From 07d833473cea24ca1e5f8de54be618741de02870 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Thu, 14 Apr 2016 17:29:45 -0700 Subject: [PATCH] Bug Fixes --- Source/Apps/Assign.asm | 6 +- Source/Apps/OSLdr.asm | 4 +- Source/CBIOS/cbios.asm | 3 +- Source/CBIOS/ver.inc | 2 +- Source/HBIOS/API.txt | 40 ++++--- Source/HBIOS/Config/plt_mk4.asm | 16 +-- Source/HBIOS/Config/plt_sbc.asm | 2 +- Source/HBIOS/Config/zeta2_ppp.asm | 1 + Source/HBIOS/Config/zeta_ppp.asm | 1 + Source/HBIOS/encode.asm | 137 +++++++++++++++++++++++ Source/HBIOS/hbios.asm | 43 ++++---- Source/HBIOS/hbios.inc | 24 ++-- Source/HBIOS/loader.asm | 4 + Source/HBIOS/ppp.asm | 3 +- Source/HBIOS/prp.asm | 3 +- Source/HBIOS/romldr.asm | 175 ++++++++++-------------------- Source/HBIOS/sd.asm | 1 + Source/HBIOS/tms.asm | 12 +- Source/HBIOS/util.asm | 20 ++++ Source/HBIOS/ver.inc | 2 +- 20 files changed, 297 insertions(+), 202 deletions(-) create mode 100644 Source/HBIOS/encode.asm diff --git a/Source/Apps/Assign.asm b/Source/Apps/Assign.asm index 01d6ecf4..6771511e 100644 --- a/Source/Apps/Assign.asm +++ b/Source/Apps/Assign.asm @@ -322,7 +322,7 @@ devlist: or a ; set flags jr nz,devlstu ; do UNA mode dev list ; - ld b,$F7 ; hbios func: sysget + ld b,$F8 ; hbios func: sysget ld c,$10 ; sysget subfunc: diocnt rst 08 ; call hbios, E := device count ld b,e ; use device count for loop count @@ -872,7 +872,7 @@ drvmap2: ld (device),a ; save as device id ; ; loop thru hbios units looking for device type/unit match - ld b,$F7 ; hbios func: sysget + ld b,$F8 ; hbios func: sysget ld c,$10 ; sysget subfunc: diocnt rst 08 ; call hbios, E := device count ld b,e ; use device count for loop count @@ -1193,7 +1193,7 @@ chkdrv: ; chkdev: ; HBIOS variant push af ; save incoming unit - ld b,$F7 ; hbios func: sysget + ld b,$F8 ; hbios func: sysget ld c,$10 ; sysget subfunc: diocnt rst 08 ; call hbios, E := device count pop af ; restore incoming unit diff --git a/Source/Apps/OSLdr.asm b/Source/Apps/OSLdr.asm index 81461a9c..98ea8070 100644 --- a/Source/Apps/OSLdr.asm +++ b/Source/Apps/OSLdr.asm @@ -89,8 +89,8 @@ osbin .equ osimg + hdrsiz ; Start of actual OS binary (after header) ; ; HBIOS internal info (adjust if HBIOS changes) ; -bfgbnk .equ $F1 ; HBIOS Get Bank function -bfver .equ $F6 ; HBIOS Get Version function +bfgbnk .equ $F3 ; HBIOS Get Bank function +bfver .equ $F1 ; HBIOS Get Version function sigptr .equ hbimg + 3 ; HBIOS signature pointer hbmrk .equ hbimg + $100 ; HBIOS marker hbver .equ hbimg + $102 ; HBIOS version diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 84f41e9b..f502980d 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -1877,7 +1877,7 @@ INIT: LD (DEFDRIVE),A ; STORE IT ; CBIOS BANNER - CALL NEWLINE ; FORMATTING + CALL NEWLINE2 ; FORMATTING LD DE,STR_BANNER ; POINT TO BANNER CALL WRITESTR ; DISPLAY IT @@ -2215,6 +2215,7 @@ CLRRAM2: LD A,(BNKUSER) ; SWITCH BACK TO USER BANK LD C,A ; ... TO REG C CALL $FFF0 ; DO IT (RST 08 NOT SAFE) + CALL NEWLINE2 ; FORMATTING LD DE,STR_INITRAMDISK ; RAM DISK INIT MESSAGE CALL WRITESTR ; DISPLAY IT LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK diff --git a/Source/CBIOS/ver.inc b/Source/CBIOS/ver.inc index 89ffed7b..dd683c96 100644 --- a/Source/CBIOS/ver.inc +++ b/Source/CBIOS/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 8 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "2.8.0-pre.1" +#DEFINE BIOSVER "2.8.0-pre.2" diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index fbd13ed2..54020aca 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -2,39 +2,41 @@ HBIOS Management Functions ========================== -SETBNK ($F0): +RESET: ($F0): + B=Function A=Result + +VER ($F1): + B=Function A=Result + C=Reserved (set to 0) DE=Version (Maj/Min/Upd/Pat) + L=Platform Id +SETBNK ($F2): B=Function A=Result C=Bank Id C=Previous Bank Id -GETBNK ($F1): +GETBNK ($F3): B=Function A=Result C=Bank Id -SETCPY ($F2): +SETCPY ($F4): B=Function A=Result D=Destination Bank Id E=Source Bank Id HL=Count of Bytes to Copy -BNKCPY ($F3): +BNKCPY ($F5): B=Function A=Result DE=Destination Address HL=Source Address -ALLOC ($F4): +ALLOC ($F6): B=Function A=Result HL=Size HL=Address of Allocated Memory Block -FREE ($F5): +FREE ($F7): B=Function A=Result HL=Address of Memory Block to Free -VER ($F6): - B=Function A=Result - C=Reserved (set to 0) DE=Version (Maj/Min/Upd/Pat) - L=Platform Id - -GET ($F7): +GET ($F8): BC=Function/Subfunction A=Result Subfunctions: @@ -72,7 +74,7 @@ GET ($F7): D=BIOS Bank Id E=User Bank Id -SET ($F8): +SET ($F9): BC=Function/Subfunction A=Result BOOTINFO ($E0): @@ -80,20 +82,17 @@ SET ($F8): L=Boot Bank Id DE=Boot Volume (Disk Unit/Slice) -PEEK: ($F9): +PEEK: ($FA): B=Function A=Result D=Bank E=Byte Value HL=Address -POKE: ($FA): +POKE: ($FB): B=Function A=Result D=Bank E=Byte Value HL=Address -RESET: ($FF): - B=Function A=Result - ================ Serial Functions ================ @@ -227,9 +226,9 @@ DEFMED ($19): Define media in unit. CAPACITY ($1A): - BC=Function/Unit DE:HL=Blocks on Device + BC=Function/Unit A=Result + DE:HL=Blocks on Device BC=Block Size - A=Result Report current media capacity information. If media is unknown, return error (no media) @@ -242,7 +241,6 @@ GEOMETRY ($1B): E=Sectors BC=Block Size - Report current media geometry information. If media is unknown, return error (no media) diff --git a/Source/HBIOS/Config/plt_mk4.asm b/Source/HBIOS/Config/plt_mk4.asm index 30fcb5af..1ea07ca9 100644 --- a/Source/HBIOS/Config/plt_mk4.asm +++ b/Source/HBIOS/Config/plt_mk4.asm @@ -20,25 +20,19 @@ DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC ; UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE) UARTOSC .EQU 1843200 ; UART OSC FREQUENCY -UARTCNT .EQU 6 ; NUMBER OF UARTS -UART0IOB .EQU $80 ; IOBASE (CASSETTE INTERFACE) +UARTCNT .EQU 4 ; NUMBER OF UARTS +UART0IOB .EQU $C0 ; IOBASE (4UART PORT A) UART0BAUD .EQU CONBAUD ; BAUDRATE UART0FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC -UART1IOB .EQU $88 ; IOBASE (MF/PIC) +UART1IOB .EQU $C8 ; IOBASE (4UART PORT B) UART1BAUD .EQU CONBAUD ; BAUDRATE UART1FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC -UART2IOB .EQU $C0 ; IOBASE (4UART PORT A) +UART2IOB .EQU $D0 ; IOBASE (4UART PORT C) UART2BAUD .EQU CONBAUD ; BAUDRATE UART2FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC -UART3IOB .EQU $C8 ; IOBASE (4UART PORT B) +UART3IOB .EQU $D8 ; IOBASE (4UART PORT D) UART3BAUD .EQU CONBAUD ; BAUDRATE UART3FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC -UART4IOB .EQU $D0 ; IOBASE (4UART PORT C) -UART4BAUD .EQU CONBAUD ; BAUDRATE -UART4FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC -UART5IOB .EQU $D8 ; IOBASE (4UART PORT D) -UART5BAUD .EQU CONBAUD ; BAUDRATE -UART5FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC ; ASCIENABLE .EQU TRUE ; TRUE FOR Z180 ASCI SUPPORT ASCI0BAUD .EQU CONBAUD ; ASCI0 BAUDRATE (IMPLEMENTED BY Z180_ASCIB0) diff --git a/Source/HBIOS/Config/plt_sbc.asm b/Source/HBIOS/Config/plt_sbc.asm index 170aa9a3..ad24cb7c 100644 --- a/Source/HBIOS/Config/plt_sbc.asm +++ b/Source/HBIOS/Config/plt_sbc.asm @@ -27,7 +27,7 @@ UART0FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC UART1IOB .EQU $80 ; IOBASE (CASSETTE INTERFACE) UART1BAUD .EQU CONBAUD ; BAUDRATE UART1FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC -UART2IOB .EQU $88 ; IOBASE (MF/PIC) +UART2IOB .EQU $48 ; IOBASE (MF/PIC) UART2BAUD .EQU CONBAUD ; BAUDRATE UART2FEAT .EQU UF_FIFO ; FEATURE FLAGS: UF_FIFO | UF_AFC UART3IOB .EQU $C0 ; IOBASE (4UART PORT A) diff --git a/Source/HBIOS/Config/zeta2_ppp.asm b/Source/HBIOS/Config/zeta2_ppp.asm index b27b1380..1ef5e8d0 100644 --- a/Source/HBIOS/Config/zeta2_ppp.asm +++ b/Source/HBIOS/Config/zeta2_ppp.asm @@ -3,4 +3,5 @@ ; ZETA2 PARPORTPROP CONFIGURATION ;================================================================================================== ; +CRTACT .SET TRUE ; ACTIVATE CRT CONSOLE AT BOOT PPPENABLE .SET TRUE ; TRUE FOR PARPORTPROP SUPPORT diff --git a/Source/HBIOS/Config/zeta_ppp.asm b/Source/HBIOS/Config/zeta_ppp.asm index 3dfd5c21..c08a37e6 100644 --- a/Source/HBIOS/Config/zeta_ppp.asm +++ b/Source/HBIOS/Config/zeta_ppp.asm @@ -3,4 +3,5 @@ ; ZETA PARPORTPROP CONFIGURATION ;================================================================================================== ; +CRTACT .SET TRUE ; ACTIVATE CRT CONSOLE AT BOOT PPPENABLE .SET TRUE ; TRUE FOR PARPORTPROP SUPPORT diff --git a/Source/HBIOS/encode.asm b/Source/HBIOS/encode.asm new file mode 100644 index 00000000..ebae4841 --- /dev/null +++ b/Source/HBIOS/encode.asm @@ -0,0 +1,137 @@ +; +;================================================================================================== +; FUNCTIONS TO ENCODE/DECODE 32-BIT VALUES TO/FROM A 5-BIT SHIFT-ENCODED VALUE +;================================================================================================== +; +; THE FUNCTIONS IN THIS FILE ARE BASED ON LIKE FUNCTIONS CREATED BY JOHN COFFMAN +; IN HIS UNA BIOS PROJECT. THEY ARE INCLUDED HERE BASED ON GPLV3 PERMISSIBLE USE. +; +; Copyright (C) 2014 John R. Coffman. All rights reserved. +; Provided for hobbyist use on the Z180 SBC Mark IV board. +; +; This program is free software: you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program. If not, see . +; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; DECODE +; +; Enter with: +; HL = word to be decoded (5-bits) FXXXX +; F=extra 3 factor, XXXX=shift factor, reg H must be zero +; DE = encode divisor OSC_DIV = 3, or BAUD_DIV = 75 +; +; Exit with: +; DE:HL = decoded value +; A = non-zero on error +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +DECODE: + LD A,H ; SET TO TEST + LD C,$FF ; PRESUME ERROR CONDITION + OR A ; TEST FOR ZERO + JR NZ,DECODE9 ; NOT AN ENCODED VALUE + LD A,L ; GET LOW ORDER 5 BITS + CP 32 ; TEST FOR ERROR + JR NC,DECODE9 ; ERROR RETURN IF NOT BELOW + ; ARGUMENT HL IS VALIDATED + LD H,D + LD L,E ; COPY TO HL + CP 16 + JR C,DECODE2 ; IF < 16, NO 3 FACTOR + ADD HL,DE ; INTRODUCE FACTOR OF 3 + ADD HL,DE ; ** +DECODE2: + LD DE,0 ; ZERO THE HIGH ORDER + AND 15 ; MASK TO 4 BITS + JR Z,DECODE8 ; GOOD EXIT + LD C,B ; SAVE B-REG + LD B,A ; +DECODE3: + ADD HL,HL ; SHIFT LEFT BY 1, SET CARRY + RL E + RL D ; ** + DJNZ DECODE3 + LD B,C ; RESTORE B-REG +DECODE8: + LD C,0 ; SIGNAL GOOD RETURN +DECODE9: + LD A,C ; ERROR CODE TEST + OR A ; ERROR CODE IN REG-C AND Z-FLAG + RET +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ENCODE +; +; Enter with: +; DE:HL = dword value to be encoded +; C = divisor (0 < C < 256) +; encode divisor OSC_DIV = 3, or BAUD_DIV = 75 +; +; Exit with: +; C = encoded value +; A = non-zero on error +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +ENCODE: + ; *** MAKE SURE INCOMING VALUE IS NOT ZERO??? + CALL ENCODE6 ; TEST DE:HL FOR ZERO + JR Z,ENCODE4 ; IF NOT ZERO, GO TO FAILURE + ; APPLY ENCODING DIVISOR + CALL DIV32X8 ; DE:HL / C (REMAINDER IN A) + OR A ; SET FLAGS TO TEST FOR ZERO + RET NZ ; ERROR IF NOT EVENLY DIVISIBLE + ; APPLY DIV 3 IF POSSIBLE + LD BC,ENCODE_TMP ; SAVE WORKING VALUE + CALL ST32 ; ... IN TEMP + LD C,3 ; ATTEMPT DIVIDE + CALL DIV32X8 ; ... BY 3 + OR A ; SET FLAGS TO TEST FOR ZERO + JR Z,ENCODE1 ; JUMP IF IT WORKED + LD HL,ENCODE_TMP ; FAILED, RESTORE + CALL LD32 ; ... PRIOR WORKING VALUE + LD C,0 ; INIT RESULT IN C W/O DIV 3 FLAG + JR ENCODE2 +ENCODE1: + LD C,$10 ; INIT RESULT IN C W/ DIV 3 FLAG +ENCODE2: + ; LOOP TO DETERMINE POWER OF 2 + LD B,32 +ENCODE3: + SRL D + RR E + RR H + RR L + JR C,ENCODE5 ; DONE, C HAS RESULT + INC C ; BUMP THE RESULT VALUE + DJNZ ENCODE3 +ENCODE4: + OR $FF ; SIGNAL ERROR + RET ; AND DONE +ENCODE5: + CALL ENCODE6 ; TEST FOR ZERO + RET NZ ; ERROR IF DE:HL NOT ZERO NOW + ; RETURN SUCCESS W/ VALUE IN C + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +ENCODE6: + ; SUBROUTINE TO TEST DE:HL FOR ZERO (SETS ZF, CLOBBERS A) + LD A,H + OR L + RET NZ + LD A,D + OR E + RET +; +ENCODE_TMP .FILL 4,0 ; TEMP DWORD VALUE diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 58a5885c..bbee510b 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1146,37 +1146,29 @@ VDA_ADDENT: SYS_DISPATCH: LD A,B ; GET REQUESTED FUNCTION AND $0F ; ISOLATE SUB-FUNCTION - JP Z,SYS_SETBNK ; $F0 + JP Z,SYS_RESET ; $F0 DEC A - JP Z,SYS_GETBNK ; $F1 + JP Z,SYS_VER ; $F1 DEC A - JP Z,SYS_SETCPY ; $F2 + JP Z,SYS_SETBNK ; $F2 DEC A - JP Z,SYS_BNKCPY ; $F3 + JP Z,SYS_GETBNK ; $F3 DEC A - JP Z,SYS_ALLOC ; $F4 + JP Z,SYS_SETCPY ; $F4 DEC A - JP Z,SYS_FREE ; $F5 + JP Z,SYS_BNKCPY ; $F5 DEC A - JP Z,SYS_VER ; $F6 + JP Z,SYS_ALLOC ; $F6 DEC A - JP Z,SYS_GET ; $F7 + JP Z,SYS_FREE ; $F7 DEC A - JP Z,SYS_SET ; $F8 + JP Z,SYS_GET ; $F8 DEC A - JP Z,SYS_PEEK ; $F9 + JP Z,SYS_SET ; $F9 DEC A - JP Z,SYS_POKE ; $FA + JP Z,SYS_PEEK ; $FA DEC A - ;JP Z,SYS_ ; $FB - DEC A - ;JP Z,SYS_ ; $FC - DEC A - ;JP Z,SYS_ ; $FD - DEC A - ;JP Z,SYS_ ; $FE - DEC A - JP Z,SYS_RESET ; $FF + JP Z,SYS_POKE ; $FB CALL PANIC ; INVALID ; ; SET ACTIVE MEMORY BANK AND RETURN PREVIOUSLY ACTIVE MEMORY BANK @@ -1781,6 +1773,7 @@ SIZ_TERM .EQU $ - ORG_TERM #INCLUDE "util.asm" #INCLUDE "time.asm" #INCLUDE "bcd.asm" +#INCLUDE "encode.asm" #INCLUDE "xio.asm" ; #IF (DSKYENABLE) @@ -2278,8 +2271,10 @@ PS_PRTSC: ; PS_PRTSC1: ; PRINT TERMINAL CONFIG - PRTS("Video $") ; FORMATTING LD A,C ; GET ATTRIBUTE VALUE + CP $FF ; NO ATTACHED VDA + JR Z,PS_PRTSC2 + PRTS("Video $") ; FORMATTING AND $0F ; ISOLATE VIDEO UNIT NUM CALL PRTDECB ; PRINT IT CALL PC_COMMA @@ -2291,6 +2286,12 @@ PS_PRTSC1: #ENDIF RET ; +PS_PRTSC2: + PRTS("PropTerm$") ; ASSUME PROPELLER + CALL PC_COMMA + PRTS(" ANSI$") + RET +; ; PRINT ONE LINE VIDEO UNIT/DEVICE INFO, VIDEO UNIT INDEX IN C ; PS_VIDEO: diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 4574377e..51aecc23 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -53,18 +53,18 @@ BF_VDAKFL .EQU BF_VDA + 13 ; FLUSH KEYBOARD BUFFER BF_VDAKRD .EQU BF_VDA + 14 ; READ KEYBOARD ; BF_SYS .EQU $F0 -BF_SYSSETBNK .EQU BF_SYS + 0 ; SET CURRENT BANK -BF_SYSGETBNK .EQU BF_SYS + 1 ; GET CURRENT BANK -BF_SYSSETCPY .EQU BF_SYS + 2 ; BANK MEMORY COPY SETUP -BF_SYSBNKCPY .EQU BF_SYS + 3 ; BANK MEMORY COPY -BF_SYSALLOC .EQU BF_SYS + 4 ; ALLOC HBIOS HEAP MEMORY -BF_SYSFREE .EQU BF_SYS + 5 ; FREE HBIOS HEAP MEMORY -BF_SYSVER .EQU BF_SYS + 6 ; GET HBIOS VERSION -BF_SYSGET .EQU BF_SYS + 7 ; GET HBIOS INFO -BF_SYSSET .EQU BF_SYS + 8 ; SET HBIOS PARAMETERS -BF_SYSPEEK .EQU BF_SYS + 9 ; GET A BYTE VALUE FROM ALT BANK -BF_SYSPOKE .EQU BF_SYS + 10 ; SET A BYTE VALUE IN ALT BANK -BF_SYSRESET .EQU BF_SYS + 15 ; SOFT RESET HBIOS +BF_SYSRESET .EQU BF_SYS + 0 ; SOFT RESET HBIOS +BF_SYSVER .EQU BF_SYS + 1 ; GET HBIOS VERSION +BF_SYSSETBNK .EQU BF_SYS + 2 ; SET CURRENT BANK +BF_SYSGETBNK .EQU BF_SYS + 3 ; GET CURRENT BANK +BF_SYSSETCPY .EQU BF_SYS + 4 ; BANK MEMORY COPY SETUP +BF_SYSBNKCPY .EQU BF_SYS + 5 ; BANK MEMORY COPY +BF_SYSALLOC .EQU BF_SYS + 6 ; ALLOC HBIOS HEAP MEMORY +BF_SYSFREE .EQU BF_SYS + 7 ; FREE HBIOS HEAP MEMORY +BF_SYSGET .EQU BF_SYS + 8 ; GET HBIOS INFO +BF_SYSSET .EQU BF_SYS + 9 ; SET HBIOS PARAMETERS +BF_SYSPEEK .EQU BF_SYS + 10 ; GET A BYTE VALUE FROM ALT BANK +BF_SYSPOKE .EQU BF_SYS + 11 ; SET A BYTE VALUE IN ALT BANK ; BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT diff --git a/Source/HBIOS/loader.asm b/Source/HBIOS/loader.asm index 868547fa..c7a766e6 100644 --- a/Source/HBIOS/loader.asm +++ b/Source/HBIOS/loader.asm @@ -140,6 +140,10 @@ START: ; EMIT FIRST SIGN OF LIFE TO SERIAL PORT ; CALL XIO_INIT ; INIT SERIAL PORT +#IFNDEF + CALL XIO_CRLF ; FORMATTING + CALL XIO_CRLF ; FORMATTING +#ENDIF LD HL,STR_BOOT ; POINT TO MESSAGE CALL XIO_OUTS ; SAY HELLO ; diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index e16faf2b..49a268d0 100644 --- a/Source/HBIOS/ppp.asm +++ b/Source/HBIOS/ppp.asm @@ -341,7 +341,8 @@ PPPCON_QUERY: ; PPPCON_DEVICE: LD D,CIODEV_PPPCON ; D := DEVICE TYPE - LD E,C ; E := PHYSICAL UNIT + LD E,0 ; E := DEVICE NUM, ALWAYS 0 + LD C,$FF ; $FF MEANS TERM W/ NO ATTACHED VDA XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index 6f4c885e..d6bf36dc 100644 --- a/Source/HBIOS/prp.asm +++ b/Source/HBIOS/prp.asm @@ -218,7 +218,8 @@ PRPCON_QUERY: ; PRPCON_DEVICE: LD D,CIODEV_PRPCON ; D := DEVICE TYPE - LD E,C ; E := PHYSICAL UNIT + LD E,0 ; E := DEVICE NUM, ALWAYS 0 + LD C,$FF ; $FF MEANS TERM W/ NO ATTACHED VDA XOR A ; SIGNAL SUCCESS RET ; diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 2d2c1853..70aba11b 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -460,33 +460,21 @@ UDEVUNK .DB "UNK$" LD B,BF_DIOMEDIA ; DRIVER FUNCTION = DISK MEDIA LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY RST 08 ; CALL HBIOS - LD A,E ; MOVE RESULTANT MEDIA ID TO A - OR A ; SET FLAGS - JP Z,DB_ERR ; HANDLE ERROR + ;LD A,E ; MOVE RESULTANT MEDIA ID TO A + ;OR A ; SET FLAGS + JP NZ,DB_ERR ; HANDLE ERROR - ; SET SPT BASED ON MEDIA DETECTED - LD C,18 ; ASSUME 18 SPT - CP MID_FD144 ; 3.5" 1.44M FLOPPY? - JR Z,BOOTDISK1 ; YES, DONE - - LD C,15 ; ASSUME 15 SPT - CP MID_FD120 ; 5.25" 1.2M FLOPPY? - JR Z,BOOTDISK1 ; YES, DONE - CP MID_FD111 ; 8" 1.11M FLOPPY? - JR Z,BOOTDISK1 ; YES, DONE - - LD C,9 ; ASSUME 9 SPT - CP MID_FD720 ; 3.5" 720K FLOPPY? - JR Z,BOOTDISK1 ; YES, DONE - CP MID_FD360 ; 5.25" 360k FLOPPY? - JR Z,BOOTDISK1 ; YES, DONE - - LD C,16 ; EVERYTHING ELSE IS LBA (USE 16 SPT) + ; ESTABLISH GEOMETRY + LD A,(BL_DEVICE) ; GET DEVICE/UNIT + LD C,A ; PUT IN C + LD B,BF_DIOGEOM ; HB FUNC: GET DISK GEOMETRY + RST 08 ; DO IT, D:=HEADS, E:=SECTORS + LD A,D ; GET HEADS PER CYLINCER + AND $7F ; CLEAR LBA CAPABILITY FLAG + LD (BL_HPC),A ; SAVE HEADS PER CYL + LD A,E ; GET SECTORS PER TRACK + LD (BL_SPT),A ; SAVE SECTORS PER TRACK -BOOTDISK1: - LD A,C - LD (BL_SPT),A ; SAVE SPT - ; DETERMINE STARTING TRACK FOR LU LD A,(BL_LU) ; GET LU SPECIFIED LD E,A ; LU INDEX @@ -497,6 +485,8 @@ BOOTDISK1: ; READ BOOT INFO SECTOR LD HL,0 ; INITIAL TRACK (RELATIVE TO LU) LD (BL_CURTRK),HL ; SAVE AS CURRENT TRACK + LD A,0 ; BOOT INFO IS HEAD 0 + LD (BL_CURHD),A ; SAVE AS CURRENT HEAD LD A,2 ; BOOT INFO IS IN SECTOR 2 LD (BL_CURSEC),A ; SAVE AS CURRENT SECTOR LD HL,BL_INFOSEC ; WHERE TO PUT INFO SECTOR @@ -560,24 +550,27 @@ BOOTDISK1: ; SETUP FOR DATA LOAD LD HL,(BB_CPMLOC) ; GET TARGET LOAD LOCATION LD (BL_CURDMA),HL ; ... AND SAVE IT - + DB_LOOP: + ; READ NEXT SECTOR CALL DB_NXTSEC ; BUMP TO NEXT SECTOR CALL DB_READSEC ; READ SECTOR JP NZ,DB_ERR ; HANDLE ERRORS CALL PC_PERIOD ; SHOW PROGRESS +; + ; INCREMENT DMA ADDRESS BY SECTOR SIZE LD HL,(BL_CURDMA) ; GET LOAD LOC LD DE,512 ; 512 BYTES PER SECTOR ADD HL,DE ; INCREMENT MEM POINTER LD (BL_CURDMA),HL ; ... AND SAVE IT +; + ; INCREMENT COUNTER AND LOOP AS NEEDED LD HL,BL_COUNT ; POINT TO COUNTER DEC (HL) ; ... AND DECREMENT IT JR NZ,DB_LOOP ; LOOP IF NEEDED - CALL NEWLINE ; FORMATTING + ;CALL NEWLINE ; FORMATTING ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT - ;LD B,BF_SYSHCBPUTW ; HB FUNC: PUT HCB WORD - ;LD C,HCB_BOOTVOL ; BOOT VOLUME (DEV/UNIT, SLICE) LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA @@ -595,107 +588,51 @@ DB_LOOP: ; INCREMENT TO NEXT SECTOR ; DB_NXTSEC: - LD A,(BL_SPT) ; GET SECTORS PER TRACK - LD B,A ; ... AND SAVE IT IN B + ; INCREMENT SECTOR LD HL,BL_CURSEC ; POINT TO CURRENT SECTOR INC (HL) ; INCREMENT IT - LD A,(HL) ; GET CURRENT SECTOR TO A - CP B ; COMPARE TO SPT IN B - RET NZ ; IF WE HAVE NOT HIT SPT, DONE - XOR A ; PREPARE TO CLEAR CUR SECTOR - LD (HL),A ; ... AND DO IT - LD HL,(BL_CURTRK) ; LOAD CURRENT TRACK VALUE - INC HL ; ... AND INCREMENT IT - LD (BL_CURTRK),HL ; ... AND SAVE IT - RET + LD A,(BL_SPT) ; GET SECTORS/TRACK + CP (HL) ; COMPARE TO CURRENT SECTOR + RET NZ ; RETURN IF SEC HAS NOT REACHED SPT + ; INCREMENT HEAD + LD (HL),0 ; RESET SECTOR TO ZERO + LD HL,BL_CURHD ; POINT TO CURRENT HEAD + INC (HL) ; INCREMENT IT + LD A,(BL_HPC) ; GET HEADS/CYLINDER + CP (HL) ; COMPARE TO CURRENT HEAD + RET NZ ; RETURN IF HEAD HAS NOT REACHED HPC + ; INCREMENT TRACK + LD (HL),0 ; RESET HEAD TO ZERO + LD HL,(BL_CURTRK) ; GET CURRENT TRACK VALUE + INC HL ; INCREMENT + LD (BL_CURTRK),HL ; AND SAVE NEW VALUE + RET ; DONE ; ; READ CURRENT SECTOR TO LOAD LOCATION ; DB_READSEC: - LD A,(BL_DEVICE) ; GET ACTIVE DEVICE/UNIT BYTE - AND $F0 ; ISOLATE DEVICE PORTION - CP DIODEV_FD ; FLOPPY? - JR NZ,DB_READSEC1 ; NO, USE LBA HANDLING ; SET HL=TRACK (ADD IN TRACK OFFSET) - LD DE,(BL_LUTRK) ; DE = TRACK OFFSET FOR LU SUPPORT - LD HL,(BL_CURTRK) ; HL = TRACK # - ADD HL,DE ; APPLY OFFSET FOR ACTIVE LU - ; SET DE=SECTOR - LD A,(BL_CURSEC) ; GET THE SECTOR INTO A - LD E,A ; MOVE IT TO LSB - LD D,0 ; MSB IS ALWAYS ZERO - ; SET C = DEVICE/UNIT - LD B,BF_DIOREAD ; FUNCTION IN B - LD A,(BL_DEVICE) ; LOAD DEVICE/UNIT VALUE - LD C,A ; SAVE IN C - JR DB_READSEC3 ; DISPATCH TO DRIVER -; -DB_READSEC1: -; - ; LBA STYLE ACCESS - LD DE,(BL_CURTRK) ; GET TRACK INTO DE - LD B,4 ; PREPARE TO LEFT SHIFT BY 4 BITS -DB_READSEC2: - SLA E ; SHIFT DE LEFT BY 4 BITS - RL D - DJNZ DB_READSEC2 ; LOOP TILL ALL BITS DONE - LD A,(BL_CURSEC) ; GET THE SECTOR INTO A - AND $0F ; GET RID OF TOP NIBBLE - OR E ; COMBINE WITH E - LD E,A ; BACK IN E - LD HL,0 ; HL:DE NOW HAS LU RELATIVE LBA - ; APPLY LU OFFSET NOW - ; LU OFFSET IS EXPRESSED AS NUMBER OF BLOCKS * 256 TO LU OFFSET! - LD A,(BL_LUTRK) ; LSB OF LU TRACK TO A - ADD A,D ; ADD WITH D - LD D,A ; PUT IT BACK IN D - LD A,(BL_LUTRK+1) ; MSB OF LU TRACK TO A - CALL ADDHLA ; ADD LU OFFSET - ; FINAL LBA IN HL:DE - SET 7,H ; SET HI BIT TO INDICATE LBA - LD B,BF_DIOREAD ; FUNCTION IN B - LD A,(BL_DEVICE) ; GET THE DEVICE/UNIT VALUE - LD C,A ; PUT IT IN C -; -DB_READSEC3: -; - ; DISPATCH TO DRIVER -#IF 0 - PUSH AF - PUSH BC - PUSH DE - PUSH HL - - CALL PC_PERIOD - LD A,C - CALL PRTHEXBYTE - PUSH BC - PUSH HL - POP BC - CALL PC_PERIOD - CALL PRTHEXWORD - PUSH DE - POP BC - CALL PC_COLON - CALL PRTHEXWORD - CALL NEWLINE - POP BC - - POP HL - POP DE - POP BC - POP AF -#ENDIF - PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT - EX DE,HL ; SWAP DE/HL TO XLAT FROM OLD TO NEW CALL + LD DE,(BL_LUTRK) ; DE = TRACK OFFSET FOR LU SUPPORT + LD HL,(BL_CURTRK) ; HL = TRACK # + ADD HL,DE ; APPLY OFFSET FOR ACTIVE LU + ; SET HEAD AND SECTOR + LD A,(BL_CURHD) ; GET CURRENT HEAD + LD D,A ; PUT IN D + LD A,(BL_CURSEC) ; GET CURRENT SECTOR + LD E,A ; PUT IN E + ; SEEK LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL + LD A,(BL_DEVICE) ; GET BOOT DISK UNIT + LD C,A ; PUT IN C RST 08 ; DO IT - POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A + ; READ + LD B,BF_DIOREAD ; FUNCTION IN B + LD A,(BL_DEVICE) ; GET BOOT DISK UNIT + LD C,A ; PUT IN C LD HL,(BL_CURDMA) ; GET BUFFER ADDRESS - LD DE,1 ; TRANSFER ONE SECTOR + LD DE,1 ; TRANSFER ONE SECTOR RST 08 - OR A ; SET FLAGS BASED ON RESULT RET ; ; PRINT LIST OF ALL DRIVES @@ -1045,9 +982,11 @@ BL_STACKSIZ .EQU 40H .FILL BL_STACKSIZ,0 BL_STACK .EQU $ ; +BL_HPC .DB 0 ; HEADS PER CYLINDER FOR LOAD DEVICE BL_SPT .DB 16 ; SECTORS PER TRACK FOR LOAD DEVICE BL_LUTRK .DW 0 ; STARTING TRACK FOR LU BL_CURTRK .DW 0 ; CURRENT TRACK FOR LOAD +BL_CURHD .DB 0 ; CURRENT HEAD FOR LOAD BL_CURSEC .DB 0 ; CURRENT SECTOR FOR LOAD BL_CURDMA .DW 0 ; CURRENT MEM LOC BEING LOADED BL_COUNT .DB 0 ; LOAD COUNTER diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index d6edddb5..59f38676 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -531,6 +531,7 @@ SD_MEDIA: ; USE SEND_CSD TO CHECK CARD CALL SD_SELUNIT ; SET CUR UNIT LD A,SD_CMD_SEND_CSD ; SEND_CSD + CALL SD_INITCMD ; SETUP COMMAND BUFFER CALL SD_EXECCMD ; EXECUTE COMMAND JR NZ,SD_MEDIA1 ; ERROR, NEED RESET LD BC,16 ; 16 BYTES OF CSD diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index eac6ef3f..7640b587 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -26,7 +26,7 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ; WILL NEED TO BE MODIFIED FOR DIFFERENT ACCESS SPEEDS ; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!! ; -#DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP +#DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP \ NOP \ NOP ; ;====================================================================== ; TMS DRIVER - INITIALIZATION @@ -49,17 +49,11 @@ TMS_INIT: LD DE,0 ; UNIT DATA BLOB ADDRESS CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED ; - ; ADD OURSELVES TO VDA DISPATCH TABLE - LD B,0 ; PHYSICAL UNIT IS ZERO - LD C,VDADEV_TMS ; DEVICE TYPE - LD DE,0 ; UNIT DATA BLOB ADDRESS - CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - ; INITIALIZE EMULATION LD C,A ; C := ASSIGNED VIDEO DEVICE NUM LD DE,TMS_DISPATCH ; DE := DISPATCH ADDRESS CALL TERM_ATTACH ; DO IT - +; XOR A ; SIGNAL SUCCESS RET ; @@ -271,6 +265,7 @@ TMS_CRTINIT: TMS_CRTINIT1: XOR A OUT (TMS_DATREG),A + TMS_IODELAY ; DELAY DEC DE LD A,D OR E @@ -312,6 +307,7 @@ TMS_LOADFONT2: TMS_LOADFONT3: POP AF OUT (TMS_DATREG),A + TMS_IODELAY ; DELAY DEC DE DJNZ TMS_LOADFONT3 ; diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index 47547709..0cdd76ef 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -723,6 +723,26 @@ DIV16B: RET ; +; INTEGER DIVIDES DE:HL BY C +; RESULT IN DE:HL, REMAINDER IN A +; CLOBBERS F, B +; +DIV32X8: + XOR A + LD B,32 +DIV32X8A: + ADD HL,HL + RL E + RL D + RLA + CP C + JR C,DIV32X8B + SUB C + INC L +DIV32X8B: + DJNZ DIV32X8A + RET +; ; FILL MEMORY AT HL WITH VALUE A, LENGTH IN BC, ALL REGS USED ; LENGTH *MUST* BE GREATER THAN 1 FOR PROPER OPERATION!!! ; diff --git a/Source/HBIOS/ver.inc b/Source/HBIOS/ver.inc index 89ffed7b..dd683c96 100644 --- a/Source/HBIOS/ver.inc +++ b/Source/HBIOS/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 8 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "2.8.0-pre.1" +#DEFINE BIOSVER "2.8.0-pre.2"