375 lines
6.9 KiB
NASM
375 lines
6.9 KiB
NASM
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
|