home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / printer / spool.arc / BUFFERP.ASM next >
Assembly Source File  |  1985-08-09  |  15KB  |  730 lines

  1. ; PRINT control program
  2.  
  3.     page 60,132
  4.  
  5. ;Routines
  6.  
  7.     public    begin,s1,baddevice,b1,do_menu,b2,b23,test_end,exit8
  8.     public    clear_the_buffer,b245,b25,change_priority,b26,b265,b27
  9.     public    change_port,b3,b35,b4,exit9,lpt1,b5,lpt2,b6,lpt3,com1,com2
  10.     public    this_prn_not_avaliable,termin_ate,set_pause,get_query,no_pause
  11.     public    printbxcxdx,p1,p2,p3,p4,p5,bin2dec,repeat3,ioctl,ioctl_ret
  12.     public    get_port_address,g1,print_port,com,lpt,com_one,com_two,lpt_one
  13.     public    lpt_two,lpt_three,error3,ascbin,ab1,ab2
  14.     public    ab25,ab3,ab4,ab5,ab6
  15.  
  16. ;Variables
  17.  
  18.     public    header,not_installed,not_valid_port,pause_on,line1,line2,line3
  19.     public    line4,menu,number,port_menu,not_avaliable,pause_on_q
  20.     public    pause_off_q,buffer_cleared,new_port,lpt1_mess,lpt2_mess
  21.     public    lpt3_mess,com1_mess,com2_mess,new_priority,nothing_done
  22.     public    you_sure,crlf,space,not_valid_number,port_number,port_type
  23.     public    buffer_size,characters_in_buffer,priority,pause_flag
  24.     public    scratch,ioctl_buff,handle
  25.  
  26. code    segment
  27.     assume cs:code, ds:code, es:code, ss:code
  28.  
  29. keyboard_no_echo equ    8        ; msdos function call equates
  30. display_char    equ    2
  31. display_string    equ    9
  32. terminate    equ    4ch
  33.  
  34. cr            equ    0dh
  35. lf            equ    0ah
  36.  
  37. ;    Version 2.1    : By Craig Derouen. Change communications input from
  38. ;    3/20/85        : software interrupt to ioctl calls to make better
  39. ;            : compatability with other programs.
  40. ;    Version 2.2    : By Craig Derouen. Add printer pause feature
  41. ;    4/4/85
  42.  
  43.     org 100h
  44. begin:
  45.     jmp s1
  46. ; data
  47. header        db "BUFFER PRINT control program. Version 2.2",cr,lf,lf,"$"
  48. not_installed    db "FLASH PRINT is not installed.",cr,lf,"$"
  49. not_valid_port    db "The output port does not exist",cr,lf,"$"
  50. pause_on    db cr,lf,"The printer output is paused right now",cr,lf,"$"
  51. line1        db "The number of characters in the buffer: $"
  52. line2        db "The size of the buffer in characters: $"
  53. line3        db "The port being used with the printer: $"
  54. line4        db "The priority of the printer (1 lowest, 200 highest): $"
  55. menu        db cr,lf,"Choose the number of one of the following command options.",cr,lf
  56.         db "1.) Clear the buffer",cr,lf
  57.         db "2.) Change the port to use with the printer",cr,lf
  58.         db "3.) Change the priority",cr,lf
  59.         db "4.) Pause printer output",cr,lf
  60.         db "5.) Reprint the current page",cr,lf
  61.         db "6.) Exit the program",cr,lf,"$"
  62. number        db "Number: ","$"
  63. port_menu    db cr,lf,lf,"Choose the port to use with the printer.",cr,lf
  64.         db "1.) LPT1",cr,lf
  65.         db "2.) LPT2",cr,lf
  66.         db "3.) LPT3",cr,lf
  67.         db "4.) COM1",cr,lf
  68.         db "5.) COM2",cr,lf
  69.         db "6.) Exit the program",cr,lf,"$"
  70. not_avaliable    db "The port chosen is not in the system",cr,lf,"$"
  71. pause_on_q    db cr,lf,"Do you want to pause printer output (y=yes) ? $"
  72. pause_off_q    db cr,lf,"Do you want printer output on again (y=yes) ? $"
  73. buffer_cleared    db "The buffer is empty",cr,lf,"$"
  74. new_port    db "The new port to use with the printer is $"
  75. lpt1_mess    db "LPT1",cr,lf,"$"
  76. lpt2_mess    db "LPT2",cr,lf,"$"
  77. lpt3_mess    db "LPT3",cr,lf,"$"
  78. com1_mess    db "COM1",cr,lf,"$"
  79. com2_mess    db "COM2",cr,lf,"$"
  80. new_priority    db "Input the new priority: $"
  81. nothing_done    db "Nothing was done",cr,lf,"$"
  82. you_sure    db "You sure you what to clear the buffer? (y=yes) $"
  83. crlf        db cr,lf,"$"
  84. space        db "  $"
  85. not_valid_number db cr,lf,"invalid number",cr,lf,"$"
  86.  
  87. port_number        db ?
  88. port_type        db ?
  89. buffer_size        dw ?
  90. characters_in_buffer    dw ?
  91. priority        dw ?
  92. pause_flag        db ?
  93. ; end of data
  94.  
  95. ; macros
  96. print    macro    message
  97.     mov ah, display_string
  98.     mov dx, offset message
  99.     int 21h
  100.     endm
  101.  
  102. buffer_input    macro    size_of_buffer
  103.     local i2, buffer, num_of_chars, buffer2
  104. ; This macro inputs characters from the keyboard with echo and stores them in memory.
  105. ; The string of characters is terminated with two bytes of 0.
  106. ; enter: ds = cs
  107. ; exit: al = # of characters typed not including the CR
  108. ;    ds:si -> first char. of the string typed
  109.  
  110.     jmp i2
  111. buffer        db size_of_buffer + 1
  112. num_of_chars    db ?
  113. buffer2        db size_of_buffer dup(?)
  114.         dw ?
  115. i2:
  116.     mov ah, 0ah            ; buffer keyboard input
  117.     mov dx, offset buffer
  118.     int 21h
  119.     
  120.     mov al, [num_of_chars]        ; end the string with 0,0
  121.     mov ah, 0
  122.     mov si, offset buffer2
  123.     add si, ax
  124.     mov [si], word ptr 0
  125.     sub si, ax
  126.     
  127.     endm
  128. ; end of macros
  129.  
  130. s1:
  131.     print header            ; print "BUFFER PRINT program ..."
  132.     
  133.     mov ax,7
  134.     call ioctl            ; call driver
  135.     push bx
  136.     mov ax,8
  137.     xor bx,bx            ; do nothing
  138.     call ioctl
  139.     mov pause_flag,bl
  140.     pop bx
  141.     
  142.     jc  baddevice
  143.     cmp bx, 55aah            ; check test pattern
  144.     je  b1
  145.  
  146. baddevice:
  147.     print not_installed        ; print "BUFFER PRINT is not installed."
  148.     jmp termin_ate
  149. b1:
  150.     mov ax, cs            ; restore es = cs
  151.     mov es, ax
  152.  
  153.     mov ax, 1            ; get port # and type
  154.     call ioctl
  155.     mov [port_number], bl
  156.     mov [port_type], bh
  157.     
  158.     mov ax, 3            ; get buffer size
  159.     call ioctl
  160.     mov [buffer_size], bx
  161.     
  162.     mov ax, 4            ; get # of char. in the buffer
  163.     call ioctl
  164.     mov [characters_in_buffer], bx
  165.     
  166.     mov ax, 6            ; get the priority
  167.     call ioctl
  168.     mov [priority], bx
  169.  
  170.     print line1            ; print "The number of characters in the buffer:"
  171.     
  172.     mov ax, [characters_in_buffer]
  173.     call bin2dec
  174.     call printbxcxdx
  175.     print crlf        
  176.     
  177.     print line2            ; print "The size of the buffer in characters:"
  178.     
  179.     mov ax, [buffer_size]
  180.     call bin2dec
  181.     call printbxcxdx
  182.     print crlf
  183.     
  184.     print line3            ; print "The port being used with the printer:"
  185.     
  186.     mov ah, [port_type]
  187.     mov al, [port_number]    
  188.     call print_port
  189.     
  190.     print line4            ; print "The priority of the printer (1 lowest, 65536 highest):"
  191.     
  192.     mov ax, [priority]
  193.     call bin2dec
  194.     call printbxcxdx
  195.     print crlf
  196.     cmp pause_flag,-1        ; is printer paused ?
  197.     jne do_menu
  198.     print pause_on
  199. do_menu:
  200.     print menu            ; print the menu
  201. b2:    
  202.     print number            ; print "Number: "
  203.     
  204.     mov ah, keyboard_no_echo    ; wait for a number to be typed
  205.     int 21h
  206.  
  207.     cmp al, cr
  208.     je exit8
  209.     
  210.     push ax                ; echo every thing except cr
  211.     mov ah, display_char
  212.     mov dl, al
  213.     int 21h
  214.  
  215.     print space            ; print two spaces
  216.     pop ax
  217.     
  218.     cmp al, "1"            ; jump to the correct command
  219.     je clear_the_buffer
  220.     cmp al, "2"
  221.     jne b23
  222.     jmp change_port
  223. b23:
  224.     cmp al, "3"
  225.     je change_priority
  226.     cmp al, "4"
  227.     jne test_end
  228.     jmp set_pause            ; Handle pause status
  229. test_end:
  230.     cmp al, "5"            ; reprint current page
  231.     je print_cur_page
  232.     cmp al, "6"
  233.     je exit8
  234.     jmp b2
  235.  
  236. exit8:
  237.     print crlf
  238.     jmp termin_ate
  239.     
  240. print_cur_page:
  241.     mov    ax,9            ; current page function
  242.     xor    bx,bx
  243.     call    ioctl
  244.     jmp    termin_ate
  245.  
  246. clear_the_buffer:
  247.     print you_sure            ; print "Are you sure you want to clear the buffer? (y=yes) "
  248.     
  249.     mov ah, keyboard_no_echo    ; wait for something to be typed
  250.     int 21h
  251.  
  252.     cmp al, cr
  253.     je b245
  254.  
  255.     push ax                ; echo everything except cr
  256.     mov ah, display_char
  257.     mov dl, al
  258.     int 21h
  259.     
  260.     print space            ; print two spaces
  261.     pop ax
  262.  
  263.     and al, 0dfh            ; convert the something to upper case
  264.     
  265.     cmp al, "Y"
  266.     je b25
  267. b245:
  268.     print nothing_done        ; print "Nothing was done"
  269.     jmp termin_ate
  270. b25:    
  271.     mov ax, 0            ; flush the buffer
  272.     call ioctl
  273.  
  274.     print buffer_cleared        ; print "The buffer is empty"    
  275.     jmp termin_ate
  276.  
  277. change_priority:
  278.     print new_priority        ; print "Input the new priority"
  279.     
  280.     buffer_input  5            ; input max. of 5 character from the keyboard with echo
  281.     cmp al, 0            ; if no characters were typed exit
  282.     jnz b26
  283.     jmp termin_ate
  284. b26:    
  285.     call ascbin            ; conver the ascii characters to binary
  286.     push ax    
  287.  
  288.     print crlf
  289.  
  290.     lodsb                ; if the first non convertable character is a 0, then it was a good #.
  291.     cmp al, 0
  292.     pop ax
  293.     jnz b265
  294.  
  295.     cmp ax, 0            ; the priority must be between 1 and 200
  296.     je b265
  297.     cmp ax, 200            
  298.     ja b265
  299.     jmp b27
  300.  
  301. b265:
  302.     print not_valid_number
  303.     jmp change_priority
  304. b27:    
  305.     mov bx, ax            ; set the new priority
  306.     mov ax, 5
  307.     call ioctl
  308.  
  309.     print crlf    
  310.     jmp termin_ate
  311.     
  312. change_port:
  313.     print port_menu            ; print the port menu
  314. b3:
  315.     print number            ; print "Number: "
  316.     
  317.     mov ah, keyboard_no_echo    ; wait for a number to be typed
  318.     int 21h
  319.  
  320.     cmp al, cr
  321.     je exit9
  322.     
  323.     push ax                ; echo every thing except cr
  324.     mov ah, display_char
  325.     mov dl, al
  326.     int 21h
  327.  
  328.     print space            ; print two spaces
  329.     pop ax
  330.  
  331.     cmp al, "1"            ; jump to the correct command
  332.     je lpt1
  333.     cmp al, "2"
  334.     je lpt2
  335.     cmp al, "3"
  336.     je lpt3
  337.     cmp al, "4"
  338.     jne b35
  339.     jmp com1
  340. b35:
  341.     cmp al, "5"
  342.     jne b4
  343.     jmp com2
  344. b4:
  345.     cmp al, "6"
  346.     je exit9
  347.     jmp b3
  348.  
  349. exit9:
  350.     print crlf
  351.     jmp termin_ate
  352. lpt1:
  353.     mov bx, 0000h
  354.     call get_port_address        ; determine if this port is in the system
  355.     cmp dx, 0
  356.     jnz  b5
  357.     jmp this_prn_not_avaliable
  358. b5:    
  359.     print new_port            ; print "The new port to use with the printer is "
  360.     print lpt1_mess            ; print "LPT1."
  361.     
  362.     mov ax, 2            ; use lpt1 for the output port
  363.     mov bl, 0            ; port number
  364.     mov bh, 1            ; port type = parallel
  365.     call ioctl
  366.     jmp termin_ate
  367.     
  368. lpt2:
  369.     mov bx, 0001
  370.     call get_port_address        ; determine if this port is in the system
  371.     cmp dx, 0
  372.     jnz b6
  373.     jmp this_prn_not_avaliable
  374. b6:    
  375.     print new_port            ; print "The new port to use with the printer is "
  376.     print lpt2_mess            ; print "LPT2."
  377.         
  378.     mov ax, 2
  379.     mov bl, 1    ; port number
  380.     mov bh, 1    ; port type = parallel
  381.     call ioctl
  382.     jmp termin_ate
  383.  
  384. lpt3:
  385.     mov bx, 0002
  386.     call get_port_address        ; determine if this port is in the system
  387.     cmp dx, 0
  388.     jz this_prn_not_avaliable
  389.     
  390.     print new_port            ; print "The new port to use with the printer is "
  391.     print lpt3_mess            ; print "LPT3."
  392.     
  393.     mov ax, 2
  394.     mov bl, 2    ; port number (0,1,2)
  395.     mov bh, 1    ; port type = parallel
  396.     call ioctl
  397.     
  398.     jmp termin_ate
  399.  
  400. com1:
  401.     mov bx, 0100h
  402.     call get_port_address        ; determine if this port is in the system
  403.     cmp dx, 0
  404.     jz this_prn_not_avaliable
  405.     
  406.     print new_port            ; print "The new port to use with the printer is "
  407.     print com1_mess            ; print "COM1."
  408.     
  409.     mov ax, 2
  410.     mov bl, 0    ; port number
  411.     mov bh, 0    ; port type = serial
  412.     call ioctl
  413.     jmp termin_ate
  414.  
  415. com2:
  416.     mov bx, 0101h
  417.     call get_port_address        ; determine if this port is in the system
  418.     cmp dx, 0
  419.     jz this_prn_not_avaliable
  420.     
  421.     print new_port            ; print "The new port to use with the printer is "
  422.     print com2_mess            ; print "COM2."
  423.     
  424.     mov ax, 2
  425.     mov bl, 1    ; port number
  426.     mov bh, 0    ; port type = serial
  427.     call ioctl
  428.     jmp termin_ate
  429.  
  430. this_prn_not_avaliable:
  431.     print not_avaliable
  432.     jmp b3
  433.  
  434. termin_ate:
  435.     mov ah, terminate        ; return to msdos
  436.     int 21h
  437.  
  438. set_pause:
  439. ; Get current pause status and determine if user wishes to toggle it.
  440.     mov    ax,8            ; function call
  441.     mov    bx,1            ; assume we want to turn on pause
  442.     mov    dx,offset pause_on_q
  443.     cmp     pause_flag,-1        ; is pause on?
  444.     jne    get_query
  445.     mov    bx,2            ; we want to turn it off
  446.     mov     dx,offset pause_off_q
  447. get_query:
  448.     push    ax
  449.     push    bx
  450.     mov    ah,9
  451.     int    21h            ; show message
  452.     mov    ah,1
  453.     int    21h            ; get response
  454.     or    al,20h            ; to lower case
  455.     cmp    al,'y'
  456.     jne    no_pause
  457.     pop    bx
  458.     pop    ax
  459.     call     ioctl
  460.     jmp    termin_ate
  461. no_pause:
  462.     pop    bx
  463.     pop    ax
  464.     jmp    termin_ate
  465.  
  466. ;--------------------------------------------------------------------
  467.  
  468. printbxcxdx    proc
  469. ; print registers bx, cx, dx if they are not spaces
  470.     push dx
  471.     push dx
  472.  
  473.     cmp bh, " "
  474.     je p1
  475.  
  476.     mov ah, display_char
  477.     mov dl, bh
  478.     int 21h
  479. p1:
  480.     cmp bl, " "
  481.     je p2
  482.  
  483.     mov ah, display_char
  484.     mov dl, bl
  485.     int 21h
  486. p2:
  487.     cmp ch, " "
  488.     je p3
  489.  
  490.     mov ah, display_char
  491.     mov dl, ch
  492.     int 21h
  493. p3:
  494.     cmp cl, " "
  495.     je p4
  496.  
  497.     mov ah, display_char
  498.     mov dl, cl
  499.     int 21h
  500. p4:
  501.     mov ah, display_char
  502.     pop dx
  503.     cmp dh, " "
  504.     je p5
  505.     mov dl, dh
  506.     int 21h
  507. p5:
  508.     mov ah, display_char
  509.     pop dx
  510.     int 21h
  511.  
  512.     ret
  513. printbxcxdx    endp
  514.  
  515. ;--------------------------------------------------------------------
  516.  
  517. bin2dec    proc
  518. ; Convert a two byte binary number to a six byte ascii decimal number.
  519. ; call: ax = binary number
  520. ;    es = cs = ds
  521. ; return: bxcxdx = ascii decimal number
  522. ; registers changed: bx cx dx
  523. ; algorithm used:
  524. ; REPEAT digit = (x mod 10) + '0'; x = x DIV 10 UNTIL x = 0
  525.     
  526.     pushf
  527.     push ax
  528.     push si
  529.     push di
  530.  
  531.     cld            ; auto increment
  532.     mov di, offset scratch    ; work space
  533.     mov si, di
  534.     push ax
  535.     mov ax, 2020h
  536.     stosw
  537.     stosw
  538.     stosw
  539.     pop ax
  540.     mov di, si
  541.     mov bx, 10
  542.  
  543. repeat3:    
  544.     xor dx, dx        ; get the first digit
  545.     div bx            ; dxax/bx = ax R dx
  546.     add dx, "0"
  547.     push ax
  548.     mov al, dl
  549.     stosb            ; mov es:[di], al
  550.     pop ax
  551.     or ax, ax
  552.     jnz repeat3
  553.  
  554.     lodsw
  555.     mov dx, ax
  556.     lodsw
  557.     mov cx, ax
  558.     lodsw
  559.     mov bx, ax
  560.  
  561.     pop di
  562.     pop si
  563.     pop ax
  564.     popf
  565.     ret
  566.  
  567. scratch    db 6 dup(9)
  568. bin2dec    endp
  569.  
  570. ;--------------------------------------------------------------------
  571.  
  572. ; Put function into IOCTL buffer and call the device
  573.  
  574. ioctl    proc    near
  575.     mov    [ioctl_buff],ax    ; put in functions
  576.     mov    [ioctl_buff+2],bx
  577.     mov    bx,[handle]    ; get printer handle
  578.     mov    ax,4403h    ; read/write ioctl
  579.     mov    cx,4        ; just 2 words
  580.     mov    dx,offset ioctl_buff
  581.     int    21h
  582.     xor    bx,bx
  583.     jc    ioctl_ret    ; oops an error
  584.     mov    bx,[ioctl_buff+2] ; get response
  585. ioctl_ret:
  586.     ret
  587. ioctl    endp
  588.  
  589. ioctl_buff    dw    ?
  590.         dw    ?
  591. handle        dw    4    ; Standard PRN handle
  592.  
  593.     
  594. ;--------------------------------------------------------------------
  595.  
  596. get_port_address    proc
  597. ; call: bh = port type (0 com, 1 if parallel)
  598. ;    bl = port_number (0, 1, 2)
  599. ; return: dx = port address
  600.     push ax
  601.     push es
  602.     push si
  603.  
  604.     mov    ax,0040h    ; use es:si to get the port address
  605.     mov    es,ax        ; the com and parallel ports are at 40:0 to 40:0010
  606.     mov    si,8    
  607.     cmp    bh, 0
  608.     jnz    g1
  609.     mov     si, 0
  610. g1:
  611.     mov    al, bl
  612.     cbw        
  613.     add    si,ax    
  614.     add    si,ax    
  615.     mov    dx,es:[si]
  616.     
  617.     pop si
  618.     pop es
  619.     pop ax
  620.     ret
  621. get_port_address    endp
  622.  
  623. ;--------------------------------------------------------------------
  624.  
  625. print_port    proc
  626. ; print the port type (LPT1, LPT2, LPT3, COM1, COM2) on the screen
  627. ; call:    ah = port type (0 = com, 1 = parallel)
  628. ;    al = port number (0, 1, 2)
  629. ; return: carry set if al or ah are out of range
  630.     cmp ah, 0
  631.     jz com
  632.     cmp ah, 1
  633.     jz lpt
  634.     jmp error3
  635. com:    
  636.     cmp al, 0
  637.     jz com_one
  638.     cmp al, 1
  639.     jz com_two
  640.     jmp error3
  641. lpt:
  642.     cmp al, 0
  643.     jz lpt_one
  644.     cmp al, 1
  645.     jz lpt_two
  646.     cmp al, 2
  647.     jz lpt_three
  648.     jmp error3
  649. com_one:
  650.     print com1_mess
  651.     ret
  652. com_two:
  653.     print com2_mess
  654.     ret
  655. lpt_one:
  656.     print lpt1_mess
  657.     ret
  658. lpt_two:
  659.     print lpt2_mess
  660.     ret
  661. lpt_three:
  662.     print lpt3_mess
  663.     ret
  664. error3:
  665.     stc
  666.     ret
  667. print_port    endp
  668.     
  669. ;--------------------------------------------------------------------
  670.  
  671. ascbin    proc
  672.  
  673.     cld
  674.     push dx
  675.     push bx
  676.     xor bx,bx
  677.     mov cx,-1
  678. ab1:
  679.     cmp byte ptr [si],' '
  680.     jnz ab2
  681.     inc si
  682.     jmp ab1
  683. ab2:
  684.     push si
  685.     cmp byte ptr [si],'+'
  686.     jz ab25
  687.     cmp byte ptr [si],'-'
  688.     jnz ab3
  689. ab25:
  690.     inc si
  691. ab3:
  692.     lodsb
  693.     cmp al,'.'
  694.     jnz ab4
  695.     xor cx,cx
  696.     jmp ab3
  697. ab4:
  698.     cmp al,'0'
  699.     jb ab5
  700.     cmp al,'9'
  701.     ja ab5
  702.     and ax,0fh
  703.     xchg ax,bx
  704.     mov dx,10
  705.     mul dx
  706.     add bx,ax
  707.     or cx,cx
  708.     js ab3
  709.     inc cx
  710.     jmp ab3
  711. ab5:
  712.     dec si
  713.     mov ax,bx
  714.     pop bx
  715.     cmp byte ptr [bx],'-'
  716.     jnz ab6
  717.     neg ax
  718. ab6:
  719.     pop bx
  720.     pop dx
  721.     ret
  722. ascbin    endp
  723.  
  724. ;--------------------------------------------------------------------
  725.  
  726. code    ends 
  727.  
  728.     end    begin
  729.  
  730.