Changeset 149c3e0 in buchla-emu


Ignore:
Timestamp:
08/05/2017 08:48:28 PM (7 years ago)
Author:
Thomas Lopatic <thomas@…>
Branches:
master
Children:
29618fe
Parents:
5fa5369
Message:

Resuming, Ctrl-C, breakpoints look OK.

Location:
emu
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • emu/all.h

    r5fa5369 r149c3e0  
    7373extern void gdb_quit(void);
    7474extern void gdb_loop(void);
    75 extern void gdb_inst(void);
     75extern void gdb_inst(bool bp);
    7676
    7777extern SDL_mutex *cpu_mutex;
  • emu/cpu.c

    r5fa5369 r149c3e0  
    494494static void inst_cb(void)
    495495{
    496         gdb_inst();
    497 
    498496        uint32_t pc = m68k_get_reg(NULL, M68K_REG_PC);
    499497        uint32_t op = m68k_read_memory_16(pc);
     498
     499        gdb_inst(op == 0x4e4f);
    500500
    501501        if (op == 0x4e4d) {
  • emu/gdb.c

    r5fa5369 r149c3e0  
    3939#define LOCK_REQ 1
    4040#define LOCK_ACK 2
     41#define LOCK_BP 3
    4142
    4243typedef enum {
     
    9798}
    9899
    99 void gdb_inst(void)
     100void gdb_inst(bool bp)
    100101{
    101102        ver3("gdb inst");
    102103
    103         if (SDL_AtomicGet(&lock) == LOCK_NONE) {
     104        if (!bp && SDL_AtomicGet(&lock) == LOCK_NONE) {
    104105                return;
    105106        }
     
    107108        if (SDL_UnlockMutex(cpu_mutex) < 0) {
    108109                fail("SDL_UnlockMutex() failed: %s", SDL_GetError());
     110        }
     111
     112        if (bp) {
     113                ver2("-> lock bp");
     114                SDL_AtomicSet(&lock, LOCK_BP);
     115
     116                while (SDL_AtomicGet(&lock) != LOCK_REQ) {
     117                        SDL_Delay(100);
     118                }
    109119        }
    110120
     
    124134}
    125135
     136static void wait_cpu(void)
     137{
     138        while (SDL_AtomicGet(&lock) != LOCK_ACK) {
     139                SDL_Delay(100);
     140        }
     141
     142        ver2("<- lock ack");
     143}
     144
    126145static void stop_cpu(void)
    127146{
     
    129148        SDL_AtomicSet(&lock, LOCK_REQ);
    130149
    131         while (SDL_AtomicGet(&lock) != LOCK_ACK) {
    132                 SDL_Delay(100);
    133         }
    134 
    135         ver2("<- lock ack");
     150        wait_cpu();
    136151}
    137152
     
    140155        ver2("-> lock none");
    141156        SDL_AtomicSet(&lock, LOCK_NONE);
    142 }
    143 
    144 static void step_cpu(void)
    145 {
    146         ver2("-> lock req");
    147         SDL_AtomicSet(&lock, LOCK_REQ);
    148 }
    149 
    150 static void wait_cpu(void)
    151 {
    152         while (SDL_AtomicGet(&lock) != LOCK_ACK) {
    153                 SDL_Delay(100);
    154         }
    155 
    156         ver2("<- lock ack");
    157157}
    158158
     
    215215
    216216        cont_cpu();
    217         wait_cpu();
    218 
    219         // 0x05 = SIGTRAP
    220         return RES_DAT("S05", 3);
     217
     218        return RES_OK;
    221219}
    222220
     
    227225        }
    228226
    229         step_cpu();
    230         wait_cpu();
     227        stop_cpu();
    231228
    232229        // 0x05 = SIGTRAP
     
    455452        }
    456453
     454        if (res.out == NULL) {
     455                return RES_OK;
     456        }
     457
    457458        static const uint8_t *hex = (uint8_t *)"0123456789abcdef";
    458459        static uint8_t buf[SZ_BUF];
     
    487488
    488489        ver3("input %c st %d n %d", byte, (int32_t)state, n_buf);
     490
     491        if (state == STATE_HEAD && byte == 0x03) {
     492                stop_cpu();
     493                state = STATE_ACK;
     494                return RES_DAT("$S05#b8", 7);
     495        }
    489496
    490497        switch (state) {
     
    552559                }
    553560
     561                if (res.out == NULL) {
     562                        state = STATE_HEAD;
     563                        return RES_OK;
     564                }
     565
    554566                state = STATE_ACK;
    555567                return RES_DAT(res.out, res.n_out);
     
    588600
    589601        while (SDL_AtomicGet(&run) != 0) {
    590                 int32_t n_act = SDLNet_CheckSockets(set, 250);
     602                int32_t n_act = SDLNet_CheckSockets(set, 100);
    591603
    592604                if (n_act < 0) {
    593605                        fail("SDLNet_CheckSockets() failed: %s", SDLNet_GetError());
     606                }
     607
     608                if (SDL_AtomicGet(&lock) == LOCK_BP) {
     609                        ver2("<- lock bp");
     610                        stop_cpu();
     611                        state = STATE_ACK;
     612
     613                        if (SDLNet_TCP_Send(con, "$S05#b8", 7) != 7) {
     614                                err("connection error");
     615                                con_close(con);
     616                                con = NULL;
     617                                continue;
     618                        }
     619
     620                        continue;
    594621                }
    595622
Note: See TracChangeset for help on using the changeset viewer.