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„„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