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 / MBUG / MBUG115.ARC / MXSET23.MAC < prev    next >
Text File  |  1979-12-31  |  27KB  |  1,307 lines

  1. ;MXSET  Ver 2.3  19 May 84
  2. ;**********************************************************
  3. ;
  4. ;This program will set/reset all of the major functions of the
  5. ;Epson MX80 or MX-100 printer with or without Graftrax
  6. ;The program uses Z80 Zilog mnemonics and calls are made to 
  7. ;Richard Conn's excellent SYSLIB.REL file. 
  8. ;Microsoft's M80 macro assembler is needed 
  9. ;
  10. ;***********************************************************
  11. ;
  12. ;Note - sub menu A, 0/1 options correct?
  13. ; grafics
  14. ;Rev  2.3  19 May 84   Frans Van Duinen
  15. ;  modified for 8080 compatibility
  16. ;  added hex keypad to printer function
  17. ;  in typewriter & keypad functions maintain condensed
  18. ;   mode across CR/LF
  19. ;
  20. ;Rev  2.2  21 April 84   Frans Van Duinen
  21. ;  and some more bugs
  22. ;
  23. ;Rev  2.2  21 April 84   Frans Van Duinen
  24. ;  fixed some bugs introduced with ver 2.1
  25. ;  capability to run under WS
  26. ;
  27. ;Rev  2.1  20 April 84   Frans Van Duinen, Toronto
  28. ;  set up for MX80 or 100 with or without Graftrax,
  29. ;  cleaned up coding
  30. ;Rev  2.0  16 April 84   David C. Naylor, Halton Hills
  31. ;  set up for MX100 without graftrax 
  32. ;
  33. ;Rev. 1.2 by Simon J. Ewins, Toronto, Ontario, Canada.
  34. ; June 28, 1983.   Toronto, Ontario.
  35. ;
  36. ;
  37. ; Legend:
  38. ;
  39. ;  <DE> - refers to content of registers, e.g. <A>
  40. ;   DE> - refers to memory location pointed to be register pair
  41. ;   <>  - not equal
  42. ;
  43. ; SYSLIB functions used
  44.     EXTRN    BBLINE        ;Get input line, returns HL>line
  45. ;                 <A> count; on input <A><>0 - capitalize
  46.     EXTRN    EVAL10        ;Convert decimal number at HL> to binary
  47. ;                 returns <DE> number, HL> next char
  48. ;                 handling of nos>65535 unknown
  49. ;                 returns zero if no valid digits
  50. ;
  51. ;Note that CIN, COUT PRINT CCOUT are not compatible with WS
  52. ;
  53. ;Conditional assembly
  54. ;
  55. FALSE    EQU    0
  56. TRUE    EQU    NOT FALSE
  57. ;
  58. MX100    EQU    TRUE    ;Set true if using wider printer
  59. GTRAX    EQU    FALSE    ;Set true if printer graftrax equiped
  60. ;
  61. ;
  62. ; Equated symbols
  63. BELL    EQU    07    ;Bell
  64. BS    EQU    08    ;Backspace
  65. LF    EQU    0AH    ;Linefeed
  66. FF    EQU    0CH    ;Formfeed
  67. CR    EQU    0DH    ;Carriage return
  68. SO    EQU    0EH    ;Turn on double width
  69. SI    EQU    0FH    ;Shift in (activates compressed)
  70. DC2    EQU    12H    ;Turn off compressed
  71. DC4    EQU    14H    ;Turn off double width
  72. EOF    EQU    1AH    ;End of file (^Z)
  73. ESC    EQU    1BH    ;Escape char
  74. ;
  75. OFF    EQU    0    ;Off flag
  76. ON    EQU    1    ;On flag for printer
  77. ;
  78. ;
  79. BDOS    EQU    5    ;Entry for BDOS
  80. ;
  81.     IF    MX100
  82. ;
  83. ; MX100 related values
  84. ;
  85. MAXWDTH    EQU    233    ;Max page width
  86. MAXGMED    EQU    816    ;Max no of dots - med graphics
  87. MAXGHI    EQU    1632    ;Max no of dots - hi graphics
  88. ;
  89.     ELSE
  90. ;
  91. ; MX80  related values
  92. ;
  93. MAXWDTH    EQU    132    ;Max page width
  94. MAXGMED    EQU    480    ;Max no of dots - med graphics
  95. MAXGHI    EQU    960    ;Max no of dots - hi graphics
  96. ;
  97.     ENDIF
  98. ;
  99. ;Techniques:
  100. ;
  101. ;Note the sequence 
  102. ;    CALL LPRINT
  103. ;    DB   ESC,...,0
  104. ;
  105. ; The routine LPRINT never returns control. 
  106. ; instead it exits to label START, a call is used
  107. ; to pass the return address as the addr of the string
  108. ; to print. String must terminate on 00H
  109. ;
  110. ;
  111. ;Note that the sequence 
  112. ;    CALL RPRINT
  113. ;    DB   ESC,...,0
  114. ;
  115. ; does return control
  116. ;
  117. ;
  118.     .Z80
  119.     CSEG
  120. ;
  121.     JP    START        ;Skip subrtn
  122. CLR:
  123.     DB    FF,0,0,0,0,0,0    ;Clear screen & home cursor
  124. ;                Set to sequence for your computer:
  125. ;                Osborne    - 1AH,0
  126. ;                Televideo  - 1AH,0
  127. ;                Superbrain -  FF,0
  128. ;                Heath      - ESC,'E',0
  129. ;                If not wanted set to CR,LF,LF,LF...
  130. ;
  131. ; Constants & Workfields
  132. ;
  133. ;
  134. OPTIONS: DB    0        ;Printer options activated in this session
  135. ;                ; 0 - Condensed  
  136. ;                ;  is used for typewriter function
  137. ;                ;  set/reset by condensed on/off & reset  
  138. ;
  139. START:
  140.     CALL    CPRINT        ;Cls & display
  141.     DB    'EPSON SET-UP ver 2.2',CR,LF
  142. ;
  143.     IF    MX100
  144. ;
  145.     DB    'For MX100 '
  146. ;
  147.     ELSE
  148. ;
  149.     DB    'For MX80 '
  150. ;
  151.     ENDIF
  152. ;
  153.     IF    GTRAX
  154. ;
  155.     DB    'with Graftrax '
  156. ;
  157.     ELSE
  158. ;
  159.     DB    'without Graftrax '
  160. ;
  161.     ENDIF
  162. ;
  163.     DB    CR,LF
  164.     DB    'OPTIONS:',CR,LF
  165.     DB    'A: Select character font',CR,LF
  166. ;
  167.     IF    GTRAX
  168. ;
  169.     DB    'B: Reset printer to defaults',CR,LF
  170. ;
  171.     ELSE
  172. ;
  173.     DB    'B: Select character set',CR,LF
  174. ;
  175.     ENDIF
  176. ;
  177.     DB    'C: Set line spacing',CR,LF
  178.     DB    'D: Set page size',CR,LF
  179. ;
  180.     IF    GTRAX
  181. ;
  182.     DB    'E: Set uni-directional print ON/OFF',CR,LF
  183. ;
  184.     ELSE
  185. ;
  186.     DB    'E: Set vertical tabs',CR,LF
  187. ;
  188.     ENDIF
  189. ;
  190.     DB    'F: Set horizontal tabs',CR,LF
  191.     DB    'G: Set to top of form (FF)',CR,LF
  192.     DB    'H: Turn ON perforation skip',CR,LF
  193.     DB    'I: Turn OFF perforation skip',CR,LF
  194.     DB    'J: Enable out of paper signal',CR,LF
  195.     DB    'K: Disable out of paper signal',CR,LF
  196.     DB    'L: Set graphics mode',CR,LF
  197.     DB    'M: Print test',CR,LF
  198. ;
  199.     IF    GTRAX
  200. ;
  201.     DB    'N: Set bit 8 handling',CR,LF
  202.     DB    'O: Home printhead',CR,LF
  203. ;
  204.     ENDIF
  205. ;
  206.     DB    'X: Hex keypad to printer',CR,LF 
  207.     DB    'Z: Keyboard to printer',CR,LF 
  208.     DB    '^C: Quit to CP/M',CR,LF,LF,0
  209.     CALL    CHOICE        ;Complete menu, get input
  210. ;
  211.     CP    'A'
  212.     JP    Z,LA        ;Select type font
  213.     CP    'B'
  214.     JP    Z,LB        ;Select character set/reset printer
  215.     CP    'C'
  216.     JP    Z,LC        ;Set line spacing 
  217.     CP    'D'
  218.     JP    Z,LD        ;Set page size
  219.     CP    'E'
  220.     JP    Z,LE        ;Set vertical tabs/reset
  221.     CP    'F'
  222.     JP    Z,LBLF        ;Set horizontal tabs
  223.     CP    'G'
  224.     JP    Z,LG        ;Force formfeed
  225.     CP    'H'
  226.     JP    Z,LH        ;Set perf skip on
  227.     CP    'I'
  228.     JP    Z,LI        ;Set perf skip off
  229.     CP    'J'
  230.     JP    Z,LJ        ;Enable paper-out detector (signal only)
  231.     CP    'K'
  232.     JP    Z,LK        ;Disable paper-out detector
  233.     CP    'L'
  234.     JP    Z,LL        ;Set graphics
  235.     CP    'M'
  236.     JP    Z,LM        ;Print test
  237. ;
  238.     IF    GTRAX
  239. ;
  240.     CP    'N'
  241.     JP    Z,LN        ;Handling of h/o bit
  242.     CP    'O'
  243.     JP    Z,LO        ;Home print head
  244. ;
  245.     ENDIF
  246. ;
  247.     CP    'X'
  248.     JP    Z,LX        ;Hex keypad to printer
  249.     CP    'Z'
  250.     JP    Z,LZ        ;Keyboard to printer
  251. ;
  252. ;            Invalid response
  253. ERROR:
  254.     CALL    PRINT
  255.     DB    BELL,0
  256.     JP    START
  257. ;
  258. ;
  259. ;
  260. ;            Select font
  261. LA:
  262.     CALL    CPRINT        ;Cls & display
  263.     DB    CR,LF,LF
  264.     DB    '1:  Set condensed ON',CR,LF
  265.     DB    '2:  Set condensed OFF',CR,LF
  266.     DB    '3:  Set enlarged ON',CR,LF
  267.     DB    '4:  Set enlarged OFF',CR,LF
  268.     DB    '5:  Set emphasized ON',CR,LF
  269.     DB    '6:  Set emphasized OFF',CR,LF
  270. ;
  271.     IF    GTRAX
  272. ;
  273.     DB    '7:  Set Italics ON',CR,LF
  274.     DB    '8:  Set Italics OFF',CR,LF
  275.     DB    '9:  Set double strike ON',CR,LF
  276.     DB    '10: Set double strike OFF',CR,LF
  277.     DB    '11: Set to subscript',CR,LF
  278.     DB    '12: Set to superscript',CR,LF
  279.     DB    '13: Set super/subscript OFF',CR,LF
  280.     DB    '14: Set permanent enlarged ON',CR,LF
  281.     DB    '15: Set permanent enlarged OFF',CR,LF
  282. ;
  283.     ENDIF
  284. ;
  285.     DB    LF,0        ;Extra LF & terminating null
  286. ;
  287.     CALL    CHOICE        ;Get response 
  288.     LD    B,1        ;Set minimum
  289. ;
  290.     IF    GTRAX
  291. ;
  292.     LD    C,16        ;Get max+1
  293. ;
  294.     ELSE
  295. ;
  296.     LD    C,7        ;Get max+1
  297. ;
  298.     ENDIF
  299. ;
  300.     CALL    NUMBER
  301.     CP    1        ;Test flag
  302.     JP    Z,START        ;Get out on thru
  303.     JP    NC,LA        ;Out of range
  304. ;    CP    2        ;Condensed on/off? 
  305.     JP    Z,CONDOFF    ;Yes -
  306.     JP    NC,NOCOND    ;No -
  307.     LD    C,80H        ;Yes - set flag
  308.     CALL    SETOPT
  309.     JP    NOCOND
  310. CONDOFF:
  311.     LD    C,7FH        ;Set flag off
  312.     CALL    RESOPT        ;Reset option flag
  313. NOCOND:
  314. ;
  315. ;                 Note that different selections
  316. ;                 have differing formats:
  317. ;                 1 - SI  - no ESC
  318. ;                 2 - DC2 - no ESC
  319. ;                 3 - SO  - no ESC
  320. ;                 4 - DC4 - no ESC
  321. ;                 5 - ESC,'E' 
  322. ;                 6 - ESC,'F'
  323. ;                 7 - ESC,'4'
  324. ;                 8 - ESC,'5'
  325. ;                 9 - ESC,'G'
  326. ;                10 - ESC,'H'
  327. ;                11 - ESC,'S',OFF
  328. ;                12 - ESC,'S',ON
  329. ;                13 - ESC,'T'
  330. ;                14 - ESC,'W',ON
  331. ;                15 - ESC,'W',OFF
  332. ;
  333.     LD    A,E        ;Get index
  334.     LD    HL,ATABL-1    ;Index table (offset for ascii char index)
  335.      ADD    A,L        ;Combine with index char
  336.     JP    NC,LA1        ;No carry to high byte
  337.     INC    H
  338. LA1:
  339.     LD    L,A        ;Complete index
  340. ;
  341.  
  342.     LD    A,(HL)        ;Get byte at HL>
  343.     PUSH    AF        ; & save
  344.     LD    A,E        ;Get selection back
  345.     CP    5
  346.     JP    C,LA2        ; 1-4 no ESC
  347.     LD    A,ESC
  348.     CALL    LOUT
  349. LA2:
  350.     POP    AF
  351.     CALL    LOUT        ;Byte from table
  352. ;
  353. ;
  354.     IF    GTRAX
  355. ;
  356.     LD    A,11
  357.     SUB    E        ;Normalize '11' & '12' to 0 & 1
  358.     CP    2        ;Is this option 11 or 12?
  359.     JP    C,LA3        ;Yes - put normalized
  360.     OR    A        ;Was this #1 - #10 (positive now)
  361.     JP    P,START        ;Yes - get out
  362.     CP    255        ;No - was it #13 
  363.     JP    Z,START        ;Yes - is complete
  364.     ADD    A,4        ;No - adjust 14 - 15 to 1 - 0
  365. LA3:
  366.     CALL    LOUT        ;Output 0 (option 11/14) or 1 (12/15)
  367. ;
  368.     ENDIF 
  369. ;
  370.     JP    START
  371. ;
  372. ;
  373. ATABL:    DB    SI,DC2        ;Condensed on/off - no ESC
  374.     DB    SO,DC4        ;Enlarged (double width) on/off - no ESC
  375.     DB    'E','F'        ;Emphasized on/off 
  376. ;
  377.     IF    GTRAX
  378. ;
  379.     DB    '4','5'        ;Italics on/off
  380.     DB    'G','H'        ;Double strike on/off
  381.     DB    'S','S'        ;Super/subscr - with ESC & 1,0
  382.     DB    'T'        ;Super/sub off - with Esc
  383.     DB    'W','W'        ;Double width on/off - With ESC & 1,0
  384. ;
  385.     ENDIF
  386. ;
  387. ;
  388. ;
  389. LB:
  390. ;
  391.     IF    GTRAX
  392. ;            Reset printer to default
  393.     LD    C,0        ;Reset options
  394.     CALL    RESOPT
  395. ;
  396.     CALL    LPRINT        ;Print & exit
  397.     DB    ESC,'@',0
  398. ;
  399. ;
  400.     ELSE
  401. ;
  402.                 ;Select character set
  403.     CALL    CPRINT        ;Cls & display
  404.     DB    CR,LF,LF
  405.     DB    '1:  North American',CR,LF
  406.     DB    '2:  British',CR,LF
  407.     DB    '3:  French',CR,LF
  408.     DB    '4:  German',CR,LF
  409.     DB    '5:  Spanish',CR,LF
  410.     DB    '6:  Italian',CR,LF
  411.     DB    '7:  Danish',CR,LF
  412.     DB    '8:  Swedish',CR,LF,LF,0
  413. ;
  414.     CALL    CHOICE        ;Get response
  415.     LD    B,1        ;Set minimum
  416.     LD    C,9        ; & max+1
  417.     CALL    NUMBER
  418.     CP    1        ;Test flag
  419.     JP    Z,START        ;Get out on thru
  420.     JP    NC,LB        ;Out of range
  421.     LD    A,E        ;Get index
  422.     LD    HL,BTABL-1    ;Index table (offset for ascii char index)
  423.      ADD    A,L        ;Combine with index char
  424.     JP    NC,LB1        ;No carry to high byte
  425.     INC    H
  426. LB1:    
  427.     LD    L,A        ;Complete index
  428. ;
  429.     CALL    RPRINT
  430.     DB    ESC,'R',0    ;Put out 1st part
  431.     LD    A,(HL)        ;Get language/ char set code
  432.     CALL    LOUT        ;May be zero
  433.     JP    START
  434. ;
  435. ;
  436. ;
  437. BTABL:    DB    0        ;North American
  438.     DB    3        ;British
  439.     DB    1        ;French
  440.     DB    2        ;German
  441.     DB    7        ;Spanish
  442.     DB    6        ;Italian
  443.     DB    4        ;Danish
  444.     DB    5        ;Swedish
  445. ;
  446. ;
  447.     ENDIF
  448. ;
  449. ;
  450. ;
  451. LC:            ;Set line spacing
  452.     CALL    CPRINT        ;Cls & display
  453.     DB    '1: Select 6 lines per inch',CR,LF
  454.     DB    '2: Select 8 lines per inch',CR,LF
  455.     DB    '3: Set line spacing in 1/72" increments',CR,LF
  456. ;
  457.     IF    GTRAX
  458. ;
  459.     DB    '4: Set line spacing in 1/216" increments',CR,LF
  460. ;
  461.     ENDIF
  462. ;
  463.     DB    LF,0        ;Mark end of string
  464. ;
  465.     CALL    CHOICE        ;Get input
  466.     LD    B,1        ;Set minimum
  467. ;
  468.     IF    GTRAX
  469. ;
  470.     LD    C,5        ; & max+1
  471. ;
  472.     ELSE
  473. ;
  474.     LD    C,4        ; & max+1
  475. ;
  476.     ENDIF
  477. ;
  478.     CALL    NUMBER
  479.     CP    1        ;Test flag
  480.     JP    Z,START        ;Get out on thru
  481.     JP    NC,LC        ;Out of range
  482.     LD    A,E        ;Get index
  483.     CP    2        ;Which one?
  484.     JP    Z,LC2        ;#2
  485.     JP    NC,LC3        ;#3 (or 4 if GTRAX)
  486. ;
  487.             ;Select 6 lines per inch
  488.     CALL    LPRINT        ;Print & exit
  489.     DB    ESC,'2',0    ;Set 6 lines/inch
  490. ;
  491. ;
  492. LC2:            ;Select 8 lines per inch
  493.     CALL    LPRINT        ;Print & exit
  494.     DB    ESC,'0',0    ;Set 8 lines/inch
  495. ;
  496. ;
  497. LC3:            ;Set variable line spacing
  498. ;
  499.     IF    GTRAX
  500. ;
  501.     CP    4        ;Item 4 (1/216)    
  502.     JP    NZ,LC5        ;No -
  503. ;
  504. LC4:
  505.     CALL    PRINT
  506.     DB    CR,LF,LF,'Enter quantity of 1/216 inches (max 85): ',CR,LF
  507.     DB    '---> ? ',0
  508. ;
  509.     LD    A,0        ;No capitals reqd
  510.     CALL    BBLINE        ;Get input line
  511.     LD    B,1        ;Set minimum
  512.     LD    C,0        ; & max+1 (256)
  513.     CALL    NUMBER
  514.     CP    1        ;Test flag
  515.     JP    Z,START        ;Get out on thru
  516.     JP    NC,LC4        ;Out of range
  517.     LD    A,E        ;Get index
  518.     LD    (LC42),A
  519.     CALL    LPRINT        ;Print & exit
  520.     DB    ESC,'3'        ;Set spacing in 1/216" increments
  521. LC42:    DB    1,0
  522. ;
  523. ;
  524. ;
  525.     ENDIF
  526. ;
  527. LC5:
  528.     CALL    PRINT
  529.     DB    CR,LF,LF,'Enter quantity of 1/72 inches (max 85): ',CR,LF
  530.     DB    '---> ? ',0
  531. ;
  532.     LD    A,0        ;No capitals reqd
  533.     CALL    BBLINE        ;Get input line
  534.     LD    B,1        ;Set minimum
  535.     LD    C,86        ; & max+1
  536.     CALL    NUMBER
  537.     CP    1        ;Test flag
  538.     JP    Z,START        ;Get out on thru
  539.     JP    NC,LC5        ;Out of range
  540.     LD    A,E        ;Get index
  541.     LD    (LC52),A
  542.     CALL    LPRINT        ;Print & exit
  543.     DB    ESC,'A'        ;Set LF spacing in 1/72" increments
  544. LC52:    DB    1,0
  545. ;
  546. ;
  547. LD:            ;Set page dimensions
  548.     CALL    CPRINT        ;Cls & display
  549.     DB    '1: Set form length in lines',CR,LF
  550.     DB    '2: Set form length in inches',CR,LF
  551.     DB    '3: Set width',CR,LF,0
  552. ;
  553.     CALL    CHOICE
  554.     LD    B,1        ;Set minimum
  555.     LD    C,4        ; & max+1
  556.     CALL    NUMBER
  557.     CP    1        ;Test flag
  558.     JP    Z,START        ;Get out on thru
  559.     JP    NC,LD        ;Out of range
  560.     LD    A,E        ;Get index
  561.     CP    2        ;Which one?
  562.     JP    NC,LD3        ;#3
  563.     JP    Z,LD2        ;#2
  564. ;
  565.             ;Set page length in lines
  566. LD1:
  567.     CALL    PRINT
  568.     DB    CR,LF,LF,'Enter length in lines (max 127): ',CR,LF
  569.     DB    '---> ? ',0
  570. ;
  571.     LD    A,0
  572.     CALL    BBLINE
  573.     LD    B,1        ;Set minimum
  574.     LD    C,128        ; & max+1
  575.     CALL    NUMBER
  576.     CP    1        ;Test flag
  577.     JP    Z,START        ;Get out on thru
  578.     JP    NC,LD1        ;Out of range
  579.     LD    A,E        ;Get index
  580.     LD    (LD12),A
  581.     CALL    LPRINT        ;Print & exit
  582.     DB    ESC,'C'
  583. LD12:    DB    1,0
  584. ;
  585. ;
  586. ;
  587. LD2:            ;Set page length in inch increments
  588.     CALL    PRINT
  589.     DB    CR,LF,LF,'Enter length in inches (max 22): ',CR,LF
  590.     DB    '---> ? ',0
  591. ;
  592.     LD    A,0
  593.     CALL    BBLINE
  594.     LD    B,1        ;Set minimum
  595.     LD    C,23        ; & max+1
  596.     CALL    NUMBER
  597.     CP    1        ;Test flag
  598.     JP    Z,START        ;Get out on thru
  599.     JP    NC,LD2        ;Out of range
  600.     LD    A,E        ;Get index
  601.     LD    (LD22),A
  602. ;
  603.     CALL    RPRINT
  604.     DB    ESC,'C',0
  605.     XOR    A        ;Force null
  606.     CALL    LOUT        ; & put
  607. ;
  608.     CALL    LPRINT        ;Print & exit
  609. LD22:    DB    1,0
  610. ;
  611. ;
  612. LD3:            ;Set page width
  613.     CALL    PRINT
  614.     DB    CR,LF,LF,'Enter width: ',CR,LF
  615. ;
  616.     IF    MX100
  617. ;
  618.     DB    'Up to 136 in normal or emphasized mode.',CR,LF
  619.     DB    '      233 in condensed mode.',CR,LF
  620.     DB    '       68 in enlarged mode.',CR,LF
  621.     DB    '      116 in enlarged-condensed mode',CR,LF
  622. ;
  623.     ELSE
  624. ;
  625.     DB    'Up to  80 in normal or emphasized mode.',CR,LF
  626.     DB    '      132 in condensed mode.',CR,LF
  627.     DB    '       40 in enlarged mode.',CR,LF
  628.     DB    '       60 in enlarged-condensed mode',CR,LF
  629. ;
  630.     ENDIF
  631. ;
  632.  
  633.  
  634.     DB    '---> ? ',0
  635. ;
  636.     LD    A,0
  637.     CALL    BBLINE
  638.     LD    B,1        ;Set minimum
  639.     LD    C,MAXWDTH+1    ; & max+1
  640.     CALL    NUMBER
  641.     CP    1        ;Test flag
  642.     JP    Z,START        ;Get out on thru
  643.     JP    NC,LD3        ;Out of range
  644.     LD    A,E        ;Get index
  645.     LD    (LD32),A
  646.     CALL    LPRINT        ;Print & exit
  647.     DB    ESC,'Q'
  648. LD32:    DB    1,0
  649. ;
  650. ;
  651. ;
  652. ;
  653. ;
  654. LE:
  655. ;
  656.     IF    GTRAX
  657. ;
  658. ;            Set uni-directional print on/off
  659.     CALL    CPRINT        ;Cls & display
  660.     DB    '1:  Set uni-directional print ON',CR,LF
  661.     DB    '2:  Set uni-directional print OFF',CR,LF,0
  662. ;
  663.     CALL    CHOICE        ;Ask & get input
  664.     LD    B,1        ;Set minimum
  665.     LD    C,3        ; & max+1
  666.     CALL    NUMBER
  667.     CP    1        ;Test flag
  668.     JP    Z,START        ;Get out on thru
  669.     JP    NC,LE        ;Out of range
  670.     CALL    RPRINT
  671.     DB    ESC,'U',0
  672.     LD    A,2        ;Convert index to 1/0 flag
  673.     SUB    E        ;1 now 1; 2 now 0
  674.     CALL    LOUT
  675.     JP    START
  676. ;
  677. ;
  678.     ELSE
  679. ;
  680. ;            ;Set vertical tabs
  681.     CALL    CPRINT        ;Cls & display
  682.     DB    CR,LF,LF,'Enter vertical tab positions (max 8)',CR,LF
  683.     DB    '(in ascending order) ---> ? ',0
  684. ;
  685.     LD    A,0
  686.     CALL    BBLINE        ;Get line of tabs, terminated by 00h
  687.     LD    DE,VTABS    ;Set to tab list
  688.     LD    A,1        ;Set minimum tab
  689.     LD    (DE),A        ;Prime tab list
  690.     LD    C,128        ;Set max tab+1 (we dont know page len)    
  691.     LD    B,8        ;Set loop count
  692.     CALL    TABS        ;Handle tabs, returns flag in <A>
  693.     OR    A        ;OK?
  694.     JP    Z,LE2        ;Yes
  695.     DEC    A        ;No - exit?
  696.     JP    Z,START        ;Yes -
  697.     JP    LE        ;No - ask new input
  698. ;
  699. ;            Output tab string
  700. LE2:
  701.     LD    HL,VTABS-2    ;Set to string to put
  702.     JP    HTBS2        ; & go put
  703. ;
  704. ;
  705. ;
  706.     DB    ESC,'B'        ;Vertical tabs
  707. VTABS:    DB    1,0,0,0,0,0,0,0,0  ;8 tabs & null
  708. ;
  709. ;
  710. ;
  711.     ENDIF
  712. ;
  713. ;
  714. LBLF:            ;Set horizontal tabs
  715.     CALL    CPRINT        ;Cls & display
  716.     DB    CR,LF,LF,'Enter horizontal tab positions (max 12)',CR,LF
  717.     DB    '(in ascending order) ---> ? ',0
  718. ;
  719.     LD    A,0
  720.     CALL    BBLINE
  721.     LD    DE,HTABS    ;Set to tab list
  722.     LD    A,1        ;Set minimum tab
  723.     LD    (DE),A        ;Prime tab list
  724.     LD    C,MAXWDTH+1    ;Set max tab+1 (we dont know page width)
  725.     LD    B,12        ;Set loop count
  726.     CALL    TABS        ;Handle tabs, returns flag in <A>
  727.     OR    A        ;OK?
  728.     JP    Z,LBLF2        ;Yes
  729.     DEC    A        ;No - exit?
  730.     JP    Z,START        ;Yes -
  731.     JP    LBLF        ;No - ask new input
  732. ;
  733. ;            Output tab string
  734. LBLF2:
  735.     LD    HL,HTABS-2    ;Set to string to put
  736. HTBS2:
  737.     CALL    LPR        ;Put string at HR>
  738. ;                 Is safer than RPRINT due to variable len
  739. ;                 past null may be garbage
  740.     XOR    A        ;Force null after tabs
  741.     CALL    LOUT
  742.     JP    START
  743. ;
  744. ;
  745.     DB    ESC,'D'
  746. HTABS:    DB    1,0,0,0,0,0,0,0,0,0,0,0,0  ; 12 tabs & null
  747. ;
  748. ;
  749. ;
  750. LG:            ;Set top of form (FF)
  751.     CALL    LPRINT        ;Print & exit
  752.     DB    FF,0        ;Output formfeed
  753. ;
  754. ;
  755. LH:            ;Turn on perf. skip-over
  756.     CALL    CPRINT        ;Cls & display
  757.     DB    CR,LF,LF
  758.     DB    'Enter no of lines to skip over perforation'
  759.     DB    ' (max 127)',CR,LF
  760.     DB    '---> ? ',0
  761. ;
  762.     LD    A,0
  763.     CALL    BBLINE
  764.     LD    B,1        ;Set minimum
  765.     LD    C,128        ; & max+1
  766.     CALL    NUMBER
  767.     CP    1        ;Test flag
  768.     JP    Z,START        ;Get out on thru
  769.     JP    NC,LH        ;Out of range
  770.     LD    A,E        ;Get index
  771.     LD    (LH2),A
  772.     CALL    LPRINT        ;Print & exit
  773.     DB    ESC,'N'
  774. LH2:    DB    0,0        ;Skip n lines
  775. ;
  776. ;
  777. ;
  778. LI:            ;Turn off perf. skip-over
  779.     CALL    LPRINT        ;Print & exit
  780.     DB    ESC,'O',0
  781. ;
  782. ;
  783. ;
  784. LJ:            ;Enable paper-out signal
  785.     CALL    LPRINT        ;Print & exit
  786.     DB    ESC,'9',0
  787. ;
  788. ;
  789. ;
  790. LK:            ;Disable paper-out signal
  791.     CALL    LPRINT        ;Print & exit
  792.     DB    ESC,'8',0    ;Disable paper-out sensor
  793. ;
  794. ;
  795. ;
  796. LL:            ;Set graphics 
  797. ; Note that non-graftrax also supports graphics
  798.     CALL    CPRINT        ;Cls & display
  799.     DB    '1:  Set medium density graphics',CR,LF
  800.     DB    '2:  Set high density graphics',CR,LF,0
  801. ;
  802.     CALL    CHOICE        ;Ask & get input
  803.     LD    B,1        ;Set minimum
  804.     LD    C,3        ; & max+1
  805.     CALL    NUMBER
  806.     CP    1        ;Test flag
  807.     JP    Z,START        ;Get out on thru
  808.     JP    NC,LL        ;Out of range
  809.     LD    A,E        ;Get index
  810.     CP    1        ;Medium density?
  811.     JP    NZ,LL2        ;No - high
  812. ;
  813. ;            Set medium density
  814. LL1:
  815.     LD    HL,MAXGMED    ;Set max no acceptable
  816.     CALL    GETBITS        ;Get no of bits 
  817.     CP    1        ;Test flag
  818.     JP    Z,START        ;Get out on thru
  819.     JP    NC,LL1        ;Out of range
  820.     LD    (LL12),HL    ;Save wanted no bits
  821.     CALL    LPRINT        ;Print & exit
  822.     DB    ESC,'K'
  823. ;
  824. ;
  825. LL12:    DB    0,0,0
  826. ;
  827. ;
  828. ;
  829. LL2:            ;Set graphics - high density
  830.     LD    HL,MAXGHI    ;Set max no acceptable
  831.     CALL    GETBITS        ;Get no of bits 
  832.     CP    1        ;Test flag
  833.     JP    Z,START        ;Get out on thru
  834.     JP    NC,LL2        ;Out of range
  835.     LD    (LL22),HL    ;Save wanted no bits
  836.     CALL    LPRINT        ;Print & exit
  837.     DB    ESC,'L'
  838. LL22:    DB    0,0,0
  839. ;
  840. ;
  841. LM:            ;Print test
  842.     CALL    LPRINT
  843. ;    DB    CR,LF,LF       ;Removed re double width SO
  844.     DB    'ABCDEFGHIJKLMNOPQRSTUVWXYZ  '
  845.     DB    'abcdefghijklmnopqrstuvwxyz',CR,LF,0
  846. ;            ; LF turns off condensed
  847.     CALL    SETCOND        ;Re-activate condensed if reqd
  848. ;
  849.     CALL    LPRINT
  850.     DB    "1234567890-=['\;,./"
  851.     DB    '!@#$%^&*()_+]"|:<>?',CR,LF,LF,0
  852. ;            ; LF turns off condensed 
  853.     CALL    SETCOND        ;Re-activate condensed if reqd
  854. ;
  855. ;
  856.     IF    GTRAX
  857. ;
  858. LN:            ;Set handling of 8th bit
  859.     CALL    CPRINT        ;Cls & display
  860.     DB    '1:  Bit 8 as is',CR,LF
  861.     DB    '2:  Bit 8 always ON',CR,LF
  862.     DB    '3:  Bit 8 always OFF',CR,LF,0
  863. ;
  864.     CALL    CHOICE        ;Ask & get input
  865.     LD    B,1        ;Set minimum
  866.     LD    C,4        ; & max+1
  867.     CALL    NUMBER
  868.     CP    1        ;Test flag
  869.     JP    Z,START        ;Get out on thru
  870.     JP    NC,LN        ;Out of range
  871.     LD    A,E        ;Get index
  872.     LD    HL,NTABL-1    ;Index table (offset for ascii char index)
  873.      ADD    A,L        ;Combine with index char
  874.     JP    NC,LN1        ;No carry to high byte
  875.     INC    H
  876. LN1:
  877.     LD    L,A        ;Complete index
  878. ;
  879.     LD    A,(HL)        ;Get byte at HL>
  880.     LD    (LNBYT),A    ; & store in string
  881.     CALL    LPRINT        ;Print & exit
  882.     DB    ESC
  883. LNBYT:    DB    0,0
  884. ;
  885. ;
  886. NTABL:    DB    '#','>','='    ;As is, on, off        
  887. ;
  888. ;
  889. ;
  890. LO:            ;Home print head
  891.     CALL    LPRINT        ;Print & exit
  892.     DB    ESC,'<',0
  893. ;
  894. ;
  895.     ENDIF
  896. ;
  897. ;
  898. ;            Hex keypad to printer
  899. LX:
  900.     CALL    CPRINT        ;Cls & display
  901.     DB    'Only keys 0-9 and A-F are accepted',CR,LF
  902.     DB    'For every pair of hex digits a character',CR,LF
  903.     DB    'passed to the printer',CR,LF
  904.     DB    'Use ^Z (single keystroke) to end',CR,LF,CR,LF,0
  905. ;
  906. LXLP:
  907.     CALL    XIN        ;Get one hex digit (or ^Z)
  908.     CALL    CCOUT        ;& display, control char as ^. 
  909.     CP    EOF        ;^Z?
  910.     JP    Z,START        ;Yes - get out
  911.     LD    D,C        ;Keep 1st hex digit
  912.     CALL    XIN        ;Get second hex digit (or ^Z)
  913.     CALL    CCOUT        ;& display, control char as ^. 
  914.     CP    EOF        ;^Z?
  915.     JP    Z,START        ;Yes - get out
  916.     LD    A,' '        ;Blank between digit pairs
  917.     CALL    CCOUT
  918. ;            Combine hex digits
  919. ;                Low-order digit in <C>
  920.     LD    A,D        ;
  921.     ADD    A,A        ; 2x
  922.     ADD    A,A        ; 4x
  923.     ADD    A,A        ; 8x
  924.     ADD    A,A        ;16x 
  925.     ADD    A,C        ;Combine digits
  926. ;
  927.     CALL    LOUT        ;No - put to printer
  928.     CP    LF        ;Line feed?
  929.     JP    Z,CHKCNDX    ;Yes - check condensed
  930.     CP    CR        ;Or carriage return (may not be necessary)
  931.     JP    NZ,LXLP        ;No - go for next char
  932. CHKCNDX:
  933.     CALL    SETCOND        ;Re-activate condensed if reqd
  934.     JP    LXLP        ;Go for next char
  935. ;
  936. ;
  937. ;            Get Hex digit
  938. ;             Returns hex digit in <C>,
  939. ;             original char entered in <A>
  940. ;
  941. XIN:
  942.     CALL    DIN        ;Get one char
  943.     OR    A        ;Anything?
  944.     JP    Z,XIN        ;No - try again
  945.     CP    EOF        ;^Z?
  946.     RET    Z        ;Yes - return
  947.     LD    B,A        ;Keep actual char
  948.     CP    '0'        ;Validate 0 - 9
  949.     JP    C,XIN
  950.     CP    '9'
  951.     JP    C,XIN2        ;Yes - digit 0 -9
  952.     CP    'A'        ;Lower case A - F? 
  953.     JP    C,XIN
  954.     CP    'F'
  955.     JP    C,XIN3        ;Yes - A - F
  956.     CP    'a'        ;Upper case A - F 
  957.     JP    C,XIN
  958.     CP    'f'+1
  959.     JP    NC,XIN        ;No - ignore
  960. XIN3:            ;Alpha A-F/a-f
  961.     AND    07H        ;Convert to 01-06
  962.     ADD    A,9        ;now 0A-0FH
  963. XIN2:    AND    0FH        ;Strip zone for 0-9, noop for alpha
  964.     LD    C,A        ;Hex digit
  965.     LD    A,B        ;Original char
  966.     RET
  967. ;
  968. ;
  969. ;            Re-activate condensed if selected 
  970. SETCOND:
  971.     LD    A,(OPTIONS)    ;Get current options
  972.     AND    80H        ;Condensed on?
  973.     JP    Z,LXLP        ;No - go for next char
  974.     LD    A,SI        ;Set condensed on again
  975.     CALL    LOUT        ; to printer
  976.     RET
  977. ;
  978. ;
  979. ;            Keyboard to printer
  980. LZ:
  981.     CALL    CPRINT        ;Cls & display
  982.     DB    'All keys pressed are passed to the printer',CR,LF
  983.     DB    'This includes all control keys, except ^Z',CR,LF
  984.     DB    'Use ^Z to end',CR,LF,CR,LF,0
  985. ;
  986. LZLP:
  987.     CALL    DIN        ;Get one char
  988.     OR    A        ;Anything?
  989.     JP    Z,LZLP        ;No - try again
  990.     CALL    CCOUT        ;& display, control char as ^. 
  991.     CP    EOF        ;^Z?
  992.     JP    Z,START        ;Yes - get out
  993.     CALL    LOUT        ;No - put to printer
  994.     CP    LF        ;Line feed?
  995.     JP    Z,CHKCOND    ;Yes - check condensed
  996.     CP    CR        ;Or carriage return (may not be necessary)
  997.     JP    NZ,LZLP        ;No - go for next char
  998. CHKCOND:
  999.     CALL    SETCOND        ;Re-activate condensed if reqd
  1000.     JP    LZLP        ;Go for next char
  1001.  
  1002. ;
  1003. ;
  1004. ;    Print string on printer & exit
  1005. LPRINT:
  1006.     EX    (SP),HL        ;Save <HL> & get string addr
  1007.     CALL    LPR        ;Print string at HL>
  1008.     POP    HL        ;Restore register used 
  1009.     JP    START
  1010. ;
  1011. ;    Print string on printer & return
  1012. RPRINT:
  1013.     EX    (SP),HL        ;Save <HL> & get string addr
  1014.     CALL    LPR        ;Print string at HL>
  1015.     EX    (SP),HL        ;Restore register used & return addr
  1016.     RET
  1017. ;
  1018. ;            Print string at HL>
  1019. ;
  1020. LPR:
  1021.     PUSH    AF
  1022. LPRLP:
  1023.     LD    A,(HL)        ;Get next char
  1024.     INC    HL        ; & step past
  1025.     OR    A        ;End?
  1026.     JP    Z,LPREX        ;Yes
  1027.     CALL    LOUT        ;Output byte in <A>
  1028.     JP    LPRLP        ;Go for next byte
  1029. ;
  1030. LPREX:
  1031.     POP    AF
  1032.     RET
  1033. ;
  1034. ;    Print string on Console & return
  1035. PRINT:
  1036.     EX    (SP),HL        ;Save <HL> & get string addr
  1037.     CALL    PR        ;Print string at HL>
  1038.     EX    (SP),HL        ;Restore register used & return addr
  1039.     RET
  1040. ;
  1041. ;            Print string at HL> on console
  1042. ;
  1043. PR:
  1044.     PUSH    AF
  1045. PRLP:
  1046.     LD    A,(HL)        ;Get next char
  1047.     INC    HL        ; & step past
  1048.     OR    A        ;End?
  1049.     JP    Z,PREX        ;Yes
  1050.     CALL    COUT        ;Output byte in <A>
  1051.     JP    PRLP        ;Go for next byte
  1052. ;
  1053. PREX:
  1054.     POP    AF
  1055.     RET
  1056. ;
  1057. ;
  1058. ;            loop through all tabs
  1059. ;                ;HL> tab source string
  1060. ;                ;DE> tab destination list
  1061. ;                ;<B> max no of tabs
  1062. ;                ;<C> max allowed tab
  1063. ;                ;Returns <A> 0 - ok, 1 zero tab found, 2 error 
  1064. TABS:
  1065.     PUSH    DE        ;Save tab destination pointer
  1066.     PUSH    BC        ;Save no of tabs
  1067.     LD    A,(DE)        ;Get minimum
  1068.     LD    B,A
  1069.     CALL    NUMBER        ;Get next number in <E>, flag in <A>
  1070.     POP    BC
  1071.     LD    A,E        ;Save tab # (2x)
  1072.     LD    B,E        ;Save tab #
  1073.     POP    DE        ;Restore dest'n pointer
  1074.     LD    (DE),A        ;Save tab
  1075.     INC    DE        ;Step to next posn
  1076.     OR    A        ;Test flag
  1077.     RET    NZ        ; On null response & on error     
  1078.     LD    A,(HL)        ;Was current no last?
  1079.     OR    A        ;(i.e. terminating null)
  1080.     JP    Z,TABT        ;Yes - thru
  1081.     LD    A,B        ;Get save tab no
  1082.     INC    A        ;Set as new minimum
  1083.     LD    (DE),A        ; & save tab+1 for minimum check
  1084.     DJNZ    TABS        ;Continue if count not out
  1085. ;                 max no tabs - ignore rest
  1086. TABT:            ;Thru all tabs
  1087.     XOR    A
  1088.     LD    (DE),A        ;Ensure last posn zero
  1089.     RET            ;With <A> zero
  1090. ;
  1091. ;
  1092. ;            :Get number from HL>,
  1093. ;             limited by , or 00H
  1094. ;             test min in <B>, max in <C>
  1095. ;             returned in <E>, 
  1096. ;             flag in <A> 0 - ok, 1 end input, 2 error
  1097. ;             returns HL> past comma if present
  1098. NUMBER:
  1099.     PUSH    HL        ;Save current posn for null check
  1100.     CALL    EVAL10        ;Get next number at HL> in <DE>
  1101.     EX    DE,HL        ;Put curr posn in <DE>
  1102.     EX    (SP),HL        ;Get prev posn in <HL>
  1103.     XOR    A        ;Turn off carry flag
  1104.     SBC    HL,DE        ;Did we move at all? (equal/not eq)
  1105.     POP    HL        ;Either way restore 
  1106.     EX    DE,HL        ;<DE> number, HL> next posn
  1107.     JP    Z,NUMEX        ;Didn't move - exit
  1108. ;            We picked up some number - may be zero
  1109.     LD    A,D
  1110.     OR    A
  1111.     JP    NZ,NUMER    ;Over 255
  1112.     LD    A,C        ;Get max if any
  1113.     OR    A        ;Set flag
  1114.     LD    A,E        ;Get number - leave flag 
  1115.     JP    Z,NUMMAX    ;No maximum
  1116.     CP    C        ;Over max?
  1117.     JP    NC,NUMER    ;Yes - get out
  1118. NUMMAX:
  1119.     CP    B        ;Less minimum 
  1120.     JP    C,NUMER        ;Invalid
  1121.     LD    A,(HL)        ;Get delimiter following tab
  1122.     OR    A        ;Null?
  1123.     JP    Z,NUMTRU    ;Yes - thru
  1124.     CP    ','        ;Valid delimiter?
  1125.     JP    NZ,NUMER    ;No - ask new input
  1126.     INC    HL        ;Step past comma
  1127.     LD    A,E        ;Get no again, now check for zero
  1128.     OR    A        ;Zero - treat as end
  1129.     RET    Z        ;Yes - get out with
  1130. ;            Number ok 
  1131. NUMTRU:
  1132.     XOR    A        ;Set ok flag
  1133.     RET
  1134. NUMEX:
  1135.     LD    A,(HL)        ;Get delimiter following tab
  1136.     OR    A        ;Null?
  1137.     JP    NZ,NUMER    ;No - invalid
  1138.     LD    A,1        ;Set exit flag
  1139.     RET
  1140. NUMER:
  1141.     CALL    PRINT        ;Put out error
  1142.     DB    BELL,CR,LF,LF,0
  1143. ;
  1144.     LD    A,2        ;Set error flag
  1145.     RET
  1146. ;
  1147. ;
  1148. ;             Get No of bits for graphics mode,
  1149. ;              in:  <HL> max 
  1150. ;              out: <HL> actual
  1151. GETBITS:
  1152.     PUSH    HL        ;Save max
  1153.     CALL    PRINT
  1154.     DB    'No of bits of graphics? ',0
  1155. ;
  1156.     LD    A,0
  1157.     CALL    BBLINE
  1158.     CALL    EVAL10
  1159.     EX    DE,HL        ;Put curr posn in <DE>
  1160.     EX    (SP),HL        ;Get prev posn in <HL>
  1161.     XOR    A        ;Turn off carry flag
  1162.     SBC    HL,DE        ;Did we move at all? (equal/not eq)
  1163.     POP    HL        ;Either way restore 
  1164.     EX    DE,HL        ;<DE> number, HL> max no
  1165.     JP    Z,NUMEX        ;Didn't move - exit with flag
  1166.     XOR    A        ;Turn off carry flag
  1167.     SBC    HL,DE        ;is entered over max?
  1168.     JP    C,NUMER        ;Yes - get out on error flag
  1169.     EX    DE,HL
  1170.      RET            ;No -ok, zero in <A>, numberin <HL> 
  1171. ;
  1172. ;            Ask for input - return 1 byte in <A>
  1173. CHOICE:
  1174.     CALL    PRINT        ;Show last line in menu
  1175.     DB    'Enter your choice: ',0
  1176. ;
  1177.     LD    A,1        ;Specify capitalization
  1178.     CALL    BBLINE        ;Wait for input line
  1179.     LD    A,(HL)        ;Get first char, all others ignored
  1180.     RET
  1181. ;
  1182. ;
  1183. ;            Set Options flags on
  1184. ;             <C> has bit mask
  1185. SETOPT:
  1186.     PUSH    HL
  1187.     PUSH    AF
  1188.     LD    A,(OPTIONS)    ;Get current options
  1189.     OR    C        ;Turn on bits
  1190.     LD    (OPTIONS),A    ;Save updated flags
  1191.     POP    AF
  1192.     POP    HL
  1193.     RET
  1194. ;
  1195. ;            Set Options flags off
  1196. ;             <C> has bit mask
  1197. RESOPT:
  1198.     PUSH    HL
  1199.     PUSH    AF
  1200.     LD    A,(OPTIONS)    ;Get current options
  1201.     AND    C        ;Turn off bits
  1202.     LD    (OPTIONS),A    ;Save updated flags
  1203.     POP    AF
  1204.     POP    HL
  1205.     RET
  1206. ;
  1207. ;
  1208. ;            Clear screen & display text
  1209. CPRINT:
  1210.     PUSH    HL
  1211.     PUSH    AF
  1212.     LD    HL,CLR        ;Set to clear screen string
  1213. CPRTLP:
  1214.     LD    A,(HL)        ;Get next char
  1215.     INC    HL
  1216.     OR    A        ;End of string?
  1217.     JP    Z,CPRT        ;Yes -
  1218.     CALL    COUT        ;No - display
  1219.     JP    CPRTLP
  1220. ;
  1221. CPRT:
  1222.     POP    AF
  1223.     POP    HL    
  1224.     JP    PRINT        ;Go print string whose addr now on stack
  1225. ;
  1226. ;
  1227. COUT:            ;Put char in <A> to CON:
  1228.     PUSH    AF
  1229.     PUSH    BC
  1230.     PUSH    DE
  1231.     PUSH    HL
  1232.     LD    E,A        ;Set char
  1233.     LD    C,2        ;Set CONOUT funtion
  1234.     CALL    BDOS
  1235.     POP    HL
  1236.     POP    DE
  1237.     POP    BC
  1238.     POP    AF
  1239.     RET
  1240. ;
  1241. LOUT:            ;Put char in <A> to LST:
  1242.     PUSH    AF
  1243.     PUSH    BC
  1244.     PUSH    DE
  1245.     PUSH    HL
  1246.     LD    E,A        ;Set char
  1247.     LD    C,5        ;Set LISTOUT funtion
  1248.     CALL    BDOS
  1249.     POP    HL
  1250.     POP    DE
  1251.     POP    BC
  1252.     POP    AF
  1253.     RET
  1254. ;
  1255. CCOUT:            ;Put char in <A> to CON:
  1256. ;            Show control chars
  1257.     PUSH    AF
  1258.     PUSH    BC
  1259.     CP    ' '        ;Control char?
  1260.     JP    NC,CCO2        ;No
  1261.     CP    CR        ;Special?
  1262.     JP    Z,CCO2        ;Yes - as is
  1263.     CP    LF        ;Special?
  1264.     JP    Z,CCO2        ;Yes - as is
  1265.     CP    BELL        ;Special?
  1266.     JP    Z,CCO2        ;Yes - as is
  1267.     CP    BS        ;Special?
  1268.     JP    Z,CCO2        ;Yes - as is
  1269. ;            Convert & display
  1270.     CP    ESC        ;Escape?
  1271.     JP    NZ,CCO3        ;Yes - spell
  1272.     LD    A,'E'
  1273.     CALL    COUT    
  1274.     LD    A,'S'
  1275.     CALL    COUT
  1276.     LD    A,'C'
  1277.     JP    CCO2
  1278. ;
  1279. CCO3:            ;Show ^
  1280.     OR    40H        ;Convert to alpha
  1281.     PUSH    AF
  1282.     LD    A,'^'
  1283.     CALL    COUT
  1284.     POP    AF        ;Get converted
  1285. CCO2:
  1286.     CALL    COUT        ;Put char in <A>
  1287.     POP    BC
  1288.     POP    AF
  1289.     RET
  1290. ;
  1291. DIN:            ;Get char - if available
  1292.     PUSH    BC
  1293.     PUSH    DE
  1294.     PUSH    HL
  1295.     LD    C,6        ;Set Direct CON I/O funtion
  1296.     LD    E,0FFH        ;Flag as input request
  1297.     CALL    BDOS
  1298.     POP    HL
  1299.     POP    DE
  1300.     POP    BC
  1301.     RET
  1302. ;
  1303. ;
  1304.     END
  1305.