mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
Upload
Digital Research
This commit is contained in:
122
CPM OPERATING SYSTEMS/CPM 3.X/CPM 3.0/SOURCE/boot.asm
Normal file
122
CPM OPERATING SYSTEMS/CPM 3.X/CPM 3.0/SOURCE/boot.asm
Normal file
@@ -0,0 +1,122 @@
|
||||
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
|
||||
Reference in New Issue
Block a user