diff --git a/assembler.rb b/assembler.rb index c3949d9..b745edd 100644 --- a/assembler.rb +++ b/assembler.rb @@ -25,6 +25,10 @@ end # # # INSTRUCTIONS # # # + +# ops should always be in format of +# [src] [args] -> [dest] + def jmp(addr) # TODO: this probs wont show up since we have < 3mb of ram but # we can't jump to an address with a different 4 most significant bits @@ -45,7 +49,7 @@ end # load upper immediate # NOTE: val will be shifted left by 16 def lui(val, dest) - # oooooo ----- ttttt iiiiiiiiiiiiiiii + # oooooo ----- ddddd iiiiiiiiiiiiiiii op = 0b001111_00000_00000_0000000000000000 op |= 0xffff & val op |= (0b11111 & dest) << 16 @@ -68,10 +72,19 @@ def ori(src, bits, dest) op = 0b001101_00000_00000_00000000_00000000 op |= (src & 0b11111) << 21 op |= (bits & 0xffff) - op |= (dest & 0x11111) << 16 + op |= (dest & 0b11111) << 16 word op end +# store word +def sw(src, offset, dest) + # oooooo ddddd sssss iiiiiiii iiiiiiii + op = 0b101011_00000_00000_00000000_00000000 + op |= (src & 0b11111) << 16 + op |= (offset & 0xffff) + op |= (dest & 0b11111) << 21 + word op +end @@ -127,6 +140,18 @@ nop ; jmp $base_addr + 16 ; nop ; word 0xdeadbeef lui $gp0 >> 16, 1 ori 1, $gp0, 1 +nop + +#lui 0, 3 +#ori 3, 0xffff, 3 + +#sw 1, 0, 2 + +32.times do |i| + ori i, 0xf00d, i +end + + nop ; nop ; nop ; nop nop ; nop ; nop ; nop nop ; nop ; nop ; nop