Browse Source

Bug Fixes

patch
Wayne Warthen 10 years ago
parent
commit
7da6c582a0
  1. BIN
      Hardware/Prop/Spin/ParPortProp.spin
  2. BIN
      Hardware/Prop/Spin/PropIO.spin
  3. BIN
      Hardware/Prop/Spin/PropIO2.spin
  4. 3
      Hardware/Prop/Spin/VGA_1024.spin
  5. 2
      Source/HBIOS/Config/mk4_propio.asm
  6. 367
      Source/HBIOS/asci.asm
  7. 11
      Source/HBIOS/hbios.asm
  8. 9
      Source/HBIOS/ide.asm
  9. 3
      Source/HBIOS/loader.asm
  10. 8
      Source/HBIOS/ppide.asm
  11. 11
      Source/HBIOS/ppp.asm
  12. 10
      Source/HBIOS/prp.asm
  13. 3
      Source/HBIOS/rf.asm
  14. 9
      Source/HBIOS/sd.asm
  15. 4
      Source/HBIOS/time.asm
  16. 33
      Source/HBIOS/uart.asm
  17. 161
      Source/HBIOS/xio.asm

BIN
Hardware/Prop/Spin/ParPortProp.spin

Binary file not shown.

BIN
Hardware/Prop/Spin/PropIO.spin

Binary file not shown.

BIN
Hardware/Prop/Spin/PropIO2.spin

Binary file not shown.

3
Hardware/Prop/Spin/VGA_1024.spin

