From 107311645d84c6ff203a718cdc567e8f6d8109bc Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 18 Aug 2026 19:41:05 +0900 Subject: [PATCH] update --- CMakeLists.txt | 1 + address.txt | 4 +- badapple/frames.bin | Bin 0 -> 105218 bytes badapple/main.s | 167 +++++++++++++++++++++++++++++++++++++++++ rom.c | 2 + src/main.c | 4 +- src/musashi/m68kconf.h | 2 +- 7 files changed, 175 insertions(+), 5 deletions(-) create mode 100644 badapple/frames.bin create mode 100644 badapple/main.s 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 0000000000000000000000000000000000000000..ce972a5ccb169583809ce29fdbd750c5011ccc73 GIT binary patch literal 105218 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 Mfqy0NKPrL$9}HQkQvd(} literal 0 HcmV?d00001 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