Sultan's Maze (cpctelera_next Turbo-Edition)

Hallo zusammen.

Ich hatte schon lange diese verrückte Obsession, „Sultan’s Maze“ schneller zu machen.

In den letzten Abenden haben GPT und ich uns Routine für Routine durch den Code gearbeitet.
Jeder Teil wurde nach und nach auf cpctelera_next portiert, eine Routine nach der anderen.

Alles wurde sorgfältig getestet (auch wenn ich kein zu 100 % fehlerfreies Erlebnis garantieren kann!), und einige meiner eigenen Optimierungsideen sind ebenfalls eingeflossen.

Viel Spaß damit!

SultansMaze.dsk (199.8 KB)

8 „Gefällt mir“

Denk daran: Bei voll ausgefüllten Rechtecken macht man das am besten mit horizontalen Linien. So wie hier (sdcc Assembler):

ld hl,#nbOctetToPrint                ; 16-Bit muss verwendet werden... Sorry.
call prepare_jump_line               ; Sprung auf eine bestimmte Anzahl zu schreibender Bytes setzen
ld hl,#screenAddress                 ; Erstes zu setzendes Bildschirm-Byte
ld a,#valueToUse                     ; Das Füll-Byte
call print_sub_line                  ; Los geht's
; Hier ist hl = nächste Adresse der gezeichneten Bytes 
; berechne hl also einfach für deine nächste Zeile neu und rufe print_sub_line auf, um die
; gleiche Anzahl an Bytes zu zeichnen
ret

; print_sub_line                      
; hl = 0 .. 79
; hl,de modifiziert
prepare_jump_line:
    ld de,#fill_line_a_end           ; Zeigt auf das Ende der Sprungtabelle
    add hl,hl                        ; 2 Bytes pro ld (hl),a inc hl
    sbc hl,de                        ; hl = Sprungadresse
    ld (#print_sub_line + 1),hl      ; [SMC] Sprungadresse setzen
    ret

; jp wird benötigt, da 80x2 > +127 (Maximum für jr). Wenn weniger als 63 Bytes geplant sind 
; oder standardmäßig eine feste Anzahl von Pixeln gesetzt wird, kann jr ausreichen
; und in prepare_jump_line könnte 8-Bit-Arithmetik verwendet werden
print_sub_line:
    jp #fill_line_a_end              ; [SMC] Sprung basierend auf Berechnung in prepare_jump_line
.rpt 80
    ld (hl),a                        ; Bildschirm-Byte auf Wert setzen
    inc hl                           ; Nächstes Bildschirm-Byte
.endm
fill_line_a_end:
    ret
1 „Gefällt mir“

Hast du deine eigenen Funktionen zum Zeichnen von Linien verwendet?

Bravo, super!

1 „Gefällt mir“

@Arnaud6128

Es wurden Linienfunktionen von cpctelera_next verwendet. :slightly_smiling_face:

Um die Wände zu füllen, werden Linien jedoch nur an den Rändern eingesetzt, wo Tiles nicht mehr hinpassen. Der Großteil der Wandtextur wird mit Tiles gefüllt.

1 „Gefällt mir“

@SagaDS

Für das Schloss auf dem Titelbildschirm werden horizontale Linien als Füllung verwendet.