254 lines
No EOL
4 KiB
Text
254 lines
No EOL
4 KiB
Text
include clink.inc
|
||
|
||
xbufseg SEGMENT para public 'DATA'
|
||
;high=X, low=Y => result=X*Y/256
|
||
PUBLIC _bufdata
|
||
_bufdata dw 32768 dup(0)
|
||
xbufseg ENDS
|
||
|
||
xmulseg SEGMENT para public 'DATA'
|
||
;high=X, low=Y => result=X*Y/256
|
||
PUBLIC _muldata
|
||
_muldata dw 32768 dup(0)
|
||
xmulseg ENDS
|
||
|
||
xlineseg SEGMENT para public 'DATA'
|
||
;high=X, low=Y, shl=1 => result=offset to blit routine
|
||
PUBLIC _linedata
|
||
_linedata dw 32768 dup(0)
|
||
xlineseg ENDS
|
||
|
||
|
||
code SEGMENT para public 'CODE'
|
||
ASSUME cs:code
|
||
LOCALS
|
||
.386
|
||
EXTRN lblt_table:word
|
||
|
||
rows dw 200 dup(0)
|
||
vram dw 0a000h
|
||
mulseg dw SEG _muldata
|
||
lineseg dw SEG _linedata
|
||
bufseg dw SEG _bufdata
|
||
|
||
PUBLIC _xyzdata
|
||
;x,y,-,-, e1a,e1b,e1c,e1d, e2a,e2b,e2c,e2d, e3a,e3b,e3c,e3d
|
||
_xyzdata dw 32*32 dup(4*4 dup(0))
|
||
RECLEN equ (4*4*2)
|
||
_plane dw 0
|
||
drawplane dw 0101h,0202h,0404h
|
||
drawstore dw 8,16,24
|
||
|
||
PUBLIC _asminit
|
||
_asminit PROC FAR
|
||
CBEG
|
||
call lineblit_init
|
||
call xyzdata_init
|
||
call rows_init
|
||
CEND
|
||
_asminit ENDP
|
||
|
||
PUBLIC _setborder
|
||
_setborder PROC FAR
|
||
CBEG
|
||
mov dx,3dah
|
||
in al,dx
|
||
mov dx,3c0h
|
||
mov al,11h+32
|
||
out dx,al
|
||
mov al,[bp+6]
|
||
out dx,al
|
||
CEND
|
||
_setborder ENDP
|
||
|
||
xyzdata_init PROC NEAR
|
||
mov cx,32*32
|
||
mov bx,OFFSET _xyzdata
|
||
mov ax,cs:lblt_table[0]
|
||
@@1: mov cs:[bx+8+2],ax
|
||
mov cs:[bx+8+6],ax
|
||
mov cs:[bx+16+2],ax
|
||
mov cs:[bx+16+6],ax
|
||
mov cs:[bx+24+2],ax
|
||
mov cs:[bx+24+6],ax
|
||
add bx,RECLEN
|
||
loop @@1
|
||
ret
|
||
xyzdata_init ENDP
|
||
|
||
rows_init PROC NEAR
|
||
mov cx,200
|
||
mov bx,OFFSET rows
|
||
mov dx,320
|
||
xor ax,ax
|
||
@@1: mov cs:[bx],ax
|
||
add ax,dx
|
||
add bx,2
|
||
loop @@1
|
||
ret
|
||
rows_init ENDP
|
||
|
||
ALIGN 2
|
||
tmpcolor dw 0
|
||
tmpcount dw 0
|
||
|
||
PUBLIC _asmloop1
|
||
_asmloop1 PROC FAR
|
||
CBEG
|
||
mov ax,cs
|
||
mov ds,ax
|
||
int 3
|
||
mov bx,ds:_plane
|
||
inc bx
|
||
cmp bx,3
|
||
jb @@i1
|
||
xor bx,bx
|
||
@@i1: mov ds:_plane,bx
|
||
shl bx,1
|
||
mov ax,ds:drawplane[bx]
|
||
mov ds:tmpcolor,ax
|
||
mov bp,ds:drawstore[bx]
|
||
mov es,ds:vram
|
||
mov fs,ds:lineseg
|
||
mov gs,ds:bufseg
|
||
xor ebx,ebx
|
||
;===erase===
|
||
mov ds:tmpcount,31
|
||
mov si,OFFSET _xyzdata
|
||
mov dx,ds:tmpcolor
|
||
@@3: zzz=0
|
||
REPT 31
|
||
local l1
|
||
mov di,ds:[si+zzz+bp+0]
|
||
call ds:[si+zzz+bp+2]
|
||
mov di,ds:[si+zzz+bp+4]
|
||
call ds:[si+zzz+bp+6]
|
||
zzz=zzz+RECLEN
|
||
l1: ENDM
|
||
add si,32*RECLEN
|
||
dec ds:tmpcount
|
||
jz @@2
|
||
jmp @@3
|
||
@@2: ;===draw===
|
||
mov ds:tmpcount,31
|
||
mov si,OFFSET _xyzdata
|
||
mov dx,ds:tmpcolor
|
||
@@1: zzz=0
|
||
REPT 31
|
||
local l1
|
||
mov cx,ds:[si+zzz+2+RECLEN] ;Y2
|
||
mov bx,ds:[si+zzz+2] ;Y1
|
||
sub cx,bx
|
||
jc l1
|
||
shl bx,1
|
||
mov di,ds:rows[bx]
|
||
|
||
mov bx,ds:[si+zzz+0+RECLEN] ;X2
|
||
mov ax,ds:[si+zzz+0] ;X1
|
||
sub bx,ax
|
||
jc l1
|
||
add di,ax
|
||
|
||
mov bh,cl
|
||
mov ds:[si+zzz+bp+0],di
|
||
shl bx,1
|
||
mov cx,fs:[bx]
|
||
mov ds:[si+zzz+bp+2],cx
|
||
call dx
|
||
|
||
mov cx,ds:[si+zzz+2+32*RECLEN] ;Y2
|
||
mov bx,ds:[si+zzz+2] ;Y1
|
||
sub cx,bx
|
||
jc l1
|
||
shl bx,1
|
||
mov di,ds:rows[bx]
|
||
|
||
mov bx,ds:[si+zzz+0+32*RECLEN] ;X2
|
||
mov ax,ds:[si+zzz+0] ;X1
|
||
sub bx,ax
|
||
jc l1
|
||
add di,ax
|
||
|
||
mov bh,cl
|
||
mov ds:[si+zzz+bp+4],di
|
||
shl bx,1
|
||
mov cx,fs:[bx]
|
||
mov ds:[si+zzz+bp+6],cx
|
||
call dx
|
||
|
||
zzz=zzz+RECLEN
|
||
l1: ENDM
|
||
add si,32*RECLEN
|
||
dec ds:tmpcount
|
||
jz @@0
|
||
jmp @@1
|
||
@@0: CEND
|
||
_asmloop1 ENDP
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
;include lineblit.inc ;linked
|
||
|
||
lineblit_init PROC NEAR
|
||
mov es,cs:lineseg
|
||
mov ax,cs
|
||
mov ds,ax
|
||
;fill with offset/rets
|
||
mov si,OFFSET lblt_table
|
||
mov ax,cs:[si]
|
||
xor di,di
|
||
mov cx,32768
|
||
rep stosw
|
||
;add the actual line offsets
|
||
mov cx,12 ;Y
|
||
xor ebx,ebx
|
||
@@2: push cx
|
||
mov cx,12 ;X
|
||
xor bl,bl
|
||
@@1: mov ax,ds:[si]
|
||
add si,2
|
||
mov es:[ebx*2],ax
|
||
inc bl
|
||
loop @@1
|
||
pop cx
|
||
inc bh
|
||
loop @@2
|
||
ret
|
||
lineblit_init ENDP
|
||
|
||
lineblit PROC NEAR
|
||
;di=x+y*320 (base)
|
||
;bh=Y dist
|
||
;bl=X dist
|
||
ret
|
||
lineblit ENDP
|
||
|
||
PUBLIC _line
|
||
_line PROC FAR
|
||
CBEG
|
||
mov dx,[bp+8]
|
||
mov bx,dx
|
||
shl bx,1
|
||
mov di,cs:rows[bx]
|
||
mov ax,[bp+6]
|
||
add di,ax
|
||
neg ax
|
||
add ax,[bp+10]
|
||
mov bl,al
|
||
neg dx
|
||
add dx,[bp+12]
|
||
mov bh,dl
|
||
shl bx,1
|
||
mov al,[bp+14]
|
||
mov ah,al
|
||
mov es,cs:vram
|
||
mov ds,cs:lineseg
|
||
call word ptr ds:[bx]
|
||
CEND
|
||
_line ENDP
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
code ENDS
|
||
END
|
||
|