summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--log/log-readable.cpp68
-rw-r--r--log/rom-code-lines128
-rw-r--r--log/rom-hex-positions128
-rw-r--r--src/apple.h2
-rw-r--r--src/cpu/instructions.c2
-rw-r--r--src/debug.h58
-rw-r--r--src/interpreter.c122
-rw-r--r--src/main.c14
8 files changed, 338 insertions, 184 deletions
diff --git a/log/log-readable.cpp b/log/log-readable.cpp
new file mode 100644
index 0000000..82e263d
--- /dev/null
+++ b/log/log-readable.cpp
@@ -0,0 +1,68 @@
+// log-readable.cpp
+// A simple utility which makes the runtime log files into a more readable
+// format by adding commented code lines from wozmon.
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <map>
+
+using namespace std;
+
+int main()
+{
+ ifstream RomLine ("rom-hex-positions");
+ ifstream Code ("rom-code-lines");
+
+ map<string, string> Convert;
+
+ string x;
+ string y;
+
+ for (int i = 0; i < 128; i++)
+ {
+ getline (RomLine, x);
+ getline (Code, y, (char)0x0d);
+ if (i != 0)
+ y.erase(0,1);
+ Convert[x] = y;
+
+ cout << x << " : " << Convert[x] << endl;
+ }
+
+ RomLine.close();
+ Code.close();
+
+ ifstream Log("log.raw");
+ ofstream Output("log.new");
+
+ Output << "Time PC Label Instruction Comment\n" << endl;
+ while(!Log.eof())
+ {
+ string t;
+ // Expects time counter, and prints.
+ Log >> t;
+ Output << t;
+ // Expecting a delimiter surrounded with space.
+ Log >> t;
+ Output << " : ";
+ // Expecting program counter
+ Log >> t;
+ Output << t;
+ // If a mapping exists, print out the program counter and line code.
+ try {
+ string s = Convert[t];
+ Output << t << " : ";
+ Output << s;
+ }
+ // Otherwise, don't do anything.
+ catch (out_of_range) { }
+ // Newline
+ Output << endl;
+ }
+
+ Log.close();
+ Output.close();
+ return 0;
+}
diff --git a/log/rom-code-lines b/log/rom-code-lines
new file mode 100644
index 0000000..2ed13e6
--- /dev/null
+++ b/log/rom-code-lines
@@ -0,0 +1,128 @@
+RESET CLD Clear decimal arithmetic mode
+ CLI
+ LDY #%0111.1111 Mask for DSP data direction reg
+ STY DSP (DDR mode is assumed after reset)
+ LDA #%1010.0111 KBD and DSP control register mask
+ STA KBDCR Enable interrupts, set CA1, CB1 for
+ STA DSPCR positive edge sense/output mode.
+NOTCR CMP #BS Backspace key?
+ BEQ BACKSPACE Yes
+ CMP #ESC ESC?
+ BEQ ESCAPE Yes
+ INY Advance text index
+ BPL NEXTCHAR Auto ESC if line longer than 127
+ESCAPE LDA #PROMPT Print prompt character
+ JSR ECHO Output it.
+GETLINE LDA #CR Send CR
+ JSR ECHO
+ LDY #0+1 Start a new input line
+BACKSPACE DEY Backup text index
+ BMI GETLINE Oops, line's empty, reinitialize
+NEXTCHAR LDA KBDCR Wait for key press
+ BPL NEXTCHAR No key yet!
+ LDA KBD Load character. B7 should be '1'
+ STA IN,Y Add to text buffer
+ JSR ECHO Display character
+ CMP #CR
+ BNE NOTCR It's not CR!
+ LDY #-1 Reset text index
+ LDA #0 Default mode is XAM
+ TAX X=0
+SETSTOR ASL Leaves $7B if setting STOR mode
+SETMODE STA MODE Set mode flags
+BLSKIP INY Advance text index
+NEXTITEM LDA IN,Y Get character
+ CMP #CR
+ BEQ GETLINE We're done if it's CR!
+ CMP #"."
+ BCC BLSKIP Ignore everything below "."!
+ BEQ SETMODE Set BLOCK XAM mode ("." = $AE)
+ CMP #":"
+ BEQ SETSTOR Set STOR mode! $BA will become $7B
+ CMP #"R"
+ BEQ RUN Run the program! Forget the rest
+ STX L Clear input value (X=0)
+ STX H
+ STY YSAV Save Y for comparison
+NEXTHEX LDA IN,Y Get character for hex test
+ EOR #$B0 Map digits to 0-9
+ CMP #9+1 Is it a decimal digit?
+ BCC DIG Yes!
+ ADC #$88 Map letter "A"-"F" to $FA-FF
+ CMP #$FA Hex letter?
+ BCC NOTHEX No! Character not hex
+DIG ASL
+ ASL Hex digit to MSD of A
+ ASL
+ ASL
+ LDX #4 Shift count
+HEXSHIFT ASL Hex digit left, MSB to carry
+ ROL L Rotate into LSD
+ ROL H Rotate into MSD's
+ DEX Done 4 shifts?
+ BNE HEXSHIFT No, loop
+ INY Advance text index
+ BNE NEXTHEX Always taken
+NOTHEX CPY YSAV Was at least 1 hex digit given?
+ BEQ ESCAPE No! Ignore all, start from scratch
+ BIT MODE Test MODE byte
+ BVC NOTSTOR B6=0 is STOR, 1 is XAM or BLOCK XAM
+ LDA L LSD's of hex data
+ STA (STL,X) Store current 'store index'(X=0)
+ INC STL Increment store index.
+ BNE NEXTITEM No carry!
+ INC STH Add carry to 'store index' high
+TONEXTITEM JMP NEXTITEM Get next command item.
+RUN JMP (XAML) Run user's program
+NOTSTOR BMI XAMNEXT B7 = 0 for XAM, 1 for BLOCK XAM
+ LDX #2 Copy 2 bytes
+SETADR LDA L-1,X Copy hex data to
+ STA STL-1,X 'store index'
+ STA XAML-1,X and to 'XAM index'
+ DEX Next of 2 bytes
+ BNE SETADR Loop unless X = 0
+NXTPRNT BNE PRDATA NE means no address to print
+ LDA #CR Print CR first
+ JSR ECHO
+ LDA XAMH Output high-order byte of address
+ JSR PRBYTE
+ LDA XAML Output low-order byte of address
+ JSR PRBYTE
+ LDA #":" Print colon
+ JSR ECHO
+PRDATA LDA #" " Print space
+ JSR ECHO
+ LDA (XAML,X) Get data from address (X=0)
+ JSR PRBYTE Output it in hex format
+XAMNEXT STX MODE 0 -> MODE (XAM mode).
+ LDA XAML See if there's more to print
+ CMP L
+ LDA XAMH
+ SBC H
+ BCS TONEXTITEM Not less! No more data to output
+ INC XAML Increment 'examine index'
+ BNE MOD8CHK No carry!
+ INC XAMH
+MOD8CHK LDA XAML If address MOD 8 = 0 start new line
+ AND #%0000.0111
+ BPL NXTPRNT Always taken.
+PRBYTE PHA Save A for LSD
+ LSR
+ LSR
+ LSR MSD to LSD position
+ LSR
+ JSR PRHEX Output hex digit
+ PLA Restore A
+PRHEX AND #%0000.1111 Mask LSD for hex print
+ ORA #"0" Add "0"
+ CMP #"9"+1 Is it a decimal digit?
+ BCC ECHO Yes! output it
+ ADC #6 Add offset for letter A-F
+ECHO BIT DSP DA bit (B7) cleared yet?
+ BMI ECHO No! Wait for display ready
+ STA DSP Output character. Sets DA
+ RTS
+ .DA $0000 Unused, what a pity
+NMI_VEC .DA $0F00 NMI vector
+RESET_VEC .DA RESET RESET vector
+IRQ_VEC .DA $0000 IRQ vector \ No newline at end of file
diff --git a/log/rom-hex-positions b/log/rom-hex-positions
new file mode 100644
index 0000000..6d77f3a
--- /dev/null
+++ b/log/rom-hex-positions
@@ -0,0 +1,128 @@
+ff00
+ff01
+ff02
+ff04
+ff07
+ff09
+ff0c
+ff0f
+ff11
+ff13
+ff15
+ff17
+ff18
+ff1a
+ff1c
+ff1f
+ff21
+ff24
+ff26
+ff27
+ff29
+ff2c
+ff2e
+ff31
+ff34
+ff37
+ff39
+ff3b
+ff3d
+ff3f
+ff40
+ff41
+ff43
+ff44
+ff47
+ff49
+ff4b
+ff4d
+ff4f
+ff51
+ff53
+ff55
+ff57
+ff59
+ff5b
+ff5d
+ff5f
+ff62
+ff64
+ff66
+ff68
+ff6a
+ff6c
+ff6e
+ff6f
+ff70
+ff71
+ff72
+ff74
+ff75
+ff77
+ff79
+ff7a
+ff7c
+ff7d
+ff7f
+ff81
+ff83
+ff85
+ff87
+ff89
+ff8b
+ff8d
+ff8f
+ff91
+ff94
+ff97
+ff99
+ff9b
+ff9d
+ff9f
+ffa1
+ffa2
+ffa4
+ffa6
+ffa8
+ffab
+ffad
+ffb0
+ffb2
+ffb5
+ffb7
+ffba
+ffbc
+ffbf
+ffc1
+ffc4
+ffc6
+ffc8
+ffca
+ffcc
+ffce
+ffd0
+ffd2
+ffd4
+ffd6
+ffd8
+ffda
+ffdc
+ffdd
+ffde
+ffdf
+ffe0
+ffe1
+ffe4
+ffe5
+ffe7
+ffe9
+ffeb
+ffed
+ffef
+fff2
+fff4
+fff7
+fff8
+fffa
+fffc
+fffe \ No newline at end of file
diff --git a/src/apple.h b/src/apple.h
index d423074..244f1b3 100644
--- a/src/apple.h
+++ b/src/apple.h
@@ -4,7 +4,7 @@
#include <stdio.h>
#include <stdlib.h>
-#define MEMORY_SIZE 4096
+#define MEMORY_SIZE 0x0400
#define XAML 0x24
#define XAMH 0x25
diff --git a/src/cpu/instructions.c b/src/cpu/instructions.c
index da093ec..2d4fc9e 100644
--- a/src/cpu/instructions.c
+++ b/src/cpu/instructions.c
@@ -309,7 +309,7 @@ void fPLP(Addressing addr, address val){
void fJSR(Addressing addr, address val){
SetStack((PC+3) >> 8);
SetStack((PC+3) & 0x00FF);
- PC = idata.add;
+ PC = idata.add; PC -= 3;
}
void fRTS(Addressing addr, address val){
diff --git a/src/debug.h b/src/debug.h
deleted file mode 100644
index 59e3c47..0000000
--- a/src/debug.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// debug.h
-// Various functions useful for use during development.
-
-#include"stdio.h"
-#include"cpu/6502.h"
-#include"cpu/addressing.h"
-#include"cpu/core.h"
-#include"cpu/instructions.h"
-#include"cpu/table.h"
-
-
-
-// Converts a single character to hexadecimal
-int dCharToNum(char c){
- // 0x0 - 0x9
- if (c != 0x20 && (c >= 0x30 && c <= 0x39)){
- return (c - 0x30);
- }
- // 0xA - 0xF
- else if (c != 0x20 && (c >= 0x41 && c <= 0x46)){
- return (c - 0x37);
- // 0xa - 0xf
- }else if (c != 0x20 && (c >= 0x61 && c <= 0x66)){
- return (c - 0x57);
- // Invalid
- }else{
- return -1;
- }
-}
-
-// Dump page m from memory to stdout.
-void dPageDump(short m){
- m <<= 8;
- for(int i = 0; i < 256; i+=16){
- printf("\t");
- for(int j = 0; j < 16; j+=1){
- if ((j+1) % 4 == 0){
- printf("%02x ", GetMemory((m+(i+j))));
- }
- else {
- printf("%02x ", GetMemory((m+(i+j))));
- }
- }
- printf("\n");
- }
-}
-
-// Dump CPU values
-void dStatusDump(void){
-printf("\
-\t..acc:\t%x\tcycles:\t%d\n\
-\t....X:\t%x\tlength:\t%d\n\
-\t....Y:\t%x\t...add:\t%x\n\
-\tstack:\t%x\t.value:\t%x\n\
-\tflags:\t%x\t....PC:\t%x\n\
-\n\
-", acc, idata.cycles, X, idata.length, Y, idata.add, S, idata.value, P, PC);
-}
diff --git a/src/interpreter.c b/src/interpreter.c
deleted file mode 100644
index 6dc7178..0000000
--- a/src/interpreter.c
+++ /dev/null
@@ -1,122 +0,0 @@
-// 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);
- }
-
-}
diff --git a/src/main.c b/src/main.c
index 46e6ba5..f4ddf1b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -3,6 +3,8 @@
#include <ncurses.h>
#include <unistd.h>
+
+
int main() {
@@ -10,11 +12,19 @@ int main() {
DisplayInit();
+ FILE *Log = fopen("log/log.raw", "w+");
+ int Time = 0;
+
while(1) {
+ // Logging
+ fprintf(Log, "%04x : %04x\n", Time, PC);
+ fflush(Log);
+ // Computing
CallInstructionTable(GetMemory(PC), 0);
+ // Display information
PrintInfo();
- //sleep(3);
- //getch();
+ // Logging
+ Time++;
}
DisplayClose();