Mais de 32 sprites em um TMS9128

tmsbug-1_abertura

Sério? O TMS9900 : TMS9918A / TMS9928A / TMS9929A Video Display Processors – Data Manual (Nov 1982) diz o seguinte (tradução livre):

A tela pode conter até 32 sprites nos planos de vídeo de maior prioridade.

Mas por acidente descobri que por causa de um bug no desenho dos sprites você pode ter mais do que 32 sprites na tela¹. Fiz testes em um Sharp HB-8000 v1.2 (TMS9128) e em um Frael Bruc 100 (TMS9129) e obtive em ambos o mesmo resultado.

(¹) Não necessariamente em MSX mas outros sistemas como ColecoVision, Sord M5, TI-99/4A também podem estar afetados!

[ in English ]

Mostrando o bug

Como reproduzi-lo? Digite isto aqui em um MSX1 real…

10 COLOR 15,0,0:SCREEN 2,2,0
15 SPRITE$(0)=STRING$(32,&HAA):Y%=15:X%=192
20 PUT SPRITE 0,(128,95),15,0
25 VDP(4)=0 ' Try with 1 or 2 too!
30 PUT SPRITE 8,(X%,Y%),7,0
35 J%=STICK(0)
40 IF (PEEK(&HF3E7) AND 32) THEN COLOR ,,8 ELSE COLOR ,,0
45 Y%=Y%-(J%=5)+(J%=1)
50 X%=X%-(J%=3)+(J%=7)
55 GOTO 30

Em um MSX1 emulado você tem:

tmsbug-1_glitch_on_emulator

Mas há algo estranho no MSX1 real

tmsbug-1_glitch_on_real_msx

Use as setas para mover a caixa (caixas?) azul claro pela tela e ver o comportamento do bug, a tela piscará no caso de colisão de sprites.

Descobri que o velho truque para redimensionar a Tabela de Padrões mudando o registrador 4 também afeta o desenho dos sprites. Assim, todos os sprites acima da 7º camada e localizados no primeiro terço da tela aparecerão também nos segundo (linha atual+64) e terceiro (linha atual+128) terços. E todos eles sendo sprites reais, não “fantasmas”, pois a  detecção de colisão continua funcionando para todos eles!

Claro, nada é perfeito, e não se esqueça que a Tabela de Padrões tem agora 2048 bytes e está replicada em todos os terços da tela!

(²) Truque que não funciona no T6950.

Mais de 32 sprites

E como isto afeta o limite de 32 sprites na tela? Agora tente isto…

100 COLOR 15,14,0:SCREEN 2,2
105 RESTORE 105:FOR J%=0 TO 7:READ K%:LINE (0,J%*8)-STEP(255,7),K%,BF:NEXT J%:DATA 8,9,10,11,3,7,5,13
110 RESTORE 160:FOR J%=0 TO 15:K$="":FOR I%=0 TO 31:READ L$
115 K$=K$+CHR$(VAL("&H"+L$)):NEXT I%:SPRITE$(J%)=K$:NEXT J%
120 K%=8:FOR J%=0 TO 3:FOR I%=0 TO 3
125 PUT SPRITE K%,(96+16*I%,-1+16*J%),1,J%*4+I%
130 K%=K%+1:NEXT I%,J%
135 VDP(0)=VDP(0) OR 2
140 VDP(1)=VDP(1) AND &HE7
145 VDP(3)=&H9F
150 VDP(4)=0
155 GOTO 155
160 DATA 07,1f,3f,7f,70,f1,f1,f1,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,1c,1e,1e,1e,1e,1e,1c,fc,f8,f0,c0,00
165 DATA 07,1f,3f,7f,78,fc,fc,fc,fc,fc,78,7f,3f,1f,07,00,c0,f0,f8,fc,7c,7e,7e,7e,7e,7e,3c,fc,f8,f0,c0,00
170 DATA 07,1f,3f,7f,70,ff,f0,f1,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,1c,1e,1e,fe,1e,1e,1c,fc,f8,f0,c0,00
175 DATA 07,1f,3f,7f,78,ff,fc,ff,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,1c,1e,3e,1e,1e,1e,1c,fc,f8,f0,c0,00
180 DATA 07,1f,3f,7f,71,f1,f1,f1,f0,ff,7f,7f,3f,1f,07,00,c0,f0,f8,fc,fc,1e,1e,1e,1e,1e,1c,fc,f8,f0,c0,00
185 DATA 07,1f,3f,7f,70,f1,f0,ff,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,7c,fe,1e,1e,1e,1e,1c,fc,f8,f0,c0,00
190 DATA 07,1f,3f,7f,70,f1,f0,f1,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,7c,fe,1e,1e,1e,1e,1c,fc,f8,f0,c0,00
195 DATA 07,1f,3f,7f,70,f1,ff,fe,fc,fc,7c,7f,3f,1f,07,00,c0,f0,f8,fc,1c,1e,1e,3e,7e,7e,7c,fc,f8,f0,c0,00
200 DATA 07,1f,3f,7f,70,f1,f8,f1,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,1c,1e,3e,1e,1e,1e,1c,fc,f8,f0,c0,00
205 DATA 07,1f,3f,7f,70,f1,f0,ff,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,1c,1e,1e,1e,1e,1e,1c,fc,f8,f0,c0,00
210 DATA 07,1f,3f,7f,7c,ff,f0,f1,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,1c,1e,1e,1e,1e,1e,1c,fc,f8,f0,c0,00
215 DATA 07,1f,3f,7f,71,f1,f0,f1,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,fc,fe,1e,1e,1e,1e,1c,fc,f8,f0,c0,00
220 DATA 07,1f,3f,7f,70,f1,f1,f1,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,1c,1e,1e,fe,1e,1e,1c,fc,f8,f0,c0,00
225 DATA 07,1f,3f,7f,7f,ff,f0,f1,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,1c,1e,1e,1e,1e,1e,1c,fc,f8,f0,c0,00
230 DATA 07,1f,3f,7f,70,f1,f0,f1,f1,f1,70,7f,3f,1f,07,00,c0,f0,f8,fc,1c,1e,1e,fe,1e,1e,1c,fc,f8,f0,c0,00
235 DATA 07,1f,3f,7f,7c,fc,fc,f0,fc,fc,7c,7f,3f,1f,07,00,c0,f0,f8,fc,1c,7e,7e,1e,7e,7e,7c,fc,f8,f0,c0,00

A propósito, também redimensionei a Tabela de Atributos alterando o registrador 3 mas isto não afeta com o bug se comporta.

Em um MSX1 emulado você vê 16 sprites no topo da tela…

tmsbug-1_16_sprites_on_emulator

Mas em um MSX1 real

tmsbug-1_48_sprites_on_real_msx

Você vê 48 sprites simultâneos! ?

Conclusão

Já sei que isto não funciona nos V9938 (testado, SVI-738) e V9958 (testado, FS A1-ST); e não deve funcionar no T6950 (não testado). Sobre emuladores, não funciona no fMSX (testado, versão 4.5), openMSX (testado, versão 0.15.0) e WebMSX (testado 5.4.0) e também não pode não funcionar nos MSX baseados em FPGA.

Bem, não tenho como testar todas a família do TMS9918 e suas variantes (FPGA, Sega, Toshiba, Yamaha etc) para saber em quais deles este “recurso” está presente.

Então, qualquer ajuda será bem vinda!

Sobre Giovanni Nunes

Giovanni Nunes (anteriormente conhecido como “O Quinto Elemento”) é uma das mentes em baixa resolução que compõem o Governo de Retrópolis, responsável pela identidade visual de todas as facetas do nosso Império Midiático.