BERRYLANG.PRG - source to WASM
Berrylang 1.0: everything is an i32 and I'm sure that's fine. Builtins: peek8/16/32, poke8/16/32, rand(). Export init() and frame().
Ready to compile. No linker was harmed.
HARDWARE MANUAL
$00000 64K RAM / stack
$10000 32000 Framebuffer 320x200 4bpp (hi nibble=left px)
$17D00 32 Palette 16 x u16 big-endian $0RGB (0-15)
bit15 set = 1024-colour mode:
low 10 bits rrrggggbbb (3/4/3 bits)
$17D20 8 Mouse x u16, y u16, buttons u8, wheel i8
$17D28 32 Key-down bitmap (256 ST scancodes)
$17D48 16 Key ring: head u8, tail u8, codes[14]
$17D60 16 AY port: count u8, then (reg,val) pairs
up to 7 pairs/frame. Regs 0-13:
0-5 tone fine/coarse A,B,C 6 noise
7 mixer (0=on; b0-2 tone b3-5 noise)
8-10 vol (bit4/5 = envelope)
11-12 env period 13 env shape
F = 1773500/(16*TP)
$17D70 16 FDC: cmd(1=rd,2=wr) trk sec side status
($74? no: status @$17D74? see below)
$70 cmd $71 trk $72 sec(1-based) $73 side
$74 status(1 done,FF err) $78 DMA u32
$17D80 4 VBL frame counter u32
$17D84 4 RTC unix seconds u32
$17D88 8 RTC sec,min,hour,day,month,wday,year u16
$17E00 448 Char ROM: chars $20-$FF, u16 each, 3x5
5 octal rows top->bottom, bit2 = left px
bit15 = descender (draw 1px lower)
$80-$8F mosaics, $90-$9F lines, $A0+ Latin-1
$20000+ Heap
Exports: init(), frame() @50Hz
Imports (optional): env.memory, env.log(ptr,len),
env.rand(), env.floppy_read(lba,dst),
env.floppy_write(lba,src), env.exec(ptr,len)
Berrylang: fdread(lba,dst) fdwrite(lba,src) exec(ptr,len)
.JAM Berry executable format
+0 "JAM" $1A magic
+4 u32 WASM length
+8 ... WASM module
Double-click a .JAM in the desktop to run it.