SecondReality/PLZPART/PLZA.ASM
2017-09-24 01:45:36 +02:00

375 lines
6.9 KiB
NASM
Raw Permalink Blame History

IDEAL
MODEL large
P386
SEGMENT lerssicode para PUBLIC 'CODE'
PUBLIC C jmp_tau
LABEL jmp_tau WORD
IRP ccc, <0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199>
dw OFFSET plz_y&ccc
ENDM
LABEL start_mask BYTE
REPT 200
db 1111b, 1110b, 1100b, 1000b
ENDM
LABEL end_mask BYTE
REPT 200
db 0001b, 0011b, 0111b, 1111b
ENDM
PUBLIC C xx, C yy
PUBLIC C yy1, C xx1, C yy2, C xx2
PUBLIC C ay1, C ay2, C ax1, C ax2
PUBLIC C txx1, C txx2, C txy1, C txy2
PUBLIC C tax1, C tax2, C tay1, C tay2
PUBLIC C to, C from, C dseg, C ctau
xx dw ?
yy dw ?
yy1 dd ?
xx1 dd ?
yy2 dd ?
xx2 dd ?
ay1 dd ?
ax1 dd ?
ay2 dd ?
ax2 dd ?
txx1 dd ?
txy1 dd ?
txx2 dd ?
txy2 dd ?
tax1 dd ?
tay1 dd ?
tax2 dd ?
tay2 dd ?
to dd 0a0000000h
from dd ?
dseg dw 0
ctau dd ?
linecount dw ?
ASSUME cs:lerssicode, ds:nothing, es:nothing
PUBLIC c do_block
PROC C do_block FAR
ARG ycount:word
push es ds si di bp
mov ax, [ycount]
mov [linecount], ax
cmp ax, 0d
je @@end
lds bx, [from]
les di, [to]
lgs si, [ctau]
mov fs, [dseg]
@@doline:
cmp [yy], 0d
jl @@endline
cmp [yy], 134d
jge @@end ; y-clip
mov bp, [word ctau]
mov ax, [Word xx2+2]
cmp ax, [gs:bp]
ja @@l7
mov [gs:bp], ax ; x1..
@@l7: shr ax, 2d
add di, ax
mov si, [Word xx1+2]
cmp si, [gs:bp+2]
jb @@l8
mov [gs:bp+2], si ; x2..
@@l8: shr si, 2d
sub si, ax ; si = bytes to copy
jb @@endline
jz @@singlebyte
mov bp, si
dec si
jz @@twobyte
mov dx, 3c4h
mov ax, 0f02h
out dx, ax
mov ebx, [txy1-2] ; xlo
mov ecx, [txx1-2] ; ylo
movsx esi, si
mov eax, [txy2]
sub eax, [txy1]
cdq
idiv esi ; addy
mov ecx, eax
mov eax, [txx2]
sub eax, [txx1]
cdq
idiv esi ; addx
mov edx, ecx ; look reg table
rol edx, 16d ; y_add
mov dh, dl ; yah
rol eax, 16d ; x_add
mov dl, al ; xah
test dl, 80h
jz @@l2
dec dh
@@l2:
mov bh, [Byte txy1+2] ; txt y
mov bl, [Byte txx1+2] ; txt x
test si, 1d
jz @@l1
movzx si, [fs:bx] ; out odd byte
add ecx, eax
mov al, [ds:bx+si]
adc ebx, edx
adc bh, 0
mov [es:bp+di-1],al
jmp [cs:jmp_tau+bp-2]
@@l1: jmp [cs:jmp_tau+si] ; and jump to rept
; e h l
; ax x_add data data
; bx ylo ty tx
; cx xlo - -
; dx y_add yah xah
; di -
; si sinus inc
ALIGN 4
IRP ccc, <200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1>
plz_y&ccc&:
movzx si, [fs:bx]
add ecx, eax
mov ah, [ds:bx+si]
adc ebx, edx
adc bh, 0
movzx si, [fs:bx]
add ecx, eax
mov al, [ds:bx+si]
adc ebx, edx
adc bh, 0 ; immediate = y_hi
mov [es:di+ccc*2-1], ax ; output byte
ENDM
plz_y0:
@@twobyte:
mov bh, [Byte txy2+2] ; txt y
mov bl, [Byte txx2+2] ; txt x
movzx si, [fs:bx]
mov cl, [ds:bx+si]
mov bh, [Byte txy1+2] ; txt y
mov bl, [Byte txx1+2] ; txt x
movzx si, [fs:bx]
mov ch, [ds:bx+si]
mov bx, [Word xx2+2]
and bx, 3d
mov ah, [start_mask+bx]
mov al, 02
mov dx, 3c4h
out dx, ax
mov [es:di], cl
mov bx, [Word xx1+2]
and bx, 3d
mov ah, [end_mask+bx]
out dx, ax
mov [es:bp+di], ch
@@endline:
add [Word to], 160d ; next line
mov di, [word to]
inc [yy]
add [word ctau], 4d
mov eax, [ax1]
add [xx1], eax
mov eax, [ax2]
add [xx2], eax
mov eax, [tay1]
add [txy1], eax
mov eax, [tax1]
add [txx1], eax
mov eax, [tay2]
add [txy2], eax
mov eax, [tax2]
add [txx2], eax ; increment txt and line indexes
dec [linecount]
jnz @@doline
@@end:
pop bp di si ds es
ret
@@singlebyte:
mov bh, [Byte txy2+2] ; txt y
mov bl, [Byte txx2+2] ; txt x
movzx si, [fs:bx]
mov cl, [ds:bx+si]
mov al, 02
mov dx, 3c4h
mov bx, [Word xx2+2]
and bx, 3d
mov ah, [start_mask+bx]
mov bx, [Word xx1+2]
and bx, 3d
and ah, [end_mask+bx]
out dx, ax
mov [es:di], cl
add [Word to], 160d ; next line
mov di, [word to]
inc [yy]
add [word ctau], 4d
mov eax, [ax1]
add [xx1], eax
mov eax, [ax2]
add [xx2], eax
mov eax, [tay1]
add [txy1], eax
mov eax, [tax1]
add [txx1], eax
mov eax, [tay2]
add [txy2], eax
mov eax, [tax2]
add [txx2], eax ; increment txt and line indexes
dec [linecount]
jnz @@doline
pop bp di si ds es
ret
ENDP
PUBLIC C shadepal
PROC C shadepal
ARG fpal:dword, ppal:dword, shd:word
push si di ds es
lds si, [ppal]
les di, [fpal]
mov dx, [shd]
mov cx, 192/16d
@@loop:
REPT 16
lodsb
mul dl
shr ax, 6d
stosb
ENDM
loop @@loop
pop es ds di si
ret
ENDP
ycnt dw 0
PUBLIC C do_clear
PROC C do_clear
ARG vmem:dword, otau:dword, ntau:dword
push si di ds es bp
mov dx, 3c4h
mov ax, 0f02h
out dx, ax
les dx, [vmem]
lds bx, [otau] ; dx:bx-> otau
lds si, [ntau]
sub si, bx ; dx:bx+si-> ntau
mov dl, [es:0] ; fill latches
mov [ycnt], 134d
xor ax, ax
@@lineloop:
cmp [Word ds:bx], 640d
je @@nextline
mov di, [Word ds:bx]
shr di, 2d
mov cx, [word ds:bx+si]
shr cx, 2d
sub cx, di
jb @@l1
add di, dx
rep stosb
@@l1:
mov di, [Word ds:bx+si+2]
shr di, 2d
mov cx, [word ds:bx+2]
shr cx, 2d
sub cx, di
jb @@nextline
add di, dx
inc di
rep stosb
@@nextline:
mov [Word ds:bx], 640d
mov [Word ds:bx+2], 0d
add dx, 160d
add bx, 4d
sub [ycnt], 1d
jae @@lineloop
; Maskaa p<><70>t...
les di, [vmem]
lds si, [ntau] ; dx:bx-> ntau
mov cx, 134d
mov dx, 3c4h
mov ax, 0f02h
@@maskloop:
mov bx, [ds:si]
dec bx
mov ah, [end_mask+bx]
out dx, ax
shr bx, 2d
mov [es:bx+di], ch
mov bx, [ds:si+2]
inc bx
mov ah, [start_mask+bx]
out dx, ax
shr bx, 2d
mov [es:bx+di], ch
@@nextmask:
add si,4d
add di, 160d
loop @@maskloop
pop bp es ds di si
ret
ENDP
ENDS
END