From fb9f9774d793c95cfd6abe84b1239ac465e6d3ce Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Thu, 3 Oct 2024 17:36:17 -0700 Subject: [PATCH] eZ80 Compatibility Enhancements See Issue #400 --- Source/HBIOS/ez80cpudrv.asm | 2 ++ Source/HBIOS/fd.asm | 1 + Source/HBIOS/ide.asm | 15 +++++++++++++-- Source/HBIOS/imm.asm | 16 ++++++++++++++-- Source/HBIOS/kbd.asm | 5 +++++ Source/HBIOS/lcd.asm | 17 +++++++++++++++-- Source/HBIOS/lpt.asm | 17 +++++++++++++++++ Source/HBIOS/ppa.asm | 16 ++++++++++++++-- Source/HBIOS/util.asm | 8 +++++++- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 11 files changed, 90 insertions(+), 11 deletions(-) diff --git a/Source/HBIOS/ez80cpudrv.asm b/Source/HBIOS/ez80cpudrv.asm index 041f71ee..494f717b 100644 --- a/Source/HBIOS/ez80cpudrv.asm +++ b/Source/HBIOS/ez80cpudrv.asm @@ -234,6 +234,8 @@ DELAY: RET VDELAY: + EZ80_DELAY + EZ80_DELAY EZ80_DELAY DEC DE LD A,D diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 3d9d53dc..5edc02d1 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -914,6 +914,7 @@ FD_DETECT2: ; A FLOATING BUS. CALL DLY32 ; WAIT A BIT LD C,FDC_MSR ; POINT TO MSR PORT + EZ80_IO IN A,(C) ; READ USING (C) FORM OF INPUT ;CALL PC_SPACE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG* diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 8056a120..e16d4f2c 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -1598,8 +1598,19 @@ IDE_WAIT001: LD C,(IY+IDE_IOBASE) LD B,8 ; NUMBER OF REGISTERS TO CHECK IDE_WAIT002: - EZ80_IO - IN A,(C) ; GET REGISTER VALUE + + ; THE EZ80_IO ROUTINE SEEMS TO ALWAYS RETURN $00 FOR UNOCCUPIED + ; PORTS. THAT CAUSES AN INORDINATE DELAY HERE, SO WE HANDLE + ; 16 BIT I/O OURSELVES. + + ;;;EZ80_IO + ;;;IN A,(C) ; GET REGISTER VALUE + + PUSH BC ; SAVE LOOP CONTROL + LD B,$FF ; MSB FOR I/O + IN A,(C) ; READ PORT + POP BC ; RESTORE LOOP CONTROL + ;CALL PC_SPACE ;CALL PRTHEXBYTE OR A ; SET FLAGS diff --git a/Source/HBIOS/imm.asm b/Source/HBIOS/imm.asm index 5999e79f..5daf5cfd 100644 --- a/Source/HBIOS/imm.asm +++ b/Source/HBIOS/imm.asm @@ -239,6 +239,7 @@ IMM_DETECT: ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT LD C,A ; MOVE TO C FOR I/O LD A,$82 ; CONFIG A OUT, B IN, C OUT + EZ80_IO OUT (C),A ; DO IT CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE #ENDIF @@ -479,6 +480,7 @@ IMM_GEOM: ; IMM_WRITEDATA: LD C,(IY+IMM_IOBASE) ; DATA PORT IS AT IOBASE + EZ80_IO OUT (C),A ; WRITE THE BYTE ;CALL DELAY ; IS THIS NEEDED??? RET ; DONE @@ -501,6 +503,7 @@ IMM_WRITECTRL: LD C,(IY+IMM_IOBASE) ; GET BASE IO ADDRESS INC C ; BUMP TO CONTROL PORT INC C + EZ80_IO OUT (C),A ; WRITE TO CONTROL PORT ;CALL DELAY ; IS THIS NEEDED? RET ; DONE @@ -519,6 +522,7 @@ IMM_WRITECTRL: IMM_READSTATUS: LD C,(IY+IMM_IOBASE) ; IOBASE TO C INC C ; BUMP TO STATUS PORT + EZ80_IO IN A,(C) ; READ IT ; #IF (IMMMODE == IMMMODE_MG014) @@ -963,9 +967,11 @@ IMM_GETBLOCK: ; IMM_GETBLOCK1: EXX ; ALT REGS + EZ80_IO OUT (C),D ; SEND FIRST CLOCK -IMM_GETBLOCK_A .EQU $+1 + EZ80_IO IN A,($FF) ; GET LOW NIBBLE +IMM_GETBLOCK_A .EQU $-1 #IF (IMMMODE == IMMMODE_MG014) AND $0F ; RELEVANT BITS ONLY ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR @@ -981,9 +987,11 @@ IMM_GETBLOCK_A .EQU $+1 RLCA ; MOVE TO LOW NIBBLE LD L,A ; SAVE NIBBLE IN L #ENDIF + EZ80_IO OUT (C),E ; SEND SECOND CLOCK -IMM_GETBLOCK_B .EQU $+1 + EZ80_IO IN A,($FF) ; GET HIGH NIBBLE +IMM_GETBLOCK_B .EQU $-1 #IF (IMMMODE == IMMMODE_MG014) AND $0F ; RELEVANT BITS ONLY ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR @@ -1079,13 +1087,17 @@ IMM_PUTBLOCK: IMM_PUTBLOCK1: LD A,(DE) ; GET NEXT BYTE IMM_PUTBLOCK_A .EQU $+1 + EZ80_IO OUT ($FF),A ; PUT ON BUS INC DE ; INCREMENT BUF POS + EZ80_IO OUT (C),H ; FIRST CLOCK LD A,(DE) ; GET NEXT BYTE IMM_PUTBLOCK_B .EQU $+1 + EZ80_IO OUT ($FF),A ; PUT ON BUS INC DE ; INCREMENT BUF POS + EZ80_IO OUT (C),L ; SECOND CLOCK DJNZ IMM_PUTBLOCK1 ; LOOP RET ; DONE diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 67014d2b..75171cb0 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -169,6 +169,7 @@ KBD_IST: ; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING ; LD C,(IY+KBD_ST) ; STATUS PORT + EZ80_IO IN A,(C) ; GET STATUS AND $01 ; ISOLATE INPUT PENDING BIT RET @@ -180,6 +181,7 @@ KBD_OST: ; A=0, Z SET FOR NOT READY, OTHERWISE READY TO WRITE ; LD C,(IY+KBD_ST) ; STATUS PORT + EZ80_IO IN A,(C) ; GET STATUS AND $02 ; ISOLATE OUTPUT EMPTY BIT XOR $02 ; FLIP IT FOR APPROPRIATE RETURN VALUES @@ -210,6 +212,7 @@ KBD_PUTCMD1: CALL PRTHEXBYTE #ENDIF LD C,(IY+KBD_CMD) ; COMMAND PORT + EZ80_IO OUT (C),A ; WRITE IT KBD_PUTCMD2: XOR A ; SIGNAL SUCCESS @@ -239,6 +242,7 @@ KBD_PUTDATA1: CALL PRTHEXBYTE #ENDIF LD C,(IY+KBD_DAT) ; DATA PORT + EZ80_IO OUT (C),A ; WRITE IT KBD_PUTDATA2: XOR A ; SIGNAL SUCCESS @@ -259,6 +263,7 @@ KBD_GETDATA0: RET KBD_GETDATA1: LD C,(IY+KBD_DAT) ; DATA PORT + EZ80_IO IN A,(C) ; GET THE DATA VALUE #IF (KBDTRACE >= 2) PUSH AF diff --git a/Source/HBIOS/lcd.asm b/Source/HBIOS/lcd.asm index 4f42d4d7..0a49df9b 100644 --- a/Source/HBIOS/lcd.asm +++ b/Source/HBIOS/lcd.asm @@ -42,14 +42,17 @@ LCD_PREINIT: ; RESET LCD CONTROLLER, DELAYS ARE FIXED, BUSY FLAG ; CANNOT BE USED YET, CONTROLLER MAY NOT EXIST! LD A,LCD_FUNC_SET | %11000 + EZ80_IO OUT (LCD_FUNC),A LD DE,50000/16 ; WAIT >40MS, WE USE 50MS CALL VDELAY ; DO IT LD A,LCD_FUNC_SET | %11000 + EZ80_IO OUT (LCD_FUNC),A LD DE,5000/16 ; WAIT >4.1MS, WE USE 5MS CALL VDELAY ; DO IT LD A,LCD_FUNC_SET | %11000 + EZ80_IO OUT (LCD_FUNC),A LD DE,5000/16 ; WAIT >4.1MS, WE USE 5MS CALL VDELAY ; DO IT @@ -78,7 +81,7 @@ LCD_PREINIT: CALL LCD_GOTORC LD HL,LCD_CPU LD A,(HB_CPUTYPE) ; GET CPU TYPE - RRCA ; WORD OFFSET + RLCA ; WORD OFFSET CALL ADDHLA ; ADD OFFSET LD E,(HL) ; GET LSB INC HL ; BUMP @@ -316,14 +319,18 @@ LCD_DETECT_Z: LCD_DETECT_PASS: CALL LCD_DELAY ; WAIT LD A,LCD_FUNC_DDADR + EZ80_IO OUT (LCD_FUNC),A ; POINT TO FIRST BYTE CALL LCD_DELAY ; WAIT LD A,C ; TEST VALUE + EZ80_IO OUT (LCD_DATA),A ; WRITE IT CALL LCD_DELAY ; WAIT LD A,LCD_FUNC_DDADR + EZ80_IO OUT (LCD_FUNC),A ; POINT TO FIRST BYTE CALL LCD_DELAY + EZ80_IO IN A,(LCD_DATA) ; GET VALUE CP C ; AS WRITTEN? RET @@ -340,10 +347,12 @@ LCD_DELAY: LCD_OUTF: PUSH AF ; SAVE CODE LCD_OUTF1: + EZ80_IO IN A,(LCD_STAT) ; GET STATUS AND $80 ; ISOLATE BUSY FLAG JR NZ,LCD_OUTF1 ; LOOP TILL NOT BUSY POP AF ; RECOVER CODE + EZ80_IO OUT (LCD_FUNC),A ; SEND IT RET ; DONE ; @@ -363,10 +372,12 @@ LCD_OUTFS: LCD_OUTD: PUSH AF ; SAVE BYTE LCD_OUTD1: + EZ80_IO IN A,(LCD_STAT) ; GET STATUS AND $80 ; ISOLATE BUSY FLAG JR NZ,LCD_OUTD1 ; LOOP TILL NOT BUSY POP AF ; RECOVER BYTE + EZ80_IO OUT (LCD_DATA),A ; SEND IT RET ; DONE ; @@ -397,10 +408,12 @@ LCD_OUTDS: ; GET DATA BYTE INTO A ; LCD_IND: + EZ80_IO IN A,(LCD_STAT) ; GET STATUS AND $80 ; ISOLATE BUSY FLAG JR NZ,LCD_IND ; LOOP TILL NOT BUSY POP AF ; RECOVER BYTE + EZ80_IO IN A,(LCD_DATA) ; GET IT RET ; DONE ; @@ -488,7 +501,7 @@ LCD_CPU_Z180 .DB "Z180",0 LCD_CPU_Z180K .DB "Z180-K",0 LCD_CPU_Z180N .DB "Z180-N",0 LCD_CPU_Z280 .DB "Z280",0 -LCD_CPU_EZ80 .DB "EZ80",0 +LCD_CPU_EZ80 .DB "eZ80",0 ; LCD_MSGTBL: .DW LCD_MSG_LDR_SEL diff --git a/Source/HBIOS/lpt.asm b/Source/HBIOS/lpt.asm index 7e680296..0445b269 100644 --- a/Source/HBIOS/lpt.asm +++ b/Source/HBIOS/lpt.asm @@ -168,6 +168,7 @@ LPT_OUT: CALL LPT_OST ; READY TO SEND? JR Z,LPT_OUT ; LOOP IF NOT LD C,(IY+3) ; PORT 0 (DATA) + EZ80_IO OUT (C),E ; OUTPUT DATA TO PORT #IF (LPTMODE == LPTMODE_SPP) LD A,%00001101 ; SELECT & STROBE, LEDS OFF @@ -185,6 +186,7 @@ LPT_OUT: #IF (LPTMODE == LPTMODE_S100) DEC C ; PUT CONTROL PORT IN C #ENDIF + EZ80_IO OUT (C),A ; OUTPUT DATA TO PORT CALL DELAY #IF (LPTMODE == LPTMODE_SPP) @@ -196,6 +198,7 @@ LPT_OUT: #IF (LPTMODE == LPTMODE_S100) LD A,%11111111 ; STROBE #ENDIF + EZ80_IO OUT (C),A ; OUTPUT DATA TO PORT CALL DELAY XOR A ; SIGNAL SUCCESS @@ -218,6 +221,7 @@ LPT_OST: #IF (LPTMODE == LPTMODE_S100) DEC C ; SELECT STATUS PORT #ENDIF + EZ80_IO IN A,(C) ; GET STATUS INFO #IF (LPTMODE == LPTMODE_SPP) AND %10000000 ; ISOLATE /BUSY @@ -245,13 +249,16 @@ LPT_INITDEVX: ; LD C,(IY+3) ; PORT 0 (DATA) XOR A ; CLEAR ACCUM + EZ80_IO OUT (C),A ; SEND IT INC C ; BUMP TO INC C ; ... PORT 2 LD A,%00001000 ; SELECT AND ASSERT RESET, LEDS OFF + EZ80_IO OUT (C),A ; SEND IT CALL LDELAY ; HALF SECOND DELAY LD A,%00001100 ; SELECT AND DEASSERT RESET, LEDS OFF + EZ80_IO OUT (C),A ; SEND IT XOR A ; SIGNAL SUCCESS RET ; RETURN @@ -263,12 +270,15 @@ LPT_INITDEVX: ADD A,3 ; BUMP TO CONTROL PORT LD C,A ; MOVE TO C FOR I/O LD A,$82 ; CONFIG A OUT, B IN, C OUT + EZ80_IO OUT (C),A ; DO IT DEC C ; OUTPUT PORT LD A,$81 ; STROBE OFF, SELECT ON, RES ON, LED ON + EZ80_IO OUT (C),A ; SEND IT CALL LDELAY ; HALF SECOND DELAY LD A,$05 ; STROBE OFF, SELECT ON, RES OFF, LED OFF + EZ80_IO OUT (C),A ; SEND IT XOR A ; SIGNAL SUCCESS RET ; RETURN @@ -278,6 +288,7 @@ LPT_INITDEVX: LD C,(IY+3) ; BASE PORT DEC C ; DEC TO CONTROL PORT LD A,$FF ; INIT VALUE + EZ80_IO OUT (C),A ; DO IT RET ; RETURN #ENDIF @@ -330,6 +341,7 @@ LPT_DETECT2: INC C ; PORT C FOR I/O INC C ; ... XOR A ; DEFAULT VALUE (TRI-STATE OFF) + EZ80_IO OUT (C),A ; SEND IT ; ;IN A,(C) ; READ IT @@ -345,7 +357,9 @@ LPT_DETECT2: DEC C ; BACK TO BASE PORT DEC C ; ... LD A,$A5 ; TEST VALUE + EZ80_IO OUT (C),A ; SEND IT + EZ80_IO IN A,(C) ; READ IT BACK CP $A5 ; CORRECT? RET ; RETURN (ZF SET CORRECTLY) @@ -366,11 +380,14 @@ LPT_DETECT: ADD A,3 ; BUMP TO CONTROL PORT LD C,A ; PUT IN C LD A,$80 ; SET PORT A TO WRITE + EZ80_IO OUT (C),A ; WRITE IT ; LD C,(IY+3) ; PPI PORT A LD A,$A5 ; TEST VALUE + EZ80_IO OUT (C),A ; PUSH VALUE TO PORT + EZ80_IO IN A,(C) ; GET PORT VALUE #IF (LPTTRACE >= 3) CALL PC_SPACE diff --git a/Source/HBIOS/ppa.asm b/Source/HBIOS/ppa.asm index a30aa08a..ec8505f6 100644 --- a/Source/HBIOS/ppa.asm +++ b/Source/HBIOS/ppa.asm @@ -243,6 +243,7 @@ PPA_DETECT: ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT LD C,A ; MOVE TO C FOR I/O LD A,$82 ; CONFIG A OUT, B IN, C OUT + EZ80_IO OUT (C),A ; DO IT CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE #ENDIF @@ -476,6 +477,7 @@ PPA_GEOM: ; PPA_WRITEDATA: LD C,(IY+PPA_IOBASE) ; DATA PORT IS AT IOBASE + EZ80_IO OUT (C),A ; WRITE THE BYTE ;CALL DELAY ; IS THIS NEEDED??? RET ; DONE @@ -493,6 +495,7 @@ PPA_WRITECTRL: LD C,(IY+PPA_IOBASE) ; GET BASE IO ADDRESS INC C ; BUMP TO CONTROL PORT INC C + EZ80_IO OUT (C),A ; WRITE TO CONTROL PORT ;CALL DELAY ; IS THIS NEEDED? RET ; DONE @@ -511,6 +514,7 @@ PPA_WRITECTRL: PPA_READSTATUS: LD C,(IY+PPA_IOBASE) ; IOBASE TO C INC C ; BUMP TO STATUS PORT + EZ80_IO IN A,(C) ; READ IT ; #IF (PPAMODE == PPAMODE_MG014 @@ -855,9 +859,11 @@ PPA_GETBLOCK: ; PPA_GETBLOCK1: EXX ; ALT REGS + EZ80_IO OUT (C),D ; SEND FIRST CLOCK -PPA_GETBLOCK_A .EQU $+1 + EZ80_IO IN A,($FF) ; GET HIGH NIBBLE +PPA_GETBLOCK_A .EQU $-1 #IF (PPAMODE == PPAMODE_MG014) AND $0F ; RELEVANT BITS ONLY ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR @@ -869,9 +875,11 @@ PPA_GETBLOCK_A .EQU $+1 AND $F0 ; RELEVANT BITS ONLY LD L,A ; SAVE NIBBLE IN L #ENDIF + EZ80_IO OUT (C),E ; SEND SECOND CLOCK -PPA_GETBLOCK_B .EQU $+1 + EZ80_IO IN A,($FF) ; GET LOW NIBBLE +PPA_GETBLOCK_B .EQU $-1 #IF (PPAMODE == PPAMODE_MG014) AND $0F ; RELEVANT BITS ONLY ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR @@ -964,9 +972,12 @@ PPA_PUTBLOCK: PPA_PUTBLOCK1: LD A,(DE) ; GET NEXT BYTE PPA_PUTBLOCK_A .EQU $+1 + EZ80_IO OUT ($FF),A ; PUT ON BUS INC DE ; INCREMENT BUF POS + EZ80_IO OUT (C),H ; FIRST CLOCK + EZ80_IO OUT (C),L ; SECOND CLOCK DJNZ PPA_PUTBLOCK1 ; LOOP RET ; DONE @@ -1147,6 +1158,7 @@ PPA_INITDEV: ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT LD C,A ; MOVE TO C FOR I/O LD A,$82 ; CONFIG A OUT, B IN, C OUT + EZ80_IO OUT (C),A ; DO IT CALL DELAY ; SHORT DELAY FOR BUS SETTLE #ENDIF diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index 55c65f43..6d1ee813 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -684,7 +684,13 @@ DLY16: CALL DLY8 ; 432 400 DLY8: CALL DLY4 ; 216 200 DLY4: CALL DLY2 ; 108 100 DLY2: CALL DLY1 ; 54 50 -DLY1: RET ; 27 25 +DLY1: +#IF (CPUFAM == CPU_EZ80) + NOP + NOP + NOP +#ENDIF + RET ; 27 25 ; ; MULTIPLY 8-BIT VALUES ; IN: MULTIPLY H BY E diff --git a/Source/ver.inc b/Source/ver.inc index 79f57ff6..22b08f47 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.86" +#DEFINE BIOSVER "3.5.0-dev.87" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index e3a1221b..8fa0e506 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.86" + db "3.5.0-dev.87" endm