2026-02-19, 10:54 AM
well I changed the sjasmplus linker to attempt to run a short piece of ASM from $8000 and I set the SP to $BEEF and I can see in zesarux that the SP in indeed $BEEF so.... we know that my project.nex is making it to be started but for some reason zesarux is stubbornly doing two things... 1) holding on to speccy ROM 2) but more tellingly zesarux is not executing my code at $8000 whose job is this :
named: load.bas
here's my build script named "build.ps1" :
here's my sjasmplus linker named "project.cfg"
here's my zesarux.cfg file :
so I still cannot fathom a way to get the speccy ROM out of the way :/
named: load.bas
Code:
Asm
org $8000
di
ld a, 2 ; red color
out ($fe), a ; set border
.loop:
jr .loop ; stay here forever
ld bc, $243b ; select the rom lock register (nextreg $8f)
ld a, $8f ; rom lock register
out (c), a
inc b
ld a, 0 ; value 0: unlock and map ram
out (c), a
ld bc, $243b ; select the write enable register (nextreg $8e)
ld a, $8e ; write control register
out (c), a
inc b
ld a, 3 ; write 3 to allow writing to the new ram in slots 0 and 1
out (c), a
ld bc, $243b ; force page 50 into slot 0 to be absolutely certain
ld a, $50 ; mmu slot 0 register
out (c), a
inc b
ld a, 50 ; page 50
out (c), a
jp $0000 ; jump to your actual core logic
End Asmhere's my build script named "build.ps1" :
Code:
$ErrorActionPreference = 'Stop'
Function Abort {
Param( [string]$Text )
Write-Error $Text
Break Script
}
$Compiler = 'D:\zxnext\boriel\zxbc.py'
$Assembler = 'D:\zxnext\sjasmplus\sjasmplus.exe'
$Emulator = 'D:\zxnext\zesarux\zesarux.exe'
$SDCard = 'D:\zxnext\projects\demo\sdcard.mmc'
python $Compiler --version
Write-Host '...compiling to ASM: load' -ForegroundColor DarkYellow
python $Compiler load.bas -f asm -o load.asm --org 32768 --headerless --explicit --strict --zxnext -i --arch zxnext --opt-strategy size --heap-address 40000 --heap-size 400
$Status = $LastExitCode
If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
Write-Host '...compiling to bin: load' -ForegroundColor DarkYellow
python $Compiler load.bas -f bin -o load.bin --org 32768 --headerless --explicit --strict --zxnext -i --arch zxnext --opt-strategy size --heap-address 40000 --heap-size 400 -M load.map
$Status = $LastExitCode
If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
# compile the core engine, this sits at address 0 and contains the IM1 interrupt vector...
# ...help says this: headerless mode: omit ASM prologue and epilogue
# ...I have no idea as yet whether I need either or neither or both...
Write-Host '...compiling to ASM: core' -ForegroundColor DarkYellow
python $Compiler core.bas -f asm -o core.asm --org 0 -W140 -W160 --headerless --explicit --strict --zxnext -i --arch zxnext --opt-strategy size --heap-address 16000 --heap-size 383
$Status = $LastExitCode
If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
Write-Host '...compiling to bin: core' -ForegroundColor DarkYellow
python $Compiler core.bas -f bin -o core.bin --org 0 -W140 -W160 --headerless --explicit --strict --zxnext -i --arch zxnext --opt-strategy size --heap-address 16000 --heap-size 383 -M core.map
$Status = $LastExitCode
If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
# compile the paged stage modules, these all target the MMU3 slot at $6000 (24576)...
$Stages = @( 'init', 'left', 'right' )
ForEach ( $Stage In $Stages ) {
$Name = "stage-$($Stage)"
Write-Host "...compiling to ASM: $Name" -ForegroundColor DarkYellow
python $Compiler "$($Name).bas" -f asm -o "$($Name).asm" --org 24576 -W150 --headerless --explicit --strict --zxnext -i --arch zxnext --opt-strategy size --heap-address 32000 --heap-size 767
$Status = $LastExitCode
If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
Write-Host "...compiling to ASM: $Name" -ForegroundColor DarkYellow
python $Compiler "$($Name).bas" -f bin -o "$($Name).bin" --org 24576 -W150 --headerless --explicit --strict --zxnext -i --arch zxnext --opt-strategy size --heap-address 32000 --heap-size 767 -M "$($Name).map"
$Status = $LastExitCode
If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
}
# stitch everything together with sjasmplus...
Write-Host '...assembling nex file...' -ForegroundColor DarkYellow
& $Assembler project.cfg --nologo --msg=all --lst=project.lst --lstlab
$Status = $LastExitCode
If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
$CoreFile = Get-Item "core.bin"
$CoreSize = [math]::Round( ( $CoreFile.Length / 16384 ) * 100, 2 )
Write-Host "...core size: $( $CoreFile.Length) bytes ($CoreSize% of 16KB)" -ForegroundColor Cyan
# ...clean up intermediate bin files to keep the project tidy
# ...Remove-Item core.bin, stage-init.bin, stage-left.bin, stage-right.bin
$FileName = "project.nex"
$FileBytes = [System.Text.Encoding]::ASCII.GetBytes($FileName)
# the line length is the filename + 4 bytes (for the token, two quotes, and the CR)
$LineLength = $FileBytes.Count + 4
$Header = [byte[]](
0x00, 0x0A, # line number 10
$LineLength, 0x00, # length of the line in bytes
0x00, # dummy byte
0xEF, # LOAD token
0x22 # opening quote (")
)
$Footer = [byte[]](
0x22, # closing quote (")
0x0D # carriage return
)
# combine everything into one array
$FinalBytes = $Header + $FileBytes + $Footer
$AutoExec = Join-Path -Path $PWD -ChildPath "autoexec.bas"
[System.IO.File]::WriteAllBytes( $AutoExec, $FinalBytes )
# use hdfmonkey to swap it onto the mmc
.\hdfmonkey.exe rm .\tbblue.mmc autoexec.dot
.\hdfmonkey.exe put .\tbblue.mmc autoexec.bas
Write-Host '...hdfmonkey rm...' -ForegroundColor DarkYellow
.\hdfmonkey.exe rm tbblue.mmc project.nex /project.nex
$Status = $LastExitCode
# If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
Write-Host '...hdfmonkey ls...' -ForegroundColor DarkYellow
.\hdfmonkey.exe ls tbblue.mmc | Select-String 'project'
$Status = $LastExitCode
If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
Write-Host '...hdfmonkey put...' -ForegroundColor DarkYellow
.\hdfmonkey.exe put tbblue.mmc project.nex /project.nex
$Status = $LastExitCode
If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
Write-Host '...hdfmonkey ls...' -ForegroundColor DarkYellow
.\hdfmonkey.exe ls tbblue.mmc | Select-String 'project'
$Status = $LastExitCode
If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
Write-Host "...launching emulator..." -ForegroundColor DarkYellow
& $Emulator --configfile zesarux.cfg
$Status = $LastExitCode
If ( $Status -ne 0 ) { Abort "...failed, status: $Status" }
Break Scripthere's my sjasmplus linker named "project.cfg"
Code:
DEVICE ZXSPECTRUMNEXT
SAVENEX OPEN "project.nex", $8000, $BEEF, 54
SAVENEX CFG 0, 0, 0, 1
ORG $0000 : MMU 0, 50, $0000
ORG $2000 : MMU 1, 51, $2000
ORG $4000 : MMU 2, 52, $4000
ORG $6000 : MMU 3, 53, $6000
ORG $8000 : MMU 4, 54, $8000
ORG $A000 : MMU 5, 55, $A000
ORG $C000 : MMU 6, 56, $C000
ORG $E000 : MMU 7, 57, $E000
ORG $8000 : MMU 4, 54, $8000 : INCBIN "load.bin"
ORG $0000 : MMU 0, 50, $0000 : INCBIN "core.bin"
ORG $C000 : MMU 6, 56, $C000 : INCBIN "fon-056.fon"
ORG $6000 : MMU 3, 60, $6000 : INCBIN "stage-init.bin"
ORG $6000 : MMU 3, 68, $6000 : INCBIN "stage-left.bin"
ORG $6000 : MMU 3, 69, $6000 : INCBIN "stage-right.bin"
; move the address counter back to where the loader is
ORG $8000 : MMU 4, 54, $8000
SAVENEX BANK 50
SAVENEX BANK 51
SAVENEX BANK 52
SAVENEX BANK 53
SAVENEX BANK 54
SAVENEX BANK 55
SAVENEX BANK 56
SAVENEX BANK 57
SAVENEX BANK 60
SAVENEX BANK 68
SAVENEX BANK 69
SAVENEX CLOSEhere's my zesarux.cfg file :
Code:
--machine tbblue
--set-breakpoint 1 "PC=1"
--set-breakpoint 2 "PC=8000"
--set-breakpoint 3 "PC=8001"
--set-breakpointaction 1 ""
--set-breakpointaction 2 ""
--set-breakpointaction 3 ""
--enable-breakpoints
--nowelcomemessage
--quickexit
--no-saveconf-on-exit
--zoomx 1
--zoomy 1
--mmc-file tbblue.mmc
--enable-mmc
--enable-divmmc-ports
--realvideo
--smartloadpath project.nexso I still cannot fathom a way to get the speccy ROM out of the way :/

