2012.2.12
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第32回]

●CP/Mソースプログラムの修正作業(3)

久しぶりに本題に戻ってきました。
[第20回]の続きの作業になります。
おやおや、あれからもうかれこれ2週間近く経ってしまいました。
その間にいろいろあったおかげで、今までに修正したところを再度修正しなければならないところが出てきてしまいました。
そこで、BIOSのパラメータの設定作業の前に、追加修正をしておくことにいたします。
[第20回]で修正作業をして保存したcpm22c.txtをTeraPadで開いて以下の個所を修正してください。

18 ENTRY        EQU     8005H;  5               ;entry point for the cp/m bdos.

23 REENT  EQU     8000H;

44 START:       JP      SETENTRY

1251 ;

1298    JP Z,ZREENT;    JP      Z,0             ;yes.

1310    JP REENT;JP     0               ;always reboot on these errors.

1383    JP Z,ZREENT;    JP      Z,0             ;yes, reboot now.

1616    JP Z,ZREENT;    JP      Z,0

行の先頭にある数字はTeraPadでcpm22b.txtを開いたときに表示される行番号です。
#18 は[第20回]の修正で;をつけてコメント行にしましたが、今回はその;を外して、さらに5を8005Hに直します。
ここは本来は0005H番地を指定するところなのですが、今はまだメモリ増設基板をつけていませんから、仮に8005Hを指定します。

#23 は[第20回]の修正で1033Hを指定しましたが、それを8000Hに再修正します。
ここも本来は0000H番地を指定するところなのですが、上と同じ理由で仮に8000Hを指定します。

#44 は[第20回]の修正でREBOOT:ラベルをつけましたが、それを8000H番地台(本来は0000H番地台)のジャンプテーブル等を作成するルーチン(SETENTRY)へのジャンプ命令に直します。 ラベルもREBOOT:からSTART:に変更します。

#1251 は[第20回]の修正でENTRY:ラベルを追加したところですが、ENTRYは今回#18で定義しますから、もとのコメント行(;)に戻します。

#1298 は[第20回]の修正でREBOOTへのジャンプ命令にしましたが、それをZREENTへのジャンプ命令に再変更します。
ZREENTはのちほどBIOSルーチンの作成作業のところで定義します。

#1310も[第20回]の修正でREBOOTへのジャンプ命令にしたところですが、ここはREENTへのジャンプ命令に再変更します。

#1383と#1616は[第20回]の修正でREENTへのジャンプ命令にしたところですが、それをZREENTへのジャンプ命令に再変更します。

以上の修正作業が完了したら、ファイル名をcpm22d.txtに変更して保存してください。

●BIOSパラメータの設定とBIOSプログラムの作成

いよいよ、といいますか、やっと、BIOSパラメータの設定作業のところまできました。
現在のCPM22d.txtでは、その部分は以下のようになっています。


ジャンプ先がダミー(0)のジャンプテーブルがあるだけです。
ここにディスクパラメータなどの設定を書き込み、BIOSプログラムを追加作成しなければなりません。
その部分のリストを下に示します。
ここは私が書いた中日電工のオリジナルですから、このままコピーして、上で示しましたcpm22d.txtの

******************

*    BIOS JUMP TABLE

から最後の

******* END OF CP/M

までのところに上から貼り付けていただいて構いません。
貼り付けたら、cpm22d.txtを上書き保存してください。

;*************** BIOS DATA AREA ******************************
;
DIRBF EQU 0B800H;128bytes
;
CSV00 EQU 0B880H;8bytes 
ALV00 EQU 0B888H;3bytes
;
;   DISK PARAMETER BASE
;
DPBASE: 
;
;drive No.0 (a drive)
        DEFW    0               ;XLATE
        DEFW    0               ;scratch1
        DEFW    0               ;scratch2
        DEFW    0               ;scratch3
        DEFW    DIRBF           ;address of dirbf.
        DEFW    DPTOP           ;address of disk parameter block.
        DEFW    CSV00           ;address of check vector.
        DEFW    ALV00           ;address of allocation vector (bit map).
;
;
DPTOP:DEFW      16              ;sectors per track from bios.
        DEFB    2               ;block shift.sector in a block 128*2^n
        DEFB    3               ;block mask.sector no. in a block - 1
        DEFB    0               ;extent mask.
        DEFW    23              ;disk size (number of blocks-1).
        DEFW    31              ;directory size.(max file name no.-1)
        DEFW    0C0H            ;storage for first bytes of bit map (dir space used).
        DEFW    8               ;check sum vector size
        DEFW    0               ;offset. first usable track number.
