_ _ ___ _ _ _ | || | | _ \ / \ | \/ | | __ | | / | ^ | | __ | |_||_| |_\_\ |_|_| |_||_| THE HAND ROLLED ASSEMBLY MACHINE ================================ /// assembly made fun! ///

( gif coming soon ) HRAM is a 1979-era computer simulator that lets you experience the pure joy of real assembly computer programming the simplicity of HRAM makes it ideal whether you're just learning assembly or an expert wanting a real challenge |--------------------| | | | BUY IT TODAY | | | |--------------------| price :: $10.24 usd platforms :: x64 windows 10+ version :: v100 community :: google groups ======================================== _ _ _ _ _ _ _ _ | \/ | / \ |\| | | | | / \ | | | __ | | ^ | | \ | | | | | ^ | | |_ |_||_| |_|_| |_|\| |___| |_|_| |___| ========================================

# specs

# top graphics :: 128x72, 8-bit screen colors :: red/green, 256 total memory :: 32kb, all pages exec ========================================

# overview

# top you write real, native assembly that uses real memory addresses in order to write to the screen and handle keyboard/mouse input your code is a signal handler function with signature void signal(byte, byte) and is called on certain system events whose args are defined in signal table typically you respond to input/signals then update the screen memory and blit in order to make small fun video games ========================================

# memory table

# top ADDR SIZE PURPOSE 0x30000 4 clock (+/- 15ms) 0x30004 2 caret (col row) 0x30006 2 mouse (x y) 0x30008 8 [reserved] 0x30010 20 keys (256 bits) 0x30030 d0 c-addresses 0x30100 2400 screen[72][128] 0x32500 900 fontsheet[16x6][4x6] 0x32e00 200 [reserved] 0x33000 1000 free memory 0x34000 2000 assembly program 0x36000 2000 assembly source ========================================

# signal table

# top EVENT CL DL init 0 hram-version frame 1 delta mousemove 2 n/a mousewheel 3 delta mousedown 4 button mouseup 5 button keydown 6 keycode keyup 7 keycode ========================================

# c-addresses

# top void blit() void togglefullscreen() [rest reserved] ========================================

# recipes

# top ; set single pixel mov byte ptr [0x30101], 0xf0 ; draw mouse mov al, [0x30007] ; al = mousey mov bl, 128 ; bl = 128 mul bl ; al = al * bl add al, [0x30006] ; al = al + mousex ; al + 0x30100 = 0xf0 mov byte ptr [rax + 0x30100], 0xf0 ; call blit() sub rsp, 24 ; setup shadow stack call [0x30030] ; call *(0x30030) add rsp, 24 ; remove shadow stack [ END OF MANUAL ] ==================================== copyright (c) novo cantico llc, 2025