ACTION! - Sprung ins Modul bei mehr als 2 Byte Parametern
von Erhard » Mi 6. Mär 2013, 09:05An alle ACTION!-in-depth-user,
bei meiner Arbeit mit ACTION! ist mir eine Besonderheit im kompilierten Code aufgefallen.
Immer dann, wenn an eine Prozedur mehr als 2 Byte übergeben werden, also 3 Byte oder 1 Word und 1 Byte, erfolgt im kompilierten Code ein Sprung ins Modul.
Dadurch stellen sich bei mir 1 Frage:
Wieso funktioniert ACTION! überhaupt ohne Modul ???
Beispiel 1 (Keine Parameter)
Maschinensprache zu Beispiel 1
Beispiel 2 (1 Parameter)
Maschinensprache zu Beispiel 2
Beispiel 3 (2 Parameter)
Maschinensprache zu Beispiel 3
Beispiel 3 (3 Byte Parameter)
Maschinensprache zu Beispiel 3
Wenn hier also ein Sprung ins Modul erfolgt, welches aber nicht notwendigerweise vorhanden ist - wieso funktioniert es denn trotzdem?
Ich harre gespannt eurer Ideen.
PS: Wozu dient eigentlich der JMP-Befehl, der gleich immer am Anfang kommt und der nur sich selbst überspringt? Sollten die lokalen Variablen vielleicht ursprünglich mal nach diesem JMP-Befehl stehen statt davor? Übersichtlicher wäre es ja.
Viele Grüße
Erhard
bei meiner Arbeit mit ACTION! ist mir eine Besonderheit im kompilierten Code aufgefallen.
Immer dann, wenn an eine Prozedur mehr als 2 Byte übergeben werden, also 3 Byte oder 1 Word und 1 Byte, erfolgt im kompilierten Code ein Sprung ins Modul.
Dadurch stellen sich bei mir 1 Frage:
Wieso funktioniert ACTION! überhaupt ohne Modul ???
Beispiel 1 (Keine Parameter)
- Code: Alles auswählen
MODULE
PROC TEST()
BYTE I
FOR I = 1 TO 10 DO
OD
RETURN
Maschinensprache zu Beispiel 1
- Code: Alles auswählen
2083 4C 86 20 JMP $2086
2086 A0 01 LDY #$01 ;SET I=1
2088 8C 82 20 STY $2082
208B A9 0A LDA #$0A ;Vergleiche 10 mit I
208D CD 82 20 CMP $2082
2090 B0 03 BCS $2095 ;ist größer
2092 4C 9B 20 JMP $209B ;10 wurde erreicht
2095 EE 82 20 INC $2082 ;I=I+1
2098 4C 8B 20 JMP $208B ;weiter
209B 60 RTS
Beispiel 2 (1 Parameter)
- Code: Alles auswählen
MODULE
PROC TEST(BYTE A)
BYTE I
FOR I = 1 TO 10 DO
OD
RETURN
Maschinensprache zu Beispiel 2
- Code: Alles auswählen
20A2 4C A5 20 JMP $20A5
20A5 8D A0 20 STA $20A0 ;hier wird das übergebene Byte gesichert
20A8 A0 01 LDY #$01
20AA 8C A1 20 STY $20A1
20AD A9 0A LDA #$0A
20AF CD A1 20 CMP $20A1
20B2 B0 03 BCS $20B7
20B4 4C BD 20 JMP $20BD
20B7 EE A1 20 INC $20A1
20BA 4C AD 20 JMP $20AD
20BD 60 RTS
Beispiel 3 (2 Parameter)
- Code: Alles auswählen
MODULE
PROC TEST(BYTE A, B)
BYTE I
FOR I = 1 TO 10 DO
OD
RETURN
Maschinensprache zu Beispiel 3
- Code: Alles auswählen
208A 4C 8D 20 JMP $208D
208D 8E 88 20 STX $2088 ;hier wird das 2. übergebene Byte gesichert
2090 8D 87 20 STA $2087 ;hier wird das 1. übergebene Byte gesichert
2093 A0 01 LDY #$01
2095 8C 89 20 STY $2089
2098 A9 0A LDA #$0A
209A CD 89 20 CMP $2089
209D B0 03 BCS $20A2
209F 4C A8 20 JMP $20A8
20A2 EE 89 20 INC $2089
20A5 4C 98 20 JMP $2098
20A8 60 RTS
Beispiel 3 (3 Byte Parameter)
- Code: Alles auswählen
MODULE
PROC TEST(BYTE A, B, C)
BYTE I
FOR I = 1 TO 10 DO
OD
RETURN
Maschinensprache zu Beispiel 3
- Code: Alles auswählen
2091 4C 94 20 JMP $2094
2094 20 F5 A0 JSR $A0F5 ;tja - hier gehts ins Modul und es
;werden wohl die Parameter gesichert
2097 8D 20 02 STA $0220
209A A0 01 LDY #$01
209C 8C 90 20 STY $2090
209F A9 0A LDA #$0A
20A1 CD 90 20 CMP $2090
20A4 B0 03 BCS $20A9
20A6 4C AF 20 JMP $20AF
20A9 EE 90 20 INC $2090
20AC 4C 9F 20 JMP $209F
20AF 60 RTS
Wenn hier also ein Sprung ins Modul erfolgt, welches aber nicht notwendigerweise vorhanden ist - wieso funktioniert es denn trotzdem?
Ich harre gespannt eurer Ideen.
PS: Wozu dient eigentlich der JMP-Befehl, der gleich immer am Anfang kommt und der nur sich selbst überspringt? Sollten die lokalen Variablen vielleicht ursprünglich mal nach diesem JMP-Befehl stehen statt davor? Übersichtlicher wäre es ja.
Viele Grüße
Erhard