mirror of
https://github.com/mrkite/regs.git
synced 2024-05-29 07:41:26 +00:00
initial import
This commit is contained in:
commit
2154a1a7e3
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*.o
|
||||||
|
*.swp
|
||||||
|
*.map
|
||||||
|
seg*
|
||||||
|
2mg
|
||||||
|
omf
|
||||||
|
regs
|
312
2mg.c
Normal file
312
2mg.c
Normal file
|
@ -0,0 +1,312 @@
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* Extracts 2mg and other prodos disk images into a directory structure
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <argp.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "handle.h"
|
||||||
|
|
||||||
|
static void doDirectory(uint16_t key, uint8_t *disk, uint32_t disklen,
|
||||||
|
int depth);
|
||||||
|
static void doEntry(uint8_t *entry, uint8_t *disk, uint32_t disklen,
|
||||||
|
int depth);
|
||||||
|
static void doFile(uint16_t key, uint32_t len, char *name, uint8_t *disk,
|
||||||
|
uint32_t disklen, int type);
|
||||||
|
static void doGSOS(uint16_t key, char *name, uint8_t *disk, uint32_t disklen,
|
||||||
|
int depth);
|
||||||
|
|
||||||
|
const char *argp_program_version = "2mg 0.2";
|
||||||
|
const char *argp_program_bug_address = "sean@seancode.com";
|
||||||
|
static char doc[] = "Extract ProDOS disk images";
|
||||||
|
static char args_doc[] = "DISKIMAGE";
|
||||||
|
static struct argp_option options[] = {
|
||||||
|
{"list", 'l', 0, 0, "List files"},
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct arguments {
|
||||||
|
char *diskimage;
|
||||||
|
bool list;
|
||||||
|
};
|
||||||
|
|
||||||
|
static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
||||||
|
struct arguments *arguments = state->input;
|
||||||
|
switch (key) {
|
||||||
|
case 'l':
|
||||||
|
arguments->list = true;
|
||||||
|
break;
|
||||||
|
case ARGP_KEY_ARG:
|
||||||
|
if (state->arg_num >= 1) {
|
||||||
|
argp_usage(state);
|
||||||
|
}
|
||||||
|
arguments->diskimage = arg;
|
||||||
|
break;
|
||||||
|
case ARGP_KEY_END:
|
||||||
|
if (state->arg_num < 1) {
|
||||||
|
argp_usage(state);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ARGP_ERR_UNKNOWN;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct argp argp = { options, parse_opt, args_doc, doc };
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
struct arguments arguments;
|
||||||
|
arguments.list = false;
|
||||||
|
|
||||||
|
argp_parse(&argp, argc, argv, 0, 0, &arguments);
|
||||||
|
|
||||||
|
FILE *f = fopen(arguments.diskimage, "rb");
|
||||||
|
if (!f) {
|
||||||
|
fprintf(stderr, "Failed to open '%s'\n", arguments.diskimage);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
size_t len = ftell(f);
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
if (len < 64) {
|
||||||
|
fprintf(stderr, "%s is not a valid disk image\n", argv[1]);
|
||||||
|
fclose(f);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *header = malloc(64);
|
||||||
|
fread(header, 64, 1, f);
|
||||||
|
|
||||||
|
uint32_t disklen = len;
|
||||||
|
uint32_t diskofs = 0;
|
||||||
|
|
||||||
|
if (r4(header) == fourcc("2IMG")) {
|
||||||
|
if (r32(header + 0xc) != 1) {
|
||||||
|
fprintf(stderr, "Not a ProDOS disk image\n");
|
||||||
|
fclose(f);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
disklen = r32(header + 0x14) * 512;
|
||||||
|
diskofs = r32(header + 0x18);
|
||||||
|
}
|
||||||
|
free(header);
|
||||||
|
|
||||||
|
fseek(f, diskofs, SEEK_SET);
|
||||||
|
uint8_t *disk = malloc(disklen);
|
||||||
|
fread(disk, disklen, 1, f);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
doDirectory(2, disk, disklen, arguments.list ? 0 : -1);
|
||||||
|
free(disk);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void readFilename(uint8_t *filename, uint8_t length, char *outname) {
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
char ch = filename[i];
|
||||||
|
if (isalnum(ch) || ch == '_' || ch == '.' || ch == ' ') {
|
||||||
|
*outname++ = ch;
|
||||||
|
} else {
|
||||||
|
*outname++ = 'x';
|
||||||
|
char hi = ch >> 4;
|
||||||
|
char lo = ch & 0xf;
|
||||||
|
if (hi > 9) {
|
||||||
|
*outname++ = 'a' + (hi - 10);
|
||||||
|
} else {
|
||||||
|
*outname++ = '0' + hi;
|
||||||
|
}
|
||||||
|
if (lo > 9) {
|
||||||
|
*outname++ = '0' + (lo - 10);
|
||||||
|
} else {
|
||||||
|
*outname++ = '0' + lo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*outname = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void indent(int depth) {
|
||||||
|
for (int i = 0; i < depth; i++) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doDirectory(uint16_t key, uint8_t *disk, uint32_t disklen,
|
||||||
|
int depth) {
|
||||||
|
uint8_t *block = disk + key * 512;
|
||||||
|
if ((block[4] & 0xf0) != 0xf0 && (block[4] & 0xf0) != 0xe0) {
|
||||||
|
fprintf(stderr, "Invalid ProDOS disk\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char dirname[50];
|
||||||
|
readFilename(block + 5, block[4] & 0xf, dirname);
|
||||||
|
|
||||||
|
if (depth < 0) {
|
||||||
|
mkdir(dirname, 0777);
|
||||||
|
chdir(dirname);
|
||||||
|
} else {
|
||||||
|
indent(depth);
|
||||||
|
printf("%s <dir>\n", dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t entryLength = block[0x23];
|
||||||
|
uint8_t entriesPerBlock = block[0x24];
|
||||||
|
uint16_t fileCount = r16(block + 0x25);
|
||||||
|
uint8_t *entry = block + entryLength + 4;
|
||||||
|
uint8_t curEntry = 1;
|
||||||
|
uint16_t curFile = 0;
|
||||||
|
|
||||||
|
while (curFile < fileCount) {
|
||||||
|
if (entry[0] != 0) {
|
||||||
|
doEntry(entry, disk, disklen, depth < 0 ? -1 : depth + 1);
|
||||||
|
curFile++;
|
||||||
|
}
|
||||||
|
curEntry++;
|
||||||
|
entry += entryLength;
|
||||||
|
if (curEntry == entriesPerBlock) {
|
||||||
|
curEntry = 0;
|
||||||
|
block = disk + r16(block + 2) * 512;
|
||||||
|
entry = block + 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (depth < 0) {
|
||||||
|
chdir("..");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doEntry(uint8_t *entry, uint8_t *disk, uint32_t disklen,
|
||||||
|
int depth) {
|
||||||
|
uint16_t key = r16(entry + 0x11);
|
||||||
|
uint32_t eof = r24(entry + 0x15);
|
||||||
|
|
||||||
|
char filename[50];
|
||||||
|
readFilename(entry + 1, entry[0] & 0xf, filename);
|
||||||
|
|
||||||
|
switch (entry[0] & 0xf0) {
|
||||||
|
case 0x10: // seedling
|
||||||
|
case 0x20: // sapling
|
||||||
|
case 0x30: // tree
|
||||||
|
if (depth < 0) {
|
||||||
|
doFile(key, eof, filename, disk, disklen, entry[0] >> 4);
|
||||||
|
} else {
|
||||||
|
indent(depth);
|
||||||
|
printf("%s %d bytes\n", filename, eof);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x50:
|
||||||
|
doGSOS(key, filename, disk, disklen, depth);
|
||||||
|
break;
|
||||||
|
case 0xd0:
|
||||||
|
doDirectory(key, disk, disklen, depth < 0 ? -1 : depth + 1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Unknown file type: %x\n", entry[0] & 0xf0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dumpSeedling(uint8_t *block, uint32_t len, FILE *f) {
|
||||||
|
if (block == NULL) {
|
||||||
|
fseek(f, len, SEEK_CUR);
|
||||||
|
} else {
|
||||||
|
fwrite(block, len, 1, f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dumpSapling(uint8_t *index, uint32_t len, FILE *f, uint8_t *disk,
|
||||||
|
uint32_t disklen) {
|
||||||
|
if (index == NULL) {
|
||||||
|
fseek(f, len, SEEK_CUR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (len > 0) {
|
||||||
|
uint16_t blockid = index[0] | (index[256] << 8);
|
||||||
|
uint8_t *block = NULL;
|
||||||
|
if (blockid && (blockid + 1) * 512 <= disklen) {
|
||||||
|
block = disk + blockid * 512;
|
||||||
|
}
|
||||||
|
uint32_t blen = len > 512 ? 512 : len;
|
||||||
|
dumpSeedling(block, blen, f);
|
||||||
|
len -= blen;
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dumpTree(uint8_t *index, uint32_t len, FILE *f, uint8_t *disk,
|
||||||
|
uint32_t disklen) {
|
||||||
|
if (index == NULL) {
|
||||||
|
fseek(f, len, SEEK_CUR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (len > 0) {
|
||||||
|
uint16_t blockid = index[0] | (index[256] << 8);
|
||||||
|
uint8_t *block = NULL;
|
||||||
|
if (blockid && (blockid + 1) * 512 <= disklen) {
|
||||||
|
block = disk + blockid * 512;
|
||||||
|
}
|
||||||
|
uint32_t blen = len > 256 * 512 ? 256 * 512 : len;
|
||||||
|
dumpSapling(block, blen, f, disk, disklen);
|
||||||
|
len -= blen;
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doGSOS(uint16_t key, char *name, uint8_t *disk,
|
||||||
|
uint32_t disklen, int depth) {
|
||||||
|
uint8_t *block = disk + key * 512;
|
||||||
|
int type = *block;
|
||||||
|
uint16_t subkey = r16(block + 1);
|
||||||
|
uint32_t eof = r24(block + 5);
|
||||||
|
if (depth < 0) {
|
||||||
|
doFile(subkey, eof, name, disk, disklen, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
char resname[50];
|
||||||
|
strncpy(resname, name, 50);
|
||||||
|
strncat(resname, ".res", 50);
|
||||||
|
block = disk + key * 512 + 0x100;
|
||||||
|
type = *block;
|
||||||
|
subkey = r16(block + 1);
|
||||||
|
uint32_t reof = r24(block + 5);
|
||||||
|
if (depth < 0) {
|
||||||
|
doFile(subkey, reof, resname, disk, disklen, type);
|
||||||
|
} else {
|
||||||
|
indent(depth);
|
||||||
|
printf("%s %d bytes resource: %d bytes\n", name, eof, reof);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doFile(uint16_t key, uint32_t len, char *name, uint8_t *disk,
|
||||||
|
uint32_t disklen, int type) {
|
||||||
|
uint8_t *block = disk + key * 512;
|
||||||
|
FILE *f = fopen(name, "wb");
|
||||||
|
if (!f) {
|
||||||
|
fprintf(stderr, "Failed to create '%s'\n", name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 1:
|
||||||
|
dumpSeedling(block, len, f);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
dumpSapling(block, len, f, disk, disklen);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
dumpTree(block, len, f, disk, disklen);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
}
|
374
65816.h
Normal file
374
65816.h
Normal file
|
@ -0,0 +1,374 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* Defines the 65816 opcodes, their addressing modes, and sizes
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
Addressing modes:
|
||||||
|
imp implied
|
||||||
|
imm #$const (l)
|
||||||
|
immm #$const (l | h) if m16
|
||||||
|
immx #$const (l | h) if x16
|
||||||
|
imms #$const (l | h)
|
||||||
|
abs $addr (addrl | addrh)
|
||||||
|
abl $addr (addrl | addrh | bank)
|
||||||
|
abx $addr,x (addrl | addrh)
|
||||||
|
aby $addr,y (addrl | addrh)
|
||||||
|
ablx $addr,x (addrl | addrh | bank)
|
||||||
|
aix ($addr,x) (addrl | addrh)
|
||||||
|
zp $zp (offset)
|
||||||
|
zpx $zp,x (offset)
|
||||||
|
zpy $zp,y (offset)
|
||||||
|
zps $zp,s (offset)
|
||||||
|
ind ($addr) (addrl | addrh)
|
||||||
|
inz ($zp) (offset)
|
||||||
|
inl [$zp] (offset)
|
||||||
|
inx ($zp,x) (offset)
|
||||||
|
iny ($zp),y (offset)
|
||||||
|
inly [$zp],y (offset)
|
||||||
|
ins ($zp,s),y (offset)
|
||||||
|
rel $r (signed byte + pc)
|
||||||
|
rell $r (offsetl | offseth) + pc
|
||||||
|
bank $sb,$db (dstbnk | srcbnk)
|
||||||
|
db $op
|
||||||
|
dw $op
|
||||||
|
dd $op
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
IMP = 0,
|
||||||
|
IMM,
|
||||||
|
IMMM,
|
||||||
|
IMMX,
|
||||||
|
IMMS,
|
||||||
|
ABS,
|
||||||
|
ABL,
|
||||||
|
ABX,
|
||||||
|
ABY,
|
||||||
|
ABLX,
|
||||||
|
AIX,
|
||||||
|
ZP,
|
||||||
|
ZPX,
|
||||||
|
ZPY,
|
||||||
|
ZPS,
|
||||||
|
IND,
|
||||||
|
INZ,
|
||||||
|
INL,
|
||||||
|
INX,
|
||||||
|
INY,
|
||||||
|
INLY,
|
||||||
|
INS,
|
||||||
|
REL,
|
||||||
|
RELL,
|
||||||
|
BANK,
|
||||||
|
DB,
|
||||||
|
DW,
|
||||||
|
DD
|
||||||
|
} Address;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
BREAK = 0,
|
||||||
|
NORMAL = 1,
|
||||||
|
BRANCH = 2,
|
||||||
|
CALL = 3,
|
||||||
|
RETURN = 4,
|
||||||
|
JUMP = 5
|
||||||
|
} OpType;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char *inst;
|
||||||
|
Address address;
|
||||||
|
OpType type;
|
||||||
|
} Opcode;
|
||||||
|
|
||||||
|
static Opcode opcodes[] = {
|
||||||
|
{"brk", IMP, BREAK}, // 00
|
||||||
|
{"ora", INX, NORMAL}, // 01
|
||||||
|
{"cop", IMP, NORMAL}, // 02
|
||||||
|
{"ora", ZPS, NORMAL}, // 03
|
||||||
|
{"tsb", ZP, NORMAL}, // 04
|
||||||
|
{"ora", ZP, NORMAL}, // 05
|
||||||
|
{"asl", ZP, NORMAL}, // 06
|
||||||
|
{"ora", INL, NORMAL}, // 07
|
||||||
|
{"php", IMP, NORMAL}, // 08
|
||||||
|
{"ora", IMMM, NORMAL}, // 09
|
||||||
|
{"asl", IMP, NORMAL}, // 0a
|
||||||
|
{"phd", IMP, NORMAL}, // 0b
|
||||||
|
{"tsb", ABS, NORMAL}, // 0c
|
||||||
|
{"ora", ABS, NORMAL}, // 0d
|
||||||
|
{"asl", ABS, NORMAL}, // 0e
|
||||||
|
{"ora", ABL, NORMAL}, // 0f
|
||||||
|
{"bpl", REL, BRANCH}, // 10
|
||||||
|
{"ora", INY, NORMAL}, // 11
|
||||||
|
{"ora", INZ, NORMAL}, // 12
|
||||||
|
{"ora", INS, NORMAL}, // 13
|
||||||
|
{"trb", ZP, NORMAL}, // 14
|
||||||
|
{"ora", ZPX, NORMAL}, // 15
|
||||||
|
{"asl", ZPX, NORMAL}, // 16
|
||||||
|
{"ora", INLY, NORMAL}, // 17
|
||||||
|
{"clc", IMP, NORMAL}, // 18
|
||||||
|
{"ora", ABY, NORMAL}, // 19
|
||||||
|
{"inc", IMP, NORMAL}, // 1a
|
||||||
|
{"tcs", IMP, NORMAL}, // 1b
|
||||||
|
{"trb", ABS, NORMAL}, // 1c
|
||||||
|
{"ora", ABX, NORMAL}, // 1d
|
||||||
|
{"asl", ABX, NORMAL}, // 1e
|
||||||
|
{"ora", ABLX, NORMAL}, // 1f
|
||||||
|
{"jsr", ABS, CALL}, // 20
|
||||||
|
{"and", INX, NORMAL}, // 21
|
||||||
|
{"jsl", ABL, CALL}, // 22
|
||||||
|
{"and", ZPS, NORMAL}, // 23
|
||||||
|
{"bit", ZP, NORMAL}, // 24
|
||||||
|
{"and", ZP, NORMAL}, // 25
|
||||||
|
{"rol", ZP, NORMAL}, // 26
|
||||||
|
{"and", INL, NORMAL}, // 27
|
||||||
|
{"plp", IMP, NORMAL}, // 28
|
||||||
|
{"and", IMMM, NORMAL}, // 29
|
||||||
|
{"rol", IMP, NORMAL}, // 2a
|
||||||
|
{"pld", IMP, NORMAL}, // 2b
|
||||||
|
{"bit", ABS, NORMAL}, // 2c
|
||||||
|
{"and", ABS, NORMAL}, // 2d
|
||||||
|
{"rol", ABS, NORMAL}, // 2e
|
||||||
|
{"and", ABL, NORMAL}, // 2f
|
||||||
|
{"bmi", REL, BRANCH}, // 30
|
||||||
|
{"and", INY, NORMAL}, // 31
|
||||||
|
{"and", INZ, NORMAL}, // 32
|
||||||
|
{"and", INS, NORMAL}, // 33
|
||||||
|
{"bit", ZPX, NORMAL}, // 34
|
||||||
|
{"and", ZPX, NORMAL}, // 35
|
||||||
|
{"rol", ZPX, NORMAL}, // 36
|
||||||
|
{"and", INLY, NORMAL}, // 37
|
||||||
|
{"sec", IMP, NORMAL}, // 38
|
||||||
|
{"and", ABY, NORMAL}, // 39
|
||||||
|
{"dec", IMP, NORMAL}, // 3a
|
||||||
|
{"tsc", IMP, NORMAL}, // 3b
|
||||||
|
{"bit", ABX, NORMAL}, // 3c
|
||||||
|
{"and", ABX, NORMAL}, // 3d
|
||||||
|
{"rol", ABX, NORMAL}, // 3e
|
||||||
|
{"and", ABLX, NORMAL}, // 3f
|
||||||
|
{"rti", IMP, RETURN}, // 40
|
||||||
|
{"eor", INX, NORMAL}, // 41
|
||||||
|
{"db", DB, BREAK}, // 42
|
||||||
|
{"eor", ZPS, NORMAL}, // 43
|
||||||
|
{"mvp", BANK, NORMAL}, // 44
|
||||||
|
{"eor", ZP, NORMAL}, // 45
|
||||||
|
{"lsr", ZP, NORMAL}, // 46
|
||||||
|
{"eor", INL, NORMAL}, // 47
|
||||||
|
{"pha", IMP, NORMAL}, // 48
|
||||||
|
{"eor", IMMM, NORMAL}, // 49
|
||||||
|
{"lsr", IMP, NORMAL}, // 4a
|
||||||
|
{"phk", IMP, NORMAL}, // 4b
|
||||||
|
{"jmp", ABS, JUMP}, // 4c
|
||||||
|
{"eor", ABS, NORMAL}, // 4d
|
||||||
|
{"lsr", ABS, NORMAL}, // 4e
|
||||||
|
{"eor", ABL, NORMAL}, // 4f
|
||||||
|
{"bvc", REL, BRANCH}, // 50
|
||||||
|
{"eor", INY, NORMAL}, // 51
|
||||||
|
{"eor", INZ, NORMAL}, // 52
|
||||||
|
{"eor", INS, NORMAL}, // 53
|
||||||
|
{"mvn", BANK, NORMAL}, // 54
|
||||||
|
{"eor", ZPX, NORMAL}, // 55
|
||||||
|
{"lsr", ZPX, NORMAL}, // 56
|
||||||
|
{"eor", INLY, NORMAL}, // 57
|
||||||
|
{"cli", IMP, NORMAL}, // 58
|
||||||
|
{"eor", ABY, NORMAL}, // 59
|
||||||
|
{"phy", IMP, NORMAL}, // 5a
|
||||||
|
{"tcd", IMP, NORMAL}, // 5b
|
||||||
|
{"jmp", ABL, JUMP}, // 5c
|
||||||
|
{"eor", ABX, NORMAL}, // 5d
|
||||||
|
{"lsr", ABX, NORMAL}, // 5e
|
||||||
|
{"eor", ABLX, NORMAL}, // 5f
|
||||||
|
{"rts", IMP, RETURN}, // 60
|
||||||
|
{"adc", INX, NORMAL}, // 61
|
||||||
|
{"per", IMP, NORMAL}, // 62
|
||||||
|
{"adc", ZPS, NORMAL}, // 63
|
||||||
|
{"stz", ZP, NORMAL}, // 64
|
||||||
|
{"adc", ZP, NORMAL}, // 65
|
||||||
|
{"ror", ZP, NORMAL}, // 66
|
||||||
|
{"adc", INL, NORMAL}, // 67
|
||||||
|
{"pla", IMP, NORMAL}, // 68
|
||||||
|
{"adc", IMMM, NORMAL}, // 69
|
||||||
|
{"ror", IMP, NORMAL}, // 6a
|
||||||
|
{"rtl", IMP, RETURN}, // 6b
|
||||||
|
{"jmp", IND, JUMP}, // 6c
|
||||||
|
{"adc", ABS, NORMAL}, // 6d
|
||||||
|
{"ror", ABS, NORMAL}, // 6e
|
||||||
|
{"adc", ABL, NORMAL}, // 6f
|
||||||
|
{"bvs", REL, BRANCH}, // 70
|
||||||
|
{"adc", INY, NORMAL}, // 71
|
||||||
|
{"adc", INZ, NORMAL}, // 72
|
||||||
|
{"adc", INS, NORMAL}, // 73
|
||||||
|
{"stz", ZPX, NORMAL}, // 74
|
||||||
|
{"adc", ZPX, NORMAL}, // 75
|
||||||
|
{"ror", ZPX, NORMAL}, // 76
|
||||||
|
{"adc", INLY, NORMAL}, // 77
|
||||||
|
{"sei", IMP, NORMAL}, // 78
|
||||||
|
{"adc", ABY, NORMAL}, // 79
|
||||||
|
{"ply", IMP, NORMAL}, // 7a
|
||||||
|
{"tdc", IMP, NORMAL}, // 7b
|
||||||
|
{"jmp", AIX, JUMP}, // 7c
|
||||||
|
{"adc", ABX, NORMAL}, // 7d
|
||||||
|
{"ror", ABX, NORMAL}, // 7e
|
||||||
|
{"adc", ABLX, NORMAL}, // 7f
|
||||||
|
{"bra", REL, JUMP}, // 80
|
||||||
|
{"sta", INX, NORMAL}, // 81
|
||||||
|
{"brl", RELL, JUMP}, // 82
|
||||||
|
{"sta", ZPS, NORMAL}, // 83
|
||||||
|
{"sty", ZP, NORMAL}, // 84
|
||||||
|
{"sta", ZP, NORMAL}, // 85
|
||||||
|
{"stx", ZP, NORMAL}, // 86
|
||||||
|
{"sta", INL, NORMAL}, // 87
|
||||||
|
{"dey", IMP, NORMAL}, // 88
|
||||||
|
{"bit", IMMM, NORMAL}, // 89
|
||||||
|
{"txa", IMP, NORMAL}, // 8a
|
||||||
|
{"phb", IMP, NORMAL}, // 8b
|
||||||
|
{"sty", ABS, NORMAL}, // 8c
|
||||||
|
{"sta", ABS, NORMAL}, // 8d
|
||||||
|
{"stx", ABS, NORMAL}, // 8e
|
||||||
|
{"sta", ABL, NORMAL}, // 8f
|
||||||
|
{"bcc", REL, BRANCH}, // 90
|
||||||
|
{"sta", INY, NORMAL}, // 91
|
||||||
|
{"sta", INZ, NORMAL}, // 92
|
||||||
|
{"sta", INS, NORMAL}, // 93
|
||||||
|
{"sty", ZPX, NORMAL}, // 94
|
||||||
|
{"sta", ZPX, NORMAL}, // 95
|
||||||
|
{"stx", ZPY, NORMAL}, // 96
|
||||||
|
{"sta", INLY, NORMAL}, // 97
|
||||||
|
{"tya", IMP, NORMAL}, // 98
|
||||||
|
{"sta", ABY, NORMAL}, // 99
|
||||||
|
{"txs", IMP, NORMAL}, // 9a
|
||||||
|
{"txy", IMP, NORMAL}, // 9b
|
||||||
|
{"stz", ABS, NORMAL}, // 9c
|
||||||
|
{"sta", ABX, NORMAL}, // 9d
|
||||||
|
{"stz", ABX, NORMAL}, // 9e
|
||||||
|
{"sta", ABLX, NORMAL}, // 9f
|
||||||
|
{"ldy", IMMX, NORMAL}, // a0
|
||||||
|
{"lda", INX, NORMAL}, // a1
|
||||||
|
{"ldx", IMMX, NORMAL}, // a2
|
||||||
|
{"lda", ZPS, NORMAL}, // a3
|
||||||
|
{"ldy", ZP, NORMAL}, // a4
|
||||||
|
{"lda", ZP, NORMAL}, // a5
|
||||||
|
{"ldx", ZP, NORMAL}, // a6
|
||||||
|
{"lda", INL, NORMAL}, // a7
|
||||||
|
{"tay", IMP, NORMAL}, // a8
|
||||||
|
{"lda", IMMM, NORMAL}, // a9
|
||||||
|
{"tax", IMP, NORMAL}, // aa
|
||||||
|
{"plb", IMP, NORMAL}, // ab
|
||||||
|
{"ldy", ABS, NORMAL}, // ac
|
||||||
|
{"lda", ABS, NORMAL}, // ad
|
||||||
|
{"ldx", ABS, NORMAL}, // ae
|
||||||
|
{"lda", ABL, NORMAL}, // af
|
||||||
|
{"bcs", REL, BRANCH}, // b0
|
||||||
|
{"lda", INY, NORMAL}, // b1
|
||||||
|
{"lda", INZ, NORMAL}, // b2
|
||||||
|
{"lda", INS, NORMAL}, // b3
|
||||||
|
{"ldy", ZPX, NORMAL}, // b4
|
||||||
|
{"lda", ZPX, NORMAL}, // b5
|
||||||
|
{"ldx", ZPY, NORMAL}, // b6
|
||||||
|
{"lda", INLY, NORMAL}, // b7
|
||||||
|
{"clv", IMP, NORMAL}, // b8
|
||||||
|
{"lda", ABY, NORMAL}, // b9
|
||||||
|
{"tsx", IMP, NORMAL}, // ba
|
||||||
|
{"tyx", IMP, NORMAL}, // bb
|
||||||
|
{"ldy", ABX, NORMAL}, // bc
|
||||||
|
{"lda", ABX, NORMAL}, // bd
|
||||||
|
{"ldx", ABY, NORMAL}, // be
|
||||||
|
{"lda", ABLX, NORMAL}, // bf
|
||||||
|
{"cpy", IMMX, NORMAL}, // c0
|
||||||
|
{"cmp", INX, NORMAL}, // c1
|
||||||
|
{"rep", IMM, NORMAL}, // c2
|
||||||
|
{"cmp", ZPS, NORMAL}, // c3
|
||||||
|
{"cpy", ZP, NORMAL}, // c4
|
||||||
|
{"cmp", ZP, NORMAL}, // c5
|
||||||
|
{"dec", ZP, NORMAL}, // c6
|
||||||
|
{"cmp", INL, NORMAL}, // c7
|
||||||
|
{"iny", IMP, NORMAL}, // c8
|
||||||
|
{"cmp", IMMM, NORMAL}, // c9
|
||||||
|
{"dex", IMP, NORMAL}, // ca
|
||||||
|
{"wai", IMP, NORMAL}, // cb
|
||||||
|
{"cpy", ABS, NORMAL}, // cc
|
||||||
|
{"cmp", ABS, NORMAL}, // cd
|
||||||
|
{"dec", ABS, NORMAL}, // ce
|
||||||
|
{"cmp", ABL, NORMAL}, // cf
|
||||||
|
{"bne", REL, BRANCH}, // d0
|
||||||
|
{"cmp", INY, NORMAL}, // d1
|
||||||
|
{"cmp", INZ, NORMAL}, // d2
|
||||||
|
{"cmp", INS, NORMAL}, // d3
|
||||||
|
{"pei", ZP, NORMAL}, // d4
|
||||||
|
{"cmp", ZPX, NORMAL}, // d5
|
||||||
|
{"dec", ZPX, NORMAL}, // d6
|
||||||
|
{"cmp", INLY, NORMAL}, // d7
|
||||||
|
{"cld", IMP, NORMAL}, // d8
|
||||||
|
{"cmp", ABY, NORMAL}, // d9
|
||||||
|
{"phx", IMP, NORMAL}, // da
|
||||||
|
{"stp", IMP, BREAK}, // db
|
||||||
|
{"jmp", IND, JUMP}, // dc
|
||||||
|
{"cmp", ABX, NORMAL}, // dd
|
||||||
|
{"dec", ABX, NORMAL}, // de
|
||||||
|
{"cmp", ABLX, NORMAL}, // df
|
||||||
|
{"cpx", IMMX, NORMAL}, // e0
|
||||||
|
{"sbc", INX, NORMAL}, // e1
|
||||||
|
{"sep", IMM, NORMAL}, // e2
|
||||||
|
{"sbc", ZPS, NORMAL}, // e3
|
||||||
|
{"cpx", ZP, NORMAL}, // e4
|
||||||
|
{"sbc", ZP, NORMAL}, // e5
|
||||||
|
{"inc", ZP, NORMAL}, // e6
|
||||||
|
{"sbc", INL, NORMAL}, // e7
|
||||||
|
{"inx", IMP, NORMAL}, // e8
|
||||||
|
{"sbc", IMMM, NORMAL}, // e9
|
||||||
|
{"nop", IMP, NORMAL}, // ea
|
||||||
|
{"xba", IMP, NORMAL}, // eb
|
||||||
|
{"cpx", ABS, NORMAL}, // ec
|
||||||
|
{"sbc", ABS, NORMAL}, // ed
|
||||||
|
{"inc", ABS, NORMAL}, // ee
|
||||||
|
{"sbc", ABL, NORMAL}, // ef
|
||||||
|
{"beq", REL, BRANCH}, // f0
|
||||||
|
{"sbc", INY, NORMAL}, // f1
|
||||||
|
{"sbc", INZ, NORMAL}, // f2
|
||||||
|
{"sbc", INS, NORMAL}, // f3
|
||||||
|
{"pea", IMMS, NORMAL}, // f4
|
||||||
|
{"sbc", ZPX, NORMAL}, // f5
|
||||||
|
{"inc", ZPX, NORMAL}, // f6
|
||||||
|
{"sbc", INLY, NORMAL}, // f7
|
||||||
|
{"sed", IMP, NORMAL}, // f8
|
||||||
|
{"sbc", ABY, NORMAL}, // f9
|
||||||
|
{"plx", IMP, NORMAL}, // fa
|
||||||
|
{"xce", IMP, NORMAL}, // fb
|
||||||
|
{"jsr", AIX, CALL}, // fc
|
||||||
|
{"sbc", ABX, NORMAL}, // fd
|
||||||
|
{"inc", ABX, NORMAL}, // fe
|
||||||
|
{"sbc", ABLX, NORMAL} // ff
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint8_t addressSizes[] = {
|
||||||
|
1, // IMP
|
||||||
|
2, // IMM
|
||||||
|
3, // IMMM
|
||||||
|
3, // IMMX
|
||||||
|
3, // IMMS
|
||||||
|
3, // ABS
|
||||||
|
4, // ABL
|
||||||
|
3, // ABX
|
||||||
|
3, // ABY
|
||||||
|
4, // ABLX
|
||||||
|
3, // AIX
|
||||||
|
2, // ZP
|
||||||
|
2, // ZPX
|
||||||
|
2, // ZPY
|
||||||
|
2, // ZPS
|
||||||
|
3, // IND
|
||||||
|
2, // INZ
|
||||||
|
2, // INL
|
||||||
|
2, // INX
|
||||||
|
2, // INY
|
||||||
|
2, // INLY
|
||||||
|
2, // INS
|
||||||
|
2, // REL
|
||||||
|
3, // RELL
|
||||||
|
3, // BANK
|
||||||
|
1, // DB
|
||||||
|
2, // DW
|
||||||
|
4 // DD
|
||||||
|
};
|
24
LICENSE
Normal file
24
LICENSE
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
Copyright (c) 2018, Sean Kasun
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||||
|
THE POSSIBILITY OF SUCH DAMAGE.
|
19
Makefile
Normal file
19
Makefile
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
CC=clang
|
||||||
|
CFLAGS=-Wall
|
||||||
|
|
||||||
|
all: 2mg omf regs
|
||||||
|
|
||||||
|
2mg: 2mg.o
|
||||||
|
$(CC) $(CFLAGS) -o $@ $^
|
||||||
|
|
||||||
|
omf: omf.o parser.o
|
||||||
|
$(CC) $(CFLAGS) -o $@ $^
|
||||||
|
|
||||||
|
regs: regs.o map.o scan.o parser.o disasm.o
|
||||||
|
$(CC) $(CFLAGS) -o $@ $^
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
$(CC) -c $(CFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o 2mg omg regs
|
175
README.md
Executable file
175
README.md
Executable file
|
@ -0,0 +1,175 @@
|
||||||
|
# What is this?
|
||||||
|
|
||||||
|
This is a set of command-line tools designed specifically to reverse engineer Apple IIgs software. It is comprised of 3 separate tools; `2mg`, `omf`, and `regs`.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 2mg
|
||||||
|
|
||||||
|
`2mg` extracts .2mg and .po prodos disk images. You can also just list the contents of the disk image with the `-l` or `--list` command line argument. Otherwise, it will create a folder with the name of the disk and extract all the files into that folder.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## omf
|
||||||
|
|
||||||
|
`omf` is a rather complicated tool which is designed to extract relocatable segments from OMF files. Apple IIgs executables (.sys16 files) and system tools (ex. SYSTEM/TOOLS/TOOL025) are in OMF format.
|
||||||
|
|
||||||
|
You first run this tool and pass it an OMF file and it will generate a .map file. This map file is a simple text file that you may edit. Each line is in the format:
|
||||||
|
|
||||||
|
`segment:memory location`
|
||||||
|
|
||||||
|
The `segment`is the segment number from the OMF file, and `memory location` is where in memory to relocate that segment.
|
||||||
|
|
||||||
|
`omf` does its best to automatically pack all the relocatable segments into the smallest memory possible, starting at `$2/0000`. You can change the starting memory address with the `-o` or `--org` argument. If you wish to manually specify where each segment should go in memory, feel free to edit the .map file however you wish.
|
||||||
|
|
||||||
|
The next step is to run `omf` again, this time specifying the map file with `-m` or `--map`. This will apply the .map to the OMF and output each segment along with a corresponding .map file. `omf` will throw an error if the segments cannot be mapped as the .map file dictates (for example, you modified the map file so that the segments accidentally overlap).
|
||||||
|
|
||||||
|
`omf` will modify each segment, applying the proper relocations before outputting the segment. If you wish to change where a segment is in memory, you should modify the original .map file and re-run `omf`. The resulting output files will be hardcoded for those specific memory locations.
|
||||||
|
|
||||||
|
The segment outputs will be named `segX` and `segX.map`, where `X` is the segment number, in hex. If you wish to change the prefix from `seg` use the `-p` or `--prefix` argument.
|
||||||
|
|
||||||
|
At this point, you can use the resulting segment files and map files as input to the `regs` tool.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## regs
|
||||||
|
|
||||||
|
`regs`is my 65816 tracing disassembler. It can be used in conjunction with the .map files created by `omf` or on its own. Since it is a tracing disassembler, it will start disassembly at a given location, and keep disassembling, following all possible paths. Everything not disassembled will be assumed to be data and shown in a hex view.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### regs by itself
|
||||||
|
|
||||||
|
You can call `regs` and simply pass it a binary file and it will attempt to disassemble it. You can specify where in memory it should load the file before disassembly with the `-o` or `--org` argument. You can also control whether or not the disassembler is in emulation mode or 16-bit mode with various command-line arguments. Emulation mode is also useful for disassembling 8-bit Apple II software. Use `-e` to start in emulation mode (default native mode), `-m` to start with an 8-bit accumulator (default 16-bit), and `-x` to start with 8-bit index registers (default 16-bit).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### regs with .map files
|
||||||
|
|
||||||
|
`regs` with .map files is where the disassembler really shines. You can call `regs` and pass it a .map file generated by `omf` and have real control over the disassembly. The .map file is designed to be edited by hand. The format is as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
gMAP "seg1"
|
||||||
|
sORG $30000
|
||||||
|
$30000:
|
||||||
|
$30053:mx
|
||||||
|
$31066:e
|
||||||
|
```
|
||||||
|
|
||||||
|
The first line specifies the segment file that this map applies to. The filename in the quotes should be relative to the current directory.
|
||||||
|
|
||||||
|
The next line specifies where the segment belongs in memory. **Do not edit this** if the segment was created by `omf`, since it has also been hardcoded in the binary.
|
||||||
|
|
||||||
|
The next lines are a list of entry points to begin disassembly at. If, when analyzing the disassembly you find a switch case encoded as an indirect jump, you can take that list of jumps and add them to the map file and re-run `regs` to disassemble the previously un-disassembled data. As you work through a disassembly, you may end up with a map file with hundreds of entry points, that's normal.
|
||||||
|
|
||||||
|
The flags after the colon are optional, and specify whether emulation mode should be enabled, or 16-bit or 8-bit accumulator and index registers should be used. It defaults to native mode with 16-bit registers.
|
||||||
|
|
||||||
|
You can also use bank-separators if you wish. `$3/1066` is the same as `$31066`.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Pascal folder
|
||||||
|
|
||||||
|
You'll notice a pascal folder in this repository. These are the original GS/OS pascal header files. This is to make it easier for you to look up the arguments and structures of various tool calls you'll come across when disassembling.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Examples
|
||||||
|
|
||||||
|
The flexibility of these tools makes their use a little complicated. So here are some examples of how to go about disassembling various things.
|
||||||
|
|
||||||
|
### Disassembling an S16
|
||||||
|
|
||||||
|
I'll be using the S16 from Dream Zone as an example.
|
||||||
|
|
||||||
|
Generate a basic map of your S16:
|
||||||
|
|
||||||
|
`$ omf dream.s16`
|
||||||
|
|
||||||
|
This will create a file called `dream.s16.map`, which we could edit if we choose. We'll leave it as it is. Extract the segments of the OMF with:
|
||||||
|
|
||||||
|
`$ omf --map=dream.s16.map dream.s16 --prefix=dream`
|
||||||
|
|
||||||
|
This will create files `dream1`to `dream5` as well as `dream1.map` to `dream5.map`.
|
||||||
|
|
||||||
|
The program's entry point is always the beginning of the first segment, so we'll start there.
|
||||||
|
|
||||||
|
`$ regs dream1.map > dream1.s`
|
||||||
|
|
||||||
|
This will disassemble the entry point. We can then modify the map to further refine the disassembly if we wish.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Disassembling a Tool
|
||||||
|
|
||||||
|
This works the same as disassembling an S16, but with an important difference.
|
||||||
|
|
||||||
|
We'll start the same, generating a map and extracting it.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ omf TOOL025
|
||||||
|
$ omf --map=TOOL025.map TOOL025
|
||||||
|
```
|
||||||
|
|
||||||
|
Now, we'll remove all disassembly instructions from the map. You'll see why in a second. So we edit the map file to look like the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
gMAP "seg1"
|
||||||
|
sORG $20000
|
||||||
|
```
|
||||||
|
|
||||||
|
That's it.. no disassembly instructions. Now we run the disassembler:
|
||||||
|
|
||||||
|
`$ regs seg1.map > seg1.s`
|
||||||
|
|
||||||
|
This will just give us a hex dump of the segment. That's actually what we want. All tools start with a tool table. The first dword specifies the number of tools in this toolset. The next dwords all contain addresses (minus 1) of the various tool entry points.
|
||||||
|
|
||||||
|
Let's say I want to disassemble NoteOn. We check the pascal folder and discover that it's tool $0b inside the $19 toolset. Which is the TOOL025 file we're working on (the tool numbers in the filenames are in decimal). So we calculate the offset to that entry point.
|
||||||
|
|
||||||
|
`$0b * 4 + $20000 = $2:002c`
|
||||||
|
|
||||||
|
If we look at the hex dump at that location we'll discover the entry point of NoteOn: `$2:02dd`. Well that's minus one, so we add the real entry point to the .map file:
|
||||||
|
|
||||||
|
```
|
||||||
|
gMAP "seg1"
|
||||||
|
sORG $20000
|
||||||
|
$2/02de:
|
||||||
|
```
|
||||||
|
|
||||||
|
And rerun the disassembler.
|
||||||
|
|
||||||
|
`$ regs seg1.map > seg1.s`
|
||||||
|
|
||||||
|
We have just disassembled the NoteOn function.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Disassembling a Specific Tool Call in ROM
|
||||||
|
|
||||||
|
Let's say I want to disassemble WriteRamBlock. We discover it's in the sound toolset $08. If you search, you'll discover that there isn't a TOOL008 anywhere, so we'll have to pull it from ROM. I'll be using an older 128k ROM just because it's convenient.
|
||||||
|
|
||||||
|
First thing I do, is actually hand make a `rom.map` file for the ROM.
|
||||||
|
|
||||||
|
```
|
||||||
|
gMAP "APPLE2GS.ROM"
|
||||||
|
sORG $fe0000
|
||||||
|
$fe/0000:
|
||||||
|
```
|
||||||
|
|
||||||
|
and disassemble it.
|
||||||
|
|
||||||
|
`$ regs rom.map > rom.s`
|
||||||
|
|
||||||
|
This is actually the bootstrap that initializes the `$e1/0000` tool call entrypoint. I notice it copies over a block of memory from `$fe/0051` into `$e1/0000`. So we add `$fe/0051` to the disassembly list of the map file, and disassemble it again.
|
||||||
|
|
||||||
|
Following along with the disassembly, we discover that there's a toolset list starting at `$fe/012f`. It starts with a dword with the number of toolsets in the ROM, followed by a list of offsets to the various toolsets. We want toolset 8 for the sound toolset.
|
||||||
|
|
||||||
|
`$8 * 4 + $fe012f = $fe014f`
|
||||||
|
|
||||||
|
Look up the dword in that location and I find that the toolset is located at `$ff/3e00`. If you then jump to that location, you'll find this is in the exact same format as a tool on disk. It starts with a tool table. WriteRamBlock is tool 9.
|
||||||
|
|
||||||
|
`$9 * 4 + $ff3e00 = $ff3e24`
|
||||||
|
|
||||||
|
At that location, we discover the offset to the tool entry point is `$ff/41a4` so we'll add `$ff/41a5`to the map file and rerun the disassembly.
|
||||||
|
|
||||||
|
Boom, we have just disassembled a specific tool call from ram.
|
412
addresses.h
Normal file
412
addresses.h
Normal file
|
@ -0,0 +1,412 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* Defines important IIgs memory addresses.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t address;
|
||||||
|
const char *comment;
|
||||||
|
} MemAddress;
|
||||||
|
|
||||||
|
static MemAddress addresses[] = {
|
||||||
|
{0x03d0, "Enter BASIC"},
|
||||||
|
{0x03d2, "Reconnect DOS"},
|
||||||
|
{0x03d9, "Cow Sound"},
|
||||||
|
{0x03ea, "Reconnect IO"},
|
||||||
|
{0x03f2, "Control-Reset Vector"},
|
||||||
|
{0x03f5, "Ampersand Vector"},
|
||||||
|
{0x03f8, "Control-Y Vector"},
|
||||||
|
{0x0400, "Text Screen"},
|
||||||
|
{0x0800, "Text Screen 2"},
|
||||||
|
{0x0803, "Enter assembler"},
|
||||||
|
{0x2000, "Hires screen"},
|
||||||
|
{0x4000, "Hires screen 2"},
|
||||||
|
{0x9dbf, "Reconnect DOS 3.3"},
|
||||||
|
{0xa56e, "CATALOG"},
|
||||||
|
{0xc000, "KBD / 80STOREOFF"},
|
||||||
|
{0xc001, "80STOREON"},
|
||||||
|
{0xc002, "RDMAINRAM"},
|
||||||
|
{0xc003, "RDCARDRAM"},
|
||||||
|
{0xc004, "WRMAINRAM"},
|
||||||
|
{0xc005, "WRCARDRAM"},
|
||||||
|
{0xc006, "SETSLOTCXROM"},
|
||||||
|
{0xc007, "SETINTCXROM"},
|
||||||
|
{0xc008, "SETSTDZP"},
|
||||||
|
{0xc009, "SETALTZP"},
|
||||||
|
{0xc00a, "SETINTC3ROM"},
|
||||||
|
{0xc00b, "SETSLOTC3ROM"},
|
||||||
|
{0xc00c, "CLR80VID"},
|
||||||
|
{0xc00d, "SET80VID"},
|
||||||
|
{0xc00e, "CLRALTCHAR"},
|
||||||
|
{0xc00f, "SETALTCHAR"},
|
||||||
|
{0xc010, "KBDSTRB"},
|
||||||
|
{0xc011, "RDLCBNK2"},
|
||||||
|
{0xc012, "RDLCRAM"},
|
||||||
|
{0xc013, "RDRAMRD"},
|
||||||
|
{0xc014, "RDRAMWRT"},
|
||||||
|
{0xc015, "RDCXROM"},
|
||||||
|
{0xc016, "RDALTZP"},
|
||||||
|
{0xc017, "RDC3ROM"},
|
||||||
|
{0xc018, "RD80STORE"},
|
||||||
|
{0xc019, "RDVBL"},
|
||||||
|
{0xc01a, "RDTEXT"},
|
||||||
|
{0xc01b, "RDMIXED"},
|
||||||
|
{0xc01c, "RDPAGE2"},
|
||||||
|
{0xc01d, "RDHIRES"},
|
||||||
|
{0xc01e, "RDALTCHAR"},
|
||||||
|
{0xc01f, "RD80VID"},
|
||||||
|
{0xc020, "TAPEOUT"},
|
||||||
|
{0xc021, "MONOCOLOR"},
|
||||||
|
{0xc022, "TBCOLOR"},
|
||||||
|
{0xc023, "VGCINT"},
|
||||||
|
{0xc024, "MOUSEDATA"},
|
||||||
|
{0xc025, "KEYMODREG"},
|
||||||
|
{0xc026, "DATAREG"},
|
||||||
|
{0xc027, "KMSTATUS"},
|
||||||
|
{0xc028, "ROMBANK"},
|
||||||
|
{0xc029, "NEWVIDEO"},
|
||||||
|
{0xc02b, "LANGSEL"},
|
||||||
|
{0xc02c, "CHARROM"},
|
||||||
|
{0xc02d, "SLTROMSEL"},
|
||||||
|
{0xc02e, "VERTCNT"},
|
||||||
|
{0xc02f, "HORIZCNT"},
|
||||||
|
{0xc030, "SPKR"},
|
||||||
|
{0xc031, "DISKREG"},
|
||||||
|
{0xc032, "SCANINT"},
|
||||||
|
{0xc033, "CLOCKDATA"},
|
||||||
|
{0xc034, "CLOCKCTL"},
|
||||||
|
{0xc035, "SHADOW"},
|
||||||
|
{0xc036, "CYAREG"},
|
||||||
|
{0xc037, "DMAREG"},
|
||||||
|
{0xc038, "SCCBREG"},
|
||||||
|
{0xc039, "SCCAREG"},
|
||||||
|
{0xc03a, "SCCBDATA"},
|
||||||
|
{0xc03b, "SCCADATA"},
|
||||||
|
{0xc03c, "SOUNDCTL"},
|
||||||
|
{0xc03d, "SOUNDDATA"},
|
||||||
|
{0xc03e, "SOUNDADRL"},
|
||||||
|
{0xc03f, "SOUNDADRH"},
|
||||||
|
{0xc040, "STROBE"},
|
||||||
|
{0xc041, "INTEN"},
|
||||||
|
{0xc044, "MMDELTAX"},
|
||||||
|
{0xc045, "MMDELTAY"},
|
||||||
|
{0xc046, "DIAGTYPE"},
|
||||||
|
{0xc047, "CLRVBLINT"},
|
||||||
|
{0xc048, "CLRXYINT"},
|
||||||
|
{0xc050, "TXTCLR"},
|
||||||
|
{0xc051, "TXTSET"},
|
||||||
|
{0xc052, "MIXCLR"},
|
||||||
|
{0xc053, "MIXSET"},
|
||||||
|
{0xc054, "TXTPAGE1"},
|
||||||
|
{0xc055, "TXTPAGE2"},
|
||||||
|
{0xc056, "LORES"},
|
||||||
|
{0xc057, "HIRES"},
|
||||||
|
{0xc058, "CLRAN0"},
|
||||||
|
{0xc059, "SETAN0"},
|
||||||
|
{0xc05a, "CLRAN1"},
|
||||||
|
{0xc05b, "SETAN1"},
|
||||||
|
{0xc05c, "CLRAN2"},
|
||||||
|
{0xc05d, "SETAN2"},
|
||||||
|
{0xc05e, "DHIRESON"},
|
||||||
|
{0xc05f, "DHIRESOFF"},
|
||||||
|
{0xc060, "TAPEIN"},
|
||||||
|
{0xc061, "RDBTN0"},
|
||||||
|
{0xc062, "RDBTN1"},
|
||||||
|
{0xc063, "RDBTN2"},
|
||||||
|
{0xc064, "PADDL0"},
|
||||||
|
{0xc065, "PADDL1"},
|
||||||
|
{0xc066, "PADDL2"},
|
||||||
|
{0xc067, "PADDL3"},
|
||||||
|
{0xc068, "STATEREG"},
|
||||||
|
{0xc06d, "TESTREG"},
|
||||||
|
{0xc06e, "CLTRM"},
|
||||||
|
{0xc06f, "ENTM"},
|
||||||
|
{0xc070, "PTRIG"},
|
||||||
|
{0xc073, "BANKSEL"},
|
||||||
|
{0xc07e, "IOUDISON"},
|
||||||
|
{0xc07f, "IOUDISOFF"},
|
||||||
|
{0xc081, "ROMIN"},
|
||||||
|
{0xc083, "LCBANK2"},
|
||||||
|
{0xc08b, "LCBANK1"},
|
||||||
|
{0xc0e0, "PH0 off"},
|
||||||
|
{0xc0e1, "PH0 on"},
|
||||||
|
{0xc0e2, "PH1 off"},
|
||||||
|
{0xc0e3, "PH1 on"},
|
||||||
|
{0xc0e4, "PH2 off"},
|
||||||
|
{0xc0e5, "PH2 on"},
|
||||||
|
{0xc0e6, "PH3 off"},
|
||||||
|
{0xc0e7, "PH3 on"},
|
||||||
|
{0xc0e8, "motor off"},
|
||||||
|
{0xc0e9, "motor on"},
|
||||||
|
{0xc0ea, "drive 1"},
|
||||||
|
{0xc0eb, "drive 2"},
|
||||||
|
{0xc0ec, "q6 off"},
|
||||||
|
{0xc0ed, "q6 on"},
|
||||||
|
{0xc0ee, "q7 off"},
|
||||||
|
{0xc0ef, "q7 on"},
|
||||||
|
{0xc311, "AUXMOVE"},
|
||||||
|
{0xc314, "XFER"},
|
||||||
|
{0xc50d, "Smartport"},
|
||||||
|
{0xc70d, "Smartport"},
|
||||||
|
{0xcfff," CLRROM"},
|
||||||
|
{0xd1fc, "Hires Find"},
|
||||||
|
{0xd2c9, "Hires bg"},
|
||||||
|
{0xd331, "Hires graphics bg"},
|
||||||
|
{0xd33a, "Hires DRAW1"},
|
||||||
|
{0xd3b9, "Hires SHLOAD"},
|
||||||
|
{0xd683, "Clear FOR"},
|
||||||
|
{0xdafb, "Carriage Return"},
|
||||||
|
{0xe000, "Reset Int Basic"},
|
||||||
|
{0xe04b, "IntBASIC LIST"},
|
||||||
|
{0xe5ad, "NEW"},
|
||||||
|
{0xe5b7, "PLOT"},
|
||||||
|
{0xe836, "IntBASIC CHAIN"},
|
||||||
|
{0xefec, "IntBASIC RUN"},
|
||||||
|
{0xf07c, "IntBASIC LOAD"},
|
||||||
|
{0xf0e0, "Leave monitor"},
|
||||||
|
{0xf123, "DRAW shape"},
|
||||||
|
{0xf14f, "Plot point"},
|
||||||
|
{0xf171, "IntBASIC TRACE ON"},
|
||||||
|
{0xf176, "IntBASIC TRACE OFF"},
|
||||||
|
{0xf30a, "IntBASIC CON"},
|
||||||
|
{0xf317, "RESUME"},
|
||||||
|
{0xf328, "Clear error"},
|
||||||
|
{0xf3de, "HGR"},
|
||||||
|
{0xf3e4, "Show hires"},
|
||||||
|
{0xf3f2, "Clear hires"},
|
||||||
|
{0xf3f6, "Clear hires color"},
|
||||||
|
{0xf666, "Enter assembler"},
|
||||||
|
{0xf800, "PLOT"},
|
||||||
|
{0xf80e, "PLOT1"},
|
||||||
|
{0xf819, "HLINE"},
|
||||||
|
{0xf828, "VLINE"},
|
||||||
|
{0xf832, "CLRSCR"},
|
||||||
|
{0xf836, "CLRTOP"},
|
||||||
|
{0xf838, "Clear lores y"},
|
||||||
|
{0xf83c, "Clear rect"},
|
||||||
|
{0xf847, "GBASCALC"},
|
||||||
|
{0xf85e, "Add 3 COLOR"},
|
||||||
|
{0xf85f, "NXTCOL"},
|
||||||
|
{0xf864, "SETCOL"},
|
||||||
|
{0xf871, "SCRN"},
|
||||||
|
{0xf88c, "INSDS1.2"},
|
||||||
|
{0xf88e, "INSDS2"},
|
||||||
|
{0xf890, "GET816LEN"},
|
||||||
|
{0xf8d0, "INSTDSP"},
|
||||||
|
{0xf940, "PRNTYX"},
|
||||||
|
{0xf941, "PRNTAX"},
|
||||||
|
{0xf944, "PRNTX"},
|
||||||
|
{0xf948, "PRBLNK"},
|
||||||
|
{0xf94a, "PRBL2"},
|
||||||
|
{0xf94c, "Print X blank"},
|
||||||
|
{0xf953, "PCADJ"},
|
||||||
|
{0xf962, "TEXT2COPY"},
|
||||||
|
{0xfa40, "OLDIRQ"},
|
||||||
|
{0xfa4c, "BREAK"},
|
||||||
|
{0xfa59, "OLDBRK"},
|
||||||
|
{0xfa62, "RESET"},
|
||||||
|
{0xfaa6, "PWRUP"},
|
||||||
|
{0xfaba, "SLOOP"},
|
||||||
|
{0xfad7, "REGDSP"},
|
||||||
|
{0xfb19, "RTBL"},
|
||||||
|
{0xfb1e, "PREAD"},
|
||||||
|
{0xfb21, "PREAD4"},
|
||||||
|
{0xfb2f, "INIT"},
|
||||||
|
{0xfb39, "SETTXT"},
|
||||||
|
{0xfb40, "SETGR"},
|
||||||
|
{0xfb4b, "SETWND"},
|
||||||
|
{0xfb51, "SETWND2"},
|
||||||
|
{0xfb5b, "TABV"},
|
||||||
|
{0xfb60, "APPLEII"},
|
||||||
|
{0xfb6f, "SETPWRC"},
|
||||||
|
{0xfb78, "VIDWAIT"},
|
||||||
|
{0xfb88, "KBDWAIT"},
|
||||||
|
{0xfbb3, "VERSION"},
|
||||||
|
{0xfbbf, "ZIDBYTE2"},
|
||||||
|
{0xfbc0, "ZIDBYTE"},
|
||||||
|
{0xfbc1, "BASCALC"},
|
||||||
|
{0xfbdd, "BELL1"},
|
||||||
|
{0xfbe2, "BELL1.2"},
|
||||||
|
{0xfbe4, "BELL2"},
|
||||||
|
{0xfbf0, "STORADV"},
|
||||||
|
{0xfbf4, "ADVANCE"},
|
||||||
|
{0xfbfd, "VIDOUT"},
|
||||||
|
{0xfc10, "BS"},
|
||||||
|
{0xfc1a, "UP"},
|
||||||
|
{0xfc22, "VTAB"},
|
||||||
|
{0xfc24, "VTABZ"},
|
||||||
|
{0xfc2c, "ESC"},
|
||||||
|
{0xfc42, "CLREOP"},
|
||||||
|
{0xfc58, "HOME"},
|
||||||
|
{0xfc62, "CR"},
|
||||||
|
{0xfc66, "LF"},
|
||||||
|
{0xfc70, "SCROLL"},
|
||||||
|
{0xfc9c, "CLREOL"},
|
||||||
|
{0xfc9e, "CLREOLZ"},
|
||||||
|
{0xfca8, "WAIT"},
|
||||||
|
{0xfcb4, "NXTA4"},
|
||||||
|
{0xfcba, "NXTA1"},
|
||||||
|
{0xfcc9, "HEADR"},
|
||||||
|
{0xfd0c, "RDKEY"},
|
||||||
|
{0xfd10, "FD10"},
|
||||||
|
{0xfd18, "RDKEY1"},
|
||||||
|
{0xfd1b, "KEYIN"},
|
||||||
|
{0xfd35, "RDCHAR"},
|
||||||
|
{0xfd5a, "Wait return"},
|
||||||
|
{0xfd5c, "Ring bell wait"},
|
||||||
|
{0xfd67, "GETLNZ"},
|
||||||
|
{0xfd6a, "GETLN"},
|
||||||
|
{0xfd6c, "GETLN0"},
|
||||||
|
{0xfd6f, "GETLN1"},
|
||||||
|
{0xfd75, "Wait line"},
|
||||||
|
{0xfd8b, "CROUT1"},
|
||||||
|
{0xfd8e, "CROUT"},
|
||||||
|
{0xfd92, "PRA1"},
|
||||||
|
{0xfda3, "Print memory"},
|
||||||
|
{0xfdda, "PRBYTE"},
|
||||||
|
{0xfde3, "PRHEX"},
|
||||||
|
{0xfded, "COUT"},
|
||||||
|
{0xfdf0, "COUT1"},
|
||||||
|
{0xfdf6, "COUTZ"},
|
||||||
|
{0xfe1f, "IDROUTINE"},
|
||||||
|
{0xfe2c, "MOVE"},
|
||||||
|
{0xfe5e, "LIST"},
|
||||||
|
{0xfe61, "Disassembler"},
|
||||||
|
{0xfe80, "INVERSE"},
|
||||||
|
{0xfe84, "NORMAL"},
|
||||||
|
{0xfe86, "Set I"},
|
||||||
|
{0xfe89, "SETKBD"},
|
||||||
|
{0xfe8b, "INPORT"},
|
||||||
|
{0xfe93, "SETVID"},
|
||||||
|
{0xfe95, "OUTPORT"},
|
||||||
|
{0xfeb0, "Jump BASIC"},
|
||||||
|
{0xfeb6, "GO"},
|
||||||
|
{0xfebf, "Display regs"},
|
||||||
|
{0xfec2, "Perform trace"},
|
||||||
|
{0xfecd, "WRITE"},
|
||||||
|
{0xfefd, "READ"},
|
||||||
|
{0xff2d, "PRERR"},
|
||||||
|
{0xff3a, "BELL"},
|
||||||
|
{0xff3f, "RESTORE"},
|
||||||
|
{0xff44, "RSTR1"},
|
||||||
|
{0xff4a, "SAVE"},
|
||||||
|
{0xff4c, "SAV1"},
|
||||||
|
{0xff58, "IORTS"},
|
||||||
|
{0xff59, "OLDRST"},
|
||||||
|
{0xff65, "MON"},
|
||||||
|
{0xff69, "MONZ"},
|
||||||
|
{0xff6c, "MONZ2"},
|
||||||
|
{0xff70, "MONZ4"},
|
||||||
|
{0xff8a, "DIG"},
|
||||||
|
{0xffa7, "GETNUM"},
|
||||||
|
{0xffad, "NXTCHR"},
|
||||||
|
{0xffbe, "TOSUB"},
|
||||||
|
{0xffc7, "ZMODE"},
|
||||||
|
{0xe01e04, "StdText"},
|
||||||
|
{0xe01e08, "StdLine"},
|
||||||
|
{0xe01e0c, "StdRect"},
|
||||||
|
{0xe01e10, "StdRRect"},
|
||||||
|
{0xe01e14, "StdOval"},
|
||||||
|
{0xe01e18, "StdArc"},
|
||||||
|
{0xe01e1c, "StdPoly"},
|
||||||
|
{0xe01e20, "StdRgn"},
|
||||||
|
{0xe01e24, "StdPixels"},
|
||||||
|
{0xe01e28, "StdComment"},
|
||||||
|
{0xe01e2c, "StdTxMeas"},
|
||||||
|
{0xe01e30, "StdTxBnds"},
|
||||||
|
{0xe01e34, "StdGetPic"},
|
||||||
|
{0xe01e38, "StdPutPic"},
|
||||||
|
{0xe01e98, "ShieldCursor"},
|
||||||
|
{0xe01e9c, "UnshieldCursor"},
|
||||||
|
{0xe10000, "System Tool dispatch"},
|
||||||
|
{0xe10004, "System Tool dispatch"},
|
||||||
|
{0xe10008, "User Tool dispatch"},
|
||||||
|
{0xe1000c, "User Tool dispatch"},
|
||||||
|
{0xe10010, "Interrupt manager"},
|
||||||
|
{0xe10014, "COP manager"},
|
||||||
|
{0xe10018, "Abort manager"},
|
||||||
|
{0xe1001c, "System death manager"},
|
||||||
|
{0xe10020, "AppleTalk interrupt"},
|
||||||
|
{0xe10024, "Serial interrupt"},
|
||||||
|
{0xe10028, "Scanline interrupt"},
|
||||||
|
{0xe1002c, "Sound interrupt"},
|
||||||
|
{0xe10030, "VBlank interrupt"},
|
||||||
|
{0xe10034, "Mouse interrupt"},
|
||||||
|
{0xe10038, "250ms interrupt"},
|
||||||
|
{0xe1003c, "Keyboard interrupt"},
|
||||||
|
{0xe10040, "ADB Response"},
|
||||||
|
{0xe10044, "ADB SRQ"},
|
||||||
|
{0xe10048, "DA manager"},
|
||||||
|
{0xe1004c, "Flush Buffer"},
|
||||||
|
{0xe10050, "KbdMicro interrupt"},
|
||||||
|
{0xe10054, "1s interrupt"},
|
||||||
|
{0xe10058, "External VGC interrupt"},
|
||||||
|
{0xe1005c, "Ohter interrupt"},
|
||||||
|
{0xe10060, "Cursor update"},
|
||||||
|
{0xe10064, "IncBusy"},
|
||||||
|
{0xe10068, "DecBusy"},
|
||||||
|
{0xe1006c, "Bell vector"},
|
||||||
|
{0xe10070, "Break vector"},
|
||||||
|
{0xe10074, "Trace vector"},
|
||||||
|
{0xe10078, "Step vector"},
|
||||||
|
{0xe1007c, "ROM disk"},
|
||||||
|
{0xe10080, "ToWriteBram"},
|
||||||
|
{0xe10084, "ToReadBram"},
|
||||||
|
{0xe10088, "ToWriteTime"},
|
||||||
|
{0xe1008c, "ToReadTime"},
|
||||||
|
{0xe10090, "ToCtrlPanel"},
|
||||||
|
{0xe10094, "ToBramSetup"},
|
||||||
|
{0xe10098, "ToPrintMsg8"},
|
||||||
|
{0xe1009c, "ToPrintMsg16"},
|
||||||
|
{0xe100a0, "Native Ctl-Y"},
|
||||||
|
{0xe100a4, "ToAltDispCDA"},
|
||||||
|
{0xe100a8, "Prodos 16"},
|
||||||
|
{0xe100ac, "OS vector"},
|
||||||
|
{0xe100b0, "GS/OS"},
|
||||||
|
{0xe100b4, "P8 Switch"},
|
||||||
|
{0xe100b8, "Public Flags"},
|
||||||
|
{0xe100bc, "OS Kind"},
|
||||||
|
{0xe100bd, "OS Boot"},
|
||||||
|
{0xe100be, "OS Busy"},
|
||||||
|
{0xe100c0, "MsgPtr"},
|
||||||
|
{0xe10180, "ToBusyStrip"},
|
||||||
|
{0xe10184, "ToStrip"},
|
||||||
|
{0xe101b2, "MidiInputPoll"},
|
||||||
|
{0xe10200, "Memory manager"},
|
||||||
|
{0xe10204, "Set System Speed"},
|
||||||
|
{0xe10208, "Slot Arbiter"},
|
||||||
|
{0xe10220, "Hypercard callback"},
|
||||||
|
{0xe10224, "WordForRTL"},
|
||||||
|
{0xe11004, "ATLK Basic"},
|
||||||
|
{0xe11008, "ATLK Pascal"},
|
||||||
|
{0xe1100c, "ATLK RamGoComp"},
|
||||||
|
{0xe11010, "ATLK SoftReset"},
|
||||||
|
{0xe11014, "ATLK RamDispatch"},
|
||||||
|
{0xe11018, "ATLK RamForbid"},
|
||||||
|
{0xe1101c, "ATLK RamPermit"},
|
||||||
|
{0xe11020, "ATLK ProEntry"},
|
||||||
|
{0xe11022, "ATLK ProDOS"},
|
||||||
|
{0xe11026, "ATLK SerStatus"},
|
||||||
|
{0xe1102a, "ATLK SerWrite"},
|
||||||
|
{0xe1102e, "ATLK SerRead"},
|
||||||
|
{0xe1103e, "ATLK PFI"},
|
||||||
|
{0xe1d600, "ATLK CmdTable"},
|
||||||
|
{0xe1da00, "ATLK TickCount"}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define numAddresses (sizeof(addresses) / sizeof(addresses[0]))
|
||||||
|
|
||||||
|
static const char *addressLookup(uint32_t addr) {
|
||||||
|
for (int i = 0; i < numAddresses; i++) {
|
||||||
|
if (addresses[i].address >= addr) {
|
||||||
|
if (addresses[i].address == addr)
|
||||||
|
return addresses[i].comment;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (addr & ~0xffff)
|
||||||
|
return addressLookup(addr & 0xffff); // try pageless
|
||||||
|
return NULL;
|
||||||
|
}
|
358
disasm.c
Normal file
358
disasm.c
Normal file
|
@ -0,0 +1,358 @@
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* The main disassembler.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "disasm.h"
|
||||||
|
#include "65816.h"
|
||||||
|
#include "handle.h"
|
||||||
|
#include "addresses.h"
|
||||||
|
#include "prodos8.h"
|
||||||
|
#include "prodos16.h"
|
||||||
|
#include "smartport.h"
|
||||||
|
#include "tools.h"
|
||||||
|
|
||||||
|
static void dumphex(uint8_t *ptr, uint32_t addr, uint32_t len) {
|
||||||
|
uint8_t *eof = ptr + len;
|
||||||
|
for (int line = 0; ptr < eof; line++) {
|
||||||
|
printf("%02x/%04x: ", addr >> 16, addr & 0xffff);
|
||||||
|
uint8_t *p = ptr;
|
||||||
|
int skip = addr & 0xf;
|
||||||
|
int i = 0;
|
||||||
|
for (; i < skip; i++) {
|
||||||
|
if (i == 8) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
for (; i < 16 && p < eof; i++) {
|
||||||
|
if (i == 8) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
printf("%02x ", *p++);
|
||||||
|
}
|
||||||
|
for (; i < 16; i++) {
|
||||||
|
if (i == 8) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
printf("| ");
|
||||||
|
i = 0;
|
||||||
|
for (; i < skip; i++) {
|
||||||
|
if (i == 8) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
for (; i < 16 && ptr < eof; i++) {
|
||||||
|
if (i == 8) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
uint8_t c = *ptr++;
|
||||||
|
addr++;
|
||||||
|
printf("%c", (c >= ' ' && c <= '~') ? c : '.');
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void disassemble(uint8_t *data, size_t len, Map *map) {
|
||||||
|
uint8_t *ptr = data;
|
||||||
|
uint8_t *end = data + len;
|
||||||
|
|
||||||
|
uint16_t x = 0;
|
||||||
|
uint32_t val;
|
||||||
|
int8_t delta;
|
||||||
|
int16_t delta16;
|
||||||
|
uint32_t d6;
|
||||||
|
bool smart = false, dos8 = false, dos16 = false;
|
||||||
|
|
||||||
|
uint32_t addr = map->minMemory;
|
||||||
|
|
||||||
|
while (ptr < end) {
|
||||||
|
MapFlags flags = map->mem[addr - map->minMemory];
|
||||||
|
if ((flags & IsOpcode) || smart || dos8 || dos16) {
|
||||||
|
printf("%02x/%04x:", addr >> 16, addr & 0xffff);
|
||||||
|
uint8_t *start = ptr;
|
||||||
|
uint8_t opcode = *ptr++;
|
||||||
|
|
||||||
|
const char *inst = opcodes[opcode].inst;
|
||||||
|
Address mode = opcodes[opcode].address;
|
||||||
|
|
||||||
|
if (smart || dos8) {
|
||||||
|
mode = DB;
|
||||||
|
inst = "db";
|
||||||
|
}
|
||||||
|
if (dos16) {
|
||||||
|
mode = DW;
|
||||||
|
inst = "dw";
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t width = addressSizes[mode];
|
||||||
|
if (mode == IMMM && (flags & (IsEmu | IsM8))) {
|
||||||
|
width--;
|
||||||
|
}
|
||||||
|
if (mode == IMMX && (flags & (IsEmu | IsX8))) {
|
||||||
|
width--;
|
||||||
|
}
|
||||||
|
addr += width;
|
||||||
|
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
printf(" %02x", start[i]);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 4 - width; i++) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
printf(" %s", inst);
|
||||||
|
for (int i = strlen(inst); i < 8; i++) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *comments = NULL;
|
||||||
|
uint8_t oprlen = 0;
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
case IMP:
|
||||||
|
break;
|
||||||
|
case IMM:
|
||||||
|
printf("#$%02x", *ptr++);
|
||||||
|
oprlen = 4;
|
||||||
|
break;
|
||||||
|
case IMMM:
|
||||||
|
if (flags & (IsEmu | IsM8)) {
|
||||||
|
printf("#$%02x", *ptr++);
|
||||||
|
oprlen = 4;
|
||||||
|
} else {
|
||||||
|
printf("#$%04x", r16(ptr)); ptr += 2;
|
||||||
|
oprlen = 6;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IMMX:
|
||||||
|
if (flags & (IsEmu | IsX8)) {
|
||||||
|
x = *ptr++;
|
||||||
|
printf("#$%02x", x);
|
||||||
|
oprlen = 4;
|
||||||
|
} else {
|
||||||
|
x = r16(ptr); ptr += 2;
|
||||||
|
printf("#$%04x", x);
|
||||||
|
oprlen = 6;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IMMS:
|
||||||
|
printf("#$%04x", r16(ptr)); ptr += 2;
|
||||||
|
oprlen = 6;
|
||||||
|
break;
|
||||||
|
case ABS:
|
||||||
|
val = r16(ptr); ptr += 2;
|
||||||
|
printf("$%04x", val);
|
||||||
|
oprlen = 5;
|
||||||
|
comments = addressLookup(val);
|
||||||
|
break;
|
||||||
|
case ABL:
|
||||||
|
val = r24(ptr); ptr += 3;
|
||||||
|
printf("$%02x/%04x", val >> 16, val & 0xffff);
|
||||||
|
oprlen = 8;
|
||||||
|
comments = addressLookup(val);
|
||||||
|
break;
|
||||||
|
case ABX:
|
||||||
|
printf("$%04x, x", r16(ptr)); ptr += 2;
|
||||||
|
oprlen = 8;
|
||||||
|
break;
|
||||||
|
case ABY:
|
||||||
|
printf("$%04x, y", r16(ptr)); ptr += 2;
|
||||||
|
oprlen = 8;
|
||||||
|
break;
|
||||||
|
case ABLX:
|
||||||
|
val = r24(ptr); ptr += 3;
|
||||||
|
printf("$%02x/%04x, x", val >> 16, val & 0xffff);
|
||||||
|
oprlen = 11;
|
||||||
|
break;
|
||||||
|
case AIX:
|
||||||
|
printf("($%04x, x)", r16(ptr)); ptr += 2;
|
||||||
|
oprlen = 10;
|
||||||
|
break;
|
||||||
|
case ZP:
|
||||||
|
printf("$%02x", *ptr++);
|
||||||
|
oprlen = 3;
|
||||||
|
break;
|
||||||
|
case ZPX:
|
||||||
|
printf("$%02x, x", *ptr++);
|
||||||
|
oprlen = 6;
|
||||||
|
break;
|
||||||
|
case ZPY:
|
||||||
|
printf("$%02x, y", *ptr++);
|
||||||
|
oprlen = 6;
|
||||||
|
break;
|
||||||
|
case ZPS:
|
||||||
|
printf("$%02x, s", *ptr++);
|
||||||
|
oprlen = 6;
|
||||||
|
break;
|
||||||
|
case IND:
|
||||||
|
printf("($%04x)", r16(ptr)); ptr += 2;
|
||||||
|
oprlen = 7;
|
||||||
|
break;
|
||||||
|
case INZ:
|
||||||
|
printf("($%02x)", *ptr++);
|
||||||
|
oprlen = 5;
|
||||||
|
break;
|
||||||
|
case INL:
|
||||||
|
printf("[$%02x]", *ptr++);
|
||||||
|
oprlen = 5;
|
||||||
|
break;
|
||||||
|
case INX:
|
||||||
|
printf("($%02x, x)", *ptr++);
|
||||||
|
oprlen = 8;
|
||||||
|
break;
|
||||||
|
case INY:
|
||||||
|
printf("($%02x), y", *ptr++);
|
||||||
|
oprlen = 8;
|
||||||
|
break;
|
||||||
|
case INLY:
|
||||||
|
printf("[$%02x], y", *ptr++);
|
||||||
|
oprlen = 8;
|
||||||
|
break;
|
||||||
|
case INS:
|
||||||
|
printf("($%02x, s), y", *ptr++);
|
||||||
|
oprlen = 11;
|
||||||
|
break;
|
||||||
|
case REL:
|
||||||
|
delta = *ptr++;
|
||||||
|
d6 = delta + addr;
|
||||||
|
printf("$%02x/%04x", d6 >> 16, d6 & 0xffff);
|
||||||
|
oprlen = 8;
|
||||||
|
break;
|
||||||
|
case RELL:
|
||||||
|
delta16 = r16(ptr); ptr += 2;
|
||||||
|
d6 = delta16 + addr;
|
||||||
|
printf("$%02x/%04x", d6 >> 16, d6 & 0xffff);
|
||||||
|
oprlen = 8;
|
||||||
|
break;
|
||||||
|
case BANK:
|
||||||
|
val = *ptr++;
|
||||||
|
printf("$%02x, $%02x", *ptr++, val);
|
||||||
|
oprlen = 8;
|
||||||
|
break;
|
||||||
|
case DB:
|
||||||
|
printf("$%02x", opcode);
|
||||||
|
oprlen = 3;
|
||||||
|
break;
|
||||||
|
case DW:
|
||||||
|
val = opcode | (*ptr++ << 8);
|
||||||
|
printf("$%04x", val);
|
||||||
|
oprlen = 5;
|
||||||
|
break;
|
||||||
|
case DD:
|
||||||
|
printf("$%08x", opcode | r24(ptr) << 8); ptr += 3;
|
||||||
|
oprlen = 9;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (smart) {
|
||||||
|
comments = smartportLookup(opcode);
|
||||||
|
smart = false;
|
||||||
|
}
|
||||||
|
if (dos8) {
|
||||||
|
comments = prodos8Lookup(opcode);
|
||||||
|
dos8 = false;
|
||||||
|
}
|
||||||
|
if (dos16) {
|
||||||
|
comments = prodos16Lookup(val);
|
||||||
|
dos16 = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opcode == 0xa2) { // ldx
|
||||||
|
if (*ptr == 0x22) { // jsl
|
||||||
|
if (r24(ptr + 1) == 0xe10000) { // jsl el/0000
|
||||||
|
comments = toolLookup(x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opcode == 0x20) { // jsr
|
||||||
|
if (val == 0xc50d || val == 0xc70d) {
|
||||||
|
smart = true;
|
||||||
|
}
|
||||||
|
if (val == 0xbf00) {
|
||||||
|
dos8 = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opcode == 0x22) { // jsl
|
||||||
|
if (val == 0xe100a8) {
|
||||||
|
dos16 = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (comments != NULL) {
|
||||||
|
for (int i = oprlen; i < 16; i++) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
printf("; %s", comments);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t nextFlags = map->mem[addr - map->minMemory];
|
||||||
|
if (((flags ^ nextFlags) & (IsEmu | IsM8 | IsX8)) && comments == NULL &&
|
||||||
|
(nextFlags & IsOpcode)) {
|
||||||
|
for (int i = oprlen; i < 16; i++) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
printf(";");
|
||||||
|
if ((flags ^ nextFlags) & IsEmu) {
|
||||||
|
if (nextFlags & IsEmu) {
|
||||||
|
printf(" 8-bit mode");
|
||||||
|
} else {
|
||||||
|
printf(" 16-bit mode");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((flags ^ nextFlags) & IsM8) {
|
||||||
|
if (nextFlags & IsM8) {
|
||||||
|
printf(" a.b");
|
||||||
|
} else {
|
||||||
|
printf(" a.w");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((flags ^ nextFlags) & IsX8) {
|
||||||
|
if (nextFlags & IsX8) {
|
||||||
|
printf(" x.b");
|
||||||
|
} else {
|
||||||
|
printf(" x.w");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
} else {
|
||||||
|
uint32_t dlen = 0;
|
||||||
|
uint8_t *p = ptr;
|
||||||
|
while (p < end && !(map->mem[addr + dlen - map->minMemory] & IsOpcode)) {
|
||||||
|
p++;
|
||||||
|
dlen++;
|
||||||
|
}
|
||||||
|
uint32_t val;
|
||||||
|
switch (dlen) {
|
||||||
|
case 4:
|
||||||
|
printf("%02x/%04x:", addr >> 16, addr & 0xffff);
|
||||||
|
val = r32(ptr);
|
||||||
|
printf(" %02x %02x %02x %02x dd $%08x\n", val & 0xff,
|
||||||
|
(val >> 8) & 0xff, (val >> 16) & 0xff, val >> 24, val);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
printf("%02x/%04x:", addr >> 16, addr & 0xffff);
|
||||||
|
val = r16(ptr);
|
||||||
|
printf(" %02x %02x dw $%04x\n", val & 0xff, val >> 8, val);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
printf("%02x/%04x:", addr >> 16, addr & 0xffff);
|
||||||
|
printf(" %02x db $%04x\n", *ptr, *ptr);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dumphex(ptr, addr, dlen);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ptr += dlen;
|
||||||
|
addr += dlen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
10
disasm.h
Normal file
10
disasm.h
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* The main disassembler.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "map.h"
|
||||||
|
|
||||||
|
extern void disassemble(uint8_t *data, size_t len, Map *map);
|
41
handle.h
Normal file
41
handle.h
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* Routines for reading multi-byte numbers from a stream
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
static inline uint32_t fourcc(const char *p) {
|
||||||
|
return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint16_t r16(uint8_t *p) {
|
||||||
|
uint16_t r = *p++;
|
||||||
|
r |= *p << 8;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t r24(uint8_t *p) {
|
||||||
|
uint32_t r = *p++;
|
||||||
|
r |= *p++ << 8;
|
||||||
|
r |= *p << 16;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t r32(uint8_t *p) {
|
||||||
|
uint32_t r = *p++;
|
||||||
|
r |= *p++ << 8;
|
||||||
|
r |= *p++ << 16;
|
||||||
|
r |= *p << 24;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t r4(uint8_t *p) {
|
||||||
|
uint32_t r = *p++ << 24;
|
||||||
|
r |= *p++ << 16;
|
||||||
|
r |= *p++ << 8;
|
||||||
|
r |= *p;
|
||||||
|
return r;
|
||||||
|
}
|
142
map.c
Normal file
142
map.c
Normal file
|
@ -0,0 +1,142 @@
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* Handles the memory map, for the tracing disassembler.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include "map.h"
|
||||||
|
#include "parser.h"
|
||||||
|
#include "handle.h"
|
||||||
|
|
||||||
|
static Rule *parseRule(ConfigFile *f) {
|
||||||
|
Rule *rule = malloc(sizeof(Rule));
|
||||||
|
rule->next = NULL;
|
||||||
|
if (!token(f, '$')) {
|
||||||
|
fail(f, "Address must be a hex value above 0 \n"
|
||||||
|
"starting with '$', i.e. $c20");
|
||||||
|
}
|
||||||
|
rule->address = hex(f);
|
||||||
|
if (token(f, '/')) {
|
||||||
|
rule->address <<= 16;
|
||||||
|
rule->address |= hex(f);
|
||||||
|
}
|
||||||
|
if (rule->address == 0) {
|
||||||
|
fail(f, "Address must be a hex value above 0 \n"
|
||||||
|
"starting with '$', i.e. $c20");
|
||||||
|
}
|
||||||
|
if (!token(f, ':')) {
|
||||||
|
fail(f, "Expected ':'");
|
||||||
|
}
|
||||||
|
rule->flags = IsOpcode;
|
||||||
|
bool foundFlag = false;
|
||||||
|
do {
|
||||||
|
foundFlag = false;
|
||||||
|
if (token(f, 'e')) {
|
||||||
|
rule->flags |= IsEmu;
|
||||||
|
foundFlag = true;
|
||||||
|
}
|
||||||
|
if (token(f, 'm')) {
|
||||||
|
rule->flags |= IsM8;
|
||||||
|
foundFlag = true;
|
||||||
|
}
|
||||||
|
if (token(f, 'x')) {
|
||||||
|
rule->flags |= IsX8;
|
||||||
|
foundFlag = true;
|
||||||
|
}
|
||||||
|
} while (foundFlag);
|
||||||
|
return rule;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map *loadMap(const char *filename, uint32_t org, MapFlags flags) {
|
||||||
|
Map *map = malloc(sizeof(Map));
|
||||||
|
map->rules = NULL;
|
||||||
|
map->minMemory = org;
|
||||||
|
map->maxMemory = 0;
|
||||||
|
map->mem = NULL;
|
||||||
|
|
||||||
|
FILE *f = fopen(filename, "rb");
|
||||||
|
if (!f) {
|
||||||
|
fprintf(stderr, "Failed to open '%s'\n", filename);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
size_t len = ftell(f);
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
uint8_t *data = malloc(len);
|
||||||
|
fread(data, len, 1, f);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
if (r4(data) != fourcc("gMAP")) {
|
||||||
|
// not a map file, use org as the only entry point
|
||||||
|
map->rules = malloc(sizeof(Rule));
|
||||||
|
map->rules->address = org;
|
||||||
|
map->rules->flags = flags;
|
||||||
|
map->rules->next = NULL;
|
||||||
|
map->filename = filename;
|
||||||
|
free(data);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
ConfigFile c;
|
||||||
|
c.start = data;
|
||||||
|
c.p = c.start;
|
||||||
|
c.end = c.start + len;
|
||||||
|
c.filename = filename;
|
||||||
|
|
||||||
|
// set filename
|
||||||
|
c.p += 4;
|
||||||
|
eatSpaces(&c);
|
||||||
|
if (!token(&c, '"')) {
|
||||||
|
fail(&c, "Expected '\"' around the filename.");
|
||||||
|
}
|
||||||
|
uint8_t *fnp = c.p;
|
||||||
|
while (fnp < c.end && *fnp != '"') {
|
||||||
|
fnp++;
|
||||||
|
}
|
||||||
|
if (fnp == c.end) {
|
||||||
|
fail(&c, "Filename has no closing '\"'.");
|
||||||
|
}
|
||||||
|
int flen = fnp - c.p;
|
||||||
|
char *fname = malloc(flen);
|
||||||
|
memcpy(fname, c.p, flen);
|
||||||
|
fname[flen] = 0;
|
||||||
|
map->filename = fname;
|
||||||
|
c.p = fnp + 1;
|
||||||
|
|
||||||
|
eatSpaces(&c);
|
||||||
|
if (r4(c.p) != fourcc("sORG")) {
|
||||||
|
fail(&c, "Expected 'sORG' tag");
|
||||||
|
}
|
||||||
|
c.p += 4;
|
||||||
|
eatSpaces(&c);
|
||||||
|
if (!token(&c, '$')) {
|
||||||
|
fail(&c, "ORG must be a hex value above 0\n"
|
||||||
|
"starting with '$', i.e. $c20");
|
||||||
|
}
|
||||||
|
map->minMemory = hex(&c);
|
||||||
|
if (map->minMemory == 0) {
|
||||||
|
fail(&c, "ORG must be a hex value above 0\n"
|
||||||
|
"starting with '$', i.e. $c20");
|
||||||
|
}
|
||||||
|
eatSpaces(&c);
|
||||||
|
|
||||||
|
// load rules
|
||||||
|
Rule *lastRule = NULL;
|
||||||
|
while (c.p < c.end) {
|
||||||
|
Rule *rule = parseRule(&c);
|
||||||
|
if (lastRule == NULL) {
|
||||||
|
map->rules = rule;
|
||||||
|
} else {
|
||||||
|
lastRule->next = rule;
|
||||||
|
}
|
||||||
|
lastRule = rule;
|
||||||
|
eatSpaces(&c);
|
||||||
|
}
|
||||||
|
free(c.start);
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
33
map.h
Normal file
33
map.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* The memory map for the tracing disassembler
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
IsData = 0x01,
|
||||||
|
IsOpcode = 0x02,
|
||||||
|
IsOperand = 0x04,
|
||||||
|
IsX8 = 0x10,
|
||||||
|
IsM8 = 0x20,
|
||||||
|
IsEmu = 0x100
|
||||||
|
} MapFlags;
|
||||||
|
|
||||||
|
typedef struct Rule {
|
||||||
|
uint32_t address;
|
||||||
|
uint16_t flags;
|
||||||
|
struct Rule *next;
|
||||||
|
} Rule;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Rule *rules;
|
||||||
|
uint32_t minMemory;
|
||||||
|
uint32_t maxMemory;
|
||||||
|
MapFlags *mem;
|
||||||
|
const char *filename;
|
||||||
|
} Map;
|
||||||
|
|
||||||
|
extern Map *loadMap(const char *filename, uint32_t org, MapFlags flags);
|
568
omf.c
Normal file
568
omf.c
Normal file
|
@ -0,0 +1,568 @@
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* Handles parsing and relocating an OMF (s16, tool, etc)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "handle.h"
|
||||||
|
#include "parser.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <argp.h>
|
||||||
|
|
||||||
|
const char *argp_program_version = "omf 0.5";
|
||||||
|
const char *argp_program_bug_address = "sean@seancode.com";
|
||||||
|
static char doc[] = "Relocate and extract OMF segments"
|
||||||
|
"\vThis should be run twice. The first time to generate the map."
|
||||||
|
"The second time, to use that map to relocate and extract the segments";
|
||||||
|
static char args_doc[] = "FILE";
|
||||||
|
static struct argp_option options[] = {
|
||||||
|
{"org", 'o', "ADDRESS", OPTION_ARG_OPTIONAL,
|
||||||
|
"Start mapping the segments at this address, default 20000"},
|
||||||
|
{"map", 'm', "FILE", OPTION_ARG_OPTIONAL,
|
||||||
|
"Use this map to extract the segments"},
|
||||||
|
{"prefix", 'p', "PREFIX", OPTION_ARG_OPTIONAL,
|
||||||
|
"Prefix segment files with this. Default \"seg\""},
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct arguments {
|
||||||
|
char *filename;
|
||||||
|
char *map;
|
||||||
|
char *prefix;
|
||||||
|
uint32_t org;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline uint32_t parseNum(const char *s) {
|
||||||
|
uint32_t res = 0;
|
||||||
|
while (isspace(*s)) {
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
while (isxdigit(*s)) {
|
||||||
|
res <<= 4;
|
||||||
|
if (*s >= '0' && *s <= '9') {
|
||||||
|
res |= *s - '0';
|
||||||
|
} else if (*s >= 'a' && *s <= 'f') {
|
||||||
|
res |= *s - 'a' + 10;
|
||||||
|
} else if (*s >= 'A' && *s <= 'F') {
|
||||||
|
res |= *s - 'A' + 10;
|
||||||
|
}
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
||||||
|
struct arguments *arguments = state->input;
|
||||||
|
switch (key) {
|
||||||
|
case 'm':
|
||||||
|
arguments->map = arg;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
arguments->prefix = arg;
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
if (arg) {
|
||||||
|
arguments->org = parseNum(arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ARGP_KEY_ARG:
|
||||||
|
if (state->arg_num >= 1) {
|
||||||
|
argp_usage(state);
|
||||||
|
}
|
||||||
|
arguments->filename = arg;
|
||||||
|
break;
|
||||||
|
case ARGP_KEY_END:
|
||||||
|
if (state->arg_num < 1) {
|
||||||
|
argp_usage(state);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ARGP_ERR_UNKNOWN;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct argp argp = { options, parse_opt, args_doc, doc };
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct Segment {
|
||||||
|
uint32_t bytecnt;
|
||||||
|
uint32_t resspc;
|
||||||
|
uint32_t length;
|
||||||
|
uint8_t lablen;
|
||||||
|
uint8_t numlen;
|
||||||
|
uint32_t banksize;
|
||||||
|
uint16_t kind;
|
||||||
|
uint32_t org;
|
||||||
|
uint32_t align;
|
||||||
|
uint16_t segnum;
|
||||||
|
uint32_t entry;
|
||||||
|
char name[256];
|
||||||
|
uint8_t *offset;
|
||||||
|
uint8_t *data;
|
||||||
|
uint32_t mapped;
|
||||||
|
struct Segment *next;
|
||||||
|
} Segment;
|
||||||
|
|
||||||
|
static Segment *loadOMF(uint8_t *data, size_t len);
|
||||||
|
static void mapSegments(Segment *segments, uint32_t min);
|
||||||
|
static void relocSegments(Segment *segments, char *prefix);
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
struct arguments arguments;
|
||||||
|
arguments.filename = "";
|
||||||
|
arguments.map = NULL;
|
||||||
|
arguments.prefix = "seg";
|
||||||
|
arguments.org = 0x20000;
|
||||||
|
argp_parse(&argp, argc, argv, 0, 0, &arguments);
|
||||||
|
|
||||||
|
// open omf
|
||||||
|
FILE *f = fopen(arguments.filename, "rb");
|
||||||
|
if (!f) {
|
||||||
|
fprintf(stderr, "Failed to open '%s'\n", arguments.filename);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
size_t len = ftell(f);
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
uint8_t *data = malloc(len);
|
||||||
|
fread(data, len, 1, f);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
Segment *segments = loadOMF(data, len);
|
||||||
|
if (arguments.map != NULL) {
|
||||||
|
// load the map!
|
||||||
|
f = fopen(arguments.map, "rb");
|
||||||
|
if (!f) {
|
||||||
|
fprintf(stderr, "Failed to open '%s'\n", arguments.map);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ConfigFile c;
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
len = ftell(f);
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
c.start = malloc(len);
|
||||||
|
fread(c.start, len, 1, f);
|
||||||
|
fclose(f);
|
||||||
|
c.p = c.start;
|
||||||
|
c.end = c.start + len;
|
||||||
|
|
||||||
|
while (c.p < c.end) {
|
||||||
|
uint32_t segnum = hex(&c);
|
||||||
|
if (!token(&c, ':')) {
|
||||||
|
fprintf(stderr, "Error: expected ':' in map.\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
uint32_t mapped = hex(&c);
|
||||||
|
|
||||||
|
for (Segment *seg = segments; seg != NULL; seg = seg->next) {
|
||||||
|
if (seg->segnum == segnum) {
|
||||||
|
seg->mapped = mapped;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
eatSpaces(&c);
|
||||||
|
}
|
||||||
|
free(c.start);
|
||||||
|
}
|
||||||
|
|
||||||
|
// map any unmapped segments
|
||||||
|
mapSegments(segments, arguments.org);
|
||||||
|
|
||||||
|
if (arguments.map != NULL) {
|
||||||
|
relocSegments(segments, arguments.prefix);
|
||||||
|
} else {
|
||||||
|
int mlen = strlen(arguments.filename);
|
||||||
|
char *mapname = malloc(mlen + 5);
|
||||||
|
memcpy(mapname, arguments.filename, mlen);
|
||||||
|
memcpy(mapname + mlen, ".map\0", 5);
|
||||||
|
f = fopen(mapname, "wb");
|
||||||
|
if (!f) {
|
||||||
|
fprintf(stderr, "Failed to create '%s'\n", mapname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (Segment *seg = segments; seg != NULL; seg = seg->next) {
|
||||||
|
fprintf(f, "%x:%x\n", seg->segnum, seg->mapped);
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
fprintf(stdout, "Created '%s'. Edit it, and extract with: \n"
|
||||||
|
" %s --map=%s %s\n", mapname, argv[0], mapname, arguments.filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Segment *loadOMF(uint8_t *data, size_t len) {
|
||||||
|
Segment *last = NULL;
|
||||||
|
Segment *segments = NULL;
|
||||||
|
|
||||||
|
size_t ofs = 0;
|
||||||
|
while (ofs < len) {
|
||||||
|
Segment *seg = malloc(sizeof(Segment));
|
||||||
|
seg->next = NULL;
|
||||||
|
|
||||||
|
uint8_t *p = data + ofs;
|
||||||
|
seg->bytecnt = r32(p); p += 4;
|
||||||
|
seg->resspc = r32(p); p += 4;
|
||||||
|
seg->length = r32(p); p += 4;
|
||||||
|
uint8_t kind = *p++;
|
||||||
|
seg->lablen = *p++;
|
||||||
|
seg->numlen = *p++;
|
||||||
|
uint8_t version = *p++;
|
||||||
|
seg->banksize = r32(p); p += 4;
|
||||||
|
seg->kind = r16(p); p += 2;
|
||||||
|
p += 2; // undefined
|
||||||
|
seg->org = r32(p); p += 4;
|
||||||
|
seg->align = r32(p); p += 4;
|
||||||
|
p += 2; // byte order
|
||||||
|
seg->segnum = r16(p); p += 2;
|
||||||
|
seg->entry = r32(p); p += 4;
|
||||||
|
uint16_t dispname = r16(p); p += 2;
|
||||||
|
uint16_t dispdata = r16(p); p += 2;
|
||||||
|
p = data + ofs + dispname + 0xa;
|
||||||
|
uint8_t strlen = seg->lablen;
|
||||||
|
if (strlen == 0) {
|
||||||
|
strlen = *p++;
|
||||||
|
}
|
||||||
|
memcpy(seg->name, p, strlen);
|
||||||
|
seg->name[strlen] = 0;
|
||||||
|
seg->offset = data + ofs + dispdata;
|
||||||
|
if (version == 1) { // convert to v2
|
||||||
|
seg->bytecnt *= 512;
|
||||||
|
seg->kind = (kind & 0x1f) | ((kind & 0xe0) << 8);
|
||||||
|
}
|
||||||
|
seg->mapped = 0;
|
||||||
|
seg->data = NULL;
|
||||||
|
|
||||||
|
ofs += seg->bytecnt;
|
||||||
|
if (last == NULL) {
|
||||||
|
segments = seg;
|
||||||
|
} else {
|
||||||
|
last->next = seg;
|
||||||
|
}
|
||||||
|
last = seg;
|
||||||
|
}
|
||||||
|
return segments;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cmpmemory(const void *p1, const void *p2) {
|
||||||
|
const uint32_t *a = p1, *b = p2;
|
||||||
|
return *a - *b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mapSegments(Segment *segments, uint32_t min) {
|
||||||
|
// we use a memory map that denotes runes of available memory.
|
||||||
|
// Each segment has a start and end, so we need an array of twice the
|
||||||
|
// number of segments (+2 for the absolute start and end of memory)
|
||||||
|
|
||||||
|
// count segments
|
||||||
|
uint32_t numSegs = 0;
|
||||||
|
for (Segment *seg = segments; seg != NULL; seg = seg->next) {
|
||||||
|
numSegs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t *memory = malloc(sizeof(uint32_t) * (numSegs * 2 + 2));
|
||||||
|
int numNodes = 0;
|
||||||
|
memory[numNodes++] = min; // minimum
|
||||||
|
memory[numNodes++] = 0x1000000; // maximum possible memory for the IIgs.
|
||||||
|
|
||||||
|
// step one, map hardcoded or overridden targets
|
||||||
|
for (Segment *seg = segments; seg != NULL; seg = seg->next) {
|
||||||
|
if (seg->org != 0 || seg->mapped != 0) {
|
||||||
|
if (seg->mapped == 0) {
|
||||||
|
if ((seg->kind & 0x1f) == 0x11) { // absolute bank
|
||||||
|
seg->mapped = seg->org << 16;
|
||||||
|
} else {
|
||||||
|
seg->mapped = seg->org;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool collision = false;
|
||||||
|
// verify we aren't overlapping.. that would be tremendously bad.
|
||||||
|
for (int node = 0; node < numNodes; node += 2) {
|
||||||
|
if (seg->mapped < memory[node] &&
|
||||||
|
seg->mapped + seg->length > memory[node]) { // crosses!
|
||||||
|
collision = true;
|
||||||
|
}
|
||||||
|
if (seg->mapped < memory[node + 1] &&
|
||||||
|
seg->mapped + seg->length > memory[node + 1]) { // crosses!
|
||||||
|
collision = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (collision) {
|
||||||
|
fprintf(stderr, "Segment #$%x collides with another segment!\n",
|
||||||
|
seg->segnum);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
memory[numNodes++] = seg->mapped;
|
||||||
|
memory[numNodes++] = seg->mapped + seg->length;
|
||||||
|
if (seg->mapped < memory[0]) { // below the minimum!
|
||||||
|
memory[0] = seg->mapped; // recalibrate the minimum
|
||||||
|
}
|
||||||
|
// resort memory map
|
||||||
|
qsort(memory, numNodes, sizeof(uint32_t), cmpmemory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// finally, map everything else by first fit.
|
||||||
|
for (Segment *seg = segments; seg != NULL; seg = seg->next) {
|
||||||
|
if (seg->mapped == 0) {
|
||||||
|
for (int node = 0; node < numNodes; node += 2) {
|
||||||
|
uint32_t base = memory[node];
|
||||||
|
if (seg->align && (base & (seg->align - 1))) { // snap to alignment
|
||||||
|
base += seg->align;
|
||||||
|
base &= ~(seg->align - 1);
|
||||||
|
}
|
||||||
|
if (seg->banksize &&(((base & (seg->banksize - 1)) + seg->length) &
|
||||||
|
~(seg->banksize - 1))) { // crosses bank
|
||||||
|
base += seg->banksize;
|
||||||
|
base &= ~(seg->banksize - 1);
|
||||||
|
}
|
||||||
|
// does it fit?
|
||||||
|
if (base < memory[node + 1] && memory[node + 1] - base >= seg->length) {
|
||||||
|
seg->mapped = base;
|
||||||
|
memory[numNodes++] = seg->mapped;
|
||||||
|
memory[numNodes++] = seg->mapped + seg->length;
|
||||||
|
qsort(memory, numNodes, sizeof(uint32_t), cmpmemory);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (seg->mapped == 0) {
|
||||||
|
fprintf(stderr, "Failed to map Segment #$%x, not enough free memory\n",
|
||||||
|
seg->segnum);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(memory);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DONE = 0x00,
|
||||||
|
RELOC = 0xe2,
|
||||||
|
INTERSEG = 0xe3,
|
||||||
|
DS = 0xf1,
|
||||||
|
LCONST = 0xf2,
|
||||||
|
cRELOC = 0xf5,
|
||||||
|
cINTERSEG = 0xf6,
|
||||||
|
SUPER = 0xf7
|
||||||
|
} SegOp;
|
||||||
|
|
||||||
|
static void patch(uint8_t *data, uint8_t numBytes, uint32_t value) {
|
||||||
|
for (int i = 0; i < numBytes; i++, value >>= 8) {
|
||||||
|
data[i] = value & 0xff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hexout(char *p, uint32_t val, int len) {
|
||||||
|
p += len;
|
||||||
|
while (len-- > 0) {
|
||||||
|
char ch = val & 0xf;
|
||||||
|
val >>= 4;
|
||||||
|
if (ch < 10) {
|
||||||
|
*--p = '0' + ch;
|
||||||
|
} else {
|
||||||
|
*--p = 'a' + (ch - 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void relocSegments(Segment *segments, char *prefix) {
|
||||||
|
int prefixLen = strlen(prefix);
|
||||||
|
char *filename = malloc(prefixLen + 4);
|
||||||
|
char *mapname = malloc(prefixLen + 9);
|
||||||
|
|
||||||
|
for (Segment *seg = segments; seg != NULL; seg = seg->next) {
|
||||||
|
bool done = false;
|
||||||
|
uint32_t pc = seg->mapped;
|
||||||
|
uint8_t *p = seg->offset;
|
||||||
|
seg->data = calloc(seg->length, 1);
|
||||||
|
|
||||||
|
while (!done) {
|
||||||
|
uint8_t opcode = *p++;
|
||||||
|
switch (opcode) {
|
||||||
|
case DONE:
|
||||||
|
done = true;
|
||||||
|
break;
|
||||||
|
case RELOC:
|
||||||
|
{
|
||||||
|
uint8_t numBytes = *p++;
|
||||||
|
int8_t bitShift = *p++;
|
||||||
|
uint32_t offset = r32(p); p += 4;
|
||||||
|
uint32_t subOffset = r32(p) + seg->mapped; p += 4;
|
||||||
|
|
||||||
|
if (bitShift < 0) {
|
||||||
|
subOffset >>= -bitShift;
|
||||||
|
} else {
|
||||||
|
subOffset <<= bitShift;
|
||||||
|
}
|
||||||
|
patch(seg->data + offset, numBytes, subOffset);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case INTERSEG:
|
||||||
|
{
|
||||||
|
uint8_t numBytes = *p++;
|
||||||
|
int8_t bitShift = *p++;
|
||||||
|
uint32_t offset = r32(p); p += 4;
|
||||||
|
p += 2; // filenum
|
||||||
|
uint16_t segnum = r16(p); p += 2;
|
||||||
|
uint32_t subOffset = r32(p); p += 4;
|
||||||
|
for (Segment *sub = segments; sub != NULL; sub = sub->next) {
|
||||||
|
if (sub->segnum == segnum) {
|
||||||
|
subOffset += sub->mapped;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bitShift < 0) {
|
||||||
|
subOffset >>= -bitShift;
|
||||||
|
} else {
|
||||||
|
subOffset <<= bitShift;
|
||||||
|
}
|
||||||
|
patch(seg->data + offset, numBytes, subOffset);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DS:
|
||||||
|
pc += r32(p); p += 4; // filled with zeros
|
||||||
|
break;
|
||||||
|
case LCONST:
|
||||||
|
{
|
||||||
|
uint32_t count = r32(p); p += 4;
|
||||||
|
memcpy(seg->data + pc - seg->mapped, p, count); p += count;
|
||||||
|
pc += count;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case cRELOC:
|
||||||
|
{
|
||||||
|
uint8_t numBytes = *p++;
|
||||||
|
int8_t bitShift = *p++;
|
||||||
|
uint16_t offset = r16(p); p += 2;
|
||||||
|
uint32_t subOffset = r16(p) + seg->mapped; p += 2;
|
||||||
|
if (bitShift < 0) {
|
||||||
|
subOffset >>= -bitShift;
|
||||||
|
} else {
|
||||||
|
subOffset <<= bitShift;
|
||||||
|
}
|
||||||
|
patch(seg->data + offset, numBytes, subOffset);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case cINTERSEG:
|
||||||
|
{
|
||||||
|
uint8_t numBytes = *p++;
|
||||||
|
int8_t bitShift = *p++;
|
||||||
|
uint16_t offset = r16(p); p += 2;
|
||||||
|
uint8_t segnum = *p++;
|
||||||
|
uint32_t subOffset = r16(p); p += 2;
|
||||||
|
for (Segment *sub = segments; sub != NULL; sub = sub->next) {
|
||||||
|
if (sub->segnum == segnum) {
|
||||||
|
subOffset += sub->mapped;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bitShift < 0) {
|
||||||
|
subOffset >>= -bitShift;
|
||||||
|
} else {
|
||||||
|
subOffset <<= bitShift;
|
||||||
|
}
|
||||||
|
patch(seg->data + offset, numBytes, subOffset);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SUPER:
|
||||||
|
{
|
||||||
|
uint32_t superLen = r32(p); p += 4;
|
||||||
|
uint8_t *superEnd = p + superLen;
|
||||||
|
uint8_t superType = *p++;
|
||||||
|
uint32_t superPage = 0;
|
||||||
|
while (p < superEnd) {
|
||||||
|
uint8_t numOfs = *p++;
|
||||||
|
if (numOfs & 0x80) {
|
||||||
|
superPage += 256 * (numOfs & 0x7f);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (int o = 0; o <= numOfs; o++) {
|
||||||
|
uint32_t offset = superPage | *p++;
|
||||||
|
uint8_t numBytes = 0;
|
||||||
|
uint32_t subOffset = r16(seg->data + offset);
|
||||||
|
if (superType == 0 || superType == 1) { // RELOC2 | RELOC3
|
||||||
|
subOffset += seg->mapped;
|
||||||
|
numBytes = 2 + superType;
|
||||||
|
} else if (superType < 14) { // INTERSEG1--12
|
||||||
|
uint8_t segnum = seg->data[offset + 2];
|
||||||
|
for (Segment *sub = segments; sub != NULL; sub = sub->next) {
|
||||||
|
if (sub->segnum == segnum) {
|
||||||
|
subOffset += sub->mapped;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
numBytes = 3;
|
||||||
|
} else if (superType < 26) { // INTERSEG13--24
|
||||||
|
uint8_t segnum = superType - 13;
|
||||||
|
for (Segment *sub = segments; sub != NULL; sub = sub->next) {
|
||||||
|
if (sub->segnum == segnum) {
|
||||||
|
subOffset += sub->mapped;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
numBytes = 2;
|
||||||
|
} else { // INTERSEG25--36
|
||||||
|
uint8_t segnum = superType - 25;
|
||||||
|
for (Segment *sub = segments; sub != NULL; sub = sub->next) {
|
||||||
|
if (sub->segnum == segnum) {
|
||||||
|
subOffset += sub->mapped;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
subOffset >>= 16;
|
||||||
|
numBytes = 2;
|
||||||
|
}
|
||||||
|
patch(seg->data + offset, numBytes, subOffset);
|
||||||
|
}
|
||||||
|
superPage += 256;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (opcode < 0xe0) {
|
||||||
|
memcpy(seg->data + pc - seg->mapped, p, opcode); p += opcode;
|
||||||
|
pc += opcode;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Unknown segment code: %x\n", opcode);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(filename, prefix, prefixLen);
|
||||||
|
int numLen = 3;
|
||||||
|
if (seg->segnum < 0x10) {
|
||||||
|
numLen = 1;
|
||||||
|
} else if (seg->segnum < 0x100) {
|
||||||
|
numLen = 2;
|
||||||
|
}
|
||||||
|
hexout(filename + prefixLen, seg->segnum, numLen);
|
||||||
|
filename[prefixLen + numLen] = 0;
|
||||||
|
memcpy(mapname, filename, prefixLen + numLen);
|
||||||
|
memcpy(mapname + prefixLen + numLen, ".map\0", 5);
|
||||||
|
|
||||||
|
FILE *f = fopen(filename, "wb");
|
||||||
|
if (!f) {
|
||||||
|
fprintf(stderr, "Failed to create '%s'\n", filename);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
fwrite(seg->data, 1, seg->length, f);
|
||||||
|
fclose(f);
|
||||||
|
f = fopen(mapname, "wb");
|
||||||
|
if (!f) {
|
||||||
|
fprintf(stderr, "Failed to create '%s'\n", mapname);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
fprintf(f, "gMAP \"%s\"\n", filename);
|
||||||
|
fprintf(f, "sORG $%x\n", seg->mapped);
|
||||||
|
if ((seg->kind & 0x1f) == 0) { // code
|
||||||
|
fprintf(f, "$%x:\n", seg->mapped + seg->entry);
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
fprintf(stdout, "Extracted Segment #$%x %s into %s\n", seg->segnum,
|
||||||
|
seg->name, filename);
|
||||||
|
fprintf(stdout, "Created map %s\n", mapname);
|
||||||
|
}
|
||||||
|
free(filename);
|
||||||
|
}
|
66
parser.c
Normal file
66
parser.c
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* Routines for parsing a simple config file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "parser.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
void fail(ConfigFile *f, char *format, ...) {
|
||||||
|
// calculate line and column
|
||||||
|
int line = 1;
|
||||||
|
int col = 1;
|
||||||
|
bool done = false;
|
||||||
|
while (f->p > f->start) {
|
||||||
|
if (*f->p == '\n') {
|
||||||
|
done = true;
|
||||||
|
line++;
|
||||||
|
}
|
||||||
|
if (!done) {
|
||||||
|
col++;
|
||||||
|
}
|
||||||
|
f->p--;
|
||||||
|
}
|
||||||
|
va_list args;
|
||||||
|
va_start(args, format);
|
||||||
|
fprintf(stderr, "%s[%d,%d] Error: ", f->filename, line, col);
|
||||||
|
vfprintf(stderr, format, args);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
va_end(args);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void eatSpaces(ConfigFile *f) {
|
||||||
|
while (f->p < f->end && isspace(*f->p)) {
|
||||||
|
f->p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool token(ConfigFile *f, char ch) {
|
||||||
|
eatSpaces(f);
|
||||||
|
if (f->p < f->end && *f->p == ch) { // found it, consume
|
||||||
|
f->p++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// not found, don't consume anything
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t hex(ConfigFile *f) {
|
||||||
|
eatSpaces(f);
|
||||||
|
uint32_t res = 0;
|
||||||
|
while (f->p < f->end && isxdigit(*f->p)) {
|
||||||
|
res <<= 4;
|
||||||
|
if (*f->p >= '0' && *f->p <= '9') {
|
||||||
|
res |= *f->p - '0';
|
||||||
|
} else if (*f->p >= 'a' && *f->p <= 'f') {
|
||||||
|
res |= *f->p - 'a' + 10;
|
||||||
|
} else if (*f->p >= 'A' && *f->p <= 'F') {
|
||||||
|
res |= *f->p - 'A' + 10;
|
||||||
|
}
|
||||||
|
f->p++;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
22
parser.h
Normal file
22
parser.h
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* Routines for parsing simple config files
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t *start;
|
||||||
|
uint8_t *p;
|
||||||
|
uint8_t *end;
|
||||||
|
const char *filename;
|
||||||
|
} ConfigFile;
|
||||||
|
|
||||||
|
extern void fail(ConfigFile *f, char *format, ...);
|
||||||
|
extern void eatSpaces(ConfigFile *f);
|
||||||
|
extern bool token(ConfigFile *f, char ch);
|
||||||
|
extern uint32_t hex(ConfigFile *f);
|
42
pascal/ace.p
Executable file
42
pascal/ace.p
Executable file
|
@ -0,0 +1,42 @@
|
||||||
|
{********************************************
|
||||||
|
; File: ACE.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT ACE;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
CONST
|
||||||
|
aceNoError = $0; {Error - }
|
||||||
|
aceIsActive = $1D01; {Error - }
|
||||||
|
aceBadDP = $1D02; {Error - }
|
||||||
|
aceNotActive = $1D03; {Error - }
|
||||||
|
aceNoSuchParam = $1D04; {Error - }
|
||||||
|
aceBadMethod = $1D05; {Error - }
|
||||||
|
aceBadSrc = $1D06; {Error - }
|
||||||
|
aceBadDest = $1D07; {Error - }
|
||||||
|
aceDataOverlap = $1D08; {Error - }
|
||||||
|
aceNotImplemented = $1DFF; {Error - }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
PROCEDURE ACEBootInit ; Tool $1D,$01;
|
||||||
|
PROCEDURE ACEStartUp ( dPageAddr:Integer) ; Tool $1D,$02;
|
||||||
|
PROCEDURE ACEShutDown ; Tool $1D,$03;
|
||||||
|
FUNCTION ACEVersion : Integer ; Tool $1D,$04;
|
||||||
|
PROCEDURE ACEReset ; Tool $1D,$05;
|
||||||
|
FUNCTION ACEStatus : Boolean ; Tool $1D,$06;
|
||||||
|
FUNCTION ACEInfo ( infoItemCode:Integer) : Longint ; Tool $1D,$07;
|
||||||
|
PROCEDURE ACECompBegin ; Tool $1D,$0B;
|
||||||
|
PROCEDURE ACECompress ( src:Handle; srcOffset:Longint; dest:Handle;
|
||||||
|
destOffset:Longint; nBlks:Integer; method:Integer) ; Tool $1D,$09;
|
||||||
|
PROCEDURE ACEExpand ( src:Handle; srcOffset:Longint; dest:Handle;
|
||||||
|
destOffset:Longint; nBlks:Integer; method:Integer) ; Tool $1D,$0A;
|
||||||
|
PROCEDURE ACEExpBegin ; Tool $1D,$0C;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
102
pascal/adb.p
Executable file
102
pascal/adb.p
Executable file
|
@ -0,0 +1,102 @@
|
||||||
|
{********************************************
|
||||||
|
; File: ADB.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT ADB;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
cmndIncomplete = $0910; {error - Command not completed. }
|
||||||
|
cantSync = $0911; {error - Can't synchronize }
|
||||||
|
adbBusy = $0982; {error - Busy (command pending) }
|
||||||
|
devNotAtAddr = $0983; {error - Device not present at address }
|
||||||
|
srqListFull = $0984; {error - List full }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
readModes = $000A; {ReadKeyMicroData - }
|
||||||
|
readConfig = $000B; {ReadKeyMicroData - }
|
||||||
|
readADBError = $000C; {ReadKeyMicroData - }
|
||||||
|
readVersionNum = $000D; {ReadKeyMicroData - }
|
||||||
|
readAvailCharSet = $000E; {ReadKeyMicroData - }
|
||||||
|
readAvailLayout = $000F; {ReadKeyMicroData - }
|
||||||
|
readMicroMem = $0009; {ReadKeyMicroMem - }
|
||||||
|
abort = $0001; {SendInfo - command }
|
||||||
|
resetKbd = $0002; {SendInfo - command }
|
||||||
|
flushKbd = $0003; {SendInfo - command }
|
||||||
|
setModes = $0004; {SendInfo - 2nd param is pointer to mode byte }
|
||||||
|
clearModes = $0005; {SendInfo - 2nd param is pointer to mode Byte }
|
||||||
|
setConfig = $0006; {SendInfo - 2nd param is pointer to SetConfigRec }
|
||||||
|
synch = $0007; {SendInfo - 2nd param is pointer to SynchRec }
|
||||||
|
writeMicroMem = $0008; {SendInfo - 2nd param is pointer to MicroControlMemRec }
|
||||||
|
resetSys = $0010; {SendInfo - command }
|
||||||
|
keyCode = $0011; {SendInfo - 2nd param is pointer to key code byte. }
|
||||||
|
resetADB = $0040; {SendInfo - command }
|
||||||
|
transmitADBBytes = $0047; {SendInfo - add number of bytes to this }
|
||||||
|
enableSRQ = $0050; {SendInfo - command - ADB address in low nibble }
|
||||||
|
flushADBDevBuf = $0060; {SendInfo - command - ADB address in low nibble }
|
||||||
|
disableSRQ = $0070; {SendInfo - command - ADB address in low nibble }
|
||||||
|
transmit2ADBBytes = $0080; {SendInfo - add ADB address to this }
|
||||||
|
listen = $0080; {SendInfo - adbCommand = listen + ( 16 * reg) + (adb address) }
|
||||||
|
talk = $00C0; {SendInfo - adbCommand = talk + ( 16 * reg) + (adb address) }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
ReadConfigRecPtr = ^ReadConfigRec;
|
||||||
|
ReadConfigRec = PACKED RECORD
|
||||||
|
rcRepeatDelay : Byte; { Output Byte: Repeat / Delay }
|
||||||
|
rcLayoutOrLang : Byte; { Output Byte: Layout / Language }
|
||||||
|
rcADBAddr : Byte; { Output Byte: ADB address - keyboard and mouse }
|
||||||
|
END;
|
||||||
|
SetConfigRecPtr = ^SetConfigRec;
|
||||||
|
SetConfigRec = PACKED RECORD
|
||||||
|
scADBAddr : Byte; { keyboard and mouse }
|
||||||
|
scLayoutOrLang : Byte;
|
||||||
|
scRepeatDelay : Byte;
|
||||||
|
END;
|
||||||
|
SynchRecPtr = ^SynchRec;
|
||||||
|
SynchRec = PACKED RECORD
|
||||||
|
synchMode : Byte;
|
||||||
|
synchKybdMouseAddr : Byte;
|
||||||
|
synchLayoutOrLang : Byte;
|
||||||
|
synchRepeatDelay : Byte;
|
||||||
|
END;
|
||||||
|
ScaleRecPtr = ^ScaleRec;
|
||||||
|
ScaleRec = RECORD
|
||||||
|
xDivide : Integer;
|
||||||
|
yDivide : Integer;
|
||||||
|
xOffset : Integer;
|
||||||
|
yOffset : Integer;
|
||||||
|
xMultiply : Integer;
|
||||||
|
yMultiply : Integer;
|
||||||
|
END;
|
||||||
|
PROCEDURE ADBBootInit ; Tool $09,$01;
|
||||||
|
PROCEDURE ADBStartUp ; Tool $09,$02;
|
||||||
|
PROCEDURE ADBShutDown ; Tool $09,$03;
|
||||||
|
FUNCTION ADBVersion : Integer ; Tool $09,$04;
|
||||||
|
PROCEDURE ADBReset ; Tool $09,$05;
|
||||||
|
FUNCTION ADBStatus : Boolean ; Tool $09,$06;
|
||||||
|
PROCEDURE AbsOff ; Tool $09,$10;
|
||||||
|
PROCEDURE AbsOn ; Tool $09,$0F;
|
||||||
|
PROCEDURE AsyncADBReceive ( compPtr:Ptr) ; Tool $09,$0D;
|
||||||
|
PROCEDURE ClearSRQTable ; Tool $09,$16;
|
||||||
|
PROCEDURE GetAbsScale (VAR dataInPtr:ScaleRec) ; Tool $09,$13;
|
||||||
|
FUNCTION ReadAbs : Integer ; Tool $09,$11;
|
||||||
|
PROCEDURE ReadKeyMicroData ( dataLength:Integer; dataPtr:Ptr;
|
||||||
|
adbCommand:Integer) ; Tool $09,$0A;
|
||||||
|
PROCEDURE ReadKeyMicroMem ( dataLength:Integer; dataPtr:Ptr;
|
||||||
|
adbCommand:Integer) ; Tool $09,$0B;
|
||||||
|
PROCEDURE SendInfo ( dataLength:Integer; dataPtr:Ptr; adbCommand:Integer) ;
|
||||||
|
Tool $09,$09;
|
||||||
|
PROCEDURE SetAbsScale ( dataOutPtr:ScaleRec) ; Tool $09,$12;
|
||||||
|
PROCEDURE SRQPoll ( compPtr:Ptr; adbRegAddr:Integer) ; Tool $09,$14;
|
||||||
|
PROCEDURE SRQRemove ( adbRegAddr:Integer) ; Tool $09,$15;
|
||||||
|
PROCEDURE SyncADBReceive ( inputWord:Integer; compPtr:Ptr; adbCommand:Integer)
|
||||||
|
; Tool $09,$0E;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
166
pascal/applesharefst.p
Executable file
166
pascal/applesharefst.p
Executable file
|
@ -0,0 +1,166 @@
|
||||||
|
{********************************************
|
||||||
|
; File: AppleShareFST.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT APPLESHAREFST;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,GSOS;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
ASBufferControl = $0001; {Command Number - }
|
||||||
|
ASByteRangeLock = $0002; {Command Number - }
|
||||||
|
ASSpecialOpenFork = $0003; {Command Number - }
|
||||||
|
ASGetPrivileges = $0004; {Command Number - }
|
||||||
|
ASSetPrivileges = $0005; {Command Number - }
|
||||||
|
ASUserInfo = $0006; {Command Number - }
|
||||||
|
ASCopyFile = $0007; {Command Number - }
|
||||||
|
ASGetUserPath = $0008; {Command Number - }
|
||||||
|
ASOpenDesktop = $0009; {Command Number - }
|
||||||
|
ASCloseDesktop = $000A; {Command Number - }
|
||||||
|
ASGetComment = $000B; {Command Number - }
|
||||||
|
ASSetComment = $000C; {Command Number - }
|
||||||
|
ASGetServerName = $000D; {Command Number - }
|
||||||
|
appleShareNetError = $0088; {Error - AppleShare Network Error }
|
||||||
|
unknownUser = $007E; {Error - specified user name not registered }
|
||||||
|
unknownGroup = $007F; {Error - specified group name not the name of a group }
|
||||||
|
lockRange = $8000; {Mask - }
|
||||||
|
relativeToEOF = $4000; {Mask - }
|
||||||
|
seeFolders = $00; {Mask - }
|
||||||
|
seeFiles = $02; {Mask - }
|
||||||
|
makeChanges = $0004; {Mask - }
|
||||||
|
folderOwner = $80; {Mask - }
|
||||||
|
onDesktop = $0001; {File Info Mask - }
|
||||||
|
bFOwnAppl = $0002; {File Info Mask - used internally }
|
||||||
|
bFNever = $0010; {File Info Mask - never SwitchLaunch }
|
||||||
|
bFAlways = $0020; {File Info Mask - always SwitchLaunch }
|
||||||
|
shareApplication = $0040; {File Info Mask - set if file is a shareable
|
||||||
|
application }
|
||||||
|
fileIsInited = $0100; {File Info Mask - seen by Finder }
|
||||||
|
fileHasChanged = $0200; {File Info Mask - used internally by Finder }
|
||||||
|
fileIsBusy = $0400; {File Info Mask - copied from File System busy bit }
|
||||||
|
fileNoCopy = $0800; {File Info Mask - not used in 5.0 and later, formally BOZO
|
||||||
|
}
|
||||||
|
fileIsSystem = $1000; {File Info Mask - set if file is a system file }
|
||||||
|
fileHasBundle = $2000; {File Info Mask - }
|
||||||
|
fileIsInvisible = $4000; {File Info Mask - }
|
||||||
|
fileIsLocked = $8000; {File Info Mask - }
|
||||||
|
inTrashWindow = $FFFD; {Window Info Mask - }
|
||||||
|
inDesktopWindow = $FFFE; {Window Info Mask - }
|
||||||
|
inDiskWindow = $0000; {Window Info Mask - }
|
||||||
|
requestReadAccess = $0000; {accessWord Mask - }
|
||||||
|
requestWriteAccess = $0002; {accessWord Mask - }
|
||||||
|
denyReadAccess = $0010; {accessWord Mask - }
|
||||||
|
denyWriteAccess = $0020; {accessWord Mask - }
|
||||||
|
dataForkNum = $0000; {forkNum Mask - }
|
||||||
|
resourceForkNum = $0001; {forkNum Mask - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
CommandBlock = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
commandNum : Integer;
|
||||||
|
END;
|
||||||
|
BufferControlRecPtr = ^BufferControlRec;
|
||||||
|
BufferControlRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
refNum : Integer;
|
||||||
|
flags : Integer;
|
||||||
|
END;
|
||||||
|
SpecialOpenForkRecPtr = ^SpecialOpenForkRec;
|
||||||
|
SpecialOpenForkRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
accessMode : Integer;
|
||||||
|
forkNum : Integer;
|
||||||
|
END;
|
||||||
|
ByteRangeLockRecPtr = ^ByteRangeLockRec;
|
||||||
|
ByteRangeLockRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
referenceNum : Integer;
|
||||||
|
lockFlag : Integer;
|
||||||
|
fileOffset : Longint;
|
||||||
|
rangeLength : Longint;
|
||||||
|
rangeStart : Longint;
|
||||||
|
END;
|
||||||
|
GetAccessRightsRecPtr = ^GetAccessRightsRec;
|
||||||
|
GetAccessRightsRec = PACKED RECORD
|
||||||
|
reserved : Byte;
|
||||||
|
world : Byte;
|
||||||
|
group : Byte;
|
||||||
|
owner : Byte;
|
||||||
|
END;
|
||||||
|
GetPrivilegesRecPtr = ^GetPrivilegesRec;
|
||||||
|
GetPrivilegesRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
accessRights : GetAccessRightsRec;
|
||||||
|
ownerName : ResultBuf255Ptr;
|
||||||
|
groupName : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
SetAccessRightsRecPtr = ^SetAccessRightsRec;
|
||||||
|
SetAccessRightsRec = PACKED RECORD
|
||||||
|
userSummary : Byte;
|
||||||
|
world : Byte;
|
||||||
|
group : Byte;
|
||||||
|
owner : Byte;
|
||||||
|
END;
|
||||||
|
SetPrivilegesRecPtr = ^SetPrivilegesRec;
|
||||||
|
SetPrivilegesRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
accessRights : SetAccessRightsRec;
|
||||||
|
ownerName : ResultBuf255Ptr;
|
||||||
|
groupName : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
UserInfoRecPtr = ^UserInfoRec;
|
||||||
|
UserInfoRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
deviceNum : Integer;
|
||||||
|
userName : ResultBuf255Ptr;
|
||||||
|
primaryGroupName : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
CopyFileRecPtr = ^CopyFileRec;
|
||||||
|
CopyFileRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
sourcePathname : GSString255Ptr;
|
||||||
|
destPathname : GSString255Ptr;
|
||||||
|
END;
|
||||||
|
GetUserPathRecPtr = ^GetUserPathRec;
|
||||||
|
GetUserPathRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
prefix : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
DesktopRecPtr = ^DesktopRec;
|
||||||
|
DesktopRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
desktopRefNum : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
END;
|
||||||
|
GetCommentRecPtr = ^GetCommentRec;
|
||||||
|
GetCommentRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
desktopRefNum : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
comment : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
SetCommentRecPtr = ^SetCommentRec;
|
||||||
|
SetCommentRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
desktopRefNum : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
comment : GSString255Ptr;
|
||||||
|
END;
|
||||||
|
GetServerNameRecPtr = ^GetServerNameRec;
|
||||||
|
GetServerNameRec = RECORD
|
||||||
|
pBlock : CommandBlock;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
serverName : ResultBuf255Ptr;
|
||||||
|
zoneName : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
274
pascal/controls.p
Executable file
274
pascal/controls.p
Executable file
|
@ -0,0 +1,274 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Controls.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT CONTROLS;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,QUICKDRAW,EVENTS;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
wmNotStartedUp = $1001; {error - Window manager was not started first. }
|
||||||
|
noConstraint = $0000; {Axis Parameter - No constraint on movement. }
|
||||||
|
hAxisOnly = $0001; {Axis Parameter - Horizontal axis only. }
|
||||||
|
vAxisOnly = $0002; {Axis Parameter - Vertical axis only. }
|
||||||
|
simpRound = $0000; {CtlFlag - Simple button flag }
|
||||||
|
upFlag = $0001; {CtlFlag - Scroll bar flag. }
|
||||||
|
boldButton = $0001; {CtlFlag - Bold round cornered outlined button. }
|
||||||
|
simpBRound = $0001; {CtlFlag - Simple button flag }
|
||||||
|
downFlag = $0002; {CtlFlag - Scroll bar flag. }
|
||||||
|
simpSquare = $0002; {CtlFlag - Simple button flag }
|
||||||
|
simpDropSquare = $0003; {CtlFlag - Simple button flag }
|
||||||
|
leftFlag = $0004; {CtlFlag - Scroll bar flag. }
|
||||||
|
rightFlag = $0008; {CtlFlag - Scroll bar flag. }
|
||||||
|
dirScroll = $0010; {CtlFlag - Scroll bar flag. }
|
||||||
|
horScroll = $0010; {CtlFlag - Scroll bar flag. }
|
||||||
|
family = $007F; {CtlFlag - Mask for radio button family number }
|
||||||
|
ctlInVis = $0080; {CtlFlag - invisible mask for any type of control }
|
||||||
|
inListBox = $88; {CtlFlag - }
|
||||||
|
simpleProc = $00000000; {CtlProc - }
|
||||||
|
checkProc = $02000000; {CtlProc - }
|
||||||
|
radioProc = $04000000; {CtlProc - }
|
||||||
|
scrollProc = $06000000; {CtlProc - }
|
||||||
|
growProc = $08000000; {CtlProc - }
|
||||||
|
drawCtl = $0000; {DefProc - Draw control command. }
|
||||||
|
calcCRect = $0001; {DefProc - Compute drag RECT command. }
|
||||||
|
testCtl = $0002; {DefProc - Hit test command. }
|
||||||
|
initCtl = $0003; {DefProc - Initialize command. }
|
||||||
|
dispCtl = $0004; {DefProc - Dispose command. }
|
||||||
|
posCtl = $0005; {DefProc - Move indicator command. }
|
||||||
|
thumbCtl = $0006; {DefProc - Compute drag parameters command. }
|
||||||
|
dragCtl = $0007; {DefProc - Drag command. }
|
||||||
|
autoTrack = $0008; {DefProc - Action command. }
|
||||||
|
newValue = $0009; {DefProc - Set new value command. }
|
||||||
|
setParams = $000A; {DefProc - Set new parameters command. }
|
||||||
|
moveCtl = $000B; {DefProc - Move command. }
|
||||||
|
recSize = $000C; {DefProc - Return record size command. }
|
||||||
|
noHilite = $0000; {hiliteState - Param to HiliteControl }
|
||||||
|
inactiveHilite = $00FF; {hiliteState - Param to HiliteControl }
|
||||||
|
noPart = $0000; {PartCode - }
|
||||||
|
simpleButton = $0002; {PartCode - }
|
||||||
|
checkBox = $0003; {PartCode - }
|
||||||
|
radioButton = $0004; {PartCode - }
|
||||||
|
upArrow = $0005; {PartCode - }
|
||||||
|
downArrow = $0006; {PartCode - }
|
||||||
|
pageUp = $0007; {PartCode - }
|
||||||
|
pageDown = $0008; {PartCode - }
|
||||||
|
growBox = $000A; {PartCode - }
|
||||||
|
thumb = $0081; {PartCode - }
|
||||||
|
fCtlTarget = $8000; {CtlRec.ctlMoreFlags - is current target of typing commands
|
||||||
|
}
|
||||||
|
fCtlCanBeTarget = $4000; {CtlRec.ctlMoreFlags - can be made the target control
|
||||||
|
}
|
||||||
|
fCtlWantEvents = $2000; {CtlRec.ctlMoreFlags - control can be called view
|
||||||
|
SendEventToCtl }
|
||||||
|
fCtlProcRefNotPtr = $1000; {CtlRec.ctlMoreFlags - set = ID of defproc, clear =
|
||||||
|
pointer to defproc }
|
||||||
|
fCtlTellAboutSize = $0800; {CtlRec.ctlMoreFlags - set if ctl needs notification
|
||||||
|
when size of owning window changes }
|
||||||
|
fCtlIsMultiPar = $0400; {CtlRec.ctlMoreFlags - set if ctl needs notification to
|
||||||
|
be hidden }
|
||||||
|
titleIsPtr = $00; {Ctl Verb - }
|
||||||
|
titleIsHandle = $01; {Ctl Verb - }
|
||||||
|
titleIsResource = $02; {Ctl Verb - }
|
||||||
|
colorTableIsPtr = $00; {Ctl Verb - }
|
||||||
|
colorTableIsHandle = $04; {Ctl Verb - }
|
||||||
|
colorTableIsResource = $08; {Ctl Verb - }
|
||||||
|
ctlHandleEvent = $0D; {DefProc message - }
|
||||||
|
ctlChangeTarget = $0E; {DefProc message - }
|
||||||
|
ctlChangeBounds = $0F; {DefProc message - }
|
||||||
|
ctlWindChangeSize = $10; {DefProc message - }
|
||||||
|
ctlHandleTab = $11; {DefProc message - }
|
||||||
|
ctlHideCtl = $12; {DefProc message - }
|
||||||
|
singlePtr = $0000; {InputVerb - }
|
||||||
|
singleHandle = $0001; {InputVerb - }
|
||||||
|
singleResource = $0002; {InputVerb - }
|
||||||
|
ptrToPtr = $0003; {InputVerb - }
|
||||||
|
ptrToHandle = $0004; {InputVerb - }
|
||||||
|
ptrToResource = $0005; {InputVerb - }
|
||||||
|
handleToPtr = $0006; {InputVerb - }
|
||||||
|
handleToHandle = $0007; {InputVerb - }
|
||||||
|
handleToResource = $0008; {InputVerb - }
|
||||||
|
resourceToResource = $0009; {InputVerb - }
|
||||||
|
simpleButtonControl = $80000000; {ProcRefs - }
|
||||||
|
checkControl = $82000000; {ProcRefs - }
|
||||||
|
radioControl = $84000000; {ProcRefs - }
|
||||||
|
scrollBarControl = $86000000; {ProcRefs - }
|
||||||
|
growControl = $88000000; {ProcRefs - }
|
||||||
|
statTextControl = $81000000; {ProcRefs - }
|
||||||
|
editLineControl = $83000000; {ProcRefs - }
|
||||||
|
editTextControl = $85000000; {ProcRefs - }
|
||||||
|
popUpControl = $87000000; {ProcRefs - }
|
||||||
|
listControl = $89000000; {ProcRefs - }
|
||||||
|
iconButtonControl = $07FF0001; {ProcRefs - }
|
||||||
|
pictureControl = $8D000000; {ProcRefs - }
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
noCtlError = $1004; {Error - no controls in window }
|
||||||
|
noSuperCtlError = $1005; {Error - no super controls in window }
|
||||||
|
noCtlTargetError = $1006; {Error - no target super control }
|
||||||
|
notSuperCtlError = $1007; {Error - action can only be done on super control }
|
||||||
|
canNotBeTargetError = $1008; {Error - conrol cannot be made target }
|
||||||
|
noSuchIDError = $1009; {Error - specified ID cannot be found }
|
||||||
|
tooFewParmsError = $100A; {Error - not enough params specified }
|
||||||
|
noCtlToBeTargetError = $100B; {Error - NextCtl call, no ctl could be target }
|
||||||
|
noWind_Err = $100C; {Error - there is no front window }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
WindowPtr = GrafPortPtr ;
|
||||||
|
|
||||||
|
|
||||||
|
BarColorsHndl = ^BarColorsPtr;
|
||||||
|
BarColorsPtr = ^BarColors;
|
||||||
|
BarColors = RECORD
|
||||||
|
barOutline : Integer; { color for outlining bar, arrows, and thumb }
|
||||||
|
barNorArrow : Integer; { color of arrows when not highlighted }
|
||||||
|
barSelArrow : Integer; { color of arrows when highlighted }
|
||||||
|
barArrowBack : Integer; { color of arrow box's background }
|
||||||
|
barNorThumb : Integer; { color of thumb's background when not highlighted }
|
||||||
|
barSelThumb : Integer; { color of thumb's background when highlighted }
|
||||||
|
barPageRgn : Integer; { color and pattern page region: high byte - 1=
|
||||||
|
dither, 0 = solid }
|
||||||
|
barInactive : Integer; { color of scroll bar's interior when inactive }
|
||||||
|
END;
|
||||||
|
BoxColorsHndl = ^BoxColorsPtr;
|
||||||
|
BoxColorsPtr = ^BoxColors;
|
||||||
|
BoxColors = RECORD
|
||||||
|
boxReserved : Integer; { reserved }
|
||||||
|
boxNor : Integer; { color of box when not checked }
|
||||||
|
boxSel : Integer; { color of box when checked }
|
||||||
|
boxTitle : Integer; { color of check box's title }
|
||||||
|
END;
|
||||||
|
BttnColorsHndl = ^BttnColorsPtr;
|
||||||
|
BttnColorsPtr = ^BttnColors;
|
||||||
|
BttnColors = RECORD
|
||||||
|
bttnOutline : Integer; { color of outline }
|
||||||
|
bttnNorBack : Integer; { color of background when not selected }
|
||||||
|
bttnSelBack : Integer; { color of background when selected }
|
||||||
|
bttnNorText : Integer; { color of title's text when not selected }
|
||||||
|
bttnSelText : Integer; { color of title's text when selected }
|
||||||
|
END;
|
||||||
|
CtlRecHndlPtr = ^CtlRecHndl;
|
||||||
|
CtlRecHndl = ^CtlRecPtr;
|
||||||
|
CtlRecPtr = ^CtlRec;
|
||||||
|
CtlRec = PACKED RECORD
|
||||||
|
ctlNext : CtlRecHndl; { Handle of next control. }
|
||||||
|
ctlOwner : WindowPtr; { Pointer to control's window. }
|
||||||
|
ctlRect : Rect; { Enclosing rectangle. }
|
||||||
|
ctlFlag : Byte; { Bit flags. }
|
||||||
|
ctlHilite : Byte; { Highlighted part. }
|
||||||
|
ctlValue : Integer; { Control's value. }
|
||||||
|
ctlProc : LongProcPtr; { Control's definition procedure. }
|
||||||
|
ctlAction : LongProcPtr; { Control's action procedure. }
|
||||||
|
ctlData : Longint; { Reserved for CtrlProc's use. }
|
||||||
|
ctlRefCon : Longint; { Reserved for application's use. }
|
||||||
|
ctlColor : Ptr; { Pointer to appropriate color table. }
|
||||||
|
ctlReserved : PACKED ARRAY[1..16] OF Byte; { Reserved for future expansion
|
||||||
|
}
|
||||||
|
ctlID : Longint;
|
||||||
|
ctlMoreFlags : Integer;
|
||||||
|
ctlVersion : Integer;
|
||||||
|
END;
|
||||||
|
LimitBlkHndl = ^LimitBlkPtr;
|
||||||
|
LimitBlkPtr = ^LimitBlk;
|
||||||
|
LimitBlk = RECORD
|
||||||
|
boundRect : Rect; { Drag bounds. }
|
||||||
|
slopRect : Rect; { Cursor bounds. }
|
||||||
|
axisParam : Integer; { Movement constrains. }
|
||||||
|
dragPatt : Ptr; { Pointer to 32 byte Pattern for drag outline. }
|
||||||
|
END;
|
||||||
|
RadioColorsHndl = ^RadioColorsPtr;
|
||||||
|
RadioColorsPtr = ^RadioColors;
|
||||||
|
RadioColors = RECORD
|
||||||
|
radReserved : Integer; { reserved }
|
||||||
|
radNor : Integer; { color of radio button when off }
|
||||||
|
radSel : Integer; { color of radio button when on }
|
||||||
|
radTitle : Integer; { color of radio button's title text }
|
||||||
|
END;
|
||||||
|
PROCEDURE CtlBootInit ; Tool $10,$01;
|
||||||
|
PROCEDURE CtlStartUp ( userID:Integer; dPageAddr:Integer) ; Tool $10,$02;
|
||||||
|
PROCEDURE CtlShutDown ; Tool $10,$03;
|
||||||
|
FUNCTION CtlVersion : Integer ; Tool $10,$04;
|
||||||
|
PROCEDURE CtlReset ; Tool $10,$05;
|
||||||
|
FUNCTION CtlStatus : Boolean ; Tool $10,$06;
|
||||||
|
PROCEDURE CtlNewRes ; Tool $10,$12;
|
||||||
|
PROCEDURE DisposeControl ( theControlHandle:CtlRecHndl) ; Tool $10,$0A;
|
||||||
|
PROCEDURE DragControl ( startX:Integer; startY:Integer; limitRectPtr:Rect;
|
||||||
|
slopRectPtr:Rect; dragFlag:Integer; theControlHandle:CtlRecHndl) ; Tool
|
||||||
|
$10,$17;
|
||||||
|
FUNCTION DragRect ( actionProcPtr:VoidProcPtr; dragPatternPtr:Pattern;
|
||||||
|
startX:Integer; startY:Integer; dragRectPtr:Rect; limitRectPtr:Rect;
|
||||||
|
slopRectPtr:Rect; dragFlag:Integer) : Longint ; Tool $10,$1D;
|
||||||
|
PROCEDURE DrawControls ( theWindowPtr:WindowPtr) ; Tool $10,$10;
|
||||||
|
PROCEDURE DrawOneCtl ( theControlHandle:CtlRecHndl) ; Tool $10,$25;
|
||||||
|
PROCEDURE EraseControl ( theControlHandle:CtlRecHndl) ; Tool $10,$24;
|
||||||
|
FUNCTION FindControl (VAR foundCtl:CtlRecHndl; pointX:Integer; pointY:Integer;
|
||||||
|
theWindowPtr:WindowPtr) : Integer ; Tool $10,$13;
|
||||||
|
FUNCTION GetCtlAction ( theControlHandle:CtlRecHndl) : LongProcPtr ; Tool
|
||||||
|
$10,$21;
|
||||||
|
FUNCTION GetCtlDPage : Integer ; Tool $10,$1F;
|
||||||
|
FUNCTION GetCtlParams ( theControlHandle:CtlRecHndl) : Longint ; Tool $10,$1C;
|
||||||
|
FUNCTION GetCtlRefCon ( theControlHandle:CtlRecHndl) : Longint ; Tool $10,$23;
|
||||||
|
FUNCTION GetCtlTitle ( theControlHandle:CtlRecHndl) : Ptr ; Tool $10,$0D;
|
||||||
|
FUNCTION GetCtlValue ( theControlHandle:CtlRecHndl) : Integer ; Tool $10,$1A;
|
||||||
|
FUNCTION GrowSize : Longint ; Tool $10,$1E;
|
||||||
|
PROCEDURE HideControl ( theControlHandle:CtlRecHndl) ; Tool $10,$0E;
|
||||||
|
PROCEDURE HiliteControl ( hiliteState:Integer; theControlHandle:CtlRecHndl) ;
|
||||||
|
Tool $10,$11;
|
||||||
|
PROCEDURE KillControls ( theWindowPtr:WindowPtr) ; Tool $10,$0B;
|
||||||
|
PROCEDURE MoveControl ( newX:Integer; newY:Integer;
|
||||||
|
theControlHandle:CtlRecHndl) ; Tool $10,$16;
|
||||||
|
FUNCTION NewControl ( theWindowPtr:WindowPtr; boundsRectPtr:Rect; titlePtr:Ptr;
|
||||||
|
flag:Integer; value :Integer; param1:Integer; param2:Integer;
|
||||||
|
defProcPtr:LongProcPtr; refCon:Longint; U__colorTablePtr:Ptr) : CtlRecHndl ;
|
||||||
|
Tool $10,$09;
|
||||||
|
PROCEDURE SetCtlAction ( newActionPtr:LongProcPtr; theControlHandle:CtlRecHndl)
|
||||||
|
; Tool $10,$20;
|
||||||
|
FUNCTION SetCtlIcons ( newFontHandle:FontHndl) : FontHndl ; Tool $10,$18;
|
||||||
|
PROCEDURE SetCtlParams ( param2:Integer; param1:Integer;
|
||||||
|
theControlHandle:CtlRecHndl) ; Tool $10,$1B;
|
||||||
|
PROCEDURE SetCtlRefCon ( newRefCon:Longint; theControlHandle:CtlRecHndl) ;
|
||||||
|
Tool $10,$22;
|
||||||
|
PROCEDURE SetCtlTitle ( title:Str255; theControlHandle:CtlRecHndl) ; Tool
|
||||||
|
$10,$0C;
|
||||||
|
PROCEDURE SetCtlValue ( curValue:Integer; theControlHandle:CtlRecHndl) ; Tool
|
||||||
|
$10,$19;
|
||||||
|
PROCEDURE ShowControl ( theControlHandle:CtlRecHndl) ; Tool $10,$0F;
|
||||||
|
FUNCTION TestControl ( pointX:Integer; pointY:Integer;
|
||||||
|
theControlHandle:CtlRecHndl) : Integer ; Tool $10,$14;
|
||||||
|
FUNCTION TrackControl ( startX:Integer; startY:Integer;
|
||||||
|
actionProcPtr:LongProcPtr; theControlHndl:CtlRecHndl) : Integer ; Tool $10,$15;
|
||||||
|
FUNCTION NewControl2 ( ownerPtr:WindowPtr; inputDesc:RefDescriptor;
|
||||||
|
inputRef:Ref) : CtlRecHndl ; Tool $10,$31;
|
||||||
|
FUNCTION FindTargetCtl : CtlRecHndl ; Tool $10,$26;
|
||||||
|
FUNCTION MakeNextCtlTarget : CtlRecHndl ; Tool $10,$27;
|
||||||
|
PROCEDURE MakeThisCtlTarget ( targetCtlRecHndl:CtlRecHndl) ; Tool $10,$28;
|
||||||
|
PROCEDURE CallCtlDefProc ( U__ctlRecHndl:CtlRecHndl; defProcMessage:Integer;
|
||||||
|
U__param:Longint) ; Tool $10,$2C;
|
||||||
|
PROCEDURE NotifyControls ( U__mask:Integer; message:Integer; U__param:Longint;
|
||||||
|
window:WindowPtr) ; Tool $10,$2D;
|
||||||
|
FUNCTION SendEventToCtl ( targetOnlyFlag:Integer; U__WindowPtr:WindowPtr;
|
||||||
|
extendedTaskRecPtr:Ptr) : Boolean ; Tool $10,$29;
|
||||||
|
FUNCTION GetCtlID ( theCtlHandle:CtlRecHndl) : Longint ; Tool $10,$2A;
|
||||||
|
PROCEDURE SetCtlID ( newID:Longint; theCtlHandle:CtlRecHndl) ; Tool $10,$2B;
|
||||||
|
FUNCTION GetCtlMoreFlags ( theCtlHandle:CtlRecHndl) : Longint ; Tool $10,$2E;
|
||||||
|
FUNCTION SetCtlMoreFlags ( newID:Longint; theCtlHandle:CtlRecHndl) : Longint ;
|
||||||
|
Tool $10,$2F;
|
||||||
|
FUNCTION GetCtlHandleFromID ( U__WindowPtr:WindowPtr; ControlID:Longint) :
|
||||||
|
CtlRecHndl ; Tool $10,$30;
|
||||||
|
PROCEDURE SetCtlParamPtr ( SubArrayPtr:Ptr) ; Tool $10,$34;
|
||||||
|
FUNCTION GetCtlParamPtr : Ptr ; Tool $10,$35;
|
||||||
|
FUNCTION CMLoadResource ( U__ResType:Integer; U__ResID:Longint) : Handle ; Tool
|
||||||
|
$10,$32;
|
||||||
|
PROCEDURE CMReleaseResource ( U__ResType:Integer; U__ResID:Longint) ; Tool
|
||||||
|
$10,$33;
|
||||||
|
PROCEDURE InvalCtls ( U__WindowPtr:Longint) ; Tool $10,$37;
|
||||||
|
PROCEDURE NotifyCtls ( moreFlagsMask:Integer; message:Integer; param:Longint;
|
||||||
|
theGrafPortPtr:GrafPort) ; Tool $10,$2D;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
38
pascal/ctiutils.p
Executable file
38
pascal/ctiutils.p
Executable file
|
@ -0,0 +1,38 @@
|
||||||
|
UNIT CTIUtils;
|
||||||
|
|
||||||
|
INTERFACE
|
||||||
|
|
||||||
|
USES
|
||||||
|
|
||||||
|
FUNCTION Int2String
|
||||||
|
|
||||||
|
FUNCTION LongInt2String
|
||||||
|
|
||||||
|
FUNCTION Real2String
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION String2Int
|
||||||
|
|
||||||
|
FUNCTION String2LongInt
|
||||||
|
|
||||||
|
FUNCTION String2Real
|
||||||
|
|
||||||
|
|
||||||
|
procedure P2GSstring
|
||||||
|
|
||||||
|
|
||||||
|
procedure GS2Pstring
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE StuffHex
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE CallCode
|
||||||
|
|
||||||
|
nBytesIn: integer; BytesIn: univ ptr;
|
||||||
|
nBytesOut: integer; BytesOut: univ ptr );
|
||||||
|
|
||||||
|
IMPLEMENTATION
|
||||||
|
|
||||||
|
END.
|
67
pascal/desk.p
Executable file
67
pascal/desk.p
Executable file
|
@ -0,0 +1,67 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Desk.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT DESK;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,QUICKDRAW,EVENTS;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
daNotFound = $0510; {error - desk accessory not found }
|
||||||
|
notSysWindow = $0511; {error - not the system window }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
eventAction = $0001; {NDA action code - }
|
||||||
|
runAction = $0002; {NDA action code - }
|
||||||
|
undoAction = $0005; {NDA action code - }
|
||||||
|
cutAction = $0006; {NDA action code - }
|
||||||
|
copyAction = $0007; {NDA action code - }
|
||||||
|
pasteAction = $0008; {NDA action code - }
|
||||||
|
clearAction = $0009; {NDA action code - }
|
||||||
|
cursorAction = $0003; {NDAaction code - }
|
||||||
|
kUndo = $0001; {System Edit - edit type }
|
||||||
|
kCut = $0002; {System Edit - edit type }
|
||||||
|
kCopy = $0003; {System Edit - edit type }
|
||||||
|
kPaste = $0004; {System Edit - edit type }
|
||||||
|
kClear = $0005; {System Edit - edit type }
|
||||||
|
PROCEDURE DeskBootInit ; Tool $05,$01;
|
||||||
|
PROCEDURE DeskStartUp ; Tool $05,$02;
|
||||||
|
PROCEDURE DeskShutDown ; Tool $05,$03;
|
||||||
|
FUNCTION DeskVersion : Integer ; Tool $05,$04;
|
||||||
|
PROCEDURE DeskReset ; Tool $05,$05;
|
||||||
|
FUNCTION DeskStatus : Boolean ; Tool $05,$06;
|
||||||
|
PROCEDURE ChooseCDA ; Tool $05,$11;
|
||||||
|
PROCEDURE CloseAllNDAs ; Tool $05,$1D;
|
||||||
|
PROCEDURE CloseNDA ( refNum:Integer) ; Tool $05,$16;
|
||||||
|
PROCEDURE CloseNDAByWinPtr ( theWindowPtr:GrafPortPtr) ; Tool $05,$1C;
|
||||||
|
PROCEDURE FixAppleMenu ( startingID:Integer) ; Tool $05,$1E;
|
||||||
|
FUNCTION GetDAStrPtr : Ptr ; Tool $05,$14;
|
||||||
|
FUNCTION GetNumNDAs : Integer ; Tool $05,$1B;
|
||||||
|
PROCEDURE InstallCDA ( idHandle:Handle) ; Tool $05,$0F;
|
||||||
|
PROCEDURE InstallNDA ( idHandle:Handle) ; Tool $05,$0E;
|
||||||
|
FUNCTION OpenNDA ( idNum:Integer) : Integer ; Tool $05,$15;
|
||||||
|
PROCEDURE RestAll ; Tool $05,$0C;
|
||||||
|
PROCEDURE RestScrn ; Tool $05,$0A;
|
||||||
|
PROCEDURE SaveAll ; Tool $05,$0B;
|
||||||
|
PROCEDURE SaveScrn ; Tool $05,$09;
|
||||||
|
PROCEDURE SetDAStrPtr ( altDispHandle:Handle; stringTablePtr:Ptr) ; Tool
|
||||||
|
$05,$13;
|
||||||
|
PROCEDURE SystemClick ( eventRecPtr:EventRecord; theWindowPtr:GrafPortPtr;
|
||||||
|
findWndwResult:Integer) ; Tool $05,$17;
|
||||||
|
FUNCTION SystemEdit ( editType:Integer) : Boolean ; Tool $05,$18;
|
||||||
|
FUNCTION SystemEvent ( eventWhat:Integer; eventMessage:Longint;
|
||||||
|
eventWhen:Longint; eventWhere:Point; eventMods:Integer) : Boolean ; Tool
|
||||||
|
$05,$1A;
|
||||||
|
PROCEDURE SystemTask ; Tool $05,$19;
|
||||||
|
PROCEDURE AddToRunQ ( headerPtr:Ptr) ; Tool $05,$1F;
|
||||||
|
PROCEDURE RemoveFromRunQ ( headerPtr:Ptr) ; Tool $05,$20;
|
||||||
|
PROCEDURE RemoveCDA ( idHandle:Handle) ; Tool $05,$21;
|
||||||
|
PROCEDURE RemoveNDA ( idHandle:Handle) ; Tool $05,$22;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
205
pascal/dialogs.p
Executable file
205
pascal/dialogs.p
Executable file
|
@ -0,0 +1,205 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Dialogs.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT DIALOGS;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,QUICKDRAW,EVENTS,CONTROLS,WINDOWS,LINEEDIT;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
badItemType = $150A; {error - }
|
||||||
|
newItemFailed = $150B; {error - }
|
||||||
|
itemNotFound = $150C; {error - }
|
||||||
|
notModalDialog = $150D; {error - }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
getInitView = $0001; {Command - }
|
||||||
|
getInitTotal = $0002; {Command - }
|
||||||
|
getInitValue = $0003; {Command - }
|
||||||
|
scrollLineUp = $0004; {Command - }
|
||||||
|
scrollLineDown = $0005; {Command - }
|
||||||
|
scrollPageUp = $0006; {Command - }
|
||||||
|
scrollPageDown = $0007; {Command - }
|
||||||
|
scrollThumb = $0008; {Command - }
|
||||||
|
buttonItem = $000A; {Item Type - }
|
||||||
|
checkItem = $000B; {Item Type - }
|
||||||
|
radioItem = $000C; {Item Type - }
|
||||||
|
scrollBarItem = $000D; {Item Type - }
|
||||||
|
userCtlItem = $000E; {Item Type - }
|
||||||
|
statText = $000F; {Item Type - }
|
||||||
|
longStatText = $0010; {Item Type - }
|
||||||
|
editLine = $0011; {Item Type - }
|
||||||
|
iconItem = $0012; {Item Type - }
|
||||||
|
picItem = $0013; {Item Type - }
|
||||||
|
userItem = $0014; {Item Type - }
|
||||||
|
userCtlItem2 = $0015; {Item Type - }
|
||||||
|
longStatText2 = $0016; {Item Type - }
|
||||||
|
itemDisable = $8000; {Item Type - }
|
||||||
|
minItemType = $000A; {Item Type Range - }
|
||||||
|
maxItemType = $0016; {Item Type Range - }
|
||||||
|
ok = $0001; {ItemID - }
|
||||||
|
cancel = $0002; {ItemID - }
|
||||||
|
inButton = $0002; {ModalDialog2 - Part code }
|
||||||
|
inCheckBox = $0003; {ModalDialog2 - Part code }
|
||||||
|
inRadioButton = $0004; {ModalDialog2 - Part code }
|
||||||
|
inUpArrow = $0005; {ModalDialog2 - Part code }
|
||||||
|
inDownArrow = $0006; {ModalDialog2 - Part code }
|
||||||
|
inPageUp = $0007; {ModalDialog2 - Part code }
|
||||||
|
inPageDown = $0008; {ModalDialog2 - Part code }
|
||||||
|
inStatText = $0009; {ModalDialog2 - Part code }
|
||||||
|
inGrow = $000A; {ModalDialog2 - Part code }
|
||||||
|
inEditLine = $000B; {ModalDialog2 - Part code }
|
||||||
|
inUserItem = $000C; {ModalDialog2 - Part code }
|
||||||
|
inLongStatText = $000D; {ModalDialog2 - Part code }
|
||||||
|
inIconItem = $000E; {ModalDialog2 - Part code }
|
||||||
|
inLongStatText2 = $000F; {ModalDialog2 - }
|
||||||
|
inThumb = $0081; {ModalDialog2 - Part code }
|
||||||
|
okDefault = $0000; {Stage Bit Vector - }
|
||||||
|
cancelDefault = $0040; {Stage Bit Vector - }
|
||||||
|
alertDrawn = $0080; {Stage Bit Vector - }
|
||||||
|
|
||||||
|
atItemListLength = $0005;
|
||||||
|
|
||||||
|
dtItemListLength = $0008;
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
DialogPtr = WindowPtr ;
|
||||||
|
ItemTempHndl = ^ItemTempPtr;
|
||||||
|
ItemTempPtr = ^ItemTemplate;
|
||||||
|
ItemTemplate = RECORD
|
||||||
|
itemID : Integer;
|
||||||
|
itemRect : Rect;
|
||||||
|
itemType : Integer;
|
||||||
|
itemDescr : Ptr;
|
||||||
|
itemValue : Integer;
|
||||||
|
itemFlag : Integer;
|
||||||
|
itemColor : Ptr; { pointer to appropriate type of color table }
|
||||||
|
END;
|
||||||
|
AlertTempHndl = ^AlertTempPtr;
|
||||||
|
AlertTempPtr = ^AlertTemplate;
|
||||||
|
AlertTemplate = RECORD
|
||||||
|
atBoundsRect : Rect;
|
||||||
|
atAlertID : Integer;
|
||||||
|
atStage1 : Byte;
|
||||||
|
atStage2 : Byte;
|
||||||
|
atStage3 : Byte;
|
||||||
|
atStage4 : Byte;
|
||||||
|
atItemList : ARRAY[1..atItemListLength] OF ItemTempPtr; { Null terminated
|
||||||
|
array }
|
||||||
|
END;
|
||||||
|
DlgTempHndl = ^DlgTempPtr;
|
||||||
|
DlgTempPtr = ^DialogTemplate;
|
||||||
|
DialogTemplate = RECORD
|
||||||
|
dtBoundsRect : Rect;
|
||||||
|
dtVisible : Boolean;
|
||||||
|
dtRefCon : Longint;
|
||||||
|
dtItemList : ARRAY[1..dtItemListLength] OF ItemTempPtr; { Null terminated
|
||||||
|
array }
|
||||||
|
END;
|
||||||
|
IconRecordHndl = ^IconRecordPtr;
|
||||||
|
IconRecordPtr = ^IconRecord;
|
||||||
|
IconRecord = RECORD
|
||||||
|
iconRect : Rect;
|
||||||
|
iconImage : PACKED ARRAY[1..1] OF Byte;
|
||||||
|
END;
|
||||||
|
UserCtlItemPBHndl = ^UserCtlItemPBPtr;
|
||||||
|
UserCtlItemPBPtr = ^UserCtlItemPB;
|
||||||
|
UserCtlItemPB = RECORD
|
||||||
|
defProcParm : Longint; { ? should this be a LongProcPtr? }
|
||||||
|
titleParm : Ptr;
|
||||||
|
param2 : Integer;
|
||||||
|
param1 : Integer;
|
||||||
|
END;
|
||||||
|
PROCEDURE DialogBootInit ; Tool $15,$01;
|
||||||
|
PROCEDURE DialogStartUp ( userID:Integer) ; Tool $15,$02;
|
||||||
|
PROCEDURE DialogShutDown ; Tool $15,$03;
|
||||||
|
FUNCTION DialogVersion : Integer ; Tool $15,$04;
|
||||||
|
PROCEDURE DialogReset ; Tool $15,$05;
|
||||||
|
FUNCTION DialogStatus : Boolean ; Tool $15,$06;
|
||||||
|
FUNCTION Alert ( alertTemplatePtr:AlertTemplate; filterProcPtr:WordProcPtr) :
|
||||||
|
Integer ; Tool $15,$17;
|
||||||
|
FUNCTION CautionAlert ( alertTemplatePtr:AlertTemplate;
|
||||||
|
filterProcPtr:WordProcPtr) : Integer ; Tool $15,$1A;
|
||||||
|
PROCEDURE CloseDialog ( theDialogPtr:DialogPtr) ; Tool $15,$0C;
|
||||||
|
FUNCTION DefaultFilter ( theDialogPtr:DialogPtr; theEventPtr:EventRecord;
|
||||||
|
itemHitPtr:IntPtr) : Boolean ; Tool $15,$36;
|
||||||
|
FUNCTION DialogSelect ( theEventPtr:EventRecord;VAR resultPtr:WindowPtr;VAR
|
||||||
|
itemHitPtr:Integer) : Boolean ; Tool $15,$11;
|
||||||
|
PROCEDURE DisableDItem ( theDialogPtr:DialogPtr; itemID:Integer) ; Tool
|
||||||
|
$15,$39;
|
||||||
|
PROCEDURE DlgCopy ( theDialogPtr:DialogPtr) ; Tool $15,$13;
|
||||||
|
PROCEDURE DlgCut ( theDialogPtr:DialogPtr) ; Tool $15,$12;
|
||||||
|
PROCEDURE DlgDelete ( theDialogPtr:DialogPtr) ; Tool $15,$15;
|
||||||
|
PROCEDURE DlgPaste ( theDialogPtr:DialogPtr) ; Tool $15,$14;
|
||||||
|
PROCEDURE DrawDialog ( theDialogPtr:DialogPtr) ; Tool $15,$16;
|
||||||
|
PROCEDURE EnableDItem ( theDialogPtr:DialogPtr; itemID:Integer) ; Tool
|
||||||
|
$15,$3A;
|
||||||
|
PROCEDURE ErrorSound ( soundProcPtr:VoidProcPtr) ; Tool $15,$09;
|
||||||
|
FUNCTION FindDItem ( theDialogPtr:DialogPtr; thePoint:Point) : Integer ; Tool
|
||||||
|
$15,$24;
|
||||||
|
FUNCTION GetAlertStage : Integer ; Tool $15,$34;
|
||||||
|
FUNCTION GetControlDItem ( theDialogPtr:DialogPtr; itemID:Integer) : CtlRecHndl
|
||||||
|
; Tool $15,$1E;
|
||||||
|
FUNCTION GetDefButton ( theDialogPtr:DialogPtr) : Integer ; Tool $15,$37;
|
||||||
|
PROCEDURE GetDItemBox ( theDialogPtr:DialogPtr; itemID:Integer;
|
||||||
|
itemBoxPtr:Rect) ; Tool $15,$28;
|
||||||
|
FUNCTION GetDItemType ( theDialogPtr:DialogPtr; itemID:Integer) : Integer ;
|
||||||
|
Tool $15,$26;
|
||||||
|
FUNCTION GetDItemValue ( theDialogPtr:DialogPtr; itemID:Integer) : Integer ;
|
||||||
|
Tool $15,$2E;
|
||||||
|
FUNCTION GetFirstDItem ( theDialogPtr:DialogPtr) : Integer ; Tool $15,$2A;
|
||||||
|
PROCEDURE GetIText ( theDialogPtr:DialogPtr; itemID:Integer;VAR text:Str255) ;
|
||||||
|
Tool $15,$1F;
|
||||||
|
PROCEDURE GetNewDItem ( theDialogPtr:DialogPtr; itemTemplatePtr:ItemTemplate)
|
||||||
|
; Tool $15,$33;
|
||||||
|
FUNCTION GetNewModalDialog ( dialogTemplatePtr:DlgTempPtr) : DialogPtr ; Tool
|
||||||
|
$15,$32;
|
||||||
|
FUNCTION GetNextDItem ( theDialogPtr:DialogPtr; itemID:Integer) : Integer ;
|
||||||
|
Tool $15,$2B;
|
||||||
|
PROCEDURE HideDItem ( theDialogPtr:DialogPtr; itemID:Integer) ; Tool $15,$22;
|
||||||
|
FUNCTION IsDialogEvent ( theEventPtr:EventRecord) : Boolean ; Tool $15,$10;
|
||||||
|
FUNCTION ModalDialog ( filterProcPtr:WordProcPtr) : Integer ; Tool $15,$0F;
|
||||||
|
FUNCTION ModalDialog2 ( filterProcPtr:WordProcPtr) : Longint ; Tool $15,$2C;
|
||||||
|
PROCEDURE NewDItem ( theDialogPtr:DialogPtr; itemID:Integer; itemRectPtr:Rect;
|
||||||
|
itemType:Integer; itemDescr:Ptr; itemValue:Integer; itemFlag:Integer;
|
||||||
|
itemColorPtr:Ptr) ; Tool $15,$0D;
|
||||||
|
FUNCTION NewModalDialog ( dBoundsRectPtr:Rect; dVisibleFlag:Boolean;
|
||||||
|
dRefCon:Longint) : DialogPtr ; Tool $15,$0A;
|
||||||
|
FUNCTION NewModelessDialog ( dBoundsRectPtr:Rect; dTitle:Str255;
|
||||||
|
dBehindPtr:DialogPtr; dFlag:Integer; dRefCon:Longint; dFullSizePtr:Rect) :
|
||||||
|
DialogPtr ; Tool $15,$0B;
|
||||||
|
FUNCTION NoteAlert ( alertTemplatePtr:AlertTempPtr; filterProcPtr:WordProcPtr)
|
||||||
|
: Integer ; Tool $15,$19;
|
||||||
|
PROCEDURE ParamText ( param0:Str255; param1:Str255; param2:Str255;
|
||||||
|
param3:Str255) ; Tool $15,$1B;
|
||||||
|
PROCEDURE RemoveDItem ( theDialogPtr:DialogPtr; itemID:Integer) ; Tool
|
||||||
|
$15,$0E;
|
||||||
|
PROCEDURE ResetAlertStage ; Tool $15,$35;
|
||||||
|
PROCEDURE SelIText ( theDialogPtr:DialogPtr; itemID:Integer; startSel:Integer;
|
||||||
|
endSel:Integer) ; Tool $15,$21;
|
||||||
|
PROCEDURE SelectIText ( theDialogPtr:DialogPtr; itemID:Integer;
|
||||||
|
startSel:Integer; endSel:Integer) ; Tool $15,$21;
|
||||||
|
PROCEDURE SetDAFont ( fontHandle:FontHndl) ; Tool $15,$1C;
|
||||||
|
PROCEDURE SetDefButton ( defButtonID:Integer; theDialogPtr:DialogPtr) ; Tool
|
||||||
|
$15,$38;
|
||||||
|
PROCEDURE SetDItemBox ( theDialogPtr:DialogPtr; itemID:Integer;
|
||||||
|
itemBoxPtr:Rect) ; Tool $15,$29;
|
||||||
|
PROCEDURE SetDItemType ( itemType:Integer; theDialogPtr:DialogPtr;
|
||||||
|
itemID:Integer) ; Tool $15,$27;
|
||||||
|
PROCEDURE SetDItemValue ( itemValue:Integer; theDialogPtr:DialogPtr;
|
||||||
|
itemID:Integer) ; Tool $15,$2F;
|
||||||
|
PROCEDURE SetIText ( theDialogPtr:DialogPtr; itemID:Integer; theString:Str255)
|
||||||
|
; Tool $15,$20;
|
||||||
|
PROCEDURE ShowDItem ( theDialogPtr:DialogPtr; itemID:Integer) ; Tool $15,$23;
|
||||||
|
FUNCTION StopAlert ( alertTemplatePtr:AlertTempPtr; filterProcPtr:WordProcPtr)
|
||||||
|
: Integer ; Tool $15,$18;
|
||||||
|
PROCEDURE UpdateDialog ( theDialogPtr:DialogPtr; updateRgnHandle:RgnHandle) ;
|
||||||
|
Tool $15,$25;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
133
pascal/events.p
Executable file
133
pascal/events.p
Executable file
|
@ -0,0 +1,133 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Events.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT EVENTS;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
emDupStrtUpErr = $0601; {error - duplicate EMStartup Call }
|
||||||
|
emResetErr = $0602; {error - can't reset error the Event Manager }
|
||||||
|
emNotActErr = $0603; {error - event manager not active }
|
||||||
|
emBadEvtCodeErr = $0604; {error - illegal event code }
|
||||||
|
emBadBttnNoErr = $0605; {error - illegal button number }
|
||||||
|
emQSiz2LrgErr = $0606; {error - queue size too large }
|
||||||
|
emNoMemQueueErr = $0607; {error - not enough memory for queue }
|
||||||
|
emBadEvtQErr = $0681; {error - fatal sys error - event queue damaged }
|
||||||
|
emBadQHndlErr = $0682; {error - fatal sys error - queue handle damaged }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
nullEvt = $0000; {Event Code - }
|
||||||
|
mouseDownEvt = $0001; {Event Code - }
|
||||||
|
mouseUpEvt = $0002; {Event Code - }
|
||||||
|
keyDownEvt = $0003; {Event Code - }
|
||||||
|
autoKeyEvt = $0005; {Event Code - }
|
||||||
|
updateEvt = $0006; {Event Code - }
|
||||||
|
activateEvt = $0008; {Event Code - }
|
||||||
|
switchEvt = $0009; {Event Code - }
|
||||||
|
deskAccEvt = $000A; {Event Code - }
|
||||||
|
driverEvt = $000B; {Event Code - }
|
||||||
|
app1Evt = $000C; {Event Code - }
|
||||||
|
app2Evt = $000D; {Event Code - }
|
||||||
|
app3Evt = $000E; {Event Code - }
|
||||||
|
app4Evt = $000F; {Event Code - }
|
||||||
|
mDownMask = $0002; {Event Masks - }
|
||||||
|
mUpMask = $0004; {Event Masks - }
|
||||||
|
keyDownMask = $0008; {Event Masks - }
|
||||||
|
autoKeyMask = $0020; {Event Masks - }
|
||||||
|
updateMask = $0040; {Event Masks - }
|
||||||
|
activeMask = $0100; {Event Masks - }
|
||||||
|
switchMask = $0200; {Event Masks - }
|
||||||
|
deskAccMask = $0400; {Event Masks - }
|
||||||
|
driverMask = $0800; {Event Masks - }
|
||||||
|
app1Mask = $1000; {Event Masks - }
|
||||||
|
app2Mask = $2000; {Event Masks - }
|
||||||
|
app3Mask = $4000; {Event Masks - }
|
||||||
|
app4Mask = $8000; {Event Masks - }
|
||||||
|
everyEvent = $FFFF; {Event Masks - }
|
||||||
|
jcTickCount = $00; {Journal Code - TickCount call }
|
||||||
|
jcGetMouse = $01; {Journal Code - GetMouse call }
|
||||||
|
jcButton = $02; {Journal Code - Button call }
|
||||||
|
jcEvent = $04; {Journal Code - GetNextEvent and EventAvail calls }
|
||||||
|
activeFlag = $0001; {Modifier Flags - set if window being activated }
|
||||||
|
changeFlag = $0002; {Modifier Flags - set if active wind. changed state }
|
||||||
|
btn1State = $0040; {Modifier Flags - set if button 1 up }
|
||||||
|
btn0State = $0080; {Modifier Flags - set if button 0 up }
|
||||||
|
appleKey = $0100; {Modifier Flags - set if Apple key down }
|
||||||
|
shiftKey = $0200; {Modifier Flags - set if shift key down }
|
||||||
|
capsLock = $0400; {Modifier Flags - set if caps lock key down }
|
||||||
|
optionKey = $0800; {Modifier Flags - set if option key down }
|
||||||
|
controlKey = $1000; {Modifier Flags - set if Control key down }
|
||||||
|
keyPad = $2000; {Modifier Flags - set if keypress from key pad }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
EventRecordHndl = ^EventRecordPtr;
|
||||||
|
EventRecordPtr = ^EventRecord;
|
||||||
|
EventRecord = RECORD CASE INTEGER OF
|
||||||
|
0: (
|
||||||
|
what : Integer; { event code }
|
||||||
|
message : Longint; { event message }
|
||||||
|
when : Longint; { ticks since startup }
|
||||||
|
where : Point; { mouse location }
|
||||||
|
modifiers : Integer; { modifier flags }
|
||||||
|
);
|
||||||
|
1: (
|
||||||
|
wmWhat : Integer;
|
||||||
|
wmMessage : Longint;
|
||||||
|
wmWhen : Longint;
|
||||||
|
wmWhere : Point;
|
||||||
|
wmModifiers : Integer;
|
||||||
|
wmTaskData : Longint; { TaskMaster return value. }
|
||||||
|
wmTaskMask : Longint; { TaskMaster feature mask. }
|
||||||
|
wmLastClickTick : Longint;
|
||||||
|
wmClickCount : Integer;
|
||||||
|
wmTaskData2 : Longint;
|
||||||
|
wmTaskData3 : Longint;
|
||||||
|
wmTaskData4 : Longint;
|
||||||
|
wmLastClickPt : Point;
|
||||||
|
);
|
||||||
|
END;
|
||||||
|
PROCEDURE EMBootInit ; Tool $06,$01;
|
||||||
|
PROCEDURE EMStartUp ( dPageAddr:Integer; queueSize:Integer; xMinClamp:Integer;
|
||||||
|
xMaxClamp:Integer; yMinClamp:Integer; yMaxClamp:Integer; userID:Integer) ;
|
||||||
|
Tool $06,$02;
|
||||||
|
PROCEDURE EMShutDown ; Tool $06,$03;
|
||||||
|
FUNCTION EMVersion : Integer ; Tool $06,$04;
|
||||||
|
PROCEDURE EMReset ; Tool $06,$05;
|
||||||
|
FUNCTION EMStatus : Boolean ; Tool $06,$06;
|
||||||
|
FUNCTION Button ( buttonNum:Integer) : Boolean ; Tool $06,$0D;
|
||||||
|
FUNCTION DoWindows : Integer ; Tool $06,$09;
|
||||||
|
FUNCTION EventAvail ( eventMask:Integer;VAR eventPtr:EventRecord) : Boolean ;
|
||||||
|
Tool $06,$0B;
|
||||||
|
PROCEDURE FakeMouse ( changedFlag:Integer; modLatch:Integer; xPos:Integer;
|
||||||
|
yPos:Integer; ButtonStatus:Integer) ; Tool $06,$19;
|
||||||
|
FUNCTION FlushEvents ( eventMask:Integer; stopMask:Integer) : Integer ; Tool
|
||||||
|
$06,$15;
|
||||||
|
FUNCTION GetCaretTime : Longint ; Tool $06,$12;
|
||||||
|
FUNCTION GetDblTime : Longint ; Tool $06,$11;
|
||||||
|
PROCEDURE GetMouse (VAR mouseLocPtr:Point) ; Tool $06,$0C;
|
||||||
|
FUNCTION GetNextEvent ( eventMask:Integer;VAR eventPtr:EventRecord) : Boolean ;
|
||||||
|
Tool $06,$0A;
|
||||||
|
FUNCTION GetOSEvent ( eventMask:Integer;VAR eventPtr:EventRecord) : Boolean ;
|
||||||
|
Tool $06,$16;
|
||||||
|
FUNCTION OSEventAvail ( eventMask:Integer;VAR eventPtr:EventRecord) : Boolean ;
|
||||||
|
Tool $06,$17;
|
||||||
|
FUNCTION PostEvent ( eventCode:Integer; eventMsg:Longint) : Integer ; Tool
|
||||||
|
$06,$14;
|
||||||
|
PROCEDURE SetEventMask ( sysEventMask:Integer) ; Tool $06,$18;
|
||||||
|
PROCEDURE SetSwitch ; Tool $06,$13;
|
||||||
|
FUNCTION StillDown ( buttonNum:Integer) : Boolean ; Tool $06,$0E;
|
||||||
|
FUNCTION WaitMouseUp ( buttonNum:Integer) : Boolean ; Tool $06,$0F;
|
||||||
|
FUNCTION TickCount : Longint ; Tool $06,$10;
|
||||||
|
FUNCTION GetKeyTranslation : Integer ; Tool $06,$1B;
|
||||||
|
PROCEDURE SetKeyTranslation ( kTransID:Integer) ; Tool $06,$1C;
|
||||||
|
PROCEDURE SetAutoKeyLimit ( newLimit:Integer) ; Tool $06,$1A;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
103
pascal/fonts.p
Executable file
103
pascal/fonts.p
Executable file
|
@ -0,0 +1,103 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Fonts.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT FONTS;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,QUICKDRAW;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
fmDupStartUpErr = $1B01; {error - duplicate FMStartUp call }
|
||||||
|
fmResetErr = $1B02; {error - can't reset the Font Manager }
|
||||||
|
fmNotActiveErr = $1B03; {error - Font Manager not active }
|
||||||
|
fmFamNotFndErr = $1B04; {error - family not found }
|
||||||
|
fmFontNtFndErr = $1B05; {error - font not found }
|
||||||
|
fmFontMemErr = $1B06; {error - font not in memory }
|
||||||
|
fmSysFontErr = $1B07; {error - system font cannot be purgeable }
|
||||||
|
fmBadFamNumErr = $1B08; {error - illegal family number }
|
||||||
|
fmBadSizeErr = $1B09; {error - illegal size }
|
||||||
|
fmBadNameErr = $1B0A; {error - illegal name length }
|
||||||
|
fmMenuErr = $1B0B; {error - fix font menu never called }
|
||||||
|
fmScaleSizeErr = $1B0C; {error - scaled size of font exeeds limits }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
newYork = $0002; {Family Number - }
|
||||||
|
geneva = $0003; {Family Number - }
|
||||||
|
monaco = $0004; {Family Number - }
|
||||||
|
venice = $0005; {Family Number - }
|
||||||
|
london = $0006; {Family Number - }
|
||||||
|
athens = $0007; {Family Number - }
|
||||||
|
sanFran = $0008; {Family Number - }
|
||||||
|
toronto = $0009; {Family Number - }
|
||||||
|
cairo = $000B; {Family Number - }
|
||||||
|
losAngeles = $000C; {Family Number - }
|
||||||
|
times = $0014; {Family Number - }
|
||||||
|
helvetica = $0015; {Family Number - }
|
||||||
|
courier = $0016; {Family Number - }
|
||||||
|
symbol = $0017; {Family Number - }
|
||||||
|
taliesin = $0018; {Family Number - }
|
||||||
|
shaston = $FFFE; {Family Number - }
|
||||||
|
baseOnlyBit = $0020; {FamSpecBits - }
|
||||||
|
notBaseBit = $0020; {FamStatBits - }
|
||||||
|
memOnlyBit = $0001; {FontSpecBits - }
|
||||||
|
realOnlyBit = $0002; {FontSpecBits - }
|
||||||
|
anyFamBit = $0004; {FontSpecBits - }
|
||||||
|
anyStyleBit = $0008; {FontSpecBits - }
|
||||||
|
anySizeBit = $0010; {FontSpecBits - }
|
||||||
|
memBit = $0001; {FontStatBits - }
|
||||||
|
unrealBit = $0002; {FontStatBits - }
|
||||||
|
apFamBit = $0004; {FontStatBits - }
|
||||||
|
apVarBit = $0008; {FontStatBits - }
|
||||||
|
purgeBit = $0010; {FontStatBits - }
|
||||||
|
notDiskBit = $0020; {FontStatBits - }
|
||||||
|
notFoundBit = $8000; {FontStatBits - }
|
||||||
|
dontScaleBit = $0001; {Scale Word - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
FontStatRecHndl = ^FontStatRecPtr;
|
||||||
|
FontStatRecPtr = ^FontStatRec;
|
||||||
|
FontStatRec = RECORD
|
||||||
|
resultID : FontID;
|
||||||
|
resultStats : Integer;
|
||||||
|
END;
|
||||||
|
PROCEDURE FMBootInit ; Tool $1B,$01;
|
||||||
|
PROCEDURE FMStartUp ( userID:Integer; dPageAddr:Integer) ; Tool $1B,$02;
|
||||||
|
PROCEDURE FMShutDown ; Tool $1B,$03;
|
||||||
|
FUNCTION FMVersion : Integer ; Tool $1B,$04;
|
||||||
|
PROCEDURE FMReset ; Tool $1B,$05;
|
||||||
|
FUNCTION FMStatus : Boolean ; Tool $1B,$06;
|
||||||
|
PROCEDURE AddFamily ( famNum:Integer; famName:Str255) ; Tool $1B,$0D;
|
||||||
|
PROCEDURE AddFontVar ( fontHandle:FontHndl; newSpecs:Integer) ; Tool $1B,$14;
|
||||||
|
FUNCTION ChooseFont ( currentID:FontID; famSpecs:Integer) : FontID ; Tool
|
||||||
|
$1B,$16;
|
||||||
|
FUNCTION CountFamilies ( famSpecs:Integer) : Integer ; Tool $1B,$09;
|
||||||
|
FUNCTION CountFonts ( desiredID:FontId; fontSpecs:Integer) : Integer ; Tool
|
||||||
|
$1B,$10;
|
||||||
|
FUNCTION FamNum2ItemID ( famNum:Integer) : Integer ; Tool $1B,$1B;
|
||||||
|
FUNCTION FindFamily ( famSpecs:Integer; positionNum:Integer; famName:Str255) :
|
||||||
|
Integer ; Tool $1B,$0A;
|
||||||
|
PROCEDURE FindFontStats ( desiredID:FontId; fontSpecs:Integer;
|
||||||
|
positionNum:Integer;VAR resultPtr:FontStatRec) ; Tool $1B,$11;
|
||||||
|
PROCEDURE FixFontMenu ( menuID:Integer; startingID:Integer; famSpecs:Integer)
|
||||||
|
; Tool $1B,$15;
|
||||||
|
FUNCTION FMGetCurFID : FontID ; Tool $1B,$1A;
|
||||||
|
FUNCTION FMGetSysFID : FontID ; Tool $1B,$19;
|
||||||
|
PROCEDURE FMSetSysFont ( newFontID:FontID) ; Tool $1B,$18;
|
||||||
|
FUNCTION GetFamInfo ( famNum:Integer; famName:Str255) : Integer ; Tool $1B,$0B;
|
||||||
|
FUNCTION GetFamNum ( famName:Str255) : Integer ; Tool $1B,$0C;
|
||||||
|
PROCEDURE InstallFont ( desiredID:FontID; scaleWord:Integer) ; Tool $1B,$0E;
|
||||||
|
PROCEDURE InstallWithStats ( desiredID:FontID; scaleWord:Integer;
|
||||||
|
resultPtr:Ptr) ; Tool $1B,$1C;
|
||||||
|
FUNCTION ItemID2FamNum ( itemID:Integer) : Integer ; Tool $1B,$17;
|
||||||
|
PROCEDURE LoadFont ( desiredID:FontID; fontSpecs:Integer;
|
||||||
|
positionNum:Integer;VAR resultPtr:FontStatRec) ; Tool $1B,$12;
|
||||||
|
PROCEDURE LoadSysFont ; Tool $1B,$13;
|
||||||
|
PROCEDURE SetPurgeStat ( theFontID:FontID; purgeStat:Integer) ; Tool $1B,$0F;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
138
pascal/fst.p
Executable file
138
pascal/fst.p
Executable file
|
@ -0,0 +1,138 @@
|
||||||
|
{********************************************
|
||||||
|
; File: FST.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT FST;
|
||||||
|
INTERFACE
|
||||||
|
USES Types,GSOS;
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
BufferControlRecPtr = ^BufferControlRec;
|
||||||
|
BufferControlRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
refNum : Integer;
|
||||||
|
flags : Integer;
|
||||||
|
END;
|
||||||
|
SpecialOpenForkRecPtr = ^SpecialOpenForkRec;
|
||||||
|
SpecialOpenForkRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
referenceNum : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
accessMode : Integer;
|
||||||
|
resourceNum : Integer;
|
||||||
|
END;
|
||||||
|
ByteRangeLockRecPtr = ^ByteRangeLockRec;
|
||||||
|
ByteRangeLockRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
referenceNum : Integer;
|
||||||
|
lockFlag : Integer;
|
||||||
|
fileOffset : Longint;
|
||||||
|
rangeLength : Longint;
|
||||||
|
rangeStart : Longint;
|
||||||
|
END;
|
||||||
|
GetAccessRightsRecPtr = ^GetAccessRightsRec;
|
||||||
|
GetAccessRightsRec = PACKED RECORD
|
||||||
|
reserved : Byte;
|
||||||
|
world : Byte;
|
||||||
|
group : Byte;
|
||||||
|
owner : Byte;
|
||||||
|
END;
|
||||||
|
GetPrivilegesRecPtr = ^GetPrivilegesRec;
|
||||||
|
GetPrivilegesRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
accessRights : GetAccessRightsRec;
|
||||||
|
ownerName : ResultBuf255Ptr;
|
||||||
|
groupName : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
SetAccessRightsRecPtr = ^SetAccessRightsRec;
|
||||||
|
SetAccessRightsRec = PACKED RECORD
|
||||||
|
userSummary : Byte;
|
||||||
|
world : Byte;
|
||||||
|
group : Byte;
|
||||||
|
owner : Byte;
|
||||||
|
END;
|
||||||
|
SetPrivilegesRecPtr = ^SetPrivilegesRec;
|
||||||
|
SetPrivilegesRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
accessRights : SetAccessRightsRec;
|
||||||
|
ownerName : ResultBuf255Ptr;
|
||||||
|
groupName : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
UserInfoRecPtr = ^UserInfoRec;
|
||||||
|
UserInfoRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
deviceNum : Integer;
|
||||||
|
userName : ResultBuf255Ptr;
|
||||||
|
primaryGroupName : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
CopyFileRecPtr = ^CopyFileRec;
|
||||||
|
CopyFileRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
sourcePathname : GSString255Ptr;
|
||||||
|
destPathname : GSString255Ptr;
|
||||||
|
END;
|
||||||
|
GetUserPathRecPtr = ^GetUserPathRec;
|
||||||
|
GetUserPathRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
prefix : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
DesktopRecPtr = ^DesktopRec;
|
||||||
|
DesktopRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
desktopRefNum : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
END;
|
||||||
|
GetCommentRecPtr = ^GetCommentRec;
|
||||||
|
GetCommentRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
desktopRefNum : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
comment : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
SetCommentRecPtr = ^SetCommentRec;
|
||||||
|
SetCommentRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
desktopRefNum : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
comment : GSString255Ptr;
|
||||||
|
END;
|
||||||
|
GetServerNameRecPtr = ^GetServerNameRec;
|
||||||
|
GetServerNameRec = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
command : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
serverName : ResultBuf255Ptr;
|
||||||
|
zoneName : ResultBuf255Ptr;
|
||||||
|
END;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
498
pascal/gsos.p
Executable file
498
pascal/gsos.p
Executable file
|
@ -0,0 +1,498 @@
|
||||||
|
{********************************************
|
||||||
|
; File: GSOS.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT GSOS;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
readEnable = $0001; {access - read enable bit: CreateRec, OpenRec access and
|
||||||
|
requestAccess fields }
|
||||||
|
writeEnable = $0002; {access - write enable bit: CreateRec, OpenRec access and
|
||||||
|
requestAccess fields }
|
||||||
|
fileInvisible = $0004; {access - Invisible bit }
|
||||||
|
backupNeeded = $0020; {access - backup needed bit: CreateRec, OpenRec access
|
||||||
|
field. (Must be 0 in requestAccess field ) }
|
||||||
|
renameEnable = $0040; {access - rename enable bit: CreateRec, OpenRec access
|
||||||
|
and requestAccess fields }
|
||||||
|
destroyEnable = $0080; {access - destroy enable bit: CreateRec, OpenRec access
|
||||||
|
and requestAccess fields }
|
||||||
|
startPlus = $0000; {base - > setMark = displacement }
|
||||||
|
eofMinus = $0001; {base - > setMark = eof - displacement }
|
||||||
|
markPlus = $0002; {base - > setMark = mark + displacement }
|
||||||
|
markMinus = $0003; {base - > setMark = mark - displacement }
|
||||||
|
cacheOff = $0000; {cachePriority - do not cache blocks invloved in this read }
|
||||||
|
cacheOn = $0001; {cachePriority - cache blocks invloved in this read if
|
||||||
|
possible }
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
badSystemCall = $0001; {error - bad system call number }
|
||||||
|
invalidPcount = $0004; {error - invalid parameter count }
|
||||||
|
gsosActive = $07; {error - GS/OS already active }
|
||||||
|
devNotFound = $10; {error - device not found }
|
||||||
|
invalidDevNum = $11; {error - invalid device number }
|
||||||
|
drvrBadReq = $20; {error - bad request or command }
|
||||||
|
drvrBadCode = $0021; {error - bad control or status code }
|
||||||
|
drvrBadParm = $0022; {error - bad call parameter }
|
||||||
|
drvrNotOpen = $0023; {error - character device not open }
|
||||||
|
drvrPriorOpen = $0024; {error - character device already open }
|
||||||
|
irqTableFull = $0025; {error - interrupt table full }
|
||||||
|
drvrNoResrc = $0026; {error - resources not available }
|
||||||
|
drvrIOError = $0027; {error - I/O error }
|
||||||
|
drvrNoDevice = $0028; {error - device not connected }
|
||||||
|
drvrBusy = $0029; {error - call aborted, driver is busy }
|
||||||
|
drvrWrtProt = $002B; {error - device is write protected }
|
||||||
|
drvrBadCount = $002C; {error - invalid byte count }
|
||||||
|
drvrBadBlock = $002D; {error - invalid block address }
|
||||||
|
drvrDiskSwitch = $002E; {error - disk has been switched }
|
||||||
|
drvrOffLine = $002F; {error - device off line/ no media present }
|
||||||
|
badPathSyntax = $0040; {error - invalid pathname syntax }
|
||||||
|
invalidRefNum = $0043; {error - invalid reference number }
|
||||||
|
pathNotFound = $44; {error - subdirectory does not exist }
|
||||||
|
volNotFound = $0045; {error - volume not found }
|
||||||
|
fileNotFound = $0046; {error - file not found }
|
||||||
|
dupPathname = $0047; {error - create or rename with existing name }
|
||||||
|
volumeFull = $0048; {error - volume full error }
|
||||||
|
volDirFull = $0049; {error - volume directory full }
|
||||||
|
badFileFormat = $004A; {error - version error (incompatible file format) }
|
||||||
|
badStoreType = $004B; {error - unsupported (or incorrect) storage type }
|
||||||
|
eofEncountered = $004C; {error - end-of-file encountered }
|
||||||
|
outOfRange = $004D; {error - position out of range }
|
||||||
|
invalidAccess = $004E; {error - access not allowed }
|
||||||
|
buffTooSmall = $004F; {error - buffer too small }
|
||||||
|
fileBusy = $0050; {error - file is already open }
|
||||||
|
dirError = $0051; {error - directory error }
|
||||||
|
unknownVol = $0052; {error - unknown volume type }
|
||||||
|
paramRangeErr = $0053; {error - parameter out of range }
|
||||||
|
outOfMem = $0054; {error - out of memory }
|
||||||
|
dupVolume = $0057; {error - duplicate volume name }
|
||||||
|
notBlockDev = $0058; {error - not a block device }
|
||||||
|
invalidLevel = $0059; {error - specifield level outside legal range }
|
||||||
|
damagedBitMap = $005A; {error - block number too large }
|
||||||
|
badPathNames = $005B; {error - invalid pathnames for ChangePath }
|
||||||
|
notSystemFile = $005C; {error - not an executable file }
|
||||||
|
osUnsupported = $005D; {error - Operating System not supported }
|
||||||
|
stackOverflow = $005F; {error - too many applications on stack }
|
||||||
|
dataUnavail = $0060; {error - Data unavailable }
|
||||||
|
endOfDir = $0061; {error - end of directory has been reached }
|
||||||
|
invalidClass = $0062; {error - invalid FST call class }
|
||||||
|
resForkNotFound = $0063; {error - file does not contain required resource }
|
||||||
|
invalidFSTID = $0064; {error - error - FST ID is invalid }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
(* *** File System IDs ***
|
||||||
|
proDOSFSID = $0001; {fileSysID - ProDOS/SOS }
|
||||||
|
dos33FSID = $0002; {fileSysID - DOS 3.3 }
|
||||||
|
dos32FSID = $0003; {fileSysID - DOS 3.2 }
|
||||||
|
dos31FSID = $0003; {fileSysID - DOS 3.1 }
|
||||||
|
appleIIPascalFSID = $0004; {fileSysID - Apple II Pascal }
|
||||||
|
mfsFSID = $0005; {fileSysID - Macintosh (flat file system) }
|
||||||
|
hfsFSID = $0006; {fileSysID - Macintosh (hierarchical file system) }
|
||||||
|
lisaFSID = $0007; {fileSysID - Lisa file system }
|
||||||
|
appleCPMFSID = $0008; {fileSysID - Apple CP/M }
|
||||||
|
charFSTFSID = $0009; {fileSysID - Character FST }
|
||||||
|
msDOSFSID = $000A; {fileSysID - MS/DOS }
|
||||||
|
highSierraFSID = $000B; {fileSysID - High Sierra }
|
||||||
|
iso9660FSID = $000C; {fileSysID - ISO 9660 }
|
||||||
|
appleShareFSID = $000D; {fileSysID - ISO 9660 }
|
||||||
|
*** File System IDs *** *)
|
||||||
|
|
||||||
|
characterFST = $4000; {FSTInfo.attributes - character FST }
|
||||||
|
ucFST = $8000; {FSTInfo.attributes - SCM should upper case pathnames before
|
||||||
|
passing them to the FST }
|
||||||
|
onStack = $8000; {QuitRec.flags - place state information about quitting
|
||||||
|
program on the quit return stack }
|
||||||
|
restartable = $4000; {QuitRec.flags - the quitting program is capable of being
|
||||||
|
restarted from its dormant memory }
|
||||||
|
seedling = $0001; {storageType - standard file with seedling structure }
|
||||||
|
standardFile = $0001; {storageType - standard file type (no resource fork) }
|
||||||
|
sapling = $0002; {storageType - standard file with sapling structure }
|
||||||
|
tree = $0003; {storageType - standard file with tree structure }
|
||||||
|
pascalRegion = $0004; {storageType - UCSD Pascal region on a partitioned disk }
|
||||||
|
extendedFile = $0005; {storageType - extended file type (with resource fork) }
|
||||||
|
directoryFile = $000D; {storageType - volume directory or subdirectory file }
|
||||||
|
minorRelNumMask = $00FF; {version - minor release number }
|
||||||
|
majorRelNumMask = $7F00; {version - major release number }
|
||||||
|
finalRelNumMask = $8000; {version - final release number }
|
||||||
|
isFileExtended = $8000; {GetDirEntryGS - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
GSString255Hndl = ^GSString255Ptr;
|
||||||
|
GSString255Ptr = ^GSString255;
|
||||||
|
GSString255 = RECORD
|
||||||
|
length : Integer; { Number of Chars in text field }
|
||||||
|
text : PACKED ARRAY[1..255] OF CHAR;
|
||||||
|
END;
|
||||||
|
GSString255HndlPtr = ^GSString255Hndl;
|
||||||
|
|
||||||
|
GSString32Hndl = ^GSString32Ptr;
|
||||||
|
GSString32Ptr = ^GSString32;
|
||||||
|
GSString32 = RECORD
|
||||||
|
length : Integer; { Number of characters in text field }
|
||||||
|
text : PACKED ARRAY[1..32] OF CHAR;
|
||||||
|
END;
|
||||||
|
ResultBuf255Hndl = ^ResultBuf255Ptr;
|
||||||
|
ResultBuf255Ptr = ^ResultBuf255;
|
||||||
|
ResultBuf255 = RECORD
|
||||||
|
bufSize : Integer;
|
||||||
|
bufString : GSString255;
|
||||||
|
END;
|
||||||
|
ResultBuf255HndlPtr = ^ResultBuf255Hndl;
|
||||||
|
|
||||||
|
ResultBuf32Hndl = ^ResultBuf32Ptr;
|
||||||
|
ResultBuf32Ptr = ^ResultBuf32;
|
||||||
|
ResultBuf32 = RECORD
|
||||||
|
bufSize : Integer;
|
||||||
|
bufString : GSString32;
|
||||||
|
END;
|
||||||
|
ChangePathRecPtrGS = ^ChangePathRecGS;
|
||||||
|
ChangePathRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
newPathname : GSString255Ptr;
|
||||||
|
END;
|
||||||
|
CreateRecPtrGS = ^CreateRecGS;
|
||||||
|
CreateRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
access : Integer;
|
||||||
|
fileType : Integer;
|
||||||
|
auxType : Longint;
|
||||||
|
storageType : Integer;
|
||||||
|
eof : Longint;
|
||||||
|
resourceEOF : Longint;
|
||||||
|
END;
|
||||||
|
DAccessRecPtrGS = ^DAccessRecGS;
|
||||||
|
DAccessRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
devNum : Integer;
|
||||||
|
code : Integer;
|
||||||
|
list : Ptr;
|
||||||
|
requestCount : Longint;
|
||||||
|
transferCount : Longint;
|
||||||
|
END;
|
||||||
|
DevNumRecPtrGS = ^DevNumRecGS;
|
||||||
|
DevNumRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
devName : GSString255Ptr;
|
||||||
|
devNum : Integer;
|
||||||
|
END;
|
||||||
|
DInfoRecPtrGS = ^DInfoRecGS;
|
||||||
|
DInfoRecGS = RECORD
|
||||||
|
pCount : Integer; { minimum = 2 }
|
||||||
|
devNum : Integer;
|
||||||
|
devName : GSString32Ptr;
|
||||||
|
characteristics : Integer;
|
||||||
|
totalBlocks : Longint;
|
||||||
|
slotNum : Integer;
|
||||||
|
unitNum : Integer;
|
||||||
|
version : Integer;
|
||||||
|
deviceID : Integer;
|
||||||
|
headLink : Integer;
|
||||||
|
forwardLink : Integer;
|
||||||
|
extendedDIBptr : Longint;
|
||||||
|
END;
|
||||||
|
DIORecPtrGS = ^DIORecGS;
|
||||||
|
DIORecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
devNum : Integer;
|
||||||
|
buffer : Ptr;
|
||||||
|
requestCount : Longint;
|
||||||
|
startingBlock : Longint;
|
||||||
|
blockSize : Integer;
|
||||||
|
transferCount : Longint;
|
||||||
|
END;
|
||||||
|
DirEntryRecPtrGS = ^DirEntryRecGS;
|
||||||
|
DirEntryRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
refNum : Integer;
|
||||||
|
flags : Integer;
|
||||||
|
base : Integer;
|
||||||
|
displacement : Integer;
|
||||||
|
name : Ptr;
|
||||||
|
entryNum : Integer;
|
||||||
|
fileType : Integer;
|
||||||
|
eof : Longint;
|
||||||
|
blockCount : Longint;
|
||||||
|
createDateTime : TimeRec;
|
||||||
|
modDateTime : TimeRec;
|
||||||
|
access : Integer;
|
||||||
|
auxType : Longint;
|
||||||
|
fileSysID : Integer;
|
||||||
|
optionList : ResultBuf255Ptr;
|
||||||
|
resourceEOF : Longint;
|
||||||
|
resourceBlocks : Longint;
|
||||||
|
END;
|
||||||
|
ExpandPathRecPtrGS = ^ExpandPathRecGS;
|
||||||
|
ExpandPathRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
inputPath : GSString255Ptr;
|
||||||
|
outputPath : ResultBuf255Ptr;
|
||||||
|
flags : Integer;
|
||||||
|
END;
|
||||||
|
FileInfoRecPtrGS = ^FileInfoRecGS;
|
||||||
|
FileInfoRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
access : Integer;
|
||||||
|
fileType : Integer;
|
||||||
|
auxType : Longint;
|
||||||
|
storageType : Integer; { must be 0 for SetFileInfo }
|
||||||
|
createDateTime : TimeRec;
|
||||||
|
modDateTime : TimeRec;
|
||||||
|
optionList : Longint;
|
||||||
|
eof : Longint;
|
||||||
|
blocksUsed : Longint; { must be 0 for SetFileInfo }
|
||||||
|
resourceEOF : Longint; { must be 0 for SetFileInfo }
|
||||||
|
resourceBlocks : Longint; { must be 0 for SetFileInfo }
|
||||||
|
END;
|
||||||
|
FormatRecPtrGS = ^FormatRecGS;
|
||||||
|
FormatRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
devName : GSString32Ptr; { device name pointer }
|
||||||
|
volName : GSString32Ptr; { volume name pointer }
|
||||||
|
fileSysID : Integer; { file system ID }
|
||||||
|
reqFileSysID : Integer; { in; }
|
||||||
|
END;
|
||||||
|
FSTInfoRecPtrGS = ^FSTInfoRecGS;
|
||||||
|
FSTInfoRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
fstNum : Integer;
|
||||||
|
fileSysID : Integer;
|
||||||
|
fstName : ResultBuf255Ptr;
|
||||||
|
version : Integer;
|
||||||
|
attributes : Integer;
|
||||||
|
blockSize : Integer;
|
||||||
|
maxVolSize : Longint;
|
||||||
|
maxFileSize : Longint;
|
||||||
|
END;
|
||||||
|
InterruptRecPtrGS = ^InterruptRecGS;
|
||||||
|
InterruptRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
intNum : Integer;
|
||||||
|
vrn : Integer; { used only by BindInt }
|
||||||
|
intCode : Longint; { used only by BindInt }
|
||||||
|
END;
|
||||||
|
IORecPtrGS = ^IORecGS;
|
||||||
|
IORecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
refNum : Integer;
|
||||||
|
dataBuffer : Ptr;
|
||||||
|
requestCount : Longint;
|
||||||
|
transferCount : Longint;
|
||||||
|
cachePriority : Integer;
|
||||||
|
END;
|
||||||
|
LevelRecPtrGS = ^LevelRecGS;
|
||||||
|
LevelRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
level : Integer;
|
||||||
|
END;
|
||||||
|
NameRecPtrGS = ^NameRecGS;
|
||||||
|
NameRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
pathname : GSString255Ptr; { full pathname or a filename depending on call
|
||||||
|
}
|
||||||
|
END;
|
||||||
|
GetNameRecPtrGS = ^GetNameRecGS;
|
||||||
|
GetNameRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
dataBuffer : ResultBuf255Ptr; { full pathname or a filename depending on
|
||||||
|
call }
|
||||||
|
END;
|
||||||
|
NewlineRecPtrGS = ^NewlineRecGS;
|
||||||
|
NewlineRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
refNum : Integer;
|
||||||
|
enableMask : Integer;
|
||||||
|
numChars : Integer;
|
||||||
|
newlineTable : Ptr;
|
||||||
|
END;
|
||||||
|
OpenRecPtrGS = ^OpenRecGS;
|
||||||
|
OpenRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
refNum : Integer;
|
||||||
|
pathname : GSString255Ptr;
|
||||||
|
requestAccess : Integer;
|
||||||
|
resourceNumber : Integer; { For extended files: dataFork/resourceFork }
|
||||||
|
access : Integer; { Value of file's access attribute }
|
||||||
|
fileType : Integer; { Value of file's fileType attribute }
|
||||||
|
auxType : Longint;
|
||||||
|
storageType : Integer;
|
||||||
|
createDateTime : TimeRec;
|
||||||
|
modDateTime : TimeRec;
|
||||||
|
optionList : IntPtr;
|
||||||
|
eof : Longint;
|
||||||
|
blocksUsed : Longint;
|
||||||
|
resourceEOF : Longint;
|
||||||
|
resourceBlocks : Longint;
|
||||||
|
END;
|
||||||
|
OSShutdownRecPtrGS = ^OSShutdownRecGS;
|
||||||
|
OSShutdownRecGS = RECORD
|
||||||
|
pCount : Integer; { in }
|
||||||
|
shutdownFlag : Integer; { in }
|
||||||
|
END;
|
||||||
|
PositionRecPtrGS = ^PositionRecGS;
|
||||||
|
PositionRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
refNum : Integer;
|
||||||
|
position : Longint;
|
||||||
|
END;
|
||||||
|
EOFRecPtrGS = ^EOFRecGS;
|
||||||
|
EOFRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
refNum : Integer;
|
||||||
|
eof : Longint;
|
||||||
|
END;
|
||||||
|
PrefixRecPtrGS = ^PrefixRecGS;
|
||||||
|
PrefixRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
prefixNum : Integer;
|
||||||
|
CASE INTEGER OF
|
||||||
|
0: (getPrefix : ResultBuf255Ptr;);
|
||||||
|
1: (setPrefix : GSString255Ptr;);
|
||||||
|
END;
|
||||||
|
QuitRecPtrGS = ^QuitRecGS;
|
||||||
|
QuitRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
pathname : GSString255Ptr; { pathname of next app to run }
|
||||||
|
flags : Integer;
|
||||||
|
END;
|
||||||
|
RefnumRecPtrGS = ^RefNumRecGS;
|
||||||
|
RefNumRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
refNum : Integer;
|
||||||
|
END;
|
||||||
|
SessionStatusRecPtrGS = ^SessionStatusRecGS;
|
||||||
|
SessionStatusRecGS = RECORD
|
||||||
|
pCount : Integer; { in: min = 1 }
|
||||||
|
status : Integer; { out: }
|
||||||
|
END;
|
||||||
|
SetPositionRecPtrGS = ^SetPositionRecGS;
|
||||||
|
SetPositionRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
refNum : Integer;
|
||||||
|
base : Integer;
|
||||||
|
displacement : Longint;
|
||||||
|
END;
|
||||||
|
SysPrefsRecPtrGS = ^SysPrefsRecGS;
|
||||||
|
SysPrefsRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
preferences : Integer;
|
||||||
|
END;
|
||||||
|
VersionRecPtrGS = ^VersionRecGS;
|
||||||
|
VersionRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
version : Integer;
|
||||||
|
END;
|
||||||
|
VolumeRecPtrGS = ^VolumeRecGS;
|
||||||
|
VolumeRecGS = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
devName : GSString32Ptr;
|
||||||
|
volName : ResultBuf255Ptr;
|
||||||
|
totalBlocks : Longint;
|
||||||
|
freeBlocks : Longint;
|
||||||
|
fileSysID : Integer;
|
||||||
|
blockSize : Integer;
|
||||||
|
END;
|
||||||
|
PROCEDURE BeginSessionGS (VAR pblockPtr: SessionStatusRecGS); GSOS $201D ;
|
||||||
|
|
||||||
|
PROCEDURE BindIntGS (VAR pblockPtr: InterruptRecGS); GSOS $2031 ;
|
||||||
|
|
||||||
|
PROCEDURE ChangePathGS (VAR pblockPtr: ChangePathRecGS); GSOS $2004 ;
|
||||||
|
|
||||||
|
PROCEDURE ClearBackupBitGS (VAR pblockPtr: NameRecGS); GSOS $200B ;
|
||||||
|
|
||||||
|
PROCEDURE CloseGS (VAR pblockPtr: RefNumRecGS); GSOS $2014 ;
|
||||||
|
|
||||||
|
PROCEDURE CreateGS (VAR pblockPtr: CreateRecGS); GSOS $2001 ;
|
||||||
|
|
||||||
|
PROCEDURE DControlGS (VAR pblockPtr: DAccessRecGS); GSOS $202E ;
|
||||||
|
|
||||||
|
PROCEDURE DestroyGS (VAR pblockPtr: NameRecGS); GSOS $2002 ;
|
||||||
|
|
||||||
|
PROCEDURE DInfoGS (VAR pblockPtr: DInfoRecGS); GSOS $202C ;
|
||||||
|
|
||||||
|
PROCEDURE DReadGS (VAR pblockPtr: DIORecGS); GSOS $202F ;
|
||||||
|
|
||||||
|
PROCEDURE DStatusGS (VAR pblockPtr: DAccessRecGS); GSOS $202D ;
|
||||||
|
|
||||||
|
PROCEDURE DWriteGS (VAR pblockPtr: DIORecGS); GSOS $2030 ;
|
||||||
|
|
||||||
|
PROCEDURE EndSessionGS (VAR pblockPtr: SessionStatusRecGS); GSOS $201E ;
|
||||||
|
|
||||||
|
PROCEDURE EraseDiskGS (VAR pblockPtr: FormatRecGS); GSOS $2025 ;
|
||||||
|
|
||||||
|
PROCEDURE ExpandPathGS (VAR pblockPtr: ExpandPathRecGS); GSOS $200E ;
|
||||||
|
|
||||||
|
PROCEDURE FlushGS (VAR pblockPtr: RefNumRecGS); GSOS $2015 ;
|
||||||
|
|
||||||
|
PROCEDURE FormatGS (VAR pblockPtr: FormatRecGS); GSOS $2024 ;
|
||||||
|
|
||||||
|
PROCEDURE GetBootVolGS (VAR pblockPtr: NameRecGS); GSOS $2028 ;
|
||||||
|
|
||||||
|
PROCEDURE GetDevNumberGS (VAR pblockPtr: DevNumRecGS); GSOS $2020 ;
|
||||||
|
|
||||||
|
PROCEDURE GetDirEntryGS (VAR pblockPtr: DirEntryRecGS); GSOS $201C ;
|
||||||
|
|
||||||
|
PROCEDURE GetEOFGS (VAR pblockPtr: EOFRecGS); GSOS $2019 ;
|
||||||
|
|
||||||
|
PROCEDURE GetFileInfoGS (VAR pblockPtr: FileInfoRecGS); GSOS $2006 ;
|
||||||
|
|
||||||
|
PROCEDURE GetFSTInfoGS (VAR pblockPtr: FSTInfoRecGS); GSOS $202B ;
|
||||||
|
|
||||||
|
PROCEDURE GetLevelGS (VAR pblockPtr: LevelRecGS); GSOS $201B ;
|
||||||
|
|
||||||
|
PROCEDURE GetMarkGS (VAR pblockPtr: PositionRecGS); GSOS $2017 ;
|
||||||
|
|
||||||
|
PROCEDURE GetNameGS (VAR pblockPtr: GetNameRecGS); GSOS $2027 ;
|
||||||
|
|
||||||
|
PROCEDURE GetPrefixGS (VAR pblockPtr: PrefixRecGS); GSOS $200A ;
|
||||||
|
|
||||||
|
PROCEDURE GetVersionGS (VAR pblockPtr: VersionRecGS); GSOS $202A ;
|
||||||
|
|
||||||
|
PROCEDURE GetSysPrefsGS (VAR pblockPtr: SysPrefsRecGS); GSOS $200F ;
|
||||||
|
|
||||||
|
PROCEDURE NewlineGS (VAR pblockPtr: NewlineRecGS); GSOS $2011 ;
|
||||||
|
|
||||||
|
PROCEDURE NullGS (VAR pblockPtr: IntPtr); GSOS $200D ;
|
||||||
|
|
||||||
|
PROCEDURE OpenGS (VAR pblockPtr: OpenRecGS); GSOS $2010 ;
|
||||||
|
|
||||||
|
PROCEDURE QuitGS (VAR pblockPtr: QuitRecGS); GSOS $2029 ;
|
||||||
|
|
||||||
|
PROCEDURE ReadGS (VAR pblockPtr: IORecGS); GSOS $2012 ;
|
||||||
|
|
||||||
|
PROCEDURE ResetCacheGS (VAR pblockPtr: IntPtr); GSOS $2026 ;
|
||||||
|
|
||||||
|
PROCEDURE SessionStatusGS (VAR pblockPtr: SessionStatusRecGS); GSOS $201F ;
|
||||||
|
|
||||||
|
PROCEDURE SetEOFGS (VAR pblockPtr: SetPositionRecGS); GSOS $2018 ;
|
||||||
|
|
||||||
|
PROCEDURE SetFileInfoGS (VAR pblockPtr: FileInfoRecGS); GSOS $2005 ;
|
||||||
|
|
||||||
|
PROCEDURE SetLevelGS (VAR pblockPtr: LevelRecGS); GSOS $201A ;
|
||||||
|
|
||||||
|
PROCEDURE SetMarkGS (VAR pblockPtr: SetPositionRecGS); GSOS $2016 ;
|
||||||
|
|
||||||
|
PROCEDURE SetPrefixGS (VAR pblockPtr: PrefixRecGS); GSOS $2009 ;
|
||||||
|
|
||||||
|
PROCEDURE SetSysPrefsGS (VAR pblockPtr: SysPrefsRecGS); GSOS $200C ;
|
||||||
|
|
||||||
|
PROCEDURE UnbindIntGS (VAR pblockPtr: InterruptRecGS); GSOS $2032 ;
|
||||||
|
|
||||||
|
PROCEDURE VolumeGS (VAR pblockPtr: VolumeRecGS); GSOS $2008 ;
|
||||||
|
|
||||||
|
PROCEDURE WriteGS (VAR pblockPtr: IORecGS); GSOS $2013 ;
|
||||||
|
|
||||||
|
PROCEDURE OSShutdownGS (VAR pblockPtr: OSShutdownRecGS); GSOS $2003 ;
|
||||||
|
|
||||||
|
PROCEDURE FSTSpecific (VAR pBlockPtr: Ptr); GSOS $2033 ;
|
||||||
|
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
111
pascal/intmath.p
Executable file
111
pascal/intmath.p
Executable file
|
@ -0,0 +1,111 @@
|
||||||
|
{********************************************
|
||||||
|
; File: IntMath.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT INTMATH;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
imBadInptParam = $0B01; {error - bad input parameter }
|
||||||
|
imIllegalChar = $0B02; {error - Illegal character in string }
|
||||||
|
imOverflow = $0B03; {error - integer or long integer overflow }
|
||||||
|
imStrOverflow = $0B04; {error - string overflow }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
minLongint = $80000000; {Limit - minimum negative signed long integer }
|
||||||
|
minFrac = $80000000; {Limit - pinned value for negative Frac overflow }
|
||||||
|
minFixed = $80000000; {Limit - pinned value for negative Fixed overflow }
|
||||||
|
minInt = $8000; {Limit - Minimum negative signed integer }
|
||||||
|
maxInt = $7FFF; {Limit - Maximum positive signed integer }
|
||||||
|
maxUInt = $FFFF; {Limit - Maximum positive unsigned integer }
|
||||||
|
maxLongint = $7FFFFFFF; {Limit - maximum positive signed Longint }
|
||||||
|
maxFrac = $7FFFFFFF; {Limit - pinned value for positive Frac overflow }
|
||||||
|
maxFixed = $7FFFFFFF; {Limit - pinned value for positive Fixed overflow }
|
||||||
|
maxULong = $FFFFFFFF; {Limit - maximum unsigned Long }
|
||||||
|
unsignedFlag = $0000; {SignedFlag - }
|
||||||
|
signedFlag = $0001; {SignedFlag - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
IntDivRecPtr = ^IntDivRec;
|
||||||
|
IntDivRec = RECORD
|
||||||
|
quotient : Integer; { quotient from SDivide }
|
||||||
|
remainder : Integer; { remainder from SDivide }
|
||||||
|
END;
|
||||||
|
LongDivRecPtr = ^LongDivRec;
|
||||||
|
LongDivRec = RECORD
|
||||||
|
quotient : Longint; { Quotient from LongDiv }
|
||||||
|
remainder : Longint; { remainder from LongDiv }
|
||||||
|
END;
|
||||||
|
DivRecPtr = ^DivRec; (* for backward compatability *)
|
||||||
|
DivRec = LongDivRec;
|
||||||
|
LongMulRecPtr = ^LongMulRec;
|
||||||
|
LongMulRec = RECORD
|
||||||
|
lsResult : Longint; { low 2 words of product }
|
||||||
|
msResult : Longint; { High 2 words of product }
|
||||||
|
END;
|
||||||
|
WordDivRecPtr = ^WordDivRec;
|
||||||
|
WordDivRec = RECORD
|
||||||
|
quotient : Integer; { Quotient from UDivide }
|
||||||
|
remainder : Integer; { remainder from UDivide }
|
||||||
|
END;
|
||||||
|
PROCEDURE IMBootInit ; Tool $0B,$01;
|
||||||
|
PROCEDURE IMStartUp ; Tool $0B,$02;
|
||||||
|
PROCEDURE IMShutDown ; Tool $0B,$03;
|
||||||
|
FUNCTION IMVersion : Integer ; Tool $0B,$04;
|
||||||
|
PROCEDURE IMReset ; Tool $0B,$05;
|
||||||
|
FUNCTION IMStatus : Boolean ; Tool $0B,$06;
|
||||||
|
FUNCTION Dec2Int ( strPtr:Ptr; strLength:Integer; signedFlag:Boolean) : Integer
|
||||||
|
; Tool $0B,$28;
|
||||||
|
FUNCTION Dec2Long ( strPtr:Ptr; strLength:Integer; signedFlag:Boolean) :
|
||||||
|
Longint ; Tool $0B,$29;
|
||||||
|
FUNCTION Fix2Frac ( fixedValue:Fixed) : Frac ; Tool $0B,$1C;
|
||||||
|
FUNCTION Fix2Long ( fixedValue:Fixed) : Longint ; Tool $0B,$1B;
|
||||||
|
PROCEDURE Fix2X ( fixedValue:Fixed;VAR extendPtr:Extended) ; Tool $0B,$1E;
|
||||||
|
FUNCTION FixATan2 ( input1:Longint; input2:Longint) : Fixed ; Tool $0B,$17;
|
||||||
|
FUNCTION FixDiv ( dividend:Longint; divisor:Longint) : Fixed ; Tool $0B,$11;
|
||||||
|
FUNCTION FixMul ( multiplicand:Fixed; multiplier:Fixed) : Fixed ; Tool $0B,$0F;
|
||||||
|
FUNCTION FixRatio ( numerator:Integer; denominator:Integer) : Fixed ; Tool
|
||||||
|
$0B,$0E;
|
||||||
|
FUNCTION FixRound ( fixedValue:Fixed) : Integer ; Tool $0B,$13;
|
||||||
|
FUNCTION Frac2Fix ( fracValue:Frac) : Fixed ; Tool $0B,$1D;
|
||||||
|
PROCEDURE Frac2X ( fracValue:Frac;VAR extendPtr:Extended) ; Tool $0B,$1F;
|
||||||
|
FUNCTION FracCos ( angle:Fixed) : Frac ; Tool $0B,$15;
|
||||||
|
FUNCTION FracDiv ( dividend:Longint; divisor:Longint) : Frac ; Tool $0B,$12;
|
||||||
|
FUNCTION FracMul ( multiplicand:Frac; multiplier:Frac) : Frac ; Tool $0B,$10;
|
||||||
|
FUNCTION FracSin ( angle:Fixed) : Frac ; Tool $0B,$16;
|
||||||
|
FUNCTION FracSqrt ( fracValue:Frac) : Frac ; Tool $0B,$14;
|
||||||
|
FUNCTION Hex2Int ( strPtr:Ptr; strLength:Integer) : Integer ; Tool $0B,$24;
|
||||||
|
FUNCTION Hex2Long ( strPtr:Ptr; strLength:Integer) : Longint ; Tool $0B,$25;
|
||||||
|
FUNCTION HexIt ( intValue:Integer) : Longint ; Tool $0B,$2A;
|
||||||
|
FUNCTION HiWord ( longValue:Longint) : Integer ; Tool $0B,$18;
|
||||||
|
PROCEDURE Int2Dec ( wordValue:Integer; strPtr:Ptr; strLength:Integer;
|
||||||
|
signedFlag:Boolean) ; Tool $0B,$26;
|
||||||
|
PROCEDURE Int2Hex ( intValue:Integer; strPtr:Ptr; strLength:Integer) ; Tool
|
||||||
|
$0B,$22;
|
||||||
|
PROCEDURE Long2Dec ( longValue:Longint; strPtr:Ptr; strLength:Integer;
|
||||||
|
signedFlag:Boolean) ; Tool $0B,$27;
|
||||||
|
FUNCTION Long2Fix ( longValue:Longint) : Fixed ; Tool $0B,$1A;
|
||||||
|
PROCEDURE Long2Hex ( longValue:Longint; strPtr:Ptr; strLength:Integer) ; Tool
|
||||||
|
$0B,$23;
|
||||||
|
FUNCTION LongDivide ( dividend:Longint; divisor:Longint) : LongDivRec ;
|
||||||
|
EXTERNAL ;
|
||||||
|
FUNCTION LongMul ( multiplicand:Longint; multiplier:Longint) : LongMulRec ;
|
||||||
|
EXTERNAL ;
|
||||||
|
FUNCTION LoWord ( longValue:Longint) : Integer ; Tool $0B,$19;
|
||||||
|
FUNCTION Multiply ( multiplicand:Integer; multiplier:Integer) : Longint ; Tool
|
||||||
|
$0B,$09;
|
||||||
|
FUNCTION SDivide ( dividend:Integer; divisor:Integer) : IntDivRec ; Tool
|
||||||
|
$0B,$0A;
|
||||||
|
FUNCTION UDivide ( dividend:Integer; divisor:Integer) : WordDivRec ; Tool
|
||||||
|
$0B,$0B;
|
||||||
|
FUNCTION X2Fix ( extendPtr:ExtendedPtr) : Longint ; Tool $0B,$20;
|
||||||
|
FUNCTION X2Frac ( extendPtr:ExtendedPtr) : Longint ; Tool $0B,$21;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
95
pascal/lineedit.p
Executable file
95
pascal/lineedit.p
Executable file
|
@ -0,0 +1,95 @@
|
||||||
|
{********************************************
|
||||||
|
; File: LineEdit.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT LINEEDIT;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,QUICKDRAW,EVENTS;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
leDupStrtUpErr = $1401; {error - duplicate LEStartup call }
|
||||||
|
leResetErr = $1402; {error - can't reset Line Edit }
|
||||||
|
leNotActiveErr = $1403; {error - Line Edit not active }
|
||||||
|
leScrapErr = $1404; {error - desk scrap too big to copy }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
leJustLeft = $0000; {Justification - }
|
||||||
|
leJustCenter = $0001; {Justification - }
|
||||||
|
leJustFill = $0002; {Justification - }
|
||||||
|
leJustRight = $FFFF; {Justification - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
LERecHndl = ^LERecPtr;
|
||||||
|
LERecPtr = ^LERec;
|
||||||
|
LERec = RECORD
|
||||||
|
leLineHandle : Handle;
|
||||||
|
leLength : Integer;
|
||||||
|
leMaxLength : Integer;
|
||||||
|
leDestRect : Rect;
|
||||||
|
leViewRect : Rect;
|
||||||
|
lePort : GrafPortPtr;
|
||||||
|
leLineHite : Integer;
|
||||||
|
leBaseHite : Integer;
|
||||||
|
leSelStart : Integer;
|
||||||
|
leSelEnd : Integer;
|
||||||
|
leActFlg : Integer;
|
||||||
|
leCarAct : Integer;
|
||||||
|
leCarOn : Integer;
|
||||||
|
leCarTime : Longint;
|
||||||
|
leHiliteHook : VoidProcPtr;
|
||||||
|
leCaretHook : VoidProcPtr;
|
||||||
|
leJust : Integer;
|
||||||
|
lePWChar : Integer;
|
||||||
|
END;
|
||||||
|
PROCEDURE LEBootInit ; Tool $14,$01;
|
||||||
|
PROCEDURE LEStartUp ( userID:Integer; dPageAddr:Integer) ; Tool $14,$02;
|
||||||
|
PROCEDURE LEShutDown ; Tool $14,$03;
|
||||||
|
FUNCTION LEVersion : Integer ; Tool $14,$04;
|
||||||
|
PROCEDURE LEReset ; Tool $14,$05;
|
||||||
|
FUNCTION LEStatus : Boolean ; Tool $14,$06;
|
||||||
|
PROCEDURE LEActivate ( leRecHandle:LERecHndl) ; Tool $14,$0F;
|
||||||
|
PROCEDURE LEClick ( eventPtr:EventRecord; leRecHandle:LERecHndl) ; Tool
|
||||||
|
$14,$0D;
|
||||||
|
PROCEDURE LECopy ( leRecHandle:LERecHndl) ; Tool $14,$13;
|
||||||
|
PROCEDURE LECut ( leRecHandle:LERecHndl) ; Tool $14,$12;
|
||||||
|
PROCEDURE LEDeactivate ( leRecHandle:LERecHndl) ; Tool $14,$10;
|
||||||
|
PROCEDURE LEDelete ( leRecHandle:LERecHndl) ; Tool $14,$15;
|
||||||
|
PROCEDURE LEDispose ( leRecHandle:LERecHndl) ; Tool $14,$0A;
|
||||||
|
PROCEDURE LEFromScrap ; Tool $14,$19;
|
||||||
|
FUNCTION LEGetScrapLen : Integer ; Tool $14,$1C;
|
||||||
|
FUNCTION LEGetTextHand ( leRecHandle:LERecHndl) : Handle ; Tool $14,$22;
|
||||||
|
FUNCTION LEGetTextLen ( leRecHandle:LERecHndl) : Integer ; Tool $14,$23;
|
||||||
|
PROCEDURE LEIdle ( leRecHandle:LERecHndl) ; Tool $14,$0C;
|
||||||
|
PROCEDURE LEInsert ( textPtr:Ptr; textLength:Integer; leRecHandle:LERecHndl) ;
|
||||||
|
Tool $14,$16;
|
||||||
|
PROCEDURE LEKey ( theKey:CHAR; modifiers:Integer; leRecHandle:LERecHndl) ;
|
||||||
|
Tool $14,$11;
|
||||||
|
FUNCTION LENew ( destRectPtr:Rect; viewRectPtr:Rect; maxTextLen:Integer) :
|
||||||
|
LERecHndl ; Tool $14,$09;
|
||||||
|
PROCEDURE LEPaste ( leRecHandle:LERecHndl) ; Tool $14,$14;
|
||||||
|
FUNCTION LEScrapHandle : Handle ; Tool $14,$1B;
|
||||||
|
PROCEDURE LESetCaret ( caretProcPtr:VoidProcPtr; leRecHandle:LERecHndl) ; Tool
|
||||||
|
$14,$1F;
|
||||||
|
PROCEDURE LESetHilite ( hiliteProcPtr:VoidProcPtr; leRecHandle:LERecHndl) ;
|
||||||
|
Tool $14,$1E;
|
||||||
|
PROCEDURE LESetJust ( just:Integer; leRecHandle:LERecHndl) ; Tool $14,$21;
|
||||||
|
PROCEDURE LESetScrapLen ( newLength:Integer) ; Tool $14,$1D;
|
||||||
|
PROCEDURE LESetSelect ( selStart:Integer; selEnd:Integer;
|
||||||
|
leRecHandle:LERecHndl) ; Tool $14,$0E;
|
||||||
|
PROCEDURE LESetText ( textPtr:Ptr; textLength:Integer; leRecHandle:LERecHndl)
|
||||||
|
; Tool $14,$0B;
|
||||||
|
PROCEDURE LETextBox ( textPtr:Ptr; textLength:Integer; rectPtr:Rect;
|
||||||
|
just:Integer) ; Tool $14,$18;
|
||||||
|
PROCEDURE LETextBox2 ( textPtr:Ptr; textLength:Integer; rectPtr:Rect;
|
||||||
|
just:Integer) ; Tool $14,$20;
|
||||||
|
PROCEDURE LEToScrap ; Tool $14,$1A;
|
||||||
|
PROCEDURE LEUpdate ( leRecHandle:LERecHndl) ; Tool $14,$17;
|
||||||
|
FUNCTION GetLEDefProc : Ptr ; Tool $14,$24;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
106
pascal/lists.p
Executable file
106
pascal/lists.p
Executable file
|
@ -0,0 +1,106 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Lists.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT LISTS;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,QUICKDRAW,EVENTS,CONTROLS;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
cString = $0001; {ListType bit mask - null terminated string type }
|
||||||
|
LIST_STRG = $0001; {ListType bit mask - null terminated string type }
|
||||||
|
selectOnlyOne = $0002; {ListType bit mask - only one selection allowed }
|
||||||
|
LIST_SELECT = $0002; {ListType bit mask - single selection only }
|
||||||
|
memDisabled = $40; {memFlag - Sets member flag to disabled }
|
||||||
|
memSelected = $80; {memFlag - Sets member flag to selected }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
LColorTableHndl = ^LColorTablePtr;
|
||||||
|
LColorTablePtr = ^LColorTable;
|
||||||
|
LColorTable = RECORD
|
||||||
|
listFrameClr : Integer; { Frame color }
|
||||||
|
listNorTextClr : Integer; { Unhighlighted text color }
|
||||||
|
listSelTextClr : Integer; { Highlighted text color }
|
||||||
|
listNorBackClr : Integer; { Unhighlighted background color }
|
||||||
|
listSelBackClr : Integer; { Highlighted backgraound color }
|
||||||
|
END;
|
||||||
|
MemRecHndl = ^MemRecPtr;
|
||||||
|
MemRecPtr = ^MemRec;
|
||||||
|
MemRec = PACKED RECORD
|
||||||
|
memPtr : Ptr; { Pointer to string, or custom }
|
||||||
|
memFlag : Byte; { Bit Flag }
|
||||||
|
END;
|
||||||
|
ListCtlRecHndl = ^ListCtlRecPtr;
|
||||||
|
ListCtlRecPtr = ^ListCtlRec;
|
||||||
|
ListCtlRec = PACKED RECORD
|
||||||
|
ctlNext : CtlRecHndl; { Handle of Next Control }
|
||||||
|
ctlOwner : GrafPortPtr; { Window owner }
|
||||||
|
ctlRect : Rect; { Enclosing Rect }
|
||||||
|
ctlFlag : Byte; { Bit 7 visible, Bit 0 string type, Bit 1 multiple }
|
||||||
|
ctlHilite : Byte; { (not used) }
|
||||||
|
ctlValue : Integer; { First member in display }
|
||||||
|
ctlProc : LongProcPtr; { Address of list definition procedure }
|
||||||
|
ctlAction : LongProcPtr; { Address of list action procedure }
|
||||||
|
ctlData : Longint; { Low = view size, High = total members }
|
||||||
|
ctlRefCon : Longint; { Not used }
|
||||||
|
ctlColor : LColorTablePtr; { Null for default colors }
|
||||||
|
ctlMemDraw : VoidProcPtr; { Address of routine to draw members }
|
||||||
|
ctlMemHeight : Integer; { Member's Height in Pixels }
|
||||||
|
ctlMemSize : Integer; { Bytes in member record }
|
||||||
|
ctlList : MemRecPtr; { Adress of first member record in array }
|
||||||
|
ctlListBar : CtlRecHndl; { Handle of list contrlo's scroll bar control }
|
||||||
|
END;
|
||||||
|
ListRecHndl = ^ListRecPtr;
|
||||||
|
ListRecPtr = ^ListRec;
|
||||||
|
ListRec = RECORD
|
||||||
|
listRect : Rect; { Enclosing Rectangle }
|
||||||
|
listSize : Integer; { Number of List Members }
|
||||||
|
listView : Integer; { Max Viewable members }
|
||||||
|
listType : Integer; { Bit Flag }
|
||||||
|
listStart : Integer; { First member in view }
|
||||||
|
listCtl : CtlRecHndl; { List control's handle }
|
||||||
|
listDraw : VoidProcPtr; { Address of Custom drawing routine }
|
||||||
|
listMemHeight : Integer; { Height of list members }
|
||||||
|
listMemSize : Integer; { Size of Member Records }
|
||||||
|
listPointer : MemRecPtr; { Pointer to first element in MemRec array }
|
||||||
|
listRefCon : Longint; { becomes Control's refCon }
|
||||||
|
listScrollClr : BarColorsPtr; { Color table for list's scroll bar }
|
||||||
|
END;
|
||||||
|
PROCEDURE ListBootInit ; Tool $1C,$01;
|
||||||
|
PROCEDURE ListStartup ; Tool $1C,$02;
|
||||||
|
PROCEDURE ListShutDown ; Tool $1C,$03;
|
||||||
|
FUNCTION ListVersion : Integer ; Tool $1C,$04;
|
||||||
|
PROCEDURE ListReset ; Tool $1C,$05;
|
||||||
|
FUNCTION ListStatus : Boolean ; Tool $1C,$06;
|
||||||
|
FUNCTION CreateList ( theWindowPtr:WindowPtr; U__listRecPtr:ListRecPtr) :
|
||||||
|
ListCtlRecHndl ; Tool $1C,$09;
|
||||||
|
PROCEDURE DrawMember ( memberPtr:MemRecPtr; U__listRecPtr:ListRecPtr) ; Tool
|
||||||
|
$1C,$0C;
|
||||||
|
FUNCTION GetListDefProc : LongProcPtr ; Tool $1C,$0E;
|
||||||
|
PROCEDURE NewList ( memberPtr:MemRecPtr; U__listRecPtr:ListRecPtr) ; Tool
|
||||||
|
$1C,$10;
|
||||||
|
FUNCTION NextMember ( memberPtr:MemRecPtr; U__listRecPtr:ListRecPtr) :
|
||||||
|
MemRecPtr ; Tool $1C,$0B;
|
||||||
|
FUNCTION ResetMember ( U__listRecPtr:ListRecPtr) : MemRecPtr ; Tool $1C,$0F;
|
||||||
|
PROCEDURE SelectMember ( memberPtr:MemRecPtr; U__listRecPtr:ListRecPtr) ; Tool
|
||||||
|
$1C,$0D;
|
||||||
|
PROCEDURE SortList ( comparePtr:VoidProcPtr; U__listRecPtr:ListRecPtr) ; Tool
|
||||||
|
$1C,$0A;
|
||||||
|
PROCEDURE DrawMember2 ( itemNumber:Integer; ctlHandle:CtlRecHndl) ; Tool
|
||||||
|
$1C,$11;
|
||||||
|
FUNCTION NextMember2 ( itemNumber:Integer; ctlHandle:CtlRecHndl) : Integer ;
|
||||||
|
Tool $1C,$12;
|
||||||
|
FUNCTION ResetMember2 ( ctlHandle:CtlRecHndl) : Integer ; Tool $1C,$13;
|
||||||
|
PROCEDURE SelectMember2 ( itemNumber:Integer; ctlHandle:CtlRecHndl) ; Tool
|
||||||
|
$1C,$14;
|
||||||
|
PROCEDURE SortList2 ( comparePtr:Ptr; ctlHandle:CtlRecHndl) ; Tool $1C,$15;
|
||||||
|
PROCEDURE NewList2 ( drawProcPtr:ProcPtr; listStart:Integer; listRef:Ref;
|
||||||
|
listRefDesc:RefDescriptor; listSize:Integer; ctlHandle:CtlRecHndl) ; Tool
|
||||||
|
$1C,$16;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
87
pascal/loader.p
Executable file
87
pascal/loader.p
Executable file
|
@ -0,0 +1,87 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Loader.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT LOADER;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
CONST
|
||||||
|
idNotFound = $1101; {error - segment/application/entry not found }
|
||||||
|
idNotLoadFile = $1104; {error - file is not a load file }
|
||||||
|
idBusyErr = $1105; {error - system loader is busy }
|
||||||
|
idFilVersErr = $1107; {error - file version error }
|
||||||
|
idUserIDErr = $1108; {error - user ID error }
|
||||||
|
idSequenceErr = $1109; {error - segnum out of sequence }
|
||||||
|
idBadRecordErr = $110A; {error - illegal load record found }
|
||||||
|
idForeignSegErr = $110B; {error - segment is foreign }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
InitialLoadOutputRecPtr = ^InitialLoadOutputRec;
|
||||||
|
InitialLoadOutputRec = RECORD
|
||||||
|
userID : Integer;
|
||||||
|
startAddr : Ptr;
|
||||||
|
dPageAddr : Integer;
|
||||||
|
buffSize : Integer;
|
||||||
|
END;
|
||||||
|
RestartOutRecPtr = ^RestartOutRec;
|
||||||
|
RestartOutRec = RECORD
|
||||||
|
userID : Integer;
|
||||||
|
startAddr : Ptr;
|
||||||
|
dPageAddr : Integer;
|
||||||
|
buffSize : Integer;
|
||||||
|
END;
|
||||||
|
LoadSegNameOutPtr = ^LoadSegNameOut;
|
||||||
|
LoadSegNameOut = RECORD
|
||||||
|
segAddr : Ptr;
|
||||||
|
fileNum : Integer;
|
||||||
|
segNum : Integer;
|
||||||
|
END;
|
||||||
|
UnloadSegOutRecPtr = ^UnloadSegOutRec;
|
||||||
|
UnloadSegOutRec = RECORD
|
||||||
|
userID : Integer;
|
||||||
|
fileNum : Integer;
|
||||||
|
segNum : Integer;
|
||||||
|
END;
|
||||||
|
PROCEDURE LoaderInitialization ; Tool $11,$01;
|
||||||
|
PROCEDURE LoaderStartUp ; Tool $11,$02;
|
||||||
|
PROCEDURE LoaderShutDown ; Tool $11,$03;
|
||||||
|
FUNCTION LoaderVersion : Integer ; Tool $11,$04;
|
||||||
|
PROCEDURE LoaderReset ; Tool $11,$05;
|
||||||
|
FUNCTION LoaderStatus : Boolean ; Tool $11,$06;
|
||||||
|
PROCEDURE GetLoadSegInfo ( userID:Integer; loadFileNum:Integer;
|
||||||
|
loadSegNum:Integer; bufferPtr:Ptr) ; Tool $11,$0F;
|
||||||
|
FUNCTION GetUserID ( pathNamePtr:Ptr) : Integer ; Tool $11,$10;
|
||||||
|
FUNCTION GetUserID2 ( pathNamePtr:Ptr) : Integer ; Tool $11,$21;
|
||||||
|
FUNCTION InitialLoad ( userID:Integer; loadFileNamePtr:Ptr; spMemFlag:Boolean)
|
||||||
|
: InitialLoadOutputRec ; EXTERNAL ;
|
||||||
|
FUNCTION InitialLoad2 ( userID:Integer; loadFileNamePtr:Ptr; spMemFlag:Boolean;
|
||||||
|
inputType:Integer) : InitialLoadOutputRec ; EXTERNAL ;
|
||||||
|
FUNCTION LGetPathname ( userID:Integer; fileNumber:Integer) : Ptr ; Tool
|
||||||
|
$11,$11;
|
||||||
|
FUNCTION LGetPathname2 ( userID:Integer; fileNumber:Integer) : Ptr ; Tool
|
||||||
|
$11,$22;
|
||||||
|
FUNCTION GetPathname ( userID:Integer; fileNumber:Integer) : Ptr ; Tool
|
||||||
|
$11,$11;
|
||||||
|
FUNCTION GetPathname2 ( userID:Integer; fileNumber:Integer) : Ptr ; Tool
|
||||||
|
$11,$22;
|
||||||
|
PROCEDURE RenamePathname ( oldPathname:Ptr; newPathname:Ptr) ; Tool $11,$13;
|
||||||
|
FUNCTION LoadSegName ( userID:Integer; loadFileNamePtr:Ptr; loadSegNamePtr:Ptr)
|
||||||
|
: LoadSegNameOut ; EXTERNAL ;
|
||||||
|
FUNCTION LoadSegNum ( userID:Integer; loadFileNum:Integer; loadSegNum:Integer)
|
||||||
|
: Ptr ; Tool $11,$0B;
|
||||||
|
FUNCTION Restart ( userID:Integer) : RestartOutRec ; EXTERNAL ;
|
||||||
|
FUNCTION UnloadSeg ( segmentPtr:Ptr) : UnloadSegOutRec ; EXTERNAL ;
|
||||||
|
PROCEDURE UnloadSegNum ( userID:Integer; loadFileNum:Integer;
|
||||||
|
loadSegNum:Integer) ; Tool $11,$0C;
|
||||||
|
FUNCTION UserShutDown ( userID:Integer; restartFlag:Integer) : Integer ; Tool
|
||||||
|
$11,$12;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
87
pascal/locator.p
Executable file
87
pascal/locator.p
Executable file
|
@ -0,0 +1,87 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Locator.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT LOCATOR;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
toolNotFoundErr = $0001; {error - }
|
||||||
|
funcNotFoundErr = $0002; {error - }
|
||||||
|
toolVersionErr = $0110; {error - }
|
||||||
|
sysStrtMtErr = $0100; {error - can't mount system startup volume }
|
||||||
|
messNotFoundErr = $0111; {error - }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
fileInfoType = $0001; {MessageCenter - Message type parameter }
|
||||||
|
addMessage = $0001; {MessageCenter - action parameter }
|
||||||
|
getMessage = $0002; {MessageCenter - action parameter }
|
||||||
|
deleteMessage = $0003; {MessageCenter - action parameter }
|
||||||
|
mvReturn = $0001; {TLMountVolume - like ok for dialogs }
|
||||||
|
mvEscape = $0002; {TLMountVolume - like cancel for dialogs }
|
||||||
|
sysTool = $0000; {Tool Set Spec - }
|
||||||
|
userTool = $8000; {Tool Set Spec - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
MessageRecHndl = ^MessageRecPtr;
|
||||||
|
MessageRecPtr = ^MessageRec;
|
||||||
|
MessageRec = RECORD
|
||||||
|
messageNext : MessageRecHndl;
|
||||||
|
messageType : Integer;
|
||||||
|
messageData : Integer;
|
||||||
|
fileNames : PACKED ARRAY[1..1] OF Str255;
|
||||||
|
END;
|
||||||
|
ToolSpec = RECORD
|
||||||
|
toolNumber : Integer;
|
||||||
|
minVersion : Integer;
|
||||||
|
END;
|
||||||
|
StartStopRecordPtr = ^StartStopRecord;
|
||||||
|
StartStopRecord = RECORD
|
||||||
|
flags : Integer;
|
||||||
|
videoMode : Integer;
|
||||||
|
resFileID : Integer;
|
||||||
|
dPageHandle : Handle;
|
||||||
|
numTools : Integer;
|
||||||
|
END;
|
||||||
|
PROCEDURE TLBootInit ; Tool $01,$01;
|
||||||
|
PROCEDURE TLStartUp ; Tool $01,$02;
|
||||||
|
PROCEDURE TLShutDown ; Tool $01,$03;
|
||||||
|
FUNCTION TLVersion : Integer ; Tool $01,$04;
|
||||||
|
PROCEDURE TLReset ; Tool $01,$05;
|
||||||
|
FUNCTION TLStatus : Boolean ; Tool $01,$06;
|
||||||
|
FUNCTION GetFuncPtr ( userOrSystem:Integer; funcTSNum:Integer) : Ptr ; Tool
|
||||||
|
$01,$0B;
|
||||||
|
FUNCTION GetTSPtr ( userOrSystem:Integer; tSNum:Integer) : Ptr ; Tool $01,$09;
|
||||||
|
FUNCTION GetWAP ( userOrSystem:Integer; tSNum:Integer) : Ptr ; Tool $01,$0C;
|
||||||
|
PROCEDURE LoadOneTool ( toolNumber:Integer; minVersion:Integer) ; Tool
|
||||||
|
$01,$0F;
|
||||||
|
PROCEDURE LoadTools ( toolTablePtr:Ptr) ; Tool $01,$0E;
|
||||||
|
PROCEDURE MessageCenter ( action:Integer; messagetype:Integer;
|
||||||
|
messageHandle:MessageRecHndl) ; Tool $01,$15;
|
||||||
|
PROCEDURE RestoreTextState ( stateHandle:Handle) ; Tool $01,$14;
|
||||||
|
FUNCTION SaveTextState : Handle ; Tool $01,$13;
|
||||||
|
PROCEDURE SetDefaultTPT ; Tool $01,$16;
|
||||||
|
PROCEDURE SetTSPtr ( userOrSystem:Integer; tsNum:Integer; fptablePtr:FPTPtr) ;
|
||||||
|
Tool $01,$0A;
|
||||||
|
PROCEDURE SetWAP ( userOrSystem:Integer; tSNum:Integer; waptPtr:Ptr) ; Tool
|
||||||
|
$01,$0D;
|
||||||
|
FUNCTION TLMountVolume ( whereX:Integer; whereY:Integer; line1:Str255;
|
||||||
|
line2:Str255; but1:Str255; but2:Str255) : Integer ; Tool $01,$11;
|
||||||
|
FUNCTION TLTextMountVolume ( line1:Str255; line2:Str255; but1:Str255;
|
||||||
|
but2:Str255) : Integer ; Tool $01,$12;
|
||||||
|
PROCEDURE UnloadOneTool ( toolNumber:Integer) ; Tool $01,$10;
|
||||||
|
FUNCTION StartUpTools ( userID:Integer; startStopRefDesc:RefDescriptor;
|
||||||
|
startStopRef:Ref) : Ref ; Tool $01,$18;
|
||||||
|
PROCEDURE ShutDownTools ( startStopDesc:RefDescriptor; startStopRef:Ref) ;
|
||||||
|
Tool $01,$19;
|
||||||
|
FUNCTION MessageByName ( createItFlag:Boolean; recordPtr:Ptr) : Longint ; Tool
|
||||||
|
$01,$17;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
80
pascal/memory.p
Executable file
80
pascal/memory.p
Executable file
|
@ -0,0 +1,80 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Memory.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT MEMORY;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
memErr = $0201; {error - unable to allocate block }
|
||||||
|
emptyErr = $0202; {error - illegal operation, empty handle }
|
||||||
|
notEmptyErr = $0203; {error - an empty handle was expected for this operation }
|
||||||
|
lockErr = $0204; {error - illegal operation on a locked block }
|
||||||
|
purgeErr = $0205; {error - attempt to purge an unpurgable block }
|
||||||
|
handleErr = $0206; {error - an invalid handle was given }
|
||||||
|
idErr = $0207; {error - an invalid owner ID was given }
|
||||||
|
attrErr = $0208; {error - operation illegal on block with given attributes }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
attrNoPurge = $0000; {Handle Attribute Bits - Not purgeable }
|
||||||
|
attrBank = $0001; {Handle Attribute Bits - fixed bank }
|
||||||
|
attrAddr = $0002; {Handle Attribute Bits - fixed address }
|
||||||
|
attrPage = $0004; {Handle Attribute Bits - page aligned }
|
||||||
|
attrNoSpec = $0008; {Handle Attribute Bits - may not use special memory }
|
||||||
|
attrNoCross = $0010; {Handle Attribute Bits - may not cross banks }
|
||||||
|
attrPurge1 = $0100; {Handle Attribute Bits - Purge level 1 }
|
||||||
|
attrPurge2 = $0200; {Handle Attribute Bits - Purge level 2 }
|
||||||
|
attrPurge3 = $0300; {Handle Attribute Bits - Purge level 3 }
|
||||||
|
attrPurge = $0300; {Handle Attribute Bits - test or set both purge bits }
|
||||||
|
attrHandle = $1000; {Handle Attribute Bits - block of master pointers }
|
||||||
|
attrSystem = $2000; {Handle Attribute Bits - system handle }
|
||||||
|
attrFixed = $4000; {Handle Attribute Bits - not movable }
|
||||||
|
attrLocked = $8000; {Handle Attribute Bits - locked }
|
||||||
|
PROCEDURE MMBootInit ; Tool $02,$01;
|
||||||
|
FUNCTION MMStartUp : Integer ; Tool $02,$02;
|
||||||
|
PROCEDURE MMShutDown ( userID:Integer) ; Tool $02,$03;
|
||||||
|
FUNCTION MMVersion : Integer ; Tool $02,$04;
|
||||||
|
PROCEDURE MMReset ; Tool $02,$05;
|
||||||
|
FUNCTION MMStatus : Boolean ; Tool $02,$06;
|
||||||
|
PROCEDURE BlockMove ( srcPtr:Ptr; dstPtr:Ptr; count:Longint) ; Tool $02,$2B;
|
||||||
|
PROCEDURE CheckHandle ( theHandle:Handle) ; Tool $02,$1E;
|
||||||
|
PROCEDURE CompactMem ; Tool $02,$1F;
|
||||||
|
PROCEDURE DisposeAll ( userID:Integer) ; Tool $02,$11;
|
||||||
|
PROCEDURE DisposeHandle ( theHandle:Handle) ; Tool $02,$10;
|
||||||
|
FUNCTION FindHandle ( locationPtr:Ptr) : Handle ; Tool $02,$1A;
|
||||||
|
FUNCTION FreeMem : Longint ; Tool $02,$1B;
|
||||||
|
FUNCTION GetHandleSize ( theHandle:Handle) : Longint ; Tool $02,$18;
|
||||||
|
PROCEDURE HandToHand ( sourceHandle:Handle; destHandle:Handle; count:Longint)
|
||||||
|
; Tool $02,$2A;
|
||||||
|
PROCEDURE HandToPtr ( sourceHandle:Handle; destPtr:Ptr; count:Longint) ; Tool
|
||||||
|
$02,$29;
|
||||||
|
PROCEDURE HLock ( theHandle:Handle) ; Tool $02,$20;
|
||||||
|
PROCEDURE HLockAll ( userID:Integer) ; Tool $02,$21;
|
||||||
|
PROCEDURE HUnlock ( theHandle:Handle) ; Tool $02,$22;
|
||||||
|
PROCEDURE HUnlockAll ( userID:Integer) ; Tool $02,$23;
|
||||||
|
FUNCTION MaxBlock : Longint ; Tool $02,$1C;
|
||||||
|
FUNCTION NewHandle ( blockSize:Longint; userID:Integer; attributes:Integer;
|
||||||
|
locationPtr:Ptr) : Handle ; Tool $02,$09;
|
||||||
|
PROCEDURE PtrToHand ( sourcePtr:Ptr; destHandle:Handle; count:Longint) ; Tool
|
||||||
|
$02,$28;
|
||||||
|
PROCEDURE PurgeAll ( userID:Integer) ; Tool $02,$13;
|
||||||
|
PROCEDURE PurgeHandle ( theHandle:Handle) ; Tool $02,$12;
|
||||||
|
FUNCTION RealFreeMem : Longint ; Tool $02,$2F;
|
||||||
|
PROCEDURE ReallocHandle ( blockSize:Longint; userID:Integer;
|
||||||
|
attributes:Integer; locationPtr:Ptr; theHandle:Handle) ; Tool $02,$0A;
|
||||||
|
PROCEDURE RestoreHandle ( theHandle:Handle) ; Tool $02,$0B;
|
||||||
|
PROCEDURE SetHandleSize ( newSize:Longint; theHandle:Handle) ; Tool $02,$19;
|
||||||
|
PROCEDURE SetPurge ( newPurgeLevel:Integer; theHandle:Handle) ; Tool $02,$24;
|
||||||
|
PROCEDURE SetPurgeAll ( newPurgeLevel:Integer; userID:Integer) ; Tool $02,$25;
|
||||||
|
FUNCTION TotalMem : Longint ; Tool $02,$1D;
|
||||||
|
PROCEDURE AddToOOMQueue ( headerPtr:Ptr) ; Tool $02,$0C;
|
||||||
|
PROCEDURE DeleteFromOOMQueue ( headerPtr:Ptr) ; Tool $02,$0D;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
142
pascal/menus.p
Executable file
142
pascal/menus.p
Executable file
|
@ -0,0 +1,142 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Menus.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT MENUS;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,QUICKDRAW,EVENTS,CONTROLS,WINDOWS;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
mDrawMsg = $0000; {MenuDefProcCodes - }
|
||||||
|
mChooseMsg = $0001; {MenuDefProcCodes - }
|
||||||
|
mSizeMsg = $0002; {MenuDefProcCodes - }
|
||||||
|
mDrawTitle = $0003; {MenuDefProcCodes - }
|
||||||
|
mDrawMItem = $0004; {MenuDefProcCodes - }
|
||||||
|
mGetMItemID = $0005; {MenuDefProcCodes - }
|
||||||
|
mInvis = $0004; {MenuFlag - }
|
||||||
|
mCustom = $0010; {MenuFlag - }
|
||||||
|
mXor = $0020; {MenuFlag - }
|
||||||
|
mSelected = $0040; {MenuFlag - }
|
||||||
|
mDisabled = $0080; {MenuFlag - }
|
||||||
|
customMenu = $0010; {MenuFlagMasks - }
|
||||||
|
xorMItemHilite = $0020; {MenuFlagMasks - }
|
||||||
|
xorTitleHilite = $0020; {MenuFlagMasks - }
|
||||||
|
underMItem = $0040; {MenuFlagMasks - }
|
||||||
|
disableItem = $0080; {MenuFlagMasks - }
|
||||||
|
disableMenu = $0080; {MenuFlagMasks - }
|
||||||
|
enableItem = $FF7F; {MenuFlagMasks - }
|
||||||
|
enableMenu = $FF7F; {MenuFlagMasks - }
|
||||||
|
noUnderMItem = $FFBF; {MenuFlagMasks - }
|
||||||
|
colorMItemHilite = $FFDF; {MenuFlagMasks - }
|
||||||
|
colorTitleHilite = $FFDF; {MenuFlagMasks - }
|
||||||
|
colorReplace = $FFDF; {MenuFlagMasks - }
|
||||||
|
standardMenu = $FFEF; {MenuFlagMasks - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
MenuBarRecHndl = ^MenuBarRecPtr;
|
||||||
|
MenuBarRecPtr = ^MenuBarRec;
|
||||||
|
MenuBarRec = CtlRec ;
|
||||||
|
MenuRecHndl = ^MenuRecPtr;
|
||||||
|
MenuRecPtr = ^MenuRec;
|
||||||
|
MenuRec = PACKED RECORD
|
||||||
|
menuID : Integer; { Menu's ID number }
|
||||||
|
menuWidth : Integer; { Width of menu }
|
||||||
|
menuHeight : Integer; { Height of menu }
|
||||||
|
menuProc : WordProcPtr; { Menu's definition procedure }
|
||||||
|
menuFlag : Integer; { Bit flags }
|
||||||
|
firstItem : Byte;
|
||||||
|
numOfItems : Byte;
|
||||||
|
titleWidth : Integer; { Width of menu's title }
|
||||||
|
titleName : Ptr;
|
||||||
|
END;
|
||||||
|
PROCEDURE MenuBootInit ; Tool $0F,$01;
|
||||||
|
PROCEDURE MenuStartUp ( userID:Integer; dPageAddr:Integer) ; Tool $0F,$02;
|
||||||
|
PROCEDURE MenuShutDown ; Tool $0F,$03;
|
||||||
|
FUNCTION MenuVersion : Integer ; Tool $0F,$04;
|
||||||
|
PROCEDURE MenuReset ; Tool $0F,$05;
|
||||||
|
FUNCTION MenuStatus : Boolean ; Tool $0F,$06;
|
||||||
|
PROCEDURE CalcMenuSize ( newWidth:Integer; newHeight:Integer; menuNum:Integer)
|
||||||
|
; Tool $0F,$1C;
|
||||||
|
PROCEDURE CheckMItem ( checkedFlag:Boolean; itemNum:Integer) ; Tool $0F,$32;
|
||||||
|
FUNCTION CountMItems ( menuNum:Integer) : Integer ; Tool $0F,$14;
|
||||||
|
PROCEDURE DeleteMenu ( menuNum:Integer) ; Tool $0F,$0E;
|
||||||
|
PROCEDURE DeleteMItem ( itemNum:Integer) ; Tool $0F,$10;
|
||||||
|
PROCEDURE DisableMItem ( itemNum:Integer) ; Tool $0F,$31;
|
||||||
|
PROCEDURE DisposeMenu ( menuHandle:MenuRecHndl) ; Tool $0F,$2E;
|
||||||
|
PROCEDURE DrawMenuBar ; Tool $0F,$2A;
|
||||||
|
PROCEDURE EnableMItem ( itemNum:Integer) ; Tool $0F,$30;
|
||||||
|
FUNCTION FixMenuBar : Integer ; Tool $0F,$13;
|
||||||
|
PROCEDURE FlashMenuBar ; Tool $0F,$0C;
|
||||||
|
FUNCTION GetBarColors : Longint ; Tool $0F,$18;
|
||||||
|
FUNCTION GetMenuBar : MenuBarRecHndl ; Tool $0F,$0A;
|
||||||
|
FUNCTION GetMenuFlag ( menuNum:Integer) : Integer ; Tool $0F,$20;
|
||||||
|
FUNCTION GetMenuMgrPort : GrafPortPtr ; Tool $0F,$1B;
|
||||||
|
FUNCTION GetMenuTitle ( menuNum:Integer) : Ptr ; Tool $0F,$22;
|
||||||
|
FUNCTION GetMHandle ( menuNum:Integer) : MenuRecHndl ; Tool $0F,$16;
|
||||||
|
FUNCTION GetMItem ( itemNum:Integer) : StringPtr ; Tool $0F,$25;
|
||||||
|
FUNCTION GetMItemFlag ( itemNum:Integer) : Integer ; Tool $0F,$27;
|
||||||
|
FUNCTION GetMItemMark ( itemNum:Integer) : Integer ; Tool $0F,$34;
|
||||||
|
FUNCTION GetMItemStyle ( itemNum:Integer) : TextStyle ; Tool $0F,$36;
|
||||||
|
FUNCTION GetMTitleStart : Integer ; Tool $0F,$1A;
|
||||||
|
FUNCTION GetMTitleWidth ( menuNum:Integer) : Integer ; Tool $0F,$1E;
|
||||||
|
FUNCTION GetSysBar : MenuBarRecHndl ; Tool $0F,$11;
|
||||||
|
PROCEDURE HiliteMenu ( hiliteFlag:Boolean; menuNum:Integer) ; Tool $0F,$2C;
|
||||||
|
PROCEDURE InitPalette ; Tool $0F,$2F;
|
||||||
|
PROCEDURE InsertMenu ( addMenuHandle:MenuRecHndl; insertAfter:Integer) ; Tool
|
||||||
|
$0F,$0D;
|
||||||
|
PROCEDURE InsertMItem ( addItemPtr:Ptr; insertAfter:Integer; menuNum:Integer)
|
||||||
|
; Tool $0F,$0F;
|
||||||
|
FUNCTION MenuGlobal ( menuGlobalMask:Integer) : Integer ; Tool $0F,$23;
|
||||||
|
PROCEDURE MenuKey ( taskRecPtr:WmTaskRec; barHandle:MenuBarRecHndl) ; Tool
|
||||||
|
$0F,$09;
|
||||||
|
PROCEDURE MenuNewRes ; Tool $0F,$29;
|
||||||
|
PROCEDURE MenuRefresh ( redrawRoutinePtr:VoidProcPtr) ; Tool $0F,$0B;
|
||||||
|
PROCEDURE MenuSelect ( taskRecPtr:WmTaskRec; barHandle:MenuBarRecHndl) ; Tool
|
||||||
|
$0F,$2B;
|
||||||
|
FUNCTION NewMenu ( menuStringPtr:Ptr) : MenuRecHndl ; Tool $0F,$2D;
|
||||||
|
FUNCTION NewMenuBar ( theWindowPtr:WindowPtr) : MenuBarRecHndl ; Tool $0F,$15;
|
||||||
|
PROCEDURE SetBarColors ( newBarColor:Integer; newInvertColor:Integer;
|
||||||
|
newOutColor:Integer) ; Tool $0F,$17;
|
||||||
|
PROCEDURE SetMenuBar ( barHandle:MenuBarRecHndl) ; Tool $0F,$39;
|
||||||
|
PROCEDURE SetMenuFlag ( newValue:Integer; menuNum:Integer) ; Tool $0F,$1F;
|
||||||
|
PROCEDURE SetMenuID ( newMenuNum:Integer; curMenuNum:Integer) ; Tool $0F,$37;
|
||||||
|
PROCEDURE SetMenuTitle ( newStr:Str255; menuNum:Integer) ; Tool $0F,$21;
|
||||||
|
PROCEDURE SetMItem ( newItemLine:Str255; itemNum:Integer) ; Tool $0F,$24;
|
||||||
|
PROCEDURE SetMItemBlink ( count:Integer) ; Tool $0F,$28;
|
||||||
|
PROCEDURE SetMItemFlag ( newValue:Integer; itemNum:Integer) ; Tool $0F,$26;
|
||||||
|
PROCEDURE SetMItemID ( newItemNum:Integer; curItemNum:Integer) ; Tool $0F,$38;
|
||||||
|
PROCEDURE SetMItemMark ( mark:Integer; itemNum:Integer) ; Tool $0F,$33;
|
||||||
|
PROCEDURE SetMItemName ( str:Str255; itemNum:Integer) ; Tool $0F,$3A;
|
||||||
|
PROCEDURE SetMItemStyle ( theTextStyle:TextStyle; itemNum:Integer) ; Tool
|
||||||
|
$0F,$35;
|
||||||
|
PROCEDURE SetMTitleStart ( xStart:Integer) ; Tool $0F,$19;
|
||||||
|
PROCEDURE SetMTitleWidth ( newWidth:Integer; menuNum:Integer) ; Tool $0F,$1D;
|
||||||
|
PROCEDURE SetSysBar ( barHandle:MenuBarRecHndl) ; Tool $0F,$12;
|
||||||
|
FUNCTION PopUpMenuSelect ( selection:Integer; currentLeft:Integer;
|
||||||
|
currentTop:Integer; flag:Integer; menuHandle:MenuRecHndl) : Integer ; Tool
|
||||||
|
$0F,$3C;
|
||||||
|
FUNCTION GetPopUpDefProc : Ptr ; Tool $0F,$3B;
|
||||||
|
PROCEDURE DrawPopUp ( selection:Integer; flag:Integer; right:Integer;
|
||||||
|
bottom:Integer; left:Integer; top:Integer; menuHandle:MenuRecHndl) ; Tool
|
||||||
|
$0F,$3D;
|
||||||
|
FUNCTION NewMenuBar2 ( refDesc:RefDescriptor; menuBarTemplateRef:Ref;
|
||||||
|
windowPortPtr:GrafPortPtr) : MenuBarRecHndl ; Tool $0F,$43;
|
||||||
|
FUNCTION NewMenu2 ( refDesc:RefDescriptor; menuTemplateRef:Ref) : MenuRecHndl ;
|
||||||
|
Tool $0F,$3E;
|
||||||
|
PROCEDURE InsertMItem2 ( refDesc:RefDescriptor; menuTemplateRef:Ref;
|
||||||
|
insertAfter:Integer; menuNum:Integer) ; Tool $0F,$3F;
|
||||||
|
PROCEDURE SetMenuTitle2 ( refDesc:RefDescriptor; titleRef:Ref; menuNum:Integer)
|
||||||
|
; Tool $0F,$40;
|
||||||
|
PROCEDURE SetMItem2 ( refDesc:RefDescriptor; menuItemTempRef:Ref;
|
||||||
|
menuItemID:Integer) ; Tool $0F,$41;
|
||||||
|
PROCEDURE SetMItemName2 ( refDesc:RefDescriptor; titleRef:Ref;
|
||||||
|
menuItemID:Integer) ; Tool $0F,$42;
|
||||||
|
PROCEDURE HideMenuBar ; Tool $0F,$45;
|
||||||
|
PROCEDURE ShowMenuBar ; Tool $0F,$46;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
119
pascal/midi.p
Executable file
119
pascal/midi.p
Executable file
|
@ -0,0 +1,119 @@
|
||||||
|
{********************************************
|
||||||
|
; File: MIDI.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT MIDI;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
miToolNum = $0020; {Midi - the tool number of the MIDI Tool Set }
|
||||||
|
miDrvrFileType = $00BB; {Midi - filetype of MIDI device driver }
|
||||||
|
miNSVer = $0102; {Midi - minimum version of Note Synthesizer required by MIDI
|
||||||
|
Tool Set }
|
||||||
|
miSTVer = $0203; {Midi - minimum version of Sound Tools needed by MIDI Tool Set
|
||||||
|
}
|
||||||
|
miDrvrAuxType = $0300; {Midi - aux type of MIDI device driver }
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
miStartUpErr = $2000; {Midi - MIDI Tool Set is not started }
|
||||||
|
miPacketErr = $2001; {Midi - incorrect length for a received MIDI command }
|
||||||
|
miArrayErr = $2002; {Midi - a designated array had an insufficient or illegal
|
||||||
|
size }
|
||||||
|
miFullBufErr = $2003; {Midi - input buffer overflow }
|
||||||
|
miToolsErr = $2004; {Midi - the required tools were not started up or had
|
||||||
|
insufficient versions }
|
||||||
|
miOutOffErr = $2005; {Midi - MIDI output must first be enabled }
|
||||||
|
miNoBufErr = $2007; {Midi - no buffer is currently allocated }
|
||||||
|
miDriverErr = $2008; {Midi - the designated file is not a legal MIDI device
|
||||||
|
driver }
|
||||||
|
miBadFreqErr = $2009; {Midi - the MIDI clock cannot attain the requested
|
||||||
|
frequency }
|
||||||
|
miClockErr = $200A; {Midi - the MIDI clock value wrapped to zero }
|
||||||
|
miConflictErr = $200B; {Midi - conflicting processes for MIDI input }
|
||||||
|
miNoDevErr = $200C; {Midi - no MIDI device driver loaded }
|
||||||
|
miDevNotAvail = $2080; {Midi - the requested device is not available }
|
||||||
|
miDevSlotBusy = $2081; {Midi - requested slot is already in use }
|
||||||
|
miDevBusy = $2082; {Midi - the requested device is already in use }
|
||||||
|
miDevOverrun = $2083; {Midi - device overrun by incoming MIDI data }
|
||||||
|
miDevNoConnect = $2084; {Midi - no connection to MIDI }
|
||||||
|
miDevReadErr = $2085; {Midi - framing error in received MIDI data }
|
||||||
|
miDevVersion = $2086; {Midi - ROM version is incompatible with device driver }
|
||||||
|
miDevIntHndlr = $2087; {Midi - conflicting interrupt handler is installed }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
miSetClock = $0000; {MidiClock - set time stamp clock }
|
||||||
|
miStartClock = $0001; {MidiClock - start time stamp clock }
|
||||||
|
miStopClock = $0002; {MidiClock - stop time stamp clock }
|
||||||
|
miSetFreq = $0003; {MidiClock - set clock frequency }
|
||||||
|
miRawMode = $00000000; {MidiControl - raw mode for MIDI input and output }
|
||||||
|
miSetRTVec = $0000; {MidiControl - set real-time message vector }
|
||||||
|
miPacketMode = $00000001; {MidiControl - packet mode for MIDI input and output
|
||||||
|
}
|
||||||
|
miSetErrVec = $0001; {MidiControl - set real-time error vector }
|
||||||
|
miStandardMode = $00000002; {MidiControl - standard mode for MIDI input and
|
||||||
|
output }
|
||||||
|
miSetInBuf = $0002; {MidiControl - set input buffer information }
|
||||||
|
miSetOutBuf = $0003; {MidiControl - set output buffer information }
|
||||||
|
miStartInput = $0004; {MidiControl - start MIDI input }
|
||||||
|
miStartOutput = $0005; {MidiControl - start MIDI output }
|
||||||
|
miStopInput = $0006; {MidiControl - stop MIDI input }
|
||||||
|
miStopOutput = $0007; {MidiControl - stop MIDI output }
|
||||||
|
miFlushInput = $0008; {MidiControl - discard contents of input buffer }
|
||||||
|
miFlushOutput = $0009; {MidiControl - discard contents of output buffer }
|
||||||
|
miFlushPacket = $000A; {MidiControl - discard next input packet }
|
||||||
|
miWaitOutput = $000B; {MidiControl - wait for output buffer to empty }
|
||||||
|
miSetInMode = $000C; {MidiControl - set input mode }
|
||||||
|
miSetOutMode = $000D; {MidiControl - set output mode }
|
||||||
|
miClrNotePad = $000E; {MidiControl - clear all notes marked on in the note pad
|
||||||
|
}
|
||||||
|
miSetDelay = $000F; {MidiControl - set minimum delay between output packets }
|
||||||
|
miOutputStat = $0010; {MidiControl - enable/disable output of running-status }
|
||||||
|
miIgnoreSysEx = $0011; {MidiControl - ignore system exclusive input }
|
||||||
|
miSelectDrvr = $0000; {MidiDevice - display device driver selection dialog }
|
||||||
|
miLoadDrvr = $0001; {MidiDevice - load and initialize device driver }
|
||||||
|
miUnloadDrvr = $0002; {MidiDevice - shutdown MIDI device, unload driver }
|
||||||
|
miNextPktLen = $0; {MidiInfo - return length of next packet }
|
||||||
|
miInputChars = $0001; {MidiInfo - return number of characters in input buffer }
|
||||||
|
miOutputChars = $0002; {MidiInfo - return number of characters in output buffer
|
||||||
|
}
|
||||||
|
miMaxInChars = $0003; {MidiInfo - return maximum number of characters in input
|
||||||
|
buffer }
|
||||||
|
miMaxOutChars = $0004; {MidiInfo - return maximum number of characters in
|
||||||
|
output buffer }
|
||||||
|
miRecordAddr = $0005; {MidiInfo - return current MidiRecordSeq address }
|
||||||
|
miPlayAddr = $0006; {MidiInfo - return current MidiPlaySeq address }
|
||||||
|
miClockValue = $0007; {MidiInfo - return current time stamp clock value }
|
||||||
|
miClockFreq = $0008; {MidiInfo - return number of clock ticks per second }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
MiBufInfo = RECORD
|
||||||
|
bufSize : Integer; { size of buffer (0 for default) }
|
||||||
|
address : Ptr; { address of buffer (0 for auto-allocation) }
|
||||||
|
END;
|
||||||
|
MiDriverInfo = RECORD
|
||||||
|
slot : Integer; { device slot }
|
||||||
|
external : Integer; { slot internal (=0) / external (=1) }
|
||||||
|
pathname : PACKED ARRAY[1..65] OF Byte; { device driver pathname }
|
||||||
|
END;
|
||||||
|
PROCEDURE MidiBootInit ; Tool $20,$01;
|
||||||
|
PROCEDURE MidiStartUp ( userID:Integer; directPages:Integer) ; Tool $20,$02;
|
||||||
|
PROCEDURE MidiShutDown ; Tool $20,$03;
|
||||||
|
FUNCTION MidiVersion : Integer ; Tool $20,$04;
|
||||||
|
PROCEDURE MidiReset ; Tool $20,$05;
|
||||||
|
FUNCTION MidiStatus : Boolean ; Tool $20,$06;
|
||||||
|
PROCEDURE MidiClock ( funcNum:Integer; arg:Longint) ; Tool $20,$0B;
|
||||||
|
PROCEDURE MidiControl ( controlCode:Integer) ; Tool $20,$09;
|
||||||
|
PROCEDURE MidiDevice ( funcNum:Integer; driverInfo:Ptr) ; Tool $20,$0A;
|
||||||
|
FUNCTION MidiInfo ( funcNum:Integer) : Longint ; Tool $20,$0C;
|
||||||
|
PROCEDURE MidiInputPoll ; EXTERNAL ;
|
||||||
|
FUNCTION MidiReadPacket ( arrayAddr:Ptr; arraySize:Integer) : Integer ; Tool
|
||||||
|
$20,$0D;
|
||||||
|
FUNCTION MidiWritePacket ( arrayAddr:Ptr) : Integer ; Tool $20,$0E;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
367
pascal/misctool.p
Executable file
367
pascal/misctool.p
Executable file
|
@ -0,0 +1,367 @@
|
||||||
|
{********************************************
|
||||||
|
; File: MiscTool.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT MISCTOOL;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
CONST
|
||||||
|
badInputErr = $0301; {error - bad input parameter }
|
||||||
|
noDevParamErr = $0302; {error - no device for input parameter }
|
||||||
|
taskInstlErr = $0303; {error - task already installed error }
|
||||||
|
noSigTaskErr = $0304; {error - no signature in task header }
|
||||||
|
queueDmgdErr = $0305; {error - queue has been damaged error }
|
||||||
|
taskNtFdErr = $0306; {error - task was not found error }
|
||||||
|
firmTaskErr = $0307; {error - firmware task was unsuccessful }
|
||||||
|
hbQueueBadErr = $0308; {error - heartbeat queue damaged }
|
||||||
|
unCnctdDevErr = $0309; {error - attempted to dispatch to unconnected device }
|
||||||
|
idTagNtAvlErr = $030B; {error - ID tag not available }
|
||||||
|
pdosUnClmdIntErr = $0001; {System Fail - ProDOS unclaimed interrupt error }
|
||||||
|
divByZeroErr = $0004; {System Fail - divide by zero error }
|
||||||
|
pdosVCBErr = $000A; {System Fail - ProDOS VCB unusable }
|
||||||
|
pdosFCBErr = $000B; {System Fail - ProDOS FCB unusable }
|
||||||
|
pdosBlk0Err = $000C; {System Fail - ProDOS block zero allocated illegally }
|
||||||
|
pdosIntShdwErr = $000D; {System Fail - ProDOS interrupt w/ shadowing off }
|
||||||
|
segLoader1Err = $0015; {System Fail - segment loader error }
|
||||||
|
sPackage0Err = $0017; {System Fail - can't load a package }
|
||||||
|
package1Err = $0018; {System Fail - can't load a package }
|
||||||
|
package2Err = $0019; {System Fail - can't load a package }
|
||||||
|
package3Err = $001A; {System Fail - can't load a package }
|
||||||
|
package4Err = $001B; {System Fail - can't load a package }
|
||||||
|
package5Err = $001C; {System Fail - can't load a package }
|
||||||
|
package6Err = $001D; {System Fail - can't load a package }
|
||||||
|
package7Err = $001E; {System Fail - can't load a package }
|
||||||
|
package8Err = $0020; {System Fail - can't load a package }
|
||||||
|
package9Err = $0021; {System Fail - can't load a package }
|
||||||
|
package10Err = $0022; {System Fail - can't load a package }
|
||||||
|
package11Err = $0023; {System Fail - can't load a package }
|
||||||
|
package12Err = $0024; {System Fail - can't load a package }
|
||||||
|
outOfMemErr = $0025; {System Fail - out of memory error }
|
||||||
|
segLoader2Err = $0026; {System Fail - segment loader error }
|
||||||
|
fMapTrshdErr = $0027; {System Fail - file map trashed }
|
||||||
|
stkOvrFlwErr = $0028; {System Fail - stack overflow error }
|
||||||
|
psInstDiskErr = $0030; {System Fail - Please Insert Disk (file manager alert) }
|
||||||
|
memMgr1Err = $0032; {System Fail - memory manager error }
|
||||||
|
memMgr2Err = $0033; {System Fail - memory manager error }
|
||||||
|
memMgr3Err = $0034; {System Fail - memory manager error }
|
||||||
|
memMgr4Err = $0035; {System Fail - memory manager error }
|
||||||
|
memMgr5Err = $0036; {System Fail - memory manager error }
|
||||||
|
memMgr6Err = $0037; {System Fail - memory manager error }
|
||||||
|
memMgr7Err = $0038; {System Fail - memory manager error }
|
||||||
|
memMgr8Err = $0039; {System Fail - memory manager error }
|
||||||
|
memMgr9Err = $003A; {System Fail - memory manager error }
|
||||||
|
memMgr10Err = $003B; {System Fail - memory manager error }
|
||||||
|
memMgr11Err = $003C; {System Fail - memory manager error }
|
||||||
|
memMgr12Err = $003D; {System Fail - memory manager error }
|
||||||
|
memMgr13Err = $003E; {System Fail - memory manager error }
|
||||||
|
memMgr14Err = $003F; {System Fail - memory manager error }
|
||||||
|
memMgr15Err = $0040; {System Fail - memory manager error }
|
||||||
|
memMgr16Err = $0041; {System Fail - memory manager error }
|
||||||
|
memMgr17Err = $0042; {System Fail - memory manager error }
|
||||||
|
memMgr18Err = $0043; {System Fail - memory manager error }
|
||||||
|
memMgr19Err = $0044; {System Fail - memory manager error }
|
||||||
|
memMgr20Err = $0045; {System Fail - memory manager error }
|
||||||
|
memMgr21Err = $0046; {System Fail - memory manager error }
|
||||||
|
memMgr22Err = $0047; {System Fail - memory manager error }
|
||||||
|
memMgr23Err = $0048; {System Fail - memory manager error }
|
||||||
|
memMgr24Err = $0049; {System Fail - memory manager error }
|
||||||
|
memMgr25Err = $004A; {System Fail - memory manager error }
|
||||||
|
memMgr26Err = $004B; {System Fail - memory manager error }
|
||||||
|
memMgr27Err = $004C; {System Fail - memory manager error }
|
||||||
|
memMgr28Err = $004D; {System Fail - memory manager error }
|
||||||
|
memMgr29Err = $004E; {System Fail - memory manager error }
|
||||||
|
memMgr30Err = $004F; {System Fail - memory manager error }
|
||||||
|
memMgr31Err = $0050; {System Fail - memory manager error }
|
||||||
|
memMgr32Err = $0051; {System Fail - memory manager error }
|
||||||
|
memMgr33Err = $0052; {System Fail - memory manager error }
|
||||||
|
memMgr34Err = $0053; {System Fail - memory manager error }
|
||||||
|
stupVolMntErr = $0100; {System Fail - can't mount system startup volume }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
(* *** Reference Numbers ***
|
||||||
|
p1PrntModem = $0000; {Battery Ram Parameter Ref Number - }
|
||||||
|
p1LineLnth = $0001; {Battery Ram Parameter Ref Number - }
|
||||||
|
p1DelLine = $0002; {Battery Ram Parameter Ref Number - }
|
||||||
|
p1AddLine = $0003; {Battery Ram Parameter Ref Number - }
|
||||||
|
p1Echo = $0004; {Battery Ram Parameter Ref Number - }
|
||||||
|
p1Buffer = $0005; {Battery Ram Parameter Ref Number - }
|
||||||
|
p1Baud = $0006; {Battery Ram Parameter Ref Number - }
|
||||||
|
p1DtStpBits = $0007; {Battery Ram Parameter Ref Number - }
|
||||||
|
p1Parity = $0008; {Battery Ram Parameter Ref Number - }
|
||||||
|
p1DCDHndShk = $0009; {Battery Ram Parameter Ref Number - }
|
||||||
|
p1DSRHndShk = $000A; {Battery Ram Parameter Ref Number - }
|
||||||
|
p1XnfHndShk = $000B; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2PrntModem = $000C; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2LineLnth = $000D; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2DelLine = $000E; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2AddLine = $000F; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2Echo = $0010; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2Buffer = $0011; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2Baud = $0012; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2DtStpBits = $0013; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2Parity = $0014; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2DCDHndShk = $0015; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2DSRHndShk = $0016; {Battery Ram Parameter Ref Number - }
|
||||||
|
p2XnfHndShk = $0017; {Battery Ram Parameter Ref Number - }
|
||||||
|
dspColMono = $0018; {Battery Ram Parameter Ref Number - }
|
||||||
|
dsp40or80 = $0019; {Battery Ram Parameter Ref Number - }
|
||||||
|
dspTxtColor = $001A; {Battery Ram Parameter Ref Number - }
|
||||||
|
dspBckColor = $001B; {Battery Ram Parameter Ref Number - }
|
||||||
|
dspBrdColor = $001C; {Battery Ram Parameter Ref Number - }
|
||||||
|
hrtz50or60 = $001D; {Battery Ram Parameter Ref Number - }
|
||||||
|
userVolume = $001E; {Battery Ram Parameter Ref Number - }
|
||||||
|
bellVolume = $001F; {Battery Ram Parameter Ref Number - }
|
||||||
|
sysSpeed = $0020; {Battery Ram Parameter Ref Number - }
|
||||||
|
slt1intExt = $0021; {Battery Ram Parameter Ref Number - }
|
||||||
|
slt2intExt = $0022; {Battery Ram Parameter Ref Number - }
|
||||||
|
slt3intExt = $0023; {Battery Ram Parameter Ref Number - }
|
||||||
|
slt4intExt = $0024; {Battery Ram Parameter Ref Number - }
|
||||||
|
slt5intExt = $0025; {Battery Ram Parameter Ref Number - }
|
||||||
|
slt6intExt = $0026; {Battery Ram Parameter Ref Number - }
|
||||||
|
slt7intExt = $0027; {Battery Ram Parameter Ref Number - }
|
||||||
|
startupSlt = $0028; {Battery Ram Parameter Ref Number - }
|
||||||
|
txtDspLang = $0029; {Battery Ram Parameter Ref Number - }
|
||||||
|
kybdLang = $002A; {Battery Ram Parameter Ref Number - }
|
||||||
|
kyBdBuffer = $002B; {Battery Ram Parameter Ref Number - }
|
||||||
|
kyBdRepSpd = $002C; {Battery Ram Parameter Ref Number - }
|
||||||
|
kyBdRepDel = $002D; {Battery Ram Parameter Ref Number - }
|
||||||
|
dblClkTime = $002E; {Battery Ram Parameter Ref Number - }
|
||||||
|
flashRate = $002F; {Battery Ram Parameter Ref Number - }
|
||||||
|
shftCpsLCas = $0030; {Battery Ram Parameter Ref Number - }
|
||||||
|
fstSpDelKey = $0031; {Battery Ram Parameter Ref Number - }
|
||||||
|
dualSpeed = $0032; {Battery Ram Parameter Ref Number - }
|
||||||
|
hiMouseRes = $0033; {Battery Ram Parameter Ref Number - }
|
||||||
|
dateFormat = $0034; {Battery Ram Parameter Ref Number - }
|
||||||
|
clockFormat = $0035; {Battery Ram Parameter Ref Number - }
|
||||||
|
rdMinRam = $0036; {Battery Ram Parameter Ref Number - }
|
||||||
|
rdMaxRam = $0037; {Battery Ram Parameter Ref Number - }
|
||||||
|
langCount = $0038; {Battery Ram Parameter Ref Number - }
|
||||||
|
lang1 = $0039; {Battery Ram Parameter Ref Number - }
|
||||||
|
lang2 = $003A; {Battery Ram Parameter Ref Number - }
|
||||||
|
lang3 = $003B; {Battery Ram Parameter Ref Number - }
|
||||||
|
lang4 = $003C; {Battery Ram Parameter Ref Number - }
|
||||||
|
lang5 = $003D; {Battery Ram Parameter Ref Number - }
|
||||||
|
lang6 = $003E; {Battery Ram Parameter Ref Number - }
|
||||||
|
lang7 = $003F; {Battery Ram Parameter Ref Number - }
|
||||||
|
lang8 = $0040; {Battery Ram Parameter Ref Number - }
|
||||||
|
layoutCount = $0041; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout1 = $0042; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout2 = $0043; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout3 = $0044; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout4 = $0045; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout5 = $0046; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout6 = $0047; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout7 = $0048; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout8 = $0049; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout9 = $004A; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout10 = $004B; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout11 = $004C; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout12 = $004D; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout13 = $004E; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout14 = $004F; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout15 = $0050; {Battery Ram Parameter Ref Number - }
|
||||||
|
layout16 = $0051; {Battery Ram Parameter Ref Number - }
|
||||||
|
aTalkNodeNo = $0080; {Battery Ram Parameter Ref Number - }
|
||||||
|
|
||||||
|
irqIntFlag = $0000; {GetAddr Param Ref No - }
|
||||||
|
irqDataReg = $0001; {GetAddr Param Ref No - }
|
||||||
|
irqSerial1 = $0002; {GetAddr Param Ref No - }
|
||||||
|
irqSerial2 = $0003; {GetAddr Param Ref No - }
|
||||||
|
irqAplTlkHi = $0004; {GetAddr Param Ref No - }
|
||||||
|
tickCnt = $0005; {GetAddr Param Ref No - }
|
||||||
|
irqVolume = $0006; {GetAddr Param Ref No - }
|
||||||
|
irqActive = $0007; {GetAddr Param Ref No - }
|
||||||
|
irqSndData = $0008; {GetAddr Param Ref No - }
|
||||||
|
brkVar = $0009; {GetAddr Param Ref No - }
|
||||||
|
evMgrData = $000A; {GetAddr Param Ref No - }
|
||||||
|
mouseSlot = $000B; {GetAddr Param Ref No - }
|
||||||
|
mouseClamps = $000C; {GetAddr Param Ref No - }
|
||||||
|
absClamps = $000D; {GetAddr Param Ref No - }
|
||||||
|
sccIntFlag = $000E; {GetAddr Param Ref No - }
|
||||||
|
|
||||||
|
extVGCInt = $01; {Hardware Interrupt Status - Returned by GetIRQEnable }
|
||||||
|
scanLineInt = $02; {Hardware Interrupt Status - Returned by GetIRQEnable }
|
||||||
|
adbDataInt = $04; {Hardware Interrupt Status - Returned by GetIRQEnable }
|
||||||
|
ADTBDataInt = $04; {Hardware Interrupt Status - maintained for compatiblity
|
||||||
|
with old interfaces }
|
||||||
|
oneSecInt = $10; {Hardware Interrupt Status - Returned by GetIRQEnable }
|
||||||
|
quartSecInt = $20; {Hardware Interrupt Status - Returned by GetIRQEnable }
|
||||||
|
vbInt = $40; {Hardware Interrupt Status - Returned by GetIRQEnable }
|
||||||
|
kbdInt = $80; {Hardware Interrupt Status - Returned by GetIRQEnable }
|
||||||
|
|
||||||
|
kybdEnable = $0000; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
kybdDisable = $0001; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
vblEnable = $0002; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
vblDisable = $0003; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
qSecEnable = $0004; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
qSecDisable = $0005; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
oSecEnable = $0006; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
oSecDisable = $0007; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
adbEnable = $000A; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
adbDisable = $000B; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
scLnEnable = $000C; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
scLnDisable = $000D; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
exVCGEnable = $000E; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
exVCGDisable = $000F; {Interrupt Ref Number - Parameter to IntSource }
|
||||||
|
|
||||||
|
mouseOff = $0000; {Mouse Mode Value - }
|
||||||
|
transparent = $0001; {Mouse Mode Value - }
|
||||||
|
transParnt = $0001; {Mouse Mode Value - (old name) }
|
||||||
|
moveIntrpt = $0003; {Mouse Mode Value - }
|
||||||
|
bttnIntrpt = $0005; {Mouse Mode Value - }
|
||||||
|
bttnOrMove = $0007; {Mouse Mode Value - }
|
||||||
|
mouseOffVI = $0008; {Mouse Mode Value - }
|
||||||
|
transParntVI = $0009; {Mouse Mode Value - (old name) }
|
||||||
|
transparentVI = $0009; {Mouse Mode Value - }
|
||||||
|
moveIntrptVI = $000B; {Mouse Mode Value - }
|
||||||
|
bttnIntrptVI = $000D; {Mouse Mode Value - }
|
||||||
|
bttnOrMoveVI = $000F; {Mouse Mode Value - }
|
||||||
|
|
||||||
|
toolLoc1 = $0000; {Vector Ref Number - }
|
||||||
|
toolLoc2 = $0001; {Vector Ref Number - }
|
||||||
|
usrTLoc1 = $0002; {Vector Ref Number - }
|
||||||
|
usrTLoc2 = $0003; {Vector Ref Number - }
|
||||||
|
intrptMgr = $0004; {Vector Ref Number - }
|
||||||
|
copMgr = $0005; {Vector Ref Number - }
|
||||||
|
abortMgr = $0006; {Vector Ref Number - }
|
||||||
|
U_sysFailMgr = $0007; {Vector Ref Number - }
|
||||||
|
aTalkIntHnd = $0008; {Vector Ref Number - }
|
||||||
|
sccIntHnd = $0009; {Vector Ref Number - }
|
||||||
|
scLnIntHnd = $000A; {Vector Ref Number - }
|
||||||
|
sndIntHnd = $000B; {Vector Ref Number - }
|
||||||
|
vblIntHnd = $000C; {Vector Ref Number - }
|
||||||
|
mouseIntHnd = $000D; {Vector Ref Number - }
|
||||||
|
qSecIntHnd = $000E; {Vector Ref Number - }
|
||||||
|
kybdIntHnd = $000F; {Vector Ref Number - }
|
||||||
|
adbRBIHnd = $0010; {Vector Ref Number - }
|
||||||
|
adbSRQHnd = $0011; {Vector Ref Number - }
|
||||||
|
deskAccHnd = $0012; {Vector Ref Number - }
|
||||||
|
flshBufHnd = $0013; {Vector Ref Number - }
|
||||||
|
kybdMicHnd = $0014; {Vector Ref Number - }
|
||||||
|
oneSecHnd = $0015; {Vector Ref Number - }
|
||||||
|
extVCGHnd = $0016; {Vector Ref Number - }
|
||||||
|
otherIntHnd = $0017; {Vector Ref Number - }
|
||||||
|
crsrUpdtHnd = $0018; {Vector Ref Number - }
|
||||||
|
incBsyFlag = $0019; {Vector Ref Number - }
|
||||||
|
decBsyFlag = $001A; {Vector Ref Number - }
|
||||||
|
bellVector = $001B; {Vector Ref Number - }
|
||||||
|
breakVector = $001C; {Vector Ref Number - }
|
||||||
|
traceVector = $001D; {Vector Ref Number - }
|
||||||
|
stepVector = $001E; {Vector Ref Number - }
|
||||||
|
ctlYVector = $0028; {Vector Ref Number - }
|
||||||
|
proDOSVctr = $002A; {Vector Ref Number - }
|
||||||
|
osVector = $002B; {Vector Ref Number - }
|
||||||
|
msgPtrVctr = $002C; {Vector Ref Number - }
|
||||||
|
*** Reference Numbers *** *)
|
||||||
|
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
ClampRecHndl = ^ClampRecPtr;
|
||||||
|
ClampRecPtr = ^ClampRec;
|
||||||
|
ClampRec = RECORD
|
||||||
|
yMaxClamp : Integer;
|
||||||
|
yMinClamp : Integer;
|
||||||
|
xMaxClamp : Integer;
|
||||||
|
xMinClamp : Integer;
|
||||||
|
END;
|
||||||
|
FWRecHndl = ^FWRecPtr;
|
||||||
|
FWRecPtr = ^FWRec;
|
||||||
|
FWRec = RECORD
|
||||||
|
yRegExit : Integer;
|
||||||
|
xRegExit : Integer;
|
||||||
|
aRegExit : Integer;
|
||||||
|
status : Integer;
|
||||||
|
END;
|
||||||
|
MouseRecHndl = ^MouseRecPtr;
|
||||||
|
MouseRecPtr = ^MouseRec;
|
||||||
|
MouseRec = PACKED RECORD
|
||||||
|
mouseMode : Byte;
|
||||||
|
mouseStatus : Byte;
|
||||||
|
yPos : Integer;
|
||||||
|
xPos : Integer;
|
||||||
|
END;
|
||||||
|
InterruptStateRecHndl = ^InterruptStateRecPtr;
|
||||||
|
InterruptStateRecPtr = ^InterruptStateRec;
|
||||||
|
InterruptStateRec = PACKED RECORD
|
||||||
|
irq_A : Integer;
|
||||||
|
irq_X : Integer;
|
||||||
|
irq_Y : Integer;
|
||||||
|
irq_S : Integer;
|
||||||
|
irq_D : Integer;
|
||||||
|
irq_P : Byte;
|
||||||
|
irq_DB : Byte;
|
||||||
|
irq_e : Byte;
|
||||||
|
irq_K : Byte;
|
||||||
|
irq_PC : Integer;
|
||||||
|
irq_state : Byte;
|
||||||
|
irq_shadow : Integer;
|
||||||
|
irq_mslot : Byte;
|
||||||
|
END;
|
||||||
|
PROCEDURE MTBootInit ; Tool $03,$01;
|
||||||
|
PROCEDURE MTStartUp ; Tool $03,$02;
|
||||||
|
PROCEDURE MTShutDown ; Tool $03,$03;
|
||||||
|
FUNCTION MTVersion : Integer ; Tool $03,$04;
|
||||||
|
PROCEDURE MTReset ; Tool $03,$05;
|
||||||
|
FUNCTION MTStatus : Boolean ; Tool $03,$06;
|
||||||
|
PROCEDURE ClampMouse ( xMinClamp:Integer; xMaxClamp:Integer; yMinClamp:Integer;
|
||||||
|
yMaxClamp:Integer) ; Tool $03,$1C;
|
||||||
|
PROCEDURE ClearMouse ; Tool $03,$1B;
|
||||||
|
PROCEDURE ClrHeartBeat ; Tool $03,$14;
|
||||||
|
PROCEDURE DeleteID ( idTag:Integer) ; Tool $03,$21;
|
||||||
|
PROCEDURE DelHeartBeat ( taskPtr:Ptr) ; Tool $03,$13;
|
||||||
|
FUNCTION FWEntry ( aRegValue:Integer; xRegValue:Integer; yRegValue:Integer;
|
||||||
|
eModeEntryPt:Integer) : FWRec ; EXTERNAL ;
|
||||||
|
FUNCTION GetAbsClamp : ClampRec ; EXTERNAL ;
|
||||||
|
FUNCTION GetAddr ( refNum:Integer) : Ptr ; Tool $03,$16;
|
||||||
|
FUNCTION GetIRQEnable : Integer ; Tool $03,$29;
|
||||||
|
FUNCTION GetMouseClamp : ClampRec ; EXTERNAL ;
|
||||||
|
FUNCTION GetNewID ( idTag:Integer) : Integer ; Tool $03,$20;
|
||||||
|
FUNCTION GetTick : Longint ; Tool $03,$25;
|
||||||
|
FUNCTION GetVector ( vectorRefNum:Integer) : Ptr ; Tool $03,$11;
|
||||||
|
PROCEDURE HomeMouse ; Tool $03,$1A;
|
||||||
|
PROCEDURE InitMouse ( mouseSlot:Integer) ; Tool $03,$18;
|
||||||
|
PROCEDURE IntSource ( srcRefNum:Integer) ; Tool $03,$23;
|
||||||
|
FUNCTION Munger ( destPtr:Ptr; destLenPtr:IntPtr; targPtr:Ptr; targLen:Integer;
|
||||||
|
replPtr:Ptr; replLen:Integer; padPtr:Ptr) : Integer ; Tool $03,$28;
|
||||||
|
FUNCTION PackBytes (VAR srcBuffer:Ptr;VAR srcSize:Integer; dstBuffer:Ptr;
|
||||||
|
dstSize:Integer) : Integer ; Tool $03,$26;
|
||||||
|
PROCEDURE PosMouse ( xPos:Integer; yPos:Integer) ; Tool $03,$1E;
|
||||||
|
PROCEDURE ReadAsciiTime ( bufferPtr:Ptr) ; Tool $03,$0F;
|
||||||
|
FUNCTION ReadBParam ( paramRefNum:Integer) : Integer ; Tool $03,$0C;
|
||||||
|
PROCEDURE ReadBRam ( bufferPtr:Ptr) ; Tool $03,$0A;
|
||||||
|
FUNCTION ReadMouse : MouseRec ; EXTERNAL ;
|
||||||
|
FUNCTION ReadTimeHex : TimeRec ; EXTERNAL ;
|
||||||
|
FUNCTION ServeMouse : Integer ; Tool $03,$1F;
|
||||||
|
PROCEDURE SetAbsClamp ( xMinClamp:Integer; xMaxClamp:Integer;
|
||||||
|
yMinClamp:Integer; yMaxClamp:Integer) ; EXTERNAL ;
|
||||||
|
PROCEDURE SetHeartBeat ( taskPtr:Ptr) ; Tool $03,$12;
|
||||||
|
PROCEDURE SetMouse ( mouseMode:Integer) ; Tool $03,$19;
|
||||||
|
PROCEDURE SetVector ( vectorRefNum:Integer; vectorPtr:Ptr) ; Tool $03,$10;
|
||||||
|
PROCEDURE StatusID ( idTag:Integer) ; Tool $03,$22;
|
||||||
|
PROCEDURE SysBeep ; Tool $03,$2C;
|
||||||
|
PROCEDURE SysFailMgr ( errorCode:Integer; str:Str255) ; Tool $03,$15;
|
||||||
|
FUNCTION UnPackBytes ( srcBuffer:Ptr; srcSize:Integer;VAR dstBuffer:Ptr;VAR
|
||||||
|
dstSize:Integer) : Integer ; Tool $03,$27;
|
||||||
|
PROCEDURE WriteBParam ( theData:Integer; paramRefNum:Integer) ; Tool $03,$0B;
|
||||||
|
PROCEDURE WriteBRam ( bufferPtr:Ptr) ; Tool $03,$09;
|
||||||
|
PROCEDURE WriteTimeHex ( month:Byte; day:Byte; curYear:Byte; hour:Byte;
|
||||||
|
minute:Byte; second:Byte) ; EXTERNAL ;
|
||||||
|
PROCEDURE AddToQueue ( newEntryPtr:Ptr; headerPtr:Ptr) ; Tool $03,$2E;
|
||||||
|
PROCEDURE DeleteFromQueue ( entryPtr:Ptr; headerPtr:Ptr) ; Tool $03,$2F;
|
||||||
|
PROCEDURE SetInterruptState ( iStateRec:InterruptStateRec;
|
||||||
|
bytesDesired:Integer) ; Tool $03,$30;
|
||||||
|
PROCEDURE GetInterruptState (VAR iStateRec:InterruptStateRec;
|
||||||
|
bytesDesired:Integer) ; Tool $03,$31;
|
||||||
|
FUNCTION GetIntStateRecSize : Integer ; Tool $03,$32;
|
||||||
|
FUNCTION ReadMouse2 : MouseRec ; EXTERNAL ;
|
||||||
|
FUNCTION GetCodeResConverter : ProcPtr ; Tool $03,$34;
|
||||||
|
FUNCTION GetRomResource : Ptr ; Tool $03,$35;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
95
pascal/noteseq.p
Executable file
95
pascal/noteseq.p
Executable file
|
@ -0,0 +1,95 @@
|
||||||
|
{********************************************
|
||||||
|
; File: NoteSeq.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT NOTESEQ;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
pitchBend = $0; {Command - }
|
||||||
|
tempo = $00000001; {Command - }
|
||||||
|
turnNotesOff = $00000002; {Command - }
|
||||||
|
jump = $00000003; {Command - }
|
||||||
|
setVibratoDepth = $00000004; {Command - }
|
||||||
|
programChange = $00000005; {Command - }
|
||||||
|
setRegister = $00000006; {Command - }
|
||||||
|
ifGo = $00000007; {Command - }
|
||||||
|
incRegister = $00000008; {Command - }
|
||||||
|
decRegister = $00000009; {Command - }
|
||||||
|
midiNoteOff = $0000000A; {Command - }
|
||||||
|
midiNoteOn = $0000000B; {Command - }
|
||||||
|
midiPolyKey = $0000000C; {Command - }
|
||||||
|
midiCtlChange = $0000000D; {Command - }
|
||||||
|
midiProgChange = $0000000E; {Command - }
|
||||||
|
midiChnlPress = $0000000F; {Command - }
|
||||||
|
midiPitchBend = $00000010; {Command - }
|
||||||
|
midiSelChnlMode = $00000011; {Command - }
|
||||||
|
midiSysExclusive = $00000012; {Command - }
|
||||||
|
midiSysCommon = $00000013; {Command - }
|
||||||
|
midiSysRealTime = $00000014; {Command - }
|
||||||
|
midiSetSysExl = $00000015; {Command - }
|
||||||
|
commandMask = $0000007F; {Command - }
|
||||||
|
volumeMask = $0000007F; {Command - }
|
||||||
|
chord = $00000080; {Command - }
|
||||||
|
val1Mask = $00007F00; {Command - }
|
||||||
|
toneMask = $00007F00; {Command - }
|
||||||
|
noteMask = $00008000; {Command - }
|
||||||
|
lByte = $00FF0000; {Command - meaning depends on midi command }
|
||||||
|
durationMask = $07FF0000; {Command - }
|
||||||
|
trackMask = $78000000; {Command - }
|
||||||
|
delayMask = $80000000; {Command - }
|
||||||
|
hByte = $FF000000; {Command - }
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
noRoomMidiErr = $1A00; {error - }
|
||||||
|
noCommandErr = $1A01; {error - can't understand the current SeqItem }
|
||||||
|
noRoomErr = $1A02; {error - sequence is more than twelve levels deep }
|
||||||
|
startedErr = $1A03; {error - Note Sequencer is already started }
|
||||||
|
noNoteErr = $1A04; {error - can't find the note to be turned off by the current
|
||||||
|
SeqItem }
|
||||||
|
noStartErr = $1A05; {error - Note Sequencer not started yet }
|
||||||
|
instBndsErr = $1A06; {error - Instrument number out of Instrument boundary
|
||||||
|
range }
|
||||||
|
nsWrongVer = $1A07; {error - incompatible versions of NoteSequencer and
|
||||||
|
NoteSynthesizer }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
LocRecHndl = ^LocRecPtr;
|
||||||
|
LocRecPtr = ^LocRec;
|
||||||
|
LocRec = RECORD
|
||||||
|
curPhraseItem : Integer;
|
||||||
|
curPattItem : Integer;
|
||||||
|
curLevel : Integer;
|
||||||
|
END;
|
||||||
|
PROCEDURE SeqBootInit ; Tool $1A,$01;
|
||||||
|
PROCEDURE SeqStartUp ( dPageAddr:Integer; mode:Integer; updateRate:Integer;
|
||||||
|
increment:Integer) ; Tool $1A,$02;
|
||||||
|
PROCEDURE SeqShutDown ; Tool $1A,$03;
|
||||||
|
FUNCTION SeqVersion : Integer ; Tool $1A,$04;
|
||||||
|
PROCEDURE SeqReset ; Tool $1A,$05;
|
||||||
|
FUNCTION SeqStatus : Boolean ; Tool $1A,$06;
|
||||||
|
PROCEDURE SeqAllNotesOff ; Tool $1A,$0D;
|
||||||
|
FUNCTION ClearIncr : Integer ; Tool $1A,$0A;
|
||||||
|
FUNCTION GetLoc : LocRec ; EXTERNAL ;
|
||||||
|
FUNCTION GetTimer : Integer ; Tool $1A,$0B;
|
||||||
|
PROCEDURE SetIncr ( increment:Integer) ; Tool $1A,$09;
|
||||||
|
PROCEDURE SetInstTable ( instTable:Handle) ; Tool $1A,$12;
|
||||||
|
PROCEDURE SetTrkInfo ( priority:Integer; instIndex:Integer; trackNum:Integer)
|
||||||
|
; Tool $1A,$0E;
|
||||||
|
PROCEDURE StartInts ; Tool $1A,$13;
|
||||||
|
PROCEDURE StartSeq ( errHndlrRoutine:VoidProcPtr; compRoutine:VoidProcPtr;
|
||||||
|
sequence:Handle) ; Tool $1A,$0F;
|
||||||
|
PROCEDURE StepSeq ; Tool $1A,$10;
|
||||||
|
PROCEDURE StopInts ; Tool $1A,$14;
|
||||||
|
PROCEDURE StopSeq ( next:Integer) ; Tool $1A,$11;
|
||||||
|
PROCEDURE StartSeqRel ( errHandlerPtr:ProcPtr; compRoutine:ProcPtr;
|
||||||
|
sequence:Handle) ; Tool $1A,$15;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
87
pascal/notesyn.p
Executable file
87
pascal/notesyn.p
Executable file
|
@ -0,0 +1,87 @@
|
||||||
|
{********************************************
|
||||||
|
; File: NoteSyn.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT NOTESYN;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
CONST
|
||||||
|
nsAlreadyInit = $1901; {error - Note Syn already initialized }
|
||||||
|
nsSndNotInit = $1902; {error - Sound Tools not initialized }
|
||||||
|
nsNotAvail = $1921; {error - generator not available }
|
||||||
|
nsBadGenNum = $1922; {error - bad generator number }
|
||||||
|
nsNotInit = $1923; {error - Note Syn not initialized }
|
||||||
|
nsGenAlreadyOn = $1924; {error - generator already on }
|
||||||
|
soundWrongVer = $1925; {error - incompatible versions of Sound and NoteSyn }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
EnvelopeHndl = ^EnvelopePtr;
|
||||||
|
EnvelopePtr = ^Envelope;
|
||||||
|
Envelope = PACKED RECORD
|
||||||
|
st1BkPt : Byte;
|
||||||
|
st1Increment : Integer;
|
||||||
|
st2BkPt : Byte;
|
||||||
|
st2Increment : Integer;
|
||||||
|
st3BkPt : Byte;
|
||||||
|
st3Increment : Integer;
|
||||||
|
st4BkPt : Byte;
|
||||||
|
st4Increment : Integer;
|
||||||
|
st5BkPt : Byte;
|
||||||
|
st5Increment : Integer;
|
||||||
|
st6BkPt : Byte;
|
||||||
|
st6Increment : Integer;
|
||||||
|
st7BkPt : Byte;
|
||||||
|
st7Increment : Integer;
|
||||||
|
st8BkPt : Byte;
|
||||||
|
st8Increment : Integer;
|
||||||
|
END;
|
||||||
|
WaveFormHndl = ^WaveFormPtr;
|
||||||
|
WaveFormPtr = ^WaveForm;
|
||||||
|
WaveForm = PACKED RECORD
|
||||||
|
wfTopKey : Byte;
|
||||||
|
wfWaveAddress : Byte;
|
||||||
|
wfWaveSize : Byte;
|
||||||
|
wfDocMode : Byte;
|
||||||
|
wfRelPitch : Integer;
|
||||||
|
END;
|
||||||
|
InstrumentHndl = ^InstrumentPtr;
|
||||||
|
InstrumentPtr = ^Instrument;
|
||||||
|
Instrument = PACKED RECORD
|
||||||
|
theEnvelope : Envelope;
|
||||||
|
releaseSegment : Byte;
|
||||||
|
priorityIncrement : Byte;
|
||||||
|
pitchBendRange : Byte;
|
||||||
|
vibratoDepth : Byte;
|
||||||
|
vibratoSpeed : Byte;
|
||||||
|
inSpare : Byte;
|
||||||
|
aWaveCount : Byte;
|
||||||
|
bWaveCount : Byte;
|
||||||
|
aWaveList : ARRAY[1..1] OF WaveForm;
|
||||||
|
bWaveList : ARRAY[1..1] OF WaveForm;
|
||||||
|
END;
|
||||||
|
PROCEDURE NSBootInit ; Tool $19,$01;
|
||||||
|
PROCEDURE NSStartUp ( updateRate:Integer; userUpdateRtnPtr:Ptr) ; Tool
|
||||||
|
$19,$02;
|
||||||
|
PROCEDURE NSShutDown ; Tool $19,$03;
|
||||||
|
FUNCTION NSVersion : Integer ; Tool $19,$04;
|
||||||
|
PROCEDURE NSReset ; Tool $19,$05;
|
||||||
|
FUNCTION NSStatus : Boolean ; Tool $19,$06;
|
||||||
|
PROCEDURE AllNotesOff ; Tool $19,$0D;
|
||||||
|
FUNCTION AllocGen ( requestPriority:Integer) : Integer ; Tool $19,$09;
|
||||||
|
PROCEDURE DeallocGen ( genNumber:Integer) ; Tool $19,$0A;
|
||||||
|
PROCEDURE NoteOff ( genNumber:Integer; semitone:Integer) ; Tool $19,$0C;
|
||||||
|
PROCEDURE NoteOn ( genNumber:Integer; semitone:Integer; volume:Integer;
|
||||||
|
instrumentPtr:Ptr) ; Tool $19,$0B;
|
||||||
|
PROCEDURE NSSetUpdateRate ( updateRate:Integer) ; Tool $19,$0E;
|
||||||
|
FUNCTION NSSetUserUpdateRtn ( updateRtn:VoidProcPtr) : VoidProcPtr ; Tool
|
||||||
|
$19,$0F;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
165
pascal/print.p
Executable file
165
pascal/print.p
Executable file
|
@ -0,0 +1,165 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Print.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT PRINT;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,QUICKDRAW,EVENTS,CONTROLS,WINDOWS,LINEEDIT,DIALOGS;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
pntrConFailed = $1308; {error - connection to the printer failed }
|
||||||
|
memFullErr = $FF80; {errors - }
|
||||||
|
ioAbort = $FFE5; {errors - }
|
||||||
|
prAbort = $0080; {errors - }
|
||||||
|
missingDriver = $1301; {errors - specified driver not in system/drivers }
|
||||||
|
portNotOn = $1302; {errors - specified port not selected in ctl panel }
|
||||||
|
noPrintRecord = $1303; {errors - no print record was given }
|
||||||
|
badLaserPrep = $1304; {errors - laser prep in laser writer incompatible }
|
||||||
|
badLPFile = $1305; {errors - laser prep in system/drivers incompatible }
|
||||||
|
papConnNotOpen = $1306; {errors - cannot connect to laser writer }
|
||||||
|
papReadWriteErr = $1307; {errors - apple talk PAPRead or PAPWrite error }
|
||||||
|
ptrConnFailed = $1308; {errors - cannot establish connection with imagewriter }
|
||||||
|
badLoadParam = $1309; {errors - parameter for load/unload is invalid }
|
||||||
|
callNotSupported = $130A; {errors - toolcall made is not supported by this
|
||||||
|
version }
|
||||||
|
startUpAlreadyMade = $1321; {errors - low level startup already made }
|
||||||
|
invalidCtlVal = $1322; {errors - invalid control value had been spec'd }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
kReset = $0001; {LLDControl - Printer control value - reset printer }
|
||||||
|
kFormFeed = $0002; {LLDControl - Printer control value - form feed }
|
||||||
|
kLineFeed = $0003; {LLDControl - Printer control value - line feed }
|
||||||
|
bothDrivers = $0; {whichDriver - input to PMLoadDriver and PMUnloadDriver }
|
||||||
|
printerDriver = $0001; {whichDriver - input to PMLoadDriver and PMUnloadDriver
|
||||||
|
}
|
||||||
|
portDriver = $0002; {whichDriver - input to PMLoadDriver and PMUnloadDriver }
|
||||||
|
prPortrait = $0000; { - }
|
||||||
|
prLandscape = $0001; { - }
|
||||||
|
prImageWriter = $0001; { - }
|
||||||
|
prImageWriterLQ = $0002; { - }
|
||||||
|
prLaserWriter = $0003; { - }
|
||||||
|
prEpson = $0004; { - }
|
||||||
|
prBlackWhite = $0001; { - }
|
||||||
|
prColor = $0002; { - }
|
||||||
|
bDraftLoop = $0000; { - }
|
||||||
|
bSpoolLoop = $0080; { - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
PrPrinterSpecRec = RECORD
|
||||||
|
prPrinterType : Integer;
|
||||||
|
prCharacteristics : Integer;
|
||||||
|
END;
|
||||||
|
PrInfoRecHndl = ^PrInfoRecPtr;
|
||||||
|
PrInfoRecPtr = ^PrInfoRec;
|
||||||
|
PrInfoRec = RECORD
|
||||||
|
iDev : Integer; { reserved for internal use }
|
||||||
|
iVRes : Integer; { vertical resolution of printer }
|
||||||
|
iHRes : Integer; { horizontal resolution of printer }
|
||||||
|
rPage : Rect; { defining page rectangle }
|
||||||
|
END;
|
||||||
|
PrJobRecPtr = ^PrJobRec;
|
||||||
|
PrJobRec = PACKED RECORD
|
||||||
|
iFstPage : Integer; { first page to print }
|
||||||
|
iLstPage : Integer; { last page to print }
|
||||||
|
iCopies : Integer; { number of copies }
|
||||||
|
bJDocLoop : Byte; { printing method }
|
||||||
|
fFromUser : Byte; { used internally }
|
||||||
|
pIdleProc : WordProcPtr; { background procedure }
|
||||||
|
pFileName : Ptr; { spool file name }
|
||||||
|
iFileVol : Integer; { spool file volume reference number }
|
||||||
|
bFileVers : Byte; { spool file version number }
|
||||||
|
bJobX : Byte; { used internally }
|
||||||
|
END;
|
||||||
|
PrStyleRecHndl = ^PrStyleRecPtr;
|
||||||
|
PrStyleRecPtr = ^PrStyleRec;
|
||||||
|
PrStyleRec = RECORD
|
||||||
|
wDev : Integer; { output quality information }
|
||||||
|
internA : ARRAY[1..3] OF Integer; { for internal use }
|
||||||
|
feed : Integer; { paper feed type }
|
||||||
|
paperType : Integer; { paper type }
|
||||||
|
crWidth : Integer; { carriage Width for image writer or vertical sizing for
|
||||||
|
lazer writer }
|
||||||
|
reduction : Integer; { % reduction, laser writer only }
|
||||||
|
internB : Integer; { for internal use }
|
||||||
|
END;
|
||||||
|
PrRecHndl = ^PrRecPtr;
|
||||||
|
PrRecPtr = ^PrRec;
|
||||||
|
PrRec = RECORD
|
||||||
|
prVersion : Integer; { print manager version }
|
||||||
|
prInfo : PrInfoRec; { printer infomation subrecord }
|
||||||
|
rPaper : Rect; { Defining paper rectangle }
|
||||||
|
prStl : PrStyleRec; { style subrecord }
|
||||||
|
prInfoPT : PACKED ARRAY[1..14] OF Byte; { reserved for internal use }
|
||||||
|
prXInfo : PACKED ARRAY[1..24] OF Byte; { reserved for internal use }
|
||||||
|
prJob : PrJobRec; { job subrecord }
|
||||||
|
printX : PACKED ARRAY[1..38] OF Byte; { reserved for future use }
|
||||||
|
iReserved : Integer; { reserved for internal use }
|
||||||
|
END;
|
||||||
|
PrStatusRecHndl = ^PrStatusRecPtr;
|
||||||
|
PrStatusRecPtr = ^PrStatusRec;
|
||||||
|
PrStatusRec = RECORD
|
||||||
|
iTotPages : Integer; { number of pages in spool file }
|
||||||
|
iCurPage : Integer; { page being printed }
|
||||||
|
iTotCopies : Integer; { number of copies requested }
|
||||||
|
iCurCopy : Integer; { copy being printed }
|
||||||
|
iTotBands : Integer; { reserved for internal use }
|
||||||
|
iCurBand : Integer; { reserved for internal use }
|
||||||
|
fPgDirty : Integer; { TRUE if started printing page }
|
||||||
|
fImaging : Integer; { reserved for internal use }
|
||||||
|
hPrint : PrRecHndl; { handle of print record }
|
||||||
|
pPrPort : GrafPortPtr; { pointer to grafport being use for printing }
|
||||||
|
hPic : Longint; { reserved for internal use }
|
||||||
|
END;
|
||||||
|
PROCEDURE PMBootInit ; Tool $13,$01;
|
||||||
|
PROCEDURE PMStartUp ( userID:Integer; dPageAddr:Integer) ; Tool $13,$02;
|
||||||
|
PROCEDURE PMShutDown ; Tool $13,$03;
|
||||||
|
FUNCTION PMVersion : Integer ; Tool $13,$04;
|
||||||
|
PROCEDURE PMReset ; Tool $13,$05;
|
||||||
|
FUNCTION PMStatus : Boolean ; Tool $13,$06;
|
||||||
|
PROCEDURE LLDBitMap ( bitMapPtr:Ptr; rectPtr:Rect; userID:Integer) ; Tool
|
||||||
|
$13,$1C;
|
||||||
|
PROCEDURE LLDControl ( printerControlValue:Integer) ; Tool $13,$1B;
|
||||||
|
PROCEDURE LLDShutDown ( userID:Integer) ; Tool $13,$1A;
|
||||||
|
PROCEDURE LLDStartUp ( dPageAddr:Integer; userID:Integer) ; Tool $13,$19;
|
||||||
|
PROCEDURE LLDText ( textPtr:Ptr; textLength:Integer; userID:Integer) ; Tool
|
||||||
|
$13,$1D;
|
||||||
|
PROCEDURE PMLoadDriver ( whichDriver:Integer) ; Tool $13,$35;
|
||||||
|
PROCEDURE PMUnloadDriver ( whichDriver:Integer) ; Tool $13,$34;
|
||||||
|
FUNCTION PrChoosePrinter : Boolean ; Tool $13,$16;
|
||||||
|
FUNCTION PrChooser : Boolean ; Tool $13,$16;
|
||||||
|
PROCEDURE PrCloseDoc ( printGrafPortPtr:GrafPortPtr) ; Tool $13,$0F;
|
||||||
|
PROCEDURE PrClosePage ( printGrafPortPtr:GrafPortPtr) ; Tool $13,$11;
|
||||||
|
PROCEDURE PrDefault ( printRecordHandle:PrRecHndl) ; Tool $13,$09;
|
||||||
|
FUNCTION PrDriverVer : Integer ; Tool $13,$23;
|
||||||
|
FUNCTION PrError : Integer ; Tool $13,$14;
|
||||||
|
FUNCTION PrJobDialog ( printRecordHandle:PrRecHndl) : Boolean ; Tool $13,$0C;
|
||||||
|
FUNCTION PrOpenDoc ( printRecordHandle:PrRecHndl; printGrafPortPtr:GrafPortPtr)
|
||||||
|
: GrafPortPtr ; Tool $13,$0E;
|
||||||
|
PROCEDURE PrOpenPage ( printGrafPortPtr:GrafPortPtr; pageFramePtr:RectPtr) ;
|
||||||
|
Tool $13,$10;
|
||||||
|
PROCEDURE PrPicFile ( printRecordHandle:PrRecHndl;
|
||||||
|
printGrafPortPtr:GrafPortPtr; statusRecPtr:PrStatusRecPtr) ; Tool $13,$12;
|
||||||
|
PROCEDURE PrPixelMap ( srcLocPtr:LocInfoPtr; srcRectPtr:Rect;
|
||||||
|
colorFlag:Integer) ; Tool $13,$0D;
|
||||||
|
FUNCTION PrPortVer : Integer ; Tool $13,$24;
|
||||||
|
PROCEDURE PrSetError ( errorNumber:Integer) ; Tool $13,$15;
|
||||||
|
FUNCTION PrStlDialog ( printRecordHandle:PrRecHndl) : Boolean ; Tool $13,$0B;
|
||||||
|
FUNCTION PrValidate ( printRecordHandle:PrRecHndl) : Boolean ; Tool $13,$0A;
|
||||||
|
PROCEDURE PrSetDocName ( DocNamePtr:StringPtr) ; Tool $13,$37;
|
||||||
|
FUNCTION PrGetDocName : StringPtr ; Tool $13,$36;
|
||||||
|
FUNCTION PrGetPgOrientation ( prRecordHandle:PrRecHndl) : Integer ; Tool
|
||||||
|
$13,$38;
|
||||||
|
FUNCTION PrGetPrinterSpecs : PrPrinterSpecRec ; Tool $13,$18;
|
||||||
|
PROCEDURE PrGetZoneName (VAR ZoneNamePtr:Str255) ; Tool $13,$25;
|
||||||
|
PROCEDURE PrGetPrinterDvrName (VAR DvrNamePtr:Str255) ; Tool $13,$28;
|
||||||
|
PROCEDURE PrGetPortDvrName (VAR DvrNamePtr:Str255) ; Tool $13,$29;
|
||||||
|
PROCEDURE PrGetUserName (VAR UserNamePtr:Str255) ; Tool $13,$2A;
|
||||||
|
PROCEDURE PrGetNetworkName (VAR NetworkNamePtr:Str255) ; Tool $13,$2B;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
211
pascal/prodos16.p
Normal file
211
pascal/prodos16.p
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
FileAccess: mask Word {
|
||||||
|
7: destroyEnable
|
||||||
|
6: renameEnable
|
||||||
|
5: backupNeeded
|
||||||
|
1: writeEnable
|
||||||
|
0: readEnable
|
||||||
|
}
|
||||||
|
|
||||||
|
FileDate: mask Word {
|
||||||
|
15-9: year
|
||||||
|
8-5: month
|
||||||
|
4-0: day
|
||||||
|
}
|
||||||
|
|
||||||
|
FileTime: mask Word {
|
||||||
|
12-8: hour
|
||||||
|
5-0: minute
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageType: enum Word {
|
||||||
|
inactive: $0
|
||||||
|
seedling: $1
|
||||||
|
sapling: $2
|
||||||
|
tree: $3
|
||||||
|
pascal: $4
|
||||||
|
directory: $d
|
||||||
|
}
|
||||||
|
|
||||||
|
CREATE_PB: record {
|
||||||
|
pathname: ^String // 00
|
||||||
|
access: FileAccess // 04
|
||||||
|
file_type: Word // 06
|
||||||
|
aux_type: Long // 08
|
||||||
|
storage_type: StorageType // 0c
|
||||||
|
create_date: FileDate // 0e
|
||||||
|
create_time: FileTime // 10
|
||||||
|
}
|
||||||
|
|
||||||
|
DESTROY_PB: record {
|
||||||
|
pathname: ^String // 00
|
||||||
|
}
|
||||||
|
|
||||||
|
CHANGE_PATH_PB: record {
|
||||||
|
pathname: ^String // 00
|
||||||
|
new_pathname: ^String // 04
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_FILE_INFO_PB: record {
|
||||||
|
pathname: ^String // 00
|
||||||
|
access: FileAccess // 04
|
||||||
|
file_type: Word // 06
|
||||||
|
aux_type: Long // 08
|
||||||
|
unused: Word // 0c
|
||||||
|
create_date: FileDate // 0e
|
||||||
|
create_time: FileTime // 10
|
||||||
|
mod_date: FileDate // 12
|
||||||
|
mod_time: FileTime // 14
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_FILE_INFO_PB: record {
|
||||||
|
pathname: ^String // 00
|
||||||
|
access: FileAccess // 04
|
||||||
|
file_type: Word // 06
|
||||||
|
aux_type: Long // 08
|
||||||
|
storage_type: StorageType // 0c
|
||||||
|
create_date: FileDate // 0e
|
||||||
|
create_time: FileTime // 10
|
||||||
|
mod_date: FileDate // 12
|
||||||
|
mod_time: FileTime // 14
|
||||||
|
blocks_used: Long // 16
|
||||||
|
}
|
||||||
|
|
||||||
|
VOLUME_PB: record {
|
||||||
|
dev_name: ^String // 00
|
||||||
|
vol_name: ^String // 04
|
||||||
|
total_blocks: Long // 08
|
||||||
|
free_blocks: Long // 0c
|
||||||
|
file_sys_id: Word // 10
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_PREFIX_PB: record {
|
||||||
|
prefix_num: Word // 00
|
||||||
|
prefix: ^String // 02
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_PREFIX_PB: record {
|
||||||
|
prefix_num: Word // 00
|
||||||
|
prefix: ^String // 02
|
||||||
|
}
|
||||||
|
|
||||||
|
CLEAR_BACKUP_BIT_PB: record {
|
||||||
|
pathname: ^String // 00
|
||||||
|
}
|
||||||
|
|
||||||
|
OPEN_PB: record {
|
||||||
|
ref_num: Word // 00
|
||||||
|
pathname: ^String // 02
|
||||||
|
io_buffer: Ptr // 06
|
||||||
|
}
|
||||||
|
|
||||||
|
NEWLINE_PB: record {
|
||||||
|
ref_num: Word // 00
|
||||||
|
enable_Mask: Word // 02
|
||||||
|
newline_char: Word // 04
|
||||||
|
}
|
||||||
|
|
||||||
|
READ_PB: record {
|
||||||
|
ref_num: Word // 00
|
||||||
|
data_buffer: Ptr // 02
|
||||||
|
request_count: Long // 06
|
||||||
|
transfer_count: Long // 0a
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_PB: record {
|
||||||
|
ref_num: Word // 00
|
||||||
|
data_buffer: Ptr // 02
|
||||||
|
request_count: Long // 06
|
||||||
|
transfer_count: Long // 0a
|
||||||
|
}
|
||||||
|
|
||||||
|
CLOSE_PB: record {
|
||||||
|
ref_num: Word // 00
|
||||||
|
}
|
||||||
|
|
||||||
|
FLUSH_PB: record {
|
||||||
|
ref_num: Word // 00
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_MARK_PB: record {
|
||||||
|
ref_num: Word // 00
|
||||||
|
position: Long // 02
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_MARK_PB: record {
|
||||||
|
ref_num: Word // 00
|
||||||
|
position: Long // 02
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_EOF_PB: record {
|
||||||
|
ref_num: Word // 00
|
||||||
|
eof: Long // 02
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_EOF_PB: record {
|
||||||
|
ref_num: Word // 00
|
||||||
|
eof: Long // 02
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_LEVEL_PB: record {
|
||||||
|
level: Word // 00
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_LEVEL_PB: record {
|
||||||
|
level: Word // 00
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_DEV_NUM_PB: record {
|
||||||
|
dev_name: ^String // 00
|
||||||
|
dev_num: Word // 04
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_LAST_DEV_PB: record {
|
||||||
|
dev_num: Word // 00
|
||||||
|
}
|
||||||
|
|
||||||
|
READ_BLOCK_PB: record {
|
||||||
|
dev_num: Word // 00
|
||||||
|
data_buffer: Ptr // 02
|
||||||
|
block_num: Long // 06
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_BLOCK_PB: record {
|
||||||
|
dev_num: Word // 00
|
||||||
|
data_buffer: Ptr // 02
|
||||||
|
block_num: Long // 06
|
||||||
|
}
|
||||||
|
|
||||||
|
FORMAT_PB: record {
|
||||||
|
dev_name: ^String // 00
|
||||||
|
vol_name: ^String // 04
|
||||||
|
file_sys_id: Word // 08
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_NAME_PB: record {
|
||||||
|
data_buffer: ^String // 00
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_BOOT_VOL_PB: record {
|
||||||
|
data_buffer: ^String // 00
|
||||||
|
}
|
||||||
|
|
||||||
|
QUIT_PB: record {
|
||||||
|
pathname: ^String // 00
|
||||||
|
flags: mask Word { // 04
|
||||||
|
15: returnUserID
|
||||||
|
14: restartable
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_VERSION_PB: record {
|
||||||
|
version: Word // 00
|
||||||
|
}
|
||||||
|
|
||||||
|
ALLOC_INTERRUPT_PB: record {
|
||||||
|
int_num: Word // 00
|
||||||
|
int_code: Ptr // 02
|
||||||
|
}
|
||||||
|
|
||||||
|
DEALLOC_INTERRUPT_PB: record {
|
||||||
|
int_num: Word // 00
|
||||||
|
}
|
119
pascal/qdaux.p
Executable file
119
pascal/qdaux.p
Executable file
|
@ -0,0 +1,119 @@
|
||||||
|
{********************************************
|
||||||
|
; File: QDAux.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT QDAUX;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,QUICKDRAW;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Private Constants ***
|
||||||
|
frameVerb = $00; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picNop = $00; {PicInfo - PRIVATE - for reference only }
|
||||||
|
drawCharVerb = $00; {PicInfo - PRIVATE - for reference only }
|
||||||
|
paintVerb = $01; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picClipRgn = $01; {PicInfo - PRIVATE - for reference only }
|
||||||
|
drawTextVerb = $01; {PicInfo - PRIVATE - for reference only }
|
||||||
|
eraseVerb = $02; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picBkPat = $02; {PicInfo - PRIVATE - for reference only }
|
||||||
|
drawCStrVerb = $02; {PicInfo - PRIVATE - for reference only }
|
||||||
|
invertVerb = $03; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picTxFont = $03; {PicInfo - PRIVATE - for reference only }
|
||||||
|
fillVerb = $04; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picTxFace = $04; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picTxMode = $05; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picSpExtra = $06; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picPnSize = $07; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picPnMode = $08; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picPnPat = $09; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picThePat = $0A; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picOvSize = $0B; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picOrigin = $0C; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picTxSize = $0D; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picFGColor = $0E; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picBGColor = $0F; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picTxRatio = $10; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picVersion = $11; {PicInfo - PRIVATE - for reference only }
|
||||||
|
lineNoun = $20; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picLine = $20; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picLineFrom = $21; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picShortL = $22; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picShortLFrom = $23; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picLongText = $28; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picDHText = $29; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picDVText = $2A; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picDVDHText = $2B; {PicInfo - PRIVATE - for reference only }
|
||||||
|
rectNoun = $30; {PicInfo - PRIVATE - for reference only }
|
||||||
|
rRectNoun = $40; {PicInfo - PRIVATE - for reference only }
|
||||||
|
ovalNoun = $50; {PicInfo - PRIVATE - for reference only }
|
||||||
|
arcNoun = $60; {PicInfo - PRIVATE - for reference only }
|
||||||
|
polyNoun = $70; {PicInfo - PRIVATE - for reference only }
|
||||||
|
rgnNoun = $80; {PicInfo - PRIVATE - for reference only }
|
||||||
|
mapNoun = $90; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picBitsRect = $90; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picBitsRgn = $91; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picPBitsRect = $98; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picPBitsRgn = $99; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picShortComment = $A0; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picLongComment = $A1; {PicInfo - PRIVATE - for reference only }
|
||||||
|
picEnd = $FF; {PicInfo - PRIVATE - for reference only }
|
||||||
|
*** Private Constants *** *)
|
||||||
|
|
||||||
|
resMode640PMask = $00; {SeedFill/CalcMask - }
|
||||||
|
resMode640DMask = $01; {SeedFill/CalcMask - }
|
||||||
|
resMode320Mask = $02; {SeedFill/CalcMask - }
|
||||||
|
destModeCopyMask = $0000; {SeedFill/CalcMask - }
|
||||||
|
destModeLeaveMask = $1000; {SeedFill/CalcMask - }
|
||||||
|
destModeOnesMask = $2000; {SeedFill/CalcMask - }
|
||||||
|
destModeZerosMask = $3000; {SeedFill/CalcMask - }
|
||||||
|
destModeError = $1212; {Error - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
QDIconRecordHndl = ^QDIconRecordPtr;
|
||||||
|
QDIconRecordPtr = ^QDIconRecord;
|
||||||
|
QDIconRecord = RECORD
|
||||||
|
iconType : Integer;
|
||||||
|
iconSize : Integer;
|
||||||
|
iconHeight : Integer;
|
||||||
|
iconWidth : Integer;
|
||||||
|
iconImage : PACKED ARRAY[1..1] OF Byte;
|
||||||
|
iconMask : PACKED ARRAY[1..1] OF Byte;
|
||||||
|
END;
|
||||||
|
PicHndl = ^PicPtr;
|
||||||
|
PicPtr = ^Picture;
|
||||||
|
Picture = RECORD
|
||||||
|
picSCB : Integer;
|
||||||
|
picFrame : Rect; { Followed by picture opcodes }
|
||||||
|
END;
|
||||||
|
PROCEDURE QDAuxBootInit ; Tool $12,$01;
|
||||||
|
PROCEDURE QDAuxStartUp ; Tool $12,$02;
|
||||||
|
PROCEDURE QDAuxShutDown ; Tool $12,$03;
|
||||||
|
FUNCTION QDAuxVersion : Integer ; Tool $12,$04;
|
||||||
|
PROCEDURE QDAuxReset ; Tool $12,$05;
|
||||||
|
FUNCTION QDAuxStatus : Boolean ; Tool $12,$06;
|
||||||
|
PROCEDURE CopyPixels ( srcLocPtr:LocInfo; destLocPtr:LocInfo; srcRect:Rect;
|
||||||
|
destRect:Rect; xferMode:Integer; makeRgn:RgnHandle) ; Tool $12,$09;
|
||||||
|
PROCEDURE DrawIcon ( iconPtr:QDIconRecord; displayMode:Integer; xPos:Integer;
|
||||||
|
yPos:Integer) ; Tool $12,$0B;
|
||||||
|
PROCEDURE SpecialRect ( rectPtr:Rect; frameColor:Integer; fillColor:Integer) ;
|
||||||
|
Tool $12,$0C;
|
||||||
|
PROCEDURE WaitCursor ; Tool $12,$0A;
|
||||||
|
PROCEDURE SeedFill ( srcLocInfoPtr:LocInfo; srcRect:Rect;
|
||||||
|
dstLocInfoPtr:LocInfo; dstRect:Rect; seedH:Integer; seedV:Integer;
|
||||||
|
resMode:Integer; U__patternPtr:PatternPtr; leakTblPtr:Ptr) ; Tool $12,$0D;
|
||||||
|
PROCEDURE CalcMask ( srcLocInfoPtr:LocInfo; srcRect:Rect;
|
||||||
|
dstLocInfoPtr:LocInfo; dstRect:Rect; resMode:Integer; U__patternPtr:PatternPtr;
|
||||||
|
leakTblPtr:Ptr) ; Tool $12,$0E;
|
||||||
|
PROCEDURE PicComment ( kind:Integer; dataSize:Integer; dataHandle:Handle) ;
|
||||||
|
Tool $04,$B8;
|
||||||
|
PROCEDURE ClosePicture ; Tool $04,$B9;
|
||||||
|
PROCEDURE DrawPicture ( picHandle:PicHndl; destRect:Rect) ; Tool $04,$BA;
|
||||||
|
PROCEDURE KillPicture ( pichandle:PicHndl) ; Tool $04,$BB;
|
||||||
|
FUNCTION OpenPicture ( picFrame:Rect) : PicHndl ; Tool $04,$B7;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
510
pascal/quickdraw.p
Executable file
510
pascal/quickdraw.p
Executable file
|
@ -0,0 +1,510 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Quickdraw.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT QUICKDRAW;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
alreadyInitialized = $0401; {error - Quickdraw already initialized }
|
||||||
|
cannotReset = $0402; {error - never used }
|
||||||
|
notInitialized = $0403; {error - Quickdraw not initialized }
|
||||||
|
screenReserved = $0410; {error - screen reserved }
|
||||||
|
badRect = $0411; {error - bad rectangle }
|
||||||
|
notEqualChunkiness = $0420; {error - Chunkiness is not equal }
|
||||||
|
rgnAlreadyOpen = $0430; {error - region is already open }
|
||||||
|
rgnNotOpen = $0431; {error - region is not open }
|
||||||
|
rgnScanOverflow = $0432; {error - region scan overflow }
|
||||||
|
rgnFull = $0433; {error - region is full }
|
||||||
|
polyAlreadyOpen = $0440; {error - poly is already open }
|
||||||
|
polyNotOpen = $0441; {error - poly is not open }
|
||||||
|
polyTooBig = $0442; {error - poly is too big }
|
||||||
|
badTableNum = $0450; {error - bad table number }
|
||||||
|
badColorNum = $0451; {error - bad color number }
|
||||||
|
badScanLine = $0452; {error - bad scan line }
|
||||||
|
notImplemented = $04FF; {error - not implemented }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
tsNumber = $04; { - }
|
||||||
|
U_colorTable = $0F; {AnSCBByte - Mask for SCB color table }
|
||||||
|
scbReserved = $10; {AnSCBByte - Mask for SCB reserved bit }
|
||||||
|
scbFill = $20; {AnSCBByte - Mask for SCB fill bit }
|
||||||
|
scbInterrupt = $40; {AnSCBByte - Mask for SCB interrupt bit }
|
||||||
|
scbColorMode = $80; {AnSCBByte - Mask for SCB color mode bit }
|
||||||
|
table320 = $32; {ColorData - (val=size) }
|
||||||
|
table640 = $32; {ColorData - (val=size) }
|
||||||
|
blueMask = $000F; {ColorValue - Mask for Blue nibble }
|
||||||
|
greenMask = $00F0; {ColorValue - Mask for green nibble }
|
||||||
|
redMask = $0F00; {ColorValue - Mask for red nibble }
|
||||||
|
widMaxSize = $0001; {FontFlags - }
|
||||||
|
zeroSize = $0002; {FontFlags - }
|
||||||
|
maskSize = $08; {GrafPort - Mask Size (val=size) }
|
||||||
|
locSize = $10; {GrafPort - Loc Size (val=size) }
|
||||||
|
patsize = $20; {GrafPort - Pattern Size (val=size) }
|
||||||
|
pnStateSize = $32; {GrafPort - Pen State Size (Val=size) }
|
||||||
|
portSize = $AA; {GrafPort - Size of GrafPort }
|
||||||
|
black = $000; {MasterColors - These work in 320 and 640 mode }
|
||||||
|
blue = $00F; {MasterColors - These work in 320 and 640 mode }
|
||||||
|
darkGreen320 = $080; {MasterColors - These work in 320 mode }
|
||||||
|
green320 = $0E0; {MasterColors - These work in 320 mode }
|
||||||
|
green640 = $0F0; {MasterColors - These work in 640 mode }
|
||||||
|
lightBlue320 = $4DF; {MasterColors - These work in 320 mode }
|
||||||
|
purple320 = $72C; {MasterColors - These work in 320 mode }
|
||||||
|
darkGray320 = $777; {MasterColors - These work in 320 mode }
|
||||||
|
periwinkleBlue320 = $78F; {MasterColors - These work in 320 mode }
|
||||||
|
brown320 = $841; {MasterColors - These work in 320 mode }
|
||||||
|
lightGray320 = $0CCC; {MasterColors - These work in 320 mode }
|
||||||
|
red320 = $0D00; {MasterColors - These work in 320 mode }
|
||||||
|
lilac320 = $0DAF; {MasterColors - These work in 320 mode }
|
||||||
|
red640 = $0F00; {MasterColors - These work in 640 mode }
|
||||||
|
orange320 = $0F70; {MasterColors - These work in 320 mode }
|
||||||
|
flesh320 = $0FA9; {MasterColors - These work in 320 mode }
|
||||||
|
yellow = $0FF0; {MasterColors - These work in 320 and 640 mode }
|
||||||
|
white = $0FFF; {MasterColors - These work in 320 and 640 mode }
|
||||||
|
modeCopy = $0000; {PenModeDATA - }
|
||||||
|
modeOR = $0001; {PenModeDATA - }
|
||||||
|
modeXOR = $0002; {PenModeDATA - }
|
||||||
|
modeBIC = $0003; {PenModeDATA - }
|
||||||
|
modeForeCopy = $0004; {PenModeDATA - }
|
||||||
|
modeForeOR = $0005; {PenModeDATA - }
|
||||||
|
modeForeXOR = $0006; {PenModeDATA - }
|
||||||
|
modeForeBIC = $0007; {PenModeDATA - }
|
||||||
|
modeNOT = $8000; {PenModeDATA - }
|
||||||
|
notCopy = $8000; {PenModeDATA - }
|
||||||
|
notOR = $8001; {PenModeDATA - }
|
||||||
|
notXOR = $8002; {PenModeDATA - }
|
||||||
|
notBIC = $8003; {PenModeDATA - }
|
||||||
|
notForeCOPY = $8004; {PenModeDATA - }
|
||||||
|
notForeOR = $8005; {PenModeDATA - }
|
||||||
|
notForeXOR = $8006; {PenModeDATA - }
|
||||||
|
notForeBIC = $8007; {PenModeDATA - }
|
||||||
|
mode320 = $0000; {QDStartup - Argument to QDStartup }
|
||||||
|
mode640 = $0080; {QDStartup - Argument to QDStartup }
|
||||||
|
plainMask = $0000; {TextStyle - Mask for plain text bit }
|
||||||
|
boldMask = $0001; {TextStyle - Mask for bold bit }
|
||||||
|
italicMask = $0002; {TextStyle - Mask for italic bit }
|
||||||
|
underlineMask = $0004; {TextStyle - Mask for underline bit }
|
||||||
|
outlineMask = $0008; {TextStyle - Mask for outline bit }
|
||||||
|
shadowMask = $0010; {TextStyle - Mask for shadow bit }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
TextStyle = Integer ;
|
||||||
|
ColorValue = Integer ;
|
||||||
|
AnSCBByte = Byte ;
|
||||||
|
PatternPtr = ^Pattern;
|
||||||
|
Pattern = PACKED ARRAY[1..32] of Byte ;
|
||||||
|
Mask = PACKED ARRAY[1..8] OF Byte;
|
||||||
|
CursorHndl = ^CursorPtr;
|
||||||
|
CursorPtr = ^Cursor;
|
||||||
|
Cursor = RECORD
|
||||||
|
cursorHeight : Integer; { size in bytes }
|
||||||
|
cursorWidth : Integer; { enclosing rectangle }
|
||||||
|
cursorData : ARRAY[1..1,1..1] OF Integer;
|
||||||
|
cursorMask : ARRAY[1..1,1..1] OF Integer;
|
||||||
|
cursorHotSpot : Point;
|
||||||
|
END;
|
||||||
|
RgnHandle = ^RgnPtr;
|
||||||
|
RgnPtr = ^Region;
|
||||||
|
Region = RECORD
|
||||||
|
rgnSize : Integer; { size in bytes }
|
||||||
|
rgnBBox : Rect; { enclosing rectangle }
|
||||||
|
END;
|
||||||
|
BufDimRecHndl = ^BufDimRecPtr;
|
||||||
|
BufDimRecPtr = ^BufDimRec;
|
||||||
|
BufDimRec = RECORD
|
||||||
|
maxWidth : Integer;
|
||||||
|
textBufHeight : Integer;
|
||||||
|
textBufferWords : Integer;
|
||||||
|
fontWidth : Integer;
|
||||||
|
END;
|
||||||
|
FontHndl = ^FontPtr;
|
||||||
|
FontPtr = ^Font;
|
||||||
|
Font = RECORD
|
||||||
|
offseToMF : Integer; { fully defined front of the Font record. }
|
||||||
|
family : Integer;
|
||||||
|
style : TextStyle;
|
||||||
|
size : Integer;
|
||||||
|
version : Integer;
|
||||||
|
fbrExtent : Integer;
|
||||||
|
END;
|
||||||
|
FontGlobalsRecHndl = ^FontGlobalsRecPtr;
|
||||||
|
FontGlobalsRecPtr = ^FontGlobalsRecord;
|
||||||
|
FontGlobalsRecord = RECORD
|
||||||
|
fgFontID : Integer; { currently 12 bytes long, but may be expanded }
|
||||||
|
fgStyle : TextStyle;
|
||||||
|
fgSize : Integer;
|
||||||
|
fgVersion : Integer;
|
||||||
|
fgWidMax : Integer;
|
||||||
|
fgFBRExtent : Integer;
|
||||||
|
END;
|
||||||
|
FontIDHndl = ^FontIDPtr;
|
||||||
|
FontIDPtr = ^FontID;
|
||||||
|
FontID = PACKED RECORD
|
||||||
|
famNum : Integer;
|
||||||
|
fontStyle : Byte;
|
||||||
|
fontSize : Byte;
|
||||||
|
END;
|
||||||
|
FontInfoRecHndl = ^FontInfoRecPtr;
|
||||||
|
FontInfoRecPtr = ^FontInfoRecord;
|
||||||
|
FontInfoRecord = RECORD
|
||||||
|
ascent : Integer;
|
||||||
|
descent : Integer;
|
||||||
|
widMax : Integer;
|
||||||
|
leading : Integer;
|
||||||
|
END;
|
||||||
|
LocInfoHndl = ^LocInfoPtr;
|
||||||
|
LocInfoPtr = ^LocInfo;
|
||||||
|
LocInfo = RECORD
|
||||||
|
portSCB : Integer; { SCBByte in low byte }
|
||||||
|
ptrToPixImage : Ptr; { ImageRef }
|
||||||
|
width : Integer; { Width }
|
||||||
|
boundsRect : Rect; { BoundsRect }
|
||||||
|
END;
|
||||||
|
QDProcsHndl = ^QDProcsPtr;
|
||||||
|
QDProcsPtr = ^QDProcs;
|
||||||
|
QDProcs = RECORD
|
||||||
|
stdText : VoidProcPtr;
|
||||||
|
stdLine : VoidProcPtr;
|
||||||
|
stdRect : VoidProcPtr;
|
||||||
|
stdRRect : VoidProcPtr;
|
||||||
|
stdOval : VoidProcPtr;
|
||||||
|
stdArc : VoidProcPtr;
|
||||||
|
stdPoly : VoidProcPtr;
|
||||||
|
stdRgn : VoidProcPtr;
|
||||||
|
stdPixels : VoidProcPtr;
|
||||||
|
stdComment : VoidProcPtr;
|
||||||
|
stdTxMeas : VoidProcPtr;
|
||||||
|
stdTxBnds : VoidProcPtr;
|
||||||
|
stdGetPic : VoidProcPtr;
|
||||||
|
stdPutPic : VoidProcPtr;
|
||||||
|
END;
|
||||||
|
GrafPortHndl = ^GrafPortPtr;
|
||||||
|
GrafPortPtr = ^GrafPort;
|
||||||
|
GrafPort = RECORD
|
||||||
|
portInfo : LocInfo;
|
||||||
|
portRect : Rect; { PortRect }
|
||||||
|
clipRgn : RgnHandle; { Clip Rgn. Pointer }
|
||||||
|
visRgn : RgnHandle; { Vis. Rgn. Pointer }
|
||||||
|
bkPat : Pattern; { BackGround Pattern }
|
||||||
|
pnLoc : Point; { Pen Location }
|
||||||
|
pnSize : Point; { Pen Size }
|
||||||
|
pnMode : Integer; { Pen Mode }
|
||||||
|
pnPat : Pattern; { Pen Pattern }
|
||||||
|
pnMask : Mask; { Pen Mask }
|
||||||
|
pnVis : Integer; { Pen Visable }
|
||||||
|
fontHandle : FontHndl;
|
||||||
|
gfontID : FontID; { Font ID }
|
||||||
|
fontFlags : Integer; { FontFlags }
|
||||||
|
txSize : Integer; { Text Size }
|
||||||
|
txFace : TextStyle; { Text Face }
|
||||||
|
txMode : Integer; { Text Mode }
|
||||||
|
spExtra : Fixed; { Fixed Point Value }
|
||||||
|
chExtra : Fixed; { Fixed Point Value }
|
||||||
|
fgColor : Integer; { ForeGround Color }
|
||||||
|
bgColor : Integer; { BackGround Color }
|
||||||
|
picSave : Handle; { PicSave }
|
||||||
|
rgnSave : Handle; { RgnSave }
|
||||||
|
polySave : Handle; { PolySave }
|
||||||
|
grafProcs : QDProcsPtr;
|
||||||
|
arcRot : Integer; { ArcRot }
|
||||||
|
userField : Longint; { UserField }
|
||||||
|
sysField : Longint; { SysField }
|
||||||
|
END;
|
||||||
|
PaintParamHndl = ^PaintParamPtr;
|
||||||
|
PaintParamPtr = ^PaintParam;
|
||||||
|
PaintParam = RECORD
|
||||||
|
ptrToSourceLocInfo : LocInfoPtr;
|
||||||
|
ptrToDestLocInfo : LocInfoPtr;
|
||||||
|
ptrToSourceRect : RectPtr;
|
||||||
|
ptrToDestPoint : PointPtr;
|
||||||
|
mode : Integer;
|
||||||
|
maskHandle : Handle; { clip region }
|
||||||
|
END;
|
||||||
|
PenStateHndl = ^PenStatePtr;
|
||||||
|
PenStatePtr = ^PenState;
|
||||||
|
PenState = RECORD
|
||||||
|
psPnSize : Point;
|
||||||
|
psPnMode : Integer;
|
||||||
|
psPnPat : Pattern;
|
||||||
|
psPnMask : Mask;
|
||||||
|
END;
|
||||||
|
RomFontRecHndl = ^RomFontRecPtr;
|
||||||
|
RomFontRecPtr = ^RomFontRec;
|
||||||
|
RomFontRec = RECORD
|
||||||
|
rfFamNum : Integer;
|
||||||
|
rfFamStyle : Integer;
|
||||||
|
rfSize : Integer;
|
||||||
|
rfFontHandle : FontHndl;
|
||||||
|
rfNamePtr : Ptr;
|
||||||
|
rfFBRExtent : Integer;
|
||||||
|
END;
|
||||||
|
ColorTableHndl = ^ColorTablePtr;
|
||||||
|
ColorTablePtr = ^ColorTable;
|
||||||
|
ColorTable = RECORD
|
||||||
|
entries : ARRAY[1..16] OF Integer;
|
||||||
|
END;
|
||||||
|
PROCEDURE QDBootInit ; Tool $04,$01;
|
||||||
|
PROCEDURE QDStartUp ( dPageAddr:Integer; masterSCB:Integer; maxWidth:Integer;
|
||||||
|
userID:Integer) ; Tool $04,$02;
|
||||||
|
PROCEDURE QDShutDown ; Tool $04,$03;
|
||||||
|
FUNCTION QDVersion : Integer ; Tool $04,$04;
|
||||||
|
PROCEDURE QDReset ; Tool $04,$05;
|
||||||
|
FUNCTION QDStatus : Boolean ; Tool $04,$06;
|
||||||
|
PROCEDURE AddPt (VAR srcPtPtr:Point;VAR destPtPtr:Point) ; Tool $04,$80;
|
||||||
|
PROCEDURE CharBounds ( theChar:CHAR;VAR resultPtr:Rect) ; Tool $04,$AC;
|
||||||
|
FUNCTION CharWidth ( theChar:CHAR) : Integer ; Tool $04,$A8;
|
||||||
|
PROCEDURE ClearScreen ( colorWord:Integer) ; Tool $04,$15;
|
||||||
|
PROCEDURE ClipRect ( rectPtr:Rect) ; Tool $04,$26;
|
||||||
|
PROCEDURE ClosePoly ; Tool $04,$C2;
|
||||||
|
PROCEDURE ClosePort ( portPtr:GrafPortPtr) ; Tool $04,$1A;
|
||||||
|
PROCEDURE CloseRgn ( aRgnHandle:RgnHandle) ; Tool $04,$6E;
|
||||||
|
PROCEDURE CopyRgn ( srcRgnHandle:RgnHandle; destRgnHandle:RgnHandle) ; Tool
|
||||||
|
$04,$69;
|
||||||
|
PROCEDURE CStringBounds ( cStringPtr:Ptr;VAR resultRect:Rect) ; Tool $04,$AE;
|
||||||
|
FUNCTION CStringWidth ( cStringPtr:Ptr) : Integer ; Tool $04,$AA;
|
||||||
|
PROCEDURE DiffRgn ( rgn1Handle:RgnHandle; rgn2Handle:RgnHandle;
|
||||||
|
diffRgnHandle:RgnHandle) ; Tool $04,$73;
|
||||||
|
PROCEDURE DisposeRgn ( aRgnHandle:RgnHandle) ; Tool $04,$68;
|
||||||
|
PROCEDURE DrawChar ( theChar:CHAR) ; Tool $04,$A4;
|
||||||
|
PROCEDURE DrawCString ( cStrPtr:CStringPtr) ; Tool $04,$A6;
|
||||||
|
PROCEDURE DrawString ( str:Str255) ; Tool $04,$A5;
|
||||||
|
PROCEDURE DrawText ( textPtr:Ptr; textLength:Integer) ; Tool $04,$A7;
|
||||||
|
FUNCTION NotEmptyRect ( rectPtr:Rect) : Boolean ; Tool $04,$52;
|
||||||
|
FUNCTION EmptyRgn ( aRgnHandle:RgnHandle) : Boolean ; Tool $04,$78;
|
||||||
|
FUNCTION EqualPt (VAR point1Ptr:Point;VAR point2Ptr:Point) : Boolean ; Tool
|
||||||
|
$04,$83;
|
||||||
|
FUNCTION EqualRect ( rect1Ptr:Rect; rect2Ptr:Rect) : Boolean ; Tool $04,$51;
|
||||||
|
FUNCTION EqualRgn ( rgn1Handle:RgnHandle; rgn2Handle:RgnHandle) : Boolean ;
|
||||||
|
Tool $04,$77;
|
||||||
|
PROCEDURE EraseArc ( rectPtr:Rect; startAngle:Integer; arcAngle:Integer) ;
|
||||||
|
Tool $04,$64;
|
||||||
|
PROCEDURE EraseOval ( rectPtr:Rect) ; Tool $04,$5A;
|
||||||
|
PROCEDURE ErasePoly ( polyHandle:Handle) ; Tool $04,$BE;
|
||||||
|
PROCEDURE EraseRect ( rectPtr:Rect) ; Tool $04,$55;
|
||||||
|
PROCEDURE EraseRgn ( aRgnHandle:RgnHandle) ; Tool $04,$7B;
|
||||||
|
PROCEDURE EraseRRect ( rectPtr:Rect; ovalWidth:Integer; ovalHeight:Integer) ;
|
||||||
|
Tool $04,$5F;
|
||||||
|
PROCEDURE FillArc ( rectPtr:Rect; startAngle:Integer; arcAngle:Integer;
|
||||||
|
patternPtr:Pattern) ; Tool $04,$66;
|
||||||
|
PROCEDURE FillOval ( rectPtr:Rect; patternPtr:Pattern) ; Tool $04,$5C;
|
||||||
|
PROCEDURE FillPoly ( polyHandle:Handle; patternPtr:Pattern) ; Tool $04,$C0;
|
||||||
|
PROCEDURE FillRect ( rectPtr:Rect; patternPtr:Pattern) ; Tool $04,$57;
|
||||||
|
PROCEDURE FillRgn ( aRgnHandle:RgnHandle; patternPtr:Pattern) ; Tool $04,$7D;
|
||||||
|
PROCEDURE FillRRect ( rectPtr:Rect; ovalWidth:Integer; ovalHeight:Integer;
|
||||||
|
patternPtr:Pattern) ; Tool $04,$61;
|
||||||
|
PROCEDURE ForceBufDims ( maxWidth:Integer; maxFontHeight:Integer;
|
||||||
|
maxFBRExtent:Integer) ; Tool $04,$CC;
|
||||||
|
PROCEDURE FrameArc ( rectPtr:Rect; startAngle:Integer; arcAngle:Integer) ;
|
||||||
|
Tool $04,$62;
|
||||||
|
PROCEDURE FrameOval ( rectPtr:Rect) ; Tool $04,$58;
|
||||||
|
PROCEDURE FramePoly ( polyHandle:Handle) ; Tool $04,$BC;
|
||||||
|
PROCEDURE FrameRect ( rectPtr:Rect) ; Tool $04,$53;
|
||||||
|
PROCEDURE FrameRgn ( aRgnHandle:RgnHandle) ; Tool $04,$79;
|
||||||
|
PROCEDURE FrameRRect ( rectPtr:Rect; ovalWidth:Integer; ovalHeight:Integer) ;
|
||||||
|
Tool $04,$5D;
|
||||||
|
FUNCTION GetAddress ( tableID:Integer) : Ptr ; Tool $04,$09;
|
||||||
|
FUNCTION GetArcRot : Integer ; Tool $04,$B1;
|
||||||
|
FUNCTION GetBackColor : Integer ; Tool $04,$A3;
|
||||||
|
PROCEDURE GetBackPat (VAR patternPtr:Pattern) ; Tool $04,$35;
|
||||||
|
FUNCTION GetCharExtra : Fixed ; Tool $04,$D5;
|
||||||
|
PROCEDURE GetClip ( aRgnHandle:RgnHandle) ; Tool $04,$25;
|
||||||
|
FUNCTION GetClipHandle : RgnHandle ; Tool $04,$C7;
|
||||||
|
FUNCTION GetColorEntry ( tableNumber:Integer; entryNumber:Integer) : Integer ;
|
||||||
|
Tool $04,$11;
|
||||||
|
PROCEDURE GetColorTable ( tableNumber:Integer;VAR destTablePtr:ColorTable) ;
|
||||||
|
Tool $04,$0F;
|
||||||
|
FUNCTION GetCursorAdr : CursorPtr ; Tool $04,$8F;
|
||||||
|
FUNCTION GetFGSize : Integer ; Tool $04,$CF;
|
||||||
|
FUNCTION GetFont : FontHndl ; Tool $04,$95;
|
||||||
|
FUNCTION GetFontFlags : Integer ; Tool $04,$99;
|
||||||
|
PROCEDURE GetFontGlobals (VAR fgRecPtr:FontGlobalsRecord) ; Tool $04,$97;
|
||||||
|
FUNCTION GetFontID : FontID ; Tool $04,$D1;
|
||||||
|
PROCEDURE GetFontInfo (VAR fontInfoRecPtr:FontInfoRecord) ; Tool $04,$96;
|
||||||
|
FUNCTION GetFontLore (VAR recordPtr:FontGlobalsRecord; recordSize:Integer) :
|
||||||
|
Integer ; Tool $04,$D9;
|
||||||
|
FUNCTION GetForeColor : Integer ; Tool $04,$A1;
|
||||||
|
FUNCTION GetGrafProcs : QDProcsPtr ; Tool $04,$45;
|
||||||
|
FUNCTION GetMasterSCB : Integer ; Tool $04,$17;
|
||||||
|
PROCEDURE GetPen (VAR pointPtr:Point) ; Tool $04,$29;
|
||||||
|
PROCEDURE GetPenMask (VAR maskPtr:Mask) ; Tool $04,$33;
|
||||||
|
FUNCTION GetPenMode : Integer ; Tool $04,$2F;
|
||||||
|
PROCEDURE GetPenPat (VAR patternPtr:Pattern) ; Tool $04,$31;
|
||||||
|
PROCEDURE GetPenSize (VAR pointPtr:Point) ; Tool $04,$2D;
|
||||||
|
PROCEDURE GetPenState (VAR U__penStatePtr:PenState) ; Tool $04,$2B;
|
||||||
|
FUNCTION GetPicSave : Longint ; Tool $04,$3F;
|
||||||
|
FUNCTION GetPixel ( h:Integer; v:Integer) : Integer ; Tool $04,$88;
|
||||||
|
FUNCTION GetPolySave : Longint ; Tool $04,$43;
|
||||||
|
FUNCTION GetPort : GrafPortPtr ; Tool $04,$1C;
|
||||||
|
PROCEDURE GetPortLoc (VAR locInfoPtr:LocInfo) ; Tool $04,$1E;
|
||||||
|
PROCEDURE GetPortRect (VAR U__rectPtr:Rect) ; Tool $04,$20;
|
||||||
|
FUNCTION GetRgnSave : Longint ; Tool $04,$41;
|
||||||
|
PROCEDURE GetROMFont (VAR recordPtr:RomFontRec) ; Tool $04,$D8;
|
||||||
|
FUNCTION GetSCB ( scanLine:Integer) : Integer ; Tool $04,$13;
|
||||||
|
FUNCTION GetSpaceExtra : Fixed ; Tool $04,$9F;
|
||||||
|
FUNCTION GetStandardSCB : Integer ; Tool $04,$0C;
|
||||||
|
FUNCTION GetSysField : Longint ; Tool $04,$49;
|
||||||
|
FUNCTION GetSysFont : FontHndl ; Tool $04,$B3;
|
||||||
|
FUNCTION GetTextFace : TextStyle ; Tool $04,$9B;
|
||||||
|
FUNCTION GetTextMode : Integer ; Tool $04,$9D;
|
||||||
|
FUNCTION GetTextSize : Integer ; Tool $04,$D3;
|
||||||
|
FUNCTION GetUserField : Longint ; Tool $04,$47;
|
||||||
|
FUNCTION GetVisHandle : RgnHandle ; Tool $04,$C9;
|
||||||
|
PROCEDURE GetVisRgn ( aRgnHandle:RgnHandle) ; Tool $04,$B5;
|
||||||
|
PROCEDURE GlobalToLocal (VAR pointPtr:Point) ; Tool $04,$85;
|
||||||
|
PROCEDURE GrafOff ; Tool $04,$0B;
|
||||||
|
PROCEDURE GrafOn ; Tool $04,$0A;
|
||||||
|
PROCEDURE HideCursor ; Tool $04,$90;
|
||||||
|
PROCEDURE HidePen ; Tool $04,$27;
|
||||||
|
PROCEDURE InflateTextBuffer ( newWidth:Integer; newHeight:Integer) ; Tool
|
||||||
|
$04,$D7;
|
||||||
|
PROCEDURE InitColorTable (VAR tablePtr:ColorTable) ; Tool $04,$0D;
|
||||||
|
PROCEDURE InitCursor ; Tool $04,$CA;
|
||||||
|
PROCEDURE InitPort ( portPtr:GrafPortPtr) ; Tool $04,$19;
|
||||||
|
PROCEDURE InsetRect (VAR U__rectPtr:Rect; deltaH:Integer; deltaV:Integer) ;
|
||||||
|
Tool $04,$4C;
|
||||||
|
PROCEDURE InsetRgn ( aRgnHandle:RgnHandle; dH:Integer; dV:Integer) ; Tool
|
||||||
|
$04,$70;
|
||||||
|
PROCEDURE InvertArc ( rectPtr:Rect; startAngle:Integer; arcAngle:Integer) ;
|
||||||
|
Tool $04,$65;
|
||||||
|
PROCEDURE InvertOval ( rectPtr:Rect) ; Tool $04,$5B;
|
||||||
|
PROCEDURE InvertPoly ( polyHandle:Handle) ; Tool $04,$BF;
|
||||||
|
PROCEDURE InvertRect ( rectPtr:Rect) ; Tool $04,$56;
|
||||||
|
PROCEDURE InvertRgn ( aRgnHandle:RgnHandle) ; Tool $04,$7C;
|
||||||
|
PROCEDURE InvertRRect ( rectPtr:Rect; ovalWidth:Integer; ovalHeight:Integer) ;
|
||||||
|
Tool $04,$60;
|
||||||
|
PROCEDURE KillPoly ( polyHandle:Handle) ; Tool $04,$C3;
|
||||||
|
PROCEDURE Line ( dH:Integer; dV:Integer) ; Tool $04,$3D;
|
||||||
|
PROCEDURE LineTo ( h:Integer; v:Integer) ; Tool $04,$3C;
|
||||||
|
PROCEDURE LocalToGlobal (VAR pointPtr:Point) ; Tool $04,$84;
|
||||||
|
PROCEDURE MapPoly ( polyHandle:Handle; srcRectPtr:Rect; destRectPtr:Rect) ;
|
||||||
|
Tool $04,$C5;
|
||||||
|
PROCEDURE MapPt (VAR pointPtr:Point; srcRectPtr:Rect; destRectPtr:Rect) ; Tool
|
||||||
|
$04,$8A;
|
||||||
|
PROCEDURE MapRect (VAR rectPtr:Rect; srcRectPtr:Rect; destRectPtr:Rect) ; Tool
|
||||||
|
$04,$8B;
|
||||||
|
PROCEDURE MapRgn ( aRgnHandle:RgnHandle; srcRectPtr:Rect; destdRectPtr:Rect) ;
|
||||||
|
Tool $04,$8C;
|
||||||
|
PROCEDURE Move ( dH:Integer; dV:Integer) ; Tool $04,$3B;
|
||||||
|
PROCEDURE MovePortTo ( h:Integer; v:Integer) ; Tool $04,$22;
|
||||||
|
PROCEDURE MoveTo ( h:Integer; v:Integer) ; Tool $04,$3A;
|
||||||
|
FUNCTION NewRgn : RgnHandle ; Tool $04,$67;
|
||||||
|
PROCEDURE ObscureCursor ; Tool $04,$92;
|
||||||
|
PROCEDURE OffsetPoly ( polyHandle:Handle; dH:Integer; dV:Integer) ; Tool
|
||||||
|
$04,$C4;
|
||||||
|
PROCEDURE OffsetRect (VAR U__rectPtr:Rect; deltaH:Integer; deltaV:Integer) ;
|
||||||
|
Tool $04,$4B;
|
||||||
|
PROCEDURE OffsetRgn ( aRgnHandle:RgnHandle; dH:Integer; dV:Integer) ; Tool
|
||||||
|
$04,$6F;
|
||||||
|
FUNCTION OpenPoly : handle ; Tool $04,$C1;
|
||||||
|
PROCEDURE OpenPort ( portPtr:GrafPortPtr) ; Tool $04,$18;
|
||||||
|
PROCEDURE OpenRgn ; Tool $04,$6D;
|
||||||
|
PROCEDURE PaintArc ( rectPtr:Rect; startAngle:Integer; arcAngle:Integer) ;
|
||||||
|
Tool $04,$63;
|
||||||
|
PROCEDURE PaintOval ( rectPtr:Rect) ; Tool $04,$59;
|
||||||
|
PROCEDURE PaintPixels ( U__paintParamPtr:PaintParam) ; Tool $04,$7F;
|
||||||
|
PROCEDURE PaintPoly ( polyHandle:Handle) ; Tool $04,$BD;
|
||||||
|
PROCEDURE PaintRect ( rectPtr:Rect) ; Tool $04,$54;
|
||||||
|
PROCEDURE PaintRgn ( aRgnHandle:RgnHandle) ; Tool $04,$7A;
|
||||||
|
PROCEDURE PaintRRect ( rectPtr:Rect; ovalWidth:Integer; ovalHeight:Integer) ;
|
||||||
|
Tool $04,$5E;
|
||||||
|
PROCEDURE PenNormal ; Tool $04,$36;
|
||||||
|
PROCEDURE PPToPort ( srcLocPtr:LocInfoPtr; srcRectPtr:Rect; destX:Integer;
|
||||||
|
destY:Integer; transferMode:Integer) ; Tool $04,$D6;
|
||||||
|
PROCEDURE Pt2Rect (VAR point1Ptr:Point;VAR point2Ptr:Point;VAR U__rectPtr:Rect)
|
||||||
|
; Tool $04,$50;
|
||||||
|
FUNCTION PtInRect (VAR pointPtr:Point; rectPtr:Rect) : Boolean ; Tool $04,$4F;
|
||||||
|
FUNCTION PtInRgn (VAR pointPtr:Point; aRgnHandle:RgnHandle) : Boolean ; Tool
|
||||||
|
$04,$75;
|
||||||
|
FUNCTION Random : Integer ; Tool $04,$86;
|
||||||
|
FUNCTION RectInRgn ( rectPtr:Rect; aRgnHandle:RgnHandle) : Boolean ; Tool
|
||||||
|
$04,$76;
|
||||||
|
PROCEDURE RectRgn ( aRgnHandle:RgnHandle; rectPtr:Rect) ; Tool $04,$6C;
|
||||||
|
PROCEDURE RestoreBufDims ( sizeInfoPtr:BufDimRecPtr) ; Tool $04,$CE;
|
||||||
|
PROCEDURE SaveBufDims (VAR sizeInfoPtr:BufDimRec) ; Tool $04,$CD;
|
||||||
|
PROCEDURE ScalePt (VAR pointPtr:Point; srcRectPtr:Rect; destRectPtr:Rect) ;
|
||||||
|
Tool $04,$89;
|
||||||
|
PROCEDURE ScrollRect ( rectPtr:Rect; dH:Integer; dV:Integer;
|
||||||
|
aRgnHandle:RgnHandle) ; Tool $04,$7E;
|
||||||
|
FUNCTION SectRect ( rect1Ptr:Rect; rect2Ptr:Rect;VAR intersectRectPtr:Rect) :
|
||||||
|
Boolean ; Tool $04,$4D;
|
||||||
|
PROCEDURE SectRgn ( rgn1Handle:RgnHandle; rgn2Handle:RgnHandle;
|
||||||
|
destRgnHandle:RgnHandle) ; Tool $04,$71;
|
||||||
|
PROCEDURE SetAllSCBs ( newSCB:Integer) ; Tool $04,$14;
|
||||||
|
PROCEDURE SetArcRot ; Tool $04,$B0;
|
||||||
|
PROCEDURE SetBackColor ( backColor:Integer) ; Tool $04,$A2;
|
||||||
|
PROCEDURE SetBackPat ( patternPtr:Pattern) ; Tool $04,$34;
|
||||||
|
PROCEDURE SetBufDims ( maxWidth:Integer; maxFontHeight:Integer;
|
||||||
|
maxFBRExtent:Integer) ; Tool $04,$CB;
|
||||||
|
PROCEDURE SetCharExtra ( charExtra:Fixed) ; Tool $04,$D4;
|
||||||
|
PROCEDURE SetClip ( aRgnHandle:RgnHandle) ; Tool $04,$24;
|
||||||
|
PROCEDURE SetClipHandle ( aRgnHandle:RgnHandle) ; Tool $04,$C6;
|
||||||
|
PROCEDURE SetColorEntry ( tableNumber:Integer; entryNumber:Integer;
|
||||||
|
newColor:ColorValue) ; Tool $04,$10;
|
||||||
|
PROCEDURE SetColorTable ( tableNumber:Integer; srcTablePtr:ColorTable) ; Tool
|
||||||
|
$04,$0E;
|
||||||
|
PROCEDURE SetCursor ( theCursorPtr:Cursor) ; Tool $04,$8E;
|
||||||
|
PROCEDURE SetEmptyRgn ( aRgnHandle:RgnHandle) ; Tool $04,$6A;
|
||||||
|
PROCEDURE SetFont ( newFontHandle:FontHndl) ; Tool $04,$94;
|
||||||
|
PROCEDURE SetFontFlags ( fontFlags:Integer) ; Tool $04,$98;
|
||||||
|
PROCEDURE SetFontID (VAR U__fontID:FontID) ; Tool $04,$D0;
|
||||||
|
PROCEDURE SetForeColor ( foreColor:Integer) ; Tool $04,$A0;
|
||||||
|
PROCEDURE SetGrafProcs ( grafProcsPtr:QDProcsPtr) ; Tool $04,$44;
|
||||||
|
PROCEDURE SetIntUse ( useInt:Integer) ; Tool $04,$B6;
|
||||||
|
PROCEDURE SetMasterSCB ( masterSCB:Integer) ; Tool $04,$16;
|
||||||
|
PROCEDURE SetOrigin ( h:Integer; v:Integer) ; Tool $04,$23;
|
||||||
|
PROCEDURE SetPenMask ( maskPtr:Mask) ; Tool $04,$32;
|
||||||
|
PROCEDURE SetPenMode ( penMode:Integer) ; Tool $04,$2E;
|
||||||
|
PROCEDURE SetPenPat ( patternPtr:Pattern) ; Tool $04,$30;
|
||||||
|
PROCEDURE SetPenSize ( penWidth:Integer; penHeight:Integer) ; Tool $04,$2C;
|
||||||
|
PROCEDURE SetPenState (VAR U__penStatePtr:PenState) ; Tool $04,$2A;
|
||||||
|
PROCEDURE SetPicSave ( picSaveValue:Longint) ; Tool $04,$3E;
|
||||||
|
PROCEDURE SetPolySave ( polySaveValue:Longint) ; Tool $04,$42;
|
||||||
|
PROCEDURE SetPort ( portPtr:GrafPortPtr) ; Tool $04,$1B;
|
||||||
|
PROCEDURE SetPortLoc ( U__locInfoPtr:LocInfo) ; Tool $04,$1D;
|
||||||
|
PROCEDURE SetPortRect ( rectPtr:Rect) ; Tool $04,$1F;
|
||||||
|
PROCEDURE SetPortSize ( portWidth:Integer; portHeight:Integer) ; Tool $04,$21;
|
||||||
|
PROCEDURE SetPt (VAR srcPtPtr:Point; h:Integer; v:Integer) ; Tool $04,$82;
|
||||||
|
PROCEDURE SetRandSeed ( randomSeed:Longint) ; Tool $04,$87;
|
||||||
|
PROCEDURE SetRect (VAR aRectPtr:Rect; left:Integer; top:Integer; right:Integer;
|
||||||
|
bottom:Integer) ; Tool $04,$4A;
|
||||||
|
PROCEDURE SetRectRgn ( aRgnHandle:RgnHandle; left:Integer; top:Integer;
|
||||||
|
right:Integer; bottom:Integer) ; Tool $04,$6B;
|
||||||
|
PROCEDURE SetRgnSave ( rgnSaveValue:Longint) ; Tool $04,$40;
|
||||||
|
PROCEDURE SetSCB ( scanLine:Integer; newSCB:Integer) ; Tool $04,$12;
|
||||||
|
PROCEDURE SetSolidBackPat ( colorNum:Integer) ; Tool $04,$38;
|
||||||
|
PROCEDURE SetSolidPenPat ( colorNum:Integer) ; Tool $04,$37;
|
||||||
|
PROCEDURE SetSpaceExtra ( spaceExtra:Fixed) ; Tool $04,$9E;
|
||||||
|
PROCEDURE SetStdProcs ( stdProcRecPtr:QDProcsPtr) ; Tool $04,$8D;
|
||||||
|
PROCEDURE SetSysField ( sysFieldValue:Longint) ; Tool $04,$48;
|
||||||
|
PROCEDURE SetSysFont ( fontHandle:FontHndl) ; Tool $04,$B2;
|
||||||
|
PROCEDURE SetTextFace ( textFace:TextStyle) ; Tool $04,$9A;
|
||||||
|
PROCEDURE SetTextMode ( textMode:Integer) ; Tool $04,$9C;
|
||||||
|
PROCEDURE SetTextSize ( textSize:Integer) ; Tool $04,$D2;
|
||||||
|
PROCEDURE SetUserField ( userFieldValue:Longint) ; Tool $04,$46;
|
||||||
|
PROCEDURE SetVisHandle ( aRgnHandle:RgnHandle) ; Tool $04,$C8;
|
||||||
|
PROCEDURE SetVisRgn ( aRgnHandle:RgnHandle) ; Tool $04,$B4;
|
||||||
|
PROCEDURE ShowCursor ; Tool $04,$91;
|
||||||
|
PROCEDURE ShowPen ; Tool $04,$28;
|
||||||
|
PROCEDURE SolidPattern ( colorNum:Integer;VAR patternPtr:Pattern) ; Tool
|
||||||
|
$04,$39;
|
||||||
|
PROCEDURE StringBounds ( str:Str255;VAR resultPtr:Rect) ; Tool $04,$AD;
|
||||||
|
FUNCTION StringWidth ( str:Str255) : Integer ; Tool $04,$A9;
|
||||||
|
PROCEDURE SubPt (VAR srcPtPtr:Point;VAR destPtPtr:Point) ; Tool $04,$81;
|
||||||
|
PROCEDURE TextBounds ( textPtr:Ptr; textLength:Integer;VAR resultPtr:Rect) ;
|
||||||
|
Tool $04,$AF;
|
||||||
|
FUNCTION TextWidth ( textPtr:Ptr; textLength:Integer) : Integer ; Tool $04,$AB;
|
||||||
|
PROCEDURE UnionRect ( rect1Ptr:Rect; rect2Ptr:Rect;VAR unionRectPtr:Rect) ;
|
||||||
|
Tool $04,$4E;
|
||||||
|
PROCEDURE UnionRgn ( rgn1Handle:RgnHandle; rgn2Handle:RgnHandle;
|
||||||
|
unionRgnHandle:RgnHandle) ; Tool $04,$72;
|
||||||
|
PROCEDURE XorRgn ( rgn1Handle:RgnHandle; rgn2Handle:RgnHandle;
|
||||||
|
xorRgnHandle:RgnHandle) ; Tool $04,$74;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
184
pascal/resources.p
Executable file
184
pascal/resources.p
Executable file
|
@ -0,0 +1,184 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Resources.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT RESOURCES;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,MEMORY,GSOS;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
resLogOut = $0; {ResourceConverter - }
|
||||||
|
resLogIn = $1; {ResourceConverter - }
|
||||||
|
resLogApp = $0; {ResourceConverter - }
|
||||||
|
resLogSys = $2; {ResourceConverter - }
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
resForkUsed = $1E01; {Error - Resource fork not empty }
|
||||||
|
resBadFormat = $1E02; {Error - Format of resource fork is unknown }
|
||||||
|
resForkEmpty = $1E03; {Error - Resource fork is empty }
|
||||||
|
resNoCurFile = $1E04; {Error - there are no current open resource files }
|
||||||
|
resDupID = $1E05; {Error - ID is already used }
|
||||||
|
resNotFound = $1E06; {Error - resource was not found }
|
||||||
|
resFileNotFound = $1E07; {Error - resource file not found }
|
||||||
|
resBadAppID = $1E08; {Error - User ID not found, please call ResourceStartup }
|
||||||
|
resNoUniqueID = $1E09; {Error - a unique ID was not found }
|
||||||
|
resBadAttr = $1E0A; {Error - reseved bits in attributes word are not zero }
|
||||||
|
resHashGone = $1E0B; {Error - the hash count table is no longer valid }
|
||||||
|
resIndexRange = $1E0D; {Error - index is out of range }
|
||||||
|
resNoCurApp = $1E0E; {Error - no current application, please call
|
||||||
|
ResourceStartup }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
resChanged = $0020; {Resources - }
|
||||||
|
resPreLoad = $0040; {Resources - }
|
||||||
|
resProtected = $0080; {Resources - }
|
||||||
|
resAbsLoad = $0400; {Resources - }
|
||||||
|
resConverter = $0800; {Resources - }
|
||||||
|
resMemAttr = $C3F1; {Resources - }
|
||||||
|
systemMap = $0001; {Resources - }
|
||||||
|
mapChanged = $0002; {Resources - }
|
||||||
|
romMap = $0004; {Resources - }
|
||||||
|
resNameOffset = $10000; {Resources - type holding names }
|
||||||
|
resNameVersion = $0001; {Resources - }
|
||||||
|
rIcon = $8001; {Resources - resource type holding names }
|
||||||
|
rPicture = $8002; {Resources - resource type holding names }
|
||||||
|
rControlList = $8003; {Resources - resource type holding names }
|
||||||
|
rControlTemplate = $8004; {Resources - resource type holding names }
|
||||||
|
rWindow = $8005; {Resources - resource type holding names }
|
||||||
|
rString = $8006; {Resources - resource type holding names }
|
||||||
|
rStringList = $8007; {Resources - resource type holding names }
|
||||||
|
rMenuBar = $8008; {Resources - resource type holding names }
|
||||||
|
rMenu = $8009; {Resources - resource type holding names }
|
||||||
|
rMenuItem = $800A; {Resources - resource type holding names }
|
||||||
|
rTextForLETextBox2 = $800B; {Resources - resource type holding names }
|
||||||
|
rCtlDefProc = $800C; {Resources - resource type holding names }
|
||||||
|
rCtlColorTbl = $800D; {Resources - resource type holding names }
|
||||||
|
rWindParam1 = $800E; {Resources - resource type holding names }
|
||||||
|
rWindParam2 = $800F; {Resources - resource type holding names }
|
||||||
|
rWindColor = $8010; {Resources - resource type holding names }
|
||||||
|
rResName = $8014; {Resources - resource type holding names }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
ResID = Longint ;
|
||||||
|
ResType = Integer ;
|
||||||
|
ResAttr = Integer ;
|
||||||
|
|
||||||
|
|
||||||
|
ResHeaderRec = RECORD
|
||||||
|
rFileVersion : Longint; { Format version of resource fork }
|
||||||
|
rFileToMap : Longint; { Offset from start to resource map record }
|
||||||
|
rFileMapSize : Longint; { Number of bytes map occupies in file }
|
||||||
|
rFileMemo : PACKED ARRAY[1..128] OF Byte; { Reserved space for application
|
||||||
|
}
|
||||||
|
rFileRecSize : Longint; { Size of ResHeaderRec Record }
|
||||||
|
END;
|
||||||
|
FreeBlockRec = RECORD
|
||||||
|
blkOffset : Longint;
|
||||||
|
blkSize : Longint;
|
||||||
|
END;
|
||||||
|
ResMapHandle = ^ResMapPtr;
|
||||||
|
ResMapPtr = ^ResMap;
|
||||||
|
ResMap = RECORD
|
||||||
|
mapNext : ResMapHandle; { Handle to next resource map }
|
||||||
|
mapFlag : Integer; { Bit Flags }
|
||||||
|
mapOffset : Longint; { Map's file position }
|
||||||
|
mapSize : Longint; { Number of bytes map occupies in file }
|
||||||
|
mapToIndex : Integer;
|
||||||
|
mapFileNum : Integer;
|
||||||
|
mapID : Integer;
|
||||||
|
mapIndexSize : Longint;
|
||||||
|
mapIndexUsed : Longint;
|
||||||
|
mapFreeListSize : Integer;
|
||||||
|
mapFreeListUsed : Integer;
|
||||||
|
mapFreeList : ARRAY[1..1] OF FreeBlockRec; { n bytes (array of free block
|
||||||
|
records) }
|
||||||
|
END;
|
||||||
|
ResRefRecPtr = ^ResRefRec;
|
||||||
|
ResRefRec = RECORD
|
||||||
|
fResType : ResType;
|
||||||
|
fResID : ResID;
|
||||||
|
fResOffset : Longint;
|
||||||
|
fResAttr : ResAttr;
|
||||||
|
fResSize : Longint;
|
||||||
|
fResHandle : Handle;
|
||||||
|
END;
|
||||||
|
ResourceSpec = RECORD
|
||||||
|
resourceType : ResType;
|
||||||
|
resourceID : ResID;
|
||||||
|
END;
|
||||||
|
ResNameEntryPtr = ^ResNameEntry;
|
||||||
|
ResNameEntry = RECORD
|
||||||
|
namedResID : ResID;
|
||||||
|
resName : Str255;
|
||||||
|
END;
|
||||||
|
ResNameRecordHandle = ^ResNameRecordPtr;
|
||||||
|
ResNameRecordPtr = ^ResNameRecord;
|
||||||
|
ResNameRecord = RECORD
|
||||||
|
version : Integer;
|
||||||
|
nameCount : Longint;
|
||||||
|
resNameEntries : ARRAY[1..1] OF ResNameEntry;
|
||||||
|
END;
|
||||||
|
PROCEDURE ResourceBootInit ; Tool $1E,$01;
|
||||||
|
PROCEDURE ResourceStartup ( userID:Integer) ; Tool $1E,$02;
|
||||||
|
PROCEDURE ResourceShutdown ; Tool $1E,$03;
|
||||||
|
FUNCTION ResourceVersion : Integer ; Tool $1E,$04;
|
||||||
|
PROCEDURE ResourceReset ; Tool $1E,$05;
|
||||||
|
FUNCTION ResourceStatus : Boolean ; Tool $1E,$06;
|
||||||
|
PROCEDURE AddResource ( resourceHandle:Handle; resourceAttr:ResAttr;
|
||||||
|
resourceType:ResType; resourceID:ResID) ; Tool $1E,$0C;
|
||||||
|
PROCEDURE CloseResourceFile ( fileID:Integer) ; Tool $1E,$0B;
|
||||||
|
FUNCTION CountResources ( resourceType:ResType) : Longint ; Tool $1E,$22;
|
||||||
|
FUNCTION CountTypes : Integer ; Tool $1E,$20;
|
||||||
|
PROCEDURE CreateResourceFile ( auxType:Longint; fileType:Integer;
|
||||||
|
fileAccess:Integer; fileName:GSString255Ptr) ; Tool $1E,$09;
|
||||||
|
PROCEDURE DetachResource ( resourceType:ResType; resourceID:ResID) ; Tool
|
||||||
|
$1E,$18;
|
||||||
|
FUNCTION GetCurResourceApp : Integer ; Tool $1E,$14;
|
||||||
|
FUNCTION GetCurResourceFile : Integer ; Tool $1E,$12;
|
||||||
|
FUNCTION GetIndResource ( resourceType:ResType; resourceIndex:Longint) : ResID
|
||||||
|
; Tool $1E,$23;
|
||||||
|
FUNCTION GetIndType ( typeIndex:Integer) : ResType ; Tool $1E,$21;
|
||||||
|
FUNCTION GetMapHandle ( fileID:Integer) : ResMapHandle ; Tool $1E,$26;
|
||||||
|
FUNCTION GetOpenFileRefNum ( fileID:Integer) : Integer ; Tool $1E,$1F;
|
||||||
|
FUNCTION GetResourceAttr ( resourceType:ResType; resourceID:ResID) : ResAttr ;
|
||||||
|
Tool $1E,$1B;
|
||||||
|
FUNCTION GetResourceSize ( resourceType:ResType; currentID:ResID) : Longint ;
|
||||||
|
Tool $1E,$1D;
|
||||||
|
FUNCTION HomeResourceFile ( resourceType:ResType; resourceID:ResID) : Integer ;
|
||||||
|
Tool $1E,$15;
|
||||||
|
FUNCTION LoadAbsResource ( loadAddress:Longint; maxSize:Longint;
|
||||||
|
resourceType:ResType; resourceID:ResID) : Handle ; Tool $1E,$27;
|
||||||
|
FUNCTION LoadResource ( resourceType:ResType; resourceID:ResID) : Handle ; Tool
|
||||||
|
$1E,$0E;
|
||||||
|
PROCEDURE MarkResourceChange ( U__changeFlag:Boolean; resourceType:ResType;
|
||||||
|
resourceID:ResID) ; Tool $1E,$10;
|
||||||
|
PROCEDURE MatchResourceHandle ( foundRec:Ptr; resourceHandle:Handle) ; Tool
|
||||||
|
$1E,$1E;
|
||||||
|
FUNCTION OpenResourceFile ( openAccess:Integer; resourceMapPtr:ResMapPtr;
|
||||||
|
fileName:GSString255Ptr) : Integer ; Tool $1E,$0A;
|
||||||
|
PROCEDURE ReleaseResource ( purgeLevel:Integer; resourceType:ResType;
|
||||||
|
resourceID:ResID) ; Tool $1E,$17;
|
||||||
|
PROCEDURE RemoveResource ( resourceType:ResType; resourceID:ResID) ; Tool
|
||||||
|
$1E,$0F;
|
||||||
|
PROCEDURE ResourceConverter ( converterProc:ProcPtr; resourceType:ResType;
|
||||||
|
logFlags:Integer) ; Tool $1E,$28;
|
||||||
|
PROCEDURE SetCurResourceApp ( userID:Integer) ; Tool $1E,$13;
|
||||||
|
PROCEDURE SetCurResourceFile ( fileID:Integer) ; Tool $1E,$11;
|
||||||
|
PROCEDURE SetResourceAttr ( resourceAttr:ResAttr; resourceType:ResType;
|
||||||
|
currentID:ResID) ; Tool $1E,$1C;
|
||||||
|
FUNCTION SetResourceFileDepth ( searchDepth:Integer) : Integer ; Tool $1E,$25;
|
||||||
|
PROCEDURE SetResourceID ( newID:ResID; resourceType:ResType; currentID:ResID)
|
||||||
|
; Tool $1E,$1A;
|
||||||
|
FUNCTION SetResourceLoad ( readFlag:Integer) : Integer ; Tool $1E,$24;
|
||||||
|
FUNCTION UniqueResourceID ( IDrange:Integer; resourceType:ResType) : ResID ;
|
||||||
|
Tool $1E,$19;
|
||||||
|
PROCEDURE UpdateResourceFile ( fileID:Integer) ; Tool $1E,$0D;
|
||||||
|
PROCEDURE WriteResource ( resourceType:ResType; resourceID:ResID) ; Tool
|
||||||
|
$1E,$16;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
222
pascal/sane.p
Executable file
222
pascal/sane.p
Executable file
|
@ -0,0 +1,222 @@
|
||||||
|
UNIT SANE;
|
||||||
|
|
||||||
|
{ Apple IIGS SANE Interfaces
|
||||||
|
|
||||||
|
See the Apple Numerics Manual for complete documentation
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 1986-1988 by TML Systems, Inc. All Rights Reserved.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
{ The SANE environment word (Integer) is defined as follows:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERFACE
|
||||||
|
|
||||||
|
CONST DecStrLen = 255;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{ Standard housekeeping routines }
|
||||||
|
|
||||||
|
PROCEDURE SANEStartUp
|
||||||
|
|
||||||
|
PROCEDURE SANEShutDown;
|
||||||
|
FUNCTION SANEVersion: Integer;
|
||||||
|
PROCEDURE SANEReset;
|
||||||
|
FUNCTION SANEStatus: Integer;
|
||||||
|
|
||||||
|
{ Conversions between numeric binary types }
|
||||||
|
|
||||||
|
FUNCTION Num2Integer
|
||||||
|
|
||||||
|
FUNCTION Num2Longint
|
||||||
|
|
||||||
|
FUNCTION Num2Real
|
||||||
|
|
||||||
|
FUNCTION Num2Double
|
||||||
|
|
||||||
|
FUNCTION Num2Extended
|
||||||
|
|
||||||
|
FUNCTION Num2Comp
|
||||||
|
|
||||||
|
|
||||||
|
{ Conversions between binary and decimal }
|
||||||
|
|
||||||
|
PROCEDURE Num2Dec
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION Dec2Num
|
||||||
|
|
||||||
|
|
||||||
|
{ Conversions between decimal formats }
|
||||||
|
|
||||||
|
PROCEDURE Str2Dec
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE CStr2Dec
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE Dec2Str
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{ Arithmetic, auxiliary and elementary functions }
|
||||||
|
|
||||||
|
FUNCTION Remainder
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION Rint
|
||||||
|
|
||||||
|
FUNCTION Scalb
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION Logb
|
||||||
|
|
||||||
|
FUNCTION Log2
|
||||||
|
|
||||||
|
FUNCTION Ln1
|
||||||
|
|
||||||
|
FUNCTION Exp2
|
||||||
|
|
||||||
|
FUNCTION Exp1
|
||||||
|
|
||||||
|
FUNCTION Tan
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION CopySign
|
||||||
|
|
||||||
|
FUNCTION NextExtended
|
||||||
|
|
||||||
|
FUNCTION XpwrI
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION XpwrY
|
||||||
|
|
||||||
|
FUNCTION Compound
|
||||||
|
|
||||||
|
FUNCTION Annuity
|
||||||
|
|
||||||
|
FUNCTION RandomX
|
||||||
|
|
||||||
|
|
||||||
|
{ Inquirty routines }
|
||||||
|
|
||||||
|
FUNCTION ClassReal
|
||||||
|
|
||||||
|
FUNCTION ClassDouble
|
||||||
|
|
||||||
|
FUNCTION ClassComp
|
||||||
|
|
||||||
|
FUNCTION ClassExtended
|
||||||
|
|
||||||
|
FUNCTION SignNum
|
||||||
|
|
||||||
|
|
||||||
|
{ NaN function }
|
||||||
|
|
||||||
|
FUNCTION NAN
|
||||||
|
|
||||||
|
|
||||||
|
{ Environment control routines }
|
||||||
|
|
||||||
|
FUNCTION GetHaltVector: Integer;
|
||||||
|
PROCEDURE SetHaltVector
|
||||||
|
|
||||||
|
|
||||||
|
{ Environment access routines }
|
||||||
|
PROCEDURE SetEnvironment
|
||||||
|
|
||||||
|
PROCEDURE GetEnvironment
|
||||||
|
|
||||||
|
PROCEDURE ProcEntry
|
||||||
|
|
||||||
|
PROCEDURE ProcExit
|
||||||
|
|
||||||
|
|
||||||
|
{ Comparison routine }
|
||||||
|
|
||||||
|
FUNCTION Relation
|
||||||
|
|
||||||
|
|
||||||
|
IMPLEMENTATION
|
||||||
|
|
||||||
|
END.
|
22
pascal/scheduler.p
Executable file
22
pascal/scheduler.p
Executable file
|
@ -0,0 +1,22 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Scheduler.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT SCHEDULER;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
PROCEDURE SchBootInit ; Tool $07,$01;
|
||||||
|
PROCEDURE SchStartUp ; Tool $07,$02;
|
||||||
|
PROCEDURE SchShutDown ; Tool $07,$03;
|
||||||
|
FUNCTION SchVersion : Integer ; Tool $07,$04;
|
||||||
|
PROCEDURE SchReset ; Tool $07,$05;
|
||||||
|
FUNCTION SchStatus : Boolean ; Tool $07,$06;
|
||||||
|
FUNCTION SchAddTask ( taskPtr:VoidProcPtr) : Boolean ; Tool $07,$09;
|
||||||
|
PROCEDURE SchFlush ; Tool $07,$0A;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
40
pascal/scrap.p
Executable file
40
pascal/scrap.p
Executable file
|
@ -0,0 +1,40 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Scrap.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT SCRAP;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
badScrapType = $1610; {error - No scrap of this type. }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
textScrap = $0000; {scrapType - }
|
||||||
|
picScrap = $0001; {scrapType - }
|
||||||
|
PROCEDURE ScrapBootInit ; Tool $16,$01;
|
||||||
|
PROCEDURE ScrapStartUp ; Tool $16,$02;
|
||||||
|
PROCEDURE ScrapShutDown ; Tool $16,$03;
|
||||||
|
FUNCTION ScrapVersion : Integer ; Tool $16,$04;
|
||||||
|
PROCEDURE ScrapReset ; Tool $16,$05;
|
||||||
|
FUNCTION ScrapStatus : Boolean ; Tool $16,$06;
|
||||||
|
PROCEDURE GetScrap ( destHandle:Handle; scrapType:Integer) ; Tool $16,$0D;
|
||||||
|
FUNCTION GetScrapCount : Integer ; Tool $16,$12;
|
||||||
|
FUNCTION GetScrapHandle ( scrapType:Integer) : handle ; Tool $16,$0E;
|
||||||
|
FUNCTION GetScrapPath : Ptr ; Tool $16,$10;
|
||||||
|
FUNCTION GetScrapSize ( scrapType:Integer) : Longint ; Tool $16,$0F;
|
||||||
|
FUNCTION GetScrapState : Integer ; Tool $16,$13;
|
||||||
|
PROCEDURE LoadScrap ; Tool $16,$0A;
|
||||||
|
PROCEDURE PutScrap ( numBytes:Longint; scrapType:Integer; srcPtr:Ptr) ; Tool
|
||||||
|
$16,$0C;
|
||||||
|
PROCEDURE SetScrapPath ( path:Str255) ; Tool $16,$11;
|
||||||
|
PROCEDURE UnloadScrap ; Tool $16,$09;
|
||||||
|
PROCEDURE ZeroScrap ; Tool $16,$0B;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
115
pascal/sound.p
Executable file
115
pascal/sound.p
Executable file
|
@ -0,0 +1,115 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Sound.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT SOUND;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
noDOCFndErr = $0810; {error - no DOC chip found }
|
||||||
|
docAddrRngErr = $0811; {error - DOC address range error }
|
||||||
|
noSAppInitErr = $0812; {error - no SAppInit call made }
|
||||||
|
invalGenNumErr = $0813; {error - invalid generator number }
|
||||||
|
synthModeErr = $0814; {error - synthesizer mode error }
|
||||||
|
genBusyErr = $0815; {error - generator busy error }
|
||||||
|
mstrIRQNotAssgnErr = $0817; {error - master IRQ not assigned }
|
||||||
|
sndAlreadyStrtErr = $0818; {error - sound tools already started }
|
||||||
|
unclaimedSndIntErr = $08FF; {error - sound tools already started }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
ffSynthMode = $0001; {channelGenMode - Free form synthesizer mode }
|
||||||
|
noteSynthMode = $0002; {channelGenMode - Note synthesizer mode. }
|
||||||
|
gen0off = $0001; {genMask - param to FFStopSound }
|
||||||
|
gen1off = $0002; {genMask - param to FFStopSound }
|
||||||
|
gen2off = $0004; {genMask - param to FFStopSound }
|
||||||
|
gen3off = $0008; {genMask - param to FFStopSound }
|
||||||
|
gen4off = $0010; {genMask - param to FFStopSound }
|
||||||
|
gen5off = $0020; {genMask - param to FFStopSound }
|
||||||
|
gen6off = $0040; {genMask - param to FFStopSound }
|
||||||
|
gen7off = $0080; {genMask - param to FFStopSound }
|
||||||
|
gen8off = $0100; {genMask - param to FFStopSound }
|
||||||
|
gen9off = $0200; {genMask - param to FFStopSound }
|
||||||
|
gen10off = $0400; {genMask - param to FFStopSound }
|
||||||
|
gen11off = $0800; {genMask - param to FFStopSound }
|
||||||
|
gen12off = $1000; {genMask - param to FFStopSound }
|
||||||
|
gen13off = $2000; {genMask - param to FFStopSound }
|
||||||
|
gen14off = $4000; {genMask - param to FFStopSound }
|
||||||
|
genAvail = $0000; {genStatus - Generator available status }
|
||||||
|
ffSynth = $0100; {genStatus - Free Form Synthesizer status }
|
||||||
|
noteSynth = $0200; {genStatus - Note Synthesizer status }
|
||||||
|
lastBlock = $8000; {genStatus - Last block of wave }
|
||||||
|
smReadRegister = $00; {Jump Table Offset - Read Register routine }
|
||||||
|
smWriteRegister = $04; {Jump Table Offset - Write Register routine }
|
||||||
|
smReadRam = $08; {Jump Table Offset - Read Ram routine }
|
||||||
|
smWriteRam = $0C; {Jump Table Offset - Write Ram routine }
|
||||||
|
smReadNext = $10; {Jump Table Offset - Read Next routine }
|
||||||
|
smWriteNext = $14; {Jump Table Offset - Write Next routine }
|
||||||
|
smOscTable = $18; {Jump Table Offset - Pointer to Oscillator table }
|
||||||
|
smGenTable = $1C; {Jump Table Offset - Pointer to generator table }
|
||||||
|
smGcbAddrTable = $20; {Jump Table Offset - Pointer to GCB address table }
|
||||||
|
smDisableInc = $24; {Jump Table Offset - Disable Increment routine }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
SoundPBHndl = ^SoundPBPtr;
|
||||||
|
SoundPBPtr = ^SoundParamBlock;
|
||||||
|
SoundParamBlock = RECORD
|
||||||
|
waveStart : Ptr; { starting address of wave }
|
||||||
|
waveSize : Integer; { waveform size in pages }
|
||||||
|
freqOffset : Integer; { ? formula to be provided }
|
||||||
|
docBuffer : Integer; { DOC buffer start address, low byte = 0 }
|
||||||
|
bufferSize : Integer; { DOC buffer start address, low byte = 0 }
|
||||||
|
nextWavePtr : SoundPBPtr; { Pointer to start of next wave's parameter block
|
||||||
|
}
|
||||||
|
volSetting : Integer; { DOC volume setting. High byte = 0 }
|
||||||
|
END;
|
||||||
|
DocRegParamBlkPtr = ^DocRegParamBlk;
|
||||||
|
DocRegParamBlk = PACKED RECORD
|
||||||
|
oscGenType : Integer;
|
||||||
|
freqLow1 : Byte;
|
||||||
|
freqHigh1 : Byte;
|
||||||
|
vol1 : Byte;
|
||||||
|
tablePtr1 : Byte;
|
||||||
|
control1 : Byte;
|
||||||
|
tableSize1 : Byte;
|
||||||
|
freqLow2 : Byte;
|
||||||
|
freqHigh2 : Byte;
|
||||||
|
vol2 : Byte;
|
||||||
|
tablePtr2 : Byte;
|
||||||
|
control2 : Byte;
|
||||||
|
tableSize2 : Byte;
|
||||||
|
END;
|
||||||
|
PROCEDURE SoundBootInit ; Tool $08,$01;
|
||||||
|
PROCEDURE SoundStartUp ( dPageAddr:Integer) ; Tool $08,$02;
|
||||||
|
PROCEDURE SoundShutDown ; Tool $08,$03;
|
||||||
|
FUNCTION SoundVersion : Integer ; Tool $08,$04;
|
||||||
|
PROCEDURE SoundReset ; Tool $08,$05;
|
||||||
|
FUNCTION SoundToolStatus : Boolean ; Tool $08,$06;
|
||||||
|
FUNCTION FFGeneratorStatus ( genNumber:Integer) : Integer ; Tool $08,$11;
|
||||||
|
FUNCTION FFSoundDoneStatus ( genNumber:Integer) : Boolean ; Tool $08,$14;
|
||||||
|
FUNCTION FFSoundStatus : Integer ; Tool $08,$10;
|
||||||
|
PROCEDURE FFStartSound ( genNumFFSynth:Integer; pBlockPtr:SoundPBPtr) ; Tool
|
||||||
|
$08,$0E;
|
||||||
|
PROCEDURE FFStopSound ( genMask:Integer) ; Tool $08,$0F;
|
||||||
|
FUNCTION GetSoundVolume ( genNumber:Integer) : Integer ; Tool $08,$0C;
|
||||||
|
FUNCTION GetTableAddress : Ptr ; Tool $08,$0B;
|
||||||
|
PROCEDURE ReadRamBlock ( destPtr:Ptr; docStart:Integer; byteCount:Integer) ;
|
||||||
|
Tool $08,$0A;
|
||||||
|
PROCEDURE SetSoundMIRQV ( sMasterIRQ:Longint) ; Tool $08,$12;
|
||||||
|
PROCEDURE SetSoundVolume ( volume:Integer; genNumber:Integer) ; Tool $08,$0D;
|
||||||
|
FUNCTION SetUserSoundIRQV ( userIRQVector:Longint) : Ptr ; Tool $08,$13;
|
||||||
|
PROCEDURE WriteRamBlock ( srcPtr:Ptr; docStart:Integer; byteCount:Integer) ;
|
||||||
|
Tool $08,$09;
|
||||||
|
PROCEDURE FFSetUpSound ( channelGen:Integer; paramBlockPtr:SoundPBPtr) ; Tool
|
||||||
|
$08,$15;
|
||||||
|
PROCEDURE FFStartPlaying ( genWord:Integer) ; Tool $08,$16;
|
||||||
|
PROCEDURE SetDOCReg ( pBlockPtr:DocRegParamBlk) ; Tool $08,$17;
|
||||||
|
PROCEDURE ReadDOCReg (VAR pBlockPtr:DocRegParamBlk) ; Tool $08,$18;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
154
pascal/stdfile.p
Executable file
154
pascal/stdfile.p
Executable file
|
@ -0,0 +1,154 @@
|
||||||
|
{********************************************
|
||||||
|
; File: StdFile.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT STDFILE;
|
||||||
|
INTERFACE
|
||||||
|
USES Types, QuickDraw, Events, Controls, Windows, LineEdit, Dialogs;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
noDisplay = $0000; {filterProc result - file not to be displayed }
|
||||||
|
noSelect = $0001; {filterProc result - file displayed, but not selectable }
|
||||||
|
displaySelect = $0002; {filterProc result - file displayed and selectable }
|
||||||
|
sfMatchFileType = $8000; { - }
|
||||||
|
sfMatchAuxType = $4000; { - }
|
||||||
|
sfDisplayGrey = $2000; { - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
SFReplyRecPtr = ^SFReplyRec;
|
||||||
|
SFReplyRec = RECORD
|
||||||
|
good : Boolean;
|
||||||
|
fileType : Integer;
|
||||||
|
auxFileType : Integer;
|
||||||
|
filename : String[15];
|
||||||
|
fullPathname : String[128];
|
||||||
|
END;
|
||||||
|
SFReplyRec2Hndl = ^SFReplyRec2Ptr;
|
||||||
|
SFReplyRec2Ptr = ^SFReplyRec2;
|
||||||
|
SFReplyRec2 = RECORD
|
||||||
|
good : Boolean;
|
||||||
|
filetype : Integer;
|
||||||
|
auxType : Longint;
|
||||||
|
nameDesc : RefDescriptor;
|
||||||
|
nameRef : Ref;
|
||||||
|
pathDesc : RefDescriptor;
|
||||||
|
pathRef : Ref;
|
||||||
|
END;
|
||||||
|
multiReplyRecord = RECORD
|
||||||
|
good : Integer;
|
||||||
|
namesHandle : Handle;
|
||||||
|
END;
|
||||||
|
SFTypeListHandle = ^SFTypeListPtr;
|
||||||
|
SFTypeListPtr = ^SFTypeList;
|
||||||
|
SFTypeList = PACKED RECORD
|
||||||
|
numEntries : Byte;
|
||||||
|
fileTypeEntries : PACKED ARRAY[1..5] OF Byte;
|
||||||
|
END;
|
||||||
|
TypeSelector2 = RECORD
|
||||||
|
flags : Integer;
|
||||||
|
fileType : Integer;
|
||||||
|
auxType : Longint;
|
||||||
|
END;
|
||||||
|
SFTypeList2Ptr = ^SFTypeList2;
|
||||||
|
SFTypeList2 = RECORD
|
||||||
|
numEntries : Integer;
|
||||||
|
fileTypeEntries : ARRAY[1..5] OF TypeSelector2;
|
||||||
|
END;
|
||||||
|
PROCEDURE SFBootInit ; Tool $17,$01;
|
||||||
|
PROCEDURE SFStartUp ( userID:Integer; dPageAddr:Integer) ; Tool $17,$02;
|
||||||
|
PROCEDURE SFShutDown ; Tool $17,$03;
|
||||||
|
FUNCTION SFVersion : Integer ; Tool $17,$04;
|
||||||
|
PROCEDURE SFReset ; Tool $17,$05;
|
||||||
|
FUNCTION SFStatus : Boolean ; Tool $17,$06;
|
||||||
|
PROCEDURE SFAllCaps ( allCapsFlag:Boolean) ; Tool $17,$0D;
|
||||||
|
PROCEDURE SFGetFile
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE SFGetFile2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE SFMultiGet2 ( whereX:Integer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE SFPGetFile ( whereX:Integer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE SFPGetFile2 ( whereX:Integer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE SFPMultiGet2 ( whereX:Integer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE SFPPutFile ( whereX:Integer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE SFPPutFile2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE SFPutFile ( whereX:Integer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE SFPutFile2 ( whereX:Integer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION SFShowInvisible ( invisibleState:Boolean) : Boolean ; Tool $17,$12;
|
||||||
|
PROCEDURE SFReScan ( filterProcPtr:ProcPtr; typeListPtr:SFTypeList2Ptr) ; Tool
|
||||||
|
$17,$13;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
343
pascal/textedit.p
Executable file
343
pascal/textedit.p
Executable file
|
@ -0,0 +1,343 @@
|
||||||
|
{********************************************
|
||||||
|
; File: TextEdit.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT TEXTEDIT;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,MEMORY,QUICKDRAW,EVENTS,CONTROLS,FONTS,GSOS,RESOURCES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
teAlreadyStarted = $2201; {error - }
|
||||||
|
teNotStarted = $2202; {error - }
|
||||||
|
teInvalidHandle = $2203; {error - }
|
||||||
|
teInvalidVerb = $2204; {error - }
|
||||||
|
teInvalidFlag = $2205; {error - }
|
||||||
|
teInvalidPCount = $2206; {error - }
|
||||||
|
teInvalidRect = $2207; {error - }
|
||||||
|
teBufferOverflow = $2208; {error - }
|
||||||
|
teInvalidLine = $2209; { - }
|
||||||
|
teInvalidCall = $220A; { - }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
NullVerb = $0; {TE - }
|
||||||
|
PStringVerb = $0001; {TE - }
|
||||||
|
CStringVerb = $0002; {TE - }
|
||||||
|
C1InputVerb = $0003; {TE - }
|
||||||
|
C1OutputVerb = $0004; {TE - }
|
||||||
|
HandleVerb = $0005; {TE - }
|
||||||
|
PointerVerb = $0006; {TE - }
|
||||||
|
NewPStringVerb = $0007; {TE - }
|
||||||
|
fEqualLineSpacing = $8000; {TE - }
|
||||||
|
fShowInvisibles = $4000; {TE - }
|
||||||
|
teInvalidDescriptor = $2204; { - }
|
||||||
|
teInvalidParameter = $220B; { - }
|
||||||
|
teInvalidTextBox2 = $220C; { - }
|
||||||
|
teEqualLineSpacing = $8000; { - }
|
||||||
|
teShowInvisibles = $4000; { - }
|
||||||
|
teJustLeft = $0; { - }
|
||||||
|
teJustRight = $1; { - }
|
||||||
|
teJustCenter = $2; { - }
|
||||||
|
teJustFull = $3; { - }
|
||||||
|
teNoTabs = $0; { - }
|
||||||
|
teColumnTabs = $1; { - }
|
||||||
|
teAbsoluteTabs = $2; { - }
|
||||||
|
teLeftTab = $0; { - }
|
||||||
|
teCenterTab = $1; { - }
|
||||||
|
teRightTab = $2; { - }
|
||||||
|
teDecimalTab = $3; { - }
|
||||||
|
teInvis = $4000; { - }
|
||||||
|
teCtlColorIsPtr = $0000; { - }
|
||||||
|
teCtlColorIsHandle = $0004; { - }
|
||||||
|
teCtlColorIsResource = $0008; { - }
|
||||||
|
teCtlStyleIsPtr = $0000; { - }
|
||||||
|
teCtlStyleIsHandle = $0001; { - }
|
||||||
|
teCtlStyleIsResource = $0002; { - }
|
||||||
|
teNotControl = $80000000; { - }
|
||||||
|
teSingleFormat = $40000000; { - }
|
||||||
|
teSingleStyle = $20000000; { - }
|
||||||
|
teNoWordWrap = $10000000; { - }
|
||||||
|
teNoScroll = $08000000; { - }
|
||||||
|
teReadOnly = $04000000; { - }
|
||||||
|
teSmartCutPaste = $02000000; { - }
|
||||||
|
teTabSwitch = $01000000; { - }
|
||||||
|
teDrawBounds = $00800000; { - }
|
||||||
|
teColorHilite = $00400000; { - }
|
||||||
|
teRefIsPtr = $0000; { - }
|
||||||
|
teRefIsHandle = $0001; { - }
|
||||||
|
teRefIsResource = $0002; { - }
|
||||||
|
teRefIsNewHandle = $0003; { - }
|
||||||
|
teDataIsPString = $0000; { - }
|
||||||
|
teDataIsCString = $0001; { - }
|
||||||
|
teDataIsC1Input = $0002; { - }
|
||||||
|
teDataIsC1Output = $0003; { - }
|
||||||
|
teDataIsTextBox2 = $0004; { - }
|
||||||
|
teDataIsTextBlock = $0005; { - }
|
||||||
|
teTextIsPtr = $0000; { - }
|
||||||
|
teTextIsHandle = $0008; { - }
|
||||||
|
teTextIsResource = $0010; { - }
|
||||||
|
teTextIsNewHandle = $0018; { - }
|
||||||
|
tePartialLines = $8000; { - }
|
||||||
|
teDontDraw = $4000; { - }
|
||||||
|
teUseFont = $0020; { - }
|
||||||
|
teUseSize = $0010; { - }
|
||||||
|
teUseForeColor = $0008; { - }
|
||||||
|
teUseBackColor = $0004; { - }
|
||||||
|
teUseUserData = $0002; { - }
|
||||||
|
teUseAttributes = $0001; { - }
|
||||||
|
teReplaceFont = $0040; { - }
|
||||||
|
teReplaceSize = $0020; { - }
|
||||||
|
teReplaceForeColor = $0010; { - }
|
||||||
|
teReplaceBackColor = $0008; { - }
|
||||||
|
teReplaceUserField = $0004; { - }
|
||||||
|
teReplaceAttributes = $0002; { - }
|
||||||
|
teSwitchAttributes = $0001; { - }
|
||||||
|
teEraseRect = $0001; { - }
|
||||||
|
teEraseBuffer = $0002; { - }
|
||||||
|
teRectChanged = $0003; { - }
|
||||||
|
doEraseRect = $0001; { - }
|
||||||
|
doEraseBuffer = $0002; { - }
|
||||||
|
doRectChanged = $0003; { - }
|
||||||
|
doKeyStroke = $0004; { - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
TEColorTablePtr = ^TEColorTable;
|
||||||
|
TEColorTable = RECORD
|
||||||
|
contentColor : Integer;
|
||||||
|
outlineColor : Integer;
|
||||||
|
pageBoundaryColor : Integer;
|
||||||
|
hiliteForeColor : Integer;
|
||||||
|
hiliteBackColor : Integer;
|
||||||
|
vertColorDescriptor : Integer;
|
||||||
|
vertColorRef : Longint;
|
||||||
|
horzColorDescriptor : Integer;
|
||||||
|
horzColorRef : Longint;
|
||||||
|
growColorDescriptor : Integer;
|
||||||
|
growColorRef : Longint;
|
||||||
|
END;
|
||||||
|
TEBlockEntry = RECORD
|
||||||
|
text : Handle;
|
||||||
|
length : Handle;
|
||||||
|
flags : Integer;
|
||||||
|
END;
|
||||||
|
TEBlocksHndl = ^TEBlocksPtr;
|
||||||
|
TEBlocksPtr = ^TEBlocksRecord;
|
||||||
|
TEBlocksRecord = RECORD
|
||||||
|
start : Longint;
|
||||||
|
index : Integer;
|
||||||
|
blocks : ARRAY[1..1] OF TEBlockEntry;
|
||||||
|
END;
|
||||||
|
TEHandle = ^TERecordPtr;
|
||||||
|
TERecordPtr = ^TERecord;
|
||||||
|
TERecord = PACKED RECORD
|
||||||
|
ctlNext : CtlRecHndl;
|
||||||
|
ctlOwner : WindowPtr;
|
||||||
|
ctlRect : Rect;
|
||||||
|
ctlFlag : Byte;
|
||||||
|
ctlHilite : Byte;
|
||||||
|
ctlValue : Integer;
|
||||||
|
ctlProc : ProcPtr;
|
||||||
|
ctlAction : ProcPtr;
|
||||||
|
ctlData : Longint;
|
||||||
|
ctlRefCon : Longint;
|
||||||
|
ctlColorRef : TEColorTablePtr;
|
||||||
|
|
||||||
|
ctlID : Longint;
|
||||||
|
ctlMoreFlags : Integer;
|
||||||
|
ctlVersion : Integer;
|
||||||
|
theChar : Integer;
|
||||||
|
theModifiers : Integer;
|
||||||
|
extendFlag : Integer;
|
||||||
|
moveByWord : Integer;
|
||||||
|
inputPtr : Ptr;
|
||||||
|
inputLength : Longint;
|
||||||
|
theRect : Rect;
|
||||||
|
END;
|
||||||
|
TETabItem = RECORD
|
||||||
|
tabKind : Integer;
|
||||||
|
tabData : Integer;
|
||||||
|
END;
|
||||||
|
TERuler = RECORD
|
||||||
|
leftMargin : Integer;
|
||||||
|
leftIndent : Integer;
|
||||||
|
rightMargin : Integer;
|
||||||
|
just : Integer;
|
||||||
|
extraLS : Integer;
|
||||||
|
flags : Integer;
|
||||||
|
userData : Integer;
|
||||||
|
tabType : Integer;
|
||||||
|
tabs : ARRAY[1..1] OF TETabItem;
|
||||||
|
tabTerminator : Integer;
|
||||||
|
END;
|
||||||
|
TEStyle = RECORD
|
||||||
|
teFont : FontID;
|
||||||
|
foreColor : Integer;
|
||||||
|
backColor : Integer;
|
||||||
|
reserved : Longint;
|
||||||
|
END;
|
||||||
|
TEStyleGroupHndl = ^TEStyleGroupPtr;
|
||||||
|
TEStyleGroupPtr = ^TEStyleGroup;
|
||||||
|
TEStyleGroup = RECORD
|
||||||
|
count : Integer;
|
||||||
|
styles : ARRAY[1..1] OF TEStyle;
|
||||||
|
END;
|
||||||
|
TEStyleItem = RECORD
|
||||||
|
length : Longint;
|
||||||
|
offset : Longint;
|
||||||
|
END;
|
||||||
|
TEFormatHndl = ^TEFormatPtr;
|
||||||
|
TEFormatPtr = ^TEFormat;
|
||||||
|
TEFormat = RECORD
|
||||||
|
version : Integer;
|
||||||
|
rulerListLength : Longint;
|
||||||
|
theRulerList : ARRAY[1..1] OF TERuler;
|
||||||
|
styleListLength : Longint;
|
||||||
|
theStyleList : ARRAY[1..1] OF TEStyle;
|
||||||
|
numberOfStyles : Longint;
|
||||||
|
theStyles : ARRAY[1..1] OF TEStyleItem;
|
||||||
|
END;
|
||||||
|
TETextRef = RECORD CASE INTEGER OF
|
||||||
|
$0000:(textIsPStringPtr:StringPtr);
|
||||||
|
$0001:(textIsCStringPtr:CStringPtr);
|
||||||
|
$0002:(textIsC1InputPtr:GSString255Ptr);
|
||||||
|
$0003:(textIsC1OutputPtr:ResultBuf255Ptr);
|
||||||
|
$0004:(textIsTB2Ptr:Ptr);
|
||||||
|
$0005:(textIsRawPtr:Ptr);
|
||||||
|
|
||||||
|
$0008:(textIsPStringHandle:String255Hndl);
|
||||||
|
$0009:(textIsCStringHandle:CStringHndl);
|
||||||
|
$000A:(textIsC1InputHandle:GSString255Hndl);
|
||||||
|
$000B:(textIsC1OutputHandle:ResultBuf255Hndl);
|
||||||
|
$000C:(textIsTB2Handle:Handle);
|
||||||
|
$000D:(textIsRawHandle:Handle);
|
||||||
|
|
||||||
|
$0010:(textIsPStringResource: ResID);
|
||||||
|
$0011:(textIsCStringResource: ResID);
|
||||||
|
$0012:(textIsC1InputResource: ResID);
|
||||||
|
$0013:(textIsC1OutputResource: ResID);
|
||||||
|
$0014:(textIsTB2Resource: ResID);
|
||||||
|
$0015:(textIsRawResource: ResID);
|
||||||
|
|
||||||
|
$0018:(textIsPStringNewH:String255HndlPtr);
|
||||||
|
$0019:(textIsCStringNewH:CStringHndlPtr);
|
||||||
|
$001A:(textIsC1InputNewH:GSString255HndlPtr);
|
||||||
|
$001B:(textIsC1OutputNewH:ResultBuf255HndlPtr);
|
||||||
|
$001C:(textIsTB2NewH:HandlePtr);
|
||||||
|
$001D:(textIsRawNewH:HandlePtr);
|
||||||
|
END;
|
||||||
|
|
||||||
|
TEStyleRef = RECORD CASE INTEGER OF
|
||||||
|
$0000:(styleIsPtr:TEFormatPtr);
|
||||||
|
$0001:(styleIsHandle:TEFormatHndl);
|
||||||
|
$0002:(styleIsResource:ResID);
|
||||||
|
$0003:(styleIsNewH:^TEFormatHndl);
|
||||||
|
END;
|
||||||
|
|
||||||
|
TEParamBlockHndl = ^TEParamBlockPtr;
|
||||||
|
TEParamBlockPtr = ^TEParamBlock;
|
||||||
|
TEParamBlock = RECORD
|
||||||
|
pCount : Integer;
|
||||||
|
controlID : Longint;
|
||||||
|
boundsRect : Rect;
|
||||||
|
procRef : Longint;
|
||||||
|
flags : Integer;
|
||||||
|
moreflags : Integer;
|
||||||
|
refCon : Longint;
|
||||||
|
textFlags : Longint;
|
||||||
|
indentRect : Rect;
|
||||||
|
vertBar : CtlRecHndl;
|
||||||
|
vertScroll : Integer;
|
||||||
|
horzBar : CtlRecHndl;
|
||||||
|
horzScroll : Integer;
|
||||||
|
styleRef : TEStyleRef;
|
||||||
|
textDescriptor : Integer;
|
||||||
|
textRef : TETextRef;
|
||||||
|
textLength : Longint;
|
||||||
|
maxChars : Longint;
|
||||||
|
maxLines : Longint;
|
||||||
|
maxHeight : Integer;
|
||||||
|
pageHeight : Integer;
|
||||||
|
headerHeight : Integer;
|
||||||
|
footerHeight : Integer;
|
||||||
|
pageBoundary : Integer;
|
||||||
|
colorRef : Longint;
|
||||||
|
drawMode : Integer;
|
||||||
|
filterProcPtr : ProcPtr;
|
||||||
|
END;
|
||||||
|
TEInfoRec = RECORD
|
||||||
|
charCount : Longint;
|
||||||
|
lineCount : Longint;
|
||||||
|
formatMemory : Longint;
|
||||||
|
totalMemory : Longint;
|
||||||
|
styleCount : Longint;
|
||||||
|
rulerCount : Longint;
|
||||||
|
END;
|
||||||
|
TEHooks = RECORD
|
||||||
|
charFilter : ProcPtr;
|
||||||
|
wordWrap : ProcPtr;
|
||||||
|
wordBreak : ProcPtr;
|
||||||
|
drawText : ProcPtr;
|
||||||
|
eraseText : ProcPtr;
|
||||||
|
END;
|
||||||
|
PROCEDURE TEBootInit ; Tool $22,$01;
|
||||||
|
PROCEDURE TEStartup ( userId:Integer; directPage:Integer) ; Tool $22,$02;
|
||||||
|
PROCEDURE TEShutdown ; Tool $22,$03;
|
||||||
|
FUNCTION TEVersion : Integer ; Tool $22,$04;
|
||||||
|
PROCEDURE TEReset ; Tool $22,$05;
|
||||||
|
FUNCTION TEStatus : Integer ; Tool $22,$06;
|
||||||
|
PROCEDURE TEActivate ( teH:TEHandle) ; Tool $22,$0F;
|
||||||
|
PROCEDURE TEClear ( teH:TEHandle) ; Tool $22,$19;
|
||||||
|
PROCEDURE TEClick (VAR theEventPtr:EventRecord; teH:TEHandle) ; Tool $22,$11;
|
||||||
|
PROCEDURE TECut ( teH:TEHandle) ; Tool $22,$16;
|
||||||
|
PROCEDURE TECopy ( teH:TEHandle) ; Tool $22,$17;
|
||||||
|
PROCEDURE TEDeactivate ( teH:TEHandle) ; Tool $22,$10;
|
||||||
|
FUNCTION TEGetDefProc : ProcPtr ; Tool $22,$22;
|
||||||
|
PROCEDURE TEGetHooks (VAR hooks:TEHooks; count:Integer; teH:TEHandle) ; Tool
|
||||||
|
$22,$20;
|
||||||
|
PROCEDURE TEGetSelection (VAR selStart:Longint;VAR selEnd:Longint;
|
||||||
|
teH:TEHandle) ; Tool $22,$1C;
|
||||||
|
FUNCTION TEGetSelectionStyle (VAR commonStyle:TEStyle;
|
||||||
|
styleHandle:TEStyleGroupHndl; teH:TEHandle) : Integer ; Tool $22,$1E;
|
||||||
|
FUNCTION TEGetText ( bufferDesc:Integer; bufferRef:TETextRef;
|
||||||
|
bufferLength:Longint; styleDesc:Integer; styleRef:TEStyleRef; teH:TEHandle) :
|
||||||
|
Longint ; Tool $22,$0C;
|
||||||
|
PROCEDURE TEGetTextInfo (VAR infoRec:TEInfoRec; pCount:Integer; teH:TEHandle)
|
||||||
|
; Tool $22,$0D;
|
||||||
|
PROCEDURE TEIdle ( teH:TEHandle) ; Tool $22,$0E;
|
||||||
|
PROCEDURE TEInsert ( textDesc:Integer; textRef:TETextRef; textLength:Longint;
|
||||||
|
styleDesc:Integer; styleRef:TEStyleRef; teH:TEHandle) ; Tool $22,$1A;
|
||||||
|
PROCEDURE TEInsertPageBreak ( teH:TEHandle) ; Tool $22,$15;
|
||||||
|
PROCEDURE TEKey ( theEventPtr:EventRecord; teH:TEHandle) ; Tool $22,$14;
|
||||||
|
PROCEDURE TEKill ( teH:TEHandle) ; Tool $22,$0A;
|
||||||
|
FUNCTION TENew ( theParms:TEParamBlock) : TEHandle ; Tool $22,$09;
|
||||||
|
FUNCTION TEPaintText ( thePort:GrafPortPtr; start:Longint; destRect:rect;
|
||||||
|
paintFlags:Integer; teH:TEHandle) : Longint ; Tool $22,$13;
|
||||||
|
PROCEDURE TEPaste ( teH:TEHandle) ; Tool $22,$18;
|
||||||
|
PROCEDURE TEReplace ( textDesc:Integer; textRef:TETextRef; textLength:Longint;
|
||||||
|
styleDesc:Integer; styleRef:TEStyleRef; teH:TEHandle) ; Tool $22,$1B;
|
||||||
|
PROCEDURE TESetHooks ( hooks:TEHooks; count:Integer; teH:TEHandle) ; Tool
|
||||||
|
$22,$21;
|
||||||
|
PROCEDURE TESetSelection ( selStart:Longint; selEnd:Longint; teH:TEHandle) ;
|
||||||
|
Tool $22,$1D;
|
||||||
|
PROCEDURE TESetText ( textDesc:Integer; textRef:TETextRef; textLength:Longint;
|
||||||
|
styleDesc:Integer; styleRef:TEStyleRef; teH:TEHandle) ; Tool $22,$0B;
|
||||||
|
PROCEDURE TEStyleChange ( flags:Integer; newStyle:TEStyle; teH:TEHandle) ;
|
||||||
|
Tool $22,$1F;
|
||||||
|
PROCEDURE TEUpdate ( teH:TEHandle) ; Tool $22,$12;
|
||||||
|
PROCEDURE TEGetRuler ( rulerDescriptor:Integer; rulerRef:Ref; teH:TEHandle) ;
|
||||||
|
Tool $22,$23;
|
||||||
|
PROCEDURE TEOffsetToPoint ( textOffset:Longint; vertPosPtr:Ptr; horzPosPtr:Ptr;
|
||||||
|
teH:TEHandle) ; Tool $22,$20;
|
||||||
|
FUNCTION TEPointToOffset ( vertPosPtr:Ptr; horzPosPtr:Ptr; teH:TEHandle) :
|
||||||
|
Longint ; Tool $22,$21;
|
||||||
|
FUNCTION TEScroll ( scrollDescriptor:Integer; vertAmount:Longint;
|
||||||
|
horzAmount:Longint; teH:TEHandle) : Longint ; Tool $22,$25;
|
||||||
|
PROCEDURE TESetRuler ( rulerDescriptor:Integer; rulerRef:Ref; teH:TEHandle);
|
||||||
|
Tool $22,$24;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
104
pascal/types.p
Executable file
104
pascal/types.p
Executable file
|
@ -0,0 +1,104 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Types.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT TYPES;
|
||||||
|
INTERFACE
|
||||||
|
|
||||||
|
CONST
|
||||||
|
noError = $0000;
|
||||||
|
|
||||||
|
refIsPointer = $0000; {RefDescriptor - }
|
||||||
|
refIsHandle = $0001; {RefDescriptor - }
|
||||||
|
refIsResource = $0002; {RefDescriptor - }
|
||||||
|
refIsNewHandle = $0003; {RefDescriptor - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
Byte = 0..255;
|
||||||
|
Fixed = Longint ;
|
||||||
|
Frac = Longint ;
|
||||||
|
ExtendedPtr = ^Extended;
|
||||||
|
|
||||||
|
SignedByte = -128..127;
|
||||||
|
PackedByte = PACKED ARRAY [1..1] of SignedByte;
|
||||||
|
Ptr = ^PackedByte;
|
||||||
|
PointerPtr = ^Ptr;
|
||||||
|
Handle = ^Ptr;
|
||||||
|
|
||||||
|
HandlePtr = ^Handle;
|
||||||
|
|
||||||
|
CStringPtr = Ptr;
|
||||||
|
CStringHndl = ^CStringPtr;
|
||||||
|
CStringHndlPtr = ^CStringHndl;
|
||||||
|
ProcPtr = Ptr;
|
||||||
|
VoidProcPtr = ProcPtr;
|
||||||
|
WordProcPtr = ProcPtr;
|
||||||
|
LongProcPtr = ProcPtr;
|
||||||
|
|
||||||
|
IntPtr = ^Integer;
|
||||||
|
FPTPtr = Ptr ;
|
||||||
|
String255 = STRING[255];
|
||||||
|
String255Ptr = ^String255;
|
||||||
|
String255Hndl = ^String255Ptr;
|
||||||
|
String255HndlPtr = ^String255Hndl;
|
||||||
|
Str255 = String255;
|
||||||
|
StringPtr = String255Ptr;
|
||||||
|
StringHandle = ^StringPtr;
|
||||||
|
String32 = STRING[32];
|
||||||
|
String32Ptr = ^String32;
|
||||||
|
String32Handle = ^String32Ptr;
|
||||||
|
Str32 = String32;
|
||||||
|
|
||||||
|
PointPtr = ^Point;
|
||||||
|
Point = RECORD
|
||||||
|
v : Integer;
|
||||||
|
h : Integer;
|
||||||
|
END;
|
||||||
|
RectHndl = ^RectPtr;
|
||||||
|
RectPtr = ^Rect;
|
||||||
|
Rect = RECORD
|
||||||
|
CASE INTEGER OF
|
||||||
|
1:
|
||||||
|
(top: Integer;
|
||||||
|
left: Integer;
|
||||||
|
bottom: Integer;
|
||||||
|
right: Integer);
|
||||||
|
2:
|
||||||
|
(topLeft: Point;
|
||||||
|
botRight: Point);
|
||||||
|
3: (
|
||||||
|
v1 : Integer;
|
||||||
|
h1 : Integer;
|
||||||
|
v2 : Integer;
|
||||||
|
h2 : Integer);
|
||||||
|
END;
|
||||||
|
|
||||||
|
TimeRecHndl = ^TimeRecPtr;
|
||||||
|
TimeRecPtr = ^TimeRec;
|
||||||
|
TimeRec = PACKED RECORD
|
||||||
|
second : Byte;
|
||||||
|
minute : Byte;
|
||||||
|
hour : Byte;
|
||||||
|
year : Byte;
|
||||||
|
day : Byte;
|
||||||
|
month : Byte;
|
||||||
|
extra : Byte;
|
||||||
|
weekDay : Byte;
|
||||||
|
END;
|
||||||
|
|
||||||
|
RefDescriptor = Integer;
|
||||||
|
Ref = RECORD
|
||||||
|
CASE Integer OF
|
||||||
|
refIsPointer : ( refIsPointer : Ptr ) ;
|
||||||
|
refIsHandle : ( refIsHandle : Handle ) ;
|
||||||
|
refIsResource : ( refIsResource : Longint ) ;
|
||||||
|
refIsNewHandle : ( refIsNewHandle : Handle ) ;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
119
pascal/video.p
Executable file
119
pascal/video.p
Executable file
|
@ -0,0 +1,119 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Video.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT VIDEO;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
vdVideoOverlay = $01; { - }
|
||||||
|
vdFrameGrabber = $02; { - }
|
||||||
|
vdInVStandards = $03; { - }
|
||||||
|
vdOutVStandards = $04; { - }
|
||||||
|
vdKeyDissLevels = $05; { - }
|
||||||
|
vdNKeyDissLevels = $06; { - }
|
||||||
|
vdAdjSideEffect = $07; { - }
|
||||||
|
vdKeyColorBits = $08; { - }
|
||||||
|
vdInHueAdj = $09; { - }
|
||||||
|
vdInSatAdj = $0A; { - }
|
||||||
|
vdInContrastAdj = $0B; { - }
|
||||||
|
vdInBrightAdj = $0C; { - }
|
||||||
|
vdOutSetup = $0D; { - }
|
||||||
|
vdOutChromaFilter = $0E; { - }
|
||||||
|
vdOutExtBlank = $0F; { - }
|
||||||
|
vdKeyEnhDiss = $10; { - }
|
||||||
|
vdLineInterrupt = $11; { - }
|
||||||
|
vdGGBus = $12; { - }
|
||||||
|
vdDualOut = $13; { - }
|
||||||
|
vdTextMonoOver = $14; { - }
|
||||||
|
vdGenlock = $32; { - }
|
||||||
|
vdVideoDetect = $33; { - }
|
||||||
|
vdGenlocked = $34; { - }
|
||||||
|
vdAdjInc = $50; { - }
|
||||||
|
vdAdjDec = $51; { - }
|
||||||
|
vdAdjSave = $52; { - }
|
||||||
|
vdAvail = $01; { - }
|
||||||
|
vdNotAvail = $00; { - }
|
||||||
|
vdYes = $01; { - }
|
||||||
|
vdNo = $00; { - }
|
||||||
|
vdOn = $01; { - }
|
||||||
|
vdOff = $00; { - }
|
||||||
|
vdKColorEnable = $64; { - }
|
||||||
|
vdVerticalBlank = $82; { - }
|
||||||
|
vdMainPageLin = $C8; { - }
|
||||||
|
vdRAMPageSel = $C9; { - }
|
||||||
|
vdVBLInterrupt = $CA; { - }
|
||||||
|
vdInterlaceMode = $CB; { - }
|
||||||
|
vdClearVBLInt = $CC; { - }
|
||||||
|
vdClearLineInt = $CD; { - }
|
||||||
|
vdDisplayField = $CE; { - }
|
||||||
|
vdVBLIntRequest = $CF; { - }
|
||||||
|
vdLineIntRequest = $D0; { - }
|
||||||
|
vdNone = $00; { - }
|
||||||
|
vdNTSC = $01; { - }
|
||||||
|
vdPAL = $02; { - }
|
||||||
|
vdSECAM = $04; { - }
|
||||||
|
vdSNTSC = $08; { - }
|
||||||
|
vdSPAL = $10; { - }
|
||||||
|
vdSSECAM = $20; { - }
|
||||||
|
vdRGB60 = $40; { - }
|
||||||
|
vdRGB50 = $80; { - }
|
||||||
|
vdAux = $00; { - }
|
||||||
|
vdMain = $10; { - }
|
||||||
|
vdInterlace = $30; { - }
|
||||||
|
vdField1 = $01; { - }
|
||||||
|
vdField0 = $00; { - }
|
||||||
|
vdEnable = $01; { - }
|
||||||
|
vdDisable = $00; { - }
|
||||||
|
vdExternal = $00; { - }
|
||||||
|
vdGraphics = $01; { - }
|
||||||
|
vdVBlank = $01; { - }
|
||||||
|
vdActiveVideo = $00; { - }
|
||||||
|
vdNoVideoDevice = $2110; {Error - no video device was found }
|
||||||
|
vdAlreadyStarted = $2111; {Error - Video tool set already started }
|
||||||
|
vdInvalidSelector = $2112; {Error - an invalid selector was specified }
|
||||||
|
vdInvalidParam = $2113; {Error - an invalid parameter was specified }
|
||||||
|
vdUnImplemented = $21FF; {Error - an unimplemented tool set routine was called
|
||||||
|
}
|
||||||
|
PROCEDURE VDBootInit ; Tool $21,$01;
|
||||||
|
PROCEDURE VDStartUp ; Tool $21,$02;
|
||||||
|
PROCEDURE VDShutdown ; Tool $21,$03;
|
||||||
|
FUNCTION VDVersion : Integer ; Tool $21,$04;
|
||||||
|
PROCEDURE VDReset ; Tool $21,$05;
|
||||||
|
FUNCTION VDStatus : Boolean ; Tool $21,$06;
|
||||||
|
FUNCTION VDGetFeatures ( videoSelector:Integer) : Integer ; Tool $21,$1B;
|
||||||
|
PROCEDURE VDInControl ( videoSelector:Integer; inputCtlValue:Integer) ; Tool
|
||||||
|
$21,$1C;
|
||||||
|
FUNCTION VDInStatus ( videoSelector:Integer) : Integer ; Tool $21,$09;
|
||||||
|
PROCEDURE VDInSetStd ( inputStandard:Integer) ; Tool $21,$0A;
|
||||||
|
FUNCTION VDInGetStd : Integer ; Tool $21,$0B;
|
||||||
|
PROCEDURE VDInConvAdj ( videoSelector:Integer; adjustFunction:Integer) ; Tool
|
||||||
|
$21,$0C;
|
||||||
|
PROCEDURE VDKeyControl ( videoSelector:Integer; keyerCtlValue:Integer) ; Tool
|
||||||
|
$21,$0D;
|
||||||
|
FUNCTION VDKeyStatus ( videoSelector:Integer) : Integer ; Tool $21,$0E;
|
||||||
|
PROCEDURE VDKeySetKCol ( redValue:Integer; greenValue:Integer;
|
||||||
|
blueValue:Integer) ; Tool $21,$0F;
|
||||||
|
FUNCTION VDKeyGetRCol : Integer ; Tool $21,$10;
|
||||||
|
FUNCTION VDKeyGetGCol : Integer ; Tool $21,$11;
|
||||||
|
FUNCTION VDKeyGetBCol : Integer ; Tool $21,$12;
|
||||||
|
PROCEDURE VDKeySetKDiss ( kDissolve:Integer) ; Tool $21,$13;
|
||||||
|
FUNCTION VDKeyGetKDiss : Integer ; Tool $21,$14;
|
||||||
|
PROCEDURE VDKeySetNKDiss ( nonKeyDissolve:Integer) ; Tool $21,$15;
|
||||||
|
FUNCTION VDKeyGetNKDiss : Integer ; Tool $21,$16;
|
||||||
|
PROCEDURE VDOutSetStd ( outStandard:Integer) ; Tool $21,$17;
|
||||||
|
FUNCTION VDOutGetStd : Integer ; Tool $21,$18;
|
||||||
|
PROCEDURE VDOutControl ( videoSelector:Integer; outCtlValue:Integer) ; Tool
|
||||||
|
$21,$19;
|
||||||
|
FUNCTION VDOutStatus ( videoSelector:Integer) : Integer ; Tool $21,$1A;
|
||||||
|
PROCEDURE VDGGControl ( videoSelector:Integer; gGCtlValue:Integer) ; Tool
|
||||||
|
$21,$1D;
|
||||||
|
FUNCTION VDGGStatus ( videoSelector:Integer) : Integer ; Tool $21,$1E;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
301
pascal/windows.p
Executable file
301
pascal/windows.p
Executable file
|
@ -0,0 +1,301 @@
|
||||||
|
{********************************************
|
||||||
|
; File: Windows.p
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Copyright Apple Computer, Inc. 1986-89
|
||||||
|
; All Rights Reserved
|
||||||
|
;
|
||||||
|
********************************************}
|
||||||
|
|
||||||
|
UNIT WINDOWS;
|
||||||
|
INTERFACE
|
||||||
|
USES TYPES,QUICKDRAW,EVENTS,CONTROLS;
|
||||||
|
CONST
|
||||||
|
|
||||||
|
(* *** Toolset Errors ***
|
||||||
|
paramLenErr = $0E01; {error - first word of parameter list is the wrong size }
|
||||||
|
allocateErr = $0E02; {error - unable to allocate window record }
|
||||||
|
taskMaskErr = $0E03; {error - bits 12-15 are not clear in WmTaskMask field of
|
||||||
|
EventRecord }
|
||||||
|
*** Toolset Errors *** *)
|
||||||
|
|
||||||
|
wNoConstraint = $0000; {Axis parameter - No constraint on movement. }
|
||||||
|
wHAxisOnly = $0001; {Axis parameter - Horizontal axis only. }
|
||||||
|
wVAxisOnly = $0002; {Axis parameter - Vertical axis only. }
|
||||||
|
FromDesk = $00; {Desktop Command - Subtract region from desktop }
|
||||||
|
ToDesk = $1; {Desktop Command - Add region to desktop }
|
||||||
|
GetDesktop = $2; {Desktop Command - Get Handle of Desktop region }
|
||||||
|
SetDesktop = $3; {Desktop Command - Set Handle of Desktop region }
|
||||||
|
GetDeskPat = $4; {Desktop command - Address of pattern or drawing routine }
|
||||||
|
SetDeskPat = $5; {Desktop command - Change Address of pattern or drawing
|
||||||
|
routine }
|
||||||
|
GetVisDesktop = $6; {Desktop command - Get destop region less visible windows.
|
||||||
|
}
|
||||||
|
BackGroundRgn = $7; {Desktop command - For drawing directly on desktop. }
|
||||||
|
toBottom = $FFFFFFFE; {SendBehind value - To send window to bottom. }
|
||||||
|
topMost = $FFFFFFFF; {SendBehind value - To make window top. }
|
||||||
|
bottomMost = $0000; {SendBehind value - To make window bottom. }
|
||||||
|
tmMenuKey = $0001; {Task Mask - }
|
||||||
|
tmUpdate = $0002; {Task Mask - }
|
||||||
|
tmFindW = $0004; {Task Mask - }
|
||||||
|
tmMenuSel = $0008; {Task Mask - }
|
||||||
|
tmOpenNDA = $0010; {Task Mask - }
|
||||||
|
tmSysClick = $0020; {Task Mask - }
|
||||||
|
tmDragW = $0040; {Task Mask - }
|
||||||
|
tmContent = $0080; {Task Mask - }
|
||||||
|
tmClose = $0100; {Task Mask - }
|
||||||
|
tmZoom = $0200; {Task Mask - }
|
||||||
|
tmGrow = $0400; {Task Mask - }
|
||||||
|
tmScroll = $0800; {Task Mask - }
|
||||||
|
tmSpecial = $1000; {Task Mask - }
|
||||||
|
tmCRedraw = $2000; {Task Mask - }
|
||||||
|
tmInactive = $4000; {Task Mask - }
|
||||||
|
tmInfo = $8000; {Task Mask - }
|
||||||
|
wNoHit = $0000; {TaskMaster codes - retained for back compatibility. }
|
||||||
|
inNull = $0000; {TaskMaster codes - retained for back compatibility }
|
||||||
|
inKey = $0003; {TaskMaster codes - retained for back compatibility }
|
||||||
|
inButtDwn = $0001; {TaskMaster codes - retained for back compatibility }
|
||||||
|
inUpdate = $0006; {TaskMaster codes - retained for back compatibility }
|
||||||
|
wInDesk = $0010; {TaskMaster codes - On Desktop }
|
||||||
|
wInMenuBar = $0011; {TaskMaster codes - On system menu bar }
|
||||||
|
wClickCalled = $0012; {TaskMaster codes - system click called }
|
||||||
|
wInContent = $0013; {TaskMaster codes - In content region }
|
||||||
|
wInDrag = $0014; {TaskMaster codes - In drag region }
|
||||||
|
wInGrow = $0015; {TaskMaster codes - In grow region, active window only }
|
||||||
|
wInGoAway = $0016; {TaskMaster codes - In go-away region, active window only }
|
||||||
|
wInZoom = $0017; {TaskMaster codes - In zoom region, active window only }
|
||||||
|
wInInfo = $0018; {TaskMaster codes - In information bar }
|
||||||
|
wInSpecial = $0019; {TaskMaster codes - Item ID selected was 250 - 255 }
|
||||||
|
wInDeskItem = $001A; {TaskMaster codes - Item ID selected was 1 - 249 }
|
||||||
|
wInFrame = $1B; {TaskMaster codes - in Frame, but not on anything else }
|
||||||
|
wInactMenu = $1C; {TaskMaster codes - "selection" of inactive menu item }
|
||||||
|
wClosedNDA = $001D; {TaskMaster codes - desk accessory closed }
|
||||||
|
wCalledSysEdit = $001E; {TaskMaster codes - inactive menu item selected }
|
||||||
|
wInSysWindow = $8000; {TaskMaster codes - hi bit set for system windows }
|
||||||
|
wDraw = $00; {VarCode - Draw window frame command. }
|
||||||
|
wHit = $01; {VarCode - Hit test command. }
|
||||||
|
wCalcRgns = $02; {VarCode - Compute regions command. }
|
||||||
|
wNew = $03; {VarCode - Initialization command. }
|
||||||
|
wDispose = $04; {VarCode - Dispose command. }
|
||||||
|
fHilited = $0001; {WFrame - Window is highlighted. }
|
||||||
|
fZoomed = $0002; {WFrame - Window is zoomed. }
|
||||||
|
fAllocated = $0004; {WFrame - Window record was allocated. }
|
||||||
|
fCtlTie = $0008; {WFrame - Window state tied to controls. }
|
||||||
|
fInfo = $0010; {WFrame - Window has an information bar. }
|
||||||
|
fVis = $0020; {WFrame - Window is visible. }
|
||||||
|
fQContent = $0040; {WFrame - }
|
||||||
|
fMove = $0080; {WFrame - Window is movable. }
|
||||||
|
fZoom = $0100; {WFrame - Window is zoomable. }
|
||||||
|
fFlex = $0200; {WFrame - }
|
||||||
|
fGrow = $0400; {WFrame - Window has grow box. }
|
||||||
|
fBScroll = $0800; {WFrame - Window has horizontal scroll bar. }
|
||||||
|
fRScroll = $1000; {WFrame - Window has vertical scroll bar. }
|
||||||
|
fAlert = $2000; {WFrame - }
|
||||||
|
fClose = $4000; {WFrame - Window has a close box. }
|
||||||
|
fTitle = $8000; {WFrame - Window has a title bar. }
|
||||||
|
windSize = $145; {WindRec - Size of WindRec. }
|
||||||
|
wmTaskRecSize = $0046; {WmTaskRec - Size of WmTaskRec. }
|
||||||
|
wTrackZoom = $001F; { - }
|
||||||
|
wHitFrame = $0020; { - }
|
||||||
|
wInControl = $0021; { - }
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
WmTaskRec = EventRecord ;
|
||||||
|
|
||||||
|
|
||||||
|
WmTaskRecPtr = EventRecordPtr ;
|
||||||
|
|
||||||
|
WindColorHndl = ^WindColorPtr;
|
||||||
|
WindColorPtr = ^WindColor;
|
||||||
|
WindColor = RECORD
|
||||||
|
frameColor : Integer; { Color of window frame. }
|
||||||
|
titleColor : Integer; { Color of title and bar. }
|
||||||
|
tBarColor : Integer; { Color/pattern of title bar. }
|
||||||
|
growColor : Integer; { Color of grow box. }
|
||||||
|
infoColor : Integer; { Color of information bar. }
|
||||||
|
END;
|
||||||
|
WindRecPtr = ^WindRec;
|
||||||
|
WindRec = RECORD
|
||||||
|
port : GrafPort; { Window's port }
|
||||||
|
wDefProc : ProcPtr;
|
||||||
|
wRefCon : Longint;
|
||||||
|
wContDraw : ProcPtr;
|
||||||
|
wReserved : Longint; { Space for future expansion }
|
||||||
|
wStrucRgn : RgnHandle; { Region of frame plus content. }
|
||||||
|
wContRgn : RgnHandle; { Content region. }
|
||||||
|
wUpdateRgn : RgnHandle; { Update region. }
|
||||||
|
wControls : CtlRecHndl; { Window's control list. }
|
||||||
|
wFrameCtrls : CtlRecHndl; { Window frame's control list. }
|
||||||
|
wFrame : Integer;
|
||||||
|
END;
|
||||||
|
WindowChainPtr = ^WindowChain;
|
||||||
|
WindowChain = RECORD
|
||||||
|
wNext : WindowChainPtr;
|
||||||
|
theWindow : WindRec;
|
||||||
|
END;
|
||||||
|
ParamListHndl = ^ParamListPtr;
|
||||||
|
ParamListPtr = ^ParamList;
|
||||||
|
ParamList = RECORD
|
||||||
|
paramLength : Integer; { Parameter to NewWindow. }
|
||||||
|
wFrameBits : Integer; { Parameter to NewWindow. }
|
||||||
|
wTitle : Ptr; { Parameter to NewWindow. }
|
||||||
|
wRefCon : Longint; { Parameter to NewWindow. }
|
||||||
|
wZoom : Rect; { Parameter to NewWindow. }
|
||||||
|
wColor : WindColorPtr; { Parameter to NewWindow. }
|
||||||
|
wYOrigin : Integer; { Parameter to NewWindow. }
|
||||||
|
wXOrigin : Integer; { Parameter to NewWindow. }
|
||||||
|
wDataH : Integer; { Parameter to NewWindow. }
|
||||||
|
wDataW : Integer; { Parameter to NewWindow. }
|
||||||
|
wMaxH : Integer; { Parameter to NewWindow. }
|
||||||
|
wMaxW : Integer; { Parameter to NewWindow. }
|
||||||
|
wScrollVer : Integer; { Parameter to NewWindow. }
|
||||||
|
wScrollHor : Integer; { Parameter to NewWindow. }
|
||||||
|
wPageVer : Integer; { Parameter to NewWindow. }
|
||||||
|
wPageHor : Integer; { Parameter to NewWindow. }
|
||||||
|
wInfoRefCon : Longint; { Parameter to NewWindow. }
|
||||||
|
wInfoHeight : Integer; { height of information bar }
|
||||||
|
wFrameDefProc : LongProcPtr; { Parameter to NewWindow. }
|
||||||
|
wInfoDefProc : VoidProcPtr; { Parameter to NewWindow. }
|
||||||
|
wContDefProc : VoidProcPtr; { Parameter to NewWindow. }
|
||||||
|
wPosition : Rect; { Parameter to NewWindow. }
|
||||||
|
wPlane : WindowPtr; { Parameter to NewWindow. }
|
||||||
|
wStorage : WindowChainPtr; { Parameter to NewWindow. }
|
||||||
|
END;
|
||||||
|
DeskMessageRecordPtr = ^DeskMessageRecord;
|
||||||
|
DeskMessageRecord = RECORD
|
||||||
|
reserved : Longint;
|
||||||
|
messageType : Integer;
|
||||||
|
drawType : Integer;
|
||||||
|
END;
|
||||||
|
FUNCTION AlertWindow ( alertFlags:Integer; subStrPtr:Ptr; alertStrPtr:Ref) :
|
||||||
|
Integer ; Tool $0E,$59;
|
||||||
|
PROCEDURE DrawInfoBar ( theWindowPtr:WindowPtr) ; Tool $0E,$55;
|
||||||
|
PROCEDURE EndFrameDrawing ; Tool $0E,$5B;
|
||||||
|
FUNCTION GetWindowMgrGlobals : Longint ; Tool $0E,$58;
|
||||||
|
PROCEDURE ResizeWindow ( hiddenFlag:Integer; U__rectPtr:Rect;
|
||||||
|
theWindowPtr:WindowPtr) ; Tool $0E,$5C;
|
||||||
|
PROCEDURE StartFrameDrawing ( windowPtr:Longint) ; Tool $0E,$5A;
|
||||||
|
PROCEDURE WindBootInit ; Tool $0E,$01;
|
||||||
|
PROCEDURE WindStartUp ( userID:Integer) ; Tool $0E,$02;
|
||||||
|
PROCEDURE WindShutDown ; Tool $0E,$03;
|
||||||
|
FUNCTION WindVersion : Integer ; Tool $0E,$04;
|
||||||
|
PROCEDURE WindReset ; Tool $0E,$05;
|
||||||
|
FUNCTION WindStatus : Boolean ; Tool $0E,$06;
|
||||||
|
PROCEDURE BeginUpdate ( theWindowPtr:WindowPtr) ; Tool $0E,$1E;
|
||||||
|
PROCEDURE BringToFront ( theWindowPtr:WindowPtr) ; Tool $0E,$24;
|
||||||
|
FUNCTION CheckUpdate ( theEventPtr:EventRecordPtr) : Boolean ; Tool $0E,$0A;
|
||||||
|
PROCEDURE CloseWindow ( theWindowPtr:WindowPtr) ; Tool $0E,$0B;
|
||||||
|
FUNCTION Desktop ( deskTopOP:Integer; dtParam:Longint) : Ptr ; Tool $0E,$0C;
|
||||||
|
PROCEDURE DragWindow ( grid:Integer; startX:Integer; startY:Integer;
|
||||||
|
grace:Integer; boundsRectPtr:RectPtr; theWindowPtr:WindowPtr) ; Tool $0E,$1A;
|
||||||
|
PROCEDURE EndInfoDrawing ; Tool $0E,$51;
|
||||||
|
PROCEDURE EndUpdate ( theWindowPtr:WindowPtr) ; Tool $0E,$1F;
|
||||||
|
FUNCTION FindWindow (VAR theWindowPtr:WindowPtr; pointX:Integer;
|
||||||
|
pointY:Integer) : Integer ; Tool $0E,$17;
|
||||||
|
FUNCTION FrontWindow : WindowPtr ; Tool $0E,$15;
|
||||||
|
FUNCTION GetContentDraw ( theWindowPtr:WindowPtr) : VoidProcPtr ; Tool $0E,$48;
|
||||||
|
FUNCTION GetContentOrigin ( theWindowPtr:WindowPtr) : Point ; Tool $0E,$3E;
|
||||||
|
FUNCTION GetContentRgn ( theWindowPtr:WindowPtr) : RgnHandle ; Tool $0E,$2F;
|
||||||
|
FUNCTION GetDataSize ( theWindowPtr:WindowPtr) : Longint ; Tool $0E,$40;
|
||||||
|
FUNCTION GetDefProc ( theWindowPtr:WindowPtr) : LongProcPtr ; Tool $0E,$31;
|
||||||
|
FUNCTION GetFirstWindow : WindowPtr ; Tool $0E,$52;
|
||||||
|
PROCEDURE GetFrameColor (VAR colorPtr:WindColorPtr; theWindowPtr:WindowPtr) ;
|
||||||
|
Tool $0E,$10;
|
||||||
|
FUNCTION GetInfoDraw ( theWindowPtr:WindowPtr) : VoidProcPtr ; Tool $0E,$4A;
|
||||||
|
FUNCTION GetInfoRefCon ( theWindowPtr:WindowPtr) : Longint ; Tool $0E,$35;
|
||||||
|
FUNCTION GetMaxGrow ( theWindowPtr:WindowPtr) : Longint ; Tool $0E,$42;
|
||||||
|
FUNCTION GetNextWindow ( theWindowPtr:WindowPtr) : WindowPtr ; Tool $0E,$2A;
|
||||||
|
FUNCTION GetPage ( theWindowPtr:WindowPtr) : Longint ; Tool $0E,$46;
|
||||||
|
PROCEDURE GetRectInfo (VAR infoRectPtr:Rect; theWindowPtr:WindowPtr) ; Tool
|
||||||
|
$0E,$4F;
|
||||||
|
FUNCTION GetScroll ( theWindowPtr:WindowPtr) : Longint ; Tool $0E,$44;
|
||||||
|
FUNCTION GetStructRgn ( theWindowPtr:WindowPtr) : RgnHandle ; Tool $0E,$2E;
|
||||||
|
FUNCTION GetSysWFlag ( theWindowPtr:WindowPtr) : Boolean ; Tool $0E,$4C;
|
||||||
|
FUNCTION GetUpdateRgn ( theWindowPtr:WindowPtr) : RgnHandle ; Tool $0E,$30;
|
||||||
|
FUNCTION GetWControls ( theWindowPtr:WindowPtr) : CtlRecHndl ; Tool $0E,$33;
|
||||||
|
FUNCTION GetWFrame ( theWindowPtr:WindowPtr) : Integer ; Tool $0E,$2C;
|
||||||
|
FUNCTION GetWKind ( theWindowPtr:WindowPtr) : Integer ; Tool $0E,$2B;
|
||||||
|
FUNCTION GetWMgrPort : WindowPtr ; Tool $0E,$20;
|
||||||
|
FUNCTION GetWRefCon ( theWindowPtr:WindowPtr) : Longint ; Tool $0E,$29;
|
||||||
|
FUNCTION GetWTitle ( theWindowPtr:WindowPtr) : Ptr ; Tool $0E,$0E;
|
||||||
|
FUNCTION GetZoomRect ( theWindowPtr:WindowPtr) : RectPtr ; Tool $0E,$37;
|
||||||
|
FUNCTION GrowWindow ( minWidth:Integer; minHeight:Integer; startX:Integer;
|
||||||
|
startY:Integer; theWindowPtr:WindowPtr) : Longint ; Tool $0E,$1B;
|
||||||
|
PROCEDURE HideWindow ( theWindowPtr:WindowPtr) ; Tool $0E,$12;
|
||||||
|
PROCEDURE HiliteWindow ( fHiliteFlag:Boolean; theWindowPtr:WindowPtr) ; Tool
|
||||||
|
$0E,$22;
|
||||||
|
PROCEDURE InvalRect ( badRectPtr:Rect) ; Tool $0E,$3A;
|
||||||
|
PROCEDURE InvalRgn ( badRgnHandle:RgnHandle) ; Tool $0E,$3B;
|
||||||
|
PROCEDURE MoveWindow ( newX:Integer; newY:Integer; theWindowPtr:WindowPtr) ;
|
||||||
|
Tool $0E,$19;
|
||||||
|
FUNCTION NewWindow ( theParamListPtr:ParamList) : WindowPtr ; Tool $0E,$09;
|
||||||
|
FUNCTION PinRect ( theXPt:Integer; theYPt:Integer; theRectPtr:Rect) : Point ;
|
||||||
|
Tool $0E,$21;
|
||||||
|
PROCEDURE RefreshDesktop ( redrawRect:RectPtr) ; Tool $0E,$39;
|
||||||
|
PROCEDURE SelectWindow ( theWindowPtr:WindowPtr) ; Tool $0E,$11;
|
||||||
|
PROCEDURE SendBehind ( behindWindowPtr:WindowPtr; theWindowPtr:WindowPtr) ;
|
||||||
|
Tool $0E,$14;
|
||||||
|
PROCEDURE SetContentDraw ( contentDrawPtr:VoidProcPtr; theWindowPtr:WindowPtr)
|
||||||
|
; Tool $0E,$49;
|
||||||
|
PROCEDURE SetContentOrigin ( xOrigin:Integer; yOrigin:Integer;
|
||||||
|
theWindowPtr:WindowPtr) ; Tool $0E,$3F;
|
||||||
|
PROCEDURE SetContentOrigin2 ( scrollFlag:Integer; xOrigin:Integer;
|
||||||
|
yOrigin:Integer; theWindowPtr:WindowPtr) ; Tool $0E,$57;
|
||||||
|
PROCEDURE SetDataSize ( dataWidth:Integer; dataHeight:Integer;
|
||||||
|
theWindowPtr:WindowPtr) ; Tool $0E,$41;
|
||||||
|
PROCEDURE SetDefProc ( wDefProcPtr:LongProcPtr; theWindowPtr:WindowPtr) ; Tool
|
||||||
|
$0E,$32;
|
||||||
|
PROCEDURE SetFrameColor ( newColorPtr:WindColorPtr; theWindowPtr:WindowPtr) ;
|
||||||
|
Tool $0E,$0F;
|
||||||
|
PROCEDURE SetInfoDraw ( infoRecCon:VoidProcPtr; theWindowPtr:WindowPtr) ; Tool
|
||||||
|
$0E,$16;
|
||||||
|
PROCEDURE SetInfoRefCon ( infoRefCon:Longint; theWindowPtr:WindowPtr) ; Tool
|
||||||
|
$0E,$36;
|
||||||
|
PROCEDURE SetMaxGrow ( maxWidth:Integer; maxHeight:Integer;
|
||||||
|
theWindowPtr:WindowPtr) ; Tool $0E,$43;
|
||||||
|
PROCEDURE SetOriginMask ( originMask:Integer; theWindowPtr:WindowPtr) ; Tool
|
||||||
|
$0E,$34;
|
||||||
|
PROCEDURE SetPage ( hPage:Integer; vPage:Integer; theWindowPtr:WindowPtr) ;
|
||||||
|
Tool $0E,$47;
|
||||||
|
PROCEDURE SetScroll ( hScroll:Integer; vScroll:Integer; theWindowPtr:WindowPtr)
|
||||||
|
; Tool $0E,$45;
|
||||||
|
PROCEDURE SetSysWindow ( theWindowPtr:WindowPtr) ; Tool $0E,$4B;
|
||||||
|
PROCEDURE SetWFrame ( wFrame:Integer; theWindowPtr:WindowPtr) ; Tool $0E,$2D;
|
||||||
|
FUNCTION SetWindowIcons ( newFontHandle:FontHndl) : FontHndl ; Tool $0E,$4E;
|
||||||
|
PROCEDURE SetWRefCon ( wRefCon:Longint; theWindowPtr:WindowPtr) ; Tool
|
||||||
|
$0E,$28;
|
||||||
|
PROCEDURE SetWTitle ( title:Str255; theWindowPtr:WindowPtr) ; Tool $0E,$0D;
|
||||||
|
PROCEDURE SetZoomRect ( wZoomSizePtr:Rect; theWindowPtr:WindowPtr) ; Tool
|
||||||
|
$0E,$38;
|
||||||
|
PROCEDURE ShowHide ( showFlag:Boolean; theWindowPtr:WindowPtr) ; Tool $0E,$23;
|
||||||
|
PROCEDURE ShowWindow ( theWindowPtr:WindowPtr) ; Tool $0E,$13;
|
||||||
|
PROCEDURE SizeWindow ( newWidth:Integer; newHeight:Integer;
|
||||||
|
theWindowPtr:WindowPtr) ; Tool $0E,$1C;
|
||||||
|
PROCEDURE StartDrawing ( theWindowPtr:WindowPtr) ; Tool $0E,$4D;
|
||||||
|
PROCEDURE StartInfoDrawing (VAR infoRectPtr:Rect; theWindowPtr:WindowPtr) ;
|
||||||
|
Tool $0E,$50;
|
||||||
|
FUNCTION TaskMaster ( taskMask:Integer; taskRecPtr:WmTaskRec) : Integer ; Tool
|
||||||
|
$0E,$1D;
|
||||||
|
FUNCTION TrackGoAway ( startX:Integer; startY:Integer; theWindowPtr:WindowPtr)
|
||||||
|
: Boolean ; Tool $0E,$18;
|
||||||
|
FUNCTION TrackZoom ( startX:Integer; startY:Integer; theWindowPtr:WindowPtr) :
|
||||||
|
Boolean ; Tool $0E,$26;
|
||||||
|
PROCEDURE ValidRect ( goodRectPtr:Rect) ; Tool $0E,$3C;
|
||||||
|
PROCEDURE ValidRgn ( goodRgnHandle:RgnHandle) ; Tool $0E,$3D;
|
||||||
|
FUNCTION WindDragRect ( actionProcPtr:VoidProcPtr; dragPatternPtr:Pattern;
|
||||||
|
startX:Integer; startY:Integer; dragRectPtr:Rect; limitRectPtr:Rect;
|
||||||
|
slopRectPtr:Rect; dragFlag:Integer) : Longint ; Tool $0E,$53;
|
||||||
|
PROCEDURE WindNewRes ; Tool $0E,$25;
|
||||||
|
FUNCTION WindowGlobal ( WindowGlobalMask:Integer) : Integer ; Tool $0E,$56;
|
||||||
|
PROCEDURE ZoomWindow ( theWindowPtr:WindowPtr) ; Tool $0E,$27;
|
||||||
|
FUNCTION TaskMasterDA ( eventMask:Integer; taskRecPtr:Ptr) : Integer ; Tool
|
||||||
|
$0E,$5F;
|
||||||
|
FUNCTION CompileText ( subType:Integer; subStringsPtr:Ptr; srcStringPtr:Ptr;
|
||||||
|
srcSize:Integer) : Handle ; Tool $0E,$60;
|
||||||
|
FUNCTION NewWindow2 ( titlePtr:StringPtr; refCon:Longint;
|
||||||
|
contentDrawPtr:ProcPtr; defProcPtr:ProcPtr; paramTableDesc:RefDescriptor;
|
||||||
|
paramTableRef:Ref; resourceType:Integer) : WindowPtr ; Tool $0E,$61;
|
||||||
|
FUNCTION ErrorWindow ( subType:Integer; subStringPtr:Ptr; errNum:Integer) :
|
||||||
|
Integer ; Tool $0E,$62;
|
||||||
|
IMPLEMENTATION
|
||||||
|
END.
|
144
prodos16.h
Normal file
144
prodos16.h
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* The ProDOS 16 tool calls
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t call;
|
||||||
|
const char *name;
|
||||||
|
} Prodos16;
|
||||||
|
|
||||||
|
static Prodos16 prodos16[] = {
|
||||||
|
{0x0001, "CREATE"},
|
||||||
|
{0x0002, "DESTROY"},
|
||||||
|
{0x0004, "CHANGE_PATH"},
|
||||||
|
{0x0005, "SET_FILE_INFO"},
|
||||||
|
{0x0006, "GET_FILE_INFO"},
|
||||||
|
{0x0008, "VOLUME"},
|
||||||
|
{0x0009, "SET_PREFIX"},
|
||||||
|
{0x000a, "GET_PREFIX"},
|
||||||
|
{0x000b, "CLEAR_BACKUP_BIT"},
|
||||||
|
{0x0010, "OPEN"},
|
||||||
|
{0x0011, "NEWLINE"},
|
||||||
|
{0x0012, "READ"},
|
||||||
|
{0x0013, "WRITE"},
|
||||||
|
{0x0014, "CLOSE"},
|
||||||
|
{0x0015, "FLUSH"},
|
||||||
|
{0x0016, "SET_MARK"},
|
||||||
|
{0x0017, "GET_MARK"},
|
||||||
|
{0x0018, "SET_EOF"},
|
||||||
|
{0x0019, "GET_EOF"},
|
||||||
|
{0x001a, "SET_LEVEL"},
|
||||||
|
{0x001b, "GET_LEVEL"},
|
||||||
|
{0x001c, "GET_DIR_ENTRY"},
|
||||||
|
{0x0020, "GET_DEV_NUM"},
|
||||||
|
{0x0021, "GET_LAST_DEV"},
|
||||||
|
{0x0022, "READ_BLOCK"},
|
||||||
|
{0x0023, "WRITE_BLOCK"},
|
||||||
|
{0x0024, "FORMAT"},
|
||||||
|
{0x0025, "ERASE_DISK"},
|
||||||
|
{0x0027, "GET_NAME"},
|
||||||
|
{0x0028, "GET_BOOT_VOL"},
|
||||||
|
{0x0029, "QUIT"},
|
||||||
|
{0x002a, "GET_VERSION"},
|
||||||
|
{0x002c, "D_INFO"},
|
||||||
|
{0x0031, "ALLOC_INTERRUPT"},
|
||||||
|
{0x0032, "DEALLOCATE_INTERRUPT"},
|
||||||
|
{0x0101, "Get_LInfo"},
|
||||||
|
{0x0102, "Set_LInfo"},
|
||||||
|
{0x0103, "Get_Lang"},
|
||||||
|
{0x0104, "Set_Lang"},
|
||||||
|
{0x0105, "Error"},
|
||||||
|
{0x0106, "Set_Variable"},
|
||||||
|
{0x0107, "Version"},
|
||||||
|
{0x0108, "Read_Indexed"},
|
||||||
|
{0x0109, "Init_Wildcard"},
|
||||||
|
{0x010a, "Next_Wildcard"},
|
||||||
|
{0x010b, "Read_Variable"},
|
||||||
|
{0x010c, "ChangeVector"},
|
||||||
|
{0x010d, "Execute"},
|
||||||
|
{0x010e, "FastFile"},
|
||||||
|
{0x010f, "Direction"},
|
||||||
|
{0x0110, "Redirect"},
|
||||||
|
{0x0113, "Stop"},
|
||||||
|
{0x0114, "ExpandDevices"},
|
||||||
|
{0x0115, "UnsetVariable"},
|
||||||
|
{0x0116, "Export"},
|
||||||
|
{0x0117, "PopVariables"},
|
||||||
|
{0x0118, "PushVariables"},
|
||||||
|
{0x0119, "SetStopFlag"},
|
||||||
|
{0x011a, "ConsoleOut"},
|
||||||
|
{0x011b, "SetIODevices"},
|
||||||
|
{0x011c, "GetIODevices"},
|
||||||
|
{0x011d, "GetCommand"},
|
||||||
|
{0x2001, "Create"},
|
||||||
|
{0x2002, "Destroy"},
|
||||||
|
{0x2003, "OSShutdown"},
|
||||||
|
{0x2004, "ChangePath"},
|
||||||
|
{0x2005, "SetFileInfo"},
|
||||||
|
{0x2006, "GetFileInfo"},
|
||||||
|
{0x2007, "JudgeName"},
|
||||||
|
{0x2008, "Volume"},
|
||||||
|
{0x2009, "SetPrefix"},
|
||||||
|
{0x200a, "GetPrefix"},
|
||||||
|
{0x200b, "ClearBackup"},
|
||||||
|
{0x200c, "SetSysPrefs"},
|
||||||
|
{0x200d, "Null"},
|
||||||
|
{0x200e, "ExpandPath"},
|
||||||
|
{0x200f, "GetSysPrefs"},
|
||||||
|
{0x2010, "Open"},
|
||||||
|
{0x2011, "NewLine"},
|
||||||
|
{0x2012, "Read"},
|
||||||
|
{0x2013, "Write"},
|
||||||
|
{0x2014, "Close"},
|
||||||
|
{0x2015, "Flush"},
|
||||||
|
{0x2016, "SetMark"},
|
||||||
|
{0x2017, "GetMark"},
|
||||||
|
{0x2018, "SetEOF"},
|
||||||
|
{0x2019, "GetEOF"},
|
||||||
|
{0x201a, "SetLevel"},
|
||||||
|
{0x201b, "GetLevel"},
|
||||||
|
{0x201c, "GetDirEntry"},
|
||||||
|
{0x201d, "BeginSession"},
|
||||||
|
{0x201e, "EndSession"},
|
||||||
|
{0x201f, "SessionStatus"},
|
||||||
|
{0x2020, "GetDevNumber"},
|
||||||
|
{0x2024, "Format"},
|
||||||
|
{0x2025, "EraseDisk"},
|
||||||
|
{0x2026, "ResetCache"},
|
||||||
|
{0x2027, "GetName"},
|
||||||
|
{0x2028, "GetBoolVol"},
|
||||||
|
{0x2029, "Quit"},
|
||||||
|
{0x202a, "GetVersion"},
|
||||||
|
{0x202b, "GetFSTInfo"},
|
||||||
|
{0x202c, "DInfo"},
|
||||||
|
{0x202d, "DStatus"},
|
||||||
|
{0x202e, "DControl"},
|
||||||
|
{0x202f, "DRead"},
|
||||||
|
{0x2030, "DWrite"},
|
||||||
|
{0x2031, "BindInt"},
|
||||||
|
{0x2032, "UnbindInt"},
|
||||||
|
{0x2033, "FSTSpecific"},
|
||||||
|
{0x2034, "AddNotifyProc"},
|
||||||
|
{0x2035, "DelNotifyProc"},
|
||||||
|
{0x2036, "DRename"},
|
||||||
|
{0x2037, "GetStdRefNum"},
|
||||||
|
{0x2038, "GetRefNum"},
|
||||||
|
{0x2039, "GetRefInfo"},
|
||||||
|
{0x203a, "SetStdRefNum"}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define numProdos16 (sizeof(prodos16) / sizeof(prodos16[0]))
|
||||||
|
|
||||||
|
static const char *prodos16Lookup(uint16_t call) {
|
||||||
|
for (int i = 0; i < numProdos16; i++) {
|
||||||
|
if (prodos16[i].call >= call) {
|
||||||
|
if (prodos16[i].call == call)
|
||||||
|
return prodos16[i].name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
56
prodos8.h
Normal file
56
prodos8.h
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* Defines the ProDOS 8 tool calls
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t call;
|
||||||
|
const char *name;
|
||||||
|
} Prodos8;
|
||||||
|
|
||||||
|
static Prodos8 prodos8[] = {
|
||||||
|
{0x0040, "ALLOC_INTERRUPT"},
|
||||||
|
{0x0041, "DEALLOC_INTERRUPT"},
|
||||||
|
{0x0042, "AppleTalk"},
|
||||||
|
{0x0043, "SpecialOpenFork"},
|
||||||
|
{0x0044, "ByteRangeLock"},
|
||||||
|
{0x0065, "QUIT"},
|
||||||
|
{0x0080, "READ_BLOCK"},
|
||||||
|
{0x0081, "WRITE_BLOCK"},
|
||||||
|
{0x0082, "GET_TIME"},
|
||||||
|
{0x00c0, "CREATE"},
|
||||||
|
{0x00c1, "DESTROY"},
|
||||||
|
{0x00c2, "RENAME"},
|
||||||
|
{0x00c3, "SetFileInfo"},
|
||||||
|
{0x00c4, "GetFileInfo"},
|
||||||
|
{0x00c5, "ONLINE"},
|
||||||
|
{0x00c6, "SET_PREFIX"},
|
||||||
|
{0x00c7, "GET_PREFIX"},
|
||||||
|
{0x00c8, "OPEN"},
|
||||||
|
{0x00c9, "NEWLINE"},
|
||||||
|
{0x00ca, "READ"},
|
||||||
|
{0x00cb, "WRITE"},
|
||||||
|
{0x00cc, "CLOSE"},
|
||||||
|
{0x00cd, "FLUSH"},
|
||||||
|
{0x00ce, "SET_MARK"},
|
||||||
|
{0x00cf, "GET_MARK"},
|
||||||
|
{0x00d0, "SET_EOF"},
|
||||||
|
{0x00d1, "GET_EOF"},
|
||||||
|
{0x00d2, "SET_BUF"},
|
||||||
|
{0x00d3, "GET_BUF"}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define numProdos8 (sizeof(prodos8) / sizeof(prodos8[0]))
|
||||||
|
|
||||||
|
static const char *prodos8Lookup(uint16_t call) {
|
||||||
|
for (int i = 0; i < numProdos8; i++) {
|
||||||
|
if (prodos8[i].call >= call) {
|
||||||
|
if (prodos8[i].call == call)
|
||||||
|
return prodos8[i].name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
120
regs.c
Normal file
120
regs.c
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* The main disassembler
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <argp.h>
|
||||||
|
#include "handle.h"
|
||||||
|
#include "scan.h"
|
||||||
|
#include "disasm.h"
|
||||||
|
|
||||||
|
const char *argp_program_version = "regs 0.1";
|
||||||
|
const char *argp_program_bug_address = "sean@seancode.com";
|
||||||
|
static char doc[] = "Disassemble Apple IIgs software";
|
||||||
|
static char args_doc[] = "FILE or MAP";
|
||||||
|
static struct argp_option options[] = {
|
||||||
|
{"org", 'o', "ADDRESS", 0,
|
||||||
|
"Starting address of the binary file, in hex"},
|
||||||
|
{"m", 'm', 0, OPTION_ARG_OPTIONAL,
|
||||||
|
"Start with 8-bit accumulator"},
|
||||||
|
{"x", 'x', 0, OPTION_ARG_OPTIONAL,
|
||||||
|
"Start with 8-bit indices"},
|
||||||
|
{"e", 'e', 0, OPTION_ARG_OPTIONAL,
|
||||||
|
"Start in emulation mode"},
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct arguments {
|
||||||
|
char *filename;
|
||||||
|
uint32_t org;
|
||||||
|
MapFlags flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline uint32_t parseNum(const char *s) {
|
||||||
|
uint32_t res = 0;
|
||||||
|
while (isspace(*s)) {
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
while (isxdigit(*s)) {
|
||||||
|
res <<= 4;
|
||||||
|
if (*s >= '0' && *s <= '9') {
|
||||||
|
res |= *s - '0';
|
||||||
|
} else if (*s >= 'a' && *s <= 'f') {
|
||||||
|
res |= *s - 'a' + 10;
|
||||||
|
} else if (*s >= 'A' && *s <= 'F') {
|
||||||
|
res |= *s - 'A' + 10;
|
||||||
|
}
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
||||||
|
struct arguments *arguments = state->input;
|
||||||
|
switch (key) {
|
||||||
|
case 'o':
|
||||||
|
if (arg) {
|
||||||
|
arguments->org = parseNum(arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if (arg) {
|
||||||
|
arguments->flags |= IsM8;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'x':
|
||||||
|
if (arg) {
|
||||||
|
arguments->flags |= IsX8;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if (arg) {
|
||||||
|
arguments->flags |= IsEmu;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ARGP_KEY_ARG:
|
||||||
|
if (state->arg_num >= 1) {
|
||||||
|
argp_usage(state);
|
||||||
|
}
|
||||||
|
arguments->filename = arg;
|
||||||
|
break;
|
||||||
|
case ARGP_KEY_END:
|
||||||
|
if (state->arg_num < 1) {
|
||||||
|
argp_usage(state);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ARGP_ERR_UNKNOWN;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct argp argp = { options, parse_opt, args_doc, doc };
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
struct arguments arguments;
|
||||||
|
arguments.filename = "";
|
||||||
|
arguments.org = 0x300;
|
||||||
|
arguments.flags = IsOpcode;
|
||||||
|
argp_parse(&argp, argc, argv, 0, 0, &arguments);
|
||||||
|
|
||||||
|
// load the map, if it exists
|
||||||
|
Map *map = loadMap(arguments.filename, arguments.org, arguments.flags);
|
||||||
|
|
||||||
|
// load the file
|
||||||
|
FILE *f = fopen(map->filename, "rb");
|
||||||
|
if (!f) {
|
||||||
|
fprintf(stderr, "Failed to open '%s'\n", map->filename);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
size_t len = ftell(f);
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
uint8_t *data = malloc(len);
|
||||||
|
fread(data, len, 1, f);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
scan(data, len, map);
|
||||||
|
disassemble(data, len, map);
|
||||||
|
free(data);
|
||||||
|
}
|
185
scan.c
Normal file
185
scan.c
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* The tracing scanner.
|
||||||
|
*/
|
||||||
|
#include "scan.h"
|
||||||
|
#include "65816.h"
|
||||||
|
#include "handle.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t address;
|
||||||
|
MapFlags flags;
|
||||||
|
} Scan;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t max;
|
||||||
|
uint32_t num;
|
||||||
|
Scan *values;
|
||||||
|
} List;
|
||||||
|
|
||||||
|
static void initList(List *list) {
|
||||||
|
list->max = 1024;
|
||||||
|
list->num = 0;
|
||||||
|
list->values = malloc(sizeof(Scan) * list->max);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void freeList(List *list) {
|
||||||
|
free(list->values);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void appendList(List *list, uint32_t address, MapFlags flags) {
|
||||||
|
list->values[list->num].address = address;
|
||||||
|
list->values[list->num].flags = flags;
|
||||||
|
list->num++;
|
||||||
|
if (list->num == list->max) {
|
||||||
|
list->max *= 1.6;
|
||||||
|
list->values = realloc(list->values, sizeof(Scan) * list->max);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t fillMem(uint32_t address, int len, MapFlags flags, Map *map) {
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
map->mem[address++ - map->minMemory] = flags;
|
||||||
|
}
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
void scan(uint8_t *data, size_t len, Map *map) {
|
||||||
|
List toScan;
|
||||||
|
initList(&toScan);
|
||||||
|
map->maxMemory = map->minMemory + len;
|
||||||
|
|
||||||
|
map->mem = calloc(len, sizeof(MapFlags));
|
||||||
|
|
||||||
|
for (Rule *rule = map->rules; rule != NULL; rule = rule->next) {
|
||||||
|
appendList(&toScan, rule->address, rule->flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (toScan.num > 0) {
|
||||||
|
toScan.num--;
|
||||||
|
MapFlags flags = toScan.values[toScan.num].flags;
|
||||||
|
uint32_t address = toScan.values[toScan.num].address;
|
||||||
|
|
||||||
|
while (address < map->maxMemory) {
|
||||||
|
uint8_t *ptr = data + address - map->minMemory;
|
||||||
|
|
||||||
|
uint8_t opcode = *ptr++;
|
||||||
|
if (map->mem[address - map->minMemory] & IsOperand) {
|
||||||
|
// we jumped into the middle of an opcode.. go backward to clear it
|
||||||
|
uint32_t offset = (address - map->minMemory) - 1;
|
||||||
|
while (offset > 0 && (map->mem[offset] & IsOperand)) {
|
||||||
|
map->mem[offset--] = IsData;
|
||||||
|
}
|
||||||
|
map->mem[offset] = IsData; // overwrite the opcode too.
|
||||||
|
}
|
||||||
|
|
||||||
|
Address mode = opcodes[opcode].address;
|
||||||
|
OpType type = opcodes[opcode].type;
|
||||||
|
if (address + addressSizes[mode] > map->maxMemory) {
|
||||||
|
mode = DB;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t width = addressSizes[mode];
|
||||||
|
if (mode == IMMM && (flags & (IsEmu | IsM8))) {
|
||||||
|
width--;
|
||||||
|
}
|
||||||
|
if (mode == IMMX && (flags & (IsEmu | IsX8))) {
|
||||||
|
width--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode == DB) {
|
||||||
|
map->mem[address++ - map->minMemory] = IsData;
|
||||||
|
} else {
|
||||||
|
map->mem[address++ - map->minMemory] = IsOpcode |
|
||||||
|
(flags & (IsEmu | IsX8 | IsM8));
|
||||||
|
address = fillMem(address, width - 1, IsOperand, map);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t val = 0;
|
||||||
|
int8_t delta;
|
||||||
|
int16_t delta16;
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
case IMM:
|
||||||
|
val = *ptr++;
|
||||||
|
if (opcode == 0xe2) {
|
||||||
|
flags |= val;
|
||||||
|
} else if (opcode == 0xc2) {
|
||||||
|
flags &= ~val;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IMMM:
|
||||||
|
if (flags & (IsEmu | IsM8)) {
|
||||||
|
val = *ptr++;
|
||||||
|
} else {
|
||||||
|
val = r16(ptr); ptr += 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IMMX:
|
||||||
|
if (flags & (IsEmu | IsX8)) {
|
||||||
|
val = *ptr++;
|
||||||
|
} else {
|
||||||
|
val = r16(ptr); ptr += 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IMMS:
|
||||||
|
val = r16(ptr); ptr += 2;
|
||||||
|
break;
|
||||||
|
case ABS:
|
||||||
|
val = r16(ptr); ptr += 2;
|
||||||
|
val |= address & 0xff0000;
|
||||||
|
break;
|
||||||
|
case ABL:
|
||||||
|
val = r24(ptr); ptr += 3;
|
||||||
|
break;
|
||||||
|
case REL:
|
||||||
|
delta = *ptr++;
|
||||||
|
val = delta + address;
|
||||||
|
break;
|
||||||
|
case RELL:
|
||||||
|
delta16 = r16(ptr); ptr += 2;
|
||||||
|
val = delta16 + address;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opcode == 0x18 && *ptr == 0xfb) { // clc xce
|
||||||
|
flags &= ~IsEmu; // 16-bit
|
||||||
|
}
|
||||||
|
if (opcode == 0x38 && *ptr == 0xfb) { // sec xce
|
||||||
|
flags |= IsEmu; // 8-bit
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opcode == 0x20) { // jsr
|
||||||
|
if ((val & 0xffff) == 0xc50d || (val & 0xffff) == 0xc70d) { // disk
|
||||||
|
address = fillMem(address, 3, IsData, map); // db, dw
|
||||||
|
if (*ptr++ >= 0x40) {
|
||||||
|
address = fillMem(address, 2, IsData, map); // dw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((val & 0xffff) == 0xbf00) { // prodos8
|
||||||
|
address = fillMem(address, 3, IsData, map); // db, dw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opcode == 0x22) { // jsl
|
||||||
|
if (val == 0xe100a8) {
|
||||||
|
address = fillMem(address, 6, IsData, map); // dw, dd
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == BRANCH || (type == CALL && mode != AIX) ||
|
||||||
|
(type == JUMP && mode != IND && mode != AIX)) {
|
||||||
|
if (val >= map->minMemory && val < map->maxMemory &&
|
||||||
|
!(map->mem[val - map->minMemory] & IsOpcode)) {
|
||||||
|
appendList(&toScan, val, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (type == BREAK || type == RETURN || type == JUMP) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
freeList(&toScan);
|
||||||
|
}
|
11
scan.h
Normal file
11
scan.h
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* The tracing scanner.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "map.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
extern void scan(uint8_t *data, size_t len, Map *map);
|
47
smartport.h
Normal file
47
smartport.h
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2018 Sean Kasun
|
||||||
|
* Defines the SmartPort tool calls
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t call;
|
||||||
|
const char *name;
|
||||||
|
} SmartPort;
|
||||||
|
|
||||||
|
static SmartPort smartport[] = {
|
||||||
|
{0x00, "Status"},
|
||||||
|
{0x01, "Read"},
|
||||||
|
{0x02, "Write"},
|
||||||
|
{0x03, "Format"},
|
||||||
|
{0x04, "Control"},
|
||||||
|
{0x05, "Init"},
|
||||||
|
{0x06, "Open"},
|
||||||
|
{0x07, "Close"},
|
||||||
|
{0x08, "Read"},
|
||||||
|
{0x09, "Write"},
|
||||||
|
{0x40, "Status"},
|
||||||
|
{0x41, "Read"},
|
||||||
|
{0x42, "Write"},
|
||||||
|
{0x43, "Format"},
|
||||||
|
{0x44, "Control"},
|
||||||
|
{0x45, "Init"},
|
||||||
|
{0x46, "Open"},
|
||||||
|
{0x47, "Close"},
|
||||||
|
{0x48, "Read"},
|
||||||
|
{0x49, "Write"}
|
||||||
|
};
|
||||||
|
|
||||||
|
#define numSmartPort (sizeof(smartport) / sizeof(smartport[0]))
|
||||||
|
|
||||||
|
static const char *smartportLookup(uint8_t call) {
|
||||||
|
for (int i = 0; i < numSmartPort; i++) {
|
||||||
|
if (smartport[i].call >= call) {
|
||||||
|
if (smartport[i].call == call)
|
||||||
|
return smartport[i].name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user