LANG OCTASM,0.1

DAT256
#paleta242 rb 1024   ;8bbp mode
#colortabla rb 2048  ;ybr color conversions
DAT4
#cpi{ dd latin1 DAT256 #latin1 rb 1000h #cpi437 rb 1000h }
enum 4,winx1,winy1,winx2,winy2,winx,winy,xmax2,ymax2
enum 4,winlst,bpp3_bufer,bytesporlinea,pflv,menu_video
#color dd 0
#colortransparente
#color1 dd 0
#paleta dd 0
#paleta2 dd 0 rb 512
#default_paleta dd 0
#bmp rb 8
#pflh dd 0;getvp
#pfgraf rb 4
#video_base_ptr dd 0
#video_mem dd 0
#bank_mask dd 0;0fffh
#bank_number rb 4
#bytesporpixel db 0
#videofuncion db 0
#bank_shl  db 0   #bank_shr  db 12
#window_b db 0  ;set to 1 if window_a is not rw
;#pfsetcolor dd 0
DAT4
#videofunciones
db 0,1,2,8,0,0,0,0,3,4,0,5,7,6,9,10
dd lv1,bpp1\g1,bpp1\g2,bpp1\g8,bpp1\g9,bpp1\g11,bpp1\g13,bpp1\g12,bpp1\g14,bpp1\g15,bpp1\g16,0   ;256colores             8bpp
dd lv2,bpp2\g1,bpp2\g2,bpp2\g8,bpp2\g9,bpp2\g11,bpp2\g13,bpp2\g12,bpp2\g14,bpp2\g15,bpp2\g16,0    ;64kcolores                   16bpp
dd lv3,bpp3\g1,bpp3\g2,bpp3\g8,bpp3\g9,bpp3\g11,bpp3\g13,bpp3\g12,bpp3\g14,bpp3\g15,bpp3\g16,0    ;16mcolores              24bpp
dd lv4,bpp4\g1,bpp4\g2,bpp4\g8,bpp4\g9,bpp4\g11,bpp4\g13,bpp4\g12,bpp4\g14,bpp4\g15,bpp4\g16,0    ;16mcolores 32bpp
CODE

