Autor Wątek: Pascal, Delphi  (Przeczytany 2764 razy)

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Pascal, Delphi
« dnia: 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).

W czym mogę to skompilować do .exe?


function IntelSmallInt(SmI:smallint):smallint;
 asm
  xchg al,ah
 end;
AY Music, ULA plus.

pear

  • *****
  • Wiadomości: 5509
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Pascal, Delphi
« Odpowiedź #1 dnia: 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
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;
ZX/Enterprise/CPC/Robotron/C128D

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Pascal, Delphi
« Odpowiedź #2 dnia: 2015.04.14, 18:25:04 »
Gdyby był ktoś zainteresowany, temat rozwinąłem na forum dobre programy (link).
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.
AY Music, ULA plus.