home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk10 / apps / mandel / setscan.asm < prev   
Encoding:
Assembly Source File  |  1988-08-11  |  15.1 KB  |  668 lines

  1. page    ,132
  2. ;***************************************************************************
  3. ;                                       *
  4. ;        Copyright (C) 1987 by Microsoft Inc.               *
  5. ;                                       *
  6. ;***************************************************************************
  7. title    SetScan - Set An EGA Scan to the Given Colors
  8.  
  9.  
  10.  
  11.  
  12. .286c                    ;Allow iAPX80286 instructions
  13.  
  14. memM    equ    1            ;define middle model program
  15. ?PLM=1
  16. ?WIN=0
  17.  
  18.  
  19.  
  20. .xlist
  21. include cmacros.inc
  22. include ega.inc
  23. .list
  24.  
  25.  
  26. ScreenWidthB    equ    80        ;Width of screen in bytes
  27. ScreenSize    equ    14000        ;Size of screen plane in words
  28.  
  29. ;**    define segment for ring 2 IOPL code
  30.  
  31. createSeg    _SCRIO,  SCRIO,  byte,     public, CODE
  32. scrioOFFSET equ OFFSET _SCRIO:
  33.  
  34. sBegin    data
  35.  
  36. ;**    These routines assume that the following two external values are
  37. ;    initialized before any routine is called.
  38.  
  39.  
  40.     extrn    _dpoffset:word        ;EGA display page offset
  41.     extrn    _psel:word        ;selector array for EGA memory
  42.  
  43. sEnd    data
  44.  
  45. sBegin    scrio
  46. assumes cs,_scrio
  47. assumes ds,data
  48.  
  49.  
  50.  
  51.  
  52. ;**    SetDVideo  - disable video
  53. ;
  54. ;    SetDVideo disable video to prevent snow and flicker during state
  55. ;    changes of the EGA.  A call to SetEVideo must be made to reenable
  56. ;    the video.
  57. ;
  58. ;    SetDVideo ();
  59. ;
  60. ;    Entry    none
  61. ;    Exit    EGA video blanked
  62. ;    Returns none
  63. ;    Calls    dvideo
  64.  
  65.  
  66. cProc    SetDvideo,<FAR,PUBLIC>,<>
  67.  
  68. cBegin
  69.     call    bvd            ;blank video display
  70. cEnd
  71.  
  72.  
  73.  
  74.  
  75. ;**    SetEVideo  - enable video
  76. ;
  77. ;    SetEVideo renables video
  78. ;
  79. ;    SetEVideo ();
  80. ;
  81. ;    Entry    none
  82. ;    Exit    EGA video restored
  83. ;    Returns none
  84. ;    Calls    evideo
  85.  
  86.  
  87. cProc    SetEvideo,<FAR,PUBLIC>,<>
  88.  
  89. cBegin
  90.     call    evd            ;enable video display
  91. cEnd
  92.  
  93.  
  94.  
  95.  
  96. ;**    SetScan - Set One Scan to Given Colors
  97. ;
  98. ;    The given scan line is set to the colors passed in.
  99. ;
  100. ;    SetScan (row, count, values);
  101. ;
  102. ;    Entry    row = row to write
  103. ;        count = number of bytes of display data
  104. ;        values = pointer to character array of bit values
  105. ;    Exit    display page forced to 0
  106. ;        display row updated
  107. ;    Returns none
  108. ;    The display adapter must be initialized before invoking this
  109. ;    routine.
  110.  
  111.  
  112.  
  113. cProc    SetScan,<FAR,PUBLIC>,<si,di,es>
  114.     parmW    Y
  115.     parmW    count
  116.     parmW    pMapped
  117.  
  118. cBegin
  119.     cld
  120.     xor    bx,bx            ;force display to page 0
  121.     call    sdp            ;set display page
  122.     mov    ax,Y            ;Compute start of scan that will
  123.     mov    di,ScreenWidthB     ;  be set to the passed colors
  124.     mul    di
  125.     mov    di,ax
  126.     mov    si,_psel        ;es:di --> scan on the EGA
  127.     mov    es,word ptr [si]
  128.     mov    dx,rGraphics        ;Set the Graphics Controller's
  129.     mov    al,rBitmask        ;  address register to point to
  130.     out    dx,al            ;  the bitmask register
  131.     inc    dx            ;--> Graphics Controller's data register
  132.     mov    ah,10000000b        ;Set mask for initial pixel
  133.     mov    cx,count        ;Set count of pixels
  134.     jcxz    ssr2            ;None, exit now
  135.     mov    si,offset pMapped    ;ds:si --> pixel colors
  136.     xor    bx,bx            ;Zero is always handy!
  137.  
  138. ssr1:    mov    al,ah            ;Set BitMask register to only alter
  139.     out    dx,al            ;  pixel of interest
  140.     ror    ah,1            ;Set up for next pixel
  141.     lodsb                ;Get color for this pixel
  142.  
  143.  
  144. ;    The BitMask register allows bits to be protected from changes.
  145. ;    It works in conjunction with some internal EGA latches.  Every
  146. ;    time a read operation from EGA memory is performed, the latches
  147. ;    are loaded with the data read from each plane (one 8-bit latch
  148. ;    per plane).  Wherever the BitMask register is a "0", the EGA
  149. ;    writes data from the latches.  Wherever the BitMask register is
  150. ;    a "1", the data from the host is written.  This is not implemented
  151. ;    in the hardware as a read/modify/write operation, so the user
  152. ;    must load the latches explicitly.
  153.  
  154.  
  155.     xchg    es:[di],al        ;Load latches, write color to the pixel
  156.     adc    di,bx            ;Possibly --> next destination byte
  157.     loop    ssr1            ;Until all pixels drawn.
  158.  
  159. ssr2:    mov    al,0ffh         ;Set mask for all pixel
  160.     out    dx,al
  161. cEnd
  162.  
  163.  
  164.  
  165.  
  166. ;**    SetScanClear - clear video display memory
  167. ;
  168. ;    SetScanClear clears the 28000 bytes of video memory starting at
  169. ;    the page offset specified in _dpoffset.
  170. ;
  171. ;    SetScanClear ();
  172. ;
  173. ;    Entry    none
  174. ;    Exit    EGA video memory cleared
  175. ;    Returns none
  176. ;    Calls    cdm
  177.  
  178.  
  179. cProc    SetScanClear,<FAR,PUBLIC>,<>
  180.  
  181. cBegin
  182.     call    bvd            ;blank video display
  183.     mov    cx,_dpoffset
  184.     call    cdm            ;clear display memory
  185.     call    evd            ;enable video display
  186. cEnd
  187.  
  188.  
  189.  
  190.  
  191. ;**    SetScanRestore - restore graphics display
  192. ;
  193. ;    Restore active EGA display page from saved image
  194. ;    SetScanRestore (ressel);
  195. ;
  196. ;    Entry    ressel = far pointer to array of selectors to segments
  197. ;             containing graphics image to be restored
  198. ;        _dpoffset = offset of active display page
  199. ;    Exit    graphics image restored
  200. ;    Returns none
  201.  
  202.  
  203. cProc    SetScanRestore,<FAR,PUBLIC>,<si,di,es,ds>
  204.     parmD    ressel
  205.  
  206. cBegin
  207.     mov    cx,_dpoffset        ;(cx) = display page to clear
  208.     call    cdm            ;clear display memory
  209.     mov    bx,_psel        ;(es) = display selector
  210.     mov    es,word ptr [bx]
  211.  
  212. ;    Restore graphics memory.
  213. ;    This is done by enabling each 32k bank of graphics memory
  214. ;    and copying memory from the restore segments.
  215.  
  216.     mov    dx,rGraphics        ;Set the Graphics Controller's
  217.     mov    ax,0*256+rMode
  218.     out    dx,ax
  219.     mov    al,rBitmask        ;  address register to point to
  220.     mov    ah,0ffh         ;Set mask for initial pixel
  221.     out    dx,ax            ;  the bitmask register
  222.     mov    dx,rSequencer        ;(dx) = sequencer register address
  223.     mov    al,rMapMask        ;write to sequencer map mask register
  224.     mov    ah,C0            ;select plane C0
  225.     out    dx,ax
  226.     push    ds            ;save (ds) for later
  227.     mov    bx,_dpoffset        ;move display offset to stack
  228.     push    bx
  229.     lds    bx,ressel        ;(ds:bx) = address of restore selector
  230.     mov    ds,[bx]         ;(ds) = first selector
  231.     xor    si,si            ;(si) = offset into restore segment
  232.     pop    di            ;(di) = offset into display memory
  233.     push    di
  234.     mov    cx,ScreenSize        ;copy image to plane C0
  235.     rep    movsw
  236.     mov    ah,C1            ;select plane C1
  237.     out    dx,ax
  238.     pop    di            ;(di) = offset into display memory
  239.     push    di
  240.     mov    cx,ScreenSize        ;copy image to plane C1
  241.     rep    movsw
  242.     lds    bx,ressel        ;(ds:bx) = address of restore selector
  243.     mov    ds,[bx+2]        ;(ds) = second selector
  244.     xor    si,si            ;(si) = offset into restore segment
  245.     mov    ah,C2            ;select plane C2
  246.     out    dx,ax
  247.     pop    di            ;(di) = offset into display memory
  248.     push    di
  249.     mov    cx,ScreenSize        ;copy image to plane C2
  250.     rep    movsw
  251.     mov    ah,C3            ;select plane C3
  252.     out    dx,ax
  253.     pop    di            ;(di) = offset into display memory
  254.     mov    cx,ScreenSize        ;copy image to C3
  255.     rep    movsw
  256.     pop    ds
  257.  
  258. ;    set start address register
  259.  
  260.     mov    bx,_dpoffset
  261.     call    sdp            ;set display page
  262. cEnd
  263.  
  264.  
  265.  
  266.  
  267. ;**    SetScanRFont - restore EGA font table
  268. ;
  269. ;    SetScanRFont restores the EGA font tables saved by SetScanSFont.
  270. ;
  271. ;    SetScanRFont (fontsel);
  272. ;
  273. ;    Entry    fontsel = selector for font save memory
  274. ;    Exit    EGA font table restored from font save segment
  275. ;    Returns none
  276. ;    Calls    ifa, tfa
  277.  
  278.  
  279. cProc    SetScanRFont,<FAR,PUBLIC>,<si,di,es>
  280.     parmW    frsel
  281.  
  282. cBegin
  283.     mov    si,_psel        ;(es) = display selector
  284.     mov    es,word ptr [si]
  285.     push    ds
  286.     call    ifa            ;initialize font addressing
  287.     mov    bx,frsel        ;(bx) = font restore selector
  288.     mov    ds,bx            ;(ds) = font selector
  289.     xor    si,si            ;(si) = offset into restore segment
  290.     xor    di,di            ;(di) = offset into display
  291.     mov    cx,08000h        ;copy 32k words to plane C2
  292.     rep    movsw            ;copy memory
  293.     pop    ds
  294.     call    tfa            ;terminate font table addressing
  295. cEnd
  296.  
  297.  
  298.  
  299. ;**    SetScanSave - Save graphics display
  300. ;
  301. ;    Copy active page of display memory to RAM save buffer.
  302. ;
  303. ;    SetScanSave (savesel);
  304. ;
  305. ;    Entry    savsel = far pointer to array of selectors for segments
  306. ;             used to save graphics image
  307. ;        _dpoffset = offset of active EGA display page
  308. ;    Exit    graphics image saved
  309. ;    Returns none
  310.  
  311.  
  312. cProc    SetScanSave,<FAR,PUBLIC>,<si,di,ds,es>
  313.     parmD    savesel         ;far pointer to array of save selectors
  314.  
  315. cBegin
  316.     les    bx,savesel        ;(es:bx) = address of save selector
  317.     mov    es,es:[bx]        ;(es) = first selector
  318.     mov    bx,_dpoffset        ;(bx) = offset into display memory
  319.     push    bx
  320.     mov    dx,rGraphics        ;(dx) = address of graphics controller
  321.     mov    al,rReadMap
  322.     mov    ah,rmC0         ;set read map select to plane 0
  323.     out    dx,ax            ;
  324.     mov    si,_psel        ;(ds) = display selector
  325.     mov    ds,word ptr [si]
  326.     mov    si,bx            ;(si) = offset into display
  327.     xor    di,di            ;offset into save memory
  328.     mov    cx,ScreenSize        ;copy image from plane C0
  329.     rep    movsw            ;copy memory
  330.     mov    ah,rmC1         ;select plane 1
  331.     out    dx,ax
  332.     mov    si,bx            ;(si) = offset into display
  333.     mov    cx,ScreenSize        ;copy image from plane C1
  334.     rep    movsw
  335.     les    bx,savesel        ;(es:bx) = address of save selector
  336.     mov    es,es:[bx+2]        ;(es) = second selector
  337.     pop    bx            ;(bx) = offset into display memory
  338.     mov    ah,rmC2         ;select plane 2
  339.     out    dx,ax
  340.     mov    si,bx            ;(si) = offset into display
  341.     xor    di,di            ;offset into save memory
  342.     mov    cx,ScreenSize        ;copy image from plane C2
  343.     rep    movsw            ;copy memory
  344.     mov    ah,rmC3         ;select plane 3
  345.     out    dx,ax
  346.     mov    si,bx            ;(si) = offset into display
  347.     mov    cx,ScreenSize        ;copy image from C3
  348.     rep    movsw
  349.     mov    ah,rmC0         ;set read map select to plane 0
  350.     out    dx,ax            ;
  351. cEnd
  352.  
  353.  
  354.  
  355.  
  356. ;**    SetScanSFont - save font tables
  357. ;
  358. ;    SetScanSFont (fontsel);
  359. ;
  360. ;    Entry    fontsel = selector for font save memory
  361. ;    Exit    EGA font table saved in font save segment
  362. ;    Returns none
  363. ;    Calls    ifa, tfa
  364.  
  365.  
  366. cProc    SetScanSFont,<FAR,PUBLIC>,<si,di,es>
  367.     parmW    fssel
  368.  
  369. cBegin
  370.     call    ifa            ;initialize font addressing
  371.     push    ds
  372.     mov    bx,fssel        ;(bx) = font save selector
  373.     mov    es,bx            ;(es) = font save selector
  374.     mov    si,_psel        ;(ds) = display selector
  375.     mov    ds,word ptr [si]
  376.     xor    si,si            ;(si) = offset into display
  377.     xor    di,di            ;offset into save memory
  378.     mov    cx,8000h        ;copy 32k words from plane C0
  379.     rep    movsw            ;copy memory
  380.     pop    ds            ;(ds) = data segment selector
  381. cEnd
  382.  
  383.  
  384.  
  385.  
  386. ;*    bvd - blank video display
  387. ;
  388. ;    bvd blanks the video display by preventing access to the
  389. ;    palette registers.
  390. ;
  391. ;    Entry    none
  392. ;    Exit    display blanked
  393. ;    Returns none
  394. ;    Calls    wvs
  395. ;    Uses    al, dx
  396.  
  397. cProc    bvd,<NEAR>,<>
  398.  
  399. cBegin
  400.     call    wvs            ;wait for vertical resynch
  401.     mov    dx,rAttread        ;read feature control to reset
  402.     in    al,dx            ;internal flipflop to force address
  403.     mov    dx,rAttwrite
  404.     mov    al,000H         ;disable access to palette
  405.     out    dx,al
  406. cEnd
  407.  
  408.  
  409.  
  410.  
  411. ;*    cdm - clear display memory
  412. ;
  413. ;    cdm clears the 28000 bytes of memory starting at the address
  414. ;    pointed to by (cx)
  415. ;
  416. ;    Entry    cx = offset of page to clear
  417. ;    Exit    display memory cleared
  418. ;    Returns none
  419. ;    Calls    sdm
  420. ;    Uses    ax, bx, cx, dx
  421.  
  422.  
  423. cProc    cdm,<NEAR,PUBLIC>,<di, es>
  424.  
  425. cBegin
  426.     mov    bx,_psel        ;(es) = display selector
  427.     mov    es,word ptr [bx]
  428.     mov    bx,cx            ;(bx) = display offset
  429.  
  430.  
  431. ;    Clear graphics memory.
  432. ;    This is done by enabling each 32k bank of graphics memory
  433. ;    and storing zeroes.
  434.  
  435.     mov    dx,rGraphics        ;Set the Graphics Controller's
  436.     mov    al,rBitmask        ;  address register to point to
  437.     mov    ah,0ffh         ;Set mask for initial pixel
  438.     out    dx,ax            ;  the bitmask register
  439.     mov    dx,rSequencer        ;(dx) = sequencer register address
  440.     mov    al,rMapMask        ;write to sequencer map mask register
  441.     mov    ah,C0            ;select plane C0
  442.     out    dx,ax
  443.     mov    di,bx            ;(di) = offset into display memory
  444.     mov    cx,ScreenSize        ;copy image to plane C0
  445.     xor    ax,ax
  446.     rep    stosw
  447.     mov    al,rMapMask        ;write to sequencer map mask register
  448.     mov    ah,C1            ;select plane C1
  449.     out    dx,ax
  450.     mov    di,bx            ;(di) = offset into display memory
  451.     mov    cx,ScreenSize        ;copy image to plane C1
  452.     xor    ax,ax
  453.     rep    stosw
  454.     mov    al,rMapMask        ;write to sequencer map mask register
  455.     mov    ah,C2            ;select plane C2
  456.     out    dx,ax
  457.     mov    di,bx            ;(di) = offset into display memory
  458.     mov    cx,ScreenSize        ;copy image to plane C2
  459.     xor    ax,ax
  460.     rep    stosw
  461.     mov    al,rMapMask        ;write to sequencer map mask register
  462.     mov    ah,C3            ;select plane C3
  463.     out    dx,ax
  464.     mov    di,bx            ;(di) = offset into display memory
  465.     mov    cx,ScreenSize        ;copy image to C3
  466.     xor    ax,ax
  467.     rep    stosw
  468.     call    sdm            ;set display mode
  469. cEnd
  470.  
  471.  
  472.  
  473.  
  474. ;*    evd - enable video display
  475. ;
  476. ;    evd enables the video display by reenabling access to the
  477. ;    palette registers
  478. ;
  479. ;    Entry    none
  480. ;    Exit    video display restored
  481. ;    Returns none
  482. ;    Calls    none
  483. ;    Uses    al, dx
  484.  
  485.  
  486. cProc    evd,<NEAR>,<>
  487.  
  488. cBegin
  489.     mov    dx,rAttread        ;read feature control to reset
  490.     in    al,dx            ;internal flipflop to force address
  491.     mov    dx,rAttwrite
  492.     mov    al,020H         ;allow access to palette
  493.     out    dx,al
  494. cEnd
  495.  
  496.  
  497.  
  498.  
  499. ;**    ifa - initialize font addressing
  500. ;
  501. ;    initialize EGA to allow read of font tables
  502. ;
  503. ;    Entry    none
  504. ;    Exit    EGA addressing set up
  505. ;    Returns none
  506.  
  507.  
  508. cProc    ifa,<NEAR>,<>
  509.  
  510. cBegin
  511.     mov    dx,rGraphics
  512.     mov    ax,0204h
  513.     cli
  514.     out    dx,ax            ;Read Map Select register
  515.     mov    ax,0005h
  516.     out    dx,ax            ;Graphics Mode register
  517.     mov    ax,0406h
  518.     out    dx,ax            ;Graphics Misc register
  519.     mov    dx,rSequencer
  520.     mov    ax,0C02h
  521.     out    dx,ax            ;Write Map Select
  522.     mov    ax,0404h
  523.     out    dx,ax            ;Turn on odd/even
  524.     sti
  525. cEnd
  526.  
  527.  
  528.  
  529.  
  530. ;*    sdm - set display mode
  531. ;
  532. ;    sdm restores the EGA to the default graphics mode
  533. ;
  534. ;    Entry    none
  535. ;    Exit    default graphics display mode reestablished
  536. ;    Returns none
  537. ;    Calls    none
  538. ;    Uses    ax, dx
  539.  
  540.  
  541. cProc    sdm,<NEAR>,<si,di,es>
  542.  
  543. cBegin
  544.     mov    dx,rSequencer        ;Enable all planes for writing
  545.     mov    ah,C0+C1+C2+C3
  546.     mov    al,rMapMask
  547.     out    dx,ax
  548.     mov    dx,rGraphics        ;-->Graphics Controller
  549.     mov    ax,0*256+rEnableSR    ;Clear any set/reset enable
  550.     out    dx,ax
  551.  
  552.  
  553. ;    Color Write Mode takes data from the host as a color.  D0 of
  554. ;    the host data is taken as the color for plane C0, D1 for plane
  555. ;    C1, etc.  The color for each plane is written to all bits of
  556. ;    the destination byte which are enabled in the BitMask Register.
  557.  
  558.  
  559.     mov    ax,(mColorWrite+mDataRead)*256+rMode
  560.     out    dx,ax
  561.  
  562.  
  563. ;    The Data Rotate register allows a boolean function between
  564. ;    the data from the host and the data in the EGA's latches
  565. ;    to occur.  It also allows the data from the host to be
  566. ;    rotated by some count before the operation occurs.
  567.  
  568.  
  569.     mov    ax,(drSet*256)+rDataRotate
  570.     out    dx,ax
  571. cEnd
  572.  
  573.  
  574.  
  575.  
  576. ;*    sdp - set display page
  577. ;
  578. ;    sdp sets the current display page by setting the display offset
  579. ;    to the value in bx
  580. ;
  581. ;    Entry    bx = page offset
  582. ;    Exit    disply page address set
  583. ;    Returns none
  584. ;    Calls    wvs
  585. ;    Uses    ax,dx
  586.  
  587.  
  588. cProc    sdp,<NEAR>,<>
  589.  
  590. cBegin
  591.     call    wvs            ;wait for vertical synch
  592.     mov    dx,rCRTC        ;(dx) = CRT controller
  593.     mov    al,rSahr        ;(al) = high address register
  594.     mov    ah,bh            ;(ah) = upper byte of address
  595.     out    dx,ax
  596.     mov    al,rSalr
  597.     mov    ah,bl            ;(ah) = low byte of address
  598.     out    dx,ax
  599. cEnd
  600.  
  601.  
  602.  
  603.  
  604. ;**    tfa - terminate font addressing
  605. ;
  606. ;    terminate font table addressing mode
  607. ;
  608. ;    Entry    none
  609. ;    Exit    EGA returned to normal addressing mode
  610. ;    Returns none
  611.  
  612.  
  613. cProc    tfa,<NEAR>,<>
  614.  
  615. cBegin
  616.     mov    cx,0e06h        ;Setup color buffer with chaining
  617.     mov    dx,rGraphics
  618.     mov    ax,0004h
  619.     cli
  620.     out    dx,ax            ;Read Map Select register
  621.     mov    ax,1005h
  622.     out    dx,ax            ;Graphics Mode register
  623.     mov    ax,0e06h        ;Setup color buffer with chaining
  624.     out    dx,ax            ;Graphics Misc register
  625.     mov    dx,rSequencer
  626.     mov    ax,0302h
  627.     out    dx,ax            ;Write Map Select
  628.     mov    ax,0004h
  629.     out    dx,ax            ;Turn off odd/even
  630.     sti
  631. cEnd
  632.  
  633.  
  634.  
  635.  
  636. ;*    wvs - wait for vertical synch
  637. ;
  638. ;    wvs waits for the leading edge of the vertical synch pulse
  639. ;
  640. ;    Entry    none
  641. ;    Exit    leading edge of vertical synch encountered
  642. ;    Returns none
  643. ;    Calls    none
  644. ;    Uses    al, dx
  645.  
  646.  
  647. cProc    wvs,<NEAR>,<>
  648.  
  649. cBegin
  650.     mov    dx,rAttread        ;read feature control to reset
  651.  
  652. ;    wait until not in vertical retrace
  653.  
  654. wvs1:    in    al,dx            ;internal flipflop to force address
  655.     test    al,mVRetrace        ;check for vertical retrace
  656.     jnz    wvs1            ;if vertical retrace set
  657.  
  658. ;    wait for start of vertical retrace
  659.  
  660. wvs2:    in    al,dx            ;internal flipflop to force address
  661.     test    al,mVRetrace        ;check for vertical retrace
  662.     jz    wvs2            ;if vertical retrace not set
  663. cEnd
  664.  
  665.  
  666. sEnd    scrio
  667. end
  668.