rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <proto/exec.h>
|
nuclear@0
|
3 #include <exec/memory.h>
|
nuclear@0
|
4 #include "inttypes.h"
|
nuclear@1
|
5 #include "copper.h"
|
nuclear@0
|
6 #include "mouse.h"
|
nuclear@0
|
7 #include "hwregs.h"
|
nuclear@0
|
8
|
nuclear@0
|
9 #define WIDTH 480
|
nuclear@0
|
10 #define HEIGHT 128
|
nuclear@0
|
11
|
nuclear@0
|
12 #define BPLSIZE (WIDTH / 8 * HEIGHT)
|
nuclear@0
|
13 #define MAX_HSCROLL (WIDTH - 320)
|
nuclear@0
|
14 #define HMOD (MAX_HSCROLL / 8)
|
nuclear@0
|
15
|
nuclear@0
|
16 static uint16_t prev_intena, prev_intreq, prev_adkcon, prev_dmacon;
|
nuclear@0
|
17
|
nuclear@0
|
18 extern uint32_t backdrop;
|
nuclear@0
|
19
|
nuclear@0
|
20 int init(void);
|
nuclear@0
|
21 void cleanup(void);
|
nuclear@0
|
22 void wait_vpos(int x);
|
nuclear@0
|
23 void wait_vblank(void);
|
nuclear@0
|
24
|
nuclear@0
|
25 int main(void)
|
nuclear@0
|
26 {
|
nuclear@0
|
27 int x, y;
|
nuclear@0
|
28
|
nuclear@0
|
29 if(init() == -1) {
|
nuclear@0
|
30 return 1;
|
nuclear@0
|
31 }
|
nuclear@0
|
32
|
nuclear@0
|
33 while(!mouse_state(&x, &y)) {
|
nuclear@0
|
34 wait_vblank();
|
nuclear@0
|
35 REG32_BPL1PT = (uint32_t)&backdrop;
|
nuclear@0
|
36 }
|
nuclear@0
|
37
|
nuclear@0
|
38 cleanup();
|
nuclear@0
|
39 return 0;
|
nuclear@0
|
40 }
|
nuclear@0
|
41
|
nuclear@0
|
42 int init(void)
|
nuclear@0
|
43 {
|
nuclear@0
|
44 int i, x, y, bit;
|
nuclear@0
|
45 unsigned char *fbptr;
|
nuclear@0
|
46 unsigned char tmp;
|
nuclear@0
|
47
|
nuclear@0
|
48 Forbid();
|
nuclear@0
|
49
|
nuclear@1
|
50 /* initialize copper */
|
nuclear@1
|
51 if(init_copper(0, 0) == -1) {
|
nuclear@1
|
52 return -1;
|
nuclear@1
|
53 }
|
nuclear@1
|
54
|
nuclear@0
|
55 prev_dmacon = REG_DMACONR;
|
nuclear@0
|
56 REG_DMACON = CLRBITS(DMA_ALL);
|
nuclear@0
|
57
|
nuclear@0
|
58 prev_intena = REG_INTENAR;
|
nuclear@0
|
59 REG_INTENA = SETBITS(INTEN_ALL);
|
nuclear@0
|
60
|
nuclear@0
|
61 prev_intreq = REG_INTREQR;
|
nuclear@0
|
62 prev_adkcon = REG_ADKCONR;
|
nuclear@0
|
63
|
nuclear@0
|
64 REG_BPLCON0 = BPLCON0_COUNT(1) | BPLCON0_COLOR;
|
nuclear@0
|
65 REG_BPLCON1 = 0; /* h-scroll */
|
nuclear@0
|
66 REG_BPL1MOD = HMOD;
|
nuclear@0
|
67 REG_BPL2MOD = HMOD;
|
nuclear@0
|
68 REG_DIWSTART = 0x2981;
|
nuclear@0
|
69 REG_DIWSTOP = 0x29c1;
|
nuclear@0
|
70 REG_DDFSTART = 0x38;
|
nuclear@0
|
71 REG_DDFSTOP = 0xd0;
|
nuclear@0
|
72
|
nuclear@0
|
73 /* populate palette */
|
nuclear@0
|
74 REG_COLOR0 = 0;
|
nuclear@0
|
75 REG_COLOR1 = 0xfff;
|
nuclear@0
|
76
|
nuclear@0
|
77 wait_vblank();
|
nuclear@0
|
78 REG32_BPL1PT = (uint32_t)&backdrop;
|
nuclear@0
|
79
|
nuclear@1
|
80 add_copper(COPPER_VWAIT(40));
|
nuclear@1
|
81 add_copper(COPPER_MOVE(REGN_COLOR1, 0xf80));
|
nuclear@1
|
82 add_copper(COPPER_VWAIT(45));
|
nuclear@1
|
83 add_copper(COPPER_MOVE(REGN_COLOR1, 0xfff));
|
nuclear@1
|
84 add_copper(COPPER_END);
|
nuclear@0
|
85
|
nuclear@1
|
86 REG_DMACON = SETBITS(DMA_BPL | DMA_COPPER | DMA_MASTER);
|
nuclear@0
|
87 return 0;
|
nuclear@0
|
88 }
|
nuclear@0
|
89
|
nuclear@0
|
90 void cleanup(void)
|
nuclear@0
|
91 {
|
nuclear@0
|
92 REG_DMACON = CLRBITS(DMA_ALL);
|
nuclear@0
|
93 REG_DMACON = SETBITS(prev_dmacon);
|
nuclear@0
|
94
|
nuclear@0
|
95 REG_INTREQ = CLRBITS(0x7fff);
|
nuclear@0
|
96 REG_INTREQ = SETBITS(prev_intreq);
|
nuclear@0
|
97
|
nuclear@0
|
98 REG_ADKCON = CLRBITS(0x7fff);
|
nuclear@0
|
99 REG_ADKCON = SETBITS(prev_adkcon);
|
nuclear@0
|
100
|
nuclear@0
|
101 REG_INTENA = CLRBITS(INTEN_ALL);
|
nuclear@0
|
102 REG_INTENA = SETBITS(prev_intena);
|
nuclear@0
|
103
|
nuclear@1
|
104 cleanup_copper();
|
nuclear@0
|
105 Permit();
|
nuclear@0
|
106 }
|
nuclear@0
|
107
|
nuclear@0
|
108 void wait_vpos(int x)
|
nuclear@0
|
109 {
|
nuclear@0
|
110 x <<= 8;
|
nuclear@0
|
111 while((REG32_VPOSR & 0x1ff00) < x);
|
nuclear@0
|
112 }
|
nuclear@0
|
113
|
nuclear@0
|
114 void wait_vblank(void)
|
nuclear@0
|
115 {
|
nuclear@0
|
116 wait_vpos(300);
|
nuclear@0
|
117 }
|