mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Bug Fixes
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -129,12 +129,11 @@ PUB cls1(VerStr) | i
|
|||||||
clrbtm(TURQUOISE)
|
clrbtm(TURQUOISE)
|
||||||
|
|
||||||
inverse := 1
|
inverse := 1
|
||||||
'statprint(36,0, string(" N8VEM PropIO V2 | RomWBW v0.95"))
|
|
||||||
statprint(36, 0, VerStr)
|
statprint(36, 0, VerStr)
|
||||||
inverse := 0
|
inverse := 0
|
||||||
|
|
||||||
repeat i from 37 to (rows - 1)
|
repeat i from 37 to (rows - 1)
|
||||||
statprint(37,0, string(" "))
|
statprint(i,0, string(" "))
|
||||||
|
|
||||||
|
|
||||||
{{
|
{{
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
; MARK IV PROPIO CONFIGURATION
|
; MARK IV PROPIO CONFIGURATION
|
||||||
;==================================================================================================
|
;==================================================================================================
|
||||||
;
|
;
|
||||||
CRTACT .SET TRUE ; CRT ACTIVATION AT STARTUP
|
CRTACT .SET FALSE ; CRT ACTIVATION AT STARTUP
|
||||||
;
|
;
|
||||||
PRPENABLE .SET TRUE ; ENABLE PROPIO BOARD SUPPORT
|
PRPENABLE .SET TRUE ; ENABLE PROPIO BOARD SUPPORT
|
||||||
|
|||||||
@@ -75,75 +75,48 @@ ASCI_INIT1:
|
|||||||
;
|
;
|
||||||
; ASCI0
|
; ASCI0
|
||||||
CALL NEWLINE ; FORMATTING
|
CALL NEWLINE ; FORMATTING
|
||||||
PRTS("ASCI0: IO=0x$")
|
PRTS("ASCI0: IO=0x$") ; PREFIX
|
||||||
LD A,Z180_TDR0
|
LD A,Z180_TDR0 ; LOAD TDR PORT ADDRESS
|
||||||
CALL PRTHEXBYTE
|
CALL PRTHEXBYTE ; PRINT IT
|
||||||
|
|
||||||
CALL PC_COMMA
|
CALL PC_COMMA ; FORMATTING
|
||||||
LD A,Z180_RDR0
|
LD A,Z180_RDR0 ; LOAD RDR PORT ADDRESS
|
||||||
CALL PRTHEXBYTE
|
CALL PRTHEXBYTE ; PRINT IT
|
||||||
|
|
||||||
CALL PC_SPACE ; FORMATTING
|
CALL PC_SPACE ; FORMATTING
|
||||||
LD DE,ASCI0CFG ; LOAD CONFIG
|
LD DE,(ASCI0_CONFIG) ; LOAD CONFIG
|
||||||
CALL PS_PRTSC0 ; PRINT IT
|
CALL PS_PRTSC0 ; PRINT IT
|
||||||
|
|
||||||
LD HL,ASCI0CFG ; SERIAL CONFIG WORD
|
|
||||||
LD A,H ; BYTE W/ ENCODED BAUD RATE
|
|
||||||
AND $1F ; ISOLATE BITS
|
|
||||||
LD L,A ; MOVE TO L
|
|
||||||
LD H,0 ; CLEAR MSB
|
|
||||||
CALL ASCI_CNTLB ; DERIVE CNTLB VALUE
|
|
||||||
;CALL TSTPT
|
|
||||||
JR Z,ASCI_INIT2 ; IMPLEMENT IF NO ERROR
|
|
||||||
PRTS(" ERROR!$")
|
|
||||||
JR ASCI_INIT3 ; DO NEXT UNIT
|
|
||||||
|
|
||||||
|
LD DE,-1 ; DE := -1 TO INIT DEFAULT CONFIG
|
||||||
|
CALL ASCI0_INITDEV ; INIT DEVICE
|
||||||
|
JR Z,ASCI_INIT2 ; SUCCESS, SKIP AHEAD
|
||||||
|
PRTS(" ERROR!$") ; DISPLAY ERROR
|
||||||
|
;
|
||||||
ASCI_INIT2:
|
ASCI_INIT2:
|
||||||
LD A,66H
|
|
||||||
OUT0 (Z180_ASEXT0),A
|
|
||||||
LD A,64H
|
|
||||||
OUT0 (Z180_CNTLA0),A
|
|
||||||
LD A,C
|
|
||||||
OUT0 (Z180_CNTLB0),A
|
|
||||||
|
|
||||||
ASCI_INIT3:
|
|
||||||
; ASCI1
|
; ASCI1
|
||||||
CALL NEWLINE ; FORMATTING
|
CALL NEWLINE ; FORMATTING
|
||||||
PRTS("ASCI1: IO=0x$")
|
PRTS("ASCI1: IO=0x$") ; PREFIX
|
||||||
LD A,Z180_TDR1
|
LD A,Z180_TDR1 ; LOAD TDR PORT ADDRESS
|
||||||
CALL PRTHEXBYTE
|
CALL PRTHEXBYTE ; PRINT IT
|
||||||
CALL PC_COMMA
|
|
||||||
LD A,Z180_RDR1
|
CALL PC_COMMA ; FORMATTING
|
||||||
CALL PRTHEXBYTE
|
LD A,Z180_RDR1 ; LOAD RDR PORT ADDRESS
|
||||||
|
CALL PRTHEXBYTE ; PRINT IT
|
||||||
|
|
||||||
CALL PC_SPACE ; FORMATTING
|
CALL PC_SPACE ; FORMATTING
|
||||||
LD DE,ASCI1CFG ; LOAD CONFIG
|
LD DE,(ASCI1_CONFIG) ; LOAD CONFIG
|
||||||
CALL PS_PRTSC0 ; PRINT IT
|
CALL PS_PRTSC0 ; PRINT IT
|
||||||
|
|
||||||
LD HL,ASCI1CFG ; SERIAL CONFIG WORD
|
LD DE,-1 ; DE := -1 TO INIT DEFAULT CONFIG
|
||||||
LD A,H ; BYTE W/ ENCODED BAUD RATE
|
CALL ASCI1_INITDEV ; INIT DEVICE
|
||||||
AND $1F ; ISOLATE BITS
|
JR Z,ASCI_INIT3 ; SUCCESS, SKIP AHEAD
|
||||||
LD L,A ; MOVE TO L
|
PRTS(" ERROR!$") ; DISPLAY ERROR
|
||||||
LD H,0 ; CLEAR MSB
|
;
|
||||||
CALL ASCI_CNTLB ; DERIVE CNTLB VALUE
|
ASCI_INIT3:
|
||||||
;CALL TSTPT
|
|
||||||
JR Z,ASCI_INIT4 ; IMPLEMENT IF NO ERROR
|
|
||||||
PRTS(" ERROR!$")
|
|
||||||
JR ASCI_INIT5 ; DO NEXT UNIT
|
|
||||||
|
|
||||||
ASCI_INIT4:
|
|
||||||
LD A,66H
|
|
||||||
OUT0 (Z180_ASEXT1),A
|
|
||||||
LD A,64H
|
|
||||||
OUT0 (Z180_CNTLA1),A
|
|
||||||
LD A,C
|
|
||||||
OUT0 (Z180_CNTLB1),A
|
|
||||||
|
|
||||||
ASCI_INIT5:
|
|
||||||
XOR A
|
XOR A
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
; CHARACTER DEVICE DRIVER ENTRY
|
; DISPATCH TO SPECIFIC ASCI UNIT
|
||||||
;
|
;
|
||||||
ASCI_DISPATCH:
|
ASCI_DISPATCH:
|
||||||
PUSH IY ; PUSH UNIT DATA WORD
|
PUSH IY ; PUSH UNIT DATA WORD
|
||||||
@@ -154,9 +127,11 @@ ASCI_DISPATCH:
|
|||||||
JP Z,ASCI1
|
JP Z,ASCI1
|
||||||
CALL PANIC
|
CALL PANIC
|
||||||
;
|
;
|
||||||
|
; ASCI 0 FUNCTIONS
|
||||||
|
;
|
||||||
ASCI0:
|
ASCI0:
|
||||||
LD A,B ; GET REQUESTED FUNCTION
|
LD A,B ; GET REQUESTED FUNCTION
|
||||||
AND $0F ; ISOLATE SUB-FUNCTION
|
AND $0F ; ISOLATE SUB-FUNCTION
|
||||||
JP Z,ASCI0_IN
|
JP Z,ASCI0_IN
|
||||||
DEC A
|
DEC A
|
||||||
JP Z,ASCI0_OUT
|
JP Z,ASCI0_OUT
|
||||||
@@ -172,30 +147,27 @@ ASCI0:
|
|||||||
JP Z,ASCI0_DEVICE
|
JP Z,ASCI0_DEVICE
|
||||||
CALL PANIC
|
CALL PANIC
|
||||||
;
|
;
|
||||||
;
|
|
||||||
;
|
|
||||||
ASCI0_IN:
|
ASCI0_IN:
|
||||||
CALL ASCI0_IST
|
CALL ASCI0_IST
|
||||||
OR A
|
OR A
|
||||||
JR Z,ASCI0_IN
|
JR Z,ASCI0_IN
|
||||||
IN0 A,(Z180_RDR0) ; READ THE CHAR FROM THE ASCI
|
IN0 A,(Z180_RDR0) ; READ THE CHAR
|
||||||
LD E,A
|
LD E,A
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
;
|
|
||||||
;
|
|
||||||
ASCI0_IST:
|
ASCI0_IST:
|
||||||
; CHECK FOR ERROR FLAGS
|
; CHECK FOR ERROR FLAGS
|
||||||
IN0 A,(Z180_STAT0)
|
IN0 A,(Z180_STAT0)
|
||||||
AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR
|
AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR
|
||||||
JR Z,ASCI0_IST1 ; ALL IS WELL, CHECK FOR DATA
|
JR Z,ASCI0_IST1 ; ALL IS WELL, CHECK FOR DATA
|
||||||
|
;
|
||||||
; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!!
|
; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!!
|
||||||
IN0 A,(Z180_CNTLA0)
|
IN0 A,(Z180_CNTLA0)
|
||||||
RES 3,A ; CLEAR EFR (ERROR FLAG RESET)
|
RES 3,A ; CLEAR EFR (ERROR FLAG RESET)
|
||||||
OUT0 (Z180_CNTLA0),A
|
OUT0 (Z180_CNTLA0),A
|
||||||
|
;
|
||||||
ASCI0_IST1: ; CHECK FOR STAT0.RDRF (DATA READY)
|
ASCI0_IST1:
|
||||||
|
; CHECK FOR STAT0.RDRF (DATA READY)
|
||||||
IN0 A,(Z180_STAT0) ; READ LINE STATUS REGISTER
|
IN0 A,(Z180_STAT0) ; READ LINE STATUS REGISTER
|
||||||
AND $80 ; TEST IF DATA IN RECEIVE BUFFER
|
AND $80 ; TEST IF DATA IN RECEIVE BUFFER
|
||||||
JP Z,CIO_IDLE ; DO IDLE PROCESSING AND RETURN
|
JP Z,CIO_IDLE ; DO IDLE PROCESSING AND RETURN
|
||||||
@@ -203,8 +175,6 @@ ASCI0_IST1: ; CHECK FOR STAT0.RDRF (DATA READY)
|
|||||||
INC A ; SIGNAL CHAR READY, A = 1
|
INC A ; SIGNAL CHAR READY, A = 1
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
;
|
|
||||||
;
|
|
||||||
ASCI0_OUT:
|
ASCI0_OUT:
|
||||||
CALL ASCI0_OST
|
CALL ASCI0_OST
|
||||||
OR A
|
OR A
|
||||||
@@ -221,34 +191,54 @@ ASCI0_OST:
|
|||||||
INC A ; SIGNAL BUFFER EMPTY, A = 1
|
INC A ; SIGNAL BUFFER EMPTY, A = 1
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
;
|
|
||||||
;
|
|
||||||
ASCI0_INITDEV:
|
ASCI0_INITDEV:
|
||||||
XOR A ; NOT IMPLEMENTED!!!
|
; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT)
|
||||||
RET
|
LD A,D ; TEST DE FOR
|
||||||
|
AND E ; ... VALUE OF -1
|
||||||
|
INC A ; ... SO Z SET IF -1
|
||||||
|
JR NZ,ASCI0_INITDEV1 ; IF NEW CONFIG (NOT -1), IMPLEMENT IT
|
||||||
|
LD DE,(ASCI0_CONFIG) ; OTHERWISE, LOAD EXISTING CONFIG
|
||||||
;
|
;
|
||||||
|
ASCI0_INITDEV1:
|
||||||
|
; DETERMINE APPROPRIATE CNTLB VALUE (BASED ON BAUDRATE & CPU SPEED)
|
||||||
|
LD A,D ; BYTE W/ ENCODED BAUD RATE
|
||||||
|
AND $1F ; ISOLATE BITS
|
||||||
|
LD L,A ; MOVE TO L
|
||||||
|
LD H,0 ; CLEAR MSB
|
||||||
|
PUSH DE ; SAVE CONFIG
|
||||||
|
CALL ASCI_CNTLB ; DERIVE CNTLB VALUE
|
||||||
|
POP DE ; RESTORE CONFIG
|
||||||
|
;CALL TSTPT
|
||||||
|
RET NZ ; ABORT ON ERROR
|
||||||
|
LD (ASCI0_CONFIG),DE ; RECORD UPDATED CONFIG
|
||||||
;
|
;
|
||||||
|
; IMPLEMENT CONFIGURATION
|
||||||
|
LD A,66H ; LOAD DEFAULT ASEXT VALUE
|
||||||
|
OUT0 (Z180_ASEXT0),A ; SET IT
|
||||||
|
LD A,64H ; LOAD DEFAULT CNTLA VALUE
|
||||||
|
OUT0 (Z180_CNTLA0),A ; SET IT
|
||||||
|
LD A,C ; LOAD CNTLB VALUE DETERMINED ABOVE
|
||||||
|
OUT0 (Z180_CNTLB0),A ; SET IT
|
||||||
|
;
|
||||||
|
XOR A ; SIGNAL SUCCESS
|
||||||
|
RET ; DONE
|
||||||
;
|
;
|
||||||
ASCI0_QUERY:
|
ASCI0_QUERY:
|
||||||
LD DE,ASCI0CFG
|
LD DE,(ASCI0_CONFIG)
|
||||||
;LD DE,ASCI0BAUD >> 16
|
|
||||||
;LD HL,ASCI0BAUD & $FFFF
|
|
||||||
XOR A
|
XOR A
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
;
|
|
||||||
;
|
|
||||||
ASCI0_DEVICE:
|
ASCI0_DEVICE:
|
||||||
LD D,CIODEV_ASCI ; D := DEVICE TYPE
|
LD D,CIODEV_ASCI ; D := DEVICE TYPE
|
||||||
LD E,0 ; E := PHYSICAL UNIT
|
LD E,0 ; E := PHYSICAL UNIT
|
||||||
XOR A ; SIGNAL SUCCESS
|
XOR A ; SIGNAL SUCCESS
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
;
|
; ASCI 1 FUNCTIONS
|
||||||
;
|
;
|
||||||
ASCI1:
|
ASCI1:
|
||||||
LD A,B ; GET REQUESTED FUNCTION
|
LD A,B ; GET REQUESTED FUNCTION
|
||||||
AND $0F ; ISOLATE SUB-FUNCTION
|
AND $0F ; ISOLATE SUB-FUNCTION
|
||||||
JR Z,ASCI1_IN
|
JR Z,ASCI1_IN
|
||||||
DEC A
|
DEC A
|
||||||
JR Z,ASCI1_OUT
|
JR Z,ASCI1_OUT
|
||||||
@@ -264,29 +254,25 @@ ASCI1:
|
|||||||
JP Z,ASCI1_DEVICE
|
JP Z,ASCI1_DEVICE
|
||||||
CALL PANIC
|
CALL PANIC
|
||||||
;
|
;
|
||||||
;
|
|
||||||
;
|
|
||||||
ASCI1_IN:
|
ASCI1_IN:
|
||||||
CALL ASCI1_IST
|
CALL ASCI1_IST
|
||||||
OR A
|
OR A
|
||||||
JR Z,ASCI1_IN
|
JR Z,ASCI1_IN
|
||||||
IN0 A,(Z180_RDR1) ; READ THE CHAR FROM THE ASCI
|
IN0 A,(Z180_RDR1) ; READ THE CHAR
|
||||||
LD E,A
|
LD E,A
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
;
|
|
||||||
;
|
|
||||||
ASCI1_IST:
|
ASCI1_IST:
|
||||||
; CHECK FOR ERROR FLAGS
|
; CHECK FOR ERROR FLAGS
|
||||||
IN0 A,(Z180_STAT1)
|
IN0 A,(Z180_STAT1)
|
||||||
AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR
|
AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR
|
||||||
JR Z,ASCI1_IST1 ; ALL IS WELL, CHECK FOR DATA
|
JR Z,ASCI1_IST1 ; ALL IS WELL, CHECK FOR DATA
|
||||||
|
;
|
||||||
; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!!
|
; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!!
|
||||||
IN0 A,(Z180_CNTLA1)
|
IN0 A,(Z180_CNTLA1)
|
||||||
RES 3,A ; CLEAR EFR (ERROR FLAG RESET)
|
RES 3,A ; CLEAR EFR (ERROR FLAG RESET)
|
||||||
OUT0 (Z180_CNTLA1),A
|
OUT0 (Z180_CNTLA1),A
|
||||||
|
;
|
||||||
ASCI1_IST1: ; CHECK FOR STAT0.RDRF (DATA READY)
|
ASCI1_IST1: ; CHECK FOR STAT0.RDRF (DATA READY)
|
||||||
IN0 A,(Z180_STAT1) ; READ LINE STATUS REGISTER
|
IN0 A,(Z180_STAT1) ; READ LINE STATUS REGISTER
|
||||||
AND $80 ; TEST IF DATA IN RECEIVE BUFFER
|
AND $80 ; TEST IF DATA IN RECEIVE BUFFER
|
||||||
@@ -295,8 +281,6 @@ ASCI1_IST1: ; CHECK FOR STAT0.RDRF (DATA READY)
|
|||||||
INC A ; SIGNAL CHAR READY, A = 1
|
INC A ; SIGNAL CHAR READY, A = 1
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
;
|
|
||||||
;
|
|
||||||
ASCI1_OUT:
|
ASCI1_OUT:
|
||||||
CALL ASCI1_OST
|
CALL ASCI1_OST
|
||||||
OR A
|
OR A
|
||||||
@@ -314,122 +298,135 @@ ASCI1_OST:
|
|||||||
INC A ; SIGNAL BUFFER EMPTY, A = 1
|
INC A ; SIGNAL BUFFER EMPTY, A = 1
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
;
|
|
||||||
;
|
|
||||||
ASCI1_INITDEV:
|
ASCI1_INITDEV:
|
||||||
XOR A ; NOT IMPLEMENTED!!!
|
; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT)
|
||||||
RET
|
LD A,D ; TEST DE FOR
|
||||||
|
AND E ; ... VALUE OF -1
|
||||||
|
INC A ; ... SO Z SET IF -1
|
||||||
|
JR NZ,ASCI1_INITDEV1 ; IF NEW CONFIG (NOT -1), IMPLEMENT IT
|
||||||
|
LD DE,(ASCI1_CONFIG) ; OTHERWISE, LOAD EXISTING CONFIG
|
||||||
|
;
|
||||||
|
ASCI1_INITDEV1:
|
||||||
|
; DETERMINE APPROPRIATE CNTLB VALUE (BASED ON BAUDRATE & CPU SPEED)
|
||||||
|
LD A,D ; BYTE W/ ENCODED BAUD RATE
|
||||||
|
AND $1F ; ISOLATE BITS
|
||||||
|
LD L,A ; MOVE TO L
|
||||||
|
LD H,0 ; CLEAR MSB
|
||||||
|
PUSH DE ; SAVE CONFIG
|
||||||
|
CALL ASCI_CNTLB ; DERIVE CNTLB VALUE
|
||||||
|
POP DE ; RESTORE CONFIG
|
||||||
|
;CALL TSTPT
|
||||||
|
RET NZ ; ABORT ON ERROR
|
||||||
|
LD (ASCI1_CONFIG),DE ; RECORD UPDATED CONFIG
|
||||||
;
|
;
|
||||||
|
; IMPLEMENT CONFIGURATION
|
||||||
|
LD A,66H ; LOAD DEFAULT ASEXT VALUE
|
||||||
|
OUT0 (Z180_ASEXT1),A ; SET IT
|
||||||
|
LD A,64H ; LOAD DEFAULT CNTLA VALUE
|
||||||
|
OUT0 (Z180_CNTLA1),A ; SET IT
|
||||||
|
LD A,C ; LOAD CNTLB VALUE DETERMINED ABOVE
|
||||||
|
OUT0 (Z180_CNTLB1),A ; SET IT
|
||||||
;
|
;
|
||||||
|
XOR A ; SIGNAL SUCCESS
|
||||||
|
RET ; DONE
|
||||||
;
|
;
|
||||||
ASCI1_QUERY:
|
ASCI1_QUERY:
|
||||||
;LD DE,ASCI1BAUD >> 16
|
LD DE,(ASCI1_CONFIG)
|
||||||
;LD HL,ASCI1BAUD & $FFFF
|
|
||||||
LD DE,ASCI1CFG
|
|
||||||
XOR A
|
XOR A
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
;
|
|
||||||
;
|
|
||||||
ASCI1_DEVICE:
|
ASCI1_DEVICE:
|
||||||
LD D,CIODEV_ASCI ; D := DEVICE TYPE
|
LD D,CIODEV_ASCI ; D := DEVICE TYPE
|
||||||
LD E,1 ; E := PHYSICAL UNIT
|
LD E,1 ; E := PHYSICAL UNIT
|
||||||
XOR A ; SIGNAL SUCCESS
|
XOR A ; SIGNAL SUCCESS
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
|
; LOCAL DATA
|
||||||
|
;
|
||||||
|
ASCI0_CONFIG .DW ASCI0CFG ; SAVED CONFIG FOR ASCI0
|
||||||
|
ASCI1_CONFIG .DW ASCI1CFG ; SAVED CONFIG FOR ASCI1
|
||||||
|
;
|
||||||
; DERIVE A CNTLB VALUE BASED ON AN ENCODED BAUD RATE AND CURRENT CPU SPEED
|
; DERIVE A CNTLB VALUE BASED ON AN ENCODED BAUD RATE AND CURRENT CPU SPEED
|
||||||
; ENTRY: HL = ENCODED BAUD RATE
|
; ENTRY: HL = ENCODED BAUD RATE
|
||||||
; EXIT: C = CNTLB VALUE, A=0, Z SET INDICATES SUCCESS
|
; EXIT: C = CNTLB VALUE, A=0/Z IFF SUCCESS
|
||||||
;
|
;
|
||||||
; GIVEN DIVISOR = CLK HZ / BAUD
|
; DESIRED DIVISOR == CPUHZ / BAUD
|
||||||
; LET LOOKUP = DIVISOR / 160
|
; DUE TO ENCODING BAUD IS ALWAYS DIVISIBLE BY 75
|
||||||
; LOOKUP = CLK / BAUD / 160
|
; Z180 DIVISOR IS ALWAYS A FACTOR OF 160
|
||||||
; LET KCLK = CLK / 1000, SO CLK = KCLK * 1000
|
|
||||||
; LOOKUP = KCLK * 1000 / BAUD / 160
|
|
||||||
; OR, LOOKUP = (KCLK / 12) / (BAUD / 75)
|
|
||||||
;
|
;
|
||||||
; SO, WE USE (CPUKHZ / 12) / (BAUD RATE / 75) TO GET LOOKUP VALUE
|
; X = CPU_HZ / 160 / 75 ==> SIMPLIFIED ==> X = CPU_KHZ / 12
|
||||||
; THEN LOOKUP THE CORRECT CNTLB0 VALUE
|
; X = X / (BAUD / 75)
|
||||||
|
; IF X % 3 == 0, THEN (PS=1, X := X / 3) ELSE PS=0
|
||||||
|
; IF X % 4 == 0, THEN (DR=1, X := X / 4) ELSE DR=0
|
||||||
|
; SS := LOG2(X)
|
||||||
;
|
;
|
||||||
ASCI_CNTLB:
|
ASCI_CNTLB:
|
||||||
LD DE,1 ; USE DECODE CONSTANT OF 1 TO GET BAUD RATE ALREADY DIVIDED BY 75
|
LD DE,1 ; USE DECODE CONSTANT OF 1 TO GET BAUD RATE ALREADY DIVIDED BY 75
|
||||||
CALL DECODE ; DECODE THE BAUDATE INTO DE:HL, DE IS DISCARDED
|
CALL DECODE ; DECODE THE BAUDATE INTO DE:HL, DE IS DISCARDED
|
||||||
|
;CALL TSTPT
|
||||||
RET NZ ; ABORT ON ERROR
|
RET NZ ; ABORT ON ERROR
|
||||||
PUSH HL ; HL HAS (BAUD / 75), SAVE IT
|
PUSH HL ; HL HAS (BAUD / 75), SAVE IT
|
||||||
;LD HL,(HCB + HCB_CPUKHZ) ; GET CPU CLK IN KHZ
|
;LD HL,(HCB + HCB_CPUKHZ) ; GET CPU CLK IN KHZ
|
||||||
LD HL,CPUKHZ ; CPU CLK IN KHZ
|
LD HL,CPUKHZ ; CPU CLK IN KHZ
|
||||||
|
;LD HL,9216 ; *DEBUG*
|
||||||
LD DE,12 ; PREPARE TO DIVIDE BY 12
|
LD DE,12 ; PREPARE TO DIVIDE BY 12
|
||||||
CALL DIV16 ; BC := (CPU CLK KHZ / 12), REMAINDER IN HL, ZF
|
CALL DIV16 ; BC := (CPU_KHZ / 12), REM IN HL, ZF
|
||||||
POP DE ; RESTORE DENOMINATOR
|
;CALL TSTPT
|
||||||
JR NZ,ASCI_CNTLB2 ; ABORT IF REMAINDER
|
POP DE ; RESTORE (BAUD / 75)
|
||||||
PUSH BC ; MOVE VALUE
|
RET NZ ; ABORT IF REMAINDER
|
||||||
POP HL ; ... TO HL NUMERATOR
|
PUSH BC ; MOVE WORKING VALUE
|
||||||
CALL DIV16 ; BC := LOOKUP VALUE, REMAINDER IN HL, ZF
|
POP HL ; ... BACK TO HL
|
||||||
JR NZ,ASCI_CNTLB2 ; ABORT IF REMAINDER
|
CALL DIV16 ; BC := X / (BAUD / 75)
|
||||||
PUSH BC ; MOVE LOOKUP VALUE
|
;CALL TSTPT
|
||||||
POP DE ; TO DE
|
RET NZ ; ABORT IF REMAINDER
|
||||||
LD B,ASCI_LKUPCNT ; INIT LOOP COUNT
|
;
|
||||||
LD HL,ASCI_LKUP ; POINT TO START OF TABLE
|
; DETERMINE PS BIT BY ATTEMPTING DIVIDE BY 3
|
||||||
ASCI_CNTLB0:
|
PUSH BC ; SAVE WORKING VALUE ON STACK
|
||||||
LD A,(HL) ; GET BYTE TO COMPARE
|
PUSH BC ; MOVE WORKING VALUE
|
||||||
INC HL ; INCREMENT HL FOR NEXT
|
POP HL ; ... TO HL
|
||||||
CP E ; COMPARE LSB
|
LD DE,3 ; SETUP TO DIVIDE BY 3
|
||||||
JR NZ,ASCI_CNTLB1 ; NO MATCH, LOOP
|
CALL DIV16 ; BC := X / 3, REM IN HL, ZF
|
||||||
LD A,(HL) ; GET BYTE TO COMPARE
|
;CALL TSTPT
|
||||||
CP D ; COMPARE MSB
|
POP HL ; HL := PRIOR WORKING VALUE
|
||||||
JR NZ,ASCI_CNTLB1 ; NO MATCH, LOOP
|
LD E,0 ; INIT E := 0 AS WORKING CNTLB VALUE
|
||||||
; MATCH FOUND
|
JR NZ,ASCI_CNTLB1 ; DID NOT WORK, LEAVE PS==0, SKIP AHEAD
|
||||||
INC HL ; POINT TO CNTLB VALUE
|
SET 5,E ; SET PS BIT
|
||||||
LD C,(HL) ; LOAD IN C
|
PUSH BC ; MOVE NEW WORKING
|
||||||
XOR A ; SIGNAL SUCCESS
|
POP HL ; ... VALUE TO HL
|
||||||
RET ; AND DONE
|
;
|
||||||
ASCI_CNTLB1:
|
ASCI_CNTLB1:
|
||||||
INC HL ; BUMP TO
|
;CALL TSTPT
|
||||||
INC HL ; ... NEXT ENTRY
|
; DETERMINE DR BIT BY ATTEMPTING DIVIDE BY 4
|
||||||
DJNZ ASCI_CNTLB0 ; LOOP IF MORE TO CHECK
|
LD A,L ; LOAD LSB OF WORKING VALUE
|
||||||
|
AND $03 ; ISOLATE LOW ORDER BITS
|
||||||
|
JR NZ,ASCI_CNTLB2 ; NOT DIVISIBLE BY 4, SKIP AHEAD
|
||||||
|
SET 3,E ; SET PS BIT
|
||||||
|
SRL H ; DIVIDE HL BY 4
|
||||||
|
RR L ; ...
|
||||||
|
SRL H ; ...
|
||||||
|
RR L ; ...
|
||||||
|
;
|
||||||
ASCI_CNTLB2:
|
ASCI_CNTLB2:
|
||||||
OR $FF ; NOT FOUND, SET ERROR
|
;CALL TSTPT
|
||||||
RET ; AND RETURN
|
; DETERMINE SS BITS BY RIGHT SHIFTING AND INCREMENTING
|
||||||
|
LD B,7 ; LOOP COUNTER, MAX VALUE OF SS IS 7
|
||||||
|
LD C,E ; MOVE WORKING CNTLB VALUE TO C
|
||||||
|
ASCI_CNTLB3:
|
||||||
|
BIT 0,L ; CAN WE SHIFT AGAIN?
|
||||||
|
JR NZ,ASCI_CNTLB4 ; NOPE, DONE
|
||||||
|
SRL H ; IMPLEMENT THE
|
||||||
|
RR L ; ... SHIFT OPERATION
|
||||||
|
INC C ; INCREMENT SS BITS
|
||||||
|
DJNZ ASCI_CNTLB3 ; LOOP IF MORE SHIFTING POSSIBLE
|
||||||
;
|
;
|
||||||
; LOOKUP PS BIT PS DIV DR BIT DR DIV SS BITS SS DIV DIVISOR CNTLB
|
; AT THIS POINT HL MUST BE EQUAL TO 1 OR WE FAILED!
|
||||||
; ------ ------ ------ ------ ------ ------- ------ ------- --------
|
DEC HL ; IF HL == 1, SHOULD BECOME ZERO
|
||||||
; 1 0 10 0 16 0 1 160 XX0X0000
|
LD A,H ; TEST HL
|
||||||
; 2 0 10 0 16 1 2 320 XX0X0001
|
OR L ; ... FOR ZERO
|
||||||
; 3 1 30 0 16 0 1 480 XX1X0000
|
RET NZ ; ABORT IF NOT ZERO
|
||||||
; 4 0 10 0 16 2 4 640 XX0X0010
|
|
||||||
; 6 1 30 0 16 1 2 960 XX1X0001
|
|
||||||
; 8 0 10 0 16 3 8 1280 XX0X0011
|
|
||||||
; 12 1 30 0 16 2 4 1920 XX1X0010
|
|
||||||
; 16 0 10 0 16 4 16 2560 XX0X0100
|
|
||||||
; 24 1 30 0 16 3 8 3840 XX1X0011
|
|
||||||
; 32 0 10 0 16 5 32 5120 XX0X0101
|
|
||||||
; 48 1 30 0 16 4 16 7680 XX1X0100
|
|
||||||
; 64 0 10 0 16 6 64 10240 XX0X0110
|
|
||||||
; 96 1 30 0 16 5 32 15360 XX1X0101
|
|
||||||
; 128 0 10 1 64 5 32 20480 XX0X1101
|
|
||||||
; 192 1 30 0 16 6 64 30720 XX1X0110
|
|
||||||
; 256 0 10 1 64 6 64 40960 XX0X1110
|
|
||||||
; 384 1 30 1 64 5 32 61440 XX1X1101
|
|
||||||
; 768 1 30 1 64 6 64 122880 XX1X1110
|
|
||||||
;
|
;
|
||||||
ASCI_LKUP: ; LOOKUP CNTLB VAL
|
ASCI_CNTLB4:
|
||||||
.DW 1 \ .DB %00000000
|
;CALL TSTPT
|
||||||
.DW 2 \ .DB %00000001
|
XOR A
|
||||||
.DW 3 \ .DB %00100000
|
RET
|
||||||
.DW 4 \ .DB %00000010
|
|
||||||
.DW 6 \ .DB %00100001
|
|
||||||
.DW 8 \ .DB %00000011
|
|
||||||
.DW 12 \ .DB %00100010
|
|
||||||
.DW 16 \ .DB %00000100
|
|
||||||
.DW 24 \ .DB %00100011
|
|
||||||
.DW 32 \ .DB %00000101
|
|
||||||
.DW 48 \ .DB %00100100
|
|
||||||
.DW 64 \ .DB %00000110
|
|
||||||
.DW 96 \ .DB %00100101
|
|
||||||
.DW 128 \ .DB %00001101
|
|
||||||
.DW 192 \ .DB %00100110
|
|
||||||
.DW 256 \ .DB %00001110
|
|
||||||
.DW 384 \ .DB %00101101
|
|
||||||
.DW 768 \ .DB %00101110
|
|
||||||
;
|
;
|
||||||
ASCI_LKUPCNT .EQU ($ - ASCI_LKUP) / 3
|
|
||||||
@@ -503,11 +503,9 @@ HB_START:
|
|||||||
;
|
;
|
||||||
; DISPLAY THE PRE-INITIALIZATION BANNER
|
; DISPLAY THE PRE-INITIALIZATION BANNER
|
||||||
;
|
;
|
||||||
CALL NEWLINE
|
CALL NEWLINE2
|
||||||
CALL NEWLINE
|
|
||||||
PRTX(STR_BANNER)
|
PRTX(STR_BANNER)
|
||||||
CALL NEWLINE
|
CALL NEWLINE2
|
||||||
CALL NEWLINE
|
|
||||||
PRTX(STR_PLATFORM)
|
PRTX(STR_PLATFORM)
|
||||||
PRTS(" @ $")
|
PRTS(" @ $")
|
||||||
LD HL,(HCB + HCB_CPUKHZ)
|
LD HL,(HCB + HCB_CPUKHZ)
|
||||||
@@ -589,8 +587,7 @@ INITSYS1:
|
|||||||
#ENDIF
|
#ENDIF
|
||||||
;
|
;
|
||||||
; NOTIFY USER OF CONSOLE SWITCH ON BOOT CONSOLE
|
; NOTIFY USER OF CONSOLE SWITCH ON BOOT CONSOLE
|
||||||
CALL NEWLINE
|
CALL NEWLINE2
|
||||||
CALL NEWLINE
|
|
||||||
PRTX(STR_SWITCH)
|
PRTX(STR_SWITCH)
|
||||||
CALL NEWLINE
|
CALL NEWLINE
|
||||||
;
|
;
|
||||||
@@ -2133,6 +2130,7 @@ PS_PRTDC:
|
|||||||
; PRINT HARD DISK STORAGE SIZE IN MB
|
; PRINT HARD DISK STORAGE SIZE IN MB
|
||||||
LD B,BF_DIOCAP ; HBIOS FUNC: GET CAPACTIY
|
LD B,BF_DIOCAP ; HBIOS FUNC: GET CAPACTIY
|
||||||
RST 08 ; DE:HL := BLOCKS
|
RST 08 ; DE:HL := BLOCKS
|
||||||
|
JP NZ,PS_PRTNUL ; MEDIA PROBLEM
|
||||||
RES 7,D ; CLEAR LBA BIT
|
RES 7,D ; CLEAR LBA BIT
|
||||||
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
|
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
|
||||||
CALL SRL32 ; RIGHT SHIFT
|
CALL SRL32 ; RIGHT SHIFT
|
||||||
@@ -2146,6 +2144,7 @@ PS_PRTDC1:
|
|||||||
; PRINT ROM/ROM DISK CAPACITY IN KB
|
; PRINT ROM/ROM DISK CAPACITY IN KB
|
||||||
LD B,BF_DIOCAP ; HBIOS FUNC: GET CAPACTIY
|
LD B,BF_DIOCAP ; HBIOS FUNC: GET CAPACTIY
|
||||||
RST 08 ; DE:HL := BLOCKS
|
RST 08 ; DE:HL := BLOCKS
|
||||||
|
JP NZ,PS_PRTNUL ; MEDIA PROBLEM
|
||||||
RES 7,D ; CLEAR LBA BIT
|
RES 7,D ; CLEAR LBA BIT
|
||||||
LD B,1 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
|
LD B,1 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
|
||||||
CALL SRL32 ; RIGHT SHIFT
|
CALL SRL32 ; RIGHT SHIFT
|
||||||
|
|||||||
@@ -460,8 +460,10 @@ IDE_CAP:
|
|||||||
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
|
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
|
||||||
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
||||||
LD BC,512 ; 512 BYTES PER BLOCK
|
LD BC,512 ; 512 BYTES PER BLOCK
|
||||||
XOR A ; SIGNAL SUCCESS
|
IDE_DPTR(IDE_STAT) ; POINT TO UNIT STATUS
|
||||||
RET ; AND DONE
|
LD A,(HL) ; GET STATUS
|
||||||
|
OR A ; SET FLAGS
|
||||||
|
RET
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
@@ -473,8 +475,7 @@ IDE_GEOM:
|
|||||||
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
||||||
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
||||||
LD E,16 ; SECTORS / TRACK = 16
|
LD E,16 ; SECTORS / TRACK = 16
|
||||||
XOR A ; SIGNAL SUCCESS
|
RET ; DONE, A STILL HAS IDE_CAP STATUS
|
||||||
RET
|
|
||||||
;
|
;
|
||||||
;=============================================================================
|
;=============================================================================
|
||||||
; FUNCTION SUPPORT ROUTINES
|
; FUNCTION SUPPORT ROUTINES
|
||||||
|
|||||||
@@ -140,8 +140,7 @@ START:
|
|||||||
; EMIT FIRST SIGN OF LIFE TO SERIAL PORT
|
; EMIT FIRST SIGN OF LIFE TO SERIAL PORT
|
||||||
;
|
;
|
||||||
CALL XIO_INIT ; INIT SERIAL PORT
|
CALL XIO_INIT ; INIT SERIAL PORT
|
||||||
#IFNDEF
|
#IFNDEF ROMLOAD
|
||||||
CALL XIO_CRLF ; FORMATTING
|
|
||||||
CALL XIO_CRLF ; FORMATTING
|
CALL XIO_CRLF ; FORMATTING
|
||||||
#ENDIF
|
#ENDIF
|
||||||
LD HL,STR_BOOT ; POINT TO MESSAGE
|
LD HL,STR_BOOT ; POINT TO MESSAGE
|
||||||
|
|||||||
@@ -493,7 +493,10 @@ PPIDE_CAP:
|
|||||||
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
||||||
LD BC,512 ; 512 BYTES PER BLOCK
|
LD BC,512 ; 512 BYTES PER BLOCK
|
||||||
XOR A ; SIGNAL SUCCESS
|
XOR A ; SIGNAL SUCCESS
|
||||||
RET ; AND DONE
|
PPIDE_DPTR(PPIDE_STAT) ; POINT TO UNIT STATUS
|
||||||
|
LD A,(HL) ; GET STATUS
|
||||||
|
OR A ; SET FLAGS
|
||||||
|
RET
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
@@ -505,8 +508,7 @@ PPIDE_GEOM:
|
|||||||
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
||||||
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
||||||
LD E,16 ; SECTORS / TRACK = 16
|
LD E,16 ; SECTORS / TRACK = 16
|
||||||
XOR A ; SIGNAL SUCCESS
|
RET ; DONE, A STILL HAS PPIDE_CAP STATUS
|
||||||
RET
|
|
||||||
;
|
;
|
||||||
;=============================================================================
|
;=============================================================================
|
||||||
; FUNCTION SUPPORT ROUTINES
|
; FUNCTION SUPPORT ROUTINES
|
||||||
|
|||||||
@@ -630,8 +630,9 @@ PPPSD_CAP:
|
|||||||
LD HL,PPPSD_BLKCNT ; GET BLOCK COUNT
|
LD HL,PPPSD_BLKCNT ; GET BLOCK COUNT
|
||||||
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
||||||
LD BC,512 ; 512 BYTES PER BLOCK
|
LD BC,512 ; 512 BYTES PER BLOCK
|
||||||
XOR A ; SIGNAL SUCCESS
|
LD A,(PPPSD_STAT) ; GET CURRENT STATUS
|
||||||
RET ; AND DONE
|
OR A ; SET FLAGS
|
||||||
|
RET
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
@@ -643,8 +644,7 @@ PPPSD_GEOM:
|
|||||||
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
||||||
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
||||||
LD E,16 ; SECTORS / TRACK = 16
|
LD E,16 ; SECTORS / TRACK = 16
|
||||||
XOR A ; SIGNAL SUCCESS
|
RET ; DONE, A STILL HAS PPPSD_CAP STATUS
|
||||||
RET
|
|
||||||
;
|
;
|
||||||
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
|
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
|
||||||
; UNIT IS SPECIFIED IN A
|
; UNIT IS SPECIFIED IN A
|
||||||
@@ -684,7 +684,8 @@ PPPSD_INITCARD:
|
|||||||
|
|
||||||
; HANDLE ERROR
|
; HANDLE ERROR
|
||||||
CALL PPPSD_GETDSKSTAT ; GET FULL ERROR CODE
|
CALL PPPSD_GETDSKSTAT ; GET FULL ERROR CODE
|
||||||
JP PPPSD_ERRCMD ; HANDLE ERRORS
|
;JP PPPSD_ERRCMD ; HANDLE ERRORS
|
||||||
|
JP PPPSD_NOMEDIA ; RETURN W/ NO MEDIA ERROR
|
||||||
|
|
||||||
PPPSD_INITCARD1:
|
PPPSD_INITCARD1:
|
||||||
|
|
||||||
|
|||||||
@@ -493,8 +493,9 @@ PRPSD_CAP:
|
|||||||
LD HL,PRPSD_BLKCNT ; POINT TO BLOCK COUNT
|
LD HL,PRPSD_BLKCNT ; POINT TO BLOCK COUNT
|
||||||
CALL LD32 ; GET THE CURRENT CAPACITY TO DE:HL
|
CALL LD32 ; GET THE CURRENT CAPACITY TO DE:HL
|
||||||
LD BC,512 ; 512 BYTES PER BLOCK
|
LD BC,512 ; 512 BYTES PER BLOCK
|
||||||
XOR A ; SIGNAL SUCCESS
|
LD A,(PRPSD_STAT) ; GET CURRENT STATUS
|
||||||
RET ; AND DONE
|
OR A ; SET FLAGS
|
||||||
|
RET
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
@@ -507,7 +508,7 @@ PRPSD_GEOM:
|
|||||||
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
||||||
LD E,16 ; SECTORS / TRACK = 16
|
LD E,16 ; SECTORS / TRACK = 16
|
||||||
XOR A ; SIGNAL SUCCESS
|
XOR A ; SIGNAL SUCCESS
|
||||||
RET
|
RET ; DONE, A STILL HAS PRPSD_CAP STATUS
|
||||||
;
|
;
|
||||||
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
|
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
|
||||||
; UNIT IS SPECIFIED IN A
|
; UNIT IS SPECIFIED IN A
|
||||||
@@ -545,7 +546,8 @@ PRPSD_INITCARD:
|
|||||||
; REQUEST HARDWARE INIT, RESULT IN A, Z/NZ SET
|
; REQUEST HARDWARE INIT, RESULT IN A, Z/NZ SET
|
||||||
LD A,PRPSD_CMDINIT
|
LD A,PRPSD_CMDINIT
|
||||||
CALL PRPSD_SNDCMD
|
CALL PRPSD_SNDCMD
|
||||||
RET NZ ; NZ SET, A HAS RESULT CODE
|
;RET NZ ; NZ SET, A HAS RESULT CODE
|
||||||
|
JP NZ,PRPSD_NOMEDIA ; RETURN W/ NO MEDIA ERROR
|
||||||
|
|
||||||
#IF (PRPSDTRACE >= 3)
|
#IF (PRPSDTRACE >= 3)
|
||||||
; GET CSD IF DEBUGGING
|
; GET CSD IF DEBUGGING
|
||||||
|
|||||||
@@ -120,8 +120,7 @@ RF_GEOM:
|
|||||||
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
||||||
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
||||||
LD E,16 ; SECTORS / TRACK = 16
|
LD E,16 ; SECTORS / TRACK = 16
|
||||||
XOR A ; SIGNAL SUCCESS
|
RET ; DONE, A STILL HAS RF_CAP STATUS
|
||||||
RET
|
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -571,8 +571,10 @@ SD_CAP:
|
|||||||
SD_DPTR(SD_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
|
SD_DPTR(SD_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
|
||||||
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
||||||
LD BC,512 ; 512 BYTES PER BLOCK
|
LD BC,512 ; 512 BYTES PER BLOCK
|
||||||
XOR A ; SIGNAL SUCCESS
|
SD_DPTR(SD_STAT) ; POINT TO UNIT STATUS
|
||||||
RET ; AND DONE
|
LD A,(HL) ; GET STATUS
|
||||||
|
OR A ; SET FLAGS
|
||||||
|
RET
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
@@ -584,8 +586,7 @@ SD_GEOM:
|
|||||||
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
||||||
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA BIT
|
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA BIT
|
||||||
LD E,16 ; SECTORS / TRACK = 16
|
LD E,16 ; SECTORS / TRACK = 16
|
||||||
XOR A ; SIGNAL SUCCESS
|
RET ; DONE, A STILL HAS SD_CAP STATUS
|
||||||
RET
|
|
||||||
;
|
;
|
||||||
;=============================================================================
|
;=============================================================================
|
||||||
; FUNCTION SUPPORT ROUTINES
|
; FUNCTION SUPPORT ROUTINES
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ LEAPDIV:
|
|||||||
; PRESERVE HL
|
; PRESERVE HL
|
||||||
PUSH HL
|
PUSH HL
|
||||||
CALL DIV16
|
CALL DIV16
|
||||||
LD A,H
|
;LD A,H
|
||||||
OR L
|
;OR L
|
||||||
POP HL
|
POP HL
|
||||||
RET
|
RET
|
||||||
|
|||||||
@@ -207,20 +207,27 @@ UART_OST:
|
|||||||
;
|
;
|
||||||
UART_INITDEV:
|
UART_INITDEV:
|
||||||
; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT)
|
; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT)
|
||||||
LD A,D
|
LD A,D ; TEST DE FOR
|
||||||
AND E
|
AND E ; ... VALUE OF -1
|
||||||
INC A
|
INC A ; ... SO Z SET IF -1
|
||||||
JR Z,UART_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG
|
JR NZ,UART_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG
|
||||||
;
|
;
|
||||||
; UDPATE CONFIG BYTES
|
; LOAD EXISTING CONFIG TO REINIT
|
||||||
|
LD E,(IY + 4) ; LOW BYTE
|
||||||
|
LD D,(IY + 5) ; HIGH BYTE
|
||||||
|
;
|
||||||
|
UART_INITDEV1:
|
||||||
|
; DETERMINE DIVISOR
|
||||||
|
PUSH DE ; SAVE CONFIG
|
||||||
|
CALL UART_COMPDIV ; COMPUTE DIVISOR TO BC
|
||||||
|
POP DE ; RESTORE CONFIG
|
||||||
|
RET NZ ; ABORT IF COMPDIV FAILS!
|
||||||
|
;
|
||||||
|
; GOT A DIVISOR, COMMIT NEW CONFIG
|
||||||
LD (IY + 4),E ; SAVE LOW WORD
|
LD (IY + 4),E ; SAVE LOW WORD
|
||||||
LD (IY + 5),D ; SAVE HI WORD
|
LD (IY + 5),D ; SAVE HI WORD
|
||||||
;
|
;
|
||||||
UART_INITDEV1:
|
; START OF ACTUAL UART CONFIGURATION
|
||||||
; START OF UART INITIALIZATION, SET BAUD RATE
|
|
||||||
LD E,(IY + 4) ; GET LOW WORD
|
|
||||||
LD D,(IY + 5) ; GET HI WORD
|
|
||||||
CALL UART_COMPDIV ; COMPUTE DIVISOR TO BC
|
|
||||||
LD A,80H ; DLAB IS BIT 7 OF LCR
|
LD A,80H ; DLAB IS BIT 7 OF LCR
|
||||||
UART_OUTP(UART_LCR) ; DLAB ON
|
UART_OUTP(UART_LCR) ; DLAB ON
|
||||||
LD A,B
|
LD A,B
|
||||||
@@ -304,8 +311,8 @@ UART_INITDEV3:
|
|||||||
|
|
||||||
PRTC(']')
|
PRTC(']')
|
||||||
#ENDIF
|
#ENDIF
|
||||||
|
;
|
||||||
XOR A ; NOT IMPLEMENTED!!!
|
XOR A ; SIGNAL SUCCESS
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -38,7 +38,8 @@ XIO_INIT: ; MINIMAL UART INIT
|
|||||||
LD A,$64 ; ENABLE XMT/RCV, 8 DATA, NO PARITY, 1 STOP
|
LD A,$64 ; ENABLE XMT/RCV, 8 DATA, NO PARITY, 1 STOP
|
||||||
OUT0 (Z180_CNTLA0),A ; -> CNTLA0
|
OUT0 (Z180_CNTLA0),A ; -> CNTLA0
|
||||||
LD A,$22 ; FAILSAFE VALUE, 9600 BAUD AT 18.432 MHZ
|
LD A,$22 ; FAILSAFE VALUE, 9600 BAUD AT 18.432 MHZ
|
||||||
OUT0 (Z180_CNTLB0),A ; -> CNTLB0
|
;LD A,$20 ; FAILSAFE VALUE, 9600 BAUD AT 18.432 MHZ
|
||||||
|
;OUT0 (Z180_CNTLB0),A ; -> CNTLB0
|
||||||
|
|
||||||
; TRY TO IMPLEMENT CONFIGURED BAUD RATE
|
; TRY TO IMPLEMENT CONFIGURED BAUD RATE
|
||||||
LD HL,ASCI0CFG ; SERIAL CONFIG WORD
|
LD HL,ASCI0CFG ; SERIAL CONFIG WORD
|
||||||
@@ -47,10 +48,12 @@ XIO_INIT: ; MINIMAL UART INIT
|
|||||||
LD L,A ; MOVE TO L
|
LD L,A ; MOVE TO L
|
||||||
LD H,0 ; CLEAR MSB
|
LD H,0 ; CLEAR MSB
|
||||||
CALL XIO_CNTLB ; DERIVE CNTLB VALUE
|
CALL XIO_CNTLB ; DERIVE CNTLB VALUE
|
||||||
JR NZ,XIO_INIT1 ; BYPASS ON FAILURE
|
JR Z,XIO_INIT1 ; SUCCESS, IMPLEMENT IT
|
||||||
LD A,C ; PUT INT C
|
LD C,$22 ; FAILSAFE VALUE, 9600 BAUD AT 18.432 MHZ
|
||||||
|
|
||||||
|
XIO_INIT1:
|
||||||
|
LD A,C ; MOVE VALUE TO ACCUM
|
||||||
OUT0 (Z180_CNTLB0),A ; AND SET THE VALUE
|
OUT0 (Z180_CNTLB0),A ; AND SET THE VALUE
|
||||||
|
|
||||||
#ENDIF
|
#ENDIF
|
||||||
|
|
||||||
#IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_ZETA2))
|
#IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_ZETA2))
|
||||||
@@ -76,14 +79,15 @@ XIO_INIT: ; MINIMAL UART INIT
|
|||||||
|
|
||||||
#ENDIF
|
#ENDIF
|
||||||
|
|
||||||
XIO_INIT1:
|
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
|
XIO_CRLF2:
|
||||||
|
CALL XIO_CRLF ; SEND CRLF, FALL THRU FOR ANOTHER
|
||||||
XIO_CRLF: ; OUTPUT A NEWLINE
|
XIO_CRLF: ; OUTPUT A NEWLINE
|
||||||
LD A,13 ; A = CR
|
LD A,13 ; A = CR
|
||||||
CALL XIO_OUTC ; WRITE IT
|
CALL XIO_OUTC ; WRITE IT
|
||||||
LD A,10 ; A = LF
|
LD A,10 ; A = LF
|
||||||
JR XIO_OUTC ; WRITE IT
|
JR XIO_OUTC ; WRITE IT AND RETURN
|
||||||
;
|
;
|
||||||
XIO_SPACE: ; OUTPUT A SPACE CHARACTER
|
XIO_SPACE: ; OUTPUT A SPACE CHARACTER
|
||||||
LD A,' '
|
LD A,' '
|
||||||
@@ -190,99 +194,86 @@ XIO_DIV16B:
|
|||||||
;
|
;
|
||||||
; DERIVE A CNTLB VALUE BASED ON AN ENCODED BAUD RATE AND CURRENT CPU SPEED
|
; DERIVE A CNTLB VALUE BASED ON AN ENCODED BAUD RATE AND CURRENT CPU SPEED
|
||||||
; ENTRY: HL = ENCODED BAUD RATE
|
; ENTRY: HL = ENCODED BAUD RATE
|
||||||
; EXIT: C = CNTLB VALUE, A=0, Z SET INDICATES SUCCESS
|
; EXIT: C = CNTLB VALUE, A=0/Z IFF SUCCESS
|
||||||
;
|
;
|
||||||
; GIVEN DIVISOR = CLK HZ / BAUD
|
; DESIRED DIVISOR == CPUHZ / BAUD
|
||||||
; LET LOOKUP = DIVISOR / 160
|
; DUE TO ENCODING BAUD IS ALWAYS DIVISIBLE BY 75
|
||||||
; LOOKUP = CLK / BAUD / 160
|
; Z180 DIVISOR IS ALWAYS A FACTOR OF 160
|
||||||
; LET KCLK = CLK / 1000, SO CLK = KCLK * 1000
|
|
||||||
; LOOKUP = KCLK * 1000 / BAUD / 160
|
|
||||||
; OR, LOOKUP = (KCLK / 12) / (BAUD / 75)
|
|
||||||
;
|
;
|
||||||
; SO, WE USE (CPUKHZ / 12) / (BAUD RATE / 75) TO GET LOOKUP VALUE
|
; X = CPU_HZ / 160 / 75 ==> SIMPLIFIED ==> X = CPU_KHZ / 12
|
||||||
; THEN LOOKUP THE CORRECT CNTLB0 VALUE
|
; X = X / (BAUD / 75)
|
||||||
|
; IF X % 3 == 0, THEN (PS=1, X := X / 3) ELSE PS=0
|
||||||
|
; IF X % 4 == 0, THEN (DR=1, X := X / 4) ELSE DR=0
|
||||||
|
; SS := LOG2(X)
|
||||||
;
|
;
|
||||||
XIO_CNTLB:
|
XIO_CNTLB:
|
||||||
LD DE,1 ; USE DECODE CONSTANT OF 1 TO GET BAUD RATE ALREADY DIVIDED BY 75
|
LD DE,1 ; USE DECODE CONSTANT OF 1 TO GET BAUD RATE ALREADY DIVIDED BY 75
|
||||||
CALL DECODE ; DECODE THE BAUDATE INTO DE:HL, DE IS DISCARDED
|
CALL DECODE ; DECODE THE BAUDATE INTO DE:HL, DE IS DISCARDED
|
||||||
|
;CALL TSTPT
|
||||||
RET NZ ; ABORT ON ERROR
|
RET NZ ; ABORT ON ERROR
|
||||||
PUSH HL ; HL HAS (BAUD / 75), SAVE IT
|
PUSH HL ; HL HAS (BAUD / 75), SAVE IT
|
||||||
;LD HL,(HCB + HCB_CPUKHZ) ; GET CPU CLK IN KHZ
|
;LD HL,(HCB + HCB_CPUKHZ) ; GET CPU CLK IN KHZ
|
||||||
LD HL,CPUKHZ ; CPU CLK IN KHZ
|
LD HL,CPUKHZ ; CPU CLK IN KHZ
|
||||||
|
;LD HL,9216 ; *DEBUG*
|
||||||
LD DE,12 ; PREPARE TO DIVIDE BY 12
|
LD DE,12 ; PREPARE TO DIVIDE BY 12
|
||||||
CALL XIO_DIV16 ; BC := (CPU CLK KHZ / 12), REMAINDER IN HL, ZF
|
CALL XIO_DIV16 ; BC := (CPU_KHZ / 12), REM IN HL, ZF
|
||||||
POP DE ; RESTORE DENOMINATOR
|
;CALL TSTPT
|
||||||
JR NZ,XIO_CNTLB2 ; ABORT IF REMAINDER
|
POP DE ; RESTORE (BAUD / 75)
|
||||||
PUSH BC ; MOVE VALUE
|
RET NZ ; ABORT IF REMAINDER
|
||||||
POP HL ; ... TO HL NUMERATOR
|
PUSH BC ; MOVE WORKING VALUE
|
||||||
CALL XIO_DIV16 ; BC := LOOKUP VALUE, REMAINDER IN HL, ZF
|
POP HL ; ... BACK TO HL
|
||||||
JR NZ,XIO_CNTLB2 ; ABORT IF REMAINDER
|
CALL XIO_DIV16 ; BC := X / (BAUD / 75)
|
||||||
PUSH BC ; MOVE LOOKUP VALUE
|
;CALL TSTPT
|
||||||
POP DE ; TO DE
|
RET NZ ; ABORT IF REMAINDER
|
||||||
LD B,XIO_LKUPCNT ; INIT LOOP COUNT
|
;
|
||||||
LD HL,XIO_LKUP ; POINT TO START OF TABLE
|
; DETERMINE PS BIT BY ATTEMPTING DIVIDE BY 3
|
||||||
XIO_CNTLB0:
|
PUSH BC ; SAVE WORKING VALUE ON STACK
|
||||||
LD A,(HL) ; GET BYTE TO COMPARE
|
PUSH BC ; MOVE WORKING VALUE
|
||||||
INC HL ; INCREMENT HL FOR NEXT
|
POP HL ; ... TO HL
|
||||||
CP E ; COMPARE LSB
|
LD DE,3 ; SETUP TO DIVIDE BY 3
|
||||||
JR NZ,XIO_CNTLB1 ; NO MATCH, LOOP
|
CALL XIO_DIV16 ; BC := X / 3, REM IN HL, ZF
|
||||||
LD A,(HL) ; GET BYTE TO COMPARE
|
;CALL TSTPT
|
||||||
CP D ; COMPARE MSB
|
POP HL ; HL := PRIOR WORKING VALUE
|
||||||
JR NZ,XIO_CNTLB1 ; NO MATCH, LOOP
|
LD E,0 ; INIT E := 0 AS WORKING CNTLB VALUE
|
||||||
; MATCH FOUND
|
JR NZ,XIO_CNTLB1 ; DID NOT WORK, LEAVE PS==0, SKIP AHEAD
|
||||||
INC HL ; POINT TO CNTLB VALUE
|
SET 5,E ; SET PS BIT
|
||||||
LD C,(HL) ; LOAD IN C
|
PUSH BC ; MOVE NEW WORKING
|
||||||
XOR A ; SIGNAL SUCCESS
|
POP HL ; ... VALUE TO HL
|
||||||
RET ; AND DONE
|
;
|
||||||
XIO_CNTLB1:
|
XIO_CNTLB1:
|
||||||
INC HL ; BUMP TO
|
;CALL TSTPT
|
||||||
INC HL ; ... NEXT ENTRY
|
; DETERMINE DR BIT BY ATTEMPTING DIVIDE BY 4
|
||||||
DJNZ XIO_CNTLB0 ; LOOP IF MORE TO CHECK
|
LD A,L ; LOAD LSB OF WORKING VALUE
|
||||||
|
AND $03 ; ISOLATE LOW ORDER BITS
|
||||||
|
JR NZ,XIO_CNTLB2 ; NOT DIVISIBLE BY 4, SKIP AHEAD
|
||||||
|
SET 3,E ; SET PS BIT
|
||||||
|
SRL H ; DIVIDE HL BY 4
|
||||||
|
RR L ; ...
|
||||||
|
SRL H ; ...
|
||||||
|
RR L ; ...
|
||||||
|
;
|
||||||
XIO_CNTLB2:
|
XIO_CNTLB2:
|
||||||
OR $FF ; NOT FOUND, SET ERROR
|
;CALL TSTPT
|
||||||
RET ; AND RETURN
|
; DETERMINE SS BITS BY RIGHT SHIFTING AND INCREMENTING
|
||||||
|
LD B,7 ; LOOP COUNTER, MAX VALUE OF SS IS 7
|
||||||
|
LD C,E ; MOVE WORKING CNTLB VALUE TO C
|
||||||
|
XIO_CNTLB3:
|
||||||
|
BIT 0,L ; CAN WE SHIFT AGAIN?
|
||||||
|
JR NZ,XIO_CNTLB4 ; NOPE, DONE
|
||||||
|
SRL H ; IMPLEMENT THE
|
||||||
|
RR L ; ... SHIFT OPERATION
|
||||||
|
INC C ; INCREMENT SS BITS
|
||||||
|
DJNZ XIO_CNTLB3 ; LOOP IF MORE SHIFTING POSSIBLE
|
||||||
;
|
;
|
||||||
; LOOKUP PS BIT PS DIV DR BIT DR DIV SS BITS SS DIV DIVISOR CNTLB
|
; AT THIS POINT HL MUST BE EQUAL TO 1 OR WE FAILED!
|
||||||
; ------ ------ ------ ------ ------ ------- ------ ------- --------
|
DEC HL ; IF HL == 1, SHOULD BECOME ZERO
|
||||||
; 1 0 10 0 16 0 1 160 XX0X0000
|
LD A,H ; TEST HL
|
||||||
; 2 0 10 0 16 1 2 320 XX0X0001
|
OR L ; ... FOR ZERO
|
||||||
; 3 1 30 0 16 0 1 480 XX1X0000
|
RET NZ ; ABORT IF NOT ZERO
|
||||||
; 4 0 10 0 16 2 4 640 XX0X0010
|
|
||||||
; 6 1 30 0 16 1 2 960 XX1X0001
|
|
||||||
; 8 0 10 0 16 3 8 1280 XX0X0011
|
|
||||||
; 12 1 30 0 16 2 4 1920 XX1X0010
|
|
||||||
; 16 0 10 0 16 4 16 2560 XX0X0100
|
|
||||||
; 24 1 30 0 16 3 8 3840 XX1X0011
|
|
||||||
; 32 0 10 0 16 5 32 5120 XX0X0101
|
|
||||||
; 48 1 30 0 16 4 16 7680 XX1X0100
|
|
||||||
; 64 0 10 0 16 6 64 10240 XX0X0110
|
|
||||||
; 96 1 30 0 16 5 32 15360 XX1X0101
|
|
||||||
; 128 0 10 1 64 5 32 20480 XX0X1101
|
|
||||||
; 192 1 30 0 16 6 64 30720 XX1X0110
|
|
||||||
; 256 0 10 1 64 6 64 40960 XX0X1110
|
|
||||||
; 384 1 30 1 64 5 32 61440 XX1X1101
|
|
||||||
; 768 1 30 1 64 6 64 122880 XX1X1110
|
|
||||||
;
|
;
|
||||||
XIO_LKUP: ; LOOKUP CNTLB VAL
|
XIO_CNTLB4:
|
||||||
.DW 1 \ .DB %00000000
|
;CALL TSTPT
|
||||||
.DW 2 \ .DB %00000001
|
XOR A
|
||||||
.DW 3 \ .DB %00100000
|
RET
|
||||||
.DW 4 \ .DB %00000010
|
|
||||||
.DW 6 \ .DB %00100001
|
|
||||||
.DW 8 \ .DB %00000011
|
|
||||||
.DW 12 \ .DB %00100010
|
|
||||||
.DW 16 \ .DB %00000100
|
|
||||||
.DW 24 \ .DB %00100011
|
|
||||||
.DW 32 \ .DB %00000101
|
|
||||||
.DW 48 \ .DB %00100100
|
|
||||||
.DW 64 \ .DB %00000110
|
|
||||||
.DW 96 \ .DB %00100101
|
|
||||||
.DW 128 \ .DB %00001101
|
|
||||||
.DW 192 \ .DB %00100110
|
|
||||||
.DW 256 \ .DB %00001110
|
|
||||||
.DW 384 \ .DB %00101101
|
|
||||||
.DW 768 \ .DB %00101110
|
|
||||||
;
|
|
||||||
XIO_LKUPCNT .EQU ($ - XIO_LKUP) / 3
|
|
||||||
;
|
;
|
||||||
#ENDIF
|
#ENDIF
|
||||||
|
|||||||
Reference in New Issue
Block a user