.syntax unified

.set OS_ScreenMode, 0x65
.set OS_RemoveCursors, 0x36
.set OS_ReadVduVariables, 0x31
.set OS_Exit, 0x11
.set OS_ReadEscapeState, 0x2c
.set OS_ReadMonotonicTime, 0x42
.set OS_Byte, 0x06

  adr pc, thumb+1
.thumb
thumb:
  movs r0, #0
  movs r1, #13
  swi OS_ScreenMode
  swi OS_RemoveCursors
  adr.n r0, screen_address
  mov r1, r0
  swi OS_ReadVduVariables
mainloop:
  swi OS_ReadMonotonicTime
  ldr.n r3, screen_address
  movs r2, #255
yloop:
  mov r1, #320
xloop:
  push {r0-r6}
  mov r7, #2 <<19
  subs r1, r1, #160
  subs r2, r2, #128
  lsls r1, r1, #8
  lsls r2, r2, #8
  lsrs r4, r7, #1
  lsls r5, r0, #22
  eor r5, r5, r5, asr #31
  lsrs r3, r5, #11
loop:
  adds r3, r3, r1
  adds r4, r4, r2
  add r1, r1, r2, asr #7
  sub r2, r2, r1, asr #7
  adds r1, r1, #64
  eors r5, r3, r4
  adds r0, r0, #1
  lsls r6, r0, #15
  ands r5, r5, r6
  tst r5, r7
  beq loop
  lsrs r7, r5, #15
  eors r7, r7, r0
  pop {r0-r6}
  strb r7 , [r3], #1
  subs r1, r1, #1
  bne xloop
  subs r2, r2, #1
  bge yloop
  swi OS_ReadEscapeState
  bcc mainloop
  swi OS_Exit

.align 2
screen_address:
  .word 148
  .word -1
