00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "stack.h"
00018
00019
00020 void stackPush(Stack *stack, long data) {
00021 if(stack->flags & STACK_EXPAND_UP) {
00022 *(long *)(stack->base - (4*stack->pointer++)) = data;
00023 }
00024 else {
00025 *(long *)(stack->base + (4*stack->pointer++)) = data;
00026 }
00027 }
00028
00029
00030 long stackPop(Stack *stack) {
00031 if(stack->flags & STACK_EXPAND_UP) {
00032 return *(long *)(stack->base - (4*--stack->pointer));
00033 }
00034 else {
00035 return *(long *)(stack->base + (4*--stack->pointer));
00036 }
00037 }
00038
00039
00040 long stackPeek(Stack *stack, long offset) {
00041 if(stack->flags & STACK_EXPAND_UP) {
00042 return *(long *)(stack->base - (4*offset));
00043 }
00044 else {
00045 return *(long *)(stack->base + (4*offset));
00046 }
00047 }
00048
00049
00050 void stackPoke(Stack *stack, long offset, long data) {
00051 if(stack->flags & STACK_EXPAND_UP) {
00052 *(long *)(stack->base - (4*offset)) = data;
00053 }
00054 else {
00055 *(long *)(stack->base + (4*offset)) = data;
00056 }
00057 }
00058
00059
00060 void stackRemove(Stack *stack, long offset, long count) {
00061 long src, dst, tot;
00062
00063 debugEnter("stackRemove", "0x%8x, %d, %d", stack, offset, count);
00064
00065
00066 if(count >= stack->pointer) {
00067 consoleOut("stackRemove > stack->pointer\n");
00068 return;
00069 }
00070
00071
00072
00073 if(offset == stack->pointer-1) {
00074 consoleOut("stackRemove, stack->pointer == 1\n");
00075 stack->pointer -= count;
00076 return;
00077 }
00078
00079
00080
00081 if(stack->flags & STACK_EXPAND_UP) {
00082 src = stack->base - (4 * (stack->pointer - 1) );
00083 dst = src + (4 * count);
00084 tot = (stack->base - (4 * offset)) - src;
00085 } else {
00086 src = stack->base + (4 * (stack->pointer - 1) );
00087 dst = src - (4 * count);
00088 tot = src - (stack->base + (4 * offset));
00089 }
00090
00091
00092 stack->pointer -= count;
00093
00094
00095
00096 memcpy(dst, src, tot);
00097
00098 debugLeave("stackRemove", 0, 0);
00099 }
00100
00101 void stackDisplay(Stack *stack) {
00102 long i;
00103
00104 for(i = 0; i < stack->pointer; i++) {
00105 consoleOut("%3d: 0x%8x\n", i, stackPeek(stack, i));
00106 }
00107 }
00108
00109
00110
00111
00112
00113