· Text 1133 · w6 · inlagg
Eftersom det dröjer med besked om REL-filernas uppbyggnad (numret till
frågan har jag glömt), så bidrar jag här med vad jag har kommit fram
till genom att dissekera ADDOPT.ABS:
.REL-filerna byggs upp av block om 256 bytes (inte 253!). Varje
block ska ha kontrollsumman 0. Summan räknas ut genom att addera
ihop varje byte i blocket med ADC-instruktionen. Själva programmet
börjar i det andra blocket. I det första ligger lite andra data:
Byteposition 0 ska innehålla koden 2. Position 21 ska ha ett udda
innehåll. Position 132 (Hög) och 133 (Låg) anger hur mycket utrymme
programmet tar. Stacken flyttas ned angivet antal bytes, och program-
met startar direkt ovanför. Position 14 (Hög) och 15 (Låg) innehåller
ett tal som kan användas till lite av varje, och framförallt som
anropsadress till en initieringsrutin i programmet. Jag kallar den
fortsättningsvis för A. Resten av utrymmet kan disponeras efter eget
tycke (tror jag).
Resten av filen består av styrkoder och programkod. Styrkoderna tolkas
så här (x-märkta bits får ha vilket värde som helst):
76543210 (bits)
1nnnnnnn Kopiera de n efterföljande byte:arna från REL-filen till
det färdiga programmet.
0xx1bxsw b=1:Hämta ett ord från stacken till det färdiga programmet
0:Följs av axxxxxxx,Hög,Låg. Ordet hög-låg kopieras in
i programmet. Om a=1 adderas basadressen till ordet.
s=0:Swap. Ordet ska lagras med den höga byten först.
s=1:Låg byte först.
w=0:Lagra bägge byte:arna.
w=1:Lagra bara den första byten.
0x001111, axxxxxxx, Hög, Låg
Ordet hög-låg lagras på stacken för framtida bruk. Om a=1
adderas basadressen till ordet.
0x10x000 Addera de två översta orden på stacken. Lägg tillbaks
resultatet på stacken.
001 Subtrahera det näst översta ordet på stacken från det
översta, och lägg tillbaks resultatet. Överst-Näst överst.
100 Negera stackens översta ord. (Dvs byt tecken.)
Övriga Otillåten kod. ADDOPT övergår till att behandla nästa
REL-fil. Stacken flyttas tillbaks till sin ursprungliga
position.
0x000000 Gå direkt till nästa block i filen. Läggs lämpligen som
näst sista byte i blocket. Den sista byten får väljas så
att blocksumman blir 0.
0001 Gör ett anrop. Om stacken är "tom", dvs inga oanvända data
ligger kvar där, laddas HL med det tidigare nämda värdet
A, varefter CALL (HL) görs, och till sist fortsätter
ADDOPT med nästa fil. Om data (=adresser) finns på stacken
laddas HL med A, och RET utförs, vilket för kontrollen
till den adress som ligger överst på stacken. Ligger det
mer än en adress på stacken kommer de att betas av i takt
med att RET-instruktioner påträffas, varefter CALL (HL)
gärs om carry är falsk. Därefter tas nästa fil.
0010 Samma som 0001.
1000 Ny måladress tas från stacken.
1001 Ny måladress blir
gammal adr + överstistack - 1 AND NOT överstistack - 1.
Vad detta ska vara bra för vet jag inte, men delutrycket
"NOT överstistack -1" motsvarar "-överstistack".
1010 Ändra värdet A. Nytt A tas från stacken.
Övriga Samma som 0x10xövriga.
Med basadress menar jag den adress där det färdiga programmet börjar,
dvs direkt över stacken. Med måladress menar jag den adress i det fär-
diga programmet som för ögonblicket bearbetas. Med "ord" menar jag två
bytes även om det kanske inte är stämmer riktigt på denna processor.
Som synes går det att göra en del små beräkningar under
"relokerandet". Den viktigaste av styrkoderna är "0xx1bxsw" som tillå-
ter en att justera absoluta adresser i förhållande till basadressen.
Därnäst kommer "1nnnnnnn" som används till all annan programkod som
inte behöver justeras.
Hoppas någon har glädje av detta.