Градиент

Сидел дома, скучал от жары, решил написать генерацию цвета для палитры VGA. Но не получилось, что-то написал неверное. Решил написать модель и вернуться к ассемблеру. Интересно, сколько будет байт?

Procedure.a f(v.a)
  If v&64
    v!255
  EndIf
  
  ProcedureReturn (v&63)*2
EndProcedure

If InitSprite() And OpenWindow(0,0,0,640,480,"SineWave",#PB_Window_SystemMenu) And OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0) 
  StartDrawing(ScreenOutput()) 
  
  
  For i=0 To 255
    
      rr=0
      gg=0
      bb=i

     If i>64 And i<192
       gg=i-64
       bb=63
     EndIf
     
    If i&128
      rr=i
;      bb=63
      gg=63
    EndIf
    
    If i>192
      gg=i
      bb=i
    EndIf

    LineXY( i,0,i,320,RGB( f(rr),f(gg),f(bb) ) )
   ; LineXY( i,320,i,640,RGB( f(rr)*0,f(gg),f(bb)*0 ) )
  Next i
  ;LineXY(192,0,192,640,255)
        StopDrawing() 
        FlipBuffers() 
  Repeat 
  Until WindowEvent()=#PB_Event_CloseWindow 
EndIf

; IDE Options = PureBasic 5.30 (Windows - x86)

Обновление: написал программу на ассемблере. Вышло 73 байта, надо дооптимизировать

org 100h
use16
mov al,13h
int 10h
push 0a000h
pop es

xor cl,cl
xor di,di
xlp:
mov ch,200
push di
ylp:
mov byte [es:di],cl
add di,320
dec ch
jne ylp
pop di
inc di
inc cl
jne xlp
;33 bytes
;gen
mov dx,03c8h
xor al,al
out dx,al
inc dx
;cl=0
pal:
;  For i=0 To 255
;    
;      rr=0
;      gg=0
xor bh,bh;BH=red,BL=blue,AL=green
xor al,al
;      bb=i
mov bl,cl

;     If i>64 And i<192
cmp cl,64
jbe eif1
cmp cl,192
jae eif1
; gg=i-64
mov al,cl
sub al,64
; bb=63
mov bl,63
;     EndIf
eif1:

;    If i&128
or cl,cl
jns eif2
;   rr=i
mov bh,cl
;   gg=63
mov al,63
;    EndIf
eif2:

;    If i>192
cmp cl,192
jbe eif3
;      gg=i
mov al,cl
;      bb=i
mov bl,cl
;    EndIf
eif3:

push ax
mov al,bh
call wrport
pop ax
call wrport
mov al,bl
call wrport
inc cl
jne pal
ret
wrport:
test al,64
je noinv
xor al,255
noinv:
and al,63
out dx,al
ret



Комментарии