Browse Source

Bug Fixes

pull/3/head
Wayne Warthen 10 years ago
parent
commit
07d833473c
  1. 6
      Source/Apps/Assign.asm
  2. 4
      Source/Apps/OSLdr.asm
  3. 3
      Source/CBIOS/cbios.asm
  4. 2
      Source/CBIOS/ver.inc
  5. 40
      Source/HBIOS/API.txt
  6. 16
      Source/HBIOS/Config/plt_mk4.asm
  7. 2
      Source/HBIOS/Config/plt_sbc.asm
  8. 1
      Source/HBIOS/Config/zeta2_ppp.asm
  9. 1
      Source/HBIOS/Config/zeta_ppp.asm
  10. 137
      Source/HBIOS/encode.asm
  11. 43
      Source/HBIOS/hbios.asm
  12. 24
      Source/HBIOS/hbios.inc
  13. 4
      Source/HBIOS/loader.asm
  14. 3
      Source/HBIOS/ppp.asm
  15. 3
      Source/HBIOS/prp.asm
  16. 175
      Source/HBIOS/romldr.asm
  17. 1
      Source/HBIOS/sd.asm
  18. 12
      Source/HBIOS/tms.asm
  19. 20
      Source/HBIOS/util.asm
  20. 2
      Source/HBIOS/ver.inc

6
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

4
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

3
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

2
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"

40
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)

16
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)

2
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)

1
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

1
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

137
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 <http://www.gnu.org/licenses/>.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 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

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

24
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

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

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

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

175
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

1
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

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

20
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!!!
;

2
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"

Loading…
Cancel
Save