Skip to content

Instantly share code, notes, and snippets.

@neuro-sys
Created January 29, 2019 21:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save neuro-sys/d594da599f20728622f401d2c848ddbc to your computer and use it in GitHub Desktop.
Save neuro-sys/d594da599f20728622f401d2c848ddbc to your computer and use it in GitHub Desktop.
Amstrad CPC, CRTC Address Generator
#include <stdio.h>
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
#define VIDEO_ADDR(MA, RA) \
((MA & 0x3FF) << 1) | ((RA & 7) << 11) | ((MA & 0x3000) << 2)
#define PRINT_CHAR_ADDR
int main()
{
u8 R13;
u8 R12;
u8 R0;
u8 R9;
u8 R1;
u8 R6;
int clock;
R1 = 0x28;
R9 = 0x7;
R0 = 0x3F;
R12 = 0x30;
R13 = 0;
R6 = 25;
int refresh_addr = (u16) R13 | (((u16) R12 << 8));
clock = 0;
while (1) {
u16 MA; /* MA pins on CRTC */
u16 RA; /* Raster pins on CRTC */
int line;
line = clock / ((R9 + 1) * (R0 + 1));
MA = refresh_addr + (line * R1 + (clock % (R0 + 1)));
RA = (clock / (R0 + 1)) % (R9 + 1);
if (line >= R6) {
break;
}
#ifdef PRINT_ALL_ADDR
printf("%.4x", VIDEO_ADDR(MA, RA));
#endif
#ifdef PRINT_CHAR_ADDR
if (clock % (R0 + 1) == 0) {
static int c = 0;
if (c % (R9 + 1) == 0) {
printf("\n");
printf("%2d: ", (line + 1));
}
printf("%.4x", VIDEO_ADDR(MA, RA));
if ((c + 1) % (R9 + 1) != 0) {
printf(", ");
}
c += 1;
}
#endif
clock += 1;
}
return 0;
}
@neuro-sys
Copy link
Author

 1:   c000, c800, d000, d800, e000, e800, f000, f800
 2:   c050, c850, d050, d850, e050, e850, f050, f850
 3:   c0a0, c8a0, d0a0, d8a0, e0a0, e8a0, f0a0, f8a0
 4:   c0f0, c8f0, d0f0, d8f0, e0f0, e8f0, f0f0, f8f0
 5:   c140, c940, d140, d940, e140, e940, f140, f940
 6:   c190, c990, d190, d990, e190, e990, f190, f990
 7:   c1e0, c9e0, d1e0, d9e0, e1e0, e9e0, f1e0, f9e0
 8:   c230, ca30, d230, da30, e230, ea30, f230, fa30
 9:   c280, ca80, d280, da80, e280, ea80, f280, fa80
10:   c2d0, cad0, d2d0, dad0, e2d0, ead0, f2d0, fad0
11:   c320, cb20, d320, db20, e320, eb20, f320, fb20
12:   c370, cb70, d370, db70, e370, eb70, f370, fb70
13:   c3c0, cbc0, d3c0, dbc0, e3c0, ebc0, f3c0, fbc0
14:   c410, cc10, d410, dc10, e410, ec10, f410, fc10
15:   c460, cc60, d460, dc60, e460, ec60, f460, fc60
16:   c4b0, ccb0, d4b0, dcb0, e4b0, ecb0, f4b0, fcb0
17:   c500, cd00, d500, dd00, e500, ed00, f500, fd00
18:   c550, cd50, d550, dd50, e550, ed50, f550, fd50
19:   c5a0, cda0, d5a0, dda0, e5a0, eda0, f5a0, fda0
20:   c5f0, cdf0, d5f0, ddf0, e5f0, edf0, f5f0, fdf0
21:   c640, ce40, d640, de40, e640, ee40, f640, fe40
22:   c690, ce90, d690, de90, e690, ee90, f690, fe90
23:   c6e0, cee0, d6e0, dee0, e6e0, eee0, f6e0, fee0
24:   c730, cf30, d730, df30, e730, ef30, f730, ff30
25:   c780, cf80, d780, df80, e780, ef80, f780, ff80

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment