Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/types.h>
- #include <stdint.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "hw_md.h"
- #include "files.h"
- #define HIRES_BMP 1
- static unsigned short clookup[8] = { 0, 1, 1, 2, 3, 4, 5, 5 };
- extern int z80_ambtc_start;
- extern int z80_ambtc_end;
- void load_driver(void)
- {
- // hold z80 bus - halt z80
- z80_busrequest(Z80_BUS_REQUEST);
- // clear z80 sram
- z80_memclr((void *)0xA00000, 0x2000);
- // copy driver to z80 sram
- z80_memcpy((void *)0xA00000, &z80_ambtc_start, (int)&z80_ambtc_end - (int)&z80_ambtc_start);
- // reset z80
- z80_reset(Z80_ASSERT_RESET);
- // release z80 bus
- z80_busrequest(Z80_BUS_RELEASE);
- // finish z80 reset - start driver
- z80_reset(Z80_CLEAR_RESET);
- }
- int start_song(char *fname)
- {
- volatile uint8_t *pb;
- int fd;
- int addr = 0, len = 0;
- for (fd = 0; fd < NUM_FILES; fd++)
- if (!memcmp(fname, fileName[fd], strlen(fname)))
- {
- addr = filePtr[fd];
- len = fileSize[fd];
- break;
- }
- if (!addr || !len)
- return 0; // bad filename
- z80_busrequest(Z80_BUS_REQUEST);
- // point to Z80 base parameters
- pb = (uint8_t *)0xA00040;
- // sample address
- pb[0x00] = addr >> 0;
- pb[0x01] = addr >> 8;
- pb[0x02] = addr >> 16;
- // sample length
- pb[0x03] = len >> 0;
- pb[0x04] = len >> 8;
- pb[0x05] = len >> 16;
- // DELAY - set the playback sample rate
- pb[0x0C] = 4; // ~ 22000 samples/sec
- // PAN (left / right / center)
- pb[0x0D] = 0xC0; // center
- // PLAY
- pb[0x0E] = -1; // play forever
- // PAUSE
- pb[0x0F] = 0;
- z80_busrequest(Z80_BUS_RELEASE);
- return 1;
- }
- void stop_song(void)
- {
- volatile uint8_t *pb;
- z80_busrequest(Z80_BUS_REQUEST);
- // point to Z80 base parameters
- pb = (uint8_t *)0xA00040;
- // PAUSE
- pb[0x0F] = 1; // pause
- // PLAY
- pb[0x0E] = 0; // stop
- z80_busrequest(Z80_BUS_RELEASE);
- delay(2);
- }
- void pause_song(short flag)
- {
- volatile uint8_t *pb;
- z80_busrequest(Z80_BUS_REQUEST);
- // point to Z80 base parameters
- pb = (uint8_t *)0xA00040;
- // PAUSE
- pb[0x0F] = flag; // pause
- z80_busrequest(Z80_BUS_RELEASE);
- }
- int is_playing(void)
- {
- volatile uint8_t *pb, res;
- z80_busrequest(Z80_BUS_REQUEST);
- // point to Z80 base parameters
- pb = (uint8_t *)0xA00040;
- // PLAY
- res = pb[0x0E];
- z80_busrequest(Z80_BUS_RELEASE);
- return res;
- }
- int bmp_valid(void *bmp)
- {
- char *p = (char *)bmp;
- return (p[0] == 'B' && p[1] == 'M' && p[14] == 40) ? 1 : 0;
- }
- int bmp_width(void *bmp)
- {
- unsigned char *p = (unsigned char *)bmp;
- return p[0x12] | (p[0x13]<<8) | (p[0x14]<<16) | (p[0x15]<<24);
- }
- int bmp_height(void *bmp)
- {
- unsigned char *p = (unsigned char *)bmp;
- return p[0x16] | (p[0x17]<<8) | (p[0x18]<<16) | (p[0x19]<<24);
- }
- inline unsigned short swap(unsigned short val)
- {
- return (val>>8) | (val<<8);
- }
- inline unsigned short blue(unsigned short color)
- {
- unsigned short ret = clookup[(swap(color)&0x001F)>>2];
- return ret ? ret : 0;
- }
- inline unsigned short green(unsigned short color)
- {
- unsigned short ret = clookup[(swap(color)&0x03E0)>>7];
- return ret ? ret+5 : 0;
- }
- inline unsigned short red(unsigned short color)
- {
- unsigned short ret = clookup[(swap(color)&0x7C00)>>12];
- return ret ? ret+10 : 0;
- }
- int main(void)
- {
- unsigned short current = 0, next;
- clear_screen();
- clear_text();
- put_str("Direct Color Graphics Test", TEXT_WHITE, 20-13, 2);
- // load Z80 driver
- load_driver();
- if (start_song(fileName[0]))
- {
- put_str(" ", TEXT_WHITE, 2, 5);
- put_str("Playing:", TEXT_GREEN, 2, 5);
- put_str(fileName[0], TEXT_RED, 11, 5);
- }
- else
- {
- put_str(" ", TEXT_WHITE, 2, 5);
- put_str("Error:", TEXT_GREEN, 2, 5);
- put_str(fileName[0], TEXT_RED, 11, 5);
- }
- while (1)
- {
- next = (gTicks / 600) % (NUM_FILES - 1) + 1;
- if (next != current)
- {
- unsigned short *p;
- unsigned short sc, dc;
- void *bmp = (void *)filePtr[next];
- int x, y, yy, offs, w, h;
- clear_screen();
- if (bmp_valid(bmp))
- {
- p = (unsigned short *)((int)bmp + 0x36);
- w = bmp_width(bmp);
- h = bmp_height(bmp);
- #ifdef HIRES_BMP
- // draw hires bmp to bitmap
- for (yy=0; yy<h; yy++)
- {
- y = (h - 1) - yy; // draw bottom to top
- offs = 0x1C00 + ((((yy & 0xF8)<<3) + ((yy & 0xF8)<<5))<<2) + ((yy & 7)<<2);
- for (x=0; x<w; x+=8)
- {
- if (!(yy & 1))
- {
- // R0G1R2G3R4G5R6G7
- sc = p[y*w + x];
- dc = red(sc) << 12; // R0
- sc = p[y*w + x + 1];
- dc |= green(sc) << 8; // G1
- sc = p[y*w + x + 2];
- dc |= red(sc) << 4; // R2
- sc = p[y*w + x + 3];
- dc |= green(sc); // G3
- set_vram(offs, dc);
- sc = p[y*w + x + 4];
- dc = red(sc) << 12; // R4
- sc = p[y*w + x + 5];
- dc |= green(sc) << 8; // G5
- sc = p[y*w + x + 6];
- dc |= red(sc) << 4; // R6
- sc = p[y*w + x + 7];
- dc |= green(sc); // G7
- next_vram(dc);
- }
- else
- {
- // G0B1G2B3G4B5G6B7
- sc = p[y*w + x];
- dc = green(sc) << 12; // G0
- sc = p[y*w + x + 1];
- dc |= blue(sc) << 8; // B1
- sc = p[y*w + x + 2];
- dc |= green(sc) << 4; // G2
- sc = p[y*w + x + 3];
- dc |= blue(sc); // B3
- set_vram(offs, dc);
- sc = p[y*w + x + 4];
- dc = green(sc) << 12; // G4
- sc = p[y*w + x + 5];
- dc |= blue(sc) << 8; // B5
- sc = p[y*w + x + 6];
- dc |= green(sc) << 4; // G6
- sc = p[y*w + x + 7];
- dc |= blue(sc); // B7
- next_vram(dc);
- }
- offs += 32;
- }
- }
- for (y=h; y<224; y++)
- {
- offs = 0x1C00 + ((((y & 0xF8)<<3) + ((y & 0xF8)<<5))<<2) + ((y & 7)<<2);
- for (x=0; x<w; x+=8)
- {
- set_vram(offs, 0);
- next_vram(0);
- offs += 32;
- }
- }
- #else
- // draw lores bmp to bitmap
- for (yy=0; yy<h; yy++)
- {
- y = (h - 1) - yy; // draw bottom to top
- offs = 0x1C00 + ((((yy*2 & 0xF8)<<3) + ((yy*2 & 0xF8)<<5))<<2) + ((yy*2 & 7)<<2);
- for (x=0; x<w; x+=4)
- {
- // R0G0R1G1R2G2R3G3
- sc = p[y*w + x];
- dc = red(sc) << 12; // R0
- dc |= green(sc) << 8; // G0
- sc = p[y*w + x + 1];
- dc |= red(sc) << 4; // R1
- dc |= green(sc); // G1
- set_vram(offs, dc);
- sc = p[y*w + x + 2];
- dc = red(sc) << 12; // R2
- dc |= green(sc) << 8; // G2
- sc = p[y*w + x + 3];
- dc |= red(sc) << 4; // R3
- dc |= green(sc); // G3
- next_vram(dc);
- // G0B0G1B1G2B2G3B3
- sc = p[y*w + x];
- dc = green(sc) << 12; // G0
- dc |= blue(sc) << 8; // B0
- sc = p[y*w + x + 1];
- dc |= green(sc) << 4; // G1
- dc |= blue(sc); // B1
- next_vram(dc);
- sc = p[y*w + x + 2];
- dc = green(sc) << 12; // G2
- dc |= blue(sc) << 8; // B2
- sc = p[y*w + x + 3];
- dc |= green(sc) << 4; // G3
- dc |= blue(sc); // B3
- next_vram(dc);
- offs += 32;
- }
- }
- for (y=h; y<112; y++)
- {
- offs = 0x1C00 + ((((y*2 & 0xF8)<<3) + ((y*2 & 0xF8)<<5))<<2) + ((y*2 & 7)<<2);
- for (x=0; x<w; x+=4)
- {
- set_vram(offs, 0);
- next_vram(0);
- next_vram(0);
- next_vram(0);
- offs += 32;
- }
- }
- #endif
- // show bitmap
- map_screen();
- }
- current = next;
- }
- delay(10);
- }
- clear_screen();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment