#!/bin/csh
set NUMBER=64
if ( $1 > 0 ) then
	set NUMBER=$1
endif
echo '//                              -*- Mode: C++ -*-'
echo '//'
echo '// uC++ Version 5.3.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 {'
set i=0
while ( $i < $NUMBER )
	echo '    static void bp_handler_'$i'();'
	@ i+=1
end
echo 'public:'
echo '    uLocalDebuggerHandler() {}'
echo '};'
echo ''
set i=0
while ( $i < $NUMBER )
	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->uProcessBP,U_THIS_TASK->uTaskDebugMask['$i' / NBBY] & ( 1 << ('$i' % NBBY) ),uKernelModule::uDisableInt,uKernelModule::uDisableIntSpin);'
#	echo '#endif // __U_DEBUG_H__'
	echo '    if ( ! U_THIS_TASK->uProcessBP ) {'
	echo '        U_THIS_TASK->uProcessBP = true;'
	echo '        if ( U_THIS_TASK->uTaskDebugMask['$i' / NBBY] & ( 1 << ('$i' % NBBY) ) ) {'
	echo '            if ( ! THREAD_GETMEM( uDisableInt) && ! THREAD_GETMEM( uDisableIntSpin) ) {'
	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->uProcessBP = false;'
	echo '                    return;'
	echo '                }'
	echo '            }'
	echo '        }'
	echo '        U_THIS_TASK->uProcessBP = 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+=1
end
