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 HBIOS Management Functions
========================== ==========================
GET ($05):
BC=Function/Subfunction A=Result
GET ($07):
BC=Function/Subfunction A=Result
Subfunctions: Subfunctions:
CIOCNT ($00): CIOCNT ($00):
BC=Function/Subfunction A=Result
E=Serial Unit Count
BC=Function/Subfunction A=Result
E=Serial Unit Count
DIOCNT ($10): 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 Serial Functions
================ ================
IN ($00): 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 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. will wait indefinitely for a character to be available.
OUT ($01): OUT ($01):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
E=Character to Output 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): IST ($02):
BC=Function/Unit A=Result
*E=# Bytes Pending
BC=Function/Unit A=Result
*E=# Bytes Pending
OST ($03): OST ($03):
BC=Function/Unit A=Result
*E=# Buffer Bytes Available
BC=Function/Unit A=Result
*E=# Buffer Bytes Available
INIT ($04): INIT ($04):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
DE=Line Characteristics DE=Line Characteristics
L=Terminal Type
QUERY ($05) 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): 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 Disk Functions
============== ==============
STATUS ($10): STATUS ($10):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
Return current status result code of specified unit. Does not clear Return current status result code of specified unit. Does not clear
the status. the status.
RESET ($11): RESET ($11):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
Reset the physical interface associated with the specified unit. Flag all units 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 associated with the interface for unit initialization at next I/O call. Clear
media identified unless locked. Reset result code of all associated units. media identified unless locked. Reset result code of all associated units.
SEEK ($12): SEEK ($12):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
D:7=Address Type (0=CHS, 1=LBA) D:7=Address Type (0=CHS, 1=LBA)
CHS: D:0-6=Head,E=Sector,HL=Track CHS: D:0-6=Head,E=Sector,HL=Track
LBA: DE:HL LBA: DE:HL
@ -92,7 +118,7 @@ SEEK ($12):
Physical seek is typically deferred until subsequent I/O operation. Physical seek is typically deferred until subsequent I/O operation.
READ ($13) / WRITE ($14) / VERIFY ($15): READ ($13) / WRITE ($14) / VERIFY ($15):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
HL=Buffer Address HL=Buffer Address
E=Block Count E=Block Count
@ -101,7 +127,7 @@ READ ($13) / WRITE ($14) / VERIFY ($15):
target sector is sector where error occurred. target sector is sector where error occurred.
FORMAT ($16): FORMAT ($16):
BC=Function/Unit A=Result
BC=Function/Unit A=Result
CHS: D=Head, HL=Cylinder CHS: D=Head, HL=Cylinder
E=Fill Byte E=Fill Byte
@ -112,87 +138,151 @@ FORMAT ($16):
*** Need to specify interleave/sector id's somehow. *** Need to specify interleave/sector id's somehow.
DEVICE ($17) 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. does not perform any I/O and succeeds even if the device is in an error state.
It does not reset the unit status. 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): 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 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, set, then perform media discovery or verification. If no media in device,
return no media error. return no media error.
DEFMED ($19): DEFMED ($19):
BC=Function/Unit A=Result
E=Media ID (legacy)
BC=Function/Unit A=Result
E=Media ID (legacy)
Define media in unit. Define media in unit.
CAPACITY ($1A): 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. Return device capacity information.
If media is unknown, return error (no media) If media is unknown, return error (no media)
GEOMETRY ($1B): 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. Return device geometry information.
If media is unknown, return error (no media) If media is unknown, return error (no media)
INFO ($1F): INFO ($1F):
BC=Function/Sub-function A=Result
BC=Function/Sub-function A=Result
C=0: Report total unit count in system: 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 0: RAM- RAMdrive on the Z180 SBC Mark IV board
LBASupported UserAddressableSectors 832 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: ANSI_INIT:
; SAVE INCOMING VDA DISPATCH ADDRESS ; 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 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 ; QUERY THE VIDEO DRIVER FOR SCREEN DIMENSIONS
LD B,BF_VDAQRY ; FUNCTION IS QUERY LD B,BF_VDAQRY ; FUNCTION IS QUERY
LD HL,0 ; WE DO NOT WANT A COPY OF THE CHARACTER BITMAP DATA 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 INC HL ; POINT TO NEXT BYTE
DJNZ ANSI_INIT2 ; LOOP TILL ALL BYTES DONE DJNZ ANSI_INIT2 ; LOOP TILL ALL BYTES DONE
; ;
LD DE,ANSI_DISPATCH ; RETURN OUR DISPATCH ADDRESS
XOR A
RET RET
; ;
; ;
@ -78,21 +81,21 @@ ANSI_VDADISPADR .EQU $ - 2
; ;
; ;
ANSI_DISPATCH: 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 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 CALL PANIC
; ;
;================================================================================================== ;==================================================================================================
@ -101,12 +104,12 @@ ANSI_DISPATCH:
; ;
; READ A CHARACTER ; READ A CHARACTER
; ;
ANSI_IN: ; HANDLE INPUT REQUEST
ANSI_CIOIN: ; HANDLE INPUT REQUEST
; ;
; RETURN QUEUED DATA IF WE HAVE ANY ; RETURN QUEUED DATA IF WE HAVE ANY
LD A,(ANSI_QLEN) ; GET THE CURRENT QUEUE LENGTH LD A,(ANSI_QLEN) ; GET THE CURRENT QUEUE LENGTH
OR A ; SET FLAGS 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 DEC A ; DECREMENT THE QUEUE LENGTH
LD (ANSI_QLEN),A ; AND SAVE IT LD (ANSI_QLEN),A ; AND SAVE IT
LD HL,(ANSI_QPTR) ; GET THE QUEUE POINTER LD HL,(ANSI_QPTR) ; GET THE QUEUE POINTER
@ -117,44 +120,44 @@ ANSI_IN: ; HANDLE INPUT REQUEST
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; DONE RET ; DONE
; ;
ANSI_IN1: ; PERFORM ACTUAL KEYBOARD INPUT
ANSI_CIOIN1: ; PERFORM ACTUAL KEYBOARD INPUT
LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ
CALL ANSI_VDADISP ; CALL VDA DISPATCHER CALL ANSI_VDADISP ; CALL VDA DISPATCHER
LD A,E ; CHARACTER READ INTO A LD A,E ; CHARACTER READ INTO A
BIT 7,A ; TEST HIGH BIT 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 XOR A ; OTHERWISE, SIGNAL SUCCESS
RET ; AND RETURN THE KEY RET ; AND RETURN THE KEY
; ;
ANSI_IN2: ; HANDLE SPECIAL KEY
ANSI_CIOIN2: ; HANDLE SPECIAL KEY
CALL ANSI_KDISP ; IF $80 OR HIGHER, DISPATCH CALL ANSI_KDISP ; IF $80 OR HIGHER, DISPATCH
JR ANSI_IN ; AND LOOP
JR ANSI_CIOIN ; AND LOOP
; ;
; WRITE A CHARACTER W/ EMULATION ; 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 PUSH HL ; PUT IT ON STACK
LD A,E ; GET THE INCOMING CHARACTER LD A,E ; GET THE INCOMING CHARACTER
CP $20 ; $00-$1F IS C0 CP $20 ; $00-$1F IS C0
JP C,ANSI_C0DISP ; IF C0, DO C0 DISPATCH JP C,ANSI_C0DISP ; IF C0, DO C0 DISPATCH
CP $80 ; $20-$7F 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 CP $A0 ; $80-$9F IS C1
JP C,ANSI_C1DISP ; IF C1, DO C1 DISPATCH 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 LD HL,(ANSI_STATE) ; LOAD THE CURRENT STATE
JP (HL) ; DO IT JP (HL) ; DO IT
; CALL JPHL ; DO IT ; CALL JPHL ; DO IT
; ;
ANSI_OUT2: ; SET RESULT AND RETURN
ANSI_CIOOUT2: ; SET RESULT AND RETURN
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET RET
; ;
; CHECK INPUT STATUS ; CHECK INPUT STATUS
; ;
ANSI_IST: ; CHECK QUEUE FIRST
ANSI_CIOIST: ; CHECK QUEUE FIRST
LD A,(ANSI_QLEN) ; GET CURRENT QUEUE LENGTH LD A,(ANSI_QLEN) ; GET CURRENT QUEUE LENGTH
OR A ; SET FLAGS OR A ; SET FLAGS
RET NZ ; RETURN IF CHAR(S) WAITING RET NZ ; RETURN IF CHAR(S) WAITING
@ -170,7 +173,7 @@ ANSI_IST: ; CHECK QUEUE FIRST
CALL ANSI_VDADISP ; DO IT CALL ANSI_VDADISP ; DO IT
LD A,E ; CHARACTER READ TO A LD A,E ; CHARACTER READ TO A
BIT 7,A ; TEST HIGH BIT 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 ; REGULAR CHARACTER RECEIVED, QUEUE IT AND RETURN CHARS WAITING STATUS
LD HL,ANSI_QUEUE ; SET HL TO START OF QUEUE LD HL,ANSI_QUEUE ; SET HL TO START OF QUEUE
@ -180,35 +183,43 @@ ANSI_IST: ; CHECK QUEUE FIRST
XOR A ; ZERO ACCUM XOR A ; ZERO ACCUM
INC A ; ASSUM := 1 (NUM CHARS IN QUEUE) INC A ; ASSUM := 1 (NUM CHARS IN QUEUE)
LD (ANSI_QLEN),A ; SAVE NEW QUEUE LEN 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 CALL ANSI_KDISP ; DO SPECIAL KEY HANDLING
JR ANSI_IST ; REPEAT
JR ANSI_CIOIST ; REPEAT
; ;
; CHECK OUTPUT STATUS ; CHECK OUTPUT STATUS
; ;
ANSI_OST: ; VIDEO OUTPUT IS *ALWAYS* READY
ANSI_CIOOST: ; VIDEO OUTPUT IS *ALWAYS* READY
XOR A ; ZERO ACCUM XOR A ; ZERO ACCUM
INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY
RET RET
; ;
; INITIALIZE ; 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 ; QUERY STATUS
; ;
ANSI_QUERY:
CALL PANIC ; NOT IMPLEMENTED
ANSI_CIOQUERY:
LD DE,0
LD HL,0
XOR A
RET RET
; ;
; REPORT DEVICE ; 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 D,A ; AND PASS BACK IN D
LD E,C ; E := PHYSICAL UNIT LD E,C ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
@ -338,7 +349,7 @@ ANSI_ESCDISP1: ; NORMAL ESCAPE DISPATCHING, NO INT CHARACTER
; ;
ANSI_ESCDISP1A: ; CONTINUE NORMAL ESCAPE SEQ DISPATCHING ANSI_ESCDISP1A: ; CONTINUE NORMAL ESCAPE SEQ DISPATCHING
CP 'c' ; RIS: RESET TO INITIAL STATE 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 JP ANSI_UNK ; UNKNOWN, ABORT
; ;
ANSI_ESCDISP2: ; ESC DISPATCHING FOR '#' INT CHAR 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_PARLST .FILL 16,0 ; PARAMETER VALUE LIST (UP TO 16 BYTE VALUES)
ANSI_VARLEN .EQU $ - ANSI_VARS 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_INITDEV:
ASCI0_QUERY:
CALL PANIC CALL PANIC
; ;
; ;
; ;
ASCI0_QUERY:
LD DE,ASCI0BAUD >> 16
LD HL,ASCI0BAUD & $FFFF
XOR A
RET
;
;
;
ASCI0_DEVICE: ASCI0_DEVICE:
LD D,CIODEV_ASCI ; D := DEVICE TYPE LD D,CIODEV_ASCI ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT LD E,C ; E := PHYSICAL UNIT
@ -313,11 +320,18 @@ ASCI1_OST:
; ;
; ;
ASCI1_INITDEV: ASCI1_INITDEV:
ASCI1_QUERY:
CALL PANIC CALL PANIC
; ;
; ;
; ;
ASCI1_QUERY:
LD DE,ASCI1BAUD >> 16
LD HL,ASCI1BAUD & $FFFF
XOR A
RET
;
;
;
ASCI1_DEVICE: ASCI1_DEVICE:
LD D,CIODEV_ASCI ; D := DEVICE TYPE LD D,CIODEV_ASCI ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT LD E,C ; E := PHYSICAL UNIT

