Сидел дома, скучал от жары, решил написать генерацию цвета для палитры 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)
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
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
Комментарии
Отправить комментарий