home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / laser / postprn.arc / POSTPRN.ASM < prev    next >
Assembly Source File  |  1989-06-16  |  6KB  |  404 lines

  1.     title    postprn
  2. ; History:374,1
  3.  
  4. ; Russ Nelson
  5. ;
  6. ; masm postprn;
  7. ; link postprn;
  8. ; exe2bin postprn.exe postprn.dvd
  9. ;
  10. ; DEVICE=postprn.dvd ( in config.sys)
  11. ;
  12.  
  13. DEBUG    equ    0
  14.  
  15. CR    equ    0dh
  16. LF    equ    0ah
  17.  
  18. transfer    equ    0
  19.  
  20. dqq    struc
  21. ofs    dw    ?
  22. seg    dw    ?
  23. dqq    ends
  24.  
  25. wqq    struc
  26. w    dw    ?
  27. wqq    ends
  28.  
  29. bqq    struc
  30. b    db    ?
  31. bqq    ends
  32.  
  33. rqq    struc
  34. len    db    ?
  35. unit    db    ?
  36. code    db    ?
  37. status    dw    ?
  38. q1    dd    ?
  39. q2    dd    ?
  40. mdesc    db    ?
  41. trans    dd    ?
  42. count    dw    ?
  43. rqq    ends
  44.  
  45. cseg    segment    byte
  46.     assume    cs:cseg
  47.     org    0
  48.  
  49. success    equ    0100h
  50. error    equ    8100h
  51. unk_cmd    equ    8103h
  52. busy    equ    0300h
  53.  
  54. land_header    label    near
  55.     dw    land2_header
  56.     dw    0
  57.     dw    8800h            ;we support Open/Close/RM.
  58.     dw    strat
  59.     dw    land
  60.     db    'PRNLAND '
  61.  
  62. land2_header    label    near
  63.     dw    land4_header
  64.     dw    0
  65.     dw    8800h            ;we support Open/Close/RM.
  66.     dw    strat
  67.     dw    land2
  68.     db    'PRNLAND2'
  69.  
  70. land4_header    label    near
  71.     dw    port_header
  72.     dw    0
  73.     dw    8800h            ;we support Open/Close/RM.
  74.     dw    strat
  75.     dw    land4
  76.     db    'PRNLAND4'
  77.  
  78. port_header    label    near
  79.     dw    port2_header
  80.     dw    0
  81.     dw    8800h            ;we support Open/Close/RM.
  82.     dw    strat
  83.     dw    port
  84.     db    'PRNPORT '
  85.  
  86. port2_header    label    near
  87.     dw    port4_header
  88.     dw    0
  89.     dw    8800h            ;we support Open/Close/RM.
  90.     dw    strat
  91.     dw    port2
  92.     db    'PRNPORT2'
  93.  
  94. port4_header    label    near
  95.     dd    -1
  96.     dw    8800h            ;we support Open/Close/RM.
  97.     dw    strat
  98.     dw    port4
  99.     db    'PRNPORT4'
  100.  
  101. ;currently, we only print to printer zero (lpt1 aka prn).
  102. ;this could be made a user option.
  103. printer    dw    0            ;which printer to print to.
  104.  
  105. prolog_ptr    dw    ?
  106.  
  107. just_opened    db    0
  108.  
  109. req    dd    ?
  110.  
  111. land_prolog    label    byte
  112.   if DEBUG
  113.     db    '%% land',CR,LF
  114.   else
  115.     include    land.inc
  116.   endif
  117.     db    0
  118. land2_prolog    label    byte
  119.   if DEBUG
  120.     db    '%% land2',CR,LF
  121.   else
  122.     include    land2.inc
  123.   endif
  124.     db    0
  125. land4_prolog    label    byte
  126.   if DEBUG
  127.     db    '%% land4',CR,LF
  128.   else
  129.     include    land4.inc
  130.   endif
  131.     db    0
  132. port_prolog    label    byte
  133.   if DEBUG
  134.     db    '%% port',CR,LF
  135.   else
  136.     include    port.inc
  137.   endif
  138.     db    0
  139. port2_prolog    label    byte
  140.   if DEBUG
  141.     db    '%% port2',CR,LF
  142.   else
  143.     include    port2.inc
  144.   endif
  145.     db    0
  146. port4_prolog    label    byte
  147.   if DEBUG
  148.     db    '%% port4',CR,LF
  149.   else
  150.     include    port4.inc
  151.   endif
  152.     db    0
  153.  
  154. showline_prolog    label    byte
  155.   if DEBUG
  156.     db    '%% showline',CR,LF
  157.   else
  158.     include    showline.inc
  159.   endif
  160.     db    0
  161.  
  162. cmd_table    label    word
  163.     dw    cmd_init
  164.     dw    cmd_success
  165.     dw    cmd_success
  166.     dw    cmd_unk
  167.     dw    cmd_success
  168.     dw    cmd_busy
  169.     dw    cmd_success
  170.     dw    cmd_success
  171.     dw    cmd_output
  172.     dw    cmd_output
  173.     dw    cmd_output_status
  174.     dw    cmd_unk
  175.     dw    cmd_unk
  176.     dw    cmd_open
  177.     dw    cmd_close
  178.     dw    cmd_success
  179.  
  180. strat:
  181.     mov    cs:[req].ofs,bx
  182.     mov    cs:[req].seg,es
  183.     retf
  184.  
  185. land:
  186.     mov    cs:prolog_ptr,offset land_prolog
  187.     jmp    short intr
  188.  
  189. land2:
  190.     mov    cs:prolog_ptr,offset land2_prolog
  191.     jmp    short intr
  192.  
  193. land4:
  194.     mov    cs:prolog_ptr,offset land4_prolog
  195.     jmp    short intr
  196.  
  197. port:
  198.     mov    cs:prolog_ptr,offset port_prolog
  199.     jmp    short intr
  200.  
  201. port2:
  202.     mov    cs:prolog_ptr,offset port2_prolog
  203.     jmp    short intr
  204.  
  205. port4:
  206.     mov    cs:prolog_ptr,offset port4_prolog
  207.     jmp    short intr
  208.  
  209.  
  210. intr:
  211.     push    ds
  212.     push    es
  213.     push    ax
  214.     push    bx
  215.     push    cx
  216.     push    dx
  217.     push    di
  218.     push    si
  219.     mov    ax,cs
  220.     mov    ds,ax
  221.     les    bx,cs:req
  222.     mov    al,es:[bx].code
  223.     mov    ah,0
  224.     shl    ax,1
  225.     mov    si,ax
  226.  
  227.     call    cmd_table[si]
  228.  
  229.     les    bx,cs:req
  230.     mov    es:[bx].status,ax
  231.     pop    si
  232.     pop    di
  233.     pop    dx
  234.     pop    cx
  235.     pop    bx
  236.     pop    ax
  237.     pop    es
  238.     pop    ds
  239.     retf
  240.  
  241. cmd_success:
  242.     mov    ax,success
  243.     ret
  244.  
  245. cmd_busy:
  246.     mov    ax,busy
  247.     ret
  248.  
  249. cmd_unk:
  250.     mov    ax,unk_cmd
  251.     ret
  252.  
  253. cmd_output:
  254.     cmp    just_opened,0        ;did we just open it?
  255.     je    cmd_output_1
  256.     mov    just_opened,0
  257.     call    write_prolog
  258. cmd_output_1:
  259.     les    bx,cs:req
  260.     mov    cx,es:[bx].count
  261.     lds    si,es:[bx].trans
  262.     mov    dx,cs:printer
  263. output_loop:
  264.     lodsb
  265.     call    chrout
  266.     jc    output_error
  267.     loop    output_loop
  268.     ret
  269. output_error:
  270.     les    bx,cs:req
  271.     sub    es:[bx].count,cx
  272.     ret
  273.  
  274.  
  275. cmd_close:
  276.     cmp    just_opened,1        ;don't bother if we haven't
  277.     je    cmd_close_1        ;  sent anything.
  278.     mov    dx,cs:printer
  279.     mov    al,'D'-40h
  280.     call    chrout
  281. cmd_close_1:
  282.     ret
  283.  
  284.  
  285. cmd_open:
  286.     mov    just_opened,1
  287.     mov    ax,success
  288.     ret
  289.  
  290.  
  291. write_prolog:
  292.     mov    si,offset showline_prolog
  293.     call    write_string
  294.     jc    write_string_1
  295.     mov    si,prolog_ptr
  296. write_string:
  297.     mov    dx,cs:printer
  298. write_string_2:
  299.     lodsb
  300.     or    al,al
  301.     je    write_string_1
  302.     call    chrout
  303.     jnc    write_string_2
  304. write_string_1:
  305.     ret
  306.  
  307.  
  308. chrout:
  309. ;enter with dx = printer number, al = character to print.
  310. ;return cy if we failed to print the character, nc if we printed it,
  311. ;  ax = status.
  312.     mov    bl,0
  313. chrout_1:
  314.     mov    ah,0
  315.     int    17h
  316.     mov    bh,al
  317.     call    status_check
  318.     jnc    chrout_3
  319.     xor    bl,1
  320.     je    chrout_2
  321.     mov    al,bh
  322.     jmp    chrout_1
  323. chrout_3:
  324.     mov    ax,success
  325.     clc
  326.     ret
  327. chrout_2:
  328.     mov    ah,80h
  329.     stc
  330.     ret
  331.  
  332.  
  333. cmd_output_status:
  334.     mov    dx,cs:printer
  335.     mov    ah,2
  336.     int    17h
  337.     call    status_check
  338.     jc    buffer_error
  339.     test    ah,80h
  340.     jz    buffer_busy
  341.     mov    ax,success
  342.     ret
  343. buffer_error:
  344.     mov    ah,80h
  345.     ret
  346. buffer_busy:
  347.     mov    ax,busy
  348.     ret
  349.  
  350.  
  351. status_check:
  352.     mov    al,02h
  353.     test    ah,01h
  354.     jnz    status_bad
  355.     mov    al,0ah
  356.     test    ah,08h
  357.     jz    status_ok
  358.     test    ah,20h
  359.     jz    status_bad
  360.     mov    al,09h
  361. status_bad:
  362.     stc
  363.     ret
  364. status_ok:
  365.     clc
  366.     ret
  367.  
  368.  
  369.     public    last_code
  370. last_code    label    near
  371.  
  372. cmd_init:
  373.     mov    ah,30h            ;get the dos version number
  374.     int    21h
  375.     cmp    al,3            ;if less than 3, we're hosed.
  376.     jae    cmd_init_2
  377.     mov    ah,9
  378.     mov    dx,offset version    ;tell them that we're hosed,
  379.     int    21h
  380.     mov    ax,0            ;  and don't install ourselves.
  381.     jmp    short cmd_init_3
  382. cmd_init_2:
  383.     cmp    cs:prolog_ptr,offset port4_prolog;only print the banner on
  384.     jne    cmd_init_1        ;the last device to be initialized.
  385.     mov    ah,9
  386.     mov    dx,offset banner
  387.     int    21h
  388. cmd_init_1:
  389.     mov    ax,offset last_code    ;tell dos where our last resident code is.
  390. cmd_init_3:
  391.     les    bx,cs:[req]        ;return the end of our code.
  392.     mov    es:[bx].trans.ofs,ax
  393.     mov    es:[bx].trans.seg,cs
  394.     mov    ax,success
  395.     ret
  396.  
  397.  
  398. banner    db    'Postprn version .9 has been loaded.',13,10,'$'
  399. version    db    'Postprn requires MS-DOS 3.x.',13,10,'$'
  400.  
  401. cseg    ends
  402.  
  403.     end
  404.