Digital Research
This commit is contained in:
2020-11-06 18:50:37 +01:00
parent 621ed8ccaf
commit 31738079c4
8481 changed files with 1888323 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
; Figure 5-12
;
; OM
; Output Message
; This subroutine selects one of several messages based on
; the contents of the A register on entry. It then displays
; this message on the console.
;
; Each message is declared with a '$' as its last character.
; If the A register contains a value larger than the number
; of messages declared, OM will output "Unknown Message".
;
; As an option, OM can output Carriage Return / Line Feed
; prior to outputting the message text.
;
; Entry Parameters
;
; HL -> Message Table
; This has the form :
; DB 3 ;Number of Messages in table
; DW MSG0 ;Address of text (A = 0)
; DW MSG1 ;(A = 1)
; DW MSG2 ;(A = 2)
;
; MSG0: DB 'Message text$'
; ...etc.
;
; A = Message Code (from 0 on up)
; B = Output CR/LF if Non-zero
;
; Calling sequence
;
; LXI H,MSG$TABLE
; LDA MSGCODE
; MVI B,0 ;Suppress CR/LF
; CALL OM
;
B$PRINTS EQU 9 ;Print $-terminated string
BDOS EQU 5 ;BDOS Entry Point
;
CR EQU 0DH ;Carriage Return
LF EQU 0AH ;Line Feed
;
OM$CRLF: DB CR,LF,'$'
OM$UM: DB 'Unknown Message$'
;
;
OM:
PUSH PSW ;Save message code
PUSH H ;Save message table pointer
MOV A,B ;Check if CR/LF required
ORA A
JZ OM$NOCR ;No
LXI D,OM$CRLF ;Output CR/LF
MVI C,B$PRINTS
CALL BDOS
OM$NOCR:
POP H ;Recover message table pointer
POP PSW ;Recover message code
CMP M ;Compare message to max. value
JNC OM$ERR ;Error - code not <= max.
INX H ;Bypass max. value in table
ADD A ;Message Code * 2
MOV E,A ;Make Code * 2 a word value
MVI D,0
DAD D ;HL -> Address of message text
MOV E,M ;Get LS Byte
INX H ;HL -> MS Byte
MOV D,M ;Get MS Byte
;DE -> Message text itself
OM$PS: ;Print string entry point
MVI C,B$PRINTS ;Function Code
CALL BDOS
RET ;Return to caller
;
OM$ERR: ;Error
LXI D,OM$UM ;Point to "Unknown Message"
JMP OM$PS ;Print string