diff --git a/Doc/ROM Applications.pdf b/Doc/ROM Applications.pdf index 6f67aa2c..0eea282c 100644 Binary files a/Doc/ROM Applications.pdf and b/Doc/ROM Applications.pdf differ diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index a64d5d21..7b8f44ed 100644 Binary files a/Doc/RomWBW Applications.pdf and b/Doc/RomWBW Applications.pdf differ diff --git a/Doc/RomWBW Architecture.pdf b/Doc/RomWBW Architecture.pdf index 9e3dbb91..f72f69b4 100644 Binary files a/Doc/RomWBW Architecture.pdf and b/Doc/RomWBW Architecture.pdf differ diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 7a3c3a43..e204ef98 100644 Binary files a/Doc/RomWBW Disk Catalog.pdf and b/Doc/RomWBW Disk Catalog.pdf differ diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index a677da60..71978e42 100644 Binary files a/Doc/RomWBW Getting Started.pdf and b/Doc/RomWBW Getting Started.pdf differ diff --git a/ReadMe.md b/ReadMe.md index 8807e9c5..b2abe703 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ ## Z80/Z180 System Software Version 3.1 Pre-release -02 Feb 2022 +28 Feb 2022 Wayne Warthen 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 $<