mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Z280 Native Bug Fix
- Fix CP/M 3 and ZPM3 disk boot issue. - Relocate Z280 BNKCPY to HBIOS bank.
This commit is contained in:
@@ -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
|
||||
;==================================================================================================
|
||||
|
||||
Reference in New Issue
Block a user