2 марта 2016, 00:27 (3186 дней назад) № 9900
Кажется начинаю понимать, почему на TI-99/4a были такие проблемы с качественными играми... Вот какой у меня получился код для рисования прямоугольника с градиентом. Просто от края до края экрана (т.е. x всегда 0, ширина всегда весь экран).
Он даже не успевает отрисоваться в обратный ход луча! Понятно, что тут что-то можно соптимизировать (я первый раз пишу для TMS9900), но всё равно ситуация как-то не радует...
------------------------
def start
vdpwd equ >8C00 ; VDP RAM write data
vdpwa equ >8C02 ; VDP RAM read/write address
ws0 equ >8300 ; Workspace 0 (till 831f)
R0L equ ws0+1 ; Workspace 0 R0 low byte
start:
li r1,25 ; y coord (top left corner of the color bar)
li r6,10 ; height (lines) max. 16
; convert Y to addr
; in: r1 - y (lines)
mov r1,r0 ; store Y
sla r0,5 ; R0 *= 32
soc r1,r0 ; R0 = R0 OR y
andi r0,>ff07
ai r0,>2000 ; >2000 - Color Table start address
mov r0, r4 ; store addr
; out: r4 = VDP addr = dst addr
; calc how many lines to draw for top half of the bar
mov r4,r5
andi r5,>00ff
neg r5
ai r5,8 ; now r5 = number of lines in top half
c r6,r5 ; compare total height (r6) with top half height (r5)
jhe skip_h
mov r6,r5 ; use initial total height! (otherwise use calculated remainder)
skip_h:
li r3,32 ; blocks (32*8 = 256 = full horiz. line of blocks)
; draw TOP half
nextblock1:
clr r2
mov r4,r0 ; set VDP RAM addr (low, hi)
movb @R0L,@vdpwa
ori r0,>4000
movb r0,@vdpwa
ai r4,8 ; increase VDP RAM addr to next block
nextline_in_block1:
movb @colortbl(r2),@vdpwd
inc r2
c r2,r5 ; +height (max 8)
jne nextline_in_block1
dec r3
jne nextblock1
c r2,r6 ; if bar completed, skip it bottom half
jeq skip_bottom
; draw BOTTOM half
; r5 - top half height
neg r5
ai r5,8 ; bottom half height = 8 - top half height (r5)
s r5,r4
li r3,32 ; blocks (32*8 = 256 = full horiz. line of blocks)
mov r2,r7 ; r2 - current line (total line counter)
nextblock2:
mov r7,r2
mov r4,r0 ; set VDP RAM addr (low, hi)
movb @R0L,@vdpwa
ori r0,>4000
movb r0,@vdpwa
ai r4,8 ; increase VDP RAM addr to next block
nextline_in_block2:
movb @colortbl(r2),@vdpwd ; r2 continues
inc r2
c r2,r6 ; compare with total height
jne nextline_in_block2
dec r3
jne nextblock2
skip_bottom:
nop
done: jmp done
colortbl:
BYTE >11, >1c, >12, >13, >1f, >1f, >13, >12, >1c, >11
end start
-------
(возможно, в Facebook она не будет вам доступна - видимость ограничена)