Files

67 lines
1.8 KiB
NASM

; marker.asm -- loader acceptance app.
;
; Built by dwt/loader/build.sh with three separate section origins:
; .text 018C0000h (byte 0x318000)
; .data 018D0000h (byte 0x31A000)
; .bss 018D8000h (byte 0x31B000)
;
; It is the *COFF image* that the loader must place; it is never poked as a
; raw blob. The loader parses the COFF, copies .text and .data, zeroes .bss,
; and calls create_process() with the image's entry point.
;
; Evidence cells (32-bit, bit addresses; outside every app section):
; 018E0000 _start address at run time (must be 018C0000)
; 018E0020 d_magic read from .data (must be DEADBEEF)
; 018E0040 d_two read from .data (must be 12345678)
; 018E0060 b_zero read from .bss (must be 0; the harness pre-fills A5)
; 018E0080 b_counter, incremented forever (proves the child is scheduled)
;
; The harness pre-fills the whole .bss range with A5A5A5A5 before the load, so
; a zero at 018E0060 is the loader's zero-fill, not a fresh-RAM accident.
.def _start
.text
_start:
setf 16, 0, 0
setf 32, 0, 1
; Run-time address of this code: position dependence, made visible.
movi _start, a2, L
move a2, @018E0000h, 1
; Initialised .data must have been copied by the loader.
move @d_magic, a0, 1
move a0, @018E0020h, 1
move @d_two, a1, 1
move a1, @018E0040h, 1
; .bss must have been zeroed by the loader (harness pre-fills A5).
move @b_zero, a3, 1
move a3, @018E0060h, 1
; A live counter: a created process, not a one-shot jump.
sub a4, a4
loop:
addi 1, a4
move a4, @b_counter, 1
move a4, @018E0080h, 1
movi 2000h, a5, L
delay:
dsjs a5, delay
jruc loop
; Kept to leave a call in the image (and a relocation in the .obj).
.global sub
sub:
rets
.data
d_magic: .long 0DEADBEEFh
d_two: .long 012345678h
.bss b_zero, 32, 1
.bss b_counter, 32, 1
.end