Browse Source

Add Device Summary Display

pull/3/head
Wayne Warthen 10 years ago
parent
commit
8aedfbb7f3
  1. 282
      Source/HBIOS/API.txt
  2. 99
      Source/HBIOS/ansi.asm
  3. 18
      Source/HBIOS/asci.asm
  4. 9
      Source/HBIOS/cvdu.asm
  5. 15
      Source/HBIOS/fd.asm
  6. 395
      Source/HBIOS/hbios.asm
  7. 5
      Source/HBIOS/hbios.inc
  8. 1
      Source/HBIOS/hdsk.asm
  9. 28
      Source/HBIOS/ide.asm
  10. 6
      Source/HBIOS/md.asm
  11. 29
      Source/HBIOS/ppide.asm
  12. 10
      Source/HBIOS/ppp.asm
  13. 10
      Source/HBIOS/prp.asm
  14. 1
      Source/HBIOS/rf.asm
  15. 9
      Source/HBIOS/scg.asm
  16. 1
      Source/HBIOS/sd.asm
  17. 60
      Source/HBIOS/tty.asm
  18. 18
      Source/HBIOS/uart.asm
  19. 32
      Source/HBIOS/util.asm
  20. 9
      Source/HBIOS/vdu.asm
  21. 2
      Source/HBIOS/ver.inc

282
Source/HBIOS/API.txt

