reAssembler

reAssembler je původní makroassembler pro procesor Z80 s podporou maker, definic, lokálních návěstí a include souborů.

» syntaxe a formát zápisu
» podporované direktivy a pseudoinstrukce
» podmíněný překlad
» definice maker
» vlastní direktivy



Syntaxe a formát zápisu


Syntaxe zápisu návěstí


;labels syntax example
;prefix . define local label

main_code:    ld b,10            ;global label "main_code"
.loop:        call sub_code      ;local "loop"
              djnz loop          ;goto local "loop"
              ret

sub_code:     ld a,10            ;global label "sub_code" invalidates prev "loop"
.loop:        dec a              ;local "loop"
              jr     nz,loop     ;goto local "loop"
              ret

Syntaxe zápisu výrazu a hodnot

;number systems
              ld  a,128         ;decimal
              ld  a,$80         ;hexadecimal
              ld  a,'A'         ;ASCII char
              ld  a,%10000000   ;binary



Aritmetické operace
Ve výrazu lze užít následující operátory:

+ - * /
              ld hl,32*128+4    ;hl = $1004

Logické operace

|        OR
&       AND
^       XOR
~       NEG
<       menší než*
>       větší než*
==     rovno*
!=      není rovno*

        *výsledkem operace je 0 nebo 1 

               ld a, 'A' | $80  ;char A or 128   

Znak $ pro aktualní hodnotu PC

               ld hl, $+3    ;hl = address of next instr (PC+3)

Užití závorek
Pokud chcete ve výrazu užít závorky, je nutno před výraz vložit operátor =


               ld hl, ($4000 + 4)  ; compiled as LD HL,($4004)

               ld hl, =($4000 + 4) ; compiles as LD HL,$4004


Podporované direktivy a pseudoinstrukce

ORG, EQU, END

                org    $8000    ;start addres*
    FIRST_RAM   equ    $4000    ;define FIRST_RAM as 16384
                xor    a
                ld     (FIRST_RAM),a
                ret
                end

*direktiva ORG vytvoří nový blok v závislosti na případných direktivách %SPLIT_BLOCKS nebo %MERGE_BLOCKS

DEFB, DB;  DEFW, DW;  DEFS, DS;  DEFM, DM


    ;define bytes
                defb   10
                defb   $80,'A'

    ;define words
                defw    32768
                defw    10000,'AB'

    ;define memory space
                defs    100    ;create 100 bytes space
                defs    64,32  ;create 64 bytes space filled by byte 32

    ;define ASCII string
                defm    "Hello"
                defm    "Hello"," world"

INCDIR, INCLUDE, INCBIN

    incdir    "F:\SOURCES\" ;add the directory to the directory search list
    incdir    "F:\DATA\"    ;add the directory to the directory search list
    include   "TEST.ASM"    ;including source file f:\sources\test.asm (or f:\data\test.asm )
                            ;if this file is not in the same directory

    incbin    "DATA.BIN"    ;include binary data from file f:\data\data.bin

Podmíněný překlad

#DEFINE, #IFDEF, #IFNDEF, #ELSE, #UNDEF

    #define    mov     ld         ;define MOV as LD
               mov     hl,16384   ;compile as LD HL, 16384

      #define _DEBUG              ;set DEBUG mode
    ...
    #ifdef _DEBUG
        ;source code for debug mode
    #else
        ;source code for release
    #endif

    #undef mov        ;undefine MOV



Definice maker


#MACRO, #ENDM

;example of a macro definition (max. 8 parameters can be used)
#macro      total  (width, height)    ;begin macro definition (with ())
            ld      a,@width          ;@ character specifies parameter
            ld      b,@height
            add     a,b
#endm                                 ;end of macro definition
            ...                       ;some code...
            total  10,12              ;use macro (without ())



Vlastní direktivy reAssembleru

Následující direktivy lze použít pouze při kompilaci v reAssembleru
V případě, že bude zdrojový text kompilován jiným kompilátorem,
povolte Kompatibilní mód assemleru a direktivu umístěte za dvojici znaků ;
např. [
 ;;%entry ]kdy ostatní kompilátory ji budou ignorovat.

%SYS_VARS [enable/disable]
Umožní používat přímo názvy sytémových proměnných bez nutnosti žádných include souborů

%sys_vars enable  

          ld  a,(KSTATE)    ;read sys var $5C00

%ROM_CALLS [enable/disable]
Umožní volat rutiny 48K ROM přímo bez nutnosti žádných include souborů

%rom_calls enable

           call LD_BYTES   ;call $0556

%ROM_WRITE [enable/disable]
Povolí/zakáže zápis kompilátoru do ROM [0000 - 3FFF]

%SINGLE_BLOCK fill_byte

Vygenerovaný soubor bude sloučen do jediného bloku,  nedefinované bajty budou nastavany na hodnotu fill_byte

    org 32768    ;1st block
    ld a,100
    ret

    org 33000    ;2nd block

    xor a
    ret

Result: 2 bloky o velikosti 5 bytes (3+2)

    %single_block $ff
   
    org 32768        ;1st block
    ld a,100
    ret
   
    org 33000    ;2nd block
    xor a
    ret

Result: 1 blok o velikosti 234 bytes ($8003 - $80e7 nastaveny na $FF)

%SPLIT_BLOCKS
Direktiva ORG vytvoří nový blok

%MERGE_BLOCKS
Direktiva ORG nevytvoří nový blok, kód bude navazovat na předchozí, bude však adresován dle hodnoty ORG

%PREPROC, %POSTPROC
Direktivy pro kompilaci TRAP RAM

%EXPORT
Exportuje návěstí do debuggeru

%ENTRY, %PAGE, %BREAK
Tyto direktivy mají efekt pouze při kompilaci do paměti debuggeru

    %ENTRY
    Definuje vstupní bod pro spuštění funkcí Sestavit a spustit

    %BREAK
    Vloží Breakpoint

    %PAGE n
    Nastavení paměťové stránky n (0-7) pro 128K





  reSpectrum ©2019-2023 Milan "mYdloch" Kremel  respectrum@email.cz, aktualizace 18.12.2023