summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-12-30 18:13:22 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-12-30 18:13:22 +0000
commit3eb484bd4d79de731b743d9dccf9a2535b82699f (patch)
treed1294e332ccb95febfb82745a73d1cfcb29366bd
parentc5ba5065cbf2b43101f4c311f56d55a0ff99bad6 (diff)
downloadnuttx-3eb484bd4d79de731b743d9dccf9a2535b82699f.tar.gz
nuttx-3eb484bd4d79de731b743d9dccf9a2535b82699f.tar.bz2
nuttx-3eb484bd4d79de731b743d9dccf9a2535b82699f.zip
Integrating z80
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@463 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/TODO2
-rw-r--r--nuttx/arch/z80/include/z80/irq.h2
-rw-r--r--nuttx/arch/z80/src/common/up_head.asm13
-rw-r--r--nuttx/arch/z80/src/common/up_irq.c7
-rw-r--r--nuttx/arch/z80/src/z80/chip.h9
-rw-r--r--nuttx/configs/z80sim/defconfig4
-rw-r--r--nuttx/configs/z80sim/src/z80_irq.c17
-rw-r--r--nuttx/configs/z80sim/src/z80_timerisr.c1
-rw-r--r--nuttx/include/nuttx/sched.h2
-rw-r--r--nuttx/mm/mm_initialize.c2
10 files changed, 44 insertions, 15 deletions
diff --git a/nuttx/TODO b/nuttx/TODO
index 69250b169..a38b5b3d0 100644
--- a/nuttx/TODO
+++ b/nuttx/TODO
@@ -231,7 +231,7 @@ o Build system
Priority: Low
Description: Dependencies do not work correctly under configs/<board>/src
- (same as arch/<arch>/src/board).
+ (same as arch/<arch>/src/board) with SDCC.
Status: Open
Priority: Medium
diff --git a/nuttx/arch/z80/include/z80/irq.h b/nuttx/arch/z80/include/z80/irq.h
index a187fd4c3..12dd502c1 100644
--- a/nuttx/arch/z80/include/z80/irq.h
+++ b/nuttx/arch/z80/include/z80/irq.h
@@ -51,7 +51,7 @@
/* Z80 Interrupts */
-#define Z80_IRQ_SYSTIMER (1)
+#define Z80_IRQ_SYSTIMER (0)
#define NR_IRQS (1)
/* IRQ Stack Frame Format
diff --git a/nuttx/arch/z80/src/common/up_head.asm b/nuttx/arch/z80/src/common/up_head.asm
index 36a145be7..fd3bf20a1 100644
--- a/nuttx/arch/z80/src/common/up_head.asm
+++ b/nuttx/arch/z80/src/common/up_head.asm
@@ -111,15 +111,22 @@ forever:
push af ; Offset 0: I with interrupt state in carry
di
- ; Call the interrupt decode logic. SP points to the beggining of the reg structure
+ ; Call the interrupt decode logic. SP points to the beggining of the reg structure
+
ld hl, #0 ; Argument is the beginning of the reg structure
add hl, sp ;
- push hl ;
+ push hl ; Place argument at the top of thest
call _up_decodeirq ; Decode the IRQ
+ ; On return, HL points to the beginning of the reg structure to restore
+ ; Note that (1) the argument pushed on the stack is not popped, and (2) the
+ ; original stack pointer is lost. In the normal case (no context switch),
+ ; HL will contain the value of the SP before the argument was pushed.
+
+ ld sp, hl ; Use the new stack pointer
+
; Restore registers. HL points to the beginning of the reg structure to restore
- ld sp, hl ; Use the temp stack pointer
ex af, af' ; Select alternate AF
pop af ; Offset 0: AF' = I with interrupt state in carry
pop bc ; Offset 1: BC
diff --git a/nuttx/arch/z80/src/common/up_irq.c b/nuttx/arch/z80/src/common/up_irq.c
index 5f8897a41..ef7c8c1c6 100644
--- a/nuttx/arch/z80/src/common/up_irq.c
+++ b/nuttx/arch/z80/src/common/up_irq.c
@@ -92,13 +92,14 @@ irqstate_t irqsave(void) __naked
void irqrestore(irqstate_t flags) __naked
{
_asm
+ di ; Assume disabled
pop hl ; HL = return address
pop af ; AF Carry bit hold interrupt state
jr nc, statedisable
ei
- ret
statedisable:
- di
- ret
+ push af ; Restore stack
+ push hl ;
+ ret ; and return
_endasm;
}
diff --git a/nuttx/arch/z80/src/z80/chip.h b/nuttx/arch/z80/src/z80/chip.h
index 9f85f1475..d5c36bd19 100644
--- a/nuttx/arch/z80/src/z80/chip.h
+++ b/nuttx/arch/z80/src/z80/chip.h
@@ -45,6 +45,15 @@
* Definitions
************************************************************************************/
+/* Bits in the Z80 FLAGS register */
+
+#define Z80_C_FLAG 0x01 /* Bit 0: Carry flag */
+#define Z80_N_FLAG 0x02 /* Bit 1: Add/Subtract flag */
+#define Z80_PV_FLAG 0x04 /* Bit 2: Parity/Overflow flag */
+#define Z80_H_FLAG 0x10 /* Bit 4: Half carry flag */
+#define Z80_Z_FLAG 0x40 /* Bit 5: Zero flag */
+#define Z80_S_FLAG 0x80 /* Bit 7: Sign flag */
+
/************************************************************************************
* Public Function Prototypes
************************************************************************************/
diff --git a/nuttx/configs/z80sim/defconfig b/nuttx/configs/z80sim/defconfig
index 0603818d0..a993a6aeb 100644
--- a/nuttx/configs/z80sim/defconfig
+++ b/nuttx/configs/z80sim/defconfig
@@ -285,5 +285,5 @@ CONFIG_CUSTOM_STACK=n
CONFIG_PROC_STACK_SIZE=1024
CONFIG_PTHREAD_STACK_MIN=
CONFIG_PTHREAD_STACK_DEFAULT=
-CONFIG_HEAP_SIZE=32768
-CONFIG_HEAP_BASE=CONFIG_DRAM_SIZE-CONFIG_HEAP_SIZE
+CONFIG_HEAP_SIZE=
+CONFIG_HEAP_BASE=
diff --git a/nuttx/configs/z80sim/src/z80_irq.c b/nuttx/configs/z80sim/src/z80_irq.c
index b6e81b32e..5fd150359 100644
--- a/nuttx/configs/z80sim/src/z80_irq.c
+++ b/nuttx/configs/z80sim/src/z80_irq.c
@@ -76,10 +76,21 @@ void up_irqinitialize(void)
current_regs = NULL;
- /* And finally, enable interrupts */
+ /* Attach the timer interrupt -- There is not special timer interrupt
+ * enable in the simulation so it must be enabled here before interrupts
+ * are enabled.
+ *
+ * NOTE: Normally, there are seperate enables for "global" interrupts
+ * and specific device interrupts. In such a "normal" case, the timer
+ * interrupt should be attached and enabled in the the function up_timerinit()
+ */
+
+ irq_attach(Z80_IRQ_SYSTIMER, (xcpt_t)up_timerisr);
+
+ /* And finally, enable interrupts (including the timer) */
#ifndef CONFIG_SUPPRESS_INTERRUPTS
- irqrestore(TRUE);
+ irqrestore(Z80_C_FLAG);
#endif
}
@@ -93,7 +104,7 @@ void up_irqinitialize(void)
void up_disable_irq(int irq)
{
- irqrestore(FALSE);
+ irqrestore(0);
}
/****************************************************************************
diff --git a/nuttx/configs/z80sim/src/z80_timerisr.c b/nuttx/configs/z80sim/src/z80_timerisr.c
index e56678d13..a088d14b8 100644
--- a/nuttx/configs/z80sim/src/z80_timerisr.c
+++ b/nuttx/configs/z80sim/src/z80_timerisr.c
@@ -91,5 +91,6 @@ int up_timerisr(int irq, FAR chipreg_t *regs)
void up_timerinit(void)
{
+ /* The timer interrupt was attached in up_irqinitialize -- see comments there */
}
diff --git a/nuttx/include/nuttx/sched.h b/nuttx/include/nuttx/sched.h
index 1de713843..3fa2eace6 100644
--- a/nuttx/include/nuttx/sched.h
+++ b/nuttx/include/nuttx/sched.h
@@ -268,7 +268,7 @@ typedef struct _TCB _TCB;
/* This is the callback type used by sched_foreach() */
-typedef void (sched_foreach_t)(FAR _TCB *tcb, FAR void *arg);
+typedef void (*sched_foreach_t)(FAR _TCB *tcb, FAR void *arg);
#endif /* __ASSEMBLY__ */
diff --git a/nuttx/mm/mm_initialize.c b/nuttx/mm/mm_initialize.c
index 95b8a2037..c7416eaac 100644
--- a/nuttx/mm/mm_initialize.c
+++ b/nuttx/mm/mm_initialize.c
@@ -162,7 +162,7 @@ void mm_addregion(FAR void *heapstart, size_t heapsize)
heapend = MM_ALIGN_DOWN((size_t)heapstart + (size_t)heapsize);
heapsize = heapend - heapbase;
- mlldbg("Region %d: base=%p size=%d\n", IDX+1, heapstart, heapsize);
+ mlldbg("Region %d: base=%p size=%u\n", IDX+1, heapstart, heapsize);
/* Add the size of this region to the total size of the heap */