Dunque...
Vediamo cosa abbiamo ricavato finora.
I record SEGDEF definiscono le caratteristiche dei vari segmenti.
In pratica, definiscono:
- L'allineamento;
- Il rango (combine);
- la lunghezza.
I record LEDATA, per quanto ricordo, contengono il "contenuto" vero e proprio dei segmenti.
La parte più difficile è il record FIXUPP.
Esso, a parte i primi tre bytes di rito, contiene un subrecord che, a quanto ho capito, può essere di due tipi: FIXUP o THREAD (non meglio da me conosciuti, prendiamoli per buoni).
Se si tratti di un subrecord FIXUP o THREAD, dipende dal
primo byte di questo subrecord.
Vediamo sul pratico...
Il codice che identifica il record FIXUPP è il
9C.
00 B4 00 CD 16 B4 4C CD-21 F2 9C 0F 00 C8 03 54
01 C4 10 54 01 C4 15 50-02 07 00 DA 8A 06 00 C1
Eccolo isolato:
9C 0F 00 C8 03 54 01 C4 10 54 01 C4 15 50 02 07 00 DA
...e depurato dei tre bytes rituali iniziali e dell'ultimo (checksum):
C8 03 54 01 C4 10 54 01 C4 15 50 02 07 00
Ora, questa sequenza di bytes è fatta di un unico sottorecord, che può essere di tipo
THREAD o di tipo
FIXUP, e la differenza è specificata
dal primo bit.
Mi sembra ovvio che, essendo il primo bytes C8, il primo bit è pari a 1, il che significa che
si tratta di un sottorecord di tipo FIXUP.
Salto tutto il capitolo del documento relativo ai subrecord di tipo THREAD e vado a qualli di tipo FIXUP.
Il primo campo del subrecord FIXUP si chiama
Locat, ed è lungo
due bytes.
Eccolo isolato:
C8 03 54 01 C4 10 54 01 C4 15 50 02 07 00
- Il primo bit del campo Locat è quello che identifica il record come di tipo FIXUP.
- Il secondo bit del campo Locat distingue fra self-relative e segment-relative fizup. Non ricordo bene cosa significhi, ho una vaga idea...
- I successivi 4 bit formano il sottocampo Location e specificano il tipo di aggiustamento che va fatto: credo si tratti di specificare se quello da aggiustare è l'offset o l'indirizzo di segmento o ambedue...
- I restanti 10 bits formano il Segment Data Offset, ossia indicano la posizione dove effettuare il riaggiustamento nel record LEDATA precedente.
Che macello!!!.
Vediamo il campo
Locat di questo subrecord di tipo FIXUP:
C8 03 = 1100-1000 0000-0011
Dividiamo i sottocampi:
1-1-0010-0000000011.
Il
primo bit è 1, il che
identifica questo sottorecord come un sottorecord di tipo FIXUP e non THREAD.
Il
secondo bit è 1, il che
significa che si tratta di un aggiustamento segment-relative.
Il campo successivo è
Location, e
indica il tipo di aggiustamento che va fatto, in questo caso il suo valore è 2, e significa che è un aggiustamento 16 bit-base.
Vediamolo con dispObj:
FIXUPP: Type 9C, Offset 006A
Segment-relative base location 003 (003),
Frame & Target segment DATA
Segment-relative word offset location 010 (010),
Frame & Target segment DATA
Segment-relative word offset location 015 (015),
Frame & Target segment TEXT, offset 0007
0000:9C 0F 00 C8 03 54 01 C4-10 54 01 C4 15 50 02 07 ...╚.T.─.T.─.P..
0010:00 .
Ho beccato il primo di tre aggiustamenti.
"Segment-relative base location".
E abbiamo visto i primi tre sottocampi di
Locat.
Adesso vediamo l'altro, che è 00000000011, ossia 3, e indica in quale offset del LEDATA precedente va fatto l'aggiustamento.
Corrisponde a quanto detto dal dispObj, ossia 003.
Andiamo a vedere il LEDATA:
0000:EB 07 BA 00 00 8E DA FA-FA B4 00 B0 03 CD 10 A1
0010:00 00 2E 8B 1E 00 00 B4-00 CD 16 B4 4C CD 21
Eccolo!
Ora mi esercito con gli altri, sempre sul campo
Locat.
Riprendo il record, e lo separo nei vari
sottorecords FIXUP:
C8 03 54 01
C4 10 54 01
C4 15 50 02 07 00
(l'ultimo sottorecord FIXUPP è più lungo, non so perchè, lo vedrò poi)
Ecco i campi
Locat.
1100-1000 0000-0003
1100-0100 0001-0000
1100-0100 0001-0101
Dividiamoli in sottocampi:
1 1 0010 0000000003
1 1 0001 0000010000
1 1 0001 0000010101
Traduzione:
Nel primo campo Locat il sottorecord è FIXUP, la correzione è segment-relative, si tratta di una rilocazione dell'indirizzo di segmento (base location). La posizione nel LEDATA è 003.
Nel secondo campo Locat il sottorecord è FIXUP, la correzione è segment-relative, si tratta di una rilocazione di offset. La posizione nel LEDATA è 010.
Nel terzo campo Locat il sottorecord è FIXUP, la correzione è segment-relative, si tratta di una rilocazione di offset. La posizione nel LEDATA è 015.
Confrontiamo col responso di dispObj:
FIXUPP: Type 9C, Offset 006A
Segment-relative base location 003 (003),
Frame & Target segment DATA
Segment-relative word offset location 010 (010),
Frame & Target segment DATA
Segment-relative word offset location 015 (015),
Frame & Target segment TEXT, offset 0007
Esatto!!!