//----------------------------------------------
//Inversionism 2020 by Kuemmel
//----------------------------------------------
.syntax unified
//--- some often used OS routines
.set OS_NewLine, 0x03
.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
.set OS_CallASWI, 0x6f
.set VFPSupport_CreateContext, 0x58ec1
.set OS_ConvertInteger4, 0xdc
.set OS_Write0, 0x02
.set OS_Plot, 0x45
.thumb
start:
//---get vfp support context--------------------------------------
  movs r1,#32
  lsls r0,r1,#26    // reuse r1
  adds r0,r0,#3     // r0 = 0x80000003
  movs r2,#0
  movw r10,#0x8ec1
  movt r10,#0x5
  swi OS_CallASWI   // needed due to swi numner >0xff

//---init screen and get screen start address ---------------------
  movs r0,#15
  adr.n r1,mode
  swi OS_ScreenMode
  mvns r3,r2        //  -1
  movs r2,#148      // 148
  movs r0,r1        // read = write address
  stmia r1!,{r2,r3}
  swi OS_ReadVduVariables // screen address at r1
  swi OS_RemoveCursors    // remove cursor

//---init constants for colouring
  vmov.f32 s28,#4.0
  vmov.f32 s29,#8.0
  vmov.f32 s30,#2.0

//--- main intro loop --------------------------------------------
  mainloop:

  movs r5,#0                 // *** Startwert fuer Sinus-Wert
  movs r6,#512               // *** Startwert fuer Sinus-Speed, try other

  movs r7,#1600              // Schleifen-Zaehler
  sinusloop:

    movs r0,#69              // OS_Plot Code - Set Point
    rsb  r1,r7,#1600         // Schleifen-Zaehler als x-Koordinate
    asrs r2,r5,#8            // Sinuswert als y-Koordinate, das 'ASR #8'
                             // bewirkt eine Skalierung der Sinus-Amplitude
    adds r2,r2,#600          // *** centering
    swi  OS_Plot             // Set Point!

    adds r5,r5,r6            // *** naechsten Sinuswert bilden
    subs r6,r6,r5,asr#12     // *** naechsten Sinusspeed bilden, try other

    subs r7,r7,#1            // Zaehler verringern...
  bne   sinusloop

//--- escape test and exit ---------------------------------------
  swi OS_ReadEscapeState // check for ESC
  bcc mainloop
  swi OS_Exit            // exit to OS

.align 2
mode:
.string "32 C16M"        // 800x600 True colour

