Commit 024a09bbfa3065b99b2e7309dd157987b788c7fd
authorMichel Pollet <buserror@gmail.com>
Sun, 6 Dec 2009 23:12:23 +0000 (23:12 +0000)
committerMichel Pollet <buserror@gmail.com>
Sun, 6 Dec 2009 23:12:23 +0000 (23:12 +0000)
Used to be 8 bits only in the code, but bit megas use 9 bits,
so the new type is uint16_t.

Signed-off-by: Michel Pollet <buserror@gmail.com>
14 files changed:
simavr/Makefile
simavr/sim/avr_eeprom.c
simavr/sim/avr_ioport.c
simavr/sim/avr_ioport.h
simavr/sim/avr_spi.c
simavr/sim/avr_spi.h
simavr/sim/avr_timer8.c
simavr/sim/avr_timer8.h
simavr/sim/avr_uart.c
simavr/sim/avr_uart.h
simavr/sim/sim_avr.h
simavr/sim/sim_io.c
simavr/sim/sim_io.h
simavr/sim/sim_regbit.h

index cb0c01766fd110071e93c2d3de7219df54f793d8..90e56463aa981f43e007779b111f4d7eb138fd00 100644 (file)
@@ -51,16 +51,14 @@ all:        obj libsimavr.a ${target}
 obj:
        @mkdir -p obj
 
