-
Notifications
You must be signed in to change notification settings - Fork 3
/
test_dpcplus.c
115 lines (98 loc) · 2.91 KB
/
test_dpcplus.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "vcs.h"
#include "dpcplus.h"
#include "dpcplus_frequencies.h"
unsigned char X, Y;
#ifdef PAL
#define BLANK 48
#define KERNAL (192 + 36)
#define OVERSCAN 36
#else
#define BLANK 40
#define KERNAL 192
#define OVERSCAN 30
#endif
unsigned char *sprite_ptr;
unsigned char *color_ptr;
char ypos;
const display unsigned char sprite0[20] = { 0x12, 0x36, 0x4a, 0x33, 0x55, 0x33, 0xcb, 0xb6, 0x48, 0x3e, 0x5e, 0x6e, 0x76, 0x36, 0x84, 0xbc, 0x3a, 0x76, 0x66, 0x66};
const display unsigned char colors0[20] = { 0x3c, 0x3c, 0x3c, 0x0e, 0x0e, 0x0e, 0x3c, 0x3c, 0x3c, 0x3c, 0x38, 0x2c, 0x3c, 0x3c, 0x38, 0x38, 0x2c, 0x2c, 0x12, 0x12};
// This function is put to bank1 (instead of default bank0) just to check bankswitching
bank1 void init()
{
ypos = 100;
// Position sprite
strobe(WSYNC);
X = 6;
do { X--; } while (X >= 0);
strobe(RESP0);
strobe(WSYNC);
}
void main()
{
init();
while(1) {
*VBLANK = 2; // Enable VBLANK
*VSYNC = 2; // Set VSYNC
strobe(WSYNC); // Hold it for 3 scanlines
strobe(WSYNC);
strobe(WSYNC);
*VSYNC = 0; // Turn VSYNC Off
// Blank
*TIM64T = ((BLANK - 3) * 76 + 13) / 64;
// Do some logic here
// Prepare DPC sprites for drawing
// Set up first sprite
sprite_ptr = sprite0 - ypos;
*DF0HI = sprite_ptr >> 8;
*DF0LOW = sprite_ptr;
*DF0TOP = sprite0 - 1;
*DF0BOT = sprite0 + sizeof(sprite0);
// Set up color data stream
color_ptr = colors0 - ypos;
*DF1HI = color_ptr >> 8;
*DF1LOW = color_ptr;
*DF1TOP = colors0 - 1;
*DF1BOT = colors0 + sizeof(colors0);
// Joystick input
if (!(*SWCHA & 0x80)) *HMP0 = 0xF0; // Right
if (!(*SWCHA & 0x40)) *HMP0 = 0x10; // Left
if (!(*SWCHA & 0x20)) ypos++; // Down
if (!(*SWCHA & 0x10)) ypos--; // Up
// Apply movement
strobe(WSYNC);
strobe(HMOVE);
csleep(10);
// Stop moving
*HMP0 = 0;
// Apply movement
strobe(WSYNC);
strobe(HMOVE);
while (*INTIM);
strobe(WSYNC);
*VBLANK = 0;
// Image
// Do some logic here
#ifdef ENABLE_FASTFETCH
*FASTFETCH = 0x00; // Enable fast fetch DPC++ mode
#endif
for (Y = KERNAL + 1; Y != 0; Y--) {
#ifdef ENABLE_FASTFETCH
// 5 cycles TIA register update instead of 7 cycles
*GRP0 = DF0DATAW; // DF0DATAW fast fetch
*COLUP0 = DF1DATAW; // DF1DATAW fast fetch
#else
*GRP0 = *DF0DATAW;
*COLUP0 = *DF1DATAW;
#endif
strobe(WSYNC);
}
#ifdef ENABLE_FASTFETCH
*FASTFETCH = 0x0FF; // Disable fast fetch mode
#endif
// Overscan
*VBLANK = 2; // Enable VBLANK
*TIM64T = (OVERSCAN * 76 + 13) / 64;
// Do some logic here
while (*INTIM);
}
}