aboutsummaryrefslogtreecommitdiff
path: root/source/seta018.c
blob: a608960d70ab1e933eea3ecc80c11666c3dd48c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "../copyright"

#include "seta.h"
#include "memmap.h"

ST018_Regs ST018;

uint8_t S9xGetST018(uint32_t Address)
{
   uint8_t t = 0; // Initialise to some value for the compiler
   uint16_t address = (uint16_t) Address & 0xFFFF;

   // these roles may be flipped
   // op output
   if (address == 0x3804)
   {
      if (ST018.out_count)
      {
         t = (uint8_t) ST018.output [ST018.out_index];
         ST018.out_index++;
         if (ST018.out_count == ST018.out_index)
            ST018.out_count = 0;
      }
      else
         t = 0x81;
   }
   else if (address == 0x3800) // status register
      t = ST018.status;

   return t;
}

void S9xSetST018(uint8_t Byte, uint32_t Address)
{
   uint16_t address = (uint16_t) Address & 0xFFFF;
   static bool reset = false;

   if (!reset) // bootup values
   {
      ST018.waiting4command = true;
      ST018.part_command = 0;
      reset = true;
   }

   Memory.SRAM[address] = Byte;
   ST018.status = 0x00; // default status for now

   if (address == 0x3804) // op data goes through this address
   {
      if (ST018.waiting4command && ST018.part_command == 2) // check for new commands: 3 bytes length
      {
         ST018.waiting4command = false;
         ST018.command <<= 8;
         ST018.command |= Byte;
         ST018.in_index = 0;
         ST018.out_index = 0;
         ST018.part_command = 0; // 3-byte commands
         ST018.pass = 0;   // data streams into the chip
         switch (ST018.command & 0xFFFFFF)
         {
         case 0x0100:
         case 0xFF00:
            ST018.in_count = 0;
            break;
         default:
            ST018.waiting4command = true;
            break;
         }
      }
      else if (ST018.waiting4command) // 3-byte commands
      {
         ST018.part_command++;
         ST018.command <<= 8;
         ST018.command |= Byte;
      }
   }
   else if (address == 0x3802) // extra parameters
   {
      ST018.parameters[ST018.in_index] = Byte;
      ST018.in_index++;
   }

   if (ST018.in_count == ST018.in_index) // Actually execute the command
   {
      ST018.waiting4command = true;
      ST018.in_index = 0;
      ST018.out_index = 0;
      switch (ST018.command)
      {
      case 0x0100:
      case 0xFF00: // hardware check?
         ST018.waiting4command = false;
         ST018.pass++;
         if (ST018.pass == 1)
         {
            ST018.in_count = 1;
            ST018.out_count = 2;

            // Overload's research
            ST018.output[0x00] = 0x81;
            ST018.output[0x01] = 0x81;
         }
         else
         {
            ST018.out_count = 3;
            ST018.output[0x02] = 0x81;

            // done processing requests
            if (ST018.pass == 3)
               ST018.waiting4command = true;
         }
         break;
      }
   }
}