Browse Source

Z280 Native Bug Fix

- Fix CP/M 3 and ZPM3 disk boot issue.
- Relocate Z280 BNKCPY to HBIOS bank.
pull/199/head
Wayne Warthen 5 years ago
parent
commit
06ac451aa6
  1. 181
      Source/HBIOS/hbios.asm

181
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
;==================================================================================================

Loading…
Cancel
Save