diff --git a/apple1.xcodeproj/project.pbxproj b/apple1.xcodeproj/project.pbxproj new file mode 100644 index 0000000..9580f80 --- /dev/null +++ b/apple1.xcodeproj/project.pbxproj @@ -0,0 +1,280 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + AFF1A1EE1FBD2A9C0069B921 /* 6502.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF1A1E91FBD2A9B0069B921 /* 6502.c */; }; + AFF1A1EF1FBD2A9C0069B921 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF1A1EA1FBD2A9B0069B921 /* main.c */; }; + AFF1A1F01FBD2A9C0069B921 /* memory.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF1A1EB1FBD2A9C0069B921 /* memory.c */; }; + AFF1A1F11FBD2A9C0069B921 /* opcodes.c in Sources */ = {isa = PBXBuildFile; fileRef = AFF1A1ED1FBD2A9C0069B921 /* opcodes.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + AFF1A1DD1FBD2A490069B921 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + AFF1A1DF1FBD2A490069B921 /* apple1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = apple1; sourceTree = BUILT_PRODUCTS_DIR; }; + AFF1A1E91FBD2A9B0069B921 /* 6502.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = 6502.c; path = src/6502.c; sourceTree = ""; }; + AFF1A1EA1FBD2A9B0069B921 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = main.c; path = src/main.c; sourceTree = ""; }; + AFF1A1EB1FBD2A9C0069B921 /* memory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = memory.c; path = src/memory.c; sourceTree = ""; }; + AFF1A1EC1FBD2A9C0069B921 /* inc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = inc; path = src/inc; sourceTree = ""; }; + AFF1A1ED1FBD2A9C0069B921 /* opcodes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = opcodes.c; path = src/opcodes.c; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + AFF1A1DC1FBD2A490069B921 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + AFF1A1D61FBD2A490069B921 = { + isa = PBXGroup; + children = ( + AFF1A1E91FBD2A9B0069B921 /* 6502.c */, + AFF1A1EC1FBD2A9C0069B921 /* inc */, + AFF1A1EA1FBD2A9B0069B921 /* main.c */, + AFF1A1EB1FBD2A9C0069B921 /* memory.c */, + AFF1A1ED1FBD2A9C0069B921 /* opcodes.c */, + AFF1A1E01FBD2A490069B921 /* Products */, + ); + sourceTree = ""; + }; + AFF1A1E01FBD2A490069B921 /* Products */ = { + isa = PBXGroup; + children = ( + AFF1A1DF1FBD2A490069B921 /* apple1 */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + AFF1A1DE1FBD2A490069B921 /* apple1 */ = { + isa = PBXNativeTarget; + buildConfigurationList = AFF1A1E61FBD2A490069B921 /* Build configuration list for PBXNativeTarget "apple1" */; + buildPhases = ( + AFF1A1DB1FBD2A490069B921 /* Sources */, + AFF1A1DC1FBD2A490069B921 /* Frameworks */, + AFF1A1DD1FBD2A490069B921 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = apple1; + productName = apple1; + productReference = AFF1A1DF1FBD2A490069B921 /* apple1 */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + AFF1A1D71FBD2A490069B921 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0910; + ORGANIZATIONNAME = "Thiago Auler dos Santos"; + TargetAttributes = { + AFF1A1DE1FBD2A490069B921 = { + CreatedOnToolsVersion = 9.1; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = AFF1A1DA1FBD2A490069B921 /* Build configuration list for PBXProject "apple1" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = AFF1A1D61FBD2A490069B921; + productRefGroup = AFF1A1E01FBD2A490069B921 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + AFF1A1DE1FBD2A490069B921 /* apple1 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + AFF1A1DB1FBD2A490069B921 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AFF1A1EE1FBD2A9C0069B921 /* 6502.c in Sources */, + AFF1A1F11FBD2A9C0069B921 /* opcodes.c in Sources */, + AFF1A1F01FBD2A9C0069B921 /* memory.c in Sources */, + AFF1A1EF1FBD2A9C0069B921 /* main.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + AFF1A1E41FBD2A490069B921 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + AFF1A1E51FBD2A490069B921 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + AFF1A1E71FBD2A490069B921 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = MKA3BYM4R9; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + AFF1A1E81FBD2A490069B921 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = MKA3BYM4R9; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + AFF1A1DA1FBD2A490069B921 /* Build configuration list for PBXProject "apple1" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AFF1A1E41FBD2A490069B921 /* Debug */, + AFF1A1E51FBD2A490069B921 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AFF1A1E61FBD2A490069B921 /* Build configuration list for PBXNativeTarget "apple1" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AFF1A1E71FBD2A490069B921 /* Debug */, + AFF1A1E81FBD2A490069B921 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = AFF1A1D71FBD2A490069B921 /* Project object */; +} diff --git a/apple1.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/apple1.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..151b9a6 --- /dev/null +++ b/apple1.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/src/inc/6502.h b/src/inc/6502.h index 9ebeba1..915ae91 100644 --- a/src/inc/6502.h +++ b/src/inc/6502.h @@ -1,7 +1,7 @@ #ifndef _APPLE_I_6502_H_ #define _APPLE_I_6502_H_ -void init(); -void run(); +void init(void); +void run(void); #endif diff --git a/src/inc/memory.h b/src/inc/memory.h index 9bd623b..fc8e90f 100644 --- a/src/inc/memory.h +++ b/src/inc/memory.h @@ -2,7 +2,6 @@ #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); diff --git a/src/inc/opcodes.h b/src/inc/opcodes.h index 9f832e6..67a5962 100644 --- a/src/inc/opcodes.h +++ b/src/inc/opcodes.h @@ -3,13 +3,13 @@ #include "types.h" -dw pc; // program counter -db ac; // accumulator -db x; // x register -db y; // y register -db sp; // stack pointer -db sr; // status register -db ir; // instruction register +extern dw pc; // program counter +extern db ac; // accumulator +extern db x; // x register +extern db y; // y register +extern db sp; // stack pointer +extern db sr; // status register +extern db ir; // instruction register enum opcodes_table { /// aaa00 aaa01 aaa10 @@ -51,65 +51,65 @@ typedef enum opcodes_table oct; typedef enum opcodes_list ocl; typedef enum address_mode am; -am address_mode; +extern am address_mode; -void adc(); // add memory to accumulator with carry -void and(); // and memory with accumulator -void asl(); // shift left one bit (memory or accumulator) -void bcc(); // branch on carry clear -void bcs(); // branch on carry set -void beq(); // branch on result zero -void bit(); // test bits in memory with accumulator -void bmi(); // branch on result minus -void bne(); // branch on result not zero -void bpl(); // branch on result plus -void brk(); // force break -void bvc(); // branch on overflow clear -void bvs(); // branch on overflow set -void clc(); // clear carry flag -void cld(); // clear decimal mode -void cli(); // clear interrupt disable bit -void clv(); // clear overflow flag -void cmp(); // compare memory with accumulator -void cpx(); // compare memory and index x -void cpy(); // compare memory and index y -void dec(); // decrement memory by one -void dex(); // decrement index x by one -void dey(); // decrement index y by one -void eor(); // exclusive-or memory with accumulator -void inc(); // increment memory by one -void inx(); // increment index x by one -void iny(); // increment index y by one -void jmp(); // jump to new location (indirect) -void jpa(); // jump to new location (absolute) -void jsr(); // jump to new location saving return address -void lda(); // load accumulator with memory -void ldx(); // load index x with memory -void ldy(); // load index y with memory -void lsr(); // shift one bit right (memory or accumulator) -void nop(); // no operation -void ora(); // or memory with accumulator -void pha(); // push accumulator on stack -void php(); // push processor status on stack -void pla(); // pull accumulator from stack -void plp(); // pull processor status from stack -void rol(); // rotate on bit left (memory or accumulator) -void ror(); // rotate on bit right (memory or accumulator) -void rti(); // return from interrupt -void rts(); // return from subroutine -void sbc(); // subtract memory from accumulator with borrow -void sec(); // set carry flag -void sed(); // set decimal flag -void sei(); // set interrupt disable status -void sta(); // store accumulator in memory -void stx(); // store index x in memory -void sty(); // store index y in memory -void tax(); // transfer accumulator to index x -void tay(); // transfer accumulator to index y -void tsx(); // transfer stack pointer to index x -void txa(); // transfer index x to accumulator -void txs(); // transfer index x to stack pointer -void tya(); // transfer index y to accumulator +void adc(void); // add memory to accumulator with carry +void and(void); // and memory with accumulator +void asl(void); // shift left one bit (memory or accumulator) +void bcc(void); // branch on carry clear +void bcs(void); // branch on carry set +void beq(void); // branch on result zero +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 bvc(void); // branch on overflow clear +void bvs(void); // branch on overflow set +void clc(void); // clear carry flag +void cld(void); // clear decimal mode +void cli(void); // clear interrupt disable bit +void clv(void); // clear overflow flag +void cmp(void); // compare memory with accumulator +void cpx(void); // compare memory and index x +void cpy(void); // compare memory and index y +void dec(void); // decrement memory by one +void dex(void); // decrement index x by one +void dey(void); // decrement index y by one +void eor(void); // exclusive-or memory with accumulator +void inc(void); // increment memory by one +void inx(void); // increment index x by one +void iny(void); // increment index y by one +void jmp(void); // jump to new location (indirect) +void jpa(void); // jump to new location (absolute) +void jsr(void); // jump to new location saving return address +void lda(void); // load accumulator with memory +void ldx(void); // load index x with memory +void ldy(void); // load index y with memory +void lsr(void); // shift one bit right (memory or accumulator) +void nop(void); // no operation +void ora(void); // or memory with accumulator +void pha(void); // push accumulator on stack +void php(void); // push processor status on stack +void pla(void); // pull accumulator from stack +void plp(void); // pull processor status from stack +void rol(void); // rotate on bit left (memory or accumulator) +void ror(void); // rotate on bit right (memory or accumulator) +void rti(void); // return from interrupt +void rts(void); // return from subroutine +void sbc(void); // subtract memory from accumulator with borrow +void sec(void); // set carry flag +void sed(void); // set decimal flag +void sei(void); // set interrupt disable status +void sta(void); // store accumulator in memory +void stx(void); // store index x in memory +void sty(void); // store index y in memory +void tax(void); // transfer accumulator to index x +void tay(void); // transfer accumulator to index y +void tsx(void); // transfer stack pointer to index x +void txa(void); // transfer index x to accumulator +void txs(void); // transfer index x to stack pointer +void tya(void); // transfer index y to accumulator #define N_IS_SET (sr & 0b10000000) // negative #define N_SET sr = sr | 0b10000000 diff --git a/src/opcodes.c b/src/opcodes.c index e06b578..32b44cd 100644 --- a/src/opcodes.c +++ b/src/opcodes.c @@ -1,6 +1,16 @@ #include "inc/opcodes.h" #include "inc/memory.h" +dw pc; // program counter +db ac; // accumulator +db x; // x register +db y; // y register +db sp; // stack pointer +db sr; // status register +db ir; // instruction register + +am address_mode; + dw address; db operand;