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

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

[第120回]


●CP/M互換オリジナルDOS(3)

[第118回]ではCP/M互換のオリジナルDOSのCCP(Console Command Processer)プログラムを紹介しました。
そして前回[第119回]ではその中核を為すDOS(Disk Operating System)プログラムを紹介しました。
今回はBIOS(Basic Input Output System)プログラムの紹介です。

2012/5/11  16:11  ZBIOS1A.TXT
END=D3A2
              ;bios for nd80z
              ;2012/5/11
              ;
              	REENT=$8000
              	IOBYTE=$8003
              	DIRBF=$B800;128bytes
              ;
              	CSV00=$B880;4bytes	
              	ALV00=$B884;2bytes
              	CSV01=$B886;4bytes	
              	ALV01=$B88A;2bytes
              ;
              	CBASE=$BC00
              	FBASE=$C406
              ;
              ;zb3routine
              ;
              	ADISP=$1015
              	ZB3MON=$1033
              	SOUT=$10AB
              	SIN=$10AE
              	RSOUT=$067C
              	RSIN=$078D
              ;
              	TRKADRS=$BB00
              	SCTADRS=$BB02
              	DMAADRS=$BB04
              	DRVNO=$BB06
              	CONSTDT=$BB07
              	DISKTOP=$8800
              	DISKTOP2=$A000
              ;
              	ORG $D200
              ;
D200 C38BD2   	JP	BOOTJ
D203 C392D2   	JP	WBOOTJ
D206 C399D2   	JP	CONSTJ
D209 C3AED2   	JP	CONINJ
D20C C3C5D2   	JP	CONOUTJ
D20F C3CDD2   	JP	LISTJ
D212 C3CED2   	JP	PUNCHJ
D215 C3D9D2   	JP	READERJ
D218 C3F1D2   	JP	HOMEJ
D21B C306D3   	JP	SELDSKJ
D21E C31AD3   	JP	SETTRKJ
D221 C338D3   	JP	SETSECJ
D224 C34CD3   	JP	SETDMAJ
D227 C353D3   	JP	READJ
D22A C366D3   	JP	WRITEJ
D22D C370D3   	JP	PRSTATJ
D230 C371D3   	JP	SECTRNJ
D233 C368D2   	JP	SETENTRY
D236 C374D3   	JP	ZREENTJ
              ;
              ;   DISK PARAMETER BASE
              ;
              ;drive No.0 (a drive)
D239 0000     DPBASE:DW $0000;XLATE
D23B 0000     	DW $0000;scratch1
D23D 0000     	DW $0000;scratch2
D23F 0000     	DW $0000;scratch3
D241 00B8     	DW DIRBF;address of dirbf.
D243 59D2     	DW DPTOP;address of disk parameter block.
D245 80B8     	DW CSV00;address of check vector.
D247 84B8     	DW ALV00;address of allocation vector (bit map).
              ;
              ;drive No.1 (b drive)
D249 0000     	DW $0000;XLATE
D24B 0000     	DW $0000;scratch1
D24D 0000     	DW $0000;scratch2
D24F 0000     	DW $0000;scratch3
D251 00B8     	DW DIRBF;address of dirbf.
D253 59D2     	DW DPTOP;address of disk parameter block.
D255 86B8     	DW CSV01;address of check vector.
D257 8AB8     	DW ALV01;address of allocation vector (bit map).
              ;
D259 1000     DPTOP:DW $0010;sectors per track from bios.
D25B 03       	DB 03;block shift.sector in a block 128*2^n
D25C 07       	DB 07;block mask.sector no. in a block - 1
D25D 00       	DB 00;extent mask.
D25E 0500     	DW $0005;disk size (number of blocks-1).
D260 1F00     	DW $001F;directory size.(max file name no.-1)
D262 8000     	DW $0080;storage for first bytes of bit map (dir space used).
D264 0000     	DW $0000
D266 0000     	DW $0000;offset. first usable track number.
              ;
              ;BIOS ROUTINE
              ;
              
              ;
D268 210080   SETENTRY:LD HL,REENT
D26B 3EC3     	LD A,C3
D26D 77       	LD (HL),A
D26E 23       	INC HL
D26F 1175D2   	LD DE,SETEN2
D272 73       	LD (HL),E
D273 23       	INC HL
D274 72       	LD (HL),D
D275 210380   SETEN2:LD HL,IOBYTE
D278 AF       	XOR A
D279 77       	LD (HL),A
D27A 23       	INC HL
D27B 77       	LD (HL),A
D27C 23       	INC HL
D27D 3EC3     	LD A,C3
D27F 77       	LD (HL),A
D280 23       	INC HL
D281 1106C4   	LD DE,FBASE
D284 73       	LD (HL),E
D285 23       	INC HL
D286 72       	LD (HL),D
D287 AF       	XOR A
D288 C300BC   	JP CBASE
              ;
D28B AF       BOOTJ:XOR A
D28C 320380   	LD (IOBYTE),A
D28F C300BC   	JP CBASE
              ;
D292 3A0380   WBOOTJ:LD A,(IOBYTE)
D295 4F       	LD C,A
D296 C300BC   	JP CBASE
              ;
              ;CONSOLE STATUS
              ;
D299 3E07     CONSTJ:LD A,07
D29B CDAB10   	CALL SOUT
D29E CDAE10   	CALL SIN
D2A1 FE20     	CP 20
D2A3 C2A8D2   	JP NZ,CONSTJ2
D2A6 AF       	XOR A
D2A7 C9       	RET
D2A8 3207BB   CONSTJ2:LD (CONSTDT),A
D2AB F601     	OR 01
D2AD C9       	RET
              ;
              ;CONSOLE INPUT
              ;
D2AE 3A07BB   CONINJ:	LD A,(CONSTDT)
D2B1 B7       	OR A
D2B2 CABCD2   	JP Z,CONINJ2
D2B5 F5       	PUSH AF
D2B6 AF       	XOR A
D2B7 3207BB   	LD (CONSTDT),A
D2BA F1       	POP AF
D2BB C9       	RET
D2BC 3E05     CONINJ2:LD A,05;1chr IN,nodp
D2BE CDAB10   	CALL SOUT
D2C1 CDAE10   	CALL SIN
D2C4 C9       	RET
              ;
              ;CONSOLE OUT
              ;
D2C5 79       CONOUTJ:LD A,C
D2C6 FE0A     	CP 0A;12.1.8
D2C8 D21510   	JP NC,ADISP;11.12.29
D2CB AF       	XOR A
D2CC C9       	RET
              ;
              ;PRINTER OUT
              ;
D2CD C9       LISTJ:	RET
              ;
              ;PUNCHER OUT(RS232C OUT)
              ;
D2CE 79       PUNCHJ:LD A,C
D2CF 06E3     	LD B,E3
D2D1 CD7C06   	CALL RSOUT
D2D4 3EEF     	LD A,EF
D2D6 D398     	OUT (98),A
D2D8 C9       	RET
              ;
              ;READER IN
              ;
D2D9 06EB     READERJ:LD B,EB
D2DB 78       	LD A,B
D2DC D398     	OUT (98),A
D2DE CD8D07   READERJ1:CALL RSIN
D2E1 79       	LD A,C
D2E2 C2EAD2   	JP NZ,READERJ2;GET DATA
D2E5 FEFF     	CP FF
D2E7 CADED2   	JP Z,READERJ1;NO DATA
              ;get data or error
D2EA F5       READERJ2:PUSH AF
D2EB 3EEF     	LD A,EF
D2ED D398     	OUT (98),A
D2EF F1       	POP AF;if error A=01,02,04
D2F0 C9       	RET
              ;
              ;SEEK HOME POSITION
              ;
D2F1 210088   HOMEJ:	LD HL,DISKTOP
D2F4 3A06BB   	LD A,(DRVNO)
D2F7 B7       	OR A
D2F8 CAFED2   	JP Z,HOMEJ2
D2FB 2100A0   	LD HL,DISKTOP2
D2FE 2200BB   HOMEJ2:LD (TRKADRS),HL
D301 2202BB   	LD (SCTADRS),HL
D304 AF       	XOR A
D305 C9       	RET
              ;
              ;SELECT DRIVE PARAMETER SET
              ;
D306 210000   SELDSKJ:LD HL,$0000
D309 79       	LD A,C
D30A FE02     	CP 02
D30C D0       	RET NC
D30D 3206BB   	LD (DRVNO),A
D310 6F       	LD L,A
D311 29       	ADD HL,HL;*2
D312 29       	ADD HL,HL;*4
D313 29       	ADD HL,HL;*8
D314 29       	ADD HL,HL;*16
D315 1139D2   	LD DE,DPBASE
D318 19       	ADD HL,DE
D319 C9       	RET
              ;
              ;SET TRKADRS
              ;
D31A 210088   SETTRKJ:LD HL,DISKTOP
D31D 3A06BB   	LD A,(DRVNO)
D320 B7       	OR A
D321 CA27D3   	JP Z,SETTRKJ2
D324 2100A0   	LD HL,DISKTOP2
D327 110008   SETTRKJ2:LD DE,$0800
D32A 0C       	INC C
D32B 0D       STTRK1:	DEC C
D32C CA33D3   	JP Z,STTRK9
D32F 19       	ADD HL,DE
D330 C32BD3   	JP STTRK1
D333 2200BB   STTRK9:LD (TRKADRS),HL
D336 AF       	XOR A
D337 C9       	RET	
              ;
              ;SET SCTADRS
              ;
D338 2A00BB   SETSECJ:LD HL,(TRKADRS)
D33B 118000   	LD DE,$0080
D33E 0C       	INC C
D33F 0D       STSCT1:	DEC C
D340 CA47D3   	JP Z,STSCT9
D343 19       	ADD HL,DE
D344 C33FD3   	JP STSCT1
D347 2202BB   STSCT9:LD (SCTADRS),HL
D34A AF       	XOR A
D34B C9       	RET	
              ;
              ;SET DMAADRS
              ;
D34C 60       SETDMAJ:LD H,B
D34D 69       	LD L,C
D34E 2204BB   	LD (DMAADRS),HL
D351 AF       	XOR A
D352 C9       	RET
              ;
              ;READ SECTOR
              ;
D353 2A04BB   READJ:LD HL,(DMAADRS)
D356 EB       	EX DE,HL
D357 2A02BB   	LD HL,(SCTADRS)
D35A 0E80     READJ1:	LD C,80
D35C 7E       READJ2:LD A,(HL)
D35D 12       	LD (DE),A
D35E 23       	INC HL
D35F 13       	INC DE
D360 0D       	DEC C
D361 C25CD3   	JP NZ,READJ2
D364 AF       	XOR A
D365 C9       	RET
              ;
              ;WRITE SECTOR
              ;
D366 2A02BB   WRITEJ:	LD HL,(SCTADRS)
D369 EB       	EX DE,HL
D36A 2A04BB   	LD HL,(DMAADRS)
D36D C35AD3   	JP READJ1
              ;
              ;PRINTER STATUS
              ;
D370 C9       PRSTATJ:RET
              ;
              ;sector translator
              ;
D371 69       SECTRNJ:LD L,C
D372 60       	LD H,B
D373 C9       	RET
              ;
D374 CD8DD3   ZREENTJ:CALL CRLFDP
D377 2197D3   	LD HL,ENDCPM
D37A 7E       ZREENTJ2:LD A,(HL)
D37B FE24     	CP 24;'$'?
D37D CA87D3   	JP Z,ZREENTJE
D380 CD1510   	CALL ADISP
D383 23       	INC HL
D384 C37AD3   	JP ZREENTJ2
D387 CD8DD3   ZREENTJE:CALL CRLFDP
D38A C33310   	JP ZB3MON
D38D 3E0D     CRLFDP:LD A,0D
D38F CD1510   	CALL ADISP
D392 3E0A     	LD A,0A
D394 C31510   	JP ADISP	
D397 656E6420 ENDCPM:"end "
D39B 6F662043 	"of C"
D39F 502F4D24 	"P/M$"
              ;R
ADISP        =1015  ALV00        =B884  ALV01        =B88A  
BOOTJ        =D28B  CBASE        =BC00  CONINJ       =D2AE  
CONINJ2      =D2BC  CONOUTJ      =D2C5  CONSTDT      =BB07  
CONSTJ       =D299  CONSTJ2      =D2A8  CRLFDP       =D38D  
CSV00        =B880  CSV01        =B886  DIRBF        =B800  
DISKTOP      =8800  DISKTOP2     =A000  DMAADRS      =BB04  
DPBASE       =D239  DPTOP        =D259  DRVNO        =BB06  
ENDCPM       =D397  FBASE        =C406  HOMEJ        =D2F1  
HOMEJ2       =D2FE  IOBYTE       =8003  LISTJ        =D2CD  
PRSTATJ      =D370  PUNCHJ       =D2CE  READERJ      =D2D9  
READERJ1     =D2DE  READERJ2     =D2EA  READJ        =D353  
READJ1       =D35A  READJ2       =D35C  REENT        =8000  
RSIN         =078D  RSOUT        =067C  SCTADRS      =BB02  
SECTRNJ      =D371  SELDSKJ      =D306  SETDMAJ      =D34C  
SETEN2       =D275  SETENTRY     =D268  SETSECJ      =D338  
SETTRKJ      =D31A  SETTRKJ2     =D327  SIN          =10AE  
SOUT         =10AB  STSCT1       =D33F  STSCT9       =D347  
STTRK1       =D32B  STTRK9       =D333  TRKADRS      =BB00  
WBOOTJ       =D292  WRITEJ       =D366  ZB3MON       =1033  
ZREENTJ      =D374  ZREENTJ2     =D37A  ZREENTJE     =D387  


この部分はCP/M2.2をND80ZVシステム上で動作させるために、オリジナルのものを作成して今まで使っていたものとほとんど同じです。
もとはCP/M2.2ソースプログラムの一部として、そこに書き加えて作成したものを、Z80アセンブラZASM.exeでアセンブルして使っていました。
しかし今回CCPとDOSをそれぞれ独立したプログラムとして作成しましたので、BIOSもそれだけで独立したプログラムとして書き直しました。
CP/M2.2ソースプログラムはアセンブラの文法が当社オリジナルのZ80アセンブラZASM.COMとは一部が異なっていたために、フリーのZ80アセンブラZASM.EXEを使わせていただきましたが、今回は新規書き下ろしでソースプログラムを作成しましたので、当社の文法に合わせました。
BIOSもそのように必要なところを書き直してZASM.COMでアセンブルできるようにしました。

ワンボードマイコンでCP/Mを![第120回]
2012.5.14upload

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