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

176 lines
3.1 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; xsub loads below ccp, and feeds command lines to
; programs which read buffered input
;
bias equ 0000h ;bias for relocation
base equ 0ffffh ;no intercepts below here
wboot equ 0000h
bdos equ 0005h
bdosl equ bdos+1
dbuff equ 0080h
;
cr equ 0dh ;carriage return
lf equ 0ah ;line feed
modnum equ 14 ;module number position
pbuff equ 9 ;print buffer
rbuff equ 10 ;read buffer
openf equ 15 ;open file
closef equ 16 ;close file
delf equ 19 ;delete file
dreadf equ 20 ;disk read
dmaf equ 26 ;set dma function
;
;
org 0000h+bias
; initialize jmps to include xsub module
lxi h,wstart
shld wboot+1
lhld bdosl
shld rbdos+1 ;real bdos entry
lxi h,trap ;address to fill
shld bdosl ;jmp @0005 leads to trap
pop h ;ccp return address
shld ccpret
pchl ;back to ccp
;
rbdos: jmp 0000h ;filled in at initialization
;
wstart:
lxi sp,stack
mvi c,pbuff ;print message
lxi d,actmsg
call rbdos
lxi h,dbuff ;restore default buffer
shld udma
lxi h,trap
shld bdosl ;fixup low jump address
lhld ccpret ;back to ccp
pchl
actmsg: db cr,lf,'(xsub active)$'
;
trap: ;arrive here at each bdos call
pop h ;return address
push h ;back to stack
mov a,h ;high address
cpi base shr 8
jnc rbdos ;skip calls on bdos above here
mov a,c ;function number
cpi rbuff
jz rnbuff ;read next buffer
cpi dmaf ;set dma address?
jnz rbdos ;skip if not
xchg ;dma to hl
shld udma ;save it
xchg
jmp rbdos
;
setdma:
mvi c,dmaf
lxi d,combuf
call rbdos
ret
;
rsetdma:
mvi c,dmaf
lhld udma
xchg
call rbdos
ret
;
fbdos:
push b
push d
call setdma
pop d
pop b
call rbdos
push psw
call rsetdma
pop psw
ret
;
cksub: ;check for sub file present
mvi c,openf
lxi d,subfcb
call fbdos ;submit file present?
inr a ;00 if not present
ret
;
rnbuff:
push d ;command address
call cksub ;sub file present?
pop d
mvi c,rbuff
jz rbdos ;no sub file now
;
push d
lda subrc ;length of file
ora a ;zero?
jz rbdos ;skip if so
dcr a ;length - 1
sta subcr ;next to read
mvi c,dreadf
lxi d,subfcb
call fbdos ;read record
; now print the buffer with cr,lf
lxi h,combuf
mov e,m ;length
mvi d,0 ;high order 00
dad d ;to last character position
inx h
mvi m,cr
inx h
mvi m,lf
inx h
mvi m,'$'
mvi c,pbuff
lxi d,combuf+1
call rbdos ;to print it
pop h ;.max length
lxi d,combuf
ldax d ;how long?
cmp m ;cy if ok
jc movlin
mov a,m ;max length
stax d ;truncate length
movlin:
mov c,a ;length to c
inr c ;+1
inx h ;to length of line
rdloop:
ldax d ;next char
mov m,a
inx h
inx d
dcr c
jnz rdloop ;loop til copied
mvi c,closef
lxi d,subfcb
lxi h,modnum
dad d ;hl=fcb(modnum)
mvi m,0 ;=0 so acts as if written
lda subcr ;length of file
dcr a ;incremented by read op
sta subrc ;decrease file length
ora a ;at zero?
jnz fileop
mvi c,delf ;delete if at end
fileop: call fbdos
ret
;
subfcb:
db 1 ;a:
db '$$$ '
db 'SUB'
db 0,0,0
subrc:
ds 1
ds 16 ;map
subcr: ds 1
;
combuf: ds 131
udma: dw dbuff
ccpret: ds 2 ;ccp return address
ds 32 ;16 level stack
stack:
end