diff --git a/Source/HBIOS/Config/RCZ280_nat.asm b/Source/HBIOS/Config/RCZ280_nat.asm index 9eec800d..bcc119f4 100644 --- a/Source/HBIOS/Config/RCZ280_nat.asm +++ b/Source/HBIOS/Config/RCZ280_nat.asm @@ -48,3 +48,5 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) +; +Z2UOSCEXT .SET TRUE ; Z2U: USE EXTERNAL OSCILLATOR diff --git a/Source/HBIOS/acia.asm b/Source/HBIOS/acia.asm index 0746c9cd..25c8f2fb 100644 --- a/Source/HBIOS/acia.asm +++ b/Source/HBIOS/acia.asm @@ -393,6 +393,7 @@ ACIA_INITDEVX: LD D,(IY+5) ; HIGH BYTE ; ACIA_INITDEV1: + LD (ACIA_NEWCFG),DE ; SAVE NEW CONFIG ; #IF (ACIADEBUG) PUSH DE @@ -493,6 +494,12 @@ ACIA_INITWS2: RLA ; MOVE BITS TO RLA ; ... PROPER LOCATION OR C ; COMBINE WITH WORKING VALUE +; + ; SAVE CONFIG PERMANENTLY NOW + LD DE,(ACIA_NEWCFG) ; GET NEW CONFIG BACK + LD (IY+4),E ; SAVE LOW WORD + LD (IY+5),D ; SAVE HI WORD +; JR ACIA_INITGO ; ACIA_INITSAFE: @@ -646,6 +653,7 @@ ACIA_STR_ACIA .DB "ACIA$" ; ACIA_DEV .DB 0 ; DEVICE NUM USED DURING INIT ACIA_CMD .DB 0 ; COMMAND PORT SHADOW REGISTER +ACIA_NEWCFG .DW 0 ; TEMP STORE FOR NEW CFG ; #IF (INTMODE != 1) ; diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index fd2f474e..8aed93cf 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -130,7 +130,8 @@ ASCI0CFG .EQU DEFSERCFG ; ASCI 0: SERIAL LINE CONFIG ASCI1CFG .EQU DEFSERCFG ; ASCI 1: SERIAL LINE CONFIG ; Z2UENABLE .EQU FALSE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) -Z2UOSC .EQU 1843200 ; Z2U: OSC FREQUENCY IN MHZ +Z2UOSC .EQU 1843200 ; Z2U: OSC FREQUENCY IN MHZ +Z2UOSCEXT .EQU TRUE ; Z2U: USE EXTERNAL OSCILLATOR Z2U0BASE .EQU $10 ; Z2U 0: BASE I/O ADDRESS Z2U0CFG .EQU DEFSERCFG ; Z2U 0: SERIAL LINE CONFIG ; diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 847aa1cc..2dfefba7 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -103,7 +103,8 @@ UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; Z2UENABLE .EQU FALSE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) -Z2UOSC .EQU 1843200 ; Z2U: OSC FREQUENCY IN MHZ +Z2UOSC .EQU 1843200 ; Z2U: OSC FREQUENCY IN MHZ +Z2UOSCEXT .EQU TRUE ; Z2U: USE EXTERNAL OSCILLATOR Z2U0BASE .EQU $10 ; Z2U 0: BASE I/O ADDRESS Z2U0CFG .EQU DEFSERCFG ; Z2U 0: SERIAL LINE CONFIG ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index b9851839..80d23622 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1864,7 +1864,7 @@ HB_Z280BUS1: #ENDIF ; CALL PRTSTRD - .TEXT ", MMU=$" + .TEXT ", $" CALL PRTSTRD #IF (MEMMGR == MM_NONE) .TEXT "NONE$" @@ -1887,6 +1887,8 @@ HB_Z280BUS1: #IF (MEMMGR == MM_ZRC) .TEXT "ZRC$" #ENDIF + CALL PRTSTRD + .TEXT " MMU$" ; ; DISPLAY MEMORY CONFIG ; diff --git a/Source/HBIOS/z2u.asm b/Source/HBIOS/z2u.asm index 46eeb5ff..040ab5cd 100644 --- a/Source/HBIOS/z2u.asm +++ b/Source/HBIOS/z2u.asm @@ -56,6 +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 @@ -190,16 +191,17 @@ Z2U_INTRCV1: JR Z,Z2U_INTRCV4 ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED INC A ; INCREMENT THE COUNT LD (HL),A ; AND SAVE IT - CP Z2U_BUFSZ / 2 ; BUFFER GETTING FULL? - JR NZ,Z2U_INTRCV2 ; IF NOT, BYPASS CLEARING RTS + ;CP Z2U_BUFSZ / 2 ; BUFFER GETTING FULL? + ;JR NZ,Z2U_INTRCV2 ; IF NOT, BYPASS CLEARING RTS ; THIS IS WHERE WE SHOULD DEASSERT RTS, BUT THE Z2U HAS NONE Z2U_INTRCV2: INC HL ; HL NOW HAS ADR OF HEAD PTR PUSH HL ; SAVE ADR OF HEAD PTR - LD A,(HL) ; DEREFERENCE HL - INC HL - LD H,(HL) - LD L,A ; HL IS NOW ACTUAL HEAD PTR + ;LD A,(HL) ; DEREFERENCE HL + ;INC HL + ;LD H,(HL) + ;LD L,A ; HL IS NOW ACTUAL HEAD PTR + .DB $ED,$26 ; LD HL,(HL) ; DEREFERENCE HL, HL IS NOW ACTUAL HEAD PTR LD (HL),B ; SAVE CHARACTER RECEIVED IN BUFFER AT HEAD INC HL ; BUMP HEAD POINTER POP DE ; RECOVER ADR OF HEAD PTR @@ -215,9 +217,10 @@ Z2U_INTRCV2: INC HL ; ... SO HL NOW HAS ADR OF ACTUAL BUFFER START Z2U_INTRCV3: EX DE,HL ; DE := HEAD PTR VAL, HL := ADR OF HEAD PTR - LD (HL),E ; SAVE UPDATED HEAD PTR - INC HL - LD (HL),D + ;LD (HL),E ; SAVE UPDATED HEAD PTR + ;INC HL + ;LD (HL),D + .DB $ED,$1E ;LD (HL),DE ; SAVE UPDATED HEAD PTR ; CHECK FOR MORE PENDING... IN A,(Z280_UARTRCTL) ; GET STATUS @@ -416,11 +419,23 @@ Z2U_INITDEV: RET ; DONE ; Z2U_INITSAFE: - LD E,%11000010 ; 8N0, DIV 16, NO C/T - JR Z2U_INITDEV2 ; YES, DO IT + LD A,%11000010 ; 8N0, DIV 16, NO C/T + LD (Z2U_CFGREG),A ; SAVE IT + JR Z2U_INITDEV8 ; DO IT ; Z2U_INITDEVX: -; + ; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT) + LD A,D ; TEST DE FOR + AND E ; ... VALUE OF -1 + INC A ; ... SO Z SET IF -1 + JR NZ,Z2U_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG +; + ; LOAD EXISTING CONFIG TO REINIT + LD E,(IY+4) ; LOW BYTE + LD D,(IY+5) ; HIGH BYTE +; +Z2U_INITDEV1: + LD (Z2U_NEWCFG),DE ; SAVE NEW CONFIG LD A,D ; HIWORD OF CONFIG AND $1F ; ISOLATE BAUD RATE PUSH AF @@ -430,42 +445,99 @@ Z2U_INITDEVX: LD C,75 ; BAUD RATE ENCODE CONSTANT CALL ENCODE ; C = ENCODED OSC POP DE ; D = UART OSC - JR NZ,Z2U_INITFAIL ; HANDLE ENCODE FAILURE + JP NZ,Z2U_INITFAIL ; HANDLE ENCODE FAILURE LD A,C ; TO A SUB D ; DIV W/ SUB OF SQUARES + ; REG A NOW HAS ENCODED BAUD RATE DIVISOR +; + PUSH AF ; SAVE IT + AND $0F ; ISOLATE 2'S POWER ; + ; Z280 UART CAN USE 16, 32, OR 64 AS BAUD RATE DIVISOR + ; SET E TO IMPLEMENT WHAT WE CAN + LD E,%11000000 ; 8N0, DIV 1, NO C/T + ;JR Z2U_INITDEV2 ; *DEBUG* + CP 4 ; DIV 16 POSSIBLE? + JR C,Z2U_INITDEV2 ; IF NOT, SKIP AHEAD LD E,%11000010 ; 8N0, DIV 16, NO C/T - CP 4 ; DIV 16? - JR Z,Z2U_INITDEV2 ; YES, DO IT + SUB 4 ; REFLECT IN TGT DIVISOR + CP 1 ; DIV 32 POSSIBLE? + JR C,Z2U_INITDEV2 ; IF NOT, SKIP AHEAD LD E,%11000100 ; 8N0, DIV 32, NO C/T - CP 5 ; DIV 32? - JR Z,Z2U_INITDEV2 ; YES, DO IT + DEC A ; REFLECT IN TGT DIVISOR + CP 1 ; DIV 64 POSSIBLE? + JR C,Z2U_INITDEV2 ; IF NOT, SKIP AHEAD LD E,%11000110 ; 8N0, DIV 64, NO C/T - CP 6 ; DIV 64? - JR Z,Z2U_INITDEV2 ; YES, DO IT -; -Z2U_INITFAIL: - OR $FF ; SIGNAL ERROR - RET ; AND DONE + DEC A ; Z2U_INITDEV2: + LD D,A ; 2'S POWER TO D + POP AF ; RECOVER ORIGINAL VALUE + AND $F0 ; MASK OFF ORIG 2'S POWER + OR D ; COMBINE + ;CALL PRTHEXBYTE ; *DEBUG* + PUSH AF ; RESAVE IT + LD A,E ; GET Z280 UART CONFIG REG VAL + LD (Z2U_CFGREG),A ; SAVE CONFIG REG VALUE FOR LATER + POP AF ; RECOVER REMAINING ENCODED DIVISOR + LD L,A ; INTO L + LD H,0 ; H MUST BE ZERO + LD DE,1 ; RATIO, SO NO CONSTANT + CALL DECODE ; DECODE INTO DE:HL + ;LD HL,626 ; *DEBUG* + JR NZ,Z2U_INITFAIL ; HANDLE FAILURE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXWORDHL ; *DEBUG* +; + ; SAVE CONFIG PERMANENTLY NOW + LD DE,(Z2U_NEWCFG) ; GET NEW CONFIG BACK + LD (IY+4),E ; SAVE LOW WORD + LD (IY+5),D ; SAVE HI WORD +; +Z2U_INITDEV8: ; START BY SELECTING I/O PAGE $FE + PUSH HL ; SAVE HL LD L,$FE ; Z280 UART REGISTERS AT I/O PAGE $FE LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER .DB $ED,$6E ; LDCTL (C),HL + POP HL ; RESTORE HL +; + DEC HL ; ADJUST FOR T/C + LD A,H ; TEST FOR + OR L ; ... ZERO + JR Z,Z2U_INITDEV9 ; IF ZERO, SKIP C/T ; - ; SETUP - ;LD A,%11000010 ; 8N0, DIV 16, NO C/T - LD A,E ; CONFIG VALUE + ; PROGRAM C/T 1 +#IF Z2UOSCEXT + LD A,%10001100 ; CONFIG: C, RE, COUNTER +#ELSE + LD A,%10001000 ; CONFIG: C, RE, COUNTER +#ENDIF + OUT (Z280_CT1_CFG),A ; SET C/T 1 + LD C,Z280_CT1_TC ; SET C/T 1 FROM HL + .DB $ED,$BF ; OUTW (C),HL + LD C,Z280_CT1_CT ; SET C/T 1 FROM HL + .DB $ED,$BF ; OUTW (C),HL + LD A,%11100000 ; CMD: EN, GT, TG + OUT (Z280_CT1_CMDST),A ; SET C/T 1 +; + ; MODIFY CFG REG VALUE TO USE C/T + LD A,(Z2U_CFGREG) ; CONFIG VALUE + SET 3,A ; SET C/T USAGE BIT + LD (Z2U_CFGREG),A ; SAVE IT +; +Z2U_INITDEV9: + ; PROGRAM THE UART + LD A,(Z2U_CFGREG) ; CONFIG VALUE OUT (Z280_UARTCFG),A ; SET CONFIG REGISTER LD A,%10000000 ; ENABLE, NO INTS, 1 STOP BITS - OUT (Z280_UARTXCTL),A ; SET CONFIG REGISTER + OUT (Z280_UARTXCTL),A ; SET XMIT CTL REGISTER #IF (INTMODE == 3) - LD A,%11000000 ; ENABLE W/ INTS + LD A,%11000000 ; ENABLE W/ RCV INTS #ELSE - LD A,%10000000 ; ENABLE, NO INTS + LD A,%10000000 ; ENABLE, NO RCV INTS #ENDIF - OUT (Z280_UARTRCTL),A ; SET CONFIG REGISTER + OUT (Z280_UARTRCTL),A ; SET RCV CTL REGISTER ; ; RESTORE I/O PAGE TO $00 LD L,$00 ; NORMAL I/O REG IS $00 @@ -496,9 +568,14 @@ Z2U_INITDEV2: ; #ENDIF ; + ; RETURN SUCCESS XOR A ; SIGNAL SUCCESS RET ; DONE ; +Z2U_INITFAIL: + OR $FF ; SIGNAL ERROR + RET ; AND DONE +; ; ; Z2U_QUERY: @@ -552,7 +629,9 @@ Z2U_PRTCFG: ; ; WORKING VARIABLES ; -Z2U_DEV .DB 0 ; DEVICE NUM USED DURING INIT +Z2U_DEV .DB 0 ; DEVICE NUM USED DURING INIT +Z2U_CFGREG .DB 0 ; VALUE TO PROGRAM CFG REG +Z2U_NEWCFG .DW 0 ; TEMP STORE FOR NEW CFG ; #IF (INTMODE < 3) ; diff --git a/Source/ver.inc b/Source/ver.inc index 0a509e88..39594378 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.40" +#DEFINE BIOSVER "3.1.1-pre.41" diff --git a/Source/ver.lib b/Source/ver.lib index 4ceb188d..e8892882 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.40" + db "3.1.1-pre.41" endm