Browse Source

Miscellaneous

- Fix minor ACIA bug that only occurs if setting a non-standard baud rate.
- Enhance Z280 UART driver to use C/T for more baud rates and to use Z280 opcodes to speed up interrupt handler a bit.
pull/199/head
Wayne Warthen 5 years ago
parent
commit
7956074746
  1. 2
      Source/HBIOS/Config/RCZ280_nat.asm
  2. 8
      Source/HBIOS/acia.asm
  3. 3
      Source/HBIOS/cfg_master.asm
  4. 3
      Source/HBIOS/cfg_rcz280.asm
  5. 4
      Source/HBIOS/hbios.asm
  6. 141
      Source/HBIOS/z2u.asm
  7. 2
      Source/ver.inc
  8. 2
      Source/ver.lib

2
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

8
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)
;

3
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
;

3
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
;

4
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
;

141
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)
;

2
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"

2
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

Loading…
Cancel
Save