@ -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 , $ 6 E ; 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 , $ 6 E ; 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 , $ 6 E ; 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 , $ 0 A ; LOWEST 4K OF MEMORY
.DB $ ED , $ BF ; OUTW (C),HL
LD L , $ 1 A ; MODIFY THE TEMPLATE FOR NEXT 4K
.DB $ ED , $ BF ; OUTW (C),HL
LD L , $ 2 A ; MODIFY THE TEMPLATE FOR NEXT 4K
.DB $ ED , $ BF ; OUTW (C),HL
LD L , $ 3 A ; MODIFY THE TEMPLATE FOR NEXT 4K
.DB $ ED , $ BF ; OUTW (C),HL
LD L , $ 4 A ; MODIFY THE TEMPLATE FOR NEXT 4K
.DB $ ED , $ BF ; OUTW (C),HL
LD L , $ 5 A ; MODIFY THE TEMPLATE FOR NEXT 4K
.DB $ ED , $ BF ; OUTW (C),HL
LD L , $ 6 A ; MODIFY THE TEMPLATE FOR NEXT 4K
.DB $ ED , $ BF ; OUTW (C),HL
LD L , $ 7 A ; 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 , $ 8 A ; 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 , $ 6 E ; 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 , $ 0 A ; 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 , $ 9 A ; 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 , $ 6 D ; 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 , $ 6 E ; 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