|
|
|
@ -75,75 +75,48 @@ ASCI_INIT1: |
|
|
|
; |
|
|
|
; ASCI0 |
|
|
|
CALL NEWLINE ; FORMATTING |
|
|
|
PRTS("ASCI0: IO=0x$") |
|
|
|
LD A,Z180_TDR0 |
|
|
|
CALL PRTHEXBYTE |
|
|
|
PRTS("ASCI0: IO=0x$") ; PREFIX |
|
|
|
LD A,Z180_TDR0 ; LOAD TDR PORT ADDRESS |
|
|
|
CALL PRTHEXBYTE ; PRINT IT |
|
|
|
|
|
|
|
CALL PC_COMMA |
|
|
|
LD A,Z180_RDR0 |
|
|
|
CALL PRTHEXBYTE |
|
|
|
CALL PC_COMMA ; FORMATTING |
|
|
|
LD A,Z180_RDR0 ; LOAD RDR PORT ADDRESS |
|
|
|
CALL PRTHEXBYTE ; PRINT IT |
|
|
|
|
|
|
|
CALL PC_SPACE ; FORMATTING |
|
|
|
LD DE,ASCI0CFG ; LOAD CONFIG |
|
|
|
LD DE,(ASCI0_CONFIG) ; LOAD CONFIG |
|
|
|
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: |
|
|
|
LD A,66H |
|
|
|
OUT0 (Z180_ASEXT0),A |
|
|
|
LD A,64H |
|
|
|
OUT0 (Z180_CNTLA0),A |
|
|
|
LD A,C |
|
|
|
OUT0 (Z180_CNTLB0),A |
|
|
|
|
|
|
|
ASCI_INIT3: |
|
|
|
; ASCI1 |
|
|
|
CALL NEWLINE ; FORMATTING |
|
|
|
PRTS("ASCI1: IO=0x$") |
|
|
|
LD A,Z180_TDR1 |
|
|
|
CALL PRTHEXBYTE |
|
|
|
CALL PC_COMMA |
|
|
|
LD A,Z180_RDR1 |
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
|
|
CALL PC_SPACE ; FORMATTING |
|
|
|
LD DE,ASCI1CFG ; LOAD CONFIG |
|
|
|
CALL PS_PRTSC0 ; PRINT IT |
|
|
|
PRTS("ASCI1: IO=0x$") ; PREFIX |
|
|
|
LD A,Z180_TDR1 ; LOAD TDR PORT ADDRESS |
|
|
|
CALL PRTHEXBYTE ; PRINT IT |
|
|
|
|
|
|
|
LD HL,ASCI1CFG ; 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_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 |
|
|
|
CALL PC_COMMA ; FORMATTING |
|
|
|
LD A,Z180_RDR1 ; LOAD RDR PORT ADDRESS |
|
|
|
CALL PRTHEXBYTE ; PRINT IT |
|
|
|
|
|
|
|
ASCI_INIT5: |
|
|
|
CALL PC_SPACE ; FORMATTING |
|
|
|
LD DE,(ASCI1_CONFIG) ; LOAD CONFIG |
|
|
|
CALL PS_PRTSC0 ; PRINT IT |
|
|
|
|
|
|
|
LD DE,-1 ; DE := -1 TO INIT DEFAULT CONFIG |
|
|
|
CALL ASCI1_INITDEV ; INIT DEVICE |
|
|
|
JR Z,ASCI_INIT3 ; SUCCESS, SKIP AHEAD |
|
|
|
PRTS(" ERROR!$") ; DISPLAY ERROR |
|
|
|
; |
|
|
|
ASCI_INIT3: |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
; CHARACTER DEVICE DRIVER ENTRY |
|
|
|
; DISPATCH TO SPECIFIC ASCI UNIT |
|
|
|
; |
|
|
|
ASCI_DISPATCH: |
|
|
|
PUSH IY ; PUSH UNIT DATA WORD |
|
|
|
@ -154,9 +127,11 @@ ASCI_DISPATCH: |
|
|
|
JP Z,ASCI1 |
|
|
|
CALL PANIC |
|
|
|
; |
|
|
|
; ASCI 0 FUNCTIONS |
|
|
|
; |
|
|
|
ASCI0: |
|
|
|
LD A,B ; GET REQUESTED FUNCTION |
|
|
|
AND $0F ; ISOLATE SUB-FUNCTION |
|
|
|
LD A,B ; GET REQUESTED FUNCTION |
|
|
|
AND $0F ; ISOLATE SUB-FUNCTION |
|
|
|
JP Z,ASCI0_IN |
|
|
|
DEC A |
|
|
|
JP Z,ASCI0_OUT |
|
|
|
@ -172,30 +147,27 @@ ASCI0: |
|
|
|
JP Z,ASCI0_DEVICE |
|
|
|
CALL PANIC |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ASCI0_IN: |
|
|
|
CALL ASCI0_IST |
|
|
|
OR A |
|
|
|
JR Z,ASCI0_IN |
|
|
|
IN0 A,(Z180_RDR0) ; READ THE CHAR FROM THE ASCI |
|
|
|
IN0 A,(Z180_RDR0) ; READ THE CHAR |
|
|
|
LD E,A |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ASCI0_IST: |
|
|
|
; CHECK FOR ERROR FLAGS |
|
|
|
IN0 A,(Z180_STAT0) |
|
|
|
AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR |
|
|
|
JR Z,ASCI0_IST1 ; ALL IS WELL, CHECK FOR DATA |
|
|
|
|
|
|
|
; |
|
|
|
; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!! |
|
|
|
IN0 A,(Z180_CNTLA0) |
|
|
|
RES 3,A ; CLEAR EFR (ERROR FLAG RESET) |
|
|
|
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 |
|
|
|
AND $80 ; TEST IF DATA IN RECEIVE BUFFER |
|
|
|
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 |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ASCI0_OUT: |
|
|
|
CALL ASCI0_OST |
|
|
|
OR A |
|
|
|
@ -221,34 +191,54 @@ ASCI0_OST: |
|
|
|
INC A ; SIGNAL BUFFER EMPTY, A = 1 |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ASCI0_INITDEV: |
|
|
|
XOR A ; NOT IMPLEMENTED!!! |
|
|
|
RET |
|
|
|
; 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,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: |
|
|
|
LD DE,ASCI0CFG |
|
|
|
;LD DE,ASCI0BAUD >> 16 |
|
|
|
;LD HL,ASCI0BAUD & $FFFF |
|
|
|
LD DE,(ASCI0_CONFIG) |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ASCI0_DEVICE: |
|
|
|
LD D,CIODEV_ASCI ; D := DEVICE TYPE |
|
|
|
LD E,0 ; E := PHYSICAL UNIT |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
LD D,CIODEV_ASCI ; D := DEVICE TYPE |
|
|
|
LD E,0 ; E := PHYSICAL UNIT |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; ASCI 1 FUNCTIONS |
|
|
|
; |
|
|
|
ASCI1: |
|
|
|
LD A,B ; GET REQUESTED FUNCTION |
|
|
|
AND $0F ; ISOLATE SUB-FUNCTION |
|
|
|
LD A,B ; GET REQUESTED FUNCTION |
|
|
|
AND $0F ; ISOLATE SUB-FUNCTION |
|
|
|
JR Z,ASCI1_IN |
|
|
|
DEC A |
|
|
|
JR Z,ASCI1_OUT |
|
|
|
@ -264,29 +254,25 @@ ASCI1: |
|
|
|
JP Z,ASCI1_DEVICE |
|
|
|
CALL PANIC |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ASCI1_IN: |
|
|
|
CALL ASCI1_IST |
|
|
|
OR A |
|
|
|
JR Z,ASCI1_IN |
|
|
|
IN0 A,(Z180_RDR1) ; READ THE CHAR FROM THE ASCI |
|
|
|
IN0 A,(Z180_RDR1) ; READ THE CHAR |
|
|
|
LD E,A |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ASCI1_IST: |
|
|
|
; CHECK FOR ERROR FLAGS |
|
|
|
IN0 A,(Z180_STAT1) |
|
|
|
AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR |
|
|
|
JR Z,ASCI1_IST1 ; ALL IS WELL, CHECK FOR DATA |
|
|
|
|
|
|
|
; |
|
|
|
; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!! |
|
|
|
IN0 A,(Z180_CNTLA1) |
|
|
|
RES 3,A ; CLEAR EFR (ERROR FLAG RESET) |
|
|
|
OUT0 (Z180_CNTLA1),A |
|
|
|
|
|
|
|
; |
|
|
|
ASCI1_IST1: ; CHECK FOR STAT0.RDRF (DATA READY) |
|
|
|
IN0 A,(Z180_STAT1) ; READ LINE STATUS REGISTER |
|
|
|
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 |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ASCI1_OUT: |
|
|
|
CALL ASCI1_OST |
|
|
|
OR A |
|
|
|
@ -314,122 +298,135 @@ ASCI1_OST: |
|
|
|
INC A ; SIGNAL BUFFER EMPTY, A = 1 |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ASCI1_INITDEV: |
|
|
|
XOR A ; NOT IMPLEMENTED!!! |
|
|
|
RET |
|
|
|
; 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,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: |
|
|
|
;LD DE,ASCI1BAUD >> 16 |
|
|
|
;LD HL,ASCI1BAUD & $FFFF |
|
|
|
LD DE,ASCI1CFG |
|
|
|
LD DE,(ASCI1_CONFIG) |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
ASCI1_DEVICE: |
|
|
|
LD D,CIODEV_ASCI ; D := DEVICE TYPE |
|
|
|
LD E,1 ; E := PHYSICAL UNIT |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
LD D,CIODEV_ASCI ; D := DEVICE TYPE |
|
|
|
LD E,1 ; E := PHYSICAL UNIT |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
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 |
|
|
|
; 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 |
|
|
|
; LET LOOKUP = DIVISOR / 160 |
|
|
|
; LOOKUP = CLK / BAUD / 160 |
|
|
|
; LET KCLK = CLK / 1000, SO CLK = KCLK * 1000 |
|
|
|
; LOOKUP = KCLK * 1000 / BAUD / 160 |
|
|
|
; OR, LOOKUP = (KCLK / 12) / (BAUD / 75) |
|
|
|
; DESIRED DIVISOR == CPUHZ / BAUD |
|
|
|
; DUE TO ENCODING BAUD IS ALWAYS DIVISIBLE BY 75 |
|
|
|
; Z180 DIVISOR IS ALWAYS A FACTOR OF 160 |
|
|
|
; |
|
|
|
; SO, WE USE (CPUKHZ / 12) / (BAUD RATE / 75) TO GET LOOKUP VALUE |
|
|
|
; THEN LOOKUP THE CORRECT CNTLB0 VALUE |
|
|
|
; X = CPU_HZ / 160 / 75 ==> SIMPLIFIED ==> X = CPU_KHZ / 12 |
|
|
|
; 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: |
|
|
|
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 TSTPT |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
PUSH HL ; HL HAS (BAUD / 75), SAVE IT |
|
|
|
;LD HL,(HCB + HCB_CPUKHZ) ; GET CPU CLK IN KHZ |
|
|
|
LD HL,CPUKHZ ; CPU CLK IN KHZ |
|
|
|
;LD HL,9216 ; *DEBUG* |
|
|
|
LD DE,12 ; PREPARE TO DIVIDE BY 12 |
|
|
|
CALL DIV16 ; BC := (CPU CLK KHZ / 12), REMAINDER IN HL, ZF |
|
|
|
POP DE ; RESTORE DENOMINATOR |
|
|
|
JR NZ,ASCI_CNTLB2 ; ABORT IF REMAINDER |
|
|
|
PUSH BC ; MOVE VALUE |
|
|
|
POP HL ; ... TO HL NUMERATOR |
|
|
|
CALL DIV16 ; BC := LOOKUP VALUE, REMAINDER IN HL, ZF |
|
|
|
JR NZ,ASCI_CNTLB2 ; ABORT IF REMAINDER |
|
|
|
PUSH BC ; MOVE LOOKUP VALUE |
|
|
|
POP DE ; TO DE |
|
|
|
LD B,ASCI_LKUPCNT ; INIT LOOP COUNT |
|
|
|
LD HL,ASCI_LKUP ; POINT TO START OF TABLE |
|
|
|
ASCI_CNTLB0: |
|
|
|
LD A,(HL) ; GET BYTE TO COMPARE |
|
|
|
INC HL ; INCREMENT HL FOR NEXT |
|
|
|
CP E ; COMPARE LSB |
|
|
|
JR NZ,ASCI_CNTLB1 ; NO MATCH, LOOP |
|
|
|
LD A,(HL) ; GET BYTE TO COMPARE |
|
|
|
CP D ; COMPARE MSB |
|
|
|
JR NZ,ASCI_CNTLB1 ; NO MATCH, LOOP |
|
|
|
; MATCH FOUND |
|
|
|
INC HL ; POINT TO CNTLB VALUE |
|
|
|
LD C,(HL) ; LOAD IN C |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; AND DONE |
|
|
|
CALL DIV16 ; BC := (CPU_KHZ / 12), REM IN HL, ZF |
|
|
|
;CALL TSTPT |
|
|
|
POP DE ; RESTORE (BAUD / 75) |
|
|
|
RET NZ ; ABORT IF REMAINDER |
|
|
|
PUSH BC ; MOVE WORKING VALUE |
|
|
|
POP HL ; ... BACK TO HL |
|
|
|
CALL DIV16 ; BC := X / (BAUD / 75) |
|
|
|
;CALL TSTPT |
|
|
|
RET NZ ; ABORT IF REMAINDER |
|
|
|
; |
|
|
|
; DETERMINE PS BIT BY ATTEMPTING DIVIDE BY 3 |
|
|
|
PUSH BC ; SAVE WORKING VALUE ON STACK |
|
|
|
PUSH BC ; MOVE WORKING VALUE |
|
|
|
POP HL ; ... TO HL |
|
|
|
LD DE,3 ; SETUP TO DIVIDE BY 3 |
|
|
|
CALL DIV16 ; BC := X / 3, REM IN HL, ZF |
|
|
|
;CALL TSTPT |
|
|
|
POP HL ; HL := PRIOR WORKING VALUE |
|
|
|
LD E,0 ; INIT E := 0 AS WORKING CNTLB VALUE |
|
|
|
JR NZ,ASCI_CNTLB1 ; DID NOT WORK, LEAVE PS==0, SKIP AHEAD |
|
|
|
SET 5,E ; SET PS BIT |
|
|
|
PUSH BC ; MOVE NEW WORKING |
|
|
|
POP HL ; ... VALUE TO HL |
|
|
|
; |
|
|
|
ASCI_CNTLB1: |
|
|
|
INC HL ; BUMP TO |
|
|
|
INC HL ; ... NEXT ENTRY |
|
|
|
DJNZ ASCI_CNTLB0 ; LOOP IF MORE TO CHECK |
|
|
|
;CALL TSTPT |
|
|
|
; DETERMINE DR BIT BY ATTEMPTING DIVIDE BY 4 |
|
|
|
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: |
|
|
|
OR $FF ; NOT FOUND, SET ERROR |
|
|
|
RET ; AND RETURN |
|
|
|
; |
|
|
|
; LOOKUP PS BIT PS DIV DR BIT DR DIV SS BITS SS DIV DIVISOR CNTLB |
|
|
|
; ------ ------ ------ ------ ------ ------- ------ ------- -------- |
|
|
|
; 1 0 10 0 16 0 1 160 XX0X0000 |
|
|
|
; 2 0 10 0 16 1 2 320 XX0X0001 |
|
|
|
; 3 1 30 0 16 0 1 480 XX1X0000 |
|
|
|
; 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 |
|
|
|
.DW 1 \ .DB %00000000 |
|
|
|
.DW 2 \ .DB %00000001 |
|
|
|
.DW 3 \ .DB %00100000 |
|
|
|
.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 |
|
|
|
;CALL TSTPT |
|
|
|
; 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 |
|
|
|
; |
|
|
|
; AT THIS POINT HL MUST BE EQUAL TO 1 OR WE FAILED! |
|
|
|
DEC HL ; IF HL == 1, SHOULD BECOME ZERO |
|
|
|
LD A,H ; TEST HL |
|
|
|
OR L ; ... FOR ZERO |
|
|
|
RET NZ ; ABORT IF NOT ZERO |
|
|
|
; |
|
|
|
ASCI_CNTLB4: |
|
|
|
;CALL TSTPT |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
|