amiga_cyberspace

annotate src/main.c @ 1:b5d609c7161d

copper
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 26 Jul 2017 08:45:20 +0300
parents e6fd57053627
children b98fa9b135ea
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 }