bmp_mono=14
bmp_8=11
bmp_8_trans=12
bmp_trans=15
bmp_read=8
bmp32_write=3
#setvideomode ;(modo de video) ncr vesa 1.2
	{     ;retorna cf=1 si error

define P(strng)  pusha fprintf([f_out],"strng %10 %0") esp+=8 popa
define PN(strng,param)  pusha ebp=esp fprintf([f_out],"strng %10 %0",param) esp=ebp popa
DAT4 #f_out dd \..\GRAPH.TXT
CODE
	pushad ebx=[esp+arg1] PN(setvideomode %x,ebx)
	sub esp,256 test bh jnz >1
	al=13h rm_int(10h)
	d[xmax2]=320 d[ymax2]=200 ecx=1
	d[vscreen\vx]=320 d[vscreen\vy]=200
	d[bytesporlinea]=320
	d[bytesporpixel]=1 d[pflh]=getvp
	w[bank_shl]=1f00h or d[bank_mask],-1
	d[video_base_ptr]=0a0000h jmp l5
#error  PN(setvideomode error %x,eax) add esp,256 popad stc retp 4
      # or bh,040H ;lfb
	edi=esp ecx=ebx ax=4f01h rm_int(10h) cmp ax,4fh je >1
	P(no lfb)
	and ch,1011_1111b ;probar sin lfb
	ax=4f01h
	edi=esp rm_int(10h) cmp ax,4fh jne error
      # vesa10() jc error
	eax=[edi]
	test al,1 jz error ;mode supported?
	test al js >1 ;lfb?  VBE v2.0
	P(using bank switch)
	shr eax,16 and ax,707h
	b[window_b]=0
	cmp al,7 je >1
	or al,ah cmp al,7 jne error
	b[window_b]=1   ;required to use window_b
      # ebx=ecx+8000h ;videomode ,no borrar
	P(fijar el modo de video)
	ax=4f02h rm_int(10h) ;fijar el modo de video
	cmp ax,4fh jne error
	ecx=w[edi+10h] [bytesporlinea]=ecx
	PN(bytesporlinea %d,ecx)
	ecx=w[edi+20] d[vscreen\vy]=ecx [ymax2]=ecx
	PN(vy %d,ecx)
	ecx=w[edi+18] d[vscreen\vx]=ecx [xmax2]=ecx
	PN(vx %d,ecx)
	push ecx
	al=[edi+19h] shr al,3 [bytesporpixel]=al
	pusha eax=al PN(bytesporpixel %d,eax) popa
	ecx=w[edi+18] dec ecx  ;redondear x
	bsr eax,ecx inc eax
	ecx=0 [vscreen\x]=ecx [vscreen\y]=ecx
	bts ecx,eax
      # ;calc vscreen size
	eax=[video_mem] ebx=b[bytesporpixel]
	cdq div ebx cdq div ecx
	cmp eax,d[vscreen\vy] jc >1
	[esp]=ecx add ecx,ecx
	cmp ecx,eax jna <1
      # pop ecx ax=4f06h ebx=0
	rm_int(10h) cmp ax,4fh jne >1
	[ymax2]=dx [bytesporlinea]=bx [xmax2]=cx
      # ebx=w[bytesporlinea] PN(bytesporlinea %d ,ebx)
	PN(xmax2 %d ymax2 %d,([xmax2],[ymax2]))
	d[pflh]=getvp
	pop eax push eax test al jns l4
	;linear framebuffer mode supported
	or d[bank_mask],-1 b[bank_shr]=31
	eax=[esp+28h] [video_base_ptr]=eax
	PN(getvp2+6 %x,eax)
	[getvp2+6]=eax
	bsr eax,ebx bsf edx,ebx cmp al,dl jne l5
	[getvp2+2]=al ah=[bytesporpixel]
	PN(getvp2+2 %x,eax)
	al=10h dec ah jz >1
	al=42h dec ah jz >1
	al=82h dec ah jz l5
      # [getvp2+5]=al d[pflh]=getvp2 jmp l5
    #l4 eax=w[esp+8] shl eax,4
	[video_base_ptr]=eax
	PN(video_base_ptr %x,eax)
	bsf eax,[esp+4] bsf ebx,[esp+6] ecx=0
	dec ebx cmp ebx,eax adc ebx,ecx
	neg al add al,bl add bl,10 ah=bl
	bts ecx,ebx dec ecx
	[bank_shl]=ax [bank_mask]=ecx
	PN(bank_shl %x bank_mask %x,(eax,ecx))
      #l5
	eax=0 [bank_number]=eax [videofuncion]=al
	cl=[bytesporpixel] cmp cl,1 jne >1
      { P(plte)
	pushad sub esp,768+4 edi=esp ecx=0 esi=paleta242
      # lodsd bswap eax ror eax,10 and eax,3f3f3fh stosd dec edi dec cl jnz <1
	ax=1012h ebx=0 ch=1 edx=esp rm_int(10h)
	add esp,768+4 popad
      }
      # edi=[bpp3_bufer] free() [bpp3_bufer]=edi
	cmp cl,3 jne >1
	P(bpp3)
	push ecx ecx=[bytesporlinea] add ecx,20 malloc() [bpp3_bufer]=edi
	pop ecx
      # add esp,256 popad
	retp 4

;in the VESA SuperVGA mode information
;resolution info is optional for VESA modes in v1.0/1.1
#vesa10 ;edi->vesa struct cl=videomode
       P(vesa10)
       test w[edi+12h] jnz >2  ;info provided?
       PN(no resolution info %x,ecx)
       eax=640+400*10000h test cl jz >1
       eax=640+480*10000h cmp cl,1 je >1
       eax=800+600*10000h cmp cl,3 je >1
       eax=1024+768*10000h cmp cl,5 je >1
       stc ret
     # pusha edx=eax eax=ax edx>>=16 PN(resolution: %d %d,(eax,edx)) popa
       [edi+12h]=eax ;resolution
       b[edi+19h]=8  ;bpp
     # clc ret
    }

#setvideofuncion  ;parametro en al solo cambia eax
       d[paleta2]=0
       and al,15 ah=al xchg al,[videofuncion] cmp al,ah je >2
       push ebx eax=ah al=[eax+videofunciones]
       ebx=b[bytesporpixel] shl ebx,4 ebx=videofunciones+16+ebx*3-48
       d[pfgraf]=[ebx+eax*4]
       ebx=[ebx] cmp al,5 jc >1
       ebx=lv4 cmp al,8 je >1
       ebx=lv5 ja >1
       ebx=lv3 cmp al,6 je >1
       ebx=lv1
     # [pflv]=ebx pop ebx
     # ret

#setpaleta and d[paleta2],0 d[paleta]=[esp+ws] retp 4
#lv5 push eax eax=ecx shr ecx,3 and eax,7
     eax+=[bmp+4] btr eax,3 adc ecx,0 [bmp+4]=al
     [bmp]+=ecx pop eax ret
#lv4 [bmp]+=ecx
#lv3 [bmp]+=ecx
#lv2 [bmp]+=ecx
#lv1 [bmp]+=ecx
#lv  ret

#pixel push ecx ecx=1 lh2() pop ecx ret
#lh2{  ;con signo comprueba ecx=0
	;eax,edx,ecx
	pusha
	test ecx jz l3 jns >1
	eax=eax+ecx+1 neg ecx
      # test edx js l2
	test eax jns l0
	add eax,ecx jng l2
	sub ecx,eax call [pflv] ecx=eax
	eax=0 jmp l0
