206 lines
2.8 KiB
NASM
206 lines
2.8 KiB
NASM
FREELINE equ 200
|
|
|
|
ALIGN 2
|
|
bgcolor dw 101h
|
|
|
|
newgroup PROC NEAR
|
|
;hline list in gs:si
|
|
push ds
|
|
mov ax,SEG newdata
|
|
mov ds,ax
|
|
mov bx,gs:[si]
|
|
add si,2
|
|
@@1: mov ax,gs:[si]
|
|
add si,2
|
|
cmp ax,-32767
|
|
je @@2
|
|
mov dx,gs:[si]
|
|
add si,2
|
|
cmp bx,7eh
|
|
jne @@z
|
|
@@z: push bx
|
|
;hline ax..dx,bx with gs:color
|
|
cmp ax,dx
|
|
jle @@3
|
|
xchg ax,dx
|
|
@@3: push dx
|
|
shl bx,1
|
|
mov dx,ds:[bx]
|
|
mov bp,ds:[FREELINE*2]
|
|
mov ds:[bx],bp
|
|
mov ds:[FREELINE*2],dx
|
|
mov bx,dx
|
|
;modify list bx=>bp (edx/hi=last color)
|
|
;copy blocks < hline start
|
|
xor edx,edx
|
|
@@b: mov ecx,ds:[bx]
|
|
cmp cx,ax
|
|
jae @@a ;[bx] bigger..
|
|
add bx,4
|
|
mov ds:[bp],ecx
|
|
add bp,4
|
|
jmp @@b
|
|
@@a: ;add hline start
|
|
jne @@aa
|
|
mov edx,ecx
|
|
add bx,4
|
|
mov ecx,ds:[bx]
|
|
@@aa: mov ds:[bp],ax
|
|
mov ax,gs:color
|
|
mov ah,al
|
|
mov ds:[bp+2],ax
|
|
add bp,4
|
|
;copy blocks < hline end
|
|
pop ax
|
|
@@d: cmp cx,ax
|
|
jae @@c
|
|
add bx,4
|
|
mov edx,ecx
|
|
mov ecx,ds:[bx]
|
|
jmp @@d
|
|
@@c: ;add hline end
|
|
jne @@ca
|
|
mov edx,ecx
|
|
add bx,4
|
|
mov ecx,ds:[bx]
|
|
@@ca: mov dx,ax
|
|
mov ds:[bp],edx
|
|
add bp,4
|
|
;copy rest of the list
|
|
@@f: cmp cx,32767
|
|
je @@e
|
|
add bx,4
|
|
mov ds:[bp],ecx
|
|
add bp,4
|
|
mov ecx,ds:[bx]
|
|
jmp @@f
|
|
@@e: ;last
|
|
mov ds:[bp],ecx
|
|
pop bx
|
|
inc bx
|
|
jmp @@1
|
|
@@2: pop ds
|
|
ret
|
|
newgroup ENDP
|
|
|
|
grouppage dw 1024
|
|
|
|
PUBLIC _initnewgroup
|
|
_initnewgroup PROC FAR
|
|
CBEG
|
|
mov ax,SEG newdata
|
|
mov ds,ax
|
|
mov dx,cs:grouppage
|
|
xor dx,32768
|
|
mov cs:grouppage,dx
|
|
mov cx,201
|
|
xor bx,bx
|
|
@@2: mov ax,ds:[bx]
|
|
mov ds:[bx],dx
|
|
mov ds:[bx+256*2],ax
|
|
add dx,128
|
|
add bx,2
|
|
loop @@2
|
|
mov cx,200
|
|
mov eax,32767
|
|
mov bx,cs:grouppage
|
|
@@1: mov ds:[bx],eax
|
|
add bx,128
|
|
loop @@1
|
|
CEND
|
|
_initnewgroup ENDP
|
|
|
|
PUBLIC _drawnewgroup
|
|
_drawnewgroup PROC FAR
|
|
CBEG
|
|
LOADDS
|
|
mov dx,3c4h
|
|
mov ax,0f02h
|
|
out dx,ax
|
|
mov es,ds:vram
|
|
mov ax,SEG newdata
|
|
mov gs,ax
|
|
mov cx,200
|
|
xor bx,bx
|
|
xor di,di
|
|
@@3: push cx
|
|
push di
|
|
push bx
|
|
shl bx,1
|
|
mov si,gs:[bx]
|
|
mov bx,di
|
|
mov bp,cs:bgcolor
|
|
mov dx,3c5h
|
|
mov al,0fh
|
|
@@1: mov cx,gs:[si]
|
|
cmp cx,32767
|
|
je @@2
|
|
mov ah,cl
|
|
shr cx,2
|
|
add cx,bx
|
|
sub cx,di
|
|
jcxz @@4
|
|
out dx,al
|
|
xchg ax,bp
|
|
dec cx
|
|
mov es:[di],ah
|
|
inc di
|
|
mov al,0fh
|
|
out dx,al
|
|
mov al,ah
|
|
shr cx,1
|
|
rep stosw
|
|
adc cx,cx
|
|
rep stosb
|
|
mov ch,al
|
|
mov ax,bp
|
|
mov al,0f0h
|
|
mov cl,ah
|
|
and cl,3
|
|
rol al,cl
|
|
out dx,al
|
|
mov es:[di],ch
|
|
xor al,0fh
|
|
mov bp,gs:[si+2]
|
|
add si,4
|
|
jmp @@1
|
|
@@4: mov ch,0f0h
|
|
mov cl,ah
|
|
and cl,3
|
|
rol ch,cl
|
|
mov ah,ch
|
|
and al,ch
|
|
out dx,al
|
|
mov cx,bp
|
|
mov es:[di],cl
|
|
mov al,ah
|
|
xor al,0fh
|
|
mov bp,gs:[si+2]
|
|
add si,4
|
|
jmp @@1
|
|
@@2: out dx,al
|
|
mov ax,cs:bgcolor
|
|
mov cx,bx
|
|
add cx,80
|
|
sub cx,di
|
|
jcxz @@5
|
|
dec cx
|
|
mov es:[di],ah
|
|
inc di
|
|
mov al,0fh
|
|
out dx,al
|
|
mov al,ah
|
|
shr cx,1
|
|
rep stosw
|
|
adc cx,cx
|
|
rep stosb
|
|
@@5: ;
|
|
pop bx
|
|
pop di
|
|
pop cx
|
|
add di,80
|
|
inc bx
|
|
loop @@3
|
|
CEND
|
|
_drawnewgroup ENDP
|
|
|