Changeset 3c30832 in buchla-emu


Ignore:
Timestamp:
07/23/2017 08:57:53 PM (7 years ago)
Author:
Thomas Lopatic <thomas@…>
Branches:
master
Children:
375f7fb
Parents:
8e1b163
Message:

Interrupt handling. Serial console shows ROMP.

Location:
emu
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • emu/all.h

    r8e1b163 r3c30832  
    7272extern void fpu_init(void);
    7373extern void fpu_quit(void);
    74 extern void fpu_exec(void);
     74extern bool fpu_exec(void);
    7575extern uint32_t fpu_read(uint32_t off, int32_t sz);
    7676extern void fpu_write(uint32_t off, int32_t sz, uint32_t val);
     
    7878extern void vid_init(void);
    7979extern void vid_quit(void);
    80 extern void vid_exec(void);
     80extern bool vid_exec(void);
    8181extern uint32_t vid_read(uint32_t off, int32_t sz);
    8282extern void vid_write(uint32_t off, int32_t sz, uint32_t val);
     
    8484extern void tim_init(void);
    8585extern void tim_quit(void);
    86 extern void tim_exec(void);
     86extern bool tim_exec(void);
    8787extern uint32_t tim_read(uint32_t off, int32_t sz);
    8888extern void tim_write(uint32_t off, int32_t sz, uint32_t val);
     
    9090extern void lcd_init(void);
    9191extern void lcd_quit(void);
    92 extern void lcd_exec(void);
     92extern bool lcd_exec(void);
    9393extern uint32_t lcd_read(uint32_t off, int32_t sz);
    9494extern void lcd_write(uint32_t off, int32_t sz, uint32_t val);
     
    9696extern void ser_init(void);
    9797extern void ser_quit(void);
    98 extern void ser_exec(void);
     98extern bool ser_exec(void);
    9999extern uint32_t ser_read(uint32_t off, int32_t sz);
    100100extern void ser_write(uint32_t off, int32_t sz, uint32_t val);
     
    105105extern void mid_init(void);
    106106extern void mid_quit(void);
    107 extern void mid_exec(void);
     107extern bool mid_exec(void);
    108108extern uint32_t mid_read(uint32_t off, int32_t sz);
    109109extern void mid_write(uint32_t off, int32_t sz, uint32_t val);
     
    111111extern void fdd_init(void);
    112112extern void fdd_quit(void);
    113 extern void fdd_exec(void);
     113extern bool fdd_exec(void);
    114114extern uint32_t fdd_read(uint32_t off, int32_t sz);
    115115extern void fdd_write(uint32_t off, int32_t sz, uint32_t val);
     
    117117extern void snd_init(void);
    118118extern void snd_quit(void);
    119 extern void snd_exec(void);
     119extern bool snd_exec(void);
    120120extern uint32_t snd_read(uint32_t off, int32_t sz);
    121121extern void snd_write(uint32_t off, int32_t sz, uint32_t val);
     
    123123extern void led_init(void);
    124124extern void led_quit(void);
    125 extern void led_exec(void);
     125extern bool led_exec(void);
    126126extern uint32_t led_read(uint32_t off, int32_t sz);
    127127extern void led_write(uint32_t off, int32_t sz, uint32_t val);
     
    129129extern void kbd_init(void);
    130130extern void kbd_quit(void);
    131 extern void kbd_exec(void);
     131extern bool kbd_exec(void);
    132132extern uint32_t kbd_read(uint32_t off, int32_t sz);
    133133extern void kbd_write(uint32_t off, int32_t sz, uint32_t val);
  • emu/cpu.c

    r8e1b163 r3c30832  
    3737typedef void (*hw_init_t)(void);
    3838typedef void (*hw_quit_t)(void);
    39 typedef void (*hw_exec_t)(void);
     39typedef bool (*hw_exec_t)(void);
    4040typedef uint32_t (*hw_read_t)(uint32_t off, int32_t sz);
    4141typedef void (*hw_write_t)(uint32_t off, int32_t sz, uint32_t val);
     
    4444        uint32_t addr_beg;
    4545        uint32_t addr_end;
     46        uint32_t irq;
    4647        hw_init_t init;
    4748        hw_quit_t quit;
     
    6768
    6869static hw_t hw_map[] = {
    69         { 0x180000, 0x200000, fpu_init, fpu_quit, fpu_exec, fpu_read, fpu_write },
    70         { 0x200000, 0x280000, vid_init, vid_quit, vid_exec, vid_read, vid_write },
    71         { 0x3a0001, 0x3a4001, tim_init, tim_quit, tim_exec, tim_read, tim_write },
    72         { 0x3a4001, 0x3a8001, lcd_init, lcd_quit, lcd_exec, lcd_read, lcd_write },
    73         { 0x3a8001, 0x3ac001, ser_init, ser_quit, ser_exec, ser_read, ser_write },
    74         { 0x3ac001, 0x3b0001, mid_init, mid_quit, mid_exec, mid_read, mid_write },
    75         { 0x3b0001, 0x3b4001, fdd_init, fdd_quit, fdd_exec, fdd_read, fdd_write },
    76         { 0x3b4001, 0x3b8001, snd_init, snd_quit, snd_exec, snd_read, snd_write },
    77         { 0x3b8001, 0x3bc001, led_init, led_quit, led_exec, led_read, led_write },
    78         { 0x3bc001, 0x3c0001, kbd_init, kbd_quit, kbd_exec, kbd_read, kbd_write }
     70        { 0x180000, 0x200000, 0, fpu_init, fpu_quit, fpu_exec, fpu_read, fpu_write },
     71        { 0x200000, 0x280000, 0, vid_init, vid_quit, vid_exec, vid_read, vid_write },
     72        { 0x3a0001, 0x3a4001, 0, tim_init, tim_quit, tim_exec, tim_read, tim_write },
     73        { 0x3a4001, 0x3a8001, 0, lcd_init, lcd_quit, lcd_exec, lcd_read, lcd_write },
     74        { 0x3a8001, 0x3ac001, 5, ser_init, ser_quit, ser_exec, ser_read, ser_write },
     75        { 0x3ac001, 0x3b0001, 0, mid_init, mid_quit, mid_exec, mid_read, mid_write },
     76        { 0x3b0001, 0x3b4001, 0, fdd_init, fdd_quit, fdd_exec, fdd_read, fdd_write },
     77        { 0x3b4001, 0x3b8001, 0, snd_init, snd_quit, snd_exec, snd_read, snd_write },
     78        { 0x3b8001, 0x3bc001, 0, led_init, led_quit, led_exec, led_read, led_write },
     79        { 0x3bc001, 0x3c0001, 0, kbd_init, kbd_quit, kbd_exec, kbd_read, kbd_write }
    7980};
    8081
     
    108109}
    109110
    110 static void hw_exec(void)
    111 {
     111static uint32_t hw_exec(void)
     112{
     113        uint32_t irq = 0;
     114
    112115        for (int32_t i = 0; i < ARRAY_COUNT(hw_map); ++i) {
    113                 hw_map[i].exec();
    114         }
     116                if (hw_map[i].exec() && hw_map[i].irq > irq) {
     117                        irq = hw_map[i].irq;
     118                }
     119        }
     120
     121        return irq;
    115122}
    116123
     
    629636
    630637                m68k_execute(CPU_FREQ / PER_SEC);
    631                 hw_exec();
     638                uint32_t irq = hw_exec();
     639
     640                if (irq > 0) {
     641                        ver2("irq %u", irq);
     642                }
     643
     644                m68k_set_irq(irq);
    632645
    633646                SDL_Event ev;
  • emu/fdd.c

    r8e1b163 r3c30832  
    3434}
    3535
    36 void fdd_exec(void)
     36bool fdd_exec(void)
    3737{
    3838        ver3("fdd exec");
     39        return false;
    3940}
    4041
  • emu/fpu.c

    r8e1b163 r3c30832  
    3434}
    3535
    36 void fpu_exec(void)
     36bool fpu_exec(void)
    3737{
    3838        ver3("fpu exec");
     39        return false;
    3940}
    4041
  • emu/kbd.c

    r8e1b163 r3c30832  
    3434}
    3535
    36 void kbd_exec(void)
     36bool kbd_exec(void)
    3737{
    3838        ver3("kbd exec");
     39        return false;
    3940}
    4041
  • emu/lcd.c

    r8e1b163 r3c30832  
    3434}
    3535
    36 void lcd_exec(void)
     36bool lcd_exec(void)
    3737{
    3838        ver3("lcd exec");
     39        return false;
    3940}
    4041
  • emu/led.c

    r8e1b163 r3c30832  
    3434}
    3535
    36 void led_exec(void)
     36bool led_exec(void)
    3737{
    3838        ver3("led exec");
     39        return false;
    3940}
    4041
  • emu/mid.c

    r8e1b163 r3c30832  
    3434}
    3535
    36 void mid_exec(void)
     36bool mid_exec(void)
    3737{
    3838        ver3("mid exec");
     39        return false;
    3940}
    4041
  • emu/ser.c

    r8e1b163 r3c30832  
    3131#define CON_FONT "ttf/vera-sans-mono.ttf"
    3232
     33#define REG_IER_ISR 0
     34#define REG_CFR_SR  1
     35#define REG_CDR_TBR 2
     36#define REG_TDR_RDR 3
     37
     38typedef struct {
     39        bool irq;
     40        uint8_t rdr;
     41} state_t;
     42
    3343int32_t ser_verbose = 0;
     44
     45static state_t state[] = {
     46        { .irq = false, .rdr = 0x00 },
     47        { .irq = false, .rdr = 0x00 }
     48};
    3449
    3550static uint8_t mem[CON_H][CON_W + 1];
     
    4257
    4358static int32_t cur_x = 0, cur_y = 0;
     59
     60static void out(int32_t un, uint8_t c)
     61{
     62        state[un].irq = true;
     63        state[un].rdr = c;
     64}
    4465
    4566static void update(void)
     
    173194        switch (ev->keysym.sym) {
    174195        case SDLK_BACKSPACE:
    175                 echo('\b');
     196                out(1, '\b');
    176197                break;
    177198
    178199        case SDLK_RETURN:
    179                 echo('\r');
    180                 echo('\n');
     200                out(1, '\r');
    181201                break;
    182202
     
    184204                if ((ev->keysym.mod & KMOD_CTRL) != 0 &&
    185205                                ev->keysym.sym >= SDLK_a && ev->keysym.sym <= SDLK_z) {
    186                         echo((uint8_t)(ev->keysym.sym - SDLK_a + 1));
     206                        out(1, (uint8_t)(ev->keysym.sym - SDLK_a + 1));
    187207                }
    188208
     
    194214{
    195215        for (int32_t i = 0; ev->text[i] != 0; ++i) {
    196                 echo((uint8_t)ev->text[i]);
     216                out(1, (uint8_t)ev->text[i]);
    197217        }
    198218}
     
    248268}
    249269
    250 void ser_exec(void)
     270bool ser_exec(void)
    251271{
    252272        ver3("ser exec");
     273        return state[0].irq || state[1].irq;
    253274}
    254275
     
    256277{
    257278        ver2("ser rd %u:%d", off, sz * 8);
    258         return 0;
     279
     280        if (sz != 1 || off > 7) {
     281                fail("invalid ser rd %u:%d", off, sz * 8);
     282        }
     283
     284        int32_t rg = (int32_t)(off % 4);
     285        int32_t un = (int32_t)(off / 4);
     286
     287        uint32_t rv;
     288
     289        switch (rg) {
     290        case REG_IER_ISR:
     291                rv = (uint32_t)(0xc0 | (state[un].irq ? 0x01 : 0x00));
     292                ver2("ISR[%d] 0x%02x", un, rv);
     293                break;
     294
     295        case REG_TDR_RDR:
     296                rv = state[un].rdr;
     297                state[un].irq = false;
     298                ver2("RDR[%d] 0x%02x", un, rv);
     299                break;
     300
     301        default:
     302                rv = 0x00;
     303                break;
     304        }
     305
     306        return rv;
    259307}
    260308
     
    262310{
    263311        ver2("ser wr %u:%d 0x%0*x", off, sz * 8, sz * 2, val);
    264 }
     312
     313        if (sz != 1 || off > 7) {
     314                fail("invalid ser wr %u:%d", off, sz * 8);
     315        }
     316
     317        int32_t rg = (int32_t)(off % 4);
     318        int32_t un = (int32_t)(off / 4);
     319
     320        switch (rg) {
     321        case REG_TDR_RDR:
     322                ver2("TDR[%d] 0x%02x", un, val);
     323                echo((uint8_t)val);
     324                break;
     325
     326        default:
     327                break;
     328        }
     329}
  • emu/snd.c

    r8e1b163 r3c30832  
    3434}
    3535
    36 void snd_exec(void)
     36bool snd_exec(void)
    3737{
    3838        ver3("snd exec");
     39        return false;
    3940}
    4041
  • emu/tim.c

    r8e1b163 r3c30832  
    3434}
    3535
    36 void tim_exec(void)
     36bool tim_exec(void)
    3737{
    3838        ver3("tim exec");
     39        return false;
    3940}
    4041
  • emu/vid.c

    r8e1b163 r3c30832  
    3434}
    3535
    36 void vid_exec(void)
     36bool vid_exec(void)
    3737{
    3838        ver3("vid exec");
     39        return false;
    3940}
    4041
Note: See TracChangeset for help on using the changeset viewer.