Trace und Single Step für Maschinenprogramme
Maschinenprogramme stürzen bei Fehlern meist ohne Hinweis auf den Fehlerort ab. Mit Trace lassen sich Maschinenprogramme Befehl für Befehl abarbeiten. Es werden dabei die momentanen Registerwerte (Programmcounter, X-, Y-Register, Akku, Stackpointer und Flags) angezeigt. Diese Werte lassen sich ohne weiteres ändern. Als Dreingabe erscheinen auch noch der Zustand des User-Ports und des Datenrichtungsregisters B auf dem Bildschirm.
Das Programm läßt eine Ausführung von Maschinenprogrammen im Einzelschrittmodus zu. Dabei wird das Programm wirklich ausgeführt also nicht simuliert. Es bietet Einzelschritt, langsam und schnellen Trace. Alle Register werden angezeigt und können verändert werden. Zusätzlich wird der Befehl disassembliert. Laden und Abspeichern des Programms geschieht je nach Assemblerversion des Lesers. Das Assemblerprogramm erlaubt ein freies Verschieben von Trace durch Änderung in Zeile 100: *=$XXXX. Der Startwert für PC (Programmcounter) kann in Zeile 270 frei gewählt werden.
Programmfunktionen
Nach dem SYS-Befehl befindet man sich im Tracemodus. Es sind nur die Tasten F1 bis F7 und X für Exit aktiv. Folgende Register werden angezeigt:
- PC = Programmcounter.
- SP = Stackpointer.
- YR = Y-Register.
- XR = X-Register.
- AC = Akkumulator.
- Prozessorstatusflags.
- User-Port mit Datenrichtungsregister. Entsprechende Eingangsleitungen sind revers dargestellt.
- Es werden 1 bis 3 Hexbytes angezeigt, die verändert werden können, dann wird der Befehl disassembliert dargestellt. Trace wartet jetzt auf einen Tastendruck. Der Programmcounter zeigt am Anfang auf Hex C000.
Folgende Tastenfunktionen stehen zur Verfügung:
- Taste F7 = Einzelschritt. Pro Tastendruck wird ein Befehl des Testprogramms ausgeführt (genauer gesagt beim Loslassen von F1). Danach werden wieder die Register angezeigt und disassembliert.
- Tast F5 = Slow Trace. Solange diese Taste gedrückt ist, wird das Testprogramm Befehl für Befehl abgearbeitet, die Register angezeigt und pro Befehl noch zusätzlich um zirka 65 ms verzögert.
- Taste F3 = Tast Trace. Wie F5 jedoch ohne Verzögerung.
- Taste F1 = Set Register, Editmodus. Durch Drücken von F1 kommen Sie in den Editmodus.
Beschreibung Editmodus
Die erste Ziffer des Programmcounters wird zur Kennzeichnung des Cursororts revers dargestellt. Sie können jetzt alle angezeigten Werte überschreiben. Der Stackpointer und die Userport-Anzeige können zwar überschrieben werden, dies hat aber keinen Einfluß auf die Werte. Eine Veränderung des SP würde meist zum Absturz des Systems führen, da die CPU nach dem Interrupt nicht mehr die korrekten Rücksprungadressen auf dem Stack vorfindet. Die Cursor-Right-Taste bewegt den Cursor nach rechts, die Cursor-Up-Taste nach links. Neben diesen Steuertasten sind nur die Tasten A bis F, 0 bis 9 für die Hexziffern, der »Pfeil nach oben«, um ein Flag zu setzen, und das »Minuszeichen«, um ein Flag zu löschen, sinnvoll. Die Spacetaste ist auch erlaubt.
Die DELETE-Taste funktioniert nicht. Entsprechen die Änderungen in der PC-Zeile Ihren Wünschen, dann drücken Sie (RETURN) und können die disassemblierte Zeile editieren. Hier sind je nach Befehlslänge 1 bis 3 Hexbytes am Anfang der Zeile veränderbar, das heißt Sie können die Operanden oder auch den Opcode selbst noch vor der Ausführung verändern, was zum Austesten von Programmen sehr praktisch ist. Verlassen können Sie die disassemblierte Zeile wieder mit (RETURN). Sie befinden sich jetzt wieder im Tracemodus, das heißt die Tasten F1, F3, F5, F7 und X sind wieder aktiv.
Den Tracemodus können Sie durch Drücken der X-Taste verlassen, der Computer ist jetzt im Basic-Editmodus. Trace kann mit SYS 49152 wieder gestartet werden, wobei hier der Disassembler immer aktiviert ist. Starten Sie mit SYS 49160, dann ist der Disassembler nur beim Editieren an, Trace ist dann etwas schneller. Setzen Sie Trace nicht auf sich selbst an.
Funktionsweise
Siehe hierzu auch Assemblersourcelisting. Zuerst schalte ich den normalen Tastaturinterrupt über Timer A aus und benütze den Timer B in CIA 1 für meine Interruptroutine. Timer A läuft zwar weiter, aber sendet keine IRQ mehr. Dann setze ich den IRQ-Vektor auf Trace. Trace initialisiert beim Start den Stack und beginnt dann mit der eigentlichen Einzelschrittroutine. Diese Routine dient als neue Interruptroutine, da der IRQ-Vektor auf Trace geändert wurde. Der Interrupt wird aber nicht mehr alle 1/60 Sekunde durch den Timer A ausgelöst, sondern durch Timer B und zwar alle 25 Mikrosekunden nach Start des Timers.
In dieser Zeit kann der Prozessor das Ende der normalen IRQ-Routine durchlaufen (Register vom Stack holen). Jetzt bleibt aber nur mehr Zeit, um einen Befehl des Testprogramms abzuarbeiten, da Timer B ja schon in genau einer Mikrosekunde erneut einen IRQ sendet. Der Prozessor legt nach diesem einen Befehl alle Register auf den Stack und verzweigt entsprechend dem IRQ-Vektor wieder auf Trace. Für genauere Information siehe Listing. Innerhalb der Traceroutine wird ein IRQ nicht akzeptiert, da sich sonst das Programm immer selbst unterbrechen würde. Trace läßt sich also nur durch einen NMI unterbrechen.
Beispiel:
- SYS 49152 = Trace starten. Disassembler an.
- Taste F1 drücken = Editmodus wählen.
- PC auf $AF08 setzen. Diese Systemroutine gibt »Syntax Error« aus. Sie können zum Spaß auch die Register verändern, benützen Sie auch die Cursorsteuertasten.
RETURN drücken = Edit für disassemblierte Zeile. Hier können Sie die Hexbytes editieren. Eine Änderung hätte aber keinen Sinn, da wir ja eine ROM-Routine tracen. Drücken Sie nur (RETURN), und Sie gelangen wieder in den Tracemodus.
- F7 drücken = Einen Befehl ab PC ausführen.
- F5 drücken = Trace. Anzeige läuft. Flags werden in schneller Folge geändert. Die disassemblierte Zeile ändert sich sehr schnell. Halten Sie die Taste gedrückt, nach ein paar Sekunden sehen Sie schön langsam Buchstabe für Buchstabe »Syntax Error« erscheinen. Befindet sich der Cursor zufällig gerade am unteren Bildschirmrand und ist der Bildschirm vollgeschrieben, dann kann man schön verfolgen, wie die Scrollroutine arbeitet, der Bildschirminhalt wird Zeile für Zeile nach oben geschoben, um Platz für die Meldung zu machen.
| BMINUS | C233 | BYT | ClF6 | LOO7 | C2FB | LOO8 | C311 |
| CIA | DC00 | CLE1 | C27E | LOO9 | C31A | LOOP | C1BF |
| COD1 | C483 | COD2 | C484 | LOOP1 | C1D2 | MREAD | C15F |
| COD3 | C485 | CODE2 | C33D | OFFSET | C216 | OLDX | C482 |
| CODEL | C486 | CODL3 | C375 | OLDY | C481 | OPP | C325 |
| COL | D800 | CONT1 | C079 | PPOIN1 | C2BE | PPOIN2 | C2C4 |
| CONT2 | C090 | CONT3 | C0A4 | PPOIN3 | C2CA | PRBYTE | C10E |
| CONT4 | C0E9 | CONT6 | C17D | PREAD1 | C404 | PREAD2 | C422 |
| CRB | DC0F | DDRB | DD03 | PREAD3 | C43D | PRIZEI | C12C |
| DISAS | C274 | DISOFF | C05C | READ | C1A2 | READPC | C3D5 |
| DISON | C487 | ENDAS | C3CE | READY | A473 | RECHTS | C173 |
| EREAD | C440 | EXIT | C0F1 | REGISTER | C063 | REVERSE | C160 |
| FAST | C0CF | FLSETZ | C081 | SCREEN | 0400 | SET | C13E |
| GET | C138 | GO | C00D | SLOW | C0E7 | SPACE | C12A |
| HEX | C469 | ICR | DC0D | STACK | 0100 | START | C143 |
| IRQVEK | 0314 | LAENGE | C253 | TADR | C800 | TAST | EA87 |
| LBIT | C209 | LINKS | C169 | TEXT | C441 | TH | DC07 |
| LOO1 | C271 | LOO10 | C34D | TITEL | C037 | TL | DC06 |
| LOO11 | C356 | LOO12 | C365 | TMP | C479 | TMP1 | C480 |
| LOO13 | C381 | LOO14 | C394 | TRACE | C034 | TSTART | C500 |
| LOO15 | C3A5 | LOO16 | C3BB | USETZ | C098 | WAIT | C0AE |
| LOO2 | C272 | LOO3 | C273 | WAITL | C0C8 | ZAHL | C213 |
| LOO5 | C2A4 | LOO6 | C2B8 | ZEICHHOL | C182 |
|
|
100: C000 * = 49152
;
;
;TRACE / SINGLE STEP FUER C64 9.84
;
; +DISASSEMBLER / EDITOR
;
; JUERGEN GOEBEL
;
; 8 MUENCHEN 82
;
; GROSCHENWEG 19
;
;
;
; TEL. 089 / 432709
;
;
150: C000 .OPT 00,P1
160: C000 IRQVEK = $314
160: C000 STACK = $100
160: C000 COL = 55296 ;HINTERGRUNDFARBE
170: C000 SCREEN = 1024
170: C000 READY = $A474-1
180: C000 CIA = $DC00
180: C000 TL = CIA+6
180: C000 TH = CIA+7
180: C000 TAST = $EA87 ;TASTATURROUT.
180: C000 DDRB = $DD03
200: C000 ICR = CIA+13 ;INTERR.CONTROLREG.
200: C000 CRB = CIA+15
200: C000 TSTART = *+$0500
210: C000 EA NOP
210: C001 A9 00 LDA #0
210: C003 8D 87 C4 STA DISON
210: C006 F0 05 BEQ GO
220: C008 A9 FF LDA #255
220: C00A 8D 87 C4 STA DISON
230: C00D 78 GO SEI
230: C00E A9 34 LDA #<TRACE
230: C010 8D 14 03 STA IRQVEK ;IRQ VEKTOR
240: C013 A9 C0 LDA #>TRACE
240: C015 8D 15 03 STA IRQVEK+1 ;AUF TRACE
250: C018 A9 82 LDA #130
250: C01A 8D 0D DC STA ICR ;TIMER B INTERRUPT ERLAUBT
250: C01D A2 FF LDX #255
250: C01F 9A TXS ;STACK INITIAL.
260: C020 A9 A4 LDA #>READY ;STACK FUER TRACE
260: C022 48 PHA ;VORBEREITEN
260: C023 A9 73 LDA #<READY
260: C025 48 PHA
270: C026 A9 C0 LDA #$C0 ;PC=$C000
270: C028 48 PHA
270: C029 A9 00 LDA #0
270: C02B 48 PHA
280: C02C A9 20 LDA #32
280: C02E 48 PHA
280: C02F A9 00 LDA #0
280: C031 48 PHA
280: C032 48 PHA
280: C033 48 PHA
290: C034 D8 TRACE CLD
290: C035 A0 00 LDY #0
290: C037 B9 41 C4 TITEL LDA TEXT,Y ;KOPFZEILE
300: C03A 20 2C C1 JSR PRIZEI ;AUSGEBEN
300: C03D C0 28 CPY #40
300: C03F D0 F6 BNE TITEL
310: C041 BA TSX
310: C042 BD 06 01 LDA STACK+6,X ;PC AUSGEBEN
310: C045 8D 7C C4 STA TMP+3
310: C048 20 0E C1 JSR PRBYTE
320: C04B BD 05 01 LDA STACK+5,X
320: C04E 8D 7D C4 STA TMP+4
320: C051 20 0E C1 JSR PRBYTE
330: C054 AD 87 C4 LDA DISON
330: C057 30 03 BMI DISOFF
340: C059 20 74 C2 JSR DISAS
340: C05C 20 2A C1 DISOFF JSR SPACE
340: C05F 8A TXA ;SP AUSGEBEN
350: C060 20 0E C1 JSR PRBYTE
360: C063 20 2A C1 REGISTER JSR SPACE
360: C066 BD 01 01 LDA STACK+1,X
360: C069 20 0E C1 JSR PRBYTE
370: C06C E8 INX
370: C06D C0 38 CPY #56
370: C06F 90 F2 BCC REGISTER
370: C071 20 2A C1 JSR SPACE
380: C074 BD 01 01 LDA STACK+1,X ;PROZESSORSTATUS-FLAGS ANZEIGEN
390: C077 A2 08 LDX #8
400: C079 0A CONT1 ASL
400: C07A 48 PHA
400: C07B A9 5E LDA #94 ;PFEIL
400: C07D B0 02 BCS FLSETZ
410: C07F A9 2D LDA #45 ;MINUS
410: C081 20 2C C1 FLSETZ JSR PRIZEI
410: C084 68 PLA
420: C085 CA DEX
420: C086 D0 F1 BNE CONT1
420: C088 20 2A C1 JSR SPACE
420: C08B A2 08 LDX #8 ;USERPORT ANZEIGEN
430: C08D AD 01 DD LDA DDRB-2
440: C090 0A CONT2 ASL
440: C091 48 PHA
440: C092 A9 31 LDA #$31
440: C094 B0 02 BCS USETZ
450: C096 A9 30 LDA #$30
450: C098 20 2C C1 USETZ JSR PRIZEI
450: C09B 68 PLA
460: C09C CA DEX
460: C09D D0 F1 BNE CONT2
460: C09F A2 08 LDX #8 ;DATENRICHTUNGSREGISTER
460: C0A1 AD 03 DD LDA DDRB ;LADEN
470: C0A4 1E 41 04 CONT3 ASL SCREEN+65,X
470: C0A7 4A LSR ;ENTSPRECHENDE BITS DER ANZEIGE
480: C0A8 7E 41 04 ROR SCREEN+65,X ;WERDEN INVERTIERT
480: C0AB CA DEX
480: C0AC D0 F6 BNE CONT3
490: C0AE 20 38 C1 WAIT JSR GET ;WARTET AUF
490: C0B1 C9 17 CMP #23 ;F1,F3,F5,F7 ODER X
490: C0B3 F0 3C BEQ EXIT
500: C0B5 C9 05 CMP #5
500: C0B7 F0 16 BEQ FAST ;UND VERZWEIGT ENTSPRECHEND
510: C0B9 C9 06 CMP #6
510: C0BB F0 2A BEQ SLOW
520: C0BD C9 03 CMP #3
520: C0BF F0 07 BEQ WAITL
520: C0C1 C9 04 CMP #4
520: C0C3 D0 E9 BNE WAIT
530: C0C5 4C 3E C1 JMP SET
540: C0C8 20 38 C1 WAITL JSR GET ;WARTET BIS F7 WIEDER LOSGELASSEN
540: C0CB C9 40 CMP #64
540: C0CD D0 F9 BNE WAITL
550: C0CF A9 16 FAST LDA #$16
550: C0D1 8D 06 DC STA TL
560: C0D4 A9 00 LDA #0 ;TIMER LADEN
560: C0D6 8D 07 DC STA TH
560: C0D9 A9 11 LDA #17
560: C0DB 8D 0F DC STA CRB ;UND STARTEN
560: C0DE AD 0D DC LDA $DC0D ;ENDE IRQ
570: C0E1 68 PLA
570: C0E2 A8 TAY
570: C0E3 68 PLA
570: C0E4 AA TAX
580: C0E5 68 PLA
580: C0E6 40 RTI
590: C0E7 A2 00 SLOW LDX #0
590: C0E9 CA CONT4 DEX
590: C0EA D0 FD BNE CONT4
590: C0EC 88 DEY
590: C0ED D0 FA BNE CONT4
600: C0EF F0 DE BEQ FAST
610: C0F1 A9 02 EXIT LDA #2 ;X TASTE
610: C0F3 8D 0D DC STA ICR
610: C0F6 A9 31 LDA #$31
610: C0F8 8D 14 03 STA IRQVEK ;SETZT DEN IRQ VEKTOR
620: C0FB A9 EA LDA #$EA ;ALTEN WERT
620: C0FD 8D 15 03 STA IRQVEK+1
620: C100 A9 04 LDA #4
620: C102 8D 8B 02 STA $028B
620: C105 A9 10 LDA #16 ;REPEAT KORRIG.
630: C107 8D 8C 02 STA $028C
630: C10A 58 CLI
630: C10B 4C 74 A4 JMP READY+1 ;SPRUNG ZU BASIC
640: C10E 48 PRBYTE PHA ;1 BYTE ALS 2 HEXZ. AUF SCHIRM
640: C10F 8E 79 C4 STX TMP
640: C112 4A LSR
640: C113 4A LSR
640: C114 4A LSR
640: C115 4A LSR
650: C116 AA TAX
650: C117 BD 69 C4 LDA HEX,X
650: C11A 20 2C C1 JSR PRIZEI
660: C11D 68 PLA
660: C11E 29 0F AND #$0F
660: C120 AA TAX
660: C121 BD 69 C4 LDA HEX,X
660: C124 AE 79 C4 LDX TMP
670: C127 4C 2C C1 JMP PRIZEI
680: C12A A9 20 SPACE LDA #$20
690: C12C 29 3F PRIZEI AND #$3F ;WEGEN BILDSCHIRMCODE
700: C12E 99 00 04 STA SCREEN,Y
700: C131 A9 01 LDA #1 ;FARBE SETZEN
700: C133 99 00 D8 STA COL,Y
700: C136 C8 INY
700: C137 60 RTS
710: C138 20 87 EA GET JSR TAST ;HOLT TASTENCODE
710: C13B A5 CB LDA $CB
710: C13D 60 RTS
720: C13E 20 74 C2 SET JSR DISAS
720: C141 A0 28 LDY #40 ;F1 TASTE
730: C143 B9 00 04 START LDA SCREEN,Y
730: C146 09 80 ORA #128
730: C148 99 00 04 STA SCREEN,Y
730: C14B 8C 79 C4 STY TMP
740: C14E 20 82 C1 JSR ZEICHHOL ;EINGABEROUT.
740: C151 AC 79 C4 LDY TMP
740: C154 C9 0D CMP #13
740: C156 D0 11 BNE LINKS
750: C158 C0 64 CPY #100
750: C15A 10 03 BPL MREAD
750: C15C 4C A2 C1 JMP READ
750: C15F 60 MREAD RTS ;ZUR LESEROUTINE
760: C160 B9 00 04 REVERSE LDA SCREEN,Y ;INVERTIEREN
770: C163 29 7F AND #127
770: C165 99 00 04 STA SCREEN,Y
770: C168 60 RTS
780: C169 C9 11 LINKS CMP #17 ;CURSOR LINKS
780: C16B D0 06 BNE RECHTS
780: C16D 20 60 C1 JSR REVERSE
780: C170 88 DEY
780: C171 D0 D0 BNE START
790: C173 C9 1D RECHTS CMP #29 ;CURSOR RECHTS
790: C175 D0 06 BNE CONT6
790: C177 20 60 C1 JSR REVERSE
790: C17A C8 INY
790: C17B D0 C6 BNE START
800: C17D 20 2C C1 CONT6 JSR PRIZEI ;WERT ANZEIGEN
800: C180 D0 C1 BNE START
800: C182 A9 00 ZEICHHOL LDA #0 ;TAST.ABFRAGE
810: C184 85 C6 STA $C6
810: C186 20 87 EA JSR TAST
810: C189 AD 77 02 LDA $0277
820: C18C C9 00 CMP #0
820: C18E F0 F2 BEQ ZEICHHOL
820: C190 A0 00 LDY #0
820: C192 8C 77 02 STY $0277 ;TASTATURPUFFERSTART
830: C195 C9 85 CMP #$85 ;F1 TASTE
830: C197 F0 E9 BEQ ZEICHHOL
840: C199 A0 40 LDY #64 ;VERZOEGERUNG REPEATZAEHLER
840: C19B 8C 8B 02 STY $028B
840: C19E 8C 8C 02 STY $028C
840: C1A1 60 RTS
850: C1A2 20 60 C1 READ JSR REVERSE
850: C1A5 A0 28 LDY #40 ;PC LESEN
850: C1A7 BA TSX
850: C1A8 20 F6 C1 JSR BYT
850: C1AB 9D 06 01 STA STACK+6,X
860: C1AE 8D 7C C4 STA TMP+3
860: C1B1 C8 INY
860: C1B2 20 F6 C1 JSR BYT
870: C1B5 9D 05 01 STA STACK+5,X
870: C1B8 8D 7D C4 STA TMP+4
870: C1BB C8 INY
870: C1BC C8 INY ;STACK UEBERLESEN
870: C1BD C8 INY
870: C1BE C8 INY
880: C1BF C8 LOOP INY ;REGISTER LESEN
880: C1C0 20 F6 C1 JSR BYT
880: C1C3 9D 01 01 STA STACK+1,X
880: C1C6 C8 INY
880: C1C7 E8 INX
890: C1C8 C0 38 CPY #56
890: C1CA D0 F3 BNE LOOP
900: C1CC C8 INY
900: C1CD A9 00 LDA #0
900: C1CF 8D 79 C4 STA TMP
900: C1D2 B9 00 04 LOOP1 LDA SCREEN,Y ;FLAGS LESEN
900: C1D5 29 1F AND #%00011111
910: C1D7 C9 1E CMP #30
910: C1D9 2E 79 C4 ROL TMP
920: C1DC C8 INY
920: C1DD C0 41 CPY #65
920: C1DF D0 F1 BNE LOOP1
920: C1E1 BA TSX
920: C1E2 AD 79 C4 LDA TMP
920: C1E5 29 FB AND #%11111011 ;I FLAG LOESCHEN
930: C1E7 9D 04 01 STA STACK+4,X
930: C1EA 20 74 C2 JSR DISAS
930: C1ED 20 D5 C3 JSR READPC
930: C1F0 20 74 C2 JSR DISAS
930: C1F3 4C AE C0 JMP WAIT
940: C1F6 20 09 C2 BYT JSR LBIT ;8 BIT ZAHL VON SCREEN HOLEN
940: C1F9 0A ASL
940: C1FA 0A ASL
940: C1FB 0A ASL
940: C1FC 0A ASL
940: C1FD C8 INY
940: C1FE 8D 79 C4 STA TMP
950: C201 20 09 C2 JSR LBIT
950: C204 18 CLC
950: C205 6D 79 C4 ADC TMP
950: C208 60 RTS
960: C209 B9 00 04 LBIT LDA SCREEN,Y ;1 BYTE VON SCREEN IN HEXs
960: C20C C9 30 CMP #48
960: C20E B0 03 BCS ZAHL
960: C210 69 39 ADC #57
970: C212 38 SEC
970: C213 E9 30 ZAHL SBC #48
970: C215 60 RTS
;BERECHNET ABS. ADRESSEN BEI BRANCHES
990: C216 AD 84 C4 OFFSET LDA COD2
990: C219 30 18 BMI BMINUS
1000: C21B 18 CLC ;BRANCH VOR
1000: C21C 69 02 ADC #2
1000: C21E 6D 7D C4 ADC TMP+4
1000: C221 8D 80 C4 STA TMP1
1000: C224 AD 7C C4 LDA TMP+3
1010: C227 69 00 ADC #0
1010: C229 20 0E C1 JSR PRBYTE
1010: C22C AD 80 C4 LDA TMP1
1010: C22F 20 0E C1 JSR PRBYTE
1010: C232 60 RTS
;BRANCH RUECK
1020: C233 49 FF BMINUS EOR #255
1020: C235 38 SEC
1020: C236 E9 01 SBC #1
1020: C238 8D 79 C4 STA TMP
1030: C23B AD 7D C4 LDA TMP+4
1030: C23E ED 79 C4 SBC TMP
1030: C241 8D 80 C4 STA TMP1
1030: C244 AD 7C C4 LDA TMP+3
1040: C247 E9 00 SBC #0
1040: C249 20 0E C1 JSR PRBYTE
1040: C24C AD 80 C4 LDA TMP1
1040: C24F 20 0E C1 JSR PRBYTE
1040: C252 60 RTS ;ENDE OFFSET
;LAENGE OPCODE
;BERECHNET BEFEHLSLAENGE (1,2 OD. 3 BYTES)
;OPCODE IN AKKU UEBERGEBEN
;IM Y-REG. STEHT DANN BEFEHLSLAENGE
1090: C253 A0 01 LAENGE LDY #1
1100: C255 C9 20 CMP #$20
1100: C257 F0 18 BEQ L001
1100: C259 29 9F AND #$9F
1100: C25B F0 16 BEQ L003
1110: C25D 29 1F AND #$1F
1110: C25F C9 09 CMP #9
1110: C261 F0 0F BEQ L002
1110: C263 C9 19 CMP #$19
1120: C265 F0 0A BEQ L001
1120: C267 29 0D AND #$0D
1120: C269 C9 08 CMP #8
1120: C26B F0 06 BEQ L003
1130: C26D 29 08 AND #8
1130: C26F F0 01 BEQ L002
1140: C271 C8 L001 INY
1140: C272 C8 L002 INY
1140: C273 60 L003 RTS
1150: C274 8C 81 C4 DISAS STY OLDY
1150: C277 8E 82 C4 STX OLDX ;REGISTER RETTEN
1160: C27A A2 14 LDX #20
1160: C27C A9 20 LDA #' '
1160: C27E 9D 78 04 CLE1 STA SCREEN+120,X ;ZEILE FUER DISAS. LOESCHEN
1170: C281 CA DEX
1170: C282 D0 FA BNE CLE1
;PC L/H IN TMP+4 / TMP+3
;BELEGT 'RAM' POINTER ZUM LESEN
1190: C284 AD 7D C4 LDA TMP+4
1190: C287 8D BF C2 STA PPOIN1+1
1190: C28A 8D 7F C4 STA TMP+6
1190: C28D AD 7C C4 LDA TMP+3
1190: C290 8D C0 C2 STA PPOIN1+2
1190: C293 8D 7E C4 STA TMP+5
1200: C296 EE 7F C4 INC TMP+6
1200: C299 AD 7F C4 LDA TMP+6
1200: C29C 8D C5 C2 STA PPOIN2+1
1200: C29F D0 03 BNE L005
1210: C2A1 EE 7E C4 INC TMP+5
1210: C2A4 AD 7E C4 L005 LDA TMP+5
1210: C2A7 8D C6 C2 STA PPOIN2+2
1210: C2AA EE 7F C4 INC TMP+6
1220: C2AD AD 7F C4 LDA TMP+6
1220: C2B0 8D CB C2 STA PPOIN3+1
1220: C2B3 D0 03 BNE L006
1230: C2B5 EE 7E C4 INC TMP+5
1230: C2B8 AD 7E C4 L006 LDA TMP+5
1230: C2BB 8D CC C2 STA PPOIN3+2
1240: C2BE AD 00 C0 PPOIN1 LDA $C000
1240: C2C1 8D 83 C4 STA COD1 ;LIEST OPCODES
1250: C2C4 AD 00 C0 LDA $C000
1250: C2C7 8D 84 C4 STA COD2
1260: C2CA AD 00 C0 LDA $C000
1260: C2CD 8D 85 C4 STA COD3
1270: C2D0 AD 83 C4 LDA COP1
1270: C2D3 20 53 C2 JSR LAENGE
1270: C2D6 98 TYA
1270: C2D7 8D 86 C4 STA CODEL
1270: C2DA AA TAX
1270: C2DB A0 78 LDY #120 ;BYTES AB PC AUSGEBEN
1280: C2DD AD 83 C4 LDA COD1
1280: C2E0 20 0E C1 JSR PRBYTE
1280: C2E3 20 2A C1 JSR SPACE
1280: C2E6 CA DEX
1290: C2E7 F0 12 BEQ L007
1290: C2E9 AD 84 C4 LDA COD2
1290: C2EC 20 0E C1 JSR PRBYTE
1290: C2EF 20 2A C1 JSR SPACE
1300: C2F2 CA DEX
1300: C2F3 F0 06 BEQ L007
1300: C2F5 AD 85 C4 LDA COD3
1300: C2F8 20 0E C1 JSR PRBYTE
1310: C2FB A0 81 L007 LDY #129
1310: C2FD AD 83 C4 LDA COD1 ;GIBT OPCODE (3 BUCHSTABEN) AUS
1320: C300 18 CLC
1320: C301 A9 C5 LDA #>TSTART
1320: C303 8D 79 C4 STA TMP
1320: C306 AD 83 C4 LDA COD1
1320: C309 6D 83 C4 ADC COD1
1320: C30C 90 03 BCC L008
1330: C30E EE 79 C4 INC TMP
1330: C311 18 L008 CLC
1330: C312 6D 83 C4 ADC COD1
1330: C315 90 03 BCC L009
1330: C317 EE 79 C4 INC TMP
1330: C31A 8D 26 C3 L009 STA OPP+1 ;POINTER BELEGEN
1340: C31D AD 79 C4 LDA TMP
1340: C320 8D 27 C3 STA OPP+2
1340: C323 A2 00 LDX #0
1340: C325 BD 00 C0 OPP LDA $C000,X
1340: C328 20 2C C1 JSR PRIZEI
1340: C32B E8 INX
1350: C32C E0 03 CPX #3
1350: C32E D0 F5 BNE OPP
1350: C330 20 2A C1 JSR SPACE
1360: C333 AD 86 C4 LDA CODEL
1360: C336 C9 02 CMP #2
1360: C338 10 03 BPL CODE2
1360: C33A 4C CE C3 JMP ENDAS
1370: C33D AE 83 C4 CODE2 LDX COD1
1370: C340 BD 00 C8 LDA TADR,X ;ADRESS. FESTSTELLEN
1370: C343 AA TAX
; '#$','$' OD.'($' AUSGEBEN
1390: C344 E0 06 CPX #6
1390: C346 30 05 BMI L0010
1390: C348 A9 28 LDA #"("
1390: C34A 20 2C C1 JSR PRIZEI
1400: C34D E0 02 L0010 CPX #2
1400: C34F D0 05 BNE L0011
1400: C351 A9 23 LDA #'#'
1410: C353 20 2C C1 JSR PRIZEI
1410: C356 A9 24 L0011 LDA #'$'
1410: C358 20 2C C1 JSR PRIZEI
1420: C35B E0 01 CPX #1
1420: C35D 10 06 BPL L0012
1420: C35F 20 16 C2 JSR OFFSET
1420: C362 4C CE C3 JMP ENDAS
1430: C365 AD 86 C4 L0012 LDA CODEL ;OPERANDEN AUSGEBEN
1430: C368 C9 03 CMP #3
1430: C36A F0 09 BEQ CODL3
1440: C36C AD 84 C4 LDA COD2
1440: C36F 20 0E C1 JSR PRBYTE
1440: C372 4C 81 C3 JMP L0013
1450: C375 AD 85 C4 CODL3 LDA COD3
1450: C378 20 0E C1 JSR PRBYTE
1450: C37B AD 84 C4 LDA COD2
1450: C37E 20 0E C1 JSR PRBYTE
1460: C381 E0 04 L0013 CPX #4
1460: C383 30 49 BMI ENDAS
; ',X',',Y',',X)','),Y' OD. ')' AUSGEBEN
1480: C385 D0 0D BNE L0014
1480: C387 A9 2C LDA #","
1480: C389 20 2C C1 JSR PRIZEI
1490: C38C A9 58 LDA #"X"
1490: C38E 20 2C C1 JSR PRIZEI
1490: C391 4C CE C3 JMP ENDAS
1500: C394 E0 05 L0014 CPX #5
1500: C396 D0 0D BNE L0015
1510: C398 A9 2C LDA #","
1510: C39A 20 2C C1 JSR PRIZEI
1510: C39D A9 59 LDA #"Y"
1510: C39F 20 2C C1 JSR PRIZEI
1510: C3A2 4C CE C3 JMP ENDAS
1520: C3A5 E0 06 L0015 CPX #6
1520: C3A7 D0 12 BNE L0016
1520: C3A9 A9 2C LDA #","
1520: C3AB 20 2C C1 JSR PRIZEI
1530: C3AE A9 58 LDA #"X"
1530: C3B0 20 2C C1 JSR PRIZEI
1530: C3B3 A9 29 LDA #")"
1530: C3B5 20 2C C1 JSR PRIZEI
1530: C3B8 4C CE C3 JMP ENDAS
1540: C3BB A9 29 L0016 LDA #")"
1540: C3BD 20 2C C1 JSR PRIZEI
1550: C3C0 E0 08 CPX #8
1550: C3C2 F0 0A BEQ ENDAS
1550: C3C4 A9 2C LDA #","
1550: C3C6 20 2C C1 JSR PRIZEI
1560: C3C9 A9 59 LDA #"Y"
1560: C3CB 20 2C C1 JSR PRIZEI
1570: C3CE AC 81 C4 ENDAS LDY OLDY ;REG. HOLEN
1570: C3D1 AE 82 C4 LDX OLDX
1570: C3D4 60 RTS ;ENDE DISAS
1580: C3D5 A0 78 READPC LDY #120
1580: C3D7 20 43 C1 JSR START ;DIS.ZEILE EDIT.
1580: C3DA 20 60 C1 JSR REVERSE
1580: C3DD A0 78 LDY #120
;LIEST BYTES UND SPEICHERT IN RAM
1600: C3DF 20 F6 C1 JSR BYT
1600: C3E2 8D 83 C4 STA COD1
1600: C3E5 C8 INY
1600: C3E6 C8 INY
1600: C3E7 20 F6 C1 JSR BYT
1610: C3EA 8D 84 C4 STA COD2
1610: C3ED C8 INY
1610: C3EE C8 INY
1610: C3EF 20 F6 C1 JSR BYT
1610: C3F2 8D 85 C4 STA COD3
1620: C3F5 AD 7D C4 LDA TMP+4
1620: C3F8 8D 05 C4 STA PREAD1+1
1630: C3FB AD 7C C4 LDA TMP+3
1630: C3FE 8D 06 C4 STA PREAD1+2
1630: C401 AD 83 C4 LDA COD1
1630: C404 8D 00 C0 PREAD1 STA $C000
1640: C407 AC 86 C4 LDY CODEL
1640: C40A C0 02 CPY #2
1640: C40C 30 32 BMI EREAD
1650: C40E AD 7D C4 LDA TMP+4
1650: C411 18 CLC
1650: C412 69 01 ADC #1
1650: C414 8D 23 C4 STA PREAD2+1
1660: C417 AD 7C C4 LDA TMP+3
1660: C41A 69 00 ADC #0
1660: C41C 8D 24 C4 STA PREAD2+2
1670: C41F AD 84 C4 LDA COD2
1670: C422 8D 00 C0 PREAD2 STA $C000
1680: C425 C0 03 CPY #3
1680: C427 30 17 BMI EREAD
1690: C429 AD 7D C4 LDA TMP+4
1690: C42C 18 CLC
1690: C42D 69 02 ADC #2
1690: C42F 8D 3E C4 STA PREAD3+1
1700: C432 AD 7C C4 LDA TMP+3
1700: C435 69 00 ADC #0
1700: C437 8D 3F C4 STA PREAD3+2
1710: C43A AD 85 C4 LDA COD3
1710: C43D 8D 00 C0 PREAD3 STA $C000
1720: C440 60 EREAD RTS ;ALLE BYTES GELESEN. ENDE READPC
1730: C441 20 54 43 TEXT .ASC " PC SP YR XR AC NV-BDIZC 76543210 "
1740: C469 30 31 32 HEX .ASC "0123456789ABCDEF"
1750: C479 00 00 00 TMP .BYT 0,0,0,0,0,0,0 ;ARBEITSVARIABLEN
1760: C480 00 TMP1 .BYT 0
1770: C481 00 OLDY .BYT 0
1780: C482 00 OLDX .BYT 0
1790: C483 00 COD1 .BYT 0
1790: C484 00 COD2 .BYT 0
1790: C485 00 COD3 .BYT 0
1800: C486 00 CODEL .BYT 0
1800: C487 00 DISON .BYT 0
1810: C500 *= TSTART
;TAB. OPCODES (L-BYTE TSTART MUSS 0 SEIN)
1820: C500 42 52 4B .ASC "BRKORA?????????ORAASL???PHPORAASL"
1830: C521 3F 3F 3F .ASC "??????ORAASL???BPLORA??????"
1840: C53C 3F 3F 3F .ASC "???ORAASL???CLCORA?????????"
1850: C557 4F 52 41 .ASC "ORAASL???JSRAND??????BITAND"
1860: C572 52 4F 4C .ASC "ROL???PLPANDROL???BITANDROL"
1870: C58D 3F 3F 3F .ASC "???BMIAND?????????ANDROL???"
1880: C5A8 53 45 43 .ASC "SECAND?????????ANDROL???RTI"
1890: C5C3 45 4F 52 .ASC "EOR?????????EORLSR???PHAEOR"
1900: C5DE 4C 53 52 .ASC "LSR???KMPEORLSR???BVCEOR???"
1910: C5F9 3F 3F 3F .ASC "??????EORLSR???CLIEOR??????"
1920: C614 3F 3F 3F .ASC "???EORLSR???RTSADC?????????"
1930: C62F 41 44 43 .ASC "ADCROR???PLAADCROR???JMPADC"
1940: C64A 52 4F 52 .ASC "ROR???BVSADC?????????ADCROR"
1950: C665 3F 3F 3F .ASC "???SEIADC?????????ADCROR???"
1960: C680 3F 3F 3F .ASC "???STA??????STYSTASTX???DEY"
1970: C69B 3F 3F 3F .ASC "???TXA???STYSTASTX???BCCSTA"
1980: C6B6 3F 3F 3F .ASC "??????STYSTASTX???TYASTATXS"
1990: C6D1 3F 3F 3F .ASC "??????STA??????LDYLDALDX???"
2000: C6EC 4C 44 59 .ASC "LDYLDALDX???TAYLDATAX???LDY"
2010: C707 4C 44 41 .ASC "LDALDX???BCSLDA??????LDYLDA"
2020: C722 4C 44 58 .ASC "LDX???CLVLDATSX???LDYLDALDX"
2030: C73D 3F 3F 3F .ASC "???CPYCMP??????CYPCMPDEC???"
2040: C758 49 4E 59 .ASC "INYCMPDEX???CPYCMPDEC???BNE"
2050: C773 43 4D 50 .ASC "CMP?????????CMPDEC???CLDCMP"
2060: C78E 3F 3F 3F .ASC "?????????CMPDEC???CPXSBC???"
2070: C7A9 3F 3F 3F .ASC "???CPXSBCINC???INXSBCNOP???"
2080: C7C4 43 50 58 .ASC "CPXSBCINC???BEQSBC?????????"
2090: C7DF 53 42 43 .ASC "SBCINC???SEDSBC?????????SBC"
2100: C7FA 49 4E 43 .ASC "INC???"
;TABELLE ADRESSIERUNG (KEINE STANDARDWERTE NUR FUER DISAS)
2120: C800 01 06 01 TADR .BYT 1,6,1,1,1,3,3,1,1,2,1,1
2130: C80C 01 03 03 .BYT 1,3,3,1,0,7,1,1,1,4,4,1,1,5
2140: C81A 01 01 01 .BYT 1,1,1,4,4,1,3,6,1,1,3,3,3,1
2150: C828 01 02 01 .BYT 1,2,1,1,3,3,3,1,0,7,1,1,1,4
2160: C836 04 01 01 .BYT 4,1,1,5,1,1,1,4,4,1,1,6,1,1
2170: C844 01 03 03 .BYT 1,3,3,1,1,2,1,1,3,3,3,1,0,7
2180: C852 01 01 01 .BYT 1,1,1,4,4,1,1,5,1,1,1,4,4,1
2190: C860 01 06 01 .BYT 1,6,1,1,1,3,3,1,1,2,1,1,8,3
2200: C86E 03 01 00 .BYT 3,1,0,7,1,1,1,4,4,1,1,5,1,1,1
2210: C87D 04 04 01 .BYT 4,4,1,1,6,1,1,3,3,3,1,1,1,1
2220: C88B 01 03 03 .BYT 1,3,3,3,1,0,7,1,1,4,4,5,1,1
2230: C899 05 01 01 .BYT 5,1,1,1,4,1,1,2,6,2,1,3,3,3
2240: C8A7 01 01 02 .BYT 1,1,2,1,1,3,3,3,1,0,7,1,1,4
2250: C8B5 04 05 01 .BYT 4,5,1,1,5,1,1,4,4,5,1,2,6,1
2260: C8C3 01 03 03 .BYT 1,3,3,3,1,1,2,1,1,3,3,3,1,0
2270: C8D1 07 01 01 .BYT 7,1,1,1,4,4,1,1,5,1,1,1,4,4
2280: C8DF 01 02 06 .BYT 1,2,6,1,1,3,3,3,1,1,2,1,1,3
2290: C8ED 03 03 01 .BYT 3,3,1,0,7,1,1,1,4,4,1,1,5,1
2300: C8FB 01 01 04 .BYT 1,1,4,4,1