Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

79 lines
1.8 KiB
NASM
Raw Permalink 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-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