TARGET      BIN, R5900
           ALIGN$$     16


code       SEGMENT     1000000h
      
           addiu       sp, -128
           sd	       s0, 0(sp)
           sd          s1, 8(sp)
           sd          s2, 16(sp)
           sd          s3, 24(sp)
           sd          s4, 32(sp)
           sd          s5, 40(sp)
           sd          s6, 48(sp)
           sd          s7, 56(sp)
           sd          ra, 64(sp)

; Start code here
           jal         start
           nop

           ld          s0, 0(sp)
           ld          s1, 8(sp)
           ld          s2, 16(sp)
           ld          s3, 24(sp)
           ld          s4, 32(sp)
           ld          s5, 40(sp)
           ld          s6, 48(sp)
           ld          s7, 56(sp)
           ld          ra, 64(sp)
           addiu       sp, 128

           jr          ra
           nop
 
start      PROC
           addiu       sp, -128
           sd          ra, 0(sp)

           move        s0, a0
           lui         s1, 0x1200

           sw	       zero, 0xe0(s1)
           lw	       t0, 0(s0) ; Load printf function
           lui         a0, (hello >> 16)
           jalr        t0
           ori         a0, a0, (hello & 0xFFFF)

loop:
           ld          v0, 0x1000(s1)
           andi        v0, v0, 8
           sd          v0, 0x1000(s1)
_vsync:    
           ld          v0, 0x1000(s1)
           andi        v0, v0, 8
           beq         v0, zero, _vsync
           lw          t0, 24(s0)       ; Load the current time value

           bgtz        t0, loop         ; If we still have time left
           nop
   
           ld          ra, 0(sp)
           jr          ra
           addiu       sp, 128
           
start      ENDP

           ALIGN 16
hello:     DB "Hello World (ASM)!",0xA,0
code       ENDS

           END