forum speccy.pl
ZX Spectrum => RÓŻNOŚCI => Wątek zaczęty przez: Abrimaal w 2015.03.13, 02:52:05
-
Moja znajomość języka Pascal ograniczała się do begin, end, procedure, function, writeln, inline... a że częściej widziałem Tape Loading Error niż (C) Hisoft Pascal, to nie miałem okazji go poznać.
Teraz przyszła konieczność rekompilacji AY SplittR i AY MakeR, napisanego w Delphi 5, aby wyświetlały się ukryte dotąd wartości, takie jak np. przypisanie kanału AY do kanału audio Amiga itp...
Użyłem darmowego kompilatora Free Pascal IDE i przy próbie rekompilacji oryginalnego pliku, bez modyfikacji, od razu błąd.
Kompilator nie rozpoznaje instrukcji ASM. Funkcja poniżej ma zamieniać niższy bajt z wyższym. Użyte tutaj asm dotyczy instrukcji assemblera xchg al,ah (info) (http://www.baskent.edu.tr/~tkaracay/etudio/ders/prg/pascal/PasHTM2/pas/pasl2014.html).
W czym mogę to skompilować do .exe?
function IntelSmallInt(SmI:smallint):smallint;
asm
xchg al,ah
end;
-
Znalazłem taką sztuczkę http://stackoverflow.com/questions/5133938/procedure-that-swaps-the-bytes-low-high-of-a-word-variable (http://stackoverflow.com/questions/5133938/procedure-that-swaps-the-bytes-low-high-of-a-word-variable)
procedure MySwap(var a: word);
var
tmp: byte;
begin
tmp := PByte(@a)^;
PByte(@a)^ := PByte(NativeUInt(@a) + sizeof(byte))^;
PByte(NativeUInt(@a) + sizeof(byte))^ := tmp;
end;
Nie mam pojęcia czy zadziała, bo kosmicznie wygląda, ale aż sam z ciekawości muszę sprawdzić :)
Ewentualnie najprościej na piechotę:
procedure MySwap(var a: word);
begin
a := word(a shl 8) + byte(a shr 8);
end;
-
Gdyby był ktoś zainteresowany, temat rozwinąłem na forum dobre programy (link) (http://forum.dobreprogramy.pl/kompilator-pascal-z-obs%C5%82ug%C4%85-assemblera-t501890/).
Aby instrukcje asm dały się skompilować, wystarczyło dodać na początku {$MODE delphi}
Teraz jest inny problem. Oryginalny AYSplittR bez żadnych modyfikacji po zrekompilowaniu działa bezbłędnie, AYMakeR natomiast wiesza się w większości przypadków. Prawdopodobnie chodzi tu o type mismatch zmiennych Word i SmallInt.