|
|
|
@ -1862,7 +1862,31 @@ HB_Z280BUS1: |
|
|
|
LD A,INTMODE |
|
|
|
CALL PRTDECB |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
; |
|
|
|
CALL PRTSTRD |
|
|
|
.TEXT ", MMU=$" |
|
|
|
CALL PRTSTRD |
|
|
|
#IF (MEMMGR == MM_NONE) |
|
|
|
.TEXT "NONE$" |
|
|
|
#ENDIF |
|
|
|
#IF (MEMMGR == MM_SBC) |
|
|
|
.TEXT "SBC$" |
|
|
|
#ENDIF |
|
|
|
#IF (MEMMGR == MM_Z2) |
|
|
|
.TEXT "Z2$" |
|
|
|
#ENDIF |
|
|
|
#IF (MEMMGR == MM_N8) |
|
|
|
.TEXT "N8$" |
|
|
|
#ENDIF |
|
|
|
#IF (MEMMGR == MM_Z180) |
|
|
|
.TEXT "Z180$" |
|
|
|
#ENDIF |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
.TEXT "Z280$" |
|
|
|
#ENDIF |
|
|
|
#IF (MEMMGR == MM_ZRC) |
|
|
|
.TEXT "ZRC$" |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; DISPLAY MEMORY CONFIG |
|
|
|
; |
|
|
|
@ -1979,29 +2003,10 @@ INITSYS4: |
|
|
|
|
|
|
|
HB_DI ; NOT SURE THIS IS NEEDED |
|
|
|
|
|
|
|
;; FIXUP BNKSEL TO WORK ON USER MODE PDRS |
|
|
|
;XOR A |
|
|
|
;LD (W_MMU0+1),A |
|
|
|
;LD (W_MMU1+1),A |
|
|
|
|
|
|
|
; FIXUP BNKSEL TO WORK ON USER MODE PDRS |
|
|
|
XOR A |
|
|
|
LD (Z280_BNKSEL2+1),A |
|
|
|
|
|
|
|
;CALL NEWLINE |
|
|
|
;LD DE,$1050 |
|
|
|
;LD A,4 |
|
|
|
;CALL PRTHEXBUF |
|
|
|
|
|
|
|
;; FIXUP SYSCALL TO KEEP INTERRUPTS ENABLED |
|
|
|
;LD HL,$007F |
|
|
|
;LD (Z280_IVT + $50),HL |
|
|
|
|
|
|
|
;CALL NEWLINE |
|
|
|
;LD DE,$1050 |
|
|
|
;LD A,4 |
|
|
|
;CALL PRTHEXBUF |
|
|
|
|
|
|
|
; MAKE USER MODE BANK CORRECT |
|
|
|
LD A,(HB_CURBNK) ; GET CURRENT BANK |
|
|
|
CALL HBX_BNKSEL |
|
|
|
@ -3972,6 +3977,10 @@ HB_TMPREF .DW 0 |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; |
|
|
|
; THE Z280 IVT MUST BE ON A 4K BOUNDARY. IT HAS BEEN LOCATED |
|
|
|
; HERE IN AN EFFORT TO MINIMIZE WASTED SPACE. THERE SHOULD BE |
|
|
|
; A LITTLE LESS THAN 4K OF CODE ABOVE. |
|
|
|
; |
|
|
|
.FILL $1000 - ($ & $FFF) ; MUST BE 4K ALIGNED! |
|
|
|
; |
|
|
|
@ -4028,7 +4037,7 @@ Z280_IVT: |
|
|
|
.DW $0000 ; EPU INTERNAL OPERATION EXTENDED INSTRUCTION TRAP VECTOR |
|
|
|
.DW 0, 0 ; RESERVED |
|
|
|
.DW 0, 0 ; RESERVED |
|
|
|
; PROGRAM COUNTER VALUES FOR NMI/INTA |
|
|
|
; PROGRAM COUNTER VALUES FOR NMI/INTA (16) |
|
|
|
.DW HBX_IV00 |
|
|
|
.DW HBX_IV01 |
|
|
|
.DW HBX_IV02 |
|
|
|
@ -4045,17 +4054,19 @@ Z280_IVT: |
|
|
|
.DW HBX_IV0D |
|
|
|
.DW HBX_IV0E |
|
|
|
.DW HBX_IV0F |
|
|
|
.FILL (128 - 16) * 2, 0 |
|
|
|
; PROGRAM COUNTER VALUES FOR INTB |
|
|
|
.FILL 128 * 2, 0 |
|
|
|
; PROGRAM COUNTER VALUES FOR INTC |
|
|
|
.FILL 128 * 2, 0 |
|
|
|
; THE REMAINDER OF THE Z280 IVT IS TRUNCATED HERE BECAUSE IT |
|
|
|
; TAKES A BUNCH OF SPACE AND IS NOT USED. WE SUPPORT ONLY |
|
|
|
; 16 VECTORED INTERRUPTS AND THEY MUST BE CONNECTED TO INTA. |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; Z280 BANK SELECTION (CALLED FROM PROXY) |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; THIS VERSION USES A MASSIVE (512 BYTE) TABLE TO OPTIMIZE THE |
|
|
|
; SPEED OF THE BANK SWITCH. BY USING THE TABLE, IT IS POSSIBLE |
|
|
|
; EXECUTE THE CORE OF THE BANKSWITCH WITH A SINGLE OTIRW. |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) & FALSE |
|
|
|
; |
|
|
|
; REG A HAS BANK ID |
|
|
|
; |
|
|
|
@ -4068,7 +4079,7 @@ Z280_BNKSEL: |
|
|
|
LD C,Z280_IOPR ; I/O PAGE REGISTER TO C |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
; |
|
|
|
; POINT HL TO STARTING ENTRY TO PROGRAM |
|
|
|
; POINT HL TO STARTING ENTRY TO PROGRAM. |
|
|
|
; OPTIMIZED TO ASSUME HL IS PAGE ALIGNED! |
|
|
|
LD H,Z280_PDRTBL >> 8 |
|
|
|
SLA A |
|
|
|
@ -4082,6 +4093,11 @@ Z280_BNKSEL1: |
|
|
|
; |
|
|
|
Z280_BNKSEL2: |
|
|
|
; POINT TO FIRST PDR TO PROGRAM ($00=USER, $10=SYSTEM) |
|
|
|
; THIS CODE USES $10 (FIRST SYSTEM PDR) INITIALLY FOR |
|
|
|
; SYSTEM STARTUP. ONCE WE HAVE TRANSITIONED TO THE |
|
|
|
; RAM PAGE CODE OF HBIOS, THE LINE BELOW IS MODIFIED |
|
|
|
; IN MEMORY TO POINT TO THE FIRST USER PDR. THIS IS |
|
|
|
; DONE NEAR INITSYS4. |
|
|
|
LD A,$10 ; FIRST SYSTEM PDR |
|
|
|
OUT (Z280_MMUPDRPTR),A ; SET THE PDR POINTER |
|
|
|
; |
|
|
|
@ -4090,7 +4106,7 @@ Z280_BNKSEL2: |
|
|
|
LD B,8 ; PROGRAM 8 PDRS |
|
|
|
.DB $ED,$93 ; OTIRW |
|
|
|
; |
|
|
|
; SELECT I/O PAGE FOR MMU |
|
|
|
; RESTORE I/O PAGE TO $00 |
|
|
|
LD L,$00 ; NORMAL I/O PAGE $00 |
|
|
|
LD C,Z280_IOPR ; I/O PAGE REGISTER TO C |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
@ -4105,7 +4121,7 @@ Z280_BNKSEL2: |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (($ % 2) == 1) |
|
|
|
; BYTE ALIGN THE TABLE |
|
|
|
; WORD ALIGN THE TABLE |
|
|
|
.DB 0 |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
@ -4402,84 +4418,70 @@ Z280_PDRTBL: |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) & FALSE |
|
|
|
; Z280 BANK SELECTION (CALLED FROM PROXY) |
|
|
|
; |
|
|
|
; THIS VERSION IS SLOWER, BUT ABOIDS THE USE OF THE 512 |
|
|
|
; BYTE TABLE. |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; |
|
|
|
; REG A HAS BANK ID |
|
|
|
; |
|
|
|
Z280_BNKSEL: |
|
|
|
PUSH HL |
|
|
|
PUSH DE |
|
|
|
PUSH BC |
|
|
|
LD L,$FF ; MMU PAGE I/O REG IS $FF |
|
|
|
LD C,Z280_IOPR ; 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 |
|
|
|
PUSH HL |
|
|
|
; |
|
|
|
; SELECT I/O PAGE FOR MMU |
|
|
|
LD L,$FF ; MMU AT I/O PAGE $FF |
|
|
|
LD C,Z280_IOPR ; I/O PAGE REGISTER TO C |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
; |
|
|
|
; CONVERT BANK ID TO TOP 12 BITS OF PHYSICAL ADDRESS |
|
|
|
; WITH $0A IN THE LOW ORDER NIBBLE: |
|
|
|
; BANK ID: R000 BBBB |
|
|
|
; PDR: 0000 RBBB B000 1010 |
|
|
|
; |
|
|
|
; IF R BIT (RAM/ROM) IS SET, WE WANT TO CONVERT |
|
|
|
; FROM R000 BBBB -> 000R BBBB |
|
|
|
BIT 7,A ; CHECK BIT |
|
|
|
JR Z,Z280_BNKSEL1 ; NOT SET, SKIP AHEAD |
|
|
|
XOR %10010000 ; FIX IT |
|
|
|
; |
|
|
|
Z280_BNKSEL1: |
|
|
|
;MULTU A,$80 ; HL=0000 RBBB B000 0000 |
|
|
|
.DB $FD,$ED,$F9,$80 ; MULTU A,$80 |
|
|
|
; |
|
|
|
LD A,$0A ; VALUE FOR LOW NIBBLE |
|
|
|
OR L ; COMBINE WITH L |
|
|
|
LD L,A ; PUT IT BACK |
|
|
|
; |
|
|
|
Z280_BNKSEL2: |
|
|
|
; POINT TO FIRST PDR TO PROGRAM ($00=USER, $10=SYSTEM) |
|
|
|
; THIS CODE USES $10 (FIRST SYSTEM PDR) INITIALLY FOR |
|
|
|
; SYSTEM STARTUP. ONCE WE HAVE TRANSITIONED TO THE |
|
|
|
; RAM PAGE CODE OF HBIOS, THE LINE BELOW IS MODIFIED |
|
|
|
; IN MEMORY TO POINT TO THE FIRST USER PDR. THIS IS |
|
|
|
; DONE NEAR INITSYS4. |
|
|
|
LD A,$10 ; FIRST SYSTEM PDR |
|
|
|
OUT (Z280_MMUPDRPTR),A ; SET THE PDR POINTER |
|
|
|
; |
|
|
|
; PROGRAM 8 PDRS |
|
|
|
LD C,Z280_MMUBLKMOV ; PDR BLOCK MOVE PORT |
|
|
|
LD B,8 ; PROGRAM 8 PDRS |
|
|
|
LD A,$10 ; PDR VALUE INCREMENT |
|
|
|
Z280_BNKSEL3: |
|
|
|
.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,$00 ; RESTORE I/O PAGE REG TO 0 |
|
|
|
LD C,Z280_IOPR |
|
|
|
.DB $ED,$6D ; ADD HL, A ; BUMP VALUE |
|
|
|
DJNZ Z280_BNKSEL3 ; DO ALL PDRS |
|
|
|
; |
|
|
|
; RESTORE I/O PAGE TO $00 |
|
|
|
LD L,$00 ; NORMAL I/O PAGE $00 |
|
|
|
LD C,Z280_IOPR ; I/O PAGE REGISTER TO C |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
POP BC |
|
|
|
POP DE |
|
|
|
; |
|
|
|
POP HL |
|
|
|
POP BC |
|
|
|
RET |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; Z280 BANK COPY (CALLED FROM PROXY) |
|
|
|
@ -4488,13 +4490,13 @@ W_MMU2: |
|
|
|
; |
|
|
|
Z280_BNKCPY: |
|
|
|
; Z280 MEMORY TO MEMORY DMA |
|
|
|
; USE FLOW THROUGH MODE DMA |
|
|
|
; USE FLOW THROUGH MODE |
|
|
|
; SINGLE BYTE TRANSFER |
|
|
|
; TRANSACTION DESCRIPTION REGISTER (TDR) |
|
|
|
; %0000 0000 0000 0000 |
|
|
|
; - AUTO INCREMENT MEMORY |
|
|
|
; - FLOWTHROUGH OPERATION |
|
|
|
; - SINGLE TRANSACTION |
|
|
|
; - SINGLE TRANSACTION (CAN WE USE CONTINUOUS???) |
|
|
|
; - 1 BYTE XFER SIZE |
|
|
|
|
|
|
|
PUSH HL |
|
|
|
|