home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / print2 / prntscrn.lzh / PRNTSCRN.ASM < prev    next >
Assembly Source File  |  1990-03-20  |  11KB  |  437 lines

  1. %TITLE  "Print Screen - <Print Scrn> enhancement TSR"
  2.  
  3. DISPLAY    "Link with /t option to create a .COM file"
  4.  
  5. ;-----------------------------------------------------------------------;
  6. ; PRNTSCRN.ASM  - a TSR to enhance the print screen key                 ;
  7. ; 3-18-90  Robert Mashlan                        ;
  8. ;                                    ;
  9. ;                                                                   ;
  10. ; o Prefixes IBM characters with ASCII codes below 32 with the        ;
  11. ;   a printer control sequence.                        ;
  12. ;                                    ;
  13. ; o Prints characters with the bold attribute set in bold.        ;
  14. ;                                    ;
  15. ; o On monochrome monitors, underlined characters are printed in    ;
  16. ;   underlined mode                            ;
  17. ;                                    ;
  18. ;-----------------------------------------------------------------------;
  19.  
  20.     DOSSEG
  21.     MODEL    tiny
  22.  
  23.         LOCALS @@
  24. ;-----------------------------------------------------------------------;
  25. ; status masks returned by bios int 17h (printer service)        ;
  26. ;-----------------------------------------------------------------------;
  27.  
  28. printererrors   EQU      00101001b        ; these bits indicate an error on int 17h
  29. printerselected    EQU     00010000b       ; printer selected bit
  30.  
  31.     CODESEG
  32.  
  33.  
  34.     ORG    0100h
  35.  
  36. begin:
  37.     jmp    install
  38.  
  39. string        macro    name, str
  40. name        db    str
  41. name&len    =    $-name
  42.         endm
  43.  
  44.  
  45. ;---------------------------------------;
  46. ; printer control codes            ;
  47. ;---------------------------------------;
  48.  
  49. string        cntrseq  <27,'^'>    ; printer control code for control ch.
  50. string        boldon     <27,'G'>    ; turn bold printing on
  51. string        boldoff     <27,'H'>    ; turn bold printing off
  52. string        underon     <27,'-',1>    ; turn underlined printing on
  53. string        underoff <27,'-',0>    ; turn underlined printing off
  54.  
  55. port        db    0        ; printer port number lpt1=0, lpt2=1,..
  56. inprogress     db    0        ; in progress status byte
  57.  
  58. ;-------------------------------------------------;
  59. ; Local variables here instead of stack           ;
  60. ; because this TSR is stack parasitic           ;
  61. ;-------------------------------------------------;
  62.  
  63. boldflag    db    0    ; bold printing is on
  64. underflag    db    0    ; underlined printing on
  65. videomode    db    0    ; video mode
  66. videopage    db    0    ; display page
  67. row        db    0    ; row  ( 0 based )
  68. col        db    0    ; col. ( 0 based )
  69. char        db    0    ; character
  70. attr        db    0    ; attribute
  71. displaypage    db    0    ; display page
  72. screenwidth    db    0    ; width of screen
  73.  
  74. %NEWPAGE
  75.  
  76. bputchar     proc    near
  77. ;----------------------------------------------;
  78. ;  subroutine to output a char to the printer  ;
  79. ;  input: al=char                              ;
  80. ;  dx, ax changed                              ;
  81. ;  carry flag set on error                     ;
  82. ;----------------------------------------------;
  83. @@start:
  84.     push    ax            ; save char
  85.     mov    dl,byte ptr [port]    ; get printer port
  86.         xor    dh,dh            ; clear high byte
  87.         mov    ah,02h            ; bios printer - check status
  88.         int    17h            ; bios printer
  89.         test    ah,printererrors    ; check for errors
  90.         jnz    @@error            ;
  91.         test    ah,printerselected    ; make sure printer selected
  92.     pop    ax            ; get saved char
  93.         jz    @@error            ; to avoid time out
  94.         xor    ah,ah            ; bios printer - write char
  95.         int    17h            ; bios printer
  96.         test    ah,printererrors    ; check for errors
  97.         jnz    @@error            ;
  98. @@noerror:
  99.     clc                ; clear carry flag
  100.     retn                ; and return
  101. @@error:
  102.     stc                ; set carry
  103.     retn                ; and return
  104. bputchar     endp
  105.  
  106.  
  107. %NEWPAGE
  108.  
  109.  
  110. bpputs    proc    near
  111. ;-----------------------------------------------;
  112. ; prints a string to bios printer              ;
  113. ; input : ds:si points to string                ;
  114. ;      cx = length of string                 ;
  115. ; ax,dx,si destroyed                ;
  116. ;                                               ;
  117. ; carry flag set on error                       ;
  118. ;-----------------------------------------------;
  119.  
  120.     cld                ; auto increment si
  121. @@repeat:
  122.         lodsb                ; get char (in al)
  123.     call    bputchar        ; print char
  124.         jc    @@error            ; printer error
  125.     loop    @@repeat        ; repeat until cx exhausted
  126.  
  127. @@noerror:
  128.         clc                ; clear carry flag
  129.     retn                ; and return
  130.  
  131. @@error:
  132.     stc                ; set carry
  133.     retn                ; and return
  134.  
  135. bpputs    endp
  136.  
  137.  
  138. %NEWPAGE
  139.  
  140. printscreen    proc    near
  141. ;---------------------------------------------;
  142. ; Dump contents of screen to printer          ;
  143. ;---------------------------------------------;
  144.  
  145. @@start:
  146.     mov    byte ptr [boldflag], 0    ; clear bold flag
  147.     mov    byte ptr [underflag],0    ; clear underline flag
  148.  
  149.     mov    ah,0fh            ; bios video - get display mode
  150.     int    10h
  151.     mov    byte ptr [screenwidth],ah; save width
  152.     mov    byte ptr [videomode],al    ; save mode
  153.     mov    byte ptr [videopage],bh
  154.  
  155.     mov    ah,03h            ; bios video - get positon
  156.     int    10h
  157.     push    dx            ; save col and row to restore
  158.  
  159.     mov    byte ptr [row],0    ; clear row
  160.     jmp    @@rowstart
  161.  
  162. @@repeatrow:
  163.     mov    byte ptr [col],0    ; clear col
  164.     jmp    @@colstart
  165.  
  166. @@repeatcol:
  167.  
  168.     mov    bh,[videopage]        ; set page
  169.     mov    dh,[row]        ; set row
  170.     mov    dl,[col]        ; set col
  171.     mov    ah,02h            ; bios video - set cursor position
  172.     int    10h
  173.  
  174.     mov    bh,[videopage]        ; set page
  175.     mov    ah,08h            ; bios video - read char/attr
  176.     int    10h
  177.     mov    [attr],ah        ; get attribute
  178.     mov    [char],al        ; get char
  179.  
  180. ;    check to see if character is a 0 or a 255
  181. ;    these chars are blank on screen but freak out printers
  182. ;     converted to spaces here
  183.  
  184.     cmp    byte ptr [char],0    ; char = 0?
  185.     je    @@changetospace        ; then change to space
  186.     cmp    byte ptr [char],255    ; else is char = 255?
  187.     jne    @@nochange        ; then no change
  188. @@changetospace:
  189.     mov    byte ptr [char],' '    ; else char = ' '
  190. @@nochange:
  191.  
  192.  
  193. %NEWPAGE
  194.  
  195. @@boldcheck:
  196.     cmp    byte ptr boldflag,0    ; bold flag set?
  197. ; then
  198.     jne    @@boldflagset
  199. ; else
  200.  
  201. @@boldflagclear:
  202.     test    byte ptr [attr],8    ; bold attribute set?
  203. ; then
  204.     je    @@endboldcheck
  205. ; else
  206.     mov    byte ptr [boldflag],1    ; set bold flag
  207.     mov    cx,boldonlen        ; print bold on sequence
  208.     mov    si,offset boldon    ; print bold on sequence
  209.     call    bpputs
  210.  
  211.     jnc    @@endboldcheck
  212.     jmp    @@printererror        ; printer error - abort
  213.  
  214. @@boldflagset:
  215.     test    byte ptr [attr],8    ; bold attribute set?
  216. ; then
  217.     jne    @@endboldcheck        ; then go on
  218. ; else
  219.     mov    byte ptr [boldflag],0    ; else set boldflag
  220.     mov    cx, boldonlen
  221.     mov    si,offset boldoff    ; print bold off sequence
  222.     call    bpputs
  223. @@endboldcheck:
  224.  
  225. %NEWPAGE
  226.  
  227.  
  228. @@undercheck:
  229.     cmp    [videomode],7        ; is mode monochrome?
  230. ; then
  231.     jne    @@endundercheck        ; then go on
  232. ; else
  233.     cmp    byte ptr underflag,0    ; underflag set?
  234. ; then
  235.     jne    @@underflagset        ; then underflag set
  236. ; else
  237. @@underflagclear:
  238.     mov    al,byte ptr [attr]    ; get attribute
  239.     and    al,00000111b        ; mask last three bits
  240.     cmp    al,1            ; 1 result means underlined
  241. ; then
  242.     jne    @@underflagset
  243. ; else
  244.     mov    byte ptr [underflag],1    ; set underflag
  245.  
  246.     mov    cx, underonlen        ; start underlining on printer
  247.     mov    si,offset underon    ; print underlining on sequence
  248.     call    bpputs
  249.  
  250.     jnc     @@endundercheck        ; no error - go on
  251.     jmp     @@printererror        ; printer error - abort
  252.  
  253. @@underflagset:
  254.     cmp    byte ptr underflag,0    ; underflag clear?
  255.     je    @@endundercheck        ; then underflagclear
  256.     mov    al,byte ptr [attr]    ; else get attribute
  257.     and    al,00000111b        ; mask last three bits
  258.     cmp    al,1            ; underlined if equal
  259. ; then
  260.     je    @@endundercheck        ; still underlined
  261. ; else
  262.     mov    byte ptr [underflag],0    ; clear underflag
  263.  
  264.     mov    cx, underofflen        ; tell printer to stop underlining
  265.     mov    si, offset underoff    ; output under off sequence
  266.     call    near ptr bpputs
  267.     jc    @@printererror        ; printer error - abort
  268.  
  269. @@endundercheck:
  270.  
  271. %NEWPAGE
  272.  
  273. ;
  274. ;    output control sequence to notify printer
  275. ;    that the next character is a control code
  276. ;
  277.     cmp    byte ptr [char],31    ; not a control character?
  278. ; then
  279.     ja    @@notcontrol        ; then notcontrol
  280. ; else
  281.     mov    cx, cntrseqlen        ; tell printer that next char is cntrl
  282.     mov    si, offset cntrseq    ; output control sequence
  283.     call    near ptr bpputs
  284.     jc    @@printererror        ; printer error - abort
  285.  
  286. @@notcontrol:
  287.  
  288.     mov    al,byte ptr [char]    ; get char
  289.     call     near ptr bputchar    ; print it
  290.     jc    @@printererror        ; printer error - abort
  291.  
  292.     inc    byte ptr [col]        ; increment col
  293. @@colstart:
  294.     mov    ah,byte ptr [col]    ; get col
  295.     cmp    ah,[screenwidth]    ; col>=width?
  296. ; then
  297.     jge    @@endofline        ;
  298. ; else
  299.     jmp    @@repeatcol        ; start over
  300.  
  301. @@endofline:                ; print a carriage return and linefeed
  302.     mov    al,13            ; CR
  303.     call    near ptr bputchar    ;
  304.     jc    @@printererror        ; printer error - abort
  305.         mov    al,10                   ; LF
  306.     call    near ptr bputchar    ;
  307.     jc    @@printererror        ; printer error - abort
  308.  
  309.     inc    byte ptr [row]        ; increment row counter
  310.  
  311. @@rowstart:
  312.     cmp    byte ptr [row],25    ; last row?
  313.     jge    short @@quitrow        ; then quit
  314.     jmp    @@repeatrow        ; else repeat
  315.  
  316. @@quitrow:
  317.     cmp    byte ptr [underflag],0    ; underflag clear?
  318.     je    @@next1            ; then go on
  319.     mov    cx, underofflen
  320.     mov    si,offset underoff    ; else
  321.     call    near ptr bpputs        ; print underoff
  322.     jc    @@printererror        ; printer error - abort
  323. @@next1:
  324.     cmp    byte ptr [boldflag],0    ; bold flag clear?
  325.     je    @@next2            ; then go on
  326.  
  327.     mov    cx, boldofflen        ; else tell printer bold off
  328.     mov    si,offset boldoff    ;
  329.     call    near ptr bpputs        ; print bold off
  330.     jc    @@printererror        ; printer error - abort
  331. @@next2:
  332.     mov    al,12            ; print a form feed
  333.     call    bputchar
  334.  
  335. @@printererror:
  336.  
  337.     mov    bh,[videopage]
  338.     pop    dx            ; restore cursor position
  339.     mov    ah,02h            ; bios video - set position
  340.     int    10h
  341.     ret
  342.  
  343. printscreen    endp
  344.  
  345.  
  346. %NEWPAGE
  347.  
  348. isr05        proc
  349. ;-----------------------------------------------;
  350. ; new print screen interrupt            ;
  351. ; called when <Print Scrn> key pressed        ;
  352. ;-----------------------------------------------;
  353.  
  354.     push     ax                ; save registers
  355.     push    bx
  356.     push    cx
  357.     push    dx
  358.     push    es
  359.     push    ds
  360.     push    si
  361.     push    di
  362.         push    bp
  363.  
  364.     mov    ax,cs                ; restore the data segment
  365.     mov    ds,ax
  366.     cmp    byte ptr [inprogress],0        ; did we  interrupt ourselves?
  367.     jne     @@skip                          ; then skip
  368.     mov     byte ptr [inprogress],1           ; set in progress flag
  369.     sti                     ; reenable ints
  370.     call    near ptr printscreen        ; print the screen
  371.     mov    byte ptr [inprogress],0    ;       ; clear in progress flag
  372.  
  373. @@skip:
  374.     pop     bp                ; restore registers
  375.     pop     di
  376.     pop    si
  377.     pop    ds
  378.     pop    es
  379.     pop    dx
  380.     pop    cx
  381.     pop    bx
  382.     pop    ax
  383.     iret
  384.  
  385. isr05    endp
  386.  
  387.  
  388. %NEWPAGE
  389.  
  390.  
  391.  
  392. ;-----------------------------------------------------------------------;
  393. ;  transient code below                            ;
  394. ;-----------------------------------------------------------------------;
  395.  
  396. transientcode:
  397.  
  398. string        message,<13,10,'Print Screen now installed ',13,10>
  399.  
  400. install:
  401.  
  402. ;      Install new print screen  ISR
  403.  
  404.     mov    dx,offset isr05
  405.     mov    al,05h            ; printscreen vector
  406.     mov    ah,25h            ; dos - set vector
  407.     int     21h
  408.  
  409. ;       Print message
  410.  
  411.     cld                ; auto increment si
  412.     mov    si,offset message
  413.     mov    cx, messagelen
  414. @@repeat:
  415.     lodsb                ; get char from message
  416.     mov    dl,al            ; mov char to dl
  417.     mov    ah,02h            ; dos - display output
  418.     int    21h
  419.     loop    @@repeat        ; loop for length of message
  420.  
  421. ;     free enviroment
  422.  
  423.     mov    ax,word ptr [ds:02ch]    ; get enviroment address from psp
  424.         mov     es,ax
  425.     mov    ah,49h            ; dos - release memory
  426.     int    21h
  427.  
  428. ;     Terminate and stay resident
  429.  
  430.     mov    dx,OFFSET transientcode    ; don't save transient part
  431.     int    27h            ; terminate stay resident
  432.  
  433.  
  434.     END    begin
  435.  
  436.  
  437.