void MSU1::serialize(serializer &s) {
  Processor::serialize(s);

  s.integer(mmio.data_offset);
  s.integer(mmio.audio_offset);
  s.integer(mmio.audio_loop_offset);

  s.integer(mmio.audio_track);
  s.integer(mmio.audio_volume);

  s.integer(mmio.data_busy);
  s.integer(mmio.audio_busy);
  s.integer(mmio.audio_repeat);
  s.integer(mmio.audio_play);
  s.integer(mmio.audio_error);

  if(datafile.open()) datafile.close();
  if(datafile.open(string(cartridge.basename(), ".msu"), file::mode::read)) {
    datafile.seek(mmio.data_offset);
  }

  if(audiofile.open()) audiofile.close();
  if(audiofile.open(string(cartridge.basename(), "-", mmio.audio_track, ".pcm"), file::mode::read)) {
    audiofile.seek(mmio.audio_offset);
  }
}
 void serialize(serializer &s) {
   s.integer(basecounter);
   s.integer(heapsize);
   for(unsigned n = 0; n < heapcapacity; n++) {
     s.integer(heap[n].counter);
     s.integer(heap[n].event);
   }
 }
Example #3
0
void PPUcounter::serialize(serializer &s) {
  s.integer(status.hcounter);
  s.integer(status.vcounter);
  s.integer(status.lineclocks);
  s.integer(status.prev_lineclocks);
  s.array(status.fieldlines);
  s.integer(status.field);
}
Example #4
0
void MSU1::serialize(serializer &s) {
  Thread::serialize(s);

  s.integer(mmio.data_offset);
  s.integer(mmio.audio_offset);
  s.integer(mmio.audio_loop_offset);

  s.integer(mmio.audio_track);
  s.integer(mmio.audio_volume);

  s.integer(mmio.data_busy);
  s.integer(mmio.audio_busy);
  s.integer(mmio.audio_repeat);
  s.integer(mmio.audio_play);

  if(datafile.open()) datafile.close();
  if(datafile.open({interface->path(0), "msu1.rom"}, file::mode::read)) {
    datafile.seek(mmio.data_offset);
  }

  if(audiofile.open()) audiofile.close();
  if(audiofile.open({interface->path(0), "track-", mmio.audio_track, ".pcm"}, file::mode::read)) {
    audiofile.seek(mmio.audio_offset);
  }
}
Example #5
0
void PPUcounter::serialize(serializer &s) {
  s.integer(status.interlace);
  s.integer(status.field);
  s.integer(status.vcounter);
  s.integer(status.hcounter);

  s.array(history.field);
  s.array(history.vcounter);
  s.array(history.hcounter);
  s.integer(history.index);
}
Example #6
0
void serialize(serializer &s) {
  Board::serialize(s);

  s.integer(prg_bank);
  s.integer(chr_bank[0][0]);
  s.integer(chr_bank[0][1]);
  s.integer(chr_bank[1][0]);
  s.integer(chr_bank[1][1]);
  s.integer(mirror);
  s.array(latch);
}
void PPU::serialize(serializer &s) {
  PPUcounter::serialize(s);

  s.integer(status.render_output);
  s.integer(status.frame_executed);
  s.integer(status.frames_updated);
  s.integer(status.frames_rendered);
  s.integer(status.frames_executed);

  s.integer(ppu1_version);
  s.integer(ppu2_version);
}
Example #8
0
void System::serialize(serializer &s) {
  s.integer((unsigned&)region);
  s.integer((unsigned&)expansion);

  s.integer(scheduler.clock.cpu_freq);
  s.integer(scheduler.clock.smp_freq);

  s.integer(scheduler.clock.cpucop);
  s.integer(scheduler.clock.cpuppu);
  s.integer(scheduler.clock.cpusmp);
  s.integer(scheduler.clock.smpdsp);
}
Example #9
0
bool System::unserialize(serializer& s) {
  unsigned signature, version;
  char hash[64], description[512];

  s.integer(signature);
  s.integer(version);
  s.array(hash);
  s.array(description);

  if(signature != 0x31545342) return false;
  if(version != Info::SerializerVersion) return false;

  power();
  serialize_all(s);
  return true;
}
Example #10
0
void serialize(serializer &s) {
  Board::serialize(s);

  s.integer(mmu_port);
  s.integer(apu_port);

  s.array(prg_bank);
  s.array(chr_bank);
  s.integer(mirror);
  s.integer(irq_enable);
  s.integer(irq_counter_enable);
  s.integer(irq_counter);

  pulse[0].serialize(s);
  pulse[1].serialize(s);
  pulse[2].serialize(s);
}
Example #11
0
bool System::unserialize(serializer &s) {
  unsigned signature, version, crc32;
  char description[512];

  s.integer(signature);
  s.integer(version);
  s.integer(crc32);
  s.array(description);

  if(signature != 0x31545342) return false;
  if(version != bsnesSerializerVersion) return false;
//if(crc32 != cartridge.crc32()) return false;
  scheduler.init();

  serialize_all(s);
  return true;
}
Example #12
0
void HSU1::serialize(serializer& s) {
  s.integer(txbusy);
  s.integer(rxbusy);
  s.integer(txlatch);

  unsigned size;

  size = txbuffer.size();
  s.integer(size);
  txbuffer.resize(size);
  s.array(txbuffer.data(), txbuffer.size());

  size = rxbuffer.size();
  s.integer(size);
  rxbuffer.resize(size);
  s.array(rxbuffer.data(), rxbuffer.size());
}
Example #13
0
void serialize(serializer &s) {
  s.array(prg_bank);
  s.array(chr_bank);
  s.integer(mirror);

  s.integer(irq_latch);
  s.integer(irq_mode);
  s.integer(irq_enable);
  s.integer(irq_acknowledge);

  s.integer(irq_counter);
  s.integer(irq_scalar);
  s.integer(irq_line);
}
Example #14
0
void ArmDSP::serialize(serializer &s) {
  ARM::serialize(s);
  Thread::serialize(s);

  s.array(programRAM, 16 * 1024);

  s.integer(bridge.cputoarm.ready);
  s.integer(bridge.cputoarm.data);
  s.integer(bridge.armtocpu.ready);
  s.integer(bridge.armtocpu.data);
  s.integer(bridge.timer);
  s.integer(bridge.timerlatch);
  s.integer(bridge.reset);
  s.integer(bridge.ready);
  s.integer(bridge.signal);
}
Example #15
0
void serialize(serializer &s) {
  s.integer(prg_bank);
  s.integer(irq_mode);
  s.integer(irq_enable);
  s.integer(irq_acknowledge);
  s.integer(irq_latch);
  s.integer(irq_counter.w);
  s.integer(irq_line);
}
Example #16
0
void SPC7110::Decomp::serialize(serializer &s) {
  s.integer(decomp_mode);
  s.integer(decomp_offset);

  s.array(decomp_buffer, decomp_buffer_size);
  s.integer(decomp_buffer_rdoffset);
  s.integer(decomp_buffer_wroffset);
  s.integer(decomp_buffer_length);

  for(unsigned n = 0; n < 32; n++) {
    s.integer(context[n].index);
    s.integer(context[n].invert);
  }
}
Example #17
0
void Cx4::serialize(serializer &s) {
  Processor::serialize(s);

  for(auto& n : stack) s.integer(n);
  s.integer(opcode);

  s.integer(regs.halt);
  s.integer(regs.cachePage);
  s.integer(regs.irqPending);
  
  s.integer(regs.rwbusaddr);
  s.integer(regs.rwbustime);
  s.integer(regs.writebus);
  s.integer(regs.writebusdata);

  s.integer(regs.pc);
  s.integer(regs.p);
  s.integer(regs.n);
  s.integer(regs.z);
  s.integer(regs.v);
  s.integer(regs.c);

  s.integer(regs.a);
  s.integer(regs.acch);
  s.integer(regs.accl);
  s.integer(regs.busdata);
  s.integer(regs.romdata);
  s.integer(regs.ramdata);
  s.integer(regs.busaddr);
  s.integer(regs.ramaddr);
  for(auto& n : regs.gpr) s.integer(n);
  s.integer(regs.mdr);

  s.integer(mmio.dma);
  s.integer(mmio.suspend);
  s.integer(mmio.cacheLoading);
  s.integer(mmio.dmaSource);
  s.integer(mmio.dmaLength);
  s.integer(mmio.dmaTarget);
  s.integer(mmio.cachePreload);
  s.integer(mmio.programOffset);
  s.integer(mmio.pageNumber);
  s.integer(mmio.programCounter);
  s.integer(mmio.romSpeed);
  s.integer(mmio.ramSpeed);
  s.integer(mmio.irqDisable);
  s.integer(mmio.r1f52);
  s.integer(mmio.suspendCycles);
  s.array(mmio.vector);
  
  for(auto& page : cache) {
    s.integer(page.lock);
    s.integer(page.pageNumber);
    s.array(page.data);
  }
}
Example #18
0
void Random::serialize(serializer& s) {
  s.integer(_random.seed);
}
Example #19
0
 inline void serialize(serializer &s) {
   s.integer(frequency);
   s.integer(clock);
 }
