home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol255 / kprint.mac < prev    next >
Encoding:
Text File  |  1986-03-22  |  8.7 KB  |  669 lines

  1. ;*********************************************
  2. ;*                                           *
  3. ;*   KPRINT        ver1.0                    *
  4. ;*                                           *
  5. ;*     for EPSON,STAR or etc dot printer     *
  6. ;*                                           *
  7. ;*      (source is a M80.COM base)           *
  8. ;*                                           *
  9. ;*       By Hiroshi Kitaguchi   20-Jan-1984  *
  10. ;*                                           *
  11. ;*********************************************
  12. ;
  13. ;
  14.     ASEG
  15.     ORG    100H
  16. ;
  17.     .Z80
  18. ;
  19. ;
  20. NLINE    EQU    57
  21. ;
  22. WBOOT    EQU    0
  23. BDOS    EQU    5
  24. FCB    EQU    5CH
  25. DMABUF    EQU    80H
  26. ;
  27. NUL    EQU    0
  28. BEL    EQU    7
  29. TAB    EQU    9
  30. LF    EQU    0AH
  31. FF    EQU    0CH
  32. CR    EQU    0DH
  33. SI    EQU    0FH
  34. DC2    EQU    12H
  35. EOF    EQU    1AH
  36. ;
  37. ;
  38. ;***** PRINT MAIN *****
  39. ;
  40. PRINT:    LD    SP,STK+32    ;Set stack pointer
  41.     XOR    A
  42.     LD    (PRFLG),A    ;PRFLG=0
  43.     LD    HL,FCB+1    ;Check FCB
  44.     LD    B,11
  45.     LD    C,0
  46. PRNT01:    LD    A,(HL)
  47.     OR    C
  48.     LD    C,A
  49.     DEC    B
  50.     JP    NZ,PRNT01
  51.     CP    ' '
  52.     JP    NZ,PRNT02
  53.     LD    HL,MOPN00    ;'No file name'
  54.     CALL    PRLINE
  55.     JP    WBOOT
  56. ;
  57. PRNT02:    LD    HL,MOPN01    ;'Start','Name'
  58.     CALL    PRLINE
  59.     CALL    PRNAME        ;Print file name
  60.     LD    HL,MOPN02    ;'Divice ?'
  61.     CALL    PRLINE
  62. PRNT03:    CALL    INCHN        ;Input character,not echo
  63.     CP    'L'
  64.     JP    Z,PRNT04
  65.     CP    CR
  66.     JP    Z,PRNT04
  67.     CP    'C'
  68.     JP    Z,PRNT05
  69.     LD    A,BEL        ;Input error
  70.     CALL    PROUT
  71.     JP    PRNT03
  72. ;
  73. PRNT04:    LD    A,1        ;1=LST
  74.     PUSH    AF
  75.     LD    HL,MLST        ;'LST'
  76.     JP    PRNT06
  77. ;
  78. PRNT05:    XOR    A        ;0=CON
  79.     PUSH    AF
  80.     LD    HL,MCON        ;'CON'
  81. PRNT06:    CALL    PRLINE
  82.     LD    HL,MOPN03    ;'Page ?'
  83.     CALL    PRLINE
  84.     CALL    SETPGQ        ;Set PAGEQ
  85.     POP    AF        ;A=PRFLG
  86.     PUSH    AF
  87.     CP    1
  88.     JP    NZ,PRNT14
  89.     LD    HL,MOPN04    ;'Size ?'
  90.     CALL    PRLINE
  91. PRNT07:    CALL    INCHN        ;Input character,not echo
  92.     CP    'P'
  93.     JP    Z,PRNT08
  94.     CP    CR
  95.     JP    Z,PRNT08
  96.     CP    'E'
  97.     JP    Z,PRNT09
  98.     LD    A,BEL        ;Input error
  99.     CALL    PROUT
  100.     JP    PRNT07
  101. ;
  102. PRNT08:    XOR    A        ;0=PICA
  103.     PUSH    AF
  104.     LD    HL,MPICA    ;'PICA'
  105.     JP    PRNT10
  106. ;
  107. PRNT09:    LD    A,1        ;1=ELITE
  108.     PUSH    AF
  109.     LD    HL,MELITE    ;'ELITE'
  110. PRNT10:    CALL    PRLINE
  111.     POP    AF
  112.     LD    (SIZE),A    ;SIZE flag set
  113.     LD    HL,MOPN05    ;'Ready ?'
  114.     CALL    PRLINE
  115. PRNT11:    CALL    INCHN        ;Input error,not echo
  116.     CP    'N'
  117.     JP    Z,PRNT12
  118.     CP    'Y'
  119.     JP    Z,PRNT13
  120.     CP    CR
  121.     JP    Z,PRNT13
  122.     LD    A,BEL        ;Input error
  123.     CALL    PROUT
  124.     JP    PRNT11
  125. ;
  126. PRNT12:    CALL    PROUT
  127.      JP    END
  128. ;
  129. PRNT13:    LD    A,'Y'
  130.     CALL    PROUT
  131. PRNT14:    POP    AF        ;A=PRFLG
  132.     LD    (PRFLG),A
  133.     LD    DE,FCB        ;File open
  134.     CALL    OPEN
  135.     JP    C,ERROR
  136.     LD    A,(PRFLG)
  137.     OR    A
  138.     JP    Z,PRNT16
  139.     LD    A,(SIZE)
  140.     OR    A
  141.     LD    A,SI        ;Send SI to LST
  142.     JP    NZ,PRNT15
  143.     LD    A,DC2        ;Send DC2 to LST
  144. PRNT15:    CALL    PROUT        ;Set PICA or ELITE
  145. PRNT16:    LD    A,(PAGEQ)    ;Print title ?
  146.     RLA
  147.     CALL    C,TITLE
  148.     CALL    PRPAGE
  149. PRNT17:    CALL    SEQRD
  150.     JP    C,ERROR
  151.     CP    FF
  152.     JP    Z,PRNT21
  153.     CP    EOF
  154.     JP    Z,END
  155.     CP    CR
  156.     JP    Z,PRNT20
  157.     CP    TAB
  158.     JP    NZ,PRNT19
  159.     LD    HL,CCOUNT
  160. PRNT18:    LD    A,' '
  161.     CALL    PROUT
  162.     LD    A,(HL)
  163.     AND    7        ;HTAB=8
  164.     JP    NZ,PRNT18
  165.     JP    PRNT17
  166. ;
  167. PRNT19:    CALL    PROUT
  168.     JP    PRNT17
  169. ;
  170. PRNT20:    LD    A,(LCOUNT)    ;NLINE lines/page
  171.     CP    NLINE-1
  172.     JP    Z,PRNT21
  173.     INC    A
  174.     LD    (LCOUNT),A
  175.     XOR    A
  176.     LD    (CCOUNT),A
  177.     LD    A,CR
  178.     CALL    PROUT
  179.     LD    C,11        ;CON STS
  180.     CALL    BDOS
  181.     OR    A
  182.     JP    Z,PRNT17
  183.     LD    C,6        ;Direct CONIN
  184.     LD    E,0FFH
  185.     CALL    BDOS
  186.     CP    3        ;^C ?
  187.     JP    Z,WBOOT
  188.     JP    PRNT17
  189. ;
  190. PRNT21:    LD    A,CR
  191.     CALL    PROUT
  192.     CALL    PRPAGE
  193.     JP    PRNT17
  194. ;
  195. ;
  196. ;***** SET PAGEQ *****
  197. ;
  198. SETPGQ:    CALL    SETCB        ;Set CONBUF
  199.     LD    A,(CONBUF+1)
  200.     OR    A
  201.     LD    A,0        ;PAGEQ=all 0 or 0FFH
  202.     JP    NZ,SPGQ01
  203.     CPL
  204. SPGQ01:    LD    HL,PAGEQ
  205.     LD    B,32
  206. SPGQ02:    LD    (HL),A
  207.     INC    HL
  208.     DEC    B
  209.     JP    NZ,SPGQ02
  210.     OR    A
  211.     RET    NZ
  212.     LD    HL,CONBUF+2
  213.     LD    (CBADR),HL
  214. SPGQ03:    CALL    SETNUM
  215.     CP    '-'
  216.     JP    NZ,SPGQ07
  217.     LD    A,(NUM)
  218.     LD    (BEGP),A
  219.     LD    A,(HL)
  220.     OR    A
  221.     JP    NZ,SPGQ04
  222.     DEC    A
  223.     LD    (NUM),A
  224.     INC    A
  225.     JP    SPGQ05
  226. ;
  227. SPGQ04:    CALL    SETNUM
  228. SPGQ05:    CALL    SEP
  229.     PUSH    AF
  230.     LD    A,(NUM)
  231. SPGQ06:    LD    (ENDP),A
  232.     CALL    SETPQB
  233.     POP    AF
  234.     OR    A
  235.     JP    NZ,SPGQ03
  236.     RET
  237. ;
  238. SPGQ07:    CALL    SEP
  239.     PUSH    AF
  240.     LD    A,(NUM)
  241.     LD    (BEGP),A
  242.     JP    SPGQ06
  243. ;
  244. ;
  245. ;***** Set bit in PAGEQ *****
  246. ;
  247. SETPQB:    LD    A,(BEGP)
  248.     LD    C,A
  249.     LD    A,(ENDP)
  250.     CP    C
  251.     JP    C,ERROR
  252. SPQB01:    LD    A,(BEGP)
  253.     RRA
  254.     RRA
  255.     RRA
  256.     AND    1FH
  257.     LD    E,A
  258.     LD    D,0        ;DE=(BEGP)/8
  259.     LD    HL,PAGEQ
  260.     ADD    HL,DE
  261.     LD    A,(BEGP)
  262.     AND    7
  263.     LD    B,A
  264.     INC    B
  265.     XOR    A        ;A=0
  266.     SCF            ;Carry=1
  267. SPQB02:    RRA
  268.     DEC    B
  269.     JP    NZ,SPQB02
  270.     OR    (HL)        ;A=bit set pattern
  271.     LD    (HL),A
  272.     LD    A,(BEGP)
  273.     LD    C,A
  274.     INC    A
  275.     LD    (BEGP),A
  276.     LD    A,(ENDP)
  277.     CP    C
  278.     JP    NZ,SPQB01
  279.     RET
  280. ;
  281. ;
  282. ;***** Separater *****
  283. ;
  284. SEP:    OR    A
  285.     RET    Z
  286.     CP    ' '
  287.     RET    Z
  288.     CP    ','
  289.     RET    Z
  290.     JP    ERROR
  291. ;
  292. ;
  293. ;***** Set CONBUF *****
  294. ;
  295. SETCB:    LD    DE,CONBUF
  296.     LD    C,10        ;Input line
  297.     CALL    BDOS
  298.     LD    HL,CONBUF+2
  299.     LD    A,(CONBUF+1)
  300.     LD    E,A        ;Set next=0
  301.     LD    D,0
  302.     ADD    HL,DE
  303.     XOR    A
  304.     LD    (HL),A
  305.     RET
  306. ;
  307. ;
  308. ;***** Number set *****
  309. ;
  310. SETNUM:    XOR    A
  311.     LD    (NUM),A
  312. SETN01:    CALL    INCBUF
  313.     RET    C
  314.     PUSH    AF
  315.     LD    A,(NUM)
  316.     ADD    A,A        ;(NUM)*10-->A
  317.     LD    C,A
  318.     ADD    A,A
  319.     ADD    A,A
  320.     ADD    A,C
  321.     LD    C,A
  322.     POP    AF
  323.     ADD    A,C
  324.     LD    (NUM),A
  325.     JP    SETN01
  326. ;
  327. ;
  328. ;***** Input CONBUF *****
  329. ;
  330. INCBUF:    LD    HL,(CBADR)
  331.     LD    A,(HL)
  332.     INC    HL
  333.     LD    (CBADR),HL
  334.     CP    '0'
  335.     RET    C
  336.     CP    '9'+1
  337.     CCF
  338.     RET    C
  339.     SUB    '0'
  340.     RET
  341. ;
  342. ;
  343. ;***** Print title *****
  344. ;
  345. TITLE:    LD    A,(PRFLG)
  346.     OR    A
  347.     RET    Z        ;PRFLG=0,no title
  348. ;
  349. ;+++++++++++++++++++++++++++;
  350. ;                           ;
  351. ;   future support          ;
  352. ;     print title program   ;
  353. ;                           ;
  354. ;         (page0 = title)   ;
  355. ;                           ;
  356. ;+++++++++++++++++++++++++++;
  357. ;
  358.     RET
  359. ;
  360. ;
  361. ;***** Print file name & page *****
  362. ;
  363. PRPAGE:    LD    A,(PCOUNT)
  364. PRPG01:    RRA
  365.     RRA
  366.     RRA
  367.     AND    1FH
  368.     LD    E,A
  369.     LD    D,0        ;DE=(PCOUNT)/8
  370.     LD    HL,PAGEQ
  371.     ADD    HL,DE
  372.     LD    A,(PCOUNT)
  373.     AND    7
  374.     LD    B,A
  375.     INC    B
  376.     XOR    A        ;A=0
  377.     SCF            ;Carry=1
  378. PRPG02:    RRA
  379.     DEC    B
  380.     JP    NZ,PRPG02
  381.     AND    (HL)        ;A=test bit pattern
  382.     JP    NZ,PRPG05
  383. PRPG03:    CALL    SEQRD
  384.     JP    C,ERROR
  385.     CP    FF
  386.     JP    Z,PRPG04
  387.     CP    EOF
  388.     JP    Z,END
  389.     CP    CR
  390.     JP    NZ,PRPG03
  391.     LD    A,(LCOUNT)
  392.     CP    NLINE-1
  393.     JP    Z,PRPG04
  394.     INC    A
  395.     LD    (LCOUNT),A
  396.     JP    PRPG03
  397. ;
  398. PRPG04:    XOR    A
  399.     LD    (LCOUNT),A
  400.     LD    A,(PCOUNT)
  401.     INC    A
  402.     LD    (PCOUNT),A
  403.     JP    PRPG01
  404. ;
  405. PRPG05:    LD    A,(PRFLG)
  406.     OR    A
  407.     JP    Z,PRPG06
  408.     LD    A,FF
  409.     CALL    PROUT        ;Top of form
  410.     JP    PRPG08
  411. ;
  412. PRPG06:    LD    B,6
  413. PRPG07:    LD    A,LF
  414.     CALL    PROUT
  415.     DEC    B
  416.     JP    NZ,PRPG07
  417. PRPG08:    LD    HL,MFILE
  418.     CALL    PRLINE
  419.     CALL    PRNAME
  420.     LD    HL,MPAGE
  421.     CALL    PRLINE
  422.     LD    A,(PCOUNT)
  423.     INC    A
  424.     LD    (PCOUNT),A
  425.     DEC    A
  426.     CALL    ADEC
  427.     LD    HL,DPAGE
  428.     LD    B,3
  429.     CALL    PRN
  430.     LD    A,CR
  431.     CALL    PROUT
  432.     LD    A,LF
  433.     CALL    PROUT
  434.     LD    A,LF
  435.     CALL    PROUT
  436.     XOR    A
  437.     LD    (LCOUNT),A
  438.     LD    (CCOUNT),A
  439.     RET
  440. ;
  441. ;
  442. ;***** Print file name *****
  443. ;
  444. PRNAME:    LD    HL,FCB+1
  445.     LD    B,8
  446.     CALL    PRN
  447.     LD    A,'.'
  448.     CALL    PROUT
  449.     LD    HL,FCB+9
  450.     LD    B,3
  451.     JP    PRN
  452. ;
  453. ;
  454. ;***** Print out *****
  455. ;
  456. PROUT:    PUSH    HL
  457.     PUSH    BC
  458.     PUSH    AF
  459.     LD    E,A
  460.     LD    C,2        ;CON OUT
  461.     LD    A,(PRFLG)
  462.     OR    A
  463.     JP    Z,POUT01
  464.     INC    C
  465.     INC    C
  466.     INC    C        ;LST OUT
  467. POUT01:    CALL    BDOS
  468.     POP    AF
  469.     CP    ' '
  470.     JP    C,POUT02
  471.     LD    HL,CCOUNT
  472.     INC    (HL)
  473. POUT02:    POP    BC
  474.     POP    HL
  475.     RET
  476. ;
  477. ;
  478. ;***** Print line *****
  479. ;
  480. PRLINE:    LD    A,(HL)
  481.     CP    '$'
  482.     RET    Z
  483.     CALL    PROUT
  484.     INC    HL
  485.     JP    PRLINE
  486. ;
  487. ;
  488. ;***** Print N character (N=B reg) *****
  489. ;
  490. PRN:    LD    A,(HL)
  491.     AND    7FH        ;Mask
  492.     CALL    PROUT
  493.     INC    HL
  494.     DEC    B
  495.     JP    NZ,PRN
  496.     RET
  497. ;
  498. ;
  499. ;***** Input character,not echo *****
  500. ;
  501. INCHN:    LD    E,0FFH
  502.     LD    C,6        ;Direct CON IN
  503.     CALL    BDOS
  504.     OR    A
  505.     JP    Z,INCHN
  506.     CP    3
  507.     JP    Z,WBOOT
  508.     CP    60H
  509.     RET    C
  510.     SUB    20H
  511.     RET
  512. ;
  513. ;
  514. ;***** A reg --> DEC ASCII (page) *****
  515. ;
  516. ADEC:    LD    HL,DPAGE
  517.     LD    C,100
  518.     CALL    CDEC
  519.     LD    C,10
  520.     CALL    CDEC
  521.     LD    C,1
  522.     CALL    CDEC
  523.     RET
  524. ;
  525. ;
  526. ;***** Change DEC (A-->HL) *****
  527. ;
  528. CDEC:    LD    (HL),'0'
  529. CDEC01:    SUB    C
  530.     JP    M,CDEC02
  531.     INC    (HL)
  532.     JP    CDEC01
  533. ;
  534. CDEC02:    ADD    A,C
  535.     INC    HL
  536.     RET
  537. ;
  538. ;
  539. ;***** End *****
  540. ;
  541. END:    LD    A,(PRFLG)
  542.     OR    A
  543.     LD    HL,MCRLF
  544.     JP    Z,END01
  545.     XOR    A
  546.     LD    (PRFLG),A    ;PRFLG=0
  547.     LD    HL,MEND
  548. END01:    CALL    PRLINE
  549.     JP    WBOOT
  550. ;
  551. ;
  552. ;***** Print 'Error' *****
  553. ;
  554. ERROR:    XOR    A
  555.     LD    (PRFLG),A    ;PRFLG=0
  556.     LD    HL,MERR
  557.     CALL    PRLINE
  558.     JP    WBOOT
  559. ;
  560. ;
  561. ;***** File open *****
  562. ;
  563. OPEN:    LD    C,15        ;File open
  564.     CALL    BDOS
  565.     CP    0FFH
  566.     JP    Z,OPEN01    ;File not found
  567.     XOR    A
  568.     RET
  569. ;
  570. OPEN01:    SCF
  571.     RET
  572. ;
  573. ;
  574. ;***** Sequential read *****
  575. ;
  576. SEQRD:    LD    HL,DMABUF+128
  577.     EX    DE,HL
  578.     LD    HL,(ADDR)
  579.     CALL    COMPHD
  580.     JP    Z,SQRD02
  581. SQRD01:    LD    A,(HL)
  582.     AND    7FH        ;Mask
  583.     INC    HL
  584.     LD    (ADDR),HL
  585.     OR    A
  586.     RET
  587. ;
  588. SQRD02:    LD    C,20        ;Seq read
  589.     LD    DE,FCB
  590.     CALL    BDOS
  591.     CP    0
  592.     JP    NZ,SQRD03    ;Error
  593.     LD    HL,DMABUF
  594.     LD    (ADDR),HL
  595.     JP    SQRD01
  596. ;
  597. SQRD03:    SCF
  598.     RET
  599. ;
  600. ;
  601. ;***** Compare HL,DE *****
  602. ;
  603. COMPHD:    LD    A,H
  604.     CP    D
  605.     RET    NZ
  606.     LD    A,L
  607.     CP    E
  608.     RET
  609. ;
  610. ;
  611. ;***** Message *****
  612. ;
  613. MOPN00:    DEFB    CR,LF,CR,LF,'No file name   Type >KPRINT filename.ext'
  614. MCRLF:    DEFB    CR,LF,CR,LF,'$'
  615. ;
  616. MOPN01:    DEFB    CR,LF,CR,LF,'+++++++ KPRINT start +++++++'
  617.     DEFB    CR,LF,'  ver1.0  by Hiroshi.K'
  618.     DEFB    CR,LF,CR,LF,'File name = $'
  619. ;
  620. MOPN02:    DEFB    CR,LF,'List device ? (LST or CON) = $'
  621. ;
  622. MOPN03:    DEFB    CR,LF,'Page ? (CR only:ALL) = $'
  623. ;
  624. MOPN04:    DEFB    CR,LF,'Caracter Size ? (PICA or ELITE) = $'
  625. ;
  626. MOPN05:    DEFB    CR,LF,'LST ready ? (Y or N) = $'
  627. ;
  628. MEND:    DEFB    CR,LF,CR,LF,'++++++++ KPRINT end ++++++++',CR,LF,'$'
  629. ;
  630. MFILE:    DEFB    CR,LF,'File: $'
  631. ;
  632. MPAGE:    DEFB    '     Page $'
  633. ;
  634. MLST:    DEFB    'LST$'
  635. ;
  636. MCON:    DEFB    'CON$'
  637. ;
  638. MPICA:    DEFB    'PICA$'
  639. ;
  640. MELITE:    DEFB    'ELITE$'
  641. ;
  642. MERR:    DEFB    CR,LF,CR,LF,'++++++++ Error end ++++++++',CR,LF,'$'
  643. ;
  644. ;
  645. ;***** Counter *****
  646. ;
  647. CCOUNT:    DEFB    0        ;Character count
  648. LCOUNT:    DEFB    0        ;Line count
  649. PCOUNT:    DEFB    1        ;Page count
  650. ;
  651. ;
  652. ;***** Work *****
  653. ;
  654. ADDR:    DEFW    100H        ;Pointer of disk buffer
  655. DPAGE:    DEFB    '000'        ;for PRPAGE
  656. PRFLG:    DEFB    0        ;0=CON,1=LST
  657. SIZE:    DEFB    0        ;0=PICA,1=ELITE
  658. CBADR:    DEFW    0        ;for Input CONBUF
  659. NUM:    DEFB    0        ;for Number set
  660. BEGP:    DEFB    0        ;Begin page
  661. ENDP:    DEFB    0        ;End page
  662. CONBUF:    DEFB    255        ;Console buffer
  663.     DEFS    257
  664. ;
  665. PAGEQ:    DEFS    32        ;Page map
  666. STK:    DEFS    32        ;Stack area
  667. ;
  668.     END
  669.