diff --git a/CMakeLists.txt b/CMakeLists.txt index b8d50f1..e013ca2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable(m68kmake tools/m68kmake.c) file(GLOB_RECURSE SRCS src/**.c) list(REMOVE_ITEM SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/musashi/m68k_in.c ${CMAKE_CURRENT_SOURCE_DIR}/src/musashi/m68kfpu.c) +list(REMOVE_ITEM SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/tms34010/34010tbl.c ${CMAKE_CURRENT_SOURCE_DIR}/src/tms34010/34010ops.c) find_package(SDL2) diff --git a/address.txt b/address.txt index aa4fb4f..b4f2123 100644 --- a/address.txt +++ b/address.txt @@ -1,7 +1,7 @@ $000000-$01FFFF ROM $100000-$1FFFFF RAM -$F00000-$F000FF IO0 -$F00100-$F001FF IO1 +$F00000-$F000FF IO0 (8254 or compatibles) +$F00100-$F001FF IO1 (HD44780 compatible LCD) $F00200-$F002FF IO2 $F00300-$F003FF IO3 $F00400-$F004FF IO4 diff --git a/badapple/frames.bin b/badapple/frames.bin new file mode 100644 index 0000000..ce972a5 Binary files /dev/null and b/badapple/frames.bin differ diff --git a/badapple/main.s b/badapple/main.s new file mode 100644 index 0000000..c36b45b --- /dev/null +++ b/badapple/main.s @@ -0,0 +1,167 @@ +STACK_AREA equ $1ff000 +ROM equ $000000 +RAM equ $100000 + +TIMER0 equ $f00000 +TIMER1 equ $f00002 +TIMER2 equ $f00004 +TIMER3 equ $f00006 + +LCD equ $f00100 +LCD_CMD equ $f00100 +LCD_DATA equ $f00102 + + org $000000 + +vector_table: + dc.l STACK_AREA + dc.l init + dc.l unhandled_exception ; 2: bus error + dc.l unhandled_exception ; 3: address error + dc.l unhandled_exception ; 4: illegal instruction + dc.l unhandled_exception ; 5: zero divide + dc.l unhandled_exception ; 6: chk + dc.l unhandled_exception ; 7: trapv + dc.l unhandled_exception ; 8: privilege violation + dc.l unhandled_exception ; 9: trace + dc.l unhandled_exception ; 10: 1010 + dc.l unhandled_exception ; 11: 1111 + dc.l unhandled_exception ; 12: - + dc.l unhandled_exception ; 13: - + dc.l unhandled_exception ; 14: - + dc.l unhandled_exception ; 15: uninitialized interrupt + dc.l unhandled_exception ; 16: - + dc.l unhandled_exception ; 17: - + dc.l unhandled_exception ; 18: - + dc.l unhandled_exception ; 19: - + dc.l unhandled_exception ; 20: - + dc.l unhandled_exception ; 21: - + dc.l unhandled_exception ; 22: - + dc.l unhandled_exception ; 23: - + dc.l unhandled_exception ; 24: spurious interrupt + dc.l timer_irq ; 25: l1 irq + dc.l unhandled_exception ; 26: l2 irq + dc.l unhandled_exception ; 27: l3 irq + dc.l unhandled_exception ; 28: l4 irq + dc.l unhandled_exception ; 29: l5 irq + dc.l unhandled_exception ; 30: l6 irq + dc.l unhandled_exception ; 31: l7 irq + dc.l unhandled_exception ; 32: trap 0 + dc.l unhandled_exception ; 33: trap 1 + dc.l unhandled_exception ; 34: trap 2 + dc.l unhandled_exception ; 35: trap 3 + dc.l unhandled_exception ; 36: trap 4 + dc.l unhandled_exception ; 37: trap 5 + dc.l unhandled_exception ; 38: trap 6 + dc.l unhandled_exception ; 39: trap 7 + dc.l unhandled_exception ; 40: trap 8 + dc.l unhandled_exception ; 41: trap 9 + dc.l unhandled_exception ; 42: trap 10 + dc.l unhandled_exception ; 43: trap 11 + dc.l unhandled_exception ; 44: trap 12 + dc.l unhandled_exception ; 45: trap 13 + dc.l unhandled_exception ; 46: trap 14 + dc.l unhandled_exception ; 47: trap 15 + + ; d0 is scratch register + ; d1 is frame counter (decreases) + ; d2 is timer counter + ; a0 is scratch register + ; a1 is frame pointer (increases) + ; timer is set to 10khz + +init: + ori.w #$700, sr + move.w #$38, LCD_CMD + jsr wait_lcd + move.w #$0c, LCD_CMD + jsr wait_lcd + + move.w #$80, LCD_CMD + jsr wait_lcd + move.w #0, LCD_DATA + jsr wait_lcd + move.w #1, LCD_DATA + jsr wait_lcd + move.w #2, LCD_DATA + jsr wait_lcd + + lea bad_apple, a0 + jsr print_lcd + + move.w #$c0, LCD_CMD + jsr wait_lcd + move.w #3, LCD_DATA + jsr wait_lcd + move.w #4, LCD_DATA + jsr wait_lcd + move.w #5, LCD_DATA + jsr wait_lcd + + move.w #$34, TIMER3 ; timer 0, LSB/MSB, mode 2 + move.w #$10, TIMER1 ; LSB + move.w #$27, TIMER1 ; MSB + + clr.w d3 + + jsr init_frames + + eor.w #$700, sr + bra.s * + +init_frames: + move.w #frames, a1 + move.w (a1), d1 + addi.w #2, a1 + rts + +print_lcd: + move.b (a0)+, d0 + tst.b d0 + beq.s .done + andi.w #$ff, d0 + move.w d0, LCD_DATA + jsr wait_lcd + bra.s print_lcd +.done: + rts + +wait_lcd: + move.w LCD_DATA, d0 + andi.w #80, d0 + tst.w d0 + bne.s wait_lcd + rts + +timer_irq: + addi.w #1, d3 + cmpi.w #100, d3 + bne.s .done ; disable this when you're running on emulator + clr.w d3 +.timer: + tst.w d1 + bne.s .no_reset + jsr init_frames +.no_reset: + subi.w #1, d1 + move.w #$40, LCD_CMD + jsr wait_lcd + + move #48, d2 +.loop: + move.b (a1)+, d0 + move.w d0, LCD_DATA + jsr wait_lcd + subi.w #1, d2 + tst.w d2 + bne.s .loop +.done: + rte + +unhandled_exception: + rte + +bad_apple: dc.b " Bad Apple!!", 0 + +frames: + incbin "../badapple/frames.bin" diff --git a/rom.c b/rom.c index 9724e86..7b46036 100644 --- a/rom.c +++ b/rom.c @@ -28,6 +28,8 @@ static void lcd_print(const char* str){ #define LCD_FUNCTION_2_LINES (1 << 3) int main(void){ + int i; + lcd_cmd(LCD_FUNCTION | LCD_FUNCTION_8_BITS | LCD_FUNCTION_2_LINES); lcd_cmd(LCD_DISPLAY | LCD_DISPLAY_ON); diff --git a/src/main.c b/src/main.c index eaeae08..d90a26c 100644 --- a/src/main.c +++ b/src/main.c @@ -16,7 +16,9 @@ static unsigned char rom[ROM_SIZE]; static unsigned char ram[RAM_SIZE]; + static i8254_t i8254; + static VrEmuLcd* lcd; #define IS_IO(address, io) ((address) >= 0xf00000 && ((address) & 0xf00) == ((io) << 8)) @@ -33,7 +35,6 @@ unsigned int m68k_read_memory_8(unsigned int address){ return i8254_read(&i8254, (address >> 1) & 3); }else if(IS_IO(address, 1)){ - }else if(IS_IO(address, 2)){ } return 0; @@ -63,7 +64,6 @@ void m68k_write_memory_8(unsigned int address, unsigned int value){ }else if(address == 3){ vrEmuLcdWriteByte(lcd, value); } - }else if(IS_IO(address, 2)){ } } diff --git a/src/musashi/m68kconf.h b/src/musashi/m68kconf.h index 54c47b8..2c8535e 100644 --- a/src/musashi/m68kconf.h +++ b/src/musashi/m68kconf.h @@ -216,7 +216,7 @@ */ #ifndef M68K_INSTRUCTION_HOOK #define M68K_INSTRUCTION_HOOK M68K_OPT_OFF -#define M68K_INSTRUCTION_CALLBACK(pc) your_instruction_hook_function(pc) +#define M68K_INSTRUCTION_CALLBACK(pc) m68k_instruction(pc) #endif