mirror of
https://github.com/thiagoauler/apple1.git
synced 2025-02-16 23:31:01 +00:00
adding all the files to the repository
This commit is contained in:
parent
8c12c46e49
commit
3444289ea9
20
build.sh
Executable file
20
build.sh
Executable file
@ -0,0 +1,20 @@
|
||||
SRC_FOLDER="src"
|
||||
OBJ_FOLDER="obj"
|
||||
EXEC_NAME="apple1"
|
||||
|
||||
# clear any previous object
|
||||
rm -rf $OBJ_FOLDER
|
||||
rm -f $EXEC_NAME
|
||||
|
||||
# build all source code
|
||||
for FILE in $SRC_FOLDER/*.c
|
||||
do
|
||||
cc -c $FILE
|
||||
done
|
||||
|
||||
# move all objects to appropriate folder
|
||||
mkdir -p $OBJ_FOLDER
|
||||
mv *.o $OBJ_FOLDER
|
||||
|
||||
# create executable out of the objects
|
||||
cc -o $EXEC_NAME $OBJ_FOLDER/*.o
|
BIN
obj/6502.o
Normal file
BIN
obj/6502.o
Normal file
Binary file not shown.
BIN
obj/main.o
Normal file
BIN
obj/main.o
Normal file
Binary file not shown.
BIN
obj/memory.o
Normal file
BIN
obj/memory.o
Normal file
Binary file not shown.
BIN
obj/opcodes.o
Normal file
BIN
obj/opcodes.o
Normal file
Binary file not shown.
176
src/6502.c
Normal file
176
src/6502.c
Normal file
@ -0,0 +1,176 @@
|
||||
#include "inc/types.h"
|
||||
#include "inc/memory.h"
|
||||
#include "inc/opcodes.h"
|
||||
|
||||
oc1 opcode_decoded_1;
|
||||
oc2 opcode_decoded_2;
|
||||
|
||||
void init()
|
||||
{
|
||||
// pc is set using 0xFFFC-0xFFFD
|
||||
mem.mar = 0xFFFD;
|
||||
mem_read();
|
||||
pc = mem.mdr << 8;
|
||||
mem.mar = 0xFFFC;
|
||||
mem_read();
|
||||
pc = mem.mdr + pc;
|
||||
}
|
||||
|
||||
void fetch()
|
||||
{
|
||||
mem.mar = pc;
|
||||
mem_read();
|
||||
ir = mem.mdr;
|
||||
pc++;
|
||||
}
|
||||
|
||||
void decode()
|
||||
{
|
||||
// instruction pattern is "aaabbbccc" where:
|
||||
// aaa cc determines the opcode
|
||||
// bbb determines the addressing mode
|
||||
|
||||
db aaa = (ir & 0b11100000) >> 5;
|
||||
db bbb = (ir & 0b00011100) >> 2;
|
||||
db cc = (ir & 0b00000011);
|
||||
|
||||
db aaacc = (aaa << 2) | cc;
|
||||
|
||||
opcode_decoded_1 = aaacc;
|
||||
opcode_decoded_2 = ir;
|
||||
}
|
||||
|
||||
void execute()
|
||||
{
|
||||
switch(opcode_decoded_2)
|
||||
{
|
||||
case BRK:
|
||||
return brk();
|
||||
case BPL:
|
||||
return bpl();
|
||||
case JSR:
|
||||
return jsr();
|
||||
case BMI:
|
||||
return bmi();
|
||||
case RTI:
|
||||
return rti();
|
||||
case BVC:
|
||||
return bvc();
|
||||
case RTS:
|
||||
return rts();
|
||||
case BVS:
|
||||
return bvs();
|
||||
case BCC:
|
||||
return bcc();
|
||||
case BCS:
|
||||
return bcs();
|
||||
case BNE:
|
||||
return bne();
|
||||
case BEQ:
|
||||
return beq();
|
||||
case PHP:
|
||||
return php();
|
||||
case CLC:
|
||||
return clc();
|
||||
case PLP:
|
||||
return plp();
|
||||
case SEC:
|
||||
return sec();
|
||||
case PHA:
|
||||
return pha();
|
||||
case CLI:
|
||||
return cli();
|
||||
case PLA:
|
||||
return pla();
|
||||
case SEI:
|
||||
return sei();
|
||||
case DEY:
|
||||
return dey();
|
||||
case TYA:
|
||||
return tya();
|
||||
case TAY:
|
||||
return tay();
|
||||
case CLV:
|
||||
return clv();
|
||||
case INY:
|
||||
return iny();
|
||||
case CLD:
|
||||
return cld();
|
||||
case INX:
|
||||
return inx();
|
||||
case SED:
|
||||
return sed();
|
||||
case TXA:
|
||||
return txa();
|
||||
case TXS:
|
||||
return txs();
|
||||
case TAX:
|
||||
return tax();
|
||||
case TSX:
|
||||
return tsx();
|
||||
case DEX:
|
||||
return dex();
|
||||
case NOP:
|
||||
return nop();
|
||||
}
|
||||
|
||||
switch (opcode_decoded_1)
|
||||
{
|
||||
case BIT:
|
||||
return bit();
|
||||
case JMP:
|
||||
return jmp();
|
||||
case JPA: // JMP (absolute)
|
||||
return jmp();
|
||||
case STY:
|
||||
return sty();
|
||||
case LDY:
|
||||
return ldy();
|
||||
case CPY:
|
||||
return cpy();
|
||||
case CPX:
|
||||
return cpx();
|
||||
case ORA:
|
||||
return ora();
|
||||
case AND:
|
||||
return and();
|
||||
case EOR:
|
||||
return eor();
|
||||
case ADC:
|
||||
return adc();
|
||||
case STA:
|
||||
return sta();
|
||||
case LDA:
|
||||
return lda();
|
||||
case CMP:
|
||||
return cmp();
|
||||
case SBC:
|
||||
return sbc();
|
||||
case ASL:
|
||||
return asl();
|
||||
case ROL:
|
||||
return rol();
|
||||
case LSR:
|
||||
return lsr();
|
||||
case ROR:
|
||||
return ror();
|
||||
case STX:
|
||||
return stx();
|
||||
case LDX:
|
||||
return ldx();
|
||||
case DEC:
|
||||
return dec();
|
||||
case INC:
|
||||
return inc();
|
||||
}
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
while (pc != 0)
|
||||
{
|
||||
fetch();
|
||||
decode();
|
||||
execute();
|
||||
}
|
||||
}
|
7
src/inc/6502.h
Normal file
7
src/inc/6502.h
Normal file
@ -0,0 +1,7 @@
|
||||
#ifndef _APPLE_I_6502_H_
|
||||
#define _APPLE_I_6502_H_
|
||||
|
||||
void init();
|
||||
void run();
|
||||
|
||||
#endif
|
11
src/inc/memory.h
Normal file
11
src/inc/memory.h
Normal file
@ -0,0 +1,11 @@
|
||||
#ifndef _APPLE_I_MEMORY_LOGIC_H_
|
||||
#define _APPLE_I_MEMORY_LOGIC_H_
|
||||
|
||||
#include "types.h"
|
||||
|
||||
mr mem; // memory "glue" logic
|
||||
|
||||
void mem_read();
|
||||
void mem_write();
|
||||
|
||||
#endif
|
142
src/inc/opcodes.h
Normal file
142
src/inc/opcodes.h
Normal file
@ -0,0 +1,142 @@
|
||||
#ifndef _APPLE_I_OPCODES_H_
|
||||
#define _APPLE_I_OPCODES_H_
|
||||
|
||||
#include "types.h"
|
||||
|
||||
dw pc; // program counter
|
||||
db ac; // accumulator
|
||||
db x; // x register
|
||||
db y; // y register
|
||||
db sp; // stack pointer
|
||||
db ir; // intruction register
|
||||
|
||||
enum opcodes
|
||||
{
|
||||
BIT = 0b00100,
|
||||
JMP = 0b01000,
|
||||
JPA = 0b01100,
|
||||
STY = 0b10000,
|
||||
LDY = 0b10100,
|
||||
CPY = 0b11000,
|
||||
CPX = 0b11100,
|
||||
|
||||
ORA = 0b00001,
|
||||
AND = 0b00101,
|
||||
EOR = 0b01001,
|
||||
ADC = 0b01101,
|
||||
STA = 0b10001,
|
||||
LDA = 0b10101,
|
||||
CMP = 0b11001,
|
||||
SBC = 0b11101,
|
||||
|
||||
ASL = 0b00010,
|
||||
ROL = 0b00110,
|
||||
LSR = 0b01010,
|
||||
ROR = 0b01110,
|
||||
STX = 0b10010,
|
||||
LDX = 0b10110,
|
||||
DEC = 0b11010,
|
||||
INC = 0b11110,
|
||||
};
|
||||
|
||||
enum opcodes_comp
|
||||
{
|
||||
BRK = 0x00,
|
||||
BPL = 0x10,
|
||||
JSR = 0x20,
|
||||
BMI = 0x30,
|
||||
RTI = 0x40,
|
||||
BVC = 0x50,
|
||||
RTS = 0x60,
|
||||
BVS = 0x70,
|
||||
BCC = 0x90,
|
||||
BCS = 0xB0,
|
||||
BNE = 0xD0,
|
||||
BEQ = 0xF0,
|
||||
|
||||
PHP = 0x08,
|
||||
CLC = 0x18,
|
||||
PLP = 0x28,
|
||||
SEC = 0x38,
|
||||
PHA = 0x48,
|
||||
CLI = 0x58,
|
||||
PLA = 0x68,
|
||||
SEI = 0x78,
|
||||
DEY = 0x88,
|
||||
TYA = 0x98,
|
||||
TAY = 0xA8,
|
||||
CLV = 0xB8,
|
||||
INY = 0xC8,
|
||||
CLD = 0xD8,
|
||||
INX = 0xE8,
|
||||
SED = 0xF8,
|
||||
|
||||
TXA = 0x8A,
|
||||
TXS = 0x9A,
|
||||
TAX = 0xAA,
|
||||
TSX = 0xBA,
|
||||
DEX = 0xCA,
|
||||
NOP = 0xEA
|
||||
};
|
||||
|
||||
typedef enum opcodes oc1;
|
||||
typedef enum opcodes_comp oc2;
|
||||
|
||||
void adc(); // add memory to accumalator with carry
|
||||
void and(); // and memory with accumulator
|
||||
void asl(); // shift left one bit (memory on 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
|
||||
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(); // retrun 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
|
||||
|
||||
#endif
|
11
src/inc/ram.h
Normal file
11
src/inc/ram.h
Normal file
@ -0,0 +1,11 @@
|
||||
#ifndef _APPLE_I_RAM_H_
|
||||
#define _APPLE_I_RAM_H_
|
||||
|
||||
#include "types.h"
|
||||
|
||||
mr ram; // random access memory
|
||||
|
||||
void ram_read();
|
||||
void ram_write();
|
||||
|
||||
#endif
|
10
src/inc/rom.h
Normal file
10
src/inc/rom.h
Normal file
@ -0,0 +1,10 @@
|
||||
#ifndef _APPLE_I_ROM_H_
|
||||
#define _APPLE_I_ROM_H_
|
||||
|
||||
#include "types.h"
|
||||
|
||||
mr rom; // read only memory
|
||||
|
||||
void rom_read();
|
||||
|
||||
#endif
|
16
src/inc/types.h
Normal file
16
src/inc/types.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef _APPLE_I_TYPES_H_
|
||||
#define _APPLE_I_TYPES_H_
|
||||
|
||||
typedef unsigned char db;
|
||||
typedef unsigned short dw;
|
||||
typedef unsigned int dd;
|
||||
|
||||
struct memory_registers
|
||||
{
|
||||
dw mar; // memory address register
|
||||
db mdr; // memory data register
|
||||
};
|
||||
|
||||
typedef struct memory_registers mr;
|
||||
|
||||
#endif
|
11
src/main.c
Normal file
11
src/main.c
Normal file
@ -0,0 +1,11 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "inc/6502.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
printf("Apple-I Computer\n");
|
||||
init();
|
||||
run();
|
||||
return 0;
|
||||
}
|
65
src/memory.c
Normal file
65
src/memory.c
Normal file
@ -0,0 +1,65 @@
|
||||
#include "inc/types.h"
|
||||
#include "inc/ram.h"
|
||||
#include "inc/rom.h"
|
||||
#include "inc/memory.h"
|
||||
|
||||
/*
|
||||
|
||||
+ - - - - +
|
||||
| 0000 |
|
||||
| |
|
||||
| |
|
||||
| RAM |
|
||||
| |
|
||||
| |
|
||||
| 0FFF |
|
||||
+ - - - - +
|
||||
| |
|
||||
|
||||
. . .
|
||||
unused
|
||||
. . .
|
||||
|
||||
| |
|
||||
+ - - - - +
|
||||
| FF00 |
|
||||
| |
|
||||
| ROM |
|
||||
| |
|
||||
| FFFF |
|
||||
+ - - - - +
|
||||
|
||||
*/
|
||||
|
||||
void mem_read()
|
||||
{
|
||||
if (mem.mar >= 0x0000 && mem.mar <= 0x0FFF)
|
||||
{
|
||||
// 4KB memory RAM
|
||||
ram.mar = mem.mar;
|
||||
ram_read();
|
||||
mem.mdr = ram.mdr;
|
||||
}
|
||||
else if (mem.mar >= 0xFF00 && mem.mar <= 0xFFFF)
|
||||
{
|
||||
// wozmon ROM
|
||||
rom.mar = mem.mar & 0x00FF;
|
||||
rom_read();
|
||||
mem.mdr = rom.mdr;
|
||||
}
|
||||
else
|
||||
{
|
||||
mem.mdr = 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
void mem_write()
|
||||
{
|
||||
if (mem.mar >= 0x0000 && mem.mar <= 0x0FFF)
|
||||
{
|
||||
// 4KB memory RAM
|
||||
ram.mar = mem.mar;
|
||||
ram.mdr = mem.mdr;
|
||||
ram_write();
|
||||
}
|
||||
}
|
339
src/opcodes.c
Normal file
339
src/opcodes.c
Normal file
@ -0,0 +1,339 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "inc/opcodes.h"
|
||||
|
||||
void adc()
|
||||
{
|
||||
// add memory to accumalator with carry
|
||||
printf("ADC\n");
|
||||
}
|
||||
|
||||
void and()
|
||||
{
|
||||
// and memory with accumulator
|
||||
printf("AND\n");
|
||||
}
|
||||
|
||||
void asl()
|
||||
{
|
||||
// shift left one bit (memory on accumulator)
|
||||
printf("ASL\n");
|
||||
}
|
||||
|
||||
void bcc()
|
||||
{
|
||||
// branch on carry clear
|
||||
printf("BCC\n");
|
||||
}
|
||||
|
||||
void bcs()
|
||||
{
|
||||
// branch on carry set
|
||||
printf("BSC\n");
|
||||
}
|
||||
|
||||
void beq()
|
||||
{
|
||||
// branch on result zero
|
||||
printf("BEQ\n");
|
||||
}
|
||||
|
||||
void bit()
|
||||
{
|
||||
// test bits in memory with accumulator
|
||||
printf("BIT\n");
|
||||
}
|
||||
|
||||
void bmi()
|
||||
{
|
||||
// branch on result minus
|
||||
printf("BMI\n");
|
||||
}
|
||||
|
||||
void bne()
|
||||
{
|
||||
// branch on result not zero
|
||||
printf("BNE\n");
|
||||
}
|
||||
|
||||
void bpl()
|
||||
{
|
||||
// branch on result plus
|
||||
printf("BPL\n");
|
||||
}
|
||||
|
||||
void brk()
|
||||
{
|
||||
// force break
|
||||
printf("BRK\n");
|
||||
}
|
||||
|
||||
void bvc()
|
||||
{
|
||||
// branch on overflow clear
|
||||
printf("BVC\n");
|
||||
}
|
||||
|
||||
void bvs()
|
||||
{
|
||||
// branch on overflow set
|
||||
printf("BVS\n");
|
||||
}
|
||||
|
||||
void clc()
|
||||
{
|
||||
// clear carry flag
|
||||
printf("CLC\n");
|
||||
}
|
||||
|
||||
void cld()
|
||||
{
|
||||
// clear decimal mode
|
||||
printf("CLD\n");
|
||||
}
|
||||
|
||||
void cli()
|
||||
{
|
||||
// clear interrupt disable bit
|
||||
printf("CLI\n");
|
||||
}
|
||||
|
||||
void clv()
|
||||
{
|
||||
// clear overflow flag
|
||||
printf("CLV\n");
|
||||
}
|
||||
|
||||
void cmp()
|
||||
{
|
||||
// compare memory with accumulator
|
||||
printf("CMP\n");
|
||||
}
|
||||
|
||||
void cpx()
|
||||
{
|
||||
// compare memory and index x
|
||||
printf("CPX\n");
|
||||
}
|
||||
|
||||
void cpy()
|
||||
{
|
||||
// compare memory and index y
|
||||
printf("CPY\n");
|
||||
}
|
||||
|
||||
void dec()
|
||||
{
|
||||
// decrement memory by one
|
||||
printf("DEC\n");
|
||||
}
|
||||
|
||||
void dex()
|
||||
{
|
||||
// decrement index x by one
|
||||
printf("DEX\n");
|
||||
}
|
||||
|
||||
void dey()
|
||||
{
|
||||
// decrement index y by one
|
||||
printf("DEY\n");
|
||||
}
|
||||
|
||||
void eor()
|
||||
{
|
||||
// exclusive-or memory with accumulator
|
||||
printf("EOR\n");
|
||||
}
|
||||
|
||||
void inc()
|
||||
{
|
||||
// increment memory by one
|
||||
printf("INC\n");
|
||||
}
|
||||
|
||||
void inx()
|
||||
{
|
||||
// increment index x by one
|
||||
printf("INX\n");
|
||||
}
|
||||
|
||||
void iny()
|
||||
{
|
||||
// increment index y by one
|
||||
printf("INY\n");
|
||||
}
|
||||
|
||||
void jmp()
|
||||
{
|
||||
// jump to new location
|
||||
printf("JMP\n");
|
||||
}
|
||||
|
||||
void jsr()
|
||||
{
|
||||
// jump to new location saving return address
|
||||
printf("JSR\n");
|
||||
}
|
||||
|
||||
void lda()
|
||||
{
|
||||
// load accumulator with memory
|
||||
printf("LDA\n");
|
||||
}
|
||||
|
||||
void ldx()
|
||||
{
|
||||
// load index x with memory
|
||||
printf("LDX\n");
|
||||
}
|
||||
|
||||
void ldy()
|
||||
{
|
||||
// load index y with memory
|
||||
printf("LDY\n");
|
||||
}
|
||||
|
||||
void lsr()
|
||||
{
|
||||
// shift one bit right (memory or accumulator)
|
||||
printf("LSR\n");
|
||||
}
|
||||
|
||||
void nop()
|
||||
{
|
||||
// no operation
|
||||
printf("NOP\n");
|
||||
}
|
||||
|
||||
void ora()
|
||||
{
|
||||
// or memory with accumulator
|
||||
printf("ORA\n");
|
||||
}
|
||||
|
||||
void pha()
|
||||
{
|
||||
// push accumulator on stack
|
||||
printf("PHA\n");
|
||||
}
|
||||
|
||||
void php()
|
||||
{
|
||||
// push processor status on stack
|
||||
printf("PHP\n");
|
||||
}
|
||||
|
||||
void pla()
|
||||
{
|
||||
// pull accumulator from stack
|
||||
printf("PLA\n");
|
||||
}
|
||||
|
||||
void plp()
|
||||
{
|
||||
// pull processor status from stack
|
||||
printf("PLP\n");
|
||||
}
|
||||
|
||||
void rol()
|
||||
{
|
||||
// rotate on bit left (memory or accumulator)
|
||||
printf("ROL\n");
|
||||
}
|
||||
|
||||
void ror()
|
||||
{
|
||||
// rotate on bit right (memory or accumulator)
|
||||
printf("ROR\n");
|
||||
}
|
||||
|
||||
void rti()
|
||||
{
|
||||
// return from interrupt
|
||||
printf("RTI\n");
|
||||
}
|
||||
|
||||
void rts()
|
||||
{
|
||||
// retrun from subroutine
|
||||
printf("RTS\n");
|
||||
}
|
||||
|
||||
void sbc()
|
||||
{
|
||||
// subtract memory from accumulator with borrow
|
||||
printf("SBC\n");
|
||||
}
|
||||
|
||||
void sec()
|
||||
{
|
||||
// set carry flag
|
||||
printf("SEC\n");
|
||||
}
|
||||
|
||||
void sed()
|
||||
{
|
||||
// set decimal flag
|
||||
printf("SED\n");
|
||||
}
|
||||
|
||||
void sei()
|
||||
{
|
||||
// set interrupt disable status
|
||||
printf("SEI\n");
|
||||
}
|
||||
|
||||
void sta()
|
||||
{
|
||||
// store accumulator in memory
|
||||
printf("STA\n");
|
||||
}
|
||||
|
||||
void stx()
|
||||
{
|
||||
// store index x in memory
|
||||
printf("STX\n");
|
||||
}
|
||||
|
||||
void sty()
|
||||
{
|
||||
// store index y in memory
|
||||
printf("STY\n");
|
||||
}
|
||||
|
||||
void tax()
|
||||
{
|
||||
// transfer accumulator to index x
|
||||
printf("TAX\n");
|
||||
}
|
||||
|
||||
void tay()
|
||||
{
|
||||
// transfer accumulator to index y
|
||||
printf("TAY\n");
|
||||
}
|
||||
|
||||
void tsx()
|
||||
{
|
||||
// transfer stack pointer to index x
|
||||
printf("TSX\n");
|
||||
}
|
||||
|
||||
void txa()
|
||||
{
|
||||
// transfer index x to accumulator
|
||||
printf("TXA\n");
|
||||
}
|
||||
|
||||
void txs()
|
||||
{
|
||||
// transfer index x to stack pointer
|
||||
printf("TXS\n");
|
||||
}
|
||||
|
||||
void tya()
|
||||
{
|
||||
// transfer index y to accumulator
|
||||
printf("TYA\n");
|
||||
}
|
14
src/ram.c
Normal file
14
src/ram.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include "inc/types.h"
|
||||
#include "inc/ram.h"
|
||||
|
||||
db ram_memory[4096]; // total memory: 4KB
|
||||
|
||||
void ram_read()
|
||||
{
|
||||
ram.mdr = ram_memory[ram.mar];
|
||||
}
|
||||
|
||||
void ram_write()
|
||||
{
|
||||
ram_memory[ram.mar] = ram.mdr;
|
||||
}
|
42
src/rom.c
Normal file
42
src/rom.c
Normal file
@ -0,0 +1,42 @@
|
||||
#include "inc/types.h"
|
||||
#include "inc/rom.h"
|
||||
|
||||
db rom_memory[] = {
|
||||
0xD8, 0x58, 0xA0, 0x7F, 0x8C, 0x12, 0xD0, 0xA9,
|
||||
0xA7, 0x8D, 0x11, 0xD0, 0x8D, 0x13, 0xD0, 0xC9,
|
||||
0xDF, 0xF0, 0x13, 0xC9, 0x9B, 0xF0, 0x03, 0xC8,
|
||||
0x10, 0x0F, 0xA9, 0xDC, 0x20, 0xEF, 0xFF, 0xA9,
|
||||
0x8D, 0x20, 0xEF, 0xFF, 0xA0, 0x01, 0x88, 0x30,
|
||||
0xF6, 0xAD, 0x11, 0xD0, 0x10, 0xFB, 0xAD, 0x10,
|
||||
0xD0, 0x99, 0x00, 0x02, 0x20, 0xEF, 0xFF, 0xC9,
|
||||
0x8D, 0xD0, 0xD4, 0xA0, 0xFF, 0xA9, 0x00, 0xAA,
|
||||
0x0A, 0x85, 0x2B, 0xC8, 0xB9, 0x00, 0x02, 0xC9,
|
||||
0x8D, 0xF0, 0xD4, 0xC9, 0xAE, 0x90, 0xF4, 0xF0,
|
||||
0xF0, 0xC9, 0xBA, 0xF0, 0xEB, 0xC9, 0xD2, 0xF0,
|
||||
0x3B, 0x86, 0x28, 0x86, 0x29, 0x84, 0x2A, 0xB9,
|
||||
0x00, 0x02, 0x49, 0xB0, 0xC9, 0x0A, 0x90, 0x06,
|
||||
0x69, 0x88, 0xC9, 0xFA, 0x90, 0x11, 0x0A, 0x0A,
|
||||
0x0A, 0x0A, 0xA2, 0x04, 0x0A, 0x26, 0x28, 0x26,
|
||||
0x29, 0xCA, 0xD0, 0xF8, 0xC8, 0xD0, 0xE0, 0xC4,
|
||||
0x2A, 0xF0, 0x97, 0x24, 0x2B, 0x50, 0x10, 0xA5,
|
||||
0x28, 0x81, 0x26, 0xE6, 0x26, 0xD0, 0xB5, 0xE6,
|
||||
0x27, 0x4C, 0x44, 0xFF, 0x6C, 0x24, 0x00, 0x30,
|
||||
0x2B, 0xA2, 0x02, 0xB5, 0x27, 0x95, 0x25, 0x95,
|
||||
0x23, 0xCA, 0xD0, 0xF7, 0xD0, 0x14, 0xA9, 0x8D,
|
||||
0x20, 0xEF, 0xFF, 0xA5, 0x25, 0x20, 0xDC, 0xFF,
|
||||
0xA5, 0x24, 0x20, 0xDC, 0xFF, 0xA9, 0xBA, 0x20,
|
||||
0xEF, 0xFF, 0xA9, 0xA0, 0x20, 0xEF, 0xFF, 0xA1,
|
||||
0x24, 0x20, 0xDC, 0xFF, 0x86, 0x2B, 0xA5, 0x24,
|
||||
0xC5, 0x28, 0xA5, 0x25, 0xE5, 0x29, 0xB0, 0xC1,
|
||||
0xE6, 0x24, 0xD0, 0x02, 0xE6, 0x25, 0xA5, 0x24,
|
||||
0x29, 0x07, 0x10, 0xC8, 0x48, 0x4A, 0x4A, 0x4A,
|
||||
0x4A, 0x20, 0xE5, 0xFF, 0x68, 0x29, 0x0F, 0x09,
|
||||
0xB0, 0xC9, 0xBA, 0x90, 0x02, 0x69, 0x06, 0x2C,
|
||||
0x12, 0xD0, 0x30, 0xFB, 0x8D, 0x12, 0xD0, 0x60,
|
||||
0x00, 0x00, 0x00, 0x0F, 0x00, 0xFF, 0x00, 0x00
|
||||
};
|
||||
|
||||
void rom_read()
|
||||
{
|
||||
rom.mdr = rom_memory[rom.mar];
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user