starting to become relocatable
[fw/sdcc] / device / examples / xa51 / hwinit.c
1 #include "hw.h"
2
3 #define DIVIDER (OSC/(64L*BAUD_RATE))
4
5 void external_startup(void) {
6   _asm
7     mov.b       _WDCON,#0       ;shut down the watchdog
8     mov.b       _WFEED1,#0a5h
9     mov.b       _WFEED2,#05ah
10 ;   mov.b       _BCR,#1 ;BCR: 8 data, 16 address
11 ;   mov.b       _SCR,#1 ;SCR: page zero mode
12   _endasm;
13
14   // init serial io
15   TL1 = RTL1 = -DIVIDER;
16   TH1 = RTH1 = -DIVIDER >> 8;
17   TR1 = 1;              /* enable timer 1 */
18   
19   S0CON = 0x52;         /* mode 1, receiver enable */
20   IPA4 |= 0x6;          /* maximum priority */
21   ERI0=1;               /* enable receiver interupts */
22   TI0==1;               /* transmitter empty */
23   RI0=0;                /* receiver empty */
24   
25   //PSWH &= 0xf0;       /* start interupt system */
26 }
27
28 #define SIMULATOR 1
29
30 #ifdef SIMULATOR
31
32 void putchar(char c) {
33   c; // hush the compiler
34   _asm
35     mov.b r0l, [r7+2]
36     trap #0EH;
37   _endasm;
38 }
39
40 #define getchar(x)
41
42 void exit_simulator(void) {
43   _asm
44     trap #0FH;
45   _endasm;
46 }
47
48 #else
49
50 void putchar(char c) {
51   while(!TI0) 
52     ;
53   S0BUF = c;
54   TI0 = 0;
55 }
56
57 char getchar(void) {
58   char  c;
59   
60   while (!RI0) 
61     ;
62   c=S0BUF;
63   RI0=0;
64   return c;
65 }
66
67 int kbhit(void) {
68   return RI0;
69 }
70
71 #endif
72
73 int puts(char *string) {
74   int chars=0;
75   while (*string) {
76     putchar (*string);
77     chars++;
78   }
79   putchar ('\n');
80   return chars+1;
81 }