#u    ; sin signo, comprueba los limites de la ventana
      ; eax,edx,ecx ncr
	pusha
   #l0  edi=[winlst] test edi jz l3
	add edx,[winy1]
	add eax,[winx1]
	cmp [winy2],edx jc l2
	ebx=[winx2] sub ebx,eax js l2
	inc ebx cmp ecx,ebx ja l1
	f()
    #l3 popa ret
    #l1 xchg ecx,ebx sub ebx,ecx
	push ebx f()
	pop ecx
    #l2 call [pflv]
	popa ret

   #f             ;eax,edx,ecx,edi        comprueba los fragmentos de la ventana
	pusha
      # edi=[edi] test edi jz l2
	cmp edx,[edi+gui\frag\y] jl <1
	cmp [edi+gui\frag\y2],edx jc <1
	cmp eax,[edi+gui\frag\x] jl <1
	ebx=[edi+gui\frag\x2]
	sub ebx,eax js <1
	inc ebx edi=[edi+gui\frag\tp]
	cmp ebx,ecx jnc >1 ecx=ebx
      # sub [esp+24],ecx add [esp+28],ecx call [edi]
	popa test ecx jnz f ret
      }

#getvp2 ;eax=x edx=y linear framebufer
	;bytesporpixel 1,2,4
	;bytesporlinea potencia de 2
	;codigo variable
	shl edx,9 edi=eax*4+edx+99999 jmp [pfgraf]

#getvp ;eax=x edx=y
	push ecx bl=[bytesporpixel]
	imul edx,[bytesporlinea]
	edx+=eax dec bl jz >1
	edx+=eax dec bl jz >1
	edx+=eax dec bl jz >1
	edx+=eax
      # cl=[bank_shr] edi=edx shr edx,cl
	and edi,[bank_mask] add edi,[video_base_ptr]
	cmp edx,[bank_number] je >1
	[bank_number]=edx cl=[bank_shl] shl edx,cl
	ax=4f05h ebx=0 pusha rm_int(10h) popa
	bl=[window_b] test bl jz >1
	ax=4f05h pusha rm_int(10h) popa
      # pop ecx jmp [pfgraf]

bpp1{
	#g1 al=[color] jmp setdata

	#g2 al=[color] # xor [edi],al inc edi loop <1 ret

	#g8 esi=edi edi=[bmp] jmp >1
	#g9 esi=[bmp]
	# add [bmp],ecx jmp movedata

	#g12 ebx=b[colortransparente]
	      # ebp=[paleta] esi=[bmp]
	      # eax=b[esi] inc esi cmp eax,ebx je >1
		eax=[eax*4+ebp] ;dither()
		ror eax,8 shr ah,6 shr ax,4 rol eax,2
		[edi]=al
	      # inc edi loop <2
		[bmp]=esi ret

	#g11    esi=[paleta]
		ebp=paleta2+4 ;esi=[bmp]
		cmp esi,[paleta2] je >2
		pusha
		[paleta2]=esi edi=ebp
		cl=0
	      # lodsd
		ror eax,8 shr ah,6 shr ax,4 rol eax,2
		stosb dec cl jnz <1
		popa
	      # esi=[bmp] eax=0
	      # test edi,3 jz >1
		lodsb al=[eax+ebp] stosb loop <1
	      # push ecx shr ecx,2 jz >2
	      # ebx=0
		lodsd ebx=al dl=[ebx+ebp]
		ebx=ah dh=[ebx+ebp] rol eax,16 rol edx,16
		ebx=al dl=[ebx+ebp]
		ebx=ah dh=[ebx+ebp] rol edx,16
		[edi]=edx add edi,4 dec ecx jnz <1
	      # pop ecx and ecx,3 jz >2
		eax=0
	      # lodsb al=[eax+ebp] stosb loop <1
	      # ecx=0 [bmp]=esi ret

	#dither
		edx=3f0f3fh and edx,eax
		and eax,0c0f0c0h
		add ebx,edx edx=401040h and edx,ebx
		sub ebx,edx
		add eax,edx edx=1010100h and edx,eax
		shr edx,2 shr dh,2 sub eax,edx
		edx=eax shr ah,4 shr ax,6
		bswap edx or al,dh
		ret

	#g13 ;dithering
		esi=[bmp] ebx=[v_dither]
	      # eax=[esi] add esi,3
		dither()
		stosb loop <1
		[bmp]=esi [v_dither]=ebx ret
		DAT4
		#v_dither dd 0
		CODE

	#g14    esi=[bmp] ebx=[v_dither]
	      # lodsd
		dither()
		stosb loop <1
		[bmp]=esi [v_dither]=ebx ret

	#g15    ;monocromo
		esi=[bmp] ebp=ecx
		al=[color] ah=al dx=ax rol eax,16 ax=dx [color]=eax bl=al
		al=[color1] ah=al dx=ax rol eax,16 ax=dx [color1]=eax bh=al
		ecx=b[bmp+4]
		edx=[esi] add esi,4 bswap edx shl edx,cl
	      # test edi,3 jz >1
		add edx,edx sbb ax,ax not al and eax,ebx
		or al,ah stosb
		inc cl dec ebp jnz <1
	      # push ebp,ebx ch=cl shr ebp,2 jz g15b
		dec cl and cl,3 add cl,13
	      # add edx,edx sbb al,al add ch,4
		add edx,edx sbb ah,ah rol eax,16
		add edx,edx sbb al,al or ebx,-1
		add edx,edx sbb ah,ah rol eax,16
		xor ebx,eax and eax,[color1]
		and ebx,[color] or eax,ebx
		stosd cmp ch,29 jc >1
		shr edx,cl dx=[esi] add esi,2
		xchg dl,dh shl edx,cl sub ch,16
	      # dec ebp jnz <2
	  #g15b pop ebp,ebx cl=ch and ebp,3 jz >2
	      # add edx,edx sbb ax,ax not al and eax,ebx
		or al,ah stosb
		inc cl dec ebp jnz <1
	      # eax=cl shr eax,3 and cl,7 [bmp+4]=cl eax=esi+eax-4
		ecx=0 [bmp]=eax ret

	#g16  ;monocromo transparente
	       ebp=ecx esi=[bmp] cl=[bmp+4]
	       edx=[esi] bswap edx shl edx,cl
	       eax=[color]
	     # add edx,edx jnc >1
	       [edi]=al
	     # inc edi inc ecx btr ecx,5 jnc >1
	       add esi,4 edx=[esi] bswap edx
	     # dec ebp jnz <3
	       eax=cl shr eax,3 and cl,7 add eax,esi
	       [bmp]=eax [bmp+4]=cl ecx=0 ret

     }

bpp2{
	#g1 add ecx,ecx eax=[color] jmp setdataw

	#g2 eax=[color] # xor [edi],ax add edi,2 loop <1 ret

	#g8 esi=edi edi=[bmp] jmp >1
	#g9 esi=[bmp]
	  # add ecx,ecx add [bmp],ecx jmp movedata

	#g12 ebx=b[colortransparente] ;jmp >1
	;#g11 bh=1
	      # ebp=[paleta] esi=[bmp]
	      # eax=b[esi] inc esi cmp eax,ebx je >1
		dx=[eax*4+ebp] ah=[eax*4+ebp+2]
		shr dh,2 and ax,0f800h shr dx,3 or ax,dx
		[edi]=ax
	      # add edi,2 loop <2
		[bmp]=esi ret

	#g11   esi=[paleta]
	       ebp=paleta2+4 ;esi=[bmp]
	       cmp esi,[paleta2] je >2
	       pusha
	       [paleta2]=esi edi=ebp
	       cl=0
	     # lodsd
	       ror eax,8 shr ah,3 shr ax,2 rol eax,5
	       stosw dec cl jnz <1
	       popa
	     # esi=[bmp]
	       test edi,2 jz >1
	       eax=b[esi] inc esi
	       eax=[eax*2+ebp]
	       stosw
	       dec ecx
	     # push ecx shr ecx,1 jz >2
	      # eax=0 ebx=0
		lodsw xchg bl,ah
		ebx=[ebx*2+ebp] eax=w[eax*2+ebp]
		shl ebx,16 or eax,ebx
		stosd dec ecx jnz <1
	     # pop ecx test ecx,1 jz >1
	       eax=b[esi] inc esi
		eax=[eax*2+ebp]
		stosw
	     # ecx=0 [bmp]=esi ret

	#g13 esi=[bmp]
	      # dx=[esi] ah=[esi+2] add esi,3
		shr dh,2 and ax,0f800h shr dx,3 or ax,dx
		stosw loop <1
		[bmp]=esi ret

	#g14
	     # esi=[bmp]
	       test edi,2 jz >1
	       lodsd ror eax,8 shr ah,3 shr ax,2 rol eax,5
	       stosw
	       dec ecx
	     # push ecx shr ecx,1 jz >2
	      # eax=[esi] edx=[esi+4] add esi,8
		ror eax,8 ror edx,8
		shr ah,3 shr dh,3
		shr ax,2 shr dx,2
		ror eax,11 rol edx,5
		shrd eax,edx,16
		stosd dec ecx jnz <1
	     # pop ecx test ecx,1 jz >1
	       lodsd ror eax,8 shr ah,3 shr ax,2 rol eax,5
	       stosw
	     # ecx=0 [bmp]=esi ret

	#g15   ;monocromo
	       esi=[bmp] ebp=ecx
	       ax=[color] dx=ax rol eax,16 ax=dx [color]=eax
	       ax=[color1] dx=ax rol eax,16 ax=dx [color1]=eax
	       cl=[bmp+4]
	       edx=[esi] add esi,4 bswap edx shl edx,cl
	     # test edi,2 jz >2
	       ax=[color] add edx,edx jnc >1
	       ax=[color1]
	     # stosw inc cl dec ebp
	     # push ebp ch=cl shr ebp,1 jz g15b
	       dec cl and cl,1 add cl,15
	     # add edx,edx sbb eax,eax add ch,2
	       add edx,edx sbb ax,ax or ebx,-1 rol eax,16
	       xor ebx,eax and eax,[color1]
	       and ebx,[color] or eax,ebx
	       stosd cmp ch,31 jc >1
	       shr edx,cl dx=[esi] add esi,2
	       xchg dl,dh shl edx,cl sub ch,16
	     # dec ebp jnz <2
	  #g15b pop ebp test ebp,1 jz >3
	     # ax=[color] add edx,edx jnc >1
	       ax=[color1]
	     # stosw inc ch
	     # eax=ch shr eax,3 and ch,7 [bmp+4]=ch eax=esi+eax-4
	       ecx=0 [bmp]=eax ret

	#g16  ;monocromo transparente
	       ebp=ecx esi=[bmp] cl=[bmp+4]
	       edx=[esi] bswap edx shl edx,cl
	       eax=[color]
	     # add edx,edx jnc >1
	       [edi]=ax
	     # add edi,2 inc ecx btr ecx,5 jnc >1
	       add esi,4 edx=[esi] bswap edx
	     # dec ebp jnz <3
	       eax=cl shr eax,3 and cl,7 add eax,esi
	       [bmp]=eax [bmp+4]=cl ecx=0 ret

     }

