Sultan's Maze (cpctelera_next turbo edition)

Ciao a tutti.

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.

Buon divertimento!

SultansMaze.dsk (199.8 KB)

8 Mi Piace

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
1 Mi Piace

Hai usato le tue funzioni per disegnare le linee?

bravissimo ottimo

1 Mi Piace

@Arnaud6128

Sono state usate le funzioni per le linee di cpctelera_next. :slightly_smiling_face:

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.

1 Mi Piace

@SagaDS

Per il castello nella schermata del titolo, sono state utilizzate delle linee orizzontali per il riempimento.