ASM

Bloki assemblera ASM nie są przez kompilator weryfikowane pod względem składni, dokonuje tego dopiero Mad Assembler.

UWAGA:
Wymagane jest aby zachować stan rejestru X CPU6502, który używany jest do obsługi stosu programowego Mad-Pascal.

Kompilator dopuszcza dwie składnie bloku ASM, z klamrami { } jak dla komentarza i standardową bez klamer.

ASM
  lda #10
  sta 712
END;
ASM
{  lda #10
   sta 712
};
procedure name; assembler;
asm
  lda #10
  sta 712
end;
procedure name; assembler;
asm
{
  lda #10
  sta 712
};
end;
{$link filename}

Dyrektywa kompilatora {$link filename} pozwala dołączyć plik relokowalny z Mad Assembler-a do kompilowanego programu Mad-Pascal.

    .reloc

.extrn edx .dword

.extrn  print .proc (.dword edx) .var

.public prc


.proc   prc (.dword a .dword b .dword c) .var

.var a,b,c .dword

    print a
    print b
    print c

    rts

.endp

W powyższym przykładzie korzystamy z procedury PRINT, która jest zdefiniowana w Mad-Pascal.

uses crt;


procedure prc(a,b,c: integer); external;


procedure print(value: dword); keep; register;
begin

 writeln(value);

end;


{$link test.obx}    // link PRC procedure


begin

 prc(11, 347, 321785);

 repeat until keypressed;

end.

Z poziomu assemblera mamy dostęp do procedur Mad-Pascal ale tylko oznaczonych modyfikatorem REGISTER, czyli takich których parametry przekazywane są przez programowe rejestry EDX, ECX, EAX (jesteśmy ograniczeni do maksymalnie trzech parametrów).

Modyfikator KEEP wymusza pozostawienie procedury w kompilowanym kodzie niezależnie od tego czy wystąpiło jej użycie czy nie (normalnie procedury/funkcje które nie są używane są eliminowane).

Mad-Pascal natomiast ma dostęp do procedur z linkowanego pliku assemblera, których parametry przekazywane są przez zmienne, modyfikator .VAR.

.proc   prc (.dword a .dword b .dword c) .var

W programie relokowalnym Mad Assembler-a potrzebujemy dodatkowej deklaracji zewnętrzych symboli EDX, ECX, EAX.

.extrn edx, ecx, eax .dword

Sama procedura Mad-Pascal do której chcemy mieć dostęp z poziomu assemblera jest deklarowana jako procedura zewnętrzna z parametrami oznaczającymi rejestry programowe EDX, ECX, EAX.

Więcej informacji na temat modyfikatora REGISTER i kolejności alokacji parametrów w rejestrach programowych w rozdziale Procedury i funkcje.

.extrn  print .proc (.dword edx) .var

Dostęp do procedury PRC z poziomu Mad-Pascal zapewni nam jej upublicznienie przez dyrektywę assemblera .PUBLIC.

.public prc

Po assemblacji naszego przykładowego relokowalnego programu assemblera TEST.ASM otrzymujemy plik TEST.OBX, który możemy połączyć z programem Mad-PAscal dyrektywą {$LINK}.

{$link test.obx}