mz700-js
Version: 
MZ-700 Full JavaScript Emulator
79 lines (75 loc) • 2.33 kB
text/typescript
;
import IMem from "./imem";
/* tslint:disable:no-bitwise */
/**
 * MemoryBank
 * @constructor
 * @param {object} opt the options.
 */
export default class MemoryBank extends IMem {
    mem:(IMem|Record<string, unknown>)[];
    memblk:Map<string, IMem>;
    constructor(opt?:{size?:number, startAddr?:number}) {
        super();
        this.create(opt);
    }
    /**
     * Create
     * @param {any} opt the options.
     * @returns {undefined}
     */
    create(opt?:{size?:number, startAddr?:number}):void {
        super.create(opt);
        this.mem = new Array(this.size);
        this.memblk = new Map<string, IMem>();
    }
    /**
     * Set named memory block.
     * @param {string} name A name of a memory bank.
     * @param {IMem} memblk A memory block.
     * @returns {undefined}
     */
    setMemoryBlock(name:string, memblk:IMem):void {
        if (memblk == null) {
            if (this.memblk.has(name)) {
                const mem = this.memblk.get(name);
                const size = mem.size;
                const startAddr = mem.startAddr;
                const endAddr = startAddr + size;
                const nullMem = { peek: () => 0, poke: () => { /* empty */ } };
                for (let j = startAddr; j < endAddr; j++) {
                    this.mem[j] = nullMem;
                }
                this.memblk.delete(name);
            }
        }
        else {
            this.memblk.set(name, memblk);
            const mem = this.memblk.get(name);
            const size = mem.size;
            const startAddr = mem.startAddr;
            const endAddr = startAddr + size;
            for (let j = startAddr; j < endAddr; j++) {
                this.mem[j] = memblk;
            }
        }
    }
    /**
     * Read a byte data.
     * @param {number} address an address.
     * @returns {number} the value in the memory.
     */
    peekByte(address:number):number {
        return (this.mem[address - this.startAddr] as IMem).peek(address) & 0xff;
    }
    /**
     * Write a byte data.
     * @param {number} address an address.
     * @param {number} value a data.
     * @returns {undefined}
     */
    pokeByte(address:number, value:number):void {
        (this.mem[address - this.startAddr] as IMem).poke(address, value & 0xff);
    }
}
module.exports = MemoryBank;