;***************************************************************************
; SYSMSG.M68    -       Displays contenst of SYSMSG, optional file output
;
; Initial algorithm by Steve Lawson of Alpha Micro
;
; Modified for file option and other stuff by Dave Heyliger - AMUS Staff
;***************************************************************************

       SEARCH  SYS                     ;search the normals
       SEARCH  SYSSYM
       SEARCH  TRM
       SEARCH  AAA                     ;from DSK2:[100,133]

DEFINE  DIM=PRTTAB -1,11.
DEFINE  BRIGHT=PRTTAB -1,12.

       PHDR    -1,0,PH$REE!PH$REU      ;define program header

       .OFINI                          ;define variables
       .OFDEF  BUFFER,80.              ;one called BUFFER
       .OFDEF  FILE,D.DDB              ;one called file
       .OFSIZ  IMPSIZ

       GETIMP  IMPSIZ,A3               ;A3 will always point to BUFFER

       ;Ask user if they would like a screen or file display
       ;
       DIM
       TYPE    <Output >
       BRIGHT
       TYPE    <SYSMSG.USA >
       DIM
       TYPE    <to a >
       BRIGHT
       TYPE    <F>
       DIM
       TYPE    <ile or >
       BRIGHT
       TYPE    <S>
       DIM
       TYPE    <creen? >
       BRIGHT
       KBD
       CTRLC   DONE                    ;quit on ^C
       CMPB    @A2,#'F                 ;look for File
       BNE     SYSMSG                  ;not file option
       MOV     #123,D3                 ;"flag" set to "file option"
       CALL    FILINI                  ;and initialize file

       ;Setup initial loop, initialize
       ;
SYSMSG: CLR     D1                      ;clear message counter
LOOP:   CTRLC   DONE                    ;quit on ^C
       INC     D1                      ;increment message counter
       CMP     D1,#260.                ;all messages typed?
       JEQ     DONE                    ;yup

       ;If file option, output message to file, else output message to screen
       ;
       CMP     D3,#123                 ;File option selected?
       BNE     10$                     ;nope, screen
       CALL    FILOPT                  ;yup, output message to file
       BR      LOOP                    ;and loop
10$:    CALL    TYPEEM                  ;else type to screen
       BR      LOOP                    ;and loop



       ;SUBROUTINE to type out each message of SYSMSG.USA to screen
       ;
TYPEEM: TYPE    <Msg >                  ;start message
       DCVT    3,OT$TRM!OT$ZER         ;output message number
       TYPE    <: >                    ;and fancy ":"
       LEA     A2,BUFFER(A3)           ;point A2 to BUFFER variable
       PUSH    A2                      ;save this pointer on stack
       MOV     A2,A1                   ;copy pointer to A1
       SMSG    D1,OT$MEM               ;"type" message into BUFFER
       CLRB    @A2                     ;end message with null

       ;After message in A2, parse message to get rid of "_Message #.."
       ;
10$:    CMPB    @A1,#0                  ;at end of message?
       BEQ     20$                     ;yup, type it out to the screen
       CMPB    (A1)+,#40               ;nope, look for "_Message.."
       BNE     10$                     ;didn't even find the "_"
       CMPB    @A1,#'M                 ;found "_", how about "_M"
       BNE     10$                     ;nope
       CLRB    @A1                     ;yup, end the message right here

       ;Message parsed and ready to be displayed
       ;
20$:    POP     A2                      ;restore pointer to start of BUFFER
       TTYL    @A2                     ;type message out
       CRLF                            ;nice fancy return
       RTN                             ;done with message



       ;SUBROUTINE to output one message from SYSMSG.USA to SYSMSG.LST
       ;
FILOPT: PUSH    D1                      ;save message counter
       CLR     D1                      ;clear character register
       MOVB    #'M,D1                  ;get "Msg_" into file
       FILOTB  @A4
       MOVB    #'s,D1
       FILOTB  @A4
       MOVB    #'g,D1
       FILOTB  @A4
       MOVB    #40,D1
       FILOTB  @A4
       MOV     @SP,D1                  ;get message number
       MOV     A4,A2                   ;point A2 to DDB
       DCVT    3,OT$DDB!OT$ZER         ;output message number to file
       MOVB    #':,D1
       FILOTB  @A4                     ;"Msg #:" created

       ;get message into BUFFER varaible
       ;
       LEA     A2,BUFFER(A3)           ;point A2 to BUFFER variable
       PUSH    A2                      ;save this pointer on stack
       MOV     A2,A1                   ;copy pointer to A1
       MOV     4(SP),D1                ;get the message number into D1
       SMSG    D1,OT$MEM               ;"type" message into BUFFER
       CLRB    @A2                     ;end message with null

       ;After message in A2, parse message to get rid of "_Message #.."
       ;
10$:    CMPB    @A1,#0                  ;at end of message?
       BEQ     20$                     ;yup, move message to file
       CMPB    (A1)+,#40               ;nope, look for "_Message.."
       BNE     10$                     ;didn't even find the "_"
       CMPB    @A1,#'M                 ;found "_", how about "_M"
       BNE     10$                     ;nope
       CLRB    @A1                     ;yup, end the message right here

       ;Message parsed and ready to be displayed
       ;
20$:    POP     A2                      ;restore pointer to start of BUFFER
30$:    MOVB    (A2)+,D1                ;get character into D1
       CMPB    D1,#0                   ;end of message?
       BEQ     40$                     ;yup, output a RETURN
       FILOTB  @A4                     ;nope, output message character
       BR      30$

       ;Message complete, output a CRLF
       ;
40$:    MOVB    #15,D1                  ;here is the CR
       FILOTB  @A4
       MOVB    #12,D1                  ;and here is the LF
       FILOTB  @A4
       POP     D1                      ;restore message number
       TYPE    <.>                     ;one dot for each message to screen
       RTN                             ;done with message




       ;SUBROUTINE to initialize SYSMSG.LST file. Called only once
       ;
FILINI: LEA     A4,FILE(A3)             ;point to FILE with A4
       LEA     A2,SYSFIL               ;point A2 to "input" filename
       FSPEC   @A4                     ;fill in DDB with filespec
       INIT    @A4                     ;initialize DDB
       LOOKUP  @A4                     ;there?
       BNE     10$                     ;nope, all ok
       DSKDEL  @A4                     ;yup, get rid of old file
10$:    OPENO   @A4                     ;and open file for output
       RTN                             ;done with FILINI

SYSFIL: ASCII   /SYSMSG.LST/
       BYTE    15,12,0
       EVEN



       ;Everyone comes here when the work is done
       ;
DONE:   CMP     D3,#123                 ;files open?
       BNE     10$                     ;nope
       CLOSE   FILE(A3)                ;yup, close the file
       TYPECR  <!>                     ;final screen output
10$:    EXIT                            ;bye-bye

       END