bpp3{
	#lbpp3 ;read video data into bpp3_bufer
	       ;ncr
	  pusha
	  ecx=ecx*3 esi=edi edi=[bpp3_bufer] movedata()
	  popa ret

	#g1 eax=[color] esi=[bpp3_bufer]
	  push ecx
	  [esi]=eax [esi+3]=eax
	  eax=[esi] ebx=[esi+1] edx=[esi+2]
	# [esi]=eax [esi+4]=ebx [esi+8]=edx add esi,12 sub ecx,4 ja <1
	  jmp stbpp3

	#g2 esi=[bpp3_bufer]
	  eax=[color] [esi]=eax [esi+3]=eax
	  eax=[esi] ebx=[esi+1] edx=[esi+2]
	  push ecx lbpp3()
	# xor [esi],eax xor [esi+4],ebx xor [esi+8],edx add esi,12 sub ecx,4 ja <1
	  jmp stbpp3

	#g8  esi=edi edi=[bmp] jmp >1
	#g13
	#g9  esi=[bmp]
	  # ecx=ecx*3 add [bmp],ecx jmp movedata

	#g12  lbpp3()
	      ebx=b[colortransparente] jmp >1
	#g11  bh=1
	      # push edi,ecx edi=[bpp3_bufer]
		ebp=[paleta] esi=[bmp]
	      # eax=b[esi] inc esi cmp eax,ebx je >1
		eax=[eax*4+ebp] [edi]=eax
	      # add edi,3 loop <2
  #stbpp3a      [bmp]=esi
		pop edi
  #stbpp3 pop ecx ecx=ecx*3 esi=[bpp3_bufer] jmp movedata

	 #g14 push edi,ecx esi=[bmp] edi=[bpp3_bufer]
	    # movsd dec edi loop <1
	      jmp stbpp3a

	#g15   push edi,ecx edi=[bpp3_bufer]
	      ;monocromo
	       esi=[bmp] ebp=ecx
	       cl=[bmp+4]
	       edx=[esi] bswap edx shl edx,cl
	       ebx=esi+4
	     # add edx,edx sbb eax,eax and eax,4 eax=[color+eax]
	       [edi]=eax add edi,3
	       inc ecx btr ecx,5 jnc >1
	       edx=[ebx] add ebx,4 bswap edx
	     # dec ebp jnz <2
	       esi=ebx-4
	#g151  eax=cl shr eax,3 add esi,eax
	       and cl,7 [bmp+4]=cl jmp stbpp3a

	#g16  ;monocromo transparente
	       lbpp3()
	       push edi,ecx edi=[bpp3_bufer]
	       ebp=ecx esi=[bmp] cl=[bmp+4]
	       edx=[esi] bswap edx shl edx,cl
	       eax=[color]
	     # add edx,edx jnc >1
	       [edi]=eax
	     # add edi,3 inc ecx btr ecx,5 jnc >1
	       add esi,4 edx=[esi] bswap edx
	     # dec ebp jnz <3
	       jmp g151
     }

