From 51d9bdb6559c09705213c81e2785a21abc9f945b Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 28 Feb 2022 10:54:59 -0800 Subject: [PATCH] Minor ASSIGN Fixes, Add 2PIOTST - Improved ASSIGN operation under CP/M 3 to better handle BIOS function invocations - Added 2PIOTST for testing the DUALPIO MBC board - Increased default RAM drive size for ZRC --- Doc/ROM Applications.pdf | Bin 193897 -> 193897 bytes Doc/RomWBW Applications.pdf | Bin 241324 -> 241636 bytes Doc/RomWBW Architecture.pdf | Bin 451608 -> 451609 bytes Doc/RomWBW Disk Catalog.pdf | Bin 134794 -> 134794 bytes Doc/RomWBW Getting Started.pdf | Bin 272671 -> 272671 bytes ReadMe.md | 2 +- ReadMe.txt | 4 +- Source/Apps/Test/2piotst/2piotst.mac | 567 +++++++++++++++++++++++++++ Source/Apps/Test/2piotst/Build.cmd | 13 + Source/Apps/Test/2piotst/Clean.cmd | 8 + Source/Apps/Test/2piotst/Makefile | 8 + Source/Apps/Test/Build.cmd | 1 + Source/Apps/Test/Clean.cmd | 1 + Source/Apps/Test/Makefile | 2 +- Source/Apps/assign.asm | 101 +++-- Source/Doc/Applications.md | 5 + Source/HBIOS/Config/RCZ80_zrc.asm | 1 + Source/HBIOS/hbios.asm | 17 +- Source/HBIOS/std.asm | 12 +- Source/ver.inc | 2 +- Source/ver.lib | 2 +- Tools/Makefile.inc | 3 + 22 files changed, 701 insertions(+), 48 deletions(-) create mode 100644 Source/Apps/Test/2piotst/2piotst.mac create mode 100644 Source/Apps/Test/2piotst/Build.cmd create mode 100644 Source/Apps/Test/2piotst/Clean.cmd create mode 100644 Source/Apps/Test/2piotst/Makefile diff --git a/Doc/ROM Applications.pdf b/Doc/ROM Applications.pdf index 6f67aa2cc7a53ee8dddd1520722ee5bbee0f3916..0eea282c3040e6edae6c86cf3d01ca084f3a3c49 100644 GIT binary patch delta 260 zcmaF)iu>g&?hSQ}_51rGYi>&%-1DqgZLRk|u^Wpv#>IP0cy-d_d~UbOwIbHPhP|t= zoNt{|{O5P!3_o|nsoP(h%v&}y{HeD0?V|Gj*IXhCl?{(FMkgD6s}ouV)9ppun;Dtf z8JQTjGcqwPKFVQaVQ64rVPrhnk6oO{$jHD5Cb0edaV9HWXA@&XM{_q*BO@~>BVz*t gBQsYgM>kg!Q#U6=Hx~mpM>_=@LQ1Cld}Wda0FyOlP5=M^ delta 260 zcmaF)iu>g&?hSQ}_4Y4y_T}~@#C>*~d`-2UJLh7=dVN)ouPIBOZ*vvO-r4kT#<9>> z&z;U${`+g;vwZQ4Q@2Z{{4bwb{b}mb+?~6Rm$G(Um^kB6!&*bhO1t^e{-(<$|3+Py zZLYCf>i8DjBY*lGuOtOmB{LaKzi0F3*4yv9HFsB7@gA0`mEC$qe)lVV7OR||TKrh hV&Up!;NoWFXl`y|=H_VZ>Ski6U_(gBbf2$GvH<(mXFUJ_ diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index a64d5d210b2446a2f12b98c5b684b7627ee0c97a..7b8f44ed78bb1b43424891e840edadf9f0a4a74d 100644 GIT binary patch delta 16584 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 A9RL6T delta 16271 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 diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 7a3c3a43de979ac5e4927731b4bdd8f9158948aa..e204ef9866104b46baf21121a2eaec13bba19b5f 100644 GIT binary patch delta 255 zcmeC0%h5HLV?!xpeZ+AcyX>9>xz8?>uc=Yec|C$c;MQMo;!KldzVXH?x@pw zu{>U5w^aKUjUzSN8#EV9{~V;IP^@|G>G#`4={vm6FaCOA(|iBjuh_r8W}5eZx}hd-4d-pY@QpD_+{x9&)xgcr%+1u$+0w<#&DqGr c#L>~*)X~7u)WXcf(ZEi@hJcdkIebiV0D{?R$^ZZW delta 255 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 diff --git a/ReadMe.txt b/ReadMe.txt index 92cfdabb..5f17c6dc 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW Getting Started Wayne Warthen (mailto:wwarthen@gmail.com) -02 Feb 2022 +28 Feb 2022 @@ -17,7 +17,7 @@ RomWBW Z80/Z180 System Software Version 3.1 Pre-release -02 Feb 2022 +28 Feb 2022 Wayne Warthen wwarthen@gmail.com diff --git a/Source/Apps/Test/2piotst/2piotst.mac b/Source/Apps/Test/2piotst/2piotst.mac new file mode 100644 index 00000000..027dcddf --- /dev/null +++ b/Source/Apps/Test/2piotst/2piotst.mac @@ -0,0 +1,567 @@ +; 24.9.2018 PMS (b1ackmai1er) +; Modified version for ECB-ZILOG PERIPHERALS BOARD - TEST 2 PIO's +; 01.11.2011 WKA +; Assembler M80 +; ECB-4PIO +; Testprogramm fr die I/O-Karte ECB-4PIO in Z80-Mnemonics + + PAGE 72 + .Z80 + ASEG + ORG 100H +; +;CP/M-ADDRESSES +;* * * * * * * +; +BOOT EQU 0 ;WARMBOOT CP/M +BDOS EQU 5 ;ENTRY BDOS +NMI EQU 66H ;Error-ROUTINE +; +;CONSOLE-CODES +;* * * * * * * +; +EOT EQU 4 ;END OF TEXT +BS EQU 8 ;BACKSPACE +TAB EQU 9 ;TABULATOR +LF EQU 0AH ;LINE-FEED +CR EQU 0DH ;CARRIAGE-RETURN +FF EQU 0CH ;FORM-FEED +ESC EQU 1BH ;ESCAPE +CTRLC EQU 'C'-40H ;CONTROL-C +CTRLW EQU 'W'-40H ;CONTROL-W +CTRLX EQU 'X'-40H ;CONTROL-X +CTRLY EQU 'Y'-40H ;CONTROL-Y +CTRLZ EQU 'Z'-40H ;CONTROL-Z +; +BASE EQU 0B8H ; 4 DIL-SCHALTER +; +PIO0AD EQU BASE+0 ; PIO 0 A DATEN +PIO0AC EQU BASE+2 ; PIO 0 A CONTROL +PIO0BD EQU BASE+1 ; PIO 0 B DATEN +PIO0BC EQU BASE+3 ; PIO 0 B CONTROL +; +PIO1AD EQU BASE+4 ; PIO 1 A DATEN +PIO1AC EQU BASE+6 ; PIO 1 A CONTROL +PIO1BD EQU BASE+5 ; PIO 1 B DATEN +PIO1BC EQU BASE+7 ; PIO 1 B CONTROL +; +MAIN: LD DE,PIO_SRTMSG + CALL PSTRIN +; + LD DE,INI_MSG + CALL PSTRIN + CALL INIT +; + LD DE,PIO0ADW ;PIO0 A + CALL PSTRIN + LD A,55H + PUSH AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN + POP AF + OUT (PIO0AD),A + IN A,(PIO0AD) + PUSH AF +; + LD DE,PIO0ADR + CALL PSTRIN + POP AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN +; + LD DE,PIO0ADW + CALL PSTRIN + LD A,0AAH + PUSH AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN + POP AF + OUT (PIO0AD),A + IN A,(PIO0AD) + PUSH AF +; + LD DE,PIO0ADR + CALL PSTRIN + POP AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN +; + LD DE,PIO0BDW ;PIO0 B + CALL PSTRIN + LD A,55H + PUSH AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN + POP AF + OUT (PIO0BD),A + IN A,(PIO0BD) + PUSH AF +; + LD DE,PIO0BDR + CALL PSTRIN + POP AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN +; + LD DE,PIO0BDW + CALL PSTRIN + LD A,0AAH + PUSH AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN + POP AF + OUT (PIO0BD),A + IN A,(PIO0BD) + PUSH AF +; + LD DE,PIO0BDR + CALL PSTRIN + POP AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN +; + LD DE,PIO1ADW ;PIO1 A + CALL PSTRIN + LD A,55H + PUSH AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN + POP AF + OUT (PIO1AD),A + IN A,(PIO1AD) + PUSH AF +; + LD DE,PIO1ADR + CALL PSTRIN + POP AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN +; + LD DE,PIO1ADW + CALL PSTRIN + LD A,0AAH + PUSH AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN + POP AF + OUT (PIO1AD),A + IN A,(PIO1AD) + PUSH AF +; + LD DE,PIO1ADR + CALL PSTRIN + POP AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN +; + LD DE,PIO1BDW ;PIO1 B + CALL PSTRIN + LD A,55H + PUSH AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN + POP AF + OUT (PIO1BD),A + IN A,(PIO1BD) + PUSH AF +; + LD DE,PIO1BDR + CALL PSTRIN + POP AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN +; + LD DE,PIO1BDW + CALL PSTRIN + LD A,0AAH + PUSH AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN + POP AF + OUT (PIO1BD),A + IN A,(PIO1BD) + PUSH AF +; + LD DE,PIO1BDR + CALL PSTRIN + POP AF + CALL OUTB + LD DE,LINE_E + CALL PSTRIN +; + LD DE,PIO_ENDMSG + CALL PSTRIN + JP BOOT +; +;========================================================================== +INIT: LD HL,PIO0T ; PIO0 INITITALISIEREN + CALL INITX + LD HL,PIO1T ; PIO1 INITITALISIEREN + CALL INITX + RET +; +INITX: LD A,(HL) ; BYTE-ANZAHL + OR A + RET Z + LD B,A ; Port-Adresse nach C + INC HL + LD C,(HL) + INC HL + OTIR + JR INITX +; +PIO0T: DEFB 05 ; 5 BYTE ZUM PIO 0 A CONTROL + DEFB PIO0AC + DEFB 00000011B ; DIS-INT + DEFB 01001111B ; BETR.ART BYTE EINGABE + DEFB 01001111B ; BETR.ART BYTE EINGABE + DEFB 11001111B ; BETR.ART BIT EIN/AUSG. + DEFB 00000000B ; ALLES AUSG. + DEFB 01 ; 1 BYTE ZUM PIO 0 A DATEN + DEFB PIO0AD + DEFB 00000000B ; DATEN "LOW" +; + DEFB 05 ; 5 BYTE ZUM PIO 0 B CONTROL + DEFB PIO0BC + DEFB 00000011B ; DIS-INT + DEFB 01001111B ; BETR.ART BYTE EINGABE + DEFB 01001111B ; BETR.ART BYTE EINGABE + DEFB 11001111B ; BETR.ART BIT EIN/AUSG. + DEFB 00000000B ; ALLES AUSG. + DEFB 01 ; 1 BYTE ZUM PIO 0 B DATEN + DEFB PIO0BD + DEFB 00000000B ; DATEN "LOW" + DEFB 0 ; ENDE PIO 0 B -TABELLE +; +PIO1T: DEFB 05 ; 5 BYTE ZUM PIO 1 A CONTROL + DEFB PIO1AC + DEFB 00000011B ; DIS-INT + DEFB 01001111B ; BETR.ART BYTE EINGABE + DEFB 01001111B ; BETR.ART BYTE EINGABE + DEFB 11001111B ; BETR.ART BIT EIN/AUSG. + DEFB 00000000B ; ALLES AUSG. + DEFB 01 ; 1 BYTE ZUM PIO 1 A DATEN + DEFB PIO1AD + DEFB 00000000B ; DATEN "LOW" +; + DEFB 05 ; 5 BYTE ZUM PIO 1 B CONTROL + DEFB PIO1BC + DEFB 00000011B ; DIS-INT + DEFB 01001111B ; BETR.ART BYTE EINGABE + DEFB 01001111B ; BETR.ART BYTE EINGABE + DEFB 11001111B ; BETR.ART BIT EIN/AUSG. + DEFB 00000000B ; ALLES AUSG. + DEFB 01 ; 1 BYTE ZUM PIO 1 B DATEN + DEFB PIO1BD + DEFB 00000000B ; DATEN "LOW" + DEFB 0 ; ENDE PIO 1 B -TABELLE +; +;========================================================================== +; +;Output on Screen +;**************** +; +PRBS: LD E,BS + CALL PCHAR + RET +; +;Output CR+LF on Screen +;********************** +; +CRLF: LD E,CR + CALL PCHAR + LD E,LF + CALL PCHAR + RET +; +;Output ASCII-Character +;********************** +; +PRINP: PUSH AF + LD E,A + CALL PCHAR + POP AF + RET; +; +;CALL BDOS with Register Save +;**************************** +; +INCHA: LD C,1 ;INPUT CHARACTER TO A + JR BDO +PCHAR: LD C,2 ;PRINT CHARACTER IN E + JR BDO +PSTRIN: LD C,9 ;PRINT STRING + JR BDO +INBUFF: LD C,10 ;READ CONSOLE-BUFFER + JR BDO +CSTS: LD C,11 ;CONSOLE-STATUS + JR BDO +OPEN: LD C,15 ;OPEN FILE + JR BDO +CLOSE: LD C,16 ;CLOSE FILE + JR BDO +DELETE: LD C,19 ;DELETE FILE + JR BDO +READS: LD C,20 ;READ SEEK + JR BDO +WRITES: LD C,21 ;WRITE SEEK + JR BDO +MAKE: LD C,22 ;MAKE FILE + JR BDO +SETDMA: LD C,26 ;SET DMA-ADDRESS +BDO: PUSH HL + PUSH DE + PUSH BC + PUSH IX + PUSH IY + CALL BDOS + POP IY + POP IX + POP BC + POP DE + POP HL + RET +; +;DIRECT CONSOLE INPUT +;******************** +; +INDCON: CALL INDCOX + CP 0 + JR Z,INDCON + RET +; +INDCOX: LD C,6 ;Code for Direct Console Input + LD E,0FFH ;Code for Input + PUSH HL + PUSH DE + PUSH BC + PUSH IX + PUSH IY + CALL BDOS + POP IY + POP IX + POP BC + POP DE + POP HL + RET +; +; +;Output WORD +;*********** +; +;PARAMETER: Entry WORD IN HL +;********* +; +OUTW: LD A,H + CALL OUTB + LD A,L + CALL OUTB + RET +; +;Output BYTE +;*********** +; +;PARAMETER: Entry BYTE IN A +;********* +; +OUTB: PUSH AF + RRCA + RRCA + RRCA + RRCA + AND 0FH + CALL HBTHE ;Change Half-BYTE + POP AF + AND 0FH + CALL HBTHE + RET +; +;Output HALF-BYTE +;**************** +; +;PARAMETER: Entry Half-BYTE IN A (BIT 0 - 3) +;********* +; +HBTHE: CP 0AH + JR C,HBTHE1 + ADD A,7 ;Character to Letter +HBTHE1: ADD A,30H + LD E,A + CALL PCHAR + RET +; +;Input ADDRESS +;************* +; +;PARAMETER: Exit with ADDRESS IN HL +;********* +; +INADR: LD HL,0 +INADR1: CALL INCHAR ;Input TETRADE + LD D,A + CALL INBYT1 ;IN HEXA + RET C ;END OF Input + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + OR L + LD L,A + JR INADR1 ;New Key +; +; +;Input BYTE +;********** +; +;PARAMTER: Exit with BYTE IN A +;******** +; +INBYT: CALL INADR + LD A,L + RET +; +;Input of one TETRADE to A (BIT 0-3) +;************************************ +; +INBYT1: SUB '0' + RET C + CP 'G'-30H + JR NC,INBYT3 ;Error + CP ':'-30H + JR C,INBYT2 + CP 'A'-30H + JR C,INBYT3 ;Error + SUB 7 +INBYT2: OR A + RET +; +INBYT3: SCF + RET +; +;Input ASCII-Character to A +;************************** +; +INCON: CALL INDCON ;Input ASCII-Character to A + CP CTRLC ;TEST CONTROL-C + JP Z,QUIT + CP CTRLX ;TEST CONTROL-X + JR Z,INCHA1 + CP CTRLW ;TEST CONTROL-W + JR Z,INCHA3 + CP CTRLY ;TEST CONTROL-Y + JR Z,INCHA2 + CP BS + RET Z + CP CR + RET Z + CP ' ' + JR C,INCON + JR INCH1 +; +INCHAR: CALL INCHA ;Input ASCII-Character to A + CP CTRLC ;TEST CONTROL-C + JR Z,QUIT + CP CTRLX ;TEST CONTROL-X + JR Z,INCHA1 + CP CTRLW ;TEST CONTROL-W + JR Z,INCHA3 + CP CTRLY ;TEST CONTROL-Y + JR Z,INCHA2 + CP BS + RET Z + CP CR + RET Z + CP ' ' + JR C,INCHAR ;Input invalied +; +INCH1: CP 'A' + RET C ;Character ok +; + RES 5,A ;lower case -> upper case + RET +INCHA1: POP HL + LD E,FF + CALL PCHAR ;Clear screen + JP GOON +INCHA2: POP HL + LD E,FF + CALL PCHAR ;Clear screen + JP GOON +INCHA3: LD E,FF + CALL PCHAR + RET +; +;ABBRUCH DER BEARBEITUNG +;*********************** +; +COMPLT: LD DE,TCOMP + CALL PSTRIN + JP GOON +QUIT: CALL CRLF + LD DE,TQUIT + JR FINIS +INTTIM: POP DE ;STACK OK +; CALL DESAK + LD DE,TNMIAB + CALL PSTRIN + LD DE,MAIN ;NEW ADDRESS + PUSH DE + RETN +FINIS: CALL PSTRIN ;AT BDOS-ERROR +GOON: + JP BOOT +; +; +;TEXT-Messages +;************* +; +TCOMP: DEFB ESC,21,0,14H,ESC,23,0 + DEFM 'Function complete !!$' +TQUIT: DEFB ESC,23,0,14H,7 + DEFM 'End Run RAMFTEST$' +TNMIAB: DEFB ESC,23,0,14H + DEFM 'Time Out !!$' +; +; +INI_MSG:DEFM 'ECB-4PIO Init all PIO Bit-Mode ',CR,LF,'$' +PIO0ADW:DEFM 'ECB-4PIO Write to PIO0AD ','$' +PIO0ADR:DEFM 'ECB-4PIO Read from PIO0AD ','$' +PIO0BDW:DEFM 'ECB-4PIO Write to PIO0BD ','$' +PIO0BDR:DEFM 'ECB-4PIO Read from PIO0BD ','$' +PIO1ADW:DEFM 'ECB-4PIO Write to PIO1AD ','$' +PIO1ADR:DEFM 'ECB-4PIO Read from PIO1AD ','$' +PIO1BDW:DEFM 'ECB-4PIO Write to PIO1BD ','$' +PIO1BDR:DEFM 'ECB-4PIO Read from PIO1BD ','$' + +PIO_SRTMSG: + DEFM 'ECB-ZILOG PERIPHERALS start test 1.0',CR,LF,'$' +PIO_ENDMSG: + DEFM 'ECB-ZILOG PERIPHERALS end test 1.0',CR,LF,'$' +LINE_E: DEFM 'H',CR,LF,'$' +; + IF1 + .PRINTX 'Pass 1 complete' + ENDIF +; + IF2 + .PRINTX 'Pass 2 complete' + .PRINTX 'Assembly complete' + ENDIF +; + END + diff --git a/Source/Apps/Test/2piotst/Build.cmd b/Source/Apps/Test/2piotst/Build.cmd new file mode 100644 index 00000000..8d719eab --- /dev/null +++ b/Source/Apps/Test/2piotst/Build.cmd @@ -0,0 +1,13 @@ +@echo off +setlocal + +set TOOLS=..\..\..\..\Tools + +set PATH=%TOOLS%\zxcc;%PATH% + +set CPMDIR80=%TOOLS%/cpm/ + +zxcc M80 -=2piotst/l || exit /b +zxcc L80 -2piotst,2piotst.com/n/e || exit /b + +copy /Y 2piotst.com ..\..\..\..\Binary\Apps\Test\ || exit /b diff --git a/Source/Apps/Test/2piotst/Clean.cmd b/Source/Apps/Test/2piotst/Clean.cmd new file mode 100644 index 00000000..a9c92a7d --- /dev/null +++ b/Source/Apps/Test/2piotst/Clean.cmd @@ -0,0 +1,8 @@ +@echo off +setlocal + +if exist *.com del *.com +if exist *.lst del *.lst +if exist *.bin del *.bin +if exist *.rel del *.rel +if exist *.prn del *.prn diff --git a/Source/Apps/Test/2piotst/Makefile b/Source/Apps/Test/2piotst/Makefile new file mode 100644 index 00000000..6dde1f3a --- /dev/null +++ b/Source/Apps/Test/2piotst/Makefile @@ -0,0 +1,8 @@ +OBJECTS = 2piotst.com +DEST = ../../../../Binary/Apps/Test +TOOLS =../../../../Tools +OTHERS = *.rel + +include $(TOOLS)/Makefile.inc + +2piotst.com : 2piotst.rel \ No newline at end of file diff --git a/Source/Apps/Test/Build.cmd b/Source/Apps/Test/Build.cmd index ac6e0c2b..e0fca5e1 100644 --- a/Source/Apps/Test/Build.cmd +++ b/Source/Apps/Test/Build.cmd @@ -20,6 +20,7 @@ pushd rzsz && call Build || exit /b & popd pushd vdctest && call Build || exit /b & popd pushd kbdtest && call Build || exit /b & popd pushd ps2info && call Build || exit /b & popd +pushd 2piotst && call Build || exit /b & popd goto :eof diff --git a/Source/Apps/Test/Clean.cmd b/Source/Apps/Test/Clean.cmd index 9e1f36d9..ee9e01eb 100644 --- a/Source/Apps/Test/Clean.cmd +++ b/Source/Apps/Test/Clean.cmd @@ -17,3 +17,4 @@ pushd rzsz && call Clean || exit /b 1 & popd pushd vdctest && call Clean || exit /b 1 & popd pushd kbdtest && call Clean || exit /b 1 & popd pushd ps2info && call Clean || exit /b 1 & popd +pushd 2piotst && call Clean || exit /b 1 & popd diff --git a/Source/Apps/Test/Makefile b/Source/Apps/Test/Makefile index aed32df2..56f2b77a 100644 --- a/Source/Apps/Test/Makefile +++ b/Source/Apps/Test/Makefile @@ -1,5 +1,5 @@ OBJECTS = -SUBDIRS = DMAmon I2C inttest ppidetst ramtest tstdskng rzsz vdctest kbdtest ps2info +SUBDIRS = DMAmon I2C inttest ppidetst ramtest tstdskng rzsz vdctest kbdtest ps2info 2piotst DEST = ../../../Binary/Apps/Test TOOLS =../../../Tools diff --git a/Source/Apps/assign.asm b/Source/Apps/assign.asm index a3ed2981..258573e8 100644 --- a/Source/Apps/assign.asm +++ b/Source/Apps/assign.asm @@ -22,12 +22,14 @@ ; 2016-04-08 [WBW] Determine key memory addresses dynamically ; 2019-08-07 [WBW] Fixed DPB selection error ; 2019-11-17 [WBW] Added preliminary CP/M 3 support -; 2019-12-24 [WBW] Fixed location of BIOS save area\ +; 2019-12-24 [WBW] Fixed location of BIOS save area ; 2020-04-29 [WBW] Updated for larger DPH (16 -> 20 bytes) ; 2020-05-06 [WBW] Add patch level to version compare ; 2020-05-10 [WBW] Set media change flag in XDPH for CP/M 3 ; 2020-05-12 [WBW] Back out media change flag ; 2021-12-06 [WBW] Fix inverted ROM/RAM DPB mapping in buffer alloc +; 2022-02-28 [WBW] Use HBIOS to swap banks under CP/M 3 +; Use CPM3 BDOS direct BIOS call to get DRVTBL adr ;_______________________________________________________________________________ ; ; ToDo: @@ -43,6 +45,7 @@ stksiz .equ $40 ; Working stack size ; restart .equ $0000 ; CP/M restart vector bdos .equ $0005 ; BDOS invocation vector +bnksel .equ $FFF3 ; HBIOS bank select vector ; stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp ; @@ -108,8 +111,11 @@ init: ld c,$0C ; function number call bdos ; do it, HL := version ld (cpmver),hl ; save it - ld a,l ; low byte - cp $30 ; CP/M 3.0? + ;push hl ; *debug* + ;pop bc ; *debug* + ;call prthexword ; *debug* + ;ld a,l ; low byte + ;cp $30 ; CP/M 3.0? ; ; get location of config data and verify integrity ld hl,stamp ; HL := adr or RomWBW zero page stamp @@ -231,18 +237,24 @@ initx: ; CP/M 3 initialization ; initcpm3: - ld hl,(bioloc) - ld de,22*3 ; offset of DRVTBL func - add hl,de ; HL := DRVTBL func - call jphl ; do it, HL := DRVTBL adr - ld (drvtbl),hl ; save it + ld a,22 ; XBIOS DRVTBL function + call xbios ; Invoke XBIOS + ld (drvtbl),hl ; save DRVTBL address +; +; The CP/M 3 drvtbl is in common memory, but the XDPHs are not. +; So, here we temporarily swap the bank to the CP/M 3 system +; bank. We cannot use the CP/M Direct BIOS call because it +; explicitly blocks use of SELMEM, so we are foreced to use +; HBIOS call. The CP/M 3 system bank is always the HBIOS +; user bank. ; ; switch to sysbnk - ld hl,(bioloc) - ld de,27*3 ; offset of SELMEM func - add hl,de ; HL := SELMEM func - ld a,0 ; bank 0 is system bank - call jphl + ld a,($FFE0) ; get current bank + push af ; save it + ld bc,$F8F2 ; HBIOS Get Bank Info + rst 08 ; call HBIOS, E=User Bank + ld a,e ; HBIOS User Bank + call bnksel ; HBIOS BNKSEL ; ; copy CP/M 3 drvtbl to drvmap working copy ld hl,(drvtbl) ; get drive table in HL @@ -278,11 +290,8 @@ initc4: djnz initc2 ; ; switch back to tpabnk - ld hl,(bioloc) - ld de,27*3 ; offset of SELMEM func - add hl,de ; HL := SELMEM func - ld a,1 ; bank 1 is tpa bank - call jphl + pop af ; recover prev bank + call bnksel ; HBIOS BNKSEL ; ; return success xor a ; signal success @@ -397,6 +406,15 @@ usage: call crlf ; formatting ld de,msgban1 ; point to version message part 1 call prtstr ; print it + ld de,msg22 ; assume CP/M 2.2 + ld a,(cpmver) ; low byte of ver + cp $30 ; CP/M 3.0? + jp c,usage1 ; if not, jump ahead + ld de,msg3 ; CP/M 3 +usage1: + call prtstr + ld de,msbban2 ; next portion of banner + call prtstr ld a,(unamod) ; get UNA flag or a ; set flags ld de,msghb ; point to HBIOS mode message @@ -404,7 +422,7 @@ usage: ld de,msgub ; point to UBIOS mode message call nz,prtstr ; if UNA, say so call crlf ; formatting - ld de,msgban2 ; point to version message part 2 + ld de,msgban3 ; point to version message part 2 call prtstr ; print it call crlf2 ; blank line ld de,msguse ; point to usage message @@ -728,13 +746,13 @@ makdph3: ; ; instcpm3: -; - ; switch to sysbnk - ld hl,(bioloc) - ld de,27*3 ; offset of SELMEM func - add hl,de ; HL := SELMEM func - ld a,0 ; bank 0 is system bank - call jphl + ; swicth to sysbnk + ld a,($FFE0) ; get current bank + push af ; save it + ld bc,$F8F2 ; HBIOS Get Bank Info + rst 08 ; call HBIOS, E=User Bank + ld a,e ; HBIOS User Bank + call $FFF3 ; HBIOS BNKSEL ; ; copy drvmap working copy to CP/M 3 drvtbl ld hl,(drvtbl) ; get drvtbl address @@ -802,11 +820,8 @@ instc3: djnz instc1 ; ; switch back to tpabnk - ld hl,(bioloc) - ld de,27*3 ; offset of SELMEM func - add hl,de ; HL := SELMEM func - ld a,1 ; bank 1 is tpa bank - call jphl + pop af ; recover prev bank + call $FFF3 ; HBIOS BNKSEL ; ; set SCB drive door open flag ld a,$54 ; SCB drive door opened flag @@ -1733,6 +1748,23 @@ cbios: call addhl ; determine specific function address jp (hl) ; invoke CBIOS ; +; Routine to call CPM3 BIOS routines via BDOS +; function 50. +; +xbios: + ld (biofnc),a ; set BIOS function + ld c,50 ; direct BIOS call function + ld (dereg),de ; set DE parm + ld de,biospb ; BIOS parameter block + jp bdos ; invoke BDOS +; +biospb: +biofnc .db 0 ; BIOS function +areg .db 0 ; A register +bcreg .dw 0 ; BC register +dereg .dw 0 ; DE register +hlreg .dw 0 ; HL register +; ; Add the value in A to HL (HL := HL + A) ; addhl: @@ -1911,10 +1943,13 @@ stack .equ $ ; stack top ; Messages ; indent .db " ",0 -msgban1 .db "ASSIGN v1.4a for RomWBW CP/M, 6-Dec-2021",0 +msgban1 .db "ASSIGN v1.5 for RomWBW CP/M ",0 +msg22 .db "2.2",0 +msg3 .db "3",0 +msbban2 .db ", 28-Feb-2022",0 msghb .db " (HBIOS Mode)",0 msgub .db " (UBIOS Mode)",0 -msgban2 .db "Copyright 2021, Wayne Warthen, GNU GPL v3",0 +msgban3 .db "Copyright 2021, Wayne Warthen, GNU GPL v3",0 msguse .db "Usage: ASSIGN D:[=[{D:|[]:[]}]][,...]",13,10 .db " ex. ASSIGN (display all active assignments)",13,10 .db " ASSIGN /? (display version and usage)",13,10 diff --git a/Source/Doc/Applications.md b/Source/Doc/Applications.md index c4680d04..eae4dd92 100644 --- a/Source/Doc/Applications.md +++ b/Source/Doc/Applications.md @@ -168,6 +168,11 @@ This command is particularly sensitive to being matched to the appropriate version of the RomWBW ROM you are using. Be very careful to keep all copies of `ASSIGN.COM` up to date with your ROM. +Additionally, the `ASSIGN` command must be able to adjust to CP/M 2.2 +vs. CP/M 3. If you utilize an RSX that modifies the BDOS version +returned, you are likely to have serious problems. In this case, be +sure to use `ASSIGN` prior to loading the RSX or after it is unloaded. + ## Etymology The `ASSIGN` command is an original product and the source code is diff --git a/Source/HBIOS/Config/RCZ80_zrc.asm b/Source/HBIOS/Config/RCZ80_zrc.asm index e03cebba..44997489 100644 --- a/Source/HBIOS/Config/RCZ80_zrc.asm +++ b/Source/HBIOS/Config/RCZ80_zrc.asm @@ -30,6 +30,7 @@ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ ; +RAMSIZE .SET 1536 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) MEMMGR .SET MM_ZRC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180] ; UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index bd4e40a2..f6579df9 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -575,7 +575,7 @@ HBX_BNKCPY: SC Z280_BNKCPYX ; SYSCALL TO BNKCPYX RET ; -IOPRVAL .DW 0 ; TEMP STORAGE FOR IOPR +IOPRSAV .DW 0 ; TEMP STORAGE FOR IOPR ; #ELSE #IF (CPUFAM == CPU_Z280) @@ -1529,6 +1529,17 @@ MBC_SINGLE: #ENDIF ; #ENDIF +; +; IF THIS IS NOT A ROMBOOT, THEN WE NEED TO COPY THE "APP" BANK TO +; TPA. IT IS DONE PRIOR TO COPYING HBIOS TO IT'S FINAL BANK BECAUSE +; THE SOURCE OF THE APP BANK CODE MAY BE THE BANK THAT HBIOS WANTS TO +; USE AS IT'S FINAL LOCATION (PRIMARILY IN CASE OF RAMBOOT WHERE THE +; SYSTEM HAS THE MINIMUM 128KB OF RAM). +; + + + + ; ; IF ALREADY EXECUTING IN RAM, BYPASS RAM BANK INSTALLATION ; @@ -5428,7 +5439,7 @@ Z280_BNKCPY: ; SELECT I/O PAGE $FF LD C,Z280_IOPR ; I/O PAGE REGISTER LDCTL HL,(C) ; GET CURRENT I/O PAGE - LD (IOPRVAL),HL ; SAVE IT + LD (IOPRSAV),HL ; SAVE IT LD L,$FF ; I/O PAGE $FF LDCTL (C),HL ; @@ -5456,7 +5467,7 @@ Z2DMALOOP: ; ; RESTORE I/O PAGE LD C,Z280_IOPR ; I/O PAGE REGISTER - LD HL,(IOPRVAL) ; RESTORE I/O PAGE + LD HL,(IOPRSAV) ; RESTORE I/O PAGE LDCTL (C),HL ; ; SETUP RETURN VALUES diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index dcc452eb..51669aad 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -513,13 +513,13 @@ BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1)) ; BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK ^ RAM BID_RAMDN .EQU BID_RAMN - TOT_RAM_RB ; LAST RAM DRIVE BANK | DRIVE -; ; OS BUFFERS CP/M3? -+ THESE -; ; OS BUFFERS CP/M3? | MAKE -; ; OS BUFFERS CP/M3? | UP -; ; OS BUFFERS CP/M3? | THE -BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.) | 256KB +; ; OS BUFFERS CP/M3? -+ THESE CPM3 BNK 5 (BUF) +; ; OS BUFFERS CP/M3? | MAKE CPM3 BNK 4 (BUF) +; ; OS BUFFERS CP/M3? | UP CPM3 BNK 3 (BUF) +; ; OS BUFFERS CP/M3? | THE CPM3 BNK 2 (BUF) +BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.) | 256KB CPM3 BNK 1 (TPA) BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK | RESERVED -BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.) | RAM +BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.) | RAM CPM3 BNK 0 (OS) BID_COM .EQU BID_RAMN - 0 ; COMMON BANK, UPPER 32K -+ BANKS BID_BOOT .EQU BID_ROM0 + 0 ; BOOT BANK -+ THESE MAKE BID_IMG0 .EQU BID_ROM0 + 1 ; ROM LOADER AND FIRST IMAGES BANK | UP THE 128KB diff --git a/Source/ver.inc b/Source/ver.inc index afcf6d1e..ea9cd84d 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.158" +#DEFINE BIOSVER "3.1.1-pre.159" diff --git a/Source/ver.lib b/Source/ver.lib index 64bd8a1c..42a77a7b 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.158" + db "3.1.1-pre.159" endm diff --git a/Tools/Makefile.inc b/Tools/Makefile.inc index 59b7e6d5..da16e091 100644 --- a/Tools/Makefile.inc +++ b/Tools/Makefile.inc @@ -112,6 +112,9 @@ CPM=$(TOOLS)/cpm/bin80/ %.rel: %.mac $(ZXCC) $(CPM)/M80 -=$(basename $<) +%.com: %.rel + $(ZXCC) $(CPM)/L80 -$(basename $<),$(basename $<).com/n/e + ifeq ($(UNAME), Linux) %.eeprom: %.spin $(BSTC) -e -l $<