mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 00:14:25 +00:00
196 lines
3.2 KiB
NASM
196 lines
3.2 KiB
NASM
; xsub 'Extended Submit Facility' version 2.2
|
|
;
|
|
;
|
|
;
|
|
; 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
|
|
jmp start
|
|
ds 3
|
|
trapjmp:
|
|
jmp trap
|
|
db 'xsub'
|
|
start:
|
|
lhld wboot+1
|
|
shld savboot
|
|
lxi h,wstart
|
|
shld wboot+1
|
|
lhld bdosl
|
|
shld rbdos+1 ;real bdos entry
|
|
lxi h,trapjmp ;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
|
|
savboot:
|
|
ds 2 ;warm boot saved and restored at end
|
|
;of submit file
|
|
;
|
|
wstart:
|
|
lxi sp,stack
|
|
mvi c,pbuff ;print message
|
|
lxi d,actmsg
|
|
call rbdos
|
|
lxi h,dbuff ;restore default buffer
|
|
shld udma
|
|
call rsetdma
|
|
lxi h,trapjmp
|
|
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 restor ;no sub file
|
|
;
|
|
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
|
|
restor:
|
|
lhld savboot
|
|
shld wboot+1
|
|
jmp rbdos
|
|
;
|
|
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
|