Da molto tempo ho una sciocca ossessione: cercare di far girare più veloce Sultan’s Maze.
Nelle ultime sere, io e GPT abbiamo esaminato il codice, routine dopo routine.
Ogni parte è stata convertita per cpctelera_next, una routine alla volta.
Tutto è stato testato con cura (anche se non posso garantire un’esperienza priva di bug al 100%!) e sono state aggiunte anche alcune delle mie idee di ottimizzazione.
Ricorda: per i rettangoli con riempimento pieno, la cosa migliore è procedere con linee orizzontali. In questo modo (assembler sdcc):
ld hl,#nbOctetToPrint ; Bisogna usare 16 bit... Scusate.
call prepare_jump_line ; imposta il salto a una determinata quantità di ottetti da scrivere
ld hl,#screenAddress ; Primo ottetto dello schermo da impostare
ld a,#valueToUse ; l'ottetto di riempimento
call print_sub_line ; Facciamolo
; Qui hl = indirizzo successivo degli ottetti stampati
; quindi basta ricalcolare hl per la riga successiva e chiamare print_sub_line per stampare
; lo stesso numero di ottetti
ret
; print_sub_line
; hl = 0 .. 79
; hl,de modificati
prepare_jump_line:
ld de,#fill_line_a_end ; punta alla fine della tabella di salto
add hl,hl ; 2 ottetti per ld (hl),a inc hl
sbc hl,de ; hl = indirizzo di salto
ld (#print_sub_line + 1),hl ; [SMC] Imposta l'indirizzo di salto
ret
; serve un jp perché 80x2 > +127 (max per jr). Se si prevedono meno di 63 ottetti
; o se si ha una quantità fissa di pixel impostata di default, jr può bastare
; l'aritmetica a 8 bit potrebbe essere usata in prepare_jump_line
print_sub_line:
jp #fill_line_a_end ; [SMC] Salto basato sul calcolo di prepare_jump_line
.rpt 80
ld (hl),a ; imposta l'ottetto dello schermo sul valore
inc hl ; ottetto dello schermo successivo
.endm
fill_line_a_end:
ret
Sono state usate le funzioni per le linee di cpctelera_next.
Tuttavia, per riempire i muri, le linee vengono usate solo attorno ai bordi dove i tile non si adattano. La maggior parte della texture del muro è riempita usando i tile.