/*
Das zweite Programm
17.10.2020 www.satyria.de
*/

@NEW
.equ RPI_BASE, 0xFE000000

.equ GPIO_BASE, RPI_BASE + 0x200000

@ GPIO function select (GFSEL) registers have 3 bits per GPIO
.equ GPFSEL0, GPIO_BASE + 0x0   @GPIO select 0
.equ GPFSEL1, GPIO_BASE + 0x4   @GPIO select 1
.equ GPFSEL2, GPIO_BASE + 0x8   @GPIO select 2
.equ GPFSEL3, GPIO_BASE + 0xC   @GPIO select 3
.equ GPFSEL4, GPIO_BASE + 0x10  @GPIO select 4

@GPIO SET/CLEAR registers have 1 bit per GPIO
.equ GPSET0, GPIO_BASE + 0x1C @set0 (GPIO 0 - 31)
.equ GPSET1, GPIO_BASE + 0x20 @set1 (GPIO 32 - 63)
.equ GPCLR0, GPIO_BASE + 0x28 @clear0 (GPIO 0 - 31)
.equ GPCLR1, GPIO_BASE + 0x2C @clear1 (GPIO 32 - 63)


.section .init
.globl _start
_start:

b main

.section .text    @Anweisung an den Linker, dass jetzt Code kommt

main:             @Erzeuge das Label "main"
   mov sp,#0x8000 @Erzeuge einen Stapel von 32768 Bytes

@NEW
/*
* LED is Pin42
* on the GPFSEL4 register Bits 8-6
* 001 = GPIO Pin 42 is an output
*/

   mov r1,#1
   lsl r1,#6  /* -> 001 000 000 */

/*
* 0x10 GPFSEL4 GPIO Function Select 4
*/
 
   ldr r0,=GPFSEL4
   str r1,[r0]

/* 
* Set the 42 Bit
* 25:0 SETn (n=32..57) 0 = No effect; 1 = Set GPIO pin n.
* 42 - 32 = 10
*/

   mov r1,#1
   lsl r1,#10

MainLoop:         @Endlosschleife 

/*
* 0x2C GPCLR1 GPIO Pin Output Clear 1 
*/

   ldr r0,=GPCLR1 @LED ist aus
   str r1,[r0]

/* 
* Waiting
*/

   mov r2,#0x3F0000
wait1$:
   sub r2,#1
   cmp r2,#0
   bne wait1$

/*
* 0x20 GPSET1 GPIO Pin Output Set 1 
*/

   ldr r0,=GPSET1 @LED ist an
   str r1,[r0]

/* 
* Waiting
*/

   mov r2,#0x3F0000
wait2$:
	sub r2,#1
	cmp r2,#0
	bne wait2$

   b MainLoop
   