home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / epson / fxprint.ark / FXPRINT.ASM next >
Assembly Source File  |  1983-03-25  |  12KB  |  420 lines

  1. ;    Epson FX-80 Printer Setup Program
  2. ;        A Peace Product
  3. ;        Copyright 1983 by George F Peace
  4. ;
  5. VERSION    EQU    1$2
  6. ;
  7. ;revision history:  (lifo)
  8. ;
  9. ;  3/25/83  1.2 Corrected signon message to say FX instead of MX
  10. ;        Add RIGHT0  command
  11. ;        Expand the 12lpi command to my liking (subscript,
  12. ;        132lpp,137col,right0,condensed,skip6)
  13. ;
  14. ;  3/23/83  1.1 Add CELITE  NOSKIP  RIGHT8  SUB     SUPER
  15. ;            64COL   80COL   96COL   132COL  137COL
  16. ;            12LPI   SKIP3   SKIP6
  17. ;        Change help operation to display a configurable
  18. ;        number of commands on each line.
  19. ;
  20. ;  3/12/83  1.0    Upgrade of the MXPRNT program version 2.0 to
  21. ;        add FX-80 specific comand sequences.
  22. ;
  23. ;-------------------- CONFIGURATION --------------------
  24. ;
  25. FALSE    EQU    0
  26. TRUE    EQU    NOT FALSE
  27. ;
  28. ;The value HELPCHR should be set to the single character
  29. ;prompt for HELP output.
  30. ;
  31. HELPCHR    EQU    '?'        ;use question mark
  32. ;
  33. ;Set CMDHLP true if an invalid command entry is to cause
  34. ;display of the full help text.  Set it false to limit
  35. ;help to explicit requests.
  36. ;
  37. CMDHLP    EQU    FALSE        ;full help needed
  38. ;
  39. ;The HELPLIN parameter determines the number of commands that will
  40. ;be displayed on each help output line. The value can be any positive
  41. ;integer (0...).
  42. ;
  43. HELPLIN    EQU    5        ;number of commands listed per line
  44. ;
  45. ;CASEUP controls conversion of console input to upper case.
  46. ;Set true to convert all lower case characters to upper case.
  47. ;A false value will leave all input as it was received.
  48. ;
  49. CASEUP    EQU    TRUE        ;convert to upper case
  50. ;
  51. ;-------------------- CP/M DEFINITION --------------------
  52. ;
  53. BDOS    EQU    05H        ;BDOS entry
  54. CONOUT    EQU    02H        ;console output byte
  55. LIST    EQU    05H        ;list output byte
  56. PSTRING    EQU    09H        ;console output string
  57. CINPUT    EQU    0AH        ;console input line
  58.  
  59. CR    EQU    0DH        ;carriage return
  60. LF    EQU    0AH        ;line feed
  61. VT    EQU    0BH        ;vertical tab
  62. ESC    EQU    1BH        ;escape
  63. ;
  64. ;-------------------- MAIN PROGRAM --------------------
  65. ;
  66. START    ORG    100H
  67.     JMP    FXPRNT        ;jump around signon message
  68. ;
  69. ;    Following is the triple-purpose buffer
  70. ;
  71. ;    1. TYPEable text when in COMmand file format
  72. ;    2. The SIGNON message displayed on the console
  73. ;       each time the program is run
  74. ;    3. After signon, the first 128 bytes are used
  75. ;       for the console command input buffer
  76. ;
  77. SIGNON:
  78.     DB    CR
  79.     DB    LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF
  80.     DB    LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF
  81.     DB    VT,VT,VT,VT,VT,VT,VT,VT,VT,VT,VT,VT
  82.     DB    VT,VT,VT,VT,VT,VT,VT,VT,VT,VT,VT
  83. ;
  84.     DB    'Epson FX Printer Setup (level '
  85.     DB    (VERSION/10)+'0','.',(VERSION MOD 10)+'0',')'
  86.     DB    CR,LF,'Copyright 1983 by George F Peace'
  87.     DB    CR,LF,CR,LF,'Enter commands one per line as required.'
  88.     DB    CR,LF
  89.     DB    CR,LF,'Enter ',HELPCHR,' for help.'
  90.     DB    CR,LF,'$',CR,' ','Z'-40H
  91.     IF    NOT ($-SIGNON) / 128
  92.     DS    128-($-SIGNON)    ;complete the command buffer
  93.     ENDIF
  94. ;
  95. ;-------------------- MAIN PROGRAM --------------------
  96. ;
  97. FXPRNT:
  98.     LXI    H,NOTHOME    ;get nobody-home exit address
  99.     SHLD    START+1        ;so we won't allow restart in memory
  100.     LXI    D,SIGNON    ;load signon message address
  101.     CALL    PRINT        ;display it on the console
  102.     MVI    A,128-1        ;get maximum input character count
  103.     STA    SIGNON        ;put it in the input buffer
  104. CMDGET:
  105.     XRA    A        ;get a zero value
  106.     STA    COMMAND        ;obliterate last command
  107.     LXI    D,INPUTM    ;get input prompt
  108.     CALL    PRINT        ;display it on the console
  109.     LXI    D,CMDBUF    ;command input buffer
  110.     MVI    C,CINPUT    ;set to get input line
  111.     CALL    BDOS        ;now get the input line
  112.     LDA    COMMAND        ;get first character of command
  113.     CPI    HELPCHR        ;request for help?
  114.     JZ    HELP        ;yes - go provide some help
  115.     LXI    D,CHRCNT    ;get address of char count byte
  116.     LDAX    D        ;load number of characters
  117.     CPI    0        ;was character count zero?
  118.     JZ    DONE        ;yes, assume we are all done
  119. DECODE:
  120.     LXI    H,CMDTAB    ;list of commands/actions
  121. AGAIN:
  122.     XRA    A        ;zero the accumulator
  123.     CMP    M        ;compare to memory
  124.     JZ    CMDERR        ;no match found
  125.     MOV    C,M        ;load the character count
  126.     INX    H        ;increment to first letter
  127.     LXI    D,COMMAND    ;point to command input buffer
  128.     LDA    CHRCNT        ;load input character count
  129.     MOV    B,A        ;now move it to B
  130. NXTCHR:
  131.     LDAX    D        ;get command character
  132.     IF    CASEUP
  133.     CPI    'A'+20H        ;is character less than 'a'?
  134.     JC    UPPER        ;yes - no conversion needed
  135.     CPI    'Z'+20H        ;is character greater than 'z'?
  136.     JNC    UPPER        ;yes - no conversion needed
  137.     SUI    20H        ;convert lower case to upper
  138. UPPER:
  139.     ENDIF
  140.     CMP    M        ;compare with input character
  141.     JNZ    NXTCMD        ;no match, try next command
  142.     INX    H        ;match, increment command table address
  143.     INX    D        ;   and input buffer address
  144.     DCR    C        ;decrement command table character count
  145.     JZ    NOMORE        ;all done if no more characters
  146.     DCR    B        ;decrement input character count
  147.     JNZ    NXTCHR        ;go process more if nonzero count
  148. NOLOOP:
  149.     INX    H        ;increment command table pointer
  150.     DCR    C        ;decrement character count
  151.     JNZ    NOLOOP        ;keep going until past command
  152. NOMORE:
  153.     MOV    E,M        ;get low string address into E
  154.     INX    H        ;bump command table pointer
  155.     MOV    D,M        ;get high string address into D
  156.     XCHG            ;put address into HL
  157.     CALL    PROUT        ;call list output routine
  158.     JMP    CMDGET        ;get next command
  159. NXTCMD:
  160.     INR    C        ;increment char count past address
  161.     INR    C        ;second byte
  162. NOTYET:
  163.     INX    H        ;increment list address
  164.     DCR    C        ;decrement command character count
  165.     JNZ    NOTYET        ;keep going until past the command
  166.     JMP    AGAIN        ;at next command, process it
  167. ;
  168. NOTHOME:
  169.     LXI    D,GETOUT    ;get the no trespassing message
  170.     CALL    PRINT        ;and display it before exiting
  171. ;
  172. DONE:
  173.     LXI    D,CRLF        ;finish up with a CR/LF
  174.     CALL    PRINT        ;print it on the console
  175.     RET            ;and return to CP/M
  176. ;
  177. ;-------------------- SUBROUTINES --------------------
  178. ;
  179. CMDERR:
  180.     LXI    D,ERRMSG    ;load error message address
  181.     CALL    PRINT        ;print error message on console
  182.     IF    NOT CMDHLP
  183.     LXI    D,HELPM0    ;get help reminder
  184.     CALL    PRINT        ;and display it on the console
  185.     JMP    CMDGET        ;now go get next command line
  186.     ENDIF
  187. HELP:
  188.     LXI    D,HELPM1    ;load up help message address
  189.     CALL    PRINT        ;print it on the console
  190.     XRA    A        ;zero the accumulator
  191.     STA    HELCNT        ;and zero the help command tally
  192.     LXI    H,CMDTAB    ;get command table address
  193. HELCMD:
  194.     XRA    A        ;zero the accumulator
  195.     CMP    M        ;end of table?
  196.     JZ    HELEND        ;yes - so get out
  197.     MOV    C,M        ;get command length
  198.     INX    H        ;increment to first byte of command
  199. HELOOP:
  200.     MOV    E,M        ;load next character of command
  201.     PUSH    B        ;save character count
  202.     PUSH    H        ;save command table pointer
  203.     MVI    C,CONOUT    ;set console output
  204.     CALL    BDOS        ;and output byte to console
  205.     POP    H        ;restore command table pointer
  206.     POP    B        ;restore character count
  207.     INX    H        ;increment to next byte
  208.     DCR    C        ;decrement character count
  209.     JNZ    HELOOP        ;go back if more characters
  210.     INX    H        ;increment past
  211.     INX    H        ;  string address
  212.     LDA    HELCNT        ;get count of commands displayed
  213.     INR    A        ;increment to show latest entry
  214.     STA    HELCNT        ;replace help count
  215.     CPI    HELPLIN        ;have configured number yet?
  216.     JZ    HELOOP2        ;finish off the line with a CR/LF
  217.     LXI    D,COMMA        ;get comma definition address
  218.     PUSH    B        ;save character count
  219.     PUSH    H        ;save command table pointer
  220.     CALL    PRINT        ;display the string on the console
  221.     POP    H        ;restore command table pointer
  222.     POP    B        ;restore character count
  223.     JMP    HELCMD        ;go get next command
  224. HELOOP2:
  225.     LXI    D,CRLF        ;load CR/LF address
  226.     PUSH    B        ;save character count
  227.     PUSH    H        ;save command table pointer
  228.     CALL    PRINT        ;send CR/LF to console
  229.     POP    H        ;restore command table pointer
  230.     POP    B        ;restore character count
  231.     XRA    A        ;clear accumulator to zeros
  232.     STA    HELCNT        ;zero help count for next line
  233.     JMP    HELCMD        ;go process next command
  234. HELEND:
  235.     LXI    D,HELPM2    ;get help message address
  236.     CALL    PRINT        ;display on console
  237.     JMP    CMDGET        ;go get the next command line
  238. ;
  239. HELCNT    DB    0        ;local storage for print count
  240. ;
  241. PROUT:
  242.     MOV    E,M        ;byte to E for list output
  243.     MOV    A,M        ;and to A for test
  244.     MVI    C,LIST        ;get list output code
  245.     CPI    '$'        ;is this the string terminator?
  246.     RZ            ;yes - so return to caller
  247.     PUSH    H        ;save string pointer
  248.     CALL    BDOS        ;now fire off the request
  249.     POP    H        ;restore string pointer
  250.     INX    H        ;increment to next string byte
  251.     JMP    PROUT        ;and go back for more
  252.  
  253. PRINT:
  254.     MVI    C,PSTRING    ;print string function
  255.     CALL    BDOS        ;send the string to the console
  256.     RET            ;return to caller
  257. ;
  258. ;-------------------- COMMAND INPUT BUFFER --------------------
  259. ;
  260. CMDBUF    EQU    SIGNON        ;command buffer
  261. CHRCNT    EQU    CMDBUF+1    ;input character count
  262. COMMAND    EQU    CMDBUF+2    ;actual command address
  263. ;
  264. ;-------------------- COMMAND LOOKUP TABLE --------------------
  265. ;
  266. CMDTAB:
  267.     DB    6,'CELITE'    ;centered elite mode
  268.     DW    CELITE
  269.  
  270.     DB    9,'CONDENSED'    ;condensed print mode
  271.     DW    COND
  272.  
  273.     DB    6,'DOUBLE'    ;double srike mode
  274.     DW    DOUBLE
  275.  
  276.     DB    5,'ELITE'    ;ELITE print mode
  277.     DW    ELITE
  278.  
  279.     DB    10,'EMPHASIZED'    ;emphasized print mode
  280.     DW    EMPHA
  281.  
  282.     DB    7,'ITALICS'    ;italics character set
  283.     DW    ITALIC
  284.  
  285.     DB    6,'NORMAL'    ;turn off funny modes
  286.     DW    NORMAL
  287.  
  288.     DB    6,'NOSKIP'    ;cancel perforation skip
  289.     DW    NOSKIP
  290.  
  291.     DB    4,'PICA'    ;PICA print mode
  292.     DW    NORMAL
  293.  
  294.     DB    12,'PROPORTIONAL' ;set/clear proportional spacing
  295.     DW    PROPOR
  296.  
  297.     DB    5,'QUIET'    ;set/clear half speed mode
  298.     DW    QUIET
  299.  
  300.     DB    5,'RESET'    ;Reset printer
  301.     DW    RESET
  302.  
  303.     DB    6,'RIGHT0'    ;reset left margin to 0 columns
  304.     DW    RIGHT0
  305.  
  306.     DB    6,'RIGHT8'    ;move page right 8 characters
  307.     DW    RIGHT8
  308.  
  309.     DB    5,'SKIP3'    ;set to skip 3 lines at perf
  310.     DW    SKIP3
  311.  
  312.     DB    5,'SKIP6'    ;set to skip 6 lines at perf
  313.     DW    SKIP6
  314.  
  315.     DB    8,'STANDARD'    ;standard character set
  316.     DW    NORMAL
  317.  
  318.     DB    3,'SUB'        ;set subscript mode
  319.     DW    SUBS
  320.  
  321.     DB    5,'SUPER'    ;set superscript mode
  322.     DW    SUPERS
  323.  
  324.     DB    4,'TAB8'    ;set horizontal tabs
  325.     DW    TAB8
  326.  
  327.     DB    8,'VIEWMODE'    ;sets incremental or view mode
  328.     DW    VIEW
  329.  
  330.     DB    4,'6LPI'    ;six lines per inch
  331.     DW    LPI6
  332.  
  333.     DB    4,'8LPI'    ;eight lines per inch
  334.     DW    LPI8
  335.  
  336.     DB    4,'9LPI'    ;nine lines per inch
  337.     DW    LPI9
  338.  
  339.     DB    5,'12LPI'    ;special 12lpi condensed print
  340.     DW    LPI12
  341.  
  342.     DB    5,'64COL'    ;64 characters per line
  343.     DW    COL64
  344.  
  345.     DB    5,'80COL'    ;80 characters per line
  346.     DW    COL80
  347.  
  348.     DB    5,'96COL'    ;96 characters per line
  349.     DW    COL96
  350.  
  351.     DB    6,'132COL'    ;132 characters per line
  352.     DW    COL132
  353.  
  354.     DB    6,'137COL'    ;137 characters per line
  355.     DW    COL137
  356.  
  357.     DB    0        ;command table terminator
  358. ;
  359. ;-------------------- PRINTER OUTPUT STRINGS --------------------
  360. ;
  361. CELITE    DB    ESC,'!',1,ESC,'l',8,'$'
  362. COL64    DB    ESC,'Q',64,'$'
  363. COL80    DB    ESC,'Q',80,'$'
  364. COL96    DB    ESC,'Q',96,'$'
  365. COL132    DB    ESC,'Q',132,'$'
  366. COL137    DB    ESC,'Q',137,'$'
  367. COND    DB    ESC,'!',4,'$'
  368. DOUBLE    DB    ESC,'!',16,'$'
  369. ELITE    DB    ESC,'!',1,'$'
  370. EMPHA    DB    ESC,'!',8,'$'
  371. ITALIC    DB    ESC,'4',ESC,'$'
  372. LPI6    DB    ESC,'2',ESC,'C',66,'$'
  373. LPI8    DB    ESC,'0',ESC,'C',88,'$'
  374. LPI9    DB    ESC,'3',24,ESC,'C',99,'$'
  375. LPI12    DB    ESC,'3',18,ESC,'C',0,11,ESC,'S',1,ESC,'!',4
  376.     DB    ESC,'Q',137,ESC,'l',0,ESC,'N',6,'$'
  377. NORMAL    DB    ESC,'!',0,'$'
  378. NOSKIP    DB    ESC,'O','$'
  379. PROPOR    DB    ESC,'p',1,'$'
  380. QUIET    DB    ESC,'s',1,'$'
  381. RESET    DB    ESC,'@','$'
  382. RIGHT0    DB    ESC,'l',0,'$'
  383. RIGHT8    DB    ESC,'l',8,'$'
  384. SKIP3    DB    ESC,'N',3,'$'
  385. SKIP6    DB    ESC,'N',6,'$'
  386. SUBS    DB    ESC,'S',1,'$'
  387. SUPERS    DB    ESC,'S',0,'$'
  388. TAB8    DB    ESC,'D',9,17,25,33,41,49,57,65,73,81,89,97,115,123,131,0,'$'
  389. VIEW    DB    ESC,'i','$'
  390. ;
  391. ;-------------------- CONSOLE OUTPUT STRINGS --------------------
  392. ;
  393. INPUTM    DB    CR,LF,'Enter command (or CR): ','$'
  394.  
  395. ERRMSG    DB    CR,LF,'Unrecognized command','$'
  396.  
  397. HELPM0    DB    CR,LF,'Enter ',HELPCHR,' for help.'
  398.     DB    CR,LF,'$'
  399.  
  400. HELPM1    DB    CR,LF
  401.     DB    CR,LF,'The following commands are recognized:'
  402.     DB    CR,LF,CR,LF,'$'
  403.  
  404. HELPM2    DB    CR,LF
  405.     DB    CR,LF,'Control-C (^C) or carriage return will terminate'
  406.     DB    CR,LF,'the program.'
  407.     DB    CR,LF
  408.     DB    CR,LF,'Each command entered may be abbreviated to the'
  409.     DB    CR,LF,'minimum number of characters needed to uniquely'
  410.     DB    CR,LF,'identify it.'
  411.     DB    CR,LF,'$'
  412.  
  413. GETOUT    DB    CR,LF,CR,LF,'No program in memory.',CR,LF,'$'
  414.  
  415. CRLF    DB    CR,LF,'$'
  416.  
  417. COMMA    DB    ', ','$'
  418.  
  419.     END    START
  420.