home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / DRV256 / GXSPPT.ASM < prev    next >
Assembly Source File  |  1992-12-08  |  15KB  |  963 lines

  1.     TITLE    GSPPT - 320x200x16 mode support
  2.     NAME    GSPPT
  3.  
  4.  
  5.     COMMENT    $
  6.  
  7.     Name:        GXSPPT
  8.  
  9.         Written and (c) by Dave Stampe 9/11/91
  10.         Not for commercial use, so get permission
  11.         before marketing code using this stuff!
  12.         For private PD use only.
  13.  
  14.         $
  15.  
  16.         .MODEL LARGE
  17.         .CODE
  18.  
  19.  ;
  20.  ; void vsync();        /* waits for vert. sync pulse */
  21.  ;
  22.         PUBLIC    _vsync
  23.  
  24. _vsync    proc    far
  25.  
  26.     push    bp
  27.     push    dx
  28.     pushf
  29.     mov    bp,sp
  30.     mov    dx,03DAh
  31.     cli
  32.     in    al,dx        ; test if 0
  33.     test    al,8
  34.     je    short @11@218
  35. @11@122:
  36.     popf
  37.     pushf
  38.     cli
  39.     in    al,dx
  40.     nop
  41.     test    al,8            ; wait for 0
  42.     jne    short @11@122
  43. @11@218:
  44.     popf
  45.     pushf
  46.     cli
  47.     in    al,dx
  48.     nop
  49.     test    al,8            ; wait for 1
  50.     je    short @11@218
  51.     popf
  52.     pop    dx
  53.     pop    bp
  54.     ret
  55.  
  56. _vsync    endp
  57.  
  58.  ;
  59.  ; void setup_hdwe(int mode);    /* sets up VGA for line, poly draw */
  60.  ;                              /* modes are: 0=PUT, 1=OR,         */
  61.  ;                /*          2=AND, 3=XOR         */
  62.  ;                /* only PUT for X-mode             */
  63.  
  64.         PUBLIC    _setup_hdwe
  65.  
  66. _setup_hdwe    proc    far
  67.  
  68.     push    bp
  69.     mov    bp,sp
  70.     push    dx
  71.     mov    dx,03CEH
  72.     mov    ax,00008h               ; all display copy bits
  73.     out    dx,ax
  74.  
  75.     mov    dx,03c4h        ; prepare plane mask reg. for access
  76.     mov    ax,0f02h
  77.     out    dx,ax
  78.     pop    dx
  79.     pop    bp
  80.     ret
  81.  
  82. _setup_hdwe    endp
  83.  
  84.  ;
  85.  ; void reset_hdwe()
  86.  ;
  87.  
  88.         PUBLIC    _reset_hdwe
  89.  
  90. _reset_hdwe    proc    far
  91.  
  92.     push    bp
  93.     mov    bp,sp
  94.     push    dx
  95.     mov    dx,03CEH
  96.     mov    ax,0FF08h               ; all CPU data bits
  97.     out    dx,ax
  98.  
  99.     mov    dx,03c4h        ; prepare plane mask reg. for access
  100.     mov    ax,0f02h
  101.     out    dx,al
  102.     pop    dx
  103.     pop    bp
  104.     ret
  105.  
  106. _reset_hdwe    endp
  107.  
  108.  ;
  109.  ; int clr_page(int page, int color);    /* clear page to color */
  110.  ;
  111.  ;  /* returns 0 if OK, 1 if bad page */
  112.  
  113.         PUBLIC    _clr_page
  114.  
  115. _clr_page    proc    far
  116.  
  117.     push    bp
  118.     mov    bp,sp
  119.     sub    sp,10
  120.     push    di
  121.     push    cx
  122.     push    dx
  123.     cld
  124.     mov     cx,word ptr [bp+6]
  125.     cmp    cx,3               ; check for valid page
  126.     jle    gdpage
  127.     mov    ax,65535
  128.     jmp    abbort
  129. gdpage:
  130.     call    far ptr _setup_hdwe     ; reset to default VGA mode
  131.     cld
  132.     mov    ax,0A000h
  133.     mov    es,ax
  134.     mov    bl,BYTE PTR [bp+8]
  135.     mov    bh,0ffh            ; figure what entry to read
  136.     mov    al,es:[bx]          ; read entry into latches
  137.  
  138.     mov     ax,word ptr [bp+6]
  139.     mov    cx,16000
  140.     mul    cx
  141.     mov    di,ax
  142.  
  143.     rep    stosb
  144.     call    far ptr _reset_hdwe
  145.     xor    ax,ax
  146. abbort:
  147.     pop    dx
  148.     pop    cx
  149.     pop    di
  150.     mov    sp,bp
  151.     pop    bp
  152.     ret
  153.  
  154. _clr_page    endp
  155.  
  156.    ;
  157.    ;    int copy_page(int source, int dest)
  158.    ;
  159.    ;    /* returns 0 if OK, 1 if bad page */
  160.  
  161.         PUBLIC    _copy_page
  162.  
  163. _copy_page    proc    far
  164.  
  165.     push    bp
  166.     mov    bp,sp
  167.     sub    sp,4
  168.     push    si
  169.     push    di
  170.     push    cx
  171.     push    dx
  172.     cmp    word ptr [bp+6],3
  173.     jg    short @15@74            ; check for valid page #'s
  174.     cmp    word ptr [bp+8],3
  175.     jle    short @15@98
  176. @15@74:
  177.     mov    ax,65535
  178.     jmp    short @15@506
  179. @15@98:
  180.     call    far ptr _setup_hdwe       ; write VGA state
  181.     push    ds
  182.     cld
  183.     mov    ax,0A000h
  184.     mov    es,ax
  185.     mov    ds,ax
  186.     mov    cx,16000
  187.     mov    ax,word ptr [bp+6]        ; compute source address
  188.     mul    cx
  189.     mov    si,ax
  190.     mov    ax,word ptr [bp+8]    ; compute dest. address
  191.     mul    cx
  192.     mov    di,ax
  193.  
  194.     rep    movsb
  195.  
  196.     call    far ptr _reset_hdwe
  197.     pop    ds
  198.     xor    ax,ax
  199. @15@506:
  200.     pop    dx
  201.     pop    cx
  202.     pop    di
  203.     pop    si
  204.     mov    sp,bp
  205.     pop    bp
  206.     ret
  207.  
  208. _copy_page    endp
  209.  
  210.  
  211.  ;
  212.  ; void vga_reg(int reg)     /* integer: lsby=reg(0=color), msby=value */
  213.  ;
  214.  
  215.         PUBLIC    _vga_reg
  216.  
  217. _vga_reg    proc    far
  218.  
  219.     push    bp
  220.     mov    bp,sp
  221.     push    dx
  222.     mov    dx,03CEH
  223.     mov    ax,WORD PTR [bp+6]
  224.     out    dx,ax
  225.     pop    dx
  226.     pop    bp
  227.     ret
  228.  
  229. _vga_reg    endp
  230.  
  231.  
  232.  
  233.  ;
  234.  ; void load_color(int color)    /* integer: loads latches with color */
  235.  ;
  236.  
  237.         PUBLIC    _load_color
  238.  
  239. _load_color    proc    far
  240.  
  241.     push    bp
  242.     mov    bp,sp
  243.     mov    ax,0a000h
  244.     mov    es,ax
  245.     mov    bl,BYTE PTR [bp+6]
  246.     mov    bh,0ffh        ; figure what entry to read
  247.     mov    al,es:[bx]      ; read entry into latches
  248.     pop    bp
  249.     ret
  250.  
  251. _load_color    endp
  252.  
  253.  
  254.  ;
  255.  ; void _set_vmode(int mode)    /* enters video mode thru BIOS */
  256.  ;                              /* mode: clear if MSB not 0    */
  257.  ;                /* mode 14h = X-mode           */
  258.  
  259.         PUBLIC    _set_vmode
  260.  
  261. _set_vmode    proc    far
  262.  
  263.     push    bp
  264.     mov    bp,sp
  265.  
  266.     mov    ah,0
  267.     mov    al,BYTE PTR [bp+6]
  268.     mov    bl,al
  269.     and    bl,07fh
  270.     cmp    bl,14h
  271.     jz    setxmode
  272.     int    10h
  273.     pop    bp
  274.     ret
  275.  
  276. setxmode:
  277.     push    si
  278.     push    di
  279.     push    cx
  280.     push    dx
  281.     mov    ah,0        ; set 256-color mode
  282.     mov    al,13h
  283.     int    10h
  284.  
  285.     mov    dx,03c4h    ; convert to X-mode addressing
  286.     mov    ax,0604h        ; chain mode off
  287.     out     dx,ax
  288.  
  289.     mov    dx,03d4h
  290.     mov    ax,0014h        ; doubleword off
  291.     out    dx,ax
  292.     mov    ax,0E317h       ; byte mode on
  293.     out    dx,ax
  294.  
  295.     call     far ptr _reset_hdwe
  296.  
  297.     mov    ax,WORD PTR[bp+6]
  298.     test    al,080h
  299.     jnz    dontclear
  300.  
  301.     mov    ax,0f02h
  302.     out    dx,ax        ; clear all planes at once
  303.     mov    ax,0a000h
  304.     mov    es,ax
  305.     xor    di,di
  306.     mov    cx,0ffffh
  307.     xor    ax,ax
  308.     rep    stosb
  309.  
  310.     mov    di,0ff00h    ; setup latch color table
  311.     mov    cx,100h
  312.     xor    al,al
  313. ctloop:    stosb
  314.     inc    al
  315.     loop    ctloop
  316.  
  317. dontclear:
  318.     pop    dx
  319.     pop    cx
  320.     pop    di
  321.     pop    si
  322.     pop    bp
  323.     ret
  324.  
  325. _set_vmode    endp
  326.  
  327.  
  328.  ;
  329.  ; void _set_vpage(int page)    /* sets video page */
  330.  ;
  331.  
  332.         PUBLIC    _set_vpage
  333.  
  334. _set_vpage    proc    far
  335.  
  336.     push    bp
  337.     mov    bp,sp
  338.     push    si
  339.     push    di
  340.     push    cx
  341.     push    dx
  342.     mov    al,BYTE PTR [bp+6]
  343.     xor    ah,ah
  344.     cmp    al,4        ; check page #
  345.     jae    badpage
  346.  
  347.     mov    bx,16000
  348.     mul    bx
  349.  
  350.     mov    bh,ah
  351.     mov    ah,al           ; page # -> address
  352.     mov    al,0dh
  353.     mov    bl,0ch
  354.  
  355.     mov    dx,03d4h        ; set CRTC address
  356.     out    dx,ax
  357.     mov    ax,bx
  358.     out    dx,ax
  359. badpage:
  360.     pop    dx
  361.     pop    cx
  362.     pop    di
  363.     pop    si
  364.     pop    bp
  365.     ret
  366.  
  367. _set_vpage    endp
  368.  
  369.  
  370.                 ; bit reversal (plane mask) lookup table
  371.  
  372. bytrev:    db    000h,080h,040h,0c0h,020h,0a0h,060h,0e0h,010h,090h,050h,0d0h,030h,0b0h,070h,0f0h
  373.     db    008h,088h,048h,0c8h,028h,0a8h,068h,0e8h,018h,098h,058h,0d8h,038h,0b8h,078h,0f8h
  374.     db    004h,084h,044h,0c4h,024h,0a4h,064h,0e4h,014h,094h,054h,0d4h,034h,0b4h,074h,0f4h
  375.     db    00ch,08ch,04ch,0cch,02ch,0ach,06ch,0ech,01ch,09ch,05ch,0dch,03ch,0bch,07ch,0fch
  376.     db    002h,082h,042h,0c2h,022h,0a2h,062h,0e2h,012h,092h,052h,0d2h,032h,0b2h,072h,0f2h
  377.     db    00ah,08ah,04ah,0cah,02ah,0aah,06ah,0eah,01ah,09ah,05ah,0dah,03ah,0bah,07ah,0fah
  378.     db    006h,086h,046h,0c6h,026h,0a6h,066h,0e6h,016h,096h,056h,0d6h,036h,0b6h,076h,0f6h
  379.     db    00eh,08eh,04eh,0ceh,02eh,0aeh,06eh,0eeh,01eh,09eh,05eh,0deh,03eh,0beh,07eh,0feh
  380.     db    001h,081h,041h,0c1h,021h,0a1h,061h,0e1h,011h,091h,051h,0d1h,031h,0b1h,071h,0f1h
  381.     db    009h,089h,049h,0c9h,029h,0a9h,069h,0e9h,019h,099h,059h,0d9h,039h,0b9h,079h,0f9h
  382.     db    005h,085h,045h,0c5h,025h,0a5h,065h,0e5h,015h,095h,055h,0d5h,035h,0b5h,075h,0f5h
  383.     db    00dh,08dh,04dh,0cdh,02dh,0adh,06dh,0edh,01dh,09dh,05dh,0ddh,03dh,0bdh,07dh,0fdh
  384.     db    003h,083h,043h,0c3h,023h,0a3h,063h,0e3h,013h,093h,053h,0d3h,033h,0b3h,073h,0f3h
  385.     db    00bh,08bh,04bh,0cbh,02bh,0abh,06bh,0ebh,01bh,09bh,05bh,0dbh,03bh,0bbh,07bh,0fbh
  386.     db    007h,087h,047h,0c7h,027h,0a7h,067h,0e7h,017h,097h,057h,0d7h,037h,0b7h,077h,0f7h
  387.     db    00fh,08fh,04fh,0cfh,02fh,0afh,06fh,0efh,01fh,09fh,05fh,0dfh,03fh,0bfh,07fh,0ffh
  388.  
  389. xchar    equ    [bp+6]          ; arguments to _xprintc
  390.  
  391.     extrn    _dpaddr        ; page base address
  392.     extrn    _xcpline    ; line to print on
  393.     extrn    _xcpcol        ; column to print on
  394.  
  395.    ;
  396.    ;    xprintc(int character)
  397.    ;
  398.  
  399.         PUBLIC    _xprintc
  400.  
  401. _xprintc    proc    far
  402.  
  403.     .386
  404.  
  405.     push    bp
  406.     mov    bp,sp
  407.  
  408.     push    ds
  409.     push    di
  410.     push    si
  411.     push    cx
  412.     push    dx
  413.  
  414.     mov    ax,0a000h
  415.     mov    es,ax
  416.  
  417.     mov    ax,_xcpline       ; setup video address
  418.     imul    ax,80
  419.     mov     bx,_xcpcol
  420.     shr    bx,2
  421.     add    ax,bx
  422.     add    ax,_dpaddr
  423.     mov    di,ax
  424.  
  425.     xor    ah,ah
  426.     mov     al,xchar
  427.     shl    ax,3
  428.  
  429.     mov    cx,3
  430.     sub    cx,_xcpcol
  431.     and    cx,3
  432.  
  433.     xor    bx,bx
  434.     mov    ds,bx
  435.     mov    bx,43h*4
  436.     lds    si,ds:[bx]
  437.     add     si,ax
  438.  
  439.     mov    dx,03c4h      ; setup for plane mask access
  440.     mov    al,2
  441.     out    dx,al
  442.     inc    dx
  443.  
  444.     mov    WORD PTR xchar,8
  445.  
  446. nxtline:
  447.     mov    bl,ds:[si]          ; get,flip,shift pattern
  448.     xor    bh,bh
  449.     mov    bh,BYTE PTR cs:bytrev[bx]
  450.     xor    bl,bl
  451.     shr    bx,cl
  452.  
  453.     mov    al,bh              ; first 4 bits
  454.     shr    al,4
  455.     and    al,15
  456.     out    dx,al
  457.     mov    es:[di+2],al
  458.  
  459.     mov    al,bh              ; second 4 bits
  460.     and    al,15
  461.     out    dx,al
  462.     mov    es:[di+1],al
  463.  
  464.     mov    al,bl              ; last 4 bits
  465.     shr    al,4
  466.     and    al,15
  467.     out    dx,al
  468.     mov    es:[di],al
  469.  
  470.     inc    si
  471.     add    di,80
  472.     dec    WORD PTR xchar
  473.     jnz    nxtline
  474.  
  475.     pop    dx
  476.     pop    cx
  477.     pop    si
  478.     pop    di
  479.     pop    ds
  480.  
  481.     pop    bp
  482.     ret
  483.  
  484. _xprintc    endp
  485.  
  486.  
  487. xchar    equ    [bp+6]          ; arguments to _xprintc
  488.  
  489.      ;
  490.    ;    xrprintc(int character)    ; reversed: col. = right end
  491.    ;
  492.  
  493.         PUBLIC    _xrprintc
  494.  
  495. _xrprintc    proc    far
  496.  
  497.     .386
  498.  
  499.     push    bp
  500.     mov    bp,sp
  501.  
  502.     push    ds
  503.     push    si
  504.     push    di
  505.     push    cx
  506.     push    dx
  507.  
  508.     mov    ax,0a000h
  509.     mov    es,ax
  510.  
  511.     mov    ax,_xcpline       ; setup video address
  512.     imul    ax,80
  513.     mov     bx,_xcpcol
  514.     shr    bx,2
  515.     sub    bx,2          ; make it left side of rtmost char
  516.     add    ax,bx
  517.     add    ax,_dpaddr
  518.     mov    di,ax
  519.  
  520.     xor    ah,ah
  521.     mov     al,xchar
  522.     shl    ax,3
  523.  
  524.     mov    cx,3
  525.     sub    cx,_xcpcol
  526.     and    cx,3
  527.  
  528.     xor    bx,bx
  529.     mov    ds,bx
  530.     mov    bx,43h*4
  531.     lds    si,ds:[bx]
  532.     add     si,ax
  533.  
  534.     mov    dx,03c4h      ; setup for plane mask access
  535.     mov    al,2
  536.     out    dx,al
  537.     inc    dx
  538.  
  539.     mov    WORD PTR xchar,8
  540.  
  541. rnxtline:
  542.     mov    bh,ds:[si]          ; get,flip,shift pattern
  543.     xor    bl,bl
  544.     shr    bx,cl
  545.  
  546.     mov    al,bh              ; first 4 bits
  547.     shr    al,4
  548.     and    al,15
  549.     out    dx,al
  550.     mov    es:[di+2],al
  551.  
  552.     mov    al,bh              ; second 4 bits
  553.     and    al,15
  554.     out    dx,al
  555.     mov    es:[di+1],al
  556.  
  557.     mov    al,bl              ; last 4 bits
  558.     shr    al,4
  559.     and    al,15
  560.     out    dx,al
  561.     mov    es:[di],al
  562.  
  563.     inc    si
  564.     add    di,80
  565.     dec    WORD PTR xchar
  566.     jnz    rnxtline
  567.  
  568.     pop    dx
  569.     pop    cx
  570.     pop    di
  571.     pop    si
  572.     pop    ds
  573.  
  574.     pop    bp
  575.     ret
  576.  
  577. _xrprintc    endp
  578.  
  579.  
  580.  
  581.  ;
  582.  ; int save_8x8(int h, int y, int buffer, int address); /* save 8x8 at x,y */
  583.  ;                                 /* returns address */
  584.         PUBLIC    _save_8x8
  585.  
  586. xcoord equ [bp+6]
  587. ycoord equ [bp+8]
  588. buffer equ [bp+10]
  589.  
  590. _save_8x8    proc    far
  591.  
  592.     push    bp
  593.     mov    bp,sp
  594.     push    di
  595.     push    si
  596.     push    cx
  597.     push    dx
  598.  
  599.     mov    ax,ycoord
  600.     imul    ax,80
  601.     mov    si,xcoord
  602.     shr    si,2
  603.     add    si,ax
  604.     add    si,WORD PTR _dpaddr
  605.     push    si
  606.  
  607.     mov    di,0fe00h    ; temp. buffer
  608.     mov    ax,buffer
  609.     shl    ax,5
  610.     add    di,ax
  611.     mov    ax,0A000h
  612.     mov    es,ax
  613.     mov    cx,8
  614.  
  615. nxsl:    mov    al,es:[si]      ; move 12 so it always does 8
  616.     mov    BYTE PTR es:[di],0
  617.     mov    al,es:[si+1]
  618.     mov    BYTE PTR es:[di+1],0
  619.     mov    al,es:[si+2]
  620.     mov    BYTE PTR es:[di+2],0
  621.     add    si,80
  622.     add    di,3
  623.     loop    nxsl
  624.  
  625.     pop    ax
  626.     pop    dx
  627.     pop    cx
  628.     pop    si
  629.     pop    di
  630.     mov    sp,bp
  631.     pop    bp
  632.     ret
  633.  
  634. _save_8x8    endp
  635.  
  636.  ;
  637.  ; void rest_8x8(int buffer, int address);    /* restore 8x8 at x,y */
  638.  ;
  639.         PUBLIC    _rest_8x8
  640.  
  641. buffer  equ [bp+6]
  642. address equ [bp+8]
  643.  
  644. _rest_8x8    proc    far
  645.  
  646.     push    bp
  647.     mov    bp,sp
  648.     push    di
  649.     push    si
  650.     push    cx
  651.     push    dx
  652.  
  653.     mov    si,0fe00h    ; temp. buffer
  654.     mov    ax,buffer
  655.     shl    ax,5
  656.     add    si,ax
  657.     mov    di,address
  658.     mov    ax,0A000h
  659.     mov    es,ax
  660.     mov    cx,8
  661.  
  662. nxrl:    mov    al,es:[si]      ; move 12 so it always does 8
  663.     mov    BYTE PTR es:[di],0
  664.     mov    al,es:[si+1]
  665.     mov    BYTE PTR es:[di+1],0
  666.     mov    al,es:[si+2]
  667.     mov    BYTE PTR es:[di+2],0
  668.     add    si,3
  669.     add    di,80
  670.     loop    nxrl
  671.  
  672.     pop    dx
  673.     pop    cx
  674.     pop    si
  675.     pop    di
  676.     mov    sp,bp
  677.     pop    bp
  678.     ret
  679.  
  680. _rest_8x8    endp
  681.  
  682.  
  683.  ;
  684.  ; int clr_block(int l, int t, int r, int b, int page, int color);
  685.  ;  /* 8-pixel granularity  (next biggest) */
  686.  ;  /* returns 0 if OK, 1 if bad page      */
  687.  
  688. cbl     equ WORD PTR [bp+6]
  689. cbt     equ WORD PTR [bp+8]
  690. cbr     equ WORD PTR [bp+10]
  691. cbb     equ WORD PTR [bp+12]
  692. cbpage  equ WORD PTR [bp+14]
  693. cbcolor equ WORD PTR [bp+16]
  694.  
  695. bbyte   equ    [bp-2]       ; video base addr. of line
  696. abyte    equ    [bp-4]        ; number of lines to fill
  697. l_incr    equ    [bp-6]
  698.  
  699.         PUBLIC    _clr_block
  700.  
  701. _clr_block    proc    far
  702.  
  703.     push    bp
  704.     mov    bp,sp
  705.     sub    sp,10
  706.     push    di
  707.     push    cx
  708.     push    dx
  709.  
  710.     cld
  711.     call    far ptr _setup_hdwe     ; reset to default VGA mode
  712.     mov    ax,0A000h
  713.     mov    es,ax
  714.     mov    bx,cbcolor
  715.     add    bh,0ffh            ; figure what entry to read
  716.     mov    al,es:[bx]          ; read entry into latches
  717.  
  718.     mov     ax,cbpage
  719.     mov    cx,16000
  720.     mul    cx
  721.     mov    di,ax
  722.  
  723.     mov    bx,cbb
  724.     sub    bx,cbt            ; bx = line count
  725.     jb    badcb
  726.  
  727.     mov    ax,cbt
  728.     imul    ax,80
  729.     add    di,ax
  730.     mov    ax,cbl
  731.     shr    ax,3
  732.     shl    ax,1
  733.     add    di,ax            ; start address
  734.  
  735.     mov    cx,cbl
  736.     and    cx,0FFFCh
  737.     sub    cx,cbr
  738.     neg    cx
  739.     js      badcb
  740.     shr    cx,3
  741.     inc    cx
  742.     mov    ax,cx            ; count per line
  743.     shl    cx,1
  744.     sub    cx,80
  745.     jg    badcb
  746.     neg    cx
  747.     mov    dx,cx            ; fixup factor
  748.  
  749. cbloop:    mov    cx,ax
  750.     rep    stosw
  751.     add    di,dx
  752.     dec    bx
  753.     jge    cbloop
  754.  
  755.     call    far ptr _reset_hdwe
  756.     xor    ax,ax
  757.     jmp    cbexit
  758.  
  759. badcb:    mov    ax,-1
  760.  
  761. cbexit: pop    dx
  762.     pop    cx
  763.     pop    di
  764.     mov    sp,bp
  765.     pop    bp
  766.     ret
  767.  
  768.  
  769. _clr_block    endp
  770.  
  771.    ;
  772.    ;    int copy_block(int spage, int sx, int sy,
  773.    ;               int dpage, int dx, int dy,
  774.    ;               int xsize, int vsize )
  775.    ;
  776.    ;    /* returns 0 if OK, 1 if bad page */
  777.  
  778. copsp    equ WORD PTR [bp+6]
  779. copsx    equ WORD PTR [bp+8]
  780. copsy    equ WORD PTR [bp+10]
  781. copdp    equ WORD PTR [bp+12]
  782. copdx    equ WORD PTR [bp+14]
  783. copdy    equ WORD PTR [bp+16]
  784. copxs    equ WORD PTR [bp+18]
  785. copys    equ WORD PTR [bp+20]
  786.  
  787.         PUBLIC    _copy_block
  788.  
  789. _copy_block    proc    far
  790.  
  791.     push    bp
  792.     mov    bp,sp
  793.     sub    sp,4
  794.     push    si
  795.     push    di
  796.     push    cx
  797.     push    dx
  798.  
  799.     call    far ptr _setup_hdwe       ; write VGA state
  800.     push    ds
  801.     cld
  802.     mov    ax,0A000h
  803.     mov    es,ax
  804.     mov    ds,ax
  805.     mov    cx,16000
  806.     mov    ax,copsp            ; compute source address
  807.     mul    cx
  808.     mov    si,ax
  809.     mov    ax,copdp        ; compute dest. address
  810.     mul    cx
  811.     mov    di,ax
  812.  
  813.     mov    bx,copys                ; bx = line count
  814.  
  815.     mov    ax,copsy
  816.     imul    ax,80
  817.     add    si,ax
  818.     mov    ax,copsx
  819.     shr    ax,1
  820.     shr    ax,1
  821.     add    si,ax            ; start address
  822.  
  823.     mov    ax,copdy
  824.     imul    ax,80
  825.     add    di,ax
  826.     mov    ax,copdx
  827.     shr    ax,1
  828.     shr    ax,1
  829.     add    di,ax            ; start address
  830.  
  831.     mov    cx,copxs
  832.     add    cx,3
  833.     shr    cx,1
  834.     shr    cx,1
  835.     inc    cx
  836.     mov    ax,cx            ; count per line
  837.     sub    cx,80
  838.     neg    cx
  839.     mov    dx,cx            ; fixup factor
  840.  
  841. coplop:    mov    cx,ax
  842.     rep    movsb
  843.     add    si,dx
  844.     add    di,dx
  845.     dec    bx
  846.     jg    coplop
  847.  
  848.     call    far ptr _reset_hdwe
  849.     pop    ds
  850.     xor    ax,ax
  851.  
  852.     pop    dx
  853.     pop    cx
  854.     pop    di
  855.     pop    si
  856.     mov    sp,bp
  857.     pop    bp
  858.     ret
  859.  
  860. _copy_block    endp
  861.  
  862.  
  863.  ;
  864.  ; void load_DAC(char far *data, int count);
  865.  ;            /* loads DAC             */
  866.  
  867.  
  868.  count   equ [bp+10]
  869.  dacdata equ [bp+6]
  870.  
  871.     PUBLIC    _load_DAC
  872.  
  873. _load_DAC      proc    far
  874.  
  875.     push    bp
  876.     mov    bp,sp
  877.     push    dx
  878.     push    cx
  879.  
  880.     les    bx,DWORD PTR dacdata
  881.     mov    ax,0
  882.     mov    dx,03C8h
  883.     out    dx,al
  884.     mov     cx,WORD PTR count
  885.     mov    dx,03C9h
  886.  
  887. mvp:    mov     al,BYTE PTR es:[bx]
  888.     out    dx,al
  889.     inc    bx
  890.     nop
  891.     nop
  892.     nop
  893.     mov     al,BYTE PTR es:[bx]
  894.     out    dx,al
  895.     inc    bx
  896.     nop
  897.     nop
  898.     nop
  899.     mov     al,BYTE PTR es:[bx]
  900.     out    dx,al
  901.     inc    bx
  902.     loop    mvp
  903.  
  904.     pop    cx
  905.     pop    dx
  906.     pop    bp
  907.     ret
  908.  
  909. _load_DAC    endp
  910.  
  911.  ;
  912.  ; void read_DAC(char far *data, int count);
  913.  ;            /* reads DAC             */
  914.  
  915.  
  916.  count   equ [bp+10]
  917.  dacdata equ [bp+6]
  918.  
  919.     PUBLIC    _read_DAC
  920.  
  921. _read_DAC      proc    far
  922.  
  923.     push    bp
  924.     mov    bp,sp
  925.     push    dx
  926.     push    cx
  927.  
  928.     les    bx,DWORD PTR dacdata
  929.     mov    ax,0
  930.     mov    dx,03C7h
  931.     out    dx,al
  932.     mov     cx,WORD PTR count
  933.     mov    dx,03C9h
  934.  
  935. mvpr:
  936.     in    al,dx
  937.     mov     BYTE PTR es:[bx],al
  938.     inc    bx
  939.     nop
  940.     nop
  941.     nop
  942.     in    al,dx
  943.     mov     BYTE PTR es:[bx],al
  944.     inc    bx
  945.     nop
  946.     nop
  947.     nop
  948.     in    al,dx
  949.     mov     BYTE PTR es:[bx],al
  950.     inc    bx
  951.     loop    mvpr
  952.  
  953.     pop    cx
  954.     pop    dx
  955.     pop    bp
  956.     ret
  957.  
  958. _read_DAC    endp
  959.  
  960.  
  961.         end
  962.  
  963.