mirror of
https://github.com/whscullin/apple2js.git
synced 2024-01-12 14:14:38 +00:00
04ae0327c2
This adds both the recommended TypeScript checks, plus the recommended TypeScript checks that require type checking. This latter addition means that eslint essentially has to compile all of the TypeScript in the project, causing it to be slower. This isn't much of a problem in VS Code because there's a lot of caching being done, but it's clearly slower when run on the commandline. All of the errors are either fixed or suppressed. Some errors are suppressed because fixing them would be too laborious for the little value gained. The eslint config is also slightly refactored to separate the strictly TypeScript checks from the JavaScript checks.
92 lines
2.3 KiB
TypeScript
92 lines
2.3 KiB
TypeScript
import { byte, memory, word } from './types';
|
|
|
|
/*eslint no-console: 0*/
|
|
|
|
const hex_digits = '0123456789ABCDEF';
|
|
const bin_digits = '01';
|
|
|
|
/** Returns a random byte. */
|
|
export function garbage(): byte {
|
|
return (Math.random() * 0x100) & 0xff;
|
|
}
|
|
|
|
export const testables = {
|
|
garbage
|
|
};
|
|
|
|
/**
|
|
* Returns an array or Uint8Array of `size` bytes filled as if the computer
|
|
* was just powered on.
|
|
*/
|
|
export function allocMem(size: number) {
|
|
const result = new Uint8Array(size);
|
|
|
|
for (let idx = 0; idx < size; idx++) {
|
|
result[idx] = (idx & 0x02) ? 0x00 : 0xff;
|
|
}
|
|
// Borrowed from AppleWin (https://github.com/AppleWin/AppleWin)
|
|
for (let idx = 0; idx < size; idx += 0x200) {
|
|
result[idx + 0x28] = garbage();
|
|
result[idx + 0x29] = garbage();
|
|
result[idx + 0x68] = garbage();
|
|
result[idx + 0x69] = garbage();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/** Returns an array or Uint8Array of 256 * `pages` bytes. */
|
|
export function allocMemPages(pages: number): memory {
|
|
return allocMem(pages << 8);
|
|
}
|
|
|
|
/** Returns a new Uint8Array for the input array. */
|
|
export function bytify(ary: number[]): memory {
|
|
return new Uint8Array(ary);
|
|
}
|
|
|
|
/** Writes to the console. */
|
|
export function debug(...args: unknown[]): void {
|
|
console.log(...args);
|
|
}
|
|
|
|
/**
|
|
* Returns a string of hex digits (all caps).
|
|
* @param v the value to encode
|
|
* @param n the number of nibbles. If `n` is missing, it is guessed from the value
|
|
* of `v`. If `v` < 256, it is assumed to be 2 nibbles, otherwise 4.
|
|
*/
|
|
export function toHex(v: byte | word | number, n?: number) {
|
|
if (!n) {
|
|
n = v < 256 ? 2 : 4;
|
|
}
|
|
let result = '';
|
|
for (let idx = 0; idx < n; idx++) {
|
|
result = hex_digits[v & 0x0f] + result;
|
|
v >>= 4;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Returns a string of 8 binary digits.
|
|
* @param v the value to encode
|
|
*/
|
|
export function toBinary(v: byte) {
|
|
let result = '';
|
|
for (let idx = 0; idx < 8; idx++) {
|
|
result = bin_digits[v & 0x01] + result;
|
|
v >>= 1;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/** Packs a 32-bit integer into a string in little-endian order. */
|
|
export function numToString(num: number) {
|
|
let result = '';
|
|
for (let idx = 0; idx < 4; idx++) {
|
|
result += String.fromCharCode(num & 0xff);
|
|
num >>= 8;
|
|
}
|
|
return result;
|
|
}
|