;!!!!!! TRANSPARENT NEW COPPER !!!!!! public __ndebug1 __ndebug1 dw 0 NROWS equ 256 MAXLINES equ 512 ndp0 dw 0 ;toggling pointer inside newdata1 ndp dw 0 ;pointer inside newdata1 nec dw 0 ;pointer to next free in ne nlc dw 0 ;items in horizontal list ALIGN 4 nep dw NROWS dup(0) ALIGN 4 ne db MAXLINES dup(16 dup(0)) NE_X equ 0 ;dd NE_Y1 equ 4 ;dw NE_Y2 equ 6 ;dw NE_COLOR equ 8 ;dw NE_NEXT equ 10 ;dw NE_DX equ 12 ;dd ALIGN 4 nl db 256 dup(0) ng_init PROC NEAR mov cs:nec,OFFSET ne mov ax,cs:ndp0 xor ax,8000h mov cs:ndp0,ax mov cs:ndp,ax mov cx,NROWS/2 mov ax,cs mov es,ax xor eax,eax mov di,OFFSET nep rep stosd mov ax,SEG newdata1 mov ds,ax cmp word ptr ds:[0],0 jne @@1 mov word ptr ds:[0],-1 @@1: cmp word ptr ds:[8000h],0 jne @@2 mov word ptr ds:[8000h],-1 @@2: ret ng_init ENDP ALIGN 2 yrow dw 0 yrowad dw 0 siend dw 0 fillmacro MACRO local l1,l2 jcxz l2 push ax l1: mov ah,al or ah,fs:[di] mov es:[di],ah inc di loop l1 pop ax l2: ENDM ng_pass3 PROC NEAR mov ax,SEG newdata1 mov ds,ax mov ax,0a000h mov es,ax mov ax,SEG _bgpic mov fs,ax xor di,di mov si,cs:ndp0 mov bx,si xor bx,8000h xor ax,ax ;si=new bx=last ;cx=newpos dx=lastpos ;al=newcol ah=lastcol mov edx,ds:[bx] add bx,4 mov ecx,ds:[si] add si,4 ; @@21: cmp dx,cx jb @@23 je @@22 ;cx=0 && xstart, di->end mov ax,cs:tmp_color mov cs:[bp+NE_COLOR],ax mov bx,es:[si+2] ;y1 mov cx,es:[di+2] ;y2 cmp bx,cx jg @@i1 ;y1>y2 mov ax,es:[si+0] ;x1 mov dx,es:[di+0] ;x2 jmp @@i0 @@i1: xchg bx,cx mov ax,es:[di+0] ;x1 mov dx,es:[si+0] ;x2 @@i0: ;ax,bx=xy1 dx,cx=xy2 @@i9: mov cs:[bp+NE_Y1],bx mov cs:[bp+NE_Y2],cx mov word ptr cs:[bp+NE_X],0 mov cs:[bp+NE_X+2],ax neg ax add ax,dx shl eax,16 cdq sub cx,bx ;cx=y2-y1,edx:eax=(x2-x1)<<16 cmp cx,0 je @@n1 ;skip horizontal lines movzx ecx,cx idiv ecx mov cs:[bp+NE_DX],eax ;!!!if y1<0, clip cmp bx,0 jge @@nc mov dx,cs:[bp+NE_Y2] cmp dx,0 jle @@n1 neg bx movzx ebx,bx imul ebx add cs:[bp+NE_X],eax xor bx,bx mov cs:[bp+NE_Y1],bx @@nc: ;!!! shl bx,1 mov ax,cs:nep[bx] or ax,ax jnz @@j1 ;first on this row mov cs:nep[bx],bp mov word ptr cs:[bp+NE_NEXT],0 jmp @@j0 @@j1: ;add to this row ;scan if already exists push ax push si mov si,ax jmp @@h11 @@h1: mov si,cs:[si+NE_NEXT] @@h11: mov ax,cs:[bp+NE_Y2] cmp ax,cs:[si+NE_Y2] jne @@h2 mov eax,cs:[bp+NE_X] cmp eax,cs:[si+NE_X] jne @@h2 mov eax,cs:[bp+NE_DX] cmp eax,cs:[si+NE_DX] jne @@h2 ;duplicate line SI mov al,cs:[bp+NE_COLOR] xor cs:[si+NE_COLOR],al pop si pop ax jmp @@n1 @@h2: cmp si,0 jne @@h1 ;end of list @@h3: pop si pop ax mov cs:nep[bx],bp mov word ptr cs:[bp+NE_NEXT],ax @@j0: add bp,16 @@n1: ;next pop cx loop @@3 add si,4 mov di,si jmp @@2 @@1: mov cs:nec,bp sub bp,OFFSET ne shr bp,4 mov cs:__ndebug1,bp ret __newgroup ENDP