
#
# Postprozessor fuer von pgcc erzeugte .s-Dateien
#
# Emuliert eine einfache Startup-Routine, in der Platz fuer den Stack
# jedes Prozessors allokiert wird.
# Initialisierungen von Variablen werden nicht ausgefuehrt !!!
#
# Aufrufsyntax:
#
#	pgccpost <stacksize> 
#
# Der Postprozessor liest von stdin und schreibt nach stdout.
#
# Der Teil des Postprozessors bis zum "bsrg r2, _main" muss von allen
# Prozessoren synchron ausgefuehrt werden !
#

echo ".section \".ggdata\", .data"
echo "__stopbarrier: .byte 0"
echo
echo ".section \".text\", .text"
echo
echo "# Prozessoren zaehlen"
echo
echo "	gethi __stopbarrier, r4"
echo "	add r4,(__stopbarrier)&0x1fff, r4"
echo "	getlo 0, r5"
echo "	stg r5, r4, 0"
echo "	getlo 1, r5"
echo "	syncadd r5, r4, 0"
echo
echo "# Stackanfang allokieren und SP setzen"
echo
echo "	gethi __stack, r4"
echo "	add r4,(__stack)&0x1fff, r4"
echo "	stg r4, r4, 0"
echo "	getlo $1, r2"
echo "	mpadd r4, 0, r2"
echo "	nop"
echo
echo "# los geht's"
echo
echo "	bsrg r2, _main"
echo
echo "# auf letzten Prozessor warten"
echo
echo "	gethi __stopbarrier, r4"
echo "	add r4,(__stopbarrier)&0x1fff,r4"
echo "	getlo -1, r5"
echo "	mpadd r4, 0, r5"
echo "	getlo 1, r4"
echo "	sub r5, r4, r0"
echo
echo "# nichtletzter Proz. -> gehe in Endlosschleife"
echo
echo "	bne 0"
echo
echo "# letzter Proz. -> springe zu einem Illegal Opcode"
echo "# (dort stoppt der Simulator dann !!!"
echo
echo "	bra __stop"
echo

cat

echo
echo ".section \".text\", .text"
echo "___main:"
echo "	bmc 0"
echo "	popg r2, r1"
echo "	nop"
echo "__stop:"
echo "	iop"
echo
echo ".comm __stack,1, \".ggbss\""
