From 6a0837e9088e996ddad9b3eb08a49e706530e084 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 22 Jan 2021 16:45:43 -0800 Subject: [PATCH 1/3] Z280 Work in Progress - API callls now run in system mode - Expansion of proxy size has been reverted --- Source/CBIOS/config.asm | 2 +- Source/HBIOS/hbios.asm | 513 ++++++++++++++++++++++++++++------------ Source/HBIOS/std.asm | 3 +- Source/HBIOS/z280.inc | 30 +++ Source/ver.inc | 2 +- Source/ver.lib | 2 +- 6 files changed, 396 insertions(+), 156 deletions(-) diff --git a/Source/CBIOS/config.asm b/Source/CBIOS/config.asm index 0c2017aa..180feaeb 100644 --- a/Source/CBIOS/config.asm +++ b/Source/CBIOS/config.asm @@ -8,7 +8,7 @@ DSKTRACE .EQU FALSE ; ENABLE TRACING OF CBIOS DISK FUNCTION CALLS CPM_LOC .EQU $D000 ; LOCATION OF START OF CCP ; #IFDEF PLTWBW -CPM_END .EQU $FD80 ; ROMWBW HBIOS PROXY OCCUPIES TOP $280 BYTES OF MEMORY +CPM_END .EQU $FE00 ; ROMWBW HBIOS PROXY OCCUPIES TOP $280 BYTES OF MEMORY #ENDIF ; #IFDEF PLTUNA diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 3f90969d..fa5ece4c 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -64,6 +64,12 @@ ; - dsky.asm ; - unlzsa2s.asm ; +; TOTO +; - 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 +; ; ; INCLUDE GENERIC STUFF ; @@ -247,91 +253,6 @@ CB_BIDROMDN .DB BID_ROMDN ; .FILL (HBX_IMG - $) ; FILL TO START OF PROXY IMAGE START .ORG HBX_LOC ; ADJUST FOR RELOCATION - -; -; Z280 BANK SELECTION (CALLED FROM PROXY) -; -#IF (MEMMGR == MM_Z280) -; -Z280_BNKSEL: - PUSH HL - PUSH DE - PUSH BC - LD L,$FF ; MMU PAGE I/O REG IS $FF - LD C,8 ; REG C POINTS TO I/O PAGE REGISTER - .DB $ED,$6E ; OP CODE FOR LDCTL (C),HL - LD E,0 ; DE IS TEMPLATE - BIT 7,A - JR Z,MMU_ROM ; TO ROM ROUTINE IF BIT 7 IS ZERO - RES 7,A - RR A ; EXTRACT THE LSB - PUSH AF ; SAVE THE CONDITION FLAG - OR $08 ; RAM BASE IS $080000 - LD D,A ; REG D CONTAINS THE HIGH BYTE TEMPLATE - POP AF - JR C,W_MMU1 - JR W_MMU0 -MMU_ROM: - OR A ; CLEAR THE CARRY FLAG - RR A ; EXTRACT THE LSB - LD D,A ; REG D CONTAINS THE HIGH BYTE TEMPLATE - JR C,W_MMU1 -W_MMU0: - LD A,$10 ; SYSTEM PAGE - OUT (Z280_MMUPDRPTR),A - LD C,Z280_MMUBLKMOV ; ACCESS BLOCK MOVE PORT SO POINTER WILL AUTOINCREM - LD H,D ; GET TEMPLATE INTO HL - LD L,$0A ; LOWEST 4K OF MEMORY - .DB $ED,$BF ; OUTW (C),HL - LD L,$1A ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$2A ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$3A ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$4A ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$5A ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$6A ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$7A ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - JR W_MMU2 -W_MMU1: - LD A,$10 ; SYSTEM PAGE - OUT (Z280_MMUPDRPTR),A - LD C,Z280_MMUBLKMOV ; ACCESS BLOCK MOVE PORT SO POINTER WILL AUTOINCREM - LD H,D ; GET TEMPLATE INTO HL - LD L,$8A ; LOWEST 4K OF MEMORY - .DB $ED,$BF ; OUTW (C),HL - LD L,$9A ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$AA ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$BA ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$CA ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$DA ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$EA ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL - LD L,$FA ; MODIFY THE TEMPLATE FOR NEXT 4K - .DB $ED,$BF ; OUTW (C),HL -W_MMU2: - .DB $ED,$65 ; PCACHE - LD L,0 ; RESTORE I/O PAGE REG TO 0 - LD C,8 - .DB $ED,$6E ; LDCTL (C),HL - POP BC - POP DE - POP HL - RET -; -#ENDIF -; - .FILL ($FE00 - $) ; ; MEMORY LAYOUT: ; @@ -377,8 +298,7 @@ HBX_INVOKE: POP HL ; RESTORE HL #ENDIF -;#IF (MEMMGR == MM_Z280) -#IF 0 +#IF (MEMMGR == MM_Z280) LD A,(HB_CURBNK) ; GET CURRENT BANK LD (HB_INVBNK),A ; SAVE INVOCATION BANK @@ -390,8 +310,17 @@ HBX_INVOKE: .DW HB_DISPATCH ; SC PARAMETER PUSH AF ; SAVE AF (FUNCTION RETURN) + PUSH HL ; SAVE HL LD A,(HB_INVBNK) ; LOAD ORIGINAL BANK - LD (HB_CURBNK),A + LD HL,HB_CURBNK + CP (HL) ; BANK CHANGE? + POP HL ; RESTORE HL + JR Z,HBX_INVOKE1 ; SKIP IF NO CHANGE + CALL HBX_BNKSEL ; DO THE CHANGE + JR HBX_INVOKE2 ; AND CONTINUE +HBX_INVOKE1: + LD (HB_CURBNK),A ; JUST UPDATE CURBNK FIELD +HBX_INVOKE2: POP AF ; RESTORE AF #ELSE @@ -555,6 +484,97 @@ HBX_ROM: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; HBX_BNKCPY: +#IF (MEMMGR == MM_Z280) + ; 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 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 + + 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 +#ELSE LD A,I DI PUSH AF @@ -610,6 +630,7 @@ HBX_BC_ITER: POP HL ; RECOVER UPDATED SRC ADR ; HL = UPDATED SRC, DE = UPDATED DEST, BC = 0 RET +#ENDIF ; ; CALL A ROUTINE IN ANOTHER BANK. ; CALLER MUST ENSURE STACK IS ALREADY IN HIGH MEMORY AND HAS ADEQUATE SPACE. @@ -1023,28 +1044,12 @@ HB_START: LD L,$00 ; NORMAL I/O REG IS $00 LD C,$08 ; REG C POINTS TO I/O PAGE REGISTER .DB $ED,$6E ; LDCTL (C),HL -;; -; ; COPY Z280 BANK SELECTION CODE TO $FD80 -; LD HL,Z280_BNKSEL ; SOURCE -; LD DE,$FD80 ; DESTINATION -; LD BC,Z280_BNKSELZ-Z280_BNKSEL ; BYTE COUNT TO COPY -; LDIR ; COPY ; - ; CONFIGURE Z280 INT/TRAP VECTOR TABLE POINTER REGISTER LD C,Z280_VPR LD HL,$0010 ; TOP 16 BITS OF PHYSICAL ADR OF IVT .DB $ED,$6E ; LDCTL (C),HL - - ;; TEST SYSTEM CALL - ;.DB $ED,$71 ; SC - ;.DW Z280_BNKSEL ; SC PARAMETER - ; - ;LD A,%10101010 - ;OUT (DIAGPORT),A - ;DI - ;HALT - +; JR Z280_INITZ ; JUMP TO CODE CONTINUATION ; Z280_PDRTBL: @@ -1275,7 +1280,6 @@ Z280_INITZ: LD DE,0 LD BC,$8000 CALL HBX_BNKCPY - ;DI ; ; TRANSITION TO HBIOS IN RAM BANK ; @@ -1749,6 +1753,158 @@ NXTMIO: LD A,(HL) CALL PRTSTRD .TEXT "HBIOS MUTEX ENABLED$" #ENDIF + + + +;;; +;;; TEST DMA ***************************************************************************************** +;;; +;;TSTDMA: +;; +;; CALL NEWLINE +;; LD DE,TSTDST +;; LD A,$10 +;; CALL PRTHEXBUF +;; +;; ; 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 +;; +;; LD A,$8D +;; LD (HB_DSTBNK),A +;; LD (HB_SRCBNK),A +;; LD HL,TSTSRC +;; LD DE,TSTDST +;; LD BC,$0010 +;; +;; +;; +;; CALL HBX_BNKCPY +;; JP ENDTST +;; +;; 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 SETADR ; SETUP DEST ADR +;; +;; LD (DSTHI),IY +;; LD (DSTLO),IX +;; +;; POP DE ; SRC ADR TO DE +;; LD A,(HB_SRCBNK) ; DEST BANK TO ACCUM +;; CALL SETADR +;; +;; LD (SRCHI),IY +;; LD (SRCLO),IX +;; +;; 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 +;;DMALOOP: +;; .DB $ED,$B7 ; INW HL,(C) +;; BIT 7,H ; CHECK EN BIT OF TDR +;; JR NZ,DMALOOP ; 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 +;; +;; JR ENDTST +;; +;;SETADR: +;; +;; ; SET ADDRESS REGISTERS, BANK IN A, ADDRESS IN DE +;; ; C POINTS TO FIRST DMA ADR PORT TO SET +;; +;; BIT 7,A ; RAM? +;; JR Z,CONT ; NO, SKIP +;; RES 7,A ; CLEAR RAM BIT +;; SET 4,A ; SET BIT FOR 512K OFFSET +;; +;;CONT: +;; ; 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 +;; +;; PUSH HL +;; POP IX +;; +;; ; 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 +;; +;; PUSH HL +;; POP IY +;; +;; .DB $ED,$BF ; OUTW (C),HL +;; INC C ; BUMP TO NEXT REG +;; +;; RET +;; +;; +;;TSTSRC .DB $00, $11, $22, $33, $44, $55, $66, $77 +;; .DB $88, $99, $AA, $BB, $CC, $DD, $EE, $FF +;; +;;TSTDST .FILL 16,$12 +;; +;;SRCHI .DW 0 +;;SRCLO .DW 0 +;;DSTHI .DW 0 +;;DSTLO .DW 0 +;; +;;ENDTST: +;; CALL NEWLINE +;; LD BC,(SRCHI) +;; CALL PRTHEXWORD +;; CALL PC_SPACE +;; LD BC,(SRCLO) +;; CALL PRTHEXWORD +;; CALL NEWLINE +;; LD BC,(DSTHI) +;; CALL PRTHEXWORD +;; CALL PC_SPACE +;; LD BC,(DSTLO) +;; CALL PRTHEXWORD +;; +;; CALL NEWLINE +;; LD DE,TSTDST +;; LD A,$10 +;; CALL PRTHEXBUF ; DIAG(%11111111) ; @@ -1982,10 +2138,13 @@ IS_REC_M1: #ENDIF ; INITSYS3: + CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE +; +INITSYS4: ; #IF (MEMMGR == MM_Z280) ; LEAVE SYSTEM MODE STACK POINTING TO AN OK PLACE - LD SP,HB_STACK - $40 ; *** FIX *** + LD SP,HB_STACK ; NOW USE REAL SYSTEM STACK LOC HB_DI @@ -1993,31 +2152,18 @@ INITSYS3: XOR A LD (W_MMU0+1),A LD (W_MMU1+1),A - - ;DIAG(%10000001) - ;DI - ;HALT + + ; FIXUP SYSCALL TO KEEP INTERRUPTS ENABLED + LD HL,$007F + LD (Z280_IVT + $50),HL ; MAKE USER MODE BANK CORRECT LD A,(HB_CURBNK) ; GET CURRENT BANK CALL HBX_BNKSEL - - ;DIAG(%10000011) - ;DI - ;HALT - - ;LD C,Z280_TCR - ;.DB $ED,$66 ; LDCTL HL,(C) - ;LD A,L - ;CALL PC_SPACE - ;CALL PRTHEXBYTE - - LD HL,HBX_LOC - .DB $ED,$8F ; LDCTL USP,HL - ;DIAG(%10000111) - ;DI - ;HALT + ; PRESET THE USER MODE STACK + LD HL,HBX_LOC + .DB $ED,$8F ; LDCTL USP,HL HB_EI @@ -2025,22 +2171,7 @@ INITSYS3: LD C,Z280_MSR LD HL,$407F .DB $ED,$6E ; LDCTL (C),HL - ;LD A,%10001111 - ;OUT (DIAGPORT),A - - ;DI - ;HALT - LD SP,HBX_LOC ; SETUP INITIAL STACK JUST BELOW HBIOS PROXY - - ;DIAG(%10001111) - ;CALL LDELAY - - ;DIAG(%10011111) - ;CALL LDELAY - #ENDIF -; - CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE ; ; CHAIN TO OS LOADER ; @@ -2052,13 +2183,6 @@ INITSYS3: HALT ; WE SHOULD NEVER COME BACK! #ELSE ; COPY OS IMAGE: BID_USR: --> BID_USR:0 - ;LD A,BID_USR - ;LD (HB_SRCBNK),A - ;LD (HB_DSTBNK),A - ;LD HL,HB_END - ;LD DE,0 - ;LD BC,$8000 - ;CALL HBX_BNKCPY LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY LD D,BID_USR ; D = DEST BANK = USER BANK ;LD E,BID_USR ; E = SRC BANK = USER BANK @@ -2067,7 +2191,7 @@ INITSYS3: LD HL,$8000 ; HL = COPY LEN = ENTIRE BANK RST 08 ; DO IT LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY - LD HL,HB_END ; COPY FROM END OF OF HBIOS + LD HL,HB_END ; COPY FROM END OF HBIOS LD DE,0 ; TO USER ADDRESS 0 RST 08 ; DO IT ; @@ -2866,12 +2990,17 @@ SYS_RESINT: ; SYS_RESWARM: CALL SYS_RESINT +; +#IF (MEMMGR == MM_Z280) + JP INITSYS4 +#ELSE ; PERFORM BANK CALL TO OS IMAGES BANK IN ROM LD SP,HBX_LOC ; STACK JUST BELOW HBIOS PROXY LD A,BID_IMG0 ; CHAIN TO OS IMAGES BANK LD IX,0 ; ENTER AT ADDRESS 0 CALL HBX_BNKCALL ; GO THERE HALT ; WE SHOULD NEVER COME BACK! +#ENDIF ; ; RESTART SYSTEM AS THOUGH POWER HAD JUST BEEN TURNED ON ; @@ -3741,7 +3870,7 @@ Z280_IVT: .DW $0000 ; INT A MSR .DW 0 ; INT A VECTOR .FILL $50 - ($ - Z280_IVT),0 ; SKIP TO SYS CALL TRAP VECTOR - .DW $0000 ; SYS CALL, NEW MSR + .DW $0000 ; SYS CALL, NEW MSR (UPDATED @ RUNTIME) .DW Z280_SYSCALL ; SYS CALL, VECTOR ADR .DW $0000 ; PRIV INST TRAP, NEW MSR .DW Z280_PRIVINST ; PRIV INST, VECTOR ADR @@ -3766,6 +3895,88 @@ Z280_IVT: ; #ENDIF ; +; Z280 BANK SELECTION (CALLED FROM PROXY) +; +#IF (MEMMGR == MM_Z280) +; +Z280_BNKSEL: + PUSH HL + PUSH DE + PUSH BC + LD L,$FF ; MMU PAGE I/O REG IS $FF + LD C,8 ; REG C POINTS TO I/O PAGE REGISTER + .DB $ED,$6E ; OP CODE FOR LDCTL (C),HL + LD E,0 ; DE IS TEMPLATE + BIT 7,A + JR Z,MMU_ROM ; TO ROM ROUTINE IF BIT 7 IS ZERO + RES 7,A + RR A ; EXTRACT THE LSB + PUSH AF ; SAVE THE CONDITION FLAG + OR $08 ; RAM BASE IS $080000 + LD D,A ; REG D CONTAINS THE HIGH BYTE TEMPLATE + POP AF + JR C,W_MMU1 + JR W_MMU0 +MMU_ROM: + OR A ; CLEAR THE CARRY FLAG + RR A ; EXTRACT THE LSB + LD D,A ; REG D CONTAINS THE HIGH BYTE TEMPLATE + JR C,W_MMU1 +W_MMU0: + LD A,$10 ; SYSTEM PAGE + OUT (Z280_MMUPDRPTR),A + LD C,Z280_MMUBLKMOV ; ACCESS BLOCK MOVE PORT SO POINTER WILL AUTOINCREM + LD H,D ; GET TEMPLATE INTO HL + LD L,$0A ; LOWEST 4K OF MEMORY + .DB $ED,$BF ; OUTW (C),HL + LD L,$1A ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$2A ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$3A ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$4A ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$5A ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$6A ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$7A ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + JR W_MMU2 +W_MMU1: + LD A,$10 ; SYSTEM PAGE + OUT (Z280_MMUPDRPTR),A + LD C,Z280_MMUBLKMOV ; ACCESS BLOCK MOVE PORT SO POINTER WILL AUTOINCREM + LD H,D ; GET TEMPLATE INTO HL + LD L,$8A ; LOWEST 4K OF MEMORY + .DB $ED,$BF ; OUTW (C),HL + LD L,$9A ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$AA ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$BA ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$CA ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$DA ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$EA ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL + LD L,$FA ; MODIFY THE TEMPLATE FOR NEXT 4K + .DB $ED,$BF ; OUTW (C),HL +W_MMU2: + ;.DB $ED,$65 ; PCACHE + LD L,0 ; RESTORE I/O PAGE REG TO 0 + LD C,8 + .DB $ED,$6E ; LDCTL (C),HL + POP BC + POP DE + POP HL + RET +; +#ENDIF +; ;================================================================================================== ; DEVICE DRIVERS ;================================================================================================== diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index b95339bc..55b266d9 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -443,8 +443,7 @@ BID_COM .EQU BID_RAMN ; COMMON BANK, UPPER 32K ; SYS_SIZ .EQU $3000 ; COMBINED SIZE OF SYSTEM AREA (OS + HBIOS PROXY) HBBUF_SIZ .EQU 1024 ; INVARIANT HBIOS PHYSICAL DISK BUFFER, 1K -;HBX_SIZ .EQU $200 ; HBIOS PROXY SIZE (SUBJECT TO CHANGE) -HBX_SIZ .EQU $200 + $80 ; HBIOS PROXY SIZE (TEMP) +HBX_SIZ .EQU $200 ; HBIOS PROXY SIZE (SUBJECT TO CHANGE) CPM_SIZ .EQU SYS_SIZ - HBX_SIZ ; NET SIZE OF ALL OS COMPONENTS (EXCLUDING HBIOS PROXY) CCP_SIZ .EQU $800 ; INVARIANT SIZE OF CCP BDOS_SIZ .EQU $E00 ; INVARIANT SIZE OF BDOS diff --git a/Source/HBIOS/z280.inc b/Source/HBIOS/z280.inc index 802af93d..7c09e454 100644 --- a/Source/HBIOS/z280.inc +++ b/Source/HBIOS/z280.inc @@ -19,3 +19,33 @@ Z280_MMUPDRPTR .EQU $F1 ; Z280 MMU PDR POINTER REG Z280_MMUINV .EQU $F2 ; Z280 MMU INVALIDATION PORT Z280_MMUBLKMOV .EQU $F4 ; Z280 MMU BLOCK MOVE PORT Z280_MMUPDR .EQU $F5 ; Z280 MMU PDR PORT +; +Z280_DMA0_DSTL .EQU $00 ; DMA0 DESTINATION ADDRESS LOW +Z280_DMA0_DSTH .EQU $01 ; DMA0 DESTINATION ADDRESS HIGH +Z280_DMA0_SRCL .EQU $02 ; DMA0 SOURCE ADDRESS LOW +Z280_DMA0_SRCH .EQU $03 ; DMA0 SOURCE ADDRESS HIGH +Z280_DMA0_CNT .EQU $04 ; DMA0 COUNT +Z280_DMA0_TDR .EQU $05 ; DMA0 TRANSACTION DESCRIPTION REG +; +Z280_DMA1_DSTL .EQU $08 ; DMA1 DESTINATION ADDRESS LOW +Z280_DMA1_DSTH .EQU $09 ; DMA1 DESTINATION ADDRESS HIGH +Z280_DMA1_SRCL .EQU $0A ; DMA1 SOURCE ADDRESS LOW +Z280_DMA1_SRCH .EQU $0B ; DMA1 SOURCE ADDRESS HIGH +Z280_DMA1_CNT .EQU $0C ; DMA1 COUNT +Z280_DMA1_TDR .EQU $0D ; DMA1 TRANSACTION DESCRIPTION REG +; +Z280_DMA2_DSTL .EQU $10 ; DMA2 DESTINATION ADDRESS LOW +Z280_DMA2_DSTH .EQU $11 ; DMA2 DESTINATION ADDRESS HIGH +Z280_DMA2_SRCL .EQU $12 ; DMA2 SOURCE ADDRESS LOW +Z280_DMA2_SRCH .EQU $13 ; DMA2 SOURCE ADDRESS HIGH +Z280_DMA2_CNT .EQU $14 ; DMA2 COUNT +Z280_DMA2_TDR .EQU $15 ; DMA2 TRANSACTION DESCRIPTION REG +; +Z280_DMA3_DSTL .EQU $18 ; DMA3 DESTINATION ADDRESS LOW +Z280_DMA3_DSTH .EQU $19 ; DMA3 DESTINATION ADDRESS HIGH +Z280_DMA3_SRCL .EQU $1A ; DMA3 SOURCE ADDRESS LOW +Z280_DMA3_SRCH .EQU $1B ; DMA3 SOURCE ADDRESS HIGH +Z280_DMA3_CNT .EQU $1C ; DMA3 COUNT +Z280_DMA3_TDR .EQU $1D ; DMA3 TRANSACTION DESCRIPTION REG + + diff --git a/Source/ver.inc b/Source/ver.inc index 41fc494e..272f6272 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.29" +#DEFINE BIOSVER "3.1.1-pre.30" diff --git a/Source/ver.lib b/Source/ver.lib index ec2a37e5..7129a62f 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.29" + db "3.1.1-pre.30" endm From 06ac451aa623a8bc8f4a1c4166b13317cd90253c Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 22 Jan 2021 20:43:04 -0800 Subject: [PATCH 2/3] 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 ;================================================================================================== From 3f8cc830f765bb8fab31d03d2e37380382084dc3 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 22 Jan 2021 20:43:47 -0800 Subject: [PATCH 3/3] Bump Version --- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/ver.inc b/Source/ver.inc index 272f6272..a7247d12 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.30" +#DEFINE BIOSVER "3.1.1-pre.31" diff --git a/Source/ver.lib b/Source/ver.lib index 7129a62f..160177cf 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.30" + db "3.1.1-pre.31" endm