Changeset 7b50125 in buchla-emu for emu


Ignore:
Timestamp:
08/08/2017 06:30:31 PM (7 years ago)
Author:
Thomas Lopatic <thomas@…>
Branches:
master
Children:
82714ab
Parents:
05e6dbe (diff), 40b2112 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merged timer code.

Location:
emu
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • emu/cpu.c

    r05e6dbe r7b50125  
    7575        { 0x180000, 0x200000, 0, fpu_init, fpu_quit, fpu_exec, fpu_read, fpu_write },
    7676        { 0x200000, 0x280002, 0, vid_init, vid_quit, vid_exec, vid_read, vid_write },
    77         { 0x3a0001, 0x3a4001, 0, tim_init, tim_quit, tim_exec, tim_read, tim_write },
     77        { 0x3a0001, 0x3a4001, 4, tim_init, tim_quit, tim_exec, tim_read, tim_write },
    7878        { 0x3a4001, 0x3a8001, 0, lcd_init, lcd_quit, lcd_exec, lcd_read, lcd_write },
    7979        { 0x3a8001, 0x3ac001, 5, ser_init, ser_quit, ser_exec, ser_read, ser_write },
  • emu/tim.c

    r05e6dbe r7b50125  
    2424int32_t tim_verbose = 0;
    2525
     26#define REG_CRX 0
     27#define REG_CR2_SR 1
     28#define REG_T1H 2
     29#define REG_T1L 3
     30#define REG_T2H 4
     31#define REG_T2L 5
     32#define REG_T3H 6
     33#define REG_T3L 7
     34
     35#define COUNT_1 32
     36#define COUNT_2 3200
     37#define COUNT_3 801
     38
     39typedef struct {
     40        bool irq_e;
     41        bool irq;
     42        int32_t latch;
     43        int32_t count;
     44} state_timer;
     45
     46static state_timer timers[] = {
     47                { .irq_e = false, .irq = false, .latch = COUNT_1, .count = COUNT_1 },
     48                { .irq_e = false, .irq = false, .latch = COUNT_2, .count = COUNT_2 },
     49                { .irq_e = false, .irq = false, .latch = COUNT_3, .count = COUNT_3 }
     50};
     51
     52static bool wr_cr1 = false;
     53static bool oper = false;
     54
    2655void tim_init(void)
    2756{
     
    3665bool tim_exec(void)
    3766{
    38         ver3("tim exec");
    39         return false;
     67        if (oper) {
     68                for (int32_t i = 0; i < ARRAY_COUNT(timers); ++i) {
     69                        --timers[i].count;
     70
     71                        if (timers[i].count == 0) {
     72                                ver2("tim %d zero", i + 1);
     73                                timers[i].count = timers[i].latch;
     74
     75                                if (timers[i].irq_e) {
     76                                        ver2("tim %d irq", i + 1);
     77                                        timers[i].irq = true;
     78                                }
     79                        }
     80                }
     81        }
     82
     83        return timers[0].irq || timers[1].irq || timers[2].irq;
    4084}
    4185
     
    4387{
    4488        ver2("tim rd %u:%d", off, sz * 8);
    45         return 0;
     89
     90        if (sz != 1 || off > 7) {
     91                fail("invalid tim rd %u:%d", off, sz * 8);
     92        }
     93
     94        uint32_t rv = 0x00;
     95
     96        switch (off) {
     97        case REG_CR2_SR:
     98                rv |= (uint32_t)timers[0].irq << 0;
     99                rv |= (uint32_t)timers[1].irq << 1;
     100                rv |= (uint32_t)timers[2].irq << 2;
     101
     102                ver2("tim irqs %u %u %u",
     103                                (uint32_t)timers[0].irq, (uint32_t)timers[1].irq, (uint32_t)timers[2].irq);
     104                break;
     105
     106        case REG_T1L:
     107                if (timers[0].irq) {
     108                        ver2("tim 1 !irq");
     109                        timers[0].irq = false;
     110                }
     111
     112                break;
     113
     114        case REG_T2L:
     115                if (timers[1].irq) {
     116                        ver2("tim 2 !irq");
     117                        timers[1].irq = false;
     118                }
     119
     120                break;
     121
     122        case REG_T3L:
     123                if (timers[2].irq) {
     124                        ver2("tim 3 !irq");
     125                        timers[2].irq = false;
     126                }
     127
     128                break;
     129
     130        default:
     131                break;
     132        }
     133
     134        return rv;
    46135}
    47136
     
    49138{
    50139        ver2("tim wr %u:%d 0x%0*x", off, sz * 8, sz * 2, val);
     140
     141        if (sz != 1 || off > 7) {
     142                fail("invalid tim wr %u:%d", off, sz * 8);
     143        }
     144
     145        switch (off) {
     146        case REG_CRX:
     147                if (wr_cr1) {
     148                        if ((val & 0x01) == 0) {
     149                                ver2("tim start");
     150                                oper = true;
     151                        }
     152
     153                        timers[0].irq_e = (val & 0x40) != 0;
     154                }
     155                else {
     156                        timers[2].irq_e = (val & 0x40) != 0;
     157                }
     158
     159                break;
     160
     161        case REG_CR2_SR:
     162                wr_cr1 = (val & 0x01) != 0;
     163                timers[1].irq_e = (val & 0x40) != 0;
     164                break;
     165
     166        default:
     167                break;
     168        }
    51169}
Note: See TracChangeset for help on using the changeset viewer.