home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol116 / listtu84.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  41.8 KB  |  1,568 lines

  1.  
  2. ; LISTT v1.3  --  File utility program for printers   --  02/22/83
  3. ;
  4. ; 03/17/83
  5. ;
  6. ;    LISTT v1.3 has been modified to provide the following capabilities:
  7. ;
  8. ;      1) Program some of the OKIDATA Microline printer's 
  9. ;         attributes on selective basis before printing each file.
  10. ;
  11. ;      2) Time/Date stamp each page of the printed output using
  12. ;         Electralogics Incorporated's MFIO Reat Time Clock.
  13. ;
  14. ;    Since I prefer to use 8 1/2 inch paper, I have chosen to set
  15. ;    all form width characteristics relative to that preference.
  16. ;    These values may be easily changed to suit your own 
  17. ;    requirements.
  18. ;
  19. ;    I have also chosen to set the default specifications for the
  20. ;    printer as:- 8 lines per inch vertically and 17 characters
  21. ;    per inch horizontally. The headers are set up to locate
  22. ;    pertinent data in the same relative locations at the top of
  23. ;    the printed page regardless of the print/line characteristics
  24. ;    selected.
  25. ;
  26. ;    One more little thing; I like to leave a left margin of 20
  27. ;    spaces at 17 characters per inch, 10 spaces at 12 characters
  28. ;    per inch and no spaces at 10 characters per inch. 
  29. ;        
  30. ;    When the program is executed, the current printer parameters
  31. ;    are displayed and you are then asked if you wish to
  32. ;    alter the printer parameters (print density, or lines per
  33. ;    inch). If you answer in the affirmative, options will be
  34. ;    offered. Don't forget to answer "d" (for done) when you have
  35. ;    completed your option selection. The answer "n" will result
  36. ;    in the selection of the default parameters discussed above.
  37. ;
  38. ;    If a particular parameter is changed, for example - 6 lines
  39. ;    per inch is selected, then the variable "TEXT" is modified
  40. ;    to allow more lines of text per page. A similar
  41. ;    modification to the code is made if a different print
  42. ;    density is selected. The column in which the page number 
  43. ;    starts to print is also changed to reflect the new density.
  44. ;
  45. ;    Changes to Irv Hoff's code have been left in lower case to
  46. ;    ease recognition of them.
  47. ;
  48. ;    The code isn't elegant but it works. My apologies to Irv Hoff
  49. ;    for the liberties that I have taken with his efforts. Also my
  50. ;    thanks are extended to him for the education that this little
  51. ;    effort has given me.
  52. ;
  53. ;    If you care to leave any comments, or pose any questions,
  54. ;    leave a message on Jud's system.
  55. ;
  56. ;
  57. ;                Bill Harnell,
  58. ;                Scarborough, Ontario
  59. ;
  60. ;    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  61. ;
  62. ;
  63. ;                        Irvin M. Hoff
  64. ;                  Los Altos Hills, CA  94022
  65. ;
  66. ;      "LISTT" is a printer utility program that lists any re-
  67. ;      quested file on your printer.  The name was selected so
  68. ;      it would be easy to type, easy to remember, and be illus-
  69. ;      trative of its capabilities.  It works equally well on
  70. ;      printers that do/do not respond to form feed characters.
  71. ;
  72. ;      When requesting the program, include the name of the
  73. ;      file (and its extent) that is to be listed:
  74. ;
  75. ;
  76. ;                      A>LISTT HELLO.ASM
  77. ;
  78. ;
  79. ;      A menu then appears asking several questions:
  80. ;
  81. ;         1) Roll paper or fanfold (it adds tear tabs each
  82. ;               11" if using roll paper).
  83. ;         2) Ability to include 0-99 spaces at the left
  84. ;               margin for those printers without adjust-
  85. ;               able margins.
  86. ;         3) Ignore form feeds (Y/N) - By default accepts normal
  87. ;               form feeds.  (Automatically paginates with or
  88. ;               without form feeds).
  89. ;         4) Heading desired (such as current date, etc.)
  90. ;               The name of the file plus current page num-
  91. ;               ber near the right margin are both automatic.
  92. ;         5) Asks for starting page (defaults to page 1).
  93. ;         6) Asks for page to stop at (defaults to end of
  94. ;               file).
  95. ;
  96. ;      Thus you can compensate for various printers and can print
  97. ;      any portion of the file you wish.
  98. ;
  99. ;      NOTE:  There are two options which may be user-set.  They  
  100. ;             are locations 0103 and 0104.  They may be set with
  101. ;             "DDT", "SID" or by editing and reassembling:
  102. ;
  103. ;             1)  PAGCOL   --  Sets the column the Page number
  104. ;                              starts at.  Some printers have
  105. ;                              72 columns, some 80, some 132, etc.
  106. ;
  107. ;             2)  TTABN    --  Sets the space between tear tabs
  108. ;                              for fan fold.  Some printers have
  109. ;                              72 columns, some 80, some 132, etc.
  110. ;
  111. ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  112. ;
  113. ; 02/02/83 v1.2 Fixed the heading to indent on all pages, instead of
  114. ;               only the first. (Has worked correctly if using roll
  115. ;               paper with tear tabs, but not on fanfold.)
  116. ;                                       - Irv Hoff
  117. ;
  118. ; 01/17/83 v1.1 Would only display 99 pages and start over. Now goes 
  119. ;               to 99 pages.            - Irv Hoff
  120. ;
  121. ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  122. ;
  123. ;
  124.         ORG   100H           
  125. ;
  126. ;
  127.         JMP   BEGIN          
  128. ;
  129. ;
  130. ; SPECIAL STORAGE LOCATIONS
  131. ;
  132. datcol:    dw    head3        ;column to start date/time
  133. PAGCOL: DB      85              ;COLUMN TO START PAGE NUMBER
  134. TTABN:  DB      78              ;SPACE BETWEEN TEAR TABS FOR ROLL PAPER
  135. lspc:    db    08        ;6 std - 6 or 8 permitted
  136. chwd:    db    17        ;10 std - 10, 12 or 17 permitted
  137. stdflg:    db    00        ;standard print parameter flag
  138. ;.....
  139. ;
  140. ; ASCII CONTROL CHARACTERS
  141. ;
  142. esc    equ    1bh         ;escape character
  143. BS      EQU   'H'-40H        ;CONTROL-H FOR BACKSPACE
  144. TAB     EQU   'I'-40H        ;CONTROL-I FOR TAB
  145. LF      EQU   'J'-40H        ;CONTROL-J FOR LINE FEED
  146. FFD     EQU   'L'-40H        ;CONTROL-L FOR FORM FEED
  147. CR      EQU   'M'-40H        ;CONTROL-M FOR CARRIAGE RETURN
  148. SI      EQU   'V'-40H        ;CONTROL-V FOR SYNCH IDLE
  149. EOF     EQU   'Z'-40H        ;CONTROL-Z FOR END OF FILE
  150. ;.....
  151. ;
  152. ;
  153. ; CP/M ROUTINES AND FILE MANAGEMENT
  154. ;
  155. BDOS    EQU   0005H          ;SYSTEM CALL ENTRY POINT
  156. CONIN   EQU   1              ;CONSOLE INPUT CHAR
  157. CONOUT  EQU   2              ;DISPLAY CHAR ON CONSOLE
  158. FCB     EQU   5CH            ;LOCATION OF FILE CONTROL BLOCK
  159. LIST    EQU   5              ;SEND CHAR. TO LIST DEVICE
  160. pagenm    equ   3                 ;allows up to 999 pages
  161. STATUS  EQU   11             ;CONSOLE STATUS
  162. TBUFF   EQU   80H            ;BUFFER FOR FILE CONTROL BLOCK
  163. TFCB    EQU   005CH          ;DEFAULT FILE CONTROL BLOCK
  164. ;.....
  165. ;
  166. ;
  167. ; MISC STORAGE LOCATIONS
  168. ;
  169. ;
  170. CCP:    DB    0              ;INITIAL 'CCP' PAGE
  171. COLMN:  DB    0              ;POSITION ON THE LINE
  172. FRMFD:  DB    0              ;FORM FEED CONTROL
  173. LCNT:   DB    0              ;LINE COUNT FOR HARD COPY
  174. NOTAB:    DB    0             ;CHANGES TO '1' IF USING TEAR TABS
  175. START:    DB    0              ;START PRINTING FLAG
  176. text:    db    76             ;number of lines of text per page
  177.                 ;66 lpp = 54, 88 lpp = 76
  178. ;.....
  179. ;
  180. ;
  181. ; FILE HANDLING DATA
  182. ;
  183. FILEADR:      DW    BUFFER
  184. FILELEN:      DB    0,0
  185. FILEPTR:      DB    0,0
  186. FILESIZ:      DB    0,0
  187. FCBSTR:       DB    0,0,0,0,0,0,0,0,0,0,0,0
  188.               DB    0,0,0,0,0,0,0,0,0,0,0,0
  189.               DB    0,0,0,0,0,0,0,0,0
  190. ;.....
  191. ;
  192. ;
  193. ; HEADING LINE FOR HARD COPY
  194. ;
  195. HEAD1:  DB    SI,SI,SI,SI,SI,SI,SI,SI,SI,SI,SI,SI,'  '
  196. HEAD2:  DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  197.         DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  198.         DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  199.         DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  200.         DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  201.         DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  202.         DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  203.         DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  204. HEAD3:  DB    '                        - Page '
  205. HEAD4:  DB    SI,SI,'1',CR,LF,LF,LF,0
  206. PAGES:  DB    SI,SI,'1   '
  207. PAGEQ:  DB    SI,SI,'    '
  208. QUIT:   DB    CR,LF,LF,LF,LF,LF,LF,LF,LF,LF,0
  209. QUITR:  DB    CR,LF,LF,LF,LF,LF,0
  210. TURNUP:    DB    CR,LF,LF,LF,LF,LF,LF,LF,LF,LF,CR,LF,0
  211. ;
  212. ;.....
  213. ;
  214. ;
  215. ; MESSAGES
  216. ;
  217. MERRN:  DB    '== No file by that name on this disk =='
  218.         DB    CR,LF,'$'
  219. MERRR:  DB    '== No file requested ==',CR,LF,LF,'$'
  220. MERRW:  DB    '== No "*" or "?" please ==',CR,LF,'$'
  221. ;
  222. MSG1:   DB    CR,LF,'        LISTT Pgm v1.3  02/22/83',CR,LF
  223.     DB    '(With Okidata Microline u84 Enhancements)',cr,lf,lf,0
  224. MSG1B:  DB    cr,lf,'Do you want tear tabs to use roll paper? (y/n):  ',0
  225. MSG1C:  DB    'Number of spaces to augment left margin (0-99):  ',0
  226. MSG1D:  DB    'Accept FF (y/n):  ',0
  227. MSG1E:  DB    'Heading is:  ',0
  228. MSG1F:  DB    'Start at page  :  ',0
  229. MSG1G:  DB    'Quit  at page  :  ',0
  230. MSG2:   DB    'HIGHEST PAGE IS:  ',0
  231. MSG3:   DB     CR,LF,0
  232. ;
  233. ;.....
  234. ;
  235. msgpc:    db    cr,lf,lf,lf
  236.     db    'Following are Microline 84 printer options',cr,lf
  237.     db    '(Parenthetical notes show current values)',cr,lf,lf,0
  238. msgpc1:    db    ' 1. Line Spacing               (  )',cr,lf
  239.     db    '    (6 or 8 lpi permitted)',cr,lf,0
  240. msgpc2:    db    ' 2. Print Density              (  )',cr,lf
  241.     db    '    (10, 12 or 17 cpi permitted)',cr,lf,0
  242. msgpc5:    db    cr,lf,'Changes Desired (y, n or (d)one) ==> ',0
  243. msgpc6:    db    cr,lf,lf,'Enter 1 or 2                  ==> ',0
  244. ;
  245. lsmsg:    db    cr,lf,'Enter Lines Per Inch (6 or 8) ==> ',0
  246. lsmsg6:    db    esc,'6',cr,0        ;6 lpi
  247. lsmsg8:    db    esc,'8',cr,0        ;8 lpi
  248. tofmsg:    db    esc,'5',cr,0        ;top of form message
  249. ;
  250. cwmsg:    db    cr,lf,'Enter Print Density (10, 12 or 17 cpi)'
  251.     db    cr,lf,'1 = 10, 2 = 12 or 3 = 17 cpi  ==> ',0
  252. cwmsg10:db    30,cr,0            ;10 cpi
  253. cwmsg12:db    29,cr,0            ;12 cpi
  254. cwmsg17:db    28,cr,0            ;17 cpi
  255. ;
  256. ;
  257. ;.....
  258. ;
  259. ;
  260. ; TO GIVE THE FINAL LISTING A LEFT-MARGIN SO THAT IT CAN BE  MORE EASILY
  261. ; USED IN A BINDER, EXTRA SPACES CAN BE INSERTED AUTOMATICALLY INTO THE
  262. ; LEFT MARGIN AREA WHEN ANSWERING THE QUESTION AT BOOT TIME.  (NONE ARE
  263. ; NEEDED IF YOUR PRINTER HAS ADJUSTABLE MARGINS.)
  264. ;
  265. FILLS:  DB    '    '         ;TELLS HOW FAR TO MOVE THE MARGIN
  266. ;
  267. MARGIN: DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  268.         DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  269.         DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  270.         DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  271.  
  272. ;
  273. ;
  274. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  275. ;                                                                      ;
  276. ;                                                                      ;
  277. ;                    PROGRAM STARTS HERE                               ;
  278. ;                                                                      ;
  279. ;                                                                      ;
  280. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  281. ;
  282. ;
  283. BEGIN:    POP   H              ;GET RETURN ADDRESS TO'CCP'
  284.     SHLD  EXIT+1         ;STORE FOR RETURN TO 'CCP'
  285.         LXI   SP,STACK       ;SETUP NEW STACK FOR THIS PGM
  286. ;
  287. ;
  288. ; SIGN-ON MESSAGE
  289. ;
  290.         LXI   H,MSG1
  291.         CALL  STRNGC         ;WRITE STRING TO CRT  
  292. ;
  293. ;*****************************
  294. ;
  295. ; MOVE PGM NAME INTO HEADING BUFFER
  296. ;
  297. ;*****************************
  298. ;
  299. ; SEE IF ANY FILE WAS REQUESTED
  300. ;
  301. TITL:   LXI   H,TBUFF        ;FILE CONTROL BLOCK BUFFER
  302.         MOV   A,M            ;GET FIRST CHARACTER
  303.         ORA   A
  304.         JZ    ERRORR         ;IF ZERO, NO FILE WAS REQUESTED
  305.                  ;check for printer parm. change
  306. ;
  307. ; IF YES, SEE IF A DRIVE WAS MENTIONED, DO NOT PRINT THAT
  308. ;
  309.         LXI   H,TBUFF+3      ;SEE IF THEY SPECIFIED A DRIVE
  310.         MOV   A,M
  311.         CPI   ':'
  312.         JZ    TITL1+1        ;IF YES IGNORE
  313.         LXI   H,TBUFF        ;IF NOT, RESET TO NORMAL
  314. ;       
  315. TITL1:  INX   H              ;IGNORE THE SPACE CHAR.
  316.         LXI   D,HEAD1        ;LOCATION OF HEADING BUFFER
  317. ;.....
  318. ;
  319. ; see if printer parameter changes necessary
  320. ;
  321.     push psw!push b!push d!push h
  322.     call    shpcol
  323.     pop h!pop d!pop b!pop psw
  324. ;.....
  325. ;
  326. ; MOVE THE FILE NAME AND HEADING/DATE INTO THE BUFFER
  327. ;
  328. TITL2:  INX   H              ;NEXT LOCATION
  329.         MOV   A,M            ;GET THE CHARACTER
  330.         ORA   A              ;BINARY ZERO?
  331.         JZ    TITL3          ;IF YES, FINISHED
  332.         CPI   ' '            ;A SPACE AFTER FILENAME?
  333.         JZ    TITL3          ;IF YES, ALL FINISHED
  334.         STAX  D              ;AND STORE IN BUFFER
  335.         INX   D              ;ADVANCE BUFFER LOCATION
  336.         JMP   TITL2          ;IF NOT, CONTINUE
  337. ;
  338. ;
  339. ; CHECK FOR ANY WILD CARD CHARACTERS AND IF PRESENT SHOW ERROR
  340. ;
  341. TITL3:  LXI   H,FCB          ;WHERE NAME IS
  342.         MVI   B,11           ;NUMBER OF CHARS POSSIBLE
  343. ;
  344. TITL4:  INX   H              ;NEXT LOCATION IN FILE NAME
  345.         MOV   A,M            ;GET CHARACTER
  346.         CPI   '?'            ;CHECK FOR ANY WILD CARD CHARS.
  347.         JZ    ERRORW         ;ERROR IF ONE IS FOUND
  348.         DCR   B              ;COUNT CHARACTERS TO TEST
  349.         JNZ   TITL4          ;LOOP BACK UNLESS DONE
  350. ;
  351. ;
  352. ;*****************************
  353. ;
  354. ; CALCULATE MAXIMUM AVAILABLE BUFFER SIZE
  355. ;
  356. ;*****************************
  357. ;
  358. ;
  359.         LXI   D,BUFFER
  360.         LDA   BDOS+2         ;GET BDOS ADDRESS
  361.         SUI   8              ;PROTECT 'CCP'
  362.         MOV   H,A            ;GET THE MAIN PAGE
  363.         STA   CCP            ;STORE FOR "CLEAR BUFFER"
  364.         XRA   A              ;CLEAR CARRY IF SET
  365. ;
  366. ;
  367. ; CALCULATE THE DIFFERENCE TO GET SPACE AVAILABLE
  368. ;
  369.         SUB   E
  370.         MOV   L,A
  371. ;
  372.         MOV   A,H
  373.         SBB   D
  374.         MOV   H,A
  375. ;
  376. ;
  377. ; FREE SPACE AVAILABLE NOW IN 'HL', SO STORE FOR BUFFER SIZE
  378. ;
  379.         SHLD  FILESIZ
  380. ;
  381. ;*****************************
  382. ;
  383. ; OPEN REQUESTED FILE TO READ THE DATA TO LIST
  384. ;
  385. ;*****************************
  386. ;
  387.         LXI   H,FCB          ;LOCATION OF FILE CONTROL BLOCK
  388.         LXI   D,FCBSTR
  389.         MVI   C,12           ;NORMAL FILE LENGTH
  390.         CALL  STORE
  391. ;
  392.         XRA   A
  393.         STA   FCBSTR+12      ;NULL LOCATION FOLLOWING FILE NAME
  394.         STA   FCBSTR+32
  395.         LHLD  FILESIZ
  396.         SHLD  FILELEN
  397.         SHLD  FILEPTR
  398.         MVI   C,15
  399.         LXI   D,FCBSTR       ;OPEN FILE
  400.         CALL  BDOS
  401.         INR   A
  402.         JZ    ERRORN         ;IF UNABLE, TERMINATE
  403. ;
  404. ;
  405. ;*****************************
  406. ;
  407. ; ASK ABOUT ROLL PAPER, MARGINS, STARTING PAGE, ETC.
  408. ;
  409. ;*****************************
  410. ;
  411. ;
  412.         CALL  PRHC           ;ASK QUESTIONS
  413. ;
  414. ;
  415. ;***********************************************************************
  416. ;                                                                      ;
  417. ;                     MAIN PRINT LOOP                                  ;
  418. ;                                                                      ;
  419. ;***********************************************************************
  420. ;
  421. ;
  422. ; HANDLES TOP OF NEW PAGE
  423. ;
  424. MAIN:   call  time           ;set time/date etc. into header
  425.     CALL  NEWPG          ;SET PARAMETERS FOR A NEW PAGE
  426.         CALL  SKIP           ;SKIP CR, LF, EOF OR FFD AT NEW PAGE
  427.         JMP   MAIN2          ;ALREADY HAVE FIRST GOOD CHAR.
  428. ;
  429. ;
  430. ; HANDLE ASCII CHARACTERS
  431. ;
  432. MAIN1:  CALL  GETCH          ;GET NEW CHARACTER
  433.         CPI   EOF            ;END OF FILE IN MIDDLE OF LINE?
  434.         JZ    ROLL
  435. ;
  436. MAIN2:  CPI   ' '            ;PRINTING CHAR.?
  437.         JC    MAIN4          ;IF NOT, EXIT
  438. ;
  439. MAIN3:  CALL  WRITE2         ;WRITE CHARACTER
  440.         JMP   MAIN1          ;GET THE NEXT CHAR.
  441. ;...
  442. ;
  443. ;
  444. ; HANDLE NON-PRINTING CHARS.
  445. ;
  446. MAIN4:  CPI   CR             ;CARRIAGE RETURN
  447.         JZ    MAIN5
  448.         CPI   FFD            ;FORM FEED
  449.         JZ    MAIN6
  450.         CPI   LF             ;LINE FEED
  451.         JZ    MAIN7
  452.         CPI   TAB            ;TAB CHARACTER
  453.         JZ    MAIN8
  454.         JMP   MAIN9          ;NONE OF THESE SEND SPECIAL CHAR.
  455. ;.....
  456. ;
  457. ;
  458. ; HANDLE 'CR' CHAR.
  459. ;
  460. MAIN5:  CALL  ABORT          ;WANT TO TERMINATE?
  461.         MVI   A,CR           ;RESTORE THE CHAR.
  462.         JMP   MAIN3          ;GET NEXT CHAR.
  463. ;...
  464. ;
  465. ;
  466. ; HANDLE FORM FEED CHAR.
  467. ;
  468. MAIN6:  CALL  ABORT          ;WANT TO TERMINATE?
  469.         LDA   FRMFD          ;RESPONDING TO FORM FEED?
  470.         ORA   A
  471.         JNZ   MAIN1          ;IF NOT, IGNORE
  472. ;
  473.         LDA   LCNT           ;INCREMENT LINE COUNT
  474.         INR   A
  475.         STA   LCNT
  476.         push  h
  477.     lxi   h,text
  478.     cmp   m
  479.     pop   h
  480.         JNC   MAIN71         ;IF DONE, TURN UP NEW PAGE
  481.         MVI   A,LF
  482.         CALL  WRITEP         ;PRINT NEW LINE, DO NOT DISPLAY
  483.         JMP   MAIN6          ;CHECK AGAIN
  484. ;...
  485. ;
  486. ;
  487. ; HANDLE 'LF' CHARS.
  488. ;
  489. MAIN7:  LDA   LCNT           ;INCREMENT THE TEXT LINE COUNT
  490.         INR   A
  491.         STA   LCNT
  492.         push  h
  493.     lxi   h,text
  494.     cmp   m
  495.     pop   h                 ;MAXIMUM NUMBER OF LINES NOW?
  496.         JNC   MAIN71         ;IF YES, FINISH THE PAGE
  497.     MVI   A,LF
  498.         CALL  WRITE3
  499.         CALL  INDENT         ;INDENT IF REQUESTED
  500.         JMP   MAIN1          ;HANDLE NORMALLY
  501. ;...
  502. ;
  503. ;
  504. ;    'LF' SO START A NEW PAGE
  505. ;
  506. MAIN71: CALL  ABORT          ;WANT TO TERMINATE NOW?
  507.         CALL  SKIP           ;SKIP ANY CR, LF, EOF OR FFD TOP OF PAGE
  508.         PUSH  PSW            ;OTHERWISE SAVE CHAR.
  509.         CALL  TTABS          ;CHECK FOR ROLL PAPER
  510.         CALL  NMBR           ;INCREMENT THE PAGE NUMBER
  511.         CALL  CKSP           ;READY TO STOP AS YET?
  512.         CALL  INDENT
  513. ;
  514. MAIN72:    LXI   H,HEAD1        ;SEND THE NEW PAGE HEADING
  515.         CALL  STRNGB         ;DISPLAY AND PRINT
  516.         CALL  PAGNO          ;SET IN PAGE NUMBER
  517.     CALL  NEWPG          ;SET UP PARAMETERS FOR A NEW PAGE
  518.     POP   PSW            ;GET THE CHAR. BACK WE LOOKED AT
  519.         JMP   MAIN2          ;IGNORE GETTING A NEW CHAR.
  520. ;...
  521. ;
  522. ;
  523. ; HANDLE TAB CHARACTERS
  524. ;
  525. MAIN8:  MVI   A,' '          ;SEND A SPACE IN PLACE OF TAB
  526.         CALL  WRITE2         ;DISPLAY AND PRINT
  527.         LDA   COLMN          ;FIND WHAT COLUMN
  528.         ANI   7
  529.         JNZ   MAIN8          ;IF NOT EVEN 8, DO ANOTHER SPACE
  530.         JMP   MAIN1          ;BACK TO WORK
  531. ;...
  532. ;
  533. ;
  534. ; DISPLAY CONTROL-CHARACTERS
  535. ;
  536. MAIN9:  PUSH  PSW            ;SAVE THE CHAR.
  537.         MVI   A,'^'          ;SHOW A SPECIAL "CTL-CHAR."
  538.         CALL  WRITE2         ;DISPLAY/PRINT
  539.         POP   PSW
  540.         ADI   40H            ;CONVERT TO PRINTING CHAR.
  541.         CALL  WRITE2
  542.         JMP   MAIN           ;GET NEXT CHAR.
  543. ;.....
  544. ;
  545. ;
  546. ;***********************************************************************
  547. ;                                                                      ;
  548. ;                                                                      ;
  549. ;                    ROUTINES START HERE                               ;
  550. ;                                                                      ;
  551. ;                                                                      ;
  552. ;***********************************************************************
  553. ;
  554. ;
  555. ; CLEAR KEYBOARD OF ANY OTHER CHARS.
  556. ;
  557. ABORT:  MVI   C,STATUS
  558.         CALL  BDOS
  559.         RAR    
  560.         RNC
  561. ;
  562.         MVI   C,CONIN        ;GET THE CHAR.
  563.         CALL  BDOS
  564.         CPI   'C'-40H        ;WANT TO TERMINATE?
  565.         JNZ   ABORT          ;EXIT IF NOT CTL-C
  566. ;
  567. ABORT1: LDA   NOTAB          ;USING FANFOLD PAPER?
  568.     ORA   A
  569.     JZ    EXIT           ;IF YES, LEAVE IN NORMAL POSITION
  570.     LXI   H,TURNUP       ;OTHERWISE, TERMINATE
  571.         CALL  STRNGP         ;DISPLAY AND PRINT SOME LINE FEEDS
  572.     LXI   H,QUITR-7      ;..A FEW EXTRA LINES
  573.     CALL  STRNGP
  574.     JMP   EXIT
  575. ;
  576. ABORT2: LXI   H,QUITR-3
  577.         CALL  STRNGC
  578.         JMP   EXIT           ;FINISHED NOW
  579. ;.....
  580. ;
  581. ;
  582. ; HANDLE A BACKSPACE CHAR. WHILE ENTERING A FILE NAME
  583. ;
  584. BCKSP:  MOV   A,B            ;GET POSITION ON LINE
  585.         ORA   A
  586.         JNZ   BCKSP1         ;EXIT IF AT INITIAL COLUMN
  587.         MVI   A,' '          ;DELETE THE CHAR.
  588.         JMP   BCKSP3
  589. ;
  590. BCKSP1: DCR   B              ;SHOW ONE LESS COLUMN USED
  591.         DCX   H              ;DECREASE BUFFER LOCATION
  592.         MVI   A,' '
  593.         MOV   M,A            ;REPLACE TO ORIGINAL
  594.         CALL  WRITCC         ;BACKSPACE THE CRT
  595. ;
  596. BCKSP2: MVI   A,BS           ;RESET THE CRT AGAIN
  597. ;
  598. BCKSP3: CALL  WRITCC         ;WRITE TO CRT
  599.         RET
  600. ;.....
  601. ;
  602. ;
  603. ; CHECK TO SEE IF READY TO STOP PRINTING YET
  604. ;
  605. CKSP:   PUSH  H              ;SAVE THE REGS.
  606.         PUSH  D
  607.         PUSH  B
  608.         LXI   H,PAGEQ+2      ;ADDRESS OF QUITTING PAGE ANSWER
  609. ;
  610. CKSP1:  INX   H              ;FIND THE RIGHTMOST DIGIT
  611.         MOV   A,M
  612.         CPI   ' '
  613.         JNZ   CKSP1
  614.         DCX   H
  615. ;
  616.         LXI   D,HEAD4+2      ;RIGHTMOST DIGIT FOR PAGE NUMBER
  617.         MVI   C,PAGENM         ;ALLOWS UP TO 9,999 PAGES
  618. ;
  619. CKSP2:  LDAX  D              ;COMPARE TWO STRINGS OF NUMBERS
  620.         CMP   M
  621.         JNZ   CKSP3          ;IF DIFFERENT, NOT READY YET
  622. ;
  623.         DCX   D              ;CHECK NEXT DIGIT
  624.         DCX   H
  625.         DCR   C
  626.         JNZ   CKSP2
  627. ;
  628.         JMP   ABORT1
  629. ;
  630. CKSP3:  POP   B              ;RESTORE THE REGS.
  631.         POP   D
  632.         POP   H
  633.         RET
  634. ;.....
  635. ;
  636. ;
  637. ; CHECK TO SEE IF READY TO START PRINTING YET
  638. ;
  639. CKST:   PUSH  H              ;SAVE THE REGS.
  640.         PUSH  D
  641.         PUSH  B
  642.         LXI   H,PAGES+2      ;ADDRESS OF STARTING PAGE ANSWER
  643. ;
  644. CKST1:  INX   H              ;FIND THE RIGHTMOST DIGIT
  645.         MOV   A,M
  646.         CPI   ' '
  647.         JNZ   CKST1
  648.         DCX   H
  649. ;
  650.         LXI   D,HEAD4+2      ;RIGHTMOST DIGIT FOR PAGE NUMBER
  651.         MVI   C,PAGENM
  652. ;
  653. CKST2:  LDAX  D              ;COMPARE TWO STRINGS OF NUMBERS
  654.         CMP   M
  655.         JNZ   CKST4          ;IF DIFFERENT, NOT READY YET
  656. ;
  657.         DCX   D              ;CHECK NEXT DIGIT
  658.         DCX   H
  659.         DCR   C
  660.         JNZ   CKST2
  661. ;
  662.         STA   START          ;ALLOWS HARD COPY TO COMMENCE
  663.         MVI   A,CR
  664.         CALL  WRITEP         ;POSITION PRINTER TO LEFT FOR FIRST LINE
  665.     LDA   NOTAB         ;USING TEAR TABS?
  666.     ORA   A
  667.     CNZ   TTABS         ;IF YES, START FIRST PAGE WITH TEAR TABS
  668.         CALL  INDENT         ;INDENT IF REQUESTED
  669. ;
  670. CKST3:  LXI   H,HEAD1
  671.         CALL  STRNGB
  672.         CALL  PAGNO          ;SET IN PAGE NUMBER
  673. ;
  674. CKST4:  POP   B              ;RESTORE THE REGS.
  675.         POP   D
  676.         POP   H
  677.         RET
  678. ;.....
  679. ;
  680. ;
  681. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  682. ;                                                                     ;
  683. ;              LOAD THE DISK FILE INTO MEMORY, GET A CHAR             ;
  684. ;                                                                     ;
  685. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  686. ;
  687. ;
  688. ; SEE IF ANYTHING ALREADY IN THE BUFFER
  689. ;
  690. DISK1:  LHLD  FILELEN
  691.         XCHG
  692.         LHLD  FILEPTR
  693.         MOV   A,L
  694.         SUB   E
  695.         MOV   A,H
  696.         SBB   D
  697.         JC    DISK5          ;IF NOT EMPTY GO GET CHAR.
  698. ;
  699. ;
  700. ; IF EMPTY, FILL BUFFER
  701. ;
  702.         LXI   H,0
  703.         SHLD  FILEPTR        ;ZERO THE FILE POINTERS
  704. ;
  705. ;
  706. ; GET NEXT DISK SECTOR, CHECK FOR END OF FILE MARKER
  707. ;
  708. DISK2:  XCHG                 ;PUT INTO 'DE'
  709.         LHLD  FILELEN        ;SET 'HL' TO MAXIMUM BUFFER LENGTH
  710.         MOV   A,E
  711.         SUB   L
  712.         MOV   A,D
  713.         SBB   H
  714.         JNC   DISK4          ;IF NOW FULL, EXIT
  715. ;
  716. ;
  717. ; OTHERWISE GET NEXT SECTOR
  718. ;    
  719.         LHLD  FILEADR        ;START OF BUFFER
  720.         DAD   D              ;ADD IN FILE POINTER VALUE
  721.         XCHG                 ;ADDRESS FOR NEXT DISK SECTOR TO GO
  722.         MVI   C,26           ;SET DMA ADDRESS
  723.         CALL  BDOS
  724.         LXI   D,FCBSTR       ;ADDRESS OF DISK FILE NAME
  725.         MVI   C,20           ;READ SEQUENTIAL INTO MEMORY BUFFER
  726.         CALL  BDOS
  727.         ORA   A              ;CHECK FOR END OF FILE
  728.         JNZ   DISK3          ;IF YES, EXIT
  729. ;
  730.         LXI   D,TBUFF        ;SECTOR SIZE IS 128 BYTES
  731.         LHLD  FILEPTR        ;NEXT LOCATION TO PUT SECTOR        
  732.         DAD   D              ;ADD THE SECTOR SIZE
  733.         SHLD  FILEPTR        ;STORE FOR NEXT SECTOR-FILL
  734.         JMP   DISK2          ;CHECK FOR FULL, IF NOT KEEP GOING
  735. ;.....
  736. ;
  737. ; RESET FOR END-OF-FILE MARKER LOCATION
  738. ;
  739. DISK3:  LHLD  FILEPTR
  740.         SHLD  FILELEN
  741. ;
  742. ; SET FOR BUFFER FULL
  743. ;
  744. DISK4:  LXI   D,TBUFF        ;POINT TO TEMPORARY BUFFER ADDRESS
  745.         MVI   C,26           ;SET DMA ADDRESS
  746.         CALL  BDOS
  747.         LXI   H,0            ;RESET FILE POINTER TO START OF BUFFER
  748.         SHLD  FILEPTR
  749. ;
  750. ;
  751. ; GET THE NEXT CHARACTER FROM THE BUFFER
  752. ;
  753. DISK5:  XCHG                 ;FILE POINTER LOCATION
  754.         LHLD  FILEADR        ;START OF MEMORY BUFFER
  755.         DAD   D              ;ADDRESS OF NEXT CHARACTER TO GET
  756.         XCHG                 ;PUT INTO 'DE'
  757.         LHLD  FILELEN        ;GET LENGTH OF FILE
  758.         MOV   A,L            ;SEE IF EMPTY NOW
  759.         ORA   H
  760.         MVI   A,EOF          ;END OF FILE MARKER (CTL-Z)
  761.         RZ                   ;DONE IF 'H' AND 'L' BOTH ZERO
  762. ;
  763.         LDAX  D              ;GET THE CHAR.
  764.         LHLD  FILEPTR        ;BUMP THE POINTERS FOR NEXT CHARACTER
  765.         INX   H
  766.         SHLD  FILEPTR
  767.         RET
  768. ;.....
  769. ;
  770. ;
  771. ; EXIT IF HAVING A PROBLEM OPENING A FILE
  772. ;
  773. ERROR:  MVI   C,9            ;PRINT STRING
  774.         CALL  BDOS
  775.     JMP   EXIT
  776. ;
  777. ERRORR: LXI   D,MERRR        ;NO FILE REQUESTED - ERROR MSG
  778.         JMP   ERROR
  779. ;
  780. ERRORN: LXI   D,MERRN        ;NO FILE BY THAT NAME - ERROR MSG
  781.         JMP   ERROR
  782. ;
  783. ERRORW: LXI   D,MERRW        ;NO WILDCARD - ERROR MSG
  784.         JMP   ERROR
  785. ;.....
  786. ;
  787. ;
  788. ;EXIT ROUTINE
  789. ;
  790. EXIT:    JMP   0000H          ;FILLED IN BY 'BEGIN' FOR RETURN TO 'CCP'
  791. ;.....
  792. ;
  793. ;
  794. ; GET A CHARACTER FROM THE BUFFER
  795. ;
  796. GETCH:  CALL  DISK1          ;PICK OFF THE CHAR.
  797.         ANI   7FH            ;STRIP OFF ANY PARITY
  798.         RET
  799. ;.....
  800. ;
  801. ;
  802. ; INDENT FOR NEW LEFT MARGIN, IF REQUESTED
  803. ;
  804. INDENT: PUSH  PSW            ;SAVE THE CHAR.
  805.         LXI   H,MARGIN
  806.         CALL  STRNGP         ;WRITE THE STRING
  807.         XRA   A
  808.         STA   COLMN          ;RESET THE COLUMN COUNT
  809.         POP   PSW            ;RESTORE THE CHAR.
  810.         RET
  811. ;.....
  812. ;
  813. ;
  814. ; GET A CHARACTER FROM THE KEYBOARD
  815. ;
  816. INPUT:  PUSH  H
  817.         PUSH  B
  818.         MVI   C,CONIN
  819.         CALL  BDOS
  820.         ANI   7FH            ;STRIP OFF ANY PARITY
  821.         POP   B
  822.         POP   H
  823.         CPI   3              ;CONTROL-C ?
  824.         JZ    ABORT2         ;IF YES, GO TERMINATE
  825.         RET
  826. ;.....
  827. ;
  828. ;
  829. ; SET PARAMETERS FOR A NEW PAGE
  830. ;
  831. NEWPG:  XRA   A
  832.         STA   LCNT           ;RESET THE TEXT COUNT
  833.         STA   COLMN          ;RESET THE COLUMN COUNT
  834.         LDA   START          ;ALREADY PRINTING?
  835.         ORA   A
  836.         CZ    CKST           ;IF NOT CHECK WHETHER READY NOW
  837.         JMP   INDENT         ;SET IN ANY LEFT MARGIN SPACES
  838. ;.....
  839. ;
  840. ;
  841. ; INCREMENT THE PAGE NUMBER FOR HARD COPY
  842. ;
  843. NMBR:   LXI   H,HEAD4+2
  844.         MVI   C,PAGENM
  845. ;       
  846. NMBR1:  MOV   A,M            ;GET THE VALUE
  847.         CPI   ' '            ;IS IT A SPACE?
  848.         JZ    NMBR2          ;EXIT IF NOT
  849.         CPI   SI             ;SYNCH CHAR.?
  850.         JNZ   NMBR3
  851. ;
  852. NMBR2:  MVI   A,'0'          ;OTHERWISE CALL IT A ZERO
  853. ;
  854. NMBR3:  INR   A
  855.         MOV   M,A
  856.         CPI   '9'+1          ;READY TO START NEXT DIGIT?
  857.         JNZ   NMBR4          ;IF NOT, FINISHED
  858. ;
  859.         MVI   M,'0'          ;OTHERWISE MAKE THIS ONE A ZERO
  860.         DCX   H              ;WORK ON NEXT COLUMN
  861.         DCR   C              ;ONE LESS TO GO
  862.         JNZ   NMBR1          ;GO DO THE NEXT ONE
  863. ;
  864. NMBR4:  RET                  ;FINISHED
  865. ;.....
  866. ;
  867. ;
  868. ; IF NO PRINT, TELL WHAT MAXIMUM PAGE WAS
  869. ;
  870. NOPNT:  LXI   H,MSG3         ;TURN UP A BLANK LINE
  871.         CALL  STRNGC
  872.         LXI   H,MSG2         ;FINAL PAGE MSG
  873.         CALL  STRNGC
  874.         LXI   H,HEAD4
  875.         CALL  STRNGC
  876.         JMP   EXIT           ;ALL DONE NOW
  877. ;.....
  878. ;
  879. ; TO START A NEW PAGE
  880. ;
  881. NUPAGE:    LXI   H,TURNUP         ;SEND A STRING OF LINE FEEDS TO
  882.     JMP   STRNGB         ;..START A NEW PAGE
  883. ;.....
  884. ;
  885. ;
  886. ; DISPLAY AND PRINT THE PAGE NUMBER
  887. ;
  888. PAGNO:     MVI   A,' '          ;SPACE CHARACTER
  889.         CALL  WRITE2         ;DISPLAY AND PRINT AND COUNT
  890.         LDA   PAGCOL         ;FIND COLUMN TO START PAGE NUMBER
  891.         MOV   B,A
  892.         LDA   COLMN          ;GET PRESENT COLUMN
  893.         ADI   1              ;COMPENSATE FOR LEFT MARGIN "0" COUNT
  894.         SUB   B              ;SEE IF ROOM LEFT FOR SPACES
  895.         JC    PAGNO          ;IF YES SEND ANOTHER SPACE
  896. ;
  897.         LXI   H,HEAD3        ;PAGE NUMBER STRING
  898.         JMP   STRNGB         ;DISPLAY AND PRINT, FINISHED
  899. ;
  900. ;.....
  901. ;
  902. ;
  903. ; ASKS VARIOUS QUESTIONS SUCH AS HEADING, PAGE NUMBERS, ETC.
  904. ;
  905. ;    TABS FOR ROLL PAPER REQUEST
  906. ;
  907. PRHC:   CALL  RPAPER         ;USING ROLL PAPER?
  908. ;
  909. ;.....
  910. ;
  911. ;    ASK FOR ANY FILL CHARS. TO AUGMENT LEFT MARGIN
  912. ;
  913.         LXI   H,MSG1C        ;WANT FILL CHARS.?
  914.         CALL  STRNGC
  915.         MVI   B,0
  916.         LXI   H,FILLS+1      ;STORAGE FOR NUMBER OF FILL CHARS.
  917. ;
  918. PRHC1:  CALL  INPUT          ;GET KEYBOARD ANSWER
  919.         CPI   CR             ;CARRIAGE RETURN TO QUIT?
  920.         JZ    PRHC4
  921.         CPI   BS             ;BACKSPACE CHAR.?
  922.         JNZ   PRHC2
  923.         CALL  BCKSP          ;BACKSPACE
  924.         JMP   PRHC1
  925. ;
  926. PRHC2:  CPI   ' '
  927.         JC    PRHC1          ;IF NON-PRINTING, IGNORE
  928.         MOV   M,A            ;STORE CHARACTER
  929.         INX   H              ;NEXT STORAGE LOCATION
  930.         INR   B              ;INCREMENT COUNT
  931.         CPI   '0'
  932.         JC    PRHC3          ;DIGITS FROM 0-9 ACCEPTABLE
  933.         CPI   '9'+1
  934.         JNC   PRHC3          ;DIGITS FROM 0-9 ACCEPTABLE
  935.         MOV   A,B
  936.         CPI   2+1            ;TWO MAXIMUM DIGITS FOR 0-99
  937.         JC    PRHC1
  938. ;
  939. PRHC3:  CALL  BCKSP2         ;WON'T ALLOW THREE DIGITS
  940.         CALL  BCKSP1         ;   (OR NON-NUMERIC CHARS.)
  941.         JMP   PRHC1          ;GET NEXT CHAR.
  942. ;...
  943. ;
  944. ;
  945. ; NOW PUT THE NUMBER OF "INDENT SPACES" INTO THE "MARGIN" BUFFER
  946. ;
  947. PRHC4:  LXI   D,MARGIN       ;LOCATION OF THE "INDENT SPACES"
  948.         LXI   H,FILLS+2      ;SEE IF 2 DIGITS THIS TIME
  949.         MOV   A,M
  950.         CPI   ' '
  951.         JNZ   UNITS          ;IF NOT, HANDLE AS A UNIT-DIGIT
  952.         DCX   H
  953.         MOV   A,M
  954.         CPI   ' '            ;THIS ONE HAVE ANYTHING?
  955.         JZ    PRHC5          ;IF NOT, NO FILLS WANTED
  956. ;
  957. UNITS:  SUI   '0'            ;CONVERT TO BINARY
  958.         JZ    TENS           ;IF ALREADY ZERO, EXIT
  959.         MOV   B,A            ;STORE
  960.         MVI   A,' '
  961. ;
  962. UNITS1: STAX  D              ;STORE A SPACE
  963.         INX   D
  964.         DCR   B
  965.         JNZ   UNITS1
  966. ;
  967. TENS:   DCX   H
  968.         MOV   A,M
  969.         CPI   '1'            ;A NUMBER FROM 1-9?
  970.         JC    PRHC5          ;IF NOT, ALL DONE
  971.         SUI   '0'            ;IF YES, CONVERT TO BINARY
  972.         MOV   B,A            ;STORE
  973. ;
  974. TENS1:  MVI   C,10           ;10 SPACES FOR EACH "TENS" NUMBER
  975.         MVI   A,' '
  976. ;
  977. TENS2:  STAX  D              ;STORE A SPACE
  978.         INX   D              ;NEXT LOCATION
  979.         DCR   C
  980.         JNZ   TENS2
  981.         DCR   B
  982.         JNZ   TENS1          ;RELOAD 'C' TO 10 IF NEEDED
  983. ;......
  984. ;
  985. ;
  986. ;    WANT NORMAL FORM FEED?
  987. ;       
  988. PRHC5:  LXI   H,MSG3         ;TURN UP A NEW LINE
  989.         CALL  STRNGC
  990.         LXI   H,MSG1D        ;FORM FEED MSG
  991.         CALL  STRNGC
  992. ;
  993.         CALL  INPUT          ;GET KEYBOARD CHAR.
  994.         ANI   5FH            ;CHANGE TO UPPER CASE IF NEEDED
  995.         CPI   'Y'            ;FINISHED IF 'RET'
  996.         JNZ   PRHC6
  997.         STA   FRMFD
  998. ;...
  999. ;
  1000. ;
  1001. ;    ASK FOR CURRENT HEADING/DATE
  1002. ;
  1003. PRHC6:  LXI   H,MSG3         ;TURN UP A NEW LINE
  1004.     CALL  STRNGC
  1005.     LXI   H,MSG1E         ;HEADING/DATE MESSAGE
  1006.     CALL  STRNGC
  1007.         MVI   B,0
  1008.         LXI   H,HEAD2
  1009. ;
  1010. PRHC7:  CALL  INPUT          ;GET KEYBOARD CHAR.
  1011.         CPI   CR             ;FINISHED IF 'RET'
  1012.         JZ    PRHC9
  1013.         CPI   BS
  1014.         JNZ   PRHC8
  1015.         CALL  BCKSP
  1016.         JMP   PRHC7
  1017. ;
  1018. PRHC8:  MOV   M,A
  1019.         INX   H
  1020.         INR   B
  1021.         MOV   A,B
  1022.         CPI   124+1          ;ROOM FOR 124 CHARS. IN BUFFER
  1023.         JC    PRHC7
  1024.         CALL  BCKSP2
  1025.         CALL  BCKSP1         ;DO NOT ALLOW A TOO-LONG LINE
  1026.         JMP   PRHC7
  1027. ;
  1028. ;
  1029. ;    ASK FOR STARTING PAGE
  1030. ;
  1031. PRHC9:  LXI   H,MSG3         ;TURN UP A NEW LINE
  1032.         CALL  STRNGC
  1033.         LXI   H,MSG1F
  1034.         CALL  STRNGC
  1035.         MVI   B,0
  1036.         LXI   H,PAGES+2      ;STARTING PAGE STORAGE
  1037. ;
  1038. PRHC10: CALL  INPUT
  1039.         CPI   CR
  1040.         JZ    PRHC12
  1041.         CPI   BS
  1042.         JNZ   PRHC11
  1043.         CALL  BCKSP
  1044.         JMP   PRHC10
  1045. ;
  1046. PRHC11: MOV   M,A
  1047.         INX   H
  1048.         INR   B
  1049.         MOV   A,B
  1050.         CPI   3+1            ;THREE MAXIMUM PAGE NUMBERS
  1051.         JC    PRHC10
  1052.         CALL  BCKSP2
  1053.         CALL  BCKSP1         ;DO NOT ALLOW A TOO-LONG LINE
  1054.         JMP   PRHC10
  1055. ;
  1056. ;
  1057. ;    ASK FOR STOPPING PAGE
  1058. ;
  1059. PRHC12: LXI   H,MSG3         ;TURN UP A NEW LINE
  1060.         CALL  STRNGC
  1061.         LXI   H,MSG1G
  1062.         CALL  STRNGC
  1063.         MVI   B,0
  1064.         LXI   H,PAGEQ+2      ;QUITTING PAGE STORAGE
  1065. ;
  1066. PRHC13: CALL  INPUT
  1067.         CPI   CR
  1068.         JZ    PRHC15
  1069.         CPI   BS
  1070.         JNZ   PRHC14
  1071.         CALL  BCKSP
  1072.         JMP   PRHC13
  1073. ;
  1074. PRHC14: MOV   M,A
  1075.         INX   H
  1076.         INR   B
  1077.         MOV   A,B
  1078.         CPI   3+1            ;THREE MAXIMUM PAGE NUMBERS
  1079.         JC    PRHC13
  1080.         CALL  BCKSP2
  1081.         CALL  BCKSP1         ;DO NOT ALLOW A TOO-LONG LINE
  1082.         JMP   PRHC13
  1083. ;       
  1084. PRHC15: LXI   H,MSG3         ;TURN UP A NEW LINE
  1085.         CALL  STRNGC
  1086.         RET
  1087. ;.....
  1088. ;
  1089. ; show form & printer parameters - changes necessary ?
  1090. ;
  1091. shpcol:    lxi    h,msgpc        ;point to message
  1092.     call    strngc        ; and display it
  1093. ;
  1094.     lda    lspc        ;get spacing data
  1095.     mov    e,a        ; and store in E
  1096.     lxi    h,msgpc1+32    ;point to destination
  1097.     call    biasc        ; convert and fill
  1098.     lxi    h,msgpc1    ;  point to spacing message
  1099.     call    strngc        ; and show it
  1100. ;
  1101.     lda    chwd        ;get print density
  1102.     mov    e,a        ; and save in E
  1103.     lxi    h,msgpc2+32    ;point to destination
  1104.     call    biasc        ; convert and fill
  1105.     lxi    h,msgpc2    ;  point to density message
  1106.     call    strngc        ; and show it
  1107. ;
  1108. askch:    lxi    h,msgpc5    ;changes necessary?
  1109.     call    strngc        ; print it
  1110.     call    input        ;  and get answer
  1111.     ani    5fh        ;   make ucase
  1112.     cpi    'Y'
  1113.     jz    chang        ;changes needed 
  1114.     cpi    'N'        ; no changes, bail out
  1115.     jz    stdcfg        ;  and set standard printer parms
  1116.     cpi    'D'        ;changes done?
  1117.     rz            ; yes, bail out!
  1118.     jmp    askch        ;wait for valid input
  1119. ;
  1120. stdcfg:    mvi    a,1        ;get a "1"
  1121.     sta    stdflg        ; and set the flag
  1122.     call    lspac8        ;set 6 lines/in.
  1123.     call    cwid17        ; and 10 cpi
  1124.     call    tof        ;  and top-of-form
  1125.     xra    a        ;   then
  1126.     sta    stdflg        ;  clear the flag
  1127.     ret
  1128. ;
  1129. mdone:    call    stroki        ;send a string to the oki
  1130.     lda    stdflg
  1131.     ora    a        ; see if zero
  1132.     jz    shpcol        ;  if yes, then maybe done
  1133.     call    tof        ;if not, set top-of-form
  1134.     ret            ; and bail out
  1135. ;
  1136. ; set the top-of-form on the okidata u84
  1137. ;
  1138. tof:    lxi    h,tofmsg    ;point to the tof message
  1139.     call    stroki        ; and tell the printer
  1140.     ret
  1141. ;
  1142. chang:    lxi    h,msgpc6    ;ask for changes
  1143.     call    strngc
  1144.     call    input        ; get change number
  1145.     cpi    '1'        ;line spacing change
  1146.     jz    lspac
  1147.     cpi    '2'        ;chars. per inch
  1148.     jz    cwid
  1149.     jmp    chang        ;wait for valid input
  1150. ;
  1151. ;.....
  1152. ;
  1153. ; Set up line spacing parameter for Microline 84
  1154. ;
  1155. lspac:    lxi    h,lsmsg        ;ask for lpi
  1156.     call    strngc
  1157.     call    input        ;get answer
  1158.     cpi    '6'
  1159.     jz    lspac6        ;set 6 lpi
  1160.     cpi    '8'
  1161.     jz    lspac8        ;set 8 lpi
  1162.     jmp    lspac        ;wait for good value
  1163. ;
  1164. lspac6:    mvi    a,6        ;get a 6
  1165.     sta    lspc        ; store new variable
  1166.     mvi    a,54        ;lines of text/page
  1167.     sta    text        ; for 6lpi
  1168.     lxi    h,lsmsg6    ;point to message string
  1169.     jmp    mdone        ; and send to printer
  1170. ;
  1171. lspac8:    mvi    a,8        ;get an 8
  1172.     sta    lspc        ; store new variable
  1173.     mvi    a,76        ;lines of text/page
  1174.     sta    text        ; for 8 lpi
  1175.     lxi    h,lsmsg8    ;point to message string
  1176.     jmp    mdone        ; and send to printer
  1177. ;
  1178. ;.....
  1179. ;
  1180. ; set up print density (chars/inch) for Microline 84
  1181. ;
  1182. cwid:    lxi    h,cwmsg        ;ask for cwid
  1183.     call    strngc
  1184.     call    input        ;get value
  1185.     cpi    '1'
  1186.     jz    cwid10
  1187.     cpi    '2'
  1188.     jz    cwid12
  1189.     cpi    '3'
  1190.     jz    cwid17
  1191.     jmp    cwid
  1192. ;
  1193. cwid10:    mvi    a,50        ;pg# loc. for 10 cpi
  1194.     sta    pagcol        ; store it
  1195.     mvi    a,10
  1196.     sta    chwd
  1197.     lxi    h,cwmsg10    ;point to message string
  1198.     jmp    mdone        ;  and sent to printer
  1199. ;
  1200. cwid12:    mvi    a,56        ;pg# loc. for 12 cpi
  1201.     sta    pagcol        ; and store it
  1202.     mvi    a,12
  1203.     sta    chwd
  1204.     lxi    h,cwmsg12    ;point to message string
  1205.     jmp    mdone        ;  and send to printer
  1206. ;
  1207. cwid17:    mvi    a,85        ;pg# loc. for 17 cpi
  1208.     sta    pagcol        ; and store it
  1209.     mvi    a,17
  1210.     sta    chwd
  1211.     lxi    h,cwmsg17    ;point to message string
  1212.     jmp    mdone        ;  and send to printer
  1213. ;
  1214. ;.....
  1215. ;
  1216. ; binary to ascii conversion routine accepts binary
  1217. ; data in register E with HL pointing to the destination
  1218. ; of the 2 ascii bytes.
  1219. ;
  1220. biasc:    push psw! push b    ;save registers
  1221.     lxi    b,0        ; and clear BC
  1222.     mov    a,e        ;recall data byte
  1223.     mvi    c,10        ;  value to subtract
  1224. bitod:    sub    c        ;sub 10 from bin value
  1225.     inr    b        ; and tell tens accumulator
  1226.     jnc    bitod        ;  continue till A exhausted
  1227.     add    c        ;   too much, add once to C
  1228.     dcr    b        ;    and reduce count in B
  1229.     adi    '0'        ;now, make units value ascii
  1230.     mov    c,a        ; and store it in C
  1231.     mov    a,b        ;get the tens data
  1232.     adi    '0'        ; and make it ascii
  1233.     mov    m,a        ;  store it in table area
  1234.     inx    h        ;increment table pointer
  1235.     mov    m,c        ;get the units data to table area
  1236.     pop b! pop psw
  1237.     ret
  1238. ;
  1239. ;.....
  1240. ;
  1241. ; Electralogics Real Time Clock Routines
  1242. ;
  1243. ;
  1244. BLK    EQU 40H
  1245. BLKSEL    EQU 48H
  1246. ;
  1247. ;
  1248. TIME:    JMP RDCLK
  1249. ;
  1250. TEXIT:    RET
  1251. ;.....
  1252. ;
  1253. ; CONVERT CHAR IN A TO HEX AND DISPLAY
  1254. ; ------------------------------------
  1255. DYHEX:    PUSH PSW ! RAR ! RAR ! RAR ! RAR
  1256.     CALL DYNIB ! POP PSW
  1257. DYNIB:    ANI 0FH ! ADI 30H ! CPI 3AH ! JC DY
  1258.     ADI 7
  1259. ;.....
  1260. ;
  1261. ; place time character into header
  1262. ; ----------------------
  1263. DY:    PUSH H
  1264.     LHLD DATCOL ! MOV M,A
  1265.     INX H ! SHLD DATCOL 
  1266.     POP H 
  1267.     RET
  1268. ;
  1269. SPACE:    MVI B,1
  1270. SPACES:    MVI A,20H ! CALL DY
  1271.     DCR B ! JNZ SPACES
  1272.     RET
  1273. ;
  1274. ;
  1275. CLKFLD:        ;Set from clock  (Packed BCD format)
  1276.     DB 0    ;Day of week
  1277.     DB 0    ;Day of month
  1278.     DB 0    ;Month
  1279.     DB 83H    ;Year
  1280.     DB 0    ;Hour
  1281.     DB 0    ;Minutes
  1282.     DB 0    ;Seconds
  1283. ;
  1284. ;
  1285. DAYLST:
  1286.     DB 'SUNMONTUEWEDTHUFRISAT'
  1287. MONTHLST:
  1288.     DB 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'
  1289. ;
  1290. ;
  1291. ;
  1292. RDCLK:    MVI A,0CH ! OUT BLKSEL        ;Select counters
  1293.     LXI H,CLKFLD
  1294.     IN BLK+5 ! MOV M,A ! INX H    ;Read day of week
  1295.     IN BLK+6 ! MOV M,A ! INX H    ;  day of month
  1296.     IN BLK+7 ! MOV M,A ! INX H    ;  month
  1297.     INX H                ;  bypass year
  1298.     IN BLK+4 ! MOV M,A ! INX H    ;  hour
  1299.     IN BLK+3 ! MOV M,A ! INX H    ;  minutes
  1300.     IN BLK+2 ! MOV M,A        ;  seconds
  1301.     MVI A,0EH ! OUT BLKSEL        ;Select clock status block
  1302.     IN BLK+4 ! ANI 1 ! JNZ RDCLK    ;Retry if time not valid
  1303.     IN BLK+0            ;Reset interrupt
  1304. ;
  1305.     LXI D,CLKFLD
  1306.     LXI H,DAYLST
  1307.     LDAX D ! INX D ! CALL DYTX    ;Day of week
  1308.     CALL SPACE
  1309.     LDAX D ! INX D ! CALL DYHEX    ;Day
  1310.     CALL SPACE
  1311.     LXI H,MONTHLST            ;Month
  1312.     LDAX D ! INX D ! CALL DYTX
  1313.     CALL SPACE
  1314.     LDAX D  ! INX D ! CALL DYHEX    ;Year
  1315.     MVI B,2 ! CALL SPACES
  1316.     LDAX D  ! INX D ! CALL DYHEX    ;Hour
  1317.     MVI A,':' ! CALL DY
  1318.     LDAX D ! INX D ! CALL DYHEX    ;Minutes
  1319.     MVI A,':' ! CALL DY
  1320.     LDAX D ! CALL DYHEX        ;Seconds
  1321.     JMP TEXIT
  1322. ;.....
  1323. ;
  1324. ; DISPLAY TABLE ENTRY
  1325. ; Accepts: HL = ptr to table, A = BCD index into table
  1326. ;
  1327. DYTX:
  1328.     CPI 10H ! JC DYTX1    ;Convert index to binary
  1329.     ANI 0FH ! ADI 10
  1330. DYTX1:    MOV C,A ! DCR C ! XRA A
  1331.     ADD C ! ADD C ! ADD C
  1332.     MOV C,A ! MVI B,0 ! DAD B
  1333.     MOV A,M ! INX H ! CALL DY
  1334.     MOV A,M ! INX H ! CALL DY
  1335.     MOV A,M ! JMP DY
  1336. ;.....
  1337. ;
  1338. ;
  1339. ; ROLL UP PAGE TO TERMINATE
  1340. ;
  1341. ROLL:   LDA   START          ;HAVE WE STARTED PRINTING AT ALL?
  1342.         ORA   A
  1343.         JZ    NOPNT          ;IF NOT, TELL WHAT MAXIMUM PAGE WAS
  1344.         MVI   A,CR
  1345.         CALL  WRITEP         ;SEND
  1346. ;
  1347. ROLL1:  LDA   LCNT
  1348.         INR   A
  1349.         STA   LCNT
  1350.         push  h
  1351.     lxi   h,text
  1352.     cmp   m
  1353.     pop   h
  1354.         JNC   ROLL2 
  1355.         MVI   A,LF
  1356.         CALL  WRITEP         ;SEND
  1357.         JMP   ROLL1          ;GO DO ANOTHER UNTIL DONE
  1358. ;
  1359. ROLL2:  CALL  TTABS          ;CHECK FOR TEAR TABS
  1360.     LDA   NOTAB          ;USING FANFOLD PAPER?
  1361.     ORA   A
  1362.     JZ    EXIT           ;IF YES, LEAVE IN NORMAL POSITION
  1363.         LXI   H,QUIT         ;FINAL LINES TO FINISH PAGE
  1364.         CALL  STRNGP
  1365.         JMP   EXIT           ;DONE
  1366. ;.....
  1367. ;
  1368. ;
  1369. ; OPTION FOR ROLL PAPER (CHANGES FANFOLD AREAS)
  1370. ;
  1371. RPAPER: LXI   H,MSG1B        ;ASK IF USING ROLL PAPER
  1372.         CALL  STRNGC
  1373.         CALL  INPUT
  1374.         ANI   5FH            ;CHANGE TO UPPER CASE IF NEEDED
  1375.         CPI   'Y'                  
  1376.         JNZ   RPAP1          ;IF NOT, EXIT
  1377. ;
  1378.         INR   A              ;INCREMENT TO '1'
  1379.         STA   NOTAB         ;SHOW WE WANT TEAR TABS
  1380. ;
  1381. RPAP1:  LXI   H,MSG3 
  1382.         CALL  STRNGC
  1383.         RET
  1384. ;.....
  1385. ;
  1386. ;
  1387. ; IGNORE CR, LF, FFD OR EOF AT TOP OF ANY NEW PAGE
  1388. ;
  1389. SKIP:   CALL  GETCH          ;GET INPUT CHAR.
  1390.         CPI   CR
  1391.         JZ    SKIP           ;IF YES, SKIP
  1392.         CPI   LF
  1393.         JZ    SKIP           ;IF YES, SKIP
  1394.         CPI   EOF
  1395.         JZ    ROLL           ;IF YES, TERMINATE
  1396.         CPI   FFD
  1397.         JZ    SKIP           ;IF YES, IGNORE
  1398.         RET
  1399. ;.....
  1400. ;
  1401. ;
  1402. ; TRANSFER A STRING OF CHARS. FROM ONE AREA TO ANOTHER
  1403. ;
  1404. STORE:  MOV   A,M
  1405.         STAX  D
  1406.         INX   H
  1407.         INX   D
  1408.         DCR   C
  1409.         JNZ   STORE
  1410.         RET
  1411. ;.....
  1412. ;
  1413. ;
  1414. ; PRINT AND DISPLAY A STRING OF CHARACTERS
  1415. ;
  1416. STRNGB: MOV   A,M
  1417.         ORA   A
  1418.         RZ                   ;DONE IF ZERO
  1419.         CALL  WRITE2         ;DISPLAY AND PRINT CHAR.
  1420.         INX   H              ;NEXT LOCATION
  1421.         JMP   STRNGB         ;DO THE NEXT ONE
  1422. ;.....
  1423. ;
  1424. ;
  1425. ; WRITE ASCII STRING TO CRT ONLY
  1426. ;
  1427. STRNGC: MOV   A,M
  1428.         ORA   A
  1429.         RZ
  1430.         CALL  WRITCC         ;DISPLAY ONLY
  1431.         INX   H
  1432.         JMP   STRNGC         ;DO NEXT CHAR.
  1433. ;.....
  1434. ;
  1435. ;
  1436. ; PRINT A STRING OF CHARACTERS
  1437. ;
  1438. STRNGP: MOV   A,M            ;GET THE CHAR.
  1439.         ORA   A
  1440.         RZ                   ;DONE IF ZERO
  1441.         CALL  WRITEP         ;PRINT CHAR.
  1442.         INX   H
  1443.         JMP   STRNGP         ;DO THE NEXT ONE
  1444. ;
  1445. ;.....
  1446. ;
  1447. ; print a string of characters to OKI u84
  1448. ;
  1449. stroki:    mov    a,m        ;get the character
  1450.     ora    a
  1451.     rz            ;done bail out
  1452.     mov    e,a        ;put character in E reg.
  1453.     call    writpr        ;print the character
  1454.     inx    h
  1455.     jmp    stroki        ;loop till done
  1456. ;.....
  1457. ;
  1458. ;
  1459. ; ADDS TEAR TABS FOR ROLL PAPER
  1460. ;
  1461. TTABS:  LDA   NOTAB         ;WANT TEAR TABS?
  1462.     ORA   A
  1463.     JZ    NUPAGE         ;IF NOT EXIT. SEND LINE FEEDS
  1464.         LXI   H,QUITR
  1465.         CALL  STRNGB         ;SEND LF TO FINISH THE PAGE
  1466.         MVI   A,'-'
  1467.         CALL  WRITE3
  1468.         LDA   TTABN          ;GET NUMBER OF SPACES BETWEEN TABS
  1469.         MOV   B,A
  1470. ;
  1471. TTABS1: MVI   A,' '
  1472.         CALL  WRITE3
  1473.         DCR   B
  1474.         JNZ   TTABS1
  1475. ;
  1476.         MVI   A,'-'
  1477.         CALL  WRITE2
  1478.         LXI   H,QUITR
  1479.         CALL  STRNGB
  1480.         XRA   A
  1481.         STA   COLMN          ;RESET THE COLUMN COUNTER
  1482.         RET
  1483. ;.....  
  1484. ;
  1485. ;
  1486. ; WRITE CHAR. TO CRT
  1487. ;
  1488. WRITE2: CPI   SI             ;SYNCH CHAR.?
  1489.         RZ                   ;IF YES, IGNORE
  1490.         CPI   CR
  1491.         JZ    WRITE3         ;DO NOT COUNT
  1492.         CPI   LF
  1493.         JZ    WRITE3         ;DO NOT COUNT
  1494.         PUSH  PSW            ;SAVE THE CHAR. VALUE
  1495.         LDA   COLMN          ;INCREMENT THE COLUMN COUNT
  1496.         INR   A
  1497.         STA   COLMN
  1498.         POP   PSW            ;RESTORE THE CHAR. VALUE
  1499. ;       
  1500. ;
  1501. WRITE3: CALL  WRITEC
  1502. ;
  1503. ;
  1504. ; WRITE CHAR. TO PRINTER
  1505. ;
  1506. WRITE1: CALL  WRITEP
  1507.         RET
  1508. ;.....
  1509. ;
  1510. ;
  1511. ; WRITE ASCII CHARACTER TO CRT
  1512. ;
  1513. WRITEC: MOV   E,A            ;STORE THE CHAR. TEMP.
  1514.         LDA   START          ;READY TO DISPLAY YET?
  1515.         ORA   A
  1516.         MOV   A,E            ;RESTORE THE CHAR.
  1517.         RZ
  1518. ;
  1519. WRITCC: PUSH  H
  1520.         PUSH  D
  1521.         PUSH  B
  1522.         PUSH  PSW
  1523.         MOV   E,A
  1524.         MVI   C,CONOUT       ;WRITE TO THE CRT CONSOLE
  1525.         CALL  BDOS
  1526.         POP   PSW
  1527.         POP   B
  1528.         POP   D
  1529.         POP   H
  1530.         RET
  1531. ;.....
  1532. ;
  1533. ;
  1534. ; WRITE ASCII CHARACTER TO PRINTER
  1535. ;
  1536. WRITEP: CPI   SI             ;SYNCH CHAR.?
  1537.         RZ                   ;IF YES, IGNORE
  1538.         MOV   E,A            ;PUT CHAR. IN 'E' REG.
  1539.         LDA   START          ;READY TO START YET?
  1540.         ORA   A
  1541.         RZ                   ;EXIT IF NOT READY YET
  1542. ;
  1543. writpr:    PUSH  H
  1544.         PUSH  B
  1545.         MVI   C,LIST         ;WRITE TO THE PRINTER
  1546.         CALL  BDOS
  1547.         POP   B
  1548.         POP   H
  1549.         RET
  1550. ;
  1551. ;.....
  1552. ;
  1553. ;
  1554.     DS    40                ;MIMIMUM STACK DEPTH
  1555. STACK:    DS    0
  1556. ;
  1557. BUFF    equ    ($+127)/128*128    ;GET ON AN EVEN PAGE
  1558. ;
  1559. ;
  1560.     ORG    BUFF
  1561. ;
  1562. BUFFER  EQU   $
  1563. ;.....
  1564. ;
  1565. ;
  1566.         END   START
  1567.