]> 4ch.mooo.com Git - 16.git/blobdiff - 16/ted5/TED5_A.ASM
ted5 added
[16.git] / 16 / ted5 / TED5_A.ASM
diff --git a/16/ted5/TED5_A.ASM b/16/ted5/TED5_A.ASM
new file mode 100755 (executable)
index 0000000..d8150ea
--- /dev/null
@@ -0,0 +1,1385 @@
+;====================================================
+;
+; TED5 ASM Routines
+;
+;====================================================
+       IDEAL
+       P386N
+       MODEL   medium,C
+
+extrn  XMSdriver:DWORD
+extrn  videomode:WORD,xmshandle:WORD,XMSlookup:WORD
+extrn  tilenum:WORD,lasticon:WORD,firsticon:WORD
+extrn  CGAlookup:WORD,EGA1lookup:WORD,EGA2lookup:WORD,VGAlookup:WORD
+
+       DATASEG
+
+SCindex        =       3c4h
+SCmapmask =    2
+GCindex =              3CEh
+GCreadmap =    4
+GCmode         =       5
+
+CombTable dw   CombineCGA,CombineEGA,CombineEGA,CombineVGA
+DrawTable dw   DrawTCGA,DrawTEGA1,DrawTEGA2,DrawTVGA
+OverTable dw   OverlayCGA,OverlayEGA,OverlayEGA,OverlayVGA
+
+cgacolors db   55h,0aah
+egacolors dw   0,0ffffh
+
+oldh   db      0
+oldy   dw      0
+horzadd dw     0
+wsize  dw      1,2,4
+hsize  dw      8,16,32
+twidth dw      0
+theight        dw      0
+bmlen  dw      0
+masklen        dw      0
+
+csize  dw      32,64,256
+esize  dw      32,128,512
+vsize  dw      64,256,1024
+
+cmsize dw      64,128,512
+emsize dw      40,160,640
+vmsize dw      128,512,2048
+
+       PUBLIC  tdata
+tdata  db      2048 dup(?)
+tdata1 db      2048 dup(?)
+
+;
+; XMS move structure
+;
+blen   dw      0,0
+shandle        dw      0
+soff   dd      0
+dhandle dw     0
+doff   dd      tdata1
+
+
+Csparse        dw      csp8,csp16,csp32
+Esparse        dw      esp8,esp16,esp32
+Vsparse        dw      vsp8,vsp16,vsp32
+
+csp8   db      0ffh,0ffh
+       REPT    7
+       db      0c0h,0
+       ENDM
+csp16  db      4 dup (0ffh)
+       REPT    15
+       db      0c0h
+       db      3 dup (0)
+       ENDM
+csp32  db      8 dup (0ffh)
+       REPT    31
+       db      0c0h
+       db      7 dup(0)
+       ENDM
+
+LABEL  esp8    BYTE
+       REPT    4
+       db      0ffh
+       db      7 dup (80h)
+       ENDM
+LABEL  esp16   BYTE
+       REPT    4
+       db      0ffh,0ffh
+       REPT    15
+       db      80h,0
+       ENDM
+       ENDM
+LABEL  esp32   BYTE
+       REPT    4
+       db      4 dup (0ffh)
+       REPT    31
+       db      80h,0,0,0
+       ENDM
+       ENDM
+
+vsp8   db      8 dup(0ffh)
+       REPT    7
+       db      0ffh,7 dup(0)
+       ENDM
+vsp16  db      16 dup(0ffh)
+       REPT    15
+       db      0ffh,15 dup(0)
+       ENDM
+vsp32  db      32 dup(0ffh)
+       REPT    31
+       db      0ffh,31 dup(0)
+       ENDM
+
+
+       CODESEG
+;====================================================
+;
+; Combine tiles together (background,foreground,icons)
+;
+;====================================================
+PUBLIC CombineTiles
+PROC   CombineTiles
+       ARG     tileb:WORD,tilef:WORD,tilei:WORD,tsize:WORD
+
+       push    si
+       push    di
+
+       cld
+       mov     bx,[tsize]
+       shl     bx,1
+       mov     dx,[hsize+bx-2]
+       mov     [theight],dx
+       mov     cx,[wsize+bx-2]
+       mov     [twidth],cx
+       mov     ax,[xmshandle]
+       mov     [shandle],ax            ;set XMS handle
+
+       mov     si,[videomode]
+       shl     si,1
+       mov     ax,[CombTable+si]
+       jmp     ax
+;
+; Combine CGA tiles
+;
+LABEL  CombineCGA      PROC
+
+       shl     [twidth],1
+       mov     cx,[cmsize+bx-2]
+       mov     [bmlen],cx
+       mov     ax,[csize+bx-2]         ;get length of block to move
+       mov     [blen],ax
+       sub     cx,ax
+       mov     [masklen],cx
+
+;
+; Handle the background tiles first!
+;
+       mov     ax,[tileb]
+       cmp     ax,8000h                ;solid color?
+       jb      @@c1
+       neg     ax
+
+       mov     di,ds
+       mov     es,di
+       mov     di,OFFSET tdata
+       mov     bx,ax
+       and     bx,1
+       mov     al,[cgacolors+bx]
+
+       mov     cx,[blen]
+       rep stosb
+       jmp     SHORT @@c2
+
+@@c1:
+       shl     ax,2
+       mov     bx,ax
+       mov     es,[XMSlookup]          ;(LONG SEG *)
+       mov     ax,[es:bx]
+       mov     [WORD PTR soff],ax
+       mov     ax,[es:bx+2]
+       mov     [WORD PTR soff+2],ax
+       cmp     ax,-1                   ;SPARSE TILE?
+       je      @@c1a
+
+       mov     ax,OFFSET tdata         ;(quickie modification since "doff"
+       mov     [WORD doff],ax          ; should always point to "tdata1")
+       mov     si,OFFSET blen
+       mov     ah,11
+       call    [DWORD XMSdriver]       ;move tile into tdata1
+       mov     ax,OFFSET tdata1
+       mov     [WORD doff],ax          ;ahhh....back to normal
+
+       jmp     @@c2
+;
+; Copy sparse tile to tdata
+;
+@@c1a:
+       mov     bx,[tsize]
+       shl     bx,1
+       mov     si,[Csparse+bx-2]
+       mov     di,OFFSET tdata
+       mov     cx,[blen]
+       shr     cx,1                    ;for WORD copy
+       mov     ax,ds
+       mov     es,ax
+       rep movsw
+
+;
+; Handle foreground tiles
+;
+@@c2:
+       mov     bx,[tilef]
+       cmp     bx,0
+       je      @@c3                    ;any masked tile?
+
+       shl     bx,2
+       mov     es,[XMSlookup]
+       mov     ax,[es:bx]
+       mov     [WORD PTR soff],ax
+       mov     ax,[es:bx+2]
+       mov     [WORD PTR soff+2],ax
+       cmp     ax,-1                   ;SPARSE MASKED TILE?
+       je      @@c3
+
+       mov     ax,[bmlen]
+       mov     [blen],ax               ;set masked tile length for XMS copy
+       mov     si,OFFSET blen
+       mov     ah,11
+       call    [DWORD XMSdriver]       ;move tile into tdata1
+;
+; now we have the masked tile in "tdata1".
+; time to mask it onto "tdata"
+;
+       mov     si,OFFSET tdata1
+       add     si,[masklen]            ;SI = masked tile's tiledata
+       mov     di,OFFSET tdata         ;DI = tile in "tdata"
+
+       mov     dx,[theight]
+       mov     bx,OFFSET tdata1        ;BX = mask
+@@c2a:
+       mov     cx,[twidth]
+@@c2b:
+       mov     al,[bx]                 ;get mask byte
+       and     [di],al                 ;and tdata with it
+       lodsb                           ;get tilem byte
+       or      [di],al                 ;OR it onto tdata
+       inc     di
+       inc     bx
+       loop    @@c2b
+       dec     dx
+       jnz     @@c2a
+;
+; Handle icons (foreground tiles)
+;
+@@c3:
+       mov     bx,[tilei]
+       cmp     bx,[lasticon]
+       ja      @@cexit                 ;any icons?
+       cmp     bx,[firsticon]
+       jbe     @@cexit
+
+       shl     bx,2
+       mov     es,[XMSlookup]
+       mov     ax,[es:bx]
+       mov     [WORD PTR soff],ax
+       mov     ax,[es:bx+2]
+       mov     [WORD PTR soff+2],ax
+
+       mov     ax,[bmlen]
+       mov     [blen],ax               ;set masked tile length for XMS copy
+       mov     si,OFFSET blen
+       mov     ah,11
+       call    [DWORD XMSdriver]       ;move tile into tdata1
+;
+; now we have the masked tile in "tdata1".
+; time to mask it onto "tdata"
+;
+       mov     si,OFFSET tdata1
+       add     si,[masklen]            ;SI = masked tile's tiledata
+       mov     di,OFFSET tdata         ;DI = tile in "tdata"
+
+       mov     dx,[theight]
+       mov     bx,OFFSET tdata1        ;BX = mask
+@@c3a:
+       mov     cx,[twidth]
+@@c3b:
+       mov     al,[bx]                 ;get mask byte
+       and     [di],al                 ;and tdata with it
+       lodsb                           ;get tilem byte
+       or      [di],al                 ;OR it onto tdata
+       inc     di
+       inc     bx
+       loop    @@c3b
+       dec     dx
+       jnz     @@c3a
+@@cexit:
+       pop     di
+       pop     si
+       ret
+
+;
+; Combine EGA tiles
+;
+LABEL  CombineEGA      PROC
+
+       mov     cx,[emsize+bx-2]
+       mov     [bmlen],cx
+       mov     ax,[esize+bx-2]         ;get length of block to move
+       mov     [blen],ax
+       sub     cx,ax
+       mov     [masklen],cx
+
+;
+; Handle the background tiles first!
+;
+       mov     ax,[tileb]
+       cmp     ax,8000h                ;solid color?
+       jb      @@e1
+       neg     ax
+
+       mov     di,ds
+       mov     es,di
+       mov     di,OFFSET tdata
+       mov     dx,ax
+
+       mov     cx,[blen]               ;plane 0
+       shr     cx,3
+       mov     bx,dx
+       shr     dx,1
+       and     bx,1
+       shl     bx,1
+       mov     ax,[egacolors+bx]
+       rep stosw
+
+       mov     cx,[blen]               ;plane 1
+       shr     cx,3
+       mov     bx,dx
+       shr     dx,1
+       and     bx,1
+       shl     bx,1
+       mov     ax,[egacolors+bx]
+       rep stosw
+
+       mov     cx,[blen]               ;plane 2
+       shr     cx,3
+       mov     bx,dx
+       shr     dx,1
+       and     bx,1
+       shl     bx,1
+       mov     ax,[egacolors+bx]
+       rep stosw
+
+       mov     cx,[blen]               ;plane 3
+       shr     cx,3
+       mov     bx,dx
+       shr     dx,1
+       and     bx,1
+       shl     bx,1
+       mov     ax,[egacolors+bx]
+       rep stosw
+       jmp     SHORT @@e2
+
+@@e1:
+       shl     ax,2
+       mov     bx,ax
+       mov     es,[XMSlookup]          ;(LONG SEG *)
+       mov     ax,[es:bx]
+       mov     [WORD PTR soff],ax
+       mov     ax,[es:bx+2]
+       mov     [WORD PTR soff+2],ax
+       cmp     ax,-1                   ;SPARSE TILE?
+       je      @@e1a
+
+       mov     ax,OFFSET tdata         ;(quickie modification since "doff"
+       mov     [WORD doff],ax          ; should always point to "tdata1")
+       mov     si,OFFSET blen
+       mov     ah,11
+       call    [DWORD XMSdriver]       ;move tile into tdata1
+       mov     ax,OFFSET tdata1
+       mov     [WORD doff],ax          ;ahhh....back to normal
+
+       jmp     @@e2
+;
+; Copy sparse tile to tdata
+;
+@@e1a:
+       mov     bx,[tsize]
+       shl     bx,1
+       mov     si,[Esparse+bx-2]
+       mov     di,OFFSET tdata
+       mov     cx,[blen]
+       shr     cx,1                    ;for WORD copy
+       mov     ax,ds
+       mov     es,ax
+       rep movsw
+
+;
+; Handle foreground tiles
+;
+@@e2:
+       mov     bx,[tilef]
+       cmp     bx,0
+       je      @@e3                    ;any masked tile?
+
+       shl     bx,2
+       mov     es,[XMSlookup]
+       mov     ax,[es:bx]
+       mov     [WORD PTR soff],ax
+       mov     ax,[es:bx+2]
+       mov     [WORD PTR soff+2],ax
+       cmp     ax,-1                   ;SPARSE MASKED TILE?
+       je      @@e3
+
+       mov     ax,[bmlen]
+       mov     [blen],ax               ;set masked tile length for XMS copy
+       mov     si,OFFSET blen
+       mov     ah,11
+       call    [DWORD XMSdriver]       ;move tile into tdata1
+;
+; now we have the masked tile in "tdata1".
+; time to mask it onto "tdata"
+;
+       mov     si,OFFSET tdata1
+       add     si,[masklen]            ;SI = masked tile's tiledata
+       mov     di,OFFSET tdata         ;DI = tile in "tdata"
+       mov     ah,4
+@@e2a0:
+       mov     dx,[theight]
+       mov     bx,OFFSET tdata1        ;BX = mask
+@@e2a:
+       mov     cx,[twidth]
+@@e2b:
+       mov     al,[bx]                 ;get mask byte
+       and     [di],al                 ;and tdata with it
+       lodsb                           ;get tilem byte
+       or      [di],al                 ;OR it onto tdata
+       inc     di
+       inc     bx
+       loop    @@e2b
+       dec     dx
+       jnz     @@e2a
+       dec     ah
+       jnz     @@e2a0                  ;do all 4 planes!
+;
+; Handle icons (foreground tiles)
+;
+@@e3:
+       mov     bx,[tilei]
+       cmp     bx,[lasticon]
+       ja      @@eexit                 ;any icons?
+       cmp     bx,[firsticon]
+       jbe     @@eexit
+
+       shl     bx,2
+       mov     es,[XMSlookup]
+       mov     ax,[es:bx]
+       mov     [WORD PTR soff],ax
+       mov     ax,[es:bx+2]
+       mov     [WORD PTR soff+2],ax
+
+       mov     ax,[bmlen]
+       mov     [blen],ax               ;set masked tile length for XMS copy
+       mov     si,OFFSET blen
+       mov     ah,11
+       call    [DWORD XMSdriver]       ;move tile into tdata1
+;
+; now we have the masked tile in "tdata1".
+; time to mask it onto "tdata"
+;
+       mov     si,OFFSET tdata1
+       add     si,[masklen]            ;SI = masked tile's tiledata
+       mov     di,OFFSET tdata         ;DI = tile in "tdata"
+       mov     ah,4
+@@e3a0:
+       mov     dx,[theight]
+       mov     bx,OFFSET tdata1        ;BX = mask
+@@e3a:
+       mov     cx,[twidth]
+@@e3b:
+       mov     al,[bx]                 ;get mask byte
+       and     [di],al                 ;and tdata with it
+       lodsb                           ;get tilem byte
+       or      [di],al                 ;OR it onto tdata
+       inc     di
+       inc     bx
+       loop    @@e3b
+       dec     dx
+       jnz     @@e3a
+       dec     ah
+       jnz     @@e3a0                  ;do all 4 planes!
+@@eexit:
+       pop     di
+       pop     si
+       ret
+
+;
+; Combine VGA tiles
+;
+LABEL  CombineVGA      PROC
+
+       shl     [twidth],3
+       mov     cx,[vmsize+bx-2]
+       mov     [bmlen],cx
+       mov     ax,[vsize+bx-2]         ;get length of block to move
+       mov     [blen],ax
+       sub     cx,ax
+       mov     [masklen],cx
+
+;
+; Handle the background tiles first!
+;
+       mov     ax,[tileb]
+       cmp     ax,8000h                ;solid color?
+       jb      @@v1
+       neg     ax
+
+       mov     di,ds
+       mov     es,di
+       mov     di,OFFSET tdata
+       shl     ax,4
+       mov     bx,[blen]
+       shr     bx,3
+
+       mov     cx,bx
+       rep stosb
+       inc     al
+       mov     cx,bx
+       rep stosb
+       inc     al
+       mov     cx,bx
+       rep stosb
+       inc     al
+       mov     cx,bx
+       rep stosb
+       inc     al
+       mov     cx,bx
+       rep stosb
+       inc     al
+       mov     cx,bx
+       rep stosb
+       inc     al
+       mov     cx,bx
+       rep stosb
+       inc     al
+       mov     cx,bx
+       rep stosb
+
+       jmp     SHORT @@v2
+
+@@v1:
+       shl     ax,2
+       mov     bx,ax
+       mov     es,[XMSlookup]          ;(LONG SEG *)
+       mov     ax,[es:bx]
+       mov     [WORD PTR soff],ax
+       mov     ax,[es:bx+2]
+       mov     [WORD PTR soff+2],ax
+       cmp     ax,-1                   ;SPARSE TILE?
+       je      @@v1a
+
+       mov     ax,OFFSET tdata         ;(quickie modification since "doff"
+       mov     [WORD doff],ax          ; should always point to "tdata1")
+       mov     si,OFFSET blen
+       mov     ah,11
+       call    [DWORD XMSdriver]       ;move tile into tdata1
+       mov     ax,OFFSET tdata1
+       mov     [WORD doff],ax          ;ahhh....back to normal
+
+       jmp     @@v2
+;
+; Copy sparse tile to tdata
+;
+@@v1a:
+       mov     bx,[tsize]
+       shl     bx,1
+       mov     si,[Vsparse+bx-2]
+       mov     di,OFFSET tdata
+       mov     cx,[blen]
+       shr     cx,1                    ;for WORD copy
+       mov     ax,ds
+       mov     es,ax
+       rep movsw
+
+;
+; Handle foreground tiles
+;
+@@v2:
+       mov     bx,[tilef]
+       cmp     bx,0
+       je      @@v3                    ;any masked tile?
+
+       shl     bx,2
+       mov     es,[XMSlookup]
+       mov     ax,[es:bx]
+       mov     [WORD PTR soff],ax
+       mov     ax,[es:bx+2]
+       mov     [WORD PTR soff+2],ax
+       cmp     ax,-1                   ;SPARSE MASKED TILE?
+       je      @@v3
+
+       mov     ax,[bmlen]
+       mov     [blen],ax               ;set masked tile length for XMS copy
+       mov     si,OFFSET blen
+       mov     ah,11
+       call    [DWORD XMSdriver]       ;move tile into tdata1
+;
+; now we have the masked tile in "tdata1".
+; time to mask it onto "tdata"
+;
+       mov     si,OFFSET tdata1
+       add     si,[masklen]            ;SI = masked tile's tiledata
+       mov     di,OFFSET tdata         ;DI = tile in "tdata"
+
+       mov     dx,[theight]
+       mov     bx,OFFSET tdata1        ;BX = mask
+@@v2a:
+       mov     cx,[twidth]
+@@v2b:
+       mov     al,[bx]                 ;get mask byte
+       and     [di],al                 ;and tdata with it
+       lodsb                           ;get tilem byte
+       or      [di],al                 ;OR it onto tdata
+       inc     di
+       inc     bx
+       loop    @@v2b
+       dec     dx
+       jnz     @@v2a
+;
+; Handle icons (foreground tiles)
+;
+@@v3:
+       mov     bx,[tilei]
+       cmp     bx,[lasticon]
+       ja      @@vexit                 ;any icons?
+       cmp     bx,[firsticon]
+       jbe     @@vexit
+
+       shl     bx,2
+       mov     es,[XMSlookup]
+       mov     ax,[es:bx]
+       mov     [WORD PTR soff],ax
+       mov     ax,[es:bx+2]
+       mov     [WORD PTR soff+2],ax
+
+       mov     ax,[bmlen]
+       mov     [blen],ax               ;set masked tile length for XMS copy
+       mov     si,OFFSET blen
+       mov     ah,11
+       call    [DWORD XMSdriver]       ;move tile into tdata1
+;
+; now we have the masked tile in "tdata1".
+; time to mask it onto "tdata"
+;
+       mov     si,OFFSET tdata1
+       add     si,[masklen]            ;SI = masked tile's tiledata
+       mov     di,OFFSET tdata         ;DI = tile in "tdata"
+
+       mov     dx,[theight]
+       mov     bx,OFFSET tdata1        ;BX = mask
+@@v3a:
+       mov     cx,[twidth]
+@@v3b:
+       mov     al,[bx]                 ;get mask byte
+       and     [di],al                 ;and tdata with it
+       lodsb                           ;get tilem byte
+       or      [di],al                 ;OR it onto tdata
+       inc     di
+       inc     bx
+       loop    @@v3b
+       dec     dx
+       jnz     @@v3a
+@@vexit:
+       pop     di
+       pop     si
+       ret
+ENDP
+
+
+;====================================================
+;
+; Draw a tile in any of the video modes
+; NOTE: ONLY WORKS WITH TSIZE=2!
+;
+;====================================================
+PUBLIC DrawTile
+PROC   DrawTile
+       ARG     x:WORD,y:WORD,tsize:WORD
+
+       push    si
+       push    di
+
+       mov     bx,[tsize]
+       shl     bx,1
+       mov     ah,[BYTE PTR hsize+bx-2]
+       mov     [oldh],ah
+       mov     cx,[wsize+bx-2]
+
+       mov     bx,[videomode]
+       shl     bx,1
+       mov     dx,[DrawTable+bx]
+
+       mov     bx,[y]
+       shl     bx,1
+       jmp     dx
+
+label  DrawTCGA proc
+
+       mov     ax,0b800h
+       mov     es,ax
+       mov     si,OFFSET tdata
+       mov     di,[x]
+       shl     di,1
+       add     di,[CGAlookup+bx]
+       mov     bx,cx
+       shl     bx,1
+       mov     ah,[oldh]
+@@c1:
+       mov     cx,bx
+       rep movsb
+       sub     di,bx
+       xor     di,2000h
+       mov     cx,bx
+       rep movsb
+       sub     di,bx
+       xor     di,2000h
+       add     di,80
+
+       sub     ah,2
+       jnz     @@c1
+
+       pop     di
+       pop     si
+       ret
+;
+; EGA1/2/3 TILE DRAW ROUTINES
+;
+label  DrawTEGA1 proc
+       mov     [horzadd],38
+       mov     di,[EGA1lookup+bx]
+       jmp     SHORT DoDrawEGAT
+label  DrawTEGA2 proc
+       mov     [horzadd],78
+       mov     di,[EGA2lookup+bx]
+       jmp     SHORT DoDrawEGAT
+label  DoDrawEGAT proc
+       add     di,[x]
+       mov     [oldy],di
+       mov     si,OFFSET tdata
+       mov     bx,0a000h
+       mov     es,bx
+       mov     bx,cx
+;
+; AH : height
+; BX : width
+; ES:DI : dest
+; DS:SI : source
+;
+       cld
+       mov     dx,GCindex
+       mov     al,GCmode
+       out     dx,al
+       inc     dx
+       mov     al,0
+       out     dx,al
+;
+; Plane 0
+;
+       mov     dx,SCindex
+       mov     al,SCmapmask
+       out     dx,al
+       inc     dx
+       mov     al,1
+       out     dx,al
+
+       mov     dx,[horzadd]
+@@1:
+       mov     cx,bx
+       rep movsb
+       add     di,dx
+       dec     ah
+       jne     @@1
+;
+; Plane 1
+;
+       mov     dx,SCindex
+       mov     al,SCmapmask
+       out     dx,al
+       inc     dx
+       mov     al,2
+       out     dx,al
+
+       mov     dx,[horzadd]
+       mov     di,[oldy]
+       mov     ah,[oldh]
+@@2:
+       mov     cx,bx
+       rep movsb
+       add     di,dx
+       dec     ah
+       jne     @@2
+;
+; Plane 2
+;
+       mov     dx,SCindex
+       mov     al,SCmapmask
+       out     dx,al
+       inc     dx
+       mov     al,4
+       out     dx,al
+
+       mov     dx,[horzadd]
+       mov     di,[oldy]
+       mov     ah,[oldh]
+@@3:
+       mov     cx,bx
+       rep movsb
+       add     di,dx
+       dec     ah
+       jne     @@3
+;
+; Plane 3
+;
+       mov     dx,SCindex
+       mov     al,SCmapmask
+       out     dx,al
+       inc     dx
+       mov     al,8
+       out     dx,al
+
+       mov     dx,[horzadd]
+       mov     di,[oldy]
+       mov     ah,[oldh]
+@@4:
+       mov     cx,bx
+       rep movsb
+       add     di,dx
+       dec     ah
+       jne     @@4
+
+       pop     di
+       pop     si
+       ret
+
+label  DrawTVGA proc
+
+       mov     ax,0a000h
+       mov     es,ax
+       mov     si,OFFSET tdata
+       mov     di,[x]
+       shl     di,3
+       add     di,[VGAlookup+bx]
+       mov     bx,cx
+       shl     bx,2
+       mov     ah,[oldh]
+@@v1:
+       mov     cx,bx
+       rep movsw
+       add     di,304
+
+       dec     ah
+       jnz     @@v1
+
+       pop     di
+       pop     si
+       ret
+ENDP
+
+;////////////////////////////////////////////////////////////////////
+;
+; TED5 screen scroll routines!
+;
+;////////////////////////////////////////////////////////////////////
+PROC   CopyCGA
+PUBLIC CopyCGA
+       ARG     srcx:WORD,srcy:WORD,width:WORD,height:WORD,destx:WORD,desty:WORD
+       USES    si,di
+       push    ds
+
+       mov     ax,0b800h
+       mov     es,ax
+       mov     ds,ax
+       shl     [width],1
+       shl     [destx],1
+       shl     [srcx],1
+
+       mov     ax,[srcy]
+       cmp     ax,[desty]
+       jb      @@1
+       ja      @@2
+       mov     ax,[srcx]
+       cmp     ax,[destx]
+       jb      @@0
+;
+; Copy from sourcex to destx, right
+;
+       mov     dx,[height]
+       mov     bx,[srcy]       ;source & dest are the same!
+       shl     bx,1
+       cld
+
+@@aa:
+       mov     si,[ss:CGAlookup+bx]
+       mov     di,si
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       add     bx,2
+       dec     dx
+       jnz     @@aa
+       jz      @@exit
+;
+; Copy from end of sourcex to end of destx, left
+;
+@@0:
+       mov     dx,[height]
+       mov     bx,[srcy]       ;source & dest are the same!
+       shl     bx,1
+
+@@0a0:
+       mov     si,[ss:CGAlookup+bx]
+       mov     di,si
+       add     si,[srcx]
+       add     si,[width]
+       dec     si
+       add     di,[destx]
+       add     di,[width]
+       dec     di
+       mov     cx,[width]
+       std
+       rep movsb
+       cld
+       add     bx,2
+       dec     dx
+       jnz     @@0a0
+       jz      @@exit
+;
+; Copy from end of sourcey to end of desty, up
+;
+@@1:
+       mov     ah,[BYTE height]
+       mov     dl,[BYTE srcy]
+       add     dl,ah
+       dec     dl
+       mov     dh,[BYTE desty]
+       add     dh,ah
+       dec     dh
+       cld
+
+@@1a0:
+       mov     bx,[srcy]
+       add     bx,[height]
+       dec     bx
+       shl     bx,1
+       mov     si,[ss:CGAlookup+bx]
+       mov     bx,[desty]
+       add     bx,[height]
+       dec     bx
+       shl     bx,1
+       mov     di,[ss:CGAlookup+bx]
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       dec     [height]
+       jnz     @@1a0
+       jz      @@exit
+;
+; Copy from sourcey to desty, down
+;
+@@2:
+       mov     ah,[BYTE height]
+       mov     dl,[BYTE srcy]
+       mov     dh,[BYTE desty]
+       cld
+
+@@2a0:
+       mov     bx,[srcy]
+       shl     bx,1
+       mov     si,[ss:CGAlookup+bx]
+       mov     bx,[desty]
+       shl     bx,1
+       mov     di,[ss:CGAlookup+bx]
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       inc     [srcy]
+       inc     [desty]
+       dec     [height]
+       jnz     @@2a0
+       jz      @@exit
+@@exit:
+       pop     ds
+       ret
+ENDP
+
+
+PROC   CopyEGA
+PUBLIC CopyEGA
+       ARG     srcx:WORD,srcy:WORD,width:WORD,height:WORD,destx:WORD,desty:WORD
+       USES    si,di
+       push    ds
+
+       mov     dx,GCindex
+       mov     ax,GCmode OR 100h
+       out     dx,ax
+
+       mov     ax,0a000h
+       mov     es,ax
+       mov     ds,ax
+
+       mov     ax,[srcy]
+       cmp     ax,[desty]
+       jb      @@1
+       ja      @@2
+       mov     ax,[srcx]
+       cmp     ax,[destx]
+       jb      @@0
+;
+; Copy from sourcex to destx, right
+;
+       mov     dx,[height]
+       mov     bx,[srcy]       ;source & dest are the same!
+       shl     bx,1
+       cld
+
+       cmp     [ss:videomode],2
+       jb      @@a
+@@aa:
+       mov     si,[ss:EGA2lookup+bx]
+       mov     di,si
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       add     bx,2
+       dec     dx
+       jnz     @@aa
+       jz      @@exit
+@@a:
+       mov     si,[ss:EGA1lookup+bx]
+       mov     di,si
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       add     bx,2
+       dec     dx
+       jnz     @@a
+       jz      @@exit
+;
+; Copy from end of sourcex to end of destx, left
+;
+@@0:
+       mov     dx,[height]
+       mov     bx,[srcy]       ;source & dest are the same!
+       shl     bx,1
+
+       cmp     [ss:videomode],2
+       jb      @@0a
+@@0a0:
+       mov     si,[ss:EGA2lookup+bx]
+       mov     di,si
+       add     si,[srcx]
+       add     si,[width]
+       dec     si
+       add     di,[destx]
+       add     di,[width]
+       dec     di
+       mov     cx,[width]
+       std
+       rep movsb
+       cld
+       add     bx,2
+       dec     dx
+       jnz     @@0a0
+       jz      @@exit
+@@0a:
+       mov     si,[ss:EGA1lookup+bx]
+       mov     di,si
+       add     si,[srcx]
+       add     si,[width]
+       dec     si
+       add     di,[destx]
+       add     di,[width]
+       dec     di
+       mov     cx,[width]
+       std
+       rep movsb
+       cld
+       add     bx,2
+       dec     dx
+       jnz     @@0a
+       jz      @@exit
+;
+; Copy from end of sourcey to end of desty, up
+;
+@@1:
+       mov     ah,[BYTE height]
+       mov     dl,[BYTE srcy]
+       add     dl,ah
+       dec     dl
+       mov     dh,[BYTE desty]
+       add     dh,ah
+       dec     dh
+       cld
+
+       cmp     [ss:videomode],2
+       jb      @@1a
+@@1a0:
+       mov     bx,[srcy]
+       add     bx,[height]
+       dec     bx
+       shl     bx,1
+       mov     si,[ss:EGA2lookup+bx]
+       mov     bx,[desty]
+       add     bx,[height]
+       dec     bx
+       shl     bx,1
+       mov     di,[ss:EGA2lookup+bx]
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       dec     [height]
+       jnz     @@1a0
+       jz      @@exit
+@@1a:
+       mov     bl,dl
+       xor     bh,bh
+       shl     bx,1
+       mov     si,[ss:EGA1lookup+bx]
+       mov     bl,dh
+       xor     bh,bh
+       shl     bx,1
+       mov     di,[ss:EGA1lookup+bx]
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       dec     dl
+       dec     dh
+       dec     ah
+       jnz     @@1a
+       jz      @@exit
+;
+; Copy from sourcey to desty, down
+;
+@@2:
+       mov     ah,[BYTE height]
+       mov     dl,[BYTE srcy]
+       mov     dh,[BYTE desty]
+       cld
+
+       cmp     [ss:videomode],2
+       jb      @@2a
+@@2a0:
+       mov     bx,[srcy]
+       shl     bx,1
+       mov     si,[ss:EGA2lookup+bx]
+       mov     bx,[desty]
+       shl     bx,1
+       mov     di,[ss:EGA2lookup+bx]
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       inc     [srcy]
+       inc     [desty]
+       dec     [height]
+       jnz     @@2a0
+       jz      @@exit
+@@2a:
+       mov     bl,dl
+       xor     bh,bh
+       shl     bx,1
+       mov     si,[ss:EGA1lookup+bx]
+       mov     bl,dh
+       xor     bh,bh
+       shl     bx,1
+       mov     di,[ss:EGA1lookup+bx]
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       inc     dl
+       inc     dh
+       dec     ah
+       jnz     @@2a
+@@exit:
+       pop     ds
+       ret
+ENDP
+
+PROC   CopyVGA
+PUBLIC CopyVGA
+       ARG     srcx:WORD,srcy:WORD,width:WORD,height:WORD,destx:WORD,desty:WORD
+       USES    si,di
+       push    ds
+
+       mov     ax,0a000h
+       mov     es,ax
+       mov     ds,ax
+       shl     [width],3
+       shl     [destx],3
+       shl     [srcx],3
+
+       mov     ax,[srcy]
+       cmp     ax,[desty]
+       jb      @@1
+       ja      @@2
+       mov     ax,[srcx]
+       cmp     ax,[destx]
+       jb      @@0
+;
+; Copy from sourcex to destx, right
+;
+       mov     dx,[height]
+       mov     bx,[srcy]       ;source & dest are the same!
+       shl     bx,1
+       cld
+
+@@aa:
+       mov     si,[ss:VGAlookup+bx]
+       mov     di,si
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       add     bx,2
+       dec     dx
+       jnz     @@aa
+       jz      @@exit
+;
+; Copy from end of sourcex to end of destx, left
+;
+@@0:
+       mov     dx,[height]
+       mov     bx,[srcy]       ;source & dest are the same!
+       shl     bx,1
+
+@@0a0:
+       mov     si,[ss:VGAlookup+bx]
+       mov     di,si
+       add     si,[srcx]
+       add     si,[width]
+       dec     si
+       add     di,[destx]
+       add     di,[width]
+       dec     di
+       mov     cx,[width]
+       std
+       rep movsb
+       cld
+       add     bx,2
+       dec     dx
+       jnz     @@0a0
+       jz      @@exit
+;
+; Copy from end of sourcey to end of desty, up
+;
+@@1:
+       mov     ah,[BYTE height]
+       mov     dl,[BYTE srcy]
+       add     dl,ah
+       dec     dl
+       mov     dh,[BYTE desty]
+       add     dh,ah
+       dec     dh
+       cld
+
+@@1a0:
+       mov     bx,[srcy]
+       add     bx,[height]
+       dec     bx
+       shl     bx,1
+       mov     si,[ss:VGAlookup+bx]
+       mov     bx,[desty]
+       add     bx,[height]
+       dec     bx
+       shl     bx,1
+       mov     di,[ss:VGAlookup+bx]
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       dec     [height]
+       jnz     @@1a0
+       jz      @@exit
+;
+; Copy from sourcey to desty, down
+;
+@@2:
+       mov     ah,[BYTE height]
+       mov     dl,[BYTE srcy]
+       mov     dh,[BYTE desty]
+       cld
+
+@@2a0:
+       mov     bx,[srcy]
+       shl     bx,1
+       mov     si,[ss:VGAlookup+bx]
+       mov     bx,[desty]
+       shl     bx,1
+       mov     di,[ss:VGAlookup+bx]
+       add     si,[srcx]
+       add     di,[destx]
+       mov     cx,[width]
+       rep movsb
+       inc     [srcy]
+       inc     [desty]
+       dec     [height]
+       jnz     @@2a0
+       jz      @@exit
+@@exit:
+       pop     ds
+       ret
+ENDP
+
+;////////////////////////////////////////////////////////////////////
+;
+; OVERLAY routine
+;
+;////////////////////////////////////////////////////////////////////
+PROC   Overlay
+PUBLIC Overlay
+       ARG     tsize:WORD
+
+       push    di
+       push    si
+
+       mov     di,OFFSET tdata
+       mov     bx,[tsize]
+       shl     bx,1
+       mov     si,[videomode]
+       shl     si,1
+       mov     ax,[OverTable+si]
+       jmp     ax
+
+LABEL  OverlayCGA      PROC
+
+       mov     cx,[csize+bx-2]
+       shr     cx,1
+       mov     si,[Csparse+bx-2]
+@@c1:  lodsw
+       or      [di],ax
+       add     di,2
+       loop    @@c1
+
+       pop     si
+       pop     di
+       ret
+
+LABEL  OverlayEGA      PROC
+
+       mov     cx,[esize+bx-2]
+       shr     cx,1
+       mov     si,[Esparse+bx-2]
+@@e1:  lodsw
+       or      [di],ax
+       add     di,2
+       loop    @@e1
+
+       pop     si
+       pop     di
+       ret
+
+LABEL  OverlayVGA      PROC
+
+       mov     cx,[vsize+bx-2]
+       shr     cx,1
+       mov     si,[Vsparse+bx-2]
+@@v1:  lodsw
+       or      [di],ax
+       add     di,2
+       loop    @@v1
+
+       pop     si
+       pop     di
+       ret
+
+ENDP
+
+END
\ No newline at end of file