9
Source/HBIOS/cvdu.asm

@ -42,7 +42,7 @@ CVDU_INIT:
LD C,CIODEV_CVDU ; DEVICE TYPE LD C,CIODEV_CVDU ; DEVICE TYPE
LD DE,0 ; UNIT DATA BLOB ADDRESS LD DE,0 ; UNIT DATA BLOB ADDRESS
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED 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 (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE
LD D,VDAEMU ; DEFAULT EMULATION LD D,VDAEMU ; DEFAULT EMULATION
@ -102,8 +102,9 @@ CVDU_VDAINI:
; INITIALIZE EMULATION ; INITIALIZE EMULATION
LD B,D ; EMULATION TYPE TO B 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 LD DE,CVDU_DISPATCH ; DISPATCH ADDRESS TO DE
CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER
LD (CVDU_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS LD (CVDU_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS
@ -649,7 +650,7 @@ CVDU_BLKCPY1:
; CVDU DRIVER - DATA ; 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_ATTR .DB 0 ; CURRENT COLOR
CVDU_POS .DW 0 ; CURRENT DISPLAY POSITION CVDU_POS .DW 0 ; CURRENT DISPLAY POSITION

15
Source/HBIOS/fd.asm

@ -410,6 +410,21 @@ FD_DEFMED:
FD_DEVICE: FD_DEVICE:
LD D,DIODEV_FD ; D := DEVICE TYPE LD D,DIODEV_FD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT 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 XOR A ; SIGNAL SUCCESS
RET RET
; ;

395
Source/HBIOS/hbios.asm

@ -589,6 +589,9 @@ INITSYS1:
#ENDIF #ENDIF
; ;
INITSYS2: INITSYS2:
;
CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE
;
RET RET
; ;
;================================================================================================== ;==================================================================================================
@ -1070,7 +1073,7 @@ RTC_DISPATCH:
; TO THE CORRRECT EMULATION MODULE. ; TO THE CORRRECT EMULATION MODULE.
; ;
; B: EMULATION TYPE ID (1=TTY, 2=ANSI, ETC.) ; 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 ; DE: VDA DRIVER'S DISPATCH ADDRESS
; ;
; ;
@ -1317,7 +1320,7 @@ SYS_GETCPUINFO:
; ;
SYS_GETMEMINFO: SYS_GETMEMINFO:
LD D,ROMSIZE / 32 LD D,ROMSIZE / 32
LD D,RAMSIZE / 32
LD E,RAMSIZE / 32
XOR A XOR A
RET RET
; ;
@ -1981,6 +1984,391 @@ PRTD3M3:
RET 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) ; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED)
;================================================================================================== ;==================================================================================================
; ;
@ -2096,8 +2484,6 @@ IDLECOUNT .DB 0
; .DW 0 ; LBA LOW WORD ; .DW 0 ; LBA LOW WORD
; .DW 0 ; LBA HIGH WORD ; .DW 0 ; LBA HIGH WORD
; ;
; DISK DEVICE/UNIT ID
;HSTDSK .DB 0 ; DISK DEVICE/UNIT ID
; FULL 32 BIT LBA ; FULL 32 BIT LBA
HSTLBA .EQU $ ; REFERS TO START OF 32-BIT LBA HSTLBA .EQU $ ; REFERS TO START OF 32-BIT LBA
; LBA LOW WORD -OR- TRACK ; LBA LOW WORD -OR- TRACK
@ -2109,7 +2495,6 @@ HSTSEC .DB 0 ; SECTOR (0-255)
HSTHEAD .DB 0 ; HEAD (0-255) HSTHEAD .DB 0 ; HEAD (0-255)
; ;
DIOBUF .DW 0 ; PTR TO CURRENT DISK XFR BUFFER 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 HB_INTSTKSAV .DW 0 ; SAVED STACK POINTER DURING INT PROCESSING
.FILL $40,$FF ; 32 ENTRY STACK FOR INTERRUPT 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_SYSVER .EQU BF_SYS + 6 ; GET HBIOS VERSION
BF_SYSGET .EQU BF_SYS + 7 ; GET HBIOS INFO BF_SYSGET .EQU BF_SYS + 7 ; GET HBIOS INFO
BF_SYSSET .EQU BF_SYS + 8 ; SET HBIOS PARAMETERS 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_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT
BF_SYSGET_DIOCNT .EQU $10 ; GET DISK 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_BOOTINFO .EQU $E0 ; GET BOOT INFORMATION
BF_SYSGET_CPUINFO .EQU $F0 ; GET CPU INFORMATION BF_SYSGET_CPUINFO .EQU $F0 ; GET CPU INFORMATION
BF_SYSGET_MEMINFO .EQU $F1 ; GET MEMORY CAPACTITY INFO BF_SYSGET_MEMINFO .EQU $F1 ; GET MEMORY CAPACTITY INFO

1
Source/HBIOS/hdsk.asm

@ -129,6 +129,7 @@ HDSK_GEOM:
HDSK_DEVICE: HDSK_DEVICE:
LD D,DIODEV_HDSK ; D := DEVICE TYPE LD D,DIODEV_HDSK ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT LD E,C ; E := PHYSICAL UNIT
LD C,%00000000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET 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_STAT .EQU 0 ; LAST STATUS (1 BYTE)
IDE_TYPE .EQU 1 ; DEVICE TYPE (1 BYTE) IDE_TYPE .EQU 1 ; DEVICE TYPE (1 BYTE)
IDE_CAPACITY .EQU 2 ; DEVICE CAPACITY (1 DWORD/4 BYTES) 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 ; THE IDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL
; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING ; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING
@ -395,9 +396,16 @@ IDE_STATUS:
; ;
; ;
IDE_DEVICE: 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 RET
; ;
; IDE_GETMED ; IDE_GETMED
@ -906,6 +914,20 @@ IDE_INITDEV:
LD DE,HB_TMPBUF ; POINT TO BUFFER LD DE,HB_TMPBUF ; POINT TO BUFFER
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING 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 ; GET DEVICE CAPACITY AND SAVE IT
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD IDE_DPTR(IDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD
PUSH HL ; SAVE POINTER PUSH HL ; SAVE POINTER

6
Source/HBIOS/md.asm

@ -137,6 +137,12 @@ MD_GEOM1:
MD_DEVICE: MD_DEVICE:
LD D,DIODEV_MD ; D := DEVICE TYPE LD D,DIODEV_MD ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT 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 XOR A ; SIGNAL SUCCESS
RET 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_STAT .EQU 0 ; LAST STATUS (1 BYTE)
PPIDE_TYPE .EQU 1 ; DEVICE TYPE (1 BYTE) PPIDE_TYPE .EQU 1 ; DEVICE TYPE (1 BYTE)
PPIDE_CAPACITY .EQU 2 ; DEVICE CAPACITY (1 DWORD/4 BYTES) 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 ; THE IDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL
; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING ; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING
@ -410,9 +412,16 @@ PPIDE_SENSE:
; ;
; ;
PPIDE_DEVICE: 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 RET
; ;
; IDE_GETMED ; IDE_GETMED
@ -985,6 +994,20 @@ PPIDE_INITDEV:
LD DE,HB_TMPBUF ; POINT TO BUFFER LD DE,HB_TMPBUF ; POINT TO BUFFER
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING 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 ; GET DEVICE CAPACITY AND SAVE IT
PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD
PUSH HL ; SAVE POINTER PUSH HL ; SAVE POINTER

10
Source/HBIOS/ppp.asm

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

10
Source/HBIOS/prp.asm

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

1
Source/HBIOS/rf.asm

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

9
Source/HBIOS/scg.asm

@ -43,7 +43,7 @@ SCG_INIT:
LD C,CIODEV_SCG ; DEVICE TYPE LD C,CIODEV_SCG ; DEVICE TYPE
LD DE,0 ; UNIT DATA BLOB ADDRESS LD DE,0 ; UNIT DATA BLOB ADDRESS
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED 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 (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE
LD D,VDAEMU ; DEFAULT EMULATION LD D,VDAEMU ; DEFAULT EMULATION
@ -103,8 +103,9 @@ SCG_VDAINI:
; INITIALIZE EMULATION ; INITIALIZE EMULATION
LD B,D ; EMULATION TYPE TO B 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 LD DE,SCG_DISPATCH ; DISPATCH ADDRESS TO DE
CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER
LD (SCG_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS LD (SCG_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS
@ -597,7 +598,7 @@ SCG_BLKCPY3:
; SCG DRIVER - DATA ; 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_POS .DW 0 ; CURRENT DISPLAY POSITION
SCG_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR SCG_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR

1
Source/HBIOS/sd.asm

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

60
Source/HBIOS/tty.asm

@ -15,10 +15,14 @@
; ;
TTY_INIT: TTY_INIT:
; SAVE CALLING VDA DRIVER'S CIO UNIT NUMBER AND VDA DISPATCH ADDRESS ; 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 (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 ; QUERY THE VIDEO DRIVER FOR SCREEN DIMENSIONS
LD B,BF_VDAQRY ; FUNCTION IS QUERY LD B,BF_VDAQRY ; FUNCTION IS QUERY
LD HL,0 ; WE DO NOT WANT A COPY OF THE CHARACTER BITMAP DATA 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 DE,0 ; DE := 0, CURSOR TO HOME POSITION 0,0
LD (TTY_POS),DE ; SAVE CURSOR POSITION 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: TTY_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION AND $0F ; ISOLATE SUB-FUNCTION
JR Z,TTY_IN ; $30
JR Z,TTY_CIOIN ; $30
DEC A DEC A
JR Z,TTY_OUT ; $31
JR Z,TTY_CIOOUT ; $31
DEC A DEC A
JR Z,TTY_IST ; $32
JR Z,TTY_CIOIST ; $32
DEC A DEC A
JR Z,TTY_OST ; $33
JR Z,TTY_CIOOST ; $33
DEC A DEC A
JR Z,TTY_INITDEV ; $34
JR Z,TTY_CIOINIT ; $34
DEC A DEC A
JR Z,TTY_QUERY ; $35
JR Z,TTY_CIOQUERY ; $35
DEC A DEC A
JR Z,TTY_DEVICE ; $36
JR Z,TTY_CIODEVICE ; $36
CALL PANIC CALL PANIC
; ;
; ;
; ;
TTY_IN:
TTY_CIOIN:
LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ
JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER
; ;
; ;
; ;
TTY_OUT:
TTY_CIOOUT:
CALL TTY_DOCHAR ; HANDLE THE CHARACTER (EMULATION ENGINE) CALL TTY_DOCHAR ; HANDLE THE CHARACTER (EMULATION ENGINE)
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET RET
; ;
; ;
; ;
TTY_IST:
TTY_CIOIST:
LD B,BF_VDAKST ; SET FUNCTION TO KEYBOARD STATUS LD B,BF_VDAKST ; SET FUNCTION TO KEYBOARD STATUS
JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER
; ;
; ;
; ;
TTY_OST:
TTY_CIOOST:
XOR A ; ZERO ACCUM XOR A ; ZERO ACCUM
INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY
RET 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 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 D,A ; AND PASS BACK IN D
LD E,C ; E := PHYSICAL UNIT
LD E,C ; E := DEVICE NUMBER
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET RET
; ;
@ -184,4 +194,4 @@ TTY_DIM:
TTY_COLS .DB 80 ; NUMBER OF COLUMNS ON SCREEN TTY_COLS .DB 80 ; NUMBER OF COLUMNS ON SCREEN
TTY_ROWS .DB 24 ; NUMBER OF ROWS 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 RET
; ;
UART0_INITDEV: UART0_INITDEV:
UART0_QUERY:
CALL PANIC CALL PANIC
; ;
; ;
; ;
UART0_QUERY:
LD DE,UART0BAUD >> 16
LD HL,UART0BAUD & $FFFF
XOR A
RET
;
;
;
UART0_DEVICE: UART0_DEVICE:
LD D,CIODEV_UART ; D := DEVICE TYPE LD D,CIODEV_UART ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT LD E,C ; E := PHYSICAL UNIT
@ -355,11 +362,18 @@ UART1_OST:
RET RET
; ;
UART1_INITDEV: UART1_INITDEV:
UART1_QUERY:
CALL PANIC CALL PANIC
; ;
; ;
; ;
UART1_QUERY:
LD DE,UART1BAUD >> 16
LD HL,UART1BAUD & $FFFF
XOR A
RET
;
;
;
UART1_DEVICE: UART1_DEVICE:
LD D,CIODEV_UART ; D := DEVICE TYPE LD D,CIODEV_UART ; D := DEVICE TYPE
LD E,C ; E := PHYSICAL UNIT LD E,C ; E := PHYSICAL UNIT

32
Source/HBIOS/util.asm

@ -83,6 +83,8 @@ PC_PRTCHR:
POP AF POP AF
RET RET
NEWLINE2:
CALL NEWLINE
NEWLINE: NEWLINE:
CALL PC_CR CALL PC_CR
CALL PC_LF CALL PC_LF
@ -524,7 +526,7 @@ BYTE2BCD1:
DELAY: ; 17TS (FROM INVOKING CALL) | DELAY: ; 17TS (FROM INVOKING CALL) |
LD A,(CPUSCL) ; 13TS | LD A,(CPUSCL) ; 13TS |
; | ; |
DELAY1: ; |
DELAY1: ; |
; --- LOOP = ((CPUSCL * 16) - 5) TS ------------+ | ; --- LOOP = ((CPUSCL * 16) - 5) TS ------------+ |
DEC A ; 4TS | | DEC A ; 4TS | |
#IFDEF CPU_Z180 ; | | #IFDEF CPU_Z180 ; | |
@ -543,7 +545,7 @@ DELAY1: ; |
; IMPACT OF OVERHEAD DIMINISHES AS DE AND/OR CPU SPEED INCREASES ; IMPACT OF OVERHEAD DIMINISHES AS DE AND/OR CPU SPEED INCREASES
; ;
; CPU SCALER (CPUSCL) = (CPUHMZ - 2) FOR 16US OUTER LOOP COST ; 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) ; EXAMPLE: 8MHZ CPU, DE=6250 (DELAY GOAL IS .1 SEC OR 100,000US)
; INNER LOOP = ((16 * 6) - 5) = 91TS ; INNER LOOP = ((16 * 6) - 5) = 91TS
@ -594,26 +596,28 @@ LDELAY:
; CPU SCALER := MAX(1, (PHIMHZ - 2)) ; CPU SCALER := MAX(1, (PHIMHZ - 2))
; ;
DELAY_INIT: 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 B,BF_SYSGET ; HBIOS FUNC=GET SYS INFO
LD C,BF_SYSGET_CPUINFO ; HBIOS SUBFUNC=GET CPU INFO LD C,BF_SYSGET_CPUINFO ; HBIOS SUBFUNC=GET CPU INFO
RST 08 ; CALL HBIOS, RST 08 NOT YET INSTALLED RST 08 ; CALL HBIOS, RST 08 NOT YET INSTALLED
LD A,L ; PUT SPEED IN MHZ IN ACCUM 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 RET
#IF (CPUMHZ < 3) #IF (CPUMHZ < 3)
CPUSCL .DB 1 ; CPU SCALER MUST BE > 0
CPUSCL .DB 1 ; CPU SCALER MUST BE > 0
#ELSE #ELSE
CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ
CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ
#ENDIF #ENDIF
; ;
#ENDIF #ENDIF

9
Source/HBIOS/vdu.asm

@ -39,7 +39,7 @@ VDU_INIT:
LD C,CIODEV_VDU ; DEVICE TYPE LD C,CIODEV_VDU ; DEVICE TYPE
LD DE,0 ; UNIT DATA BLOB ADDRESS LD DE,0 ; UNIT DATA BLOB ADDRESS
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED 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 (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE
LD D,VDAEMU ; DEFAULT EMULATION LD D,VDAEMU ; DEFAULT EMULATION
@ -99,8 +99,9 @@ VDU_VDAINI:
; INITIALIZE EMULATION ; INITIALIZE EMULATION
LD B,D ; EMULATION TYPE TO B 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 LD DE,VDU_DISPATCH ; DISPATCH ADDRESS TO DE
CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER
LD (VDU_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS LD (VDU_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS
@ -468,7 +469,7 @@ VDU_RSCROLL:
; VDU DRIVER - DATA ; 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_POS .DW 0 ; CURRENT DISPLAY POSITION
VDU_OFFSET .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 RMN 8
#DEFINE RUP 0 #DEFINE RUP 0
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "2.8.0-alpha.0"
#DEFINE BIOSVER "2.8.0-pre.1"

Loading…
Cancel
Save