#!/bin/sh
NUMBER=64
if [ "$1" -gt 0 ]; then
	NUMBER=$1
fi
echo '//                              -*- Mode: C++ -*-'
echo '//'
echo '// uC++ Version 5.4.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 {'
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("pushal");				// save application state'
	echo '    asm("pushf");'
	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("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->processBP = false;'
	echo '                    return;'
	echo '                }'
	echo '            }'
	echo '        }'
	echo '        U_THIS_TASK->processBP = 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=`expr $i + 1`
done
