最新 RSS

tips@free BLOG

レトロなマイコン、電子工作、PCやフリーソフト関係のTipsと私的備忘録

<前の3件

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 - XLISPXLISPの公式サイト(英文)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 など多数のインストール済みイメージファイルがあります。

関連エントリ&リンク:

<前の3件