Bug Fixes

This commit is contained in:
Wayne Warthen
2016-04-22 15:45:10 -07:00
parent 684f59a73c
commit 7da6c582a0
17 changed files with 313 additions and 315 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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(" "))
{{ {{

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

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

View File

@@ -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

View File

@@ -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

View File

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

View File

@@ -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