forum speccy.pl

ZX Spectrum => RÓŻNOŚCI => Wątek zaczęty przez: Abrimaal w 2015.03.13, 02:52:05

Tytuł: Pascal, Delphi
Wiadomość wysłana 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;
Tytuł: Odp: Pascal, Delphi
Wiadomość wysłana przez: pear w 2015.03.13, 06:19:22
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;
Tytuł: Odp: Pascal, Delphi
Wiadomość wysłana przez: Abrimaal w 2015.04.14, 18:25:04
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.