From 06ac451aa623a8bc8f4a1c4166b13317cd90253c Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 22 Jan 2021 20:43:04 -0800 Subject: [PATCH] Z280 Native Bug Fix - Fix CP/M 3 and ZPM3 disk boot issue. - Relocate Z280 BNKCPY to HBIOS bank. --- Source/HBIOS/hbios.asm | 181 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 177 insertions(+), 4 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index fa5ece4c..d522bab0 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -64,11 +64,12 @@ ; - dsky.asm ; - unlzsa2s.asm ; -; TOTO +; TODO ; - Add remaining service routine stubs for IM3 (NMI, etc.) ; - Review PEEK/POKE code for Z280 ; - Review bank selection code (selectable user/sys bank?) ; - Check app boot under Z280 +; - Relocate Z280_PRIVINST ; ; ; INCLUDE GENERIC STUFF @@ -128,6 +129,26 @@ MODCNT .SET MODCNT + 1 .ECHO "*** ERROR: INVALID INTMODE SETTING!!!\n" !!! ; FORCE AN ASSEMBLY ERROR #ENDIF +#IF (INTMODE == 3) + #IF (CPUFAM != CPU_Z280) + .ECHO "*** ERROR: INTMODE 3 REQUIRES Z280 FAMILY CPU!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR + #ENDIF + #IF (MEMMGR != MM_Z280) + .ECHO "*** ERROR: INTMODE 3 REQUIRES Z280 MEMORY MANAGER!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR + #ENDIF +#ENDIF +#IF (MEMMGR == MM_Z280) + #IF (INTMODE != 3) + .ECHO "*** ERROR: Z280 MEMORY MANAGER REQUIRES INTMODE 3!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR + #ENDIF + #IF (CPUFAM != CPU_Z280) + .ECHO "*** ERROR: Z280 MEMORY MANAGER REQUIRES Z280 FAMILY CPU!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR + #ENDIF +#ENDIF ; ; ; @@ -485,6 +506,16 @@ HBX_ROM: ; HBX_BNKCPY: #IF (MEMMGR == MM_Z280) + .DB $ED,$71 ; SC + .DW Z280_BNKCPY ; SC PARAMETER + RET + +; +; Z280 BANK SELECTION (CALLED FROM PROXY) +; +#IF (MEMMGR == MM_Z280) & FALSE +; +Z280_BNKCPY: ; Z280 MEMORY TO MEMORY DMA ; USE FLOW THROUGH MODE DMA ; SINGLE BYTE TRANSFER @@ -495,6 +526,10 @@ HBX_BNKCPY: ; - SINGLE TRANSACTION ; - 1 BYTE XFER SIZE + PUSH HL + PUSH DE + PUSH BC + PUSH BC ; SAVE COUNT PUSH HL ; SAVE SOURCE ADDRESS @@ -529,7 +564,17 @@ Z2DMALOOP: XOR A ; I/O PAGE ZERO LD C,Z280_IOPR ; I/O PAGE REGISTER .DB $ED,$6E ; LDCTL (C),HL - + + ; SETUP RETURN VALUES + POP BC ; RECOVER ORIGINAL BC + POP DE ; RECOVER ORIGINAL DE + POP HL ; RECOVER ORIGINAL HL + ADD HL,BC ; INCREMENT SRC ADR BY COUNT + EX DE,HL ; SWAP + ADD HL,BC ; INCREMENT DST ADR BY COUNT + EX DE,HL ; SWAP BACK + LD BC,0 ; COUNT IS NOW ZERO + RET Z2DMAADR: @@ -574,6 +619,8 @@ Z2DMAADR1: INC C ; BUMP TO NEXT REG RET +#ENDIF + #ELSE LD A,I DI @@ -1050,7 +1097,7 @@ HB_START: LD HL,$0010 ; TOP 16 BITS OF PHYSICAL ADR OF IVT .DB $ED,$6E ; LDCTL (C),HL ; - JR Z280_INITZ ; JUMP TO CODE CONTINUATION + JP Z280_INITZ ; JUMP TO CODE CONTINUATION ; Z280_PDRTBL: ; LOWER 32 K (BANKED) @@ -1082,9 +1129,13 @@ Z280_PRIVINST: PUSH BC PUSH DE - LD A,(HL) + .DB $ED,$96 ; LDUP A,(HL) INC HL ; BUMP PAST PRIV INST + ;CALL PC_LBKT + ;CALL PRTHEXBYTE + ;CALL PC_RBKT + ; HANDLE DI CP $F3 ; DI? JR NZ,Z280_PRIVINST2 @@ -1101,9 +1152,21 @@ Z280_PRIVINST2: Z280_PRIVINST_HALT: ; SOMETHING ELSE, DIAGNOSE & HALT SYSTEM + PUSH HL + CALL PC_LBKT + CALL PRTHEXBYTE + .DB $ED,$96 ; LDUP A,(HL) + CALL PRTHEXBYTE + INC HL + .DB $ED,$96 ; LDUP A,(HL) + CALL PRTHEXBYTE + CALL PC_RBKT + POP HL + CALL NEWLINE LD DE,Z280_PRIVSTR CALL WRITESTR + DEC HL CALL PRTHEXWORDHL DI @@ -3977,6 +4040,116 @@ W_MMU2: ; #ENDIF ; +; Z280 BANK SELECTION (CALLED FROM PROXY) +; +#IF (MEMMGR == MM_Z280) +; +Z280_BNKCPY: + ; Z280 MEMORY TO MEMORY DMA + ; USE FLOW THROUGH MODE DMA + ; SINGLE BYTE TRANSFER + ; TRANSACTION DESCRIPTION REGISTER (TDR) + ; %0000 0000 0000 0000 + ; - AUTO INCREMENT MEMORY + ; - FLOWTHROUGH OPERATION + ; - SINGLE TRANSACTION + ; - 1 BYTE XFER SIZE + + PUSH HL + PUSH DE + PUSH BC + + PUSH BC ; SAVE COUNT + PUSH HL ; SAVE SOURCE ADDRESS + + ; SELECT I/O PAGE $FF + LD L,$FF ; I/O PAGE $FF + LD C,Z280_IOPR ; I/O PAGE REGISTER + .DB $ED,$6E ; LDCTL (C),HL + + LD C,Z280_DMA0_DSTL ; START WITH DEST REG LO + + LD A,(HB_DSTBNK) ; DEST BANK TO ACCUM + CALL Z2DMAADR ; SETUP DEST ADR REGS + + POP DE ; SRC ADR TO DE + LD A,(HB_SRCBNK) ; DEST BANK TO ACCUM + CALL Z2DMAADR ; SETUP SOURCE ADR REGS + + POP HL ; COUNT TO HL + .DB $ED,$BF ; OUTW (C),HL + INC C ; BUMP TO TDR + + LD HL,$8000 ; ENABLE DMA0 TO RUN! + .DB $ED,$BF ; OUTW (C),HL + + ; WAIT FOR XFER TO COMPLETE +Z2DMALOOP: + .DB $ED,$B7 ; INW HL,(C) + BIT 7,H ; CHECK EN BIT OF TDR + JR NZ,Z2DMALOOP ; LOOP WHILE ACTIVE + + ; RETURN TO I/O PAGE $00 + XOR A ; I/O PAGE ZERO + LD C,Z280_IOPR ; I/O PAGE REGISTER + .DB $ED,$6E ; LDCTL (C),HL + + ; SETUP RETURN VALUES + POP BC ; RECOVER ORIGINAL BC + POP DE ; RECOVER ORIGINAL DE + POP HL ; RECOVER ORIGINAL HL + ADD HL,BC ; INCREMENT SRC ADR BY COUNT + EX DE,HL ; SWAP + ADD HL,BC ; INCREMENT DST ADR BY COUNT + EX DE,HL ; SWAP BACK + LD BC,0 ; COUNT IS NOW ZERO + + RET + +Z2DMAADR: + ; SET ADDRESS REGISTERS, BANK IN A, ADDRESS IN DE + ; C POINTS TO FIRST DMA ADR PORT TO SET + BIT 7,D ; HIGH RAM? + JR Z,Z2DMAADR0 ; NO, SKIP + LD A,$8F ; SUBSTITUTE COMMON RAM BANK ID + +Z2DMAADR0: + BIT 7,A ; RAM? + JR Z,Z2DMAADR1 ; NO, SKIP + RES 7,A ; CLEAR RAM BIT + SET 4,A ; SET BIT FOR 512K OFFSET + +Z2DMAADR1: + ; ADR HI FROM A:DE + LD L,D ; L=XAAA AAAA + LD H,A ; H=BBBB BBBB + SLA L ; L=AAAA AAA0 + SRL H ; H=0BBB BBBB B + RR L ; L=BAAA AAAA + LD A,$0F ; A=0000 1111 + OR L ; A=BAAA 1111 + LD L,A ; L=BAAA 1111 + PUSH HL ; SAVE IT FOR NOW + + ; ADR LO FROM DE: + LD L,E ; L= AAAA AAAA + LD A,$F0 ; A= 1111 0000 + OR D ; A= 1111 AAAA + LD H,A ; HL=1111 AAAA AAAA AAAA + + ; SET ADR LO REG + .DB $ED,$BF ; OUTW (C),HL + INC C ; BUMP TO ADR HI REG + + ; SET ADR HI REG + POP HL ; RECOVER THE HI VAL + + .DB $ED,$BF ; OUTW (C),HL + INC C ; BUMP TO NEXT REG + + RET +#ENDIF +; ;================================================================================================== ; DEVICE DRIVERS ;==================================================================================================