Kijk, daar hebben we wat aan !
Allereerst, met het weglaten van "far" gaat het aantal
compilatie-fouten omlaag, er blijven alleen maar waarschuwingen over. Daardoor wordt de link-slag wel opgestart (met "far" gaat de compilatie zo fout dat de compiler weigert de link-slag op te starten). De rest van de fouten zijn
link-fouten.
En daar heb je een volgend probleem. De source waar je mee bezig bent vereist een library voor het aansturen van seriele poorten (al die "_Sio*"-functies), en die heb je niet, of in ieder geval niet gedefinieerd als benodigd.
De FP_OFF- en FP_SEG-functies zijn geen echte functies, maar macro's die een 32-bits adres opsplitsen in het segment-gedeelte en het offset-gedeelte.
Je zult dus eerst een SIO-library te pakken moeten zien te krijgen, maar ik twijfel ten zeerste of de oorspronkelijke versie waarmee deze code samenwerkt nog werkt met de compilers die je nu gebruikt. Als je een ander library te pakken krijgt, zul je de functies moeten ombouwen, met name wat er gebeurt in de Sio?xBuf-functies is zeer segment/offset-gerelateerd.
Ik sluit me dus ook aan bij OiSyN in de conclusie dat dit niet gaat werken onder een moderne 32-bits compiler.
Dus waar je naar moet zoeken :
- de SIO-library die bij die source hoort;
- een C-compiler die uit ongeveer dezelfde periode stamt, zodat je de juiste geheugen-modellen kunt gebruiken.
Het resulterende programma zal dus ook altijd in een DOS-box draaien.
Een adres in de oude kreupele DOS-adressering wordt (uit pure technisch-historische redenen die te maken hebben met de oorspronkelijke 16-bits-architectuur van de 80x86-processor-reeks) opgebouwd uit een 16-bits segment- en een 16-bits offset-adres. Het segment is 4 bits naar rechts verschoven t.o.v. een offset, ze overlappen elkaar dus aanzienlijk.
code:
1
2
| SSSSSSSSSSSSSSSS....
....OOOOOOOOOOOOOOOO |
Het echte adres is de optelling van deze 2 adressen.
Die 16 overlappende bits kun je dus op elke gewenste manier verdelen, er zijn vele manieren om hetzelfde adres weer te geven, en je kunt dus altijd "normaliseren" naar een segment-/offset-combinatie dat alleen de laatste 4 bits van de offset 0 zijn :
code:
1
2
| SSSSSSSSSSSSSSSS....
................OOOO |
Aan de Sio?xBuf-functies wordt alleen maar een segment doorgegeven, maar de adressen van de gereserveerde buffers bestaan uit het segment-adres van het data-segment, plus een offset t.o.v. het begin van data data-segment. Daarom worden die adressen "genormaliseerd", want je kunt een adres opgebouwd uit een segment+offset altijd omrekenen naar een adres waarbij de offset 0 is, als je een marge van 4 bits (=16 bytes) accepteert.
Vandaar dat er dus 15 bij het adres van Ptr wordt opgeteld, en vervolgens een right-shift van 4 volgt. Je verliest nu mogelijk wat bytes aan het begin van de buffer, en dat verklaart de "+16" in de definitie van beide buffers.