Okay, Korrektur der Korrektur. Meine letzte Überlegung war Grütze, aber die Korrektur von utz war goldrichtig. Hier eine überarbeitete Version ohne Basic-Header aber mit Initialisierung (35 Bytes):
Code
- drehen:
- ld de, $340 ; Zeiger auf Originaldaten
- ld hl, $380 + 60 ; Zeiger auf die unterste Zeile und Spalte links
- ?0: ld b, 8 ; Zähler für die 8 Bits pro Spaltenbyte
- ?1: push hl ; Zeiger auf unterste Zeile (+ Spalte!) sichern
- ?2: ld a, (de) ; Original Spritewert holen
- inc e ; Erhöhe Zeiger auf Originaldaten
- jp P, ?3 ; Liegt der Zeiger bereits über $380 ==> nur noch 0 als Wert laden
- xor a ; Akku löschen für E >= $80 (Negativ!)
- ?3: scf ; setze Carry
- ?4: adc a ; Shifte Bit nach links ins Carry (Achtung: Nur ADC testet auf 0, nicht RLA!)
- jr Z, ?2 ; Bei 0 neues Byte holen
- rl (hl) ; übernehme Bit in die Zieldaten
- and a ; lösche Carry
- dec l ; Dekrementiere den Zeiger auf die Zieldaten um 3
- dec l ; Zeiger := Zeiger - 3
- dec l ; Dies setzt den Zeiger auf die nächst höhere Zeile
- jp M, ?4 ; Ist der Zeiger über $380 ==> weitermachen, ansonsten Ende der Schleife
- ld a, l ; sichere den aktuellen Stand des Zeigers
- pop hl ; Zeiger wiederherstellen
- djnz ?1 ; Alle 8 Bit der Zieldaten pro Spalte übernommen?
- inc l ; Erhöhe den Zeiger der Zieldaten auf die nächste Spalte
- inc a ; letzte Spalte überschritten?
- ret M ; utz Optimierung
- jr ?0
Wichtig hierbei ist, daß man nicht den Befehl "RLA" verwendet, sondern stattdessen "ADC a", da RLA das Z-Flag nicht setzt.