#!/usr/bin/env tclsh source tclasm.tcl ## also look at stack_machine_cond_jump test ## we're going to write numbers from 0 to 639 at addresses h100000 to h1009FC ## and then write non-zero value at h100A00 # this will translate to 3 16-bit instructions set_sp h0FFFFC ## set up the counter # each of those 2 will translate to 1 16-bit instruction const 0 stack down ## this is the point we later jump to, address 10 tee ## compute address: counter * 4 + h100000 stack down const 4 mul const h100000 add stack up ## load computed address to im exchange_im ## save value of counter at address pointed by im swap store swap ## increase counter by 1 const 1 add ## compare value of counter to 640 tee stack down const 640 sub stack up ## loop if counter != 640 cond_jump 10 ## write hFFFFFFFF to address h100A00 (the point is to write a non-zero value ## there, but because our stack machine only knows how to write 32-bit values ## to memory, we'll write to h100A00 and h100A02, both being mapped as the ## VGA power-on register - what matters is the later write, so at least one of ## higher 16 bits of written value has to be non-zero) const -1 store@ h100A00 halt