mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
1.8 KiB
87 lines
1.8 KiB
TITLE CPMIO CONSOLE I/O ROUTINES FOR CP/M
|
|
ENTRY $TTYIN,$TTYOT,$LNPTR,$CPMBF,$LINBF
|
|
TANDY EQU 0
|
|
CPMSBC EQU 0
|
|
;
|
|
IF2
|
|
.PRINTX /CPMIO/
|
|
IFT TANDY
|
|
.PRINTX/TANDY VERSION/
|
|
ENDIF
|
|
IFT CPMSBC
|
|
.PRINTX/CPM SBC VERSION/
|
|
ENDIF
|
|
IFF TANDY OR CPMSBC
|
|
.PRINTX/NORMAL CPM VERSION/
|
|
ENDIF
|
|
ENDIF
|
|
;
|
|
IFT TANDY
|
|
CPMENT SET 4205H
|
|
ENDIF
|
|
IFF TANDY
|
|
CPMENT SET 5
|
|
ENDIF
|
|
IFT CPMSBC
|
|
CPMENT SET 4005H
|
|
ENDIF
|
|
;CP/M CONSOLE OUTPUT ROUTINE
|
|
$TTYOT: PUSH B
|
|
PUSH D
|
|
PUSH H
|
|
PUSH PSW ;SAVE ALL REG'S
|
|
MVI C,2 ;CONSOLE OUTPUT
|
|
MOV E,A ;EXPECTS CHAR IN [E]
|
|
CALL CPMENT ;OUTPUT THE CHAR
|
|
POP PSW
|
|
POP H
|
|
POP D
|
|
POP B ;RESTORE STATE
|
|
RET
|
|
;
|
|
;CP/M CONSOLE INPUT ROUTINE
|
|
;NOTE: DON'T STOP PROGRAM IN INPUT WITH SWITCHES, COULD LEAVE
|
|
; GARB IN LINE IF THEN SAVED AND STARTED OVER.
|
|
$TTYIN: PUSH H ;SAVE [H,L]
|
|
LHLD $LNPTR ;POINT TO LAST CHAR
|
|
MOV A,M ;GET LAST CHAR
|
|
CPI 12Q ;FINISHED OFF LINE(LF)?
|
|
CZ GETLIN ;YES, GET ANOTHER
|
|
INX H ;POINT TO NEXT CHAR
|
|
MOV A,M ;GET IT
|
|
SHLD $LNPTR ;SAVE PTR
|
|
POP H ;RESTORE
|
|
RET
|
|
;
|
|
GETLIN: PUSH B
|
|
PUSH D ;SAVE OTHER REG'S
|
|
MVI C,12Q ;READ CONSOLE LINE
|
|
LXI D,$CPMBF ;PTR TO BUFFER
|
|
CALL CPMENT ;READ LINE FROM CONSOLE
|
|
LXI H,$CPMBF+1 ;POINT TO LENGTH OF LINE
|
|
MOV E,M ;GET LENGTH
|
|
MVI D,0 ;[D,E] = LENGTH
|
|
XCHG ;SAVE [H,L] IN [D,E]
|
|
DAD D ;GET PTR TO LAST CHAR
|
|
INX H
|
|
MVI M,15Q ;ADD <CR>
|
|
INX H
|
|
MVI A,12Q ;LINE FEED
|
|
CALL $TTYOT ;CPM DOESN'T GIVE ONE
|
|
MOV M,A ;AND <LF>
|
|
XCHG ;[H,L]=1ST CHAR -1
|
|
POP D
|
|
POP B
|
|
RET
|
|
;
|
|
DSEG
|
|
$CPMBF: DB 80 ;LENGTH OF BUFFER
|
|
DB 0 ;LENGTH OF LINE
|
|
$LINBF: DB 12Q ;SO WORKS AT FIRST
|
|
DS 135 ;REST OF BUFFER FOR LINE
|
|
;
|
|
$LNPTR: DW $LINBF ;AT FIRST POINT TO <LF> IN FRONT
|
|
; ;TO FORCE READ OF LINE
|
|
;
|
|
END
|
|
|