home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / list / printcpm.lbr / EPSON.AZM / EPSON.ASM
Assembly Source File  |  1987-06-14  |  11KB  |  487 lines

  1. ;-----------------------------------------------------------------
  2. ;
  3. ;    EPSON.COM
  4. ;    Setup Epson Printer        
  5. ;    For CP/M 2.2 systems.
  6. ;    Derived from a program by M. M. Hessel 02/15/82
  7. ;
  8. ;    Re-written by Robert Kuhman on 07/02/83.
  9. ;    Sysop of the "Cro'sNest" (c)1982 RCP/M - RBBS
  10. ;    Released to the Public Domain for nonprofit use only.
  11. ;                    
  12. ;-----------------------------------------------------------------
  13. ;
  14. ;    DEFINE EQUATES
  15. ;
  16. ;    SET VERSION NUMBER AND REVISION NUMBERS
  17. ;
  18. VERS:    EQU    100        ;VERSION NUMBER (GETS FORMATTED X.XX)
  19. MONTH:    EQU    07        ;MONTH OF LAST REVISION
  20. DAY:    EQU    02        ;DAY OF MONTH
  21. YEAR:    EQU    83        ;YEAR
  22. ;
  23. TRUE:    EQU    -1
  24. FALSE:    EQU    NOT TRUE
  25. ;
  26. ;    USER DEFINED EQUATES
  27. ;
  28. STDCPM:    EQU    TRUE        ;TRUE IF 100H LOAD
  29. ;
  30. CLRSCR:    EQU    FALSE        ;TRUE IF CLEAR SCREEN
  31. ;
  32. ;    END USER DEFINED EQUATES
  33. ;
  34.     IF    STDCPM
  35. BASE:    EQU    0000H        ;STD CPM BASE
  36.     ENDIF
  37. ;
  38.     IF    NOT STDCPM
  39. BASE:    EQU    4200H        ;NON-STD BASE
  40.     ENDIF
  41. ;
  42. ;    BDOS FUNCTIONS
  43. ;    
  44. BDOS:    EQU    05        ;BDOS CALL
  45. PSTR:    EQU    09        ;PRINT BUFFER FUNCTION
  46. GSTR:    EQU    10        ;READ BUFFER FUNCTION
  47. PRTR:    EQU    05        ;PRINTER WRITE CHAR FUNCTION
  48. CONIN:    EQU    01        ;CONSOLE READ CHAR FUNCTION
  49. ;
  50. ;    CLEAR SCREEN (AND HOME CURSOR) CHARACTER DEFINITIONS
  51. ;
  52. ;    SOME TERMINAL TYPES    CS1        CS2
  53. ;    -------------------    ---        ---
  54. ;    OSBORNE            1AH        00H (NONE, SO USE NULL)
  55. ;    HEATH/ZENITH 19/89    1BH        45H
  56. ;
  57. ;
  58.     IF    CLRSCR        ;CLEAR SCREEN
  59. CS1:    EQU    1BH        ;LEADIN OR CLEAR SCREEN CHAR
  60. CS2    EQU    45H        ;CLEAR AND/OR HOME CURSOR CHAR OR NULL
  61.     ENDIF
  62. ;
  63.     IF    NOT CLRSCR    ;NO CLEAR SCREEN CAPABILITY
  64. CS1:    EQU    00H        ;NULL
  65. CS2:    EQU    00H        ;NULL
  66.     ENDIF
  67. ;
  68. ;    ASCII DEFINITIONS
  69. ;
  70. CR:    EQU    0DH        ;CARRIAGE RETURN
  71. LF:    EQU    0AH        ;LINE FEED
  72. ESC:    EQU    1BH        ;ESCAPE
  73. BELL:    EQU    07H        ;CONSOLE BELL
  74. ;
  75. ;    PROGRAM BEGINS HERE
  76. ;
  77.     ORG    BASE+0100H    ;ORGIN
  78. ;
  79. START:    CALL    BEGIN        ;GET UNDERWAY
  80.     MVI    E,LF        ;LINE FEED TO PRINTER
  81.     CALL    PCHAR        ;SEND IT
  82. RESTOR: LHLD    OLDSTK        ;GET OLD STACK POINTER
  83.     SPHL            ;PUT IT IN THE REGISTER
  84.     RET            ;EXIT TO CP/M
  85. ;    
  86. ;    ASCII MESSAGES
  87. ;    
  88. SIGNON:    DB    CR,LF,LF,LF,'EPSON.COM v'
  89.     DB    VERS/100+'0','.',VERS MOD 100/10+'0'
  90.     DB    VERS MOD 10+'0',' as of '
  91.     DB    MONTH/10+'0',MONTH MOD 10+'0','/'
  92.     DB    DAY/10+'0',DAY MOD 10+'0','/'
  93.     DB    YEAR/10+'0',YEAR MOD 10+'0'
  94.     DB    CR,LF
  95.     DB    '(Printer Setup program.)',CR,LF,LF
  96.     DB    '* Get the PAPER READY first.',CR,LF
  97.     DB    '* Then TURN ON the printer.',CR,LF,LF
  98.     DB    '$'
  99. ;
  100. HLPMSG:    DB    CR,LF,LF,LF,'H E L P',CR,LF
  101.     DB    '-------',CR,LF,LF
  102.     DB    'This program will setup an  EPSON printer until',CR,LF
  103.     DB    'you turn it off or select a new set of options.',CR,LF
  104.     DB    'The enlarged print option is not included since',CR,LF
  105.     DB    'it resets to normal size after each print line.',CR,LF
  106.     DB    'You can choose emphasized and then doublestrike',CR,LF
  107.     DB    'to provide for boldface type.',CR,LF,LF
  108.     DB    '$'
  109. ;    
  110. SETUP:    DB    CR,LF,LF,LF,'M E N U - Epson Printer',CR,LF
  111.     DB    '-----------------------',CR,LF,LF
  112.     DB    '1. Select Typesize',CR,LF,LF
  113.     DB    '2. Select Line Spacing',CR,LF,LF    
  114.     DB    '3. Select Paper Out Mode',CR,LF,LF
  115.     DB    '4. Select International Chars',CR,LF,LF
  116.     DB    '5. Help Information',CR,LF,LF
  117.     DB    '6. Exit Program',CR,LF,LF
  118.     DB    '$'
  119. ;    
  120. SLINSP:    DB    CR,LF,LF,LF,'L I N E  S P A C I N G',CR,LF
  121.     DB    '----------------------',CR,LF,LF
  122.     DB    '1. 6 lpi (Default)',CR,LF,LF
  123.     DB    '2. 8 lpi',CR,LF,LF
  124.     DB    '3. Special Line Spacing.',CR,LF,LF
  125.     DB    '$'
  126. ;    
  127. SPSPC:    DB    CR,LF,LF,LF,'L I N E  S P A C I N G (Variable)',CR,LF
  128.     DB    '---------------------------------',CR,LF,LF
  129.     DB    'You can set line spacing between',CR,LF,LF
  130.     DB    '1/72 to 85/72 of an inch.',CR,LF,LF
  131.     DB    'Choose a number between 1 and 85,... ',CR,LF,LF,'$'
  132. ;    
  133. TSIZE:    DB    CR,LF,LF,LF,'T Y P E F A C E',CR,LF
  134.     DB    '---------------',CR,LF,LF
  135.     DB    '1. Emphasized Print  (ON)',CR,LF
  136.     DB    '2. Emphasized Print (OFF)',CR,LF,LF
  137.     DB    '3. Condensed Print   (ON)',CR,LF
  138.     DB    '4. Condensed Print  (OFF)',CR,LF,LF
  139.     DB    '5. Double Strike     (ON)',CR,LF
  140.     DB    '6. Double Strike    (OFF)',CR,LF,LF
  141.     DB    '7. No Change, or enter RETURN',CR,LF,LF
  142.     DB    '$'
  143. ;    
  144. PSEL:    DB    CR,LF,LF,LF,'P A P E R  O U T',CR,LF
  145.     DB    '----------------',CR,LF,LF
  146.     DB    '1. Paper Out Detector.    (ON)',CR,LF
  147.     DB    '2. Paper Out Detector. (OFF)',CR,LF,LF
  148.     DB    '$'
  149. ;    
  150. INTCHR:    DB    CR,LF,LF,LF,'C H A R A C T E R  S E T',CR,LF
  151.     DB    '------------------------',CR,LF,LF
  152.     DB    '1. France',CR,LF,LF
  153.     DB    '2. Germany',CR,LF,LF
  154.     DB    '3. United Kingdom',CR,LF,LF
  155.     DB    '4. Denmark',CR,LF,LF
  156.     DB    '5. Sweden',CR,LF,LF
  157.     DB    '6. Italy',CR,LF,LF
  158.     DB    '7. Spain',CR,LF,LF
  159.     DB    '0. USA (Default setting)',CR,LF,LF
  160.     DB    '$'
  161. ;    
  162. CNTMSG:    DB    'Press any key to continue.','$'
  163. ;
  164. SELMSG:    DB    'Enter your Selection,... ','$'
  165. ;
  166. ERRMSG:    DB    CR,LF,LF,LF,'E R R O R',BELL,CR,LF
  167.     DB    '---------',CR,LF,LF
  168.     DB    'Default of 6 lines/inch used.',CR,LF
  169.     DB    'Re-enter your selection.',CR,LF,LF
  170.     DB    '$'
  171. ;    
  172. CLS:    DB    CS1
  173.     DB    CS2
  174.     DB    '$'
  175. ;
  176. ;    SUBROUTINES BEGIN HERE
  177. ;    
  178. ;    SUBROUTINE "SAVSTK"
  179. ;    SAVES CPM REGISTERS/STACK    
  180. ;    DEFINE SP            
  181. ;    
  182. BEGIN:    POP    B        ;SAVE STACK THEN FALL THRU TO TURNON
  183.     LXI    H,0000        ;CLEAR HL
  184.     DAD    SP        ;GET STACK POINTER
  185.     SHLD    OLDSTK        ;SAVE SP
  186.     LXI    H,STACK        ;SET HL WITH ADDRESS OF SP
  187.     SPHL            ;SET NEW STACK POINTER
  188.     PUSH    B        ;RETURN ADDRESS SET
  189.                 ;FALL THRU TO TURNON
  190. ;
  191. ;    SUBROUTINE "TURNON" REMINDS
  192. ;    YOU TO TURN ON THE PRINTER
  193. ;    
  194. TURNON:    CALL    CLEAR        ;CLEAR SCREEN
  195.     LXI    D,SIGNON    ;POINT TO SIGNON MESSAGE
  196.     CALL    PRINT        ;DISPLAY IT
  197.     LXI    D,CNTMSG    ;POINT TO CONTINUE MESSAGE
  198.     CALL    PRINT        ;DISPLAY
  199.     CALL    READ        ;GET ANY KEYBOARD ENTRY TO CONTINUE
  200.                 ;FALL THRU TO MENU
  201. ;    
  202. ;    SUBROUTINE "MENU" THE MAIN
  203. ;    SELECTION MENU. PROGRAM
  204. ;    RETURNS TO THIS MENU AFTER
  205. ;    SELECTING OPTION. EXIT GOES
  206. ;    BACK TO CPM            
  207. ;    
  208. MENU:    CALL    CLEAR        ;CLEAR SCREEN
  209.     LXI    D,SETUP        ;POINT TO MENU MESSAGE
  210.     CALL    PRINT        ;DISPLAY IT
  211.     LXI    D,SELMSG    ;POINT TO SELECTION MESSAGE
  212.     CALL    PRINT        ;DISPLAY IT
  213.     CALL    READ        ;GET THE SELECTION
  214.     MVI    B,36H        ;LOAD THE NUMBER SIX
  215.     CMP    B        ;WAS IT SELECTION 6?
  216.     JZ    EXIT        ;EXIT TO CPM
  217.     DCR    B        ;DEC DOWN TO 5
  218.     CMP    B
  219.     JZ    HELP        ;TO WRITE HELP INFORMATION
  220.     DCR    B        ;DEC DOWN TO 4
  221.     CMP    B
  222.     JZ    CHRSET        ;CHARACTER SET FONT
  223.     DCR    B        ;DEC DOWN TO 3
  224.     CMP    B
  225.     JZ    PSMODE        ;PAPER SELECTOR
  226.     DCR    B        ;DEC DOWN TO 2
  227.     CMP    B
  228.     JZ    LINESP        ;LINE SPACING
  229.     DCR    B        ;DEC DOWN TO 1
  230.     CMP    B
  231.     JZ    TYPE        ;TYPESIZE
  232.     JMP    MENU        ;INCORRECT NUMBER SELECTED?
  233. EXIT:    RET            ;GET OUT
  234. ;    
  235. ;    SUBROUTINE "HELP" PRINTS
  236. ;    INFORMATION ABOUT PROGRAM 
  237. ;    
  238. HELP:    CALL    CLEAR        ;CLEAR SCREEN
  239.     LXI    D,HLPMSG    ;POINT TO MESSAGE
  240.     CALL    PRINT        ;DISPLAY IT
  241.     LXI    D,CNTMSG
  242.     CALL    PRINT
  243.     CALL    READ
  244.     JMP    MENU        ;BACK TO THE MENU
  245. ;    
  246. ;    SUBROUTINE "CHRSET" SELECTS 
  247. ;    ONE OF AN EIGHT POSSIBLE
  248. ;    CHARACTER SETS U.S.A.,FRANCE,
  249. ;    GERMANY,ETC.
  250. ;    
  251. CHRSET:    CALL    CLEAR
  252.     LXI    D,INTCHR    ;POINT TO MESSAGE
  253.     CALL    PRINT
  254.     LXI    D,SELMSG
  255.     CALL    PRINT
  256.     CALL    READ
  257.     CALL    LEADIN        ;SEND ESC TO PRINTER
  258.     MVI    E,52H        ;FOLLOWED BY 'R'
  259.     CALL    PCHAR        ;SEND TO PRINTER
  260.     SUI    30H        ;CONVERT CONSOLE INPUT FOM ASCII TO BINARY
  261.     CMP    B        ;IS INPUT < 0 ?
  262.     JC    INCORR        ;IF YES INVALID
  263.     MVI    B,08H
  264.     CMP    B        ;IS INPUT > 7 ?
  265.     JZ    SKIP            
  266.     JNC    INCORR        ;IF YES INVALID
  267. SKIP:    MOV    E,A    
  268.     CALL    PCHAR        ;"CHARACTER SET" TO PRINTER
  269.     JMP    FIN
  270. INCORR:    MVI    E,00H        
  271.     CALL    PCHAR        ;DEFAULT SET IS USA
  272. FIN:    JMP    MENU        ;END OF CHARACTER SET!!
  273. ;    
  274. ;    SUBROUTINE "PSMODE" TURN
  275. ;    THE PAPER END DETECTOR OFF 
  276. ;    OR ON. DEFAULT IS ON    
  277. ;    
  278. PSMODE:    CALL    CLEAR
  279.     LXI    D,PSEL
  280.     CALL    PRINT 
  281.     LXI    D,SELMSG
  282.     CALL    PRINT
  283.     CALL    READ
  284.     CALL    LEADIN
  285.     MVI    B,32H
  286.     CMP    B
  287.     JNZ    SELECT
  288.     MVI    E,38H
  289.     CALL    PCHAR
  290.     JMP    MENU
  291. SELECT:    MVI    E,39H
  292.     CALL    PCHAR
  293.     JMP    MENU    
  294. ;    
  295. ;    SUBROUTINE "TYPE" SETS THE 
  296. ;    TYPEFACE        
  297. ;    
  298. TYPE:    CALL    CLEAR
  299.     LXI    D,TSIZE
  300.     CALL    PRINT
  301.     LXI    D,SELMSG
  302.     CALL    PRINT
  303.     CALL    READ
  304.     MVI    B,37H        ;TEST THE SELECTION
  305.     CMP    B
  306.     JZ    MENU        ;NO CHANGE
  307.     DCR    B
  308.     CMP    B
  309.     JZ    DSOFF        ;DOUBLESTRIKE OFF 
  310.     DCR    B
  311.     CMP    B
  312.     JZ    DSON        ;DOUBLESTRIKE ON
  313.     DCR    B
  314.     CMP    B
  315.     JZ    CNOFF        ;CONDENSED PRINTING OFF
  316.     DCR    B
  317.     CMP    B
  318.     JZ    CNON        ;CONDENSED PRINTING ON
  319.     DCR    B
  320.     CMP    B
  321.     JZ    EMOFF        ;EMPHASIZED PRINTING OFF
  322.     DCR    B
  323.     CMP    B
  324.     JZ    EMON        ;EMPHASIZED PRINTING ON
  325.     JMP    MENU         ;TO MENU
  326. DSOFF:    CALL    LEADIN
  327.     MVI    E,48H        ;DOUBLESTRIKE OFF
  328.     JMP    PTR
  329. DSON:    CALL    LEADIN
  330.     MVI    E,47H        ;DOUBLESTRIKE ON    
  331.     JMP    PTR
  332. CNOFF:    MVI    E,12H        ;^R CONDENSED OFF
  333.     JMP    PTR
  334. EMOFF:    CALL    LEADIN
  335.     MVI    E,46H        ;"F" EMPHASIZED OFF
  336.     JMP    PTR
  337. CNON:    MVI    E,0FH        ;^O CONDENSED ON
  338.     JMP    PTR
  339. EMON:    CALL    LEADIN
  340.     MVI    E,45H        ;"E" EMPHASIZED ON
  341. PTR:    CALL    PCHAR
  342. NCHG:    JMP    MENU
  343. ;    
  344. ;    SUBROUTINE "LINESP" PROVIDES A
  345. ;    CHOICE OF 1 - 85/72 OF AN INCH
  346. ;    SPACING ON THE EPSON.
  347. ;    
  348. LINESP:    CALL    CLEAR
  349.     LXI    D,SLINSP
  350.     CALL    PRINT        ;YOUR CHOICE LINE OF SPACING
  351.     LXI    D,SELMSG
  352.     CALL    PRINT
  353.     CALL    READ
  354.     MVI    B,32H
  355.     CMP    B
  356.     JNZ    SPSP    
  357.     CALL    LEADIN
  358.     MVI    E,30H        ;8 LINES/INCH
  359.     CALL    PCHAR        ;TO THE PRINTER
  360.     JMP    MENU
  361. SPSP:    MVI    B,33H
  362.     CMP    B
  363.     JZ    SPECL
  364. DFL:    CALL    LEADIN
  365.     MVI    E,31H
  366.     CALL    PCHAR        ;6 LINES/INCH (DEFAULT)
  367.     JMP    MENU
  368. SPECL:    CALL    CLEAR        ;VARIABLE LINE SPACING
  369.     LXI    D,SPSPC
  370.     CALL    PRINT
  371.     LXI    D,SELMSG
  372.     CALL    PRINT
  373.     CALL    LEADIN
  374.     MVI    E,41H
  375.     CALL    PCHAR        ;SEND "A" TO PRINTER(ESC A)
  376.     LXI    H,SPCNG        ;ADDRESS OF CONSOLE BUFFER
  377.     MOV    D,H        ;PUT H & L IN 
  378.     MOV    E,L        ;D & E REGISTERS    
  379.     MVI    M,02        ;MAXIMUM BUFFER LENGTH - 2
  380.     INX    H        ;POINT TO CHARACTER COUNT BYTE
  381.     MVI    M,00        ;ZERO CHARCTER COUNT
  382. CHRSTR:    MVI    C,GSTR        ;CONSOLE BUFFER READ ROUTINE
  383.     CALL    BDOS        ;BDOS SERVICE CALL
  384. CKCHR:    LXI    H,SPCNG+1    ;THIS ROUTINE CHECKS INPUT IS IT 1 TO 85?
  385.     MOV    A,M        ;CHARACTER COUNTER
  386.     CPI    02H        ;TWO CHARACTERS?
  387.     INX    H
  388.     INX    H        ;POINT TO UNITS DIGIT
  389.     JZ    CTES        ;IF YES PROCESS TWO DIGITS
  390.     CPI    1        ;ONE CHARACTER?
  391.     JZ    SHIFT        ;IF YES SHIFT TENS TO UNIT POSITION
  392.     JMP    DEF        ;IF 0 SET DEFAULT
  393. CTES:    MOV    A,M        ;PUT UNITS DIGIT IN A
  394.      CALL    TEST        ;TEST IF IT IS IN THE RANGE 0 TO 9
  395. TENS:    DCX    H        ;POINT TO TENS DIGIT
  396.     MOV    A,M
  397.     CALL    BLANK
  398.     CALL    TEST        ;TEST FOR 0 TO 9
  399. CONV:    MOV    A,M        ;CONVERTS TENS INPUT TO HEX
  400.     ADD    A        ;2
  401.     ADD    A        ;4
  402.     ADD    M        ;5
  403.     ADD    A        ;10
  404.     INX    H        ;POINTS TO UNITS
  405.     ADD    M        ;CONVERSION COMPLETE
  406.     CPI    0        ;IS IT 0
  407.     JZ    DEF
  408.     CPI    86        ;IS IT >85
  409.     JNC    DEF
  410.     MOV    E,A
  411.     CALL    PCHAR        ;SEND SPACING TO PRINTER
  412.     JMP    MENU        ;DONE!
  413. ;
  414. BLANK:    CPI    20H        ;IS IT BLANK?
  415.     RNZ
  416.     MVI    A,30H        ;YES PUT AN ASCII 0 IN A
  417.     MOV    M,A        ;STORE IT
  418.     RET
  419. ;
  420. TEST:    SUI    30H        ;TEST FOR DIGIT
  421.     JC    DEF        ;<0
  422.     CPI    LF        
  423.     JNC    DEF        ;>9
  424.     MOV    M,A        ;STORE DIGIT
  425.     RET
  426. SHIFT:    DCX    H        ;POINT TO TENS DIGIT
  427.     MOV    A,M        ;MOVE IT TO ACCUMULATOR
  428.     MVI    M,30H        ;STORE ASCII 0 IN TENS
  429.     INX    H        ;POINT TO UNITS DIGIT
  430.     MOV    M,A        ;PUT TENS IN UNIT PLACE
  431.     JMP    CTES
  432. DEF:    POP    D
  433. DEFLT:     MVI    E,0CH
  434.     CALL    PCHAR        ;SEND 12/72 TO PRINTER 6 LINES/INCH
  435.     CALL    CLEAR
  436.     LXI    D,ERRMSG
  437.     CALL    PRINT
  438.     LXI    D,CNTMSG
  439.     CALL    PRINT
  440.     CALL    READ
  441.     JMP    MENU
  442. ;
  443. ;    SUBROUTINE "PRINT" A STRING
  444. ;    ON THE CONSOLE. STRING MUST
  445. ;    END WITH A $ SIGN
  446. ;    
  447. CLEAR:    LXI    D,CLS        ;CLEAR SCREEN FALL THRU TO PRINT
  448. PRINT:    PUSH    H        ;PRESERVE REGISTERS
  449.     PUSH    D
  450.     PUSH    B
  451.     PUSH    PSW
  452.     MVI    C,PSTR
  453.     CALL    BDOS
  454.     POP    PSW
  455.     POP    B
  456.     POP    D
  457.     POP    H
  458.     RET
  459. ;    
  460. ;    SUBROUTINE "READ" CHARACTER
  461. ;    FROM THE CONSOLE    
  462. ;    
  463. READ:    EQU    $        ;REGISTERS NOT SAVED
  464.     MVI    C,CONIN
  465.     CALL    BDOS        ;STORES THE CHARACTER IN A
  466.     RET
  467. ;
  468. ;    SUBROUTINE "PCHAR" LISTS A
  469. ;    CHARACTER ON THE PRINTER 
  470. ;    
  471. LEADIN:    MVI    E,ESC        ;FALL THRU TO PCHAR AND SEND ESC
  472. PCHAR:    PUSH    PSW
  473.     MVI    C,PRTR
  474.     CALL    BDOS
  475.     POP    PSW
  476.     RET
  477. ;
  478. ;    BUFFER STORAGE AND STACK
  479. ;
  480. SPCNG:    DS    4        ;STORES LINE SPACING
  481. OLDSTK:    DS    2
  482.     DS    60
  483. STACK:    EQU    $
  484. ;    
  485.     END
  486. ;
  487.