aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/peripherals/timer.spec.ts11
-rw-r--r--src/peripherals/timer.ts21
2 files changed, 29 insertions, 3 deletions
diff --git a/src/peripherals/timer.spec.ts b/src/peripherals/timer.spec.ts
index 27ef7fb..9330168 100644
--- a/src/peripherals/timer.spec.ts
+++ b/src/peripherals/timer.spec.ts
@@ -1245,6 +1245,17 @@ describe('timer', () => {
expect(cpu.readData(R19)).toEqual(0x5);
expect(cpu.readData(R20)).toEqual(0x3);
});
+
+ it('should mask the unused bits of OCR1A when using fixed top values', () => {
+ const cpu = new CPU(new Uint16Array(0x1000));
+ new AVRTimer(cpu, timer1Config);
+ cpu.writeData(TCCR1A, WGM10 | WGM11); // WGM: FastPWM, top 0x3ff
+ cpu.writeData(TCCR1B, WGM12);
+ cpu.writeData(OCR1AH, 0xff);
+ cpu.writeData(OCR1A, 0xff);
+ expect(cpu.readData(OCR1A)).toEqual(0xff);
+ expect(cpu.readData(OCR1AH)).toEqual(0x03);
+ });
});
describe('External clock', () => {
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;