復活!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
前へ
次へ
ホームページトップへ戻る