Kompilator Pascal z obsługą assemblera


(Abrimaal) #1

Nie mam doświadczeń w programowaniu w Pascal, poza podstawową wiedzą zdobytą na początku lat 90tych.

W tym celu próbowałem użyć darmowego kompilatora Free Pascal IDE, jednak zatrzymał się na niezrozumiałej dla niego instrukcji asm , która ma na celu zamianę bajtów hi - lo rejestru.

function IntelWord(Wrd:word):word;
 asm
  xchg al,ah
 end;

(Pablo_Wawa) #2

Przerób tę funkcję, np. tak:

function IntelWord(Wrd:word):word;
begin
  IntelWord:=((Wrd and 255) shl 8) or (Wrd shr 8);
end;

Pisane z głowy, nie wiem, czy nie ma błędów.


(Forsajt) #3

A tak nie pójdzie?

function IntelWord(Wrd:word):word;
begin
{$ASMMODE intel}
 asm
   xchg al,ah
 end;
end;

(Abrimaal) #4

Tak, brakowało mu beginend;

Teraz zaczęło się pod górkę. Cały program służy do “rozebrania” pliku muzycznego na .ini zawierajacy nagłówek i .bin z danymi.

Kompiler wyrzuca 11 błędów dotyczących edytowanego pliku. Czy on jest mu potrzebny do samego procesu kompilacji? Ten plik znajduje się w roboczym folderze.

post-129749-0-54004100-1427669663_thumb.


(Forsajt) #5

Dodaj na początku dyrektywę {$MODE delphi}. Wtedy nie będziesz musiał nawet zmieniać tej funkcji IntelWord.


(Abrimaal) #6

Wielkie dzięki. Od razu skompilował całość i wszystko działa. :brawo:

Jeśli pojawi się problem przy modyfikacji programu (ze składnią czy nie obsługiwaną instrukcją), napiszę w osobnym temacie.


(Forsajt) #7

Nie ma to znaczenia. Ten wyjątek zgłasza dla jakiegoś konkretnego pliku .ini czy niezależnie od tego?


(Abrimaal) #8

Dla jednego z dwóch testowanych plików, jak do tej pory.

Najpierw plik muzyczny .ay został rozłożony do .bin + .ini zrekompilowanym programem.

Plik .ini jest prawidłowy, oryginalny .exe składa go z powrotem bez problemu, zrekompilowany wyrzuca ten błąd.


(Forsajt) #9

Czyli jak dobrze rozumiem, posiadasz wersję programu skompilowaną kompilatorem Borlanda i tam wyjątek nie występuje? Jaką wersją Free Pascala rekompilujesz program? Próbowałeś debugować?


(Abrimaal) #10

Oryginalny program został napisany w 2001 i jego źródła są wolne do udostępniania. Kompilator jest z 2012. Nie wiem w czym był kompilowany i czy plik .exe powstał dokładnie na bazie tej wersji.

W każdym razie AYSplittr zrekompilowany chodzi bezbłędnie, a AYMaker nie. Spróbuję przetworzyć w nich kilkanaście plików, aby mniej więcej dojść do tego, w jakich okolicznościach wyjątek występuje.

Mam w planie rozwinięcie formatu, który oryginalnie został napisany dla Motorola 68k, stąd byte order jest pod niego. W tej formie został też przeniesiony na PC. Tak musi zostać, aby pliki chodziły na starszych, nierozwijanych już odtwarzaczach.

Żeby było ciekawiej, dane w plikach .bin są dla procesora Z80, czyli bliższego x86.

Update formatu ma dotyczyć wykorzystania nieużywanych obecnie bajtów do innych celów zachowując wsteczną kompatybilność.

AYSplitR.dpr.txt

AYMakeR.dpr.txt

post-129749-0-58863000-1427847312_thumb.


(Forsajt) #11

W kilku miejscach w programie może wystąpić przekroczenie zakresu wartości, gdyż funkcja IntelWord zwraca wartość typu Word która jest przypisawana do zmiennych typu SmallInt. Użyj dyrektywy {$R-} albo popraw typy.