@ -129,12 +129,11 @@ PUB cls1(VerStr) | i
clrbtm(TURQUOISE)
inverse := 1
'statprint(36,0, string(" N8VEM PropIO V2 | RomWBW v0.95"))
statprint(36, 0, VerStr)
inverse := 0
repeat i from 37 to (rows - 1)
statprint(37,0, string(" "))
statprint(i,0, string(" "))
{{

2
Source/HBIOS/Config/mk4_propio.asm

@ -3,6 +3,6 @@
; 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

367
Source/HBIOS/asci.asm

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

11
Source/HBIOS/hbios.asm

@ -503,11 +503,9 @@ HB_START:
;
; DISPLAY THE PRE-INITIALIZATION BANNER
;
CALL NEWLINE
CALL NEWLINE
CALL NEWLINE2
PRTX(STR_BANNER)
CALL NEWLINE
CALL NEWLINE
CALL NEWLINE2
PRTX(STR_PLATFORM)
PRTS(" @ $")
LD HL,(HCB + HCB_CPUKHZ)
@ -589,8 +587,7 @@ INITSYS1:
#ENDIF
;
; NOTIFY USER OF CONSOLE SWITCH ON BOOT CONSOLE
CALL NEWLINE
CALL NEWLINE
CALL NEWLINE2
PRTX(STR_SWITCH)
CALL NEWLINE
;
@ -2133,6 +2130,7 @@ PS_PRTDC:
; PRINT HARD DISK STORAGE SIZE IN MB
LD B,BF_DIOCAP ; HBIOS FUNC: GET CAPACTIY
RST 08 ; DE:HL := BLOCKS
JP NZ,PS_PRTNUL ; MEDIA PROBLEM
RES 7,D ; CLEAR LBA BIT
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
@ -2146,6 +2144,7 @@ PS_PRTDC1:
; PRINT ROM/ROM DISK CAPACITY IN KB
LD B,BF_DIOCAP ; HBIOS FUNC: GET CAPACTIY
RST 08 ; DE:HL := BLOCKS
JP NZ,PS_PRTNUL ; MEDIA PROBLEM
RES 7,D ; CLEAR LBA BIT
LD B,1 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT

9
Source/HBIOS/ide.asm

@ -460,8 +460,10 @@ IDE_CAP:
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
LD BC,512 ; 512 BYTES PER BLOCK
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
IDE_DPTR(IDE_STAT) ; POINT TO UNIT STATUS
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 D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
LD E,16 ; SECTORS / TRACK = 16
XOR A ; SIGNAL SUCCESS
RET
RET ; DONE, A STILL HAS IDE_CAP STATUS
;
;=============================================================================
; FUNCTION SUPPORT ROUTINES

3
Source/HBIOS/loader.asm

@ -140,8 +140,7 @@ START:
; EMIT FIRST SIGN OF LIFE TO SERIAL PORT
;
CALL XIO_INIT ; INIT SERIAL PORT
#IFNDEF
CALL XIO_CRLF ; FORMATTING
#IFNDEF ROMLOAD
CALL XIO_CRLF ; FORMATTING
#ENDIF
LD HL,STR_BOOT ; POINT TO MESSAGE

8
Source/HBIOS/ppide.asm

@ -493,7 +493,10 @@ PPIDE_CAP:
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
LD BC,512 ; 512 BYTES PER BLOCK
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 D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
LD E,16 ; SECTORS / TRACK = 16
XOR A ; SIGNAL SUCCESS
RET
RET ; DONE, A STILL HAS PPIDE_CAP STATUS
;
;=============================================================================
; FUNCTION SUPPORT ROUTINES

11
Source/HBIOS/ppp.asm

@ -630,8 +630,9 @@ PPPSD_CAP:
LD HL,PPPSD_BLKCNT ; GET BLOCK COUNT
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
LD BC,512 ; 512 BYTES PER BLOCK
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
LD A,(PPPSD_STAT) ; GET CURRENT STATUS
OR A ; SET FLAGS
RET
;
;
;
@ -643,8 +644,7 @@ PPPSD_GEOM:
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
LD E,16 ; SECTORS / TRACK = 16
XOR A ; SIGNAL SUCCESS
RET
RET ; DONE, A STILL HAS PPPSD_CAP STATUS
;
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
; UNIT IS SPECIFIED IN A
@ -684,7 +684,8 @@ PPPSD_INITCARD:
; HANDLE ERROR
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:

10
Source/HBIOS/prp.asm

@ -493,8 +493,9 @@ PRPSD_CAP:
LD HL,PRPSD_BLKCNT ; POINT TO BLOCK COUNT
CALL LD32 ; GET THE CURRENT CAPACITY TO DE:HL
LD BC,512 ; 512 BYTES PER BLOCK
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
LD A,(PRPSD_STAT) ; GET CURRENT STATUS
OR A ; SET FLAGS
RET
;
;
;
@ -507,7 +508,7 @@ PRPSD_GEOM:
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
LD E,16 ; SECTORS / TRACK = 16
XOR A ; SIGNAL SUCCESS
RET
RET ; DONE, A STILL HAS PRPSD_CAP STATUS
;
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
; UNIT IS SPECIFIED IN A
@ -545,7 +546,8 @@ PRPSD_INITCARD:
; REQUEST HARDWARE INIT, RESULT IN A, Z/NZ SET
LD A,PRPSD_CMDINIT
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)
; GET CSD IF DEBUGGING

3
Source/HBIOS/rf.asm

@ -120,8 +120,7 @@ RF_GEOM:
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
LD E,16 ; SECTORS / TRACK = 16
XOR A ; SIGNAL SUCCESS
RET
RET ; DONE, A STILL HAS RF_CAP STATUS
;
;
;

9
Source/HBIOS/sd.asm

@ -571,8 +571,10 @@ SD_CAP:
SD_DPTR(SD_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
LD BC,512 ; 512 BYTES PER BLOCK
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
SD_DPTR(SD_STAT) ; POINT TO UNIT STATUS
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 D,16 | $80 ; HEADS / CYL = 16, SET LBA BIT
LD E,16 ; SECTORS / TRACK = 16
XOR A ; SIGNAL SUCCESS
RET
RET ; DONE, A STILL HAS SD_CAP STATUS
;
;=============================================================================
; FUNCTION SUPPORT ROUTINES

4
Source/HBIOS/time.asm

@ -191,7 +191,7 @@ LEAPDIV:
; PRESERVE HL
PUSH HL
CALL DIV16
LD A,H
OR L
;LD A,H
;OR L
POP HL
RET

33
Source/HBIOS/uart.asm

@ -207,20 +207,27 @@ UART_OST:
;
UART_INITDEV:
; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT)
LD A,D
AND E
INC A
JR Z,UART_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG
;
; UDPATE CONFIG BYTES
LD (IY + 4),E ; SAVE LOW WORD
LD (IY + 5),D ; SAVE HI WORD
LD A,D ; TEST DE FOR
AND E ; ... VALUE OF -1
INC A ; ... SO Z SET IF -1
JR NZ,UART_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG
;
; LOAD EXISTING CONFIG TO REINIT
LD E,(IY + 4) ; LOW BYTE
LD D,(IY + 5) ; HIGH BYTE
;
UART_INITDEV1:
; START OF UART INITIALIZATION, SET BAUD RATE
LD E,(IY + 4) ; GET LOW WORD
LD D,(IY + 5) ; GET HI WORD
; 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 + 5),D ; SAVE HI WORD
;
; START OF ACTUAL UART CONFIGURATION
LD A,80H ; DLAB IS BIT 7 OF LCR
UART_OUTP(UART_LCR) ; DLAB ON
LD A,B
@ -304,8 +311,8 @@ UART_INITDEV3:
PRTC(']')
#ENDIF
XOR A ; NOT IMPLEMENTED!!!
;
XOR A ; SIGNAL SUCCESS
RET
;
;

