home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol135 / itoh5000.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  7.6 KB  |  367 lines

  1. *******************************************************
  2. *                              *
  3. *        CITOH GRAPHICS PRINTER DRIVER          *
  4. *                              *
  5. *       USING ONLY THE TOP 4 PRINT PINS          *
  6. *                              *
  7. *        (Configured for the Sorcerer)          *
  8. *                              *
  9. *      Written by William King (November,1982)          *
  10. *                              *
  11. *******************************************************
  12.  
  13.  
  14. ;  History
  15. ;  -------
  16. ;     The original driver program was written using 8-
  17. ;  bit data with a suitable cable to the printer.  This
  18. ;  seemingly obvious exploit lead to a friend's printer
  19. ;  and my own printer breaking down beyond repair (I
  20. ;  don't know why, nor did the printer repair people,
  21. ;  very expensive).  This prompted me to write a driver
  22. ;  that used 7 bit data or less.  This driver uses only
  23. ;  the top 4 print pins (but still sending 7 bit data).
  24. ;  Thus there are NO hardware mods required (i.e. the
  25. ;  original print cable and settings may be used.
  26. ;
  27. ;  Use
  28. ;  ---
  29. ;     The main driver routine may be called as a sub.
  30. ;  by calling BASEAD+0 (i.e. 5000h in this case).
  31. ;     The video output may be set to BASEAD+0 so all
  32. ;  graphics data + text is printed 4 dot lines at a
  33. ;  time (i.e. for Sorcerer SE O=5000 from monitor)
  34. ;     The screen may be dumped to the printer as is by
  35. ;  calling the routine at BASEAD+100h (i.e. 5100h in
  36. ;  this case - note that it should be called via a
  37. ;  program rather than direct running from moitor so as
  38. ;  to preserve the entire screen display)
  39. ;
  40. ;  Cable
  41. ;  -----
  42. ;     Use the cable normally used for printing ASCII
  43. ;  data (NO need for a special cable)
  44. ;
  45. ;  Changes
  46. ;  -------
  47. ;     The program may be reconfigured for other
  48. ;  printers and other computers taking special note of
  49. ;  the following points :
  50. ;    (1) Alter line feed pitch code sequence at LFDATA
  51. ;    (2) Alter here comes 8 data bytes for graphics
  52. ;     code at GDATA
  53. ;    (3) Alter screen width at SWIDTH
  54. ;    (4) Alter # of lines on screen at LINES
  55. ;    (5) Alter start address of screen at SCRTOP
  56. ;    (6) Alter monitor equates as required
  57.  
  58.  
  59. *  MONITOR EQUATES  *
  60.  
  61.  
  62. VIDEO:    EQU    0E01BH          ;VIDEO OUTPUT
  63. KEYIN:    EQU    0E009H          ;GET A KEY ROUTINE
  64. MONWRM: EQU    0E003H          ;MONITOR WARM START
  65.  
  66.  
  67. *  HARDWARE EQUATES  *
  68.  
  69.  
  70. PWIDTH: EQU    80          ;PRINTER WIDTH (SO IF NO
  71.                   ; <CR> HAS COME, BUFFER
  72.                   ; WILL NOT OVERFLOW !)
  73. SWIDTH: EQU    64          ;SCREEN WIDTH (FOR SCREEN
  74.                   ; DUMP)
  75. LINES:    EQU    30          ;# OF LINES ON SCREEN
  76. SCRTOP: EQU    0F080H          ;ADDR OF TOP OF SCREEN
  77. ASCLOW: EQU    0F800H          ;LOWEST ASCII CHARACTER
  78.                   ; ADDRESS
  79.  
  80.  
  81. BASEAD: EQU    05000H          ;BASE ADDRESS OF DRIVER
  82.  
  83.  
  84.     ORG    BASEAD          ;SET BASE ADDR OF DRIVER
  85.  
  86.  
  87. START:    JR    POUT1-$          ;PAST SUBROUTINES
  88.  
  89.  
  90. *  PRINTER DRIVER ROUTINE  *
  91.  
  92.  
  93. DRIVE:    PUSH    AF
  94.     PUSH    AF
  95.  
  96. DR1:    IN    A,(0FFH)
  97.     BIT    7,A
  98.     JR    NZ,DR1-$
  99.  
  100.     POP    AF
  101.  
  102.     OR    080H
  103.     OUT    (0FFH),A
  104.     AND    07FH
  105.     OUT    (0FFH),A
  106.     OR    080H
  107.     OUT    (0FFH),A
  108.  
  109.     POP    AF
  110.     RET
  111.  
  112.  
  113. *  SENDS DATA FOLLOWING THE CALL,TO PRINTER  *
  114.  
  115.  
  116. DATA:    POP    HL          ;FIRST BYTE OF DATA
  117.  
  118. DAT1:    LD    A,(HL)          ;GET DATA
  119.     OR    A          ;LAST BYTE?
  120.     JR    Z,DAT2-$      ;YES,THEN BACK
  121.     CALL    DRIVE          ;NO,THEN SEND BYTE TO PRT
  122.     INC    HL          ;NEXT BYTE
  123.     JR    DAT1-$          ;KEEP GOING
  124.  
  125. DAT2:    INC    HL          ;NEXT BYTE
  126.     JP    (HL)          ;JUMP THERE
  127.  
  128.  
  129. *  MAIN PROGRAM     *
  130.  
  131.  
  132. POUT1:    CALL    VIDEO          ;CHAR TO SCREEN
  133.  
  134. POUT2:    PUSH    HL
  135.     PUSH    DE
  136.     PUSH    BC
  137.     PUSH    AF
  138.  
  139.     CP    ' '          ;CHAR >= SPACE?
  140.     JR    NC,COUNT-$    ;YES,THEN COUNT HOW MANY
  141.     CP    00DH          ;<CR>?
  142.     JR    Z,COUNT-$     ;YES,THEN DO THAT TOO!
  143.     CP    00AH          ;LF?
  144.     JR    Z,END-$          ;YES,THEN DO NOTHING
  145.     CP    00CH          ;CLEAR SCREEN?
  146.     JR    Z,END-$          ;YES,THEN DO NOTHING
  147.  
  148.     CALL    DRIVE          ;SEND CONTROL CHAR
  149.  
  150. END:    POP    AF
  151.     POP    BC
  152.     POP    DE
  153.     POP    HL
  154.  
  155.     RET
  156.  
  157.  
  158. COUNT:    CP    00DH          ;IS IT A <CR>?
  159.     JR    Z,PRINT-$     ;YES,THEN DO THE LINE
  160.  
  161.     LD    B,A          ;SAVE THE CHAR
  162.     LD    A,(BUFCNT)    ;GET NUMB. CHARS IN BUFF.
  163.     LD    E,A          ;GET TO E
  164.     LD    D,00
  165.     LD    HL,BUFFER     ;START OF BUFFER
  166.     ADD    HL,DE          ;WHERE CHAR MUST GO
  167.     LD    (HL),B          ;PUT CHAR IN BUFFER
  168.     INC    A          ;COUNT = COUNT + 1
  169.     LD    (BUFCNT),A    ;SAVE IT BACK
  170.     CP    PWIDTH          ;COUNT >= PRINTER WIDTH?
  171.     JR    C,END-$          ;NO,THEN BACK TO CALLER
  172.  
  173. PRINT:    CALL    DATA          ;SEND FOLLOWING DATA
  174.  
  175. LFDATA: DB    01BH,054H,'08';LF PITCH = 8/144"
  176.     DB    01BH,051H     ;COMPRESSED PRINT !!
  177.     DB    000H          ;END CODE
  178.  
  179.     XOR    A          ;CLEAR:
  180.     LD    (FLAG),A      ;         FIRST PASS FLAG
  181.  
  182. PASS1:    LD    A,(BUFCNT)    ;GET BUFFER COUNTER
  183.     OR    A          ;NO CHARS TO DO?
  184.     JR    Z,CR1-$          ;YES,THEN JUST SEND <CR>
  185.  
  186.     LD    B,A          ;GET COUNT TO B
  187.     LD    HL,BUFFER     ;POINTER TO START OF BUFF
  188.  
  189. PASS2:    LD    A,(HL)          ;GET A CHAR
  190.  
  191.     CALL    BITS          ;DO TOP OR BOT. BITS
  192.  
  193.     INC    HL
  194.  
  195.     DJNZ    PASS2-$          ;SEND THEM OUT TILL DONE
  196.  
  197.     LD    A,(FLAG)      ;GET FLAG
  198.     OR    A          ;FINISHED?
  199.     JR    NZ,CR2-$      ;YES,THEN DO A <CR>
  200.  
  201.     CPL              ;SET FLAG TO A NZ VALUE
  202.     LD    (FLAG),A      ;SAVE FLAG BACK
  203.  
  204.     LD    A,0DH          ;SEND A CR TO END LINE
  205.     CALL    DRIVE
  206.  
  207.     JR    PASS1-$          ;DO SECOND PASS
  208.  
  209. CR1:    LD    A,00DH          ;SEND A <CR>
  210.     CALL    DRIVE
  211.  
  212. CR2:    LD    A,00DH          ;SEND A <CR>
  213.     CALL    DRIVE
  214.  
  215.     XOR    A          ;CLEAR:
  216.     LD    (BUFCNT),A    ;         BUFFER COUNT
  217.     LD    (FLAG),A      ;         PASS FLAG
  218.  
  219.     JP    END          ;BACK TO CALLER
  220.  
  221.  
  222. *  ROUTINE TO ROTATE CHARACTER IN REGISTER A     *
  223. *  THEN SEND OUT HIGH OR LOW 4 BITS (TOP 4 PINS     *
  224. *  ON PRINTER),THUS ONLY USING THE TOP 4 PINS     *
  225.  
  226.  
  227. BITS:    PUSH    HL
  228.     PUSH    BC
  229.     PUSH    AF
  230.  
  231.     PUSH    AF
  232.  
  233.     CALL    DATA          ;SEND OUT FOLLOWING DATA
  234.  
  235. GDATA:    DB    01BH,053H,'0008'  ;"HERE COMES 8 GRAPH.
  236.     DB    000H          ; DATA BYTES"
  237.  
  238.     POP    AF
  239.  
  240. BIT1:    LD    L,A          ;GET CHAR TO L
  241.     LD    H,00          ;CLEAR H
  242.     ADD    HL,HL
  243.     ADD    HL,HL
  244.     ADD    HL,HL          ;* 8
  245.     LD    DE,ASCLOW     ;LOWEST ASCII CHAR ADDR.
  246.     ADD    HL,DE          ;GET ADDRESS OF CHAR
  247.  
  248.     PUSH    HL          ;SAVE ADDRESS
  249.     LD    C,080H          ;BIT 7 SET
  250.     PUSH    BC          ;SAVE MASK
  251.  
  252. BIT2:    LD    E,00          ;CLEAR E (RESULT IN HERE)
  253.     LD    B,001H          ;SET BIT 1
  254.  
  255. BIT3:    LD    A,(HL)          ;GET CHARACTER DATA
  256.     AND    C          ;MASK OUT ALL OTHER BITS
  257.     JR    Z,BIT4-$      ;NO BIT SET,THEN PAST
  258.  
  259.     LD    A,E          ;GET ANSWER
  260.     OR    B          ;SET THE CORRECT BIT
  261.     LD    E,A          ;SAVE RESULT
  262.  
  263. BIT4:    RL    B          ;SET NEXT BIT ON LEFT
  264.     INC    HL          ;POINT TO NEXT DATA BYTE
  265.     LD    A,B
  266.     OR    A          ;FINISHED THIS VERT. LINE
  267.     JR    NZ,BIT3-$     ;NO,THEN DO 8 BITS TOTAL
  268.  
  269.     LD    A,(FLAG)      ;FLAG ZERO=LOWER 4 BITS
  270.     OR    A          ;ZERO?
  271.     LD    A,E          ;GET DATA TO A
  272.     JR    NZ,BIT5-$     ;NO, MUST BE UPPER 4 BITS
  273.  
  274.     AND    00FH          ;ZERO,THEN KEEP LOW BITS
  275.     JR    BIT6-$          ;JUMP
  276.  
  277. BIT5:    AND    0F0H          ;NONZERO,THEN KEEP HIGH 4
  278.     SRL    A
  279.     SRL    A
  280.     SRL    A
  281.     SRL    A          ;MOVE HIGH 4 -> LOW 4
  282.  
  283. BIT6:    CALL    DRIVE          ;SEND OUT DATA
  284.  
  285.     POP    BC          ;GET MASK BACK
  286.     RR    C          ;SHIFT BITS TO RIGHT
  287.     POP    HL          ;GET ADDRESS BACK
  288.     PUSH    HL
  289.     PUSH    BC
  290.     LD    A,C          ;GET MASK
  291.     OR    A          ;DONE 8 TIMES?
  292.     JR    NZ,BIT2-$     ;NO,THEN KEEP GOING
  293.  
  294.     POP    BC          ;RESTORE PUSHES/POPS
  295.     POP    HL
  296.  
  297.     POP    AF
  298.     POP    BC
  299.     POP    HL
  300.  
  301.     RET              ;RETURN TO CALLER
  302.  
  303.  
  304. *  SCREEN DUMP ROUTINE    *
  305.  
  306.  
  307.     ORG    BASEAD+100H   ;NEED EVEN ADDRESS
  308.  
  309.  
  310. BEGIN:    LD    B,01          ;NO. OF COPIES
  311.  
  312. BEG1:    CALL    SCREEN          ;DO ONE COPY
  313.  
  314. BEG2:    CALL    KEYIN          ;KEYSCAN
  315.     CP    'P'          ;"P"?
  316.     JR    NZ,BEG2-$     ;NO,THEN WAIT
  317.  
  318.     DJNZ    BEG1-$          ;DO TILL COPIES=0
  319.  
  320.     JP    MONWRM          ;BACK TO MONITOR
  321.  
  322.  
  323. SCREEN: PUSH    HL
  324.     PUSH    BC
  325.     PUSH    AF
  326.  
  327.     LD    HL,SCRTOP     ;TOP OF SCREEN
  328.  
  329.     LD    C,LINES          ;# OF LINES ON SCREEN
  330.  
  331.     XOR    A          ;CLEAR:
  332.     LD    (BUFCNT),A    ;         PRINT BUF COUNT
  333.  
  334. SCRN1:    LD    B,SWIDTH      ;WIDTH OF SCREEN
  335.  
  336. SCRN2:    LD    A,(HL)          ;GET CHAR
  337.     CALL    POUT2          ;SEND CHAR TO PRINTER
  338.     INC    HL
  339.     DJNZ    SCRN2-$
  340.  
  341.     LD    A,00DH          ;<CR>
  342.     CALL    POUT2          ;SEND <CR> TO PRINTER
  343.  
  344.     DEC    C          ;DEC # OF LINES
  345.     LD    A,C          ;GET # OF LINES TO A
  346.     OR    A          ;END YET?
  347.     JR    NZ,SCRN1-$    ;NO,THEN DO ANOTHER LINE
  348.  
  349.     POP    AF
  350.     POP    BC
  351.     POP    HL
  352.  
  353.     RET              ;BACK TO COUNTING ROUT.
  354.  
  355.  
  356. *  DATA AREA  *
  357.  
  358.  
  359. BUFCNT: DEFS    1          ;BYTE COUNTER (IN BUFF)
  360. FLAG:    DEFS    1          ;PASS FLAG
  361.  
  362.  
  363. BUFFER: DB    00          ;SPACE FOR BUFFER
  364.  
  365.  
  366.     END
  367.