Example #20
0
void DSP2::serialize(serializer &s) {
  s.integer(status.waiting_for_command);
  s.integer(status.command);
  s.integer(status.in_count);
  s.integer(status.in_index);
  s.integer(status.out_count);
  s.integer(status.out_index);

  s.array(status.parameters);
  s.array(status.output);

  s.integer(status.op05transparent);
  s.integer(status.op05haslen);
  s.integer(status.op05len);
  s.integer(status.op06haslen);
  s.integer(status.op06len);
  s.integer(status.op09word1);
  s.integer(status.op09word2);
  s.integer(status.op0dhaslen);
  s.integer(status.op0doutlen);
  s.integer(status.op0dinlen);
}
Example #21
0
void SPC7110::serialize(serializer &s) {
  s.integer(r4801);
  s.integer(r4802);
  s.integer(r4803);
  s.integer(r4804);
  s.integer(r4805);
  s.integer(r4806);
  s.integer(r4807);
  s.integer(r4808);
  s.integer(r4809);
  s.integer(r480a);
  s.integer(r480b);
  s.integer(r480c);
  decomp.serialize(s);

  s.integer(r4811);
  s.integer(r4812);
  s.integer(r4813);
  s.integer(r4814);
  s.integer(r4815);
  s.integer(r4816);
  s.integer(r4817);
  s.integer(r4818);
  s.integer(r481x);
  s.integer(r4814_latch);
  s.integer(r4815_latch);

  s.integer(r4820);
  s.integer(r4821);
  s.integer(r4822);
  s.integer(r4823);
  s.integer(r4824);
  s.integer(r4825);
  s.integer(r4826);
  s.integer(r4827);
  s.integer(r4828);
  s.integer(r4829);
  s.integer(r482a);
  s.integer(r482b);
  s.integer(r482c);
  s.integer(r482d);
  s.integer(r482e);
  s.integer(r482f);

  s.integer(r4830);
  s.integer(r4831);
  s.integer(r4832);
  s.integer(r4833);
  s.integer(r4834);

  s.integer(dx_offset);
  s.integer(ex_offset);
  s.integer(fx_offset);

  s.integer(r4840);
  s.integer(r4841);
  s.integer(r4842);

  s.array(rtc,20);
  s.integer(rtc_state);
  s.integer(rtc_mode);
  s.integer(rtc_index);
}
Example #22
0
void SuperFX::serialize(serializer &s) {
  //superfx.hpp
  s.integer(clockmode);
  s.integer(instruction_counter);

  //core/registers.hpp
  s.integer(regs.pipeline);
  s.integer(regs.ramaddr);

  s.integer(regs.r[ 0].data);
  s.integer(regs.r[ 1].data);
  s.integer(regs.r[ 2].data);
  s.integer(regs.r[ 3].data);
  s.integer(regs.r[ 4].data);
  s.integer(regs.r[ 5].data);
  s.integer(regs.r[ 6].data);
  s.integer(regs.r[ 7].data);
  s.integer(regs.r[ 8].data);
  s.integer(regs.r[ 9].data);
  s.integer(regs.r[10].data);
  s.integer(regs.r[11].data);
  s.integer(regs.r[12].data);
  s.integer(regs.r[13].data);
  s.integer(regs.r[14].data);
  s.integer(regs.r[15].data);

  s.integer(regs.sfr.irq);
  s.integer(regs.sfr.b);
  s.integer(regs.sfr.ih);
  s.integer(regs.sfr.il);

  {
   bool alt1 = regs.sfr.alt & 0x100;
   bool alt2 = regs.sfr.alt & 0x200;

   s.integer(alt2);
   s.integer(alt1);

   regs.sfr.alt = (alt1 << 8) | (alt2 << 9);
  }

  s.integer(regs.sfr.r);
  s.integer(regs.sfr.g);
  s.integer(regs.sfr.ov);
  s.integer(regs.sfr.s);
  s.integer(regs.sfr.cy);
  s.integer(regs.sfr.z);

  s.integer(regs.pbr);
  s.integer(regs.rombr);
  s.integer(regs.rambr);
  s.integer(regs.cbr);
  s.integer(regs.scbr);

  s.integer(regs.scmr.ht);
  s.integer(regs.scmr.ron);
  s.integer(regs.scmr.ran);
  s.integer(regs.scmr.md);

  s.integer(regs.colr);

  s.integer(regs.por.obj);
  s.integer(regs.por.freezehigh);
  s.integer(regs.por.highnibble);
  s.integer(regs.por.dither);
  s.integer(regs.por.transparent);

  s.integer(regs.bramr);
  s.integer(regs.vcr);

  s.integer(regs.cfgr.irq);
  s.integer(regs.cfgr.ms0);

  s.integer(regs.clsr);

  s.integer(regs.romcl);
  s.integer(regs.romdr);

  s.integer(regs.ramcl);
  s.integer(regs.ramar);
  s.integer(regs.ramdr);

  s.integer(regs.sreg);
  s.integer(regs.dreg);

  s.array(cache.buffer);
  s.array(cache.valid);

  for(unsigned i = 0; i < 2; i++) {
    s.integer(pixelcache[i].offset);
    s.integer(pixelcache[i].bitpend);
    s.array(pixelcache[i].data);
  }

  //timing/timing.hpp
  s.integer(cache_access_speed);
  s.integer(memory_access_speed);
  r15_NOT_modified = !r15_NOT_modified;
  s.integer(r15_NOT_modified);
  r15_NOT_modified = !r15_NOT_modified;
}
Example #23
0
void PPU::serialize(serializer &s) {
  Thread::serialize(s);

  s.array(screen);
  s.array(line);
  s.array(origin);

  s.array(vram);
  s.array(oam);
  s.array(bgp);
  s.array(obp[0]);
  s.array(obp[1]);
  s.array(bgpd);
  s.array(obpd);

  s.integer(status.lx);
  s.integer(status.wyc);

  s.integer(status.display_enable);
  s.integer(status.window_tilemap_select);
  s.integer(status.window_display_enable);
  s.integer(status.bg_tiledata_select);
  s.integer(status.bg_tilemap_select);
  s.integer(status.ob_size);
  s.integer(status.ob_enable);
  s.integer(status.bg_enable);

  s.integer(status.interrupt_lyc);
  s.integer(status.interrupt_oam);
  s.integer(status.interrupt_vblank);
  s.integer(status.interrupt_hblank);

  s.integer(status.scy);
  s.integer(status.scx);

  s.integer(status.ly);
  s.integer(status.lyc);

  s.integer(status.wy);
  s.integer(status.wx);

  s.integer(status.vram_bank);

  s.integer(status.bgpi_increment);
  s.integer(status.bgpi);

  s.integer(status.obpi_increment);
  s.integer(status.obpi);
}
Example #24
0
void aDSP::serialize(serializer &s) {
    DSP::serialize(s);

    s.array(dspram);
    s.integer(dsp_counter);

    s.integer(status.MVOLL);
    s.integer(status.MVOLR);
    s.integer(status.EVOLL);
    s.integer(status.EVOLR);
    s.integer(status.KON);
    s.integer(status.KOFF);
    s.integer(status.FLG);
    s.integer(status.ENDX);
    s.integer(status.EFB);
    s.integer(status.PMON);
    s.integer(status.NON);
    s.integer(status.EON);
    s.integer(status.DIR);
    s.integer(status.ESA);
    s.integer(status.EDL);
    s.array(status.FIR);

    s.integer(status.kon);
    s.integer(status.esa);

    s.integer(status.noise_ctr);
    s.integer(status.noise_rate);
    s.integer(status.noise_sample);

    s.integer(status.echo_index);
    s.integer(status.echo_length);
    s.array(status.fir_buffer[0]);
    s.array(status.fir_buffer[1]);
    s.integer(status.fir_buffer_index);

    for(unsigned i = 0; i < 8; i++) {
        s.integer(voice[i].VOLL);
        s.integer(voice[i].VOLR);
        s.integer(voice[i].PITCH);
        s.integer(voice[i].SRCN);
        s.integer(voice[i].ADSR1);
        s.integer(voice[i].ADSR2);
        s.integer(voice[i].GAIN);
        s.integer(voice[i].ENVX);
        s.integer(voice[i].OUTX);

        s.integer(voice[i].pitch_ctr);

        s.integer(voice[i].brr_index);
        s.integer(voice[i].brr_ptr);
        s.integer(voice[i].brr_header);
        s.integer(voice[i].brr_looped);

        s.array(voice[i].brr_data);
        s.integer(voice[i].brr_data_index);

        s.integer(voice[i].envx);
        s.integer(voice[i].env_ctr);
        s.integer(voice[i].env_rate);
        s.integer(voice[i].env_sustain);
        s.integer(voice[i].env_state);
        s.integer(voice[i].env_mode);

        s.integer(voice[i].outx);
    }
}
void CPU::serialize(serializer& s) {
  R65816::serialize(s);
  Thread::serialize(s);
  PPUcounter::serialize(s);

  s.array(wram);

  s.integer(cpu_version);

  s.integer(status.interrupt_pending);

  s.integer(status.clock_count);
  s.integer(status.line_clocks);

  s.integer(status.irq_lock);

  s.integer(status.dram_refresh_position);
  s.integer(status.dram_refreshed);

  s.integer(status.hdma_init_position);
  s.integer(status.hdma_init_triggered);

  s.integer(status.hdma_position);
  s.integer(status.hdma_triggered);

  s.integer(status.nmi_valid);
  s.integer(status.nmi_line);
  s.integer(status.nmi_transition);
  s.integer(status.nmi_pending);
  s.integer(status.nmi_hold);

  s.integer(status.irq_valid);
  s.integer(status.irq_line);
  s.integer(status.irq_transition);
  s.integer(status.irq_pending);
  s.integer(status.irq_hold);

  s.integer(status.reset_pending);

  s.integer(status.dma_active);
  s.integer(status.dma_counter);
  s.integer(status.dma_clocks);
  s.integer(status.dma_pending);
  s.integer(status.hdma_pending);
  s.integer(status.hdma_mode);

  s.integer(status.auto_joypad_active);
  s.integer(status.auto_joypad_latch);
  s.integer(status.auto_joypad_counter);
  s.integer(status.auto_joypad_clock);

  s.array(status.port);

  s.integer(status.wram_addr);

  s.integer(status.joypad_strobe_latch);
  s.integer(status.joypad1_bits);
  s.integer(status.joypad2_bits);

  s.integer(status.nmi_enabled);
  s.integer(status.hirq_enabled);
  s.integer(status.virq_enabled);
  s.integer(status.auto_joypad_poll);

  s.integer(status.pio);

  s.integer(status.wrmpya);
  s.integer(status.wrmpyb);

  s.integer(status.wrdiva);
  s.integer(status.wrdivb);

  s.integer(status.hirq_pos);
  s.integer(status.virq_pos);

  s.integer(status.rom_speed);

  s.integer(status.rddiv);
  s.integer(status.rdmpy);

  s.integer(status.joy1);
  s.integer(status.joy2);
  s.integer(status.joy3);
  s.integer(status.joy4);

  s.integer(alu.mpyctr);
  s.integer(alu.divctr);
  s.integer(alu.shift);

  for(unsigned i = 0; i < 8; i++) {
    s.integer(channel[i].dma_enabled);
    s.integer(channel[i].hdma_enabled);
    s.integer(channel[i].direction);
    s.integer(channel[i].indirect);
    s.integer(channel[i].unused);
    s.integer(channel[i].reverse_transfer);
    s.integer(channel[i].fixed_transfer);
    s.integer(channel[i].transfer_mode);
    s.integer(channel[i].dest_addr);
    s.integer(channel[i].source_addr);
    s.integer(channel[i].source_bank);
    s.integer(channel[i].transfer_size);
    s.integer(channel[i].indirect_bank);
    s.integer(channel[i].hdma_addr);
    s.integer(channel[i].line_counter);
    s.integer(channel[i].unknown);
    s.integer(channel[i].hdma_completed);
    s.integer(channel[i].hdma_do_transfer);
  }

  s.integer(pipe.valid);
  s.integer(pipe.addr);
  s.integer(pipe.data);
}
Example #26
0
void SPC7110::serialize(serializer &s) {
  s.array(ram.data(), ram.size());

  s.integer(r4801);
  s.integer(r4802);
  s.integer(r4803);
  s.integer(r4804);
  s.integer(r4805);
  s.integer(r4806);
  s.integer(r4807);
  s.integer(r4809);
  s.integer(r480a);
  s.integer(r480b);
  s.integer(r480c);

  s.integer(dcu_pending);
  s.integer(dcu_mode);
  s.integer(dcu_addr);
  s.integer(dcu_offset);
  s.array(dcu_tile);
  decompressor->serialize(s);

  s.integer(r4810);
  s.integer(r4811);
  s.integer(r4812);
  s.integer(r4813);
  s.integer(r4814);
  s.integer(r4815);
  s.integer(r4816);
  s.integer(r4817);
  s.integer(r4818);
  s.integer(r481a);

  s.integer(r4820);
  s.integer(r4821);
  s.integer(r4822);
  s.integer(r4823);
  s.integer(r4824);
  s.integer(r4825);
  s.integer(r4826);
  s.integer(r4827);
  s.integer(r4828);
  s.integer(r4829);
  s.integer(r482a);
  s.integer(r482b);
  s.integer(r482c);
  s.integer(r482d);
  s.integer(r482e);
  s.integer(r482f);

  s.integer(mul_pending);
  s.integer(div_pending);

  s.integer(r4830);
  s.integer(r4831);
  s.integer(r4832);
  s.integer(r4833);
  s.integer(r4834);
}
Example #27
0
void System::serialize(serializer& s) {
  s.integer((unsigned&)region);
}
Example #28
0
void SPC700::serialize(serializer &s) {
  s.integer(regs.pc);
  s.integer(regs.a);
  s.integer(regs.x);
  s.integer(regs.y);
  s.integer(regs.s);
  s.integer(regs.p.n);
  s.integer(regs.p.v);
  s.integer(regs.p.p);
  s.integer(regs.p.b);
  s.integer(regs.p.h);
  s.integer(regs.p.i);
  s.integer(regs.p.z);
  s.integer(regs.p.c);

  s.integer(opcode);
  s.integer(dp.w);
  s.integer(sp.w);
  s.integer(rd.w);
  s.integer(wr.w);
  s.integer(bit.w);
  s.integer(ya.w);
}
Example #29
0
void R6502::serialize(serializer& s) {
  s.integer(regs.mdr);
  s.integer(regs.pc);
  s.integer(regs.a);
  s.integer(regs.x);
  s.integer(regs.y);
  s.integer(regs.s);
  s.integer(regs.p.n);
  s.integer(regs.p.v);
  s.integer(regs.p.d);
  s.integer(regs.p.i);
  s.integer(regs.p.z);
  s.integer(regs.p.c);

  s.integer(abs.w);
  s.integer(iabs.w);
  s.integer(rd);
  s.integer(zp);
  s.integer(aa);
}
Example #30
0
void SMP::serialize(serializer& s) {
  Thread::serialize(s);

  s.array(apuram, 64 * 1024);

  s.integer(opcode_number);
  s.integer(opcode_cycle);

  s.integer(regs.pc);
  s.integer(regs.sp);
  s.integer(regs.a);
  s.integer(regs.x);
  s.integer(regs.y);

  s.integer(regs.p.n);
  s.integer(regs.p.v);
  s.integer(regs.p.p);
  s.integer(regs.p.b);
  s.integer(regs.p.h);
  s.integer(regs.p.i);
  s.integer(regs.p.z);
  s.integer(regs.p.c);

  s.integer(rd);
  s.integer(wr);
  s.integer(dp);
  s.integer(sp);
  s.integer(ya);
  s.integer(bit);

  s.integer(status.iplrom_enable);

  s.integer(status.dsp_addr);

  s.integer(status.ram00f8);
  s.integer(status.ram00f9);

  s.integer(timer0.enable);
  s.integer(timer0.target);
  s.integer(timer0.stage1_ticks);
  s.integer(timer0.stage2_ticks);
  s.integer(timer0.stage3_ticks);

  s.integer(timer1.enable);
  s.integer(timer1.target);
  s.integer(timer1.stage1_ticks);
  s.integer(timer1.stage2_ticks);
  s.integer(timer1.stage3_ticks);

  s.integer(timer2.enable);
  s.integer(timer2.target);

  s.integer(timer2.stage1_ticks);
  s.integer(timer2.stage2_ticks);
  s.integer(timer2.stage3_ticks);
}