summaryrefslogtreecommitdiff
path: root/src/interpreter.c
blob: 6dc71785a73f2de9ebb6975538c99fc9b932bf01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//  interpreter.c
//  Useful for carrying out tests of the CPU instructions.
//  Refer to interpreter.md for the manual

#include"apple.h"
#include"debug.h"

//Write a custom getc function here which ignores spaces


int main(int argc, char *argv[]){
    AppleOn();

    byte c;

    // Interpreter loop
    while(1){

        //  Retrieve first character of a line
        do {
            c = getc(stdin);
        } while (c == '\n' || c == ' ' || c == '\t');

        //  The following are special debug commands.

        //  Quit program
        if (c == 'Q' || c == 'q'){
            break;
        }

        if (c == 'R' || c == 'r'){
            AppleReset(); //need to flesh out this function
            continue;
        }

        //  Dump processor status
        if (c == 'P' || c == 'p'){
            dStatusDump();
            continue;
        }

        // FIXME!!! PAGE IS CLAMPED TO 00 ON THE LONG MODE
        //  Dump a page of memory
        if (c == 'M' || c == 'm'){
            address x = 0;
            do {
                c = getc(stdin);
            } while(c == ' ' || c == '\n');
            x = dCharToNum(c) << 4;
            x += dCharToNum(getc(stdin));
            c = getc(stdin);
            if (c != '\n'){
                x <<= 8;
                x += dCharToNum(c) << 4;
                x += dCharToNum(getc(stdin));
                printf("@%04x:%02x\n", x, GetMemory(x));
            }
            else{
                printf("Page %02x", x);
                dPageDump(x);
            }
            continue;
        }

        //  Print out a statement
        if (c == '/'){  
            do {
                c = getc(stdin);
                printf("%c", c);
            } while(c != '\n');
            continue;
        }

        //  Comment, so ignores until newline.
        if (c == '#'){
            do {
                c = getc(stdin);
            } while(c != '\n');
            continue;
        }

        if (c == 'S' || c == 's'){
            address x = 0;
            byte y = 0;

            for(int i = 3; i >= 0; i--){
                x += (dCharToNum(getc(stdin)) << (4*i));
            }

            c = getc(stdin);
            if (c != '.'){
                printf("Error assigning memory to 0x%x\n", x);
                break;
            }

            for(int i = 1; i >= 0; i--){
                y += (dCharToNum(getc(stdin)) << (4*i));
            }
            Memory[x] = y;
            continue;
        }

        //  From here on it is expected input will be an instruction
        c = dCharToNum(c) << 4;
        c += dCharToNum(getc(stdin));
        address x = 0x0000;
        char z = 0x00;
        for(int i = ((getInstructionLength(c) * 2) - 2); i > 0; i--) {
            do {
                z = getc(stdin);
            } while (z == ' ' || z == '\t');

            //if (z != '\n'){
            x += dCharToNum(z) << ((4 * (i - 1)));
            /*}else{
                i++;
            }*/
        }
        CallInstructionTable(c, x);
    }

}