This commit is contained in:
Nishi 2026-08-18 19:41:05 +09:00
commit 107311645d
7 changed files with 175 additions and 5 deletions

View file

@ -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)

View file

@ -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

BIN
badapple/frames.bin Normal file

Binary file not shown.

167
badapple/main.s Normal file
View file

@ -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"

2
rom.c
View file

@ -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);

View file

@ -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)){
}
}

View file

@ -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