diff --git a/sample/a.o65 b/sample/a.o65 index cc97692..139c6d4 100644 Binary files a/sample/a.o65 and b/sample/a.o65 differ diff --git a/sample/test.s b/sample/test.s index 33df0d1..a1edee9 100644 --- a/sample/test.s +++ b/sample/test.s @@ -1,49 +1,76 @@ -; head position -ldx #$00 -stx $00 ; head position low -ldx #$e0 -stx $01 ; head position high +draw_addr = $e000 +key_addr = $f001 +draw_colour_addr = $10 -; colours -ldx #$f0 -stx $04 ; paint colour -ldx #$00 -stx $05 ; rubber colour +loop + lda #$0 + jsr read_key + cmp #$0 + beq loop -jsr one -jsr two -jsr three -jsr four + cmp #$50 + bne not_left + jsr move_left + clv + bvc loop -clv -bvc end + not_left + cmp #$4f + bne not_right + jsr move_right + clv + bvc loop -one - lda #$50 - ldx #$00 - sta ($00, x) - inc $00 + not_right + cmp #$52 + bne not_up + jsr move_up + clv + bvc loop + + not_up + cmp #$51 + bne loop + jsr move_down + clv + bvc loop + + clv + bvc loop + +read_key + lda key_addr + ldx #$0 + stx key_addr rts -two - lda #$F0 - ldx #$00 - sta ($00, x) +move_right inc $00 + jsr render_dot rts -three - lda #$FF - ldx #$00 - sta ($00, x) - inc $00 +move_left + dec $00 + jsr render_dot rts -four - lda #$af - ldx #$00 - sta ($00, x) - inc $00 +move_up + lda $00 + sbc #$40 + sta $0 + jsr render_dot rts -end +move_down + lda $00 + adc #$3f + sta $0 + jsr render_dot + rts + +render_dot + inc draw_colour_addr + lda draw_colour_addr + ldx $00 + sta draw_addr, x + rts diff --git a/src/machine/keyboard.cpp b/src/machine/keyboard.cpp new file mode 100644 index 0000000..6726560 --- /dev/null +++ b/src/machine/keyboard.cpp @@ -0,0 +1,43 @@ +#include "keyboard.h" +#include +#include + +using namespace std; + +namespace emu_6502 { + Keyboard::Keyboard(Memory& memory) : memory(memory) { + count = 0; + } + + void Keyboard::read() { + SDL_PollEvent(&event); + + switch (event.type) { + case SDL_KEYDOWN: + + //if(event.key.keysym.scancode < 255) + memory.set_at(LAST_KEY_PRESS_ADDR, event.key.keysym.scancode); + + cout << "CODE: " << event.key.keysym.scancode << endl; +// switch (event.key.keysym.sym) { +// case SDLK_LEFT: +// cout << "LEFT " << (uint16_t) count++ << endl; +// break; +// case SDLK_RIGHT: +// cout << "RIGHT" << (uint16_t) count++ << endl; +// break; +// case SDLK_UP: +// cout << "UP" << (uint16_t) count++ << endl; +// break; +// case SDLK_DOWN: +// cout << "DOWN" << (uint16_t) count++ << endl; +// break; +// default: +// break; +// } + break; + default: + return; + } + } +} \ No newline at end of file diff --git a/src/machine/keyboard.h b/src/machine/keyboard.h new file mode 100644 index 0000000..285a949 --- /dev/null +++ b/src/machine/keyboard.h @@ -0,0 +1,26 @@ +#ifndef INC_6502_EMULATOR_KEYBOARD_H +#define INC_6502_EMULATOR_KEYBOARD_H + +#include "memory.h" +#include + +namespace emu_6502 { + class Keyboard { + private: + static const uint16_t LAST_KEY_PRESS_ADDR = 0xF001; + + uint16_t count; + + SDL_Event event; + Memory& memory; + + public: + Keyboard(Memory& memory); + Keyboard(const Keyboard&) = delete; + Keyboard& operator=(const Keyboard&) = delete; + + void read(); + }; +} + +#endif //INC_6502_EMULATOR_KEYBOARD_H diff --git a/src/machine/machine.cpp b/src/machine/machine.cpp index bbe2e96..7f6a3fe 100644 --- a/src/machine/machine.cpp +++ b/src/machine/machine.cpp @@ -1,5 +1,6 @@ #include "machine.h" #include "terminal.h" +#include "keyboard.h" #include "../opcode/opcode-handler-directory.h" #include @@ -7,25 +8,26 @@ namespace emu_6502 { class MachineImpl { private: - bool terminal_initialised = false; uint16_t code_loaded_at; uint16_t code_size; + uint32_t instruction_iteration; + unique_ptr cpu; unique_ptr memory; unique_ptr stack; unique_ptr terminal; + unique_ptr keyboard; unique_ptr opcode_handler_dir; public: MachineImpl(bool init_terminal) { cpu = make_unique(); memory = make_unique(); stack = make_unique(*memory, cpu->get_sp()); + keyboard = make_unique(*memory); - if (init_terminal) { + if (init_terminal) terminal = make_unique(*memory); - terminal_initialised = true; - } opcode_handler_dir = make_unique(); } @@ -77,8 +79,10 @@ namespace emu_6502 { auto byte = read_program_byte(); opcode_handler_dir->execute(byte, machine); -// if (terminal_initialised) -// terminal->refresh(); + if (instruction_iteration++ >= 100) { + keyboard->read(); + instruction_iteration = 0; + } } } }; diff --git a/src/machine/terminal.cpp b/src/machine/terminal.cpp index 616ccc9..af026e7 100644 --- a/src/machine/terminal.cpp +++ b/src/machine/terminal.cpp @@ -25,19 +25,6 @@ namespace emu_6502 { SDL_Quit(); } -// void Terminal::refresh() { -// int x, y = 0; -// for (auto i = LOW_ADDR; i <= HIGH_ADDR; i++) { -// x = (i - LOW_ADDR) % WIDTH; -// y = (i - LOW_ADDR) / HEIGHT; -// -// draw_pixel(x, y, memory.get_at(i)); -// } -// -// SDL_RenderPresent(renderer); -// SDL_Delay(150); -// } - void Terminal::on_memory_written(pair address_value) { uint16_t address = address_value.first; @@ -49,7 +36,7 @@ namespace emu_6502 { draw_pixel(x, y, colour); SDL_RenderPresent(renderer); - SDL_Delay(5); + SDL_Delay(50); } } diff --git a/src/machine/terminal.h b/src/machine/terminal.h index 4b6e638..5ec11cb 100644 --- a/src/machine/terminal.h +++ b/src/machine/terminal.h @@ -19,7 +19,6 @@ namespace emu_6502 { Memory& memory; - SDL_Event event; SDL_Renderer* renderer; SDL_Window* window; @@ -31,8 +30,6 @@ namespace emu_6502 { Terminal(const Terminal&) = delete; Terminal& operator=(const Terminal&) = delete; ~Terminal(); - - //void refresh(); }; }