Diskussion:SBC $hhll

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Das Beispiel lässt sich noch verkürzen[Quelltext bearbeiten]

Da das Ergebnis direkt ausgegeben wird und beim nächsten Aufruf überschrieben wird, ist es unnötig es überhaupt zu speichern. Das Low-Byte vom Ergebnis kann mit tax ins X-Register kopiert werden, wo es für die Ausgabe gebraucht wird, das High-Byte vom Ergebnis ist nach der High-Byte-Subtraktion bereits im Akku. Außerdem kann AXOUT mit jmp angesprungen werden, da die Routine mit rts endet und dadurch ins Basic zurück springt. Durch entsprechende Änderungen lässt sich das Beispiel um 12 Bytes (ca.36 %) verkürzen.
Beispiel (neu)

; Diese Programm macht eine 16-Bit-Subtraktion
; und gibt das Ergebnis am Bildschirm aus.
; Programmstart mit SYS 49152

*=$c000   ; Startadresse des Programms

AXOUT = $bdcd

start      sec             ; Carry-Bit setzen
           lda l_zahl1     ; Low-Byte der 1. Zahl mit
           sbc l_zahl2     ; Low-Byte der 2. Zahl subtrahieren
           tax             ; Low-Byte vom Ergebnis nach X-Register kopieren für die Ausgabe.
                           ; Vor der High-Byte-Subtraktion wird das Carry-Bit nicht gesetzt, 
                           ; weil sein Wert anzeigt, ob ein Unterlauf bei Low erfolgte.
           lda h_zahl1     ; High-Byte der 1. Zahl mit
           sbc h_zahl2     ; High-Byte der 2. Zahl subtrahieren
                           ; Jetzt ist im Akku das High-Byte und im X-Register das Low-Byte des Ergebnisses.
           jmp AXOUT       ; 16-Bit-Zahl ausgeben und Rücksprung zu BASIC (implizites RTS)	

l_zahl1    .byte $55       ; Zahl1 = $4155
h_zahl1    .byte $41 
l_zahl2    .byte $00       ; Zahl2 = $1000
h_zahl2    .byte $10

Speicherauszug:

.c000	 38            sec
.c001	 ad 11 c0      lda $c011
.c004	 ed 13 c0      sbc $c013
.c007	 aa            tax
.c008	 ad 12 c0      lda $c012
.c00b	 ed 14 c0      sbc $c014
.c00e	 4c cd bd      jmp $bdcd
>c011	 55
>c012	 41
>c013	 00
>c014	 10
Ich bin ja auch Fan von jeglicher Optimierung, aber hier geht es nicht um die Erstellung eines optimalen Codes hinsichtlich Laufzeit und Code-Länge, sondern - um schon die Einwände diverser anderer Autoren in diesem Wiki vorwegzunehmen - um die Verständlichkeit für absolute Neulinge zu wahren, ohne ihnen "Codierungstricks" in Kommentaren erklären zu müssen ... ich weiß, geübtere 6502-Programmierer fließt das schon automatisch von der Hand, aber diesen Lernschritt muss man hier nicht auch im Anschauungsbeispiel gleich vollziehen. ;)
Aber hier auf der Diskussionsseite ist es schon bestens aufgehoben, dies zu erwähnen. Der interessierte Leser kann sich dann optional hier die Optimierungsmöglichkeiten zu Gemüte führen. --JohannKlasek (Diskussion) 18:04, 11. Aug. 2015 (CEST)
Als zusätzliche Info die auf der Diskussionsseite verbleibt war das Programm auch gedacht. Denn wenn man das Beispiel auf der Seite verändert, müsste man folglich auch das Disk-Image mit Beispielprogrammen ändern, was mir nur für eine Optimierung etwas zu aufwendig erscheint. --Sirrus (Diskussion) 19:07, 11. Aug. 2015 (CEST)