diff --git a/Hardware/Prop/Spin/ParPortProp.spin b/Hardware/Prop/Spin/ParPortProp.spin index e6d96923..45f9bedf 100644 Binary files a/Hardware/Prop/Spin/ParPortProp.spin and b/Hardware/Prop/Spin/ParPortProp.spin differ diff --git a/Hardware/Prop/Spin/PropIO.spin b/Hardware/Prop/Spin/PropIO.spin index cbd341b3..7371302a 100644 Binary files a/Hardware/Prop/Spin/PropIO.spin and b/Hardware/Prop/Spin/PropIO.spin differ diff --git a/Hardware/Prop/Spin/PropIO2.spin b/Hardware/Prop/Spin/PropIO2.spin index 2ca06d54..984b2c38 100644 Binary files a/Hardware/Prop/Spin/PropIO2.spin and b/Hardware/Prop/Spin/PropIO2.spin differ diff --git a/Hardware/Prop/Spin/VGA_1024.spin b/Hardware/Prop/Spin/VGA_1024.spin index 937c77c8..796cc930 100644 --- a/Hardware/Prop/Spin/VGA_1024.spin +++ b/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(" ")) {{ diff --git a/Source/HBIOS/Config/mk4_propio.asm b/Source/HBIOS/Config/mk4_propio.asm index 57586b6c..23ccf733 100644 --- a/Source/HBIOS/Config/mk4_propio.asm +++ b/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 diff --git a/Source/HBIOS/asci.asm b/Source/HBIOS/asci.asm index 00b4c101..baf45583 100644 --- a/Source/HBIOS/asci.asm +++ b/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 \ No newline at end of file + ;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 +; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 43554068..3ef28336 100644 --- a/Source/HBIOS/hbios.asm +++ b/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 diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index b4a7632b..5c32f784 100644 --- a/Source/HBIOS/ide.asm +++ b/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 diff --git a/Source/HBIOS/loader.asm b/Source/HBIOS/loader.asm index 8e6889f1..d11e49ac 100644 --- a/Source/HBIOS/loader.asm +++ b/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 diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 48231294..1109b511 100644 --- a/Source/HBIOS/ppide.asm +++ b/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 diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index 49a268d0..953b6fad 100644 --- a/Source/HBIOS/ppp.asm +++ b/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: diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index d6bf36dc..692b4a3a 100644 --- a/Source/HBIOS/prp.asm +++ b/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 diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index 8e11ba40..4ce8765c 100644 --- a/Source/HBIOS/rf.asm +++ b/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 ; ; ; diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 59f38676..d604a74e 100644 --- a/Source/HBIOS/sd.asm +++ b/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 diff --git a/Source/HBIOS/time.asm b/Source/HBIOS/time.asm index 9ef1d29b..315bde39 100644 --- a/Source/HBIOS/time.asm +++ b/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 diff --git a/Source/HBIOS/uart.asm b/Source/HBIOS/uart.asm index 685cd4a8..568136ae 100644 --- a/Source/HBIOS/uart.asm +++ b/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 ; ; diff --git a/Source/HBIOS/xio.asm b/Source/HBIOS/xio.asm index c410cb38..e16f81e9 100644 --- a/Source/HBIOS/xio.asm +++ b/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