OpenCores
URL https://opencores.org/ocsvn/light52/light52/trunk

Subversion Repositories light52

[/] [light52/] [trunk/] [tools/] [b51/] [src/] [b51_mcu.c] - Blame information for rev 24

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 ja_rd
 
2
#include <stdio.h>
3
 
4
#include "b51_mcu.h"
5
#include "b51_log.h"
6
 
7
/*-- Private data & data types -----------------------------------------------*/
8
 
9
 
10
/*-- Public functions --------------------------------------------------------*/
11
 
12
extern void mcu_init(mcu51_t *mcu){
13
}
14
 
15
extern void mcu_reset(mcu51_t *mcu){
16
    uint32_t i;
17
 
18
    for(i=0;i<NUM_IRQS;i++){
19
        mcu->irq_countdown[i] = 0;
20
    }
21
}
22
 
23
extern void mcu_update(mcu51_t *mcu, uint32_t states){
24
    uint32_t i;
25
 
26
    for(i=0;i<NUM_IRQS;i++){
27
        if(mcu->irq_countdown[i] > 0){
28
            mcu->irq_countdown[i]--;
29
 
30
            if(mcu->irq_countdown[i] == 0){
31
                switch(i){
32
                case 0:     /* FIXME external irq 0 unimplemented */
33
                    break;
34
                case 1:     /* FIXME Timer 0 irq unimplemented */
35
                    break;
36
                case 2:     /* FIXME external irq 1 unimplemented */
37
                    break;
38
                case 3:     /* FIXME Timer 1 irq unimplemented */
39
                    break;
40
                case 4:     /* Serial port irq */
41
                    mcu->sfr.scon |= 0x030; /* FIXME Tx and Rx interrupts */
42
                    break;
43
                default:    /* BUG! wrong index */
44
                    ;
45
                }
46
            }
47
        };
48
    }
49
}
50
 
51
 
52
extern uint16_t mcu_set_sfr(mcu51_t *mcu, uint8_t dir, uint8_t value){
53
 
54
    if(dir < 0x80) return 0xffff;
55
 
56
    switch(dir){
57
    case 0x80:  /* P0 */
58
        mcu->sfr.p0 = value;
59
        break;
60
    case 0x90:  /* P1 */
61
        mcu->sfr.p1 = value;
62
        break;
63
    case 0xa0:  /* P2 */
64
        mcu->sfr.p2 = value;
65
        break;
66
    case 0xb0:  /* P3 */
67
        mcu->sfr.p3 = value;
68
        break;
69
    case 0x87:  /* PCON */
70
        mcu->sfr.pcon = value;
71
        break;
72
    case 0x99:  /* SBUF */
73
        mcu->sfr.sbuf = value;
74
        log_con_output((char)value);
75
        /* Simulate a TI interrupt after 4 instruction cycles, arbitrarily */
76
        /* FIXME UAR simulation is in bare bones */
77
        //mcu->irq_countdown[4] = 4;
78
        break;
79
    case 0x98:  /* SCON */
80
        mcu->sfr.scon = value;
81
        break;
82
    case 0x88:  /* TCON */
83
        mcu->sfr.tcon = value;
84
        break;
85
    case 0x89:  /* TMOD */
86
        mcu->sfr.tmod = value;
87
        break;
88
    case 0x8c:  /* TH0 */
89
        mcu->sfr.th0 = value;
90
        break;
91
    case 0x8d:  /* TH1 */
92
        mcu->sfr.th1 = value;
93
        break;
94
    case 0x8a:  /* TL0 */
95
        mcu->sfr.tl0 = value;
96
        break;
97
    case 0x8b:  /* TL1 */
98
        mcu->sfr.tl1 = value;
99
        break;
100
    default:
101
        /* For undefined SFRs, return 0xffff */
102
        return (uint16_t)0xffff;
103
    }
104
 
105
    return 0;
106
}
107
 
108
extern uint16_t mcu_get_sfr(mcu51_t *mcu, uint8_t dir){
109
 
110
    if(dir < 0x80) return 0xffff;
111
 
112
    switch(dir){
113
    case 0x80:  /* P0 */
114
        return (uint16_t)mcu->sfr.p0;
115
        break;
116
    case 0x90:  /* P1 */
117
        return (uint16_t)mcu->sfr.p1;
118
        break;
119
    case 0xa0:  /* P2 */
120
        return (uint16_t)mcu->sfr.p2;
121
        break;
122
    case 0xb0:  /* P3 */
123
        return (uint16_t)mcu->sfr.p3;
124
        break;
125
    case 0x87:  /* PCON */
126
        return (uint16_t)mcu->sfr.pcon;
127
        break;
128
    case 0x99:  /* SBUF */
129
        return (uint16_t)mcu->sfr.sbuf;
130
        break;
131
    case 0x98:  /* SCON */
132
        return (uint16_t)mcu->sfr.scon | 0x030;
133
        break;
134
    case 0x88:  /* TCON */
135
        return (uint16_t)mcu->sfr.tcon;
136
        break;
137
    case 0x89:  /* TMOD */
138
        return (uint16_t)mcu->sfr.tmod;
139
        break;
140
    case 0x8c:  /* TH0 */
141
        return (uint16_t)mcu->sfr.th0;
142
        break;
143
    case 0x8d:  /* TH1 */
144
        return (uint16_t)mcu->sfr.th1;
145
        break;
146
    case 0x8a:  /* TL0 */
147
        return (uint16_t)mcu->sfr.tl0;
148
        break;
149
    case 0x8b:  /* TL1 */
150
        return (uint16_t)mcu->sfr.tl1;
151
        break;
152
    default:
153
        /* IIF the SFR is undefined we return a 16-bit-wide 0xffff */
154
        return (uint16_t)0xffff;
155
    }
156
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.