mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Merge pull request #32 from wwarthen/master
Incremental CP/M 3 Improvements
This commit is contained in:
@@ -188,20 +188,16 @@ set$jumps:
|
||||
sta 0 ! sta 5 ; set up jumps in page zero
|
||||
lxi h,?wboot ! shld 1 ; BIOS warm start entry
|
||||
lhld @MXTPA ! shld 6 ; BDOS system call entry
|
||||
|
||||
mvi a,JMP ! sta 8 ; set up HBIOS RST 08
|
||||
lxi h,0FFF0H ! shld 9 ; jump vector
|
||||
|
||||
;mvi a,3 ! sta 4 ; default drive is C:
|
||||
|
||||
|
||||
; xor a
|
||||
; ld hl,40h
|
||||
; ld b,16
|
||||
; ld b,10h
|
||||
;set$jumps1:
|
||||
; ld (hl),a
|
||||
; inc hl
|
||||
; djnz set$jumps1
|
||||
|
||||
|
||||
; Clear reserved area in page zero
|
||||
xra a
|
||||
lxi h,40h
|
||||
mvi b,10h
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
extrn @cbnk,?bnksl,?bank
|
||||
extrn @sysdr,@ccpdr
|
||||
extrn dph0
|
||||
extrn @dtbl
|
||||
extrn @dtbl,@ctbl
|
||||
|
||||
bdos equ 5
|
||||
|
||||
@@ -24,15 +24,9 @@ tpa$bank equ 0
|
||||
|
||||
?init:
|
||||
call ?mvinit
|
||||
; lxi h,08000h ! shld @civec ! shld @covec ; assign console to CRT:
|
||||
ld hl,8000H ; device 0
|
||||
ld (@civec),hl ; assign to console input
|
||||
ld (@covec),hl ; assign to console output
|
||||
; lxi h,04000h ! shld @lovec ; assign printer to LPT:
|
||||
; lxi h,02000h ! shld @aivec ! shld @aovec ; assign AUX to CRT1:
|
||||
; lxi h,signon$msg ! call ?pmsg ; print signon message
|
||||
ld hl,signon$msg ; signon message
|
||||
call ?pmsg ; print it
|
||||
call cinit ; char device init
|
||||
ld hl,signon$msg ; signon message
|
||||
call ?pmsg ; print it
|
||||
|
||||
if banked
|
||||
|
||||
@@ -59,19 +53,66 @@ init$1:
|
||||
init$2:
|
||||
; get boot disk unit and save it
|
||||
ld bc,0F8E0h ; HBIOS func: get boot info
|
||||
call 0FFF0h ; do it, D := boot unit
|
||||
rst 08 ; do it, D := boot unit
|
||||
ld a,d ; move to A
|
||||
ld (@bootdu),a ; save it
|
||||
|
||||
|
||||
call dinit
|
||||
ret
|
||||
|
||||
|
||||
cinit:
|
||||
; Setup CON: I/O vector based on HBIOS console device
|
||||
ld b,0FAh ; HBIOS Peek Function
|
||||
ld d,0 ; Bank 0 has HCB
|
||||
ld hl,112h ; Offset 112h is current console device
|
||||
rst 08 ; Call HBIOS, value in E
|
||||
push de ; save console unit value
|
||||
ld b,e ; Use as loop counter
|
||||
inc b ; ... but loop 1 extra time
|
||||
ld hl,0 ; Clear vector bitmap
|
||||
scf ; Set carry
|
||||
cinit$1:
|
||||
rr h ; Rotate carry flag
|
||||
rr l ; ... into correct vector position
|
||||
djnz cinit$1 ; loop as needed
|
||||
|
||||
;ld hl,8000H ; device 0
|
||||
ld (@civec),hl ; assign to console input
|
||||
ld (@covec),hl ; assign to console output
|
||||
|
||||
; Setup AUX: I/O vector if there are 2+ char devices in system
|
||||
ld bc,0F800h ; HBIOS GET Character Device Count
|
||||
rst 08 ; do it, count in E
|
||||
ld a,e ; device count to accum
|
||||
pop de ; recover console unit num to E
|
||||
cp 2 ; check for 2+ char devices
|
||||
jr c,cinit$3 ; if not, skip aux assignment
|
||||
or a ; check for zero
|
||||
ld hl,4000h ; assume aux on second char device
|
||||
jr nz,cinit$2 ; if console on unit 0, assumption good
|
||||
ld hl,8000h ; otherwise, aux goes to first char device
|
||||
cinit$2:
|
||||
;ld hl,4000H ; device 1
|
||||
ld (@aivec),hl ; assign to aux input
|
||||
ld (@aovec),hl ; assign to aux output
|
||||
cinit$3:
|
||||
; Truncate char table based on actual num of char devices
|
||||
rlca ; A still has char device count
|
||||
rlca ; * 8 for ctbl entry size
|
||||
rlca ; "
|
||||
ld hl,@ctbl ; Start of char table
|
||||
call addhla ; Skip used entries
|
||||
xor a ; Zero to accum
|
||||
ld (hl),0 ; Set table terminator
|
||||
|
||||
dinit:
|
||||
|
||||
; loop through all disk devices to count hard disk units
|
||||
ld b,0F8h ; SYS GET
|
||||
ld c,010h ; Disk Drive Unit Count
|
||||
call 0FFF0h ; e := disk unit count
|
||||
rst 08 ; e := disk unit count
|
||||
ld b,e ; count to b
|
||||
ld a,b ; count to a
|
||||
or a ; set flags
|
||||
@@ -94,7 +135,7 @@ dinit2:
|
||||
dinit3:
|
||||
push de ; save de (hard disk volume counter)
|
||||
ld b,017h ; hbios func: report device info
|
||||
call 0FFF0h ; call hbios, unit to c
|
||||
rst 08 ; call hbios, unit to c
|
||||
ld a,d ; device type to a
|
||||
pop de ; restore de
|
||||
cp 050h ; hard disk device?
|
||||
@@ -119,7 +160,7 @@ dinit5:
|
||||
; setup to enumerate devices to build drvmap
|
||||
ld b,0F8h ; SYS GET
|
||||
ld c,010h ; Disk Drive Unit Count
|
||||
call 0FFF0h ; e := disk unit count
|
||||
rst 08 ; e := disk unit count
|
||||
ld b,e ; count to b
|
||||
ld c,0 ; use c as device list index
|
||||
;ld hl,dph0 ; point to first dph
|
||||
@@ -129,7 +170,7 @@ dinit6: ; loop thru all units available
|
||||
push bc ; preserve loop control
|
||||
push hl ; preserve dph pointer
|
||||
ld b,017h ; hbios func: report device info
|
||||
call 0FFF0h ; call hbios, d := device type
|
||||
rst 08 ; call hbios, d := device type
|
||||
pop hl ; restore dph pointer
|
||||
pop bc ; get unit index back in c
|
||||
push bc ; resave loop control
|
||||
@@ -201,10 +242,10 @@ addhla:
|
||||
cseg ; boot loading most be done from resident memory
|
||||
|
||||
; This version of the boot loader loads the CCP from a file
|
||||
; called CCP.COM on the system drive (A:).
|
||||
; called CCP.COM on the system drive.
|
||||
|
||||
?ldccp:
|
||||
; First time, load the A:CCP.COM file into TPA
|
||||
; First time, load the CCP.COM file into TPA
|
||||
ld a,(@sysdr) ; get system boot drive
|
||||
inc a ; drive + 1 for FCB
|
||||
ld (ccp$fcb),a ; stuff into FCB
|
||||
@@ -345,7 +386,7 @@ signon$msg db 13,10,'CP/M v3.0'
|
||||
if banked
|
||||
db ' [BANKED]'
|
||||
endif
|
||||
db ', HBIOS v2.9.2',13,10,13,10,0
|
||||
db ' for RomWBW HBIOS v2.9.2',13,10,13,10,0
|
||||
|
||||
ccp$msg db 13,10,'BIOS Err on '
|
||||
ccp$msg$drv db '?'
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
; maclib ports ; define port addresses
|
||||
maclib modebaud.lib ; define mode bits and baud equates
|
||||
|
||||
max$devices equ 6
|
||||
;max$devices equ 6
|
||||
|
||||
cseg
|
||||
|
||||
@@ -47,7 +47,9 @@ max$devices equ 6
|
||||
|
||||
|
||||
?ci: ; character input
|
||||
ld bc,0000H ; unit 0, func 0 = CIN
|
||||
;ld bc,0000H ; unit 0, func 0 = CIN
|
||||
ld c,b ; Unit number to C
|
||||
ld b,00h ; HBIOS CIN Function
|
||||
rst 08 ; do it
|
||||
ld a,e ; put char in A
|
||||
ret ; done
|
||||
@@ -64,7 +66,9 @@ max$devices equ 6
|
||||
; ret
|
||||
|
||||
?cist: ; character input status
|
||||
ld bc,0200H ; unit 0, func 2 = IST
|
||||
;ld bc,0200H ; unit 0, func 2 = IST
|
||||
ld c,b ; Unit number to C
|
||||
ld b,02h ; HBIOS IST Function
|
||||
rst 08 ; do it
|
||||
or a ; set flags
|
||||
ret z ; return w/ ZF set if no char ready
|
||||
@@ -86,7 +90,9 @@ max$devices equ 6
|
||||
|
||||
?co: ; character output
|
||||
ld e,c ; char to E
|
||||
ld bc,0100H ; unit 0, func 1 = COUT
|
||||
;ld bc,0100H ; unit 0, func 1 = COUT
|
||||
ld c,b ; Unit number to C
|
||||
ld b,01h ; HBIOS COUT Function
|
||||
rst 08 ; do it
|
||||
ret ; done
|
||||
|
||||
@@ -111,7 +117,9 @@ max$devices equ 6
|
||||
; ret
|
||||
|
||||
?cost: ; character output status
|
||||
ld bc,0300H ; unit 0, func 3 = OST
|
||||
;ld bc,0300H ; unit 0, func 3 = OST
|
||||
ld c,b ; Unit number to C
|
||||
ld b,03h ; HBIOS OST Function
|
||||
rst 08 ; do it
|
||||
or a ; set flags
|
||||
ret z ; return w/ ZF set if not ready to send
|
||||
@@ -144,6 +152,39 @@ max$devices equ 6
|
||||
|
||||
|
||||
@ctbl db 'COM0 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 'COM1 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 'COM2 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 'COM3 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 'COM4 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 'COM5 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 'COM6 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 'COM7 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 'COM8 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 'COM9 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 'COM10 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 'COM11 '
|
||||
db mb$in$out+mb$serial+baud$none
|
||||
db baud$none
|
||||
db 0
|
||||
@@ -171,7 +212,6 @@ max$devices equ 6
|
||||
; db baud$none
|
||||
; db 0 ; table terminator
|
||||
|
||||
|
||||
;speed$table db 0,255,255,255,233,208,104,208,104,69,52,35,26,17,13,7
|
||||
;
|
||||
;serial$init$tbl
|
||||
|
||||
Reference in New Issue
Block a user