mirror of
https://github.com/hanzoai/zap-es.git
synced 2026-10-30 18:17:07 +00:00
275 lines
8.0 KiB
HTML
275 lines
8.0 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width" />
|
|
<link
|
|
rel="stylesheet"
|
|
href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.9.4/css/bulma.min.css"
|
|
/>
|
|
<link
|
|
rel="stylesheet"
|
|
href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
|
|
/>
|
|
<title>JS Bin</title>
|
|
</head>
|
|
<body>
|
|
<section class="hero">
|
|
<div class="hero-body">
|
|
<div class="container">
|
|
<h1 class="title">ZAP Pointer</h1>
|
|
<h2 class="subtitle">
|
|
Enter a word of hex bytes <code>08 6d 00 00 9f ff 00 00</code> in
|
|
little endian order to interpret them as a pointer.
|
|
</h2>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<section class="section">
|
|
<div class="field">
|
|
<p class="control">
|
|
<input
|
|
id="ptr-input"
|
|
class="input"
|
|
type="text"
|
|
placeholder="Pointer bytes"
|
|
/>
|
|
</p>
|
|
</div>
|
|
<div
|
|
class="notification is-danger"
|
|
id="ptr-invalid"
|
|
style="display: none"
|
|
>
|
|
Invalid pointer data! Please enter exactly 16 hexadecimal digits (spaces
|
|
are ignored).
|
|
</div>
|
|
</section>
|
|
<section class="section">
|
|
<table class="table is-bordered">
|
|
<tbody>
|
|
<tr id="row-type" class="is-selected">
|
|
<td>Pointer Type</td>
|
|
<td><code id="ptr-type">STRUCT</code></td>
|
|
</tr>
|
|
<tr id="row-offset">
|
|
<td>Offset Words</td>
|
|
<td><code id="ptr-offset">0x00000000</code></td>
|
|
</tr>
|
|
<tr id="row-struct-data-size">
|
|
<td>Struct Data Words</td>
|
|
<td><code id="ptr-struct-data-size">0x0000</code></td>
|
|
</tr>
|
|
<tr id="row-struct-pointers">
|
|
<td>Struct Pointer Count</td>
|
|
<td><code id="ptr-struct-pointers">0x0000</code></td>
|
|
</tr>
|
|
<tr id="row-list-size">
|
|
<td>List Element Size</td>
|
|
<td><code id="ptr-list-size">VOID</code></td>
|
|
</tr>
|
|
<tr id="row-list-length">
|
|
<td>List Length</td>
|
|
<td><code id="ptr-list-length">0x00000000</code></td>
|
|
</tr>
|
|
<tr id="row-double-far">
|
|
<td>Double Far</td>
|
|
<td><code id="ptr-double-far">NO</code></td>
|
|
</tr>
|
|
<tr id="row-far-offset">
|
|
<td>Far Target Offset</td>
|
|
<td><code id="ptr-far-offset">0x00000000</code></td>
|
|
</tr>
|
|
<tr id="row-far-segment">
|
|
<td>Far Target Segment</td>
|
|
<td><code id="ptr-far-segment">0x00000000</code></td>
|
|
</tr>
|
|
<tr id="row-cap-id">
|
|
<td>Capability Index</td>
|
|
<td><code id="ptr-cap-id">0x00000000</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</section>
|
|
<script>
|
|
var STRUCT_PTR = 0x00;
|
|
var LIST_PTR = 0x01;
|
|
var FAR_PTR = 0x02;
|
|
var OTHER_PTR = 0x03;
|
|
var VOID_LIST = 0x00;
|
|
var BIT_LIST = 0x01;
|
|
var BYTE_LIST = 0x02;
|
|
var BYTE_2_LIST = 0x03;
|
|
var BYTE_4_LIST = 0x04;
|
|
var BYTE_8_LIST = 0x05;
|
|
var POINTER_LIST = 0x06;
|
|
var COMPOSITE_LIST = 0x07;
|
|
|
|
var $$ = document.getElementById.bind(document);
|
|
|
|
var input = $$("ptr-input");
|
|
var invalidDiv = $$("ptr-invalid");
|
|
var typeRow = $$("row-type");
|
|
var typeEl = $$("ptr-type");
|
|
var offsetRow = $$("row-offset");
|
|
var offsetEl = $$("ptr-offset");
|
|
var structDataSizeRow = $$("row-struct-data-size");
|
|
var structDataSizeEl = $$("ptr-struct-data-size");
|
|
var structPointersRow = $$("row-struct-pointers");
|
|
var structPointersEl = $$("ptr-struct-pointers");
|
|
var listSizeRow = $$("row-list-size");
|
|
var listSizeEl = $$("ptr-list-size");
|
|
var listLengthRow = $$("row-list-length");
|
|
var listLengthEl = $$("ptr-list-length");
|
|
var doubleFarRow = $$("row-double-far");
|
|
var doubleFarEl = $$("ptr-double-far");
|
|
var farOffsetRow = $$("row-far-offset");
|
|
var farOffsetEl = $$("ptr-far-offset");
|
|
var farSegmentRow = $$("row-far-segment");
|
|
var farSegmentEl = $$("ptr-far-segment");
|
|
var capIdRow = $$("row-cap-id");
|
|
var capIdEl = $$("ptr-cap-id");
|
|
|
|
var PTR_TYPE_NAME = ["STRUCT", "LIST", "FAR", "OTHER"];
|
|
var LIST_SIZE_NAME = [
|
|
"VOID",
|
|
"BIT",
|
|
"BYTE",
|
|
"2 BYTES",
|
|
"4 BYTES",
|
|
"8 BYTES",
|
|
"POINTER",
|
|
"COMPOSITE",
|
|
];
|
|
|
|
function pad(s, width, paddingChar) {
|
|
if (width === undefined) width = 8;
|
|
|
|
if (paddingChar === undefined) paddingChar = "0";
|
|
|
|
return s.length >= width
|
|
? s
|
|
: new Array(width - s.length + 1).join(paddingChar) + s;
|
|
}
|
|
|
|
function formatHex(x, width) {
|
|
return "0x" + pad(x.toString(16), width);
|
|
}
|
|
|
|
function showWarning(m) {
|
|
invalidDiv.style.display = "inherit";
|
|
invalidDiv.innerHTML = m;
|
|
}
|
|
|
|
function hideWarning() {
|
|
invalidDiv.style.display = "none";
|
|
}
|
|
|
|
function setSelected(el, selected) {
|
|
if (selected) {
|
|
el.classList.add("is-selected");
|
|
} else {
|
|
el.classList.remove("is-selected");
|
|
}
|
|
}
|
|
|
|
input.addEventListener("input", function (ev) {
|
|
hideWarning();
|
|
|
|
var x = ev.target.value.toLowerCase().replace(/[^\da-f]/g, "");
|
|
|
|
if (x.length !== 16) {
|
|
showWarning(
|
|
"Invalid pointer data! Please enter exactly 16 hexadecimal digits (spaces are ignored).",
|
|
);
|
|
|
|
return;
|
|
}
|
|
|
|
var buf = new Uint8Array(8);
|
|
var dv = new DataView(buf.buffer);
|
|
|
|
for (var i = 0; i < 16; i += 2)
|
|
buf[i / 2] = parseInt(x.substring(i, i + 2), 16);
|
|
|
|
var lo = dv.getUint32(0, true);
|
|
var hi = dv.getUint32(4, true);
|
|
|
|
// pointer type
|
|
|
|
var pointerType = lo & 0x03;
|
|
|
|
setSelected(typeRow, true);
|
|
typeEl.innerHTML = PTR_TYPE_NAME[pointerType];
|
|
|
|
// offset words
|
|
|
|
var offset = lo >> 2;
|
|
offsetEl.innerHTML = formatHex(offset);
|
|
|
|
if (pointerType === STRUCT_PTR || pointerType === LIST_PTR) {
|
|
setSelected(offsetRow, true);
|
|
} else if (pointerType === OTHER_PTR) {
|
|
setSelected(offsetRow, true);
|
|
|
|
if (offset !== 0) {
|
|
showWarning(
|
|
"Possibly corrupt pointer data: interface pointers should always have an offset of zero!",
|
|
);
|
|
}
|
|
} else {
|
|
setSelected(offsetRow, false);
|
|
}
|
|
|
|
// struct data words
|
|
|
|
var structDataSize = dv.getUint16(4, true);
|
|
structDataSizeEl.innerHTML = formatHex(structDataSize, 4);
|
|
setSelected(structDataSizeRow, pointerType === STRUCT_PTR);
|
|
|
|
// struct pointer count
|
|
|
|
var structPointers = dv.getUint16(6, true);
|
|
structPointersEl.innerHTML = formatHex(structPointers, 4);
|
|
setSelected(structPointersRow, pointerType === STRUCT_PTR);
|
|
|
|
// list element size
|
|
|
|
var listSize = hi & 0x07;
|
|
listSizeEl.innerHTML = LIST_SIZE_NAME[listSize];
|
|
setSelected(listSizeRow, pointerType === LIST_PTR);
|
|
|
|
// list length
|
|
|
|
var listLength = hi >>> 3;
|
|
listLengthEl.innerHTML = formatHex(listLength);
|
|
setSelected(listLengthRow, pointerType === LIST_PTR);
|
|
|
|
// double far
|
|
|
|
var doubleFar = lo & 0x04;
|
|
doubleFarEl.innerHTML = doubleFar !== 0 ? "YES" : "NO";
|
|
setSelected(doubleFarRow, pointerType === FAR_PTR);
|
|
|
|
// far target offset
|
|
|
|
var farOffset = lo >>> 3;
|
|
farOffsetEl.innerHTML = formatHex(farOffset);
|
|
setSelected(farOffsetRow, pointerType === FAR_PTR);
|
|
|
|
// far target segment
|
|
|
|
var farSegment = hi;
|
|
farSegmentEl.innerHTML = formatHex(farSegment);
|
|
setSelected(farSegmentRow, pointerType === FAR_PTR);
|
|
|
|
// capability index
|
|
|
|
var capId = hi;
|
|
capIdEl.innerHTML = formatHex(capId);
|
|
setSelected(capIdRow, pointerType === OTHER_PTR);
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|