#!/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) Jun Shih 1995'
echo '//'
echo '// uLocalDebuggerHandler.h --'
echo '//'
echo '// Author           : Jun Shih'
echo '//'
echo ''
echo '//###################### uLocalDebuggerHandler #########################'
echo ''
echo '// generated automatically => do not change'
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("pushal");				// save application state'
	echo '    asm("pushf");'
	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("subl $5,4(%ebp)");	// adjust return address '
	echo '                    asm("movl %ebp,%esp"); // restore application state '
	echo '                    asm("subl $36,%esp");'
	echo '                    asm("popf");'
	echo '                    asm("popal");'
	echo '                    U_THIS_TASK->uProcessBP = false;'
	echo '                    return;'
	echo '                }'
	echo '            }'
	echo '        }'
	echo '        U_THIS_TASK->uProcessBP = false;'
	echo '    }'
	echo '    asm("movl %ebp,%esp");		// restore application state'
	echo '    asm("subl $36,%esp");'
	echo '    asm("popf");'
	echo '    asm("popal");'
	echo '    asm("movl %ebp,%esp");		// redo function save'
	echo '    asm("popl %ebp");'
	echo '    asm("addl $4, %esp");			// skip eip'
	echo '    asm(".global uLocalDebuggerHandler_exec_handler_'$i'");'
	echo '    asm("uLocalDebuggerHandler_exec_handler_'$i':");'
	echo '    // 34 nops'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '    asm("nop");'
	echo '}'
	echo ''
	@ i+=1
end
