SecondReality/GRID/ASM.OK
2017-09-24 01:45:36 +02:00

254 lines
No EOL
4 KiB
Text
Raw Permalink Blame History

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