bpp4{
	#g1 eax=[color] rep stosd ret

	#g2 eax=[color] # xor [edi],eax add edi,4 loop <1 ret

	#g8 esi=edi edi=[bmp] rep movsd [bmp]=edi ret

	#g14
	#g9 esi=[bmp] rep movsd [bmp]=esi ret

	#g12 ebx=b[colortransparente] jmp >1
	#g11 bh=1
	      # ebp=[paleta] esi=[bmp]
	      # eax=b[esi] inc esi cmp eax,ebx je >1
		eax=[eax*4+ebp] and eax,0ffffffh
		[edi]=eax
	      # add edi,4 loop <2
		[bmp]=esi ret

	#g13    esi=[bmp]
	      # dec esi and eax,0ffffffh stosd loop <1
		[bmp]=esi ret

	#g15  ;monocromo
	       ebp=ecx esi=[bmp] cl=[bmp+4]
	     # edx=[esi] bswap edx shl edx,cl
	     # add edx,edx sbb eax,eax and eax,4
	       eax=[color+eax] stosd
	       inc ecx btr ecx,5 jnc >1
	       add esi,4 edx=[esi] bswap edx
	     # dec ebp jnz <2
	       eax=cl shr eax,3 and cl,7 add eax,esi
	       [bmp]=eax [bmp+4]=cl ecx=0 ret

	 #g16  ;monocromo transparente
	       ebp=ecx esi=[bmp] cl=[bmp+4]
	       edx=[esi] bswap edx shl edx,cl
	       eax=[color]
	     # add edx,edx jnc >1
	       [edi]=eax
	     # add edi,4 inc ecx btr ecx,5 jnc >1
	       add esi,4 edx=[esi] bswap edx
	     # dec ebp jnz <3
	       eax=cl shr eax,3 and cl,7 add eax,esi
	       [bmp]=eax [bmp+4]=cl ecx=0 ret

	;ebx=plte ecx=n_pixels
	;esi->in bmp 1bpp
	;edi->out bmp 32bpp
	;ncr
#b1     pusha ebp=ecx cl=1 jmp >1
#b2     pusha ebp=ecx cl=2 jmp >1
#b4     pusha ebp=ecx cl=4
      # ch=cl test ebp jz >3
      # sub ch,cl jnz >1
	edx=b[esi] inc esi ch=8
      # edx<<=cl eax=dh edx=dl eax=[eax*4+ebx] stosd dec ebp jnz <2
      # popa ret

#b8   jecxz >2
	pusha
      # eax=b[esi] inc esi eax=[eax*4+ebx] stosd loop <1
	popa
      # ret

#b24    jecxz >2
	pusha
      # dec esi lodsd eax>>=8 stosd loop <1
	popa
      # ret

#b24_b  jecxz >2
	pusha
      # dec esi lodsd al=0 bswap eax stosd loop <1
	popa
      # ret
     }

#cls    pusha edi=d[window] test edi jz >2
	test b[edi+gui\flags],8 jz >1 ;wintext?
	gui\wintext\cls()
	popa ret
      # al=1 setvideofuncion()
	eax=0 [color]=eax ecx=[winx] edx=[winy]
	dec ecx,edx rectangle(eax,eax,ecx,edx)
      # popa ret

#vscreen{  ;seleccina la parte visible de la pantalla segun la posicion del raton
	DAT4 enum 4,x,y,vx,vy
	DAT #mode db 0
	CODE
	cmp b[mode],1 je >3 ja sc
	esi=x bl=1 eax=[mousex] call >1
	add esi,4 eax=[mousey] ecx=edx call >1
    #l1 test ebx jnz >3
	ax=4f07h pusha rm_int(10h) popa ret
      # edx=[esi] sub eax,edx jc >1
	sub eax,[esi+8] js >2
      # add edx,eax ebx=0 [esi]=edx
      # ret
      #sc
	esi=x bl=1 eax=[mousex] edi=[xmax2] call >1
	add esi,4 eax=[mousey] ecx=edx
	edi=[ymax2] call >1 jmp l1
      # edx=[esi+8] sub edi,edx
	shr edx,1
	sub eax,edx edx=[esi] js >1
	cmp eax,edx je >1
	cmp eax,edi jnc >1
	edx=eax ebx=0 [esi]=eax
      # ret
	}

#escribeg pusha test d[window] jnz >3
      # popa ret
