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 / CLOCKK / MDCLCK13.LBR / CADPRINT.AZM / CADPRINT.ASM
Assembly Source File  |  2000-06-30  |  8KB  |  367 lines

  1. ; Program to print screen dumps created by 'COCOCAD', a nice
  2. ; public domain program for the Radio Shack Color Computer used
  3. ; to generate schematics.
  4. ;                    Mike Allen 8/10/86
  5. ;
  6. ; Added OKI92 equate for Okidata ML-92/93 printers.
  7. ;                    John D. Osnes 10/3/86
  8.  
  9. NO    EQU    0
  10. YES    EQU    NOT NO
  11.  
  12. EPSON    EQU    YES        ; Epson mx80
  13. OKI92    EQU    NO        ; Okidata ml-92/93
  14.  
  15. WBOOT    EQU    0        ; Warm boot
  16. BDOS    EQU    5        ; Bdos call
  17. OPENF    EQU    0FH        ; Bdos open file
  18. SETDMA    EQU    1AH        ; Bdos set dma
  19. READSQ    EQU    14H        ; Bdos read sequental
  20. CLOSEF    EQU    10H        ; Bdos close file
  21. LSTOUT    EQU    5        ; Bdos list out
  22.  
  23. MAGIC    EQU    -7BH-256+1    ; Magic number for data offset
  24.  
  25. CR    EQU    0DH        ; Carrige return
  26. LF    EQU    0AH        ; Line feed
  27. ESC    EQU    1BH        ; Escape
  28. FF    EQU    0CH        ; Form feed
  29.  
  30.     ORG    100H
  31.  
  32.     LXI    H,0
  33.     DAD    SP
  34.     SHLD    OLDSP        ; Save old stack ptr
  35.     LXI    SP,STKTOP    ; Set local stack
  36.  
  37.      IF    EPSON
  38.     MVI    E,ESC        ; Put mx80 in 8/72 mode
  39.     CALL    LISTIT        ; Esc, 'A', 08h sequence
  40.     MVI    E,'A'
  41.     CALL    LISTIT
  42.     MVI    E,8
  43.     CALL    LISTIT
  44.     CALL    CRLF        ; Set mx80 for 8/72 per line
  45.      ENDIF            ; Epson
  46.  
  47.      IF    OKI92
  48.     MVI    E,18H        ; Set up oki92 printer
  49.     CALL    LISTIT        ; Reset (18h)
  50.     MVI    E,1CH        ; 12 cpi
  51.     CALL    LISTIT
  52.     MVI    E,0DH        ; Return carriage
  53.     CALL    LISTIT
  54.     MVI    E,03H        ; Graphic mode
  55.     CALL    LISTIT
  56.     LXI    B,468        ; Set up buffer for excess bits
  57.     LXI    H,EXCESS    ; (oki92 only prints 7 pixels/line,
  58.     SHLD    EXSPTR        ; instead of 8 pixels/line, so must
  59. INIOKI:    MVI    M,0        ; save excess bits for next line)
  60.     INX    H
  61.     DCX    B
  62.     MOV    A,B
  63.     ORA    C
  64.     JNZ    INIOKI
  65.      ENDIF            ; Oki92
  66.  
  67.     LXI    H,FCB0        ; Load up fcbs for first three files
  68.     SHLD    PTR1
  69.     LXI    H,FCB1
  70.     SHLD    PTR2
  71.     LXI    H,FCB2
  72.     SHLD    PTR3
  73.     CALL    BIGLOOP        ; Print them
  74.     LXI    H,FCB3        ; Load up fcbs for next three files
  75.     SHLD    PTR1
  76.     LXI    H,FCB4
  77.     SHLD    PTR2
  78.     LXI    H,FCB5
  79.     SHLD    PTR3
  80.     CALL    BIGLOOP        ; Print them
  81.     LXI    H,FCB6        ; Load up fcb for final three files
  82.     SHLD    PTR1
  83.     LXI    H,FCB7
  84.     SHLD    PTR2
  85.     LXI    H,FCB8
  86.     SHLD    PTR3
  87.     CALL    BIGLOOP        ; And print them
  88.  
  89.      IF    EPSON
  90.     MVI    E,ESC        ; Esc, 'A', 0Ch puts mx80 back
  91.     CALL    LISTIT        ; to 12/72 spacing
  92.     MVI    E,'A'
  93.     CALL    LISTIT
  94.     MVI    E,12
  95.     CALL    LISTIT        ; Restore line spacing
  96.     CALL    CRLF
  97.      ENDIF            ; Epson
  98.  
  99.      IF    OKI92
  100.     LXI    H,NSHIFT
  101.     MOV    A,M
  102.     CPI    7
  103.     MVI    C,1
  104.     CNZ    OKILL        ; Print excess bits, if any
  105.     MVI    E,03H        ; Reset oki92 printer
  106.     CALL    LISTIT        ; Exit graphic mode
  107.     MVI    E,02H
  108.     CALL    LISTIT
  109.     MVI    E,18H        ; Reset
  110.     CALL    LISTIT
  111.      ENDIF            ; Oki92
  112.  
  113.     MVI    E,FF
  114.     CALL    LISTIT        ; Send out a form feed
  115.  
  116. EXIT:    LHLD    OLDSP        ; Restore the stack
  117.     SPHL
  118.     RET            ; Return to ccp
  119.  
  120. CRLF:    MVI    E,CR        ; Sends cr/lf pair to printer
  121.     CALL    LISTIT
  122.     MVI    E,LF        ; Fall thru listit
  123.  
  124. LISTIT:    MVI    C,LSTOUT    ; Enter with character in e
  125.     JMP    BDOS        ; Bdos supplies the ret
  126.  
  127. OPENIT:    SHLD    TMPFCB        ; Open file - enter with fcb pointer in hl
  128.     XCHG            ; Put fcb pointer in de
  129.     MVI    C,OPENF
  130.     CALL    BDOS        ; Open it
  131.     INR    A
  132.     JZ    EXIT        ; Ff means bad open
  133.     RET
  134.  
  135. RDLOOP:    LHLD    TMPPTR        ; Pointer to dma area
  136.     XCHG            ; Into de
  137.     MVI    C,SETDMA
  138.     CALL    BDOS        ; Set dma area for read
  139.     LHLD    TMPPTR
  140.     LXI    D,128
  141.     DAD    D
  142.     SHLD    TMPPTR        ; Get ready for next read
  143.     LHLD    TMPFCB
  144.     XCHG
  145.     MVI    C,READSQ
  146.     CALL    BDOS        ; Read next record (or try to)
  147.     ORA    A
  148.     JZ    RDLOOP        ; Record was there, try for more
  149.  
  150.     LHLD    TMPPTR
  151.     LXI    D,-128
  152.     DAD    D
  153.     SHLD    TMPPTR        ; End of file - readjust pointer
  154.     LHLD    TMPFCB
  155.     XCHG
  156.     MVI    C,CLOSEF
  157.     CALL    BDOS        ; Close the file
  158.     INR    A
  159.     JZ    EXIT        ; Bad close
  160.     RET
  161.  
  162. LINELP:    MVI    B,156        ; Initialize character loop
  163.     PUSH    B        ; Save 'em
  164.     LHLD    TMPPTR
  165. CHRLP:    LXI    D,-32
  166.     DAD    D
  167.     XCHG
  168.     PUSH    D        ; Calculate new entry into table and save it
  169.     LDAX    D        ; Get char from data
  170.     CMA            ; Invert all bits
  171.  
  172.      IF    OKI92
  173.     MVI    D,8        ; Oki92 only prints 7 pixels/line, with
  174. REVRSE:    RAR            ; top pixel in least significant bit
  175.     MOV    B,A        ; Consequently, must first reverse the
  176.     MOV    A,C        ; order of the bits
  177.     RAL
  178.     MOV    C,A
  179.     MOV    A,B
  180.     DCR    D
  181.     JNZ    REVRSE
  182.     XRA    A        ; Then, shift so that any excess bits
  183. NSHIFT    EQU    $+1        ; from preceding lines are in least
  184.     MVI    D,7        ; significant bits (top of line) with
  185. SHIFT:    MOV    B,A        ; no pixel in the most significant
  186.     MOV    A,C        ; bit
  187.     RAR
  188.     MOV    C,A
  189.     MOV    A,B
  190.     RAR
  191.     DCR    D
  192.     JNZ    SHIFT
  193.     RAR
  194.     LHLD    EXSPTR
  195.     ORA    M
  196.     MOV    M,C        ; Store excess bits shifted out of
  197.     INX    H        ; current line for printing on next
  198.     SHLD    EXSPTR        ; line
  199.     CPI    03H
  200.     JNZ    OKILST
  201.     MOV    E,A
  202.     CALL    LISTIT
  203.     MVI    A,03H
  204. OKILST    EQU    $
  205.      ENDIF            ; Oki92
  206.  
  207.     MOV    E,A
  208.     CALL    LISTIT
  209.     POP    H        ; Put last entry point in hl
  210.     POP    B
  211.     DCR    B
  212.     PUSH    B        ; Decrement chr counter and save it
  213.     MOV    A,B
  214.     ORA    A
  215.     JNZ    CHRLP        ; Not done with line, so repeat
  216.     POP    B
  217.     RET
  218.  
  219. LOOP3:    MVI    C,30        ; Initialize line loop
  220. LOOPLN    EQU    $
  221.  
  222.      IF    EPSON
  223.     PUSH    B
  224.     MVI    E,ESC        ; Mx80 in lo-res, 468 points/line
  225.     CALL    LISTIT        ; Esc, 'K', (468 mod 256), (468 div 256)
  226.     MVI    E,'K'
  227.     CALL    LISTIT
  228.     MVI    E,212
  229.     CALL    LISTIT
  230.     MVI    E,1
  231.     CALL    LISTIT        ; Put mx-80 in lo-res graphics, 468 horiz pts.
  232.     POP    B
  233.      ENDIF            ; Epson
  234.  
  235.     LHLD    PTR3        ; Print 156 pts from 3rd active file
  236.     SHLD    TMPPTR
  237.     CALL    LINELP
  238.     LHLD    TMPPTR
  239.     INX    H
  240.     SHLD    PTR3
  241.     LHLD    PTR2        ; Print 156 pts from 2nd active file
  242.     SHLD    TMPPTR
  243.     CALL    LINELP
  244.     LHLD    TMPPTR
  245.     INX    H
  246.     SHLD    PTR2
  247.     LHLD    PTR1        ; Print 156 pts from 1st active file
  248.     SHLD    TMPPTR
  249.     CALL    LINELP
  250.     PUSH    B
  251.     LHLD    TMPPTR
  252.     INX    H
  253.     SHLD    PTR1
  254.  
  255.      IF    EPSON
  256.     CALL    CRLF        ; End of line, send cr/lf
  257.      ENDIF            ; Epson
  258.  
  259.      IF    OKI92
  260. OKCRLF:    MVI    E,03H        ; Graphic lf/cr for oki92 printer
  261.     CALL    LISTIT
  262.     MVI    E,0EH
  263.     CALL    LISTIT
  264.     LXI    H,EXCESS
  265.     SHLD    EXSPTR
  266.     LXI    H,NSHIFT
  267.     DCR    M
  268.     JNZ    NXTLIN
  269.     POP    B
  270. OKILL:    PUSH    B        ; Every 7 lines, there are 7 excess
  271.     MVI    M,8        ; bits shifted out of the preceding
  272.     LXI    B,468        ; line, so dump these bits to print
  273. EXSLIN:    PUSH    B        ; an 8th line
  274.     LHLD    EXSPTR
  275.     MOV    E,M
  276.     MVI    M,0
  277.     INX    H
  278.     SHLD    EXSPTR
  279.     MVI    A,03H
  280.     CMP    E
  281.     JNZ    EXSLN2
  282.     CALL    LISTIT
  283.     MVI    E,03H
  284. EXSLN2:    CALL    LISTIT
  285.     POP    B
  286.     DCX    B
  287.     MOV    A,B
  288.     ORA    C
  289.     JNZ    EXSLIN
  290.     JMP    OKCRLF
  291. NXTLIN    EQU    $
  292.      ENDIF            ; Oki92
  293.  
  294.     POP    B
  295.     DCR    C        ; Decrement line counter
  296.     JNZ    LOOPLN        ; Not done, so repeat
  297.     RET
  298.  
  299. BIGLOOP:LHLD    PTR1        ; Get fcb of 1st active file
  300.     CALL    OPENIT
  301.     LHLD    OLDPTR
  302.     SHLD    TMPPTR
  303.     CALL    RDLOOP
  304.     LHLD    TMPPTR
  305.     LXI    D,MAGIC
  306.     DAD    D
  307.     SHLD    PTR1
  308.     LHLD    PTR2        ; Get fcb of 2nd active file
  309.     CALL    OPENIT
  310.     CALL    RDLOOP
  311.     LHLD    TMPPTR
  312.     LXI    D,MAGIC
  313.     DAD    D
  314.     SHLD    PTR2
  315.     LHLD    PTR3        ; Get fcb of 3rd active file
  316.     CALL    OPENIT
  317.     CALL    RDLOOP
  318.     LHLD    TMPPTR
  319.     LXI    D,MAGIC
  320.     DAD    D
  321.     SHLD    PTR3
  322.     CALL    LOOP3        ; Print these three files
  323.     RET
  324.  
  325. FCB0:    DB    0,'PRT     PG0',0,0,0,0,0
  326.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  327. FCB1:    DB    0,'PRT     PG1',0,0,0,0,0
  328.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  329. FCB2:    DB    0,'PRT     PG2',0,0,0,0,0
  330.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  331. FCB3:    DB    0,'PRT     PG3',0,0,0,0,0
  332.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  333. FCB4:    DB    0,'PRT     PG4',0,0,0,0,0
  334.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  335. FCB5:    DB    0,'PRT     PG5',0,0,0,0,0
  336.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  337. FCB6:    DB    0,'PRT     PG6',0,0,0,0,0
  338.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  339. FCB7:    DB    0,'PRT     PG7',0,0,0,0,0
  340.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  341. FCB8:    DB    0,'PRT     PG8',0,0,0,0,0
  342.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  343. OLDPTR:    DW    BUFFER
  344.  
  345. OLDSP    EQU    $
  346. STKTOP    EQU    OLDSP+66    ; 32-level stack plus storage for
  347.                 ; user's stack pointer
  348. TMPPTR    EQU    STKTOP
  349. PTR1    EQU    TMPPTR+2
  350. PTR2    EQU    PTR1+2
  351. PTR3    EQU    PTR2+2
  352. TMPFCB    EQU    PTR3+2
  353.  
  354.      IF    EPSON
  355. FREESP    EQU    TMPFCB+2
  356.      ENDIF            ; Epson
  357.  
  358.      IF    OKI92
  359. EXSPTR    EQU    TMPFCB+2
  360. EXCESS    EQU    EXSPTR+2    ; Buffer for excess bits (468 bytes/line)
  361. FREESP    EQU    EXCESS+468
  362.      ENDIF            ; Oki92
  363.  
  364. BUFFER    EQU    FREESP
  365.  
  366.     END
  367. EQU    EXSPTR+2    ; Buffer for