#!/bin/sh
NUMBER=64
if [ "$1" -gt 0 ]; then
	NUMBER=$1
fi
echo '//                              -*- Mode: C++ -*-'
echo '//'
echo '// uC++ Version 5.4.0, Copyright (C) Martin Karsten 1995'
echo '//'
echo '// uLocalDebuggerHandler.h --'
echo '//'
echo '// Author           : Martin Karsten'
echo '//'
echo ''
echo '//###################### uLocalDebuggerHandler #########################'
echo ''
echo '// GENERATED AUTOMATICALLY => DO NOT CHANGE'
echo ''
echo '// beware about the following:'
echo '// 1) the registers l5-l7 must not be used in any bp_handler_X (check with assembler code)'
echo '// 2) for SunOS 4.1: in /usr/include/machine/trap.h:'
echo '//    #define ST_GETCC                0x20	(32)'
echo '//    #define ST_SETCC                0x21	(33)'
echo '// 3) for Solaris: in /usr/include/sys/trap.h:'
echo '//    #define ST_GETCC                0x20	(32)'
echo '//    #define ST_SETCC                0x21	(33)'
echo ''
echo 'class uLocalDebuggerHandler {'
i=0
while [ $i -lt $NUMBER ]; do
	echo '    static void bp_handler_'$i'();'
	i=`expr $i + 1`
done
echo 'public:'
echo '    uLocalDebuggerHandler() {}'
echo '};'
echo ''
i=0
while [ $i -lt $NUMBER ]; do
	echo 'void uLocalDebuggerHandler::bp_handler_'$i'() {'
	echo '    asm("or %g0,%g1,%l5");'
	echo '    asm("ta 32");'
	echo '    asm("or %g0,%g1,%l6");'
	echo '    asm("rd %y,%l7");'
#	echo '#ifdef __U_DEBUG_H__'
#	echo '    uDebugPrt( "uLocalDebuggerHandler::bp_handler_'$i' checks task 0x%p, %d, %d, %d, %d\n",'
#	echo '               U_THIS_TASK,U_THIS_TASK->processBP,U_THIS_TASK->taskDebugMask['$i' / NBBY] & ( 1 << ('$i' % NBBY) ),uKernelModule::disableInt,uKernelModule::disableIntSpin);'
#	echo '#endif // __U_DEBUG_H__'
	echo '    if ( ! U_THIS_TASK->processBP ) {'
	echo '        U_THIS_TASK->processBP = true;'
	echo '        if ( U_THIS_TASK->taskDebugMask['$i' / NBBY] & ( 1 << ('$i' % NBBY) ) ) {'
	echo '            if ( ! THREAD_GETMEM( disableInt) && ! THREAD_GETMEM( disableIntSpin) ) {'
	echo '                if ( uLocalDebugger::uLocalDebuggerInstance->breakpointHandler( '$i' ) ) {'
	echo '                    asm("add %i7,-8,%i7");'
	echo '                    asm("wr %g0,%l7,%y");'
	echo '                    asm("or %g0,%l6,%g1");'
	echo '                    asm("ta 33");'
	echo '                    asm("or %g0,%l5,%g1");'
	echo '                    U_THIS_TASK->processBP = false;'
	echo '                    return;'
	echo '                }'
	echo '            }'
	echo '        }'
	echo '        U_THIS_TASK->processBP = false;'
	echo '    }'
	echo '    asm("wr %g0,%l7,%y");'
	echo '    asm("or %g0,%l6,%g1");'
	echo '    asm("ta 33");'
	echo '    asm("or %g0,%l5,%g1");'
	echo '    asm(".global uLocalDebuggerHandler_exec_handler_'$i'");'
	echo '    asm("uLocalDebuggerHandler_exec_handler_'$i':");'
	echo '    asm("restore");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("retl");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '}'
	echo ''
	i=`expr $i + 1`
done
