94c80f203446e9ef113a4f895a6063edf7198ef9
[picodrive.git] / pico / pico / pico.c
1 /*
2  * PicoDrive
3  * (C) notaz, 2008
4  * (C) irixxxx, 2024
5  *
6  * This work is licensed under the terms of MAME license.
7  * See COPYING file in the top-level directory.
8  */
9 #include "../pico_int.h"
10
11 // x: 0x03c - 0x19d
12 // y: 0x1fc - 0x2f7
13 //    0x2f8 - 0x3f3
14 picohw_state PicoPicohw;
15
16
17
18 PICO_INTERNAL void PicoReratePico(void)
19 {
20   PicoPicoPCMRerate();
21   PicoPicohw.xpcm_ptr = PicoPicohw.xpcm_buffer + PicoPicohw.fifo_bytes;
22 }
23
24 static void PicoLinePico(void)
25 {
26   // update sound so that irq for FIFO refill is generated
27   if ((PicoPicohw.fifo_bytes | !PicoPicoPCMBusyN()) && (Pico.m.scanline & 7) == 7)
28     PsndDoPCM(cycles_68k_to_z80(SekCyclesDone() - Pico.t.m68c_frame_start));
29 }
30
31 static void PicoResetPico(void)
32 {
33   PicoPicoPCMResetN(1);
34   PicoPicoPCMStartN(1);
35   PicoPicohw.xpcm_ptr = PicoPicohw.xpcm_buffer;
36   PicoPicohw.fifo_bytes = 0;
37   PicoPicohw.r12 = 0;
38
39   PicoPicohw.pen_pos[0] = PicoPicohw.pen_pos[1] = 0x8000;
40
41   PicoPicoPCMIrqEn(0);
42   PicoPicoPCMFilter(0);
43   PicoPicoPCMGain(8);
44
45   // map version register
46   PicoDetectRegion();
47   switch (Pico.m.hardware >> 6) {
48     case 0: PicoPicohw.r1 = 0x40; break; // JP NTSC
49     case 1: PicoPicohw.r1 = 0x00; break; // JP PAL
50     case 2: PicoPicohw.r1 = 0x60; break; // US
51     case 3: PicoPicohw.r1 = 0x20; break; // EU
52   }
53 }
54
55 PICO_INTERNAL void PicoInitPico(void)
56 {
57   elprintf(EL_STATUS, "Pico startup");
58   PicoLineHook = PicoLinePico;
59   PicoResetHook = PicoResetPico;
60
61   PicoIn.AHW = PAHW_PICO;
62   memset(&PicoPicohw, 0, sizeof(PicoPicohw));
63   PicoPicohw.pen_pos[0] = PicoPicohw.pen_pos[1] = 0x8000;
64 }