home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / video / b / b_3.asm < prev   
Encoding:
Assembly Source File  |  1988-08-11  |  7.7 KB  |  378 lines

  1.         TITLE    'Listing B-3'
  2.         NAME    ScreenDumpAlpha
  3.         PAGE    55,132
  4.  
  5. ;
  6. ; Name:        ScreenDumpAlpha
  7. ;
  8. ; Function:    Screen Dump for EGA alphanumeric modes with 350-line resolution
  9. ;
  10. ; Caller:    (undefined)
  11. ;
  12. ; Notes:    The main procedure of this program, ScreenDumpAlpha, may be
  13. ;        called from an application program or as part of a TSR
  14. ;        (Terminate-but-Stay Resident) handler for interrupt 5.
  15. ;
  16.  
  17. STDPRN        =    4        ; MS-DOS standard printer handle
  18.  
  19.  
  20. DGROUP        GROUP    _DATA
  21.  
  22. _TEXT        SEGMENT    byte public 'CODE'
  23.         ASSUME    cs:_TEXT,ds:DGROUP,es:DGROUP
  24.  
  25. ;
  26. ; PrintLine
  27. ;
  28. ;    Writes one line of characters to the standard printer device.  Ignores
  29. ;    errors.
  30. ;
  31.  
  32. PrintLine    PROC    near        ; Caller:    DS:DX -> data
  33.                     ;        CX = # of bytes
  34.         mov    bx,STDPRN
  35.         mov    ah,40h        ; INT 21h function 40h:  Write
  36.         int    21h
  37.         ret
  38.  
  39. PrintLine    ENDP
  40.  
  41. ;
  42. ; PrinterGraphics
  43. ;
  44. ;    Puts the printer in its "graphics mode."  This routine must be
  45. ;    customized for different printers.
  46. ;
  47.  
  48. PrinterGraphics    PROC    near        ; Configures Epson MX-80 printer
  49.                     ;  for 480 dots/line
  50.  
  51.         mov    dx,offset DGROUP:EpsonGraphics
  52.         mov    cx,3
  53.         call    PrintLine
  54.         ret
  55.  
  56. PrinterGraphics    ENDP
  57.  
  58. ;
  59. ; PrinterDefault
  60. ;
  61. ;    Puts the printer in its default (non-graphics) mode.  Again, this
  62. ;    routine must be customized for different printers.
  63. ;
  64.  
  65. PrinterDefault    PROC    near        ; Configures Epson MX-80 for default
  66.                     ;  alphanumeric output
  67.  
  68.         mov    dx,offset DGROUP:EpsonReset
  69.         mov    cx,2
  70.         call    PrintLine
  71.         ret
  72.  
  73. PrinterDefault    ENDP
  74.  
  75. ;
  76. ; ChopZeroes
  77. ;
  78. ;    Chops trailing zeros from the printer output buffer.
  79. ;
  80.  
  81. ChopZeroes    PROC    near        ; Caller:    ES:DI -> buffer
  82.                     ;        CX = buffer length
  83.                     ; Returns:    CX = adjusted length
  84.  
  85.         jcxz    L01        ; exit if buffer is empty
  86.  
  87.         add    di,cx
  88.         dec    di        ; ES:DI -> last byte in buffer
  89.  
  90.         xor    al,al        ; AL := 0 (byte to scan for)
  91.  
  92.         std            ; scan backwards
  93.         repe    scasb
  94.         cld            ; restore direction flag
  95.         je    L01        ; jump if buffer filled with zeroes
  96.  
  97.         inc    cx        ; adjust length past last nonzero byte
  98.  
  99. L01:        ret
  100.  
  101. ChopZeroes    ENDP
  102.  
  103. ;
  104. ; PrintPixels
  105. ;
  106. ;    Prints one row of pixels on an Epson MX-80.
  107. ;
  108.  
  109. PrintPixels    PROC    near        ; Caller:    DI = offset of buffer
  110.                     ;        CX = buffer length
  111.  
  112.         push    ds
  113.         pop    es        ; ES := DS
  114.  
  115.         push    di        ; preserve buffer offset
  116.         call    ChopZeroes
  117.         push    cx        ; preserve length
  118.  
  119.         mov    word ptr DataHeader+2,cx  ; store buffer length
  120.                           ;  in output data header
  121.         mov    dx,offset DGROUP:DataHeader
  122.         mov    cx,4
  123.         call    PrintLine    ; print data header
  124.  
  125.         pop    cx        ; CX := buffer length
  126.         pop    dx        ; DX := buffer offset
  127.         call    PrintLine    ; print the pixels
  128.  
  129.         mov    dx,offset DGROUP:CRLF
  130.         mov    cx,2
  131.         call    PrintLine
  132.  
  133.         ret
  134.  
  135. PrintPixels    ENDP
  136.  
  137. ;
  138. ; TranslatePixels
  139. ;
  140. ;    Copies one printable row of pixels from the first character definition
  141. ;    table in map 2 to the print buffer.
  142. ;
  143. ;    This routine formats the printer buffer for output to an Epson
  144. ;    MX-80.  The page is printed sideways, so the printed output is
  145. ;    350 pixels wide.
  146. ;
  147.  
  148. TranslatePixels    PROC    near        ; Caller:    SI = video buffer offset
  149.                     ;        ES:DI -> print buffer
  150.  
  151.         push    ds        ; preserve DS
  152.         mov    ds,VideoBufSeg    ; DS:SI -> video buffer
  153.  
  154.         add    di,es:PrintBufSize
  155.         dec    di        ; ES:DI -> last byte in print buffer
  156.  
  157.         mov    dx,3CEh        ; Graphics Controller I/O port
  158.  
  159. ; fill the print buffer
  160.  
  161.         mov    cx,es:Rows    ; CX := number of character rows
  162.  
  163. L11:        push    cx        ; preserve CX and SI
  164.         push    si
  165.  
  166.         mov    ax,0004h    ; AH := value for Read Map Select reg
  167.                     ; AL := Read Map Select reg number
  168.         out    dx,ax        ; select map 0 (character codes)
  169.  
  170.         lodsb            ; AX := next char code in video buffer
  171.         mov    cl,5
  172.         shl    ax,cl        ; AX := AX * 32
  173.         mov    si,ax        ; SI := offset of character definition
  174.                     ;  in map 2
  175.         mov    ax,0204h
  176.         out    dx,ax        ; select map 2 (bit patterns)
  177.  
  178.         mov    cx,es:Points    ; CX := size of character definition
  179.  
  180. L12:        cld
  181.         lodsb            ; AL := 8-bit pattern from character
  182.                     ;  definition table
  183.                     ; SI := SI + 1
  184.         std
  185.         stosb            ; store bit pattern in print buffer
  186.                     ; DI := DI - 1
  187.         loop    L12        ; loop down character definition
  188.  
  189.         pop    si        ; restore SI and CX
  190.         pop    cx
  191.  
  192.         add    si,es:Columns    ; DS:SI -> next row of characters
  193.         loop    L11        ; loop down character rows
  194.  
  195.         cld            ; clear direction flag
  196.  
  197.         pop    ds        ; restore DS
  198.         ret
  199.  
  200. TranslatePixels    ENDP
  201.  
  202. ;
  203. ; ScreenDumpAlpha
  204. ;
  205.  
  206. ScreenDumpAlpha    PROC    near        ; Caller:    DS = DGROUP
  207.  
  208.         call    PrinterGraphics    ; configure the printer for graphics
  209.  
  210.         call    CGenModeSet    ; address EGA memory maps in parallel:
  211.                     ;  map 0 contains character codes
  212.                     ;  map 2 contains character definitions
  213.  
  214. ; copy screen dimensions from Video Display Data Area
  215.  
  216.         mov    ax,40h
  217.         mov    es,ax        ; ES -> video BIOS data area
  218.  
  219.         mov    al,es:[84h]    ; AX := ROWS
  220.         inc    ax
  221.         mov    Rows,ax
  222.         mov    ax,es:[4Ah]    ; AX := CRT_COLS
  223.         add    ax,ax        ; * 2 for proper buffer addressing
  224.         mov    Columns,ax
  225.         mov    ax,es:[85h]    ; AX := POINTS
  226.         mov    Points,ax
  227.         mul    Rows        ; AX := ROWS * POINTS
  228.         mov    PrintBufSize,ax
  229.  
  230. ; print the screen
  231.  
  232.         push    ds
  233.         pop    es        ; DS,ES := DGROUP
  234.  
  235.         xor    si,si        ; SI := offset of start of video buffer
  236.  
  237. L21:        push    si
  238.         mov    di,offset DGROUP:PrintBuf
  239.         call    TranslatePixels    ; copy one printable row of pixels
  240.  
  241.         mov    cx,PrintBufSize
  242.         mov    di,offset DGROUP:PrintBuf
  243.         call    PrintPixels    ; print them
  244.  
  245.         pop    si
  246.         add    si,2        ; increment to next character column
  247.         cmp    si,Columns    ; loop across all character columns
  248.         jb    L21
  249.                 
  250.         call    CGenModeClear    ; restore previous alphanumeric mode
  251.  
  252.         call    PrinterDefault    ; restore the printer to its default
  253.                     ;  state
  254.         ret
  255.  
  256. ScreenDumpAlpha    ENDP
  257.  
  258. ;
  259. ; CGenModeSet (from Chapter 10)
  260. ;
  261.  
  262. CGenModeSet    PROC    near
  263.  
  264.         push    si        ; preserve these registers
  265.         push    cx
  266.  
  267.         cli            ; disable interrupts
  268.         mov    dx,3C4h        ; Sequencer port address
  269.         mov    si,offset DGROUP:SetSeqParms
  270.         mov    cx,4
  271.  
  272. L31:        lodsw            ; AH := value for Sequencer register
  273.                     ; AL := register number
  274.         out    dx,ax        ; program the register
  275.         loop    L31
  276.         sti            ; enable interrupts
  277.  
  278.         mov    dl,0CEh        ; DX := 3CEH (Graphics Controller port
  279.                     ;        address)
  280.         mov    si,offset DGROUP:SetGCParms
  281.         mov    cx,3
  282.  
  283. L32:        lodsw            ; program the Graphics Controller
  284.         out    dx,ax
  285.         loop    L32
  286.  
  287.         pop    cx        ; restore registers and return
  288.         pop    si
  289.         ret        
  290.  
  291. CGenModeSet    ENDP
  292.  
  293.  
  294. ;
  295. ; CGenModeClear (from Chapter 10)
  296. ;
  297.  
  298. CGenModeClear    PROC    near
  299.  
  300.         push    si        ; preserve these registers
  301.         push    cx
  302.  
  303.         cli            ; disable interrupts
  304.         mov    dx,3C4h        ; Sequencer port address
  305.         mov    si,offset DGROUP:ClearSeqParms
  306.         mov    cx,4
  307.  
  308. L41:        lodsw            ; AH := value for Sequencer register
  309.                     ; AL := register number
  310.         out    dx,ax        ; program the register
  311.         loop    L41
  312.         sti            ; enable interrupts
  313.  
  314.         mov    dl,0CEh        ; DX := 3CEH (Graphics Controller port
  315.                     ;        address)
  316.         mov    si,offset DGROUP:ClearGCParms
  317.         mov    cx,3
  318.  
  319. L42:        lodsw            ; program the Graphics Controller
  320.         out    dx,ax
  321.         loop    L42
  322.  
  323.         mov    ah,0Fh        ; AH := INT 10H function number
  324.         int    10h        ; get video mode
  325.  
  326.         cmp    al,7
  327.         jne    L43        ; jump if not monochrome mode
  328.  
  329.         mov    ax,0806h    ; program Graphics Controller
  330.         out    dx,ax        ;  to start map at B000:0000
  331.  
  332. L43:        pop    cx        ; restore registers and return
  333.         pop    si
  334.         ret        
  335.  
  336. CGenModeClear    ENDP
  337.  
  338. _TEXT        ENDS
  339.  
  340.  
  341. _DATA        SEGMENT    word public 'DATA'
  342.  
  343. PrintBuf    DB    400 dup(?)    ; print output buffer
  344.  
  345. VideoBufSeg    DW    0A000h
  346.  
  347. EpsonGraphics    DB    1Bh,33h,18h
  348. EpsonReset    DB    1Bh,40h
  349. DataHeader    DB    1Bh,4Bh,00h,00h
  350. CRLF        DB    0Dh,0Ah
  351.  
  352. Columns        DW    ?        ; number of displayed character columns
  353. Rows        DW    ?        ; number of displayed character rows
  354. Points        DW    ?        ; vertical size of character matrix
  355. PrintBufSize    DW    ?        ; Rows * Points
  356.  
  357. SetSeqParms    DW    0100h        ; parameters for CGenModeSet
  358.         DW    0402h
  359.         DW    0704h
  360.         DW    0300h
  361.  
  362. SetGCParms    DW    0204h
  363.         DW    0005h
  364.         DW    0006h
  365.  
  366. ClearSeqParms    DW    0100h        ; parameters for CGenModeClear
  367.         DW    0302h
  368.         DW    0304h
  369.         DW    0300h
  370.  
  371. ClearGCParms    DW    0004h
  372.         DW    1005h
  373.         DW    0E06h
  374.  
  375. _DATA        ENDS
  376.  
  377.         END
  378.