Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1029 chrv 1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
 
5
#include <util/delay.h>
6
 
7
#include "mytypes.h"
8
#include "depacker_dirty.h"
9
#include "getfaraddress.h"
10
#include "pins.h"
11
#include "main.h"
12
#include "ps2.h"
13
#include "zx.h"
14
#include "spi.h"
15
#include "rs232.h"
16
#include "rtc.h"
17
#include "atx.h"
18
#include "joystick.h"
19
#include "tape.h"
20
#include "kbmap.h"
21
 
22
/** FPGA data pointer [far address] (linker symbol). */
23
extern ULONG fpga PROGMEM;
24
 
25
// FPGA data index..
26
volatile ULONG curFpga;
27
 
28
// Common flag register.
29
volatile UBYTE flags_register;
30
 
31
// Common modes register.
32
volatile UBYTE modes_register;
33
 
34
// Buffer for depacking FPGA configuration.
35
// You can USED for other purposed after setup FPGA.
36
UBYTE dbuf[DBSIZE];
37
 
38
void put_buffer(UWORD size)
39
{
40
        // writes specified length of buffer to the output
41
        UBYTE * ptr = dbuf;
42
 
43
        do
44
        {
45
                spi_send( *(ptr++) );
46
 
47
        } while(--size);
48
}
49
 
50
void hardware_init(void)
51
{
52
        //Initialized AVR pins
53
 
54
        cli(); // disable interrupts
55
 
56
        // configure pins
57
 
58
        PORTG = 0b11111111;
59
        DDRG  = 0b00000000;
60
 
61
//      PORTF = 0b11110000; // ATX off (zero output), fpga config/etc inputs
62
        DDRF  = 0b00001000;
63
 
64
        PORTE = 0b11110011;
65
        DDRE  = 0b00000000; // inputs pulled up, exclude PLL-control pins
66
 
67
        PORTD = 0b11111111;
68
        DDRD  = 0b00000000; // same
69
 
70
        PORTC = 0b11011111;
71
        DDRC  = 0b00000000; // PWRGOOD input, other pulled up
72
 
73
        PORTB = 0b11110001;
74
        DDRB  = 0b10000111; // LED off, spi outs inactive
75
 
76
        PORTA = 0b11111111;
77
        DDRA  = 0b00000000; // pulled up
78
 
79
        ACSR = 0x80; // DISABLE analog comparator
80
}
81
 
