Files
Digital-Research-Source-Code/CPM OPERATING SYSTEMS/CPM 3.X/CPM 3.0/SOURCE/boot.asm
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

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