#!/bin/csh
set NUMBER=64
if ( $1 > 0 ) then
	set NUMBER=$1
endif
echo '//                              -*- Mode: C++ -*-'
echo '//'
echo '// uC++ Version 4.7, 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 ( ! uKernelModule::uDisableInt && ! uKernelModule::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("'
	echo '    .global uLocalDebuggerHandler_exec_handler_'$i
	echo 'uLocalDebuggerHandler_exec_handler_'$i':'
	echo '    ");'
	echo '    // 34 nops'
	echo '    asm("'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '      nop'
	echo '    ");'
	echo '}'
	echo ''
	@ i+=1
end
