- 
	
	
	
		
assembler
	
	
		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:
	Code:
	
LDA        $4711
STA        $A1
RTS
 danke schonmal im voraus
	 
 - 
	
	
	
	
		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:
	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
 Hier ist es der LDA mit dem OpCode "C6" -- also "Extended Addressing", es folgt noch die Adresse, bestehend aus high byte und low byte.