Browse Source

Merge pull request #32 from wwarthen/master

Incremental CP/M 3 Improvements
pull/50/head
b1ackmai1er 6 years ago
committed by GitHub
parent
commit
2ec195b9e8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      Source/CPM3/bioskrnl.asm
  2. 77
      Source/CPM3/boot.z80
  3. 52
      Source/CPM3/chario.z80

12
Source/CPM3/bioskrnl.asm

@ -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

77
Source/CPM3/boot.z80

@ -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 '?'

52
Source/CPM3/chario.z80

@ -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

Loading…
Cancel
Save