#escribe ;137bytes x,y,cad,num               ax,dx,si,cl ncr
	pusha
	edi=d[window] test edi jz <1
	test b[edi+gui\flags],8 jz >1 ;wintext?
	gui\wintext\write(eax,edx,ecx,esi,[color])
	popa ret
      # sal eax,3 sal edx,4
      # ecx=cl ebp=ecx bl=[videofuncion] jecxz <3
	cmp bl,bmp_trans je >1
	push eax al=bmp_mono setvideofuncion() pop eax
      # edi=16 ecx=32 cmp ebp,ecx jnc >1
	ecx=ebp
      # pusha
	enter 1024,0 ebx=[cpi]
      # ecx=b[ebp+24+4] esi=[ebp+8]
	push ebp ebp=esp add ebp,1024+4-32-1 sub ebp,esi
      # eax=b[esi] inc esi sal eax,4
	al=[ebx+eax] [ebp+esi]=al loop <1
	pop ebp inc ebx ecx=b[ebp+24+4] sal ecx,3
	edi=esp esi=edi+1024-32
	[bmp]=esi b[bmp+4]=0
	eax=[ebp+28+4] lh2() inc edx dec b[ebp+4] jnz <2
	leave popa add esi,32 add eax,32*8 sub ebp,ecx jnz <4
	al=bl
	setvideofuncion()
	popa ret

#escribenumb movsx ebx,bl test ch jz escribenuml js escribenuml ebx=bl
#escribenum ;x,y,num,ancho,base   ax,dx,bx,cl,ch ncr
	movsx ebx,bx test ch jz escribenuml js escribenuml ebx=bx
#escribenuml ;x,y,num,ancho,base   ax,dx,ebx,cl,ch ncr
	pusha xchg ch,cl
	edi=>4 eax=ebx cmp ch,34 jc >1
	ch=34
      # ltoa()
	ecx=b[esp+24] sub edi,ecx cmp edi,>2 jnc >1
	edi=>2 cl=68
      # esi=edi eax=[esp+28]
	escribe() popa ret

DAT
# db '                                              '
# db '                                              '
CODE

#rectangulo ;
	pusha
	gui\pv_pp() rectangle(eax,ebx,ecx,edx)
	popa ret

#rectangle ;(x1,y1,x2,y2)
	pusha eax=[esp+arg1] edx=[esp+arg1+4]
	ecx=[esp+arg1+8] ebx=[esp+arg1+12]
    #l1 cmp eax,ecx jng >1  ;ordenar las coordenadas
	xchg eax,ecx
      # cmp ebx,edx jg >1
	xchg ebx,edx
      # sub ecx,eax inc ecx
      # lh2() inc edx cmp edx,ebx jng <1
	popa retp 16


#marco ;(x1,y1,x2,y2,ancho) ncr
	pusha eax=[esp+arg1] ebx=[esp+arg1+4]
	ecx=[esp+arg1+8] edx=[esp+arg1+12]
	esi=[esp+arg1+16] edi=eax+esi*2-1
	cmp edi,ecx jnc >1
	edi=ebx+esi*2-1
	cmp edi,edx jc >2
      # rectangle(eax,ebx,ecx,edx) popad retp 20
      # sub edi,edx edx=ebx+esi-1 rectangle(eax,ebx,ecx,edx)
	ebx=ecx+1 sub ebx,esi ecx=esi neg edi
      # inc edx lh2() xchg eax,ebx lh2() xchg eax,ebx
	dec edi jnz <1
	ecx=[esp+arg1+8] ebx=[esp+arg1+12] inc edx
	rectangle(eax,edx,ecx,ebx)
	popa retp 20

#triangulo  ;(x1,y1,x2,y2,x3,y3) stack ncr
	{
	PROCP((x1,y1,x2,y2,x3,y3))
	;ordenar las coordenadas de menor a mayor
	eax=[esp+x1] ebx=[esp+y1] ecx=[esp+x2] edx=[esp+y2] esi=[esp+x3] edi=[esp+y3]
	cmp edi,edx jnl >1
	xchg edx,edi xchg cx,si
      # cmp edx,ebx jnl >1
	xchg edx,ebx xchg eax,ecx
      # cmp edi,edx jnl >1
	xchg edx,edi xchg ecx,esi
      # [esp+y1]=ebx [esp+x2]=ecx ecx=edi sub edi,edx sub edx,ebx sub ecx,ebx
	[esp+y2]=edx [esp+x3]=esi [esp+y3]=edi
	test ecx,0e0000000h jnz >3 ;triangulo muy grande
	push ecx ecx=ecx*8+8 malloc() ebx=esi esi=edi [esi]=eax
	pop ecx plinea2() esi=ecx*4+esi+4 [esp+x1]=esi
	ecx=edx test edx jnz >1
	d[esi]=[esp+x2] jmp >2
      # [esi]=eax ebx=[esp+x2] plinea2() esi=esi+ecx*4
      # ebx=[esp+x3] ecx=[esp+y3] plinea2() esi=edi ebx=[esp+x1]
	ecx=ebx sub ecx,edi shr ecx,2 edx=[esp+y1] trazo() free()
      # RETURNP
    }

