_ _ ___ _ _ _ | || | | _ \ / \ | \/ | | __ | | / | ^ | | __ | |_||_| |_\_\ |_|_| |_||_| THE HAND ROLLED ASSEMBLY MACHINE ================================

HRAM is a 1970s era computer simulator you write real x64 assembly code that reads and writes raw memory to manipulate pixels in a window in response to user input events |--------------------| | | | download | | exe or zip | | | |--------------------| source :: github repo platforms :: windows 10+ 64-bit only version :: v103 community :: r/hram donate :: venmo / cashapp ======================================== _ _ _ _ _ _ _ _ | \/ | / \ |\| | | | | / \ | | | __ | | ^ | | \ | | | | | ^ | | |_ |_||_| |_|_| |_|\| |___| |_|_| |___| ========================================

# 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 quick start: 1. run hram.exe 2. open %AppData%\hsig.s 3. edit it and save changes ========================================

# 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 ========================================

# tutorial

# top (COMING SOON) [ END OF MANUAL ] ==================================== copyright (c) novo cantico llc, 2025