@ -2,88 +2,114 @@
HBIOS Management Functions
==========================
GET ($05):
BC=Function/Subfunction A=Result
GET ($07):
BC=Function/Subfunction A=Result
Subfunctions:
CIOCNT ($00):
BC=Function/Subfunction A=Result
E=Serial Unit Count
BC=Function/Subfunction A=Result
E=Serial Unit Count
DIOCNT ($10):
BC=Function/Subfunction A=Result
E=Disk Unit Count
BIOSVER ($F0):
BC=Function/Subfunction A=Result
DE=BIOS Version
L=Platform
SET ($06):
BC=Function/Subfunction A=Result
BC=Function/Subfunction A=Result
E=Disk Unit Count
VDACNT ($40):
BC=Function/Subfunction A=Result
E=Video Unit Count
BOOTINFO ($E0):
BC=Function/Subfunction A=Result
L=Boot Bank Id
DE=Boot Volume (Disk Unit/Slice)
CPUINFO ($F0):
BC=Function/Subfunction A=Result
H=Z80 CPU Variant
L=CPU Speed in MHz
DE=CPU Speed in KHz
MEMINFO ($F1):
BC=Function/Subfunction A=Result
D=# ROM Banks
E=# RAM Banks
BNKINFO ($F2):
BC=Function/Subfunction A=Result
D=BIOS Bank Id
E=User Bank Id
SET ($08):
BC=Function/Subfunction A=Result
BOOTINFO ($E0):
BC=Function/Subfunction A=Result
L=Boot Bank Id
DE=Boot Volume (Disk Unit/Slice)
================
Serial Functions
================
IN ($00):
BC=Function/Unit A=Result
E=Byte Input
BC=Function/Unit A=Result
E=Byte Input
Wait for a single character to be available at the specified device and return the character in E. Function
will wait indefinitely for a character to be available.
OUT ($01):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
E=Character to Output
Wait for device/unit to be ready to send a character, then send the character specified in E.
Wait for device to be ready to send a character, then send the character specified in E.
IST ($02):
BC=Function/Unit A=Result
*E=# Bytes Pending
BC=Function/Unit A=Result
*E=# Bytes Pending
OST ($03):
BC=Function/Unit A=Result
*E=# Buffer Bytes Available
BC=Function/Unit A=Result
*E=# Buffer Bytes Available
INIT ($04):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
DE=Line Characteristics
L=Terminal Type
QUERY ($05)
BC=Function/Unit A=Result
DE=Line Characteristics
BC=Function/Unit A=Result
DE=Line Characteristics (Baud, Flow Control, etc.)
H=Device Type (RS-232, Terminal, etc.)
L=Terminal Type (TTY, VT-102, etc.)
DEVICE ($06):
BC=Function/Unit A=Result
D=Device Type
E=Physical Unit
BC=Function/Unit A=Result
D=Device Type
E=Device Number
H=Media Type (RS-232, Terminal, etc.)
L=Video Unit Id (if Media Type == VDA)
==============
Disk Functions
==============
STATUS ($10):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
Return current status result code of specified unit. Does not clear
the status.
RESET ($11):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
Reset the physical interface associated with the specified unit. Flag all units
associated with the interface for unit initialization at next I/O call. Clear
media identified unless locked. Reset result code of all associated units.
SEEK ($12):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
D:7=Address Type (0=CHS, 1=LBA)
CHS: D:0-6=Head,E=Sector,HL=Track
LBA: DE:HL
@ -92,7 +118,7 @@ SEEK ($12):
Physical seek is typically deferred until subsequent I/O operation.
READ ($13) / WRITE ($14) / VERIFY ($15):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
HL=Buffer Address
E=Block Count
@ -101,7 +127,7 @@ READ ($13) / WRITE ($14) / VERIFY ($15):
target sector is sector where error occurred.
FORMAT ($16):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
CHS: D=Head, HL=Cylinder
E=Fill Byte
@ -112,87 +138,151 @@ FORMAT ($16):
*** Need to specify interleave/sector id's somehow.
DEVICE ($17)
BC=Function/Unit A=Result
D=Device Type
E=Physical Unit
BC=Function/Unit A=Result
D=Device Type (MD, FD, IDE, etc.)
E=Device Number (0..n)
C=Disk Attributes
Report the device type (Floppy, IDE, SD, etc.) and physical unit number. Call
Report the Device Type (Floppy, IDE, SD, etc.) and Device Number. Call
does not perform any I/O and succeeds even if the device is in an error state.
It does not reset the unit status.
Disk Device Attribute Byte:
7: 1=Floppy, 0=Hard Disk (or similar, e.g. CF, SD, RAM)
If Floppy:
6-5: Form Factor (0=8", 1=5.25", 2=3.5", 3=Other)
4: Sides (0=SS, 1=DS)
3-2: Density (0=SD, 1=DD, 2=HD, 3=ED)
1-0: Reserved
If Hard Disk:
6: Removable
5-3: Type (0=Hard, 1=CF, 2=SD, 3=USB, 4=ROM, 5=RAM, 6=RAMF, 7=?)
2-0: Reserved
Note: IDE value 848Ah in IDENTIFY DEVICE data word 0 indicates CF Card
MEDIA ($18):
BC=Function/Unit A=Result
E0:=Enable Media Discovery E=Media ID (legacy)
BC=Function/Unit A=Result
E:0=Enable Media Discovery E=Media ID (legacy)
Report the media definition for media in specified unit. If bit 0 of E is
set, then perform media discovery or verification. If no media in device,
return no media error.
DEFMED ($19):
BC=Function/Unit A=Result
E=Media ID (legacy)
BC=Function/Unit A=Result
E=Media ID (legacy)
Define media in unit.
CAPACITY ($1A):
BC=Function/Unit DE:HL=Blocks on Device
BC=Block Size
A=Result
BC=Function/Unit DE:HL=Blocks on Device
BC=Block Size
A=Result
Return device capacity information.
If media is unknown, return error (no media)
GEOMETRY ($1B):
BC=Function/Unit HL=Cylinders
D:0-6=Heads
D:7=LBA Capable
E=Sectors
BC=Block Size
A=Result
BC=Function/Unit HL=Cylinders
D:0-6=Heads
D:7=LBA Capable
E=Sectors
BC=Block Size
A=Result
Return device geometry information.
If media is unknown, return error (no media)
INFO ($1F):
BC=Function/Sub-function A=Result
BC=Function/Sub-function A=Result
C=0: Report total unit count in system:
BC=Function/Sub-function A=Result
B=Count
BC=Function/Sub-function A=Result
B=Count
===============
Video Functions
===============
A: RAM0 B: ROM0 C:
-----------------------------------------------------------------------------------
Unit Device Board Part Slice Cap
------- ------- ------- ------- ------- -------
#0 RAM MK4 384K
#1 ROM MK4 384K
#2 FD0 DIO3 3.5" DS/HD
#3 IDE0 DIO3 0 8M
Unit Device Type Capacity/Mode
---------- ---------- ---------------- --------------------
Disk 0 MD0: ROM Disk 384K, LBA
Disk 1 MD1: RAM Disk 384K, LBA
Disk 2 FD0: Floppy Disk 3.5", DS/HD, CHS
Disk 3 FD1: Floppy Disk 5.25", DS/HD, CHS
Disk 4 PPIDE0: Hard Disk 2345M, LBA
Disk 5 IDE0: Compact Flash 2048M, LBA
Disk 6 SD0: SD Card 4096M, LBA
Disk 7 PRPSD0: SD Card 2048M, LBA
Disk 8 RF0: RAM Floppy 4M, LBA
Serial 0 UART0: RS-232 38400,8N1,HFC
Serial 1 PRPCON0: Direct --
Serial 2 CVDU0: Direct --
Serial 2 VDU0: Direct --
Serial 2 SCG0: Direct --
Video 0 PRPCON0: VDA Text 80x25, ANSI
Video 1 CVDU0: VDA Text 80x25, ANSI
Video 2 VDU0: VDA Text 80x25, ANSI
Video 3 SCG0: VDA Text 40x25, TTY
Unit: Function Group & Unit Index
Device: <driver>_DEVICE Device Type & Device Num
Type: <driver>_DEVICE Type & Attributes
Capacity/Mode:
Disk: <driver>_DEVICE Attributes & <driver>_CAPACITY
Serial: <driver>_QUERY
Video: <driver>_QUERY
Unit 0: RAMDISK on MK4 (384K)
Unit 1: ROMDISK on MK4 (384K)
Unit 2: FD0 on DISKIO3 (3.5")
Unit 3: FD1 on DISKIO3 (5.25")
Unit 4: IDE0 on DISKIO3 (4096M)
A: RAM0 MK4 RAM Disk, 384K
B: ROM0 MK4 ROM Disk, 384K
C: FD0 DiskIO3 Floppy Disk 0, 3.5" DS/HD
D: FD1 DiskIO3 Floppy Disk 1, 5.25" DS/DD
E: IDE0:0 MK4 IDE Hard Disk 0, Slice 0, 8M
F: IDE0:1 MK4 IDE Hard Disk 0, Slice 1, 8M
G: PRPSD0:0 PropIO SD Card, Slice 0
-----------------------------------------------------------------------------------
<VDA>_INIT:
- INIT HARDWARE
- ADD OURSELVES TO VDA_TBL
- ADD OURSELVES TO CIO_TBL
- GOTO <VDA>_VDAINIT
<VDA>_VDAINIT: (BC=FUNCTION/DEVID, HL=BITMAP ADR, D=TERMTYPE, E=VIDEO MODE)
- CALL <VDA>_VDARESET
- INITIALIZE EMULATION BY CALLING EMU_INIT (B=TERMTYPE, C=DEVTYPE, DE=VDADISPADR) ==> (DE=CIODISPADR)
- SAVE DE TO <VDA>_CIODISPADR TO FORWARD SUBSEQUENT CIO FUNCTION CALLS
- RETURN (A=STATUS)
<VDA>_VDARESET:
- RESET HARDWARE
- RETURN (A=STATUS)
EMU_INIT: (B=TERMTYPE, C=DEVTYPE, DE=VDADISPADR) ==> (DE=CIODISPADR)
- GOTO TO <EMU>_INIT BASED ON VALUE IN B
<EMU>_INIT: (C=DEVTYPE, DE=VDADISPADR) ==> (DE=CIODISPADR)
- RECORD C TO <EMU>_DEVTYPE SO <EMU>_DEVICE FUNCTION CAN RETURN IT
- RECORD DE IN <EMU>_VDADISPADR FOR LATER USE IN CALLING PARENT VDA DRIVER
- INITIALIZE/RESET EMULATION ENGINE
- RETURN (A=STATUS, DE=CIODISPADR)
--------------------------
md
hdsk
rf
ide
sd
ppide
fd
prp
ppp
--------------------------
0: RAM- RAMdrive on the Z180 SBC Mark IV board
LBASupported UserAddressableSectors 832
@ -235,42 +325,4 @@ CP/M 2.2 Copyright 1979 (c) by Digital Research
---
<VDA>_INIT:
- ADD OURSELVES TO VDA_TBL
- ADD OURSELVES TO CIO_TBL & RECORD <VDA>_CIOUNIT
- INIT HARDWARE
- GOTO <VDA>_INI
<VDA>_INI:
- CALL <VDA>_RES
- INITIALIZE EMULATION BY CALLING EMU_INIT (PASS IN B=EMU_TYPE, C=VDA CIO UNIT NUM, DE=VDA DISPATCH ADR)
- RECORD DE (EMULATOR CIO DISPATCH ADR) <VDA>_CIODISPADR TO FORWARD SUBSEQUENT CIO FUNCTION CALLS
- RETURN (A=STATUS)
<VDA>_RES:
- RESET HARDWARE
- RETURN (A=STATUS)
EMU_INIT: (B=EMU TYPE, C=VDA CIO UNIT #, DE=VDA DISPATCH ADR) ==> (DE=EMULATOR CIO DISPATCH ADR)
- GOTO TO <EMU>_INIT BASED ON VALUE IN B
<EMU>_INIT: (C=VDA CIO UNIT #, DE=VDA DISPATCH ADR) ==> (DE=EMULATOR CIO DISPATCH ADR)
- RECORD C (VDA CIO UNIT) IN <EMU>_VDACIOUNIT SO <EMU>_DEVICE FUNCTION CAN RETURN IT
- RECORD DE IN <EMU>_VDADISPADR FOR LATER USE IN CALLING PARENT VDA DRIVER
- INITIALIZE/RESET EMULATION ENGINE
- RETURN (A=STATUS, DE=EMULATOR CIO DISPATCH)
--------------------------
md
hdsk
rf
ide
sd
ppide
fd
prp
ppp

99
Source/HBIOS/ansi.asm

@ -27,10 +27,15 @@ ANSI_DEFCOLOR .EQU 7 ; WHITE ON BLACK
;
ANSI_INIT:
; SAVE INCOMING VDA DISPATCH ADDRESS
LD C,A ; VDA DRIVER'S CIO UNIT NUMBER
LD (ANSI_CIOUNIT),A ; ... SAVED LOCALLY
LD C,A ; VDA DRIVER'S DEVICE TYPE
LD (ANSI_DEVTYPE),A ; ... SAVED LOCALLY
LD (ANSI_VDADISPADR),DE ; RECORD NEW VDA DISPATCH ADDRESS
CALL ANSI_RESET ; FULL RESET OF EMULATOR INTERNAL STATE
LD DE,ANSI_DISPATCH ; RETURN OUR DISPATCH ADDRESS
XOR A ; SIGNAL SUCCESS
RET ; RETURN
;
ANSI_RESET:
; QUERY THE VIDEO DRIVER FOR SCREEN DIMENSIONS
LD B,BF_VDAQRY ; FUNCTION IS QUERY
LD HL,0 ; WE DO NOT WANT A COPY OF THE CHARACTER BITMAP DATA
@ -65,8 +70,6 @@ ANSI_INIT2: ; LOOP TO RESET TAB STOPS
INC HL ; POINT TO NEXT BYTE
DJNZ ANSI_INIT2 ; LOOP TILL ALL BYTES DONE
;
LD DE,ANSI_DISPATCH ; RETURN OUR DISPATCH ADDRESS
XOR A
RET
;
;
@ -78,21 +81,21 @@ ANSI_VDADISPADR .EQU $ - 2
;
;
ANSI_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,ANSI_IN ; $30
DEC A
JR Z,ANSI_OUT ; $31
DEC A
JR Z,ANSI_IST ; $32
DEC A
JR Z,ANSI_OST ; $33
DEC A
JR Z,ANSI_INITDEV ; $34
DEC A
JP Z,ANSI_QUERY ; $35
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,ANSI_CIOIN ; $30
DEC A
JR Z,ANSI_CIOOUT ; $31
DEC A
JR Z,ANSI_CIOIST ; $32
DEC A
JP Z,ANSI_DEVICE ; $36
JR Z,ANSI_CIOOST ; $33
DEC A
JR Z,ANSI_CIOINIT ; $34
DEC A
JP Z,ANSI_CIOQUERY ; $35
DEC A
JP Z,ANSI_CIODEVICE ; $36
CALL PANIC
;
;==================================================================================================
@ -101,12 +104,12 @@ ANSI_DISPATCH:
;
; READ A CHARACTER
;
ANSI_IN: ; HANDLE INPUT REQUEST
ANSI_CIOIN: ; HANDLE INPUT REQUEST
;
; RETURN QUEUED DATA IF WE HAVE ANY
LD A,(ANSI_QLEN) ; GET THE CURRENT QUEUE LENGTH
OR A ; SET FLAGS
JR Z,ANSI_IN1 ; NOTHING THERE, GO TO KEYBOARD READ
JR Z,ANSI_CIOIN1 ; NOTHING THERE, GO TO KEYBOARD READ
DEC A ; DECREMENT THE QUEUE LENGTH
LD (ANSI_QLEN),A ; AND SAVE IT
LD HL,(ANSI_QPTR) ; GET THE QUEUE POINTER
@ -117,44 +120,44 @@ ANSI_IN: ; HANDLE INPUT REQUEST
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
ANSI_IN1: ; PERFORM ACTUAL KEYBOARD INPUT
ANSI_CIOIN1: ; PERFORM ACTUAL KEYBOARD INPUT
LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ
CALL ANSI_VDADISP ; CALL VDA DISPATCHER
LD A,E ; CHARACTER READ INTO A
BIT 7,A ; TEST HIGH BIT
JR NZ,ANSI_IN2 ; HANDLE $80 OR HIGHER AS SPECIAL CHAR
JR NZ,ANSI_CIOIN2 ; HANDLE $80 OR HIGHER AS SPECIAL CHAR
XOR A ; OTHERWISE, SIGNAL SUCCESS
RET ; AND RETURN THE KEY
;
ANSI_IN2: ; HANDLE SPECIAL KEY
ANSI_CIOIN2: ; HANDLE SPECIAL KEY
CALL ANSI_KDISP ; IF $80 OR HIGHER, DISPATCH
JR ANSI_IN ; AND LOOP
JR ANSI_CIOIN ; AND LOOP
;
; WRITE A CHARACTER W/ EMULATION
;
ANSI_OUT:
LD HL,ANSI_OUT2 ; RETURN ADDRESS
ANSI_CIOOUT:
LD HL,ANSI_CIOOUT2 ; RETURN ADDRESS
PUSH HL ; PUT IT ON STACK
LD A,E ; GET THE INCOMING CHARACTER
CP $20 ; $00-$1F IS C0
JP C,ANSI_C0DISP ; IF C0, DO C0 DISPATCH
CP $80 ; $20-$7F
JR C,ANSI_OUT1 ; HANDLE VIA STATE MACHINE
JR C,ANSI_CIOOUT1 ; HANDLE VIA STATE MACHINE
CP $A0 ; $80-$9F IS C1
JP C,ANSI_C1DISP ; IF C1, DO C1 DISPATCH
;
ANSI_OUT1: ; PROCESS OTHER CHARS VIA STATE MACHINE
ANSI_CIOOUT1: ; PROCESS OTHER CHARS VIA STATE MACHINE
LD HL,(ANSI_STATE) ; LOAD THE CURRENT STATE
JP (HL) ; DO IT
; CALL JPHL ; DO IT
;
ANSI_OUT2: ; SET RESULT AND RETURN
ANSI_CIOOUT2: ; SET RESULT AND RETURN
XOR A ; SIGNAL SUCCESS
RET
;
; CHECK INPUT STATUS
;
ANSI_IST: ; CHECK QUEUE FIRST
ANSI_CIOIST: ; CHECK QUEUE FIRST
LD A,(ANSI_QLEN) ; GET CURRENT QUEUE LENGTH
OR A ; SET FLAGS
RET NZ ; RETURN IF CHAR(S) WAITING
@ -170,7 +173,7 @@ ANSI_IST: ; CHECK QUEUE FIRST
CALL ANSI_VDADISP ; DO IT
LD A,E ; CHARACTER READ TO A
BIT 7,A ; TEST HIGH BIT
JR NZ,ANSI_IST1 ; HANDLE $80 OR HIGHER AS SPECIAL CHAR
JR NZ,ANSI_CIOIST1 ; HANDLE $80 OR HIGHER AS SPECIAL CHAR
;
; REGULAR CHARACTER RECEIVED, QUEUE IT AND RETURN CHARS WAITING STATUS
LD HL,ANSI_QUEUE ; SET HL TO START OF QUEUE
@ -180,35 +183,43 @@ ANSI_IST: ; CHECK QUEUE FIRST
XOR A ; ZERO ACCUM
INC A ; ASSUM := 1 (NUM CHARS IN QUEUE)
LD (ANSI_QLEN),A ; SAVE NEW QUEUE LEN
JR ANSI_IST ; REPEAT
JR ANSI_CIOIST ; REPEAT
;
ANSI_IST1: ; HANDLE SPECIAL KEY
ANSI_CIOIST1: ; HANDLE SPECIAL KEY
CALL ANSI_KDISP ; DO SPECIAL KEY HANDLING
JR ANSI_IST ; REPEAT
JR ANSI_CIOIST ; REPEAT
;
; CHECK OUTPUT STATUS
;
ANSI_OST: ; VIDEO OUTPUT IS *ALWAYS* READY
ANSI_CIOOST: ; VIDEO OUTPUT IS *ALWAYS* READY
XOR A ; ZERO ACCUM
INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY
RET
;
; INITIALIZE
;
ANSI_INITDEV:
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
ANSI_CIOINIT:
; SETUP AND FORWARD CALL TO PARENT VDA DRIVER'S VDAINIT FUNCTION
LD B,BF_VDAINI ; WE ARE FORWARDING TO VDAINIT FUNCTION
LD A,(ANSI_DEVTYPE) ; GET DEVICE TYPE WE ARE EMULATING FOR
LD C,A ; AND PUT IT IN C
LD D,L ; TERMTYPE TO D
LD E,0 ; VIDEO MODE = 0
LD HL,0 ; NO BITMAP, LEAVE IT ALONG
JP ANSI_VDADISP ; LET VDA DRIVER HANDLE IT FROM HERE
;
; QUERY STATUS
;
ANSI_QUERY:
CALL PANIC ; NOT IMPLEMENTED
ANSI_CIOQUERY:
LD DE,0
LD HL,0
XOR A
RET
;
; REPORT DEVICE
;
ANSI_DEVICE:
LD A,(ANSI_CIOUNIT) ; GET THE CURRENT CIO DEVICE
ANSI_CIODEVICE:
LD A,(ANSI_DEVTYPE) ; GET DEVICE TYPE WE ARE EMULATING FOR
LD D,A ; AND PASS BACK IN D
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
@ -338,7 +349,7 @@ ANSI_ESCDISP1: ; NORMAL ESCAPE DISPATCHING, NO INT CHARACTER
;
ANSI_ESCDISP1A: ; CONTINUE NORMAL ESCAPE SEQ DISPATCHING
CP 'c' ; RIS: RESET TO INITIAL STATE
JP Z,ANSI_INITDEV ; DO A FULL RESET
JP Z,ANSI_RESET ; DO A FULL RESET
JP ANSI_UNK ; UNKNOWN, ABORT
;
ANSI_ESCDISP2: ; ESC DISPATCHING FOR '#' INT CHAR
@ -1376,4 +1387,4 @@ ANSI_PARIDX .DB 0 ; NUMBER OF PARAMETERS RECORDED
ANSI_PARLST .FILL 16,0 ; PARAMETER VALUE LIST (UP TO 16 BYTE VALUES)
ANSI_VARLEN .EQU $ - ANSI_VARS
;
ANSI_CIOUNIT .DB $FF ; CIO UNIT NUMBER OF PARENT VDA
ANSI_DEVTYPE .DB $FF ; DEVICE TYPE OF PARENT VDA'S CIO DEVICE

18
Source/HBIOS/asci.asm

@ -229,11 +229,18 @@ ASCI0_OST:
;
;
ASCI0_INITDEV:
ASCI0_QUERY:
CALL PANIC
;
;
;
ASCI0_QUERY:
LD DE,ASCI0BAUD >> 16
LD HL,ASCI0BAUD & $FFFF
XOR A
RET
;
;
;
ASCI0_DEVICE:
LD D,CIODEV_ASCI ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
@ -313,11 +320,18 @@ ASCI1_OST:
;
;
ASCI1_INITDEV:
ASCI1_QUERY:
CALL PANIC
;
;
;
ASCI1_QUERY:
LD DE,ASCI1BAUD >> 16
LD HL,ASCI1BAUD & $FFFF
XOR A
RET
;
;
;
ASCI1_DEVICE:
LD D,CIODEV_ASCI ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT

9
Source/HBIOS/cvdu.asm

@ -42,7 +42,7 @@ CVDU_INIT:
LD C,CIODEV_CVDU ; DEVICE TYPE
LD DE,0 ; UNIT DATA BLOB ADDRESS
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
LD (CVDU_CIOUNIT),A ; SAVE IT LOCALLY
;LD (CVDU_CIOUNIT),A ; SAVE IT LOCALLY
LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE
LD D,VDAEMU ; DEFAULT EMULATION
@ -102,8 +102,9 @@ CVDU_VDAINI:
; INITIALIZE EMULATION
LD B,D ; EMULATION TYPE TO B
LD A,(CVDU_CIOUNIT) ; CIO UNIT NUMBER
LD C,A ; ... IS PASSED IN C
;LD A,(CVDU_CIOUNIT) ; CIO UNIT NUMBER
;LD C,A ; ... IS PASSED IN C
LD C,CIODEV_CVDU ; PASS OUR DEVICE TYPE IN C
LD DE,CVDU_DISPATCH ; DISPATCH ADDRESS TO DE
CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER
LD (CVDU_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS
@ -649,7 +650,7 @@ CVDU_BLKCPY1:
; CVDU DRIVER - DATA
;==================================================================================================
;
CVDU_CIOUNIT .DB $FF ; LOCAL COPY OF OUR CIO UNIT NUMBER
;CVDU_CIOUNIT .DB $FF ; LOCAL COPY OF OUR CIO UNIT NUMBER
;
CVDU_ATTR .DB 0 ; CURRENT COLOR
CVDU_POS .DW 0 ; CURRENT DISPLAY POSITION

15
Source/HBIOS/fd.asm

@ -410,6 +410,21 @@ FD_DEFMED:
FD_DEVICE:
LD D,DIODEV_FD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
#IF (FDMEDIA == FDM720)
LD C,%11010100 ; 3.5" DS/DD
#ENDIF
#IF (FDMEDIA == FDM144)
LD C,%11011000 ; 3.5" DS/HD
#ENDIF
#IF (FDMEDIA == FDM360)
LD C,%10110100 ; 5.25" DS/DD
#ENDIF
#IF (FDMEDIA == FDM120)
LD C,%10111000 ; 5.25" DS/HD
#ENDIF
#IF (FDMEDIA == FDM111)
LD C,%10010100 ; 8" DS/DD
#ENDIF
XOR A ; SIGNAL SUCCESS
RET
;

395
Source/HBIOS/hbios.asm

@ -589,6 +589,9 @@ INITSYS1:
#ENDIF
;
INITSYS2:
;
CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE
;
RET
;
;==================================================================================================
@ -1070,7 +1073,7 @@ RTC_DISPATCH:
; TO THE CORRRECT EMULATION MODULE.
;
; B: EMULATION TYPE ID (1=TTY, 2=ANSI, ETC.)
; C: VDA DRIVER'S CIO UNIT NUMBER
; C: VDA DRIVER'S VDA DEVICE TYPE
; DE: VDA DRIVER'S DISPATCH ADDRESS
;
;
@ -1317,7 +1320,7 @@ SYS_GETCPUINFO:
;
SYS_GETMEMINFO:
LD D,ROMSIZE / 32
LD D,RAMSIZE / 32
LD E,RAMSIZE / 32
XOR A
RET
;
@ -1981,6 +1984,391 @@ PRTD3M3:
RET
;
;==================================================================================================
; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES
;==================================================================================================
;
PRTSUM:
CALL NEWLINE2 ; SKIP A LINE
LD DE,PS_STRHDR ; POINT TO HEADER
CALL WRITESTR ; PRINT IT
;
; PRINT DISK DEVICES
LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET
LD C,BF_SYSGET_DIOCNT ; SUBFUNC: DISK UNIT COUNT
RST 08 ; E := DISK UNIT COUNT
LD B,E ; MOVE TO B FOR LOOP COUNT
LD C,0 ; D WILL BE UNIT INDEX
PRTSUM1:
PUSH BC ; SAVE LOOP CONTROL
CALL PS_DISK ; PRINT DISK INFO
POP BC ; RESTORE LOOP CONTROL
INC C ; BUMP DISK UNIT INDEX
DJNZ PRTSUM1 ; LOOP THRU ALL DISK DEVICES
;
; PRINT SERIAL DEVICES
LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET
LD C,BF_SYSGET_CIOCNT ; SUBFUNC: DISK UNIT COUNT
RST 08 ; E := DISK UNIT COUNT
LD B,E ; MOVE TO B FOR LOOP COUNT
LD C,0 ; D WILL BE UNIT INDEX
PRTSUM2:
PUSH BC ; SAVE LOOP CONTROL
CALL PS_SERIAL ; PRINT SERIAL INFO
POP BC ; RESTORE LOOP CONTROL
INC C ; BUMP DISK UNIT INDEX
DJNZ PRTSUM2 ; LOOP THRU ALL DISK DEVICES
;
RET ; DONE
;
; PRINT ONE LINE DISK UNIT/DEVICE INFO, DISK UNIT INDEX IN C
;
PS_DISK:
PUSH BC ; SAVE UNIT INDEX FOR LATER
;
; UNIT COLUMN
PRTS("Disk $")
LD A,C ; MOVE UNIT NUM TO A
CALL PRTDECB ; PRINT IT, ASSUME SINGLE DIGIT
PRTS(" $") ; PAD TO NEXT COLUMN
;
; DEVICE COLUMN
LD B,BF_DIODEVICE ; FUNC=GET DEVICE INFO, UNIT NUM STILL IN C
RST 08 ; DE:=DEVTYP/NUM, H:=DISK ATTRIBUTES
PUSH BC ; SAVE ATTRIBUTES
LD HL,PS_DDSTRREF ; POINT TO DISK DEVICE TYPE NAME TABLE
CALL PS_PRTDEV ; PRINT DISK DEVICE NMEMONIC PADDED TO FIELD WIDTH
POP DE ; RECOVER ATTRIBUTES TO DE
PUSH DE ; SAVE ATTRIBUTES AGAIN
CALL PS_PRTDT ; PRINT DISK TYPE
POP DE ; RESTORE ATTRIBUTES
POP BC ; RESTORE UNIT NUM
CALL PS_PRTDC ; PRINT DISK CAPACITY
;
CALL NEWLINE
RET
;
; PRINT DISK TYPE (DISK ATTRIBUTE IN E)
;
PS_PRTDT:
LD A,E ; ATTRIBUTES TO A
BIT 7,A ; FLOPPY BIT SET?
LD HL,PS_DTFLOP ; ASSUME FLOPPY
JR NZ,PS_PRTDT1 ; IF FLOPPY, JUMP AHEAD
RRCA ; SHIFT TYPE BITS
RRCA
RRCA
AND $07 ; AND ISOLATE THEM
RLCA ; X2 FOR WORD OFFSET IN STRING TABLE
LD HL,PS_DTSTRREF + 2 ; POINT TO STR REF TABLE (SKIP FLOPPY STRING)
CALL ADDHLA
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
;
PS_PRTDT1:
CALL PS_PRT ; PRINT $ TERM STRING AT (HL), C:=CHARS PRINTED
LD A,18 ; 18 CHAR FIELD
SUB C
CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A)
RET
;LD A,D
;RRCA ; TYPE IS IN UPPER NIBBLE, MOVE TO LOWER NIBBLE
;RRCA
;RRCA
;RRCA
;RLCA ; X2 FOR WORD OFFSET IN STRING TABLE
;CALL ADDHLA
;LD A,(HL)
;INC HL
;LD H,(HL)
;LD L,A
;CALL PS_PRT ; PRINT $ TERM STRING AT (HL), C:=CHARS PRINTED
;LD A,E ; NUM
;CALL PRTDECB ; PRINT NUM, ASSUME 1 CHAR
;CALL PC_COLON ; PRINT COLON
;LD A,12 - 2 ; 12 CHAR FIELD - 1 POS FOR UNIT NUM AND 1 POS FOR COLON
;SUB C
;CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A)
;RET
;
; PRINT DISK CAPACITY (UNIT IN C, ATTRIBUTE IN E)
;
PS_PRTDC:
;
LD A,E ; ATTRIBUTE TO ACCUM
BIT 7,A ; TEST FOR FLOPPY
JR NZ,PS_PRTDC2 ; HANDLE FLOPPY
RRCA ; ISOLATE TYPE BITS
RRCA
RRCA
AND $07
CP 4 ; ROM DISK?
JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB
CP 5 ; RAM DISK?
JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB
;
; PRINT HARD DISK STORAGE SIZE IN MB
LD B,BF_DIOCAP ; HBIOS FUNC: GET CAPACTIY
RST 08 ; DE:HL := BLOCKS
RES 7,D ; CLEAR LBA BIT
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
PRTS("MB$") ; PRINT SUFFIX
CALL PC_COMMA
PRTS(" LBA$") ; FOR NOW, WE ASSUME HARD DISK DOES LBA
RET ; DONE
;
PS_PRTDC1:
; PRINT ROM/ROM DISK CAPACITY IN KB
LD B,BF_DIOCAP ; HBIOS FUNC: GET CAPACTIY
RST 08 ; DE:HL := BLOCKS
RES 7,D ; CLEAR LBA BIT
LD B,1 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
PRTS("KB$") ; PRINT SUFFIX
CALL PC_COMMA
PRTS(" LBA$") ; FOR NOW, WE ASSUME HARD DISK DOES LBA
RET ; DONE
;
PS_PRTDC2:
LD C,E ; ATTRIBUTE TO C FOR SAFE KEEPING
; PRINT FLOPPY TYPE
LD A,C ; ATTRIBUTE TO ACCUM
RLCA ; ISOLATE FORM FACTOR BITS
RLCA
RLCA
AND $03
LD DE,PS_FLP8 ; ASSUME 8"
CP 0
JR Z,PS_PRTDC2A
LD DE,PS_FLP5 ; ASSUME 5.25"
CP 1
JR Z,PS_PRTDC2A
LD DE,PS_FLP3 ; ASSUME 3.5"
CP 2
JR Z,PS_PRTDC2A
LD DE,PS_FLPN ; ASSUME OTHER"
PS_PRTDC2A:
CALL WRITESTR
; PRINT FLOPPY SIDES
LD A,C ; ATTRIBUTE TO ACCUM
LD DE,PS_FLPSS ; ASSUME SINGLE SIDED
BIT 4,A ; DS?
JR Z,PS_PRTDC2B
LD DE,PS_FLPDS ; DOUBLE SIDED
PS_PRTDC2B:
CALL WRITESTR
; PRINT FLOPPY DENSITY
LD A,C ; ATTRIBUTE TO ACCUM
RRCA ; ISOLATE DENSITY BITS
RRCA
AND $03
LD DE,PS_FLPSD ; SINGLE DENSITY
CP 0
JR Z,PS_PRTDC2C
LD DE,PS_FLPDD ; DOUBLE DENSITY
CP 1
JR Z,PS_PRTDC2C
LD DE,PS_FLPHD ; HIGH DENSITY
CP 2
JR Z,PS_PRTDC2C
LD DE,PS_FLPED ; EXTENDED DENSITY
CP 3
JR Z,PS_PRTDC2C
PS_PRTDC2C:
CALL WRITESTR
CALL PC_COMMA
PRTS(" CHS$") ; FOR NOW, WE ASSUME HARD DISK DOES LBA
;
RET ; DONE
;
; FLOPPY ATTRIBUTE STRINGS
;
PS_FLP8 .TEXT "8\", $"
PS_FLP5 .TEXT "5.25\", $"
PS_FLP3 .TEXT "3.5\", $"
PS_FLPN .TEXT "???\", $"
;
PS_FLPSS .TEXT "SS/$"
PS_FLPDS .TEXT "SS/$"
;
PS_FLPSD .TEXT "SD$"
PS_FLPDD .TEXT "DD$"
PS_FLPHD .TEXT "HD$"
PS_FLPED .TEXT "ED$"
;
; PRINT ONE LINE SERIAL UNIT/DEVICE INFO, DISK UNIT INDEX IN C
;
PS_SERIAL:
PUSH BC ; SAVE UNIT INDEX FOR LATER
;
; UNIT COLUMN
PRTS("Serial $")
LD A,C ; MOVE UNIT NUM TO A
CALL PRTDECB ; PRINT IT, ASSUME SINGLE DIGIT
PRTS(" $") ; PAD TO NEXT COLUMN
;
; DEVICE COLUMN
LD B,BF_CIODEVICE ; FUNC=GET DEVICE INFO, UNIT NUM STILL IN C
RST 08 ; DE:=DEVTYP/NUM, H:=DISK ATTRIBUTES
PUSH BC ; SAVE ATTRIBUTES
LD HL,PS_SDSTRREF ; POINT TO SERIAL DEVICE TYPE NAME TABLE
CALL PS_PRTDEV ; PRINT SERIAL DEVICE NMEMONIC PADDED TO FIELD WIDTH
POP DE ; RECOVER ATTRIBUTES
PUSH DE ; SAVE ATTRIBUTES AGAIN
CALL PS_PRTST ; PRINT SERIAL TYPE
POP DE ; RESTORE ATTRIBUTES
POP BC ; RESTORE UNIT NUM
CALL PS_PRTSC ; PRINT SERIAL CONFIG
;
CALL NEWLINE
RET
;
; PRINT SERIAL TYPE (SERIAL ATTRIBUTE IN E)
;
PS_PRTST:
LD HL,PS_STDUMMY
CALL PS_PRT ; PRINT $ TERM STRING AT (HL), C:=CHARS PRINTED
LD A,18 ; 18 CHAR FIELD
SUB C
CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A)
RET
;
; PRINT SERIAL CONFIG (UNIT IN C, ATTRIBUTE IN E)
;
PS_PRTSC:
LD B,BF_CIOQUERY ; HBIOS FUNC: GET CIO CONFIG
RST 08 ; DE:HL := BAUD RATE
PUSH DE ; DE:HL ==> HL:BC
PUSH HL
POP BC
POP HL
LD DE,PS_BCDTMP ; DE POINTS TO BCD TEMP
CALL BIN2BCD ; CONVERT HL:BC TO BCD AT (DE)
LD HL,PS_BCDTMP ; POINT TO TEMP BCD
CALL PRTBCD ; AND PRINT IT
CALL PC_COMMA
PRTS(" 8N1$")
RET
;
; PRINT DEVICE NMEMONIC, DEVTYP/NUM SPECIFIED IN DE
;
PS_PRTDEV:
LD A,D
RRCA ; TYPE IS IN UPPER NIBBLE, MOVE TO LOWER NIBBLE
RRCA
RRCA
RRCA
RLCA ; X2 FOR WORD OFFSET IN STRING TABLE
CALL ADDHLA
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
CALL PS_PRT ; PRINT $ TERM STRING AT (HL), C:=CHARS PRINTED
LD A,E ; NUM
CALL PRTDECB ; PRINT NUM, ASSUME 1 CHAR
CALL PC_COLON ; PRINT COLON
LD A,12 - 2 ; 12 CHAR FIELD - 1 POS FOR UNIT NUM AND 1 POS FOR COLON
SUB C
CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A)
RET
;
;
;
PS_PRT:
; PRINT STRING AT (HL), $ TERM, RETURN CHARS PRINTED IN C
LD C,0 ; INIT CHAR COUNT
PS_PRT1:
LD A,(HL) ; GET CHAR
INC HL ; BUMP INDEX
CP '$' ; TERM?
RET Z ; IF SO, DONE
CALL COUT ; PRINT IT
INC C ; BUMP COUNTER
JR PS_PRT1 ; AND LOOP
;
;
;
PS_PAD:
; PAD N SPACES SPECIFIED IN A
LD B,A
LD A,' '
PS_PAD1:
CALL COUT
DJNZ PS_PAD1
RET
;
;
;
PS_BCDTMP .FILL 5,0 ; TEMPORARY BCD NUMBER STORAGE
;
; DISK DEVICE STRINGS
;
PS_DDSTRREF:
.DW PS_DDMD, PS_DDFD, PS_DDRF, PS_DDIDE, PS_DDATAPI, PS_DDPPIDE
.DW PS_DDSD, PS_DDPRPSD, PS_DDPPPSD, PS_DDHDSK
;
PS_DDMD .TEXT "MD$"
PS_DDFD .TEXT "FD$"
PS_DDRF .TEXT "RF$"
PS_DDIDE .TEXT "IDE$"
PS_DDATAPI .TEXT "ATAPI$"
PS_DDPPIDE .TEXT "PPIDE$"
PS_DDSD .TEXT "SD$"
PS_DDPRPSD .TEXT "PRPSD$"
PS_DDPPPSD .TEXT "PPPSD$"
PS_DDHDSK .TEXT "HDSK$"
;
; DISK TYPE STRINGS
;
PS_DTSTRREF:
.DW PS_DTFLOP, PS_DTHARD, PS_DTCF, PS_DTSD
.DW PS_DTUSB, PS_DTROM, PS_DTRAM, PS_DTRF
;
PS_DTFLOP .TEXT "Floppy Disk$"
PS_DTHARD .TEXT "Hard Disk$"
PS_DTCF .TEXT "CompactFlash$"
PS_DTSD .TEXT "SD Card$"
PS_DTUSB .TEXT "USB Drive$"
PS_DTROM .TEXT "ROM Disk$"
PS_DTRAM .TEXT "RAM Disk$"
PS_DTRF .TEXT "RAM Floppy$"
PS_DTOTHER .TEXT "???$"
;
; SERIAL DEVICE STRINGS
;
PS_SDSTRREF:
.DW PS_SDUART, PS_SDASCI, PS_SDVDU, PS_SDCVDU
.DW PS_SDUPD7220, PS_SDSCG, PS_SDPRPCON, PS_SDPPPCON
;
PS_SDUART .TEXT "UART$"
PS_SDASCI .TEXT "ASCI$"
PS_SDVDU .TEXT "VDU$"
PS_SDCVDU .TEXT "CVDU$"
PS_SDUPD7220 .TEXT "UPD7220$"
PS_SDSCG .TEXT "SCG$"
PS_SDPRPCON .TEXT "PRPCON$"
PS_SDPPPCON .TEXT "PPPCON$"
;
; SERIAL TYPE STRINGS
;
PS_STDUMMY .TEXT "--$"
;
;
; 0 1 2 3 4 5 6 7
; 01234567890123456789012345678901234567890123456789012345678901234567890123456789
PS_STRHDR .TEXT "Unit Device Type Capacity/Mode\r\n"
.TEXT "---------- ---------- ---------------- --------------------\r\n$"
;
;==================================================================================================
; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED)
;==================================================================================================
;
@ -2096,8 +2484,6 @@ IDLECOUNT .DB 0
; .DW 0 ; LBA LOW WORD
; .DW 0 ; LBA HIGH WORD
;
; DISK DEVICE/UNIT ID
;HSTDSK .DB 0 ; DISK DEVICE/UNIT ID
; FULL 32 BIT LBA
HSTLBA .EQU $ ; REFERS TO START OF 32-BIT LBA
; LBA LOW WORD -OR- TRACK
@ -2109,7 +2495,6 @@ HSTSEC .DB 0 ; SECTOR (0-255)
HSTHEAD .DB 0 ; HEAD (0-255)
;
DIOBUF .DW 0 ; PTR TO CURRENT DISK XFR BUFFER
;DIOBUFDEF .DW 0 ; PTR TO DEFAULT PREALLOCATED DISK XFR BUFFER
;
HB_INTSTKSAV .DW 0 ; SAVED STACK POINTER DURING INT PROCESSING
.FILL $40,$FF ; 32 ENTRY STACK FOR INTERRUPT PROCESSING

5
Source/HBIOS/hbios.inc

@ -61,11 +61,12 @@ 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_PEEK .EQU BF_SYS + 9 ; GET A BYTE FROM HBIOS BANK
BF_POKE .EQU BF_SYS + 10 ; PUT A BYTE TO HBIOS BANK
BF_PEEK .EQU BF_SYS + 9 ; GET A BYTE FROM ALT BANK
BF_POKE .EQU BF_SYS + 10 ; PUT A BYTE TO ALT BANK
;
BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT
BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT
BF_SYSGET_VDACNT .EQU $10 ; GET VDA UNIT COUNT
BF_SYSGET_BOOTINFO .EQU $E0 ; GET BOOT INFORMATION
BF_SYSGET_CPUINFO .EQU $F0 ; GET CPU INFORMATION
BF_SYSGET_MEMINFO .EQU $F1 ; GET MEMORY CAPACTITY INFO

1
Source/HBIOS/hdsk.asm

@ -129,6 +129,7 @@ HDSK_GEOM:
HDSK_DEVICE:
LD D,DIODEV_HDSK ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
LD C,%00000000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK
XOR A ; SIGNAL SUCCESS
RET
;

28
Source/HBIOS/ide.asm

@ -194,6 +194,7 @@ IDE_DRVSLAVE .DB %11110000 ; LBA, SLAVE DEVICE
IDE_STAT .EQU 0 ; LAST STATUS (1 BYTE)
IDE_TYPE .EQU 1 ; DEVICE TYPE (1 BYTE)
IDE_CAPACITY .EQU 2 ; DEVICE CAPACITY (1 DWORD/4 BYTES)
IDE_CFFLAG .EQU 6 ; CF FLAG (1 BYTE), NON-ZERO=CF
;
; THE IDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL
; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING
@ -395,9 +396,16 @@ IDE_STATUS:
;
;
IDE_DEVICE:
LD D,DIODEV_IDE ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
LD D,DIODEV_IDE ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
IDE_DPTR(IDE_CFFLAG) ; POINT TO CF FLAG
LD A,(HL) ; GET FLAG
OR A ; SET ACCUM FLAGS
LD C,%00000000 ; ASSUME NON-REMOVABLE HARD DISK
JR Z,IDE_DEVICE1 ; IF Z, WE ARE DONE
LD C,%01001000 ; OTHERWISE REMOVABLE COMPACT FLASH
IDE_DEVICE1:
XOR A ; SIGNAL SUCCESS
RET
;
; IDE_GETMED
@ -906,6 +914,20 @@ IDE_INITDEV:
LD DE,HB_TMPBUF ; POINT TO BUFFER
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
;
; DETERMINE IF CF DEVICE
LD HL,HB_TMPBUF ; FIRST WORD OF IDENTIFY DATA HAS CF FLAG
LD A,$8A ; FIRST BYTE OF MARKER IS $8A
CP (HL) ; COMPARE
JR NZ,IDE_INITDEV1 ; IF NO MATCH, NOT CF
INC HL
LD A,$84 ; SECOND BYTE OF MARKER IS $84
CP (HL) ; COMPARE
JR NZ,IDE_INITDEV1 ; IF NOT MATCH, NOT CF
IDE_DPTR(IDE_CFFLAG) ; POINT HL TO CF FLAG FIELD
LD A,$FF ; SET FLAG VALUE TO NON-ZERO (TRUE)
LD (HL),A ; SAVE IT
;
IDE_INITDEV1:
; GET DEVICE CAPACITY AND SAVE IT
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD
PUSH HL ; SAVE POINTER

6
Source/HBIOS/md.asm

@ -137,6 +137,12 @@ MD_GEOM1:
MD_DEVICE:
LD D,DIODEV_MD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
LD A,C ; PHYSICAL UNIT TO A
OR A ; SET FLAGS
LD C,%00100000 ; ASSUME ROM DISK ATTRIBUTES
JR Z,MD_DEVICE1 ; IF ZERO, IT IS ROM DISK, DONE
LD C,%00101000 ; USE RAM DISK ATTRIBUTES
MD_DEVICE1:
XOR A ; SIGNAL SUCCESS
RET
;

29
Source/HBIOS/ppide.asm

@ -197,6 +197,8 @@ PPIDE_DRVSLAVE .DB %11110000 ; LBA, SLAVE DEVICE
PPIDE_STAT .EQU 0 ; LAST STATUS (1 BYTE)
PPIDE_TYPE .EQU 1 ; DEVICE TYPE (1 BYTE)
PPIDE_CAPACITY .EQU 2 ; DEVICE CAPACITY (1 DWORD/4 BYTES)
PPIDE_CFFLAG .EQU 6 ; CF FLAG (1 BYTE), NON-ZERO=CF
;
; THE IDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL
; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING
@ -410,9 +412,16 @@ PPIDE_SENSE:
;
;
PPIDE_DEVICE:
LD D,DIODEV_PPIDE ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
LD D,DIODEV_PPIDE ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
PPIDE_DPTR(PPIDE_CFFLAG) ; POINT TO CF FLAG
LD A,(HL) ; GET FLAG
OR A ; SET ACCUM FLAGS
LD C,%00000000 ; ASSUME NON-REMOVABLE HARD DISK
JR Z,PPIDE_DEVICE1 ; IF Z, WE ARE DONE
LD C,%01001000 ; OTHERWISE REMOVABLE COMPACT FLASH
PPIDE_DEVICE1:
XOR A ; SIGNAL SUCCESS
RET
;
; IDE_GETMED
@ -985,6 +994,20 @@ PPIDE_INITDEV:
LD DE,HB_TMPBUF ; POINT TO BUFFER
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
;
; DETERMINE IF CF DEVICE
LD HL,HB_TMPBUF ; FIRST WORD OF IDENTIFY DATA HAS CF FLAG
LD A,$8A ; FIRST BYTE OF MARKER IS $8A
CP (HL) ; COMPARE
JR NZ,PPIDE_INITDEV1 ; IF NO MATCH, NOT CF
INC HL
LD A,$84 ; SECOND BYTE OF MARKER IS $84
CP (HL) ; COMPARE
JR NZ,PPIDE_INITDEV1 ; IF NOT MATCH, NOT CF
PPIDE_DPTR(PPIDE_CFFLAG) ; POINT HL TO CF FLAG FIELD
LD A,$FF ; SET FLAG VALUE TO NON-ZERO (TRUE)
LD (HL),A ; SAVE IT
;
PPIDE_INITDEV1:
; GET DEVICE CAPACITY AND SAVE IT
PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD
PUSH HL ; SAVE POINTER

10
Source/HBIOS/ppp.asm

@ -323,11 +323,18 @@ PPPCON_OST:
;
;
PPPCON_INITDEV:
PPPCON_QUERY:
CALL PANIC
;
;
;
PPPCON_QUERY:
LD DE,0
LD HL,0
XOR A
RET
;
;
;
PPPCON_DEVICE:
LD D,CIODEV_PPPCON ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
@ -583,6 +590,7 @@ PPPSD_RESET:
PPPSD_DEVICE:
LD D,DIODEV_PPPSD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD
XOR A ; SIGNAL SUCCESS
RET
;

10
Source/HBIOS/prp.asm

@ -198,11 +198,18 @@ PRPCON_OST1:
;
;
PRPCON_INITDEV:
PRPCON_QUERY:
CALL PANIC
;
;
;
PRPCON_QUERY:
LD DE,0
LD HL,0
XOR A
RET
;
;
;
PRPCON_DEVICE:
LD D,CIODEV_PRPCON ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
@ -445,6 +452,7 @@ PRPSD_RESET:
PRPSD_DEVICE:
LD D,DIODEV_PRPSD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD
XOR A ; SIGNAL SUCCESS
RET
;

1
Source/HBIOS/rf.asm

@ -127,6 +127,7 @@ RF_GEOM:
RF_DEVICE:
LD D,DIODEV_RF ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
LD C,%00110000 ; C := ATTRIBUTES, NON-REMOVALBE RAM FLOPPY
XOR A ; SIGNAL SUCCESS
RET
;

9
Source/HBIOS/scg.asm

@ -43,7 +43,7 @@ SCG_INIT:
LD C,CIODEV_SCG ; DEVICE TYPE
LD DE,0 ; UNIT DATA BLOB ADDRESS
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
LD (SCG_CIOUNIT),A ; SAVE IT LOCALLY
;LD (SCG_CIOUNIT),A ; SAVE IT LOCALLY
LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE
LD D,VDAEMU ; DEFAULT EMULATION
@ -103,8 +103,9 @@ SCG_VDAINI:
; INITIALIZE EMULATION
LD B,D ; EMULATION TYPE TO B
LD A,(SCG_CIOUNIT) ; CIO UNIT NUMBER
LD C,A ; ... IS PASSED IN C
;LD A,(SCG_CIOUNIT) ; CIO UNIT NUMBER
;LD C,A ; ... IS PASSED IN C
LD C,CIODEV_SCG ; PASS OUR DEVICE TYPE IN C
LD DE,SCG_DISPATCH ; DISPATCH ADDRESS TO DE
CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER
LD (SCG_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS
@ -597,7 +598,7 @@ SCG_BLKCPY3:
; SCG DRIVER - DATA
;==================================================================================================
;
SCG_CIOUNIT .DB $FF ; LOCAL COPY OF OUR CIO UNIT NUMBER
;SCG_CIOUNIT .DB $FF ; LOCAL COPY OF OUR CIO UNIT NUMBER
;
SCG_POS .DW 0 ; CURRENT DISPLAY POSITION
SCG_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR

1
Source/HBIOS/sd.asm

@ -511,6 +511,7 @@ SD_RESET:
SD_DEVICE:
LD D,DIODEV_SD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD
XOR A ; SIGNAL SUCCESS
RET
;

60
Source/HBIOS/tty.asm

@ -15,10 +15,14 @@
;
TTY_INIT:
; SAVE CALLING VDA DRIVER'S CIO UNIT NUMBER AND VDA DISPATCH ADDRESS
LD C,A ; VDA DRIVER'S CIO UNIT NUMBER
LD (TTY_CIOUNIT),A ; ... SAVED LOCALLY
LD C,A ; VDA DRIVER'S DEVICE TYPE
LD (TTY_DEVTYPE),A ; ... SAVED LOCALLY
LD (TTY_VDADISPADR),DE ; ALSO SAVE VDA DRIVER'S DISPATCH ADDRESS
LD DE,TTY_DISPATCH ; RETURN OUR DISPATCH ADDRESS
XOR A ; SIGNAL SUCCESS
RET ; RETURN
;
TTY_RESET:
; QUERY THE VIDEO DRIVER FOR SCREEN DIMENSIONS
LD B,BF_VDAQRY ; FUNCTION IS QUERY
LD HL,0 ; WE DO NOT WANT A COPY OF THE CHARACTER BITMAP DATA
@ -28,9 +32,7 @@ TTY_INIT:
LD DE,0 ; DE := 0, CURSOR TO HOME POSITION 0,0
LD (TTY_POS),DE ; SAVE CURSOR POSITION
;
LD DE,TTY_DISPATCH ; RETURN OUR DISPATCH ADDRESS
XOR A
RET
RET ; DONE
;
;
;
@ -43,65 +45,73 @@ TTY_VDADISPADR .EQU $ - 2
TTY_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,TTY_IN ; $30
JR Z,TTY_CIOIN ; $30
DEC A
JR Z,TTY_OUT ; $31
JR Z,TTY_CIOOUT ; $31
DEC A
JR Z,TTY_IST ; $32
JR Z,TTY_CIOIST ; $32
DEC A
JR Z,TTY_OST ; $33
JR Z,TTY_CIOOST ; $33
DEC A
JR Z,TTY_INITDEV ; $34
JR Z,TTY_CIOINIT ; $34
DEC A
JR Z,TTY_QUERY ; $35
JR Z,TTY_CIOQUERY ; $35
DEC A
JR Z,TTY_DEVICE ; $36
JR Z,TTY_CIODEVICE ; $36
CALL PANIC
;
;
;
TTY_IN:
TTY_CIOIN:
LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ
JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER
;
;
;
TTY_OUT:
TTY_CIOOUT:
CALL TTY_DOCHAR ; HANDLE THE CHARACTER (EMULATION ENGINE)
XOR A ; SIGNAL SUCCESS
RET
;
;
;
TTY_IST:
TTY_CIOIST:
LD B,BF_VDAKST ; SET FUNCTION TO KEYBOARD STATUS
JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER
;
;
;
TTY_OST:
TTY_CIOOST:
XOR A ; ZERO ACCUM
INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY
RET
;
;
;
TTY_INITDEV:
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
TTY_CIOINIT:
; SETUP AND FORWARD CALL TO PARENT VDA DRIVER'S VDAINIT FUNCTION
LD B,BF_VDAINI ; WE ARE FORWARDING TO VDAINIT FUNCTION
LD A,(TTY_DEVTYPE) ; GET DEVICE TYPE WE ARE EMULATING FOR
LD C,A ; AND PUT IT IN C
LD D,L ; TERMTYPE TO D
LD E,0 ; VIDEO MODE = 0
LD HL,0 ; NO BITMAP, LEAVE IT ALONG
JP TTY_VDADISP ; LET VDA DRIVER HANDLE IT FROM HERE
;
;
;
TTY_QUERY:
CALL PANIC ; NOT IMPLEMENTED
TTY_CIOQUERY:
LD DE,0
LD HL,0
XOR A
RET
;
;
;
TTY_DEVICE:
LD A,(TTY_CIOUNIT) ; PARENT VDA CIO UNIT
TTY_CIODEVICE:
LD A,(TTY_DEVTYPE) ; GET DEVICE TYPE WE ARE EMULATING FOR
LD D,A ; AND PASS BACK IN D
LD E,C ; E := PHYSICAL UNIT
LD E,C ; E := DEVICE NUMBER
XOR A ; SIGNAL SUCCESS
RET
;
@ -184,4 +194,4 @@ TTY_DIM:
TTY_COLS .DB 80 ; NUMBER OF COLUMNS ON SCREEN
TTY_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN
;
TTY_CIOUNIT .DB $FF ; CIO UNIT NUMBER OF PARENT VDA
TTY_DEVTYPE .DB $FF ; DEVICE TYPE OF PARENT VDA'S CIO DEVICE

18
Source/HBIOS/uart.asm

@ -250,11 +250,18 @@ UART0_OST:
RET
;
UART0_INITDEV:
UART0_QUERY:
CALL PANIC
;
;
;
UART0_QUERY:
LD DE,UART0BAUD >> 16
LD HL,UART0BAUD & $FFFF
XOR A
RET
;
;
;
UART0_DEVICE:
LD D,CIODEV_UART ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT
@ -355,11 +362,18 @@ UART1_OST:
RET
;
UART1_INITDEV:
UART1_QUERY:
CALL PANIC
;
;
;
UART1_QUERY:
LD DE,UART1BAUD >> 16
LD HL,UART1BAUD & $FFFF
XOR A
RET
;
;
;
UART1_DEVICE:
LD D,CIODEV_UART ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT

32
Source/HBIOS/util.asm

@ -83,6 +83,8 @@ PC_PRTCHR:
POP AF
RET
NEWLINE2:
CALL NEWLINE
NEWLINE:
CALL PC_CR
CALL PC_LF
@ -524,7 +526,7 @@ BYTE2BCD1:
DELAY: ; 17TS (FROM INVOKING CALL) |
LD A,(CPUSCL) ; 13TS |
; |
DELAY1: ; |
DELAY1: ; |
; --- LOOP = ((CPUSCL * 16) - 5) TS ------------+ |
DEC A ; 4TS | |
#IFDEF CPU_Z180 ; | |
@ -543,7 +545,7 @@ DELAY1: ; |
; IMPACT OF OVERHEAD DIMINISHES AS DE AND/OR CPU SPEED INCREASES
;
; CPU SCALER (CPUSCL) = (CPUHMZ - 2) FOR 16US OUTER LOOP COST
; NOTE: CPUSCL MUST BE >= 3!
; NOTE: CPUSCL MUST BE > 0!
;
; EXAMPLE: 8MHZ CPU, DE=6250 (DELAY GOAL IS .1 SEC OR 100,000US)
; INNER LOOP = ((16 * 6) - 5) = 91TS
@ -594,26 +596,28 @@ LDELAY:
; CPU SCALER := MAX(1, (PHIMHZ - 2))
;
DELAY_INIT:
;LD B,BF_SYSHCBGETB ; HB FUNC: GET HCB BYTE
;LD C,HCB_CPUMHZ ; CPU SPEED IN MHZ
;RST 08 ; DO IT
;LD A,E ; VALUE TO ACCUM
#IF (PLATFORM == PLT_UNA)
LD C,$F9 ; UBIOS FUNC=GET CPU INFO
RST 08 ; E := CPU MHZ
LD E,A ; PUT SPEED IN MHZ IN ACCUM
#ELSE
LD B,BF_SYSGET ; HBIOS FUNC=GET SYS INFO
LD C,BF_SYSGET_CPUINFO ; HBIOS SUBFUNC=GET CPU INFO
RST 08 ; CALL HBIOS, RST 08 NOT YET INSTALLED
LD A,L ; PUT SPEED IN MHZ IN ACCUM
SUB 2 ; ADJUST AS REQUIRED BY DELAY FUNCTIONS
LD (CPUSCL),A ; UPDATE CPU SCALER VALUE
CP 1 ; CHECK FOR MINIMUM VALUE ALLOWED
RET NC ; IF >= 1, WE ARE ALL DONE, RETURN
LD A,1 ; OTHERWISE, SET MIN VALUE
LD (CPUSCL),A ; AND SAVE IT
#ENDIF
SUB 2 ; ADJUST AS REQUIRED BY DELAY FUNCTIONS
LD (CPUSCL),A ; UPDATE CPU SCALER VALUE
CP 1 ; CHECK FOR MINIMUM VALUE ALLOWED
RET NC ; IF >= 1, WE ARE ALL DONE, RETURN
LD A,1 ; OTHERWISE, SET MIN VALUE
LD (CPUSCL),A ; AND SAVE IT
RET
#IF (CPUMHZ < 3)
CPUSCL .DB 1 ; CPU SCALER MUST BE > 0
CPUSCL .DB 1 ; CPU SCALER MUST BE > 0
#ELSE
CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ
CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ
#ENDIF
;
#ENDIF

9
Source/HBIOS/vdu.asm

@ -39,7 +39,7 @@ VDU_INIT:
LD C,CIODEV_VDU ; DEVICE TYPE
LD DE,0 ; UNIT DATA BLOB ADDRESS
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
LD (VDU_CIOUNIT),A ; SAVE IT LOCALLY
;LD (VDU_CIOUNIT),A ; SAVE IT LOCALLY
LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE
LD D,VDAEMU ; DEFAULT EMULATION
@ -99,8 +99,9 @@ VDU_VDAINI:
; INITIALIZE EMULATION
LD B,D ; EMULATION TYPE TO B
LD A,(VDU_CIOUNIT) ; CIO UNIT NUMBER
LD C,A ; ... IS PASSED IN C
;LD A,(VDU_CIOUNIT) ; CIO UNIT NUMBER
;LD C,A ; ... IS PASSED IN C
LD C,CIODEV_VDU ; PASS OUR DEVICE TYPE IN C
LD DE,VDU_DISPATCH ; DISPATCH ADDRESS TO DE
CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER
LD (VDU_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS
@ -468,7 +469,7 @@ VDU_RSCROLL:
; VDU DRIVER - DATA
;==================================================================================================
;
VDU_CIOUNIT .DB $FF ; LOCAL COPY OF OUR CIO UNIT NUMBER
;VDU_CIOUNIT .DB $FF ; LOCAL COPY OF OUR CIO UNIT NUMBER
;
VDU_POS .DW 0 ; CURRENT DISPLAY POSITION
VDU_OFFSET .DW 0 ; CURRENT DISPLAY POSITION

2
Source/HBIOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 8
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "2.8.0-alpha.0"
#DEFINE BIOSVER "2.8.0-pre.1"

Loading…
Cancel
Save