#trazo ;26b (int y,int vy,int *p1,int *p2) dx,cx,ds:si,ds:bx ncr

	jecxz >3
	pusha edi=ecx
      # ecx=[ebx] add ebx,4 eax=[esi] add esi,4 sub ecx,eax jns >1
	add eax,ecx neg ecx
      # inc ecx lh2() inc edx dec edi jnz <2
	popa
      # ret

#plinea2  ;(x1,x2,n,pdest) [si],bx,cx,esi
	cmp ecx,2 ja >3
	cmp ecx,1 ja >2 jc >1
	[esi+4]=ebx
      # ret
      # [esi+8]=ebx add ebx,[esi] sar ebx,1 [esi+4]=ebx ebx=[esi+8] ret
      # pusha
      # eax=ebx sub eax,[esi] cdq idiv ecx ebx=eax eax=[esi]
	ebp=ecx sar ebp,1 edi=ecx test edx jns >1
	add edx,ecx dec ebx
      # add esi,4 add eax,ebx sub ebp,edx jns  >1
	inc eax add ebp,edi
      # [esi]=eax dec ecx jnz <2
	popa ret

      # sub ecx,eax js >1
	add ecx,2
      # dec ecx lh2() popad ret
#linea2   ;(x,y,x2,y2) eax,edx,ecx,ebx ncr
	pusha
	cmp edx,ebx je <2
	jc >1  ;numeros sin signo
	xchg eax,ecx xchg ebx,edx
      # xchg ecx,ebx sub ecx,edx inc ecx cmp ecx,2000 jnc >1
	ebp=ecx ecx=ecx*4+4 malloc() ecx=ebp
	[edi]=eax esi=edi plinea2() ebx=edi+4 trazo() free()
      # popa ret

#xchg_colors  push [color],[color1]
	pop [color1],[color] ret

color{
#ybr    pusha ecx=eax ebp=al
	eax=ah shr ecx,16 ecx=cl
	eax=eax*4+colortabla+1024
	ecx=ecx*4+colortabla
	ebx=[eax] edx=w[eax+2] add ebx,ebp
	eax=w[ecx] add ebx,[ecx+2]
	add eax,ebp add edx,ebp
	test ah jz >1 al=0 js >1 al=-1
      # shl eax,16 test dh jz >1 dl=0 js >1 dl=-1
      # al=dl test bh jz >1 bl=0 js >1 bl=-1
      # ah=bl bgr() [esp+28]=eax
	popa ret

#rgb bswap eax ror eax,8
#bgr ;color en eax
	cmp b[bytesporpixel],2 ja >3
	push edx edx=eax jc >1
	shr eax,8 shr dh,2
	and eax,0f800h shr dx,3 jmp >2
      # shr eax,16 shr dh,4
	and eax,0c0h shr dx,6
      # or eax,edx
	pop edx
      # [color]=eax ret
     }

#circulo{ ;ecx=radio eax=centro_x edx=centro_y
pushad ebp=esp
define centro_x [ebp+28]
define centro_y [ebp+20]
define r [ebp+24]
define T ebx
define t2 esi
define x eax
define y edx

T=0 x=0 y=r esi=0

#loop_circle
add T,t2 js next_pixel
t2=y*4 dec y sub T,t2
#next_pixel
	pushad
	ecx=1 bl=4
	#l3
	push x,y,x,y add x,centro_x add y,centro_y lh2()
	pop y,x add x,centro_x add y,centro_y lh2()
	pop y,x
	neg y dec bl jnz l3
	popad
inc x t2=x*4 cmp y,x ja loop_circle
popad ret
}

#ellipse {  PROCP((x,y,xr,yr))
	ebp=esp eax=[ebp+yr] esi=0 edi=[ebp+xr]
	test eax jz a_4    ; can't do radius 0
	test edi jz a_4
	cmp eax,edi jl a_2 ; jump to x or y loop
	ebx=eax edi=eax shl edi,5
#a_1    eax=edi imul d[ebp+xr] idiv ebx
	add eax,16 ecx=esi+16
	p2() jnl a_1 jmp a_4
#a_2    ebx=edi shl edi,5
#a_3    eax=esi imul d[ebp+yr] idiv ebx
	ecx=eax+16
	eax=edi+16
	p2() jnl a_3
#a_4    RETURNP
#p2     sar eax,5 add eax,[ebp+x]
	sar ecx,5 edx=[ebp+y] add edx,ecx
	pixel() add ecx,ecx sub edx,ecx pixel() eax=edi
	cdq idiv ebx add eax,esi esi=eax cdq idiv ebx
	sub edi,eax test eax ret
	}

#put_image
	push eax
	al=bmp32_write setvideofuncion() [bmp]=edi
	pop eax jmp rectangulo



