|
|
|
@ -64,6 +64,13 @@ |
|
|
|
; - dsky.asm |
|
|
|
; - unlzsa2s.asm |
|
|
|
; |
|
|
|
; 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 |
|
|
|
; |
|
|
|
@ -122,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 |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
@ -247,91 +274,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 +319,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 +331,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 +505,123 @@ 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 |
|
|
|
; 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 |
|
|
|
|
|
|
|
#ELSE |
|
|
|
LD A,I |
|
|
|
DI |
|
|
|
PUSH AF |
|
|
|
@ -610,6 +677,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,29 +1091,13 @@ 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 |
|
|
|
; |
|
|
|
JP Z280_INITZ ; JUMP TO CODE CONTINUATION |
|
|
|
; |
|
|
|
Z280_PDRTBL: |
|
|
|
; LOWER 32 K (BANKED) |
|
|
|
@ -1077,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 |
|
|
|
@ -1096,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 |
|
|
|
@ -1275,7 +1343,6 @@ Z280_INITZ: |
|
|
|
LD DE,0 |
|
|
|
LD BC,$8000 |
|
|
|
CALL HBX_BNKCPY |
|
|
|
;DI |
|
|
|
; |
|
|
|
; TRANSITION TO HBIOS IN RAM BANK |
|
|
|
; |
|
|
|
@ -1749,6 +1816,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 +2201,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 +2215,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 +2234,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 +2246,6 @@ INITSYS3: |
|
|
|
HALT ; WE SHOULD NEVER COME BACK! |
|
|
|
#ELSE |
|
|
|
; COPY OS IMAGE: BID_USR:<IMG START> --> 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 +2254,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 +3053,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 +3933,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 +3958,198 @@ 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 |
|
|
|
; |
|
|
|
; 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 |
|
|
|
;================================================================================================== |
|
|
|
|