mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
169 lines
6.1 KiB
Plaintext
169 lines
6.1 KiB
Plaintext
;***************** BDOS byte I/O module ****************
|
||
;
|
||
; console handlers
|
||
ret0: RET ;carry set if not graphic
|
||
;
|
||
conbrk: ;check for character ready
|
||
MOV AL,kbchar
|
||
OR AL,AL
|
||
JNZ conb1 ;skip if active kbchar
|
||
;no active kbchar,
|
||
;check external break
|
||
CALL constf
|
||
AND AL,1
|
||
jz ret0 ;rz
|
||
;character ready, read it
|
||
CALL coninf ;to A
|
||
CMP AL,ctls
|
||
JNZ conb0 ;check stop screen function
|
||
;found ctls, read next char
|
||
CALL coninf ;to A
|
||
CMP AL,ctlc
|
||
JNZ L_10
|
||
JMP wbootf
|
||
L_10: ;ctlc implies re-boot
|
||
;not a reboot,
|
||
;act as if nothing happened
|
||
XOR AL,AL
|
||
RET ;with zero in accumulator
|
||
conb0:
|
||
;character in accum, save it
|
||
MOV kbchar,AL
|
||
conb1:
|
||
;return with true set
|
||
MOV AL,1
|
||
RET
|
||
;
|
||
conout:
|
||
;compute character position/write conso
|
||
;compcol = true if computing
|
||
;column position
|
||
MOV AL,compcol
|
||
OR AL,AL
|
||
JNZ compout
|
||
;write the character,
|
||
;then compute column
|
||
;write console char from CL
|
||
PUSH CX
|
||
CALL conbrk ;check for screen stop func.
|
||
POP CX
|
||
PUSH CX ;recall/save character
|
||
CALL conouf ;externally, to console
|
||
POP CX
|
||
PUSH CX ;recall/save character
|
||
;may be copying to list dev.
|
||
cmp listcp,0
|
||
JZ L_11
|
||
CALL listf
|
||
L_11: ;to printer, if so
|
||
POP CX ;recall the character
|
||
compout:
|
||
MOV AL,CL ;recall the character
|
||
;and compute column position
|
||
LEA BX,column ;A = char, BX = .column
|
||
CMP AL,rubout
|
||
jz ret1 ;no column change if nulls
|
||
INC b[bx] ;column = column + 1
|
||
CMP AL,' '
|
||
jae ret1 ;rnc
|
||
;not graphic, reset column
|
||
DEC b[bx] ;column = column - 1
|
||
MOV AL,[bx]
|
||
OR AL,AL
|
||
jz ret1 ;return if at zero
|
||
;not at zero, may be
|
||
;bacspace or end of line
|
||
MOV AL,CL ;character back to A
|
||
CMP al,ctlh
|
||
JNZ notbacksp
|
||
;backspace character
|
||
DEC b[bx] ;column = column - 1
|
||
ret1: RET
|
||
notbacksp:
|
||
;not backspace, eol ?
|
||
CMP AL,lf
|
||
jnz ret1 ;return if not
|
||
;end of line, column = 0
|
||
MOV b[bx],0 ;column = 0
|
||
RET
|
||
;
|
||
tabout:
|
||
;expand tabs to console
|
||
CMP cl,tab
|
||
jnz conout ;direct to conout if not
|
||
;tab encountered, move to
|
||
;next tab position
|
||
tab0:
|
||
MOV CL,' '
|
||
CALL conout ;another blank
|
||
MOV AL,column
|
||
AND AL,111b ;column mod 8 = 0 ?
|
||
JNZ tab0 ;back for another if not
|
||
ret2: RET
|
||
;
|
||
crlf:
|
||
;carriage return line feed sequence
|
||
MOV CL,cr
|
||
CALL conout
|
||
MOV CL,lf
|
||
JMP conout
|
||
;ret
|
||
;
|
||
print:
|
||
;print message until M(BC) = '$'
|
||
MOV SI,CX
|
||
LODS al
|
||
CMP AL,'$'
|
||
jz ret2 ; rz
|
||
;more to print
|
||
INC CX
|
||
PUSH CX
|
||
MOV CL,AL ;char to C
|
||
push ds ;restore data segment
|
||
push ss
|
||
pop ds
|
||
CALL tabout ;another character printed
|
||
pop ds
|
||
POP CX
|
||
jmps print
|
||
|
||
return: ret
|
||
func1 equ return
|
||
func2 EQU tabout
|
||
func3 equ return
|
||
func6 equ return
|
||
func7 equ return
|
||
func8 equ return
|
||
;
|
||
func9:
|
||
;write line until $ encountered
|
||
;
|
||
MOV CX,DX ;CX=string address
|
||
push ds ;read from user segment
|
||
mov ds,parametersegment
|
||
call print ;out to console
|
||
pop ds
|
||
ret
|
||
;
|
||
func10 equ return
|
||
|
||
func11 equ return
|
||
;check console status
|
||
;(drop through to sta$ret)
|
||
staret:
|
||
;store the A register to aret
|
||
MOV lret,al
|
||
funcret: ;
|
||
RET ;jmp goback
|
||
;(pop stack for non CP/M func)
|
||
;
|
||
setlret1:
|
||
;set lret = 1
|
||
MOV AL,1
|
||
jmps staret
|
||
;
|
||
; end of Basic I/O System
|
||
;
|
||
;*****************************************************************
|
||
end
|
||
|