mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
877 lines
20 KiB
NASM
877 lines
20 KiB
NASM
title 'PUT.RSX 3.0 - CP/M 3.0 Output Redirection - August 1982'
|
|
;******************************************************************
|
|
;
|
|
; PUT 'Output Redirection Facility' version 3.0
|
|
;
|
|
; 11/30/82 - Doug Huskey
|
|
; This RSX redirects console or list output to a file.
|
|
;******************************************************************
|
|
;
|
|
;
|
|
; generation procedure
|
|
;
|
|
; rmac putrsx
|
|
; xref putrsx
|
|
; link putrsx[op]
|
|
; ERA put.RSX
|
|
; REN put.RSX=putRSX.PRL
|
|
; GENCOM put.com put.rsx
|
|
;
|
|
; initialization procedure
|
|
;
|
|
; PUTF makes a RSX function 60 call with a sub-function of
|
|
; 128. PUTRSX returns the address of a data table containing:
|
|
;
|
|
; init$table:
|
|
; dw kill ;remove PUT at warmboot flg
|
|
; dw 0 ;reserved
|
|
; dw bios$output ;BIOS entry point into PUT
|
|
; dw putfcb ;FCB address
|
|
;
|
|
; PUTF initializes the data are between movstart: and movend:
|
|
; and moves it into PUT.RSX. This means that data should not
|
|
; be reordered without also changing PUTF.ASM.
|
|
;
|
|
;
|
|
true equ 0ffffh
|
|
false equ 00000h
|
|
;
|
|
bios$functions equ true ;intercept BIOS console functions
|
|
remove$rsx equ false ;this RSX does its own removal
|
|
;
|
|
; low memory locations
|
|
;
|
|
wboot equ 0000h
|
|
wboota equ wboot+1
|
|
bdos equ 0005h
|
|
bdosl equ bdos+1
|
|
buf equ 0080h
|
|
;
|
|
; equates for non graphic characters
|
|
;
|
|
ctlc equ 03h ; control c
|
|
ctle equ 05h ; physical eol
|
|
ctlh equ 08h ; backspace
|
|
ctlp equ 10h ; prnt toggle
|
|
ctlr equ 12h ; repeat line
|
|
ctls equ 13h ; stop/start screen
|
|
ctlu equ 15h ; line delete
|
|
ctlx equ 18h ; =ctl-u
|
|
ctlz equ 1ah ; end of file
|
|
rubout equ 7fh ; char delete
|
|
tab equ 09h ; tab char
|
|
cr equ 0dh ; carriage return
|
|
lf equ 0ah ; line feed
|
|
ctl equ 5eh ; up arrow
|
|
;
|
|
; BDOS function equates
|
|
;
|
|
cinf equ 1 ;read character
|
|
coutf equ 2 ;output character
|
|
crawf equ 6 ;raw console I/O
|
|
creadf equ 10 ;read buffer
|
|
cstatf equ 11 ;status
|
|
lchrf equ 5 ;print character
|
|
pbuff equ 9 ;print buffer
|
|
resetf equ 13 ;reset drive
|
|
openf equ 15 ;open file
|
|
closef equ 16 ;close file
|
|
delf equ 19 ;delete file
|
|
dreadf equ 20 ;disk read
|
|
writef equ 21 ;disk write
|
|
dmaf equ 26 ;set dma function
|
|
userf equ 32 ;set/PUT user number
|
|
resdvf equ 37 ;reset drive function
|
|
flushf equ 48 ;flush buffers function
|
|
scbf equ 49 ;set/PUT system control block word
|
|
loadf equ 59 ;Program load function
|
|
rsxf equ 60 ;RSX function call
|
|
resalvf equ 98 ;reset allocation vector
|
|
pblkf equ 111 ;print block to console
|
|
lblkf equ 112 ;print block to list device
|
|
ginitf equ 128 ;GET initialization sub-function no.
|
|
gkillf equ 129 ;GET delete sub-function no.
|
|
gfcbf equ 130 ;GET file display sub-function no.
|
|
pinitf equ 132 ;PUT initialization sub-function no.
|
|
pckillf equ 133 ;PUT console delete sub-function no.
|
|
plkillf equ 137 ;PUT list delete sub-function no.
|
|
pcfcbf equ 134 ;return PUT console fcb address
|
|
plfcbf equ 138 ;return PUT list fcb address
|
|
jinitf equ 140 ;JOURNAL initialization sub-function no.
|
|
jkillf equ 141 ;JOURNAL delete sub-function no.
|
|
jfcbf equ 142 ;return JOURNAL fcb address
|
|
;
|
|
; System Control Block definitions
|
|
;
|
|
scba equ 03ah ;offset of scbadr from SCB base
|
|
ccpflg equ 0b3h ;offset of ccpflags word from page boundary
|
|
ccpres equ 020h ;ccp resident flag = bit 5
|
|
bdosoff equ 0feh ;offset of BDOS address from page boundary
|
|
errflg equ 0aah ;offset of error flag from page boundary
|
|
conmode equ 0cfh ;offset of console mode word from pag. bound.
|
|
outdel equ 0d3h ;offset of print buffer delimiter
|
|
listcp equ 0d4h ;offset of ^P flag from page boundary
|
|
usrcode equ 0e0h ;offset of user number from pg bnd.
|
|
dcnt equ 0e1h ;offset of dcnt, searcha & searchl from pg bnd.
|
|
constfx equ 06eh ;offset of constat JMP from page boundary
|
|
coninfx equ 074h ;offset of conin JMP from page boundary
|
|
;
|
|
;
|
|
;******************************************************************
|
|
; RSX HEADER
|
|
;******************************************************************
|
|
|
|
serial: db 0,0,0,0,0,0
|
|
|
|
trapjmp:
|
|
jmp trap ;trap read buff and DMA functions
|
|
next: jmp 0 ;go to BDOS
|
|
prev: dw bdos
|
|
kill: db 0FFh ;Remove at wstart if not zero
|
|
nbank: db 0
|
|
rname: db 'PUT ' ;RSX name
|
|
space: dw 0
|
|
patch: db 0
|
|
|
|
;******************************************************************
|
|
; START OF CODE
|
|
;******************************************************************
|
|
;
|
|
; ABORT ROUTINE
|
|
;
|
|
puteof: ;close output file and abort
|
|
lda cbufp
|
|
ora a
|
|
jz restor
|
|
mvi e,ctlz
|
|
call putc
|
|
jmp puteof
|
|
|
|
|
|
;
|
|
;******************************************************************
|
|
; BIOS TRAP ENTRY POINT
|
|
;******************************************************************
|
|
;
|
|
;
|
|
; ARRIVE HERE ON EACH INTERCEPTED BIOS CALL
|
|
;
|
|
;
|
|
bios$output:
|
|
;
|
|
if bios$functions
|
|
;
|
|
;enter here from BIOS constat
|
|
mov e,c ;character in E
|
|
lda bdosfunc ;BDOS function to use
|
|
mov c,a
|
|
mvi a,1 ;offset in exit table = 1
|
|
jmp bios$trap
|
|
endif
|
|
;
|
|
;
|
|
;******************************************************************
|
|
; BDOS TRAP ENTRY POINT
|
|
;******************************************************************
|
|
;
|
|
;
|
|
; ARRIVE HERE AT EACH BDOS CALL
|
|
;
|
|
trap:
|
|
;
|
|
if bios$functions
|
|
;
|
|
xra a
|
|
biostrap:
|
|
;enter here on BIOS calls
|
|
sta exit$off
|
|
endif
|
|
pop h ;return address
|
|
push h ;back to stack
|
|
lda trapjmp+2 ;PUT.RSX page address
|
|
cmp h ;high byte of return address
|
|
jc exit ;skip calls on bdos above here
|
|
mov a,c
|
|
cpi rsxf
|
|
jz rsxfunc ;check for initialize or abort
|
|
cpi dmaf
|
|
jz dmafunc ;save users DMA address
|
|
cpi 14 ;reset function + 1
|
|
jc tbl$srch ;search if func < 14
|
|
cpi 98
|
|
jnc tbl$srch ;search if func >= 98
|
|
cpi resdvf
|
|
jz tbl$srch ;search if func = 37
|
|
;
|
|
; EXIT - FUNCTION NOT MATCHED
|
|
;
|
|
exit:
|
|
|
|
if not bios$functions
|
|
;
|
|
exit1: jmp next ;go to next RSX or BDOS
|
|
|
|
else
|
|
lda exit$off ;PUT type of call:
|
|
exit1: lxi h,exit$table ;0=BDOS call, 1=BIOS call
|
|
endif
|
|
|
|
tbl$jmp:
|
|
|
|
; a = offset (rel 0)
|
|
; hl = table address
|
|
add a ;double for 2 byte addresses
|
|
call addhla ;HL = .(exit routine)
|
|
mov b,m ;get low byte from table
|
|
inx h
|
|
mov h,m
|
|
mov l,b ;HL = exit routine
|
|
pchl ;gone to BDOS or BIOS
|
|
|
|
tbl$srch:
|
|
|
|
;
|
|
;CHECK IF THIS FUNCTION IS IN FUNCTION TABLE
|
|
;if matched b = offset in table (rel 0)
|
|
;FF terminates table
|
|
;FE is used to mark non-intercepted functions
|
|
;
|
|
lxi h,func$tbl ;list of intercepted functions
|
|
mvi b,0 ;start at beginning
|
|
tbl$srch1:
|
|
mov a,m ;get next table entry
|
|
cmp c ;is it the same?
|
|
jz intercept ;we found a match, B = offset
|
|
inr b
|
|
inx h
|
|
inr a ;0FFh terminates list
|
|
jnz tbl$srch1 ;try next one
|
|
jmp exit ;end of table - not found
|
|
|
|
;
|
|
;
|
|
;******************************************************************
|
|
; REDIRECTION PROCESSOR
|
|
;******************************************************************
|
|
;
|
|
;
|
|
; INTERCEPTED BDOS FUNCTIONS ARRIVE HERE
|
|
;
|
|
; enter with
|
|
; B = routine offset in table
|
|
; C = function number
|
|
; DE = BDOS parameters
|
|
|
|
intercept:
|
|
|
|
;switch to local stack
|
|
lxi h,0
|
|
dad sp
|
|
shld oldstack
|
|
lxi sp,stack
|
|
|
|
redirect:
|
|
|
|
push d ;save info
|
|
push b ;save function
|
|
lhld scbadr
|
|
;
|
|
;are we active now?
|
|
;
|
|
lda program
|
|
ora a ;program output only?
|
|
cnz ckccp ;if not, test if CCP is calling
|
|
jz cklist ;jump if not CCP or program output
|
|
mov a,c
|
|
cpi 0ah ;is it function 10?
|
|
jnz skip ;skip if not
|
|
lxi h,ccpcnt ;decrement once for each
|
|
dcr m ;CCP function 10
|
|
cm puteof ;if 2nd appearance of CCP
|
|
jmp skip ;if CCP is active
|
|
;
|
|
;check for list processing and ^P status
|
|
;
|
|
cklist:
|
|
lda list
|
|
ora a ;list redirection?
|
|
jz ckecho ;jump if not
|
|
mvi l,listcp ;HL = .^P flag
|
|
mov a,m
|
|
ora a ; ^P on?
|
|
jnz setecho ;set echo on if so
|
|
mov a,b
|
|
cpi 2 ;console function?
|
|
jnc skip ;skip if so
|
|
ckecho: lda echoflg ;echo parameter
|
|
setecho:
|
|
sta echo
|
|
;
|
|
;go to function trap routine
|
|
;
|
|
gofunct:
|
|
lxi h,retmon ;program return routine
|
|
push h ;push on stack
|
|
mov a,b ;offset
|
|
lxi h,trap$tbl
|
|
jmp tbl$jmp ;go to table address
|
|
;
|
|
;
|
|
rawio:
|
|
;direct console i/o - read if 0ffh
|
|
;returns to retmon
|
|
mov a,e
|
|
cpi 0fdh
|
|
jc putchr
|
|
cpi 0feh
|
|
rz ;make the status call (FE)
|
|
jc conin ;make the input call (FD)
|
|
call next ;call for input/status (FF)
|
|
ora a
|
|
jz retmon1
|
|
jmp conin1
|
|
;
|
|
;input function
|
|
;
|
|
conin:
|
|
call exit ;make the call
|
|
conin1: mov e,a ;put character in E
|
|
push psw ;save character
|
|
call conout ;put character into file
|
|
pop psw ;character in A
|
|
;
|
|
; RETURN FROM FUNCTION TRAP ROUTINE
|
|
;
|
|
cpi cr
|
|
jnz retmon1
|
|
|
|
retmon2:
|
|
;output linefeed before returning
|
|
push psw ;save character
|
|
lda echo
|
|
ora a ;no echo mode
|
|
mvi e,lf
|
|
mvi c,coutf
|
|
cz next ;output lf if so
|
|
lda input
|
|
ora a
|
|
cnz conout
|
|
pop psw ;restore character
|
|
|
|
retmon1:
|
|
;return to calling program
|
|
lhld old$stack
|
|
sphl
|
|
mov l,a
|
|
retmon0:
|
|
ret ;to calling program
|
|
;
|
|
retmon:
|
|
;echo before returning?
|
|
lda echo
|
|
ora a
|
|
jz retmon1 ;return to program if no echo
|
|
;otherwise continue
|
|
;
|
|
; PERFORM INTERCEPTED BDOS CALL
|
|
;
|
|
skip:
|
|
;restore BDOS call and stack
|
|
pop b ;restore BDOS function no.
|
|
pop d ;restore BDOS parameter
|
|
lhld old$stack
|
|
sphl
|
|
jmp exit ;goto BDOS
|
|
|
|
;******************************************************************
|
|
; BIOS FUNCTIONS (REDIRECTION ROUTINES)
|
|
;******************************************************************
|
|
;
|
|
putchr:
|
|
;put out character in E unless putting input
|
|
lda input! ora a! rnz ;return (retmon) if input redirection
|
|
listf:
|
|
conout:
|
|
conoutf:
|
|
ctlout:
|
|
;send E character with possible preceding up-arrow
|
|
mov a,e! cpi ctlz! jz ctlout1 ;always convert ^Z
|
|
call echoc ;cy if not graphic (or special case)
|
|
jnc putc ;skip if graphic, tab, cr, lf, or ctlh
|
|
|
|
ctlout1:
|
|
;send preceding up arrow
|
|
push psw! mvi e,ctl! call putc ;up arrow
|
|
pop psw! ori 40h ;becomes graphic letter
|
|
mov e,a ;ready to print
|
|
;(drop through to PUTC)
|
|
;
|
|
;
|
|
; put next character into file
|
|
;
|
|
;
|
|
putc: ;write sector if full, close in each physical block
|
|
;abort PUT if any disk error occurs
|
|
;character in E
|
|
lxi h,cbufp
|
|
mov a,m ; A = cbufp
|
|
push h
|
|
inx h ;HL = .cbuf
|
|
call addhla ;HL = .char
|
|
mov m,e ;store character
|
|
pop h
|
|
inr m ;next chr position
|
|
rp ;minus flag set after 128 chars
|
|
;
|
|
; WRITE NEXT RECORD
|
|
;
|
|
write:
|
|
mvi c,writef
|
|
call putdos
|
|
cnz restor ;abort RSX if error
|
|
xra a
|
|
sta cbufp ;reset buffer position to 0
|
|
lxi h,record
|
|
dcr m ;did we cross the block boundary?
|
|
rp ;return if not
|
|
call close ;close the file if so
|
|
cnz restor ;abort RSX if error
|
|
lxi h,blm ;HL = .blm
|
|
mov a,m
|
|
dcx h
|
|
mov m,a ;set record = blm
|
|
ret
|
|
;
|
|
; CLOSE THE FILE
|
|
;
|
|
close:
|
|
mvi c,closef
|
|
;
|
|
; PUT FILE OPERATION
|
|
;
|
|
putdos:
|
|
push b ;function no. in C
|
|
lxi d,cbuf
|
|
call setdma ;set DMA to our buffer
|
|
pop b ;function no. in C
|
|
lhld scbadr
|
|
push h ;save for restore
|
|
lxi d,sav$area ;10 byte save area
|
|
push d ;save for restore
|
|
call mov7 ;save hash info in save area
|
|
mvi l,usrcode ;HL = .BDOS user number in SCB
|
|
call mov7 ;save user, dcnt, search addr, len &
|
|
dcx h ; multi-sector count
|
|
mvi m,1 ;set multi-sector count=1
|
|
mvi l,usrcode ;HL = .BDOS user number
|
|
lxi d,putusr
|
|
ldax d
|
|
mov m,a ;set BDOS user = putusr
|
|
inx d ;DE = .putfcb
|
|
call next ;write next record or close file
|
|
pop h ;HL = .sav$area
|
|
pop d ;DE = .scb
|
|
push psw ;save A (non-zero if error)
|
|
call mov7 ;restore hash info
|
|
mvi e,usrcode ;DE = .user num in scb
|
|
call mov7 ;restore dcnt search addr & len
|
|
lhld udma
|
|
xchg
|
|
call setdma ;restore DMA to program's buffer
|
|
pop psw
|
|
ora a
|
|
ret ;zero flag set if successful
|
|
;
|
|
; CLOSE FILE AND TERMINATE RSX
|
|
;
|
|
restor:
|
|
call close
|
|
lxi d,close$err
|
|
cnz msg ;print message if close error
|
|
lxi h,0ffffh
|
|
shld rsxfunctions ;set killf and fcbf to inactive
|
|
;
|
|
;set RSX aborted flag
|
|
;
|
|
lxi h,kill ;0=active, 0ffh=aborted
|
|
mvi m,0ffh ;set to 0ffh (in-active)
|
|
;are we the bottom RSX, if so remove ourselves immediately
|
|
;to save memory
|
|
lda bdosl+1 ;get high byte of top of tpa
|
|
CMP H ;Does location 6 point to us
|
|
|
|
if remove$rsx
|
|
jnz bios$fixup ;done, if not
|
|
lhld next+1
|
|
shld bdosl
|
|
xchg
|
|
lhld scbadr
|
|
mvi l,bdosoff ;HL = "BDOS" address in SCB
|
|
mov m,e ;put next address into SCB
|
|
inx h
|
|
mov m,d
|
|
xchg
|
|
mvi l,0ch ;HL = .previous RSX field in next RSX
|
|
mvi m,7
|
|
inx h
|
|
mvi m,0 ;put previous into previous
|
|
else
|
|
mvi c,loadf
|
|
lxi d,0
|
|
cz next ;fixup RSX chain, if this RSX on bottom
|
|
endif
|
|
|
|
if bios$functions
|
|
|
|
bios$fixup:
|
|
;
|
|
;restore bios jumps
|
|
lda restore$mode ;may be FF, 7f or 0
|
|
inr a
|
|
rz ; FF = no bios interception
|
|
lhld wmsta ;real warm start routine
|
|
xchg
|
|
lhld wmjmp ;wboot jump in bios
|
|
mov m,e
|
|
inx h
|
|
mov m,d ;restore real routine in jump
|
|
lhld biosout ;conin,conout or list jmp
|
|
xchg
|
|
lhld biosjmp ;address of real bios routine
|
|
mov m,e
|
|
inx h
|
|
mov m,d
|
|
rm ; 7f = RESBDOS jmps not changed
|
|
lhld wmfix
|
|
mvi m,jmp ;replace jmp for warm start
|
|
lhld biosfix
|
|
mvi m,jmp ;replace jmp for other trapped jump
|
|
endif
|
|
ret ; 0 = everything done
|
|
;
|
|
; set DMA address in DE
|
|
;
|
|
setdma: mvi c,dmaf
|
|
jmp next
|
|
;
|
|
; print message to console
|
|
;
|
|
msg: mvi c,pbuff
|
|
jmp next
|
|
;
|
|
; move routine
|
|
;
|
|
mov7: mvi b,7
|
|
; HL = source
|
|
; DE = destination
|
|
; B = count
|
|
move: mov a,m
|
|
stax d
|
|
inx h
|
|
inx d
|
|
dcr b
|
|
jnz move
|
|
ret
|
|
;
|
|
; add a to hl
|
|
;
|
|
addhla: add l
|
|
mov l,a
|
|
rnc
|
|
inr h
|
|
ret
|
|
|
|
;
|
|
; check if CCP is calling
|
|
;
|
|
ckccp:
|
|
;returns zero flag set if not CCP
|
|
lhld scbadr
|
|
mvi l,ccpflg+1 ;HL = .ccp flag 2
|
|
mov a,m
|
|
ani ccpres ;is it the CCP?
|
|
ret
|
|
;
|
|
;******************************************************************
|
|
; BDOS FUNCTION HANDLERS
|
|
;******************************************************************
|
|
;
|
|
;
|
|
; FUNCTION 26 - SET DMA ADDRESS
|
|
;
|
|
dmafunc:
|
|
xchg ;dma to hl
|
|
shld udma ;save it
|
|
xchg
|
|
jmp next
|
|
;
|
|
;
|
|
; BIOS WARM START TRAP FUNCTION
|
|
;
|
|
warmtrap:
|
|
lxi sp,stack
|
|
call close ;close if wboot originated below RSX
|
|
jmp wstart
|
|
;
|
|
; BDOS FUNCTION 60 - RSX FUNCTION CALL
|
|
;
|
|
rsxfunc: ;check for initialize or delete RSX functions
|
|
ldax d ;get sub-function number
|
|
cpi pinitf ;is it a PUT initialization
|
|
lxi h,init$table
|
|
rz ;return to caller if init call
|
|
;check for FCB display functions
|
|
mov b,a
|
|
lda fcbf ;is it a a PUT fcb request
|
|
cmp b
|
|
lxi h,putfcb
|
|
rz ;return if so
|
|
;check for kill function
|
|
lda killf ;local kill (kill only this one)
|
|
cmp b
|
|
jz puteof ;kill and return to caller
|
|
jmp exit ;abort any higher PUTs
|
|
|
|
;
|
|
;
|
|
;******************************************************************
|
|
; BDOS OUTPUT ROUTINES
|
|
;******************************************************************
|
|
;
|
|
;
|
|
; July 1982
|
|
;
|
|
;
|
|
; Console handlers
|
|
;
|
|
echoc:
|
|
;are we in cooked or raw mode?
|
|
lda cooked! ora a! mov a,e! rz ;return if raw
|
|
;echo character if graphic
|
|
;cr, lf, tab, or backspace
|
|
cpi cr! rz ;carriage return?
|
|
cpi lf! rz ;line feed?
|
|
cpi tab! rz ;tab?
|
|
cpi ctlh! rz ;backspace?
|
|
cpi ' '! ret ;carry set if not graphic
|
|
;
|
|
;
|
|
print:
|
|
;print message until M(DE) = '$'
|
|
lhld scbadr
|
|
mvi l,OUTDEL
|
|
ldax d! CMP M! rz ;stop on delimiter
|
|
;more to print
|
|
inx d! push d! mov e,a ;char to E
|
|
call conout ;another character printed
|
|
pop d! jmp print
|
|
;
|
|
;
|
|
read:
|
|
;put prompt if in no echo mode
|
|
lda echo! ora a! jnz read1
|
|
push d
|
|
lxi d,prompt! call msg ;output prompt
|
|
pop d! mvi c,creadf ;set for read call
|
|
read1:
|
|
;read console buffer
|
|
pop h ;throw away return address
|
|
push d
|
|
call next ;make the call
|
|
pop h! inx h! mov b,m! inr b ;get the buffer length
|
|
putnxt: dcr b! jz read2
|
|
inx h! mov e,m! push b! push h
|
|
call conout! pop h! pop b ;put character
|
|
jmp putnxt
|
|
|
|
read2: lda input! ora a! push psw
|
|
mvi e,cr! cnz conout ;call if putting input
|
|
pop psw! mvi e,lf! cnz conout ;call if putting input
|
|
jmp retmon1
|
|
|
|
|
|
;
|
|
func1: equ conin
|
|
;
|
|
func2: equ conout
|
|
;write console character
|
|
;
|
|
func5: equ listf
|
|
;write list character
|
|
;write to list device
|
|
;
|
|
func6: equ rawio
|
|
;
|
|
func9: equ print
|
|
;write line until $ encountered
|
|
;
|
|
func10: equ read
|
|
;
|
|
func11: equ retmon0
|
|
;
|
|
func13: equ close
|
|
;
|
|
func37: equ close
|
|
;
|
|
func98: equ close
|
|
;
|
|
FUNC111: ;PRINT BLOCK TO CONSOLE
|
|
FUNC112: ;LIST BLOCK
|
|
XCHG! MOV E,M! INX H! MOV D,M! INX H
|
|
MOV C,M! INX H! MOV B,M! XCHG
|
|
;HL = ADDR OF STRING
|
|
;BC = LENGTH OF STRING
|
|
BLK$OUT:
|
|
MOV A,B! ORA C! RZ ;is length 0, return if so
|
|
PUSH B! PUSH H
|
|
mov e,m! call conout ;put character
|
|
POP H! INX H! POP B! DCX B
|
|
JMP BLK$OUT
|
|
|
|
; end of BDOS Console module
|
|
|
|
;******************************************************************
|
|
; DATA AREA
|
|
;******************************************************************
|
|
|
|
exit$off db 0 ;offset in exit$table of destination
|
|
|
|
trap$tbl:
|
|
;function dispatch table (must match func$tbl below)
|
|
; db lchrf, lblkf, coutf, cstatf, crawf
|
|
; db pbuff, cinf, creadf, resetf, resdvf
|
|
; db resalvf, pblkf, eot
|
|
|
|
dw func5 ;function 5 - list output
|
|
dw func112 ;function 112 - list block
|
|
dw func2 ;function 2 - console output
|
|
dw func11 ;function 11 - console status
|
|
dw func6 ;function 6 - raw console I/O
|
|
dw func9 ;function 9 - print string
|
|
dw func1 ;function 1 - console input
|
|
dw func10 ;function 10 - read console buffer
|
|
dw func13 ;function 13 - disk reset (close first)
|
|
dw func37 ;function 37 - drive reset (close first)
|
|
dw func98 ;function 98 - reset allocation vector
|
|
dw func111 ;function 111 - print block
|
|
|
|
;******************************************************************
|
|
; Following variables and entry points are used by PUT.COM
|
|
; Their order and contents must not be changed without also
|
|
; changing PUT.COM.
|
|
;******************************************************************
|
|
|
|
movstart:
|
|
init$table: ;addresses used by PUT.COM for initial.
|
|
scbadr: ;address of System Control Block
|
|
dw kill ;kill flag for error on file make
|
|
;(passed to PUT.COM by RSX init function)
|
|
;
|
|
if bios$functions ;PUT.RSX initialization
|
|
;
|
|
gobios: mov c,e
|
|
db jmp
|
|
biosout dw bios$output ;set to real BIOS routine
|
|
;(passed to PUT.COM by RSXFUNC)
|
|
biosjmp
|
|
dw warm$trap ;address of bios jmp initialized by COM
|
|
biosfix
|
|
dw 0 ;address of jmp in resbdos to restore
|
|
;restore only if changed when removed.
|
|
wstart: db jmp
|
|
wmsta: dw 0 ;address of real warm start routine
|
|
wmjmp: dw 0 ;address of jmp in bios to restore
|
|
wmfix: dw 0 ;address of jmp in resbdos to restore
|
|
bdosfunc:
|
|
db coutf
|
|
restore$mode
|
|
db 0 ;0FFh = no bios restore, 07fh = restore
|
|
;only bios jmp, 0 = restore bios jump and
|
|
;resbdos jmp when removed.
|
|
endif
|
|
;
|
|
; equates function table
|
|
;
|
|
eot equ 0ffh ; end of function table
|
|
skipf equ 0feh ; skip this function
|
|
;
|
|
;
|
|
func$tbl: ;no trapping until initialized by PUT.COM
|
|
db eot,0,0,0,0,0,0,0,0,0,0,0,0
|
|
; db lchrf, lblkf, coutf, cstatf, crawf
|
|
; db pbuff, cinf, creadf, resetf, resdvf
|
|
; db resalvf, pblkf, eot
|
|
;
|
|
input db 0 ;put console input to a file
|
|
list db 0 ;intercept list functions
|
|
echoflg:
|
|
db 1 ;echo output to device
|
|
cooked: ;must be next after echo
|
|
db 0 ;TRUE if ctrl chars (except ^Z) placed
|
|
;in the output file
|
|
rsxfunctions:
|
|
killf: db 0ffh ;not used until PUT initialized
|
|
fcbf: db 0ffh ;not used until PUT initialized
|
|
record: db 0 ;counts down records to block boundary
|
|
blm: db 0 ;block mask = records per block (rel 0)
|
|
program: ;this flag must be @ .PUTFCB-2
|
|
db 0 ;true if put program output only
|
|
putusr: db 0 ;user number for redirection file
|
|
putfcb: db 0ffh ;preset to 0ffh to indicate not active
|
|
db 'SYSOUT '
|
|
db '$$$'
|
|
db 0,0
|
|
putmod: db 0
|
|
putrc: ds 1
|
|
ds 16 ;map
|
|
putcr: ds 1
|
|
;
|
|
cbufp db 0 ;current character position in cbuf
|
|
movend:
|
|
;*******************************************************************
|
|
|
|
cbuf: ;128 byte buffer (could be ds 128)
|
|
|
|
db 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
|
|
db 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
|
|
db 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
|
|
db 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
|
|
|
|
db 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
|
|
db 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
|
|
db 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
|
|
db 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3
|
|
|
|
;
|
|
if bios$functions
|
|
;
|
|
exit$table: ;addresses to go to on exit
|
|
dw next ;BDOS
|
|
dw gobios
|
|
endif
|
|
;
|
|
udma: dw buf ;user dma
|
|
user: db 0 ;user user number
|
|
echo: db 0 ;echo output to console flag
|
|
ccpcnt: db 1 ;start at 1 (decremented each CCP)
|
|
sav$area: ;14 byte save area
|
|
db 68h,68h,68h,68h,68h, 68h,68h,68h,68h,68h
|
|
db 68h,68h,68h,68h
|
|
close$err:
|
|
db cr,lf,'PUT ERROR: FILE ERASED',cr,lf,'$'
|
|
prompt: db cr,lf,'PUT>$'
|
|
;
|
|
patch$area:
|
|
ds 30h
|
|
db ' 151282 '
|
|
db ' COPYR ''82 DRI '
|
|
|
|
db 67h,67h,67h,67h, 67h,67h,67h,67h, 67h,67h,67h,67h
|
|
db 67h,67h,67h,67h, 67h,67h,67h,67h, 67h,67h,67h,67h
|
|
db 67h,67h,67h,67h, 67h,67h,67h,67h
|
|
;
|
|
stack: ;16 level stack
|
|
oldstack:
|
|
dw 0
|
|
end
|