;
;**************************************************************
;*
;*        B I O S   J U M P   T A B L E
;*
;**************************************************************
;
BOOT:   JP      BOOTJ
WBOOT:  JP      WBOOTJ
CONST:  JP      CONSTJ
CONIN:  JP      CONINJ
CONOUT: JP      CONOUTJ
LIST:   JP      LISTJ
PUNCH:  JP      PUNCHJ
READER: JP      READERJ
HOME:   JP      HOMEJ
SELDSK: JP      SELDSKJ
SETTRK: JP      SETTRKJ
SETSEC: JP      SETSECJ
SETDMA: JP      SETDMAJ
READ:   JP      READJ
WRITE:  JP      WRITEJ
PRSTAT: JP      PRSTATJ
SECTRN: JP      SECTRNJ
;
;BIOS ROUTINE
;
;zb3routine
;
ADISP EQU 1015H
ZREENT EQU 1033H
SOUT EQU 10ABH
SIN EQU 10AEH
;
TRKADRS EQU 0BB00H
SCTADRS EQU 0BB02H
DMAADRS EQU 0BB04H
DRVNO   EQU 0BB06H
DISKTOP EQU 8800H
;
SETENTRY:LD HL,REENT
        LD A,0C3H
LD (HL),A
        INC HL
        LD DE,SETEN2
        LD (HL),E
        INC HL
        LD (HL),D
SETEN2:LD HL,IOBYTE
        XOR A
        LD (HL),A
        INC HL
        LD (HL),A
        INC HL
        LD A,0C3H
        LD (HL),A
        INC HL
        LD DE,FBASE
        LD (HL),E
        INC HL
        LD (HL),D
        JP CBASE
;
BOOTJ:XOR A
        LD (IOBYTE),A
        JP      CBASE
;
WBOOTJ: LD A,(IOBYTE)
        LD C,A
        JP      CBASE
;
;CONSOLE STATUS
;
CONSTJ:LD A,07
        CALL SOUT
        CALL SIN
        CP 20H
        RET NZ
        XOR A
        RET
;
;CONSOLE INPUT
;
CONINJ: LD A,5;1chr IN,nodp
        CALL SOUT
        CALL SIN
        RET
;
;CONSOLE OUT
;
CONOUTJ:LD A,C
        CP 0AH;12.1.8
        JP NC,ADISP ;11.12.29
        XOR A
        RET
;
;PRINTER OUT
;
LISTJ:  RET
;
;PUNCHER OUT
;
PUNCHJ: RET
;
;READER IN
;
READERJ:        RET;JP  0
;
;SEEK HOME POSITION
;
HOMEJ:  LD HL,DISKTOP
        LD (TRKADRS),HL
        LD (SCTADRS),HL
        XOR A
        RET
;
;SELECT DRIVE PARAMETER SET
;
SELDSKJ:LD HL,DPBASE
        LD A,C
        LD (DRVNO),A
        RET
;
;SET TRKADRS
;
SETTRKJ:LD HL,DISKTOP
        LD DE,800H
        INC C
STTRK1: DEC C
        JP Z,STTRK9
        ADD HL,DE
        JP STTRK1
STTRK9:LD (TRKADRS),HL
        XOR A
        RET     
;
;SET SCTADRS
;
SETSECJ:LD HL,(TRKADRS)
        LD DE,80H
        INC C
STSCT1: DEC C
        JP Z,STSCT9
        ADD HL,DE
        JP STSCT1
STSCT9:LD (SCTADRS),HL
        XOR A
        RET     
;
;SET DMAADRS
;
SETDMAJ:LD H,B
        LD L,C
        LD (DMAADRS),HL
        XOR A
        RET
;
;READ SECTOR
;
READJ:LD HL,(DMAADRS)
        EX DE,HL
        LD HL,(SCTADRS)
READJ1: LD C,80H
READJ2:LD A,(HL)
        LD (DE),A
        INC HL
        INC DE
        DEC C
        JP NZ,READJ2
        XOR A
        RET
;
;WRITE SECTOR
;
WRITEJ: LD HL,(SCTADRS)
        EX DE,HL
        LD HL,(DMAADRS)
        JP READJ1
;
;PRINTER STATUS
;
PRSTATJ:        RET
;
;sector translator
;
SECTRNJ:LD L,C
        LD H,B
        RET;
;
;*
;******************   E N D   O F   C P / M   *****************
;*
END;

これでやっととりあえずの仮RAMディスク版CP/Mソースが完成しました。
本日は時間がなくなってしまいましたので、詳しい説明やアセンブルの方法などについて、次回以降に説明することにいたします。

[2012.2.13追記]
上のリスト中、DPTOP:のパラメータの下から2番目は、DEFW 0 になっていましたが、ここはDEFW 8 でした。上のリストは修正済みです。
このことにつきましては、[第33回]で説明をしています。

ワンボードマイコンでCP/Mを![第32回]
2012.2.12upload
2012.2.13追記

前へ
次へ
ホームページトップへ戻る