82
int main()
83
{
84
start:
85
 
86
        hardware_init();
87
 
88
        rs232_init();
89
#ifdef LOGENABLE
90
        to_log("VER:");
91
        {
92
                UBYTE b,i;
93
                ULONG version = 0x1DFF0;
94
                char VER[]="..";
95
                for( i=0; i<12; i++)
96
                {
97
                        dbuf[i] = pgm_read_byte_far(version+i);
98
                }
99
                dbuf[i]=0;
100
                to_log((char*)dbuf);
101
                to_log(" ");
102
                UBYTE b1 = pgm_read_byte_far(version+12);
103
                UBYTE b2 = pgm_read_byte_far(version+13);
104
                UBYTE day = b1&0x1F;
105
                UBYTE mon = ((b2<<3)+(b1>>5))&0x0F;
106
                UBYTE year = (b2>>1)&0x3F;
107
                VER[0] = '0'+(day/10);
108
                VER[1] = '0'+(day%10);
109
        to_log(VER);
110
        to_log(".");
111
                VER[0] = '0'+(mon/10);
112
                VER[1] = '0'+(mon%10);
113
        to_log(VER);
114
        to_log(".");
115
                VER[0] = '0'+(year/10);
116
                VER[1] = '0'+(year%10);
117
        to_log(VER);
118
        to_log("\r\n");
119
                //
120
                for( i=0; i<16; i++)
121
                {
122
                        b = pgm_read_byte_far(version+i);
123
                        VER[0] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
124
                        VER[1] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
125
                        to_log(VER);
126
                }
127
                to_log("\r\n");
128
        }
129
#endif
130
 
131
        wait_for_atx_power();
132
 
133
        spi_init();
134
 
135
        DDRF |= (1<<nCONFIG); // pull low for a time
136
        _delay_us(40);
137
        DDRF &= ~(1<<nCONFIG);
138
        while( !(PINF & (1<<nSTATUS)) ); // wait ready
139
 
140
        curFpga = GET_FAR_ADDRESS(fpga); // prepare for data fetching
141
#ifdef LOGENABLE
142
        {
143
        char log_fpga[]="F........\r\n";
144
        UBYTE b = (UBYTE)((curFpga>>24)&0xFF);
145
        log_fpga[1] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
146
        log_fpga[2] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
147
        b = (UBYTE)((curFpga>>16)&0xFF);
148
        log_fpga[3] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
149
        log_fpga[4] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
150
        b = (UBYTE)((curFpga>>8)&0xFF);
151
        log_fpga[5] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
152
        log_fpga[6] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
153
        b = (UBYTE)(curFpga&0xFF);
154
        log_fpga[7] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
155
        log_fpga[8] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
156
        to_log(log_fpga);
157
        }
158
#endif
159
        depacker_dirty();
160
#ifdef LOGENABLE
161
        to_log("depacker_dirty OK\r\n");
162
#endif
163
 
164
        //power led OFF
165
        LED_PORT |= 1<<LED;
166
 
167
        // start timer (led dimming and timeouts for ps/2)
168
        TCCR2 = 0b01110011; // FOC2=0, {WGM21,WGM20}=01, {COM21,COM20}=11, {CS22,CS21,CS20}=011
169
                            // clk/64 clocking,
170
                            // 1/512 overflow rate, total 11.059/32768 = 337.5 Hz interrupt rate
171
        TIFR = (1<<TOV2);
172
        TIMSK = (1<<TOIE2);
173
 
174
 
175
        //init some counters and registers
176
    ps2keyboard_count = 12;
177
        ps2keyboard_cmd_count = 0;
178
        ps2keyboard_cmd = 0;
179
        ps2mouse_count = 12;
180
        ps2mouse_initstep = 0;
181
        ps2mouse_resp_count = 0;
182
        flags_register = 0;
183
        modes_register = 0;
184
 
185
        //enable mouse
186
        zx_mouse_reset(1);
187
 
188
        //set external interrupt
189
        //INT4 - PS2 Keyboard  (falling edge)
190
        //INT5 - PS2 Mouse     (falling edge)
191
        //INT6 - SPI  (falling edge)
192
        //INT7 - RTC  (falling edge)
193
        EICRB = (1<<ISC41)+(0<<ISC40) + (1<<ISC51)+(0<<ISC50) + (1<<ISC61)+(0<<ISC60) + (1<<ISC71)+(0<<ISC70); // set condition for interrupt
194
        EIFR = (1<<INTF4)|(1<<INTF5)|(1<<INTF6)|(1<<INTF7); // clear spurious ints there
195
        EIMSK |= (1<<INT4)|(1<<INT5)|(1<<INT6)|(1<<INT7); // enable
196
 
197
        kbmap_init();
198
        zx_init();
199
        rtc_init();
200
 
201
#ifdef LOGENABLE
202
        to_log("zx_init OK\r\n");
203
#endif
204
 
205
        sei(); // globally go interrupting
206
 
207
        //set led on keyboard
208
        ps2keyboard_send_cmd(PS2KEYBOARD_CMD_SETLED);
209
 
210
        //main loop
211
        do
212
    {
213
            tape_task();
214
                ps2mouse_task();
215
        ps2keyboard_task();
216
        zx_task(ZX_TASK_WORK);
217
                zx_mouse_task();
218
                joystick_task();
219
 
220
                //event from SPI
221
                if ( flags_register&FLAG_SPI_INT )
222
                {
223
                        //get status byte
224
                        UBYTE status;
225
                        nSPICS_PORT &= ~(1<<nSPICS);
226
                        nSPICS_PORT |= (1<<nSPICS);
227
                        status = spi_send(0);
228
                        zx_wait_task( status );
229
                }
230
 
231
                atx_power_task();
232
    }
233
        while( (flags_register&FLAG_HARD_RESET) == 0 );
234
 
235
        goto start;
236
}