161
Source/HBIOS/xio.asm

@ -38,7 +38,8 @@ XIO_INIT: ; MINIMAL UART INIT
LD A,$64 ; ENABLE XMT/RCV, 8 DATA, NO PARITY, 1 STOP
OUT0 (Z180_CNTLA0),A ; -> CNTLA0
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
LD HL,ASCI0CFG ; SERIAL CONFIG WORD
@ -47,10 +48,12 @@ XIO_INIT: ; MINIMAL UART INIT
LD L,A ; MOVE TO L
LD H,0 ; CLEAR MSB
CALL XIO_CNTLB ; DERIVE CNTLB VALUE
JR NZ,XIO_INIT1 ; BYPASS ON FAILURE
LD A,C ; PUT INT C
JR Z,XIO_INIT1 ; SUCCESS, IMPLEMENT IT
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
#ENDIF
#IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_ZETA2))
@ -76,14 +79,15 @@ XIO_INIT: ; MINIMAL UART INIT
#ENDIF
XIO_INIT1:
RET
;
XIO_CRLF2:
CALL XIO_CRLF ; SEND CRLF, FALL THRU FOR ANOTHER
XIO_CRLF: ; OUTPUT A NEWLINE
LD A,13 ; A = CR
CALL XIO_OUTC ; WRITE IT
LD A,10 ; A = LF
JR XIO_OUTC ; WRITE IT
JR XIO_OUTC ; WRITE IT AND RETURN
;
XIO_SPACE: ; OUTPUT A SPACE CHARACTER
LD A,' '
@ -190,99 +194,86 @@ XIO_DIV16B:
;
; 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)
;
XIO_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 XIO_DIV16 ; BC := (CPU CLK KHZ / 12), REMAINDER IN HL, ZF
POP DE ; RESTORE DENOMINATOR
JR NZ,XIO_CNTLB2 ; ABORT IF REMAINDER
PUSH BC ; MOVE VALUE
POP HL ; ... TO HL NUMERATOR
CALL XIO_DIV16 ; BC := LOOKUP VALUE, REMAINDER IN HL, ZF
JR NZ,XIO_CNTLB2 ; ABORT IF REMAINDER
PUSH BC ; MOVE LOOKUP VALUE
POP DE ; TO DE
LD B,XIO_LKUPCNT ; INIT LOOP COUNT
LD HL,XIO_LKUP ; POINT TO START OF TABLE
XIO_CNTLB0:
LD A,(HL) ; GET BYTE TO COMPARE
INC HL ; INCREMENT HL FOR NEXT
CP E ; COMPARE LSB
JR NZ,XIO_CNTLB1 ; NO MATCH, LOOP
LD A,(HL) ; GET BYTE TO COMPARE
CP D ; COMPARE MSB
JR NZ,XIO_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 XIO_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 XIO_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 XIO_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,XIO_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
;
XIO_CNTLB1:
INC HL ; BUMP TO
INC HL ; ... NEXT ENTRY
DJNZ XIO_CNTLB0 ; LOOP IF MORE TO CHECK
XIO_CNTLB2:
OR $FF ; NOT FOUND, SET ERROR
RET ; AND RETURN
;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,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 ; ...
;
; 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
XIO_CNTLB2:
;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
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
;
XIO_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
; 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
;
XIO_LKUPCNT .EQU ($ - XIO_LKUP) / 3
XIO_CNTLB4:
;CALL TSTPT
XOR A
RET
;
#ENDIF

Loading…
Cancel
Save