#include <ds80c390.h>
#include <time.h>
-#define Serial0GetChar getchar
-#define Serial0PutChar putchar
-
void Serial0Init (unsigned long baud, unsigned char buffered);
char Serial0GetChar(void);
void Serial0PutChar(char);
void Serial0SendBreak(void);
void Serial0Flush(void);
+void Serial0SwitchToBuffered(void); // ds400 only.
+
void Serial1Init (unsigned long baud, unsigned char buffered);
char Serial1GetChar(void);
void Serial1PutChar(char);
#define SERIAL_1_RECEIVE_BUFFER_SIZE 64
// I know someone is fooling with the crystals
-#define OSCILLATOR 18432000L
+#if defined(SDCC_ds400)
+# define OSCILLATOR 14745600L
+#else
+# define OSCILLATOR 18432000L
+#endif
/* Set the cpu speed in clocks per machine cycle, valid values are:
1024: Divide-by-1024 (power management) mode (screws ALL timers and serial)
4: Standard 8051 divide-by-4 mode
- 2: Use 2x xtal multiplier
+ 2: Use 2x xtal multiplier
1: Use 4x xtal multiplier (Don't do this with a TINI at 18.432MHz)
*/
#define CPU_SPEED 2
extern void LcdPutChar(char c);
extern void LcdPutString(char *string);
extern void LcdLPutString(unsigned int collumnRow, char *string);
-extern void LcdPrintf(const char *format, ...) reentrant;
-extern void LcdLPrintf(unsigned int collumnRow, const char *format, ...) reentrant;
+extern void LcdPrintf(const char *format, ...) __reentrant;
+extern void LcdLPrintf(unsigned int collumnRow, const char *format, ...) __reentrant;
// from i2c390.c
#define I2C_BUFSIZE 128
extern char I2CReset(void);
extern char I2CStart(void);
extern char I2CStop(void);
-extern char I2CSendStop(char addr, char count,
+extern char I2CSendStop(char addr, char count,
char send_stop);
extern char I2CReceive(char addr, char count);
-extern char I2CSendReceive(char addr, char tx_count,
+extern char I2CSendReceive(char addr, char tx_count,
char rx_count);
//extern char I2CByteOut(char);
//extern void I2CDumpError(char);
// internal functions used by tinibios.c
unsigned char _sdcc_external_startup(void);
-void Serial0IrqHandler (void) interrupt 4;
-void Serial1IrqHandler (void) interrupt 7;
+void Serial0IrqHandler (void) __interrupt 4;
+void Serial1IrqHandler (void) __interrupt 7;
+
+#if !defined(SDCC_ds400)
void ClockInit();
-void ClockIrqHandler (void) interrupt 1 _naked;
+void ClockIrqHandler (void) __interrupt 1 __naked;
+#endif
+
+#if defined(SDCC_ds400)
+// functions for dealing with the ds400 ROM firmware.
+
+// A wrapper which calls rom_init allocating all available RAM in CE0
+// to the heap, sets the serial port to SERIAL_0_BAUD, sets up the
+// millisecond timer, and diddles the clock multiplier.
+
+// Values for the romInit "speed" parameter.
+#define SPEED_1X 0 /* no clock multiplier, normal speed. */
+#define SPEED_2X 1 /* 2x clock multiplier. */
+#define SPEED_4X 2 /* 4x clock, DOESN'T WORK ON TINIm400! */
+
+unsigned char romInit(unsigned char noisy,
+ char speed);
+
+// Install an interrupt handler.
+void installInterrupt(void (*isrPtr)(void), unsigned char offset);
+#endif
+
#endif /* TINIBIOS_H */