NextForge: co už umí vestavěný assembler
NextForge má dnes vlastní vestavěný assembler, který běží přímo v prostředí editoru na ZX Spectrum Next. V aktuální fázi jde hlavně o syntaktický assembler a pass-1 analyzátor: prochází otevřený zdrojový soubor, kontroluje syntaxi, počítá program counter a hlásí chyby včetně řádku, sloupce, tokenu a stavu zpracování. A ano, nejel jsem na DrCon, v pauzách tedy mlátím hlavou o stůl - ale jsou věci, které neovlivním, tak snad mi to vyjde jindy.
Cílem zatím není nahradit SjASMPlus ve všem, ale dostat přímo do NextForge praktickou kontrolu assembly zdrojáku. Editor tak umí ověřit, jestli zdroj projde základní syntaxí, jak se posouvá PC, a kde přesně parser narazil na problém.
Průběh assembly přímo v editoru
Assembly report dnes ukazuje živý průběh v šestnácti krocích. Během assembly se jednotlivé body postupně zatrhávají a seznam se automaticky posouvá tak, aby byl vidět aktuální krok.
01 Select main source file
02 Save current editor state
03 Map assembler code bank
04 Read active source line count
05 Scan source lines
06 Skip comments and blank lines
07 Validate labels
08 Recognize directives
09 Recognize mnemonics
10 Check required operands
11 Reject unexpected operands
12 Reject empty operand slots
13 Check operand separators
14 Store first error location
15 Restore screen banks
16 Present result
Po dokončení report zobrazí výsledek, hodnotu PC a počet prošlých řádků. Při chybě ukáže řádek, sloupec, krok, token a další ladicí informace.
Parser řádků a operandů
Parser umí prázdné řádky, komentáře, labely, direktivy, mnemoniky a základní kontrolu operandů. Rozlišuje chybějící operand, neočekávaný operand, špatný label, unsupported direktivu, prázdný operand mezi čárkami i příliš mnoho operandů.
Důležitá je i quote-aware logika. Čárka nebo dvojtečka uvnitř uvozovek se nebere jako oddělovač operandů nebo statementů.
cp ','
db "A,B,C", 0
Podporované jsou také vícenásobné statementy na jednom řádku oddělené dvojtečkou:
nextreg NR_MMU2, BANKED_CODE_PAGE0 : nextreg NR_MMU3, BANKED_CODE_PAGE1
Podporované direktivy
Assembler rozpoznává a validuje běžné direktivy používané v projektu:
org
equ
db / defb
dw / defw
ds / defs
defm
device
mmu
savenex
emptytap
savetap
savebin
include
incbin
rept
endr
Z hlediska výpočtu PC už umí běžné datové direktivy:
org 0x8000
db 1, 2, 3
db "text", 0
defm "text"
dw label, 1234
ds 64, 0
Direktiva MMU se počítá jako 0 bajtů, protože v SjASMPlus neemituje žádný kód, jen mění mapování/adresní kontext.
include je zatím brán jako nulová direktiva bez expanze dalšího souboru. incbin je rozpoznaný, ale přesné PC bude v budoucnu vyžadovat zjištění velikosti binárního souboru z filesystému.
Symbolické DS / DEFS rezervace
Pass-1 sizing už umí i několik projektových symbolických rezervací, které by jinak výrazně rozhodily PC:
ds FILEIO_IO_BUF_SIZE, 0
ds MAX_FILES * FILE_STRUCT_SIZE, 0
ds MAX_FILES * 64, 0
ds MAX_FILES * MAX_FILE_TEXT_PAGES, 0
ds TEXT_POOL_PAGES_MAX, 0
ds EDITOR_LINE_LEN, 0
ds AUTOCOMPLETE_MAX_MATCHES * AUTOCOMPLETE_ENTRY_LEN, 0
ds MAX_FILES * 260, 0
REPT / ENDR
Podpora REPT/ENDR je zatím jednoduchá, ale praktická. Nejde ještě o plný makro engine s nestingem a komplexní substitucí, ale umí případ s jedním tělem řádku, který se v projektu skutečně používá.
screen_row_table:
REPT 32, row_idx
dw SCREEN_TILEMAP_ADDR + row_idx * SCREEN_COLS * 2
ENDR
Pass-1 změří velikost těla a přičte opakování do PC.
Z80 instrukce a velikosti
Assembler rozpoznává většinu běžných Z80 instrukcí a u mnoha z nich počítá realistickou velikost.
Základní instrukce
ld, inc, dec, add, adc, sbc, and, or, xor, cp, sub, jp, jr, djnz, call, ret, push, pop, ex, exx, nop, halt, di, ei, rst, im, in, out.
LD varianty
Podporované jsou varianty jako ld a,b, ld a,(hl), ld a,(nn), ld (nn),a, ld hl,(nn), ld (nn),hl, ld de,(nn), ld (nn),de, ld sp,hl, ld sp,ix a ld sp,iy.
Indexované adresování
Počítají se i formy přes ix/iy, například ld a,(ix+0), ld (iy+4),a, inc (ix+1), bit 0,(ix+3), set 7,(iy+1) nebo res 3,(ix+2).
Speciálně se řeší také nepřímé skoky:
jp label ; 3 bajty
jp (hl) ; 1 bajt
jp (ix) ; 2 bajty
jp (iy) ; 2 bajty
ED a blokové instrukce
Podporované jsou i ED/block instrukce, například:
ldi
ldir
ldd
lddr
cpi
cpir
cpd
cpdr
ini
inir
ind
indr
outi
otir
outd
otdr
reti
retn
neg
rld
rrd
Tyto instrukce se počítají jako dvoubajtové tam, kde tomu odpovídá skutečný strojový kód.
ZX Spectrum Next / Z80N
NextForge assembler už zná i vybrané ZX Spectrum Next a Z80N instrukce:
nextreg
mmu
brlc
bsla
bsra
bsrf
bsrl
ldix
ldirx
lddx
lddrx
ldpirx
mirror
mul
outinb
pixelad
pixeldn
setae
swapnib
test
nextreg má správné rozlišení velikosti podle druhého operandu:
nextreg register, value ; 4 bajty
nextreg register, a ; 3 bajty
Například nextreg NR_MMU5, a se skutečně emituje jako tříbajtová instrukce:
ED 92 xx
Co zatím neumí
- Zatím nemá obecný expression evaluator pro libovolné symboly a výrazy.
includezatím neotevírá další soubory a neexpanduje jejich obsah.incbinzatím neumí zjistit velikost binárního souboru.REPT/ENDRje zatím jednoduchý případ, ne plný makro systém.- Assembler zatím hlavně kontroluje syntaxi a počítá PC; generování výsledného bináru je další vývojová fáze.
Shrnutí
NextForge už má funkční vestavěný pass-1 assembler. Umí projít assembly zdroják přímo v editoru, zkontrolovat syntaxi, spočítat program counter a zobrazit živý report průběhu. Zvládá běžné Z80 instrukce, řadu ED instrukcí, vybrané ZX Spectrum Next/Z80N instrukce, datové direktivy, ORG, DB/DW/DS, jednoduchý REPT/ENDR, dvojtečkou oddělené statementy a quote-aware parsing operandů.
Není to ještě kompletní assembler ve stylu SjASMPlus :) (jemuž ale opravdu nechci a nikdy nebudu konkurovat :) ), ale už je to praktický základ pro integrovanou kontrolu assembly přímo v NextForge. A hlavně: běží přímo na stroji, pro který se ten kód píše.

