diff options
| author | Uri Shaked | 2022-02-21 17:49:10 +0200 |
|---|---|---|
| committer | Uri Shaked | 2022-02-21 17:49:10 +0200 |
| commit | 0f2a3b0abf058d04f5368d7c1ce55131d5e319a0 (patch) | |
| tree | 67727dbe707e3d49a1f9071bce2487774084596f /src/peripherals/timer.ts | |
| parent | Merge pull request #116 from Dudeplayz/master (diff) | |
| download | avr8js-0f2a3b0abf058d04f5368d7c1ce55131d5e319a0.tar.gz avr8js-0f2a3b0abf058d04f5368d7c1ce55131d5e319a0.tar.bz2 avr8js-0f2a3b0abf058d04f5368d7c1ce55131d5e319a0.zip | |
fix(timer): OCRH masking #117
Diffstat (limited to 'src/peripherals/timer.ts')
| -rw-r--r-- | src/peripherals/timer.ts | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/peripherals/timer.ts b/src/peripherals/timer.ts index 53777e2..6167394 100644 --- a/src/peripherals/timer.ts +++ b/src/peripherals/timer.ts @@ -388,11 +388,16 @@ export class AVRTimer { const updateTempRegister = (value: u8) => { this.highByteTemp = value; }; + const updateOCRHighRegister = (value: u8, old: u8, addr: u16) => { + this.highByteTemp = value & (this.ocrMask >> 8); + cpu.data[addr] = this.highByteTemp; + return true; + }; this.cpu.writeHooks[config.TCNT + 1] = updateTempRegister; - this.cpu.writeHooks[config.OCRA + 1] = updateTempRegister; - this.cpu.writeHooks[config.OCRB + 1] = updateTempRegister; + this.cpu.writeHooks[config.OCRA + 1] = updateOCRHighRegister; + this.cpu.writeHooks[config.OCRB + 1] = updateOCRHighRegister; if (this.hasOCRC) { - this.cpu.writeHooks[config.OCRC + 1] = updateTempRegister; + this.cpu.writeHooks[config.OCRC + 1] = updateOCRHighRegister; } this.cpu.writeHooks[config.ICR + 1] = updateTempRegister; } @@ -481,6 +486,16 @@ export class AVRTimer { } } + get ocrMask() { + switch (this.topValue) { + case TopOCRA: + case TopICR: + return 0xffff; + default: + return this.topValue; + } + } + private updateWGMConfig() { const { config, WGM } = this; const wgmModes = config.bits === 16 ? wgmModes16Bit : wgmModes8Bit; |
