2014/01/23
■ [z80][xlisp]自作Z80 CP/Mマシン(40)
引き続き XLISP ver1.1のメモ。
if関数もちゃんと動くようになったので簡単なプログラムを書いてみました。
P>TYPE TEST.LSP ; TEST.LSP ; ; 関数 nib 0〜15を"0"〜"F"に変換 ; (defun nib (n) (chr (+ n (if (< n 10) 48 55)))) ; ; 関数 byte 0〜255を"00"〜"FF"に変換 ; (defun byte (n) (strcat (nib (& 15 (/ n 16))) (nib (& 15 n)))) ; ; 0〜255 まで16進で表示、16ごとに改行する ; (setq i 0) (while (< i 256) (princ (byte i) (if (== (% i 16) 15) "\n" " ")) (setq i (+ i 1))) P>XLISP TEST.LSP <-- 実行する 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF P>
ファイルの内容を表示する(例では"MAKEFILE")
P>TYPE TEST2.LSP ; ; TEST2.LSP ファイルの内容を表示 ; (setq f (fopen "MAKEFILE" "r")) (while (setq c (getc f)) (princ (chr c)) ) (fclose f) (exit) P>XLISP TEST2.LSP <-- 実行する CC = j:c CFLAGS = -O # CFLAGS = -g -O0 objs = xlisp.obj xlread.obj xleval.obj xlprin.obj xlbind.obj \ xlsubr.obj xllist.obj xlmath.obj xlobj.obj \ xlfio.obj xlio.obj xlstr.obj xldmem.obj xlisp: $(objs) $(objs): xlisp.h .c.obj: $(CC) $(CFLAGS) -c $< clean: era xl*.obj era xlisp.com era link.map P>
ファイルを16進ダンプする(例では"MAKEFILE")
P>TYPE TEST3.LSP ; ; TEST3.LSP - ファイルを16進ダンプする ; (defun nib (n) (chr (+ n (if (< n 10) 48 55)))) (defun byte (n) (strcat (nib (& 15 (/ n 16))) (nib (& 15 n)))) (setq i 0) (setq f (fopen "MAKEFILE" "rb")) (while (setq c (getc f)) (princ (byte c) (if (== (% i 16) 15) "\n" " ")) (setq i (+ i 1))) (fclose f) (exit) P>XLISP TEST3.LSP <-- 実行する 43 43 09 3D 20 6A 3A 63 0D 0A 43 46 4C 41 47 53 20 3D 20 2D 4F 0D 0A 23 20 43 46 4C 41 47 53 20 3D 20 2D 67 20 2D 4F 30 0D 0A 0D 0A 6F 62 6A 73 20 3D 20 09 78 6C 69 73 70 2E 6F 62 6A 20 78 6C 72 65 61 64 2E 6F 62 6A 20 78 6C 65 76 61 6C 2E 6F 62 6A 20 78 6C 70 72 69 6E 2E 6F 62 6A 20 78 6C 62 69 6E 64 2E 6F 62 6A 20 5C 0D 0A 09 78 6C 73 75 62 72 2E 6F 62 6A 20 78 6C 6C 69 73 74 2E 6F 62 6A 20 78 6C 6D 61 74 68 2E 6F 62 6A 20 78 6C 6F 62 6A 2E 6F 62 6A 20 5C 0D 0A 09 78 6C 66 69 6F 2E 6F 62 6A 20 78 6C 69 6F 2E 6F 62 6A 20 78 6C 73 74 72 2E 6F 62 6A 20 78 6C 64 6D 65 6D 2E 6F 62 6A 0D 0A 0D 0A 78 6C 69 73 70 3A 20 24 28 6F 62 6A 73 29 0D 0A 0D 0A 24 28 6F 62 6A 73 29 3A 20 78 6C 69 73 70 2E 68 0D 0A 0D 0A 2E 63 2E 6F 62 6A 3A 0D 0A 09 24 28 43 43 29 20 24 28 43 46 4C 41 47 53 29 20 2D 63 20 24 3C 0D 0A 0D 0A 63 6C 65 61 6E 3A 0D 0A 09 65 72 61 20 78 6C 2A 2E 6F 62 6A 0D 0A 09 65 72 61 20 78 6C 69 73 70 2E 63 6F 6D 0D 0A 09 65 72 61 20 6C 69 6E 6B 2E 6D 61 70 0D 0A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A P>
(環境は CP/M Z80 HI-TECH C ver3.09でコンパイル)
2014/01/16
■ [z80][xlisp]自作Z80 CP/Mマシン(37)
ブレッドボードZ80マイコンではTINY BASICを載せてTinyTrek(スタートレックのタイニー版)が動きました、古から自作マイコンでは定番ですね。
CP/Mが動き出せば TurboPascalや HI-TECH Cなどの本格的なものも数多く有りますが、今回は小型の LISPと FORTHで行こうと思います(笑。
ターゲットにするLISPですが、割とメジャー(本当か?)な LISP80ではなくて、C言語で書かれたPDS(パブリック・ドメインソ・フトウェア)の XLISP Ver1.1 です、 ソースは The Unofficial CP/M Web siteにありました。
xlisp.zip(オリジナルのソースです、CP/M80は AZTEC-C用に書かれています)
XLISP は David Betz(デビットベッツ)さんによりC言語で書かれ、最初の公開は1983年1月7日のようです。 Ver1.xは小規模なコンピュータ用のオブジェクト指向拡張 Lispで、2.xは Common Lispのサブセット、3.xは Schemeのスーパーセットだそうな、、Ver4.xや XLISP-PLUS、 XLISP-STATなんてのもあるらしい、、(汗
とりあえず HI-TECH C(Z80 ver3.09)でコンパイルが通るように修正して、シミュレータで動かしてみました。
$ ./cpm3 ####### ##### ### ##### ### # # # # # # # # # # ## ## # # # # # # # # # # # # ##### # # ##### ##### # # # # # # # # # # # # # # # # # # # # # # # ####### ##### ### ##### ### # # Release 1.17, Copyright (C) 1987-2008 by Udo Munk CPU speed is unlimited Booting... LDRBIOS3 V1.2 for Z80SIM, Copyright 1989-2007 by Udo Munk CP/M V3.0 Loader Copyright (C) 1998, Caldera Inc. BNKBIOS3 SPR FC00 0400 BNKBIOS3 SPR 9000 3000 RESBDOS3 SPR F600 0600 BNKBDOS3 SPR 6200 2E00 61K TPA BANKED BIOS3 V1.6 for Z80SIM, Copyright 1989-2007 by Udo Munk A>setdef [no display] Program Name Display - Off A>setdef [uk] Date format used - UK A>setdef a:,b:,i:,* Drive Search Path: 1st Drive - A: 2nd Drive - B: 3rd Drive - I: 4th Drive - Default A>setdef [order=(com,sub)] Search Order - COM, SUB A>setdef [temporary=a] Temporary Drive - A: A>hist History RSX active A>p: P>xlisp XLISP version 1.1 > (princ "hello world!\n") hello world! () >
XLISPの詳細は 紫藤のWiki - XLISP や XLISPの公式サイト(英文)、 wikipedia(英文)を参照。 書籍は CQ出版社発行の マイコンピュータ 1984 No.15に少しだけ載っています。
2013/01/23
■ [z80]自作Z80 CP/Mマシン(34)
前回に引き続きunix用Z80(CP/M)シミュレータのz80packのメモ。
z80packのサイトからダウンロード(z80pack-1.17.tgz)し、適当なフォルダに解凍。 そしてQuickstart DRI OS'sをよく読む。
エミュレータのコンパイル $ cd ~/z80pack-1.17/cpmsim/srcsim $ make $ make clean サポートツールのコンパイル $ cd ~/z80pack-1.17/cpmsim/srctools $ make $ make clean 仮想ディスクイメージのバックアップ $ cd ~/z80pack-1.17/cpmsim/disks/library $ cp * ../backups CP/M 2.2 の実行(A:BYEで終了) $ cd ~/z80pack-1.17/cpmsim $ ./cpm2
- 使用可能なドライブはA,B,C,D,I,J,Pで、 A〜Dは8"SD形式(256KB)、I,JはHDD(4MB)、PはHDD(512M、CPM3とMP/Mのみ使用可)。
- 仮想ドライブは ~/z80pack-1.17/cpmsim/disks ディレクトリに drive[a-p].cpm のイメージファイルが存在すると実行時に自動に認識する。
- A,Bドライブのイメージファイル drivea.cpm, driveb.cpm は ~/z80pack-1.17/cpmsim/disks/liblary ディレクトリ中の cpm2-1.dsk, cpm2-2.dskへのリンクファイルであり cpm2スクリプト中で実行時にリンクされる。
cpm2スクリプトの内容は以下の通り。
#!/bin/sh rm -f disks/drive[ab].cpm ln disks/library/cpm2-1.dsk disks/drivea.cpm ln disks/library/cpm2-2.dsk disks/driveb.cpm ./cpmsim
z80packのサイトには各種インストール済みイメージファイルがあります。
例えば HI-TECH Cを使う場合は イメージファイル(hd-htc.tgz)をダウンロード&解凍し、 hd-htc.dskを ~/z80pack-1.17/cpmsim/disks/library にコピー、cpm2スクリプトファイルを以下のように編集します。
#!/bin/sh rm -f disks/drive[abi].cpm ln disks/library/cpm2-1.dsk disks/drivea.cpm ln disks/library/cpm2-2.dsk disks/driveb.cpm ln disks/library/hd-htc.dsk disks/drivei.cpm ./cpmsim
使用例
$ cd ~/z80pack-1.17/cpmsim $ ./cpm2 ####### ##### ### ##### ### # # # # # # # # # # ## ## # # # # # # # # # # # # ##### # # ##### ##### # # # # # # # # # # # # # # # # # # # # # # # ####### ##### ### ##### ### # # Release 1.17, Copyright (C) 1987-2008 by Udo Munk CPU speed is unlimited Booting... 64K CP/M Vers. 2.2 (Z80 CBIOS V1.2 for Z80SIM, Copyright 1988-2007 by Udo Munk) A>i: <-- ドライブ I: に切替え I>dir I: ASSERT H : CONIO H : CPM H : CTYPE H I: EXEC H : FLOAT H : HITECH H : LIMITS H I: MATH H : SETJMP H : SIGNAL H : STAT H I: STDARG H : STDDEF H : STDIO H : STDLIB H I: STRING H : SYS H : TIME H : UNIXIO H I: MAKE COM : CGEN COM : CPP COM : CREF COM I: DEBUG COM : DEHUFF COM : $EXEC COM : LIBR COM I: LINK COM : OBJTOHEX COM : OPTIM COM : P1 COM I: ZAS COM : CRTCPM OBJ : RRTCPM OBJ : LIBC LIB I: LIBF LIB : OPTIONS : READ ME : Z80DOC TXT I: CPM HUF : C ORG : FLOAT HUF : GEN HUF I: STDIO HUF : MAKEFILE : C C : C COM I: MAKE DOC I>a:ed hello.c <-- ラインエディタでソースファイルを新規作成 NEW FILE : *i <-- i コマンドで入力モード 1: #include <stdio.h> 2: 3: int main(argc, argv) 4: int argc; 5: char *argv[]; 6: { 7: printf("hello world\n"); 8: } 1: *e <-- CTRL-Z で入力を抜け、e で保存終了 I>c -v hello.c <-- コンパイル HI-TECH C COMPILER (CP/M-80) V3.09 Copyright (C) 1984-87 HI-TECH SOFTWARE 0:CPP -DCPM -DHI_TECH_C -Dz80 -I HELLO.C $CTMP1.$$$ 0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$ 0:CGEN $CTMP2.$$$ $CTMP1.$$$ 0:ZAS -N -oHELLO.OBJ $CTMP1.$$$ ERA $CTMP1.$$$ ERA $CTMP2.$$$ ERA $CTMP3.$$$ 0:LINK -Z -Ptext=0,data,bss -C100H -OHELLO.COM CRTCPM.OBJ HELLO.OBJ LIBC.LIB ERA HELLO.OBJ ERA $$EXEC.$$$ I>hello <-- できたプログラムを実行 hello world I>a:bye
他にも Turbo Pascal や figFORTH など多数のインストール済みイメージファイルがあります。
関連エントリ&リンク: