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

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

[第155回]


●CP/M互換DOS(仮RAMディスク版)ZBIOSプログラムのソースリスト

今回は前々回、前回に続いて、出来あがりましたCP/M互換DOS(仮RAMディスク版)ZBIOSプログラムのソースリストをお見せします。

;bios for nd80z
;2012/5/11 5/16 5/17 5/31 6/1
;
	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
;
	JP	BOOTJ
	JP	WBOOTJ
	JP	CONSTJ
	JP	CONINJ
	JP	CONOUTJ
	JP	LISTJ
	JP	PUNCHJ
	JP	READERJ
	JP	HOMEJ
	JP	SELDSKJ
	JP	SETTRKJ
	JP	SETSECJ
	JP	SETDMAJ
	JP	READJ
	JP	WRITEJ
	JP	PRSTATJ
	JP	SECTRNJ
	JP	SETENTRY
	JP	ZREENTJ
;
;   DISK PARAMETER BASE
;
;drive No.0 (a drive)
DPBASE:DW $0000;XLATE
	DW $0000;scratch1
	DW $0000;scratch2
	DW $0000;scratch3
	DW DIRBF;address of dirbf.
	DW DPTOP;address of disk parameter block.
	DW CSV00;address of check vector.
	DW ALV00;address of allocation vector (bit map).
;
;drive No.1 (b drive)
	DW $0000;XLATE
	DW $0000;scratch1
	DW $0000;scratch2
	DW $0000;scratch3
	DW DIRBF;address of dirbf.
	DW DPTOP;address of disk parameter block.
	DW CSV01;address of check vector.
	DW ALV01;address of allocation vector (bit map).
;
DPTOP:DW $0010;sectors per track from bios.
	DB 02; 03;block shift.sector in a block 128*2^n
	DB 03; 07;block mask.sector no. in a block - 1
	DB 00;extent mask.
	DW $000B; $0005;disk size (number of blocks-1).
	DW $000F; $001F;directory size.(max file name no.-1)
	DW $0080;storage for first bytes of bit map (dir space used).
	DW $0000
	DW $0000;offset. first usable track number.
;
;BIOS ROUTINE
;
SETENTRY:LD HL,REENT
	LD A,C3
	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,C3
	LD (HL),A
	INC HL
	LD DE,FBASE
	LD (HL),E
	INC HL
	LD (HL),D
	XOR A
	LD HL,CSV00
	LD C,0C
SETEN3:LD (HL),A
	INC HL
	DEC C
	JP NZ,SETEN3
	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 20
	JP NZ,CONSTJ2
	XOR A
	RET
CONSTJ2:LD (CONSTDT),A
	OR 01
	RET
;
;CONSOLE INPUT
;
CONINJ:	LD A,(CONSTDT)
	OR A
	JP Z,CONINJ2
	PUSH AF
	XOR A
	LD (CONSTDT),A
	POP AF
	RET
CONINJ2:LD A,05;1chr IN,nodp
	CALL SOUT
	CALL SIN
	RET
;
;CONSOLE OUT 12/5/20
;
CONOUTJ:LD A,C
	CP 08;BS
	JP Z,ADISP
	CP 0D
	JP Z,ADISP
	CP 0A
	JP Z,ADISP
	CP 20
	JP NC,ADISP
	RET
;
;PRINTER OUT
;
LISTJ:	RET
;
;PUNCHER OUT(RS232C OUT)
;
PUNCHJ:LD A,C
	LD B,E3
	CALL RSOUT
	LD A,EF
	OUT (98),A
	RET
;
;READER IN
;
READERJ:LD B,EB
	LD A,B
	OUT (98),A
READERJ1:CALL RSIN
	LD A,C
	JP NZ,READERJ2;GET DATA
	CP FF
	JP Z,READERJ1;NO DATA
;get data or error
READERJ2:PUSH AF
	LD A,EF
	OUT (98),A
	POP AF;if error A=01,02,04
	RET
;
;SEEK HOME POSITION
;
HOMEJ:	LD HL,DISKTOP
	LD A,(DRVNO)
	OR A
	JP Z,HOMEJ2
	LD HL,DISKTOP2
HOMEJ2:LD (TRKADRS),HL
	LD (SCTADRS),HL
	XOR A
	RET
;
;SELECT DRIVE PARAMETER SET
;
SELDSKJ:LD HL,$0000
	LD A,C
	CP 02
	JP C,SELDSKJ2
	LD A,FF
	OR A
	RET
SELDSKJ2:LD (DRVNO),A
	LD L,A
	ADD HL,HL;*2
	ADD HL,HL;*4
	ADD HL,HL;*8
	ADD HL,HL;*16
	LD DE,DPBASE
	ADD HL,DE
	XOR A
	RET
;
;SET TRKADRS
;
SETTRKJ:LD HL,DISKTOP
	LD A,(DRVNO)
	OR A
	JP Z,SETTRKJ2
	LD HL,DISKTOP2
SETTRKJ2:LD DE,$0800
	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,$0080
	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,80
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
;
ZREENTJ:LD HL,ENDZBDOS
ZREENTJ2:LD A,(HL)
	CP 24;'$'?
	JP Z,ZREENTJE
	CALL ADISP
	INC HL
	JP ZREENTJ2
ZREENTJE:CALL CRLFDP
	JP ZB3MON
CRLFDP:LD A,0D
	CALL ADISP
	LD A,0A
	JP ADISP	
ENDZBDOS:"end "
	"of Z"
	"BDOS"
	"$"
;

●CP/M互換DOS(仮RAMディスク版)ZBIOSプログラムのアセンブルリスト

こちらはCP/M互換DOS(仮RAMディスク版)ZBIOSプログラムのアセンブルリストです。

2012/6/1  19:  ZBIOS1E.TXT
END=D3C0
              ;bios for nd80z
              ;2012/5/11 5/16 5/17 5/31 6/1
              ;
              	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 C396D2   	JP	BOOTJ
D203 C39DD2   	JP	WBOOTJ
D206 C3A4D2   	JP	CONSTJ
D209 C3B9D2   	JP	CONINJ
D20C C3D0D2   	JP	CONOUTJ
D20F C3E6D2   	JP	LISTJ
D212 C3E7D2   	JP	PUNCHJ
D215 C3F2D2   	JP	READERJ
D218 C30AD3   	JP	HOMEJ
D21B C31FD3   	JP	SELDSKJ
D21E C33AD3   	JP	SETTRKJ
D221 C358D3   	JP	SETSECJ
D224 C36CD3   	JP	SETDMAJ
D227 C373D3   	JP	READJ
D22A C386D3   	JP	WRITEJ
D22D C390D3   	JP	PRSTATJ
D230 C391D3   	JP	SECTRNJ
D233 C368D2   	JP	SETENTRY
D236 C394D3   	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 02       	DB 02; 03;block shift.sector in a block 128*2^n
D25C 03       	DB 03; 07;block mask.sector no. in a block - 1
D25D 00       	DB 00;extent mask.
D25E 0B00     	DW $000B; $0005;disk size (number of blocks-1).
D260 0F00     	DW $000F; $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 2180B8   	LD HL,CSV00
D28B 0E0C     	LD C,0C
D28D 77       SETEN3:LD (HL),A
D28E 23       	INC HL
D28F 0D       	DEC C
D290 C28DD2   	JP NZ,SETEN3
D293 C300BC   	JP CBASE
              ;
D296 AF       BOOTJ:XOR A
D297 320380   	LD (IOBYTE),A
D29A C300BC   	JP CBASE
              ;
D29D 3A0380   WBOOTJ:LD A,(IOBYTE)
D2A0 4F       	LD C,A
D2A1 C300BC   	JP CBASE
              ;
              ;CONSOLE STATUS
              ;
D2A4 3E07     CONSTJ:LD A,07
D2A6 CDAB10   	CALL SOUT
D2A9 CDAE10   	CALL SIN
D2AC FE20     	CP 20
D2AE C2B3D2   	JP NZ,CONSTJ2
D2B1 AF       	XOR A
D2B2 C9       	RET
D2B3 3207BB   CONSTJ2:LD (CONSTDT),A
D2B6 F601     	OR 01
D2B8 C9       	RET
              ;
              ;CONSOLE INPUT
              ;
D2B9 3A07BB   CONINJ:	LD A,(CONSTDT)
D2BC B7       	OR A
D2BD CAC7D2   	JP Z,CONINJ2
D2C0 F5       	PUSH AF
D2C1 AF       	XOR A
D2C2 3207BB   	LD (CONSTDT),A
D2C5 F1       	POP AF
D2C6 C9       	RET
D2C7 3E05     CONINJ2:LD A,05;1chr IN,nodp
D2C9 CDAB10   	CALL SOUT
D2CC CDAE10   	CALL SIN
D2CF C9       	RET
              ;
              ;CONSOLE OUT 12/5/20
              ;
D2D0 79       CONOUTJ:LD A,C
D2D1 FE08     	CP 08;BS
D2D3 CA1510   	JP Z,ADISP
D2D6 FE0D     	CP 0D
D2D8 CA1510   	JP Z,ADISP
D2DB FE0A     	CP 0A
D2DD CA1510   	JP Z,ADISP
D2E0 FE20     	CP 20
D2E2 D21510   	JP NC,ADISP
D2E5 C9       	RET
              ;
              ;PRINTER OUT
              ;
D2E6 C9       LISTJ:	RET
              ;
              ;PUNCHER OUT(RS232C OUT)
              ;
D2E7 79       PUNCHJ:LD A,C
D2E8 06E3     	LD B,E3
D2EA CD7C06   	CALL RSOUT
D2ED 3EEF     	LD A,EF
D2EF D398     	OUT (98),A
D2F1 C9       	RET
              ;
              ;READER IN
              ;
D2F2 06EB     READERJ:LD B,EB
D2F4 78       	LD A,B
D2F5 D398     	OUT (98),A
D2F7 CD8D07   READERJ1:CALL RSIN
D2FA 79       	LD A,C
D2FB C203D3   	JP NZ,READERJ2;GET DATA
D2FE FEFF     	CP FF
D300 CAF7D2   	JP Z,READERJ1;NO DATA
              ;get data or error
D303 F5       READERJ2:PUSH AF
D304 3EEF     	LD A,EF
D306 D398     	OUT (98),A
D308 F1       	POP AF;if error A=01,02,04
D309 C9       	RET
              ;
              ;SEEK HOME POSITION
              ;
D30A 210088   HOMEJ:	LD HL,DISKTOP
D30D 3A06BB   	LD A,(DRVNO)
D310 B7       	OR A
D311 CA17D3   	JP Z,HOMEJ2
D314 2100A0   	LD HL,DISKTOP2
D317 2200BB   HOMEJ2:LD (TRKADRS),HL
D31A 2202BB   	LD (SCTADRS),HL
D31D AF       	XOR A
D31E C9       	RET
              ;
              ;SELECT DRIVE PARAMETER SET
              ;
D31F 210000   SELDSKJ:LD HL,$0000
D322 79       	LD A,C
D323 FE02     	CP 02
D325 DA2CD3   	JP C,SELDSKJ2
D328 3EFF     	LD A,FF
D32A B7       	OR A
D32B C9       	RET
D32C 3206BB   SELDSKJ2:LD (DRVNO),A
D32F 6F       	LD L,A
D330 29       	ADD HL,HL;*2
D331 29       	ADD HL,HL;*4
D332 29       	ADD HL,HL;*8
D333 29       	ADD HL,HL;*16
D334 1139D2   	LD DE,DPBASE
D337 19       	ADD HL,DE
D338 AF       	XOR A
D339 C9       	RET
              ;
              ;SET TRKADRS
              ;
D33A 210088   SETTRKJ:LD HL,DISKTOP
D33D 3A06BB   	LD A,(DRVNO)
D340 B7       	OR A
D341 CA47D3   	JP Z,SETTRKJ2
D344 2100A0   	LD HL,DISKTOP2
D347 110008   SETTRKJ2:LD DE,$0800
D34A 0C       	INC C
D34B 0D       STTRK1:	DEC C
D34C CA53D3   	JP Z,STTRK9
D34F 19       	ADD HL,DE
D350 C34BD3   	JP STTRK1
D353 2200BB   STTRK9:LD (TRKADRS),HL
D356 AF       	XOR A
D357 C9       	RET	
              ;
              ;SET SCTADRS
              ;
D358 2A00BB   SETSECJ:LD HL,(TRKADRS)
D35B 118000   	LD DE,$0080
D35E 0C       	INC C
D35F 0D       STSCT1:	DEC C
D360 CA67D3   	JP Z,STSCT9
D363 19       	ADD HL,DE
D364 C35FD3   	JP STSCT1
D367 2202BB   STSCT9:LD (SCTADRS),HL
D36A AF       	XOR A
D36B C9       	RET	
              ;
              ;SET DMAADRS
              ;
D36C 60       SETDMAJ:LD H,B
D36D 69       	LD L,C
D36E 2204BB   	LD (DMAADRS),HL
D371 AF       	XOR A
D372 C9       	RET
              ;
              ;READ SECTOR
              ;
D373 2A04BB   READJ:LD HL,(DMAADRS)
D376 EB       	EX DE,HL
D377 2A02BB   	LD HL,(SCTADRS)
D37A 0E80     READJ1:	LD C,80
D37C 7E       READJ2:LD A,(HL)
D37D 12       	LD (DE),A
D37E 23       	INC HL
D37F 13       	INC DE
D380 0D       	DEC C
D381 C27CD3   	JP NZ,READJ2
D384 AF       	XOR A
D385 C9       	RET
              ;
              ;WRITE SECTOR
              ;
D386 2A02BB   WRITEJ:	LD HL,(SCTADRS)
D389 EB       	EX DE,HL
D38A 2A04BB   	LD HL,(DMAADRS)
D38D C37AD3   	JP READJ1
              ;
              ;PRINTER STATUS
              ;
D390 C9       PRSTATJ:RET
              ;
              ;sector translator
              ;
D391 69       SECTRNJ:LD L,C
D392 60       	LD H,B
D393 C9       	RET
              ;
D394 21B4D3   ZREENTJ:LD HL,ENDZBDOS
D397 7E       ZREENTJ2:LD A,(HL)
D398 FE24     	CP 24;'$'?
D39A CAA4D3   	JP Z,ZREENTJE
D39D CD1510   	CALL ADISP
D3A0 23       	INC HL
D3A1 C397D3   	JP ZREENTJ2
D3A4 CDAAD3   ZREENTJE:CALL CRLFDP
D3A7 C33310   	JP ZB3MON
D3AA 3E0D     CRLFDP:LD A,0D
D3AC CD1510   	CALL ADISP
D3AF 3E0A     	LD A,0A
D3B1 C31510   	JP ADISP	
D3B4 656E6420 ENDZBDOS:"end "
D3B8 6F66205A 	"of Z"
D3BC 42444F53 	"BDOS"
D3C0 24       	"$"
              ;
ADISP        =1015  ALV00        =B884  ALV01        =B88A  
BOOTJ        =D296  CBASE        =BC00  CONINJ       =D2B9  
CONINJ2      =D2C7  CONOUTJ      =D2D0  CONSTDT      =BB07  
CONSTJ       =D2A4  CONSTJ2      =D2B3  CRLFDP       =D3AA  
CSV00        =B880  CSV01        =B886  DIRBF        =B800  
DISKTOP      =8800  DISKTOP2     =A000  DMAADRS      =BB04  
DPBASE       =D239  DPTOP        =D259  DRVNO        =BB06  
ENDZBDOS     =D3B4  FBASE        =C406  HOMEJ        =D30A  
HOMEJ2       =D317  IOBYTE       =8003  LISTJ        =D2E6  
PRSTATJ      =D390  PUNCHJ       =D2E7  READERJ      =D2F2  
READERJ1     =D2F7  READERJ2     =D303  READJ        =D373  
READJ1       =D37A  READJ2       =D37C  REENT        =8000  
RSIN         =078D  RSOUT        =067C  SCTADRS      =BB02  
SECTRNJ      =D391  SELDSKJ      =D31F  SELDSKJ2     =D32C  
SETDMAJ      =D36C  SETEN2       =D275  SETEN3       =D28D  
SETENTRY     =D268  SETSECJ      =D358  SETTRKJ      =D33A  
SETTRKJ2     =D347  SIN          =10AE  SOUT         =10AB  
STSCT1       =D35F  STSCT9       =D367  STTRK1       =D34B  
STTRK9       =D353  TRKADRS      =BB00  WBOOTJ       =D29D  
WRITEJ       =D386  ZB3MON       =1033  ZREENTJ      =D394  
ZREENTJ2     =D397  ZREENTJE     =D3A4  


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

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