home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / devdriv / dd / prnmod.asm < prev    next >
Assembly Source File  |  1986-06-02  |  10KB  |  280 lines

  1.          PAGE
  2.          PAGE   62,132
  3.          TITLE  RS232 Printer Device Driver Module
  4.          NAME   prnmod       
  5.          ;
  6.          INCLUDE   REQHDR.MAC
  7.          ;
  8. CSEG     SEGMENT  PARA PUBLIC  'CODE'
  9.          ASSUME  CS:CSEG, DS:CSEG
  10.          ;
  11.          ;Defined elsewhere...
  12.          EXTRN  DONE:near, DONE2:near, ERROUT:near, XFER:near
  13.          EXTRN  REQHDR:dword
  14.          ;
  15.          ;Defined here...
  16.          PUBLIC   PRNOUT, PRNSTAT, PRNIT
  17.          PUBLIC   PRNCTL_IN, PRNCTL_OUT
  18.          ;
  19. ;
  20. ;        RS232 Communications channels
  21. COMM0    EQU    0
  22. COMM1    EQU    1    
  23. ;
  24. ;        Interrupt 14H functions
  25. SETCOMM  EQU    0       ;set channel baud,parity,stopbits,databits
  26. WRITE    EQU    1       ;write AL to port
  27. READ     EQU    2       ;read AL from port
  28. STAT     EQU    3       ;read channel status
  29. ;
  30. ;        Returned status bits
  31. TXEMPTY  EQU    20H     ;transmitter register empty
  32. DSRBIT   EQU    20H     ;data set ready bit
  33. CTSBIT   EQU    10H     ;clear to send bit
  34. TX_OK    EQU    80H     ;transmission successful  
  35. ;
  36. ;        Channel initialization byte
  37. ;           Bit field definitions
  38. B110     EQU    00000000B       ;110 BAUD
  39. B150     EQU    00100000B       ;150 BAUD
  40. B300     EQU    01000000B       ;300 BAUD
  41. B600     EQU    01100000B       ;600 BAUD
  42. B1200    EQU    10000000B       ;1200 BAUD
  43. B2400    EQU    10100000B       ;2400 BAUD
  44. B4800    EQU    11000000B       ;4800 BAUD
  45. B9600    EQU    11100000B       ;9600 BAUD
  46. ;
  47. NOPAR    EQU    00000000B       ;no parity
  48. ODD      EQU    00001000B       ;odd parity
  49. EVENP    EQU    00011000B       ;even parity
  50. ;
  51. STOP1    EQU    00000000B       ;1 stop bit
  52. STOP2    EQU    00000100B       ;2 stop bits
  53. ;
  54. DATA7    EQU    00000010B       ;7 bits data
  55. DATA8    EQU    00000011B       ;8 bits data
  56. ;
  57. DEFAULT  EQU    B9600+EVENP+STOP1+DATA7
  58.          page
  59. ;--------------------------------------------------------------------------
  60. ;
  61. ;        .OUTPUT: Printer Output via ROM BIOS INT 14H
  62. ;
  63. ;               On entry  DS=CS, CX=byte count, ES:DI transfer buffer
  64. ;
  65. PRNOUT   PROC   NEAR
  66.          ;
  67.          JCXZ   OEX             ;if 0 bytes to xfer, return
  68. NXBYTE:  MOV    AL,ES:[DI]      ;get byte from transfer buffer
  69.          INC    DI              ; advance buffer ptr
  70.          MOV    BYTE PTR RCNT,2
  71.          ;
  72. RETRY:   MOV    AH,WRITE        ;send AL to COMM0 port
  73.          MOV    DX,COMM1        ;
  74.          INT    14H             ;
  75.          TEST   AH,TX_OK        ;transmission successful?
  76.          JZ     CONTINUE        ;   then continue
  77.          ;
  78.          DEC    BYTE PTR RCNT   ;decrement retry count
  79.          JNZ    RETRY           ;
  80.          MOV    AL,WRFLT        ;write fault error code
  81.          JMP    ERROUT          ;  exit
  82.          ;
  83. CONTINUE:
  84.          LOOP   NXBYTE          ;exhaust byte count
  85. OEX:     JMP    DONE            ;successful return
  86.          ;
  87. PRNOUT   ENDP
  88. ;
  89. RCNT     DB     ?               ;error retry count
  90. ;            
  91.          page
  92. ;--------------------------------------------------------------------------
  93. ;
  94. ;        .IOCTL_IN: Read printer channel initialization parameter
  95. ;
  96. ;               On entry  DS=CS, CX=byte count, ES:DI transfer buffer
  97. ;
  98. PRNCTL_IN  PROC   NEAR
  99.          ;
  100.          JCXZ   OEX             ;leave if 0 bytes requested
  101.          MOV    SI,OFFSET DEST  ;
  102.          ;
  103. RDPARM:  MOV    AL,[SI]         ;move parameters to transfer buffer
  104.          MOV    ES:[DI],AL      ;  with 0 termination
  105.          OR     AL,AL           ;
  106.          JZ     MOVFIN          ;
  107.          INC    SI              ;
  108.          INC    DI              ;
  109.          LOOP   RDPARM          ;
  110.          INC    CX              ;
  111.          ;
  112. MOVFIN:  DEC    CX              ;
  113.          JMP    XFER            ;on return set DONE and bytes transferred
  114.          ;
  115. PRNCTL_IN  ENDP
  116.          page
  117. ;--------------------------------------------------------------------------
  118. ;
  119. ;        .IOCTL_OUT: Write printer channel initialization parameter
  120. ;
  121. ;               On entry  DS=CS, CX=byte count, ES:DI transfer buffer
  122. ;
  123. PRNCTL_OUT  PROC   NEAR
  124.          ;
  125.          JCXZ   OEX             ;leave if 0 bytes requested
  126.          MOV    SI,OFFSET DEST  ;
  127.          CMP    CX,20           ;if request is to send more than
  128.          JBE    WRPARM          ;   20 bytes, set limit at 20
  129.          MOV    CX,20           ;
  130.          ;
  131. WRPARM:  MOV    AL,ES:[DI]      ;move parameters from transfer buffer
  132.          MOV    [SI],AL         ;  
  133.          INC    SI              ;
  134.          INC    DI              ;
  135.          LOOP   WRPARM          ;
  136.          ;
  137.          PUSH   CX              ;
  138.          CALL   CH_BYTE         ;convert first 2 characters to byte 
  139.          MOV    AH,SETCOMM      ;initialize channel
  140.          MOV    DX,COMM1        ;  to requested baud rate, parity, etc.
  141.          INT    14H             ;
  142.          POP    CX              ;
  143.          ;
  144.          JMP    XFER            ;on return set DONE and bytes transferred
  145.          ;
  146. PRNCTL_OUT  ENDP
  147. ;
  148. ;        Channel initialization byte
  149. OLDPARM   DB     DEFAULT        ;default 9600,even parity, 7 data, 1 stop bit
  150.          page
  151. ;--------------------------------------------------------------------------
  152. ;
  153. ;        .OUTSTAT: Printer channel status from ROM BIOS INT 14H
  154. ;
  155. ;               On entry  DS=CS, CX=byte count, ES:DI transfer buffer
  156. ;
  157. PRNSTAT  PROC   NEAR
  158.          ;                       
  159.          MOV    AH,STAT         ;get channel status in AX
  160.          MOV    DX,COMM1        ;
  161.          INT    14H             ;
  162.          ;
  163.          ;check that clear to send and data set ready are asserted
  164.          TEST   AL,CTSBIT+DSRBIT
  165.          JZ     BSY             ;
  166.          TEST   AH,TXEMPTY      ;transmitter register empty?
  167.          JZ     BSY             ;
  168. EXIT:    JMP    DONE            ;NOT busy return
  169. BSY:     JMP    DONE2           ;busy return
  170.          ;
  171. PRNSTAT  ENDP
  172. ;
  173. ;
  174. ;        Convert ASCII HEX comm port initialization byte to binary
  175. ;
  176. CH_BYTE  PROC   NEAR
  177.          ;
  178.          PUSH   CS              ;
  179.          POP    DS              ;
  180.          MOV    BX,OFFSET DEST  ;point to parameter string
  181.          MOV    AL,[BX+0]       ; get most significant HEX digit
  182.          CALL   TOHEX           ;  convert to binary nibble
  183.          XCHG   AL,AH           ;  save in AH
  184.          MOV    AL,[BX+1]       ; get least significant HEX digit
  185.          CALL   TOHEX           ;  convert to binary nibble in AL
  186.          MOV    CL,4            ;
  187.          SHL    AH,CL           ; shift most significant digit into upper nibble
  188.          ADD    AL,AH           ; combine with lower nibble and save
  189.          MOV    BYTE PTR OLDPARM,AL
  190.          RET                    ;
  191. CH_BYTE  ENDP
  192. ;
  193. ;        Convert ASCII HEX byte to binary byte
  194. ;
  195. TOHEX    PROC   NEAR
  196.          ;   
  197.          SUB    AL,30H          ;
  198.          CMP    AL,0AH          ;
  199.          JC     HEXRET          ;
  200.          SUB    AL,07H          ;
  201. HEXRET:  RET                    ;
  202.          ;
  203. TOHEX    ENDP
  204. ;
  205. ;--------------------------------------------------------------------------
  206. ;
  207. ;        .INIT: PRN device driver INIT code
  208. ;
  209. ;               On entry  DS=CS, CX=byte count, ES:DI transfer buffer
  210. ;
  211. CR       EQU    0DH
  212. LF       EQU    0AH
  213. DESTLNG  EQU    20 
  214. ;
  215. ;        Parameters passed in device= command line
  216. DEST     DB     DESTLNG  DUP (?) 
  217. ;
  218. ;
  219. PRNIT    PROC   NEAR
  220.          ;
  221. ENDPRN   EQU    $
  222.          ;
  223.          LEA    AX,CS:ENDPRN    ;offset to end of resident driver
  224.          MOV    DX,CS           ;segment address
  225.          LDS    BX,CS:REQHDR    ;DS:BX pts to request header
  226.          MOV    [BX+BRKSEG],DX  ; save ending code segment address
  227.          MOV    [BX+BRKOFF],AX  ; save ending code offset address
  228.          ;
  229.          ;get ptr to filename portion of command line in CONFIG.SYS file
  230.          LDS    SI,DWORD PTR[BX+PARMS]            
  231.          PUSH   CS              ;
  232.          POP    ES              ;
  233.          MOV    DI,OFFSET DEST  ;destination address for parms
  234.          ;
  235. TOP1:    MOV    AL,[SI]         ; check for termination char's
  236.          ;
  237.          ;  command line has the form: device=filename /parms<CR>
  238.          ;                    or       device=filename<LF>
  239.          ;        
  240.          CMP    AL,CR           ;parms are present
  241.          JZ     GETPARMS        ;
  242.          CMP    AL,LF           ;no parm field
  243.          JZ     NOPARMS         ;
  244.          ;            
  245.          INC    SI              ;
  246.          JMP    SHORT TOP1      ;
  247.          ;
  248. GETPARMS:
  249.          MOV    CX,0            ;character count
  250. NXTCHR:  DEC    SI              ;back up ptr    
  251.          INC    CX              ;
  252.          MOV    AL,[SI]         ;
  253.          CMP    AL,'/'          ;scan for start character
  254.          JNZ    NXTCHR          ;
  255.          DEC    CX              ;
  256.          INC    SI              ;ready to move parms to DEST
  257.          REP    MOVSB           ;
  258.          MOV    AL,0            ;terminate with 0
  259.          MOV    ES:[DI],AL      ;
  260.          CALL   CH_BYTE         ;convert parm to binary byte in OLDPARM
  261. NOPARMS:
  262.          MOV    AL,BYTE PTR OLDPARM
  263.          MOV    AH,SETCOMM      ;initialize channel
  264.          MOV    DX,COMM1        ;  to requested baud rate, parity, etc.
  265.          INT    14H             ;
  266.          ;
  267.          MOV    DX,OFFSET SIGN_ON
  268.          MOV    AH,9            ;boot message
  269.          INT    21H             ;
  270.          JMP    DONE            ;
  271.          ;
  272. PRNIT    ENDP
  273. ;
  274. SIGN_ON  DB     'Serial printer channel 1 initialized'
  275.          DB     0AH,0DH,'$'
  276. ;
  277. CSEG     ENDS
  278.          END
  279.  
  280.