From 2ac9f33be7e1bf910346d0b3845ca1d98f5b1969 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 5 Feb 2021 18:20:03 -0800 Subject: [PATCH] Mo' Faster - Some minor Z280 speed optimizations. --- Source/HBIOS/Config/RCZ80_mt.asm | 2 - Source/HBIOS/cfg_rcz180.asm | 2 +- Source/HBIOS/hbios.asm | 85 ++++++++++++++++---------------- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 5 files changed, 46 insertions(+), 47 deletions(-) diff --git a/Source/HBIOS/Config/RCZ80_mt.asm b/Source/HBIOS/Config/RCZ80_mt.asm index 218ebcf8..5e9857e2 100644 --- a/Source/HBIOS/Config/RCZ80_mt.asm +++ b/Source/HBIOS/Config/RCZ80_mt.asm @@ -34,5 +34,3 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) ; SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -; -PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 8182049d..fd013bb3 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -186,7 +186,7 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] +SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 80d23622..5f3bcf0e 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -463,9 +463,14 @@ HBX_BNKSEL1: #ENDIF ; #IF (MEMMGR == MM_Z280) + PUSH BC ; SAVE BC + PUSH HL ; SAVE HL + LD B,$00 ; FIRST USER PDR .DB $ED,$71 ; SC .DW Z280_BNKSEL ; SC PARAMETER - RET + POP HL ; RESTORE HL + POP BC ; RESTORE BC + RET ; DONE #ENDIF ; #IF (MEMMGR == MM_ZRC) @@ -1223,6 +1228,7 @@ Z280_INITZ: ; #IF (MEMMGR == MM_Z280) LD A,BID_BIOS + LD B,$10 ; FIRST SYSTEM PDR CALL Z280_BNKSEL #ELSE LD A,BID_BIOS ; BIOS BANK ID @@ -2005,11 +2011,7 @@ INITSYS4: HB_DI ; NOT SURE THIS IS NEEDED - ; FIXUP BNKSEL TO WORK ON USER MODE PDRS - XOR A - LD (Z280_BNKSEL2+1),A - - ; MAKE USER MODE BANK CORRECT + ; ACTIVATE THE CORRECT USER MODE BANK LD A,(HB_CURBNK) ; GET CURRENT BANK CALL HBX_BNKSEL @@ -2900,6 +2902,7 @@ SYS_SETBNK: PUSH AF ; SAVE IT LD A,C ; NEW BANK TO A LD (HB_INVBNK),A ; UPDATE INVBNK + LD B,$00 ; FIRST USER PDR CALL Z280_BNKSEL ; DO IT POP AF ; RECOVER PREV BANK LD C,A ; PREVIOUS BANK TO C @@ -4070,11 +4073,10 @@ Z280_IVT: ; #IF (MEMMGR == MM_Z280) & FALSE ; -; REG A HAS BANK ID +; REG A HAS BANK ID, REG B HAS INITIAL PDR TO PROGRAM +; REGISTERS AF, BC, HL DESTROYED ; Z280_BNKSEL: - PUSH BC - PUSH HL ; ; SELECT I/O PAGE FOR MMU LD L,$FF ; MMU AT I/O PAGE $FF @@ -4094,13 +4096,8 @@ Z280_BNKSEL1: LD L,A ; 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 + ; POINT TO FIRST PDR TO PROGRAM + LD A,B ; FIRST PDR TO PROG OUT (Z280_MMUPDRPTR),A ; SET THE PDR POINTER ; ; PROGRAM 8 PDRS @@ -4113,8 +4110,6 @@ Z280_BNKSEL2: LD C,Z280_IOPR ; I/O PAGE REGISTER TO C .DB $ED,$6E ; LDCTL (C),HL ; - POP HL - POP BC RET ; #IF (($ & $FF) != 0) @@ -4422,17 +4417,15 @@ Z280_PDRTBL: ; ; Z280 BANK SELECTION (CALLED FROM PROXY) ; -; THIS VERSION IS SLOWER, BUT ABOIDS THE USE OF THE 512 +; THIS VERSION IS SLOWER, BUT AVOIDS THE USE OF THE 512+ ; BYTE TABLE. ; #IF (MEMMGR == MM_Z280) ; -; REG A HAS BANK ID +; REG A HAS BANK ID, REG B HAS INITIAL PDR TO PROGRAM +; REGISTERS AF, BC, HL DESTROYED ; Z280_BNKSEL: - PUSH BC - 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 @@ -4445,44 +4438,52 @@ Z280_BNKSEL: ; ; 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 + RLCA ; A=R 000B BBBR + JP NC,Z280_BNKSEL1 + XOR %00100001 ; A=00RB BBB0 ; Z280_BNKSEL1: - ;MULTU A,$80 ; HL=0000 RBBB B000 0000 - .DB $FD,$ED,$F9,$80 ; MULTU A,$80 + ;MULTU A,$40 ; HL=0000 RBBB B000 0000 + .DB $FD,$ED,$F9,$40 ; MULTU A,$40 ; LD A,$0A ; VALUE FOR LOW NIBBLE - OR L ; COMBINE WITH L - LD L,A ; PUT IT BACK + .DB $ED,$6D ; ADD HL,A ; HL=0000 RBBB B000 1010 ; 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 + ; POINT TO FIRST PDR TO PROGRAM + LD A,B ; INITIAL PDR TO PROG 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 B,8 ; PROGRAM 8 PDRS LD A,$10 ; PDR VALUE INCREMENT Z280_BNKSEL3: + ; PROGRAM 8 PDR VALUES + ; LOOP UNROLLED FOR SPEED .DB $ED,$BF ; OUTW (C),HL .DB $ED,$6D ; ADD HL, A ; BUMP VALUE - DJNZ Z280_BNKSEL3 ; DO ALL PDRS + .DB $ED,$BF ; OUTW (C),HL + .DB $ED,$6D ; ADD HL, A ; BUMP VALUE + .DB $ED,$BF ; OUTW (C),HL + .DB $ED,$6D ; ADD HL, A ; BUMP VALUE + .DB $ED,$BF ; OUTW (C),HL + .DB $ED,$6D ; ADD HL, A ; BUMP VALUE + .DB $ED,$BF ; OUTW (C),HL + .DB $ED,$6D ; ADD HL, A ; BUMP VALUE + .DB $ED,$BF ; OUTW (C),HL + .DB $ED,$6D ; ADD HL, A ; BUMP VALUE + .DB $ED,$BF ; OUTW (C),HL + .DB $ED,$6D ; ADD HL, A ; BUMP VALUE + .DB $ED,$BF ; OUTW (C),HL + .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 HL - POP BC +; RET #ENDIF ; diff --git a/Source/ver.inc b/Source/ver.inc index 39594378..8f61eb17 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.41" +#DEFINE BIOSVER "3.1.1-pre.42" diff --git a/Source/ver.lib b/Source/ver.lib index e8892882..79b09e58 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.41" + db "3.1.1-pre.42" endm