home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug081.ark / POW2.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  41.5 KB  |  2,614 lines

  1. ;POW FROM DR. DOBBS JOURNAL NO. 29, PAGE 20
  2.  
  3. ;....POW....Assemble with CP/M ASM
  4.  
  5. ;Revisions (in reverse order):
  6.  
  7. ;04-20 FEB 82 ... CP/M MODS VERSION 2
  8. ;BY: WILLIAM R. BRANDONI
  9. ;    DIAMOND-SHAMROCK CORP.
  10. ;    P.O. BOX 348
  11. ;    PAINESVILLE, OHIO 44077
  12. ;    (216) 357-3680
  13. ;MAJOR REVISIONS:
  14. ; 1) Automatic processing of files larger than memory (OPTIONAL).
  15. ; 2) Changed :CT and :CC commands.
  16. ; 3) New :CD :CE :CN :CS :CU :FN :FY :JR :MD :MN :MS commands added.
  17. ; 4) New "C" and "V" options added ("V" OPTIONAL)
  18. ; 5) New "quoted space" character (#) added.
  19. ;MINOR REVISIONS:
  20. ; 6) Minor changes to some routines.  Among them are:
  21. ;     * DISKIN now recognizes CPM EOF character. Avoids some
  22. ;    occasional junk on last page. Other mods, too.
  23. ;     * NPAG now works properly even if page number is reset
  24. ;    to zero during text output.
  25. ;     * Menu input can be in lower or upper case.
  26. ;     * Some labels have been altered.
  27. ; 7) Revised option message, repeats at each prompt.
  28. ; 8) Ctrl-C returns to menu. MUST USE "Q" TO QUIT.
  29. ; 9) "BELL" added to some messages.
  30. ;10) Default page length changed. Total is now 66 for
  31. ;    standard page size.
  32. ;11) Source code restructured. Added user EQU section.
  33. ;    Changed/added some comments.
  34. ;    Code is arranged as follows:
  35. ;    **1**  INITIAL EQUATES
  36. ;    **2**  START OF PROGRAM
  37. ;    **3**  TEXT FOR ALL MESSAGES
  38. ;    **4**  GET OPTION FROM KEYBOARD
  39. ;    **5**  MAIN LOOP
  40. ;    **6**  LOOK FOR A COMMAND
  41. ;    **7**  COMMAND PROCESSING ........ alphabetized
  42. ;    **8**  PRINTER OUTPUT ROUTINES
  43. ;    **9**  POW UTILITY ROUTINES ...... alphabetized
  44. ;   **10**  SUPPORT UTILITY ROUTINES .. alphabetized
  45. ;   **11**  VARIABLE DEFINITIONS, BUFFERS, AND STACK SPACE
  46.  
  47.  
  48. ;30 JULY 79....MODS FOR CP/M
  49. ;BY BOTTER REEVES...LOY NAVA CO. LTD.
  50. ;1229/27 NEW ROAD, BANGKOK 5, THAILAND
  51. ;233-4193
  52.  
  53.  
  54. ;DEC 16-30,  1977 :
  55. ;MODIFIED FOR FDOS JUN 3,1978
  56. ;SELECTRIC MODS JUNE 15,1978
  57. ;TOTAL JUSTIFICATION FIXED JULY 20, 1978
  58.  
  59.  
  60. ;BY HERMAN WATSON
  61. ;P.O. BOX 341401
  62. ;CORAL GABLES, FLA 33134
  63.  
  64.  
  65. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  66. ; **1** INITIAL EQUATES
  67. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  68.  
  69. FALSE    EQU    0
  70. TRUE    EQU    NOT FALSE
  71.  
  72. ;  *  *  *  *  *  *  *    *  *  *  *  *  *  *  *    *  *  *
  73.  
  74. ; USER DEFINABLE EQUATES
  75.  
  76. BASE    EQU    0000H    ;<----SET TO BASE OF YOUR CP/M
  77.  
  78. BIGFILE EQU    TRUE    ;<----ENABLE INPUT FILES LARGER THAN MEMORY
  79.             ;     Sets up more buffers, modifies/defines
  80.             ;     routines, checks memory addresses,
  81.             ;     and continues file loading during
  82.             ;     processing.
  83.  
  84. VIEWCRT EQU    TRUE    ;<----ENABLE THE "V" OPTION
  85.             ;     Allows display of output on CRT console.
  86.  
  87. CRTLN    EQU    24    ;<----SET TO NO. OF LINES ON YOUR CRT
  88.             ;     Only used if VIEWCRT is TRUE.
  89.  
  90. ;  *  *  *  *  *  *  *    *  *  *  *  *  *  *  *    *  *  *
  91.  
  92. ; MISC. EQUATES
  93.  
  94. BEGIN    EQU    BASE+100H
  95.  
  96. ; SPECIAL CHARACTERS
  97.  
  98. COMAND    EQU    ':'    ;COMMAND IDENTIFIER
  99. DNSHFT    EQU    '\'    ;DOWNSHIFT
  100. UPSHFT    EQU    '^'    ;UPSHIFT
  101. NQUOTE    EQU    '['    ;QUOTE NEXT
  102. QSPACE    EQU    '#'    ;QUOTED SPACE
  103.  
  104. BELL    EQU    7
  105. LF    EQU    10
  106. FF    EQU    12
  107. CR    EQU    13
  108. SPQ    EQU    ' ' OR 10000000B ;SPACE WITH HIGH BIT ON
  109.  
  110. ; CP/M EQUATES
  111.  
  112. RESTRT    EQU    BASE    ;CP/M REBOOT
  113. BDOS    EQU    BASE+5    ;CP/M ENTRY FOR I/O
  114. CPMEOF    EQU    1AH    ;CP/M EOF IS CTRL-Z
  115.  
  116. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  117. ; **2** START OF PROGRAM
  118. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  119.  
  120.     ORG    BEGIN    ;START LOC FOR COM FILE
  121.  
  122. START:    LXI    SP,STACK
  123.  
  124.     IF    BIGFILE
  125.  
  126.     ;FIND TPA LIMIT FROM BDOS JUMP
  127.  
  128.     LHLD    BDOS+1    ;GET BDOS START
  129.     DCR    H    ;DROP BELOW BDOS
  130.     MVI    L,0    ;AND SET TO EVEN PAGE BOUNDRY
  131.     SHLD    MEMSIZ
  132.  
  133.     ;STORE VALUE OF "TEST"
  134.  
  135.     LXI    H,TEXT
  136.     SHLD    HLVAL
  137.  
  138.     ;COMPUTE "OFFSET" = "MEMSIZ" - "TEXT" - "NMOVED"
  139.  
  140.     LXI    B,MEMSIZ
  141.     LXI    D,OFFSET
  142.     LXI    H,HLVAL
  143.     CALL    SUB2
  144.     LXI    B,OFFSET
  145.     LXI    D,OFFSET
  146.     LXI    H,NMOVED
  147.     CALL    SUB2
  148.  
  149.     ;COMPUTE "TMOVED" = "TEXT" + "NMOVED"
  150.  
  151.     LXI    B,HLVAL
  152.     LXI    D,TMOVED
  153.     LXI    H,NMOVED
  154.     CALL    ADD2
  155.  
  156.     ENDIF
  157.  
  158.     LXI    H,STMSG
  159.     CALL    TXTYP
  160.     JMP    MAIN
  161.  
  162. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  163. ; **3** TEXT FOR ALL MESSAGES
  164. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  165.  
  166. STMSG:    DB    LF,CR,LF,'...PROCESSOR OF WORDS...',CR,LF
  167.     DB    '      Version  2.0',CR,LF
  168.     DB    '      (Feb.  1982)',CR,LF,LF
  169.     DB    'Options are:',CR,LF,'$'
  170.  
  171. PROMPT: DB    '  "L" = LOAD file',CR,LF
  172.     IF    VIEWCRT
  173.     DB    '  "V" = VIEW on console',CR,LF
  174.     ENDIF
  175.     DB    '  "P" = PAGE print',CR,LF
  176.     DB    '  "C" = CONTINUOUS print',CR,LF
  177.     DB    '  "Q" = QUIT',CR,LF,LF
  178.     DB    'Enter Option ...... $'
  179.  
  180. GREET:    DB    'Enter File Name ... $'
  181.  
  182. NOFMS:    DB    BELL,'FILE NOT FOUND$'
  183.  
  184. PAGMS:    DB    BELL,LF,'Press any key when printer is'
  185.     DB    ' ready (ctrl-C to abort)$'
  186.  
  187.     IF    BIGFILE
  188. MEMMSG: DB    BELL,'*** MEMORY FULL *** will read as needed$'
  189. BUFMSG: DB    BELL,'*** Reading more data ***$'
  190.     ENDIF
  191.  
  192.     IF    VIEWCRT
  193. VIEWMS: DB    BELL,LF,'Press any key to view next screen full'
  194.     DB    ' (ctrl-C to abort)'
  195.     DB    CR,LF,LF,'This message will not be repeated$'
  196. VPGMSG: DB    CR,LF,'---------- End of Page ----------$',CR,LF,LF
  197.     ENDIF
  198.  
  199. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  200. ; **4** GET OPTION FROM KEYBOARD
  201. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  202.  
  203. ;ALLOW 'L', 'V', 'C', 'P' OR 'Q' ONLY.
  204. ;"LOAD", "VIEW", "PRINT", "QUIT"
  205.  
  206. MAIN:    CALL    ECHO1
  207.     MVI    A,1    ;RESET SOME FLAGS TO DEFAULT STATUS
  208.     STA    LPOS
  209.     XRA    A
  210.     STA    CDBLF
  211.     STA    COMNT
  212.     STA    CUNLF
  213.     STA    DBLPF
  214.     STA    PAGN
  215.     STA    SOT
  216.     STA    TCNT
  217.  
  218.     IF    VIEWCRT
  219.     STA    VIEW
  220.     ENDIF
  221.  
  222.     LXI    H,PROMPT
  223.     CALL    TXTYP
  224.     CALL    CI    ;GET CHAR FROM CONSOLE
  225.     MOV    C,A
  226.     CALL    ECHO1
  227.     MOV    A,C
  228.  
  229.     IF    VIEWCRT
  230.     CPI    'V'    ;IS IT "V"?
  231.     JNZ    MAIL
  232.     MOV    C,A    ;YES -- SET FLAGS TO 1
  233.     MVI    A,1
  234.     STA    WAIT
  235.     STA    VIEW
  236.     LXI    H,VIEWMS ;OPERATOR MESSAGE FIRST
  237.     CALL    TXTYP
  238.     CALL    ECHO1
  239.     CALL    ABTST
  240.     JMP    MAIN2
  241.     ENDIF
  242.  
  243. MAIL:    CPI    'L'    ;IS IT "L"?
  244.     JNZ    MAIC
  245.     XRA    A
  246.     STA    COMNT    ;CLEAR COMMENT FLAG
  247.  
  248.     IF    BIGFILE
  249.     STA    MEMOVF    ;CLEAR OVERFLOW FLAGS
  250.     STA    MSGOVF
  251.     ENDIF
  252.  
  253.     CALL    FDIN    ;LOAD TEXT FROM DISK
  254.     JMP    MAIN
  255.  
  256. MAIC:    CPI    'C'    ;IS IT "C"?
  257.     JNZ    MAIP
  258.     MOV    C,A    ;YES -- SET "WAIT" TO 1
  259.     MVI    A,1
  260.     STA    WAIT
  261.     LXI    H,PAGMS ;OPERATOR MESSAGE FIRST
  262.     CALL    TXTYP
  263.     CALL    ECHO1
  264.     CALL    ABTST
  265.     JMP    MAIN2
  266.  
  267. MAIP:    CPI    'P'    ;IS IT "P"?
  268.     JNZ    MAIQ
  269.     MOV    C,A    ;YES -- SET "WAIT" TO 0
  270.     XRA    A
  271.     STA    WAIT
  272.  
  273. MAIN2:    MOV    A,C
  274.     LXI    H,TEXT    ;PROCESS TEXT AND COMMANDS
  275.     SHLD    APNT
  276.     CALL    CLOS
  277.     CALL    NEWL
  278.     JMP    PRINT
  279.  
  280. MAIQ:    CPI    'Q'    ;IS IT "Q"?
  281.     JNZ    MAIN    ;LOOP BACK IF NOT L,V,C,P,OR Q
  282.     JMP    RESTRT    ;REBOOT CP/M
  283.  
  284. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  285. ; **5** MAIN LOOP
  286. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  287.  
  288. ;COMMAND DECODER AND PRINT LOOP
  289. ;THIS IS THE MAIN TEXT AND WORD PROCESSING LOOP
  290. ;HERE, WE GET THE NEXT CHAR FROM TEXT AND SEE
  291. ;IF A COMMAND, OR PROCESSED TEXT
  292.  
  293. PRINT:    LHLD    APNT    ;SOURCE TEXT POINTER
  294. PRLP:    MOV    A,M
  295.     INX    H
  296.  
  297.     IF    BIGFILE
  298.     CALL    BUFTST
  299.     ENDIF
  300.  
  301.     CPI    3    ;END OF TEXT?
  302.     JC    EOF
  303.  
  304.     CPI    COMAND    ;BEGINNING OF COMMAND?
  305.     JZ    CMND
  306.  
  307.     MOV    B,A    ;COMMENTS?
  308.     LDA    COMNT
  309.     ORA    A
  310.     JZ    PRLP1    ;IF NOT, DO NORMAL PROCESSING
  311.     SHLD    APNT
  312.     JMP    PRLP
  313.  
  314. PRLP1:    MOV    A,B
  315.     CALL    CAPR    ;DO CASE PROCESSING
  316.     JC    PRLP    ;LETTER WAS TO BE IGNORED
  317.     MOV    B,A
  318.  
  319.     CPI    NQUOTE    ;QUOTE NEXT?
  320.     JNZ    PROQ
  321.     MOV    B,M    ;OUTPUT WITHOUT QUESTION
  322.     INX    H
  323.  
  324.     IF    BIGFILE
  325.     CALL    BUFTST
  326.     ENDIF
  327.  
  328.     JMP    PROC
  329.  
  330. PROQ:    CPI    QSPACE    ;QUOTED SPACE?
  331.     JNZ    PROC
  332.     MVI    B,SPQ    ;REPLACE IT
  333.  
  334. PROC:    LDA    JFLG    ;PROCESS A LETTER
  335.     ORA    A
  336.     MOV    A,B
  337.     SHLD    APNT
  338.     JZ    NOFM
  339.     CALL    FMAT    ;LEFT, RIGHT OR TOTAL JUST.
  340.     JMP    PRINT
  341. NOFM:    CALL    UFMT    ;NO JUSTIFICATION
  342.     JMP    PRINT
  343. EOF:    CALL    CLOS    ;CLOSE PENDING LINE
  344.     XRA    A
  345.     STA    EOT
  346.     CALL    NPAG
  347.     MVI    A,0FFH
  348.     STA    EOT
  349.     JMP    MAIN
  350.  
  351. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  352. ; **6** LOOK FOR A COMMAND
  353. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  354.  
  355. ;COMMAND IDENTIFIER WAS ENCOUNTERED IN TEXT
  356. ;THIS TESTS NEXT TWO CHARACTERS
  357. ;AGAINST ALL COMMANDS TO FIND COMMAND
  358. ;AND CALL IT
  359.  
  360. CMND:    MOV    B,M
  361.     INX    H
  362.  
  363.     IF    BIGFILE
  364.     CALL    BUFTST
  365.     ENDIF
  366.  
  367.     MOV    C,M
  368.     INX    H
  369.  
  370.     IF    BIGFILE
  371.     CALL    BUFTST
  372.     ENDIF
  373.  
  374.     SHLD    CEPT    ;POINTS TO DELIMITER
  375.     LXI    H,CTAB
  376.  
  377.     ;LOOP TO FIND MATCH
  378.  
  379. CLOP:    MOV    A,M
  380.     INX    H
  381.     ORA    A
  382.     JZ    CRTN
  383.     CMP    B
  384.     JZ    ONEM
  385.  
  386.     ;HERE FIRST LETTER FAIL
  387.  
  388.     LDA    COMNT    ;TEST FOR COMMENTS
  389.     ORA    A
  390.     JNZ    CRTN
  391.     INX    H
  392.     INX    H
  393.     INX    H
  394.     JMP    CLOP
  395.  
  396.     ;HERE FIRST LETTER MATCH
  397.  
  398. ONEM:    MOV    A,M
  399.     INX    H
  400.     CMP    C
  401.     JZ    TWOM
  402.  
  403.     ;HERE SECOND LETTER FAIL
  404.  
  405.     LDA    COMNT    ;TEST FOR COMMENTS
  406.     ORA    A
  407.     JNZ    CRTN
  408.     INX    H
  409.     INX    H
  410.     JMP    CLOP
  411.  
  412. ;COMMAND MATCH
  413.  
  414. TWOM:    MOV    E,M    ;LOAD ADDR
  415.     INX    H
  416.     MOV    D,M
  417.     LHLD    CEPT
  418.     SHLD    APNT    ;POINTING AT DELIMITER
  419.     LXI    H,PRINT ;SET UP RETURN
  420.     PUSH    H
  421.     XCHG
  422.     PCHL        ;GO TO COMMAND ROUTINE
  423.  
  424. ;FAILED TO MATCH A COMMAND
  425. ;OR END OF COMMAND PROCESSING
  426.  
  427. CRTN:    LHLD    APNT
  428.     MOV    B,M
  429.     INX    H
  430.  
  431.     IF    BIGFILE
  432.     CALL    BUFTST
  433.     ENDIF
  434.  
  435.     LDA    ACCSAV
  436.     ORA    A
  437.     JZ    PROC    ;NOT COMMENT - PROCESS IT
  438.     SHLD    APNT    ;ELSE SAVE POINTER AND DO AGAIN
  439.     JMP    PRLP
  440.  
  441. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  442. ; **7** COMMAND PROCESSING
  443. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  444.  
  445. ;THE COMMAND TABLE
  446.  
  447. CTAB:    DW    'CE'    ;CE MUST BE FIRST COMMAND IN TABLE SINCE
  448.     DW    COME    ;FIRST IS ONLY ONE SCANNED IF CS ACTIVE
  449.     DW    'BM'
  450.     DW    BMES
  451.     DW    'BP'
  452.     DW    BRKP
  453.     DW    'CC'
  454.     DW    CEND
  455.     DW    'CD'
  456.     DW    CDBL
  457.     DW    'CM'
  458.     DW    MIDC
  459.     DW    'CN'
  460.     DW    CNRM
  461.     DW    'CS'
  462.     DW    COMS
  463.     DW    'CT'
  464.     DW    CENT
  465.     DW    'CU'
  466.     DW    CUNL
  467.     DW    'DB'
  468.     DW    DBRK
  469.     DW    'DM'
  470.     DW    DMAR
  471.     DW    'DT'
  472.     DW    DTAB
  473.     DW    'FN'
  474.     DW    FFDN
  475.     DW    'FY'
  476.     DW    FFDY
  477.     DW    'JE'
  478.     DW    ENDJ
  479.     DW    'JL'
  480.     DW    LEFJ
  481.     DW    'JR'
  482.     DW    RITJ
  483.     DW    'JT'
  484.     DW    TOTJ
  485.     DW    'LF'
  486.     DW    LNFD
  487.     DW    'MD'
  488.     DW    MDBL
  489.     DW    'MN'
  490.     DW    MCLR
  491.     DW    'MS'
  492.     DW    MSGS
  493.     DW    'NP'
  494.     DW    NPAG
  495.     DW    'OF'
  496.     DW    OPOF
  497.     DW    'ON'
  498.     DW    OPON
  499.     DW    'PB'
  500.     DW    PGBT
  501.     DW    'PG'
  502.     DW    FPAG
  503.     DW    'PL'
  504.     DW    DPAG
  505.     DW    'PN'
  506.     DW    SETP
  507.     DW    'PT'
  508.     DW    PGTP
  509.     DW    'SP'
  510.     DW    SPAZ
  511.     DW    'TM'
  512.     DW    TMES
  513.     DB    0    ;LAST ENTRY MUST BE ZERO
  514.  
  515. ;TERMINATE A COMMAND
  516. ;CR,COMMA,SPACE, OR NOTHING ARE OK
  517.  
  518. CTRM:    LHLD    APNT
  519.     MOV    A,M
  520.     INX    H
  521.  
  522.     IF    BIGFILE
  523.     CALL    BUFTST
  524.     ENDIF
  525.  
  526.     SHLD    APNT
  527.     CPI    CR
  528.     RZ
  529.     CPI    ' '
  530.     RZ
  531.     CPI    ','
  532.     RZ
  533.     DCX    H
  534.     SHLD    APNT
  535.     RET
  536.  
  537. ;GET THE NEXT ARGUMENT
  538.  
  539. GARG:    CALL    CDEL
  540.     JNZ    GARE
  541.     CALL    ADEC
  542.     MOV    A,H
  543.     ORA    A
  544.     MOV    A,L
  545.     RZ
  546. GARE:    POP    H
  547.     JMP    CTRM
  548.  
  549. ;BOTTOM MESSAGE                 **BM**
  550.  
  551.     IF    NOT BIGFILE
  552. BMES:    CALL    GARG
  553.     STA    BOTT
  554.     CALL    CDEL
  555.     JNZ    CTRM
  556.     SHLD    BOTA    ;POINT TO MESSAGE
  557.     JMP    TMLP
  558.     ENDIF
  559.  
  560.     IF    BIGFILE
  561. BMES:    CALL    GARG
  562.     STA    BOTT
  563.     CALL    CDEL
  564.     JNZ    CTRM
  565.     LXI    D,BOTBUF  ;MOVE MESSAGE INTO BUFFER
  566.     LDA    BBSZ
  567.     MOV    B,A
  568.     CALL    BUFILL
  569.     SHLD    APNT    ;POINT PAST MESSAGE
  570.     RET
  571.     ENDIF
  572.  
  573. ;BREAK FOR A NEW PARAGRAPH            **BP**
  574.  
  575. BRKP:    CALL    CLOS    ;CLEAR LINE
  576.     LDA    PPOS    ;GET PAGE POSITION
  577.     ORA    A
  578.     JZ    BRKT    ;NO LF AT TOP OF PAGE
  579.     LDA    BRLF
  580.     STA    CETM
  581.     CALL    LFDO
  582. BRKT:    LDA    BRTB
  583.     CALL    PUTB
  584.     JMP    CTRM
  585.  
  586. ;CENTER COPY (PRINT AGAIN)            **CC**
  587.  
  588. CEND:    CALL    OUTCEN
  589.     JMP    CTRM
  590.  
  591. ;CENTER DOUBLESTRIKE                **CD**
  592.  
  593. CDBL:    CALL    GARG    ;GET VALUE
  594.     CPI    10    ;LIMIT THE VALUE
  595.     JC    CDBL1
  596.     MVI    A,10
  597. CDBL1:    STA    CDBSAV    ;STORE LAST :CD ARG
  598.     ORA    A    ;IF ZERO, USE :CN COMMAND
  599.     JZ    CNRM1
  600.     PUSH    B
  601.     MOV    C,A
  602.     LDA    DBLPF    ;ADD TO MASTER
  603.     ADD    C
  604.     POP    B
  605.     STA    CDBLF    ;STORE IT
  606.  
  607.     IF    VIEWCRT
  608.     LDA    VIEW    ;TEST FOR VIEW OPTION
  609.     ORA    A
  610.     JZ    CTRM
  611.     XRA    A
  612.     STA    CDBLF    ;CLEAR IT
  613.     ENDIF
  614.  
  615.     JMP    CTRM
  616.  
  617. ;COMMENT END                    **CE**
  618.  
  619. COME:    XRA    A    ;ZERO = NOT COMMENT
  620.     STA    COMNT
  621.     JMP    CTRM
  622.  
  623. ;CENTER MARGIN MESSAGE                **CM**
  624.  
  625. MIDC:    LDA    RMAR
  626.     LXI    H,LMAR
  627.     SUB    M
  628.     RAR        ;DIVIDE BY TWO
  629.     ADD    M
  630.     JMP    CENA
  631.  
  632. ;CENTER NORMAL PRINT                **CN**
  633.  
  634. CNRM:    XRA    A    ;CLEAR CENTER UNDERLINE
  635.     STA    CUNLF
  636. CNRM1:    LDA    DBLPF    ;RESET CENTER DOUBLESTRIKE
  637.     STA    CDBLF
  638.     JMP    CTRM
  639.  
  640. ;COMMENT START                    **CS**
  641.  
  642. COMS:    MVI    A,0FFH
  643.     STA    COMNT
  644.     JMP    CTRM
  645.  
  646. ;CENTER TAB MESSAGE                **CT**
  647.  
  648. CENT:    CALL    GARG    ;GET TAB
  649.  
  650. CENA:    STA    CETM    ;STORE TAB
  651.     CALL    CDEL
  652.     JNZ    CTRM
  653.     SHLD    CEPT    ;POINT TO MESSAGE
  654.     CALL    CLOS
  655.     CALL    NEWCB    ;CLEAN CENBUF
  656.     MVI    C,0
  657.     LHLD    CEPT    ;START OF MESSAGE ADDRESS
  658.  
  659.     ;COUNT CHARS IN MESSAGE
  660.  
  661. CECC:    MOV    A,M
  662.     INX    H
  663.     CALL    CAPR    ;DO CASE PROCESSING
  664.     JC    CECC    ;LETTER IS TO BE IGNORED
  665.     INR    C
  666.     CPI    CR
  667.     JNZ    CECC
  668.  
  669.     ;COMPUTE POSN OF FIRST LETTER OF MESSAGE
  670.  
  671.     MOV    A,C
  672.     ORA    A
  673.     RAR
  674.     MOV    C,A
  675.     LDA    CETM
  676.     SUB    C
  677.     SHLD    APNT    ;POINT PAST MESSAGE
  678.  
  679.     LXI    H,CENBUF ;COMPUTE LADR FOR MESSAGE
  680.     CALL    ADAH
  681.     XCHG
  682.     LHLD    CEPT    ;START OF MESSAGE ADDRESS
  683.  
  684. CEMV:    MOV    A,M    ;MOVE IT TO CENBUF
  685.     INX    H
  686.     CALL    CAPR    ;DO CASE PROCESSING AGAIN
  687.     JC    CEMV    ;LETTER TO BE IGNORED
  688.     CPI    CR
  689.     JZ    CEMV2
  690.     STAX    D
  691.     INX    D
  692.     JMP    CEMV
  693. CEMV2:    STAX    D
  694.     JMP    OUTCEN
  695.  
  696. ;CENTER UNDERLINE                **CU**
  697.  
  698. CUNL:    MVI    A,1    ;SET UNDERLINE
  699.     STA    CUNLF
  700.  
  701.     IF    VIEWCRT
  702.     LDA    VIEW    ;TEST VIEW OPTION
  703.     ORA    A
  704.     JZ    CTRM
  705.     XRA    A    ;CLEAR UNDERLINE
  706.     STA    CUNLF
  707.     ENDIF
  708.  
  709.     JMP    CTRM
  710.  
  711. ;DEFINE A PARAGRAPH BREAK.            **DB**
  712.  
  713. DBRK:    CALL    GARG
  714.     STA    BRLF
  715.     CALL    GARG
  716.     STA    BRTB
  717.     JMP    CTRM
  718.  
  719. ;DEFINE MARGINS.                **DM**
  720.  
  721. DMAR:    CALL    GARG
  722.     STA    LMAR
  723.     STA    BRTB    ;SET THAT TOO
  724.     CALL    GARG
  725.     STA    RMAR
  726.     CALL    CLOS
  727.     CALL    NEWL
  728.     JMP    CTRM
  729.  
  730. ;DEFINE TABS (14 MAX.)                **DT**
  731.  
  732. DTAB:    LXI    H,TTAB
  733.     SHLD    TBAD
  734. DTBL:    CALL    CDEL
  735.     JNZ    DTBX
  736.     CALL    ADEC
  737.     MOV    A,L
  738.     LHLD    TBAD
  739.     MOV    M,A
  740.     INX    H
  741.     SHLD    TBAD
  742.     JMP    DTBL
  743. DTBX:    LHLD    TBAD
  744.     MVI    M,0
  745.     JMP    CTRM
  746.  
  747. ;FORM FEED - NO                 **FN**
  748.  
  749. FFDN:    XRA    A
  750.     STA    FFLG
  751.     JMP    CTRM
  752.  
  753. ;FORM FEED - YES                **FY**
  754.  
  755. FFDY:    MVI    A,0FFH
  756.     STA    FFLG
  757.     JMP    CTRM
  758.  
  759. ;CLOSE PRESENT LINE AND SET TO NO JUST. MODE    **JE**
  760.  
  761. ENDJ:    CALL    CLOS
  762.     XRA    A
  763.     STA    JFLG
  764.     JMP    CTRM
  765.  
  766. ;SET LEFT JUSTIFICATION MODE            **JL**
  767.  
  768. LEFJ:    MVI    A,1
  769.     STA    JFLG
  770.     JMP    CTRM
  771.  
  772. ;SET RIGHT JUSTIFICATION MODE            **JR**
  773.  
  774. RITJ:    MVI    A,3
  775.     STA    JFLG
  776.     JMP    CTRM
  777.  
  778. ;SET TOTAL JUSTIFICATION MODE            **JT**
  779.  
  780. TOTJ:    MVI    A,2
  781.     STA    JFLG
  782.     JMP    CTRM
  783.  
  784. ;LINE FEED COMMAND (IGNORE ZERO LF'S)        **LF**
  785.  
  786. LNFD:    CALL    GARG
  787.     STA    CETM
  788.     CALL    LFDO
  789.     JMP    CTRM
  790.  
  791. ;MASTER DOUBLESTRIKE                **MD**
  792.  
  793. MDBL:    CALL    GARG
  794.     CPI    10    ;LIMIT THE VALUE
  795.     JC    MDBL1
  796.     MVI    A,10
  797. MDBL1:    ORA    A    ;IF ZERO, USE :MN COMMAND
  798.     JZ    MCLR
  799.     STA    DBLPF    ;STORE MASTER DOUBLE
  800.     PUSH    B
  801.     MOV    C,A
  802.     LDA    CDBLF    ;ADD TO CENTER DOUBLE
  803.     ADD    C
  804.     STA    CDBLF    ;STORE CENTER DOUBLE
  805.     POP    B
  806.  
  807.     IF    VIEWCRT
  808.     LDA    VIEW    ;TEST VIEW OPTION
  809.     ORA    A
  810.     JZ    CTRM
  811.     XRA    A
  812.     STA    DBLPF    ;CLEAR MASTER
  813.     STA    CDBLF    ;CLEAR CENTER
  814.     ENDIF
  815.  
  816.     JMP    CTRM
  817.  
  818. ;MASTER NORMAL                    **MN**
  819.  
  820. MCLR:    LDA    CDBSAV    ;RESET CENTER TO LAST :CD ARG
  821.     STA    CDBLF
  822.     XRA    A    ;CLEAR MASTER
  823.     STA    DBLPF
  824.  
  825.     IF    VIEWCRT
  826.     LDA    VIEW    ;TEST FOR VIEW OPTION
  827.     ORA    A
  828.     JZ    CTRM
  829.     XRA    A
  830.     STA    CDBLF    ;CLEAR CENTER
  831.     ENDIF
  832.  
  833.     JMP    CTRM
  834.  
  835.  
  836. ;BOTTOM AND TOP MESSAGE START            **MS**
  837.  
  838. MSGS:    CALL    GARG
  839.     STA    STMS
  840.     JMP    CTRM
  841.  
  842. ;FORCE BOTTOM PRESENT PAGE AND START NEW ONE    **NP**
  843.  
  844. NPAG:    LDA    SOT
  845.     ORA    A
  846.     JZ    DVDR
  847.     CALL    CLOS
  848.     CALL    NEWL
  849.     LDA    PLEN
  850.     STA    CETM
  851.     CALL    LFDO
  852.     JMP    CTRM
  853.  
  854. ;TURN OFF PRINTER OUTPUT            **OF**
  855.  
  856. OPOF:    XRA    A    ;ZERO TURNS OFF OUTPUT
  857.     STA    OPST
  858.     JMP    CTRM
  859.  
  860. ;TURN ON PRINTER OUTPUT             **ON**
  861.  
  862. OPON:    MVI    A,0FFH    ;NON-ZERO MEANS ON
  863.     STA    OPST
  864.     JMP    CTRM
  865.  
  866. ;DEFINE BOTTOM OF PAGE                **PB**
  867.  
  868. PGBT:    CALL    GARG
  869.     STA    BLEN
  870.     CALL    GARG
  871.     STA    BOTN
  872.     JMP    CTRM
  873.  
  874. ;IMMEDIATELY FORCE A PAGE START         **PG**
  875.  
  876. FPAG:    CALL    DVDR
  877.     JMP    CTRM
  878.  
  879. ;DEFINE PAGE LENGTH                **PL**
  880.  
  881. DPAG:    CALL    GARG
  882.     STA    PLEN
  883.     JMP    CTRM
  884.  
  885. ;PAGE NUMBER                    **PN**
  886.  
  887. SETP:    CALL    GARG
  888.     STA    PAGN
  889.     JMP    CTRM
  890.  
  891. ;DEFINE TOP OF PAGE                **PT**
  892.  
  893. PGTP:    CALL    GARG
  894.     STA    TLEN
  895.     CALL    GARG
  896.     STA    TOPN
  897.     JMP    CTRM
  898.  
  899. ;SET SPACING                    **SP**
  900.  
  901. SPAZ:    CALL    GARG
  902.     STA    SPAS
  903.     JMP    CTRM
  904.  
  905. ;TOP MESSAGE                    **TM**
  906.  
  907.     IF    NOT BIGFILE
  908. TMES:    CALL    GARG
  909.     STA    TOPT
  910.     CALL    CDEL
  911.     JNZ    CTRM
  912.     SHLD    TOPA    ;POINT TO MESSAGE
  913. TMLP:    MOV    A,M
  914.     INX    H
  915.     CPI    CR
  916.     JNZ    TMLP
  917.     SHLD    APNT    ;POINT PAST MESSAGE
  918.     RET
  919.     ENDIF
  920.  
  921.     IF    BIGFILE
  922. TMES:    CALL    GARG
  923.     STA    TOPT
  924.     CALL    CDEL
  925.     JNZ    CTRM
  926.     LXI    D,TOPBUF  ;MOVE MESSAGE INTO BUFFER
  927.     LDA    TBSZ
  928.     MOV    B,A
  929.     CALL    BUFILL
  930.     SHLD    APNT    ;POINT PAST MESSAGE
  931.     RET
  932.     ENDIF
  933.  
  934. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  935. ; **8** PRINTER OUTPUT ROUTINES
  936. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  937.  
  938. ;FORMATTED OUTPUT
  939. ;CALL WITH LETTER IN A
  940. ;HANDLES LEFT, RIGHT OR TOTAL JUSTIFICATION
  941.  
  942. FMAT:    CPI    9    ;TEST TAB
  943.     JZ    TBST
  944.     CPI    CR    ;TEST CARRIAGE RETURN
  945.     JNZ    LFTS
  946.     MVI    A,' '    ;REPLACE CR WITH SPACE
  947. LFTS:    CPI    LF    ;IGNORE LINE FEEDS
  948.     RZ
  949.     CPI    ' '
  950.     JNZ    RFMT
  951.  
  952.     ;NO SPACES AT THE LEFT OF THE LINE
  953.  
  954.     LXI    H,LMAR
  955.     LDA    LPOS
  956.     CMP    M
  957.     RZ        ;AT START, SO STAY THERE
  958.     MVI    A,' '    ;OK TO KEEP SPACE
  959. RFMT:    LHLD    LADR    ;NOW PLACE LETTER IN OUTBUF
  960.     MOV    M,A
  961.     INX    H
  962.     SHLD    LADR
  963.     LXI    H,RMAR    ;CHECK IF OUTBUF FULL
  964.     LDA    LPOS
  965.     INR    A
  966.     STA    LPOS
  967.     CMP    M
  968.     RC
  969.  
  970.     ;OUTBUF FULL. ASSUME LEFT JUST.
  971.     ;BACK UP TO SPACE AND SAVE OVERFLOW
  972.     ;DE=TEMP ADDRESS
  973.     ;C=CHAR COUNT
  974.     ;HL=OUTBUF ADDRESS
  975.  
  976.     MVI    B,30    ;MAX AMOUNT TEML CAN HOLD
  977.     MVI    C,0    ;TEML CHAR COUNT
  978.     LXI    D,TEML
  979.     LHLD    LADR
  980.     MVI    M,CR    ;EOL IN CASE NOT POSSIBLE
  981.  
  982.     ;LOOP BACK TO FIRST SPACE (WITHIN 30 LETTERS
  983.     ;AND WITHOUT HITTING LEFT MARGIN)
  984.  
  985. LJBU:    DCX    H
  986.     MOV    A,M
  987.     CPI    ' '
  988.     JZ    LJFN
  989. LJRT:    STAX    D
  990.     INX    D
  991.     INR    C
  992.     DCR    B
  993.     JZ    OUTL
  994.     JMP    LJBU
  995. LJFN:    DCX    H
  996.     MOV    A,M
  997.     INX    H
  998.     CPI    ' '
  999.     JZ    LJRT
  1000.     MOV    A,C
  1001.     STA    TCNT    ;SAVE CHAR COUNT
  1002.     LDA    LPOS    ;BACK UP LPOS
  1003.     SUB    C
  1004.     STA    LPOS
  1005.     MOV    C,A    ;DON'T GO PAST NEW PARA TAB
  1006.     LDA    BRTB    ;FOR UNMODIFIED INDENTION
  1007.     SUB    C    ;TO THAT TAB POSITION
  1008.     JNC    OUTL    ;TERMS NOT MET
  1009.     SHLD    LADR
  1010.     MVI    M,CR    ;NEW EOL
  1011.  
  1012.     ;TEST HERE IF LEFT, RIGHT, OR TOTAL JUST.
  1013.     ;1=LEFT
  1014.     ;2=TOTAL
  1015.     ;3=RIGHT
  1016.     ;BY THE WAY, AT THIS POINT LEFT JUST. IS DONE.
  1017.  
  1018.     LDA    JFLG
  1019.     CPI    1
  1020.     JZ    OUTL
  1021.     CPI    2
  1022.     JZ    TOTL
  1023.     CPI    3
  1024.     JNZ    OUTL
  1025.  
  1026.     ;RIGHT JUST.
  1027.     ;LINE IS ALREADY LEFT JUSTIFIED,
  1028.     ;SO MOVE TO RIGHT MARGIN AND PAD LEFT.
  1029.  
  1030. RIGHT:    LHLD    LEND
  1031.     XCHG
  1032.     LHLD    LADR
  1033.     LDA    LPOS
  1034.     MOV    C,A
  1035.     CALL    TDHE    ;DE .EQ. HL MEANS PAD DONE
  1036.     JZ    OUTL
  1037.  
  1038.     ;GET LEFTMOST CHAR. POSITION
  1039.     ;(SMALLEST OF BREAK-TAB OR LEFT-MARGIN)
  1040.  
  1041.     LDA    BRTB    ;BREAK
  1042.     MOV    B,A
  1043.     LDA    LMAR    ;MARGIN
  1044.     CMP    B
  1045.     JC    RJUST1
  1046.     MOV    A,B
  1047. RJUST1: STA    ACCSAV
  1048.  
  1049.     ;DO THE MOVE
  1050.  
  1051. RMOVE:    MOV    A,M    ;PICK UP AT LEFT
  1052.     STAX    D    ;STORE AT RIGHT
  1053.     MVI    A,' '    ;AND REPLACE WITH BLANK
  1054.     MOV    M,A
  1055.     DCX    D
  1056.     DCX    H
  1057.     DCR    C
  1058.     LDA    ACCSAV    ;GET LEFTMOST POSITION
  1059.     CMP    C
  1060.     JNZ    RMOVE
  1061.     JMP    OUTL
  1062.  
  1063.     ;TOTAL JUST.
  1064.     ;MOVE LINE TO RIGHT, AND PAD
  1065.     ;IF LMAR REACHED, PUSH LINE LEFT AND
  1066.     ;PAD AGAIN UNTIL DONE
  1067.     ;(HL) .GE. (DE), SO DE IS RIGHT OF HL, AND WHEN
  1068.     ;DE .EQ. HL, THE PADDING IS DONE
  1069.  
  1070.     ;BEGIN AT LAST CHAR AND SHOVE RIGHT
  1071.     ;START PADDING AT THE SFLP SPACE
  1072.     ;(SFLP IS RANDOM) AND CONTINUE
  1073.     ;PADDING EACH OCCURRANCE OF A GROUP
  1074.     ;OF SPACES UNTIL THE TWO POINTERS ARE EQUAL
  1075.     ;TO EACH OTHER
  1076.  
  1077. TOTL:    CALL    RAND    ;INIT SFLP
  1078.     STA    SFLP
  1079.     LHLD    LEND
  1080.     XCHG
  1081.     LHLD    LADR
  1082.     LDA    LPOS
  1083.     MOV    C,A
  1084.     MVI    B,0    ;MAKE SURE SP IS FOUND
  1085.     CALL    TDHE    ;DE .EQ. HL MEANS PAD DONE
  1086.     JZ    OUTL
  1087.  
  1088.     ;RIGHT AND PAD
  1089.  
  1090. RITE:    MOV    A,M    ;PICK UP FROM LEFT
  1091.     STAX    D    ;STORE AT RIGHT
  1092.     CPI    ' '    ;TEST PICKED UP CHAR
  1093.     JNZ    WORD
  1094.     MVI    B,1    ;NOTE THAT SP WAS FOUND
  1095.     LDA    SFLP    ;TST IF WE CAN INSERT YET
  1096.     ORA    A    ;TEST FOR ZERO
  1097.     JZ    PADD    ;CAN'T INSERT YET
  1098.     DCR    A
  1099.     STA    SFLP
  1100.     JMP    WORD    ;NOT YET
  1101. PADD:    LDA    LCHR    ;CHECK IF GROUP OF SPACES
  1102.     CPI    ' '    ;DON'T ALLOW THIS COND.
  1103.     JZ    WRD1
  1104.     MVI    A,' '    ;PADDING DONE HERE
  1105.     DCX    D
  1106.     STAX    D
  1107.     CALL    TDHE
  1108.     JZ    OUTL
  1109. WORD:    MOV    A,M
  1110.     STA    LCHR
  1111. WRD1:    DCX    D    ;REST OF RIGHT AND PAD LOOP
  1112.     DCX    H
  1113.     DCR    C
  1114.     LDA    BRTB    ;ALLOWS INDENTION
  1115.     CMP    C
  1116.     JZ    LEFT    ;HIT INDENTATION
  1117.     LDA    LMAR    ;OR LEFT MARGIN
  1118.     CMP    C
  1119.     JNZ    RITE    ;CAN STILL PROCEED
  1120.  
  1121.     ;PUSH LEFT AND TRY AGAIN
  1122.  
  1123. LEFT:    INX    D
  1124.     INX    H
  1125.     INR    C
  1126.     LDAX    D
  1127.     MOV    M,A
  1128.     CPI    CR
  1129.     JNZ    LEFT
  1130.     XRA    A    ;TEST IF ONE SP FOUND
  1131.     ORA    B
  1132.     JZ    OUTL    ;NOPE, NOT ONE SP FOUND
  1133.     JMP    RITE
  1134.  
  1135. ;OUTPUT A COMPLETE FORMATTED LINE FROM OUTBUF
  1136.  
  1137. OUTL:    LDA    DBLPF    ;GET THE DOUBLE FLAG
  1138.     MOV    C,A
  1139. OUTL1:    LXI    H,OUTBUF ;GET THE LINE
  1140. OUTM:    MOV    A,M
  1141.     INX    H
  1142.     CPI    CR
  1143.     JZ    OUTM1
  1144.     CALL    OUTW
  1145.     JMP    OUTM
  1146. OUTM1:    MVI    A,CR    ;DO A CR
  1147.     CALL    OUTW
  1148.     MOV    A,C
  1149.     DCR    C
  1150.     ORA    A
  1151.     JNZ    OUTL1
  1152. EOL:    CALL    NEWL    ;CLEAN OUTBUF
  1153.     LDA    SPAS    ;PROCESS SPACING
  1154.     MOV    C,A
  1155. EOLP:    CALL    CRLF
  1156.     LDA    PPOS    ;UPDATE TEXT PAGE POSITION
  1157.     INR    A
  1158.     STA    PPOS
  1159.  
  1160.     IF    VIEWCRT
  1161.     LDA    VIEW    ;IS THIS A VIEW?
  1162.     ORA    A
  1163.     JZ    EOLP1
  1164.     LDA    CRTPOS
  1165.     INR    A
  1166.     STA    CRTPOS
  1167.     CPI    CRTLN    ;END OF A SCREEN?
  1168.     JC    EOLP1
  1169.     CALL    ABTST    ;YES - WAIT FOR TYPE AT CONSOLE
  1170.     MVI    A,1
  1171.     STA    CRTPOS    ;RESET CRT POSITION
  1172.     ENDIF
  1173.  
  1174. EOLP1:    LDA    PPOS
  1175.     LXI    H,PLEN
  1176.     CMP    M
  1177.     JNC    EOXP
  1178.     DCR    C
  1179.     JNZ    EOLP
  1180.     JMP    RSTR
  1181. EOXP:    CALL    NEXP    ;NEED A NEW PAGE!
  1182.  
  1183.     ;RESTORE OVERFLOW FROM TEML
  1184.     ;INTO OUTBUF STARTING AT LMAR
  1185.  
  1186. RSTR:    LXI    D,TCNT
  1187.     LDAX    D
  1188.     ORA    A
  1189.     RZ
  1190.     LXI    H,TEML-1
  1191.     MOV    C,A
  1192.     DCR    C
  1193.     CALL    ADAH
  1194.     MOV    A,M
  1195.     CPI    ' '    ;PREVENT FIRST BEING SPACE
  1196.     MOV    A,C
  1197.     STAX    D
  1198.     JZ    RSTR
  1199.  
  1200.     ;FIRST NOT SPACE
  1201.  
  1202.     INR    C
  1203.     LDA    LMAR
  1204.     ADD    C
  1205.     STA    LPOS
  1206.     XCHG
  1207.     LHLD    LADR
  1208. RSTL:    LDAX    D
  1209.     MOV    M,A
  1210.     DCX    D
  1211.     INX    H
  1212.     DCR    C
  1213.     JNZ    RSTL
  1214.     SHLD    LADR
  1215.     XRA    A
  1216.     STA    TCNT
  1217.     RET
  1218.  
  1219.  
  1220. ;UNFORMATTED OUTPUT ROUTINE
  1221. ;EQUIVALENT TO FMAT, BUT NO JUSTIFICATION
  1222. ;IF TEXT EXCEEDS RMAR, THEN A CR IS FORCED AND A
  1223. ;NEW LINE IS STARTED
  1224.  
  1225. UFMT:    CPI    9    ;TEST TAB
  1226.     JZ    TBST
  1227.     CPI    LF    ;IGNORE LINE FEEDS
  1228.     RZ
  1229.     CPI    CR    ;TEST CARRIAGE RETURN
  1230.     LHLD    LADR
  1231.     MOV    M,A    ;INSERT AS EOL
  1232.     JZ    OUTL
  1233.     INX    H
  1234.     SHLD    LADR
  1235.     LXI    H,RMAR    ;TEST IF FULL
  1236.     LDA    LPOS
  1237.     INR    A
  1238.     STA    LPOS
  1239.     DCR    A
  1240.     CMP    M
  1241.     RC
  1242.  
  1243.     ;HERE, OUTBUF IS FULL SO FORCE CR AND CONTINUE
  1244.  
  1245.     LHLD    LADR
  1246.     MVI    M,CR
  1247.     JMP    OUTL
  1248.  
  1249. ;OUTPUT OUTBUF IF ANYTHING IN IT
  1250.  
  1251. CLOS:    LXI    H,LMAR
  1252.     LDA    LPOS
  1253.     CMP    M
  1254.     RZ
  1255.     RC
  1256.     LHLD    LADR
  1257.     MVI    M,CR
  1258.     LDA    JFLG    ;SEE IF RIGHT JUSTIFICATION
  1259.     CPI    3
  1260.     JNZ    CLOS1
  1261.     LHLD    LEND
  1262.     INX    H
  1263.     SHLD    LEND
  1264.     LDA    LPOS
  1265.     INR    A
  1266.     STA    LPOS
  1267.     JMP    RIGHT
  1268. CLOS1:    JMP    OUTL
  1269.  
  1270. ;OUTPUT BOTTOM OF PAGE, THE DIVIDER, AND
  1271. ;THE TOP OF THE NEXT PAGE
  1272.  
  1273. NEXP:    LDA    BLEN    ;GET BOTTOM LENGTH
  1274.     ORA    A
  1275.     JZ    LASTPG    ;NO BOTTOM
  1276.     MOV    C,A
  1277.     LDA    FFLG    ;ARE WE USING FORM FEEDS?
  1278.     ORA    A
  1279.     JZ    NPBL
  1280.  
  1281.     ;FORM-FEED BOTTOM ROUTINES
  1282.  
  1283.     LDA    BOTN    ;IS THERE A BOTTOM LINE?
  1284.     ORA    A
  1285.     JNZ    NPBLF
  1286.     CALL    CRFF    ;NO, SO END IT
  1287.     JMP    LASTPG
  1288.  
  1289. NPBLF:    LDA    BOTN    ;CHECK IF LINE FOR MESSAGE
  1290.     CMP    C
  1291.     CZ    BMSG    ;YES, OUTPUT IT
  1292.     LDA    BOTN
  1293.     CMP    C
  1294.     JZ    NPBLF1    ;AND END IT
  1295.     CALL    CRLF
  1296.     DCR    C
  1297.     JNZ    NPBLF
  1298.     JMP    LASTPG
  1299.  
  1300. NPBLF1: CALL    CRFF
  1301.     JMP    LASTPG
  1302.  
  1303.     ;NO-FORM-FEED BOTTOM ROUTINE
  1304.  
  1305. NPBL:    LDA    BOTN    ;CHECK IF AT LINE FOR MSG OUT
  1306.     CMP    C
  1307.     CZ    BMSG    ;YES, OUTPUT IT
  1308.     CALL    CRLF
  1309.     DCR    C
  1310.     JNZ    NPBL
  1311.  
  1312.     ;DETERMINE IF LAST PAGE IN FILE
  1313.  
  1314. LASTPG: LDA    EOT
  1315.     ORA    A
  1316.     RZ        ;ZERO SAYS EOF ENCOUNTERED
  1317.  
  1318.     ;START A NEW PAGE NOW
  1319.  
  1320. DVDR:    MOV    H,A
  1321.     MVI    A,1    ;SET THE "START OF TEXT" FLAG
  1322.     STA    SOT
  1323.  
  1324.     IF    VIEWCRT
  1325.     LDA    VIEW    ;IS THIS A VIEW?
  1326.     ORA    A
  1327.     JZ    DVDR2
  1328.     MVI    A,1    ;RESET CRT POSITION
  1329.     STA    CRTPOS
  1330.     LXI    H,VPGMSG ;SEND END-OF-PAGE MESSAGE
  1331.     CALL    TXTYP
  1332.     CALL    ECHO1
  1333.     CALL    ABTST
  1334.     JMP    DVDR1
  1335.     ENDIF
  1336.  
  1337. DVDR2:    LDA    WAIT    ;DO WE WAIT FOR NEXT PAGE?
  1338.     ORA    A
  1339.     MOV    A,H
  1340.     JNZ    DVDR1
  1341.  
  1342.     ;OUTPUT WARNING TO CONSOLE AND WAIT FOR "GO"
  1343.  
  1344.     LXI    H,PAGMS
  1345.     CALL    TXTYP
  1346.     CALL    ECHO1
  1347.     CALL    ABTST    ;ABORT IF CTRL-C
  1348.  
  1349. DVDR1:    LXI    H,PAGN
  1350.     INR    M
  1351. NEWP:    LDA    TLEN    ;GET TOP LENGTH
  1352.     ORA    A
  1353.     JZ    NPXT    ;NO TOP PLEASE
  1354.     MOV    C,A
  1355. NPTL:    LDA    TOPN    ;EQUAL LINE FOR MSG OUTPUT?
  1356.     CMP    C
  1357.     CZ    TMSG    ;YES, PRINT IT
  1358.     CALL    CRLF
  1359.     DCR    C
  1360.     JNZ    NPTL
  1361. NPXT:    XRA    A
  1362.     STA    PPOS
  1363.  
  1364.     IF    VIEWCRT
  1365.     LDA    TLEN
  1366.     STA    CRTPOS
  1367.     XRA    A
  1368.  
  1369.     ENDIF
  1370.     RET
  1371.  
  1372. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  1373. ; **9** POW UTILITY ROUTINES
  1374. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  1375.  
  1376. ;GET CHARACTER FROM CONSOLE
  1377. ;TEST FOR ABORT (CTRL C)
  1378.  
  1379.  
  1380. ABTST:    CALL    CI
  1381.     CPI    3
  1382.     RNZ        ;NOPE
  1383.     JMP    MAIN    ;RETURN TO MENU
  1384.  
  1385.  
  1386. ;ADDRESS TEST FOR OVERFLOW
  1387. ;HL=ADDRESS TO TEST
  1388. ;RETURN CARRY SET IF OVERFLOW
  1389.  
  1390.     IF    BIGFILE
  1391. ADDTST: LDA    MEMSIZ+1 ;TEST HIGH BYTE ONLY
  1392.     CMP    H     ;SINCE LIMIT IS ON PAGE BOUNDRY
  1393.     RNZ
  1394.     STC
  1395.     RET
  1396.     ENDIF
  1397.  
  1398.  
  1399. ;CONVERT ASCII NUMBER TO BINARY
  1400. ;ADDRESS IN HL ON ENTRY, SAVED IN APNT ON EXIT
  1401. ;RETURN WITH VALUE IN HL
  1402.  
  1403.  
  1404. ADEC:    PUSH    H
  1405.     POP    B
  1406.     LXI    H,0
  1407. ADE1:    LDAX    B
  1408.     CALL    NMCK    ;CHECK FOR DECIMAL NUMBER
  1409.     JC    ADE2
  1410.     INX    B
  1411.  
  1412.     IF BIGFILE
  1413.     PUSH B ! PUSH H
  1414.     POP  B ! POP  H
  1415.     CALL    BUFTST
  1416.     PUSH B ! PUSH H
  1417.     POP  B ! POP  H
  1418.     ENDIF
  1419.  
  1420.     MOV    D,H
  1421.     MOV    E,L
  1422.     DAD    H
  1423.     DAD    H
  1424.     DAD    D
  1425.     DAD    H
  1426.     SUI    48
  1427.     MOV    E,A
  1428.     MVI    D,0
  1429.     DAD    D
  1430.     JMP    ADE1
  1431. ADE2:    PUSH    B
  1432.     XTHL
  1433.     SHLD    APNT
  1434.     POP    H
  1435.     RET
  1436.  
  1437.  
  1438. ;BINARY TO DECIMAL CONVERT CONTENTS OF A REG
  1439. ;DIRECT OUTPUT TO PRINTER,COMPLETE WITH ZERO
  1440. ;SUPPRESSION
  1441.  
  1442.  
  1443. BIND:    PUSH H ! PUSH D ! PUSH B
  1444.     MVI    E,0
  1445.     LDA    PAGN
  1446.     MVI    C,100
  1447.     CALL    BIDA
  1448.     MVI    C,10
  1449.     CALL    BIDA
  1450.     ADI    '0'
  1451.     POP B ! POP D ! POP H
  1452.     RET
  1453.  
  1454. BIDA:    MVI    B,'0'-1
  1455.     INR    B
  1456.     SUB    C
  1457.     JNC    BIDA+2
  1458.     ADD    C
  1459.     MOV    D,A
  1460.     MOV    A,B
  1461.     CPI    '0'
  1462.     JNZ    BINZ
  1463.     MOV    A,E
  1464.     ORA    A
  1465.     MOV    A,D
  1466.     RZ
  1467. BINZ:    INR    E
  1468.     MOV    A,B
  1469.     CALL    OUTC
  1470.     MOV    A,D
  1471.     RET
  1472.  
  1473.  
  1474. ;OUTPUT BOTTOM OF PAGE MESSAGE
  1475.  
  1476.  
  1477. BMSG:    PUSH    B
  1478.     LDA    STMS    ;NO MSG IF PAGE NUMBER LESS THAN "STMS"
  1479.     MOV    C,A
  1480.     LDA    PAGN
  1481.     CMP    C
  1482.     POP    B
  1483.     RC
  1484.     MOV    A,C
  1485.     STA    TSTG    ;SAVE PRESENT LINE COUNT
  1486.  
  1487.     IF    NOT BIGFILE
  1488.     LHLD    BOTA     ;GET ADDRESS
  1489.     ENDIF
  1490.  
  1491.     IF    BIGFILE
  1492.     LXI    H,BOTBUF ;GET BUFFER
  1493.     ENDIF
  1494.  
  1495.     LDA    BOTT    ;AND TAB POSITION
  1496.     CALL    DIROUT    ;PRINT IT
  1497.     RET
  1498.  
  1499.  
  1500. ;FILL A TEMPORARY BUFFER (IN DE) OF SIZE (IN B) FROM
  1501. ;MEMORY (STARTING AT HL) UNTIL CR IS FOUND
  1502.  
  1503.  
  1504.     IF    BIGFILE
  1505. BUFILL: MOV    A,M
  1506.     STAX    D
  1507.     INX    H
  1508.     CALL    BUFTST
  1509.     INX    D
  1510.     CPI    CR    ;WAS LAST A CR?
  1511.     RZ
  1512.     DCR    B
  1513.     JNZ    BUFILL
  1514.     MVI    A,CR
  1515.     DCX    D
  1516.     STAX    D
  1517.     RET
  1518.     ENDIF
  1519.  
  1520.  
  1521. ;TEST FOR MEMORY OVERFLOW DURING TEXT PROCESSING
  1522. ;ON ENTRY HL=NEXT ADDRESS DESIRED
  1523.  
  1524.  
  1525.     IF    BIGFILE
  1526. BUFTST: PUSH B ! PUSH D ! PUSH H
  1527.     STA    ACCSAV    ;SAVE ACCUM
  1528.     CALL    ADDTST    ;TEST OVERFLOW
  1529.     JNC    BUFTS2    ;O.K.
  1530.     LXI    H,BUFMSG
  1531.     CALL    TXTYP    ;TYPE MESSAGE
  1532.     CALL    ECHO1
  1533.  
  1534.     ;1) MOVE TOP OF BUFFER TO BOTTOM
  1535.  
  1536.     LXI    H,NMOVED
  1537.     MOV    B,M
  1538.     LHLD    TMOVED
  1539.     XCHG
  1540.     LHLD    MEMSIZ
  1541.     DCX    D
  1542. BUFTS1: MOV    A,M
  1543.     STAX    D
  1544.     DCX    D
  1545.     DCX    H
  1546.     DCR    B
  1547.     JNZ    BUFTS1
  1548.  
  1549.     ;2) RESET OVERFLOW FLAG
  1550.  
  1551.     LXI    H,MEMOVF
  1552.     MVI    M,0
  1553.  
  1554.     ;3) READ ANOTHER BUFFER FULL
  1555.  
  1556.     LHLD    TMOVED
  1557.     CALL    TPLP
  1558.  
  1559.     ;4) RESET TEXT POINTERS
  1560.  
  1561.     LXI    B,APNT
  1562.     LXI    D,APNT
  1563.     LXI    H,OFFSET
  1564.     CALL    SUB2
  1565.     POP    H
  1566.     SHLD    HLVAL
  1567.     LXI    B,HLVAL
  1568.     LXI    D,HLVAL
  1569.     LXI    H,OFFSET
  1570.     CALL    SUB2
  1571.     LHLD    HLVAL
  1572.     PUSH    H
  1573.  
  1574. BUFTS2: LDA    ACCSAV    ;RESTORE ACCUM
  1575.     POP H ! POP D ! POP B
  1576.     RET
  1577.     ENDIF
  1578.  
  1579.  
  1580. ;CASE PROCESSING SUBROUTINE
  1581. ;RETURN WITH CARRY SET IF CHAR IS TO BE
  1582. ;IGNORED. (IE WAS A SHIFT COMMAND)
  1583.  
  1584.     ;CHECK IF UPSHIFT OR DOWNSHIFT COMMAND
  1585.  
  1586. CAPR:    CPI    UPSHFT    ;UPSHIFT?
  1587.     JZ    UCAS
  1588.     CPI    DNSHFT    ;DOWNSHIFT?
  1589.     JZ    LCAS
  1590.  
  1591.     ;CHECK AND PROCESS UPPER AND LOWER CASE
  1592.  
  1593.     MOV    B,A
  1594.     LDA    CASE
  1595.     CPI    3
  1596.     JZ    CASX    ;ZERO    SAYS SHIFT LOCKED UP
  1597.  
  1598.     ;LAND HERE, EITHER SINGLE SHIFT OR LOWER CASE
  1599.     ;TEST FOR SINGLE SHIFT
  1600.  
  1601.     CPI    1    ;1=SINGLE SHIFT
  1602.     MVI    A,0    ;Z FLAG STILL PRESERVED
  1603.     STA    CASE    ;CLEAR IT ANYWAY
  1604.     JZ    CASX    ;ZERO SAYS SINGLE SHIFT
  1605.  
  1606.     ;LAND HERE, LOWER CASE COND
  1607.     ;TEST IF IT IS ALPHA
  1608.  
  1609.     MOV    A,B
  1610.     CPI    'A'
  1611.     JC    CASX    ;NOT ALPHA
  1612.     CPI    'Z'+1
  1613.     JNC    CASX    ;NOT ALPHA
  1614.  
  1615.     ;LAND HERE, CONVERT TO LOWER CASE
  1616.  
  1617.     MVI    A,20H
  1618.     ORA    B
  1619.     MOV    B,A
  1620.  
  1621.     ;EXIT WITH CARRY BIT CLEAR
  1622.  
  1623. CASX:    ORA    A
  1624.     MOV    A,B
  1625.     RET
  1626.  
  1627.     ;PROCESS UNSHIFT OR LOWER CASE MODE
  1628.  
  1629. LCAS:    XRA    A
  1630.     JMP    NOLCK 
  1631.  
  1632.     ;PROCESS SHIFT (EITHER SINGLE OR SHIFT LOCK)
  1633.  
  1634. UCAS:    LDA    CASE
  1635.     CPI    1
  1636.     JZ    LOCK
  1637.     MVI    A,1    ;SINGLE SHIFT
  1638.     JMP    NOLCK
  1639. LOCK:    MVI    A,3
  1640. NOLCK:    STA    CASE
  1641.     STC        ;SET CARRY, IGNORE LETTER
  1642.     RET
  1643.  
  1644.  
  1645. ;FIND DELIMITER WITHIN A COMMAND
  1646. ;SPACE AND COMMA ARE ACCEPTED
  1647.  
  1648.  
  1649. CDEL:    LHLD    APNT
  1650.     MOV    A,M
  1651.     INX    H
  1652.  
  1653.     IF    BIGFILE
  1654.     CALL    BUFTST
  1655.     ENDIF
  1656.  
  1657.     CPI    ','
  1658.     RZ
  1659.     CPI    ' '
  1660.     RZ
  1661.     DCX    H
  1662.     RET
  1663.  
  1664.  
  1665. ;DIRECTLY OUTPUT MESSAGE LINE TO PRINTER
  1666. ;DOES NOT USE OR DESTROY OUTBUF AND ITS CONTENTS
  1667.  
  1668.  
  1669. DIROUT: SHLD    DIRMSG    ;SAVE MESSAGE
  1670.     STA    DIRTAB    ;AND TAB
  1671.     LDA    DBLPF    ;GET DOUBLE COUNT
  1672.     MOV    B,A
  1673.     LDA    CASE    ;SAVE TEXT CASE
  1674.     PUSH    PSW
  1675. DIRDBL: LHLD    DIRMSG    ;GET MESSAGE
  1676.     LDA    DIRTAB    ;GET TAB
  1677.     MOV    C,A
  1678.     MVI    A,3    ;RESET TO DEFAULT CASE
  1679.     STA    CASE
  1680. DIROU1: MVI    A,' '    ;SPACE OVER TO TAB
  1681.     CALL    OUTW
  1682.     DCR    C
  1683.     JNZ    DIROU1
  1684.     PUSH    B
  1685. DIROU2: MOV    A,M    ;OUTPUT THE MESSAGE
  1686.     INX    H
  1687.     CALL    CAPR    ;DO CASE PROCESSING
  1688.     JC    DIROU2    ;IGNORE LAST CHAR
  1689.     CPI    ':'    ;SUBSTITUTE THE PAGE NUMBER
  1690.     CZ    BIND    ;AT OCCURANCE OF COLON
  1691.     CPI    CR    ;QUIT AT CR
  1692.     JZ    DIROU3
  1693.     CALL    OUTW
  1694.     JMP    DIROU2
  1695. DIROU3: MVI    A,CR    ;DO A CR
  1696.     CALL    OUTW
  1697.     POP    B
  1698.     MOV    A,B
  1699.     DCR    B
  1700.     ORA    A
  1701.     JNZ    DIRDBL    ;PRINT AGAIN
  1702.     POP    PSW    ;RESTORE TEXT CASE
  1703.     STA    CASE
  1704.     LDA    TSTG    ;RESTORE LINE COUNT
  1705.     MOV    C,A
  1706.     RET
  1707.  
  1708.  
  1709. ;DISK AND TAPE INPUT ROUTINE
  1710.  
  1711.  
  1712. FDIN:    CALL    INIR    ;OPEN THE FILE
  1713.     LXI    H,TEXT    ;POINT TO START OF TEXT BUFFER
  1714.     CALL    TPLP    ;READ THE DATA
  1715.     RET
  1716.  
  1717.  
  1718. ;DO LINE FEEDS AND KEEP TRACK OF POSITION ON PAGE.
  1719. ;IF NEW PAGE, REST OF LF COMMAND IS FORGOTTEN.
  1720.  
  1721.  
  1722. LFDO:    CALL    CLOS
  1723.     LDA    CETM
  1724.     ORA    A
  1725.     RZ
  1726.     MOV    C,A
  1727. LFLP:    CALL    CRLF
  1728.     LDA    PPOS
  1729.     INR    A
  1730.     STA    PPOS
  1731.  
  1732.     IF    VIEWCRT
  1733.     LDA    VIEW    ;IS THIS A VIEW?
  1734.     ORA    A
  1735.     JZ    LFLP1
  1736.     LDA    CRTPOS
  1737.     INR    A
  1738.     STA    CRTPOS
  1739.     CPI    CRTLN    ;END OF A SCREEN?
  1740.     JC    LFLP1
  1741.     CALL    ABTST    ;YES - WAIT FOR TYPE AT CONSOLE
  1742.     MVI    A,1
  1743.     STA    CRTPOS    ;RESET CRT POSITION
  1744.     ENDIF
  1745.  
  1746. LFLP1:    LDA    PPOS
  1747.     LXI    H,PLEN
  1748.     CMP    M
  1749.     JNC    NEXP
  1750.     DCR    C
  1751.     RZ
  1752.     JMP    LFLP
  1753.  
  1754.  
  1755. ;TEST FOR MEMORY OVERFLOW DURING TEXT INPUT
  1756. ;ON ENTRY HL=NEXT ADDRESS DESIRED
  1757.  
  1758.  
  1759.     IF    BIGFILE
  1760. MEMTST: PUSH B ! PUSH D ! PUSH H
  1761.     STA    ACCSAV    ;SAVE ACCUM
  1762.     CALL    ADDTST    ;TEST OVERFLOW
  1763.     JNC    MEMTS2    ;O.K.
  1764.  
  1765.     ;IF HERE, THEN OVERFLOW MUST BE TRAPPED
  1766.  
  1767.     LDA    MSGOVF    ;CHECK MESSAGE FLAG
  1768.     ORA    A
  1769.     JNZ    MEMTS1    ;IF SET, DON'T PRINT MESSAGE AGAIN
  1770.     MVI    A,0FFH    ;SET MESSAGE FLAG
  1771.     STA    MSGOVF
  1772.     LXI    H,MEMMSG
  1773.     CALL    TXTYP    ;TYPE MESSAGE
  1774.     CALL    ECHO1
  1775.  
  1776. MEMTS1: LXI    H,MEMOVF
  1777.     MVI    M,0FFH    ;SET OVERFLOW FLAG
  1778.  
  1779. MEMTS2: LDA    ACCSAV    ;RESTORE ACCUM
  1780.     POP H ! POP D ! POP B
  1781.     RET
  1782.     ENDIF
  1783.  
  1784.  
  1785. ;INITIALIZE CENBUF FOR NEW CENTERED LINE
  1786.  
  1787.  
  1788. NEWCB:    LXI    H,CENBUF ;FILL WITH SPACES
  1789.     LDA    CBSZ
  1790.     MOV    C,A
  1791.     MVI    A,' '
  1792. NEWCB1: MOV    M,A
  1793.     INX    H
  1794.     DCR    C
  1795.     JNZ    NEWCB1
  1796.     RET
  1797.  
  1798.  
  1799. ;INITIALIZE OUTBUF FOR NEW FORMATTED LINE
  1800.  
  1801.  
  1802. NEWL:    LXI    H,OUTBUF ;FILL WITH SPACES
  1803.     LDA    MAXL
  1804.     MOV    C,A
  1805.     MVI    A,' '
  1806. NEWL1:    MOV    M,A
  1807.     INX    H
  1808.     DCR    C
  1809.     JNZ    NEWL1
  1810.     LXI    H,OUTBUF ;COMPUTE LEFT MARGIN ADDR
  1811.     LDA    LMAR
  1812.     CALL    ADAH
  1813.     SHLD    LADR
  1814.     LDA    LMAR    ;SET POSITION COUNTER
  1815.     STA    LPOS
  1816.     LXI    H,OUTBUF ;COMPUTE RIGHT MARGIN ADDR
  1817.     LDA    RMAR
  1818.     CALL    ADAH
  1819.     SHLD    LEND
  1820.     MVI    M,CR    ;EOL AT RIGHT
  1821.     RET
  1822.  
  1823.  
  1824. ;OUTPUT A CENTER MESSAGE
  1825. ;THIS IS A MODIFIED VERSION OF THE "OUTL" ROUTINE
  1826. ;FOR :CM, :CT, AND :CC ONLY
  1827.  
  1828.  
  1829. OUTCEN: LDA    CUNLF    ;GET THE UNDERLINE FLAG
  1830.     ORA    A
  1831.     JZ    OUTCN5
  1832.  
  1833.     ;PROCESS UNDERLINE FIRST
  1834.     ;IN CASE WE DON'T DEFEAT THIS IN VIEW MODE
  1835.     ;ELSE UNDERLINE WILL OVERWRITE TEXT ON CRT
  1836.  
  1837.     LDA    CDBLF    ;GET THE DOUBLE COUNT
  1838.     MOV    C,A
  1839.  
  1840. OUTCN1: LXI    H,CENBUF ;GET THE MESSAGE
  1841.  
  1842. OUTCN2: MOV    A,M
  1843.     INX    H
  1844.     CPI    CR
  1845.     JZ    OUTCN4
  1846.     CPI    ' '    ;IS IT SPACE?
  1847.     JZ    OUTCN3    ;SKIP IT
  1848.     MVI    A,'_'    ;ELSE PRINT UNDERLINE
  1849.  
  1850. OUTCN3: CALL    OUTW
  1851.     JMP    OUTCN2
  1852.  
  1853. OUTCN4: MVI    A,CR    ;DO A CR
  1854.     CALL    OUTW
  1855.     MOV    A,C    ;TEST FOR DOUBLE
  1856.     DCR    C
  1857.     ORA    A
  1858.     JNZ    OUTCN1
  1859.  
  1860.     ;PROCESS THE CENTER MESSAGE
  1861.  
  1862. OUTCN5: LDA    CDBLF    ;GET THE DOUBLE COUNT
  1863.     MOV    C,A
  1864.  
  1865. OUTCN6: LXI    H,CENBUF ;GET MESSAGE AGAIN
  1866.  
  1867. OUTCN7: MOV    A,M
  1868.     INX    H
  1869.     CPI    CR
  1870.     JZ    OUTCN8
  1871.     CALL    OUTW
  1872.     JMP    OUTCN7
  1873.  
  1874. OUTCN8: MVI    A,CR    ;DO A CR
  1875.     CALL    OUTW
  1876.     MOV    A,C
  1877.     DCR    C
  1878.     ORA    A
  1879.     JNZ    OUTCN6
  1880.  
  1881.     JMP    EOL    ;GO TO NORMAL END OF LINE ROUTINE
  1882.  
  1883.  
  1884. ;CONVERT TABS TO CORRECT POSITION
  1885.  
  1886.  
  1887. TBST:    LDA    LPOS
  1888.     MOV    C,A
  1889.     LXI    D,TTAB
  1890.  
  1891.     ;SEARCH TTAB FOR NEXT GREATEST LOCATION
  1892.  
  1893. TBST1:    LDAX    D
  1894.     INX    D
  1895.     CMP    C
  1896.     JZ    TBST1
  1897.     JNC    GOTB
  1898.     CPI    0
  1899.     JNZ    TBST1
  1900.  
  1901.     ;NO MORE TABS IN TABLE
  1902.  
  1903.     JMP    CLOS
  1904.  
  1905.     ;GOT GOOD TAB, UPDATE POINTERS
  1906.  
  1907. GOTB:    LXI    H,RMAR
  1908.     CMP    M
  1909.     JNC    CLOS
  1910. PUTB:    STA    LPOS
  1911.     LXI    H,OUTBUF
  1912.     CALL    ADAH
  1913.     SHLD    LADR
  1914.     RET
  1915.  
  1916.  
  1917. ;OUTPUT TOP OF PAGE MESSAGE
  1918.  
  1919.  
  1920. TMSG:    PUSH    B
  1921.     LDA    STMS    ;NO MSG IF PAGE NUMBER LESS THAN "STMS"
  1922.     MOV    C,A
  1923.     LDA    PAGN
  1924.     CMP    C
  1925.     POP    B
  1926.     RC
  1927.     MOV    A,C
  1928.     STA    TSTG    ;SAVE PRESENT LINE COUNT
  1929.  
  1930.     IF    NOT BIGFILE
  1931.     LHLD    TOPA     ;GET ADDRESS
  1932.     ENDIF
  1933.  
  1934.     IF    BIGFILE
  1935.     LXI    H,TOPBUF ;GET BUFFER
  1936.     ENDIF
  1937.  
  1938.     LDA    TOPT    ;AND TAB POSITION
  1939.     CALL    DIROUT    ;PRINT IT
  1940.     RET
  1941.  
  1942.  
  1943. ;TEXT INPUT LOOP
  1944. ;STARTING ADDRESS FOR TEXT BUFFER MUST BE IN HL AT START
  1945.  
  1946.  
  1947.     IF    BIGFILE
  1948. TPLP:    CALL    MEMTST    ;SEE IF OVERFLOW
  1949.     XCHG
  1950.     LXI    H,MEMOVF
  1951.     MOV    A,M
  1952.     XCHG
  1953.     ORA    A    ;NON-ZERO MEANS BUFFER FULL
  1954.     RNZ
  1955.     CALL GBYT    ;OK - GET NEXT BYTE
  1956.     ENDIF
  1957.  
  1958.     IF    NOT BIGFILE
  1959. TPLP:    CALL    GBYT    ;GET NEXT BYTE
  1960.     ENDIF
  1961.  
  1962.     MOV    M,A    ;STORE IN BUFFER
  1963.     INX    H
  1964.     JNC    TPLP    ;EOF WILL SET CARRY
  1965.  
  1966.     ;FOR TAPE, I WOULD CHECK FOR VALUE LESS THAN 3
  1967.     ;IE BINARY 1=EOF FOR TAPE
  1968.     ;AND CARRY SET = EOF FROM FDOS
  1969.  
  1970.     DCX    H    ;MARK EOF AT END OF TEXT
  1971.     MVI    M,1
  1972.     RET
  1973.  
  1974. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  1975. ; **10** SUPPORT UTILITY ROUTINES
  1976. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  1977.  
  1978. ;ADD A TO HL
  1979.  
  1980.  
  1981. ADAH:    ADD    L
  1982.     MOV    L,A
  1983.     RNC
  1984.     INR    H
  1985.     RET
  1986.  
  1987.  
  1988. ;TWO BYTE ADD
  1989. ;BC=ADDR OF FIRST, HL=ADDR OF SECOND, DE=ADDR OF RESULT
  1990.  
  1991.     IF    BIGFILE
  1992. ADD2:    PUSH B ! PUSH D ! PUSH H
  1993.     XRA    A
  1994.     LDAX    B
  1995.     ADC    M
  1996.     STAX    D
  1997.     INX    B
  1998.     INX    D
  1999.     INX    H
  2000.     LDAX    B
  2001.     ADC    M
  2002.     STAX    D
  2003.     POP H ! POP D ! POP B
  2004.     RET
  2005.     ENDIF
  2006.  
  2007.  
  2008. ;GET CHAR FROM CONSOLE
  2009.  
  2010.  
  2011. CI:    PUSH H ! PUSH D ! PUSH B
  2012.     MVI    C,1
  2013.     CALL    BDOS
  2014.     CALL    MAPUC    ;MAP TO UPPER CASE
  2015.     POP B ! POP D ! POP H
  2016.     RET
  2017.  
  2018.  
  2019. ;CONSOLE OUTPUT OF CHARACTER (ECHOS TOO)
  2020.  
  2021.  
  2022. CO:    PUSH H ! PUSH D ! PUSH B
  2023.     MOV    E,C
  2024.     MVI    C,2
  2025.     CALL    BDOS
  2026.     POP B ! POP D ! POP H
  2027.     RET
  2028.  
  2029.  
  2030. ;OUTPUT CARRAGE RETURN AND FORM FEED TO PRINTER
  2031. ;RETURNS WITH CR IN A
  2032.  
  2033.  
  2034. CRFF:    MVI    A,CR
  2035.     CALL    OUTW
  2036.     MVI    A,FF
  2037.     CALL    OUTW
  2038.     MVI    A,CR
  2039.     RET
  2040.  
  2041.  
  2042. ;OUTPUT CARRAGE RETURN AND LINE FEED TO PRINTER
  2043. ;RETURNS WITH CR IN A
  2044.  
  2045.  
  2046. CRLF:    MVI    A,CR
  2047.     CALL    OUTW
  2048.     MVI    A,LF
  2049.     CALL    OUTW
  2050.     MVI    A,CR
  2051.     RET
  2052.  
  2053.  
  2054. ;CONSOLE STATUS CHECK.
  2055. ;RETURNS A NON-ZERO IF KEY PRESSED AT CONSOLE
  2056.  
  2057.  
  2058. CSTS:    PUSH H ! PUSH D ! PUSH B
  2059.     MVI    C,11
  2060.     CALL    BDOS
  2061.     POP B ! POP D ! POP H
  2062.     RET
  2063.  
  2064.  
  2065. ;ECHOS ON CONSOLE AND OUTS CRLF
  2066.  
  2067.  
  2068. ECHO:    CALL    CO
  2069. ECHO1:    PUSH    B
  2070.     MVI    C,CR
  2071.     CALL    CO
  2072.     MVI    C,LF
  2073.     CALL    CO
  2074.     POP    B
  2075.     RET
  2076.  
  2077.  
  2078. ;GET A CHARACTER FROM DISK FILE
  2079.  
  2080.  
  2081. GBYT:    PUSH    H
  2082.     CALL    DISKIN
  2083.     POP    H
  2084.     RET
  2085.  
  2086.  
  2087. ;INITIALIZE TO READ DISK FILE
  2088.  
  2089.  
  2090. INIR:    CALL    ECHO1    ;CRLF TO CONSOLE
  2091.     LXI    H,GREET
  2092.     CALL    TXTYP
  2093.     CALL    TXTIN
  2094.     CALL    ECHO1    ;CRLF TO CONSOLE
  2095.     LXI    H,CONBUF+2    ;+2 FOR COUNTS
  2096.     LXI    D,INFCB     ;  A LA CP/M FORMAT
  2097.     CALL    MTFCB    ;LIB ROUTINE TO MAKE FCB
  2098.     JC    INIR    ;ERROR, TRY AGAIN
  2099.     CALL    OPENF    ;FCB OK, OPEN IT
  2100.     JC    INIR    ;ERROR, TRY AGAIN
  2101.     LXI    H,INBUF+128    ;INIT. FOR DISKIN
  2102.     SHLD    INPTR
  2103.     RET
  2104.  
  2105.  
  2106. ;MAP CHARACTER IN "A" TO UPPER CASE
  2107.  
  2108.  
  2109. MAPUC:    CPI    'a'
  2110.     JC    MAPEND
  2111.     CPI    'z'+1
  2112.     JNC    MAPEND
  2113.     SUI    20H
  2114. MAPEND: ORA    A    ;CLEAR CARRY
  2115.     RET
  2116.  
  2117.  
  2118. ;CHECK FOR DECIMAL NUMBER IN ASCII
  2119.  
  2120.  
  2121. NMCK:    CPI    '0'
  2122.     RC
  2123.     CPI    '9'+1
  2124.     CMC
  2125.     RET
  2126.  
  2127.  
  2128. ;OPEN FILE
  2129.  
  2130.  
  2131. OPENF:    LXI    D,INFCB
  2132.     MVI    C,15    ;CPM FUNCTION FOR OPEN
  2133.     CALL    BDOS
  2134.     CPI    255    ;FAILED TO OPEN IF = 255
  2135.     CMC
  2136.     RNZ
  2137.     LXI    H,NOFMS ;FILE NOT FOUND MSG
  2138.     CALL    TXTYP
  2139.     STC
  2140.     RET
  2141.  
  2142.  
  2143. ;PRINTER OUTPUT PROCESSING
  2144.  
  2145.  
  2146. OUTC:    CPI    CR
  2147.     JZ    CRLF
  2148. OUTW:    PUSH    B
  2149.     ANI    01111111B ;MASK OFF HIGH BIT - NEED FOR QSPACE
  2150.     MOV    C,A
  2151.     LDA    OPST    ;TEST IF OUTPUT ON
  2152.     ORA    A
  2153.     JZ    OUTW1
  2154.  
  2155.     IF    NOT VIEWCRT
  2156.     CALL    PO
  2157.     ENDIF
  2158.  
  2159.     IF    VIEWCRT
  2160.     LDA    VIEW    ;IS THIS A VIEW?
  2161.     ORA    A
  2162.     JZ    OUTWA
  2163.     CALL    CO
  2164.     JMP    OUTW1
  2165. OUTWA:    CALL    PO
  2166.     ENDIF
  2167.  
  2168. OUTW1:    CALL    CSTS
  2169.     ORA    A
  2170.     CNZ    ABTST    ;KEY PRESSED ON CONSOLE
  2171.     MOV    A,C
  2172.     POP    B
  2173.     RET
  2174.  
  2175.  
  2176. ;SEND A CHARACTER TO THE PRINTER
  2177.  
  2178.  
  2179. PO:    PUSH H ! PUSH D ! PUSH B
  2180.     MOV    E,C
  2181.     MVI    C,5    ;LIST OUT FUNCTION
  2182.     CALL    BDOS
  2183.     POP B ! POP D ! POP H
  2184.     RET
  2185.  
  2186.  
  2187. ;GENERATE PSEUDORANDOM NUMBER 0-15
  2188.  
  2189.  
  2190. RAND:    LXI    H,RNDV
  2191. RND1:    MOV    A,M
  2192.     RLC
  2193.     INR    A
  2194.     RLC
  2195.     RLC
  2196.     XRA    M
  2197.     MOV    M,A
  2198.     ANI    0FH
  2199.     RET
  2200.  
  2201.  
  2202. ;TWO BYTE SUBTRACT
  2203. ;BC=ADDR OF FIRST, HL=ADDR OF SECOND, DE=ADDR OF RESULT
  2204.  
  2205.     IF    BIGFILE
  2206. SUB2:    PUSH B ! PUSH D ! PUSH H
  2207.     XRA    A
  2208.     LDAX    B
  2209.     SBB    M
  2210.     STAX    D
  2211.     INX    B
  2212.     INX    D
  2213.     INX    H
  2214.     LDAX    B
  2215.     SBB    M
  2216.     STAX    D
  2217.     POP H ! POP D ! POP B
  2218.     RET
  2219.     ENDIF
  2220.  
  2221.  
  2222. ;TEST DE .EQ. HL
  2223. ;RETURN ZERO IF SO
  2224.  
  2225.  
  2226. TDHE:    MOV    A,D
  2227.     CMP    H
  2228.     RNZ
  2229.     MOV    A,E
  2230.     CMP    L
  2231.     RET
  2232.  
  2233.  
  2234. ;INPUT A LINE OF TEXT FROM CONSOLE
  2235.  
  2236.  
  2237. TXTIN:    PUSH H ! PUSH D ! PUSH B
  2238.     LXI    D,CONBUF+65
  2239.     MVI    C,65    ;CLEAR BUFFER TO SPACES
  2240.     MVI    A,' '
  2241. TXTN1:    STAX    D
  2242.     DCX    D
  2243.     DCR    C
  2244.     JNZ    TXTN1
  2245.     MVI    C,10
  2246.     CALL    BDOS
  2247.     POP B ! POP D ! POP H
  2248.     RET
  2249.  
  2250.  
  2251. ;TYPE A LINE OF TEXT ON CONSOLE
  2252.  
  2253.  
  2254. TXTYP:    PUSH H ! PUSH D ! PUSH B
  2255.     XCHG
  2256.     MVI    C,9
  2257.     CALL    BDOS
  2258.     POP B ! POP D ! POP H
  2259.     RET
  2260.  
  2261.  
  2262. ;++++++++++++++++++++++++++++++++++++++++++++++
  2263. ;
  2264. ; MAKE CP/M FILE CONTROL BLOCK
  2265. ;
  2266. ; MAKEFCB.LIB  -  VERSION 0.2  -  28 OCT 77
  2267. ;
  2268. ; JEFFREY W. SHOOK
  2269. ; P.O. BOX 185
  2270. ; ROCKY POINT, NEW YORK 11778
  2271. ; (516) 744 7133
  2272. ;
  2273. ; ADDED CALLS TO MAPUC    17-FEB-82  (WRB)
  2274. ;++++++++++++++++++++++++++++++++++++++++++++++
  2275.  
  2276. ; CREATE A CP/M FILE CONTROL BLOCK  FROM
  2277. ; A COMMAND STRING AT THE ADDRESS IN HL
  2278. ; AND PLACE IT AT THE ADDRESS IN DE.  RETURN
  2279. ; WITH THE CARRY SET IF AN ERROR OCCURS.
  2280.  
  2281. ; DEFINITIONS
  2282.  
  2283. FCBSIZ: EQU    33
  2284. FNMLEN: EQU    11    ; FILE NAME LENGTH
  2285.  
  2286. MTFCB:    PUSH    H    ; SAVE CMD STRING PTR
  2287.     PUSH    D    ; SAVE FCB ADDRESS
  2288.  
  2289.     LXI    B,FCBSIZ; CLEAR ENTIRE FCB AREA
  2290.     MVI    A,0
  2291.     CALL    FILLB
  2292.  
  2293.     POP    D    ; FILL FILE NAME WITH SPACES
  2294.     PUSH    D
  2295.     INX    D
  2296.     LXI    B,FNMLEN
  2297.     MVI    A,' '
  2298.     CALL    FILLB
  2299.  
  2300.     POP    D    ; RESTORE POINTERS
  2301.     POP    H
  2302.  
  2303.     CALL    SKIPS    ; SKIP LEADING SPACES
  2304.  
  2305.     INX    H    ; CHECK FOR DISK CODE
  2306.     MOV    A,M
  2307.     DCX    H
  2308.     CPI    ':'
  2309.     JNZ    MTFCB1    ; JUMP ON NO CODE
  2310.  
  2311.     MOV    A,M    ; TEST IF DISK CODE GOOD
  2312.     CALL    MAPUC    ; MAKE IT UPPER CASE
  2313.     INX    H
  2314.     INX    H
  2315.     SBI    '@'
  2316.     RC        ; MAKE ERROR RETURN IF BAD
  2317.     CPI    'Z'+1
  2318.     CMC
  2319.     RC
  2320.  
  2321.     STAX    D    ; STORE DISK CODE AT FCB + 0
  2322. MTFCB1: INX    D
  2323.  
  2324.     MVI    C,8    ; PROCESS FILE NAME FIELD
  2325.     CALL    GETNAM
  2326.  
  2327.     MOV    A,M    ; TEST FOR FILE TYPE SEPARATOR
  2328.     INX    H
  2329.     CPI    '.'
  2330.     JNZ    MTFCB2
  2331.  
  2332.     MVI    C,3    ; PROCESS FILE TYPE FIELD
  2333.     CALL    GETNAM
  2334.     MOV    A,M
  2335.     INX    H
  2336.  
  2337. MTFCB2: CALL    TERMT    ; TEST FOR CORECT TERMINATOR
  2338.     RET
  2339.  
  2340. ; PROCESS NAME FIELD
  2341.  
  2342. GETNAM: MOV    A,M    ; GET CHAR FROM CMD STR
  2343.     CALL    MAPUC    ; MAKE IT UPPER CASE
  2344.     INX    H
  2345.  
  2346.     CPI    '?'    ; ALLOW AMBIG REFERENCE CHAR
  2347.     JZ    GETNA1
  2348.  
  2349.     CPI    '*'    ; FILL REST WITH ?
  2350.     JZ    GETNA2
  2351.  
  2352.     CALL    VALCHR    ; TEST FOR ALLOWED CHAR IN NAME
  2353.     JC    GETNA3
  2354.  
  2355. GETNA1: STAX    D    ; STORE CHAR IN TFCB
  2356.     INX    D
  2357.  
  2358.     DCR    C    ; CHECK NAME SIZE
  2359.     JNZ    GETNAM
  2360.     RET
  2361.  
  2362. GETNA2: MVI    A,'?'    ; FILL REST OF FIELD WITH ?
  2363.     MVI    B,0
  2364.     JMP    FILLB
  2365.  
  2366. GETNA3: INX    D    ; MOVE FCB PTR TO END OF FIELD
  2367.     DCR    C
  2368.     JNZ    GETNA3
  2369.     DCX    H
  2370.     RET
  2371.  
  2372. ; TEST FOR VALID CHAR IN NAME FIELD
  2373. ; RETURN WITH CARRY SET IF INVALID.
  2374.  
  2375. VALCHR: CPI    '*'
  2376.     CMC
  2377.     RZ
  2378.     CPI    ','
  2379.     CMC
  2380.     RZ
  2381.     CPI    '.'
  2382.     CMC
  2383.     RZ
  2384.     CPI    ' '
  2385.     RC
  2386.     CPI    '^'+1
  2387.     CMC
  2388.     RC
  2389.     CPI    ':'
  2390.     CMC
  2391.     RNC
  2392.     CPI    '@'
  2393.     RET
  2394.  
  2395. ; TEST FOR VALID FILENAME TERMINATOR CHAR
  2396. ; RETURN WITH CARRY SET IF INVALID.
  2397.  
  2398. TERMT:    CPI    ' '
  2399.     RZ
  2400.     CPI    ','
  2401.     RZ
  2402.     CPI    CR
  2403.     RZ
  2404.     CPI    ';'
  2405.     RZ
  2406.     STC
  2407.     RET
  2408.  
  2409. ; SKIP SPACES IN CMD STRING
  2410.  
  2411. SKIPS:    MVI    A,' '
  2412. SKIPS1: CMP    M
  2413.     RNZ
  2414.     INX    H
  2415.     JMP    SKIPS1
  2416.  
  2417. ; FILL BLOCK WITH VALUE
  2418.  
  2419. ; ENTER WITH:
  2420. ; A  = VALUE FOR FILL
  2421. ; DE = START OF BLOCK
  2422. ; BC = LENGTH OF BLOCK
  2423.  
  2424. CLRB:    MVI    A,0
  2425.  
  2426. FILLB:    INR    B
  2427.     DCR    B
  2428.     JNZ    FILLB1
  2429.     INR    C
  2430.     DCR    C
  2431.     RZ
  2432.  
  2433. FILLB1: STAX    D
  2434.  
  2435.     INX    D
  2436.     DCX    B
  2437.     JMP    FILLB
  2438.  
  2439.  
  2440.  
  2441. ;++++++++++++++++++++++++++++++++++++++++++++++
  2442. ;
  2443. ; SEQUENTIAL DISK CHARACTER INPUT
  2444. ;
  2445. ; DISKIN.LIB  -  VERSION 1.0  -  18 SEP 77
  2446. ;
  2447. ; J.W. SHOOK, P.O. BOX 185, ROCKY POINT, NY 11778
  2448. ;
  2449. ; ADDED HIGH BIT MASK AND CPMEOF  17-FEB-82  (WRB)
  2450. ;++++++++++++++++++++++++++++++++++++++++++++++
  2451.  
  2452. ; BEFORE READING A FILE SEQUENTIALLY 
  2453. ; THE FOLLOWING INITIAL CONDITIONS
  2454. ; MUST BE ESTABLISHED.
  2455.  
  2456. ;    1) A CP/M FILE CONTROL BLOCK
  2457. ;       CONTAINING THE FILE NAME MUST
  2458. ;       START AT LOCATION INFCB.
  2459. ;    2) A 128 BYTE BUFFER AREA MUST
  2460. ;       START AT LOCATION INBUF.
  2461. ;    3) THE FILE MUST BE SUCCESSFULLY
  2462. ;       OPENED.
  2463. ;    4) THE NEXT RECORD POINTER IN
  2464. ;       THE FILE CONTROL BLOCK MUST BE
  2465. ;       SET TO ZERO.
  2466. ;    5) THE WORD AT LOCATION INPTR
  2467. ;       MUST BE SET TO INBUF+128 TO
  2468. ;       MARK THE BUFFER AS EMPTY.
  2469. ;    6) TO READ A FILE AGAIN, JUST SET
  2470. ;       NEXT RECORD TO ZERO, AND
  2471. ;       RESET INPTR.
  2472.  
  2473. ; READ CHARACTER FROM FILE
  2474.  
  2475. DISKIN: LHLD    INPTR    ; TEST BUFFER POINTER
  2476.     LXI    D,-(INBUF+128)
  2477.     DAD    D
  2478.     MOV    A,H
  2479.     ORA    L
  2480.     CZ    RDREC    ; IF EMPTY, READ NEXT RECORD
  2481.     RC        ; RETURN ON BAD READ
  2482.     LHLD    INPTR    ; GET CHAR FROM BUFFER
  2483.     MOV    A,M
  2484.     ANI    01111111B ;MASK OFF HIGH BIT - NEED FOR QSPACE
  2485.     CPI    CPMEOF    ; IS THIS AN EOF CHARACTER?
  2486.     JNZ    DISKN1
  2487.     STC        ; MAKE SURE CARRY IF EOF
  2488.     JMP    DISKN2
  2489. DISKN1: ORA    A    ; MAKE SURE NO CARRY IF NOT EOF
  2490. DISKN2: INX    H    ; MOVE BUFFER POINTER
  2491.     SHLD    INPTR
  2492.     RET
  2493.  
  2494.  
  2495. ; REFILL DISK INPUT BUFFER
  2496.  
  2497. RDREC:    LXI    D,INBUF ; SET DMA ADDRESS
  2498.     MVI    C,26
  2499.     CALL    BDOS
  2500.     LXI    D,INFCB ; READ A RECORD
  2501.     MVI    C,20
  2502.     CALL    BDOS
  2503.     RAR        ; SET CARRY ON BAD READ
  2504.     LXI    H,INBUF ; SET POINTER TO BUFFER START
  2505.     SHLD    INPTR
  2506.     RET
  2507.  
  2508. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  2509. ; **11** VARIABLE DEFINITIONS, BUFFERS, AND STACK SPACE
  2510. ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
  2511.  
  2512. ; DEFAULTS FOR OPTIONS
  2513.  
  2514. BLEN:    DB    10    ;BOTTOM LENGTH
  2515. BOTN:    DB    0    ;BOTTOM MESSAGE LINE NUMBER
  2516. BOTT:    DB    10    ;BOTTOM TAB
  2517. BRLF:    DB    1    ;NEW PARAGRAPH LF'S
  2518. BRTB:    DB    10    ;NEW PARAGRAPH TAB
  2519. CASE:    DB    3    ;UPPER CASE LOCK
  2520. CDBLF:    DB    0    ;NO CENTER DOUBLESTRIKE
  2521. CDBSAV:    DB    0    ;LAST :CD ARGUMENT
  2522. COMNT:    DB    0    ;COMMENT FLAG
  2523. CUNLF:    DB    0    ;NO CENTER UNDERLINE
  2524. DBLPF:    DB    0    ;NO MASTER DOUBLESTRIKE
  2525. FFLG:    DB    0    ;NO FORM FEEDS
  2526. JFLG:    DB    0    ;NO JUSTIFICATION
  2527. LCHR:    DB    0    ;LAST CHAR FOR TOTAL JUST.
  2528. LMAR:    DB    10    ;LEFT MARGIN
  2529. LPOS:    DB    1    ;LINE POSITION
  2530. PAGN:    DB    0    ;PAGE NUMBER
  2531. PLEN:    DB    46    ;PAGE LENGTH
  2532. PPOS:    DB    1    ;PAGE POSITION
  2533. RMAR:    DB    70    ;RIGHT MARGIN
  2534. SPAS:    DB    1    ;SPACING
  2535. STMS:    DB    2    ;START TOP & BOTTOM MESSAGE
  2536. TLEN:    DB    10    ;TOP LENGTH
  2537. TOPN:    DB    0    ;TOP MESSAGE LINE NUMBER
  2538. TOPT:    DB    10    ;TOP TAB
  2539. TTAB:    DB    15    ;TAB TABLE
  2540.     DB    22
  2541.     DB    30
  2542.     DB    45
  2543.     DB    0
  2544.     DS    10    ;UP TO 15 TABS - LAST MUST BE ZERO
  2545. WAIT:    DB    0    ;WAIT TO PRINT NEXT PAGE
  2546.  
  2547. ; POINTERS, BUFFERS, STATUS FLAGS AND CONSTANTS
  2548.  
  2549. ACCSAV: DS    1    ;TEMP ACCUM SAVE
  2550. APNT:    DS    2    ;INPUT POINTER
  2551. CBSZ:    DB    135    ;CENTER BUFFER SIZE
  2552. CENBUF: DS    136    ;CENTER MESSAGE BUFFER
  2553. CEPT:    DS    2    ;MESSAGE POINTER
  2554. CETM:    DS    1    ;CENTER TAB OR CHAR COUNT
  2555. CONBUF: DB    64    ;CONSOLE INPUT BUFFER
  2556.     DB    0
  2557.     DS    64
  2558. DIRMSG: DS    2    ;DIROUT MESSAGE
  2559. DIRTAB: DS    1    ;DIROUT TAB
  2560. EOT:    DB    0FFH    ;LAST PAGE PRINTED IF ZERO
  2561. HLVAL:    DS    2    ;TEMP HL SAVE
  2562. INBUF:    DS    128    ;DISK FILE INPUT BUFFER
  2563. INFCB:    DS    33    ;FILE CONTROL BLOCK
  2564. INPTR:    DS    2    ;POINTER FOR DISKIN
  2565. LADR:    DS    2    ;LPOS ADDRESS
  2566. LEND:    DS    2    ;RIGHT MARGIN ADDRESS
  2567. MAXL:    DB    135    ;MAXIMUM LINE LENGTH
  2568. OPST:    DB    0FFH    ;OUTPUT ON OR OFF STATUS
  2569. OUTBUF: DS    136    ;OUTPUT BUFFER
  2570. RNDV:    DB    5AH    ;SEED FOR RANDOM NUMBER
  2571. SFLP:    DB    0    ;FLOP FOR EVERY RND SPACE
  2572. SOT:    DB    0    ;FIRST PAGE PRINTED IF NOT ZERO
  2573. TBAD:    DS    2    ;TAB TABLE POINTER
  2574. TCNT:    DB    0    ;OVERFLOW CHAR COUNT
  2575. TEML:    DS    30    ;OVERFLOW BUFFER
  2576. TSTG:    DB    0    ;TEMP STORAGE FOR BMSG/TMSG LINE NO.
  2577.  
  2578.     IF    NOT BIGFILE
  2579. BOTA:    DS    2    ;BOTTOM MESSAGE ADDRESS
  2580. TOPA:    DS    2    ;TOP MESSAGE ADDRESS
  2581.     ENDIF
  2582.  
  2583. ; VIEW VARIABLES
  2584.  
  2585.     IF    VIEWCRT
  2586. CRTPOS: DB    1    ;CRT POSITION
  2587. VIEW:    DB    0    ;VIEW OFF INITIALLY
  2588.     ENDIF
  2589.  
  2590. ; BIGFILE VARIABLES
  2591.  
  2592.     IF    BIGFILE
  2593. BBSZ:    DB    135    ;BOTTOM BUFFER SIZE
  2594. BOTBUF: DS    136    ;BOTTOM MESSAGE BUFFER
  2595. MEMSIZ: DS    2    ;HIGH LIMIT OF TPA
  2596. MEMOVF: DB    0    ;MEMORY OVERFLOW FLAG
  2597. MSGOVF: DB    0    ;OVERFLOW MESSAGE FLAG
  2598. NMOVED: DB    200    ;NO. OF BYTES MOVED AT RELOAD
  2599.     DB    0    ;(HIGH BYTE MUST BE ZERO)
  2600. OFFSET: DS    2    ;ADDRESS OFFSET FOR BUFFER POINTERS
  2601. TBSZ:    DB    135    ;TOP BUFFER SIZE
  2602. TOPBUF: DS    136    ;TOP MESSAGE BUFFER
  2603. TMOVED: DS    2    ;ADDRESS OF END OF MOVED DATA
  2604.     ENDIF
  2605.  
  2606. ; STACK
  2607.  
  2608.     DS    64    ;STACK SPACE
  2609. STACK    EQU    $
  2610.  
  2611. ; TEXT BUFFER
  2612.  
  2613. TEXT:    END        ;TEXT BUFFER STARTS HERE
  2614.