Diskussion:SBC $hhll
Aus C64-Wiki
Zur Navigation springenZur Suche springenDas 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)