home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PROGRAMS / LIST / PSET16A.LBR / PSET16A.AQM / PSET16A.ASM
Assembly Source File  |  2000-06-30  |  38KB  |  1,122 lines

  1. ;
  2. ;       PSET16.ASM - 7 July 1986
  3. ;
  4. ;    Version 1.6a - 17 Jul 86 - I found a bug in the code that could
  5. ;    have caused a problem on exit of the program.  This revision
  6. ;    fixes that bug.  Also fixed minor bug in form length setting
  7. ;    code. - Barron McIntire
  8. ;
  9. ;    Version 1.6 - 7 Jul 86 - I have added an equate for the Citizen
  10. ;    MSP-20.  I have also changed the menu to display
  11. ;    only when the program is first called up.  A '?' option has 
  12. ;    been added to re-display the menu.  Also added a command line
  13. ;    parsing routine.  This allows you to skip the interactive mode
  14. ;    completely.  Thus, entering PSET (assuming that you have renamed
  15. ;    this to PSET.COM) will enter interactive mode, but entering
  16. ;    PSET A V 32 B will initialize the printer, set the left margin at
  17. ;    column 32, set elite mode on, and then return to DOS.  Spaces
  18. ;    may be inserted for readability, but are not necessary between 
  19. ;    commands, as the program ignores them.  Spaces ARE required,
  20. ;    however, to end decimal numbers.  Thus, PSET V32 B is valid,
  21. ;    but PSET V32B is not.  PSET V 3 2 B will set the left margin at
  22. ;    column 3, set proportional printing off (for MSP-20), and then
  23. ;    set elite mode on.  The point is, be careful of spaces following
  24. ;    numbers.  An erroneous character in the command line will cause 
  25. ;    PSET to generate an error message and stop processing at the point 
  26. ;    where it found the error.  All previous commands will be 
  27. ;    acted upon. - Barron McIntire
  28. ;
  29. ;    Version 1.5 - 25 Aug 85 - I finally received the complete user
  30. ;    guide for my citizen printer and found that it had a 160 column
  31. ;    compressed elite mode.  This version adds this under the citizen
  32. ;    equate. - Barron McIntire
  33. ;
  34. ;    Version 1.4 - 28 Jul 85 - I have added an equate for the Gemini
  35. ;    printers, as it appears that they are not totally Epson compatible.
  36. ;    insure that both Citizen and Gemini equates are not both set at
  37. ;    the same time. - Barron McIntire
  38. ;
  39. ;    Version 1.3 - 1 Mar 85 - I traded my Epson RX-80 in on a Citizen
  40. ;    MSP-10, and found that it did not release the last line when the
  41. ;    off-line switch was pressed.  I have therefore added an option to
  42. ;    generate a cr,lf.  this replaces the one-line enlarged mode which
  43. ;    didn't work anyway.  I have also added an equate for the Citizen
  44. ;    printer which will add the correspondence quality mode.  Setting
  45. ;    this to false will keep the Epson compatibility. - Barron McIntire
  46. ;
  47. ;       Version 1.2 - 6 Jan 85 - I have added the superscript and subscript
  48. ;       modes, as they can create some very fine printing when permanently
  49. ;       set, if somewhat slow.  (Try condensed mode, superscript mode, and
  50. ;    5/72 inch line spacing.)  - Barron McIntire
  51. ;
  52. ;       Version 1.1 - 12/9/84 - This is one of the nicest and most generic
  53. ;       epson menus.  My only contribution was to add the appropriate mask
  54. ;       byte wherever required to allow selection via lower case as well
  55. ;       upper case letters.  It seems to run fine on a kaypro 4-84 under
  56. ;       ZCPR3 with a Mannesmann-Talley Spirit 80 printer.  - Bruce Morgen
  57. ;
  58. ;---------------------------------------------------------------------------
  59. ;
  60. ;    Version 1.0 - 5 November 1983
  61. ;
  62. ;       This program will allow the operator to pre-set certain printer
  63. ;       states.  The printer will remain in these states until the printer
  64. ;       power is recycled, or the printer is directed into another state
  65. ;       by program control.
  66. ;
  67. ;       This program was originally written in Mbasic, and translated into
  68. ;       asm code for speed and ease of use.
  69. ;
  70. ;       This program was written for the Epson RX-80 and Heath CP/M 2.2.03.
  71. ;       It has since been found to work with Heath CP/M 2.2.04 and Kaypro
  72. ;       CP/M 2.2xx, and should work with any Epson compatible printer.
  73. ;
  74. ;       Written by:  Barron F. McIntire III
  75. ;                    3400 S. Greeley Hwy #8
  76. ;                    Cheyenne, Wyoming  82007
  77. ;                    R.A.S. Phone 307-635-8366, 300/1200 baud, 24 hours
  78. ;             Compuserve ID 74155,441            
  79. ;
  80. ;       define cp/m routines
  81. ;
  82. boot    equ     0               ;bottom of memory
  83. bdos    equ     boot+5          ;jump to cp/m bdos
  84. tpa     equ     boot+100h       ;transient program area
  85. conin   equ     1               ;console input function
  86. conout  equ     2               ;console output function
  87. lstout  equ     5               ;printer output function
  88. linout  equ     9               ;text output function
  89. ;
  90. ;       misc equates
  91. ;
  92. no    equ    0        ;for conditional assembly
  93. yes    equ    not no        ;(=0ffffh usually, not 0ffh)
  94. ver    equ    '1'
  95. modlev    equ    '6'
  96. cr      equ     13
  97. lf      equ     10
  98. bel     equ     7
  99. esc     equ     27
  100. clptr    equ    81h        ;pointer to current command line position
  101. clscr    equ    yes        ;yes if you wish screen clear at start
  102.                 ;patch your clear screen data at clr below
  103. ;
  104. ;            +++++ IMPORTANT NOTE +++++
  105. ;
  106. ;    printer equates - insure that no more than one of these equates
  107. ;    is true, as unpredictable results may occur
  108. ;
  109. epson    equ    no        ;yes for Epson printers
  110. gemini    equ    no        ;yes for Gemini printers
  111. msp10    equ    no        ;yes for Citizen MSP-10 printers
  112. msp20    equ    yes        ;yes for Citizen MSP-20 printers
  113. ;
  114.         org     tpa
  115. ;
  116. ;       set up stack
  117. ;
  118. start
  119.     lxi     h,0             ;zero hl reg
  120.         dad     sp              ;set hl to stack pointer
  121.         lxi     sp,stack        ;set our stack pointer
  122.         push    h               ;save cp/m's stack pointer on ours
  123. ;
  124. ;    parse command line
  125. ;
  126.     lxi    h,80h        ;set hl to cpm command line buffer
  127.     mov    a,m        ;get char count in a reg
  128.     cpi    0        ;is char count 0?
  129.     jz    openms        ;no command line - go run pset with menu
  130.     inr    a        ;add one to a (parse starts by sub one)
  131.     sta    ccount        ;save character count +1
  132.     shld    cladr        ;save hl register
  133.     mvi    a,1
  134.     sta    clflg        ;store 1 in command line flag
  135.     call    clprs        ;go parse command line
  136.     jmp    cpopt        ;skip option input, we already have it
  137. ;
  138. openms
  139.     mvi    a,0
  140.     sta    clflg        ;store 0 in command line flag
  141. ;
  142. ;       display opening message
  143. ;
  144.      if    clscr        ;clear screen
  145.     lxi    d,clr        ;point to clear screen data
  146.     mvi    c,linout    ;get linout function
  147.     call    bdos        ;clear the screen
  148.      endif    
  149. ;
  150.         lxi     d,messg         ;point to opening message
  151.         mvi     c,linout        ;get linout function
  152.         call    bdos            ;print the message
  153. ;
  154. ;       display menu
  155. ;
  156. mnudis
  157.     lxi    d,mnumes    ;point to menu message
  158.     mvi    c,linout    ;get linout function
  159.     call    bdos        ;print the message
  160. ;
  161. ;    ask for option
  162. ;
  163. optdis
  164.     lxi     d,optmes        ;point to options message
  165.         mvi     c,linout        ;get linout function
  166.         call    bdos            ;print the message
  167. ;
  168. ;       input option
  169. ;
  170. optin
  171.     mvi    c,conin        ;get menu option
  172.     call    bdos        ;get character
  173.     cpi    'a'        ;less than 'a'?
  174.     jc    cont2        ;don't mask if not lower case
  175.     cpi    'z'        ;greater then 'z'?
  176.     jnc    cont2        ;skip mask
  177.     ani    5fh        ;mask to upper case (b.m. - 12/84)
  178. cont2
  179.     push    psw        ;save a reg
  180.     mvi    c,conout    ;get conout function
  181.     mvi    e,cr        ;get cr char
  182.     call    bdos        ;send it
  183.     mvi    c,conout    ;get conout function
  184.     mvi    e,lf        ;get lf char
  185.     call    bdos        ;send it
  186.     pop    psw        ;get a reg back
  187. ;
  188. ;       compare option
  189. ;
  190. cpopt
  191.     push    psw        ;save input
  192.     lda    clflg        ;get command line flag
  193.     cpi    0        ;is it zero?
  194.     jz    cpopt1        ;press on if so
  195.     pop    psw        ;get original character back
  196.     cpi    20h        ;space?
  197.     jnz    cpopt2        ;no, go process it
  198.     call    clprs        ;else, get another character
  199.     jmp    cpopt        ;go again    
  200. cpopt1
  201.     pop    psw        ;get original character back
  202. cpopt2
  203.     cpi    '?'
  204.     jz    mnudis
  205.     cpi    '#'
  206.     jz    exit
  207.         cpi     'A'
  208.         jz      opt1
  209.         cpi     'B'
  210.         jz      opt2
  211.         cpi     'C'
  212.         jz      opt3
  213.         cpi     'D'
  214.         jz      opt4
  215.         cpi     'E'
  216.         jz      opt5
  217.         cpi     'F'
  218.         jz      opt6
  219.         cpi     'G'
  220.         jz      opt7
  221.         cpi     'H'
  222.         jz      opt8
  223.         cpi     'I'
  224.         jz      opt9
  225.         cpi     'J'
  226.         jz      opt10
  227.         cpi     'K'
  228.         jz      opt11
  229.         cpi     'L'
  230.         jz      opt12
  231.         cpi     'M'
  232.         jz      opt13
  233.         cpi     'N'
  234.         jz      opt14
  235.         cpi     'O'
  236.         jz      opt15
  237.         cpi     'P'
  238.         jz      opt16
  239.         cpi     'Q'
  240.         jz      opt17
  241.         cpi     'R'
  242.         jz      opt18
  243.         cpi     'S'
  244.         jz      opt19
  245.         cpi     'T'
  246.         jz      opt20
  247.         cpi     'U'
  248.         jz      opt21
  249.         cpi     'V'
  250.         jz      opt22
  251.         cpi     'W'
  252.         jz      opt23
  253.         cpi     'X'
  254.         jz      opt24
  255. ;
  256.      if    msp10 or msp20
  257.     cpi    'Y'
  258.     jz    opt25
  259.     cpi    'Z'
  260.     jz    opt26
  261.      endif
  262.      if    msp20
  263.     cpi    '0'
  264.     jz    opt27
  265.     cpi    '1'
  266.     jz    opt28
  267.     cpi    '2'
  268.     jz    opt29
  269.     cpi    '3'
  270.     jz    opt30
  271.      endif
  272. ;
  273. ;       error if no compare
  274. ;
  275. erdis
  276.     lda    clflg        ;get command line flag
  277.     cpi    0        ;is it zero?
  278.     jz    erdis2        ;then run normal error message
  279.     lxi    d,emessx    ;else get command line error message
  280.     mvi    c,linout    ;get linout function
  281.     call    bdos        ;send to user
  282.     jmp    exit        ;exit to DOS
  283. erdis2
  284.     lxi     d,emess         ;point to error message
  285.         mvi     c,linout        ;get linout function
  286.         call    bdos            ;ask if exit is desired
  287.         mvi     c,conin         ;get conin function
  288.         call    bdos            ;get the character
  289.         ani     5fh             ;mask to upper case (b.m. - 12/84)
  290.         push    psw             ;save a reg
  291.         mvi     c,conout        ;get conout function
  292.         mvi     e,cr            ;get carriage return char
  293.         call    bdos            ;output to crt
  294.         mvi     c,conout        ;get conout function
  295.         mvi     e,lf            ;get line feed
  296.         call    bdos            ;output to crt
  297.         pop     psw             ;get a reg
  298.         cpi     'Y'             ;is it yes?
  299.         jz      exit            ;then exit to cp/m
  300.         jmp     optdis          ;otherwise re-display options
  301. ;
  302. ;       printer initialization
  303. ;
  304. opt1
  305.     call    escap           ;send escape character to printer
  306.         mvi     c,lstout        ;get lstout function
  307.         mvi     e,'@'           ;get printer reset char
  308.         call    bdos            ;send to printer
  309.         jmp     more            ;another option?
  310. ;
  311. ;       elite-sized character setting
  312. ;
  313. opt2
  314.     call    escap           ;send escape character to printer
  315.      if    gemini
  316.     mvi    c,lstout    ;get lstout function
  317.     mvi    e,'B'        ;get elite first char
  318.     call    bdos        ;send to printer
  319.     mvi    c,lstout    ;get lstout char
  320.     mvi    e,2        ;get lstout second char
  321.     call    bdos        ;send to printer
  322.      endif
  323.      if    not gemini
  324.         mvi     c,lstout        ;get lstout function
  325.         mvi     e,'M'           ;get elite char
  326.         call    bdos            ;send to printer
  327.      endif
  328.         jmp     more            ;another option?
  329. ;
  330. ;       pica-sized character setting
  331. ;
  332. opt3
  333.     call    escap           ;send escape character to printer
  334.      if    gemini
  335.     mvi    c,lstout    ;get lstout function
  336.     mvi    e,'B'        ;get pica first char
  337.     call    bdos        ;send to printer
  338.     mvi    c,lstout    ;get lstout function
  339.     mvi    e,1        ;get pica second char
  340.     call    bdos        ;send to printer
  341.      endif
  342.      if    not gemini
  343.         mvi     c,lstout        ;get lstout function
  344.         mvi     e,'P'           ;get pica char
  345.         call    bdos            ;send to printer
  346.      endif
  347.         jmp     more            ;another option?
  348. ;
  349. ;       enlarged mode
  350. ;
  351. opt4
  352.     call    escap           ;send escape character to printer
  353.         mvi     c,lstout        ;get lstout function
  354.         mvi     e,'W'           ;get enlarged mode first char
  355.         call    bdos            ;send to printer
  356.         mvi     c,lstout        ;get lstout function
  357.         mvi     e,1             ;get enlarged mode second char
  358.         call    bdos            ;send to printer
  359.         jmp     more            ;another option?
  360. ;
  361. ;       send cr,lf to printer
  362. ;
  363. opt5
  364.     mvi     c,lstout        ;get lstout function
  365.         mvi     e,cr            ;get carriage return char
  366.         call    bdos            ;send to printer
  367.     mvi    c,lstout    ;get lstout function
  368.     mvi    e,lf        ;get line feed char
  369.     call    bdos        ;send to printer
  370.         jmp     more            ;another option?
  371. ;
  372. ;       condensed mode
  373. ;
  374. opt6
  375.     mvi     c,lstout        ;get lstout function
  376.         mvi     e,15            ;get condensed mode char
  377.         call    bdos            ;send to printer
  378.         jmp     more            ;another option?
  379. ;
  380. ;       emphasized and enlarged mode
  381. ;
  382. opt7
  383.     call    escap           ;send escape character to printer
  384.         mvi     c,lstout        ;get lstout function
  385.         mvi     e,'E'           ;get emphasized mode char
  386.         call    bdos            ;send to printer
  387.         mvi     c,lstout        ;get lstout function
  388.         mvi     e,esc           ;get escape character
  389.         call    bdos            ;send to printer
  390.         mvi     c,lstout        ;get lstout function
  391.         mvi     e,'W'           ;get enlarged mode first char
  392.         call    bdos            ;send to printer
  393.         mvi     c,lstout        ;get lstout function
  394.         mvi     e,1             ;get enlarged mode second char
  395.         call    bdos            ;send to printer
  396.         jmp     more            ;another option?
  397. ;
  398. ;       emphasized mode
  399. ;
  400. opt8
  401.     call    escap           ;send escape character to printer
  402.         mvi     c,lstout        ;get lstout function
  403.         mvi     e,'E'           ;get emphasized mode char
  404.         call    bdos            ;send to printer
  405.         jmp     more            ;another option?
  406. ;
  407. ;       double-strike mode
  408. ;
  409. opt9
  410.     call    escap           ;send escape character to printer
  411.         mvi     c,lstout        ;get lstout function
  412.         mvi     e,'G'           ;get double-strike mode char
  413.         call    bdos            ;send to printer
  414.         jmp     more            ;another option?
  415. ;
  416. ;       alternate character set (italics)
  417. ;
  418. opt10
  419.     call    escap           ;send escape character to printer
  420.         mvi     c,lstout        ;get lstout function
  421.         mvi     e,'4'           ;get alernate char set char
  422.         call    bdos            ;send to printer
  423.         jmp     more            ;another option?
  424. ;
  425. ;       underline mode
  426. ;
  427. opt11
  428.     call    escap           ;send escape character to printer
  429.         mvi     c,lstout        ;get lstout function
  430.         mvi     e,'-'           ;get underline mode first char
  431.         call    bdos            ;send to printer
  432.         mvi     c,lstout        ;get lstout function
  433.         mvi     e,1             ;get underline mode second char
  434.         call    bdos            ;send to printer
  435.         jmp     more            ;another option?
  436. ;
  437. ;       ignore paper end detector
  438. ;
  439. opt12
  440.     call    escap           ;send escape character to printer
  441.         mvi     c,lstout        ;get lstout function
  442.         mvi     e,'8'           ;get ignore paper end mode char
  443.         call    bdos            ;send to printer
  444.         jmp     more            ;another option?
  445. ;
  446. ;       unidirectional printing
  447. ;
  448. opt13
  449.     call    escap           ;send escape character to printer
  450.         mvi     c,lstout        ;get lstout function
  451.         mvi     e,'U'           ;get unidirectional printing first char
  452.         call    bdos            ;send to printer
  453.         mvi     c,lstout        ;get lstout function
  454.         mvi     e,1             ;get unidirectional printing second char
  455.         call    bdos            ;send to printer
  456.         jmp     more            ;another option?
  457. ;
  458. ;       7/72 inch line spacing
  459. ;
  460. opt14
  461.     call    escap           ;send escape character to printer
  462.         mvi     c,lstout        ;get lstout function
  463.         mvi     e,'1'           ;get 7/72 inch line spacing mode char
  464.         call    bdos            ;send to printer
  465.         jmp     more            ;another option?
  466. ;
  467. ;       1/16 inch line spacing
  468. ;
  469. opt15
  470.     call    escap           ;send escape character to printer
  471.         mvi     c,lstout        ;get lstout function
  472.         mvi     e,'2'           ;get 1/16 inch line spacing mode char
  473.         call    bdos            ;send to printer
  474.         jmp     more            ;another option?
  475. ;
  476. ;       1/8 inch line spacing
  477. ;
  478. opt16
  479.     call    escap           ;send escape character to printer
  480.         mvi     c,lstout        ;get lstout function
  481.         mvi     e,'0'           ;get 1/8 inch line spacing mode char
  482.         call    bdos            ;send to printer
  483.         jmp     more            ;another option?
  484. ;
  485. ;       n/72 inch line spacing
  486. ;
  487. opt17
  488.     lda    clflg        ;get command line flag
  489.     cpi    0        ;is it zero?
  490.     jz    o17a        ;press on if so
  491.     jmp    o17b        ;else skip asking for data
  492. o17a
  493.     lxi     d,mes17         ;point to message
  494.         mvi     c,linout        ;get linout function
  495.         call    bdos            ;print the message
  496. o17b
  497.         call    decin           ;decimal input routine
  498.         mov     a,e             ;save low byte in accumulator
  499.         cpi     00h             ;check for error
  500.         jnz     o17c            ;press on if not
  501.     lda    clflg        ;get command line flag
  502.     cpi    0        ;is it zero?
  503.     jz    opt17        ;let user re-input
  504.     jmp    erdis        ;else display error message and exit
  505. o17c
  506.         push    psw             ;save a reg
  507.         call    escap           ;send escape character to printer
  508.         mvi     c,lstout        ;get lstout function
  509.         mvi     e,'A'           ;get n/72 inch line spacing char
  510.         call    bdos            ;send to printer
  511.         mvi     c,lstout        ;get lstout function
  512.         pop     psw             ;get a reg
  513.         mov     e,a             ;get n
  514.         call    bdos            ;send to printer
  515.         jmp     more            ;another option?
  516. ;
  517. ;       n/216 inch line spacing (n/144 for gemini)
  518. ;
  519. opt18
  520.     lda    clflg        ;get command line flag
  521.     cpi    0        ;is it zero?
  522.     jz    o18a        ;press on if so
  523.     jmp    o18b        ;else skip asking for data
  524. o18a    
  525.     lxi     d,mes18         ;point to message
  526.         mvi     c,linout        ;get linout function
  527.         call    bdos            ;print the message
  528. o18b
  529.         call    decin           ;decimal input routine
  530.         mov     a,e             ;save low byte in accumulator
  531.         cpi     00h             ;check for error
  532.         jnz     o18c            ;press on if not
  533.     lda    clflg        ;get command line flag
  534.     cpi    0        ;is it zero?
  535.     jz    opt18        ;let user re-input
  536.     jmp    erdis        ;else display error message and exit
  537. o18c
  538.         push    psw             ;save a reg
  539.         call    escap           ;send escape character to printer
  540.         mvi     c,lstout        ;get lstout function
  541.         mvi     e,'3'           ;get n/216 inch line spacing char
  542.         call    bdos            ;send to printer
  543.         mvi     c,lstout        ;get lstout function
  544.         pop     psw             ;get a reg
  545.         mov     e,a             ;get n
  546.         call    bdos            ;send to printer
  547.         jmp     more            ;another option?
  548. ;
  549. ;       form length setting
  550. ;
  551. opt19
  552.     lda    clflg        ;get command line flag
  553.     cpi    0        ;is it zero?
  554.     jz    o19a        ;press on if so
  555.     call    clprs        ;get input from command line
  556.     cpi    20h        ;valid character?
  557.     jz    opt19        ;then get another
  558.     jmp    o19b        ;skip asking for data
  559. o19a    
  560.     lxi     d,mes19         ;point to message
  561.         mvi     c,linout        ;get linout function
  562.         call    bdos            ;print the message
  563.         mvi     c,conin         ;get conin function
  564.         call    bdos            ;get the character
  565.         push    psw             ;save a reg
  566.         mvi     c,conout        ;get conout function
  567.         mvi     e,cr            ;get carriage return
  568.         call    bdos            ;output to crt
  569.         mvi     c,conout        ;get conout function
  570.         mvi     e,lf            ;get line feed
  571.         call    bdos            ;output to crt
  572.         pop     psw             ;get a reg
  573. o19b
  574.         cpi     'I'             ;is it inches?
  575.         jnz     lines           ;go to lines routine if not
  576. inchs
  577.     lda    clflg        ;get command line flag
  578.     cpi    0        ;is it zero?
  579.     jz    o19c        ;press on if so
  580.     jmp    o19d        ;skip asking for data
  581. o19c
  582.     lxi     d,minch         ;point to inches message
  583.         mvi     c,linout        ;get linout function
  584.         call    bdos            ;print the message
  585. o19d
  586.         call    decin           ;get number of inches
  587.         mov     a,e             ;save low byte in accumulator
  588.         cpi     00h             ;check for error
  589.         jnz     o19e            ;press on if not
  590.     lda    clflg        ;get command line flag
  591.     cpi    0        ;is it zero?
  592.     jz    inchs        ;let user re-input
  593.     jmp    erdis        ;else display error message and exit
  594. o19e
  595.         push    psw             ;save a reg
  596.         call    escap           ;send escape character to printer
  597.         mvi     c,lstout        ;get lstout function
  598.         mvi     e,'C'           ;get form length char
  599.         call    bdos            ;send to printer
  600.         mvi     c,lstout        ;get lstout function
  601.         mvi     e,0             ;get inches designator
  602.         call    bdos            ;send to printer
  603.         mvi     c,lstout        ;get lstout function
  604.         pop     psw             ;get a reg
  605.         mov     e,a             ;get number of inches
  606.         call    bdos            ;send to printer
  607.         jmp     more            ;another option?
  608. lines
  609.     lda    clflg        ;get command line flag
  610.     cpi    0        ;is it zero?
  611.     jz    o19f        ;press on if so
  612.     jmp    o19g        ;skip asking for data
  613. o19f    
  614.     lxi     d,mlin          ;point to lines message
  615.         mvi     c,linout        ;get linout function
  616.         call    bdos            ;print the message
  617. o19g
  618.         call    decin           ;get number of lines
  619.         mov     a,e             ;save low byte in accumulator
  620.         cpi     00h             ;check for error
  621.         jnz     o18h            ;press on if not
  622.     lda    clflg        ;get command line flag
  623.     cpi    0        ;is it zero?
  624.     jz    lines        ;let user re-input
  625.     jmp    erdis        ;else display error message and exit
  626. o18h
  627.         push    psw             ;save a reg
  628.         call    escap           ;send escape character to printer
  629.         mvi     c,lstout        ;get lstout function
  630.         mvi     e,'C'           ;get form length char
  631.         call    bdos            ;send to printer
  632.         mvi     c,lstout        ;get lstout function
  633.         pop     psw             ;get a reg
  634.         mov     e,a             ;get number of lines
  635.         call    bdos            ;send to printer
  636.         jmp     more            ;another option?
  637. ;
  638. ;       skip over perforation
  639. ;
  640. opt20
  641.     lda    clflg        ;get command line flag
  642.     cpi    0        ;is it zero?
  643.     jz    o20a        ;press on if so
  644.     jmp    o20b        ;skip asking for data
  645. o20a    
  646.     lxi     d,mes20         ;point to message
  647.         mvi     c,linout        ;get linout function
  648.         call    bdos            ;print the message
  649. o20b
  650.         call    decin           ;get number of lines to be skipped
  651.         mov     a,e             ;save low byte in accumulator
  652.         cpi     00h             ;check for error
  653.         jnc     o20c            ;press on if not
  654.     lda    clflg        ;get command line flag
  655.     cpi    0        ;is it zero?
  656.     jz    opt20        ;let user re-input
  657.     jmp    erdis        ;else display error message and exit
  658. o20c 
  659.         cpi     127             ;greater than 127?
  660.         jc    o20d            ;press on if not
  661.     lda    clflg        ;get command line flag
  662.     cpi    0        ;is it zero?
  663.     jz    opt20        ;let user re-input
  664.     jmp    erdis        ;else display error message and exit
  665. o20d
  666.         push    psw             ;save a reg
  667.         call    escap           ;send escape character to printer
  668.         mvi     c,lstout        ;get lstout function
  669.         mvi     e,'N'           ;get skip perf char
  670.         call    bdos            ;send to printer
  671.         mvi     c,lstout        ;get lstout function
  672.         pop     psw             ;get a reg
  673.         mov     e,a             ;get number of lines to skip
  674.         call    bdos            ;send to printer
  675.         jmp     more            ;another option?
  676. ;
  677. ;       right margin setting
  678. ;
  679. opt21
  680.     lda    clflg        ;get command line flag
  681.     cpi    0        ;is it zero?
  682.     jz    o21a        ;press on if so
  683.     jmp    o21b        ;skip asking for data
  684. o21a    
  685.     lxi     d,mes21         ;point to message
  686.         mvi     c,linout        ;get linout function
  687.         call    bdos            ;print the message
  688. o21b
  689.         call    decin           ;get number of char in line
  690.         mov     a,e             ;save low byte in accumulator
  691.         cpi     00h             ;check for error
  692.         jnz     o21c            ;press on if not
  693.     lda    clflg        ;get command line flag
  694.     cpi    0        ;is it zero?
  695.     jz    opt21        ;let user re-input
  696.     jmp    erdis        ;else display error message and exit
  697. o21c
  698.         push    psw             ;save a reg
  699.         call    escap           ;send escape character to printer
  700.         mvi     c,lstout        ;get lstout function
  701.         mvi     e,'Q'           ;get right margin char
  702.         call    bdos            ;send to printer
  703.         mvi     c,lstout        ;get lstout function
  704.         pop     psw             ;get a reg
  705.         mov     e,a             ;get number of char in line
  706.         call    bdos            ;send to printer
  707.         jmp     more            ;another option?
  708. ;
  709. ;       left margin setting
  710. ;
  711. opt22
  712.     lda    clflg        ;get command line flag
  713.     cpi    0        ;is it zero?
  714.     jz    o22a        ;press on if so
  715.     jmp    o22b        ;skip asking for data
  716. o22a    
  717.     lxi     d,mes22         ;point to message
  718.         mvi     c,linout        ;get linout function
  719.         call    bdos            ;print message
  720. o22b
  721.         call    decin           ;get left margin column number
  722.         mov     a,e             ;save low byte in accumulator
  723.         cpi     00h             ;check for error
  724.         jnz     o22c            ;press on if not
  725.     lda    clflg        ;get command line flag
  726.     cpi    0        ;is it zero?
  727.     jz    opt22        ;let user re-input
  728.     jmp    erdis        ;else display error message and exit
  729. o22c
  730.         push    psw             ;save a reg
  731.         call    escap           ;send escape character to printer
  732.         mvi     c,lstout        ;get lstout function
  733.      if    gemini
  734.     mvi    e,'M'        ;get left margin character
  735.      endif
  736.      if    not gemini
  737.         mvi     e,'l'           ;get left margin character
  738.      endif
  739.         call    bdos            ;send to printer
  740.         mvi     c,lstout        ;get lstout function
  741.         pop     psw             ;get a reg
  742.         mov     e,a             ;get left margin column number
  743.         call    bdos            ;send to printer
  744.         jmp     more            ;another option?
  745. ;
  746. ;       superscript mode
  747. ;
  748. opt23
  749.     call    escap           ;send escape character to printer
  750.         mvi     c,lstout        ;get lstout function
  751.         mvi     e,'S'           ;get superscript first character
  752.         call    bdos            ;send to printer
  753.         mvi     c,lstout        ;get lstout function
  754.         mvi     e,0             ;get superscript second character
  755.         call    bdos            ;send to printer
  756.         jmp     more            ;another option?
  757. ;
  758. ;       subscript mode
  759. ;
  760. opt24
  761.     call    escap           ;send escape character to printer
  762.         mvi     c,lstout        ;get lstout function
  763.         mvi     e,'S'           ;get subscript first character
  764.         call    bdos            ;send to printer
  765.         mvi     c,lstout        ;get lstout function
  766.         mvi     e,1             ;get subscript second character
  767.         call    bdos            ;send to printer
  768.         jmp     more            ;another option?
  769. ;
  770.      if    msp10 or msp20
  771. ;
  772. ;    correspondence quality mode
  773. ;
  774. opt25
  775.     call    escap        ;send escape character to printer
  776.     mvi    c,lstout    ;get lstout function
  777.     mvi    e,'x'        ;get cq first char
  778.     call    bdos        ;send to printer
  779.     mvi    c,lstout    ;get lstout function
  780.     mvi    e,1        ;get cq second char
  781.     call    bdos        ;send to printer
  782.     jmp    more        ;another option?
  783. ;
  784. ;    condensed elite mode
  785. ;
  786. opt26
  787.     call    escap        ;send escape character to printer
  788.     mvi    c,lstout    ;get lstout function
  789.     mvi    e,'M'        ;get ce first char
  790.     call    bdos        ;send to printer
  791.     mvi    c,lstout    ;get lstout function
  792.     mvi    e,15        ;get ce second char
  793.     call    bdos        ;send to printer
  794.     jmp    more        ;another option?
  795. ;
  796.      endif
  797. ;
  798.      if    msp20
  799. ;
  800. ;    select proportional spacing
  801. ;
  802. opt27
  803.     lda    clflg        ;get command line flag
  804.     cpi    0        ;is it zero?
  805.     jz    o27a        ;press on if so
  806.     jmp    o27b        ;skip asking for data
  807. o27a    
  808.     lxi    d,mes27        ;point to message
  809.     mvi    c,linout    ;get linout function
  810.     call    bdos        ;print message
  811. o27b
  812.     call    decin        ;get number
  813.     mov    a,e        ;put number in a reg
  814.     cpi    00h        ;less than 0?
  815.         jnc     o27c            ;press on if not
  816.     lda    clflg        ;get command line flag
  817.     cpi    0        ;is it zero?
  818.     jz    opt27        ;let user re-input
  819.     jmp    erdis        ;else display error message and exit
  820. o27c
  821.     cpi    80h        ;greater than 127?
  822.         jc    o18d            ;press on if not
  823.     lda    clflg        ;get command line flag
  824.     cpi    0        ;is it zero?
  825.     jz    opt27        ;let user re-input
  826.     jmp    erdis        ;else display error message and exit
  827. o18d
  828.     push    psw        ;save
  829.     call    escap        ;send esc to ptr
  830.     mvi    c,lstout
  831.     mvi    e,' '        ;get space char
  832.     call    bdos        ;send it
  833.     pop     psw        ;get a reg back
  834.     mvi    c,lstout
  835.     mov    e,a        ;put in e reg
  836.     call    bdos        ;send it
  837.     jmp    more        ;another option?
  838. ;
  839. ;    Set Proportional printing on
  840. ;
  841. opt28
  842.     call    escap
  843.     mvi    c,lstout
  844.     mvi    e,'p'
  845.     call    bdos
  846.     mvi    c,lstout
  847.     mvi    e,1
  848.     call    bdos
  849.     jmp    more
  850. ;
  851. ;    Set proportional printing off
  852. ;
  853. opt29
  854.     call    escap
  855.     mvi    c,lstout
  856.     mvi    e,'p'
  857.     call    bdos
  858.     mvi    c,lstout
  859.     mvi    e,0
  860.     call    bdos
  861.     jmp    more
  862. ;
  863. ;    Clear print buffer
  864. ;
  865. opt30
  866.     mvi    c,lstout
  867.     mvi    e,24
  868.     call    bdos
  869.     jmp    more
  870. ;
  871.      endif    
  872. ;
  873. ;       decimal input subroutine (returns with number in de register)
  874. ;
  875. decin
  876.     lxi     d,0000h         ;clear d-e reg
  877. next
  878.     push    d               ;save d-e reg
  879.     lda    clflg        ;get command line flag
  880.     cpi    0        ;is it zero?
  881.     jz    next1        ;get input if so
  882.     mvi    a,1
  883.     sta    decflg        ;set decimal input flag
  884.     call    clprs        ;else get next char from command line
  885.     jmp    next2        ;skip user input
  886. next1
  887.         mvi     c,conin         ;get conin function
  888.         call    bdos            ;get the character
  889. next2
  890.         pop     d               ;get d-e reg
  891.         cpi     cr              ;are we done with interactive input?
  892.         jz    next3           ;return if so
  893.     cpi    20h        ;are we done with command line imput?
  894.     jz    next3        ;return if so 
  895.     sui    0030h           ;convert ascii to decimal
  896.         jc      error           ;no good if carry (less than 0)
  897.         cpi     000ah           ;higher than 9?
  898.         jnc     error           ;no good if so
  899.         lxi     h,0000h         ;clear h-l reg for multiplication
  900.         dad     d               ;multiply previous data by ten
  901.         dad     h
  902.         dad     h
  903.         dad     d
  904.         dad     h
  905.         mov     e,a             ;new entry to e
  906.         mvi     d,00h           ;clear d reg
  907.         dad     d               ;add units value to d-e reg
  908.         xchg                    ;new total to d-e reg
  909.         jmp     next            ;loop for next char
  910. next3
  911.     mvi    a,0
  912.     sta    decflg        ;reset decimal input flag
  913.     ret            ;return
  914. error
  915.     lda    clflg        ;get command line flag
  916.     cpi    0        ;is it zero?
  917.     jnz    erdis        ;go to command line error routine if not
  918.     lxi     d,ermes         ;else point to error message
  919.         mvi     c,linout        ;get linout function
  920.         call    bdos            ;print message
  921.         lxi     d,0000h         ;clear d-e reg
  922.         ret
  923. ;
  924. ;       misc subroutines
  925. ;
  926. ;     Send ESCape character to printer
  927. ;
  928. escap
  929.     mvi     c,lstout        ;get lstout function
  930.         mvi     e,esc           ;get escape character
  931.         call    bdos            ;send to printer
  932.         ret
  933. ;
  934. ;     Command line parse routine - returns with char in A register
  935. ;
  936. clprs
  937.     lhld    cladr        ;get address of last command line character
  938.     lda    ccount        ;get character count
  939.     dcr    a        ;decriment character count
  940.     sta    ccount        ;put character count back in buffer
  941.     cpi    0        ;any more characters?
  942.     jnz    clprs1        ;yes, press on
  943.     lda    decflg        ;else, get decimal input flag
  944.     cpi    0        ;zero unless called from decimal input
  945.     jz    exit        ;if not, then exit to DOS
  946.     mvi    a,1        ;put 1 back in character count
  947.     sta    ccount        ;so will decriment to 0 on next run through
  948.     mvi    a,20h        ;put space in a register
  949.     ret            ;return to decimal input routine
  950. clprs1
  951.     inx    h        ;get next character
  952.     mov    a,m        ;get character
  953.     cpi    'a'        ;less then a?
  954.     jc    clprs2        ;skip upper case mask
  955.     cpi    'z'        ;greater then z?
  956.     jnc    clprs2        ;skip upper case mask
  957.     ani    5fh        ;otherwise mask to upper case
  958. clprs2
  959.     shld    cladr        ;save character address in buffer
  960.     ret
  961. ;
  962. ;    If command line, get next character
  963. ;    if not, ask user if done
  964. ;
  965. more
  966.     lda    clflg        ;get command line flag
  967.     cpi    0        ;is it zero?
  968.     jz    more2        ;display message if not
  969.     call    clprs        ;go to command line parse routine if so
  970.     jmp    cpopt        ;go do another one if clprs didn't exit
  971. more2
  972.     lxi     d,msend         ;point to message
  973.         mvi     c,linout        ;get linout function
  974.         call    bdos            ;print the message
  975.         mvi     c,conin         ;get conin function
  976.         call    bdos            ;input character
  977.         ani     5fh             ;mask to upper case (b.m. -12/84)
  978.         push    psw             ;save a reg
  979.         mvi     c,conout        ;get conout function
  980.         mvi     e,cr            ;get carriage return
  981.         call    bdos            ;output to crt
  982.         mvi     c,conout        ;get conout function
  983.         mvi     e,lf            ;get line feed
  984.         call    bdos            ;output to crt
  985.         pop     psw             ;get a reg
  986.         cpi     'Y'             ;is it yes?
  987.         jz      optdis          ;display options if so
  988. ;
  989. exit
  990.     pop     h               ;get cp/m's stack
  991.         sphl                    ;set it
  992.         jmp     boot            ;return to cp/m
  993. ;
  994. ;       messages
  995. ;
  996.      if    clscr        ;clear screen
  997. clr    db    26,'$'         ;put your clear screen data here *********
  998.      endif            ;i.e...heath=esc,'e'
  999. ;
  1000. messg   db      '         ***** '
  1001.      if    epson
  1002.     db    'EPSON'
  1003.      endif
  1004.      if    gemini
  1005.     db    'GEMINI'
  1006.      endif
  1007.      if    msp10
  1008.     db    'CITIZEN MSP-10'
  1009.      endif
  1010.      if    msp20
  1011.     db    'CITIZEN MSP-20'
  1012.      endif
  1013.     db    ' PRINTER PRE-SET '
  1014.         db      'PROGRAM v',ver,'.',modlev,' *****',cr,lf,lf
  1015.         db      'This program will allow the operator to pre-set certain '
  1016.         db      'printer states.',cr,lf
  1017.         db      'The printer will remain in these states until the printer '
  1018.         db      'power is',cr,lf
  1019.         db      'recycled, or the printer is directed into another state '
  1020.         db      'by program control.',cr,lf,'$'
  1021. mnumes  db      lf,'The following options are available:',cr,lf,lf
  1022.     db    '  ?.  Display this list                 '
  1023.     db    ' O.  1/16 inch line spacing',cr,lf
  1024.     db    '  #.  Exit to DOS                       '
  1025.     db    ' P.  1/8 inch line spacing',cr,lf
  1026.         db      '  A.  Printer initialization            '
  1027.         db      ' Q.  n/72 inch line spacing',cr,lf
  1028.         db      '  B.  Elite-sized character setting     '
  1029.      if    gemini
  1030.         db      ' R.  n/144 inch line spacing',cr,lf
  1031.      endif
  1032.      if    not gemini
  1033.     db    ' R.  n/216 inch line spacing',cr,lf
  1034.      endif
  1035.         db      '  C.  Pica-sized character setting      '
  1036.         db      ' S.  Form length setting',cr,lf
  1037.         db      '  D.  Enlarged mode                     '
  1038.         db      ' T.  Skip over perforation',cr,lf
  1039.         db      '  E.  Send cr,lf to printer             '
  1040.     db    ' U.  Right margin setting',cr,lf
  1041.     db    '  F.  Condensed mode                    '
  1042.         db      ' V.  Left margin setting',cr,lf
  1043.         db      '  G.  Emphasized/enlarged mode          '
  1044.         db      ' W.  Superscript mode',cr,lf
  1045.         db      '  H.  Emphasized mode                   '
  1046.         db      ' X.  Subscript mode',cr,lf
  1047.         db      '  I.  Double strike mode                '
  1048.      if    msp10 or msp20
  1049.         db      ' Y.  Correspondence quality mode',cr,lf
  1050.      endif
  1051.      if    not (msp10 or msp20)
  1052.     db    '  ',cr,lf
  1053.      endif
  1054.         db      '  J.  Alternate character set (italics) '
  1055.      if    msp10 or msp20
  1056.         db      ' Z.  Condensed elite mode (160 col)',cr,lf
  1057.      endif
  1058.      if    not (msp10 or msp20)
  1059.     db    '  ',cr,lf
  1060.      endif
  1061.         db      '  K.  Underline mode                    '
  1062.      if    msp20
  1063.         db      ' 0.  Select proportional spacing',cr,lf
  1064.      endif
  1065.      if    not msp20
  1066.     db    '  ',cr,lf
  1067.      endif    
  1068.         db      '  L.  Ignore paper end detector         '
  1069.      if    msp20
  1070.         db      ' 1.  Set proportional printing on',cr,lf
  1071.      endif
  1072.      if    not msp20
  1073.     db    '  ',cr,lf
  1074.      endif
  1075.     db    '  M.  Unidirectional printing           '
  1076.      if    msp20
  1077.     db    ' 2.  Set proportional printing off',cr,lf
  1078.      endif 
  1079.      if    not msp20
  1080.     db    '  ',cr,lf
  1081.      endif
  1082.     db    '  N.  7/72 inch line spacing            '
  1083.      if    msp20
  1084.     db    ' 3.  Clear print buffer',cr,lf
  1085.      endif
  1086.      if    not msp20
  1087.     db    '  ',cr,lf
  1088.      endif
  1089.     db    cr,lf,'$'
  1090. optmes  db      'Enter desired option:','$'
  1091. emess   db      bel,lf,'++ Unknown entry! - exit to CP/M (Y/N)?','$'
  1092. emessx    db    bel,cr,lf,'++ Unknown character selected in ++',cr,lf
  1093.     db    '++ command line - exiting to DOS ++',cr,lf,'$'
  1094. mes17   db      'Enter n/72 line spacing required: ','$'
  1095. mes18   db      'Enter n/216 line spacing required: ','$'
  1096. mes19   db      'Specify setting by lines (l) or inches (i) ?','$'
  1097. minch   db      'Enter number of inches?','$'
  1098. mlin    db      'Enter number of lines?','$'
  1099. mes20   db      'Enter number of lines to be skipped?','$'
  1100. mes21   db      'Enter number of characters required in line '
  1101.         db      '(P=80, E=96, C=137)?','$'
  1102. mes22   db      'Enter column in which to start left margin?','$'
  1103. mes27    db    'Enter spacing between characters in half-dot'
  1104.     db    ' increments (0 to 127): ','$'
  1105. ermes   db      bel,cr,lf,'Non-numeric character entered!  Try again!',cr,lf,'$'
  1106. msend   db      cr,lf,'Another option (Y/N) ?','$'
  1107. ;
  1108. ;       define space
  1109. ;
  1110. ccount    ds    1    ;number of characters remaining in command line
  1111. ;
  1112. cladr    dw    0080h    ;address of current command line character
  1113. ;
  1114. clflg    ds    1    ;command line flag (0 of none / 1 if some)
  1115. ;
  1116. decflg    ds    1    ;decimal input flag
  1117. ;
  1118.         ds      16
  1119. stack   equ     $
  1120. ;
  1121.         end     start
  1122.