wär hilfreich, wenns mir schnell wer sagen könnte
vielleicht kann mir wer erklären, was das prog hier machen soll:
Code:define wert byte[1] define adr word[2] define b2 byte[2] define w3 word[3] define w4 word[4] gosub LOAD_GETBYTE define GETBYTE &HA2 for adr=0 to &H1FFF sys GETBYTE PRINT adr,":" wert next end #LOAD_GETBYTE b2=&HC6 w3=&HB7A1 w4=&H8100 return
das zugehörige assembler-prog schaut so aus:
danke schonmal im vorausCode:LDA $4711 STA $A1 RTS
wär hilfreich, wenns mir schnell wer sagen könnte
Das CCBASIC Programm liest alle Bytes ab Adresse 0 bis Adresse &H1FFF und zeigt sie über RS232 an.
Das Assembler-Programm brauchst Du dazu nicht.
könntest dus mir ein bisl genauer erklären, ich verstehs noch net ganz..
also zuerst die variablendef. is klar, dann wir den 3 werten etwas zugewiesen (wozu genau?), die zeile is mir unklar:
define GETBYTE &HA2
und wie kommt dann was in wert rein?
getbyte muss ja auch als assemblerroutine eingebunden werden..
Also: der Trick ist die Speicherbelegung bei CCBASIC:
byte[1] liegt auf Adresse &HA1, byte[2] auf &HA2 usw.
Im Unterprogramm #LOAD_GETBYTE werden diese Variablen mit einem (noch unvollständigen) Assemblerprogramm belegt:
byte[2] = &HA2 = &HC6 -- der opcode des Befehls LDA
word[2] = HhA3/4 ist noch nicht berschreiben; aber da liegt ja "adr", und das kriegt nachher in der FOR-Schleife die Werte &H000 bis &H1FFF -- das ist dann die Adresse für den LDA - Befehl
word[3] = &HA5/6 = &HB7A1 -- der Befehl STA $A1: speichert das Resultat nach &HA1 = byte[1] = "wert".
word[4] = &HA7/8 = &H8100 -- 81 ist der Befehlt RTS; die 00 wird nicht mehr durchlaufen.
In der FOR-Schleife wird mit der Änderung von "adr" also die Adresse des LDA - Befehls des Assemblerprogramms gesetzt.
SYS GETBYTE ruft das Assemblerprogramm auf (GETBYTE ist ja &HA2);
der LDA - Befehl liest jetzt das Byte an Adresse "adr", der STA - Befehl speichert's nach $A1 = "wert", und das Assembler-Programm kehrt mit RTS zurück.
Jetzt kann "wert" (liegt ja auf Adresse &HA1 !) mit PRINT ausgegeben werden.
Ach so:
"getbyte muss ja auch als assemblerroutine eingebunden werden":
In diesem Fall wird die Assembler-Routine nicht per SYSCODE eingebunden, sondern wird mit den BASIC Wertzuweisungen selbst "gesetzt".
Ist nicht schön (zu Lesen, für uns Menschen), macht aber für den Rechner keinen Unterschied, woher die Bytes kamen...
jap aber das assemblerprogramm, das man schreibt, entspricht ja dem von ganz oben .. und da versteh ich net, wieso das immer in der schleife aufgerufen wird, was macht es und wie kommt dann der bytewert in "wert".
wozu is &HA2
sorry, hab net die obige message übersehen
wie weiß der prozessor, dass lda danach 2 byte für das argument verwendet .. man kann lda auch nur ein byte übergeben
LDA: das stimmt; das ist generell so bei dieser CPU: die Befehle können unterschiedliche Adressierungs-Arten haben. Damit die CPU das erkennen kann, haben sie auch unterschiedliche Op-Codes:
LDA = Load Accumulator from Memory:
Hier ist es der LDA mit dem OpCode "C6" -- also "Extended Addressing", es folgt noch die Adresse, bestehend aus high byte und low byte.Code:Source Addressing Forms Modes OpCode Operands LDA (opr) IMM A6 ii LDA (opr) DIR B6 dd LDA (opr) EXT C6 hh ll LDA ,X IX F6 LDA (opr),X IX1 E6 ff LDA (opr),X IX2 D6 ee ff
Lesezeichen