summaryrefslogtreecommitdiff
path: root/src/peripherals/avrdx-rstctrl.ts
blob: ce02552a8da337efbfcfb2afc4d1b1b15f215e20 (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
// AVR-Dx RSTCTRL - Reset Controller
// Handles software reset and reset flags.

import { type CPU } from 'avr8js/cpu/cpu';
import { type AVRDxCCP } from './avrdx-ccp';

const RSTFR = 0;
const SWRR  = 1;
const SWRST_bm = 0x01;

export class AVRDxRSTCTRL {
  /** Set this callback to handle software resets */
  onReset: (() => void) | null = null;

  constructor(cpu: CPU, base: number, ccp: AVRDxCCP) {
    // RSTFR - reset flags, write 1 to clear
    cpu.writeHooks[base + RSTFR] = (value) => {
      cpu.data[base + RSTFR] &= ~value;
      return true;
    };

    // SWRR - software reset register (CCP protected)
    cpu.writeHooks[base + SWRR] = (value) => {
      if (ccp.isUnlocked() && (value & SWRST_bm)) {
        if (this.onReset) this.onReset();
      }
      return true;
    };
  }
}