Files
Digital-Research-Source-Code/CONTRIBUTIONS/cpm-handbook/cpmsrc/FIG5-11.ASM
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

75 lines
2.3 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.

; Figure 5-11
;
; This example shows how to use the Get and Set IOBYTE
; functions to implement a simple Terminal emulator.
; For this example to work, the BIOS must detect the
; Console Value being set to 3 (IO$CUC1) and connect
; Console Status, Input and Output functions to the
; Communications line.
;
B$DIRCONIO EQU 6 ;Direct Console Input/Output
B$GETIO EQU 7 ;Get IOBYTE
B$SETIO EQU 8 ;Set IOBYTE
B$CONST EQU 11 ;Get Console Status (sneak preview)
BDOS EQU 5 ;BDOS entry point
;
IO$CONM EQU 0000$0011B ;Console Mask for IOBYTE
IO$CCRT EQU 1 ;Console -> CRT:
IO$CUC1 EQU 3 ;Console -> User Console #1
;
TERM:
CALL SETCRT ;Connect Console -> CRT:
TERM$CKS:
CALL CONST ;Get CRT status
JZ TERM$NOKI ;No console input
CALL CONIN ;Get keyboard character
CALL SETCOMM ;Connect Console -> Comm. Line
CALL CONOUT ;Output to Comm. Line
TERM$CCS: ;Check Comm. Status
CALL CONST ;Get "Console" status
JZ TERM ;No incoming Comm. character
CALL CONIN ;Get incoming Comm. character
CALL SETCRT ;Connect Console -> CRT:
CALL CONOUT ;Output to CRT
JMP TERM$CKS ;Loop back to check keyboard status
TERM$NOKI:
CALL SETCOMM ;Connect Console -> Comm. Line
JMP TERM$CCS ;Loop back to check Comm. status
;
SETCRT: ;Connect Console -> CRT:
PUSH PSW ;Save possible data character
MVI B,IO$CCRT ;Connect Console -> CRT:
JMP SETCON ;Common Code
SETCOMM: ;Connect Console -> Comm. Line
PUSH PSW ;Save possible data character
MVI B,IO$CUC1 ;Connect Console -> Comm. Line
;Drop into SETCON
SETCON: ;Set Console Device
;New code in B (in bits 1,0)
PUSH B ;Save code
MVI C,B$GETIO ;Get current IOBYTE
CALL BDOS
ANI (NOT IO$CONM) AND 0FFH ;Preserve all but console
POP B ;Recover required code
ORA B ;OR in new bits
MOV E,A ;Ready for setting
MVI C,B$SETIO ;Function code
CALL BDOS
POP PSW ;Recover possible data character
RET
CONOUT:
MOV E,A ;Get data byte for output
MVI C,B$DIRCONIO ;Function code
JMP BDOS ;BDOS returns to CONOUT's caller
CONIN:
MVI C,B$DIRCONIO ;Function Code
MVI E,0FFH ;Indicate Console Input
JMP BDOS ;BDOS returns to CONIN's caller
CONST:
MVI C,B$CONST ;Function Code
CALL BDOS
ORA A ;Set Z-flag to result
RET