;
; MESSAGE.ASM - ASCII message typing program for CP/M.
;
; Written 7/24/84 by Al Jewer and released in the public domain.
;
; Copyright (c) 1984 Al Jewer.
;
; THIS PROGRAM MUST NOT BE SOLD !!!!!!!!!!
;
; This file is intended to be used on CP/M systems to generate
; messages in response to typed commands. That is, suppose you
; run an RCPM system, and would like people to know that they
; can use TYPE instead of TYPESQ. This file can be edited to
; contain a message such as:
;      TYPESQ no longer needed.... use TYPE instead.
;
; The unique thing about this file is that it contains ONLY ASCII
; characters... that is, the assembled .COM file can be copied
; with, say, WORDSTAR in non-document mode, and the new message
; inserted starting on the second line, and terminated with a
; dollar-sign character. The resultant file can then be run
; directly, WITHOUT assembly or loading!
; You only need a text editor to create a message file!
;
; This is probably the wildest code I've ever written - if you
; can't follow it, don't worry!
; Trust me, it works.
;
; Keep in mind that you really don't need the source code, just
; the .COM file in order to create MESSAGE files.
;
       ORG     100H            ; CP/M STARTING ADDRESS
;
START:  DAD H                   ;GET 0 IN THE L REGISTER
       DAD H
       DAD H
       DAD H
       DAD H
       DAD H
       DAD H
       DAD H
       MOV H,L                 ;ZERO THE HI BYTE OF HL PAIR
       MOV D,L                 ;ZERO HI BYTE OF DE PAIR
       INR L                   ;GET A 1
       DAD H                   ;SHIFT LEFT 2
       DAD H
       INR L                   ;SHIFT IN ANOTHER 1
       DAD H
       INR L                   ;AND ANOTHER
       DAD H                   ;FINAL SHIFT GIVES US 16H IN L
       MOV A,L                 ;GET VALUE TO A
       CMA                     ;THIS GIVES US 0E9H IN A REGISTER
                               ; (THIS IS A PCHL INSTRUCTION)
       MOV L,H                 ;RE-ZERO THE HL PAIR
       INR L                   ;GET A 1
       MOV B,L                 ;SAVE THE 1 IN THE B REGISTER
       DAD H                   ;GET A 5
       DAD H
       INR L
       MOV E,L                 ;SAVE THE 5 IN THE E REGISTER
       DCR L                   ;GET A 9
       DAD H
       INR L
       MOV C,L                 ;GET FUNCTION CODE (9) TO C REGISTER
       MOV H,B                 ;GET HI BYTE OF MESSAGE ADDRESS TO H
       MVI L,(ADDRESS AND 0FFH) ;POINT TO OUR PCHL ADDRESS (THIS WILL
                               ;BE AN OFFSET LARGER THAN 20H AND SMALLER
                               ;THAN 7FH, THEREFORE AN ASCII CODE
       MOV M,A                 ;MOVE PCHL INSTRUCTION TO RAM
       INR L                   ;POINT PAST PCHL TO START OF MESSAGE
       INR L                   ;ALSO PAST INITIAL CRLF
       INR L
       MOV A,L                 ;SWAP HL & DE (DE MUST POINT TO MESSAGE,
                               ;HL MUST POINT TO LOCATION 5)
       MOV B,H
       MOV L,E
       MOV H,D
       MOV D,B
       MOV E,A
ADDRESS: DB 'X'                 ;THIS WILL BE CHANGED TO A PCHL
       DB 0DH, 0AH             ;INITIAL CRLF
       DB 'This is where the message goes', 0DH, 0AH
       DB 'Make sure you end the message with a dollar-sign!', 0DH, 0AH
       DB '$'                  ;MESSAGE TERMINATOR
       DB 'Z'-40H              ;ASCII END OF FILE
;
       END     START