/* ds81 - Nintendo DS ZX81 emulator. Copyright (C) 2006 Ian Cowburn This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. $Id$ */ #include #include #include #include "framebuffer.h" #include "gui.h" #include "keyboard.h" #include "z80.h" #include "zx81.h" #include "tapes.h" #include "splashimg_bin.h" #include "rom_font_bin.h" /* ---------------------------------------- STATIC DATA */ static const char *main_menu[]= { "Reset ZX81", "Select Tape", "Sticky Shift On", "Sticky Shift Off", "Cancel", NULL }; typedef enum { MenuReset, MenuSelectTape, MenuStickyOn, MenuStickyOff, } MenuOpt; /* ---------------------------------------- DISPLAY FUNCS */ static void VBlankFunc(void) { scanKeys(); } static void Splash(void) { static const char *text[]= { "DS81 \177 2006 Ian C", " ", "ZX81 ROM", "\177 1981", "Nine Tiles Networks LTD", " ", "3D MONSTER MAZE", "\177 1983", "Malcom E. Evans", " ", "PRESS A TO CONTINUE", " ", " ", "http://www.noddybox.co.uk/", NULL }; sImage img; int f; FB_Clear(); loadPCX(splashimg_bin,&img); image8to16(&img); FB_Blit(&img,0,0); for(f=0;text[f];f++) { FB_Centre(text[f],40+f*8,FB_RGB(31,31,31),-1); } ZX81DisplayString("10 print '%the zx81 is ace%'\n20 goto 10"); while(!(keysDown() & KEY_A)) { swiWaitForVBlank(); } } /* ---------------------------------------- MAIN */ int main(int argc, char *argv[]) { Z80 *z80; powerON(POWER_ALL_2D); /* Set up main text screen and grab the ROM character data */ videoSetMode(MODE_0_2D | DISPLAY_BG0_ACTIVE); vramSetBankA(VRAM_A_MAIN_BG_0x6000000); vramSetBankB(VRAM_B_MAIN_BG_0x6020000); BG0_CR = BG_COLOR_256|BG_MAP_BASE(0)|BG_TILE_BASE(1); BG0_X0 = 0; BG0_Y0 = 0; BG_PALETTE[0] = RGB15(31,31,31); BG_PALETTE[1] = RGB15(0,0,0); dmaCopy(rom_font_bin,(void *)BG_TILE_RAM(1),rom_font_bin_size); /* Set up the sub-screen for rotation (basically for use as a framebuffer) */ videoSetModeSub(MODE_5_2D | DISPLAY_BG2_ACTIVE); vramSetBankC(VRAM_C_SUB_BG_0x6200000); SUB_BG2_CR = BG_BMP16_256x256; SUB_BG2_XDX = 0x100; SUB_BG2_XDY = 0; SUB_BG2_YDX = 0; SUB_BG2_YDY = 0x100; SUB_BG2_CX = 0; SUB_BG2_CY = 0; irqInit(); irqSet(IRQ_VBLANK,VBlankFunc); keysSetRepeat(30,15); FB_Init(BG_GFX_SUB); z80 = Z80Init(ZX81ReadMem, ZX81WriteMem, ZX81ReadPort, ZX81WritePort, NULL); if (!z80) { return EXIT_FAILURE; } ZX81Init((uint16*)SCREEN_BASE_BLOCK(0), z80); Splash(); SK_DisplayKeyboard(BG_GFX_SUB); SK_SetSticky(SK_SHIFT,1); while(1) { SoftKeyEvent ev; Z80Exec(z80); while(SK_GetEvent(&ev)) { switch(ev.key) { case SK_ABOUT: case SK_CONFIG: if (ev.pressed) { switch(GUI_Menu(main_menu)) { case MenuReset: ZX81Reset(z80); break; case MenuSelectTape: SelectTape(); break; case MenuStickyOn: SK_SetSticky(SK_SHIFT,1); break; case MenuStickyOff: SK_SetSticky(SK_SHIFT,0); break; } SK_DisplayKeyboard(BG_GFX_SUB); } break; default: ZX81HandleKey(ev.key,ev.pressed); break; } } } return 0; }