Browse Source

Z280 Optimizations

- New Z280 bank selection routine that does not require gigantic table and is about as fast.
- Bump Z280 UART driver to 128 byte buffer.
- Truncate unused portion of Z280 IVT at end.
pull/199/head
Wayne Warthen 5 years ago
parent
commit
4cc21948bc
  1. 1
      Source/HBIOS/Config/RCZ280_ext.asm
  2. 1
      Source/HBIOS/Config/RCZ280_nat.asm
  3. 4
      Source/HBIOS/acia.asm
  4. 4
      Source/HBIOS/asci.asm
  5. 208
      Source/HBIOS/hbios.asm
  6. 4
      Source/HBIOS/z2u.asm
  7. 2
      Source/ver.inc
  8. 2
      Source/ver.lib

1
Source/HBIOS/Config/RCZ280_ext.asm

@ -22,7 +22,6 @@
; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO
; DIRECTORIES ABOVE THIS ONE).
;
#DEFINE PLATFORM_NAME "RC2014 (EXT MMU)"
#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON <CR> OR AUTO BOOT
;
#include "cfg_rcz280.asm"

1
Source/HBIOS/Config/RCZ280_nat.asm

@ -22,7 +22,6 @@
; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO
; DIRECTORIES ABOVE THIS ONE).
;
#DEFINE PLATFORM_NAME "RC2014 (NATIVE MMU)"
#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON <CR> OR AUTO BOOT
;
#include "cfg_rcz280.asm"

4
Source/HBIOS/acia.asm

@ -660,7 +660,7 @@ ACIA0_RCVBUF:
ACIA0_BUFCNT .DB 0 ; CHARACTERS IN RING BUFFER
ACIA0_HD .DW ACIA0_BUF ; BUFFER HEAD POINTER
ACIA0_TL .DW ACIA0_BUF ; BUFFER TAIL POINTER
ACIA0_BUF .FILL 32,0 ; RECEIVE RING BUFFER
ACIA0_BUF .FILL ACIA_BUFSZ,0 ; RECEIVE RING BUFFER
ACIA0_BUFEND .EQU $ ; END OF BUFFER
ACIA0_BUFSZ .EQU $ - ACIA0_BUF ; SIZE OF RING BUFFER
;
@ -670,7 +670,7 @@ ACIA1_RCVBUF:
ACIA1_BUFCNT .DB 0 ; CHARACTERS IN RING BUFFER
ACIA1_HD .DW ACIA1_BUF ; BUFFER HEAD POINTER
ACIA1_TL .DW ACIA1_BUF ; BUFFER TAIL POINTER
ACIA1_BUF .FILL 32,0 ; RECEIVE RING BUFFER
ACIA1_BUF .FILL ACIA_BUFSZ,0 ; RECEIVE RING BUFFER
ACIA1_BUFEND .EQU $ ; END OF BUFFER
ACIA1_BUFSZ .EQU $ - ACIA1_BUF ; SIZE OF RING BUFFER
;

4
Source/HBIOS/asci.asm

@ -778,7 +778,7 @@ ASCI0_RCVBUF:
ASCI0_BUFCNT .DB 0 ; CHARACTERS IN RING BUFFER
ASCI0_HD .DW ASCI0_BUF ; BUFFER HEAD POINTER
ASCI0_TL .DW ASCI0_BUF ; BUFFER TAIL POINTER
ASCI0_BUF .FILL 32,0 ; RECEIVE RING BUFFER
ASCI0_BUF .FILL ASCI_BUFSZ,0 ; RECEIVE RING BUFFER
ASCI0_BUFEND .EQU $ ; END OF BUFFER
ASCI0_BUFSZ .EQU $ - ASCI0_BUF ; SIZE OF RING BUFFER
;
@ -786,7 +786,7 @@ ASCI1_RCVBUF:
ASCI1_BUFCNT .DB 0 ; CHARACTERS IN RING BUFFER
ASCI1_HD .DW ASCI1_BUF ; BUFFER HEAD POINTER
ASCI1_TL .DW ASCI1_BUF ; BUFFER TAIL POINTER
ASCI1_BUF .FILL 32,0 ; RECEIVE RING BUFFER
ASCI1_BUF .FILL ASCI_BUFSZ,0 ; RECEIVE RING BUFFER
ASCI1_BUFEND .EQU $ ; END OF BUFFER
ASCI1_BUFSZ .EQU $ - ASCI1_BUF ; SIZE OF RING BUFFER
;

208
Source/HBIOS/hbios.asm

@ -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

4
Source/HBIOS/z2u.asm

@ -56,7 +56,7 @@
; UNLESS FULL BLOWN INTERRUPT MODE 3 W/ NATIVE MEMORY MANAGEMENT
; IS BEING USED.
;
Z2U_BUFSZ .EQU 32 ; RECEIVE RING BUFFER SIZE
Z2U_BUFSZ .EQU 128 ; RECEIVE RING BUFFER SIZE
;
Z2U_NONE .EQU 0 ; NOT PRESENT
Z2U_PRESENT .EQU 1 ; PRESENT
@ -566,7 +566,7 @@ Z2U0_RCVBUF:
Z2U0_BUFCNT .DB 0 ; CHARACTERS IN RING BUFFER
Z2U0_HD .DW Z2U0_BUF ; BUFFER HEAD POINTER
Z2U0_TL .DW Z2U0_BUF ; BUFFER TAIL POINTER
Z2U0_BUF .FILL 32,0 ; RECEIVE RING BUFFER
Z2U0_BUF .FILL Z2U_BUFSZ,0 ; RECEIVE RING BUFFER
Z2U0_BUFEND .EQU $ ; END OF BUFFER
Z2U0_BUFSZ .EQU $ - Z2U0_BUF ; SIZE OF RING BUFFER
;

2
Source/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 1
#DEFINE RUP 1
#DEFINE RTP 0
#DEFINE BIOSVER "3.1.1-pre.39"
#DEFINE BIOSVER "3.1.1-pre.40"

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 1
rup equ 1
rtp equ 0
biosver macro
db "3.1.1-pre.39"
db "3.1.1-pre.40"
endm

Loading…
Cancel
Save