mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
123 lines
2.8 KiB
NASM
123 lines
2.8 KiB
NASM
title 'Boot loader module for CP/M 3.0'
|
|
|
|
true equ -1
|
|
false equ not true
|
|
|
|
banked equ true
|
|
|
|
public ?init,?ldccp,?rlccp,?time
|
|
extrn ?pmsg,?conin
|
|
extrn @civec,@covec,@aivec,@aovec,@lovec
|
|
extrn @cbnk,?bnksl
|
|
|
|
maclib ports
|
|
maclib z80
|
|
|
|
bdos equ 5
|
|
|
|
if banked
|
|
tpa$bank equ 1
|
|
else
|
|
tpa$bank equ 0
|
|
endif
|
|
|
|
dseg ; init done from banked memory
|
|
|
|
?init:
|
|
lxi h,08000h ! shld @civec ! shld @covec ; assign console to CRT:
|
|
lxi h,04000h ! shld @lovec ; assign printer to LPT:
|
|
lxi h,02000h ! shld @aivec ! shld @aovec ; assign AUX to CRT1:
|
|
lxi h,init$table ! call out$blocks ; set up misc hardware
|
|
lxi h,signon$msg ! call ?pmsg ; print signon message
|
|
ret
|
|
|
|
out$blocks:
|
|
mov a,m ! ora a ! rz ! mov b,a
|
|
inx h ! mov c,m ! inx h
|
|
outir
|
|
jmp out$blocks
|
|
|
|
|
|
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:).
|
|
|
|
|
|
?ldccp:
|
|
; First time, load the A:CCP.COM file into TPA
|
|
xra a ! sta ccp$fcb+15 ; zero extent
|
|
lxi h,0 ! shld fcb$nr ; start at beginning of file
|
|
lxi d,ccp$fcb ! call open ; open file containing CCP
|
|
inr a ! jz no$CCP ; error if no file...
|
|
lxi d,0100h ! call setdma ; start of TPA
|
|
lxi d,128 ! call setmulti ; allow up to 16k bytes
|
|
lxi d,ccp$fcb ! call read ; load the thing
|
|
; now,
|
|
; copy CCP to bank 0 for reloading
|
|
lxi h,0100h ! lxi b,0C80h ; clone 3K, just in case
|
|
lda @cbnk ! push psw ; save current bank
|
|
ld$1:
|
|
mvi a,tpa$bank ! call ?bnksl ; select TPA
|
|
mov a,m ! push psw ; get a byte
|
|
mvi a,2 ! call ?bnksl ; select extra bank
|
|
pop psw ! mov m,a ; save the byte
|
|
inx h ! dcx b ; bump pointer, drop count
|
|
mov a,b ! ora c ; test for done
|
|
jnz ld$1
|
|
pop psw ! call ?bnksl ; restore original bank
|
|
ret
|
|
|
|
no$CCP: ; here if we couldn't find the file
|
|
lxi h,ccp$msg ! call ?pmsg ; report this...
|
|
call ?conin ; get a response
|
|
jmp ?ldccp ; and try again
|
|
|
|
|
|
?rlccp:
|
|
lxi h,0100h ! lxi b,0C00h ; clone 3K
|
|
rl$1:
|
|
mvi a,2 ! call ?bnksl ; select extra bank
|
|
mov a,m ! push psw ; get a byte
|
|
mvi a,tpa$bank ! call ?bnksl ; select TPA
|
|
pop psw ! mov m,a ; save the byte
|
|
inx h ! dcx b ; bump pointer, drop count
|
|
mov a,b ! ora c ; test for done
|
|
jnz rl$1
|
|
ret
|
|
|
|
; No external clock.
|
|
?time:
|
|
ret
|
|
|
|
; CP/M BDOS Function Interfaces
|
|
|
|
open:
|
|
mvi c,15 ! jmp bdos ; open file control block
|
|
|
|
setdma:
|
|
mvi c,26 ! jmp bdos ; set data transfer address
|
|
|
|
setmulti:
|
|
mvi c,44 ! jmp bdos ; set record count
|
|
|
|
read:
|
|
mvi c,20 ! jmp bdos ; read records
|
|
|
|
|
|
signon$msg db 13,10,13,10,'CP/M Version 3.0, sample BIOS',13,10,0
|
|
|
|
ccp$msg db 13,10,'BIOS Err on A: No CCP.COM file',0
|
|
|
|
|
|
ccp$fcb db 1,'CCP ','COM',0,0,0,0
|
|
ds 16
|
|
fcb$nr db 0,0,0
|
|
|
|
init$table db 3,p$zpio$3a,0CFh,0FFh,07h ; set up config port
|
|
db 3,p$zpio$3b,0CFh,000h,07h ; set up bank port
|
|
db 1,p$bank$select,0 ; select bank 0
|
|
db 0 ; end of init$table
|
|
|
|
end
|