-obj/sim_%.o : cores/sim_%.h ${wildcard cores/*.h} ${wildcard sim/*.h}
 obj/sim_%.o : cores/sim_%.c
-       @gcc $(CFLAGS) \
+       @gcc $(CFLAGS) -MD \
                -I${AVR_ROOT}/include/ \
                $<  -c -o $@
        @echo CORE $<
 
-obj/%.o: %.h sim/*.h
 obj/%.o: %.c
-       @gcc $(CFLAGS) \
+       @gcc $(CFLAGS) -MD \
                $<  -c -o $@
        @echo CC $<
 
@@ -80,3 +78,6 @@ ${target}     :       obj/${target}.o
 clean:
        rm -rf ${target} obj *.a
 
+# include the dependency files generated by gcc, if any
+-include ${wildcard obj/*.d}
+
index bc6cb08e7836ca9af063ee413f3b0bf379eaa4a9..b61916cd1c65fba25a99b02878d0dc0cfad68447 100644 (file)
@@ -40,7 +40,7 @@ static avr_cycle_count_t avr_eei_raise(struct avr_t * avr, avr_cycle_count_t whe
        return 0;
 }
 
-static void avr_eeprom_write(avr_t * avr, uint8_t addr, uint8_t v, void * param)
+static void avr_eeprom_write(avr_t * avr, avr_io_addr_t addr, uint8_t v, void * param)
 {
        avr_eeprom_t * p = (avr_eeprom_t *)param;
        uint8_t eempe = avr_regbit_get(avr, p->eempe);
index 6797a97e2b65f698e5e0bb16a49ae3a9a02f719c..f9af6348add1ab1b737fa9ab50c1bfd417a0a560 100644 (file)
@@ -22,7 +22,7 @@
 #include <stdio.h>
 #include "avr_ioport.h"
 
-static uint8_t avr_ioport_read(struct avr_t * avr, uint8_t addr, void * param)
+static uint8_t avr_ioport_read(struct avr_t * avr, avr_io_addr_t addr, void * param)
 {
        avr_ioport_t * p = (avr_ioport_t *)param;
        uint8_t v = avr->data[addr];
@@ -38,7 +38,7 @@ static uint8_t avr_ioport_read(struct avr_t * avr, uint8_t addr, void * param)
        return v;
 }
 
-static void avr_ioport_write(struct avr_t * avr, uint8_t addr, uint8_t v, void * param)
+static void avr_ioport_write(struct avr_t * avr, avr_io_addr_t addr, uint8_t v, void * param)
 {
        avr_ioport_t * p = (avr_ioport_t *)param;
        uint8_t oldv = avr->data[addr];
index 0a1ca37f195381dcd3a5d2a5bebe5da0ae58d712..fe583a14fc2446b2e5871c759d43746f4159502a 100644 (file)
@@ -38,12 +38,12 @@ enum {
 typedef struct avr_ioport_t {
        avr_io_t        io;
        char name;
-       uint8_t r_port;
-       uint8_t r_ddr;
-       uint8_t r_pin;
+       avr_io_addr_t r_port;
+       avr_io_addr_t r_ddr;
+       avr_io_addr_t r_pin;
 
        avr_int_vector_t pcint; // PCINT vector
-       uint8_t r_pcint;                // pcint 8 pins mask
+       avr_io_addr_t r_pcint;          // pcint 8 pins mask
 } avr_ioport_t;
 
 void avr_ioport_init(avr_t * avr, avr_ioport_t * port);
index 567bf796dd229900c8dd683e356e4cd05cb16495..7d7ffffe955169f2038cd69c9edf2bab482d9dec 100644 (file)
@@ -22,7 +22,7 @@
 #include <stdio.h>
 #include "avr_spi.h"
 
-static uint8_t avr_spi_read(struct avr_t * avr, uint8_t addr, void * param)
+static uint8_t avr_spi_read(struct avr_t * avr, avr_io_addr_t addr, void * param)
 {
        avr_spi_t * p = (avr_spi_t *)param;
        uint8_t v = p->input_data_register;
@@ -31,7 +31,7 @@ static uint8_t avr_spi_read(struct avr_t * avr, uint8_t addr, void * param)
        return v;
 }
 
-static void avr_spi_write(struct avr_t * avr, uint8_t addr, uint8_t v, void * param)
+static void avr_spi_write(struct avr_t * avr, avr_io_addr_t addr, uint8_t v, void * param)
 {
        avr_spi_t * p = (avr_spi_t *)param;
 
index 9926e66f5808aa8afba68250feb72e114568a6ce..3e3a26ab3252267b0e9aba4a43ecbcd79badeda1 100644 (file)
@@ -38,9 +38,9 @@ typedef struct avr_spi_t {
        char name;
        avr_regbit_t    disabled;       // bit in the PRR
 
-       uint8_t r_spdr;                 // data register
-       uint8_t r_spcr;                 // control register
-       uint8_t r_spsr;                 // status register
+       avr_io_addr_t   r_spdr;                 // data register
+       avr_io_addr_t   r_spcr;                 // control register
+       avr_io_addr_t   r_spsr;                 // status register
        
        avr_regbit_t spe;               // spi enable
        avr_regbit_t mstr;              // master/slave
index 4725ea584377f8a0ca775d1f1657f61a0c632322..82047d396952f2f7fd3f8be8ac0b33baaf13574a 100644 (file)
@@ -39,14 +39,14 @@ static avr_cycle_count_t avr_timer8_compb(struct avr_t * avr, avr_cycle_count_t
        return p->compb_cycles ? when + p->compb_cycles : 0;
 }
 
-static uint8_t avr_timer8_tcnt_read(struct avr_t * avr, uint8_t addr, void * param)
+static uint8_t avr_timer8_tcnt_read(struct avr_t * avr, avr_io_addr_t addr, void * param)
 {
        //avr_timer8_t * p = (avr_timer8_t *)param;
        // made to trigger potential watchpoints
        return avr_core_watch_read(avr, addr);
 }
 
-static void avr_timer8_write(struct avr_t * avr, uint8_t addr, uint8_t v, void * param)
+static void avr_timer8_write(struct avr_t * avr, avr_io_addr_t addr, uint8_t v, void * param)
 {
        avr_timer8_t * p = (avr_timer8_t *)param;
 
index 04a2d3497ebe85e5570aef6d220c3e6a9fb22274..69c6b81ffd0afe5ee552c78fcf9bd50496194469 100644 (file)
@@ -29,7 +29,7 @@ typedef struct avr_timer8_t {
        char name;
        avr_regbit_t    disabled;       // bit in the PRR
 
-       uint8_t                 r_ocra, r_ocrb, r_ocrc, r_tcnt;
+       avr_io_addr_t   r_ocra, r_ocrb, r_ocrc, r_tcnt;
        
        avr_regbit_t    wgm[4];
        avr_regbit_t    cs[4];
index 3f000f2db0eb90a42a3cff9492caf25d5d6ba833..ad0f1bed1957d2373fd2603412ca92d165547e89 100644 (file)
@@ -36,7 +36,7 @@ static avr_cycle_count_t avr_uart_rxc_raise(struct avr_t * avr, avr_cycle_count_
        return 0;
 }
 
-static uint8_t avr_uart_read(struct avr_t * avr, uint8_t addr, void * param)
+static uint8_t avr_uart_read(struct avr_t * avr, avr_io_addr_t addr, void * param)
 {
        avr_uart_t * p = (avr_uart_t *)param;
 
@@ -58,7 +58,7 @@ static uint8_t avr_uart_read(struct avr_t * avr, uint8_t addr, void * param)
        return v;
 }
 
-static void avr_uart_write(struct avr_t * avr, uint8_t addr, uint8_t v, void * param)
+static void avr_uart_write(struct avr_t * avr, avr_io_addr_t addr, uint8_t v, void * param)
 {
        avr_uart_t * p = (avr_uart_t *)param;
 
index b748446c79efc7300ee94f52a5e07dedb5e44552..86fa850879274b5a90b5d9a6a3907fbb78120a0f 100644 (file)
@@ -42,15 +42,15 @@ typedef struct avr_uart_t {
        char name;
        avr_regbit_t    disabled;       // bit in the PRR
        
-       uint8_t r_udr;
-       uint8_t r_ucsra;
-       uint8_t r_ucsrb;
-       uint8_t r_ucsrc;
+       avr_io_addr_t r_udr;
+       avr_io_addr_t r_ucsra;
+       avr_io_addr_t r_ucsrb;
+       avr_io_addr_t r_ucsrc;
 
        avr_regbit_t    rxen;           // receive enabled
        avr_regbit_t    txen;           // transmit enable
 
-       uint8_t r_ubrrl,r_ubrrh;
+       avr_io_addr_t r_ubrrl,r_ubrrh;
 
        avr_int_vector_t rxc;
        avr_int_vector_t txc;
index 88026f7637da7eef60479d6d10f1efaffbd7d55b..21e72603ccd00cd649a58e05e5127bb450e3c4f5 100644 (file)
 #include <stdint.h>
 
 typedef uint64_t avr_cycle_count_t;
+typedef uint16_t       avr_io_addr_t;
 
 struct avr_t;
-typedef uint8_t (*avr_io_read_t)(struct avr_t * avr, uint8_t addr, void * param);
-typedef void (*avr_io_write_t)(struct avr_t * avr, uint8_t addr, uint8_t v, void * param);
+typedef uint8_t (*avr_io_read_t)(struct avr_t * avr, avr_io_addr_t addr, void * param);
+typedef void (*avr_io_write_t)(struct avr_t * avr, avr_io_addr_t addr, uint8_t v, void * param);
 typedef avr_cycle_count_t (*avr_cycle_timer_t)(struct avr_t * avr, avr_cycle_count_t when, void * param);
 
 enum {
@@ -103,6 +104,7 @@ typedef struct avr_t {
 
        /*
         * callback when specific IO registers are read/written
+        * these should probably be allocated dynamically in init()..
         */
        struct {
                void * param;
@@ -165,7 +167,7 @@ typedef struct avr_t {
 #endif
 
        // DEBUG ONLY
-       // keeps track of wich registers gets touched by instructions
+       // keeps track of which registers gets touched by instructions
        // reset before each new instructions. Allows meaningful traces
        uint32_t        touched[256 / 32];      // debug
 
index 4f5dcb6c79fead031e3ccd34dde82dda45b2334f..2c6ddef849ff2c0838aeebe1f605c865c1e2d0bd 100644 (file)
@@ -44,13 +44,13 @@ void avr_register_io(avr_t *avr, avr_io_t * io)
        avr->io_port = io;
 }
 
-void avr_register_io_read(avr_t *avr, uint8_t addr, avr_io_read_t readp, void * param)
+void avr_register_io_read(avr_t *avr, avr_io_addr_t addr, avr_io_read_t readp, void * param)
 {
        avr->ior[AVR_DATA_TO_IO(addr)].param = param;
        avr->ior[AVR_DATA_TO_IO(addr)].r = readp;
 }
 
-void avr_register_io_write(avr_t *avr, uint8_t addr, avr_io_write_t writep, void * param)
+void avr_register_io_write(avr_t *avr, avr_io_addr_t addr, avr_io_write_t writep, void * param)
 {
        avr->iow[AVR_DATA_TO_IO(addr)].param = param;
        avr->iow[AVR_DATA_TO_IO(addr)].w = writep;
index 330a9dea56917bfeac1f71fd4d8f8bcdd90cd7e3..588cccaa59d5d592bcc0ede587e4965d261c3f99 100644 (file)
@@ -60,9 +60,9 @@ typedef struct avr_io_t {
 // one after instanciation, for whatever purpose...
 void avr_register_io(avr_t *avr, avr_io_t * io);
 // register a callback for when IO register "addr" is read
-void avr_register_io_read(avr_t *avr, uint8_t addr, avr_io_read_t read, void * param);
+void avr_register_io_read(avr_t *avr, avr_io_addr_t addr, avr_io_read_t read, void * param);
 // register a callback for when the IO register is written. callback has to set the memory itself
-void avr_register_io_write(avr_t *avr, uint8_t addr, avr_io_write_t write, void * param);
+void avr_register_io_write(avr_t *avr, avr_io_addr_t addr, avr_io_write_t write, void * param);
 // call every IO modules until one responds to this
 int avr_ioctl(avr_t *avr, uint32_t ctl, void * io_param);
 // get the specific irq for a module, check AVR_IOCTL_IOPORT_GETIRQ for example
index 11700c89fa92e6d6f3de5d4e865db204182d4e0f..02d840a864a18045e04502c871debf60e296920e 100644 (file)
  * (or consecutive bits). This allows a way to set/get/clear them.
  * gcc is happy passing these as register value, so you don't need to
  * use a pointer when passing them along to functions.
+ *
+ * 9 bits ought to be enough, as it's the maximum I've seen (atmega2560)
  */
 typedef struct avr_regbit_t {
-       unsigned long reg : 8, bit : 3, mask : 8;
+       unsigned long reg : 9, bit : 3, mask : 8;
 } avr_regbit_t;
 
 /*