From 152c6e15fa8809da9ac268450118811d290ab46f Mon Sep 17 00:00:00 2001 From: Thiago Auler dos Santos Date: Fri, 17 Nov 2017 20:54:19 -0200 Subject: [PATCH] start implementation for I/O in the machine --- .gitignore | 1 + .../UserInterfaceState.xcuserstate | Bin 0 -> 75537 bytes .../xcdebugger/Expressions.xcexplist | 41 ++++++++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 71 +++++++++++++ .../xcschemes/apple1.xcscheme | 93 ++++++++++++++++++ .../xcschemes/xcschememanagement.plist | 22 +++++ src/6502.c | 26 ++++- src/inc/memory.h | 6 ++ src/inc/opcodes.h | 2 +- src/memory.c | 39 +++++++- src/opcodes.c | 9 +- 11 files changed, 298 insertions(+), 12 deletions(-) create mode 100644 apple1.xcodeproj/project.xcworkspace/xcuserdata/thiago.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 apple1.xcodeproj/project.xcworkspace/xcuserdata/thiago.xcuserdatad/xcdebugger/Expressions.xcexplist create mode 100644 apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcschemes/apple1.xcscheme create mode 100644 apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.gitignore b/.gitignore index b415d9c..bc3994c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ obj apple1 +.DS_Store diff --git a/apple1.xcodeproj/project.xcworkspace/xcuserdata/thiago.xcuserdatad/UserInterfaceState.xcuserstate b/apple1.xcodeproj/project.xcworkspace/xcuserdata/thiago.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..7b6f5b3da9be35a47e9e2c94a3744e58b108fb64 GIT binary patch literal 75537 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 literal 0 HcmV?d00001 diff --git a/apple1.xcodeproj/project.xcworkspace/xcuserdata/thiago.xcuserdatad/xcdebugger/Expressions.xcexplist b/apple1.xcodeproj/project.xcworkspace/xcuserdata/thiago.xcuserdatad/xcdebugger/Expressions.xcexplist new file mode 100644 index 0000000..15796f7 --- /dev/null +++ b/apple1.xcodeproj/project.xcworkspace/xcuserdata/thiago.xcuserdatad/xcdebugger/Expressions.xcexplist @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..8363e3d --- /dev/null +++ b/apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcschemes/apple1.xcscheme b/apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcschemes/apple1.xcscheme new file mode 100644 index 0000000..d0cf35f --- /dev/null +++ b/apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcschemes/apple1.xcscheme @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcschemes/xcschememanagement.plist b/apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..f3553e4 --- /dev/null +++ b/apple1.xcodeproj/xcuserdata/thiago.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + apple1.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + AFF1A1DE1FBD2A490069B921 + + primary + + + + + diff --git a/src/6502.c b/src/6502.c index 9ba0c5a..0b7a2f7 100644 --- a/src/6502.c +++ b/src/6502.c @@ -1,3 +1,5 @@ +#include + #include "inc/types.h" #include "inc/memory.h" #include "inc/opcodes.h" @@ -79,7 +81,7 @@ void execute() case BMI: return bmi(); case BNE: return bne(); case BPL: return bpl(); - case BRK: return brk(); + case BRK: return bkk(); case BVC: return bvc(); case BVS: return bvs(); case CLC: return clc(); @@ -137,6 +139,25 @@ void execute() } } +void display() +{ + //if (display_control == 0xA7) + { + // display is ready to ouptup + if (display_buffer & 0x80) + { + // outputs the buffer character + display_buffer = display_buffer & 0x7F; + printf("%c", display_buffer); + } + } +} + +void read_input() +{ + // verifies if the keyboard is being pressed... +} + void run() { while (1) @@ -144,6 +165,9 @@ void run() fetch(); decode(); execute(); + + display(); + read_input(); } } diff --git a/src/inc/memory.h b/src/inc/memory.h index fc8e90f..7b78347 100644 --- a/src/inc/memory.h +++ b/src/inc/memory.h @@ -2,8 +2,14 @@ #define _APPLE_I_MEMORY_H_ #include "types.h" + db read_byte(dw address); dw read_word(dw address); void write_mem(dw address, db data); +extern db keyboard_buffer; // 0xD010 +extern db keyboard_control; // 0xD011 +extern db display_buffer; // 0xD012 +extern db display_control; // 0xD013 + #endif diff --git a/src/inc/opcodes.h b/src/inc/opcodes.h index 3c73ac8..b6990e4 100644 --- a/src/inc/opcodes.h +++ b/src/inc/opcodes.h @@ -64,7 +64,7 @@ void bit(void); // test bits in memory with accumulator void bmi(void); // branch on result minus void bne(void); // branch on result not zero void bpl(void); // branch on result plus -void brk(void); // force break +void bkk(void); // force break void bvc(void); // branch on overflow clear void bvs(void); // branch on overflow set void clc(void); // clear carry flag diff --git a/src/memory.c b/src/memory.c index df6d515..f57f291 100644 --- a/src/memory.c +++ b/src/memory.c @@ -1,7 +1,6 @@ #include "inc/types.h" #include "inc/rom.h" #include "inc/memory.h" -#include /* @@ -33,7 +32,12 @@ */ -db ram_memory[4096]; // total memory: 4KB +db ram_memory[4096]; // total memory: 4KB + +db keyboard_buffer; // 0xD010 +db keyboard_control; // 0xD011 +db display_buffer; // 0xD012 +db display_control; // 0xD013 db read_byte(dw address) { @@ -42,6 +46,22 @@ db read_byte(dw address) // 4KB memory RAM return ram_memory[address]; } + else if (address == 0xD010) + { + return keyboard_buffer; + } + else if (address == 0xD011) + { + return keyboard_control; + } + else if (address == 0xD012) + { + return display_buffer; + } + /*else if (address == 0xD013) + { + return display_control; + }*/ else if (address >= 0xFF00 && address <= 0xFFFF) { // wozmon ROM @@ -78,11 +98,22 @@ void write_mem(dw address, db data) // 4KB memory RAM ram_memory[address] = data; } + /*else if (address == 0xD010) + { + keyboard_buffer = data; + }*/ + /*else if (address == 0xD011) + { + keyboard_control = data; + }*/ else if (address == 0xD012) { - // output character to video - printf("%c", data & 0x7F); + display_buffer = data; } + /*else if (address == 0xD013) + { + display_control = data; + }*/ // any other addressed memory will be ignored on write } diff --git a/src/opcodes.c b/src/opcodes.c index 324fd44..29bc5d7 100644 --- a/src/opcodes.c +++ b/src/opcodes.c @@ -150,9 +150,9 @@ db pull_byte() dw pull_word() { - db high = pull_byte() << 8; + db high = pull_byte(); db low = pull_byte(); - dw data = high | low; + dw data = high << 8 | low; return data; } @@ -261,7 +261,7 @@ void bpl() } } -void brk() +void bkk() { // force break I_SET; @@ -583,7 +583,6 @@ void sta() // store accumulator in memory fetch_operand(); write_mem(address, ac); - //adjustNZ(y); } void stx() @@ -591,7 +590,6 @@ void stx() // store index x in memory fetch_operand(); write_mem(address, x); - //adjustNZ(x); } void sty() @@ -599,7 +597,6 @@ void sty() // store index y in memory fetch_operand(); write_mem(address, y); - //adjustNZ(y); } void tax()