From b7cb4a9afa01d965df140cf03619fd37c5af2285 Mon Sep 17 00:00:00 2001 From: Shawn Quick Date: Mon, 11 Nov 2019 15:56:03 -0800 Subject: [PATCH] first commit --- .gitignore | 1 + CMakeLists.txt | 42 + LICENSE | 1 + Makefile | 47 + README | 1 + app.h | 1 + asm.cpp | 920 +++++++ asm.h | 229 ++ config.h | 14 + eval.cpp | 609 ++++ eval.h | 90 + libpal | 1 + opcodes.cpp | 682 +++++ opcodes.h | 3 + qasm | 1 + qasm.cpp | 98 + qasm.h | 19 + qasm.ini | 22 + src/asm/asm.1.s | 4006 +++++++++++++++++++++++++++ src/asm/asm.cmd.s | 21 + src/asm/asm.cond.s | 2275 +++++++++++++++ src/asm/asm.dsk.s | 1259 +++++++++ src/asm/asm.errors.s | 219 ++ src/asm/asm.eval.s | 1441 ++++++++++ src/asm/asm.header.s | 481 ++++ src/asm/asm.opcodes.s | 4673 +++++++++++++++++++++++++++++++ src/asm/asm.vars.s | 376 +++ src/data/external.s | 109 + src/data/globals.s | 101 + src/data/opcodetest.s | 407 +++ src/data/opdata.s | 1371 +++++++++ src/data/qa.equates.s | 193 ++ src/data/toolmacs.s | 1383 ++++++++++ src/docs/qasm.docs | 492 ++++ src/docs/shell.docs | 34 + src/docs/zak.idea | 28 + src/edit/edit.1.s | 4719 +++++++++++++++++++++++++++++++ src/edit/edit.apw.s | 869 ++++++ src/edit/edit.cmd.s | 22 + src/edit/edit.equs.s | 81 + src/edit/edit.macs.s | 84 + src/edit/edit.s | 5515 +++++++++++++++++++++++++++++++++++++ src/edit/edit.types.s | 278 ++ src/exe/ascii.s | 1 + src/exe/cat.cmd.s | 1 + src/exe/cat.macs.s | 1 + src/exe/catalog.s | 1 + src/exe/del.cmd.s | 1 + src/exe/dump.s | 1 + src/exe/time.s | 1 + src/intcmd/intcmd.macs.s | 163 ++ src/intcmd/qaintcmd.cmd.s | 22 + src/intcmd/qaintcmd.s | 1024 +++++++ src/link/link.cmd.s | 10 + src/link/link.errors.s | 197 ++ src/link/link.eval.s | 1342 +++++++++ src/link/link.express.s | 1345 +++++++++ src/link/link.header.s | 501 ++++ src/link/link.vars.s | 317 +++ src/link/linker.1.s | 5505 ++++++++++++++++++++++++++++++++++++ src/link/linker.2.s | 1898 +++++++++++++ src/macs/intcmd.macs.s | 163 ++ src/macs/qatools.macs.s | 599 ++++ src/macs/tool.macs.s | 243 ++ src/macs/toolmacs.s | 1382 ++++++++++ src/main.s | 225 ++ src/merlin_convert.s | 4002 +++++++++++++++++++++++++++ src/merlin_orig.s | 1 + src/obj/qatools | 1 + src/qasystem/login | 7 + src/qasystem/qacmd | 67 + src/qasystem/qagraf | 1 + src/qasystem/qaintcmd | 1 + src/qasystem/qaprefs | 1 + src/qasystem/qaprefs.s | 32 + src/qasystem/qatext | 1 + src/qasystem/qatools | 1 + src/qasystem/qe.prefs | 1 + src/qasystem/quicklink.s | 5 + src/shell/equs.s | 90 + src/shell/ifd.equs.s | 458 +++ src/shell/ifd.lib.s | 34 + src/shell/link.s | 35 + src/shell/macs.s | 953 +++++++ src/shell/qasm.s | 1649 +++++++++++ src/shell/qasm1.s | 1774 ++++++++++++ src/shell/qasm2.s | 920 +++++++ src/t1.s | 1 + src/testfile.s | 308 +++ src/tools/link.s | 23 + src/tools/qatools.1.s | 3547 ++++++++++++++++++++++++ src/tools/qatools.macs.s | 598 ++++ src/tools/qatools.s | 5261 +++++++++++++++++++++++++++++++++++ src/tools/tool.macs.s | 242 ++ src/utility/catalog | 1 + src/utility/delete | 2 + src/utility/deletelink | 1 + src/utility/dump | 1 + src/utility/edit | 1 + src/utility/lc | 1 + src/utility/qasmgs | 0 src/utility/qlinkgs | 1 + src/utility/rez | 1 + src/utility/time | 1 + 104 files changed, 68185 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README create mode 120000 app.h create mode 100644 asm.cpp create mode 100644 asm.h create mode 100644 config.h create mode 100644 eval.cpp create mode 100644 eval.h create mode 120000 libpal create mode 100644 opcodes.cpp create mode 100644 opcodes.h create mode 120000 qasm create mode 100644 qasm.cpp create mode 100644 qasm.h create mode 100644 qasm.ini create mode 100644 src/asm/asm.1.s create mode 100644 src/asm/asm.cmd.s create mode 100644 src/asm/asm.cond.s create mode 100644 src/asm/asm.dsk.s create mode 100644 src/asm/asm.errors.s create mode 100644 src/asm/asm.eval.s create mode 100644 src/asm/asm.header.s create mode 100644 src/asm/asm.opcodes.s create mode 100644 src/asm/asm.vars.s create mode 100644 src/data/external.s create mode 100644 src/data/globals.s create mode 100644 src/data/opcodetest.s create mode 100644 src/data/opdata.s create mode 100644 src/data/qa.equates.s create mode 100644 src/data/toolmacs.s create mode 100644 src/docs/qasm.docs create mode 100644 src/docs/shell.docs create mode 100644 src/docs/zak.idea create mode 100644 src/edit/edit.1.s create mode 100644 src/edit/edit.apw.s create mode 100644 src/edit/edit.cmd.s create mode 100644 src/edit/edit.equs.s create mode 100644 src/edit/edit.macs.s create mode 100644 src/edit/edit.s create mode 100644 src/edit/edit.types.s create mode 100644 src/exe/ascii.s create mode 100644 src/exe/cat.cmd.s create mode 100644 src/exe/cat.macs.s create mode 100644 src/exe/catalog.s create mode 100644 src/exe/del.cmd.s create mode 100644 src/exe/dump.s create mode 100644 src/exe/time.s create mode 100644 src/intcmd/intcmd.macs.s create mode 100644 src/intcmd/qaintcmd.cmd.s create mode 100644 src/intcmd/qaintcmd.s create mode 100644 src/link/link.cmd.s create mode 100644 src/link/link.errors.s create mode 100644 src/link/link.eval.s create mode 100644 src/link/link.express.s create mode 100644 src/link/link.header.s create mode 100644 src/link/link.vars.s create mode 100644 src/link/linker.1.s create mode 100644 src/link/linker.2.s create mode 100644 src/macs/intcmd.macs.s create mode 100644 src/macs/qatools.macs.s create mode 100644 src/macs/tool.macs.s create mode 100644 src/macs/toolmacs.s create mode 100644 src/main.s create mode 100644 src/merlin_convert.s create mode 100644 src/merlin_orig.s create mode 100644 src/obj/qatools create mode 100644 src/qasystem/login create mode 100644 src/qasystem/qacmd create mode 100644 src/qasystem/qagraf create mode 100644 src/qasystem/qaintcmd create mode 100644 src/qasystem/qaprefs create mode 100644 src/qasystem/qaprefs.s create mode 100644 src/qasystem/qatext create mode 100644 src/qasystem/qatools create mode 100644 src/qasystem/qe.prefs create mode 100644 src/qasystem/quicklink.s create mode 100644 src/shell/equs.s create mode 100644 src/shell/ifd.equs.s create mode 100644 src/shell/ifd.lib.s create mode 100644 src/shell/link.s create mode 100644 src/shell/macs.s create mode 100644 src/shell/qasm.s create mode 100644 src/shell/qasm1.s create mode 100644 src/shell/qasm2.s create mode 100644 src/t1.s create mode 100644 src/testfile.s create mode 100644 src/tools/link.s create mode 100644 src/tools/qatools.1.s create mode 100644 src/tools/qatools.macs.s create mode 100644 src/tools/qatools.s create mode 100644 src/tools/tool.macs.s create mode 100644 src/utility/catalog create mode 100644 src/utility/delete create mode 100644 src/utility/deletelink create mode 100644 src/utility/dump create mode 100644 src/utility/edit create mode 100644 src/utility/lc create mode 100644 src/utility/qasmgs create mode 100644 src/utility/qlinkgs create mode 100644 src/utility/rez create mode 100644 src/utility/time diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4469528 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +**/build diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..36dffb9 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 3.0) + +set(CMAKE_BUILD_TYPE Debug) +set(APPVERSION "1.0.0") +set(LIBRARY_NAME pal) + +include(./lib${LIBRARY_NAME}/cmake/CMakeHeader.txt) + +set(SOURCE + ${PROJECT_ROOT}/${PROJECT_ID}.cpp + ${PROJECT_ROOT}/asm.cpp + ${PROJECT_ROOT}/opcodes.cpp + ${PROJECT_ROOT}/eval.cpp +) + +include_directories(BEFORE + ${PROJECT_ROOT} + ${PROJECT_ROOT}/lib${LIBRARY_NAME}/include/${LIBRARY_NAME} +) + +add_subdirectory(${PROJECT_ROOT}/lib${LIBRARY_NAME}) + +include(${PROJECT_ROOT}/lib${LIBRARY_NAME}/cmake/CMakeApp.txt) + +add_executable( ${PROJECT_NAME} ${SOURCE}) + +target_link_libraries ( +${PROJECT_NAME} +${LIBRARY_NAME} +pthread +PocoFoundation +PocoNet +PocoUtil +PocoNetSSL +PocoCrypto +) + +include(./lib${LIBRARY_NAME}/cmake/CMakeCommands.txt) + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a71463c --- /dev/null +++ b/LICENSE @@ -0,0 +1 @@ +#GPL Licence diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..824f339 --- /dev/null +++ b/Makefile @@ -0,0 +1,47 @@ +export CC=/usr/bin/clang +export CXX=/usr/bin/clang++ + + +V?= +S= +ifneq ("$V","") +S="VERBOSE=1" +else +.SILENT: +endif + +all: + -mkdir -p ./build + -cd ./build && cmake .. && $(MAKE) $S + +distclean: + rm -rf build app/build sgqlib/build + +clean: + -cd ./build && $(MAKE) clean + +depend: + -cd ./build && $(MAKE) depend + +rebuild: + -cd ./build && $(MAKE) rebuild_cache + +lib: + -cd ./build && $(MAKE) sgq + +run: + -cd ./build && $(MAKE) run + +install: + -cd ./build && cmake -P cmake_install.cmake + +asm: + qasm src/testfile.s + #cd src/asm && ../qasm main.s + + + + + + + diff --git a/README b/README new file mode 100644 index 0000000..6d7d543 --- /dev/null +++ b/README @@ -0,0 +1 @@ +Merlin Compatible assembler/linker (and more) for linux diff --git a/app.h b/app.h new file mode 120000 index 0000000..20ade6d --- /dev/null +++ b/app.h @@ -0,0 +1 @@ +qasm.h \ No newline at end of file diff --git a/asm.cpp b/asm.cpp new file mode 100644 index 0000000..ce08943 --- /dev/null +++ b/asm.cpp @@ -0,0 +1,920 @@ +#define ADD_ERROR_STRINGS +#include "asm.h" +#include "eval.h" + +#define CLASS MerlinLine + + +CLASS::CLASS() +{ + clear(); +} + +CLASS::CLASS(std::string line) +{ + clear(); + set(line); +} + + +void CLASS::setError(uint32_t ecode) +{ + errorcode = ecode; +} + +void CLASS::print(uint32_t lineno) +{ + int i, l; + + + l = outbytect; + if (l > 4) + { + l = 4; + } + + //if ((opflags&OP_STD)!=OP_STD) + if ((opcodelower != "inc") && (opcodelower != "ldx") && (opcodelower != "stx")) + { + //return; + } + if (errorcode > 0) + { + if (errorcode >= errFatal) + { + SetColor(CL_WHITE | CL_BOLD | BG_RED); + } + else + { + SetColor(CL_YELLOW | CL_BOLD | BG_NORMAL); + } + } + else + { + SetColor(CL_WHITE | CL_BOLD | BG_NORMAL); + } + bool empty = false; + if ((lable == "") && (opcode == "") && (operand == "")) + { + empty = true; + } + int b = 4; + + printf("%02X ", addressmode); + printf("%6d", lineno + 1); + if (!empty) + { + printf(" %06X:", startpc); + } + else + { + printf(" "); + } + + for (i = 0; i < l; i++) + { + printf("%02X ", outbytes[i]); + } + for (i = l; i < b; i++) + { + printf(" "); + } + + if (empty) + { + printf("%s", comment.c_str()); + } + else + { + printf("%-12s %-8s %-10s ", lable.c_str(), opcode.c_str(), operand.c_str()); + if (errorcode > 0) + { + printf(":[Error] %s", errStrings[errorcode].c_str()); + } + else + { + printf("%s", comment.c_str()); + } + } + if (errorcode > 0) + { + SetColor(CL_NORMAL | BG_NORMAL); + } + printf("\n"); + +} + +void CLASS::clear() +{ + syntax = SYNTAX_MERLIN; + lable = ""; + opcode = ""; + opcodelower = ""; + operand = ""; + comment = ""; + operand_expr = ""; + addrtext = ""; + bytect = 0; + opflags = 0; + pass0bytect = 0; + startpc = 0; + errorcode = 0; + inbytect = 0; + outbytect = 0; + outbytes.clear(); + addressmode = 0; + expr_value = 0; + flags = 0; + outbytes.clear(); +} + +void CLASS::set(std::string line) +{ + int state = 0; + int l = line.length(); + int i = 0; + char c,delim; + + clear(); + + //printf("line: |%s|\n", line.c_str()); + while (i < l) + { + c = line[i++]; + //printf("state: %d\n",state); + switch (state) + { + case 0: // start of line state + if ((c == ';') || (c == '*')) + { + comment += c; + state = 7; + } + else if (c > ' ') + { + lable += c; + state = 1; + } + else + { + state = 2; + }; + break; + case 1: // read in entire lable until whitespace + if (c > ' ') + { + lable += c; + } + else + { + state = 2; + } + break; + case 2: // read whitespace between label and opcode + if (c == ';') + { + comment += c; + state = 7; + } + else if (c > ' ') + { + opcode += c; + state = 3; + } + break; + case 3: + if (c > ' ') + { + opcode += c; + } + else + { + state = 4; + } + break; + case 4: // read whitespace between opcode and operand + if (c == ';') + { + comment += c; + state = 7; + } + else if (c > ' ') + { + operand += c; + if (c == '\'') + { + state = 8; + } + else + { + state = 5; + } + } + break; + case 5: + if ((c == '\'') || (c=='"')) + { + delim=c; + operand += c; + state = 8; + } + else if (c > ' ') + { + operand += c; + } + else + { + state = 6; + } + break; + case 6: + if (c > ' ') + { + comment += c; + state = 7; + } + break; + case 7: + comment += c; + break; + case 8: + if (c == delim) + { + operand += c; + state = 5; + } + else + { + operand += c; + } + break; + } + } + opcodelower = Poco::toLower(opcode); +} + +#undef CLASS +#define CLASS TFileProcessor + +CLASS::CLASS() +{ +} + +CLASS::~CLASS() +{ +} + +void CLASS::errorOut(uint16_t code) +{ + printf("error: %d\n", code); +} + +void CLASS::init(void) +{ + syntax = SYNTAX_MERLIN; +} + +void CLASS::complete(void) +{ +} + +void CLASS::process(void) +{ + +} +int CLASS::doline(int lineno, std::string line) +{ + int res = -1; + + return (res); +} + +int CLASS::processfile(std::string &p) +{ + //Poco::File fn(p); + int c; + int res = -1; + uint32_t linect; + bool done, valid; + std::string p1; + std::string line, op; + + linect = 0; + done = false; + + Poco::Path tp(p); + Poco::Path path = tp.makeAbsolute(); + + valid = true; + p1 = tp.toString(); + Poco::File fn(p1); + if (!fn.exists()) + { + fn = Poco::File(p1 + ".s"); + if (!fn.exists()) + { + fn = Poco::File(p1 + ".S"); + if (!fn.exists()) + { + fn = Poco::File(p1 + ".mac"); + if (!fn.exists()) + { + valid = false; + } + } + } + } + p1 = fn.path(); + + if (valid) + { + std::ifstream f(p1); + if (f.is_open()) + { + //printf("file is open\n"); + line = ""; + + while ((!done) && (f.good()) && (!f.eof())) + { + c = f.get(); + if (c == 0x8D) // merlin line ending + { + c = 0x0A; // convert to linux + } + if (c == 0x8A) // possible merlin line ending + { + c = 0x00; // ignore + } + c &= 0x7F; +#if 0 + //printf("%02X ",c&0x7F); + + printf("%c", c); +#else + int x; + switch (c) + { + case 0x0D: + break; + case 0x09: + line += " "; + break; + case 0x0A: + linect++; + x = doline(linect, line); + if (x < 0) + { + done = true; + } + line = ""; + break; + default: + if ((c >= ' ') && (c < 0x7F)) + { + line += c; + } + else + { + //printf("garbage %08X\n",c); + } + break; + } +#endif + } + if ( (f.eof())) + { + res = 0; + } + } + } + else + { + printf("file %s does not exist\n", p.c_str()); + } + + //printf("\n\nfile read result: %d\n", res); + return (res); +} + +#undef CLASS + +#define CLASS T65816Asm + +CLASS::CLASS() +{ + lines.clear(); +} + +#define OPHANDLER(ACB) std::bind(ACB, this, std::placeholders::_1, std::placeholders::_2) + +CLASS::~CLASS() +{ +} + +void CLASS::pushopcode(std::string op, uint8_t opcode, uint16_t flags, TOpCallback cb) +{ + TSymbol sym; + + sym.name = op; + sym.opcode = opcode; + sym.namelc = Poco::toLower(op); + sym.stype = flags; + sym.value = 0; + sym.cb = cb; + std::pair p(Poco::toUpper(op), sym); + + opcodes.insert(p); +} + + +TSymbol *CLASS::findSymbol(std::string symname) +{ + TSymbol *res = NULL; + + auto itr = symbols.find(Poco::toUpper(symname)); + if (itr != symbols.end()) + { + res = &itr->second; + + return (res); + } + return (res); +} + +TSymbol *CLASS::addSymbol(std::string sym, uint32_t val, bool replace) +{ + TSymbol *res = NULL; + TSymbol *fnd = NULL; + + fnd = findSymbol(sym); + + if ((fnd != NULL) && (!replace)) + { + return (NULL); // it is a duplicate + } + + if (fnd != NULL) + { + fnd->value = val; + return (fnd); + } + + TSymbol s; + s.name = sym; + s.opcode = 0; + s.namelc = Poco::toLower(sym); + s.stype = 0; + s.value = val; + s.cb = NULL; + std::pair p(Poco::toUpper(sym), s); + symbols.insert(p); + res = findSymbol(sym); + return (res); +} + +void CLASS::showSymbolTable(void) +{ +// Poco::HashTable::Iterator itr; + for (auto itr = symbols.begin(); itr != symbols.end(); itr++) + { + TSymbol ptr = itr->second; + printf("Sym: %-24s 0x%08X\n", ptr.name.c_str(), ptr.value); + } +} + +int CLASS::callOpCode(std::string op, MerlinLine &line) +{ + int res = -1; + char c; + + if (op.length() == 4) // check for 4 digit 'L' opcodes + { + c = op[3]; + if ((c >= 'a') || (c <= 'z')) + { + c = c - 0x20; + } + if (c == 'L') + { + op = op.substr(0, 3); + line.flags |= FLAG_LONGADDR; + } + + } + //Poco::HashMap::ConstIterator ptr; + + auto itr = opcodes.find(Poco::toUpper(op)); + if (itr != opcodes.end()) + { + TSymbol s = itr->second; + if (s.cb != NULL) + { + if (s.stype & OP_ONEBYTE) + { + line.inbytes[0] = (s.opcode); + line.inbytect = 1; + } + res = s.cb(line, s); + if (res == -1) + { + res = -2; + } + } + } + else + { + line.setError(errBadOpcode); + } + return (res); +} + +//imp = +//imm = #$00 +//sr = $00,S +//dp = $00 +//dpx = $00,X +//dpy = $00,Y +//idp = ($00) +//idx = ($00,X) +//idy = ($00),Y +//idl = [$00] +//idly = [$00],Y +//isy = ($00,S),Y +//abs = $0000 +//abx = $0000,X +//aby = $0000,Y +//abl = $000000 +//alx = $000000,X +//ind = ($0000) +//iax = ($0000,X) +//ial = [$000000] +//rel = $0000 (8 bits PC-relative) +//rell = $0000 (16 bits PC-relative) +//bm = $00,$00 + + +typedef struct +{ + std::string regEx; + uint16_t addrMode; + std::string text; + std::string expression; +} TaddrMode; + +TaddrMode addrRegEx[] = +{ + { "^(?'expr'.+)\\,[s,S]{1}$", syn_s, "e,s"}, // expr,s + {"^[(]{1}(?'expr'.+)[,]{1}[(S|s)]{1}[)]{1}[,]{1}[(Y|y)]{1}$", syn_sy, "(e,s),y"}, // (expr,s),y + {"^#{1}(?'shift'[<,>,^,|]?)(.+)$", syn_imm, "immediate"}, //#expr,#^expr,#|expr,#expr + {"^[(]{1}(?'expr'.+)[,]{1}[x,X]{1}\\)$", syn_diix, "(e,x)"}, // (expr,x) + {"^[(]{1}(?'expr'.+)[\\)]{1}[\\,][(Y|y]{1}$", syn_diiy, "(e),y"}, //(expr),y + {"^[(]{1}(?'expr'.+)[\\)]{1}$", syn_di, "(e)"}, // (expr) + {"^\\[{1}(?'expr'.+)\\]{1}[,]{1}[(Y|y)]{1}$", syn_iyl, "[e],x"}, // [expr],y + {"^\\[(?'expr'.+)\\]$", syn_dil, "[e]"}, // [expr] + {"^(?'expr'.+)[,]{1}[(X|x)]{1}$", syn_absx, "e,x"}, // expr,x + {"^(?'expr'.+)[,]{1}[(Y|y)]{1}$", syn_absy, "e,y"}, // expr,y + {"^(?'expr'.+)[,]{1}(?'expr2'.+)$", syn_bm, "block"}, // block move expr,expr1 + {"^(?'expr'.+)$", syn_abs, "absolute"}, // expr (MUST BE LAST) + {"", 0, ""} +}; + +// opcodes that are only 65C02 (27) - also in 65816 + +// 0x01 = 6502 +// 0x02 = 65C02 +// 0x03 = 65816 +uint8_t opCodeCompatibility[256] = { + 0x00,0x00,0x02,0x02,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x02, + 0x00,0x00,0x01,0x02,0x01,0x00,0x00,0x02,0x00,0x00,0x01,0x02,0x01,0x00,0x00,0x02, + 0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02, + 0x00,0x00,0x01,0x02,0x01,0x00,0x00,0x02,0x00,0x00,0x01,0x02,0x01,0x00,0x00,0x02, + 0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02, + 0x00,0x00,0x01,0x02,0x02,0x00,0x00,0x02,0x00,0x00,0x01,0x02,0x02,0x00,0x00,0x02, + 0x00,0x00,0x02,0x02,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02, + 0x00,0x00,0x01,0x02,0x01,0x00,0x00,0x02,0x00,0x00,0x01,0x02,0x01,0x00,0x00,0x02, + 0x01,0x00,0x02,0x02,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x02, + 0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x01,0x00,0x01,0x02, + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02, + 0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02, + 0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02, + 0x00,0x00,0x01,0x02,0x02,0x00,0x00,0x02,0x00,0x00,0x01,0x02,0x02,0x00,0x00,0x02, + 0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02, + 0x00,0x00,0x01,0x02,0x02,0x00,0x00,0x02,0x00,0x00,0x01,0x02,0x02,0x00,0x00,0x02 +}; + +void CLASS::init(void) +{ + TFileProcessor::init(); + lines.clear(); + + insertOpcodes(); + +} + +void CLASS::initpass(void) +{ + casesen = true; + relocatable = false; + listing = true; + + origin = 0; + currentpc = 0; + cpumode = MODE_65816; + mx = 0x00; + currentsym = NULL; + totalbytes = 0; + lineno = 0; + passcomplete = false; +} + +void CLASS::complete(void) +{ + printf("=== Assembly Complete: %d bytes\n", totalbytes); + + if (listing) + { + showSymbolTable(); + } +} + +int CLASS::evaluate(std::string expr, int64_t &value) +{ + int res = -1; + int64_t result = 0; + + if (expr.length() > 0) + { + + TEvaluator eval(*this); + + res = eval.evaluate(expr, result); + //printf("res=%d %08lX\n",res,result); + if (res == 0) + { + value = result; + } + } + else + { + value = 0; + res = 0; + } + return res; +} + +int CLASS::getAddrMode(MerlinLine &line) +{ + int res = -1; + uint16_t mode = syn_none; + int idx, x; + std::string s, oper; + std::vector groups; + + oper = line.operand; + + if ((line.opcode.length() == 0) || (line.operand.length() == 0)) + { + return (syn_implied); + } + + idx = 0; + while (mode == syn_none) + { + s = addrRegEx[idx].regEx; + if (s == "") + { + mode = syn_err; + } + else + { + RegularExpression regex(s, 0, true); + groups.clear(); + x = 0; + try + { + x = regex.split(oper, 0, groups, 0); + } + catch (...) + { + x = 0; + } + if (x > 0) + { + mode = addrRegEx[idx].addrMode; + line.addrtext = addrRegEx[idx].text; + //cout << "mode: " << line.addrtext << endl; + for (uint32_t i = 0; i < groups.size(); i++) + { + s = groups[i]; + if ((s != "^") && (s != "<") && (s != ">") && (s != "|")) + { + line.operand_expr = s; + //printf("line expression=|%s|\n", s.c_str()); + } + else + { + // SGQ need to set a flag for a shift and process it after eval + } + } + } + } + idx++; + } + + if (mode == syn_none) + { + mode = syn_err; + } + res = mode; + //printf("syn_mode=%d\n", mode); + return (res); +} + +int CLASS::parseOperand(MerlinLine &line) +{ + + int res = -1; + + line.operand_expr = ""; + int m = getAddrMode(line); + if (m >= 0) + { + res = m; + } + else + { + //errorOut(errBadAddressMode); + } + return (res); +} + +void CLASS::process(void) +{ + uint32_t l; + int x; + char c; + std::string op, operand; + //uint32_t operand_eval; + //uint16_t addrmode; + + MerlinLine *line; + pass = 0; + while (pass < 2) + { + initpass(); + + l = lines.size(); + while ((lineno < l) && (!passcomplete)) + { + line = &lines[lineno]; + + //printf("lineno: %d %d |%s|\n",lineno,l,line->operand.c_str()); + + op = Poco::toLower(line->opcode); + operand = Poco::toLower(line->operand); + line->startpc = currentpc; + line->bytect = 0; + + if ((line->lable != "") && (pass == 0)) + { + c = line->lable[0]; + switch (c) + { + case ']': + break; + case ':': + break; + default: + addSymbol(line->lable, currentpc, false); + break; + } + } + x = parseOperand(*line); + if (x >= 0) + { + line->addressmode = x; + } + int64_t value = -1; + x=-1; + x = evaluate(line->operand_expr, value); + if (x == 0) + { + value &= 0xFFFFFFFF; + //printf("OPERAND VALUE=%08X\n",value); + line->expr_value = value; + } + else + { + line->expr_value = 0xFFFFFFFF; + } + + x = 0; + if (op.length() > 0) + { + x = callOpCode(op, *line); + } + if (x > 0) + { + line->bytect = x; + currentpc += x; + totalbytes += x; + } + if (pass == 0) + { + line->pass0bytect = line->bytect; + } + + + if (pass == 1) + { + if ((line->pass0bytect != line->bytect) && (line->errorcode == 0)) + { + line->setError(errBadByteCount); + } + + bool skip = false; + if (op == "lst") + { + if ((operand == "") || (operand == "on")) + { + listing = true; + } + else + { + skip = true; + listing = false; + } + } + if ((!skip) && (listing) && (pass == 1)) + { + line->print(lineno); + } + } + lineno++; + } + pass++; + } + +} + +int CLASS::doline(int lineno, std::string line) +{ + int res = 0; + std::string op; + + MerlinLine l(line); + + op = Poco::toLower(l.opcode); + if (op == "merlin") + { + syntax = SYNTAX_MERLIN; + } + else if (op == "orca") + { + syntax = SYNTAX_ORCA; + } + l.syntax = syntax; + lines.push_back(l); + + if ((op == "use") || (op == "put")) + { + //printf("processing % s\n",l.operand.c_str()); + processfile(l.operand); + } + + return (res); +} + +#undef CLASS + +#define CLASS T65816Link + +CLASS::CLASS() +{ +} + +CLASS::~CLASS() +{ +} + +void CLASS::init(void) +{ + TFileProcessor::init(); +} + +void CLASS::process(void) +{ + +} +void CLASS::complete(void) +{ +} + +int CLASS::doline(int lineno, std::string line) +{ + int res = 0; + + return (res); +} + +#undef CLASS diff --git a/asm.h b/asm.h new file mode 100644 index 0000000..0568f74 --- /dev/null +++ b/asm.h @@ -0,0 +1,229 @@ +#pragma once +#include "app.h" + +#define OPHANDLER(ACB) std::bind(ACB, this, std::placeholders::_1, std::placeholders::_2) + +#define MODE_6502 0 +#define MODE_65C02 1 +#define MODE_65816 2 + +#define SYNTAX_MERLIN 0 +#define SYNTAX_APW 1 +#define SYNTAX_ORCA 2 + +#define OP_6502 0x01 +#define OP_65C02 0x02 +#define OP_65816 0x04 +#define OP_PSUEDO 0x08 +#define OP_ONEBYTE 0x10 +#define OP_SPECIAL 0x20 +#define OP_CLASS0 0x0000 +#define OP_CLASS1 0x0100 +#define OP_CLASS2 0x0200 +#define OP_CLASS3 0x0300 +#define OP_CLASS4 0x0400 +#define OP_STD (0x1000 | OP_CLASS1 | OP_6502) +#define OP_ASL (0x2000 | OP_CLASS2 | OP_6502) +#define OP_STX (0x3000 | OP_CLASS2 | OP_6502) +#define OP_C0 (0x4000 | OP_CLASS0 | OP_6502) + +enum asmErrors +{ + errNone, + errWarn, + errIncomplete, + errFatal, + errBadAddressMode, + errBadOpcode, + errIncompatibleOpcode, + errBadByteCount, + errMAX +}; + +#ifdef ADD_ERROR_STRINGS +std::string errStrings[errMAX] = { + "No Error", + "Warning", + "Unfinished Opcode", + "Fatal", + "Unsupported Addressing Mode", + "Unknown Opcode", + "Opcode not available under CPU selecton", + "Byte output differs between passes", +}; +#else +extern std::string errStrings[errMAX]; +extern uint8_t opCodeCompatibility[256]; + +#endif + +enum +{ + syn_err = -1, // error - not recognized + syn_none = 0, // should never be returned 0 + syn_implied, // no operand 1 + syn_s, // expr,s 2 + syn_sy, // (expr,s),y 3 + syn_imm, // #expr 4 + syn_diix, // (expr,x) 5 + syn_diiy, // (expr),y 6 + syn_di, // (expr) 7 + syn_iyl, // [expr],y 8 + syn_dil, // [expr] 9 + syn_absx, // expr,x 10 + syn_absy, // expr,y 11 + syn_bm, // block move 12 + syn_abs, // expr 13 + + syn_MAX +}; + +#define FLAG_LONGADDR 0x01 + +class MerlinLine +{ +public: + + uint8_t syntax; + std::string lable; + std::string opcode; + std::string opcodelower; + std::string operand; + std::string operand_expr; + std::string comment; + std::string addrtext; + uint32_t flags; + uint16_t opflags; + uint32_t startpc; + uint32_t addressmode; + uint32_t expr_value; + uint32_t errorcode; + uint8_t inbytect; + uint8_t inbytes[256]; + + uint16_t pass0bytect; + uint16_t bytect; + uint16_t outbytect; + std::vector outbytes; + +public: + MerlinLine(); + MerlinLine(std::string line); + void clear(); + void set(std::string line); + void print(uint32_t lineno); + void setError(uint32_t ecode); +}; + +class TFileProcessor +{ +protected: + uint8_t syntax; +public: + + TFileProcessor(); + virtual ~TFileProcessor(); + virtual int processfile(std::string &p); + virtual void init(void); + virtual int doline(int lineno, std::string line); + virtual void process(void); + virtual void complete(void); + virtual void errorOut(uint16_t code); +}; + +class TSymbol; +typedef int (*TOpCB)(MerlinLine &line, TSymbol &sym); +typedef std::function TOpCallback; + +class TSymbol +{ +public: + std::string namelc; + std::string name; + uint32_t value; + uint16_t stype; + uint8_t opcode; + TOpCallback cb; + Poco::HashMaplocals; + + TSymbol() + { + locals.clear(); + }; +}; + + +class T65816Asm : public TFileProcessor +{ +protected: + bool passcomplete; + bool casesen; + bool relocatable; + bool listing; + uint32_t totalbytes; + uint32_t lineno; + uint32_t origin; + uint8_t mx; + uint8_t cpumode; // 0=6502, 1=65C02, 2=65816 + TSymbol *currentsym; + std::vector lines; + Poco::HashMapopcodes; + Poco::HashMap macros; + Poco::HashMap symbols; +public: + uint16_t pass; + uint32_t currentpc; + + T65816Asm(); + virtual ~T65816Asm(); + + virtual void init(void); + virtual int doline(int lineno, std::string line); + virtual void process(void); + virtual void complete(void); + + void insertOpcodes(void); + void pushopcode(std::string op, uint8_t opcode, uint16_t flags, TOpCallback cb); + + int callOpCode(std::string op, MerlinLine &line); + TSymbol *findSymbol(std::string sym); + TSymbol *addSymbol(std::string sym, uint32_t val, bool replace); + + void initpass(void); + void showSymbolTable(void); + + int evaluate(std::string expr, int64_t &value); + + int parseOperand(MerlinLine &line); + int getAddrMode(MerlinLine &line); + void setOpcode(MerlinLine &line, uint8_t op); + + + int doPSEUDO(MerlinLine &line, TSymbol &sym); + int doEND(MerlinLine &line, TSymbol &sym); + int doBase6502(MerlinLine &line, TSymbol &sym); + int doBRANCH(MerlinLine &line, TSymbol &sym); + int doJMP(MerlinLine &line, TSymbol &sym); + int doAddress(MerlinLine &line, TSymbol &sym); + int doNoPattern(MerlinLine &line, TSymbol &sym); + + int doEQU(MerlinLine &line, TSymbol &sym); + int doXC(MerlinLine &line, TSymbol &sym); + int doMX(MerlinLine &line, TSymbol &sym); + + int doBYTE(MerlinLine &line, TSymbol &sym); + int doUNK(MerlinLine &line, TSymbol &sym); + +}; + +class T65816Link : public TFileProcessor +{ +public: + T65816Link(); + virtual ~T65816Link(); + virtual void init(void); + virtual int doline(int lineno, std::string line); + virtual void process(void); + + virtual void complete(void); +}; \ No newline at end of file diff --git a/config.h b/config.h new file mode 100644 index 0000000..e60da9e --- /dev/null +++ b/config.h @@ -0,0 +1,14 @@ +#pragma once + +// define application options here +#define PAL_APPCLASS TMyCustomApp + +//#define SERVERAPP +#define ENABLE_SSL +#define USE_LOGGER + +// help text +#define HELP_USAGE " filename" +#define HELP_PURPOSE "a program that does something" + + diff --git a/eval.cpp b/eval.cpp new file mode 100644 index 0000000..0652cde --- /dev/null +++ b/eval.cpp @@ -0,0 +1,609 @@ +#include "asm.h" +#include "eval.h" +#include +#include + +#define CLASS TEvaluator + +std::ostream& operator<<(std::ostream& os, const Token& token) +{ + os << token.str; + return os; +} + +CLASS::CLASS(T65816Asm &_asm) : assembler(_asm) +{ +} + +CLASS::~CLASS() +{ +} + +std::deque CLASS::exprToTokens(const std::string& expr) +{ + std::deque tokens; + int state = 0; + char c; + char delim; + std::string ident, asc; + + std::string ops = "+-*//^!.&()"; + std::string c1; + char *tokptr; + char *tptr; + bool numexpect; + Token::Type t; + + numexpect = true; + for (const auto* p = expr.c_str(); *p; ++p) + { + c = *p; + c1 = c; + tptr = (char *)c1.c_str(); + tokptr = strpbrk(tptr, (const char *)ops.c_str()); + // printf("state=%d %c %p\n", state, c,tokptr); + + switch (state) + { + default: + printf("bad token state\n"); + state = 0; + break; + case 11: + if ((c < ' ') || (c == delim)) + { + // SGQ - convert ascii to a number here + asc = "0"; + //printf("ident=|%s|\n",ident.c_str()); + if (ident.length() > 0) + { + // SGQ - convert ascii to a number here + } + t = Token::Type::Number; + int pr = 1; // precedence + bool ra = false; // rightAssociative + tokens.push_back(Token + { + t, asc, pr, ra + }); + ident = ""; + state = 0; + if (c != delim) + { + p--; + } + } + else + { + ident += c; + } + break; + case 10: + case 20: + if ((c <= ' ') || (tokptr != NULL)) + { + if (ident.length() > 0) + { + if (state == 20) + { + t = Token::Type::Symbol; + } + else + { + t = Token::Type::Number; + } + int pr = 1; // precedence + bool ra = false; // rightAssociative + tokens.push_back(Token + { + t, ident, pr, ra + }); + ident = ""; + } + state = 0; + p--; + } + else + { + ident += c; + } + break; + case 0: + if ((c == '$') && (numexpect)) + { + state = 10; + ident += c; + numexpect = false; + + } + else if ((c == '*') && (numexpect)) + { + numexpect = false; + state = 20; + ident += c; + } + else if ((c == '%') && (numexpect)) + { + state = 10; + ident += c; + numexpect = false; + + } + else if ((c == '\'') && (numexpect)) + { + delim = c; + state = 11; + numexpect = false; + } + else if ((c == '"') && (numexpect)) + { + delim = c; + state = 11; + numexpect = false; + } + else if (((c == '-') || (c == '+')) && (numexpect)) + { + state = 10; + ident += c; + } + else if (isdigit(c)) + { + state = 10; + ident += c; + numexpect = false; + + } + else if ((c >= 'a') && (c <= 'z')) + { + state = 20; + ident += c; + numexpect = false; + + } + else if ((c >= 'A') && (c <= 'A')) + { + state = 20; + ident += c; + numexpect = false; + } + else if ((tokptr != NULL) && (!numexpect)) + { + t = Token::Type::Unknown; + int pr = -1; // precedence + bool ra = false; // rightAssociative + switch (c) + { + default: break; + case '(': t = Token::Type::LeftParen; break; + case ')': t = Token::Type::RightParen; break; + case '!': t = Token::Type::Operator; pr = 5; break; + case '.': t = Token::Type::Operator; pr = 5; break; + case '&': t = Token::Type::Operator; pr = 5; break; + case '^': t = Token::Type::Operator; pr = 4; ra = true; break; + case '*': t = Token::Type::Operator; pr = 3; break; + case '/': t = Token::Type::Operator; pr = 3; break; + case '+': t = Token::Type::Operator; pr = 2; break; + case '-': t = Token::Type::Operator; pr = 2; break; + + } + tokens.push_back(Token + { + t, std::string(1, c), pr, ra + }); + numexpect = true; + } + } + } + + return tokens; +} + + +std::deque CLASS::shuntingYard(const std::deque& tokens) +{ + std::deque queue; + std::vector stack; + TSymbol *sym; + char buff[128]; + + // While there are tokens to be read: + for (auto token : tokens) + { + // Read a token + switch (token.type) + { + case Token::Type::Symbol: + token.type = Token::Type::Number; + + if (token.str == "*") + { + sprintf(buff, "%u", assembler.currentpc); + token.str = buff; + } + else + { + sym = assembler.findSymbol(token.str); + if (sym != NULL) + { + sprintf(buff, "%u", sym->value); + token.str = buff; + } + else + { + token.str = "-1"; + } + } + queue.push_back(token); + break; + case Token::Type::Number: + // If the token is a number, then add it to the output queue + queue.push_back(token); + break; + + case Token::Type::Operator: + { + // If the token is operator, o1, then: + const auto o1 = token; + + // while there is an operator token, + while (!stack.empty()) + { + // o2, at the top of stack, and + const auto o2 = stack.back(); + + // either o1 is left-associative and its precedence is + // *less than or equal* to that of o2, + // or o1 if right associative, and has precedence + // *less than* that of o2, + if ( + (! o1.rightAssociative && o1.precedence <= o2.precedence) + || ( o1.rightAssociative && o1.precedence < o2.precedence) + ) + { + // then pop o2 off the stack, + stack.pop_back(); + // onto the output queue; + queue.push_back(o2); + + continue; + } + + // @@ otherwise, exit. + break; + } + + // push o1 onto the stack. + stack.push_back(o1); + } + break; + + case Token::Type::LeftParen: + // If token is left parenthesis, then push it onto the stack + stack.push_back(token); + break; + + case Token::Type::RightParen: + // If token is right parenthesis: + { + bool match = false; + while (! stack.empty()) + { + // Until the token at the top of the stack + // is a left parenthesis, + const auto tos = stack.back(); + if (tos.type != Token::Type::LeftParen) + { + // pop operators off the stack + stack.pop_back(); + // onto the output queue. + queue.push_back(tos); + } + + // Pop the left parenthesis from the stack, + // but not onto the output queue. + stack.pop_back(); + match = true; + break; + } + + if (!match && stack.empty()) + { + // If the stack runs out without finding a left parenthesis, + // then there are mismatched parentheses. + printf("RightParen error (%s)\n", token.str.c_str()); + return queue; + } + } + break; + + default: + printf("error (%s)\n", token.str.c_str()); + return queue; + break; + } + + //debugReport(token, queue, stack); + } + + // When there are no more tokens to read: + // While there are still operator tokens in the stack: + while (! stack.empty()) + { + // If the operator token on the top of the stack is a parenthesis, + // then there are mismatched parentheses. + if (stack.back().type == Token::Type::LeftParen) + { + printf("Mismatched parentheses error\n"); + return queue; + } + + // Pop the operator onto the output queue. + queue.push_back(std::move(stack.back())); + stack.pop_back(); + } + + //debugReport(Token { Token::Type::Unknown, "End" }, queue, stack); + + //Exit. + return queue; +} + +int CLASS::parseNumber(std::string n, int64_t &val) +{ + int res = -1; + int state = 0; + char c; + std::string s; + uint32_t i, l; + bool valid = false; + bool err = false; + bool neg = false; + int base = 10; + int64_t tval = 0; + val = 0; + + + + i = 0; + l = n.length(); + s = ""; + for (i = 0; i < l; i++) + { + c = n[i]; + switch (state) + { + case 0: + if (c == '$') + { + state = 10; + } + else if (c == '%') + { + state = 20; + } + else if ((c == '-') && (!valid)) + { + neg = !neg; + } + else if (isdigit(c)) + { + s += c; + valid = true; + state = 1; + tval = c - '0'; + } + else + { + state = 99; + } + break; + case 1: + if (isdigit(c)) + { + s += c; + tval *= 10; + tval += c - '0'; + } + else + { + state = 99; + } + break; + case 10: + + base = 16; + if ((c >= 'a') && (c <= 'f')) + { + c = c - 0x20; // make it uppercase + s += c; + tval <<= 4; + tval |= (c - 'A') + 10; + valid = true; + } + else if ((c >= 'A') && (c <= 'F')) + { + s += c; + tval <<= 4; + tval |= (c - 'A') + 10; + valid = true; + + } + else if ((c >= '0') && (c <= '9')) + { + s += c; + tval <<= 4;; + tval += c - '0'; + valid = true; + } + else { state = 99; } + break; + case 20: + base = 2; + if ((c >= '0') && (c <= '1')) + { + s += c; + tval <<= 1; + if (c == '1') + { + tval |= 1; + } + valid = true; + } + else if (c == '_') + { + // allow these in binary + } + else { state = 99; } + break; + + case 99: + // if you get into this state there is an error + break; + } + } + + if (tval > (int64_t)0xFFFFFFFF) + { + err = true; + } + + + if ((state == 99) || (err)) + { + valid = false; + err = true; + val = -1; + } + + if ((valid) && (!err)) + { + if (neg) + { + tval = -tval; + } + val = tval; + res = 0; + } + return (res); +} + +int CLASS::evaluate(std::string & e, int64_t &res) +{ + // const std::string expr = "3+4*2/(1-5)^2^3"; // Wikipedia's example + // const std::string expr = "20-30/3+4*2^3"; + int errcode = -1; + + res = -1; + int u; + int64_t val; + std::string expr = Poco::trim(e); + expr += " "; // add a space at end to make parsing easier + + const auto tokens = exprToTokens(expr); + auto queue = shuntingYard(tokens); + std::vector stack; + + // printf("\nCalculation\n"); + //printf("|%-3s|%-32s|%-10s|\n", "Tkn", "Queue", "Stack"); + + while (! queue.empty()) + { + std::string op; + + const auto token = queue.front(); + queue.pop_front(); + switch (token.type) + { + case Token::Type::Symbol: + stack.push_back(std::stoi((char *)"0")); + //op = "Push " + token.str; + break; + case Token::Type::Number: + val = 0; + u = parseNumber(token.str, val); + if (u < 0) + { + val = -1; + } + stack.push_back(val); + //op = "Push " + token.str; + break; + + case Token::Type::Operator: + { + // SGQ + // bug here if there isn't something on both stacks for the operator to work on + + auto rhs = -1; + auto lhs = -1; + + if (stack.size() > 1) + { + rhs = stack.back(); + stack.pop_back(); + lhs = stack.back(); + stack.pop_back(); + } + + switch (token.str[0]) + { + default: + printf("Operator error [%s]\n", token.str.c_str()); + return (-1); + break; + case '^': + stack.push_back(static_cast(pow(lhs, rhs))); + break; + case '*': + stack.push_back(lhs * rhs); + break; + case '/': + if (rhs != 0) + { + stack.push_back(lhs / rhs); + } + else + { + stack.push_back(0); + } + break; + case '+': + stack.push_back(lhs + rhs); + break; + case '-': + stack.push_back(lhs - rhs); + break; + case '!': + stack.push_back(lhs ^ rhs); + break; + case '&': + stack.push_back(lhs & rhs); + break; case '.': + stack.push_back(lhs | rhs); + break; + } + //op = "Push " + std::to_string(lhs) + " " + token.str + " " + std::to_string(rhs); + } + break; + + default: + //printf("Token error\n"); + return (-1); + } + + //debugReport(token, queue, stack, op); + } + + int64_t v = -1; + if (stack.size() > 0) + { + v = stack.back(); + } + errcode = 0; + res = v; + if (assembler.pass > 0) + { + //printf("result = %16ld 0x%08lX |%s|\n", v, v, e.c_str()); + } + return (errcode); +} diff --git a/eval.h b/eval.h new file mode 100644 index 0000000..91e8c2d --- /dev/null +++ b/eval.h @@ -0,0 +1,90 @@ +#pragma once + +// Shunting-yard Algorithm +// http://en.wikipedia.org/wiki/Shunting-yard_algorithm +// +// https://ideone.com/kn4FUu +// +#include "asm.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#define CLASS TEvaluator + +class T65816Asm; + +class Token +{ +public: + enum Type + { + Unknown = 0, + Number, + Symbol, + Operator, + LeftParen, + RightParen, + }; + + Token(Type t, const std::string& s, int prec = -1, bool ra = false) + : type { t }, str ( s ), precedence { prec }, rightAssociative { ra } + {} + + Type type; + std::string str; + int precedence; + bool rightAssociative; +}; + +class CLASS +{ +protected: + T65816Asm &assembler; +public: + CLASS(T65816Asm &_asm); + ~CLASS(); + std::deque shuntingYard(const std::deque& tokens); + std::deque exprToTokens(const std::string& expr); + int parseNumber(std::string n, int64_t &val); + int evaluate(std::string &expr, int64_t &res); + +}; + +//std::ostream& operator<<(std::ostream& os, const Token& token) +//{ +// os << token.str; +// return os; +//} + + +// Debug output +template +void debugReport(const Token& token, const T& queue, const U& stack, const std::string& comment = "") +{ + std::ostringstream ossQueue; + for (const auto& t : queue) + { + ossQueue << " " << t; + } + + std::ostringstream ossStack; + for (const auto& t : stack) + { + ossStack << " " << t; + } + + printf("|%-3s|%-32s|%10s| %s\n" + , token.str.c_str() + , ossQueue.str().c_str() + , ossStack.str().c_str() + , comment.c_str() + ); +} + +#undef CLASS diff --git a/libpal b/libpal new file mode 120000 index 0000000..dea2627 --- /dev/null +++ b/libpal @@ -0,0 +1 @@ +/projects/SQ/projects/pocoproj/libpal \ No newline at end of file diff --git a/opcodes.cpp b/opcodes.cpp new file mode 100644 index 0000000..6ff3bd9 --- /dev/null +++ b/opcodes.cpp @@ -0,0 +1,682 @@ +#include "asm.h" + +#define CLASS T65816Asm + +void CLASS::setOpcode(MerlinLine &line, uint8_t op) +{ + if (pass > 0) + { + if (cpumode < MODE_65816) // instructions are valid if we are in 65816 + { + uint8_t m = opCodeCompatibility[op]; + if ((m > 0) && (cpumode < MODE_65C02)) // if the instruction is non-zero, and we are in 6502 base mode, error + { + if (line.errorcode == 0) // don't replace other errors + { + line.setError(errIncompatibleOpcode); + } + } + } + } + line.outbytes.push_back(op); +} + +int CLASS::doPSEUDO(MerlinLine &line, TSymbol &sym) +{ + return (0); +} + +int CLASS::doXC(MerlinLine &line, TSymbol &sym) +{ + std::string s; + int res = 0; + + if (cpumode < 2) + { + cpumode++; + } + if (line.operand.length() > 0) + { + s = Poco::toUpper(line.operand); + if (s == "OFF") + { + mx = 0x03; + cpumode = MODE_6502; + } + } + return (res); +} + +int CLASS::doMX(MerlinLine &line, TSymbol &sym) +{ + mx = (uint8_t)(line.expr_value & 0xFF); + //printf("setting MX=%02X\n",mx); + return (0); +} + +int CLASS::doEQU(MerlinLine &line, TSymbol &sym) +{ + int res = 0; + if (pass == 0) + { + res = -1; + TSymbol *s; + if (line.lable.length() > 0) + { + //printf("EQU: |%s| %08X\n", line.lable.c_str(), line.expr_value); + s = addSymbol(line.lable, line.expr_value, true); + if (s != NULL) + { + res = 0; + } + } + } + return (res); +} + +int CLASS::doUNK(MerlinLine &line, TSymbol &sym) +{ + int res = -1; + + res = 0; + if (pass > 0) + { + line.setError(errIncomplete); + + //line.outbytes.push_back(0x00); + line.outbytect = res; + } + return (res); +} + +int CLASS::doNoPattern(MerlinLine &line, TSymbol &sym) +{ + // this handles a few opcodes that don't fit mathmatically in the opcode table + // the 'sym.opcode' table identifies what each is: + // STZ = 1 + // TSB = 2 + // TRB = 3 + + int res,i; + uint8_t err; + uint8_t op; + uint8_t m = line.addressmode; + + res = 1; + + op = 0x00; + err=errBadAddressMode; + + switch (sym.opcode) + { + case 1: // STZ + res++; + op = (m == syn_abs ? 0x64 : op); + op = (m == syn_absx ? 0x74 : op); + + if ((op != 0) && (line.expr_value >= 0x100)) + { + res++; + op = (op == 0x64) ? 0x9C : op; + op = (op == 0x74) ? 0x9E : op; + } + break; + case 2: // TSB + res++; + op = (m == syn_abs ? 0x04 : op); + if ((op != 0) && (line.expr_value >= 0x100)) + { + res++; + op = 0x0C; + } + break; + case 3: // TRB + res++; + op = (m == syn_abs ? 0x14 : op); + if ((op != 0) && (line.expr_value >= 0x100)) + { + res++; + op = 0x1C; + } + break; + default: + op=0; + err=errBadOpcode; + break; + } + + if (op == 0x00) + { + res = 0; + line.setError(err); + } + if ((pass > 0) && (res > 0)) + { + setOpcode(line, op); + for (i = 0; i < (res - 1); i++) + { + line.outbytes.push_back(line.expr_value >> (8 * i)); + } + line.outbytect = res; + } + return (res); +} + +int CLASS::doAddress(MerlinLine &line, TSymbol &sym) +{ + + // this routine uses the 'opcode' specifed in the sym.opcode field. + // it also adds the number of bytes stored in the sym.stype field after doing an evaluation + int res, i; + + res = 1 + sym.stype; + if (pass > 0) + { + //line.setError(errIncomplete); + setOpcode(line, sym.opcode); + for (i = 0; i < (res - 1); i++) + { + line.outbytes.push_back(line.expr_value >> (i * 8)); + } + line.outbytect = res; + } + return (res); +} + +int CLASS::doJMP(MerlinLine &line, TSymbol &sym) +{ + int res, i; + bool err = false; + uint8_t op; + uint8_t optype = sym.opcode; + uint8_t m = line.addressmode; + + res = 3; + + op = 0; + + if (optype & 0x02) // these are SUBROUTINES + { + op = (m == syn_abs ? 0x20 : op); + op = (m == syn_diix ? 0xFC : op); + if (!(optype & 0x01)) // jsl? + { + res++; + op = 0x22; + } + } + else + { + op = (m == syn_abs ? 0x4C : op); + op = (m == syn_di ? 0x6C : op); + op = (m == syn_diix ? 0x7C : op); + op = (m == syn_dil ? 0xDC : op); + + if (!(optype & 0x01)) // JML? + { + op = (m == syn_abs ? 0x5C : op); + } + if ((op == 0xDC) || (op == 0x5C)) + { + if (cpumode < MODE_65816) + { + op = 0; // can't do these without an '816 + } + res++; + } + + } + + if (op == 0) + { + err = true; + } + + if (err) + { + res = 0; + line.setError(errBadAddressMode); + } + + if ((pass > 0) && (res > 0)) + { + setOpcode(line, op); + for (i = 0; i < (res - 1); i++) + { + line.outbytes.push_back((line.expr_value >> (8 * i)) & 0xFF); + } + line.outbytect = res; + } + return (res); +} + +int CLASS::doBRANCH(MerlinLine & line, TSymbol & sym) +{ + int res, i; + + res = 2; + + uint8_t op = (sym.opcode << 6) & 0xC0; + op |= 0x10; // make it a branch opcode + if (sym.opcode & 0x80) + { + op |= 0x20; + } + if (sym.opcode & 0x40) // BRA + { + op = 0x80; + } + if (sym.opcode & 0x20) // BRL + { + op = 0x82; + res++; + } + + if ((pass > 0) && (res > 0)) + { + setOpcode(line, op); + for (i = 0; i < (res - 1); i++) + { + line.outbytes.push_back(0x00); + } + line.outbytect = res; + } + return (res); +} + +// aaabbbcc + +int CLASS::doBase6502(MerlinLine & line, TSymbol & sym) +{ + int res = 1; + int i; + uint8_t bytelen = 1; + uint8_t cc; + uint8_t op, amode; + uint16_t opflags; + bool err = false; + //std::string opcode = Poco::toUpper(line.opcode); + + line.opflags = opflags = sym.stype; + op = (sym.opcode << 5) & 0xE0; + cc = (sym.stype >> 8) & 0x03; + amode = 0xFF; + + if ((sym.stype & OP_C0) == OP_C0) + { + uint8_t cc = 0; + uint8_t m = line.addressmode; + uint8_t bbb = 0xFF; + bbb = (m == syn_imm ? 0 : bbb); + bbb = (m == syn_abs ? 1 : bbb); + bbb = (m == syn_absx ? 5 : bbb); + //printf("expr_value=%08X\n",line.expr_value); + + if ((sym.opcode == 1) && (m == syn_imm)) //BIT special case + { + cc = 0x01; + op = 0x80; + bbb = 0x02; + } + + else if ((bbb > 0) && (line.expr_value >= 0x100)) + { + bbb |= 0x02; + } + op |= (bbb << 2) | cc; + goto out; + } + + + if (cc == 0x01) + { + switch (line.addressmode) + { + case syn_diix: amode = 0; break; + case syn_abs: amode = 1; break; + case syn_imm: amode = 2; break; + case syn_diiy: amode = 4; break; + case syn_absx: amode = 5; break; + case syn_absy: amode = 6; break; + default: + err = true; + break; + } + } + else if (cc == 0x02) + { + switch (line.addressmode) + { + case syn_imm: amode = 0; break; + case syn_abs: amode = 1; break; + case syn_implied: amode = 2; break; + case syn_absy: + if ((opflags & OP_STX) == OP_STX) + { + amode = 5; + } + break; + case syn_absx: amode = 5; break; // this is actually Y addressing because X register is used + default: + err = true; + break; + } + + if ((opflags & OP_STX) == OP_STX) + //if ((opcode == "STX") || (opcode == "LDX") || (opcode == "DEC") || (opcode == "INC")) + { + if (line.addressmode == syn_implied) + { + err = true; + } + if (line.addressmode == syn_absx) + { + //err = true; + } + if (cpumode >= MODE_65C02) + { + if (line.addressmode == syn_implied) + { + if ((opflags & (OP_STX | OP_SPECIAL)) == (OP_STX | OP_SPECIAL)) + { + if (sym.opcode == 0x07) // INC + { + err = false; + op = 0x1A; + bytelen = 0; + goto out; + } + if (sym.opcode == 0x06) // DEC + { + err = false; + op = 0x3A; + bytelen = 0; + goto out; + } + } + + + } + } + } + } + + if (line.addressmode == syn_imm) + { + uint8_t mask = 0x02; + if (cc == 0x02) // the non accumulator + { + mask = 0x01; + } + if ((mx & mask) == 0) + { + bytelen++; + } + } + else if ((line.addressmode == syn_abs) || (line.addressmode == syn_absx) + || (line.addressmode == syn_absy)) + { + // check here for zero page or not and adjust amode + //printf("addrmode=%d\n",line.addressmode); + if (line.expr_value >= 0x100) + { + bytelen++; + //if ((line.addressmode != syn_absy) && (amode != 6)) + if (amode != 6) + { + amode += 2; + } + } + if (line.flags & FLAG_LONGADDR) + { + err = true; + } + } + + if (err) // not a 6502 address mode + { + if (cpumode >= MODE_65816) + { + //printf("816\n"); + cc = 0x03; + err = false; + switch (line.addressmode) + { + case syn_s: amode = 0; break; + case syn_sy: amode = 4; break; + case syn_di: cc = 0x02; amode = 4; break; + case syn_iyl: amode = 5; break; + case syn_dil: amode = 1; break; + case syn_absx: amode = 7; break; + case syn_abs: amode = 3; break; + default: + //printf("bad syn_mode=%d\n", line.addressmode); + err = true; + break; + } + if (!err) + { + if (line.addressmode == syn_abs) + { + if (line.flags & FLAG_LONGADDR) + { + //amode=7; + } + } + } + } + } + + + op |= (amode & 0x07) << 2; + op |= cc; + +out: + if (err) + { + line.setError(errBadAddressMode); + //printf("bad address mode %d\n",line.addressmode); + op = 0x00; + res = 0; + bytelen = 0; + } + + res += bytelen; + if ((pass > 0) && (res > 0)) + { + setOpcode(line, op); + for (i = 0; i < (res - 1); i++) + { + line.outbytes.push_back(line.expr_value >> (8 * i)); + } + line.outbytect = res; + } + + return (res); +} + +int CLASS::doEND(MerlinLine & line, TSymbol & sym) +{ + int res = 0; + + passcomplete = true; + return (res); +} + +int CLASS::doBYTE(MerlinLine & line, TSymbol & sym) +{ + int res = -1; + + res = line.inbytect; + //printf("inbytes=%d %02X\n",res,line.inbytes[0]); + if (pass > 0) + { + setOpcode(line, sym.opcode); + line.outbytect = res; + } + return (res); +} + +void CLASS::insertOpcodes(void) +{ + pushopcode("=", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doEQU)); + pushopcode("EQU", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doEQU)); + pushopcode("EXT", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("ENT", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("ORG", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DSK", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("SAV", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DS", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("REL", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("OBJ", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("PUT", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("USE", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("VAR", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("SAV", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("TYP", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("END", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doEND)); + pushopcode("DUM", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DEND", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("AST", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("CYC", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DAT", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("EXP", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("LST", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("LSTDO", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("PAG", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("TTL", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("SKP", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("TR", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("ASC", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DCI", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("INV", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("FLS", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("REV", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("STR", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DA", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DW", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DDB", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DFB", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DB", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("ADR", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("ADRL", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("HEX", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DS", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("DO", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("ELSE", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("IF", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("FIN", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("CHK", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("ERR", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("KBD", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("LUP", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("--^", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("MX", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doMX)); + pushopcode("PAU", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("SW", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("USR", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("XC", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doXC)); + pushopcode("MAC", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("EOM", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + pushopcode("<<<", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO)); + + + pushopcode("ADC", 0x03, OP_STD, OPHANDLER(&CLASS::doBase6502)); + pushopcode("AND", 0x01, OP_STD, OPHANDLER(&CLASS::doBase6502)); + pushopcode("ASL", 0x00, OP_ASL, OPHANDLER(&CLASS::doBase6502)); + pushopcode("BCC", 0x02, OP_6502, OPHANDLER(&CLASS::doBRANCH)); + pushopcode("BLT", 0x02, OP_6502, OPHANDLER(&CLASS::doBRANCH)); + pushopcode("BCS", 0x82, OP_6502, OPHANDLER(&CLASS::doBRANCH)); + pushopcode("BGE", 0x82, OP_6502, OPHANDLER(&CLASS::doBRANCH)); + + pushopcode("BEQ", 0x83, OP_6502, OPHANDLER(&CLASS::doBRANCH)); + pushopcode("BIT", 0x01, OP_C0, OPHANDLER(&CLASS::doBase6502)); + pushopcode("BMI", 0x80, OP_6502, OPHANDLER(&CLASS::doBRANCH)); + pushopcode("BNE", 0x03, OP_6502, OPHANDLER(&CLASS::doBRANCH)); + pushopcode("BPL", 0x00, OP_6502, OPHANDLER(&CLASS::doBRANCH)); + pushopcode("BRA", 0x40, OP_65816, OPHANDLER(&CLASS::doBRANCH)); + pushopcode("BRK", 0x00, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("BRL", 0x20, OP_65816, OPHANDLER(&CLASS::doBRANCH)); + pushopcode("BVC", 0x01, OP_6502, OPHANDLER(&CLASS::doBRANCH)); + pushopcode("BVS", 0x81, OP_6502, OPHANDLER(&CLASS::doBRANCH)); + pushopcode("CLC", 0x18, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("CLD", 0xD8, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("CLI", 0x58, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("CLV", 0xB8, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("CMP", 0x06, OP_STD, OPHANDLER(&CLASS::doBase6502)); + pushopcode("COP", 0x02, 1, OPHANDLER(&CLASS::doAddress)); + pushopcode("CPX", 0x07, OP_C0, OPHANDLER(&CLASS::doBase6502)); + pushopcode("CPY", 0x06, OP_C0, OPHANDLER(&CLASS::doBase6502)); + pushopcode("DEC", 0x06, OP_STX | OP_SPECIAL, OPHANDLER(&CLASS::doBase6502)); + pushopcode("DEX", 0xCA, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("DEY", 0x88, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("EOR", 0x02, OP_STD, OPHANDLER(&CLASS::doBase6502)); + pushopcode("INC", 0x07, OP_STX | OP_SPECIAL, OPHANDLER(&CLASS::doBase6502)); + pushopcode("INX", 0xE8, OP_6502| OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("INY", 0xC8, OP_6502| OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("JML", 0x00, OP_65816, OPHANDLER(&CLASS::doJMP)); + pushopcode("JMP", 0x01, OP_6502, OPHANDLER(&CLASS::doJMP)); + pushopcode("JSL", 0x02, OP_65816, OPHANDLER(&CLASS::doJMP)); + pushopcode("JSR", 0x03, OP_6502, OPHANDLER(&CLASS::doJMP)); + pushopcode("LDA", 0x05, OP_STD, OPHANDLER(&CLASS::doBase6502)); + pushopcode("LDX", 0x05, OP_STX, OPHANDLER(&CLASS::doBase6502)); + pushopcode("LDY", 0x05, OP_C0, OPHANDLER(&CLASS::doBase6502)); + pushopcode("LSR", 0x02, OP_ASL, OPHANDLER(&CLASS::doBase6502)); + pushopcode("MVN", 0x00, OP_6502, OPHANDLER(&CLASS::doUNK)); + pushopcode("MVP", 0x00, OP_6502, OPHANDLER(&CLASS::doUNK)); + pushopcode("NOP", 0xEA, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("ORA", 0x00, OP_STD, OPHANDLER(&CLASS::doBase6502)); + pushopcode("PEA", 0xF4, 2, OPHANDLER(&CLASS::doAddress)); + pushopcode("PEI", 0xD4, 1, OPHANDLER(&CLASS::doAddress)); + pushopcode("PER", 0x62, 2, OPHANDLER(&CLASS::doAddress)); + pushopcode("PHA", 0x48, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PHB", 0x8B, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PHD", 0x0B, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PHK", 0x4B, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PHP", 0x08, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PHX", 0xDA, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PHY", 0x5A, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PLA", 0x68, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PLB", 0xAB, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PLD", 0x2B, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PLP", 0x28, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PLX", 0xFA, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("PLY", 0x7A, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("REP", 0xC2, 1, OPHANDLER(&CLASS::doAddress)); + pushopcode("ROL", 0x01, OP_ASL, OPHANDLER(&CLASS::doBase6502)); + pushopcode("ROR", 0x03, OP_ASL, OPHANDLER(&CLASS::doBase6502)); + pushopcode("RTI", 0x40, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("RTL", 0x6B, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("RTS", 0x60, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("SBC", 0x07, OP_STD, OPHANDLER(&CLASS::doBase6502)); + pushopcode("SEC", 0x38, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("SED", 0xF8, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("SEI", 0x78, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("SEP", 0xE2, 1, OPHANDLER(&CLASS::doAddress)); + pushopcode("STP", 0xDB, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("STA", 0x04, OP_STD, OPHANDLER(&CLASS::doBase6502)); + pushopcode("STX", 0x04, OP_STX, OPHANDLER(&CLASS::doBase6502)); + pushopcode("STY", 0x04, OP_C0, OPHANDLER(&CLASS::doBase6502)); + pushopcode("STZ", 0x01, OP_6502, OPHANDLER(&CLASS::doNoPattern)); + pushopcode("TAX", 0xAA, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("TAY", 0xA8, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("TCD", 0x5B, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("TCS", 0x1B, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("TDC", 0x7B, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("TRB", 0x03, OP_6502, OPHANDLER(&CLASS::doNoPattern)); + pushopcode("TSB", 0x02, OP_6502, OPHANDLER(&CLASS::doNoPattern)); + pushopcode("TSC", 0x3B, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("TSX", 0xBA, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("TXA", 0x8A, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("TXS", 0x9A, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("TXY", 0x9B, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("TYA", 0x98, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("TYX", 0xBB, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("WAI", 0xCB, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("WDM", 0x42, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("XBA", 0xEB, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); + pushopcode("XCE", 0xFB, OP_6502 | OP_ONEBYTE, OPHANDLER(&CLASS::doBYTE)); +} + +#undef CLASS + diff --git a/opcodes.h b/opcodes.h new file mode 100644 index 0000000..45dcbb0 --- /dev/null +++ b/opcodes.h @@ -0,0 +1,3 @@ +#pragma once + + diff --git a/qasm b/qasm new file mode 120000 index 0000000..b5bd08a --- /dev/null +++ b/qasm @@ -0,0 +1 @@ +./build/qasm \ No newline at end of file diff --git a/qasm.cpp b/qasm.cpp new file mode 100644 index 0000000..4801934 --- /dev/null +++ b/qasm.cpp @@ -0,0 +1,98 @@ +#include "app.h" +#include "asm.h" + +#define CLASS PAL_APPCLASS + +// return a pointer to the actual Application class +PAL_BASEAPP *PAL::appFactory(void) +{ + return (new CLASS()); +} + +// you MUST supply this array 'appOptions'. NULL line and end. +programOption PAL::appOptions[] = +{ + { "debug", "d", "enable debug info (repeat for more verbosity)", "", false, true}, + { "config-file", "f", "load configuration data from a ", "file", false, false}, + { "", "", "", "", false, false} +}; + + +int CLASS::runServerApp(PAL_EVENTMANAGER *em) +{ + int res = -1; + if (em != NULL) + { + PAL_BASEAPP::runServerApp(em); + PAL_HTTPSERVERTASK *server = new PAL_HTTPSERVERTASK("httptask"); + if (server != NULL) + { + em->startTask(server); + server->initServer(getConfig("http.listen", "0.0.0.0:9080"), false, 64); + res = 0; + } + } + return (res); +} + +int CLASS::runCommandLineApp(void) +{ + TFileProcessor *t = NULL; + std::string line; + uint64_t startticks,n; + + // only called if SERVERAPP not defined + int res = -1; + + //LOG_DEBUG << "command line mode" << endl; + for (ArgVec::const_iterator it = commandargs.begin(); it != commandargs.end(); ++it) + { + Poco::File fn(*it); + + std::string p = fn.path(); + Poco::Path path(p); + //logger().information(path.toString()); + + std::string e = toUpper(path.getExtension()); + + if (e == "S") + { + //logger().information("ASM: " + path.toString()); + + t = new T65816Asm(); + } + if (e == "LNK") + { + //logger().information("LNK: " + path.toString()); + t = new T65816Link(); + } + if (t != NULL) + { + startticks=GetTickCount(); + t->init(); + + std::string f=path.toString(); + t->processfile(f); + t->process(); + t->complete(); + n=GetTickCount(); + printf("Operation time: %lu ms\n",n-startticks); + + delete t; + t = NULL; + } + else + { + printf("not supported type\n"); + } + + + //logger().information(*it); + res = 0; + } + + return (res); +} + + + diff --git a/qasm.h b/qasm.h new file mode 100644 index 0000000..e76710d --- /dev/null +++ b/qasm.h @@ -0,0 +1,19 @@ +#pragma once +#include +#include "pallogger.h" +#include +#include +#include + +#define CLASS PAL_APPCLASS +using namespace PAL_NAMESPACE; + +class CLASS : public PAL_BASEAPP +{ +protected: + virtual int runCommandLineApp(void); + virtual int runServerApp(PAL_EVENTMANAGER *em); +public: +}; + +#undef CLASS diff --git a/qasm.ini b/qasm.ini new file mode 100644 index 0000000..787dcca --- /dev/null +++ b/qasm.ini @@ -0,0 +1,22 @@ +[log] +loglevel=0; +logdir=/var/log/mylog +logfile=mylog.log + +[application] +timezone=America/Los_Angeles + +[qasm] +path1= +path2= +path3= +path4= +path5= + +[asm] +casesen=0 + + + + + diff --git a/src/asm/asm.1.s b/src/asm/asm.1.s new file mode 100644 index 0000000..5d01fb5 --- /dev/null +++ b/src/asm/asm.1.s @@ -0,0 +1,4006 @@ + ;use ../macs/intcmd.macs.s + ;use ../macs/tool.macs.s + ;use ../macs/qatools.macs.s + +asm php + rep $30 + sty filehandle+2 + stx filehandle + pea 0 + _QAKeyAvail + pla + beq :k + pha + _QAGetChar + pla +:k + stz errorct + stz keyflag + +:getlen pha + pha + psl filehandle + tll $1802 + plx + ply + jcs :incerr + cpx #$00 + bne :dec1 + dey +:dec1 dex + +:nodec stx filelendd + sty filelen+2 + + ldy #$04 + lda [filehandle],y + and #$7fff ; + sta [filehandle],y + + jsr getmemory + jcs :incerr + + jsr initasm + + lda #linebuff+1 + sta lineptr + lda #^linebuff + sta lineptr+2 + +:dopass rep $30 + ldy #$04 + lda [filehandle],y + ora #$8000 + sta [filehandle],y + + ldy #$02 + lda [filehandle] + sta fileptr + lda [filehandle],y + sta fileptr+$2 + lda filelen + sta flen + lda filelen+$2 + sta flen+$2 + + lda flen + ora flen+$2 + bne :init + jmp :alldone ;if file is 0 bytes + +:init jsr initpass + +:lineloop + rep $30 + pea 0 + _QAKeyAvail + pla + beq :nokey + jsr dokeypress + +:nokey sep $20 + lda passnum + beq :l2 + + lda objfull + beq :l1 + lda #objectfull + jmp :perr1 +:l1 lda reloffset+2 + beq :l2 + lda #relflag + bit modeflag + beq :l2 + lda #relfilefull + jmp :perr1 +:l2 lda prodoserr + beq :l3 + lda #doserror + jmp :perr1 + +:l3 lda #$01 + trb macflag + + lda putuse + beq :doline + tsb modeflag + stz putuse + rep $20 + stz linenum + sep $20 + +:doline lda doneflag + beq :line + jmp :donepass + +:line rep $30 + stz opcode + stz linebuff + stz labstr + stz linelabtxt + stz comment + stz linehaslab + + lda #$2020 + sta opcode+1 + sta opcode+3 + sta opcode+5 + + lda #$ffff + sta linelable + +:test sep $30 + lda macflag + bpl :sep ;mac working? + bit #%00100000 + bne :int + bit #%01000000 + beq :sep +:ext jsr expandmac + jcs :perr1 ;there was an error expanding + jmp :macentry +:int jsr expandint + jcs :perr1 + jmp :macentry + +:sep rep $30 + lda lastlen + clc + adc fileptr + sta fileptr + bcc :i1 + inc fileptr+2 +:i1 lda flen + sec + sbc lastlen + sta flen + bcs :test0 +:dec dec flen+2 + bpl :readline +:setflag lda #$ffff + sta doneflag + jmp :done +:test0 bne :readline + lda flen+2 + beq :setflag +:readline + rep $30 ;increment the line counter + inc linenum +;do tests here..... + + rep $30 + lda fileptr + sta printptr + lda fileptr+2 + sta printptr+2 + + sep $30 + ldy #$00 + + lda [fileptr] + tax + lda inputtbl,x + cmp #' ' + blt :sjmp ;to savlen => + beq :getopcode + cmp #'*' + beq :c + cmp #';' + beq :c + jmp :glabel +:c jmp :comment + +:glabel sta labstr+1 + sta linehaslab + ldx #$01 +:gliny iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' '+1 + blt :glabdone +:cpx cpx #$0f + bge :gliny + sta labstr+1,x + inx + jmp :gliny + +:sjmp jmp :savlen +:cjmp jmp :comment + +:glabdone cpx #$10 + blt :gl2 + ldx #$0f +:gl2 stx labstr + cmp #' ' + blt :sjmp + +:getopcode +:giny iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + blt :sjmp + beq :giny + cmp #';' + beq :cjmp + + sta opcode+1 + + ldx #$01 +:goiny iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' '+1 + blt :godone + cpx #31 + bge :goiny + sta opcode+1,x + inx + jmp :goiny + +:godone cpx #32 + blt :go2 + ldx #31 +:go2 stx opcode + cmp #' ' + blt :sjmp + +:getoperand +:giny1 iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + blt :sjmp + beq :giny1 + cmp #';' + beq :comment + + + ldx #$00 + phx + dey +:goiny1 iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' ;read in the rest of the line + blt :gotoper + beq :chklit + cmp #$27 + beq :lit + cmp #$22 + beq :lit + jmp :cpx1 +:chklit xba + lda 1,s + bne :xba + xba + jmp :gotoper +:lit cmp 1,s + beq :litoff + xba + lda 1,s + beq :s + jmp :xba +:s xba + sta 1,s + jmp :cpx1 +:litoff xba + lda #$00 + sta 1,s +:xba xba +:cpx1 cpx #128 + bge :goiny1 + sta linebuff+1,x + inx + jmp :goiny1 + +:gotoper cpx #128 + blt :go3 + ldx #128 +:go3 stx linebuff + xba + pla + xba + cmp #' ' + blt :savlen ;should always be taken... + bne :comment + +:comment ldx passnum ;only read the comment on pass 2 + bne :cp1 +:cp0 iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + bge :cp0 + jmp :savlen + bra :cp0 +:cp1 ldx #$00 +:cf1 lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' + blt :savcom + bne :c2 + iny + bra :cf1 +:c2 lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' + blt :savcom + iny + cpx #128 + bge :c2 + sta comment+1,x + inx + bra :c2 +:savcom stx comment + +:savlen iny + sty lastlen + ldx linebuff + lda #$0d + sta linebuff+1,x + inc linebuff + +:macentry sep $30 + lda labstr ;was there a lable or + ora opcode ;an opcode? + bne :process + jsr initline + clc + jmp :printline ;nothing to process so just + ;list the line if necessary + +:process + jsr initline + lda passnum + beq :al + lda #controld + bit keyflag + beq :al + trb keyflag + lda listflag + and #$80 + sta oldlstflag + lda listflag + eor #$80 + sta listflag +:al jsr asmline ;go process line + bcc :printline + jmp :perr +:perr1 rep $30 + and #$FF +:perr rep $30 + pha + lda #$0d + jsr drawchar + lda 1,s + jsr asmerror + + lda passnum + beq :perrpla + + lda listflag + pha + ora #$8080 + and #%00011101_00011101!$FFFF + sta listflag + jsr printline + pla + and #$7fff ;clear line list flag + sta listflag + lda #$0d + jsr drawchar +:perrpla pla + and #$80 + beq :printline + jmp :alldone + +:printline + sep $20 + do 1 + lda passnum + beq :nopr + lda listflag+1 + bpl :nopr + bit #lstdoon + beq :printmac + lda dolevel + ora dolevel+1 + bne :nopr + else + ldal $e0c061 + bpl :nopr + jmp :print + fin +:printmac lda macflag + bit #%01100000 + beq :print ;no macros expanding + lda modeflag+1 + bit #expflag + bne :print + lda macflag + bit #%00000001 + beq :nopr +:print jsr printline +:nopr jmp :lineloop + +:done sep $30 + lda modeflag + and #putflag.useflag + beq :donepass + jsr putuseend + lda doneflag + bne :donepass + jmp :lineloop + +:donepass rep $30 + lda #cancelflag + bit keyflag + bne :pn + + lda macflag + and #$80 ;is a macro still in progress? + beq :pn + lda #$0d + jsr drawchar + lda #badmacro + jsr asmerror + lda #$00 + jmp :asmerrout + +:pn lda passnum + bne :alldone + lda #$FFFF + sta passnum + + jmp :dopass ;go do next pass + +:alldone sep $30 + stz prodoserr + stz prodoserr+1 + jsr closedsk + bcc :nderr + rep $30 + pha + _QAIncTotalErrs + pla + jsr dskerror +:nderr rep $30 + pea 0 + _QAGetTotalErrs + pla + sta errorct + sep $30 + lda #cancelflag + and keyflag + ora errorct + ora errorct+1 + bne :ad0 + bit listflag + bpl :ad0 + lda #symflag + bit modeflag1 + beq :ad0 +:symbols jsr drawlables +:ad0 rep $30 + lda #$00 +:incerr +:asmerrout rep $30 + sta :errcode + jsr showendstr + jsr disposemem + lda #cancelflag + and keyflag + tay + + lda :errcode + plp + cmpl :one + rtl +:one dw $01 +:errcode ds 2 +:symstr str 0d,'Print Symbol Table?',06 + + + + +showendstr php + rep $30 + lda #cancelflag + bit keyflag + jne :cr + psl #:str1 + _QADrawString + + psl totbytes + pea 0 + pea 0 + _QADrawDec + + psl #:str2 + _QADrawString + pea 0 + lda errorct + pha + pea 0 + pea 0 + _QADrawDec + + psl #:str3 + _QADrawString + + pea 0 + lda totallines + pha + pea 0 + pea 0 + _QADrawDec + + psl #:str4 + _QADrawString + + pea 0 + lda globalct + pha + pea 0 + pea 0 + _QADrawDec + + psl #:str5 + _QADrawString + jsr calctime + +:plp plp + rts +:cr lda #$0d + jsr drawchar + jmp :plp + +:str1 str 0d,'End of QuickASM assembly. ' +:str2 str ' bytes, ' +:str3 str ' errors, ' +:str4 str ' lines, ' +:str5 str ' symbols.',0d,0d + + +calctime php + rep $30 + pha + pha + pha + _QAEndTiming + pla + sta :hours + pla + sta :minutes + pla + sta :seconds + stz :flag + + psl #:str1 + _QADrawString + lda :hours + beq :mins + pea 0 + pha + pha + pea 0 + pea 0 + _QADrawDec + psl #:str2 + _QADrawString + + lda :hours + jsr :plural + inc :flag + +:mins lda :minutes + beq :secs + lda :flag + beq :m1 + jsr :spc +:m1 pea 0 + lda :minutes + pha + pea 0 + pea 0 + _QADrawDec + psl #:str3 + _QADrawString + lda :minutes + jsr :plural + inc :flag +:secs lda :flag + beq :s0 + lda :seconds + beq :end + jsr :spc + jmp :s1 +:s0 lda :seconds + bne :s1 + lda #'<' + jsr drawchar + lda #$20 + jsr drawchar + inc :seconds +:s1 pea 0 + lda :seconds + pha + pea 0 + pea 0 + _QADrawDec + psl #:str4 + _QADrawString + lda :seconds + jsr :plural +:end lda #'.' + jsr drawchar + lda #$0d + jsr drawchar + jsr drawchar + plp + rts +:plural php + rep $30 + cmp #$01 + beq :c + lda #'s' + jsr drawchar +:c plp + rts +:spc php + rep $30 + lda #',' + jsr drawchar + lda #' ' + jsr drawchar + plp + rts + +:flag ds 2 +:hours ds 2 +:minutes ds 2 +:seconds ds 2 +:str1 str 'Elapsed time = ' +:str2 str ' hour' +:str3 str ' minute' +:str4 str ' second' + + +numbytes = 8 + +printline php + sep $30 + stz :objoutflag + stz :objoutflag+1 + + lda listflag+1 + bit #%00000100 + jne :equate + + lda #dumflag + bit modeflag + jne :noobjcode + + lda #%00000001 + bit macflag + bne :objptr + bit listflag+1 + jeq :noobjcode + +:objptr lda listflag+1 + bit #%00100000 + bne :tradr + lda lineobjptr+2 + jsr prbyte +:tradr rep $30 + lda lineobjptr + jsr prbytel + sep $30 + lda #':' + jsr drawchar + lda #' ' + jsr drawchar + +:noobjptr + rep $10 + + ldy #$00 + ldx bytesout + beq :noobjcode + stx :objoutflag + bmi :group1 + cpx #$05 + blt :objloop + ldx #$04 +:objloop lda bytesout+2,y + jsr prbyte + cpx #$01 + beq :plx0 + lda #' ' + jsr drawchar +:plx0 iny + dex + bne :objloop + rep $20 + lda bytesout + sec + sbc #$04 + bcs :s1 + lda #$00 +:s1 sta bytesout + jmp :noobjcode + +:group1 rep $30 + txa + and #$7fff + tax + sep $20 + cpx #$05 + blt :objloop1 + ldx #$04 +:objloop1 lda bytesout+2 + phx + jsr prbyte + lda 1,s + cmp #$01 + beq :plx1 + lda #' ' + jsr drawchar +:plx1 plx + dex + bne :objloop1 + rep $30 + lda bytesout + and #$7fff + sec + sbc #$04 + beq :z + bcs :or +:z stz bytesout + jmp :noobjcode +:or ora #$8000 + sta bytesout + jmp :noobjcode + + +:noobjcode sep $30 + lda listflag+1 + bit #branchlst + bne :branch + jmp :line + +:branch +* rep $30 +* pea #14 +* _QATabToCol + sep $30 + lda #'=' + jsr drawchar + lda bytesout+3 + bpl :bpos + rep $30 + ora #$FF00 + jmp :bpha +:bpos rep $30 + and #$ff +:bpha pha + lda lineobjptr + clc + adc #$02 + clc + adc 1,s + plx + jsr prbytel + jmp :line + +:equate rep $30 + pea #12 + _QATabToCol + sep $30 + lda #'=' + jsr drawchar + lda equateval+2 + beq :eq1 + jsr prbyte +:eq1 lda equateval+1 + beq :eq2 + jsr prbyte +:eq2 lda equateval + jsr prbyte + +:line rep $30 + pea #20 ;pos of line number + _QATabToCol + sep $30 + lda modeflag + bit #putflag.useflag + bne :file + lda #' ' + jsr drawchar + jmp :l1 +:file lda #'>' + jsr drawchar +:l1 rep $30 + pea 0 + lda linenum + pha + pea 0 + pea 0 + _QADrawDec + lda #' ' + jsr drawchar +* rep $30 +* lda tabs +* and #$ff +* pha +* _QATabToCol +:sp2 sep $30 + lda [printptr] + and #$7f + cmp #' ' + jlt :xit + beq :opcode + cmp #';' + beq :comment + cmp #'*' + jeq :comment1 + ldy #$00 +]lup lda [printptr],y + and #$7f + cmp #' '+1 + blt :opcode + jsr drawchar + iny + jmp ]lup +:opcode rep $30 + lda tabs+1 + and #$ff + pha + _QATabToCol + psl #opcode + tll $1c0c + lda tabs+2 + and #$ff + pha + _QATabToCol + sep $20 + lda linebuff + beq :comment + dec linebuff + rep $20 + psl #linebuff + tll $1c0c +:comment rep $30 + lda tabs+3 + and #$ff + pha + _QATabToCol +:comment1 rep $30 + psl #comment + tll $1c0c +:xit rep $30 + jsr printcycles + lda #$0d + jsr drawchar + jsr checkpause + +:trunc rep $30 + lda passnum + jeq :plp + lda :objoutflag + jeq :plp + lda bytesout + jeq :plp + lda listflag+1 + bit #%00000010 + jne :plp + bit #%00000001 + jeq :plp + lda #$ffff + sta :crout + lda lineobjptr + clc + adc #$04 + sta lineobjptr + bcc :t0 + inc lineobjptr+2 +:t0 lda bytesout + jmi :group2 + lda #$06 + sta :pos + jmp :t2 +:t1 rep $30 + lda lineobjptr + clc + adc #numbytes + sta lineobjptr + bcc :t2 + inc lineobjptr+2 +:t2 lda bytesout + jeq :tcrout + sep $30 + lda listflag+1 + bit #%00100000 + bne :tradr1 + lda lineobjptr+2 + jsr prbyte +:tradr1 rep $30 + lda lineobjptr + jsr prbytel + sep $30 + lda #':' + jsr drawchar + lda #' ' + jsr drawchar + ldx #$00 +:tlup lda bytesout + jeq :tcrout + cpx #numbytes + bge :tcr + ldy :pos + lda bytesout,y + jsr prbyte + lda #$20 + jsr drawchar + inx + inc :pos + dec bytesout + stz :crout + jmp :tlup +:tcr lda #$0d + jsr drawchar + lda #$ffff + sta :crout + jsr checkpause + jmp :t1 +:tcrout lda :crout + bne :tc + lda #$0d + jsr drawchar + jsr checkpause +:tc jmp :plp + +:group2 rep $30 + lda bytesout + and #$7fff + sta bytesout + lda #$ffff + sta :crout + jmp :t21 +:t11 rep $30 + lda lineobjptr + clc + adc #numbytes + sta lineobjptr + bcc :t21 + inc lineobjptr+2 +:t21 lda bytesout + beq :tcr12 + sep $30 + lda listflag+1 + bit #%00100000 + bne :tradr11 + lda lineobjptr+2 + jsr prbyte +:tradr11 rep $30 + lda lineobjptr + jsr prbytel + sep $30 + lda #':' + jsr drawchar + lda #' ' + jsr drawchar +:tlup1 rep $30 + ldx #$00 +:tlup12 lda bytesout + beq :tcr12 + cpx #numbytes + bge :tcr1 + lda bytesout+2 + phx + jsr prbyte + lda #$20 + jsr drawchar + stz :crout + plx + inx + dec bytesout + jmp :tlup12 +:tcr1 lda #$0d + jsr drawchar + lda #$ffff + sta :crout + jmp :t11 +:tcr12 bit :crout + bmi :plp + lda #$0d + jsr drawchar +:plp plp + rts +:pos ds 2 +:crout ds 2 +:objoutflag ds 2 + + +printcycles php + sep $30 + lda #cycflag + bit modeflag+1 + bne :show +:xit plp + rts +:show lda linecycles + beq :xit + rep $30 + pea #71 ;column for cycle count + _QATabToCol + sep $30 + lda #$20 + jsr drawchar + lda linecycles + and #$0f + ora #$30 + jsr drawchar + lda #' ' + ldy cyclemarks + beq :d1 + cpy #$02 + bge :2 + lda #$27 + jmp :d1 +:2 lda #$22 +:d1 jsr drawchar + lda #',' + jsr drawchar + + bit cycflags + bmi :mx + rep $30 + lda cycles + jsr prbytel + jmp :xit + + mx %11 +:mx bit mxflag + bmi :m1 + bvc :m0x0 + lda #$01 + jsr prbyte + jmp :xit +:m0x0 lda #$00 + jsr prbyte + jmp :xit +:m1 bvc :m1x0 + lda #$11 + jsr prbyte + jmp :xit +:m1x0 lda #$10 + jsr prbyte + jmp :xit + + +dokeypress php + rep $30 + pea 0 + _QAKeyAvail + pla + beq :clc + pha + _QAGetChar + pla + sep $20 + and #$7f + xba + sta keymod + xba + cmp #$20 + bne :nopause +:pause lda #pauseflag + tsb keyflag + sep $20 + jmp :sec +:nopause cmp #$1b + beq :cancel + cmp #'C'&$9f + bne :list +:cancel lda #$ff + sta doneflag + sta doneflag+1 + sta passnum + sta passnum+1 + lda #putflag.useflag + trb modeflag + lda #cancelflag + tsb keyflag + + rep $30 + phx + pea $FFFF + _QASetCancelFlag + plx + sep $30 + jmp :sec + +:list cmp #'D'&$9f + bne :sec + lda #controld + tsb keyflag +* sta keyflag + jmp :sec +:clc plp + clc + rts +:sec plp + sec + rts + +keymod ds 2 + +checkpause php + rep $30 + lda #pauseflag + bit keyflag + beq :perrpla + trb keyflag + lda #cancelflag + bit keyflag + bne :perrpla +:kl1 jsr dokeypress + bcc :kl1 +:perrpla plp + rts + + + +getmemory + php + rep $30 + stz :purgeflag + stz lableptr + stz lableptr+$2 + stz lableptr1 + stz lableptr1+$2 + stz nextlableptr + stz nextlableptr+2 + stz objhdl + stz objhdl+$2 + stz objzpptr + stz objzpptr+$2 + stz relptr + stz relptr+$2 + stz macptr + stz macptr+2 + lda #initobjsize + sta objsize + + + pea 0 + _QALinkerActive + pla + jeq :normal + + psl #$00 + psl #$00 + pea 0 + psl #$00 + _QAGetSymTable + pll nextlableptr + pla + sta lablect + pll linksymhdl + pll linksymtbl + + lda linksymhdl + ora linksymhdl+2 + jeq :normal + lda linksymtbl + ora linksymtbl+2 + jeq :normal + + ldy #$00 +]lup lda [linksymtbl],y + sta atable,y + iny + iny + cpy #128*2 + blt ]lup + + lda linksymhdl + sta workspace + lda linksymhdl+2 + sta workspace+2 + ldy #$02 + lda [workspace] + tax + lda [workspace],y + sta lableptr1+2 + stx lableptr1 + jmp :all + +:normal rep $30 + lda #$ffff + sta lablect ;so memory is allocated + jsr inclablect + bcc :symok + plp + sec + rts + +:symok rep $30 + ldx #$00 + lda #$FFFF +]lup sta atable,x + inx + inx + cpx #128*2 + blt ]lup + +:m1 psl #$00 + psl #maxsymbols*4 + lda userid + ora #asmmemid + pha + pea $8000 ;locked page aligned + psl #$00 + tll $0902 + plx + ply + bcc :m1out + jsr :purge + bcc :m1 + jmp :err +:m1out + stx workspace + sty workspace+2 + ldy #$02 + lda [workspace] + sta lableptr1 + lda [workspace],y + and #$00FF + sta lableptr1+$2 + + rep $30 + lda #$0000 + tay +]lup sta [lableptr1],y + iny + iny + cpy #maxsymbols*4 + blt ]lup + +:all rep $30 +:g1 psl #$00 + psl #initobjsize+1 + lda userid + ora #asmmemid + pha + pea $8000 ;locked page aligned no bank cross + psl #$00 + tll $0902 + plx + ply + bcc :m2out + jsr :purge + bcc :g1 + jmp :err +:m2out + jcs :xit + stx objhdl + stx workspace + sty objhdl+2 + sty workspace+2 + ldy #$02 + lda [workspace] + sta objzpptr + lda [workspace],y + sta objzpptr+$2 + lda #$0000 + ldy #$0000 +]lup sta [objzpptr],y + iny + iny + beq :next + cpy objsize + blt ]lup +:next rep $30 + psl #$00 + psl #macsize + lda userid + ora #asmmemid + pha + pea $8000 + psl #$00 + tll $0902 + plx + ply + bcc :m3out + jsr :purge + bcc :next + jmp :err +:m3out + stx macptr + sty macptr+2 + ldy #02 + lda [macptr] + tax + lda [macptr],y + sta macptr+2 + stx macptr + stz macvarptr + + lda #$00 + +:xit rep $30 +:err + plp + cmp :one + rts +:one dw $01 +:purgeflag ds 2 + +:purge bit :purgeflag + bmi :psec + jmp :psec + sec + ror :purgeflag + pea $00 + tll $1302 ;purgeall + tll $1f02 ;compactmem + clc + rts +:psec sec + rts + +disposemem php + rep $30 + ldal userid + ora #memid + pha + _disposeall + ldal userid + ora #putid + pha + _disposeall + ldal userid + ora #useid + pha + _disposeall + plp + rts + +initasm php + rep $30 + stz rellabct + _QAInitTotalErrs + + psl #$00 + pea #vtoolmacs + _QAGetVector + pll extmacptr + + pea 0 + _QALinkerActive + pla + beq :norm + lda lablect + sta globalct + bra :all +:norm stz globalct +:all stz keyflag + stz passnum + stz extcount + stz entcount + stz totallines + stz maclocal + stz macvarptr + stz prodoserr + stz errorct + stz dskopen + stz dskwrite + stz dskeofparm + stz dskpath + stz dskclose + stz objfull + stz titlestr + lda #$06 + sta objtype + + ldx #$0000 +]lup stz putbuffer,x + stz usebuffer,x + inx + inx + cpx #maxput*16 + blt ]lup + + ldx #$0000 +]lup stz lupbuffer,x + inx + inx + cpx #maxlup*16 + blt ]lup + + _QAStartTiming + + jsr randomize + + plp + rts +:s ds 2 + +initpass php + sep $30 + stz encval + stz putuse + stz macflag + stz checksum + stz crc16 + stz crc16+1 + stz cycflags + + lda #$FF + sta tbxand + lda #%11000000 ;full native mode + sta xcflag + stz mxflag + + rep $30 + + do oldshell + ldx goffset + lda idactive,x + bit #linkflag + beq :nolink + else + jmp :nolink + fin + + do oldshell + lda linklstflag,x + sep $30 + and #%10000000 + ora #%01000000 + jmp :linkent + fin + +:nolink sep $30 + lda #%11000000 +:linkent sta listflag ;both list and lstdo ON + lda #controld + and keyflag + eor listflag + sta listflag + lda #controld + trb keyflag + + rep $30 + lda passnum + beq :p1mode + lda #dskflag!$FFFF + trb modeflag + jmp :p2mode +:p1mode stz modeflag +:p2mode lda #expflag*256.caseflag + tsb modeflag + stz modeflag1 + + stz doneflag + stz dolevel + stz maclevel + stz putlevel + stz uselevel + stz linenum + stz domask + + stz cycles + stz linecycles + stz cyclemarks + stz cycleavg + + + lda #$ffff + sta globlab + sta oldglob + + stz dumor ;force to absolute + + lda #$8000 + sta orgor + sta objptr + sta orgval + sta oldobj + stz objptr+2 + stz orgval+2 + stz oldobj+2 + stz objct + stz objoffset + stz objoffset+2 + stz oldoffset + stz oldoffset+2 + stz reloffset + stz reloffset+2 + stz totbytes + stz totbytes+2 + stz doneflag + stz lastlen + stz dsfill + stz dsoffset + stz errvalid + stz erraddress + stz erraddress+2 + stz luplevel + plp + rts + +initline php + lda passnum + bne :pass2 +:pass1 rep $30 + lda #$FFFF + sep $30 + + rep $30 + +:jmp jmp :all +:pass2 sep $30 + lda listflag + sta listflag+1 + rep $30 + stz bytesout + + stz relout + lda reloffset + sta linerel + inc totallines + stz linecycles + stz cyclemarks + +:all rep $30 + lda #$FFFF + sep $30 + stz clrglob + stz forcelong + sta notfound + rep $30 + stz opflags + stz merrcode + sta fllast + sta lableused + lda objptr + sta lineobjptr + lda objptr+2 + sta lineobjptr+2 + +:xit plp + rts + +inclablect php + rep $30 + inc lablect + lda lablect + and #%11111111 + bne :normal + psl #$00 + psl #$2000 + lda userid + ora #asmmemid + pha + pea $8004 ;page aligned/locked + psl #$00 + tll $0902 + plx + ply + jcs :sec + sei + pei 0 + pei 2 + stx 0 + sty 2 + ldy #$02 + lda [0] + sta nextlableptr + lda [0],y + sta nextlableptr+2 + pla + sta 2 + pla + sta 0 + jmp :rts +:normal lda nextlableptr + clc + adc #32 + sta nextlableptr + bcc :rts + inc nextlableptr+2 +:rts plp + clc + rts +:sec lda #symfull + plp + sec + rts + + +asmline + php + sep $30 + lda macflag + bpl :asmline + and #$7e + bne :asmline + jsr definemacro + bcs :s + plp + clc + rts +:s plp + sec + rts + +:asmline lda modeflag + bit #lupflag + beq :lb + jsr checklup ;setup LUP lable +:lb lda labstr + ora opcode + bne :asm + lda #noerror + jmp :clc + +:asm lda labstr ;was a lable defined? + beq :opcode +:dolable + ldy passnum + beq :passone + lda labstr+1 ;get the first char + cmp #':' + bne :passone ;local lable? + ldy dolevel + bne :opcode + ldy dolevel+1 + bne :opcode + bit globlab+1 ;any global labels defined? + bpl :opcode + lda #undeflable + jmp :clc + +:passone jsr definelable + bcc :opcode + tay + lda modeflag + and #doflag + bne :opcode + cpy #duplable + beq :mis + cpy #misalignment + beq :mis + lda macflag + and #%11000000 + cmp #%11000000 + bne :bit + jmp :mis +:mis lda opcode + beq :bit + sty merrcode + jsr getopcode + sep $30 + ldy merrcode + jmp :bit +:opcode ldy opcode + beq :bit + jsr getopcode + sep $30 + bcs :clc +:noop lda #$00 +:clc tay +:bit bit clrglob + bpl :xit + bvc :xit + lda oldglob + sta globlab + lda oldglob+1 + sta globlab+1 +:xit rep $30 + tya + and #$ff + plp + cmp :one + rts +:one dw $0001 + + +getopcode ;ALWAYS returns in 16 bit mode + sep $30 + stz forcelong + + lda opcode + bne :1 + rep $30 + clc + rts + +:1 rep $30 + lda opcode+$1 + xba + sep $30 + asl + asl + asl + rep $20 + asl + asl + asl + sta workspace + lda opcode+$4 + and #$5F5F + beq :clc + cmp #$4C + beq :last + cmp #$4F44 + beq :last + sep $20 + sec + ror forcelong + rep $20 +:clc clc +:last lda opcode+$3 + and #$1F + rol + ora workspace + + rep $30 + tay ;now get the table offset + lda opcode+1 + and #$1f + asl + tax + tya + jsr (opcodelookup,x) + bcc :op + sta opcodeword + jmp :macs + +:op sta opcodeword + sty opdata + sty :jmp+1 + stx opflags + + bit forcelong-1 + bpl :normop + jsr domac1 + bcs :mfound + +:normop sep $30 + bit xcflag + bvs :opf ;65816 mode? + bmi :65c02 + bit opflags+1 + bmi :badop + bvc :opf + jmp :badop +:65c02 bit opflags+1 + bvs :badop +:opf lda opflags+1 + + bit #>macro + bne :cond + + bit #>conditional + bne :cond + + xba + lda #doflag + bit modeflag + bne :noerr + xba + + bit #>branch + bne :branch + bit #>onebyte + bne :onebyte + bit #>general + bne :general +:cond rep $30 +:jmp jmp $FFFF +:onebyte rep $30 + lda opdata + jmp putopcode +:general rep $30 + jmp generalop +:branch rep $30 + lda opdata + jmp dobranch + +:noerr rep $30 + clc + rts +:badop rep $30 + lda #badopcode + sec + rts +:mfound rep $30 + lda #$FFFF + jmp :m1 +:macs rep $30 + lda #$0000 ;we need to search +:m1 jsr domacros + rts + + +domacros php ;enter with $00 in A to search + sep $30 ;otherwise lableptr must point + tay + lda #doflag ;to the macro to be expanded + bit modeflag + beq :ok + plp + clc + rts +:ok tya + cmp #$00 + bne :nofind + ldx opcode + cpx #$10 + blt :move + ldx #$0f +:move lda opcode,x + sta labstr,x + dex + bpl :move + lda macflag + sta :mflag + stz macflag + jsr findlable + ldy :mflag + sty macflag + bcc :builtin ;not found so try built in macs + bcc :bad + rep $20 + ldy #26 + lda [lableptr],y + and #$8004 + cmp #$8004 + bne :sec +:nofind +:setup sep $30 + lda macflag + sta :mflag + lda #$c1 ;expand and init + tsb macflag + ldy #$00 + sty macvarpos + sty macvarpos+1 + jsr initmac + bcc :clc + ldy :mflag + sty macflag + plp + sec + rts +:clc rep $30 + plp + clc + rts +:bad rep $30 + lda #badopcode + plp + sec ;return clear if handled opcode + rts +:sec rep $30 + lda #notmacro + plp + sec ;return clear if handled opcode + rts +:mflag ds 2 + +:builtin sep $30 + lda #tbxflag + bit modeflag+1 + bne :bok +:bd jmp :bad +:bd1 jmp :bok1 +:bok lda opcode + cmp #$02 + blt :bd + lda opcode+1 + cmp #'_' + bne :bd1 + lda opcode+2 + and #$5f + cmp #'A' + blt :bd1 + cmp #'Z'+1 + bge :bd1 + cmp #'P' + beq :dos16 + cmp #'G' + bne :nodos + ldy opcode + cpy #7 + blt :nodos + ldy #$03 +]l lda opcode,y + cmp #':' + beq :cmp1 + and #$5f +:cmp1 cmp :gsosstr,y + bne :nodos1 + iny + cpy #$07 + blt ]l + jmp :gsos +:dos16 ldy opcode + cpy #6 + blt :nodos + ldy #$03 +]l lda opcode,y + cmp :dos16str,y + bne :nodos1 + iny + cpy #$06 + blt ]l + jmp :dos161 +:nodos1 lda opcode+2 + and #$5f +:nodos rep $30 + and #$ff + sec + sbc #'A' + asl + asl + tay + + lda extmacptr + ora extmacptr+2 + beq :bd1 + lda extmacptr + sta workspace + lda extmacptr+2 + sta workspace+2 + phy + ldy #$04 + lda [workspace],y + ora #$8000 + sta [workspace],y + ldy #$02 + lda [workspace] + sta workspace+4 + lda [workspace],y + sta workspace+6 + ply + lda [workspace+4],y + tax + iny + iny + lda [workspace+4],y + tay + txa + clc + adc workspace+4 + sta workspace+4 + tya + adc workspace+6 + sta workspace+6 + +:main sep $30 + lda [workspace+4] + beq :nf1 + sta :length + stz :length+1 + + ldy #$01 + lda [workspace+4],y + cmp opcode + bne :next + ldy #$04 ;now we're at the first char to CMP + ldx #$02 +:find lda [workspace+4],y + and #$7f + cmp opcode-1,y + beq :inx + and #$5f ;set to uppercase + cmp opcode-1,y + beq :inx + ora #$20 + cmp opcode-1,y + bne :next +:inx iny + inx + cpx opcode + blt :find + jmp :found + +:next rep $30 + lda :length + clc + adc workspace+4 + sta workspace+4 + bcc :main + inc workspace+6 + jmp :main + +:nf1 rep $30 + ldy #$04 + lda [workspace],y + and #$7FFF + sta [workspace],y + jmp :bad1 + +:found rep $30 + ldy #$01 + lda [workspace+4],y + and #$ff + inc + inc ;to account for the two len bytes + tay + lda [workspace+4],y + + pha + ldy #$04 + lda [workspace],y + and #$7FFF + sta [workspace],y + +:num lda #$2406 ;length and '$' + sta linebuff + sep $30 + ldy #$02 + lda 2,s + lsr + lsr + lsr + lsr + ora #'0' + cmp #'9'+1 + blt :ok1 + adc #'A'-'9'-2 +:ok1 sta linebuff,y + iny + lda 2,s + and #$0f + ora #'0' + cmp #'9'+1 + blt :ok2 + adc #'A'-'9'-2 +:ok2 sta linebuff,y + iny + lda 1,s + lsr + lsr + lsr + lsr + ora #'0' + cmp #'9'+1 + blt :ok3 + adc #'A'-'9'-2 +:ok3 sta linebuff,y + iny + lda 1,s + and #$0f + ora #'0' + cmp #'9'+1 + blt :ok4 + adc #'A'-'9'-2 +:ok4 sta linebuff,y + lda #$0d + sta linebuff+6 + rep $30 + pla ;remove from stack + + lda #tlltxt1 + ldx #^tlltxt1 + jsr initinternal + stz linebuff + bcc :bcc + jmp :bsec + +:bok1 rep $30 + lda opcodeword + jsr mactbl + bcs :bad1 + txa + tyx + jsr initinternal + bcc :bcc +:bsec plp + sec + rts +:bcc plp + clc + rts +:bad1 rep $30 + lda #badopcode + plp + sec ;return clear if handled opcode + rts + +:dos161 rep $30 + lda #'Z'+1-'A' + jmp :asl +:gsos rep $30 + lda #'Z'+2-'A' +:asl asl + asl + tay + rep $30 + lda extmacptr + ora extmacptr+2 + jeq :bd1 + lda extmacptr + sta workspace + lda extmacptr+2 + sta workspace+2 + phy + ldy #$04 + lda [workspace],y + ora #$8000 + sta [workspace],y + ldy #$02 + lda [workspace] + sta workspace+4 + lda [workspace],y + sta workspace+6 + ply + lda [workspace+4],y + tax + iny + iny + lda [workspace+4],y + tay + txa + clc + adc workspace+4 + sta workspace+4 + tya + adc workspace+6 + sta workspace+6 + +:main1 rep $30 + lda [workspace+4] + and #$ff + beq :nf2 + sta :length + + sep $30 + ldy #$01 + lda [workspace+4],y + cmp opcode + bne :next1 + iny ;get to the "_" + iny ;first letter must already match + iny ;now we're at the first char to CMP + ldx #$02 +:find1 lda [workspace+4],y + and #$7f + cmp opcode-1,y + beq :inx1 + and #$5f ;set to uppercase + cmp opcode-1,y + bne :next1 +:inx1 iny + inx + cpx opcode + blt :find1 + jmp :found1 + +:next1 rep $30 + lda :length + clc + adc workspace+4 + sta workspace+4 + bcc :main1 + inc workspace+6 + jmp :main1 + +:nf2 rep $30 + ldy #$04 + lda [workspace],y + and #$7FFF + sta [workspace],y + jmp :bad1 + +:found1 rep $30 + lda opcode + and #$ff + inc + inc ;to account for the two len bytes + tay + lda [workspace+4],y + + pha + ldy #$04 + lda [workspace],y + and #$7FFF + sta [workspace],y + + sep $30 + ldy #$00 + lda 2,s + lsr + lsr + lsr + lsr + ora #'0' + cmp #'9'+1 + blt :ok11 + adc #'A'-'9'-2 +:ok11 sta dosnum,y + iny + lda 2,s + and #$0f + ora #'0' + cmp #'9'+1 + blt :ok22 + adc #'A'-'9'-2 +:ok22 sta dosnum,y + iny + lda 1,s + lsr + lsr + lsr + lsr + ora #'0' + cmp #'9'+1 + blt :ok33 + adc #'A'-'9'-2 +:ok33 sta dosnum,y + iny + lda 1,s + and #$0f + ora #'0' + cmp #'9'+1 + blt :ok44 + adc #'A'-'9'-2 +:ok44 sta dosnum,y + rep $30 + pla ;remove from stack + + lda #dostxt1 + ldx #^dostxt1 + jsr initinternal + bcc :bcc2 + jmp :bsec +:bcc2 jmp :bcc + + +:length ds 2,0 +:gsosstr str '_GSOS:' +:dos16str str '_P16:' +:high ds 2 +:low ds 2 + +domac1 php + sep $30 + lda #doflag + bit modeflag + beq :ok +:clc plp + clc + rts +:ok sep $30 + ldx opcode + beq :clc + phx + + ldx labstr +]lup lda labstr,x + sta linelabtxt,x + dex + bpl ]lup + + plx +]lup lda opcode,x + sta labstr,x + dex + bpl ]lup + lda macflag + sta :mflag + stz macflag + jsr findlable + ldy :mflag + sty macflag + bcc :restore ;notfound + rep $20 + ldy #26 + lda [lableptr],y + and #$8004 + cmp #$8004 + bne :restore + plp + sec + rts + +:restore sep $30 + ldx linelabtxt +]lup lda linelabtxt,x + sta labstr,x + dex + bpl ]lup + plp + clc + rts +:hash ds 2 +:mflag ds 2 + + mx %00 + +amxindex = %0000_0000_0001 +amyindex = %0000_0000_0010 +amstack = %0000_0000_0100 +amround = %0000_0000_1000 +amsquare = %0000_0001_0000 +amforce8 = %0000_0010_0000 +amforce16 = %0000_0100_0000 +amforce24 = %0000_1000_0000 +amacc = %0001_0000_0000 +amimed = %0010_0000_0000 +ammask = amforce8.amforce16.amforce24!$FFFF + +tbld = 0 +tbldx = amxindex +tbldy = amyindex +tblds = amstack +tbld1 = amround +tbldx1 = amxindex+amround +tbldy1 = amyindex+amround +tbldsy = amstack+amround+amyindex +tbld2 = amsquare +tbldy2 = amyindex+amsquare +tblal = amforce24 +tblalx = amforce24+amxindex +tblacc = amacc +tblimed = amimed + +addmode php + sep $30 + stz myvalue + stz myvalue+1 + bit forcelong + bpl :long + lda #amforce16 + tsb myvalue + jmp :init +:long lda opcodeword + lsr + bcc :init + lda #amforce24 + tsb myvalue +:init ldy #$00 +]flush lda [lineptr],y + cmp #' ' + jlt :zero + beq :iny + cmp #';' + jeq :zero + jmp :first +:iny iny + jmp ]flush + +:first sta firstchar+1 + sty firstchar + cmp #'#' + bne :address +:imed pea #amimed + jmp :xit +:address cmp #'(' + beq :round + cmp #'[' + beq :square + cmp #'<' + beq :force8 + cmp #'|' + beq :force16 + cmp #'!' + beq :force16 + cmp #'>' + beq :force24 + jmp :index +:force8 lda #amforce8 + tsb myvalue + jmp :index +:force16 lda #amforce16 + tsb myvalue + jmp :index +:force24 lda #amforce24 + tsb myvalue + jmp :index +:round lda #amround + tsb myvalue + jmp :index +:square lda #amsquare + tsb myvalue +:index iny + lda [lineptr],y + cmp #' '+1 + blt :modexit + cmp #';' + beq :modexit + cmp #',' + bne :index +:index1 iny + lda [lineptr],y + and #$5f + cmp #'Y' + beq :yindex + cmp #'X' + beq :xindex + cmp #'S' + beq :stack +:badmode lda #badaddress + jmp :errxit +:xindex lda #amxindex + tsb myvalue + lda myvalue + and #amround + beq :modexit + lda myvalue+1 + and #amround + bne :badmode + stz myvalue+1 + iny + lda [lineptr],y + cmp #')' + bne :modexit + lda #amround + tsb myvalue+1 + jmp :modexit +:yindex lda #amyindex + tsb myvalue + dey + dey + lda [lineptr],y + cmp #']' + beq :rsfound + cmp #')' + beq :rrfound + jmp :modexit +:rsfound lda #amsquare + tsb myvalue+1 + jmp :modexit +:rrfound lda #amround + tsb myvalue+1 +:modexit lda myvalue + and #amround.amsquare + beq :allok + and myvalue+1 ;make sure all braces are there + bne :allok + lda myvalue + and #amyindex + bne :badmode1 + dey + lda [lineptr],y + cmp #')' + beq :rr2 + cmp #']' + bne :badmode1 + lda myvalue + and #amsquare + bne :allok + jmp :badmode1 +:rr2 lda myvalue + and #amround + bne :allok +:badmode1 lda #badaddress + jmp :errxit + +:stack lda #amstack + tsb myvalue + lda myvalue + and #amround + beq :modexit + stz myvalue+1 + iny + lda [lineptr],y + cmp #')' + bne :badmode1 + lda #amround + tsb myvalue+1 + iny + lda [lineptr],y + cmp #',' + bne :badmode1 + iny + lda [lineptr],y + and #$5f + cmp #'Y' + bne :badmode1 + lda #amyindex + tsb myvalue + jmp :modexit +:allok rep $30 + lda myvalue + and #$ff + plp + clc + rts +:zero pea #amacc +:xit rep $30 + pla + plp + clc + rts +:errxit rep $30 + and #$ff + plp + sec + rts + +addmodetbl dfb 6*3 + dfb 7*3 + dfb 8*3 + dfb $FF + dfb 19*3 + dfb $FF + dfb $FF + dfb $FF + dfb 9*3 + dfb 10*3 + dfb 11*3 + dfb $FF + dfb $FF + dfb $FF + dfb 20*3 + dfb $FF + dfb 12*3 + dfb $FF + dfb 13*3 + ds 109,$FF + dfb 17*3 + dfb 18*3 + ds 126,$FF + dfb 1*3 + ds 255,$FF + dfb 0*3 + ds 511,$FF + dfb 14*3 + dfb 15*3 + dfb 16*3 + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb 21*3 + dfb 22*3 + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + ds 109,$FF + dfb 17*3 + dfb 18*3 + +lastmode ds 2 + +generalop php + rep $30 + lda #$ff00 + sta :evalflag + jsr addmode + bcc :doit + plp + sec + rts +:doit + sta :mode + sta lastmode + bit #amimed + jne :imediate + bit #amacc + jne :onebyte + + bit #amforce16.amforce24 + bne :nodp + + lda :mode + tax + lda addmodetbl,x + and #$FF + cmp #$FF + jeq :bad + tay + sep $20 + bit xcflag + bpl :get + iny + bvc :get + iny + +:get lda (opdata),y + bne :putdp + lda :mode + and #amforce8 + beq :nodp + jmp :bad + +:putdp sta :opcode + stz :evalflag+1 + ldx #$00 + jsr eval + sta :evalflag + bcc :dpok + ldy passnum + beq :p12 +:err plp + sec + rts +:p12 cmp #undeflable + bne :err + lda :mode + bit #amsquare.amround + beq :nodp + lda #00 + xba + lda #forwardref + jmp :err + +:dpok rep $30 + lda lvalue+2 + bne :notdp + lda lvalue + cmp #$0100 + bge :notdp + lda :opcode + jsr putopcode + lda lvalue + jsr putbyte + plp + jmp relcorrect +:notdp lda :mode + and #amround.amsquare + bne :bad + +:nodp rep $30 + lda :mode + and #amforce8.amforce16!$FFFF + clc + adc #$400 + tax + lda addmodetbl,x + and #$FF + cmp #$FF + beq :bad + tay + sep $20 + bit xcflag + bpl :get1 + iny + bvc :get1 + iny +:get1 lda (opdata),y + beq :bad + ldx passnum + beq :p1 + jsr putopcode + bit :evalflag+1 + bpl :p3 + ldx #$00 + jsr eval + bcc :p2 +:plp plp + sec + rts +:p3 lda :evalflag + beq :p2 + plp + sec + rts +:p1 rep $30 + lda :mode + bit #amforce24 + beq :p11 + lda #$04 + plp + jmp incobjptr +:p11 lda #$03 + plp + jmp incobjptr + + mx %10 +:p2 lda lvalue + jsr putbyte + lda lvalue+1 + jsr putbyte + lda :mode + bit #amforce24 + beq :plp1 + lda lvalue+2 + jsr putbyte +:plp1 plp + jmp relcorrect + +:bad rep $30 + lda #badaddress + plp + sec + rts + + mx %00 +:onebyte sep $20 + ldy #1*3 + bit xcflag + bpl :ob1 + iny + bvc :ob1 + iny +:ob1 lda (opdata),y + beq :bad + jsr putopcode + plp + clc + rts + +:imediate rep $30 + lda :mode + and #amforce8.amforce16!$FFFF + tax + lda addmodetbl,x + and #$FF + cmp #$FF + beq :bad + tay + sep $20 + bit xcflag + bpl :get2 + iny + bvc :get2 + iny +:get2 lda (opdata),y + beq :bad + jsr putopcode + lda passnum + beq :putimed + ldx #$00 + jsr eval + bcc :putimed + plp + sec + rts +:putimed lda lvalue + jsr putbyte + lda opflags + bit #mX.mY + bne :indexreg + bit mxflag + bmi :imedout +:puttwo lda lvalue+1 + jsr putbyte + jmp :imedout +:indexreg bit mxflag + bvc :puttwo +:imedout plp + jmp relcorrect + +:mode ds 2 +:opcode ds 2 +:evalflag ds 2 + +putopcode php + rep $30 + inc linerel + sep $30 + pha + lda #cycflag + bit modeflag+1 + beq :pla + lda 1,s + jsr countcycles +:pla pla + xba + jmp put + +putbyte php + sep $30 + xba + inc relout +put lda passnum + bne :p22 + rep $30 + inc objptr + bne :off1 + inc objptr+2 +:off1 inc objoffset + bne :plp1 + inc objoffset+2 +:plp1 plp + clc + rts + + mx %11 +:p22 lda #dumflag + bit modeflag + bne :pass1 +:pass2 rep $10 + ldy objct + cpy objsize + blt :xba + lda #$ff + sta objfull+1 + sta objfull + lda #dskflag + bit modeflag + beq :nostore + tax + rep $20 + lda dskopen + jsr writedsk + bcc :reset + phx + jsr dskerror + plx +:reset txa + sep $20 + jmp :pass2 +:xba xba + eor encval + sta [objzpptr],y + xba + iny + sty objct +:nostore ldy bytesout + xba + sta bytesout+2,y + iny + sty bytesout + bit orgval+3 + bmi :sep + ldy objptr + sty orgval + ldy objptr+2 + sty orgval+2 + xba + lda #$80 + tsb orgval+3 + xba +:sep sep $30 + tay + eor checksum + sta checksum + lda #crcflag + bit modeflag+1 + beq :i2 + tya + jsr calccrc +:i2 lda #%00000001 + tsb listflag+1 + rep $30 + inc totbytes + bne :rel + inc totbytes+2 +:rel bit modeflag-1 ;rel active? + bpl :pass1 + inc reloffset + bne :pass1 + inc reloffset+2 +:pass1 rep $30 + inc objptr + bne :off + inc objptr+2 +:off inc objoffset + bne :plp + inc objoffset+2 +:plp plp + clc + rts + +calccrc rts + +countcycles php ;must set to 16 bit mode + rep $30 + and #$ff + asl + asl + tax + lda cycletbl,x + and #$ff + clc + adc linecycles + sta linecycles + sep $20 + lda mxflag + asl + rol + rol + and cycletbl+1,x + cmp cycletbl+1,x + beq :1 + sed + lda cycletbl+2,x + clc + adc linecycles + sta linecycles + cld + +:1 lda cycletbl+3,x + lsr + bcc :2 + lda mxflag+1 + and #$40 + beq :inc + + bit cycflags + bvc :noavg + inc cycleavg ;put in avg code here + lda cycleavg + and #$01 + beq :inc + jmp :2 +:noavg inc cyclemarks + jmp :2 +:inc sed + lda linecycles + clc + adc #$01 + sta linecycles + cld +:2 + +:done rep $30 + sed + lda linecycles + clc + adc cycles + sta cycles + cld + plp + rts + +relcorrect php + sep $30 + lda passnum + beq :xit1 + lda modeflag + bit #relflag + beq :xit1 + bit #dumflag + bne :xit1 + bit lableused+1 + bmi :xit1 + bit notfound + bmi :xit1 + + rep $30 + ldy relct + cpy #relsize-16 ;just in case!! + blt :setflags +:err1 jmp :err +:xit1 jmp :xit + +:setflags lda #$0f + sta :flags + stz :external + lda noshift ;get low byte of unshifted value + sta :refnum + lda shiftct + beq :l + cmp #$10 + jeq :ff + ldy relout + cpy #$02 + blt :s8 + jmp :ff +:s8 cmp #$08 + bne :l + lda #%01000000 + tsb :flags +:l lda lableused + cmp #$7fff + beq :noext + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldx #$00 + ldy #26 + lda [lableptr],y + and #$10 + beq :noext + tsb :flags + ldy #22 + lda [lableptr],y + sta :refnum + lda #$8000 + tsb :external + lda shiftct + beq :noext + lda #$ff + sta :flags + lda #$4000 + tsb :external +:noext lda relout + cmp #$03 + blt :twobytes + lda #%00100000 + tsb :flags + jmp :insert +:twobytes cmp #$01 + beq :insert + lda #$80 + tsb :flags +:insert ldy relct + lda :flags + sta [relptr],y + iny + lda linerel + sta [relptr],y + iny + iny + lda :refnum + sta [relptr],y + iny + bit :external + bvc :stz + lda #$d0 + bit :external + bpl :noext1 + ora #%00000100 +:noext1 ldx shiftct + cpx #$10 + beq :ffsta + ldx relout + cpx #$02 + blt :ob1 + ora #%00000001 + jmp :ffsta +:ob1 ldx shiftct + cpx #$08 + bne :ffsta + ora #%00000011 +:ffsta sta [relptr],y + iny + lda noshift + sta [relptr],y + iny + iny + lda noshift+2 + sta [relptr],y + iny +:stz sty relct + jmp :xit +:ff lda #$ff + sta :flags + lda #$4000 + tsb :external + jmp :l +:xit sep $30 + lda #$80 + tsb lableused+1 + tsb notfound + rep $30 + stz relout + lda reloffset + sta linerel + plp + clc + rts +:err sep $30 + lda #$80 + tsb lableused+1 + tsb notfound + rep $30 + stz relout + lda reloffset + sta linerel + lda #relfull + plp + sec + rts +:flags ds 2 +:refnum ds 2 +:external ds 2 + +:show1 phx + pha + phy + php + rep $30 + jsr prbyte + lda #$20 + jsr drawchar + plp + ply + pla + plx + rts +:show1cr phx + pha + phy + php + rep $30 + jsr prbyte + lda #$0d + jsr drawchar + plp + ply + pla + plx + rts +:show2 phx + pha + phy + php + rep $30 + jsr prbytel + lda #$20 + jsr drawchar + plp + ply + pla + plx + rts + + +incobjptr php + rep $30 + pha + clc + adc objptr + sta objptr + bcc :offset + inc objptr+2 +:offset pla + clc + adc objoffset + sta objoffset + bcc :xit + inc objoffset+2 +:xit plp + clc + rts + +xref rts + +xlabnum equ 0 +xdoflag equ xlabnum+2 +xlnum equ xdoflag+2 +xlnum1 equ xlnum+2 +xflag equ xlnum1+2 +xend equ xflag+2 + +xrefrec ds 10,0 + +defineall php + sep $30 + jmp define +definelable + php + sep $30 + lda modeflag + and #doflag + beq define + plp + sec ;tell caller do flag is off + rts +define ldy #$00 + lda labstr+1 + cmp #':' + beq :l + cmp #']' + bne :statype + iny +:l iny +:statype rep $30 + sty labtype + lda passnum + jne :pass1 ;bne :pass1 +:pass0 lda #$ffff + sta fllast + jsr findlable + bcc :p0insert + ldy #26 + lda [lableptr],y + bit #variablebit + bne :p0var + bit #entrybit + bne :p0insert + bit macflag-1 + bvs :p0insert + jmp :dup +:p0var ldy #16 + lda [lableptr],y + sta linelable + ldy #28 + lda [lableptr],y + sta varval + lda objptr + sta [lableptr],y + ldy #30 + lda [lableptr],y + sta varval+2 + lda objptr+2 + sta [lableptr],y + jmp :noerr +:p0insert lda objptr + sta labval + lda objptr+2 + sta labval+2 + jsr insertlable + bcs :err ;error returned in A + ldy #16 + lda [lableptr],y + sta linelable + stz varval + stz varval+2 + jmp :noerr +:err pha + jmp :xit + +:pass1 lda #$ffff + sta fllast + jsr findlable + bcc :undef ;not found on second pass + ldy #16 + lda [lableptr],y + sta linelable + ldy #26 + lda [lableptr],y + bit #variablebit + bne :p1var + bit #$20.$10.$08.$04.$01.linkerbit ;ext,macvar,macro, + beq :checkmis ; locals, or linkerequ's + jmp :noerr +:p1var ldy #28 + lda [lableptr],y + sta varval + lda objptr + sta [lableptr],y + ldy #30 + lda [lableptr],y + sta varval+2 + lda objptr+2 + sta [lableptr],y + jmp :noerr +:checkmis ldy #28 + lda [lableptr],y + cmp objptr + bne :misal + ldy #30 + lda [lableptr],y + cmp objptr+2 + beq :noerr +:misal ldy #28 + lda [lableptr],y ;reset object pointer so we don't + sta objptr ;generate more misalign errors + ldy #30 + lda [lableptr],y + sta objptr+$2 + pea #misalignment + jmp :xit +:undef pea #undeflable + jmp :xit +:dup pea #duplable + jmp :xit +:noerr pea #$00 +:xit rep $30 + bit linelable + bmi :geterr + ldy #26 + lda [lableptr],y + and #%111111.linkerbit ;no macvars,externals,equates,macros,variables, + bne :geterr ;locals or linkerequ's... + lda globlab + sta oldglob + ldy #16 + lda [lableptr],y + sta globlab + lda #$0080 + tsb clrglob +:geterr pla + and #$ff + stz fllast + dec fllast + plp + cmp :one + rts +:one dw $01 + +varval ds 4 + +findlabval +findlable + +]ct equ workspace +]offset equ ]ct+$2 +]pos equ ]offset+$2 +]pos1 equ ]pos+$2 +]len1 equ ]pos1+$2 +]len2 equ ]len1+$2 + +:entry php + sep $30 + bit macflag + bvc :normal + lda labstr + jeq :notfound + lda labstr+1 + and #$7f + cmp #']' + beq :normal + cmp #'@' + beq :normal + jsr macfind + bcc :macentry + plp + sec + rts +:normal lda labstr+1 + cmp #'@' + jeq :builtin +:nobuilt lda modeflag + bit #caseflag + beq :macentry + jsr caselable +:macentry stz labtype + stz labtype+1 + lda lablect + ora lablect+1 + beq :notfound + lda labstr + beq :notfound + sta ]len1 + stz ]len1+1 + lda labstr+$1 + cmp #':' ;local lable? + rep $30 + bne :global + lda globlab + bmi :notfound + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #24 + lda [lableptr],y + bmi :notfound ;none defined + sta ]pos + jmp :gloop +:global and #$ff + asl + tax + lda atable,x + bmi :notfound + sta ]pos +:gloop +]lup lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + stz ]offset + lda [lableptr] + and #$0f + sta ]len2 + sep $20 + ldx #$02 ;start at byte 2 + txy +]lup1 cpx #$10 + bge :movefound + cpx ]len1 + blt :1 + beq :1 + jmp :goleft1 +:nf1 lda ]pos + sta fllast +:notfound plp + clc + rts +:1 cpx ]len2 + blt :2 + beq :2 + jmp :goright +:2 lda labstr,x + cmp [lableptr],y + bne :next + iny + inx + jmp ]lup1 +:next blt :goleft + jmp :goright +:goleft1 lda ]len1 + cmp ]len2 + beq :movefound +:goleft rep $30 + ldy #18 + lda [lableptr],y + bmi :nf1 + sta ]pos + jmp ]lup +:goright rep $30 + ldy #20 + lda [lableptr],y + bmi :nf1 + sta ]pos + jmp ]lup + +:movefound rep $30 + lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + plp + sec + rts +:builtin jmp :nobuilt + +caselable php +:doit sep $30 + ldx labstr + beq :xit +]loop ldy labstr,x + lda converttable,y + sta labstr,x + dex + bne ]loop +:xit plp + rts + + +insertlable + +]ct equ workspace +]offset equ ]ct+$2 +]pos equ ]offset+$2 +]pos1 equ ]pos+$2 +]len1 equ ]pos1+$2 +]len2 equ ]len1+$2 + +:entry php + rep $30 + + stz labtype + lda lablect + cmp #maxsymbols ;max number of lables + blt :ne1 + lda #symfull ;symtable full + jmp :error +:ne1 lda labstr + and #$FF + bne :ne2 + lda #badlable + jmp :error +:ne2 bit macflag-1 + bvc :ne22 + lda labstr+1 + and #$7f + cmp #']' + beq :ne12 + plp + jmp macinsert +:ne12 lda labstr + and #$ff +:ne22 sta ]len1 + bit fllast + bmi :ne222 + jmp :fastinsert +:ne222 + lda labstr+$1 ;first byte of string + and #$7F + cmp #':' ;local lable? + beq :local + jmp :global +:local lda #$01 + sta labtype ;b0=Local Lable + lda globlab + bmi :udf + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #24 + lda [lableptr],y + jpl :start + lda globlab + bra :ne3 +:udf lda #undeflable + jmp :error +:ne3 sta ]pos + sta labprev + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #24 + lda lablect + sta [lableptr],y ;set local ptr for GLable + jmp :save +:global ldx #$00 + stx labtype + cmp #']' + bne :asl01 + ldx #$02 + stx labtype +:asl01 asl + tax + lda atable,x + bpl :start + lda #$FFFF + sta ]pos ;no previous + lda lablect + sta atable,x +:save rep $30 + jsr :saveit + bcc :nosave + plp + sec + rts +:nosave lda #$00 + plp + clc + rts +:start sta ]pos +]lup lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + stz ]offset + sep $20 + lda [lableptr] + sta ]len2 + stz ]len2+1 + ldx #$02 ;start at byte 2 + txy +]lup1 cpx #$10 + jeq :error2 + cpx ]len1 + blt :1 + beq :1 + jmp :goleft1 +:1 cpx ]len2 + blt :2 + beq :2 + jmp :goright +:2 lda [lableptr],y + cmp labstr,x + bne :next + iny + inx + jmp ]lup1 +:next rep $30 + blt :goright + jmp :goleft +:goleft1 rep $30 + lda ]len1 + cmp ]len2 + bne :goleft +:replace ldy #26 ;offset to equ value + lda labtype + sta [lableptr],y + iny + iny + lda labval ;replace equate + sta [lableptr],y + iny + iny + lda labval+$2 + and #$00ff + sta [lableptr],y + jmp :nosave +:goleft rep $30 + ldy #18 ;leftptr + lda [lableptr],y + bpl :p1 + lda lablect + sta [lableptr],y + jmp :save +:p1 sta ]pos + jmp ]lup +:goright rep $30 + ldy #20 ;leftptr + lda [lableptr],y + bpl :p2 + lda lablect + sta [lableptr],y + jmp :save +:p2 sta ]pos + jmp ]lup +:error2 rep $30 + lda #badlable +:error plp + sec + rts +:saveit sta labnum + pha + lda ]pos + sta labprev + lda labtype + ora orgor + sta labtype + lda #dumflag + bit modeflag + beq :si1 + lda labtype + ora dumor ;#$8000 + sta labtype +:si1 lda #$FFFF + sta lableft + sta labright + sta lablocal + lda labval+2 + and #$ff + sta labval+2 + pla + sta ]pos ;for movefound + asl + asl + tay + lda nextlableptr + sta [lableptr1],y + sta lableptr + pha ;for mvn below + iny + iny + lda nextlableptr+2 + sta [lableptr1],y + sta lableptr+2 + sep $20 + sta :mvn+1 + rep $20 + ply ;low of destination + tdc + clc + adc #labstr + tax ;source low word + lda #31 ;MVN + phb +:mvn mvn $000000,$000000 + plb + ldy #26 + lda [lableptr],y + bpl :and + inc rellabct +:and bit #localbit + bne :xref + inc globalct +:xref ldx #$00 + jsr xref + jsr inclablect + rts +:fastinsert lda fllast + sta ]pos + ldx #$00 + lda labstr+1 + and #$7f + cmp #':' + beq :filocal + cmp #']' + bne :figlobal +:fivar inx +:filocal inx +:figlobal stx labtype + lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + + ldy #$00 + sep $20 + lda [lableptr] + sta ]len2 + ldy #$02 + tyx ;start at byte 2 +]lup1 cpx #$10 + jeq :error2 + cpx ]len1 + blt :fi1 + beq :fi1 + jmp :figoleft1 +:fi1 cpx ]len2 + blt :fi2 + beq :fi2 + jmp :figoright +:fi2 lda [lableptr],y + cmp labstr,x + bne :finext + iny + inx + jmp ]lup1 +:finext rep $30 + blt :figoright + jmp :figoleft +:figoleft1 rep $30 + lda ]len1 + cmp ]len2 + bne :figoleft +:fireplace rep $30 + ldy #26 ;offset to equ value + lda labtype + sta [lableptr],y + iny + iny + lda labval ;replace equate + sta [lableptr],y + iny + iny + lda labval+$2 + and #$00ff + sta [lableptr],y + jmp :nosave +:figoright rep $30 + ldy #20 + jmp :figo +:figoleft rep $30 + ldy #18 +:figo lda lablect + sta [lableptr],y + jmp :save + + +printlab phy + phx + pha + php + sep $30 + lda labstr + tay + ldx #$01 +]lup cpy #$00 + beq :xit + lda labstr,x + jsr drawchar + inx + dey + jmp ]lup +:xit plp + pla + plx + ply + rts + +drawlables php + rep $30 + lda #$00 + sta :main + sta :recurslev +:loop lda :main + asl + tax + lda #' ' + sta :treechar + lda atable,x + jmi :next + pha + jsr :showtree +:next inc :main + lda :main + cmp #128 + blt :loop + plp + rts +:main ds 2 + +:recurslev ds 2 +:treechar ds 2 + + mx %00 +:showtree inc :recurslev + lda lableptr+2 + pha + lda lableptr + pha + lda 7,s + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #18 + lda #'R' + sta :char + lda [lableptr],y + bmi :next1 + pha + jsr :showtree + lda #'L' + sta :char +:next1 jsr :print + lda #'R' + sta :char + ldy #20 + lda [lableptr],y + bmi :done + pha + jsr :showtree +:done pla + sta lableptr + pla + sta lableptr+2 + pla + plx + pha + dec :recurslev + rts + +:char ds 2 + +:print ldy #$00 + sty :offset + lda [lableptr],y + and #$0F + sta :len + sta :bytes + bne :p1 + jmp :pxit +:p1 ldal $E0C061 + bmi :p1 + lda :recurslev + phx + phy + jsr prbyte + lda #' ' + jsr drawchar + lda :char + jsr drawchar + lda #' ' + jsr drawchar + lda :treechar + jsr drawchar + lda #' ' + jsr drawchar + ply + plx + ldx #$01 + iny + phx + phy + lda [lableptr],y + and #$7F + lda #' ' + jsr drawchar + lda #' ' + jsr drawchar + lda #' ' + jsr drawchar + lda :bytes + clc + adc #$03 + sta :bytes +:ply ply + plx +]lup lda [lableptr],y + and #$7F + phx + phy + jsr drawchar + ply + plx + iny + inx + cpx :len + blt ]lup + beq ]lup + lda #$14 + sec + sbc :bytes + tax +]lup lda #' ' + phx + jsr drawchar + plx + dex + bpl ]lup + lda #'$' + jsr drawchar + ldy #28+2 + ldx #$03 +]lup lda [lableptr],y + and #$FF + phx + phy + jsr prbyte + ply + plx + dey + dex + bne ]lup + lda #' ' + jsr drawchar + lda #' ' + jsr drawchar + lda :offset + clc + adc #26 + tay + lda [lableptr],y + jsr prbytel + lda #' ' + jsr drawchar + lda :offset + clc + adc #16 + tay + lda [lableptr],y + jsr prbytel + + lda #$0D + jsr drawchar + ldy #24 ;offset to local labels + lda [lableptr],y + bmi :rts + pha + lda #'/' + sta :treechar + pla + pha + jsr :showtree + pha + lda #' ' + sta :treechar + pla +:rts +:pxit rts + +:len ds 2 +:offset ds 2 +:bytes ds 2 + diff --git a/src/asm/asm.cmd.s b/src/asm/asm.cmd.s new file mode 100644 index 0000000..25d59ce --- /dev/null +++ b/src/asm/asm.cmd.s @@ -0,0 +1,21 @@ +* ovr all + ;use ../macs/tool.macs.s + ;use ../macs/qatools.macs.s + ;use ../macs/toolmacs.s + + put asm.vars + put asm.1 + put asm.eval + put asm.cond + put asm.opcodes + put asm.dsk + put asm.errors + put ../data/opdata + asm asm.header + + lnk ../utility/qasmgs.l + typ exe + sav ../utility/qasmgs +mylable equ $1234 + ent + diff --git a/src/asm/asm.cond.s b/src/asm/asm.cond.s new file mode 100644 index 0000000..b3294da --- /dev/null +++ b/src/asm/asm.cond.s @@ -0,0 +1,2275 @@ + + mx %00 + +doop stz lvalue + stz lvalue+2 + lda domask + bpl :ok + lda #nesterror + sec + rts +:ok lda dolevel + bne :set + ldx #$00 + jsr eval + bcc :set + cmp #undeflable + bne :err + lda #forwardref +:err sec + rts +:set lda domask + bne :shift0 +:shift1 sec + rol domask + jmp :test +:shift0 asl domask +:test lda lvalue + ora lvalue+2 + beq :dooff + lda domask + trb dolevel + jmp condout +:dooff lda domask + tsb dolevel + jmp condout + +ifop stz lvalue + stz lvalue+2 + lda domask + bpl :ok + lda #nesterror + sec + rts +:ok lda dolevel + beq :ok1 + jmp :set +:ok1 lda linebuff + and #$00ff + bne :test +:bad rep $30 + lda #badoperand + sec +:sec3 rep $30 + rts +:test stz lvalue + stz lvalue+2 + sep $30 + ldy #$00 +:flush lda (lineptr),y + iny + cmp #' ' + blt :bad + beq :flush + cmp #'M' + beq :mx + cmp #'m' + beq :mx + cmp #'X' + beq :xc1 + cmp #'x' + beq :xc1 +:save sta :first + lda (lineptr),y + cmp #' '+1 + blt :bad + iny + lda (lineptr),y + cmp #' '+1 + blt :bad + cmp :first + bne :set + inc lvalue +:set rep $30 + lda domask + bne :shift0 +:shift1 sec + rol domask + jmp :test1 +:xc1 jmp :xc +:shift0 asl domask +:test1 lda lvalue + ora lvalue+2 + beq :dooff + lda domask + trb dolevel + jmp condout +:dooff lda domask + tsb dolevel + jmp condout + + mx %11 +:mx pha + lda (lineptr),y + and #$5f + cmp #'X' + beq :testmx + pla + bra :save +:testmx pla + dey + tyx + lda #ifflag + tsb modeflag+1 + jsr eval + pha + php + lda #ifflag + trb modeflag+1 + plp + pla + bcc :mxval + cmp #undeflable + bne :sec2 + lda #forwardref +:sec2 rep $30 + sec + rts +:mxval jmp :set + + mx %11 +:xc pha + lda [lineptr],y + and #$5f + cmp #'C' + beq :testxc + pla + jmp :save +:testxc pla + dey + tyx + lda #ifflag + tsb modeflag+1 + jsr eval + pha + php + lda #ifflag + trb modeflag+1 + plp + pla + bcc :set + cmp #undeflable + bne :sec1 + lda #forwardref +:sec1 rep $30 + sec + rts +:first ds 2 + + + + do 0 +*** +ifop lda domask + bpl :ok + lda #nesterror + sec + rts +:ok lda dolevel + bne :set + ldx #$00 + jsr eval + bcc :set + cmp #undeflable + bne :err + lda #forwardref +:err rts +:set lda lvalue + ora lvalue+2 + beq :dooff + lda domask + trb dolevel + asl domask + jmp condout +:dooff lda domask + tsb dolevel + asl domask + jmp condout + fin + +elseop lda domask + eor dolevel + sta dolevel + jmp condout + +finop lda domask + trb dolevel + lsr domask + jmp condout + +condout lda dolevel + beq :on + lda #doflag + tsb modeflag + jmp :setlist +:on lda #doflag + trb modeflag +:setlist lda #lstdoon + bit listflag+1 + beq :clc + lda #$80 + trb listflag+1 +:clc clc + rts + +macop sep $30 + lda macflag + and #%01100000 ;if expanding either mactype + beq :mac + rep $30 + lda #badopcode + sec + rts + + mx %11 + +:mac lda #$40 + tsb clrglob + lda #putflag + bit modeflag + beq :good + pea #badopcode + jmp :error +:good lda passnum + jne :p1 + lda macflag + bmi :define + + lda #doflag + bit modeflag + beq :rep + +:define lda [fileptr] + tax + lda inputtbl,x + cmp #' '+1 + blt :bl + cmp #':' + beq :bl + cmp #']' + beq :bl + ldy #$00 + ldx #$00 +]l lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' '+1 + blt :slab + cpx #$0f + bge :siny + sta labstr+1,x +:siny iny + inx + jmp ]l +:slab cpx #$10 + blt :slab1 + ldx #$0f +:slab1 stx labstr + lda #$ff + sta linelable + sta linelable+1 + lda macflag + sta :mflag + rep $20 + lda oldglob + sta :old + lda globlab + sta :glob + sep $20 + stz macflag + jsr defineall + rep $10 + ldy :old + sty oldglob + ldy :glob + sty globlab + sep $10 + ldy :mflag + sty macflag + jcs :err1 +:rep rep $30 + lda linelable + bpl :ok +:bl pea #badlable + jmp :error +:ok asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + + lda lablect + cmp #maxsymbols + blt :init + pea #symfull + jmp :error + +:init ldy #26 + lda #$8004 + sta [lableptr],y + ldy #28 + lda nextlableptr + sta [lableptr],y + tax + ldy #30 + lda nextlableptr+2 + sta [lableptr],y + sta lableptr+2 + stx lableptr + + lda lablect + asl + asl + tay + lda nextlableptr + sta [lableptr1],y + iny + iny + lda nextlableptr+2 + sta [lableptr1],y + ldy #2 + lda lastlen + clc + adc fileptr + tax + lda fileptr+2 + bcc :sta + inc +:sta sta [lableptr],y + dey + dey + txa + sta [lableptr],y + ldy #4 + lda #$0000 + sta [lableptr],y + ldy #6 + sta [lableptr],y + ldy #26 + sta [lableptr],y + jsr inclablect + bcs :err1 +:p1 sep $20 + lda #$80 + tsb macflag + rep $30 + clc + rts +:err1 rep $30 + pha +:error rep $30 + pla + sec + rts +:mflag ds 2 +:old ds 2 +:glob ds 2 + +pmcop php + sep $30 + stz :y + stz :y+1 + ldy #$00 +]lup lda [lineptr],y + iny + cmp #' ' + blt :err + beq ]lup + dey + ldx #$00 +]lup lda [lineptr],y + cpx #15 + bge :c1 + sta labstr+1,x +:c1 cmp #' '+1 + blt :ok + cmp #',' + beq :ok1 + cmp #';' + beq :ok1 + inx + iny + cpx #$10 + blt ]lup + bra :ok +:ok1 iny +:ok txa + cmp #$10 + blt :ls + lda #$0f +:ls sta labstr + sty :y + sep $30 + lda macflag + sta :mflag + stz macflag + jsr findlable + ldy :mflag + sty macflag +* bcc :builtin ;not found so try built in macs + bcc :sec + rep $30 + ldy #26 + lda [lableptr],y + cmp #absolutebit.macrobit + bne :notmac +* bit expflag +* bmi :setup +* bvc :setup +* lda #$80 +* trb listflag +:setup sep $30 + lda macflag + sta :mflag + lda #$C1 + tsb macflag +* sec +* ror lstobjflag + ldy :y + sty macvarpos + stz macvarpos+1 + jsr initmac + bcc :clc + ldy :mflag + sty macflag + plp + sec + rts +:clc rep $30 + plp + clc + rts +:sec rep $30 + stz opcodeword +:err rep $30 + lda #badlable + plp + sec ;return clear if handled opcode + rts +:notmac rep $30 + lda #notmacro + plp + sec ;return clear if handled opcode + rts +:y ds 2 +:mflag ds 2 + + + + +eomop sep $30 + lda macflag + bmi :ok +:bad pea #badopcode + jmp :error +:ok bit #%01100000 + beq :define + bit #%00100000 + beq :ext + jmp :internal +:ext lda maclevel + and #$ff + beq :bad + jsr pullmac +:rtn sep $30 + lda #$FF + jsr setmaclist + lda maclevel + bne :noerror + lda #%01000000 + trb macflag +:define stz maclevel + lda #%10000000 + trb macflag +:noerror pea $00 +:error rep $30 + pla + cmp #$01 + rts +:internal rep $30 + lda imaclen + sta flen + lda imaclen+2 + sta flen+2 + lda imacptr + sta fileptr + lda imacptr+2 + sta fileptr+2 + lda imaclast + sta lastlen + lda #%00100000 + trb macflag + jmp :rtn + +definemacro + sep $30 + lda opcode + bne :1 + rep $30 + clc + rts + +:1 rep $30 + jsr hashopcode + bcc :test + pha + jsr domac1 + pla + bcc :test + clc + rts + +:test hex c9 ;CMP 'EOM ' + usr 'EOM ' + beq :eom + hex c9 + usr '<<< ' + beq :eom + hex c9 + usr 'MAC ' ;CMP 'MAC ' + beq :mac +:clcx clc + rts +:eom jmp eomop +:mac lda passnum + bne :clcx + jmp macop +:bad rep $30 + lda #badlable +:sec sec + rts +;macstack definition + ;0 = fileptr +;2 = fileptr+2 + ;4 = flen + ;6 = flen+2 + ;8 = lastlen + ;10 = mac lable num + ;12 = num of variables + ;14 = offset into macvars of var txt +;16.... same + +initmac php + rep $30 + lda maclevel + and #$ff + cmp #macnestmax + blt :ok + lda #nesterror + plp + sec + rts +:ok asl + asl + asl + asl + asl + tax + lda fileptr + sta macstack,x + lda fileptr+2 + sta macstack+2,x + lda flen + sta macstack+4,x + lda flen+2 + sta macstack+6,x + lda lastlen + sta macstack+8,x + ldy #16 + lda [lableptr],y + sta macstack+10,x + + stz lastlen + lda #$FFFF + sta flen + sta flen+2 + + ldy #30 + lda [lableptr],y + sta workspace+2 + ldy #28 + lda [lableptr],y + sta workspace + ldy #2 + lda [workspace] + sta fileptr + lda [workspace],y + sta fileptr+2 + lda passnum + bne :p1 + ldy #04 + lda [workspace],y + inc + sta [workspace],y + jmp :get +:p1 ldy #06 + lda [workspace],y + inc + sta [workspace],y +:get jsr getvars + inc maclevel + lda #$00 + jsr setmaclist + plp + clc + rts + +setmaclist php + sep $20 + cmp #$00 + beq :all +:eom lda linehaslab + bne :plp + lda #expflag + bit modeflag+1 + beq :only +:all lda linehaslab + bne :plp + lda #exponly + bit modeflag+1 + beq :plp +:only lda #$80 + trb listflag+1 +:plp plp + rts + +macvarpos ds 2 + +getvars + +]where = workspace +]ct = ]where+2 +]lit = ]ct+1 +]done = ]lit+1 + + php + rep $30 + + lda maclevel + and #$ff + xba + lsr ;quick * 128 + sta ]where + tax + stz :tbl ;init number + sep $20 + lda #128 + sta ]ct + stz ]lit + stz ]done + ldy macvarpos + +:flush lda (lineptr),y + cmp #' ' + jlt :move + beq :finy + cmp #';' + bne :first + jmp :move +:finy iny + jmp :flush +:first cmp #$22 + beq :literal + cmp #$27 + bne :giny +:literal sta ]lit +:giny sta macvars,x +* jsr :print + dec ]ct + inx + iny +:loop lda (lineptr),y + cmp #' ' + blt :done + beq :checklit + cmp #';' + beq :semi + cmp ]lit + beq :littog + cmp #$27 + beq :lit1 + cmp #$22 + bne :x1 +:lit1 sta ]lit +:x1 xba +:sta1 lda ]ct + beq :badvar + xba + sta macvars,x +* jsr :print + iny + inx + dec ]ct + jmp :loop +:checklit xba + lda ]lit + bne :sta1 + jmp :done +:littog xba + lda ]lit + bne :loff + xba + sta ]lit + xba + jmp :sta1 +:loff stz ]lit + jmp :sta1 +:done sec + ror ]done +:semi xba + lda ]lit + bne :sta1 +:next stz macvars,x +* jsr :printcr + inx + iny + dec ]ct + rep $20 + phx + inc :tbl + lda :tbl + asl + tax + lda ]where + sta :tbl,x + plx + stx ]where + lda :tbl + cmp #$08 + bge :move + sep $20 + lda ]done + bne :move + stz ]lit + lda (lineptr),y + cmp #' '+1 + blt :move + jmp :first +:badvar rep $30 + lda #badoperand + plp + sec + rts +:move rep $30 + lda maclevel + and #$ff + asl + asl + asl + asl + asl + tax + ldy #$00 +]lup lda :tbl,y + sta macstack+12,x + iny + iny + inx + inx + cpy #9*2 + blt ]lup +:xit plp + clc + rts +:tbl ds 9*2 + +:print php + rep $30 + phx + phy + pha + jsr drawchar + pla + ply + plx + plp + rts +:printcr php + rep $30 + phx + phy + pha + lda #'|' + jsr drawchar + lda #$0d + jsr drawchar + sep $20 +:b999 ldal $e0c010 + ldal $e0c061 + bpl :b999 + rep $20 + pla + ply + plx + plp + rts + + +pullmac php + rep $30 + dec maclevel + lda maclevel + and #$ff + asl + asl + asl + asl + asl + tax + lda macstack,x + sta fileptr + lda macstack+2,x + sta fileptr+2 + lda macstack+4,x + sta flen + lda macstack+6,x + sta flen+2 + lda macstack+8,x + sta lastlen + plp + rts + +expandmac php + rep $30 + jmp :init + +:entry sep $20 + stz linebuff + stz labstr + stz opcode + stz comment + + rep $30 + stz linehaslab + lda #$2020 + sta opcode+1 + sta opcode+3 + sta opcode+5 + +:init + lda fileptr + clc + adc lastlen + sta fileptr + bcc :prt + inc fileptr+2 + +:prt lda fileptr + sta printptr + lda fileptr+2 + sta printptr+2 + + stz :errcode + + sep $30 + ldy #$00 + + lda [fileptr] + tax + lda inputtbl,x + cmp #' ' + blt :sjmp ;to savlen => + beq :getopcode + cmp #'*' + beq :fjmp ;to flushiny => + cmp #';' + beq :fjmp + cmp #':' ;is it a valid lable? + bge :glabel ;yes... +:errbl xba + lda #badlable + sta :errcode + xba + +:glabel sta labstr+1 + sta linehaslab + ldx #$01 +:gliny iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' '+1 + blt :glabdone + cmp #'0' + blt :errbl1 ;bad lable + cmp #'<' + blt :cpx + cmp #'>'+1 + blt :errbl1 ;"<=>" not allowed either.. +:cpx cpx #$0f + bge :gliny + sta labstr+1,x + inx + jmp :gliny +:errbl1 pha + lda #badlable + sta :errcode + pla + jmp :cpx +:fjmp jmp :flushiny +:sjmp jmp :savlen + +:glabdone cpx #$10 + blt :gl2 + ldx #$0f +:gl2 stx labstr + cmp #' ' + bge :getopcode + jmp :savlen + +:getopcode +:giny iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + blt :sl1 + beq :giny + cmp #';' + jeq :flushiny + + sta opcode+1 + + ldx #$01 +:goiny iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' '+1 + blt :godone + cpx #31 + bge :goiny + sta opcode+1,x + inx + jmp :goiny + +:sl1 jmp :savlen +:fl1 jmp :flushiny + +:godone cpx #32 + blt :go2 + ldx #31 +:go2 stx opcode + cmp #' ' + blt :sl1 + +:getoperand +:giny1 iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + blt :sl1 + beq :giny1 + cmp #';' + beq :fl1 + + dey + ldx #$00 + phx + +:goiny1 iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' ;read in the rest of the line + blt :gotoper + beq :chklit + cmp #$27 + beq :lit + cmp #$22 + beq :lit + jmp :xba0 +:chklit xba + lda 1,s + bne :xba1 + xba + jmp :gotoper +:lit cmp 1,s + beq :litoff + sta 1,s + jmp :cpx1 +:litoff xba + lda #$00 + sta 1,s + jmp :xba1 +:xba0 xba + lda #doflag + bit modeflag + bne :xba1 + xba + cmp #']' + bne :cpx1 + xba + iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #'0' + blt :xba + beq :number + cmp #'9' + bge :xba + jmp :expand +:number phx + rep $30 + lda maclevel + and #$ff + dec + asl + asl + asl + asl + asl + tax + lda macstack+12,x + sep $30 + plx + ora #$30 + jmp :cpx1 +:xba dey +:xba1 xba +:cpx1 cpx #128 + bge :goiny1 + sta linebuff+1,x + inx + jmp :goiny1 + +:gotoper cpx #128 + blt :go3 + ldx #128 +:go3 stx linebuff + xba + pla + xba + cmp #' ' + blt :savlen + +:flushiny ldx passnum + bne :cp1 +:cp0 iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + bge :cp0 + jmp :savlen + bra :cp0 +:cp1 ldx #$00 +:cf1 lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' + blt :savcom + bne :c11 + iny + bra :cf1 +:c11 lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' + blt :savcom + iny + cpx #128 + bge :c11 + sta comment+1,x + inx + bra :c11 +:savcom stx comment +:savlen iny + sty lastlen + ldx linebuff + lda #$0d + sta linebuff+1,x + inc linebuff + + lda :errcode + bne :secxit + lda opcode ;was there an opcode? + bne :process + jmp :clcxit + ;list the line if necessary + +:process sep $30 + lda opcode + beq :c1 + cmp #$04 + blt :p1 +:c1 jmp :clcxit +:p1 rep $30 + jsr hashopcode + bcc :noforce ;not "forcelong" + pha + jsr domac1 + pla + bcs :c1 +:noforce hex c9 ;CMP 'MAC ' + usr 'MAC ' + bne :c1 + jmp :entry + +:clcxit rep $30 + lda #$00 +:secxit rep $30 + and #$FF + pha + sep $30 + lda linebuff + beq :xit + ldy #$00 +]lup iny + lda linebuff,y + cmp #' ' + blt :xit + beq ]lup + cmp #'#' + beq ]lup + cmp #'^' + beq :swap + cmp #'>' + beq :swap + cmp #'<' + bne :xit +:swap iny + xba + lda linebuff,y + cmp #'#' + bne :xit + sta linebuff-1,y + xba + sta linebuff,y + jmp :swap +:xit rep $30 + pla + plp + cmp :one + rts +:one dw $01 +:errcode ds 2 + +:expand phx + phy + rep $30 + pha + and #$7f + sec + sbc #'0' + tay + lda maclevel + and #$ff + dec + asl + asl + asl + asl + asl + tax + tya + cmp macstack+12,x + beq :exok + bge :expbad +:exok phx + asl + clc + adc 1,s + plx + tax + lda macstack+12,x + tay + lda 4,s + and #$ff + tax + sep $20 +:exl lda macvars,y + and #$7f + beq :exgood + cpx #128 + bge :xsta +:s1 sta linebuff+1,x + inx +:xsta iny + jmp :exl +:exgood rep $30 + pla + pla + and #$ff + tay + sep $30 + jmp :goiny1 +:expbad pla ;do not replace + sep $30 + ply + plx + jmp :xba + + +hashopcode + php + pea $00 + pea $00 + rep $30 + lda opcode+$1 + xba + sep $30 + asl + asl + asl + rep $30 + asl + asl + asl + sta 1,s + lda opcode+$4 + and #$5F5F + beq :clc + cmp #$4C + beq :last + cmp #$4F44 + beq :last + sta 3,s +:clc clc +:last lda opcode+$3 + and #$1F + rol + ora 1,s + plx + plx + bne :sec + plp + clc + rts +:sec plp ;indicate "forcelong" + sec + rts + + mx %00 + + +lupbuffer ds 16*maxlup,0 + +lupop lda luplevel + cmp #maxlup + blt :ok + lda #nesterror + sec + rts +:ok ldx #$00 + jsr eval + bcc :start + cmp #undeflable + bne :sec + lda #forwardref +:sec sec + rts +:start lda lvalue + ora lvalue+2 + bne :s1 + lda #badoperand + jmp :sec +:s1 lda #$80 + trb listflag+1 + lda luplevel + asl + asl + asl + asl + tax + lda fileptr + sta lupbuffer,x + lda fileptr+2 + sta lupbuffer+2,x + lda flen + sta lupbuffer+4,x + lda flen+2 + sta lupbuffer+6,x + lda lastlen + sta lupbuffer+8,x + lda lvalue + sta lupbuffer+10,x + lda lvalue+2 + sta lupbuffer+12,x + lda #lupflag + tsb modeflag + inc luplevel + clc + rts + +lupend lda #lupflag + bit modeflag + bne :ok + lda #badopcode + sec + rts +:ok lda #$80 + trb listflag+1 + lda luplevel + dec + asl + asl + asl + asl + tax + lda lupbuffer+10,x + bne :dec + lda lupbuffer+12,x + beq :end + dec lupbuffer+12,x +:dec dec lupbuffer+10,x + lda lupbuffer+12,x + ora lupbuffer+10,x + beq :end +:cont lda lupbuffer,x + sta fileptr + lda lupbuffer+2,x + sta fileptr+2 + lda lupbuffer+4,x + sta flen + lda lupbuffer+6,x + sta flen+2 + lda lupbuffer+8,x + sta lastlen + clc + rts +:end dec luplevel + bne :clc + lda #lupflag + trb modeflag +:clc clc + rts + + + do 0 +lupstart ds 4 +luplen ds 4 +lupcount ds 4 +luplast ds 2 + +lupop lda #lupflag + bit modeflag + beq :ok + lda #badopcode + sec + rts +:ok ldx #$00 + jsr eval + bcc :start + cmp #undeflable + bne :sec + lda #forwardref +:sec sec + rts +:start lda lvalue + ora lvalue+2 + bne :s1 + lda #badoperand + jmp :sec +:s1 lda #$80 + trb listflag+1 + lda fileptr + sta lupstart + lda fileptr+2 + sta lupstart+2 + lda flen + sta luplen + lda flen+2 + sta luplen+2 + lda lastlen + sta luplast + lda lvalue + sta lupcount + lda lvalue+2 + sta lupcount+2 + lda #lupflag + tsb modeflag + clc + rts + +lupend + lda #lupflag + bit modeflag + bne :ok + lda #badopcode + sec + rts +:ok lda #$80 + trb listflag+1 + lda lupcount + bne :dec1 + dec lupcount+2 +:dec1 dec + sta lupcount + ora lupcount+2 + bne :loop + lda #lupflag + trb modeflag + clc + rts +:loop lda lupstart + sta fileptr + lda lupstart+2 + sta fileptr+2 + lda luplen + sta flen + lda luplen+2 + sta flen+2 + lda luplast + sta lastlen + clc + rts + fin + +checklup php + rep $30 + lda luplevel + beq :xit + dec + asl + asl + asl + asl + tax + lda lupbuffer+10,x + sta :count + sep $30 + lda labstr + beq :opc + tax +:lab lda labstr,x + cmp #'@' + bne :dex1 + clc + adc :count + sta labstr,x +:dex1 dex + bne :lab + +:opc lda opcode + beq :operand + tax +:opc1 lda opcode,x + cmp #'@' + bne :dex2 + clc + adc :count + sta opcode,x +:dex2 dex + bne :opc1 +:operand lda linebuff + beq :xit + tax +:oper1 lda linebuff,x + cmp #'@' + bne :dex3 + clc + adc :count + sta linebuff,x +:dex3 dex + bne :oper1 +:xit plp + rts +:count ds 2 + +macinsert + +]ct equ workspace +]offset equ ]ct+$2 +]pos equ ]offset+$2 +]pos1 equ ]pos+$2 +]len1 equ ]pos1+$2 +]len2 equ ]len1+$2 +]ptr equ ]len2+2 + +:entry php + rep $30 + lda #$0020 + sta labtype + lda lablect + cmp #maxsymbols ;max number of lables + blt :ne0 +:full lda #symfull ;symtable full + jmp :error +:ne0 lda macvarptr + cmp #macsize + bge :full +:ne1 lda labstr + and #$FF + bne :ne2 +:bad lda #badlable + jmp :error +:ne2 sta ]len1 + lda labstr+$1 ;first byte of string + and #$7F + cmp #':' ;local lable? + beq :bad +* cmp #']' ;can't allow variables because +* beq :bad ;of parameter passing + lda maclevel + dec + and #$ff + asl + asl + asl + asl + asl + sta :offset + tax + lda macstack+10,x + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #28 + lda [lableptr],y + sta ]ptr + ldy #30 + lda [lableptr],y + sta ]ptr+2 + ldy #$04 + lda passnum + beq :py2 + ldy #$06 +:py2 lda []ptr],y + sta :count + ldy #24 + lda [lableptr],y + jpl :start + lda macstack+10,x + bra :ne3 +:udf lda #undeflable + jmp :error +:ne3 sta ]pos + sta labprev + ldy #24 + lda lablect + sta [lableptr],y ;set local ptr for GLable +:save rep $30 + jsr :saveit + bcc :nosave + plp + sec + rts +:nosave lda #$00 + plp + clc + rts +:start sta ]pos +]lup lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + stz ]offset + sep $20 + lda [lableptr] + sta ]len2 + stz ]len2+1 + ldx #$02 ;start at byte 2 + txy +]lup1 cpx #$10 + jeq :error2 + cpx ]len1 + blt :1 + beq :1 + jmp :goleft1 +:1 cpx ]len2 + blt :2 + beq :2 + jmp :goright +:2 lda [lableptr],y + cmp labstr,x + bne :next + iny + inx + jmp ]lup1 +:next rep $30 + blt :goright + jmp :goleft +:goleft1 rep $30 + lda ]len1 + cmp ]len2 + bne :goleft +:replace ldy #22 ;offset to equ value + lda [lableptr],y +:rl tay + iny + iny + lda [macptr],y + cmp :count + beq :r1 + dey + dey + lda [macptr],y + bpl :rl +:rs lda macvarptr + sta [macptr],y + tay + lda #$ffff + sta [macptr],y + iny + iny + lda :count + sta [macptr],y + iny + iny + lda labval + sta [macptr],y + iny + iny + lda labval+2 ;replace equate + sta [macptr],y + iny + iny + sty macvarptr + jmp :nosave +:r1 iny + iny + lda labval + sta [macptr],y + iny + iny + lda labval+2 ;replace equate + sta [macptr],y + jmp :nosave +:goleft rep $30 + ldy #18 ;leftptr + lda [lableptr],y + bpl :p1 + lda lablect + sta [lableptr],y + jmp :save +:p1 sta ]pos + jmp ]lup +:goright rep $30 + ldy #20 ;leftptr + lda [lableptr],y + bpl :p2 + lda lablect + sta [lableptr],y + jmp :save +:p2 sta ]pos + jmp ]lup +:error2 rep $30 + lda #badlable +:error plp + sec + rts +:saveit sta labnum + pha + lda ]pos + sta labprev + lda labtype + ora orgor + sta labtype + lda #dumflag + bit modeflag + beq :si1 + lda labtype + ora dumor ;#$8000 + sta labtype +:si1 lda #$FFFF + sta lableft + sta labright + sta lablocal + + ldy macvarptr + lda #$ffff + sta [macptr],y + iny + iny + lda :count + sta [macptr],y + iny + iny + lda labval + sta [macptr],y + iny + iny + lda labval+2 + sta [macptr],y + iny + iny + lda macvarptr + sta labprev + sty macvarptr + + pla + sta ]pos ;for movefound + asl + asl + tay + lda nextlableptr + sta [lableptr1],y + sta lableptr + pha ;for mvn below + iny + iny + lda nextlableptr+2 + sta [lableptr1],y + sta lableptr+2 + sep $20 + sta :mvn+1 + rep $20 + ply ;low of destination + tdc + clc + adc #labstr + tax ;source low word + lda #31 ;MVN + phb +:mvn mvn $000000,$000000 + plb + jsr inclablect + rts +:offset ds 2 +:count ds 2 + +macfind + +]ct equ workspace +]offset equ ]ct+$2 +]pos equ ]offset+$2 +]pos1 equ ]pos+$2 +]len1 equ ]pos1+$2 +]len2 equ ]len1+$2 + +:entry php + sep $30 +:normal lda modeflag + and #caseflag + beq :macentry + jsr caselable +:macentry stz labtype + stz labtype+1 + lda lablect + ora lablect+1 + jeq :notfound + lda labstr + jeq :notfound + sta ]len1 + stz ]len1+1 + lda maclevel + sta :lev + stz :lev+1 +:loop rep $30 + lda :lev + beq :notfound + dec + asl + asl + asl + asl + asl + tax + lda macstack+10,x + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #24 + lda [lableptr],y + jmi :nf1 + sta ]pos + ldy #28 + lda [lableptr],y + tax + ldy #30 + lda [lableptr],y + sta lableptr+2 + stx lableptr + ldy #$04 + ldx passnum + beq :noinx + ldy #$06 +:noinx lda [lableptr],y + sta :count +:gloop +]lup lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + stz ]offset + lda [lableptr] + and #$0f + sta ]len2 + sep $20 + ldx #$02 ;start at byte 2 + txy +]lup1 cpx #$10 + bge :movefound + cpx ]len1 + blt :1 + beq :1 + jmp :goleft1 +:notfound plp + clc + rts +:1 cpx ]len2 + blt :2 + beq :2 + jmp :goright +:2 lda labstr,x + cmp [lableptr],y + bne :next + iny + inx + jmp ]lup1 +:next blt :goleft + jmp :goright +:goleft1 lda ]len1 + cmp ]len2 + beq :movefound +:goleft rep $30 + ldy #18 + lda [lableptr],y + bmi :nf1 + sta ]pos + jmp ]lup +:goright rep $30 + ldy #20 + lda [lableptr],y + bmi :nf1 + sta ]pos + jmp ]lup +:nf1 rep $30 + dec :lev + jmp :loop +:movefound rep $30 + lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #22 + lda [lableptr],y +:lup tay + iny + iny + lda [macptr],y + cmp :count + beq :valfound + dey + dey + lda [macptr],y + bpl :lup + jmp :nf1 +:valfound iny + iny + lda [macptr],y + tax + iny + iny + lda [macptr],y + ldy #30 + sta [lableptr],y + txa + ldy #28 + sta [lableptr],y + plp + sec + rts +:count ds 2 +:lev ds 2 + +imacptr ds 4 +imaclen ds 4 +imaclast ds 4 + +expandint php + rep $30 + lda fileptr + clc + adc lastlen + sta fileptr + bcc :prt + inc fileptr+2 + +:prt lda fileptr + sta printptr + lda fileptr+2 + sta printptr+2 + + sep $30 +* ldy #$00 + + lda [fileptr] + tax + lda inputtbl,x + cmp #' ' + blt :sjmp ;to savlen => + beq :getopcode + cmp #'*' + beq :fjmp ;to flushiny => + cmp #';' + beq :fjmp +:errbl lda #badlable + jmp :errflush +:fjmp jmp :flushiny +:sjmp jmp :savlen + +:getopcode +:giny iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + blt :sl1 + beq :giny + cmp #';' + jeq :flushiny + + and tbxand + sta opcode+1 + + ldx #$01 +:goiny iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' '+1 + blt :godone + cpx #31 + bge :goiny + and tbxand + sta opcode+1,x + inx + jmp :goiny + +:sl1 jmp :savlen +:fl1 jmp :flushiny + +:godone cpx #32 + blt :go2 + ldx #31 +:go2 stx opcode + cmp #' ' + blt :sl1 + +:getoperand +:giny1 iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + blt :sl1 + beq :giny1 + cmp #';' + beq :fl1 + + dey + ldx #$00 + phx +:goiny1 iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' ;read in the rest of the line + blt :gotoper + beq :chklit + cmp #$27 + beq :lit + cmp #$22 + beq :lit + jmp :xba0 +:chklit xba + lda 1,s + bne :xba1 + xba + jmp :gotoper +:lit cmp 1,s + beq :litoff + sta 1,s + jmp :cpx1 +:litoff xba + lda #$00 + sta 1,s + jmp :xba1 +:xba0 xba + lda #doflag + bit modeflag + bne :xba1 + xba + cmp #']' + bne :cpx1 + xba + iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #'0' + blt :xba + beq :number + cmp #'9' + bge :xba + jmp :expand +:number phx + rep $30 + lda #macnestmax+1 + dec + asl + asl + asl + asl + asl + tax + lda macstack+12,x + sep $30 + plx + ora #$30 + jmp :cpx1 +:xba dey +:xba1 xba +:cpx1 cpx #128 + bge :goiny1 + sta linebuff+1,x + inx + jmp :goiny1 + +:gotoper cpx #128 + blt :go3 + ldx #128 +:go3 stx linebuff + xba + pla + xba + cmp #' ' + blt :savlen + +:flushiny ldx passnum + bne :cp1 +:cp0 iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + bge :cp0 + jmp :savlen + bra :cp0 +:cp1 ldx #$00 +:c11 lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' + blt :savcom + iny + cpx #128 + bge :c11 + sta comment+1,x + inx + bra :c11 +:savcom stx comment +:savlen iny + sty lastlen + ldx linebuff + lda #$0d + sta linebuff+1,x + inc linebuff + + + lda opcode ;was there an opcode? + bne :process + jmp :clcxit + ;list the line if necessary + +:errflush pha ;we got an error somewhere..before +]f iny ;we got to the EOLN...so we must + lda [fileptr],y ;flush it out + tax + lda inputtbl,x + cmp #' ' + bge ]f + iny + sty lastlen + ldx linebuff ;put a at end anyway + lda #$0d + sta linebuff+1,x + inc linebuff + pla ;restore the error code + jmp :secxit + +:process +:clcxit rep $30 + lda #$00 +:secxit rep $30 + pha + sep $30 + lda linebuff + beq :xit + ldy #$00 +]lup iny + lda linebuff,y + cmp #' ' + blt :xit + beq ]lup + cmp #'#' + beq ]lup + cmp #'^' + beq :swap + cmp #'>' + beq :swap + cmp #'<' + bne :xit +:swap iny + xba + lda linebuff,y + cmp #'#' + bne :xit + sta linebuff-1,y + xba + sta linebuff,y + jmp :swap +:xit rep $30 + pla + plp + cmp :one + rts +:one dw $01 + +:expand phx + phy + rep $30 + pha + and #$7f + sec + sbc #'0' + tay + lda #macnestmax+1 + dec + asl + asl + asl + asl + asl + tax + tya + cmp macstack+12,x + beq :exok + bge :expbad +:exok phx + asl + clc + adc 1,s + plx + tax + lda macstack+12,x + tay + lda 4,s + and #$ff + tax + sep $20 +:exl lda macvars,y + and #$7f + beq :exgood + cpx #128 + bge :xsta +:s1 sta linebuff+1,x + inx +:xsta iny + jmp :exl +:exgood rep $30 + pla + pla + and #$ff + tay + sep $30 + jmp :goiny1 +:expbad pla ;do not replace + sep $30 + ply + plx + jmp :xba + + +initinternal rep $30 + sta :low+1 + stx :high+1 + lda macflag + bit #%00100000 + beq :ok + lda #badmacro + sec + rts +:ok lda fileptr + sta imacptr + lda fileptr+2 + sta imacptr+2 + lda lastlen + sta imaclast + lda flen + sta imaclen + lda flen+2 + sta imaclen+2 + lda #%10100001 + tsb macflag +:high lda #$FFFF + sta fileptr+2 +:low lda #$FFFF + sta fileptr + stz lastlen + lda #$ffff + sta flen + sta flen+2 + lda maclevel + pha + lda #macnestmax + sta maclevel + stz macvarpos + jsr getvars + pla + sta maclevel + lda #$00 + jsr setmaclist + clc + rts + diff --git a/src/asm/asm.dsk.s b/src/asm/asm.dsk.s new file mode 100644 index 0000000..003ed86 --- /dev/null +++ b/src/asm/asm.dsk.s @@ -0,0 +1,1259 @@ + +getpath php + sep $30 + sta :sflag + stz pathname + stz pathname+1 + ldy #$00 +]flush lda [lineptr],y + and #$7f + cmp #' ' + blt :bad + bne :first + iny + jmp ]flush +:first cmp #'.' + beq :backup + jmp :ok +:bad pea #badoperand + jmp :error +:ok ldx #$00 +:return sep $30 +:save lda [lineptr],y + and #$7f + cmp #' '+1 + blt :done + cmp #'/' + bne :cmp + lda #':' +:cmp +:store cpx #128 + bge :inx + sta pathname+1,x +:inx inx + iny + jmp :save +:done cpx #64 + blt :len + ldx #64 +:len stx pathname + lda :sflag + beq :plp + lda pathname + cmp #63 + bge :plp + tax + lda pathname,x + and #$7f + cmp #'/' + beq :plp + cmp #':' + beq :plp +:ap lda pathname + inc + inc + sta pathname + lda #'.' + sta pathname+1,x + inx + lda #'S' + sta pathname+1,x +:plp sep $30 + lda pathname + beq :syn + plp + clc + rts +:syn rep $30 + lda #badoperand + plp + sec + rts + mx %11 + +:backup stz :level +:loop sty :y + iny + lda [lineptr],y + and #$7f + cmp #' '+1 + blt :pfx + cmp #'.' + bne :pfx + iny + lda [lineptr],y + and #$7f + cmp #' '+1 + blt :pfx + cmp #'/' + beq :i + cmp #':' + bne :pfx +:i inc :level + iny + sty :y + lda [lineptr],y + and #$7f + cmp #'.' + beq :loop +:pfx ldx #$00 + lda :level + beq :noexp + rep $30 + stz pathname + _getprefix :pfxparm + sep $30 + ldx pathname + beq :noexp +]lup lda pathname,x + and #$7f + cmp #'/' + bne :store1 + lda #':' +:store1 sta pathname,x + dex + bne ]lup + ldx pathname + lda pathname,x + cmp #':' + bne :exp + dex +:exp cpx #$00 + beq :noexp + lda pathname,x + cmp #':' + bne :dex + dec :level + beq :noexp +:dex dex + jmp :exp +:noexp stx pathname + ldy :y + jmp :return +:xit pea $00 +:error rep $30 + pla + plp + cmp :one + rtl +:one ds 2 +:temp ds 2 +:level ds 2 +:y ds 2 +:sflag ds 2,0 +:pfxparm dw $00 + adrl pathname +pathname ds 130,0 + mx %00 + + +dskop php + rep $30 + lda passnum + bne :pass2 + lda #dskflag + bit modeflag + bne :nosize + tsb modeflag + lda objhdl + ora objhdl+2 + beq :nosize + lda objhdl+2 + pha + lda objhdl + pha + _hunlock + psl #dskobjsize+1 + lda objhdl+2 + pha + lda objhdl + pha + tll $1902 ;set handlesize + lda #dskobjsize + sta objsize + lda objhdl+2 + sta workspace+2 + pha + lda objhdl + sta workspace + pha + _hlock + ldy #$02 + lda [workspace] + sta objzpptr + lda [workspace],y + sta objzpptr+2 + +:nosize lda objptr + sta orgval + sta oldobj + lda objptr+2 + and #$7fff + sta orgval+2 + sta oldobj+2 + stz reloffset + stz relct + stz objoffset + stz objoffset+2 + stz oldoffset + stz oldoffset+2 + stz objct + plp + clc + rts + +:pass2 lda dskopen + beq :newfile + jsr closedsk + jcs :gsoserr +:newfile lda #$00 + jsr getpath + bcc :ok + plp + sec + rts +:ok psl #pathname + _QASetObjPath + sep $30 + ldx pathname + stx dskpath +]lup lda pathname,x + sta dskpath,x + dex + bne ]lup + rep $30 + jsr settypes + _getfileinfo dskinfo + bcc :test + jsr settypes + _create dskcreate + jcs :gsoserr +:test lda dsktype + cmp dskctype + jne :mismatch + _open dskopen + jcs :gsoserr + lda dskopen + jsr writedsk + bcs :gsoserr + lda objptr + sta orgval + sta oldobj + lda objptr+2 + and #$7fff + sta orgval+2 + sta oldobj+2 + stz reloffset + stz relct + stz objoffset + stz objoffset+2 + stz oldoffset + stz oldoffset+2 + stz objct + plp + clc + rts + +:mismatch lda #filemismatch +:gsoserr sta prodoserr + lda #doserror + plp + sec + rts + +settypes php + rep $30 + ldy #$f8 + lda #relflag + bit modeflag + bne :rel + lda objtype + and #$ff + tay +:rel sty dskctype + sty dsktype + cpy #$06 + bne :zeroaux + lda orgval + sta dskaux + sta dskcaux + stz dskaux+2 + stz dskcaux+2 + jmp :time +:zeroaux stz dskaux + stz dskaux+2 + stz dskcaux + stz dskcaux+2 +:time stz dskctime + stz dskctime+2 + plp + rts + +settypes1 php + rep $30 + ldy #$f8 + lda #relflag + bit modeflag + bne :rel + lda objtype + and #$ff + tay +:rel sty dskctype + sty dsktype + cpy #$06 + bne :zeroaux + lda orgval + sta dskaux + sta dskcaux + stz dskaux+2 + stz dskcaux+2 + jmp :plp +:zeroaux stz dskaux + stz dskaux+2 + stz dskcaux + stz dskcaux+2 +:plp plp + rts + + +savop php + rep $30 + stz :openflag + lda modeflag + bit #dskflag + beq :pass + lda #badopcode + plp + sec + rts +:pass lda passnum + bne :sav + jmp :all +:sav lda errorct + beq :path +:badsav rep $30 + lda #badsav + plp + sec + rts +:path lda #$00 ;no append '.S' + jsr getpath + bcc :ok + plp + sec + rts +:ok psl #pathname + _QASetObjPath + lda objzpptr + sta :where + lda objzpptr+2 + sta :where+2 + lda objct + sta :request + ;*** beq :badsav + stz :request+2 + stz :openparm + stz :closeparm +:info _getfileinfo :infoparm + bcc :test + cmp #$46 + jne :mlierr + lda #relflag + bit modeflag + beq :notrel1 + lda #$f8 + sta :cftype + sta :ftype + lda objct + sta :cauxtype + sta :auxtype + stz :cauxtype+2 + jmp :create +:notrel1 lda orgval + sta :cauxtype + sta :auxtype + stz :cauxtype+2 + lda objtype + sta :cftype + sta :ftype +:create stz :ctime + stz :ctime+2 + _create :createparm + jcs :mlierr + jmp :open +:test lda #relflag + bit modeflag + beq :notrel + lda #$f8 + cmp :ftype + bne :mismatch + sta :ftype + lda objct + sta :auxtype + stz :auxtype+2 + jmp :set +:notrel lda orgval + sta :auxtype + stz :auxtype+2 + lda objtype + cmp :ftype + bne :mismatch + sta :ftype + jmp :set +:mismatch lda #filemismatch + jmp :mlierr +:set _setfileinfo :infoparm + jcs :mlierr +:open _open :openparm + jcs :mlierr + sec + ror :openflag + lda :openparm + sta :closeparm + sta :eofparm + sta :writeparm + _write :writeparm + bcs :mlierr + lda #relflag + bit modeflag + beq :seof + lda :openparm + jsr writerel + bcs :mlierr +:seof _getmark :eofparm + _seteof :eofparm + bcs :mlierr + jsr :show +:all rep $30 +* lda #relflag +* bit modeflag +* beq :a1 +* jsr endop +:a1 stz objoffset + stz objoffset+2 + stz oldoffset + stz oldoffset+2 + stz relct + stz reloffset + lda objptr + sta orgval + sta oldobj + lda objptr+2 + sta orgval+2 + sta oldobj+2 + lda #$8000 + trb orgval+2 + +:done lda #$0000 +:mlierr pha + bit :openflag + bpl :err1 + _close :closeparm +:err1 pla + sta prodoserr + cmp :one + bcc :plp + lda #doserror +:plp plp + cmp :one + rts +:one dw $01 +:openflag ds 2 +:createflag ds 2 + +:infoparm adrl pathname + dw $00 +:ftype dw $00 +:auxtype ds 18 + +:createparm adrl pathname + dw $e3 +:cftype dw $00 +:cauxtype adrl $00 + dw $01 +:ctime adrl $0000 + +:openparm dw $00 + adrl pathname + adrl $00 + +:eofparm dw $00 + adrl $00 + +:writeparm dw $00 +:where adrl $00 +:request adrl $00 + adrl $00 + +:closeparm dw $00 +:str1 str 'Object saved as ' +:str2 str ',A$' +:str3 str ',L$' + +:show php + rep $30 + lda #$8000 + trb listflag + lda #$0d + jsr drawchar + psl #:str1 + _QADrawString + psl #pathname + _QADrawString + psl #:str2 + _QADrawString + lda :auxtype + jsr prbytel + psl #:str3 + _QADrawString + ldy #$00 + lda :eofparm+5 + and #$ff + beq :s1 + jsr prbyte + iny +:s1 lda :eofparm+4 + and #$ff + bne :s2 + cpy #$00 + beq :s3 +:s2 jsr prbyte +:s3 lda :eofparm+2 + jsr prbytel + lda #',' + jsr drawchar + lda :ftype + pha + psl #:typ + _QAConvertTyp2Txt + psl #:typ + _QADrawString + lda #$0d + jsr drawchar + plp + rts +:typ ds 4 + +writerel php ;must enter with file open... + rep $30 ;at EOF AND with A holding file + sta :writeparm ;reference number + lda #relflag + bit modeflag + bne :ok +:clc plp + clc + rts + +:ok lda relct + sta :request + stz :request+$2 + lda relptr + sta :where + lda relptr+$2 + sta :where+$2 + jsl prodos + dw $13 ;WRITE + adrl :writeparm + jcs :perr + lda :request + clc + adc totbytes + sta totbytes + lda :request+2 + adc totbytes+2 + sta totbytes+2 + +:checkerr stz relct + lda errvalid + beq :ds + ldy relct + sep $20 + lda #%11101111 ;err link opcode + sta [relptr],y + rep $20 + iny + lda erraddress + sta [relptr],y + iny + iny + sep $20 + lda erraddress+2 + sta [relptr],y + rep $20 + iny + sty relct + stz errvalid + stz erraddress + stz erraddress+2 + +:ds lda dsfill + beq :rellast + ldy relct + lda #$00cf + sta [relptr],y + iny + lda dsoffset + sta [relptr],y + iny + iny + lda dsfill + sep $20 + sta [relptr],y + rep $20 + iny + sty relct + stz dsfill + stz dsoffset + +:rellast ldy relct + lda #$00 + sta [relptr],y + iny + sty :request + stz relct + + jsl prodos + dw $13 ;WRITE + adrl :writeparm + jcs :perr + lda :request + clc + adc totbytes + sta totbytes + lda :request+2 + adc totbytes+2 + sta totbytes+2 + +:lables jsr :rellables + jcs :perr + lda #$00 + sta :buffer + lda #$01 + sta :request + stz :request+2 + + lda :request + clc + adc totbytes + sta totbytes + lda :request+2 + adc totbytes+2 + sta totbytes+2 + + jsl prodos + dw $13 ;WRITE + adrl :writeparm + jcs :perr + stz relct + plp + clc + rts + +:perr sta prodoserr + stz relct + lda #doserror + plp + sec + rts + +:writeparm + ds 2 +:where ds 4 +:request ds 4 + ds 4 + +:rellables php + rep $30 + stz :errcode + stz :request+$2 + lda #:buffer + sta :where + lda #^:buffer + sta :where+2 + lda #$00 + sta :main +:loop lda :errcode + bne :relerr + lda :main + cmp lablect + blt :doit +:relerr lda :errcode + plp + cmp :one + rts +:doit asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + + ldy #$00 + stz :offset + lda [lableptr] + and #$0F + bne :stalen + inc :main + jmp :loop +:stalen sta :len + clc + adc #4 + sta :request + ldy #26 + lda [lableptr],y + bit #entrybit.externalbit + jeq :rts + bit #variablebit.localbit.macrobit.macvarbit + jne :rts + sep $20 + ldx #$00 + ldy #$01 +]lup lda [lableptr],y + and #$7f +:sta sta :buffer+1,x + iny + inx + cpx :len + blt ]lup + + rep $30 + ldy #26 + lda [lableptr],y + bit #entrybit + bne :ent1 + bit #usedbit + beq :rts +:ent1 lda [lableptr],y + pha + bit #externalbit + beq :ent + lda #$80 + tsb :len +:ent lda 1,s + and #entrybit + beq :abs + lda #$40 + tsb :len +:abs pla + bpl :value + lda #$20 + tsb :len +:value ldy #28 + lda :len + and #%00011111 + tax + lda [lableptr],y + sta :buffer+1,x + iny + iny + lda [lableptr],y + sta :buffer+3,x + sep $20 + lda :len + sta :buffer + rep $20 + and #$80 + beq :writeit + ldy #22 + lda [lableptr],y + and #$00ff + ora :buffer+1,x + sta :buffer+1,x + +:writeit lda :request + clc + adc totbytes + sta totbytes + lda :request+2 + adc totbytes+2 + sta totbytes+2 + jsl prodos + dw $13 ;WRITE + adrl :writeparm + bcc :rts + sta :errcode +:rts inc :main + jmp :loop + +:len ds 2 +:offset ds 2 +:errcode ds 2 +:one dw $01 +:main ds 2 +:buffer ds 28,0 + + +putop php + sep $30 + lda #putflag.useflag + bit modeflag + beq :level +:badput pea #badput + jmp :err +:level lda putlevel + cmp #maxput + bge :badput +:ok rep $30 + lda macflag + bit #%01100000 + bne :badput + + lda putlevel + asl + asl + asl + asl + tax + lda putbuffer,x + ora putbuffer+2,x + jne :valid + lda #$FFFF + jsr getpath + bcc :ok2 + plp + sec + rts +:ok2 lda #putid + sta loadid + stz :purgeflag +:load + jsr showfile + + psl #$00 + psl #pathname + psl #$00 ;filepos + psl #-1 ;whole file + psl #txttypes + lda userid + ora #asmmemid + pha + psl #$00 + pea $8000 + _QALoadfile + plx + ply + bcc :loaded + bit :purgeflag + jmi :memerr + lda userid + ora #putid + pha + _disposeall + sec + ror :purgeflag + lda #$0000 + tax +]lup sta putbuffer,x + inx + inx + cpx #maxput*16 + blt ]lup + jmp :load +:loaded phy + phx + lda putlevel + asl + asl + asl + asl + tax + pla + sta putbuffer,x + pla + sta putbuffer+2,x +:valid lda putlevel + asl + asl + asl + asl + tax + phx + lda putbuffer,x + sta workspace + pha + lda putbuffer+2,x + sta workspace+2 + pha + _hlock + plx + lda fileptr + sta putbuffer+4,x + lda fileptr+2 + sta putbuffer+6,x + lda flen + sta putbuffer+8,x + lda flen+2 + sta putbuffer+10,x + lda lastlen + sta putbuffer+12,x + lda linenum + sta tlinenum + +* lda #$0001 +* sta linenum + stz lastlen + psl #$00 + pei workspace+2 + pei workspace + tll $1802 ;gethandlesize + plx + ply + cpx #$00 + bne :dex + dey +:dex dex + stx flen + sty flen+2 + + ldy #$02 + lda [workspace] + sta fileptr + lda [workspace],y + sta fileptr+2 + lda #putflag + tsb putuse + inc putlevel + plp + clc + rts +:memerr rep $30 + sta prodoserr + pea #doserror +:err rep $30 + pla + plp + cmp :one + rts +:one dw $01 +:purgeflag ds 2 + + mx %00 +libop lda passnum + jeq useop + inc uselevel + clc + rts + +useop php + sep $30 + lda #putflag.useflag + bit modeflag + beq :level +:badput pea #badput + jmp :err +:level lda uselevel + cmp #maxput + bge :badput +:ok rep $30 + lda macflag + bit #%01100000 + bne :badput + lda uselevel + asl + asl + asl + asl + tax + lda usebuffer,x + ora usebuffer+2,x + bne :valid + lda #$FFFF + jsr getpath + bcc :ok2 + plp + sec + rts +:ok2 lda #useid + sta loadid + jsr showfile + + psl #$00 + psl #pathname + psl #$00 ;filepos + psl #-1 ;whole file + psl #txttypes + lda userid + ora #asmmemid + pha + psl #$00 + pea $8000 + _QALoadfile + plx ;pull off handle + ply + jcs :memerr +:loaded phy + phx + lda uselevel + asl + asl + asl + asl + tax + pla + sta usebuffer,x + pla + sta usebuffer+2,x +:valid lda uselevel + asl + asl + asl + asl + tax + phx + lda usebuffer,x + sta workspace + pha + lda usebuffer+2,x + sta workspace+2 + pha + _hlock + plx + lda fileptr + sta usebuffer+4,x + lda fileptr+2 + sta usebuffer+6,x + lda flen + sta usebuffer+8,x + lda flen+2 + sta usebuffer+10,x + lda lastlen + sta usebuffer+12,x + lda linenum + sta tlinenum + +* lda #$0001 +* sta linenum + stz lastlen + psl #$00 + pei workspace+2 + pei workspace + tll $1802 ;gethandlesize + plx + ply + cpx #$00 + bne :dex + dey +:dex dex + stx flen + sty flen+2 + ldy #$02 + lda [workspace] + sta fileptr + lda [workspace],y + sta fileptr+2 + lda #useflag + tsb putuse + inc uselevel + plp + clc + rts +:memerr rep $30 + sta prodoserr + pea #doserror +:err rep $30 + pla + plp + cmp :one + rts +:one dw $01 + +showfile + rts + php + rep $30 + psl #:str + _QADrawString + psl #pathname + _QADrawString + lda #$0d + jsr drawchar + plp + rts +:str str 'Reading: ' + +putuseend php + rep $30 + lda modeflag + bit #putflag + bne :put + bit #useflag + bne :use + plp + rts +:put jsr putend + plp + rts +:use jsr useend + plp + rts + + +putend php + rep $30 + lda putlevel + bne :dec + plp + rts +:dec dec + asl + asl + asl + asl + tax + lda putbuffer,x + sta workspace + lda putbuffer+2,x + sta workspace+2 + phx + pei workspace+2 + pei workspace + _hunlock + plx + lda putbuffer+4,x + sta fileptr + lda putbuffer+6,x + sta fileptr+2 + lda putbuffer+8,x + sta flen + lda putbuffer+10,x + sta flen+2 + lda putbuffer+12,x + sta lastlen + lda tlinenum + sta linenum + lda #putflag + trb modeflag + lda doneflag + beq :plp + stz doneflag +:plp plp + rts + +useend php + rep $30 + lda uselevel + bne :dec + plp + rts +:dec dec + asl + asl + asl + asl + tax + lda usebuffer+4,x + sta fileptr + lda usebuffer+6,x + sta fileptr+2 + lda usebuffer+8,x + sta flen + lda usebuffer+10,x + sta flen+2 + lda usebuffer+12,x + sta lastlen + lda tlinenum + sta linenum + lda #useflag + trb modeflag + lda doneflag + beq :plp + stz doneflag +:plp plp + rts + + +putbuffer ds maxput*16,0 +usebuffer ds maxput*16,0 + +closedsk php + rep $30 + lda dskopen + jeq :clc + sta dskclose + sta dskeofparm + jsr writedsk + jcs :closeerr + _getmark dskeofparm + lda dskeof + sta :temp + lda dskopen + jsr writerel + bcs :closeerr + _getmark dskeofparm + _seteof dskeofparm + _close dskclose + stz dskopen + bcc :info + stz dskclose + pha + _close dskclose + pla + jmp :sec +:info lda errorct + beq :info1 +* _delete dskdelete +* jmp :clc +:info1 _getfileinfo dskinfo + bcs :sec + jsr settypes1 + lda #relflag + bit modeflag + beq :set + lda :temp + sta dskaux + stz dskaux+2 +:set _setfileinfo dskinfo + bcs :sec + jmp :clc +:closeerr pha + stz dskclose + _close dskclose + stz dskopen + pla +:sec stz dskpath + plp + sec + rts +:clc stz dskpath + plp + clc + rts +:temp ds 2 +:str str 'Closing file.' + +writedsk phx + phy + php + rep $30 + lda dskopen + beq :nowrt + sta dskwrite + lda objct + beq :nowrt + sta dskreq + stz dskreq+2 + lda objzpptr + sta dskbuff + lda objzpptr+2 + sta dskbuff+2 + _write dskwrite + jcs :dskerr +:nowrt stz objfull + stz objct + pea #$0000 + jmp :xit +:dskerr pha + stz objfull + stz objct + jmp :xit +:xit pla + plp + ply + plx + cmp :one + rts +:one dw $01 + diff --git a/src/asm/asm.errors.s b/src/asm/asm.errors.s new file mode 100644 index 0000000..3666bfe --- /dev/null +++ b/src/asm/asm.errors.s @@ -0,0 +1,219 @@ +dskerror php + rep $30 + sta prodoserr + lda #doserror + jsr asmerror + plp + rts + +asmerror php + rep $30 + sta :errcode + _QAIncTotalErrs + pea 0 + _QAGetWindow + pea $ffff + _QASetWindow + ldx #$00 +]lup lda errtbl,x + beq :unknown + cmp :errcode + beq :found + inx + inx + inx + inx + jmp ]lup +:unknown psl #unknownstr + jmp :draw +:found inx + inx + phk + phk + pla + and #$00ff + pha + lda errtbl,x + pha +:draw _QADrawErrstring + + jsr :gsos + + psl #textstr + _QADrawErrString + lda modeflag + bit #putflag.useflag + beq :line + lda tlinenum + ldx #$00 + jsr printdec + lda #' ' + jsr drawchar + lda #'>' + jsr drawchar +:line lda linenum + ldx #$00 + jsr printdec +:period lda #'.' + jsr drawchar + lda #$0d + jsr drawchar + _QASetWindow + plp + rts +:errcode ds 2 + +:gsos php + rep $30 + lda :errcode + cmp #doserror + jne :xit + ldx #$00 +]lup lda gstbl,x + beq :gsnfound + cmp prodoserr + beq :gfound + inx + inx + inx + inx + jmp ]lup +:gfound inx + inx + lda gstbl,x + tax + phk + phk + pla + and #$00ff + pha + phx + lda #$20 + jsr drawchar + _QADrawErrString + jmp :xit +:gsnfound psl #dosstr + lda #$20 + jsr drawchar + _QADrawErrString + lda prodoserr + jsr prbytel +:xit plp + rts + +gstbl dw $07,gstr1 + dw $10,gstr16 + dw $11,gstr16 + dw $27,gstr2 + dw $28,gstr3 + dw $2b,gstr4 + dw $2e,gstr5 + dw $2f,gstr6 + dw $40,gstr7 + dw $44,gstr8 + dw $45,gstr9 + dw $46,gstr10 + dw $47,gstr11 + dw $48,gstr12 + dw $49,gstr12 + dw $4e,gstr13 + dw $50,gstr13 + dw $51,gstr17 + dw $52,gstr19 + dw $57,gstr18 + dw $201,gstr14 + + dw filemismatch,gstr15 ;error $5C + dw badsav,str25 + dw $0000,$0000 + +errtbl dw badlable,str2 + dw undeflable,str3 + dw duplable,str4 + dw misalignment,str5 + dw badoperand,str6 + dw notmacro,str7 + dw badopchar,str8 + dw badconditional,str9 + dw badaddress,str10 + dw badbranch,str11 + dw forwardref,str12 + dw twoexternals,str13 + dw badrelative,str14 + dw saneerror,str29 + dw evaltoocomplex,str30 + + dw objectfull,str15 + dw symfull,str16 + dw memfull,str17 + dw badput,str18 + dw doserror,str19 + dw relfull,str20 + dw usererror,str21 + dw macrofull,str22 + dw badmacro,str23 + dw nesterror,str24 + dw badsav,str25 + dw badopcode,str26 + dw $201,str27 + dw badinput,str28 + dw relfilefull,str31 + + dw $0000,$0000 + + +str2 str 'Bad label' +str3 str 'Undefined label' +str4 str 'Duplicate label' +str5 str 'Misalignment' +str6 str 'Bad operand' +str7 str 'Not a macro' +str8 str 'Illegal char in operand' +str9 str 'Bad conditional' +str10 str 'Bad address mode' +str11 str 'Bad branch' +str12 str 'Illegal forward reference' +str13 str 'Two externals' +str14 str 'Illegal relative address' +str15 str 'Object space overflow' +str16 str 'Symbol table full' +str17 str 'Memory full' +str18 str 'Bad PUT/USE' +str19 str 'GS/OS error:' +str20 str 'Relocation dictionary full' +str21 str 'Break' +str22 str 'Macro table full' +str23 str 'Bad macro' +str24 str 'Nesting error' +str25 str 'Bad SAV/DSK' +str26 str 'Bad opcode' +str27 str 'Out of Memory' +str28 str 'Bad input' +str29 str 'SANE error' +str30 str 'Expression too complex' +str31 str 'REL file too large' + +gstr1 str 'GS/OS is busy' +gstr2 str 'I/O error' +gstr3 str 'No device connected' +gstr4 str 'Write protected' +gstr5 str 'Disk switched' +gstr6 str 'No disk in drive' +gstr7 str 'Invalid pathname' +gstr8 str 'Directory not found' +gstr9 str 'Volume not found' +gstr10 str 'File not found' +gstr11 str 'Duplicate filename' +gstr12 str 'Disk full' +gstr13 str 'File locked' +gstr14 str 'Memory manager: Unable to allocate memory' +gstr15 str 'File type mismatch' +gstr16 str 'Device not found' +gstr17 str 'Volume damaged' +gstr18 str 'Duplicate volume online' +gstr19 str 'Not ProDOS (GS/OS) volume' +unknownstr str 'Unknown error' +codestr str ' Code=$' +textstr str ' in line: ' +dosstr str 'GS/OS Error: ' + diff --git a/src/asm/asm.eval.s b/src/asm/asm.eval.s new file mode 100644 index 0000000..54bd04b --- /dev/null +++ b/src/asm/asm.eval.s @@ -0,0 +1,1441 @@ +noop = %0000_0000_0000_0000 +rightbrace = %0100_0001_0000_0001 +gt = %1000_0010_0001_0010 +lt = %1000_0011_0010_0010 +eq = %1000_0100_0100_0010 +noteq = %1000_0101_1000_0010 +plusop = %1000_0110_0000_0011 +minusop = %1000_0111_0000_0011 +multop = %1000_1000_0000_0100 +divop = %1000_1001_0000_0100 +modop = %1000_1010_0000_0100 +evandop = %1000_1011_0000_0101 +evorop = %1000_1100_0000_0101 +eveorop = %1000_1101_0000_0101 +negateop = %0010_1110_0000_0110 +leftbrace = %0100_1111_0000_0111 + +levelmask = %0000_0000_0000_1111 +flagmask = %0000_0000_1111_0000 +mask = %1111_1111_1111_0000 +bracemask = %0100_0000_0000_0000 +negatemask = %0010_0000_0000_0000 + +eval php + rep $30 + txa + and #$ff + tax + sep $20 + ldy #$00 + sty evalrelok + sty shiftct + sty evallevel + stz notfound ;8 bit value + sty lvalue + sty lvalue+2 + sty noshift + sty noshift+2 + lda #$ff + sta lableused + sta lableused+1 + sta allmath + sta allmath+1 + stx offset ;save our offset + txy ;put starting offset in Y + sep $20 +]lup lda (lineptr),y + cmp #' ' ;flush out all leading spaces + blt :badop1 + bne :start + iny + jmp ]lup +:badop1 pea #badoperand ;push error code on stack + jmp :error + +:imedflag ds 2 + +:start ldx #%00001111 + stx :imedflag +:start1 cmp #'#' ;check for + beq :nexty0 + cmp #',' + beq :nexty1 + cmp #'(' + beq :nexty + cmp #'[' + beq :nexty + jmp :shiftop +:nexty0 rol :imedflag +:nexty1 iny + lda (lineptr),y + cmp #' '+1 + blt :badop1 + jmp :start1 +:nexty iny + lda (lineptr),y + cmp #' '+1 + blt :badop1 +:shiftop xba + lda :imedflag + bit #%00010000 + beq :nshift + xba + bit :imedflag + bvs :main1 + cmp #'^' + beq :shift16 + cmp #'<' + beq :shift0 + cmp #'>' + beq :shift8 + jmp :main1 +:nshift xba + cmp #'|' + beq :shift0 + cmp #'!' + beq :shift0 + cmp #'>' + beq :shift0 + cmp #'<' + beq :shift0 + jmp :main1 +:shift8 lda #8 + sta shiftct + jmp :shift0 +:shift16 lda #16 + sta shiftct +:shift0 iny +:main lda (lineptr),y + cmp #' '+1 + blt :badop1 +:main1 rep $20 + stz xreg + stz yreg + stz xreg+2 + stz yreg+2 + stz estack + stz op + stz top + stz bracevalid + lda #$ffff + sta xrel + sta yrel + sta zrel + sty offset + lda #$8000 + sta number + +:loop rep $30 + ldy offset + jsr getnum + bcc :4 + sta :err+1 + jmp :err +:4 sty offset + bvc :operand + +:number bit number + bmi :numok + pea #badoperand + jmp :error +:numok lsr number + ldy evallevel + beq :numsta + sec + ror bracevalid ;left braces no longer valid +:numsta sta xreg ;save the values in the x register + stx xreg+2 + lda zrel + sta xrel + jmp :loop ;go back for more + +:operand cmp #noop ;no operation OK + beq :opok + + bit #bracemask + beq :chk + + cmp #leftbrace + bne :r + + bit bracevalid + bpl :opok + pea #badopchar + jmp :error + +:r cmp #rightbrace + bne :chk + + bit bracevalid + bmi :opok + pea #badopchar + jmp :error + +:chk bit number ;are we expecting an operand? + bpl :opok + + cmp #negateop ;we can get a NEGATE op if + beq :opok ;waiting for a number + + pea #badoperand + jmp :error + +:opok sta top ;store in temporary op + + and #$8000 ;should we shift brace flag + beq :testops ;and number flag? + lsr bracevalid ;clear high bit + sec + ror number ;set high bit + +:testops bit evalrelok + bpl :check + jmp :alldone ;error will be found by xit routine + +:check lda #algflag + bit modeflag+1 + bne :test + ldx evallevel + bne :test + lda top + and #bracemask.negatemask + bne :test + jmp :l2r +:test lda top + beq :checkstack +:test1 lda op + and #levelmask + sta opmask + lda top + and #levelmask + cmp opmask + blt :checkstack + beq :eqexecute + +:push jsr pushstack + bcc :push1 + sta :err+1 + jmp :err +:push1 lda top + cmp #leftbrace + bne :push2 + stz xreg + stz xreg+2 + lda #$ffff + sta xrel + inc evallevel + lda #rightbrace + sta top +:push2 lda top + sta op + lda xreg + sta yreg + lda xreg+2 + sta yreg+2 + lda xrel + sta yrel + jmp :loop +:eqexecute lda op + beq :push2 + cmp #rightbrace + beq :pulllevel + cmp #negateop + beq :push + jsr execute + jmp :push2 ;lda top +:pulllevel jsr execute + dec evallevel + jsr pullstack + jcc :loop + pha + jmp :error + +:l2r lda op + beq :noexec ;anything to do? + jsr execute +:noexec lda top + bne :push2 + jmp :noexec1 + +:checkstack + lda op + beq :noexec1 + jsr execute +:noexec1 lda estack + beq :checkdone + jsr pullstack + bcc :pull1 + sta :err+1 + jmp :err +:pull1 lda op + cmp #negateop + beq :checkstack + jmp :testops + +:checkdone stz op + lda top + beq :alldone + jmp :loop +:alldone bit evalrelok + bpl :done1 + pea #badrelative + jmp :error +:done1 lda evallevel + beq :store + lda #badoperand + jmp :errplp +:store lda xreg + sta noshift + sta lvalue + lda xreg+2 + sta lvalue+2 + sta noshift+2 + lda xrel + sta lableused + ldx shiftct + beq :noerr +]lup lsr lvalue+2 + ror lvalue + dex + bne ]lup +:noerr rep $30 + lda #$00 + jmp :errplp +:err pea $0000 +:error rep $30 +:errpla pla +:errplp rep $30 + bit notfound-1 + bpl :getx + lda #undeflable +:getx ldx offset + and #$ff + plp + cmp :one + rts +:one dw $01 + + +execute php + rep $30 + lda op + and #flagmask + beq :noflags + plp + jmp doflags +:noflags lda op + xba + and #$0f + asl + tax + plp + jmp (:tbl,x) +:tbl dw :rts ;noop + dw doright ;rightbrace + dw doflags ;GT + dw doflags ;LT + dw doflags ;EQ + dw doflags ;notEQ + dw doplus + dw dominus + dw domult + dw dodiv + dw domod + dw doand + dw door + dw doeor + dw donegate + dw doleft + dw :rts ;just in case +:rts rts + +doflags php + rep $30 + stz :yext + stz :xext + lda op ;get the opflags + and #flagmask ;clear any unneeded bits + sta :myflags ;save it + cmp #gt.lt.eq&flagmask ;is it <=>? + jeq :true ;yes so must be true + + lda xrel + bmi :y + cmp #$7fff + beq :y + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #26 + lda [lableptr],y + bit #externalbit + beq :y + dec :xext +:y lda yrel + bmi :test + cmp #$7fff + beq :test + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #26 + lda [lableptr],y + bit #externalbit + beq :test + dec :yext +:test lda :myflags + cmp #gt.lt&flagmask is + bne :stz + lda :myflags + and #gt.lt&flagmask!$FFFF ;clear <> flags + ora #noteq&flagmask ;set not = flag + sta :myflags + +:stz stz :flags + lda yreg + cmp xreg + bne :noteq + lda yreg+2 + cmp xreg+2 + bne :noteq + lda #eq&flagmask + tsb :flags ;tell us it's equal + jmp :xit +:noteq lda #noteq&flagmask ;tell us it's not = + tsb :flags +:trylt lda yreg+2 ;check the signs of the values + eor xreg+2 + bmi :diff + lda yreg + sec + sbc xreg + lda yreg+2 + sbc xreg+2 + bcc :lt + bra :gt +:diff lda yreg+2 + bmi :lt + bra :gt +:lt lda #lt&flagmask + tsb :flags + bra :xit +:gt lda #gt&flagmask + tsb :flags +:xit lda :myflags + cmp #lt&flagmask + beq :lt1 + cmp #gt&flagmask + beq :gt1 + lda :xext + ora :yext + beq :newxit +:bad sec + ror evalrelok + jmp :false +:lt1 lda :xext + ora :yext + beq :newxit + lda :xext + beq :lt2 + lda yreg + cmp #$100 + bne :bad + lda yreg+2 + bne :bad + jmp :newxit +:lt2 lda xreg + cmp #$100 + bne :bad + lda xreg+2 + bne :bad + jmp :newxit +:gt1 lda :xext + ora :yext + beq :newxit + lda :xext + beq :gt2 + lda yreg + cmp #$FF + bne :bad + lda yreg+2 + bne :bad + jmp :newxit +:gt2 lda xreg + cmp #$FF + bne :bad + lda xreg+2 + bne :bad +:newxit lda :flags + and :myflags + beq :false +:true rep $30 + lda #$01 + sta xreg + stz xreg+2 + plp + clc + rts +:false rep $30 + stz xreg + stz xreg+2 + plp + clc + rts +:myflags ds 2 +:flags ds 2 +:yext ds 2 +:xext ds 2 + +donegate php + rep $30 + lda xreg+2 + eor #$ffff + tax + lda xreg + eor #$ffff + inc + bne :sta + inx +:sta sta xreg + stx xreg+2 + plp + rts + +doright +doleft rts + +doplus php + rep $30 + lda xrel + ora yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + lda yreg + clc + adc xreg + sta xreg + lda yreg+2 + adc xreg+2 + sta xreg+2 + plp + rts + +dominus php + rep $30 + + do 0 + lda xrel + jsr prbytel + lda #$20 + jsr drawchar + lda yrel + jsr prbytel + lda #$20 + jsr drawchar + fin + +:lda lda yreg + sec + sbc xreg + sta xreg + lda yreg+2 + sbc xreg+2 + sta xreg+2 + + lda yrel ;were either relative? + and xrel + bmi :plp ;if neither exit + lda yrel ;was just one a relative? + eor xrel + bmi :xrel + lda #$ffff + jmp :sta +:xrel lda yrel + bmi :plp + +:sta sta xrel +:plp + do 0 + lda xrel + jsr prbytel + lda #$20 + jsr drawchar + lda yrel + jsr prbytel + lda #$0d + jsr drawchar + fin + plp + rts + +door php + rep $30 + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + lda yreg + ora xreg + sta xreg + lda yreg+2 + ora xreg+2 + sta xreg+2 + plp + rts +doand php + rep $30 + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + lda yreg + and xreg + sta xreg + lda yreg+2 + and xreg+2 + sta xreg+2 + plp + rts +doeor php + rep $30 + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + lda yreg + eor xreg + sta xreg + lda yreg+2 + eor xreg+2 + sta xreg+2 + plp + rts + +domult php + rep $30 + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + stz val + stz val+$2 + lda yreg + sta myvalue + lda yreg+2 + sta myvalue+2 + ldx #32 +:mloop lsr xreg+$2 + ror xreg + bcc :noadd + lda myvalue + clc + adc val + sta val + lda myvalue+$2 + adc val+$2 + sta val+$2 +:noadd asl myvalue + rol myvalue+$2 + dex + bne :mloop + lda val + sta xreg + lda val+$2 + sta xreg+$2 + plp + rts + +dodiv php + rep $30 + + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + psl #$00 + psl #$00 + lda yreg+2 + pha + lda yreg + pha + lda xreg+2 + pha + lda xreg + pha + tll $0d0b + pla + sta xreg + pla + sta xreg+2 + pla + pla + plp + rts + +domod php + rep $30 + + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + psl #$00 + psl #$00 + lda yreg+2 + pha + lda yreg + pha + lda xreg+2 + pha + lda xreg + pha + tll $0d0b + pla + pla + pla + sta xreg + pla + sta xreg+2 + plp + rts + + +pushstack php + rep $30 + lda estack + cmp #40 + bge :err + asl + asl + asl + tax + lda yreg + sta evalstack,x + lda yreg+2 + sta evalstack+2,x + lda op + sta evalstack+4,x + lda yrel + sta evalstack+6,x + inc estack + plp + clc + rts +:err lda #evaltoocomplex + plp + sec + rts + +pullstack php + rep $30 + lda estack + beq :err + dec + sta estack + asl + asl + asl + tax + lda evalstack,x + sta yreg + lda evalstack+2,x + sta yreg+2 + lda evalstack+4,x + sta op + lda evalstack+6,x + sta yrel + plp + clc + rts +:err lda #evaltoocomplex + plp + sec + rts + + +getnum php + rep $30 + lda #$FFFF + sta zrel +:nextch lda (lineptr),y + and #$7f + cmp #' '+1 + bge :jmp +:noop pea #noop + jmp :operand +:operandiny iny +:operand rep $30 + pla + plp + rep $41 + rts +:number plp + sep $40 + clc + rts +:error rep $30 + pla + plp + sec + rts + + +:jmp pha + sec + sbc #' ' + asl + tax + pla + jmp (:chartbl,x) + +:flags stz :flag+1 + cmp #'#' + beq :noteq +:fl1 rep $20 + sec + sbc #'<' + asl + tax + lda :flagtbl,x + tsb :flag+1 +:fl2 iny + sep $20 + lda (lineptr),y + cmp #'#' + beq :noteq + cmp #'<' + blt :flag + cmp #'>'+1 + blt :fl1 +:flag pea $0000 + jmp :operand +:noteq rep $20 + lda #noteq + tsb :flag+1 + jmp :fl2 +:flagtbl dw #lt + dw #eq + dw #gt + +:left pea #leftbrace + jmp :operandiny +:minus bit number + bmi :negate + pea #minusop + jmp :operandiny +:negate pea #negateop + jmp :operandiny +:mult bit number + jmi :lable + pea #multop + jmp :operandiny +:plus bit number + bpl :plus1 + iny + jmp :nextch +:plus1 pea #plusop + jmp :operandiny +:mod sty offset + pea #modop + jmp :operandiny +:div ldy offset + iny + lda (lineptr),y + and #$7f + cmp #'/' + beq :mod + dey +:divit pea #divop + jmp :operandiny +:eor pea #eveorop + jmp :operandiny +:or pea #evorop + jmp :operandiny +:and pea #evandop + jmp :operandiny +:checkop bit number + bpl :chkno +:golab jmp :lable +:chkno pea #noop + jmp :operandiny +:right bit number + bmi :golab + pea #rightbrace + jmp :operandiny + +:badop pea #badoperand + jmp :error +:bad +:badchar pea #badopchar + jmp :error +:chartbl + dw $0000 ; + dw :eor ;! + dw :ascii ;" + dw :flags ;# + dw :hex ;$ + dw :binary ;% + dw :and ;& + dw :ascii ;' + dw :bad ;( + dw :checkop ;) + dw :mult ;* + dw :plus ;+ + dw :noop ;, + dw :minus ;- + dw :or ;. + dw :div ;/ + dw :decimal ;0 + dw :decimal ;1 + dw :decimal ;2 + dw :decimal ;3 + dw :decimal ;4 + dw :decimal ;5 + dw :decimal ;6 + dw :decimal ;7 + dw :decimal ;8 + dw :decimal ;9 + dw :lable ;: + dw :noop ;; + dw :flags ;< + dw :flags ;= + dw :flags ;> + dw :lable ;? + dw :lable ;@ + dw :lable ;A + dw :lable ;B + dw :lable ;C + dw :lable ;D + dw :lable ;E + dw :lable ;F + dw :lable ;G + dw :lable ;H + dw :lable ;I + dw :lable ;J + dw :lable ;K + dw :lable ;L + dw :lable ;M + dw :lable ;N + dw :lable ;O + dw :lable ;P + dw :lable ;Q + dw :lable ;R + dw :lable ;S + dw :lable ;T + dw :lable ;U + dw :lable ;V + dw :lable ;W + dw :lable ;X + dw :lable ;Y + dw :lable ;Z + dw :lable ;[ + dw :lable ;\ + dw :checkop ;] + dw :lable ;^ + dw :lable ;_ + dw :lable ;` + dw :lable ;a + dw :lable ;b + dw :lable ;c + dw :lable ;d + dw :lable ;e + dw :lable ;f + dw :lable ;g + dw :lable ;h + dw :lable ;i + dw :lable ;j + dw :lable ;k + dw :lable ;l + dw :lable ;m + dw :lable ;n + dw :lable ;o + dw :lable ;p + dw :lable ;q + dw :lable ;r + dw :lable ;s + dw :lable ;t + dw :lable ;u + dw :lable ;v + dw :lable ;w + dw :lable ;x + dw :lable ;y + dw :lable ;z + dw :left ;{ + dw :lable ;| + dw :right ;} + dw :lable ;~ + dw :lable ; + + +:hex rep $20 + stz val + stz val+2 + stz :valid + sep $20 + iny + lda (lineptr),y + cmp #' '+1 + blt :hexbad +]lup sep $20 + lda (lineptr),y + cmp #'0' + blt :hexout + cmp #'9'+1 + blt :hexdig + cmp #'A' + blt :hexout + cmp #'Z'+1 + blt :hexdiga + cmp #'a' + blt :hexout + cmp #'z'+1 + bge :hexout + and #$5f +:hexdiga sec + sbc #$37 + jmp :hdig +:hexdig sec + sbc #$30 +:hdig sec + ror :valid+1 + rep $20 + and #$0f + asl val + rol val+2 + asl val + rol val+2 + asl val + rol val+2 + asl val + rol val+2 + tsb val + +:hexiny iny + jmp ]lup +:hexout rep $20 + bit :valid + bpl :hexbad + jmp :numout +:hexbad pea #badopchar + jmp :error +:valid ds 2 + +:binary rep $20 + stz val + stz val+2 + stz :valid + sep $20 + iny + lda (lineptr),y + cmp #' '+1 + blt :binbad +]lup sep $20 + lda (lineptr),y + cmp #'_' + beq :biny + cmp #'0' + blt :binout + cmp #'1'+1 + bge :binout + lsr + rep $20 + rol val + rol val+2 + sec + ror :valid +:biny iny + jmp ]lup +:binout rep $20 + bit :valid + bpl :binbad + jmp :numout +:binbad pea #badopchar + jmp :error + +:decimal rep $20 + ldx #$00 + stz val ;past 1st digit... + stz val+$2 + sep $20 +:dlup lda (lineptr),y + cmp #'0' + blt :ddec + cmp #'9'+$1 + bge :ddec +:ddig sta :valstr+$1,X + iny + inx + cpx #10 + blt :dlup +:ddec phy + txy + rep $20 + beq :ddone + lda #cnvttbl + sta deczp +:dloop lda :valstr,x + and #$000F + asl + asl + tay + lda (deczp),Y + adc val + sta val + iny + iny + lda (deczp),Y + adc val+$2 + sta val+$2 + lda deczp + clc + adc #40 + sta deczp + dex + bne :dloop +:ddone rep $20 + ply + jmp :numout + +:ascii sep $20 + sta :deliminator + stz :orflag + iny + cmp #$27 + bge :asclda + sec + ror :orflag +:asclda lda (lineptr),y + cmp #' ' + blt :ascbad + iny + cmp :deliminator + beq :asczero + xba + lda (lineptr),y + cmp #' ' + blt :ascbad + cmp :deliminator + beq :asc1 + xba + tax + iny + lda (lineptr),y + cmp :deliminator + bne :ascbad + rep $20 + txa + xba + sep $20 +:asc2 ora :orflag + xba + ora :orflag + iny + rep $20 + ldx #$00 + jmp :number +:asc1 xba + iny + rep $20 + and #$ff + ora :orflag + ldx #$00 + jmp :number +:asczero rep $20 + ldx #$00 + txa + jmp :number +:ascbad pea #badopchar + jmp :error + +:deliminator ds 2 +:orflag ds 2 + +:lable rep $20 + stz allmath + stz val + stz val+2 + sep $20 + lda (lineptr),y + cmp #'*' + beq :pc + xba + lda #ifflag + bit modeflag+1 + php + xba + plp + beq :mxcont + cmp #'M' + beq :mx + cmp #'m' + beq :mx + cmp #'X' + beq :xc + cmp #'x' + beq :xc +:mxcont jmp :lsta +:mx phy + iny + lda (lineptr),y + and #$5F + cmp #'X' + bne :nomx + iny + lda (lineptr),y + cmp #'>'+1 + bge :nomx + cmp #'<' + bge :mx1 + cmp #'/'+$1 + bge :nomx +:mx1 jmp :domx ;y still on stack! +:nomx ply + lda (lineptr),y + jmp :lsta +:xc phy + iny + lda (lineptr),y + and #$5F + cmp #'C' + bne :nomx + iny + lda (lineptr),y + cmp #'>'+1 + bge :nomx + cmp #'<' + bge :xc1 + cmp #'/'+$1 + bge :nomx +:xc1 jmp :doxc ;y still on stack! +:pc iny + rep $30 + lda lineobjptr + sta val + lda lineobjptr+$2 + sta val+$2 + lda modeflag + bit #relflag + beq :pcsep +* bit #dumflag +* bne :pcsep + lda orgor + ora dumor ;* operand in ORG section of rel absolute + bmi :pcsep + lda #$7fff + sta zrel +:pcsep sep $20 + sty :next + jmp :lbxit + +:lsta ldx #$00 +]lup lda (lineptr),y + cmp #'0' + blt :lxit + cmp #'<' + blt :iny + cmp #'>'+1 + blt :lxit + cmp #'}' + beq :brace + cmp #']' + bne :iny + cpx #$00 + bne :lxit + jmp :iny +:brace lda evallevel + bne :lxit +* lda evallevel ;don't need to do this here +* bne :lxit ;unless level>256 + lda #'}' +:iny cpx #$0f + bge :iny1 + sta labstr+1,x +:iny1 iny + inx + jmp ]lup +:lxit txa + cmp #$0f+1 + blt :lx + lda #$0f +:lx sta labstr + sty :next + jsr findlabval + bcs :lfound + rep $30 + ldy passnum + bne :errlab + sep $20 + lda #$FF + sta notfound + rep $20 + jmp :lbxit +:errlab lda #undeflable + jmp :errxit +:lfound rep $30 + ldy #26 + lda [lableptr],y + pha + ldy #16 + lda [lableptr],y + pha + ldy #26 + lda [lableptr],y + ora #$2000 ;indicate used! + sta [lableptr],y + pla + ldx #$01 + jsr xref + pla + and #$dfff + cmp #$8080 ;Macro??? + bne :lbmi + lda #undeflable + jmp :errxit +:lbmi and #$8000 + bne :lsta1 + lda modeflag + bit #relflag + beq :labcont + bit #dumflag + bne :labcont + ldy #16 + lda [lableptr],y + sta zrel + +:labcont rep $30 +:lsta1 ldy #28 + lda [lableptr],y + sta val + ldy #30 + lda [lableptr],y + sta val+2 + jmp :lbxit + + mx %10 +:domx sty :next + ply + lda mxflag + and #%11000000 + asl + rol + rol + sta val + jmp :lbxit +:doxc sty :next + ply + lda xcflag + and #%11000000 + asl + rol + rol + sta val +:lbxit ldy :next + +:numout rep $30 +:lda lda val + ldx val+2 + +:clc jmp :number + +:errxit +:sec rep $30 + pha + jmp :error + +:valstr ds 16,0 +:next ds 2 + +evalstack ds 40*8 + +cnvttbl adrl 0,1,2,3,4,5,6,7,8,9 + adrl 0,10,20,30,40,50,60,70,80,90 + adrl 0,100,200,300,400,500,600,700,800,900 + adrl 0,1000,2000,3000,4000,5000,6000,7000,8000,9000 + adrl 0,10000,20000,30000,40000,50000,60000,70000,80000,90000 + adrl 0,100000,200000,300000,400000,500000,600000,700000,800000 + adrl 900000 + adrl 0,1000000,2000000,3000000,4000000,5000000,6000000,7000000 + adrl 8000000,9000000 + adrl 0,10000000,20000000,30000000,40000000,50000000,60000000 + adrl 70000000,80000000,90000000 + adrl 0,100000000,200000000,300000000,400000000,500000000 + adrl 600000000,7000000000,800000000,900000000 + adrl 0,1000000000,2000000000,3000000000,4000000000,5000000000 + adrl 6000000000,7000000000,8000000000,900000000 + diff --git a/src/asm/asm.header.s b/src/asm/asm.header.s new file mode 100644 index 0000000..6b87974 --- /dev/null +++ b/src/asm/asm.header.s @@ -0,0 +1,481 @@ + lst off + ;cas in + tr on + exp only + + rel + xc + xc + mx %00 ; make sure we're in 16-bit mode! + + ;use util.macs + use qatools.macs + use ../data/qa.equates + + brl start + +userid ds 2 ;my userid +message ds 2 +subtype ds 4 +asmdp ds 2 + +filename ds 130,0 +txttypes hex 0204B0 + +start php + phb + phd + phk + plb + rep $30 + sta userid + tdc + sta asmdp + pea 0 + _QAStatus + pla + bne :ok + pld + plb + plp + rep $30 + jsl prodos + dw $29 + adrl :quit +:quit adrl $00 + dw $00 + +:ok rep $30 + stz prodoserr + + pea 0 + psl #$00 + lda userid + pha + _QAGetMessagebyID + pll subtype + pla + sta message + beq :0 + cmp #maxamessage + blt :call + lda #$FFFF + jmp :xit +:0 lda #$00 + jmp :xit +:call dec + asl + tax + jsr (:tbl,x) +:xit rep $30 + pha + lda userid + ora #asmmemid + pha + _disposeall + pla + pld + plb + plp + cmpl :one + rtl +:one dw $01 + +:tbl dw cmdline ;parsecmdline + dw txtfile + dw loadedfile + +loadedfile php + rep $30 + psl #asmstr + _QADrawString + lda #'.' + jsr drawchar + lda #$0d + jsr drawchar + jsr drawchar + ldx subtype + ldy subtype+2 + jsl asm + bcc :clc +:sec rep $30 + plp + sec + rts +:clc plp + clc + rts + +txtfile php + rep $30 + psl #pathname + _QAGetPath + lda pathname + and #$ff + jeq :notfound + tay + sep $20 +]lup lda pathname,y + tyx + sta filename,x + dey + bpl ]lup + rep $30 + + psl #$00 + psl #filename + psl #$00 ;filepos + psl #-1 ;whole file + psl #txttypes + lda userid + ora #asmmemid + pha + psl #$00 + pea $8000 + _QALoadfile + plx + ply + jcs :sec + phx + phy + psl #asmstr + _QADrawString + lda #' ' + jsr drawchar + psl #filename + _QADrawString + lda #$0d + jsr drawchar + jsr drawchar + ply + plx + jsl asm + bcc :clc + jmp :sec +:notfound rep $30 + lda #$46 ;file not found error +:sec rep $30 + plp + sec + rts +:clc rep $30 + lda #$00 + plp + clc + rts + +cmdline php + rep $30 + stz pathname + psl #pathname + pea 80 + _QAGetCmdLine + ldy #$01 + sep $30 + lda pathname + beq :notfound +]lup lda pathname,y + and #$7f + cmp #' ' + blt :notfound + bne :p1 + iny + jmp ]lup +:p1 iny +]lup lda pathname,y + and #$7f + cmp #' ' + blt :notfound + beq :p2 + iny + jmp ]lup +:p2 iny +]lup lda pathname,y + and #$7f + cmp #' ' + blt :notfound + bne :ok + iny + jmp ]lup +:ok ldx #$00 + sta filename+1,x +]get inx + iny + lda pathname,y + and #$7f + cmp #' '+1 + blt :set + sta filename+1,x + jmp ]get +:notfound jmp :nf1 +:set txa + sta filename + rep $30 + lda filename + and #$ff + cmp #62 + bge :nosuff + tax + lda filename,x + and #$7f + cmp #'/' + beq :nosuff + inx + lda #'.S' + sta filename,x + inx + txa + sep $20 + sta filename + +:nosuff rep $30 + psl #$00 + psl #filename + psl #$00 ;filepos + psl #-1 ;whole file + psl #txttypes + lda userid + ora #asmmemid + pha + psl #$00 + pea $8000 + _QALoadfile + plx + ply + bcs :xit + phy + phx + psl #asmstr + _QADrawString + lda #' ' + jsr drawchar + psl #filename + _QADrawString + lda #$0d + jsr drawchar + jsr drawchar + plx + ply + jsl asm + bcc :clc1 + jmp :xit +:nf1 rep $30 + lda #$46 + sec + jmp :xit +:clc1 rep $30 + lda #$0000 +:xit rep $30 + plp + cmpl :one + rts +:one dw $01 + +asmstr str 0d,'Assembling' + +prbytel + php + rep $30 + phy + phx + pha + pha + _QAPrbytel + pla + plx + ply + plp + rts + +prbyte + php + rep $30 + phy + phx + pha + pha + _QAPrbyte + pla + plx + ply + plp + rts + + +drawchar php + rep $30 + phx + phy + pha + and #$7f + pha + _QADrawChar +:plp pla + ply + plx + plp + rts + + +printdec php + rep $30 + phx + pha + psl #:str + pea #11 + pea $00 + tll $270b + sep $30 + ldy #$00 + ldx #$00 +]lup lda :str,x + and #$7f + cmp #' ' + beq :inx + cmp #'0' + bne :draw + cpx #10 + bge :draw + cpy #$00 + beq :inx +:draw phy + phx + rep $30 + jsr drawchar +* pha +* tll $180c + sep $30 + plx + ply + iny +:inx inx + cpx #11 + blt ]lup + plp + rts +:str ds 12,0 + +drawlable php + rep $30 + pea $00 + tdc + clc + adc #labstr + pha + _QADrawString + lda #$0d + jsr drawchar + plp + rts + +random php ;save environment + phb + phk + plb + rep %00111001 + ldx indexi + ldy indexj + lda array-2,x + adc array-2,y + sta array-2,x + dex + dex + bne :dy + ldx #17*2 ;cycle index if at end of +:dy dey ; the array + dey + bne :setix + ldy #17*2 +:setix stx indexi + sty indexj + plb + plp + rts + +indexi da 17*2 ;the relative positions of +indexj da 5*2 ; these indexes is crucial + +array da 1,1,2,3,5,8,13,21,54,75,129,204 + da 323,527,850,1377,2227 + + err *-array-34 + +*================================================= +* SEED seeds generator from 16 bit contents of AXY +*------------------------------------------------- + +seed php + rep %00110000 +seed2 phb + phk + plb + pha + ora #1 ;at least one must be odd + sta array + stx array+2 + phx ;push index regs on stack + phy + ldx #30 +]lup sta array+2,x + dex + dex + lda 1,s ;was y + sta array+2,x + dex + dex + lda 3,s ;was x + sta array+2,x + lda 5,s ;original a + dex + dex + bne ]lup + lda #17*2 + sta indexi ;init proper indexes + lda #5*2 ; into array + sta indexj + jsr random ;warm the generator up. + jsr random + ply ;replace all registers + plx + pla + plb + plp + rts + +*================================================= +* RANDOMIZE seed generator from system clock. +* Assumes Misc Toolset active. +*------------------------------------------------- + +randomize php + rep %00110000 + lda #0 + pha + pha + pha + pha + ldx #$D03 ;readtimehex + jsl $E10000 + pla + plx + ply + sta 1,s ;trick to pull last word + pla ; fm stack without ruining + bra seed2 ; the previous ones. + + put asm.vars + put asm.1 + put asm.eval + put asm.cond + put asm.opcodes + put asm.dsk + put asm.errors + put ../data/opdata + + lst + chk + lst off + + ;typ exe + ;sav utility/qasmgs.l + diff --git a/src/asm/asm.opcodes.s b/src/asm/asm.opcodes.s new file mode 100644 index 0000000..1b0e87b --- /dev/null +++ b/src/asm/asm.opcodes.s @@ -0,0 +1,4673 @@ + mx %00 +dobranch + lda opdata + bit #$800 + jne :long + lda #$02 + ldy passnum + jeq :p1 + ldx #$00 + jsr eval + bcc :offset + jmp :errput2 +:offset lda objptr + clc + adc #$02 + sta workspace + lda lvalue + sec + sbc workspace + sta lvalue + cmp #127+1 ;positive allowed + blt :pass + cmp #$FF80 ;negative allowed + bge :pass + lda #badbranch + jmp :errput2 +:pass lda opdata + jsr putopcode + lda lvalue + jsr putbyte + lda #branchlst + tsb listflag+1 + lda #cycflag + bit modeflag+1 + beq :clc + lda opdata + bit #$400 + bne :clc + sep $30 + bit cycflags + bvc :noavg + inc cycleavg ;put in avg code here + lda cycleavg + and #$01 + beq :inc + jmp :clc +:noavg inc cyclemarks + jmp :clc +:inc sed + lda linecycles + clc + adc #$01 + sta linecycles + cld +:clc rep $30 + clc + rts +:errput3 rep $30 + pha + lda #$00 + jsr putbyte + pla +:errput2 rep $30 + pha + lda #$00 + jsr putbyte + lda #$00 + jsr putbyte + pla + sec + rts +:long lda #$03 + ldy passnum + beq :p1 + ldx #$00 + jsr eval + bcc :offset1 + jmp :errput3 +:offset1 lda objptr + clc + adc #$03 + sta workspace + lda lvalue + sec + sbc workspace + sta lvalue + lda opdata + jsr putopcode + lda lvalue + jsr putbyte + lda lvalue+1 + jsr putbyte + lda #lbranchlst + tsb listflag+1 + clc + rts +:p1 jmp incobjptr + + + + mx %00 +brkop lda #$00 + jmp implied2 +copop lda #$02 + jmp implied2 +wdmop lda #$42 +implied2 jsr putopcode + jsr addmode + bit #amacc + bne :zero + and #ammask + cmp #$0000 + bne :bad + lda passnum + beq :ok + ldx #$00 + jsr eval + bcc :ok + rts +:ok lda lvalue + jsr putbyte +:zero jmp relcorrect +:bad lda #badaddress + sec + rts + +jmpop rep $30 + jsr addmode + bcc :ok + rts +:ok sep $30 + bit #amforce24.amsquare + jne jmlop + and #amforce24.amforce16.amforce8!$FFFF + cmp #$00 + beq :4c + cmp #amround + beq :6c + cmp #amround.amxindex + bne :bad + lda xcflag + and #%11000000 + beq :bad + lda #$7c + jmp :put +:4c lda #$4c + jmp :put +:6c lda #$6c +:put jsr putopcode + lda passnum + beq :ok1 + rep $30 + ldx #$00 + jsr eval + bcc :ok1 + rts +:ok1 sep $30 + lda lvalue + jsr putbyte + lda lvalue+1 + jsr putbyte + rep $30 + jmp relcorrect +:bad rep $30 + lda #badaddress + sec + rts + +jmlop rep $30 + lda xcflag + and #%01000000 + beq :bad + jsr addmode + bcc :ok + rts +:ok and #amforce24.amforce16.amforce8!$FFFF + cmp #$00 + beq :5c + cmp #amsquare + beq :dc + cmp #amround + beq :dc + jmp :bad +:5c lda #$5c + jmp :put +:dc lda #$dc +:put sta :mode + jsr putopcode + ldy passnum + beq :ok1 + ldx #$00 + jsr eval + bcc :ok1 + rts +:ok1 lda lvalue + jsr putbyte + lda lvalue+1 + jsr putbyte + lda :mode + cmp #$5c + bne :rel + lda lvalue+2 + jsr putbyte +:rel jmp relcorrect +:bad lda #badaddress + sec + rts +:mode ds 2 + +jslop rep $30 + lda xcflag + and #%01000000 + beq :bad + lda passnum + beq :p1 + lda #$22 + jsr putopcode + ldx #$00 + jsr eval + bcc :ok + rts +:ok lda lvalue + jsr putbyte + lda lvalue+1 + jsr putbyte + lda lvalue+2 + jsr putbyte + jmp relcorrect +:p1 lda #$04 + jmp incobjptr +:bad lda #badopcode + sec + rts + +jsrop rep $30 + jsr addmode + bcc :ok + rts +:ok sep $30 + bit #amforce24 + jne jslop + and #amforce24.amforce16.amforce8!$FFFF + cmp #$00 + beq :20 + cmp #amround.amxindex + bne :bad + lda xcflag + and #%01000000 + beq :bad + lda #$FC + jmp :put +:20 lda #$20 +:put jsr putopcode + lda passnum + beq :ok1 + rep $30 + ldx #$00 + jsr eval + bcc :ok1 + rts +:ok1 sep $30 + lda lvalue + jsr putbyte + lda lvalue+1 + jsr putbyte + rep $30 + jmp relcorrect +:bad rep $30 + lda #badaddress + sec + rts + +mvnop ldy passnum + beq :three + ldy #$00 +:flush lda [lineptr],y + iny + and #$7f + cmp #' ' + blt :err + beq :flush + cmp #',' + beq :found + cmp #';' + beq :err + jmp :flush +:err lda #badoperand + sec + rts +:found tyx + jsr eval + bcs :err1 + lda #$54 ;MVN opcode + jsr putopcode + lda lvalue+$2 + jsr putbyte + lda #$10 + sta shiftct + jsr relcorrect + bcc :ok + rts +:ok ldx #$00 + jsr eval + bcs :err1 + lda lvalue+$2 + jsr putbyte + lda #$10 + sta shiftct + jsr relcorrect + rts +:three jsr putbyte + jsr putbyte + jsr putbyte + clc +:err1 rts + +mvpop ldy passnum + beq :three + ldy #$00 +:flush lda [lineptr],y + iny + and #$7f + cmp #' ' + blt :err + beq :flush + cmp #',' + beq :found + cmp #';' + beq :err + jmp :flush +:err lda #badoperand + sec + rts +:found tyx + jsr eval + bcs :err1 + lda #$44 ;MVP opcode + jsr putopcode + lda lvalue+$2 + jsr putbyte + lda #$10 + sta shiftct + jsr relcorrect + bcc :ok + rts +:ok ldx #$00 + jsr eval + bcs :err1 + lda lvalue+$2 + jsr putbyte + lda #$10 + sta shiftct + jsr relcorrect + rts +:three jsr putbyte + jsr putbyte + jsr putbyte + clc +:err1 rts + + +peaop php + rep $30 + lda passnum + bne :p2 + plp + lda #$03 + jmp incobjptr +:p2 sep $20 + lda linebuff + jeq :badadd + lda linebuff+1 + sta :first + cmp #'#' + bne :check + lda #' ' + sta linebuff+1 +:check jsr addmode + pha + php + lda :first + sta linebuff+1 + plp + pla + bcs :err + rep $30 + and #amimed.amforce24.amforce16.amforce8!$FFFF + bne :badadd + stz :flag + sep $20 + lda linebuff+1 + cmp #'#' + beq :go + lda linebuff + inc + sta linebuff-1 + lda #'#' + sta linebuff + dec :flag + lda lineptr + sec + sbc #$01 + sta lineptr + lda lineptr+2 + sbc #$00 + sta lineptr+2 +:go rep $30 + ldx #$00 + jsr eval + pha + php + lda :flag + beq :plp + inc lineptr + bne :rst + inc lineptr+2 +:rst sep $20 + lda linebuff-1 + dec + sta linebuff +:plp plp + pla + bcs :err + sep $20 + lda #$F4 + jsr putopcode + lda lvalue + jsr putbyte + lda lvalue+1 + jsr putbyte + plp + jmp relcorrect +:badadd rep $30 + lda #badaddress +:err plp + sec + rts +:first ds 2 +:flag ds 2 + +perop lda passnum + bne :per + lda #$03 + jmp incobjptr +:per jsr addmode + and #amforce24.amforce16.amforce8!$FFFF + bne :bad + ldx #$00 + jsr eval + bcc :ok + rts +:ok lda #relflag ;if rel'ing you can't use an + bit modeflag ;absolute value + beq :ok1 + bit lableused + bpl :ok1 + ;check for lableused +:ok1 lda objptr + clc + adc #$03 + pha + lda lvalue + sec + sbc 1,s + ply + sta lvalue + lda #$62 + jsr putopcode + lda lvalue + jsr putbyte + lda lvalue+1 + jsr putbyte + lda #$7fff + sta lableused + lda lvalue + sta noshift + jmp relcorrect +* clc +* rts +:bad lda #badaddress + sec + rts + +sepop ldx #$00 + jsr eval + bcc :ok + cmp #undeflable + bne :err + lda #forwardref +:err sec + rts +:ok bit lableused + bmi :ok1 + lda #badrelative + jmp :err +:ok1 sep $20 + lda lvalue + pha + lda #$e2 + jsr putopcode + lda 1,s + jsr putbyte + pla + sep $20 + asl + asl + and #%11000000 + tsb mxflag + rep $30 + clc + rts + +repop ldx #$00 + jsr eval + bcc :ok + cmp #undeflable + bne :err + lda #forwardref +:err sec + rts +:ok bit lableused + bmi :ok1 + lda #badrelative + jmp :err +:ok1 sep $20 + lda lvalue + pha + lda #$C2 + jsr putopcode + lda 1,s + jsr putbyte + pla + sep $20 + asl + asl + and #%11000000 + trb mxflag + rep $30 + clc + rts + + +xceop lda #%11000000 + tsb mxflag + lda #$fb + jmp putopcode + + +************************** +*** Peusdo-ops *** +************************** + mx %00 + +casop php + sep $30 + ldy #$00 +]lup lda [lineptr],y + and #$7F + cmp #' ' + blt :on + beq :iny + cmp #';' + beq :on + and #$5F + cmp #'S' + beq :off + cmp #'I' + beq :on +:iny iny + jmp ]lup +:on lda #caseflag + tsb modeflag + plp + clc + rts +:off lda #caseflag + trb modeflag + plp + clc + rts + mx %0 + + + +chkop sep $20 + lda checksum + jsr putbyte + stz checksum + rep $20 + clc + rts + + +dumop bit macflag-1 + bmi :bad + ldx #$00 + jsr eval + bcc :dfn + cmp #undeflable + bne :sec1 + lda #forwardref +:sec1 sec + rts +:bad lda #badopcode + sec + rts +:dfn lda objptr + pha + lda objptr+$2 + pha + lda #$8000 + sta dumor + lda lvalue + sta objptr + lda lvalue+$2 + sta objptr+$2 + lda lableused + bmi :bit + stz dumor ;make dummys relative +:bit lda #dumflag + bit modeflag + bne :pull + pla + sta dumorg+$2 + pla + sta dumorg + lda #dumflag + tsb modeflag + clc + rts +:pull pla + pla + clc + rts + + mx %00 +dendop lda #dumflag + bit modeflag + bne :ok +:bad lda #badopcode + sec + rts +:ok bit macflag-1 + bmi :bad + lda #$8000 + sta dumor + lda dumorg + sta objptr + lda dumorg+$2 + sta objptr+$2 + lda #dumflag + trb modeflag + clc + rts +dumorg ds 4 + + + mx %00 +dsop sep $30 + ldy #$00 +]lup lda [lineptr],y + cmp #' ' + blt :badoper + beq :iny + cmp #'\' + bne :nofill + jmp :fillpage +:iny iny + jmp ]lup +:fillpage iny + lda [lineptr],y + cmp #' '+1 + blt :fp0 + cmp #',' + bne :badoper + iny +:fp0 rep $30 + tyx + stz lvalue+2 + lda objptr + and #$00ff + sta lvalue + beq :dsfill + ora #$ff00 + eor #$FFFF + inc + sta lvalue +:dsfill bit modeflag-1 ;REL'ing? + bpl :ok + lda passnum + beq :clc + stz lvalue + jsr eval + bcc :dsf2 + cmp #badoperand + bne :sec1 +:dsf2 bit lableused + bmi :dsf0 + lda #badrelative + sec + rts +:dsf0 sep $20 + lda dsfill+1 + bne :clc + lda lvalue + sta dsfill + rep $20 + lda #$FF00 + tsb dsfill + lda linerel + sta dsoffset +:clc clc + rts +:sec1 sec + rts +:badoper rep $30 + lda #badoperand + sec + rts +:nofill rep $30 + tyx + jsr eval + bcc :ok + rts +:ok rep $30 + stx :next + lda #relflag + bit modeflag + beq :howmany + bit lableused + bmi :howmany + lda #badrelative + sec + rts +:howmany lda lvalue+2 + jeq :positive + cmp #$FFFF + beq :negative + jmp :bad1 +:negative lda objptr + clc + adc lvalue + sta objptr + lda objptr+2 + adc lvalue+2 + sta objptr+2 + lda #dumflag + bit modeflag + jne :d2 + lda objoffset + clc + adc lvalue + sta objoffset + lda objoffset+2 + adc lvalue+2 + jmi :outofmem + sta objoffset+2 + lda passnum + beq :d2 + lda #dskflag + bit modeflag + beq :d0 + lda dskopen + jsr writedsk + bcc :d00 +:oserr sta prodoserr + lda #doserror + sec + rts +:d00 lda dskopen + sta :markparm + _getmark :markparm + bcs :oserr + lda :mark + clc + adc lvalue + sta :mark + lda :mark+2 + adc lvalue+2 + sta :mark+2 + _setmark :markparm + bcs :oserr +:d0 lda #relflag + bit modeflag + beq :d1 + +* jmp :d1 + + lda reloffset + clc + adc lvalue + sta reloffset + lda reloffset+2 + adc lvalue+2 + sta reloffset+2 + bmi :outofmem +:d1 lda totbytes + clc + adc lvalue + sta totbytes + lda totbytes+2 + adc lvalue+2 + sta totbytes+2 + bmi :outofmem + lda #dskflag + bit modeflag + bne :d2 + lda objct + clc + adc lvalue + sta objct +:d2 clc + rts +:outofmem lda #memfull + sec + rts +:bad1 lda #badoperand + sec + rts +:positive lda lvalue + sta :count + bne :p1 + clc + rts +:p1 cmp #$8000 + blt :p11 + lda #badoperand + sec + rts +:p11 lda #dumflag + bit modeflag + beq :p111 + lda :count + jmp incobjptr + +:p111 bit orgval+2 + bmi :l1 + lda objptr + sta orgval + lda objptr+2 + ora #$8000 + sta orgval+2 + +:l1 lda passnum + bne :pass2 + + lda :count + jmp incobjptr + +:pass2 sep $30 + ldy :next +]lup lda [lineptr],y + cmp #' ' + blt :zero + bne :eval2 + iny + jmp ]lup +:eval2 tyx + jsr eval + bcc :get + rep $30 + rts + + mx %11 +:get lda lvalue + and #$ff + sta :byte + lda #relflag + bit modeflag + beq :put1 + bit lableused+1 + bmi :pass22 + rep $30 + lda #badrelative + sec + rts + + mx %11 +:zero stz :byte + lda modeflag + bit #relflag + beq :put1 + +:pass22 rep $30 + lda :count + clc + adc reloffset + sta reloffset + bcc :put1 + inc reloffset+2 + +:put1 rep $30 + lda :count + clc + adc totbytes + sta totbytes + bcc :put11 + inc totbytes+2 +:put11 + lda modeflag + bit #dskflag + jne :dsk2 + + lda objsize + sec + sbc objct + bcc :objfull + sta :room + lda :count + cmp :room + blt :store + lda :room +:store ldy objct + tax + sep $20 + lda :byte +]lup cpx #$00 + beq :savey + sta [objzpptr],y + iny + dex + jmp ]lup +:savey sty objct + cpy objsize + blt :byteout +:objfull lda #$FFFF + sta objfull +:byteout rep $30 + lda :count + ora #$8000 + sta bytesout + lda :byte + sta bytesout+2 + lda #$01 + tsb listflag+1 + lda :count + bit #$0001 + beq :nochk + sep $20 + lda :byte + eor checksum + sta checksum + rep $20 +:nochk lda #crcflag + bit modeflag+1 + beq :nocrc + lda #$FF00 + trb :byte + ldx :count +]lup cpx #$00 + beq :nocrc + phx + lda :byte + jsr calccrc + plx + dex + jmp ]lup +:nocrc lda :count + jmp incobjptr + + +:dsk2 rep $30 + lda dskopen + jsr writedsk + bcc :dsk3 + sta prodoserr + lda #doserror + sec + rts +:dsk3 sep $20 + lda :byte + xba + lda :byte + rep $30 + ldy #$0000 +]lup sta [objzpptr],y + iny + iny + cpy #1024 + blt ]lup +:write rep $30 + lda :count + sta :count1 +]lup ldy #1024 + lda :count1 + jeq :byteout + cmp #1024 + bge :512 + tay +:512 sty objct + sty :sbc1+1 + lda dskopen + jsr writedsk + bcc :sbc + sta prodoserr + lda #doserror + sec + rts +:sbc lda :count1 + sec +:sbc1 sbc #$FFFF + sta :count1 + bcs ]lup + jmp :byteout + +:count ds 2 +:count1 ds 2 +:next ds 2 +:byte ds 2 +:room ds 2 +:markparm dw $00 +:mark ds 4,0 + + mx %00 +endop lda #$FFFF + sta doneflag + stz macflag + clc + rts + + mx %00 +equop stz equateflag + jmp equate + +kbdop lda #$0001 + sta equateflag + jmp equate +pekop lda #$0002 + sta equateflag + jmp equate +rndop lda #$0003 + sta equateflag + jmp equate + +equate php + rep $30 + lda #dupok + bit modeflag1 + beq :normal + lda merrcode + cmp #duplable + bne :normal + lda linelable + bpl :normal + jsr findlable + bcc :bl + ldy #26 + lda [lableptr],y + bit #equatebit + beq :normal + ldy #28 + lda [lableptr],y + sta :oldval + ldy #30 + lda [lableptr],y + sta :oldval+2 + ldx #$00 + jsr equeval + jcs :bad + lda lvalue + cmp :oldval + bne :dup + lda lvalue+2 + cmp :oldval+2 + bne :dup + stz merrcode + jmp :noerr +:dup pea #duplable + jmp :err +:normal stz :foundflag + lda linelable + bpl :ok + jsr findlable + bcc :bl + ldy #28 + lda [lableptr],y + sta :oldval + ldy #30 + lda [lableptr],y + sta :oldval+2 + ldy #16 + sty :foundflag + lda [lableptr],y + jmp :ok +:bl pea #badlable + jmp :err +:ok pha + lda #%00000100 + tsb listflag+1 + pla +:ok9 asl + asl + tay + lda [lableptr1],y + sta :ptr + iny + iny + lda [lableptr1],y + sta :ptr+2 + sep $20 + lda #$40 + tsb clrglob + rep $20 + lda macflag + and #%01100000 + beq :nomac + + ldy #26 + lda [lableptr],y + bit #variablebit + bne :nomac + + lda passnum + bne :macp2 +:pass1 ldx #$00 + jsr equeval + jcs :bad + lda lvalue + sta labval + lda lvalue+2 + and #$FF + sta labval+2 + lda :ptr + sta lableptr + lda :ptr+2 + sta lableptr+2 + sep $30 + ldy #$00 +]lup lda [lableptr],y + tyx + sta labstr,x + iny + cpy #16 + blt ]lup + plp + jmp insertlable + mx %00 +:macp2 lda :ptr + sta lableptr + lda :ptr+2 + sta lableptr+2 + sep $30 + lda :foundflag + bne :macp21 + ldy #$00 +]lup lda [lableptr],y + tyx + sta labstr,x + iny + cpy #16 + blt ]lup + jsr findlable + bcs :macp21 + pea #undeflable + jmp :err +:macp21 rep $30 + ldy #28 + lda [lableptr],y + sta equateval + ldy #30 + lda [lableptr],y + sta equateval+2 + jmp :noerr + + mx %00 +:nomac lda passnum + bne :pass2 + lda :ptr + sta lableptr + lda :ptr+2 + sta lableptr+2 + ldy #26 + lda [lableptr],y + bit #variablebit + beq :eval + ldy #28 + lda varval + sta [lableptr],y + ldy #30 + lda varval+2 + sta [lableptr],y +:eval ldx #$00 + jsr equeval + bcc :equ +:bad pha + jmp :err +:pass2 lda :ptr + sta lableptr + lda :ptr+2 + sta lableptr+2 + ldy #26 + lda [lableptr],y + and #variablebit + beq :equval + ldy #28 + lda varval + sta [lableptr],y + ldy #30 + lda varval+2 + sta [lableptr],y + ldx #$00 + jsr equeval + bcs :bad +:equ lda :ptr + sta lableptr + lda :ptr+2 + sta lableptr+2 +:entry ldy #26 + lda [lableptr],y + and #$7FFF + ora #equatebit + bit lableused + bpl :rel + ora #absolutebit ;**** CAN'T FORCE ALL EQU TO ABSOLUTE +:rel sta [lableptr],y + iny + iny + lda lvalue + sta [lableptr],y + iny + iny + lda lvalue+2 + sta [lableptr],y +:equval ldy #28 + lda [lableptr],y + sta equateval + ldy #30 + lda [lableptr],y + sta equateval+2 +:noerr pea $00 +:err rep $30 + do 0 + lda #dupok + bit modeflag1 + beq :epla + lda merrcode + cmp #duplable + bne :epla + ldy #28 + lda [lableptr],y + cmp :oldval + bne :epla + ldy #30 + lda [lableptr],y + cmp :oldval+2 + bne :epla + stz merrcode + fin +:epla pla + plp + cmp :one + rts +:one dw $01 +:ptr ds 4 +:foundflag ds 2 +:oldval ds 4 + +equateflag ds 2 ;$0000 = normal equate +;$8000 = keyboard equate + +equeval php + rep $30 + lda equateflag + asl + tax + jmp (:tbl,x) +:tbl dw :equate + dw :kbd + dw :pek + dw :random + +:equate jsr eval ;process normally + jcc :clc + jmp :sec + +:random jsr random + sta lvalue + jsr random + sta lvalue+2 + lda #$00 + jmp :clc + +:pek lda #$ffff + sta lableused + ldx #$00 + jsr eval + bcc :pek1 + jmp :sec +:pek1 lda lvalue+2 + cmp #$100 + bge :badop + lda #relflag + bit modeflag + beq :pek2 + bit lableused + bmi :pek2 + lda #badrelative + jmp :sec +:pek2 pei $02 + pei $00 + lda lvalue + sta $00 + lda lvalue+2 + sta $02 + sep $20 ;only read the one byte + lda [$00] + rep $20 + and #$ff + sta lvalue + stz lvalue+2 + pla + sta $00 + pla + sta $02 + lda #$00 + jmp :clc +:badop lda #badoperand + jmp :sec + +:kbd stz lvalue + stz lvalue+2 + lda #$ffff + sta lableused + lda merrcode ;was there a duplicate lab err? + and #$ff + beq :readkey + cmp #duplable + jne :sec + + pea 0 + _QALinkerActive + pla + beq :readkey + + jsr findlable + bcc :readkey + ldy #26 + lda [lableptr],y + bit #linkerbit + beq :duplicate + ldy #28 + lda [lableptr],y + sta lvalue + ldy #30 + lda [lableptr],y + sta lvalue+2 + lda #$00 ;0 here if linker passed value + sta merrcode ;leave alone if not. + jmp :clc + +:readkey lda #$1234 ;*** print the message and parse input + sta lvalue + stz lvalue+2 + psl #:str + _QADrawString + lda #$00 + jmp :clc +:str str 'Enter value: ',0d + +:duplicate lda #duplable + jmp :sec + +:clc plp + clc + rts +:sec rep $30 + ldy passnum + bne :sec1 + cmp #undeflable + bne :sec1 + lda #forwardref +:sec1 plp + sec + rts + +extop +]len equ workspace + + lda passnum + bne :xit + + lda macflag + bit #%01100000 + beq :nomac + lda #badopcode + sec + rts +:nomac + + lda linelable + bmi :group + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #26 + lda [lableptr],y + and #%11111 + bne :bad + jmp :equ +:badop lda #badopcode + sec + rts +:bad lda #badlable + sec + rts +:equ stz :offset + ldy #26 ;point to type + lda [lableptr],y + bit #%1100_0000_0011_1111 + bne :bad + and #%0010_0000_0000_0000 ;used bit + ora #externalbit + sta [lableptr],y + phy + ldy #22 + lda extcount + sta [lableptr],y + inc extcount + ply + iny + iny + lda #$8000 + sta [lableptr],y + iny + iny + lda #$0000 + sta [lableptr],y +:xit lda #$00 + clc + rts +:group ldy #$FFFF +]lup iny + lda [lineptr],y + and #$7f + cmp #';' + beq :xit + cmp #' ' + blt :xit + beq ]lup +:gloop sep $20 + lda [lineptr],y + ldx #$01 + cmp #'?' + jlt :gerr + cmp #']' + jeq :gerr + sta labstr,x + iny +]lup lda [lineptr],y + cmp #' '+1 + blt :insert + cmp #',' + beq :insert + cmp #';' + beq :insert + cpx #15 + bge :iny + sta labstr+1,x +:iny iny + inx + jmp ]lup +:insert txa + cmp #$10 + blt :ls + lda #$0f +:ls sta labstr + rep $30 + sty :ypos + lda #$ffff + sta fllast + jsr findlable + jcs :gerr2 + jsr insertlable + stz fllast + dec fllast + jcs :gerr1 + stz :offset + ldy #26 ;point to type + lda [lableptr],y + bit #%1100_0000_0011_1111 + bne :gerr + and #%0010_0000_0000_0000 ;used bit + ora #externalbit + sta [lableptr],y + phy + ldy #22 + lda extcount + sta [lableptr],y + inc extcount + ply + iny + iny + lda #$8000 + sta [lableptr],y + iny + iny + lda #$0000 + sta [lableptr],y + ldy :ypos + lda [lineptr],y + iny + and #$7f + cmp #',' + jeq :gloop + lda #$00 + clc + rts +:gerr rep $30 + lda #badlable + jmp :gerr1 +:gerr2 rep $30 + lda #duplable +:gerr1 rep $30 + sec + rts +:offset ds 2 +:ypos ds 2 + + +exdop +]len equ workspace + + lda passnum + bne :xit + + lda macflag + bit #%01100000 + beq :nomac + lda #badopcode + sec + rts +:nomac + lda linelable + bmi :group + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #26 + lda [lableptr],y + and #%11111 + bne :bad + jmp :equ +:badop lda #badopcode + sec + rts +:bad lda #badlable + sec + rts +:equ stz :offset + ldy #26 ;point to type + lda [lableptr],y + bit #%1100_0000_0011_1111 + bne :bad + and #%0010_0000_0000_0000 ;used bit + ora #externalbit + sta [lableptr],y + phy + ldy #22 + lda extcount + sta [lableptr],y + inc extcount + ply + iny + iny + lda #$0000 + sta [lableptr],y + iny + iny + lda #$0000 + sta [lableptr],y +:xit lda #$00 + clc + rts +:group ldy #$FFFF +]lup iny + lda [lineptr],y + and #$7f + cmp #';' + beq :xit + cmp #' ' + blt :xit + beq ]lup +:gloop sep $20 + lda [lineptr],y + ldx #$01 + cmp #'?' + jlt :gerr + cmp #']' + jeq :gerr + sta labstr,x + iny +]lup lda [lineptr],y + cmp #' '+1 + blt :insert + cmp #',' + beq :insert + cmp #';' + beq :insert + cpx #15 + bge :iny + sta labstr+1,x +:iny iny + inx + jmp ]lup +:insert txa + cmp #$10 + blt :ls + lda #$0f +:ls sta labstr + rep $30 + sty :ypos + lda #$ffff + sta fllast + jsr findlable + jcs :gerr2 + jsr insertlable + stz fllast + dec fllast + jcs :gerr1 + stz :offset + ldy #26 ;point to type + lda [lableptr],y + bit #%1100_0000_0011_1111 + bne :gerr + and #%0010_0000_0000_0000 ;used bit + ora #externalbit + sta [lableptr],y + phy + ldy #22 + lda extcount + sta [lableptr],y + inc extcount + ply + iny + iny + lda #$0000 + sta [lableptr],y + iny + iny + lda #$0000 + sta [lableptr],y + ldy :ypos + lda [lineptr],y + iny + and #$7f + cmp #',' + jeq :gloop + lda #$00 + clc + rts +:gerr rep $30 + lda #badlable + jmp :gerr1 +:gerr2 rep $30 + lda #duplable +:gerr1 rep $30 + sec + rts +:offset ds 2 +:ypos ds 2 + +entop +]len equ workspace + + lda passnum + bne :xit + lda macflag + bit #%01100000 + beq :nomac + lda #badopcode + sec + rts +:nomac + lda linelable + bmi :group + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #26 + lda [lableptr],y + and #macvarbit.externalbit.macrobit.variablebit.localbit + bne :bad + jmp :equ +:badop lda #badopcode + sec + rts +:bad lda #badlable + sec + rts +:equ stz :offset + ldy #26 ;point to type + lda [lableptr],y + and #usedbit.absolutebit.equatebit + ora #entrybit + sta [lableptr],y + phy + ldy #22 + lda entcount + sta [lableptr],y + inc entcount + ply +:xit rep $30 + lda #$00 + clc + rts +:group ldy #$00 + sep $20 +]g lda [lineptr],y + and #$7f + cmp #' ' + blt :group1 + bne :and + iny + bra ]g +:and and #$5f + cmp #'O' + bne :group1 + iny + lda [lineptr],y + and #$5f + cmp #'N' + beq :gon + cmp #'F' + bne :group1 + iny + lda [lineptr],y + and #$5f + cmp #'F' + bne :group1 +:gon xba + iny + lda [lineptr],y + and #$7f + cmp #' '+1 + bge :group1 + xba + cmp #'F' + beq :goff + rep $20 + lda #entrybit + tsb orgor + jmp :xit +:goff rep $20 + lda #entrybit + trb orgor + jmp :xit + +:group1 rep $30 + sep $20 + ldy #$FFFF +]lup iny + lda [lineptr],y + and #$7f + cmp #';' + beq :xit + cmp #' ' + blt :xit + beq ]lup +:gloop rep $30 + sep $20 + lda [lineptr],y + ldx #$01 + cmp #'?' + jlt :gerr + cmp #']' + jeq :gerr + sta labstr,x + iny +]lup lda [lineptr],y + cmp #' '+1 + blt :insert + cmp #',' + beq :insert + cmp #';' + beq :insert + cpx #15 + bge :iny + sta labstr+1,x +:iny iny + inx + jmp ]lup +:insert txa + cmp #$10 + blt :ls + lda #$0f +:ls sta labstr + rep $30 + sty :ypos + lda #$ffff + sta fllast + jsr findlable + bcs :or + jsr insertlable + stz fllast + dec fllast + jcs :gerr1 +:or stz :offset + ldy #26 ;point to type + lda [lableptr],y + and #macvarbit.externalbit.macrobit.variablebit.localbit + bne :gerr + lda [lableptr],y + and #usedbit.absolutebit.equatebit + ora #entrybit ;entry lable + sta [lableptr],y + ldy #22 + lda entcount + sta [lableptr],y + inc entcount + + ldy :ypos + lda [lineptr],y + iny + and #$7f + cmp #',' + jeq :gloop + lda #$00 + clc + rts +:gerr rep $30 + lda #badlable + jmp :gerr1 +:gerr2 rep $30 + lda #duplable +:gerr1 rep $30 + sec + rts +:offset ds 2 +:ypos ds 2 + + +lstop php + sep $30 + ldy #$00 +]lup lda [lineptr],y + and #$7F + cmp #' ' + blt :on + beq :iny + cmp #';' + beq :on + and #$5F + cmp #'F' + beq :off + cmp #'N' + beq :on + cmp #'R' + beq :rtn +:iny iny + jmp ]lup +:on lda listflag + and #$80 + sta oldlstflag + lda #$80 + tsb listflag + trb listflag+1 + plp + clc + rts +:off lda listflag + and #$80 + sta oldlstflag + lda #$80 + trb listflag + trb listflag+1 + plp + clc + rts +:rtn lda listflag + pha + lda listflag + and #$7f + ora oldlstflag + sta listflag + lda #$80 + trb listflag+1 + pla + and #$80 + sta oldlstflag + plp + clc + rts +oldlstflag ds 4 + + mx %00 +lstdoop php + sep $30 + ldy #$00 +]lup lda [lineptr],y + and #$7F + cmp #' ' + blt :on + beq :iny + cmp #';' + beq :on + and #$5F + cmp #'F' + beq :off + cmp #'N' + beq :on +:iny iny + jmp ]lup +:off lda #lstdoon + tsb listflag + lda #$80 + trb listflag+1 + plp + clc + rts +:on lda #lstdoon + trb listflag + lda #$80 + trb listflag+1 + plp + clc + rts + + mx %00 +dupop php + sep $30 + ldy #$00 +]lup lda [lineptr],y + and #$7F + cmp #' ' + blt :on + beq :iny + cmp #';' + beq :on + and #$5F + cmp #'F' + beq :off + cmp #'N' + beq :on +:iny iny + jmp ]lup +:on lda #dupok + tsb modeflag1 + plp + clc + rts +:off lda #dupok + trb modeflag1 + plp + clc + rts + + + mx %00 +trop php + sep $30 + ldy #$00 +]lup lda [lineptr],y + and #$7F + cmp #' ' + blt :on + beq :iny + cmp #';' + beq :on + and #$5F + cmp #'F' + beq :off + cmp #'N' + beq :on + cmp #'A' + beq :adr +:iny iny + jmp ]lup +:on lda #%00000010 + tsb listflag + plp + clc + rts +:off lda #%00100010 + trb listflag + plp + clc + rts +:adr lda #%00100000 + tsb listflag + plp + clc + rts + + mx %00 +crcop php + sep $30 + lda modeflag + bit #crcflag + beq :init + lda passnum + bne :put + rep $30 + stz crc16 + lda #$02 + jmp incobjptr +:put rep $30 + lda crc16 + jsr putbyte + lda crc16+1 + jsr putbyte +:init rep $30 + lda #crcflag + tsb modeflag+1 + stz crc16 + plp + clc + rts + + mx %00 +encop lda passnum + bne :ok + lda #encflag + tsb modeflag+1 + clc + rts +:ok sep $30 + lda #encflag + tsb modeflag+1 + lda #relflag + bit modeflag + beq :flush + rep $30 + lda #badopcode + sec + rts + mx %11 +:flush ldy #$ff +]lup iny + lda [lineptr],y + and #$7f + cmp #' ' + blt :off + beq ]lup + cmp #';' + beq :off + ldx #$00 + jsr eval + bcc :good1 + rep $30 + rts + mx %11 +:off stz lvalue +:good1 lda lvalue + sta encval + rep $31 + rts + + + mx %00 +cycop php + sep $30 + lda passnum + bne :ok + plp + clc + rts +:ok ldy #$00 +]lup lda [lineptr],y + and #$7F + cmp #' ' + blt :on + beq :iny + cmp #';' + beq :on + and #$5F + cmp #'F' + beq :flags + cmp #'N' + beq :on + cmp #'A' + beq :avg +:iny iny + jmp ]lup +:flags iny + lda [lineptr],y + and #$df + cmp #'L' + bne :off + lda #cycflag + tsb modeflag+1 + lda #$80 + jmp :xit +:on lda #cycflag + tsb modeflag+1 + lda #$00 + jmp :xit +:off lda #cycflag + trb modeflag+1 + lda #$00 + stz cycflags + jmp :xit +:avg lda #cycflag + tsb modeflag+1 + lda #$40 +:xit rep $30 + stz cycles + stz cycleavg + and #$FF + tsb cycflags + plp + clc + rts + + mx %00 +expop php + sep $30 + ldy #$00 +]lup lda [lineptr],y + and #$7F + cmp #' ' + blt :on + beq :iny + cmp #';' + beq :on + and #$5F + cmp #'F' + beq :off + cmp #'N' + beq :only +:iny iny + jmp ]lup +:only iny + lda [lineptr],y + and #$df + cmp #'L' + bne :on + lda #exponly.expflag + tsb modeflag+1 + plp + clc + rts +:on lda #expflag + tsb modeflag+1 + lda #exponly + trb modeflag+1 + plp + clc + rts +:off lda #exponly.expflag + trb modeflag+1 + plp + clc + rts + + mx %00 +tbxop php + sep $30 + ldy #$00 +]lup lda [lineptr],y + and #$7F + cmp #' ' + blt :on + beq :iny + cmp #';' + beq :on + and #$5F + cmp #'F' + beq :off + cmp #'N' + beq :on + cmp #'U' + beq :uc + cmp #'L' + beq :lc +:iny iny + jmp ]lup + +:on lda #tbxflag + tsb modeflag+1 + jmp :xit +:off lda #tbxflag + trb modeflag+1 + lda #$FF + sta tbxand + jmp :xit +:uc lda #$5f + sta tbxand + jmp :on +:lc lda #$ff + sta tbxand + jmp :on +:xit rep $30 + plp + clc + rts + + + mx %00 +evlop php + sep $30 + ldy #$00 +]lup lda [lineptr],y + and #$7F + cmp #' ' + blt :on + beq :iny + cmp #';' + beq :on + and #$5F + cmp #'F' + beq :off + cmp #'N' + beq :on +:iny iny + jmp ]lup +:on lda #algflag + tsb modeflag+1 + jmp :xit +:off lda #algflag + trb modeflag+1 +:xit rep $30 + plp + clc + rts + + + mx %00 +mxop php + rep $30 + bit xcflag-1 + bvs :mx + lda #badopcode + plp + sec + rts +:mx ldx #$00 + jsr eval + bcc :peachy + cmp #undeflable + bne :sec1 + lda #forwardref +:sec1 plp + sec + rts +:peachy lda lvalue + cmp #$04 + blt :ok + lda #badoperand + plp + sec + rts +:ok sep $20 + and #$03 + lsr + ror + ror ;shift into b7-b6 + sep $20 + sta mxflag + plp + clc + rts + mx %00 + +orgop sep $30 + ldy #$FF +]lup iny + lda [lineptr],y + cmp #' ' + blt :restore + beq ]lup + ldx #$00 + jsr eval + bcc :org + rep $30 + cmp #undeflable + bne :err + lda #forwardref +:err rep $30 + sec + rts +:org rep $30 + lda #relflag + bit modeflag + beq :o1 + lda lableused + bmi :orel + lda #badrelative + sec + rts +:orel lda #$8000 + tsb orgor +:o1 lda objoffset + sta oldoffset + lda objoffset+2 + sta oldoffset+2 + lda objptr + sta oldobj + lda objptr+2 + sta oldobj+2 + lda lvalue + sta objptr + lda lvalue+2 + sta objptr+2 + stz objoffset + stz objoffset+2 + clc + rts +:restore rep $30 + lda oldobj + clc + adc objoffset + sta objptr + lda oldobj+2 + adc objoffset+2 + sta objptr+2 + lda #relflag + bit modeflag + beq :o2 + lda #$8000 + trb orgor +:o2 clc + rts + + +relop rep $30 + bit macflag-1 + bpl :rel +:bad lda #badopcode + sec + rts +:rel lda #encflag*256+relflag + bit modeflag + bne :bad + lda passnum + jne :p2 + lda rellabct + bne :bad + psl #$00 + psl #relsize+1 + ldal userid + ora #memid + pha + pea $8000 ;locked page aligned + psl #$00 + tll $0902 + plx + ply + bcs :merr01 + stx relptr + sty relptr+2 + ldy #$02 + lda [relptr] + tax + lda [relptr],y + sta relptr+$2 + stx relptr +* jmp :p1 +:p2 lda relptr + ora relptr+2 + beq :p1 + lda #relflag + tsb modeflag +:p1 lda #$8000 + trb orgor ;stz orgor + stz relct + clc + rts +:merr01 sta prodoserr + lda #doserror + sec + rts + + mx %00 +dwop php + sep $30 + ldy passnum + bne :pass2 +:p0 stz :count + lda (lineptr) + cmp #' '+1 + blt :bad +:p00 lda (lineptr),y + iny + cmp #' '+1 + blt :p0xit + beq :p00 + cmp #',' + bne :p00 + inc :count + jmp :p00 +:p0xit rep $30 + lda :count + inc + asl + plp + jmp incobjptr +:bad rep $30 + lda #badoperand + plp + sec + rts + + mx %11 +:pass2 ldx #$00 +:loop jsr eval + bcc :pass21 +:sec plp + sec + rts +:pass21 phx + lda lvalue + jsr putbyte + lda lvalue+$1 + jsr putbyte + jsr relcorrect + plx + txy + lda (lineptr),y + cmp #' '+1 + bge :loop +:clc plp + clc + rts +:count ds 2 + + + mx %00 +dfbop php + sep $30 + ldy passnum + bne :pass2 +:p0 stz :count + lda (lineptr) + cmp #' '+1 + blt :bad +:p00 lda (lineptr),y + iny + cmp #' '+1 + blt :p0xit + beq :p00 + cmp #',' + bne :p00 + inc :count + jmp :p00 +:p0xit rep $30 + lda :count + inc + plp + jmp incobjptr +:bad rep $30 + lda #badoperand + plp + sec + rts + + mx %11 +:pass2 ldx #$00 +:loop jsr eval + bcc :pass21 +:sec plp + sec + rts +:pass21 phx + lda lvalue + jsr putbyte + jsr relcorrect + plx + txy + lda (lineptr),y + cmp #' '+1 + bge :loop +:clc plp + clc + rts +:count ds 2 + + + mx %00 +ddbop ldx #$00 + bra :init +:loop ldy :val + lda [lineptr],y + and #$7F + cmp #' '+$1 + jlt :clc + cmp #',' + bne :err + tyx +:init jsr eval + bcc :pass1 + cmp #undeflable + bne :sec + ldy passnum + beq :pass1 +:sec sec + rts +:err lda #badoperand + sec + rts +:pass1 stx :val + lda lvalue+$1 + jsr putbyte + lda lvalue + jsr putbyte + lda passnum + beq :jmp + lda modeflag + bit #relflag + beq :jmp + bit lableused + bmi :jmp + bit notfound-1 + bmi :jmp + lda lableused + cmp #$7fff + beq :internal +:nrel asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + stz :offset + ldy #26 + lda [lableptr],y + bit #externalbit + beq :internal + ldy #22 + lda [lableptr],y + and #$00ff + sta noshift+1 + lda #$bf + jmp :relsta +:internal lda #$AF +:relsta ldy relct + cpy #relsize-16 + bge :relfull + sta [relptr],y + iny + lda linerel + sta [relptr],y + iny + iny + lda noshift+1 + sta [relptr],y + iny + sty relct + stz relout + sep $20 + sec + ror notfound + rep $20 + sec + ror lableused + lda reloffset + sta linerel +:jmp jmp :loop +:clc clc + rts +:relfull lda #relfull + sec + rts +:val ds 2 +:offset ds 2 + + mx %00 +adrop php + sep $30 + ldy passnum + bne :pass2 +:p0 stz :count + lda (lineptr) + cmp #' '+1 + blt :bad +:p00 lda (lineptr),y + iny + cmp #' '+1 + blt :p0xit + beq :p00 + cmp #',' + bne :p00 + inc :count + jmp :p00 +:p0xit rep $30 + lda :count + inc + pha + asl + clc + adc 1,s + plx + plp + jmp incobjptr +:bad rep $30 + lda #badoperand + plp + sec + rts + + mx %11 +:pass2 ldx #$00 +:loop jsr eval + bcc :pass21 +:sec plp + sec + rts +:pass21 phx + lda lvalue + jsr putbyte + lda lvalue+$1 + jsr putbyte + lda lvalue+2 + jsr putbyte + jsr relcorrect + plx + txy + lda (lineptr),y + cmp #' '+1 + bge :loop +:clc plp + clc + rts +:count ds 2 + + mx %00 +adrlop php + sep $30 + ldy passnum + bne :pass2 +:p0 stz :count + lda (lineptr) + cmp #' '+1 + blt :bad +:p00 lda (lineptr),y + iny + cmp #' '+1 + blt :p0xit + beq :p00 + cmp #',' + bne :p00 + inc :count + jmp :p00 +:p0xit rep $30 + lda :count + inc + asl + asl + plp + jmp incobjptr +:bad rep $30 + lda #badoperand + plp + sec + rts + + mx %11 +:pass2 ldx #$00 +:loop jsr eval + bcc :pass21 +:sec plp + sec + rts +:pass21 phx + lda lvalue + jsr putbyte + lda lvalue+$1 + jsr putbyte + lda lvalue+$2 + jsr putbyte + lda lvalue+$3 + jsr putbyte + jsr relcorrect + plx + txy + lda (lineptr),y + cmp #' '+1 + bge :loop +:clc plp + clc + rts +:count ds 2 + + mx %00 +strop jsr getasc + bcc :ok + rts +:ok lda passnum + bne :pass2 + lda asclength + and #$FF + inc + jmp incobjptr +:pass2 sep $30 + lda asclength + jsr putbyte + ldx asclength + ldy #$00 +]lup cpx #$00 + beq :clc + lda ascstr,y + phx + phy + jsr putbyte + ply + plx + iny + dex + jmp ]lup +:clc rep $31 + rts + +strlop jsr getasc + bcc :ok + rts +:ok lda passnum + bne :pass2 + lda asclength + and #$FF + inc + inc + jmp incobjptr +:pass2 sep $30 + lda asclength + jsr putbyte + lda asclength+1 + jsr putbyte + ldx asclength + ldy #$00 +]lup cpx #$00 + beq :clc + lda ascstr,y + phx + phy + jsr putbyte + ply + plx + iny + dex + jmp ]lup +:clc rep $31 + rts + + +*************************** +* +* Remember: when converting this code +* to support precompiled source files +* this routine must be modified so that +* it does not read directly from the +* source file itself. Preferably by +* checking a flag that is set by the +* initial "readline" routine indicating +* that the fields are correctly set up. +* +**************************** + +getasc1 php + rep $30 + lda #$ffff + sta ascflag + jmp getasc2 +getasc php + rep $30 + stz ascflag +getasc2 stz asclength + stz :macflag + ldy #$00 + lda macflag + and #%01100000 + sep $30 + bne :oper1 + bit ascflag+1 + bpl :norm +:spec1 lda [lineptr],y + tax + lda inputtbl,x + cmp #' ' + blt :err + bne :cmpspec + iny + bra :spec1 +:cmpspec cmp #'#' + jeq :special + ldy #$00 +:norm rep $30 + lda #$FFFF + sta :macflag + stz linebuff + stz comment + lda fileptr + sta lineptr + lda fileptr+2 + sta lineptr+2 + sep $30 + lda [lineptr] + tax + lda inputtbl,x + cmp #' ' + blt :err + beq :nolable +:lup1 iny + lda [lineptr],y + tax + lda inputtbl,x + cmp #' ' + blt :err + bne :lup1 +:nolable iny + lda [lineptr],y + tax + lda inputtbl,x + cmp #' ' + blt :err + beq :nolable +:opcode iny + lda [lineptr],y + tax + lda inputtbl,x + cmp #' ' + blt :err + bne :opcode +:oper iny +:oper1 lda [lineptr],y + tax + lda inputtbl,x + cmp #' ' + blt :err + beq :oper + jmp :start + +:err rep $30 + lda #badoperand +:sec rep $30 + stz asclength + plp + sec + rts + + mx %11 +:start ldx #$00 + stz :length + stz :length+1 + stz :deliminator +:loop lda [lineptr],y + phx + tax + lda inputtbl,x + plx + bit :macflag + bpl :cmp0 + cpx #128 + bge :cmp0 + sta linebuff+1,x + inx +:cmp0 cmp #' '+1 + jlt :done + cmp #',' + jeq :next + cmp #'$' + beq :hex0 + cmp #'0' + jlt :delim + cmp #'9'+1 + blt :hex + cmp #'a' + blt :check + cmp #'f'+1 + bge :check + and #$5f + jmp :hex1 +:check cmp #'A' + jlt :delim + cmp #'F'+1 + blt :hex1 + cmp #'Z'+1 + blt :err + cmp #'a' + jlt :delim + cmp #'z'+1 + blt :err + jmp :delim +:hex0 iny + lda [lineptr],y + phx + tax + lda inputtbl,x + plx + bit :macflag + bpl :cmp1 + cpx #128 + bge :cmp1 + sta linebuff+1,x + inx +:cmp1 cmp #'0' + jlt :err + cmp #'9'+1 + blt :hex + cmp #'A' + jlt :err + cmp #'Z'+1 + blt :hex1 + cmp #'a' + jlt :err + cmp #'z'+1 + jge :err + and #$5f +:hex1 sec + sbc #$37 + jmp :hexdigit +:hex sec + sbc #$30 +:hexdigit asl + asl + asl + asl + sta :digit + iny + lda [lineptr],y + phx + tax + lda inputtbl,x + plx + bit :macflag + bpl :cmp2 + cpx #128 + bge :cmp2 + sta linebuff+1,x + inx +:cmp2 cmp #'a' + blt :hd1 + cmp #'z'+1 + jge :err + and #$5f + jmp :hd2 +:hd1 cmp #'0' + jlt :err + cmp #'9'+1 + blt :hd3 + cmp #'A' + jlt :err + cmp #'F'+1 + blt :hd2 + jmp :err +:hd2 sec + sbc #$37 + jmp :hd4 +:hd3 sec + sbc #$30 +:hd4 ora :digit + phx + ldx :length + sta ascstr,x + plx + inc :length + iny + jmp :loop +:delim sta :deliminator + stz :orflag + cmp #$27 + bge :string + lda #$80 + sta :orflag +:string iny + lda [lineptr],y + phx + tax + lda inputtbl,x + plx + bit :macflag + bpl :cmp3 + cpx #128 + bge :cmp3 + sta linebuff+1,x + inx +:cmp3 cmp #' ' + blt :done + cmp :deliminator + bne :phx + stz :deliminator + jmp :next +:phx phx + ldx :length + ora :orflag + sta ascstr,x + plx + inc :length + jmp :string +:next iny + jmp :loop +:done bit :macflag + bpl :rep2 + stx linebuff +:comment lda passnum + beq :rep +:comment1 lda [lineptr],y + tax + lda inputtbl,x + cmp #' ' + blt :rep + bne :getcomment + iny + bra :comment1 +:getcomment ldx #$00 + sta comment+1,x + inx + iny +:c1 lda [lineptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' + blt :rep1 + sta comment+1,x + inx + iny + bra :c1 +:rep1 stx comment +:rep rep $30 + lda #linebuff+1 + sta lineptr + lda #^linebuff + sta lineptr+2 +:rep2 rep $30 + lda :deliminator + and #$ff + beq :rep3 + jmp :err +:rep3 lda :length + and #$ff + sta asclength + plp + clc + rts + +:special rep $30 + stz :length + stz :orflag + stz :rightflag + stz :deliminator + iny +:specloop lda [lineptr],y + and #$7f + phx + tax + lda inputtbl,x + and #$7f + plx + cmp #' '+1 + jlt :err + cmp #$27 + beq :delim1 + cmp #$22 + beq :delim1 + cmp #'>' + beq :right + jmp :eval +:right bit :rightflag + jmi :err + sec + ror :rightflag + iny + jmp :specloop +:delim1 ldx :deliminator + jne :err + sta :deliminator + iny + jmp :specloop +:eval tyx + lda #$ffff + sta lableused + jsr eval + bcc :ok + cmp #undeflable + jne :sec + jmp :forward +:ok bit lableused + bmi :ok1 +:forward lda #forwardref + jmp :sec +:ok1 lda lvalue+2 + jne :err + stz :flag + lda :rightflag + beq :setor + sec + ror :flag +:setor stz :orflag + lda :deliminator + and #$ff + cmp #$22 + bne :lv + lda #$80 + sta :orflag +:lv lda lvalue +:nosign ldy #$00 + sty :length + stz :zeroflag +:main ldx #$00 +:1 cmp :tbl,y + blt :11 + inx + sec + sbc :tbl,y + bra :1 +:11 phy + pha + txa + cpy #08 + bge :pha + cmp #$00 + bne :pha + bit :flag + bpl :snext + bit :zeroflag + bmi :pha + lda #$20 + jmp :ora1 +:pha and #$000f + ora #$30 + sec + ror :zeroflag +:ora1 ora :orflag + phx + ldx :length + sta ascstr,x + inc :length + plx + sec + ror :flag +:snext pla + ply + iny + iny + cpy #10 + blt :main + stz :deliminator + jmp :done + +:flag ds 2 +:tbl dw 10000,1000,100,10,1 +:digit ds 2 +:length ds 2 +:deliminator ds 2 +:orflag ds 2 +:rightflag ds 2 +:zeroflag ds 2 +:macflag ds 2 + + do 0 +getasc1 php + rep $30 + lda #$ffff + sta ascflag + jmp getasc2 +getasc php + rep $30 + stz ascflag +getasc2 stz asclength + + jsr ascoperand + + sep $20 +:flush lda [lineptr],y + and #$7f + cmp #' ' + blt :err + bne :start + iny + jmp :flush +:err rep $30 + lda #badoperand +:sec rep $30 + stz asclength + plp + sec + rts + mx %10 + +:start stz :length + stz :length+1 + bit ascflag+1 + bpl :loop + cmp #'#' + jeq :special +:loop lda [lineptr],y + and #$7f + cmp #' '+1 + jlt :done + cmp #',' + jeq :next + cmp #'$' + beq :hex0 + cmp #'0' + jlt :delim + cmp #'9'+1 + blt :hex + cmp #'a' + blt :check + cmp #'z'+1 + bge :check + and #$5f + jmp :hex1 +:check cmp #'A' + blt :err + cmp #'Z'+1 + blt :hex1 + jmp :err +:hex0 iny + lda [lineptr],y + and #$7f + cmp #'0' + jlt :err + cmp #'9'+1 + blt :hex + cmp #'A' + jlt :err + cmp #'Z'+1 + blt :hex1 + cmp #'a' + jlt :err + cmp #'z'+1 + jge :err + and #$5f +:hex1 sec + sbc #$37 + jmp :hexdigit +:hex sec + sbc #$30 +:hexdigit asl + asl + asl + asl + sta :digit + iny + lda [lineptr],y + and #$7f + cmp #'a' + blt :hd1 + cmp #'z'+1 + jge :err + and #$5f + jmp :hd2 +:hd1 cmp #'0' + jlt :err + cmp #'9'+1 + blt :hd3 + cmp #'A' + jlt :err + cmp #'F'+1 + blt :hd2 + jmp :err +:hd2 sec + sbc #$37 + jmp :hd4 +:hd3 sec + sbc #$30 +:hd4 ora :digit + ldx :length + sta ascstr,x + inc :length + iny + jmp :loop +:delim sta :deliminator + stz :orflag + cmp #$27 + bge :string + lda #$80 + sta :orflag +:string iny + lda [lineptr],y + and #$7f + cmp #' ' + blt :done + cmp :deliminator + beq :next + ldx :length + ora :orflag + sta ascstr,x + inc :length + jmp :string +:next iny + jmp :loop +:done rep $30 + lda :length + and #$ff + sta asclength + plp + clc + rts + +:special rep $30 + stz :orflag + stz :rightflag + stz :deliminator + iny +:specloop lda [lineptr],y + and #$7f + cmp #' '+1 + jlt :err + cmp #$27 + beq :delim1 + cmp #$22 + beq :delim1 + cmp #'>' + beq :right + jmp :eval +:right bit :rightflag + jmi :err + sec + ror :rightflag + iny + jmp :specloop +:delim1 ldx :deliminator + jne :err + sta :deliminator + iny + jmp :specloop +:eval tyx + jsr eval + bcc :ok + cmp #undeflable + jne :sec +:ok lda lvalue+2 + jne :err + stz :flag + lda :rightflag + beq :setor + sec + ror :flag +:setor stz :orflag + lda :deliminator + and #$ff + cmp #$22 + bne :lv + lda #$80 + sta :orflag +:lv lda lvalue +:nosign ldy #$00 + sty :length + stz :zeroflag +:main ldx #$00 +:1 cmp :tbl,y + blt :11 + inx + sec + sbc :tbl,y + bra :1 +:11 phy + pha + txa + cpy #08 + bge :pha + cmp #$00 + bne :pha + bit :flag + bpl :snext + bit :zeroflag + bmi :pha + lda #$20 + jmp :ora1 +:pha and #$000f + ora #$30 + sec + ror :zeroflag +:ora1 ora :orflag + phx + ldx :length + sta ascstr,x + inc :length + plx + sec + ror :flag +:snext pla + ply + iny + iny + cpy #10 + blt :main + jmp :done + +:flag ds 2 +:tbl dw 10000,1000,100,10,1 +:digit ds 2 +:length ds 2 +:deliminator ds 2 +:orflag ds 2 +:rightflag ds 2 +:zeroflag ds 2 + fin +ascflag ds 2 +asclength ds 2 ;keep these two together +ascstr ds 256,0 ;as one is length word + + mx %00 +ascop jsr getasc1 + bcc :ok + rts +:ok lda passnum + bne :pass2 + lda asclength + and #$FF + jmp incobjptr +:pass2 sep $30 + ldx asclength + ldy #$00 +]lup cpx #$00 + beq :clc + lda ascstr,y + phx + phy + jsr putbyte + ply + plx + iny + dex + jmp ]lup +:clc rep $31 + rts + + mx %00 +revop jsr getasc + bcc :ok + rts +:ok lda passnum + bne :pass2 + lda asclength + and #$FF + jmp incobjptr +:pass2 sep $30 + ldx asclength +]lup cpx #$00 + beq :clc + lda ascstr-1,x + phx + jsr putbyte + plx + dex + jmp ]lup +:clc rep $31 + rts + + mx %00 +invop jsr getasc + bcc :ok + rts +:ok lda passnum + bne :pass2 + lda asclength + and #$FF + jmp incobjptr +:pass2 sep $30 + ldx asclength + ldy #$00 +]lup cpx #$00 + beq :clc + lda ascstr,y + phx + phy + and #$7f + cmp #$40 + blt :1 + cmp #$60+1 + bge :1 + sec + sbc #$40 +:1 jsr putbyte + ply + plx + iny + dex + jmp ]lup +:clc rep $31 + rts + + + mx %00 +flsop jsr getasc + bcc :ok + rts +:ok lda passnum + bne :pass2 + lda asclength + and #$FF + jmp incobjptr +:pass2 sep $30 + ldx asclength + ldy #$00 +]lup cpx #$00 + beq :clc + lda ascstr,y + phx + phy + and #$7f + cmp #$40 + bge :1 + clc + adc #$40 +:1 jsr putbyte + ply + plx + iny + dex + jmp ]lup +:clc rep $31 + rts + + + mx %00 +mtxop jsr getasc + bcc :ok + rts +:ok lda passnum + bne :pass2 + lda asclength + and #$FF + jmp incobjptr +:pass2 sep $30 + ldx asclength + ldy #$00 +]lup cpx #$00 + beq :clc + lda ascstr,y + phx + phy + and #$1f + ora #$40 + jsr putbyte + ply + plx + iny + dex + jmp ]lup +:clc rep $31 + rts + + + + +dciop jsr getasc + bcc :ok + rts +:ok lda passnum + bne :pass2 + lda asclength + and #$FF + jmp incobjptr +:pass2 sep $30 + ldx asclength + beq :clc + lda ascstr + and #$80 + sta :orflag + ldy #$00 +]lup cpx #$00 + beq :clc + lda ascstr,y + and #$7f + ora :orflag + cpx #$01 + bne :phx + eor #$80 +:phx phx + phy + jsr putbyte + ply + plx + iny + dex + jmp ]lup +:clc rep $31 + rts +:orflag ds 2 + + + + mx %00 +hexop rep $30 + ldy #$00 +]flush lda [lineptr],y + and #$7F + cmp #$20 + blt :err + bne hexop1 + iny + beq ]flush +:err lda #badoperand + sec + rts +hexop1 rep $30 + tya + and #$00FF + tay + stz hexcount +hexop2 sep $30 + stz :temp +:next lda [lineptr],y + iny + cmp #$20+1 + blt :done + cmp #',' + beq :next + cmp #'0' + blt :err + cmp #'9'+$1 + blt :num + and #$5F + cmp #'A' + blt :err + cmp #'F'+$1 + bge :err + sec + sbc #$37 + bra :ok +:num sec + sbc #$30 +:ok asl + asl + asl + asl + sta :temp + lda [lineptr],y + iny + cmp #$20+$1 + blt :err + cmp #'0' + blt :err + cmp #'9'+1 + blt :num1 + and #$5F + cmp #'A' + blt :err + cmp #'F'+$1 + bge :err + sec + sbc #$37 + bra :ok2 +:num1 sec + sbc #$30 +:ok2 ora :temp + ldx passnum + bne :phy + inc hexcount + bne hexop2 + inc hexcount+1 + jmp hexop2 +:phy phy + jsr putbyte + ply + jmp hexop2 +:done rep $30 + ldy passnum + bne :clc + lda hexcount + jmp incobjptr +:clc clc + rts +:err rep $30 + lda #badoperand + sec + rts +:temp ds 2 +hexcount ds 2 + +******************************** +* Print Formatting Psuedo0ops * +******************************** + + mx %00 +astop lda passnum + beq :pass1 + lda listflag+1 + bit #$80 + beq :pass1 + ldx #$00 + jsr eval + bcc :ok + cmp #undeflable + bne :sec1 + lda #forwardref +:sec1 sec + rts +:ok ldal tcursx + and #$ff + cmp #21 + bge :ast + lda #' ' + jsr drawchar + jmp :ok +:ast lda lvalue + and #$00FF + tay +:loop lda #'*' + phy + jsr drawchar + ply + dey + bne :loop + lda #$0D + jsr drawchar + lda #$80 + trb listflag+1 +:pass1 clc + rts + + mx %00 +datop rep $30 + lda #$80 + sta :orflag + ldy #$00 + sep $20 +]lup lda [lineptr],y + and #$7f + iny + cmp #' ' + blt :zero + beq ]lup + rep $20 + ldx #$00 + jsr eval + bcc :v + cmp #undeflable + bne :sec1 + lda #forwardref +:sec1 sec + rts +:zero rep $20 + stz lvalue +:v bit lableused + bpl :bo + lda lvalue + cmp #$09+1 + blt :val +:bo lda #badoperand + sec + rts +:val asl + tax + lda :tbl,x + sta :jsr+1 +:jsr jsr $ffff + rts +:datop lda passnum + beq :pass1 + jsr :convert + +:dat ldy #$00 +:loop lda :buffspace,y + and #$7F + beq :done + sta opcode+1,y + iny + jmp :loop +*:done lda #$0d +* sta opcode+1,y +* iny +:done sep $20 + tya + sta opcode + rep $20 + stz linebuff +:pass1 clc + rts +:buffer ds 24,0 +:buffspace asc ' ' +:buffer1 asc '31-JAN-89 12:00:00 AM',00 +:orflag ds 2 + +:tbl dw :datop + dw :dat1 + dw :dat2 + dw :dat3 + dw :dat4 + dw :dat5 + dw :dat6 + dw :dat7 + dw :dat8 + dw :dat9 +:dat5 stz :orflag + jmp :dat1 +:dat6 stz :orflag + jmp :dat2 +:dat7 stz :orflag + jmp :dat3 +:dat8 stz :orflag + jmp :dat4 +:dat1 lda passnum + beq :d19 + jsr :convert +:d19 ldy #$00 +]lup lda :buffer1,y + and #$7f + ora :orflag + phy + jsr putbyte + ply + iny + cpy #$09 + blt ]lup + clc + rts +:dat2 lda passnum + beq :d29 + psl #:buffer + tll $0F03 +:d29 ldy #$00 +]lup lda :buffer,y + and #$7f + ora :orflag + phy + jsr putbyte + ply + iny + cpy #$08 + blt ]lup + clc + rts +:dat3 lda passnum + beq :d39 + jsr :convert +:d39 ldy #$00 +]lup lda :buffer1,y + and #$7f + ora :orflag + phy + jsr putbyte + ply + iny + cpy #22 + blt ]lup + clc + rts +:dat4 lda passnum + beq :d49 + psl #:buffer + tll $0F03 +:d49 ldy #$00 +]lup lda :buffer,y + and #$7f + ora :orflag + phy + jsr putbyte + ply + iny + cpy #20 + blt ]lup + clc + rts + +:dat9 lda passnum + beq :d91 + pha + pha + pha + pha + tll $0d03 + lda 1,s + jsr putbyte + pla + xba + jsr putbyte + lda 1,s + jsr putbyte + pla + xba + jsr putbyte + lda 1,s + inc + jsr putbyte + pla + xba + inc + jsr putbyte + lda #$00 + jsr putbyte + pla + xba + jsr putbyte + clc + rts +:d91 ldy #$00 +]lup lda #$00 + phy + jsr putbyte + ply + iny + cpy #8 + blt ]lup + clc + rts + +:convert php + rep $30 + pha + pha + pha + pha + tll $0d03 + lda 1,s + and #$ff + jsr :num + sta :buffer1+17 + pla + xba + and #$ff + jsr :num + sta :buffer1+14 + lda 1,s + and #$ff + pha + sep $20 + cmp #12 + bge :pm + lda #'A' + bra :ampm +:pm rep $20 + lda 1,s + sec + sbc #12 + sta 1,s + sep $20 + lda #'P' +:ampm sta :buffer1+20 + rep $20 + pla + asl + tax + lda :htbl,x + sta :buffer1+11 + pla + xba + and #$ff + jsr :num + sta :buffer1+7 + lda 1,s + and #$ff + inc + jsr :num + sta :buffer1+0 + pla + xba + and #$ff + pha + asl + clc + adc 1,s + plx + plx + tax + lda :montbl,x + sta :buffer1+3 + sep $20 + inx + inx + lda :montbl,x + sta :buffer1+5 + plp + rts + +:num php + rep $30 + ldx #'00' + stx :number + sep $20 +]lup cmp #10 + blt :one + sec + sbc #10 + inc :number + jmp ]lup +:one cmp #00 + beq :numxit + dec + inc :number+1 + jmp :one +:numxit rep $20 + lda :number + plp + rts +:number ds 3 + +:htbl asc '12' + asc ' 1' + asc ' 2' + asc ' 3' + asc ' 4' + asc ' 5' + asc ' 6' + asc ' 7' + asc ' 8' + asc ' 9' + asc '10' + asc '11' +:montbl asc 'JAN' + asc 'FEB' + asc 'MAR' + asc 'APR' + asc 'MAY' + asc 'JUN' + asc 'JUL' + asc 'AUG' + asc 'SEP' + asc 'OCT' + asc 'NOV' + asc 'DEC' + + + mx %00 +skpop lda passnum + beq :pass1 + lda listflag+1 + bit #$80 + beq :pass1 + ldx #$00 + jsr eval + bcc :ok + cmp #undeflable + bne :sec1 + lda #forwardref +:sec1 sec + rts +:ok lda lvalue + and #$00FF + tay +:loop lda #$0D + phy + jsr drawchar + ply + dey + bne :loop + lda #$80 + trb listflag+1 +:pass1 clc + rts + + mx %00 +ttlop lda passnum + bne :ttl + clc + rts +:ttl ldy #$00 + sty titlestr + lda #$80 + trb listflag+1 +]flush lda [lineptr],y + iny + and #$7F + cmp #' ' + blt :xit + beq ]flush + sta :delim +:string ldx #$00 +]loop lda [lineptr],y + iny + and #$7F + cmp :delim + beq :done + cmp #' ' + blt :err + sta titlestr+$1,X + inx + cpx #$100 + blt ]loop +:err rep $30 + lda #badoperand + sec + rts +:done txa + sep $30 + sta titlestr +:xit rep $30 + clc + rts + +:delim ds 2 + + mx %00 +pagop lda passnum + beq :clc + lda listflag+1 + bit #$80 + beq :clc + jmp :ok +:clc clc + rts +:ok lda #$0C + jsr drawchar + lda #$80 + trb listflag+1 + clc + rts + + mx %00 +typop lda passnum + bne :ok + clc + rts +:ok ldy #$00 +]lup lda [lineptr],y + and #$7f + cmp #' ' + blt :bad + bne :start + iny + jmp ]lup +:start jsr :check + rep $30 + bcc :eval + and #$FF + sta lvalue + jmp :ok1 +:eval ldx #$00 + jsr eval + bcc :ok1 + cmp #undeflable + bne :sec1 + lda #forwardref + jmp :sec1 +:bad lda #badoperand + jmp :sec1 +:sec1 sec + rts +:ok1 lda lvalue + and #$00FF + sta objtype + + pea 0 + _QALinkerActive + pla + beq :clc + lda lvalue + and #$ff + pha + _QASetObjType + +:clc clc + rts + +:check sep $30 + and #$7f + sta :typ+1 + iny + lda [lineptr],y + and #$7f + cmp #' '+1 + blt :chkbad + sta :typ+2 + iny + lda [lineptr],y + and #$7f + cmp #' '+1 + blt :chkbad + sta :typ+3 + lda #$03 + sta :typ + rep $30 + pea 0 + psl #:typ + _QAConvertTxt2Typ + pla + bcc :found +:chkbad rep $30 + clc + rts +:found rep $30 + sec + rts +:typ ds 4 + + do floatingpoint +floop lda passnum + bne :p2 + ldy #10 +]lup phy + jsr putbyte + ply + dey + bne ]lup + clc + rts +:p2 jsr getasc + bcc :ok + rts +:clc clc + rts +:ok ldx asclength + beq :clc + sep $20 +]lup lda ascstr,x + and #$7f + sta ascstr,x + dex + bne ]lup + lda asclength + sta ascstr-1 + rep $20 + lda #$01 + sta :index + psl #ascstr-1 + psl #:index + psl #:thedec + psl #:vp + fpstr2dec + psl #:thedec + psl #:x + fdec2x + ldx #0 +]lup lda :x,x + phx + jsr putbyte + plx + inx + cpx #10 + blt ]lup + clc + rts +:index ds 2 +:vp ds 2 +:x ds 10 +:thedec ds 33 + else +floop lda #badopcode + sec + rts + fin + + mx %00 +xcop php + sep $30 + ldy #$00 +]lup lda [lineptr],y + and #$7F + cmp #' ' + blt :on + beq :iny + and #$5F + cmp #'F' + beq :off + cmp #'N' + beq :on + cmp #';' + beq :on +:iny iny + jmp ]lup +:on sec + ror xcflag + plp + clc + rts +:off lda #$00 + sta xcflag + lda #%11000000 + tsb mxflag + plp + clc + rts + + mx %00 +xcop1 sep $30 + lda xcflag + and #$C0 + asl + sta xcflag + lda #%11000000 + tsb mxflag + rep $31 + rts + +pauop sep $30 + lda passnum + beq :xit + lda #$80 + trb listflag+1 + rep $30 + pea 0 + _QAKeyAvail + pla + beq :key + pha + _QAGetChar + pla +:key sep $30 + jsr dokeypress + bcc :key +:xit rep $31 + rts + + mx %00 +belop tll $2c03 + lda #$80 + trb listflag+1 + clc + rts + + mx %00 +opcop lda passnum + bne :pass2 + lda #$02 + jmp incobjptr +:pass2 ldy #$00 +:flush lda [lineptr],y + iny + and #$7F + cmp #' ' + blt :err + beq :flush + sta :test + iny + iny + iny + iny + lda [lineptr],y + and #$7F + cmp :test + bne :err + stz :test + dey + dey + dey + dey + sep $30 + sty :yval + ldx #$00 +:add1 lda [lineptr],y + and #$7F + cmp #' '+1 ; set carry bit if <> space + rol :test ; shift up + inx + iny + cpx #4 + blt :add1 ; not done yet. + lda :test + cmp #%1000 ; 1 char? + beq :ok ; yep. + cmp #%1100 ; 2 char? + beq :ok ; yep. + cmp #%1110 ; 3 char? + beq :ok + cmp #%1111 ; 4 char? + beq :ok ; good and fine + +:err rep $30 + lda #badoperand + sec + rts + + mx %11 +:ok stz :psop+1 + ldy :yval + lda [lineptr],y + asl + asl + asl ; x8 + sta :psop+0 + iny + lda [lineptr],y + lsr + ror :psop+1 + lsr + ror :psop+1 + and #7 + ora :psop+0 + sta :psop+0 + iny + lda [lineptr],y + and #$1F + asl + ora :psop+1 + pha + iny + lda [lineptr],y + iny + iny + sty :yval + tay + pla + cpy #'L' + beq :o0 ; carry set if equal + cpy #'l' ; same here. + beq :o0 + clc ; not equal. +:o0 adc #0 ; set b0 if "D" or 'd' + sta :psop+1 + lda :psop+$1 + rep $30 + jsr putbyte + lda :psop + jsr putbyte + + jmp :xit + + lda reloffset + sta linerel + stz relout + lda :yval + and #$00FF + tay + lda [lineptr],y + and #$7F + cmp #',' + beq :iny + cmp #';' + bne :err1 +:iny iny + tyx + jsr eval + bcc :okxit + rts +:err1 lda #badoperand + sec + rts +:okxit stx :yval + lda lvalue + jsr putbyte + lda lvalue+$1 + jsr putbyte + rep $30 + jsr relcorrect + bcc :ok3 + plp + sec + rts +:ok3 lda :yval + and #$00FF + tay + lda [lineptr],y + and #$7F + cmp #',' + beq :iny2 + cmp #';' + bne :err12 +:iny2 iny + tyx + jsr eval + bcc :okxit1 + rts +:err12 lda #badoperand + sec + rts +:okxit1 stx :yval + lda reloffset + sta linerel + stz relout + + lda lvalue + jsr putbyte + lda lvalue+$1 + jsr putbyte + rep $30 + jmp relcorrect +:xit rep $30 + clc + rts + +:psop hex 0000 +:test hex 0000 +:yval ds 2 + + + mx %00 +varop lda macflag + and #%01100000 + beq :var + lda #badopcode + sec + rts +:var lda #$01 + sta :number + lda #$00 + sta :pos + sep $30 + ldy #$00 +]lup lda [lineptr],y + iny + and #$7f + cmp #' ' + blt :bad + beq ]lup + cmp #';' + beq :bad + dey + sty :pos + jmp :loop +:bad rep $30 + lda #badoperand + sec + rts +:loop rep $30 + lda :number + cmp #$09 + jge :xit + and #$7f + ora #$30 + sta labstr+2 + lda #$5d02 + sta labstr + lda #$ffff + sta fllast + jsr findlable + bcs :eval + stz labnum + stz labval + stz labval+2 + lda #$ffff + sta lableft + sta labright + sta lablocal + sta labprev + jsr insertlable + stz fllast + dec fllast + bcc :eval + rts +:eval ldy #16 + lda [lableptr],y + sta :label + lda #$ffff + sta lableused + ldx :pos + jsr eval + stx :pos + bcc :save + rts +:save lda :label + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #26 + lda [lableptr],y + and #$7FFF + bit lableused + bpl :rel + ora #absolutebit ;**** CAN'T FORCE ALL EQU TO ABSOLUTE +:rel sta [lableptr],y + iny + iny + lda lvalue + sta [lableptr],y + iny + iny + lda lvalue+2 + sta [lableptr],y + ldy :pos +]lup lda [lineptr],y + iny + and #$7f + cmp #' '+1 + blt :xit + sty :pos + inc :number + jmp :loop +:xit rep $31 + rts +:pos ds 2 +:number ds 2 +:label ds 2 + +objop clc ;do nothing opcode + rts + + +errop lda passnum + bne :ok +:clc clc + rts +:ok ldy #$00 +]lup lda [lineptr],y + iny + and #$7f + cmp #' ' + blt :bad + beq ]lup + cmp #';' + beq :bad + cmp #'(' + beq :bad + cmp #'\' + jeq :relit + jmp :norel +:bad lda #badoperand + sec + rts +:norel tyx + dex +]lup iny + lda [lineptr],y + and #$7f + cmp #' '+1 + blt :norm + cmp #'(' + beq :bad + cmp #')' + beq :bad + bra ]lup +:norm jsr eval + bcc :ok1 +:sec1 sec + rts +:ok1 lda modeflag + bit #relflag + beq :ok2 + bit lableused + bmi :ok2 + jmp :badrel +:ok2 lda lvalue + ora lvalue+$2 + beq :clc + lda #usererror + sec + rts +:relit lda modeflag + bit #relflag + bne :enter + tyx + jmp :norm +:enter tyx + lda #$FFFF + sta lableused + jsr eval + bcs :sec1 + bit lableused + bpl :badrel + lda errvalid + beq :first + lda lvalue+2 + and #$ff + sta lvalue+2 + lda erraddress+2 + cmp lvalue+2 + blt :eclc + bne :first + lda erraddress + cmp lvalue + blt :eclc +:first lda #$ffff + sta errvalid + lda lvalue + sta erraddress + lda lvalue+2 + and #$ff + sta erraddress+2 +:eclc clc + rts +:badrel lda #badrelative + sec + rts +:relfull lda #relfull + sec + rts + + mx %00 +symop lda #symflag + tsb modeflag1 + clc + rts + diff --git a/src/asm/asm.vars.s b/src/asm/asm.vars.s new file mode 100644 index 0000000..970b68d --- /dev/null +++ b/src/asm/asm.vars.s @@ -0,0 +1,376 @@ + tr on + +tcursx equ $57b + +true equ $FFFF +false equ $0 + +stopgo equ false +floatingpoint equ true + +memid equ $100 +putid equ $200 +useid equ $300 + +initobjsize equ $FFFF +dskobjsize equ $1000 +relsize equ $8000 +macsize equ $C00*8 +macnestmax equ 16 ;max mac nest level +maxput equ 16 ;max put OR use/lib files (each) +maxlup equ 16 ;max lup nesting + +**** errcode equates **** + +noerror equ $00 +undeflable equ $02 +duplable equ $03 +misalignment equ $04 + +badoperand equ $05 + +notmacro equ $07 +badopchar equ $08 +badconditional equ $09 +badaddress equ $0A +badbranch equ $0B +forwardref equ $0C +twoexternals equ $0D +badrelative equ $0E +saneerror equ $0F +evaltoocomplex equ $10 + +objectfull equ $81 +symfull equ $82 +memfull equ $83 +badput equ $84 +doserror equ $85 +relfull equ $86 +usererror equ $87 +macrofull equ $88 +badmacro equ $89 +nesterror equ $8A +badsav equ $8B +badopcode equ $8C +badinput equ $8F +badlable equ $90 +relfilefull equ $91 +*badoperand equ $92 + + +filemismatch equ $5C + + +*** Symbol Types *** + +localbit = %0000_0000_0000_0001 +variablebit = %0000_0000_0000_0010 +macrobit = %0000_0000_0000_0100 +equatebit = %0000_0000_0000_1000 +externalbit = %0000_0000_0001_0000 +macvarbit = %0000_0000_0010_0000 +linkerbit = %0001_0000_0000_0000 +usedbit = %0010_0000_0000_0000 +entrybit = %0100_0000_0000_0000 +absolutebit = %1000_0000_0000_0000 + + + +*** Assembly Zpage Equates *** + dum $00 + +labstr ds 16 ;Lable STR that we are working on +labnum ds 2 ;REC num of current lable +lableft ds 2 ;B-Tree Structures +labright ds 2 +labprev ds 2 +lablocal ds 2 ;REC of Local Lable Tree +labtype ds 2 ;Type of Label +labval ds 4 ;EQU value of Lable + +globlab ds 2 ;REC of Current Global Lable +lineptr ds 4 +printptr ds 4 +linelable ds 2 +linehaslab ds 2 +linelabtxt ds 16,0 +linenum ds 2 +totallines ds 2 + +fileptr ds 4 +flen ds 4 +filehandle ds 4 +filelen ds 4 + +lableptr ds 4 +lableptr1 ds 4 +nextlableptr ds 4 + +objzpptr ds 4 +relptr ds 4 +macptr ds 4 +macvarptr ds 2 + +objct ds 2 +objsize ds 2 +objptr ds 4 +objoffset ds 4 +relct ds 2 +relout ds 2 +reloffset ds 4 +totbytes ds 4 +linerel ds 2 + +equateval ds 4 + +passnum ds 2 +doneflag ds 2 + +modeflag ds 1 + +relflag = %10000000 +dskflag = %01000000 +putflag = %00100000 +useflag = %00010000 +lupflag = %00001000 +dumflag = %00000100 +caseflag = %00000010 +doflag = %00000001 + ds 1 +tbxflag = %10000000 +algflag = %01000000 +encflag = %00100000 +cycflag = %00010000 +crcflag = %00001000 +ifflag = %00000100 +expflag = %00000010 +exponly = %00000001 + +modeflag1 ds 1 +dupok = %00000001 +symflag = %00000010 + ds 1 + +macflag ds 1 + ;b7 mac executing + ;b6 external mac + ;b5 internal mac + ;b0 mac init + + + +listflag ds 2 + +liston = %10000000 +lstdoon = %01000000 +tradron = %00100000 +branchlst = %00010000 +lbranchlst = %00001000 +equlst = %00000100 +trobjlst = %00000010 +objlst = %00000001 + + +putuse ds 2 +mxflag ds 1 +xcflag ds 1 +forcelong ds 1 +notfound ds 1 +clrglob ds 1 +lableused ds 2 +allmath ds 2 ;true = all numbers, 0 = label (after eval) +opflags ds 2 +opdata ds 2 +opcodeword ds 2 + +lvalue ds 4 +myvalue ds 4 +noshift ds 4 +lineobjptr ds 4 + +xreg ds 4 ;variables used by EVAL +yreg ds 4 +val ds 4 +xrel ds 2 +yrel ds 2 +zrel ds 2 +op ds 2 +top ds 2 +deczp ds 2 + +checksum ds 1 +crc16 ds 2 +cycles ds 2 +cycleavg ds 2 +linecycles ds 2 +cyclemarks ds 2 +cycflags ds 1 +encval ds 1 +tbxand ds 1 +firstchar ds 2 +merrcode ds 2 + +linksymtbl ds 4 +linksymhdl ds 4 + +keyflag ds 2 + +controld = %1000_0000 +cancelflag = %0100_0000 +pauseflag = %0010_0000 +spaceflag = %0001_0000 + +workspace ds 16 + err */$100 + dend + +* lst +*dpend equ workspace+16 ;length of DP storage +* lst rtn + + +*** Variables *** + +loadid ds 2 +putlevel ds 2 +uselevel ds 2 + +opcode ds 32,0 ;current opcode +lastlen ds 2 ;length of last line + + ds 2 ;must be before linebuff +linebuff ds 128,0 ;operand goes here + +comment ds 256,0 + +objhdl ds 4 ;handle to object buffer + +lablect ds 2 +globalct ds 2 +rellabct ds 2 +oldglob ds 2 +dolevel ds 2 +domask ds 2 +maclevel ds 2 +maclocal ds 2 +dumor ds 2 +orgor ds 2 +fllast ds 2 + +opmask ds 2 ;EVAL variables +number ds 2 +bracevalid ds 2 +estack ds 2 +evallevel ds 2 +evalrelok ds 2 +offset ds 2 +shiftct ds 2 +bytesout ds 256+2,0 +prodoserr ds 2 +errorct ds 2 +objtype ds 2 +objfull ds 2 + +tlinenum ds 2 + +oldobj ds 4 +oldoffset ds 4 +orgval ds 4 + +extmacptr ds 4,0 +dsfill ds 2 +dsoffset ds 2 +erraddress ds 4 +errvalid ds 2 +entcount ds 2 +extcount ds 2 + +tabs dfb 26,36,41,54 + +macstack ds macnestmax+1*32,0 +macvars ds macnestmax+1*128,0 + +luplevel ds 2 + +dskopen dw $00 + adrl dskpath + adrl $0000 + +dskwrite dw $00 +dskbuff adrl $0000 +dskreq adrl $0000 +dsktran adrl $0000 + +dskeofparm dw $00 +dskeof adrl $0000 + +dskcreate adrl dskpath + dw $e3 +dskctype dw $00 +dskcaux adrl $00 + dw $01 +dskctime adrl $0000 +dskinfo adrl dskpath + dw $00 +dsktype dw $00 +dskaux adrl $0000 + ds 16,0 +dskdelete adrl dskpath + +dskclose dw $00 +dskpath ds 129,0 + +atable ds 128*2,0 + +titlestr ds 256,0 + +converttable + hex 00000000000000000000000000000000 + hex 00000000000000000000000000000000 + asc ' !"#$%&' + hex 27 ;the ' character + asc '()*+,-./' + asc '0123456789' + asc ':;<=>?' + asc '@ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '[\]^_' + asc '@ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '[\]^_' ;DEL is last character + hex 00000000000000000000000000000000 + hex 00000000000000000000000000000000 + asc ' !"#$%&' + hex 27 ;the ' character + asc '()*+,-./' + asc '0123456789' + asc ':;<=>?' + asc '@ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '[\]^_' + asc '@ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '[\]^_' ;DEL is last character + +inputtbl + hex 202020202020202020202020200d2020 + hex 20202020202020202020202020202020 + asc ' !"#$%&' + hex 27 ;the ' character + asc '()*+,-./' + asc '0123456789' + asc ':;<=>?' + asc '@ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '[\]^_' + asc '`abcdefghijklmnopqrstuvwxyz' + asc '{|}~' + hex 20 ;delete + hex 202020202020202020202020200d2020 + hex 20202020202020202020202020202020 + asc ' !"#$%&' + hex 27 ;the ' character + asc '()*+,-./' + asc '0123456789' + asc ':;<=>?' + asc '@ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '[\]^_' + asc '`abcdefghijklmnopqrstuvwxyz' + asc '{|}~' + hex 20 ;delete + diff --git a/src/data/external.s b/src/data/external.s new file mode 100644 index 0000000..8b77ddd --- /dev/null +++ b/src/data/external.s @@ -0,0 +1,109 @@ + lst off + tr on + exp only + typ EXE ;we are a shell 'command' + rel + xc + xc + mx %00 ; make sure we're in 16-bit mode! + + use 4/util.macs + + brl start ;starts with 8 branches + brl rtl + brl rtl + brl rtl + brl rtl + brl rtl + brl rtl + brl rtl + dw $00 + asc 'MERLIN' ;id number + +ptr equ 0 + +userid ds 2 +commandline ds 129,0 + +rtl rtl + +start rep $30 + phk + plb + sta userid + stx ptr+2 + sty ptr + ldy #$00 + sep $20 +]lup lda [ptr],y + and #$7f + cmp :id,y + bne :xit + iny + cpy #$08 + blt ]lup + ldx #$00 +]f lda [ptr],y + and #$7f + cmp #' ' + blt :xit + beq :iny + cpx #$00 + bne :ok + iny + jmp ]f +:iny iny + inx + jmp ]f +:ok sep $20 + ldx #$00 + sta commandline+1,x +]get inx + iny + lda [ptr],y + and #$7f + cmp #' '+1 + blt :set + sta commandline+1,x + jmp ]get +:set txa + sta commandline + rep $30 + jsr doit +:xit rep $30 + jsl prodos + dw $29 + adrl :quit + brk $00 +:quit adrl $00 + dw $00 + +:id asc 'MERLINGS' + +doit php + rep $30 + lda commandline + and #$ff + tax + lda commandline,x + and #$7f + cmp #'/' + beq :nosuff + inx + lda #'.S' + sta commandline,x + inx + txa + sep $20 + sta commandline +:nosuff rep $30 + psl #commandline + tll $1c0c + pea "|" + tll $180c + plp + rts + + sav 6/external.l + + diff --git a/src/data/globals.s b/src/data/globals.s new file mode 100644 index 0000000..ee562ed --- /dev/null +++ b/src/data/globals.s @@ -0,0 +1,101 @@ + lst off + +maxsymbols equ $2000 + +shellflag = %0000_0001 ;shell +asmflag = %0000_0010 ;asm +linkflag = %0000_0100 ;linker +editflag = %0000_1000 ;editor +cmddflag = %0001_0000 ;command processor + +shellmemid = $100 ;these are OR'd with individual USERIDs +asmmemid = $100 ;and are GLOBAL...individual programs +linkmemid = $100 ;should request/dispose memory of an ID +editmemid = $100 ;HIGHER than these on a local basis. +cmdmemid = $100 + + dum $00 + +shelldp ds 2 +globalsdp ds 2 +asmdp ds 2 +linkdp ds 2 +editdp ds 2 +cmddp ds 2 + +goshellptr ds 4 +goasmptr ds 4 +golinkptr ds 4 +goeditptr ds 4 +gocmdptr ds 4 + +idactive ds 2 ;use flags above +idloaded ds 2 + +shellhandle ds 4 +asmhandle ds 4 +linkhandle ds 4 +edithandle ds 4 +cmdhandle ds 4 + +shellptr ds 4 +asmptr ds 4 +linkptr ds 4 +editptr ds 4 +cmdptr ds 4 + +shelluserid ds 2 +asmuserid ds 2 +linkuserid ds 2 +edituserid ds 2 +cmduserid ds 2 + + +shelllable ds 32 ;used to pass lables between programs +gobjtype ds 2 ;default filetype for sav/link +gobjaux ds 4 ;default auxtype for sav/link + +keyquit ds 2 +shellerrors ds 2 ;used to pass error counts +lasterror ds 2 ;code of last error to occur + +objcodesaved ds 2 ;<>0 if object code saved by asm + +linkfileptr ds 4 ;pointer to passed data for linker +linkhdlid ds 2 ;0 = command line + ;1 = loaded TXT file + +asmfileptr ds 4 ;pointer to passed data for assembler +asmhdlid ds 2 ;0 = command line + ;1 = loaded TXT file + ;2 = filename +asmfilelen ds 4 ;if above = 1 then this is length of file + + +editfileptr ds 4 ;pointer to passed data for editor +edithdlid ds 2 ;0 = command line + ;1 = loaded TXT file + +cmdfileptr ds 4 ;pointer to passed data for cmd processor +cmdhdlid ds 2 ;0 = command line + ;1 = loaded TXT file + +editlinenum ds 2 ;editors current line number + +linksymhdl ds 4 +linksymtbl ds 4 +linksymnum ds 2 +linklstflag ds 2 +linknextlbl ds 4 +linkkbdptr ds 4 + +extmacptr ds 4 +usrptr ds 4 +userptr ds 4 + + err */$100 + dend + + lst rtn + + diff --git a/src/data/opcodetest.s b/src/data/opcodetest.s new file mode 100644 index 0000000..f1c78c4 --- /dev/null +++ b/src/data/opcodetest.s @@ -0,0 +1,407 @@ + lst off + tr adr + xc + xc + cyc avg + + rel +* dsk object/optest.l + + mx %00 + + rep #$FF + sep #$FF ;so we don't mess up MX status + ;each are 3 cycles + xba ;2 cycles + + mx %11 + ;14 +imediate ;# 2 and 3 cycles + ldy #$FFFF + cpy #$FFFF + cpx #$FFFF + ldx #$FFFF + ora #$FFFF + and #$FFFF + eor #$FFFF + adc #$FFFF + bit #$FFFF + lda #$FFFF + cmp #$FFFF + sbc #$FFFF + + ldy #$FFFF + cpy #$FFFF + cpx #$FFFF + ldx #$FFFF + ora #$FFFF + and #$FFFF + eor #$FFFF + adc #$FFFF + bit #$FFFF + lda #$FFFF + cmp #$FFFF + sbc #$FFFF + +;16 +absolute ;a 4 and 5 cycles + bit $FFFF + sty $FFFF + stz $FFFF + ldy $FFFF + cpy $FFFF + cpx $FFFF + stx $FFFF + ldx $FFFF + ora $FFFF + and $FFFF + eor $FFFF + adc $FFFF + sta $FFFF + lda $FFFF + cmp $FFFF + sbc $FFFF + + +;8 +absolutermw ;a (r/m/w) 6 and 8 + + asl $FFFF + rol $FFFF + lsr $FFFF + ror $FFFF + dec $FFFF + inc $FFFF + tsb $FFFF + trb $FFFF + + ;2 +absjump + jmp $FFFF ;3 cycles + jsr $FFFF ;6 cycles + +;8 +abslong ;5 and 6 cycles + oral $FFFFFF + andl $FFFFFF + eorl $FFFFFF + adcl $FFFFFF + stal $FFFFFF + ldal $FFFFFF + cmpl $FFFFFF + sbcl $FFFFFF + +;2 +absljmp + jml $FFFFFF ;4 cycles + jsl $FFFFFF ;8 cycles + + ;16 +direct ;d 3,4 and 5 cycles + bit $FF + sty $FF + stz $FF + ldy $FF + cpy $FF + cpx $FF + stx $FF + ldx $FF + ora $FF + and $FF + eor $FF + adc $FF + sta $FF + lda $FF + cmp $FF + sbc $FF + + ;8 +directrmw ;d (r/m/w) 5,6,7 and 8 + asl $FF + rol $FF + lsr $FF + ror $FF + dec $FF + inc $FF + tsb $FF + trb $FF + + ;6 +areg ;2 cycles + asl + inc + rol + dec + lsr + ror + + +;25 +implied ;2 cycles + + dey + iny + inx + dex + nop + tya + tay + txa + txs + tax + tsx + tcs + tsc + tcd + tdc + txy + tyx + clc + sec + cli + sei + clv + cld + sed + + ;1 +implied1 + xba ;3 cycles + + ;2 +wait ;3 cycles + wai + stp + + ;8 +dii ;(d),y 5,6,7, and 8 + ora ($ff),y + and ($ff),y + eor ($ff),y + adc ($ff),y + sta ($ff),y + lda ($ff),y + cmp ($ff),y + sbc ($ff),y + + ;8 +diil ;[d],y 6,7, and 8 + ora [$ff],y + and [$ff],y + eor [$ff],y + adc [$ff],y + sta [$ff],y + lda [$ff],y + cmp [$ff],y + sbc [$ff],y + + ;8 +diix ;(d,x) 6,7, and 8 + ora ($FF,X) + and ($FF,X) + eor ($FF,X) + adc ($FF,X) + sta ($FF,X) + lda ($FF,X) + cmp ($FF,X) + sbc ($FF,X) + + + ;12 +dx ;d,x 4,5, and 6 + bit $FF,x + stz $FF,x + sty $FF,x + ldy $FF,x + ora $FF,x + and $FF,x + eor $FF,x + adc $FF,x + sta $FF,x + lda $FF,x + cmp $FF,x + sbc $FF,x + + ;6 +dxrwm ;d,x (r/m/w) 6,7,8, and 9 + asl $FF,x + rol $FF,x + lsr $FF,x + ror $FF,x + dec $FF,x + inc $FF,x + + ;2 +dy ;d,y 4,5 and 6 + stx $FF,y + ldx $FF,y + + ;11 +absx ;a,x 4,5 and 6 + bit $FFFF,x + ldy $FFFF,x + stz $FFFF,x + ora $FFFF,x + and $FFFF,x + eor $FFFF,x + adc $FFFF,x + sta $FFFF,x + lda $FFFF,x + cmp $FFFF,x + sbc $FFFF,x + + ;6 +absxrmw ;a,x (r/m/w) 7 and 9 + asl $FFFF,x + rol $FFFF,x + lsr $FFFF,x + ror $FFFF,x + dec $FFFF,x + inc $FFFF,x + + ;8 +abslx ;al,x 5 and 6 + oral $FFFFFF,x + andl $FFFFFF,x + eorl $FFFFFF,x + adcl $FFFFFF,x + stal $FFFFFF,x + ldal $FFFFFF,x + cmpl $FFFFFF,x + sbcl $FFFFFF,x + + ;9 +absy ;a,y 4,5 and 6 + ldx $FFFF,y + ora $FFFF,y + and $FFFF,y + eor $FFFF,y + adc $FFFF,y + sta $FFFF,y + lda $FFFF,y + cmp $FFFF,y + sbc $FFFF,y + + ;9 +relative ;2,3 and 4 + bpl relative + bmi relative + bvc relative + bvs relative + bcc relative + bcs relative + bne relative + beq relative + bra relative + + ;1 +relativelong ;4 cycles + brl relativelong + + ;2 +indirjmp + jmp ($FFFF) ;5 3 bytes + jml [$FFFF] ;6 3 bytes +; jml ($ffff) ;5 cycles + + ;8 +dindirect ;(d) 5,6,and 7 + ora ($ff) + and ($ff) + eor ($ff) + adc ($ff) + sta ($ff) + lda ($ff) + cmp ($ff) + sbc ($ff) + + ;8 +dindirectl ;[d] 6,7, and 8 + ora [$ff],y + and [$ff],y + eor [$ff],y + adc [$ff],y + sta [$ff],y + lda [$ff],y + cmp [$ff],y + sbc [$ff],y + + ;2 +abdindinx + jmp ($FFFF,x) ;6 + jsr ($FFFF,x) ;8 + ;2 +interupts + brk $FF ;7 and 8 (7 if E=1) + cop $FF ;7 and 8 + + ;3 +stackreturn + rti ;6 and 7 + rts ;6 + rtl ;6 + + ;7 +stackpush ;3 and 4 + php + pha + phy + phx + phd + phk + phb + + ;6 +stackpull ;4 and 5 + plp + pla + ply + plx + pld + plb + + ;3 +stackadd + pei $FF ;6 and 7 + pea $FFFF ;5 + per $FFFF ;6 + +;8 +stackrel ;d,s 4 and 5 + ora $FF,s + and $FF,s + eor $FF,s + adc $FF,s + sta $FF,s + lda $FF,s + cmp $FF,s + sbc $FF,s + + ;8 +stackrely ;d,s 7 and 8 + ora ($FF,s),y + and ($FF,s),y + eor ($FF,s),y + adc ($FF,s),y + sta ($FF,s),y + lda ($FF,s),y + cmp ($FF,s),y + sbc ($FF,s),y + + + ;2 +move ;7 cycles per byte + + mvn $123456,$123456 + mvp $123456,$123456 + +misc wdm $FF + + + lst + chk + lst off + +* sav object/optest.1 + + diff --git a/src/data/opdata.s b/src/data/opdata.s new file mode 100644 index 0000000..1059462 --- /dev/null +++ b/src/data/opdata.s @@ -0,0 +1,1371 @@ +p6502 = %0000_0000_0000_0000 +p65C02 = %1000_0000_0000_0000 +p65816 = %1100_0000_0000_0000 +m6502 = %0000_0000_0000_0000 +m65C02 = %1000_0000_0000_0000 +m65816 = %1100_0000_0000_0000 +conditional = %0010_0000_0000_0000 +branch = %0001_0000_0000_0000 +onebyte = %0000_1000_0000_0000 +general = %0000_0100_0000_0000 +long = %0000_0010_0000_0000 +macro = %0000_0001_0000_0000 + +psuedo = %0000_0000_1000_0000 +mY = %0000_0000_0100_0000 +mX = %0000_0000_0010_0000 +mA = %0000_0000_0001_0000 + + mx %00 +op31code opcl $00;$00;$00 +op30code opcl '>>> ';psuedo.macro.p6502;pmcop +op29code opcl '= ';psuedo.p6502;equop +op28code opcl '<<< ';psuedo.macro.p6502;eomop +op27code opcl $00;$00;$00 +opzcode opcl $00;$00;$00 +opycode opcl $00;$00;$00 +opxcode opco 'XC- ';psuedo.p6502;xcop1 + opco 'XCE ';m65816;xceop + opco 'XC ';psuedo.p6502;xcop + opcl 'XBA ';onebyte.m65816;$EB +opwcode opco 'WDM ';m65816;wdmop + opcl 'WAI ';onebyte.m65c02;$CB +opvcode opcl 'VAR ';psuedo.p6502;varop +opucode opco 'USR ';psuedo.p6502;opcop ;*** change this + opcl 'USE ';psuedo.p6502;useop +optcode opco 'TYX ';onebyte.m65816;$BB + opco 'TYP ';psuedo.p6502;typop + opco 'TYA ';onebyte.m6502;$98 + opco 'TXY ';onebyte.m65816;$9B + opco 'TXS ';onebyte.m6502;$9A + opco 'TXA ';onebyte.m6502;$8A + opco 'TTL ';psuedo.p6502;ttlop + opco 'TSX ';onebyte.m6502;$BA + opco 'TSC ';onebyte.m65816;$3B + opco 'TSB ';m65c02.general;tsbtbl + opco 'TSA ';onebyte.m65816;$3B + opco 'TRB ';m65c02.general;trbtbl + opco 'TR ';psuedo.p6502;trop + opco 'TDC ';onebyte.m65816;$7B + opco 'TDA ';onebyte.m65816;$7B + opco 'TCS ';onebyte.m65816;$1B + opco 'TCD ';onebyte.m65816;$5b + opco 'TBX ';psuedo.p65816;tbxop + opco 'TAY ';onebyte.m6502;$a8 + opco 'TAX ';onebyte.m6502;$aa + opco 'TAS ';onebyte.m65816;$1b + opcl 'TAD ';onebyte.m65816;$5b +opscode opco 'SYM ';psuedo.p6502;symop + opco 'SWA ';onebyte.m65816;$eb + opco 'STZ ';general.m6502.mA;stztbl + opco 'STY ';general.m6502.mY;stytbl + opco 'STX ';general.m6502.mX;stxtbl + opco 'STRL';psuedo.p6502;strlop + opco 'STR ';psuedo.p6502;strop + opco 'STP ';onebyte.m65c02;$db + opco 'STAL';general.long.m65816.mA;statbl + opco 'STA ';general.m6502.mA;statbl + opco 'SKP ';psuedo.p6502;skpop + opco 'SEP ';m65816;sepop + opco 'SEI ';onebyte.m6502;$78 + opco 'SED ';onebyte.m6502;$f8 + opco 'SEC ';onebyte.m6502;$38 + opco 'SBCL';general.long.m65816.mA;sbctbl + opco 'SBC ';general.m6502.mA;sbctbl + opcl 'SAV ';psuedo.p6502;savop +oprcode opco 'RTS ';onebyte.m6502;$60 + opco 'RTL ';onebyte.m65816;$6b + opco 'RTI ';onebyte.m6502;$40 + opco 'ROR ';general.m6502.mA;rortbl + opco 'ROL ';general.m6502.mA;roltbl + opco 'RND ';psuedo.p6502;rndop + opco 'REV ';psuedo.p6502;revop + opco 'REP ';m65816;repop + opcl 'REL ';psuedo.p6502;relop +opqcode opcl $00;$00;$00 +oppcode opco 'PUT ';psuedo.p6502;putop + opco 'PMC ';psuedo.macro.p6502;pmcop + opco 'PLY ';onebyte.m65C02;$7a + opco 'PLX ';onebyte.m65C02;$fa + opco 'PLP ';onebyte.m6502;$28 + opco 'PLD ';onebyte.m65816;$2b + opco 'PLB ';onebyte.m65816;$ab + opco 'PLA ';onebyte.m6502;$68 + opco 'PHY ';onebyte.m65C02;$5a + opco 'PHX ';onebyte.m65C02;$da + opco 'PHP ';onebyte.m6502;$08 + opco 'PHK ';onebyte.m65816;$4b + opco 'PHD ';onebyte.m65816;$0b + opco 'PHB ';onebyte.m65816;$8b + opco 'PHA ';onebyte.m6502;$48 + opco 'PER ';m65816;perop + opco 'PEK ';psuedo.p6502;pekop + opco 'PEI ';m65816.general;peitbl + opco 'PEA ';m65816;peaop + opco 'PAU ';psuedo.p6502;pauop + opcl 'PAG ';psuedo.p6502;pagop +opocode opco 'ORG ';psuedo.p6502;orgop + opco 'ORAL';general.long.m65816.mA;oratbl + opco 'ORA ';general.m6502.mA;oratbl + opcl 'OBJ ';psuedo.p6502;objop +opncode opcl 'NOP ';onebyte.m6502;$ea +opmcode opco 'MX ';psuedo.p65816;mxop + opco 'MVP ';m65816;mvpop + opco 'MVN ';m65816;mvnop + opco 'MTX ';psuedo.p6502;mtxop + opco '--^ ';psuedo.p6502;lupend + opcl 'MAC ';psuedo.macro.p6502;macop +oplcode opco 'LUP ';psuedo.p6502;lupop + opco 'LSTL';psuedo.p6502;lstdoop + opco 'LST ';psuedo.p6502;lstop + opco 'LSR ';general.m6502.mA;lsrtbl + opco 'LIB ';psuedo.p6502;libop + opco 'LDY ';general.m6502.mY;ldytbl + opco 'LDX ';general.m6502.mX;ldxtbl + opco 'LDAL';general.long.m65816.mA;ldatbl + lst + opcl 'LDA ';general.m6502.mA;ldatbl + lst off +opkcode opcl 'KBD ';psuedo.p6502;kbdop +opjcode opco 'JSR ';m6502;jsrop + opco 'JSL ';m65816;jslop + opco 'JMP ';m6502;jmpop + opcl 'JML ';m65816;jmlop +opicode opco 'INY ';onebyte.m6502;$c8 + opco 'INX ';onebyte.m6502;$e8 + opco 'INV ';psuedo.p6502;invop + opco 'INC ';general.m6502.mA;inctbl + opco 'INA ';onebyte.m65C02.mA;$1A + opcl 'IF ';psuedo.conditional.p6502;ifop +ophcode opcl 'HEX ';psuedo.p6502;hexop +opgcode opcl $00;$00;$00 +opfcode opco 'FLS ';psuedo.p6502;flsop + + do floatingpoint + opco 'FLO ';psuedo.m6502;floop + fin + + opcl 'FIN ';psuedo.conditional.p6502;finop +opecode opco 'EXT ';psuedo.p6502;extop + opco 'EXP ';psuedo.p6502;expop + opco 'EXD ';psuedo.p6502;exdop + opco 'EVL ';psuedo.p6502;evlop + opco 'ERR ';psuedo.p6502;errop + opco 'EQU ';psuedo.p6502;equop + opco 'EORL';general.long.m65816.mA;eortbl + opco 'EOR ';general.m6502.mA;eortbl + opco 'EOM ';psuedo.macro.p6502;eomop + opco 'ENT ';psuedo.p6502;entop + opco 'END ';psuedo.p6502;endop + opco 'ENC ';psuedo.p6502;encop + opcl 'ELS ';psuedo.conditional.p6502;elseop +opdcode opco 'DW ';psuedo.p6502;dwop + opco 'DUP ';psuedo.p6502;dupop + opco 'DUM ';psuedo.p6502;dumop + opco 'DSK ';psuedo.p6502;dskop + opco 'DS ';psuedo.p6502;dsop + opco 'DO ';psuedo.conditional.p6502;doop + opco 'DL ';psuedo.p6502;adrlop + opco 'DFS ';psuedo.p6502;dsop + opco 'DFB ';psuedo.p6502;dfbop + opco 'DEY ';onebyte.m6502;$88 + opco 'DEX ';onebyte.m6502;$ca + opco 'DEN ';psuedo.p6502;dendop + opco 'DEC ';general.m6502.mA;dectbl + opco 'DEA ';onebyte.m65C02.mA;$3A + opco 'DDB ';psuedo.p6502;ddbop + opco 'DCI ';psuedo.p6502;dciop + opco 'DBY ';psuedo.p6502;ddbop + opco 'DB ';psuedo.p6502;dfbop + opco 'DAT ';psuedo.p6502;datop + opcl 'DA ';psuedo.p6502;dwop +opccode opco 'CYC ';psuedo.p6502;cycop + opco 'CRC ';psuedo.p6502;crcop + opco 'CPY ';general.m6502.mY;cpytbl + opco 'CPX ';general.m6502.mX;cpxtbl + opco 'COP ';m65816;copop + opco 'CMPL';general.long.m65816.mA;cmptbl + opco 'CMP ';general.m6502.mA;cmptbl + opco 'CLV ';onebyte.m6502;$b8 + opco 'CLI ';onebyte.m6502;$58 + opco 'CLD ';onebyte.m6502;$d8 + opco 'CLC ';onebyte.m6502;$18 + opco 'CHK ';psuedo.p6502;chkop + opcl 'CAS ';psuedo.p6502;casop +opbcode opco 'BYT ';psuedo.p6502;dfbop + opco 'BVS ';branch.m6502;$70 + opco 'BVC ';branch.m6502;$50 + opco 'BTR ';branch.m6502;$d0 + opco 'BRL ';branch.m65816;$82+$800 + opco 'BRK ';m6502;brkop + opco 'BRA ';branch.m65C02;$80+$400 + opco 'BPL ';branch.m6502;$10 + opco 'BNE ';branch.m6502;$d0 + opco 'BMI ';branch.m6502;$30 + opco 'BLT ';branch.m6502;$90 + opco 'BIT ';general.m6502.mA;bittbl + opco 'BGE ';branch.m6502;$b0 + opco 'BFL ';branch.m6502;$f0 + opco 'BEQ ';branch.m6502;$f0 + opco 'BEL ';psuedo.p6502;belop + opco 'BCS ';branch.m6502;$b0 + opcl 'BCC ';branch.m6502;$90 +opacode opco 'AST ';psuedo.p6502;astop + opco 'ASL ';general.m6502.mA;asltbl + opco 'ASC ';psuedo.p6502;ascop + opco 'ANDL';general.long.m65816.mA;andtbl + opco 'AND ';general.m6502.mA;andtbl + opco 'ADRL';psuedo.p6502;adrlop + opco 'ADR ';psuedo.p6502;adrop + opco 'ADCL';general.long.m65816.mA;adctbl + opcl 'ADC ';general.m6502.mA;adctbl +op0code opcl $00;$00;$00 + + +opcodelookup + dw op0code + dw opacode + dw opbcode + dw opccode + dw opdcode + dw opecode + dw opfcode + dw opgcode + dw ophcode + dw opicode + dw opjcode + dw opkcode + dw oplcode + dw opmcode + dw opncode + dw opocode + dw oppcode + dw opqcode + dw oprcode + dw opscode + dw optcode + dw opucode + dw opvcode + dw opwcode + dw opxcode + dw opycode + dw opzcode + dw op27code + dw op28code + dw op29code + dw op30code + dw op31code + + +cycletbl ;byte 1 = base cycles + dfb 8,0,0,0 ; 2 = + dfb 6,3,1,0 + dfb 8,0,0,0 + dfb 4,2,1,0 + dfb 5,2,2,0 + dfb 3,2,1,0 + dfb 5,2,2,0 + dfb 6,2,1,0 + dfb 3,0,0,0 + dfb 2,2,1,0 + + dfb 2,2,0,0 + dfb 4,0,0,0 + dfb 6,2,2,0 + dfb 4,2,1,0 + dfb 6,2,2,0 + dfb 5,2,1,0 + dfb 2,0,0,0 + dfb 5,3,1,1 + dfb 5,2,1,0 + dfb 7,3,1,0 + + dfb 5,2,2,0 + dfb 4,3,1,0 + dfb 6,3,2,0 + dfb 6,3,1,0 + dfb 2,0,0,0 + dfb 4,3,1,1 + dfb 2,2,0,0 + dfb 2,2,0,0 + dfb 6,2,2,0 + dfb 4,3,1,1 + + dfb 7,3,2,0 + dfb 5,3,1,0 + dfb 6,0,0,0 + dfb 6,3,1,0 + dfb 8,0,0,0 + dfb 4,2,1,0 + dfb 3,2,1,0 + dfb 3,2,1,0 + dfb 5,2,2,0 + dfb 6,2,1,0 + + dfb 4,0,0,0 + dfb 2,2,1,0 + dfb 2,2,0,0 + dfb 5,0,0,0 + dfb 4,2,1,0 + dfb 4,2,1,0 + dfb 6,2,2,0 + dfb 5,2,1,0 + dfb 2,0,0,0 + dfb 5,3,1,1 + + dfb 5,2,1,0 + dfb 7,3,1,0 + dfb 4,3,1,0 + dfb 4,3,1,0 + dfb 6,3,2,0 + dfb 6,3,1,0 + dfb 2,0,0,0 + dfb 4,3,1,1 + dfb 2,2,0,0 + dfb 2,2,0,0 + + dfb 4,3,1,1 + dfb 4,3,1,1 + dfb 7,3,2,0 + dfb 5,3,1,0 + dfb 7,0,0,0 + dfb 6,3,1,0 + dfb 2,0,0,0 + dfb 4,2,1,0 + dfb 7,0,0,0 + dfb 3,2,1,0 + + dfb 5,2,2,0 + dfb 6,2,1,0 + dfb 3,2,1,0 + dfb 2,2,1,0 + dfb 2,2,0,0 + dfb 3,0,0,0 + dfb 3,0,0,0 + dfb 4,2,1,0 + dfb 6,2,2,0 + dfb 5,2,1,0 + + dfb 2,0,0,0 + dfb 5,3,1,1 + dfb 5,2,1,0 + dfb 7,3,1,0 + dfb 7,0,0,0 + dfb 4,3,1,0 + dfb 6,3,2,0 + dfb 6,3,1,0 + dfb 2,0,0,0 + dfb 4,3,1,1 + + dfb 3,1,1,0 + dfb 2,2,0,0 + dfb 4,0,0,0 + dfb 4,3,1,1 + dfb 7,3,2,0 + dfb 5,3,1,0 + dfb 6,0,0,0 + dfb 6,3,1,0 + dfb 6,0,0,0 + dfb 4,2,1,0 + + dfb 3,2,1,0 + dfb 3,2,1,0 + dfb 5,2,2,0 + dfb 6,2,1,0 + dfb 4,2,1,0 + dfb 2,2,1,0 + dfb 2,2,0,0 + dfb 6,0,0,0 + dfb 5,0,0,0 + dfb 4,2,1,0 + + dfb 6,2,2,0 + dfb 5,2,1,0 + dfb 2,0,0,0 + dfb 5,3,1,1 + dfb 5,2,1,0 + dfb 7,3,1,0 + dfb 4,3,1,0 + dfb 4,3,1,0 + dfb 6,3,2,0 + dfb 6,3,1,0 + + dfb 2,0,0,0 + dfb 4,3,1,1 + dfb 4,1,1,0 + dfb 2,2,0,0 + dfb 6,1,0,0 + dfb 4,3,1,1 + dfb 7,3,2,0 + dfb 5,3,1,0 + dfb 3,0,0,0 ;bra + dfb 6,3,1,0 + + dfb 4,0,0,0 ;brl + dfb 4,2,1,0 + dfb 3,1,1,0 + dfb 3,2,1,0 + dfb 3,1,1,0 + dfb 6,2,1,0 + dfb 2,1,0,0 + dfb 2,2,1,0 + dfb 2,0,0,0 + dfb 3,0,0,0 + + dfb 4,1,1,0 + dfb 4,2,1,0 + dfb 4,1,1,0 + dfb 5,2,1,0 + dfb 2,0,0,0 + dfb 6,3,1,0 + dfb 5,2,1,0 + dfb 7,3,1,0 + dfb 4,3,1,0 + dfb 4,3,1,0 + dfb 4,3,1,0 + dfb 6,3,1,0 + dfb 2,0,0,0 + dfb 5,3,1,0 + dfb 2,0,0,0 + dfb 2,0,0,0 + dfb 4,2,1,0 + dfb 5,3,1,0 + dfb 5,3,1,0 + dfb 5,3,1,0 + dfb 2,1,1,0 + dfb 6,3,1,0 + dfb 2,1,1,0 + dfb 4,2,1,0 + dfb 3,1,1,0 + dfb 3,2,1,0 + dfb 3,1,1,0 + dfb 6,2,1,0 + dfb 2,0,0,0 + dfb 2,2,1,0 + dfb 2,0,0,0 + dfb 4,0,0,0 + dfb 4,1,1,0 + dfb 4,2,1,0 + dfb 4,1,1,0 + dfb 5,2,1,0 + dfb 2,0,0,0 + dfb 5,3,1,1 + dfb 5,2,1,0 + dfb 7,3,1,0 + dfb 4,3,1,0 + dfb 4,3,1,0 + dfb 4,3,1,0 + dfb 6,3,1,0 + dfb 2,0,0,0 + dfb 4,3,1,1 + dfb 2,0,0,0 + dfb 2,0,0,0 + dfb 4,3,1,1 + dfb 4,3,1,1 + dfb 4,3,1,1 + dfb 5,3,1,0 + dfb 2,1,1,0 + dfb 6,3,1,0 + dfb 3,0,0,0 + dfb 4,2,1,0 + dfb 3,1,1,0 + dfb 3,2,1,0 + dfb 5,2,2,0 + dfb 6,2,1,0 + dfb 2,0,0,0 + dfb 2,2,1,0 + dfb 2,0,0,0 + dfb 3,0,0,0 + dfb 4,1,1,0 + dfb 4,2,1,0 + dfb 6,2,2,0 + dfb 5,2,1,0 + dfb 2,0,0,0 + dfb 5,3,1,1 + dfb 5,2,1,0 + dfb 7,3,1,0 + dfb 6,0,0,0 + dfb 4,3,1,0 + dfb 6,3,2,0 + dfb 6,3,1,0 + dfb 2,0,0,0 + dfb 4,3,1,1 + dfb 3,1,1,0 + dfb 3,0,0,0 + dfb 6,0,0,0 + dfb 4,3,1,1 + dfb 7,3,2,0 + dfb 5,3,1,0 + dfb 2,1,1,0 + dfb 6,3,1,0 + dfb 3,0,0,0 + dfb 4,2,1,0 + dfb 3,1,1,0 + dfb 3,2,1,0 + dfb 5,2,2,0 + dfb 6,2,1,0 + dfb 2,0,0,0 + dfb 2,2,1,0 + dfb 2,0,0,0 + dfb 3,0,0,0 + dfb 4,1,1,0 + dfb 4,2,1,0 + dfb 6,2,2,0 + dfb 5,2,1,0 + dfb 2,0,0,0 + dfb 5,3,1,1 + dfb 5,2,1,0 + dfb 7,3,1,0 + dfb 5,0,0,0 + dfb 4,3,1,0 + dfb 6,3,2,0 + dfb 6,3,1,0 + dfb 2,0,0,0 + dfb 4,3,1,1 + dfb 4,1,1,0 + dfb 2,0,0,0 + dfb 8,0,0,0 + dfb 4,3,1,1 + dfb 7,3,2,0 + dfb 5,3,1,0 + + + + + + +mactbl + opcx 'TLL ';tlltxt;0 + opcx 'TLC ';tlctxt;0 + opcx 'PSW ';pswtxt;0 + opcx 'PSL ';psltxt;0 + opcx 'PLW ';plwtxt;0 + opcx 'PLL ';plltxt;0 + opcx 'JVSL';jvsltxt;0 + opcx 'JVS ';jvstxt;0 + opcx 'JVCL';jvcltxt;0 + opcx 'JVC ';jvctxt;0 + opcx 'JPLL';jplltxt;0 + opcx 'JPL ';jpltxt;0 + opcx 'JNEL';jneltxt;0 + opcx 'JNE ';jnetxt;0 + opcx 'JMIL';jmiltxt;0 + opcx 'JMI ';jmitxt;0 + opcx 'JLTL';jltltxt;0 + opcx 'JLT ';jlttxt;0 + opcx 'JLEL';jleltxt;0 + opcx 'JLE ';jletxt;0 + opcx 'JGEL';jgeltxt;0 + opcx 'JGE ';jgetxt;0 + opcx 'JEQL';jeqltxt;0 + opcx 'JEQ ';jeqtxt;0 + opcx 'JCSL';jcsltxt;0 + opcx 'JCS ';jcstxt;0 + opcx 'JCCL';jccltxt;0 + opcx 'JCC ';jcctxt;0 + opcx 'DOS ';dostxt;0 + opcx 'BSRL';bsrltxt;0 + opcx 'BSR ';bsrtxt;0 + opcxl 'BLE ';bletxt;0 + +dostxt asc ' jsl $E100A8',0d + asc ' dw ]',31,0d + asc ' adrl ]',32,0d + asc ' eom',0d +dostxt1 asc ' jsl $E100A8',0d + asc ' dw $' +dosnum asc '0000',0d + asc ' adrl ]',31,0d + asc ' eom',0d +tlltxt asc ' ldx #]',31,0d + asc ' jsl $E10000',0d + asc ' eom',0d +tlltxt1 asc ' ldx #]',31,0d + asc ' jsl $E10000',0d + asc ' eom',0d +tlctxt asc ' ldx #]',31,0d + asc ' jsl $E10000',0d + asc ' bcc *+4',0d + asc ' brk $00',0d + asc ' eom',0d +psltxt asc ' if #,]',31,0d + asc ' pea ^]',31,0d + asc ' pea ]',31,0d + asc ' else',0d + asc ' lda ]',31,'+2',0d + asc ' pha',0d + asc ' lda ]',31,0d + asc ' pha',0d + asc ' fin',0d + asc ' eom',0d +pswtxt asc ' if #,]',31,0d + asc ' pea ]',31,0d + asc ' else',0d + asc ' lda ]',31,0d + asc ' pha',0d + asc ' fin',0d + asc ' eom',0d +plltxt asc ' pla',0d + asc ' sta ]',31,0d + asc ' pla',0d + asc ' sta ]',31,'+2',0d + asc ' eom',0d +plwtxt asc ' pla',0d + asc ' sta ]',31,0d + asc ' eom',0d +bsrtxt asc ' per *+4',0d + asc ' bra ]',31,0d + asc ' eom',0d +bsrltxt asc ' per *+5',0d + asc ' brl ]',31,0d + asc ' eom',0d +jmitxt asc ' bpl *+5',0d + asc ' jmp ]',31,0d + asc ' eom',0d +jpltxt asc ' bmi *+5',0d + asc ' jmp ]',31,0d + asc ' eom',0d +jnetxt asc ' beq *+5',0d + asc ' jmp ]',31,0d + asc ' eom',0d +jeqtxt asc ' bne *+5',0d + asc ' jmp ]',31,0d + asc ' eom',0d +jlttxt asc ' bge *+5',0d + asc ' jmp ]',31,0d + asc ' eom',0d +jgetxt asc ' blt *+5',0d + asc ' jmp ]',31,0d + asc ' eom',0d +bletxt asc ' blt ]',31,0d + asc ' beq ]',31,0d + asc ' eom',0d +jletxt asc ' beq *+4',0d + asc ' bge *+5',0d + asc ' jmp ]',31,0d + asc ' eom',0d +jcstxt asc ' bcc *+5',0d + asc ' jmp ]',31,0d + asc ' eom',0d +jcctxt asc ' bcs *+5',0d + asc ' jmp ]',31,0d + asc ' eom',0d +jvstxt asc ' bvc *+5',0d + asc ' jmp ]',31,0d + asc ' eom',0d +jvctxt asc ' bvs *+5',0d + asc ' jmp ]',31,0d + asc ' eom',0d +jmiltxt asc ' bpl *+6',0d + asc ' jml ]',31,0d + asc ' eom',0d +jplltxt asc ' bmi *+6',0d + asc ' jmp ]',31,0d + asc ' eom',0d +jneltxt asc ' beq *+6',0d + asc ' jml ]',31,0d + asc ' eom',0d +jeqltxt asc ' bne *+6',0d + asc ' jml ]',31,0d + asc ' eom',0d +jgeltxt asc ' blt *+6',0d + asc ' jml ]',31,0d + asc ' eom',0d +jltltxt asc ' bge *+6',0d + asc ' jml ]',31,0d + asc ' eom',0d +jleltxt asc ' beq *+4',0d + asc ' bge *+6',0d + asc ' jml ]',31,0d + asc ' eom',0d +jcsltxt asc ' bcc *+6',0d + asc ' jml ]',31,0d + asc ' eom',0d +jccltxt asc ' bcs *+6',0d + asc ' jml ]',31,0d + asc ' eom',0d +jvsltxt asc ' bvc *+6',0d + asc ' jml ]',31,0d + asc ' eom',0d +jvcltxt asc ' bvs *+6',0d + asc ' jml ]',31,0d + asc ' eom',0d + + +adctbl + hex 696969 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 656565 + hex 757575 + hex 000000 + hex 007272 + hex 616161 + hex 717171 + hex 000067 + hex 000077 + hex 6d6d6d + hex 7d7d7d + hex 797979 + hex 00006f + hex 00007f + hex 000063 + hex 000073 + hex 000000 + hex 000000 + hex 000000 + +andtbl + hex 292929 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 252525 + hex 353535 + hex 000000 + hex 003232 + hex 212121 + hex 313131 + hex 000027 + hex 000037 + hex 2d2d2d + hex 3d3d3d + hex 393939 + hex 00002f + hex 00003f + hex 000023 + hex 000033 + hex 000000 + hex 000000 + hex 000000 + +asltbl + hex 000000 + hex 0a0a0a + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 060606 + hex 161616 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 0e0e0e + hex 1e1e1e + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + +bittbl + hex 008989 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 242424 + hex 003434 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 2c2c2c + hex 003c3c + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + + +cmptbl + hex c9c9c9 + hex cdcdcd + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex c5c5c5 + hex d5d5d5 + hex 000000 + hex 00d2d2 + hex c1c1c1 + hex d1d1d1 + hex 0000c7 + hex 0000d7 + hex cdcdcd + hex dddddd + hex d9d9d9 + hex 0000cf + hex 0000df + hex 0000c3 + hex 0000d3 + hex 000000 + hex 000000 + hex 000000 + + +cpxtbl + hex e0e0e0 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex e4e4e4 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex ececec + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + +cpytbl + hex c0c0c0 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex c4c4c4 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex cccccc + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + +dectbl + hex 000000 + hex 003a3a + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex c6c6c6 + hex d6d6d6 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex cecece + hex dedede + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + + +eortbl + hex 494949 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 454545 + hex 555555 + hex 000000 + hex 005252 + hex 414141 + hex 515151 + hex 000047 + hex 000057 + hex 4d4d4d + hex 5d5d5d + hex 595959 + hex 00004f + hex 00005f + hex 000043 + hex 000053 + hex 000000 + hex 000000 + hex 000000 + +inctbl + hex 000000 + hex 001a1a + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex e6e6e6 + hex f6f6f6 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex eeeeee + hex fefefe + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + +ldatbl + hex a9a9a9 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex a5a5a5 + hex b5b5b5 + hex 000000 + hex 00b2b2 + hex a1a1a1 + hex b1b1b1 + hex 0000a7 + hex 0000b7 + hex adadad + hex bdbdbd + hex b9b9b9 + hex 0000af + hex 0000bf + hex 0000a3 + hex 0000b3 + hex 000000 + hex 000000 + hex 000000 + +ldxtbl + hex a2a2a2 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex a6a6a6 + hex 000000 + hex b6b6b6 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex aeaeae + hex 000000 + hex bebebe + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + +ldytbl + hex a0a0a0 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex a4a4a4 + hex b4b4b4 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex acacac + hex bcbcbc + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + +lsrtbl + hex 000000 + hex 4a4a4a + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 464646 + hex 565656 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 4e4e4e + hex 5e5e5e + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + + +oratbl + hex 090909 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 050505 + hex 151515 + hex 000000 + hex 001212 + hex 010101 + hex 111111 + hex 000007 + hex 000017 + hex 0d0d0d + hex 1d1d1d + hex 191919 + hex 00000f + hex 00001f + hex 000003 + hex 000013 + hex 000000 + hex 000000 + hex 000000 + + +peitbl + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 0000D4 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + + + +roltbl + hex 000000 + hex 2a2a2a + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 262626 + hex 363636 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 2e2e2e + hex 3e3e3e + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + +rortbl + hex 000000 + hex 6a6a6a + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 666666 + hex 767676 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 6e6e6e + hex 7e7e7e + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + + +sbctbl + hex e9e9e9 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex e5e5e5 + hex f5f5f5 + hex 000000 + hex 00f2f2 + hex e1e1e1 + hex f1f1f1 + hex 0000e7 + hex 0000f7 + hex ededed + hex fdfdfd + hex f9f9f9 + hex 0000ef + hex 0000ff + hex 0000e3 + hex 0000f3 + hex 000000 + hex 000000 + hex 000000 + + + +statbl + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 858585 + hex 959595 + hex 000000 + hex 009292 + hex 818181 + hex 919191 + hex 000087 + hex 000097 + hex 8d8d8d + hex 9d9d9d + hex 999999 + hex 00008f + hex 00009f + hex 000083 + hex 000093 + hex 000000 + hex 000000 + hex 000000 + + +stxtbl + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 868686 + hex 000000 + hex 969696 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 8e8e8e + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + +stytbl + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 848484 + hex 949494 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 8c8c8c + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + +stztbl + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 006464 + hex 007474 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 009c9c + hex 009e9e + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + + +trbtbl + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 001414 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 001c1c + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + +tsbtbl + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000404 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000c0c + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + hex 000000 + +ftmonths + asc 'Jan-' + asc 'Feb-' + asc 'Mar-' + asc 'Apr-' + asc 'May-' + asc 'Jun-' + asc 'Jul-' + asc 'Aug-' + asc 'Sep-' + asc 'Oct-' + asc 'Nov-' + asc 'Dec-' + + diff --git a/src/data/qa.equates.s b/src/data/qa.equates.s new file mode 100644 index 0000000..4df8d8c --- /dev/null +++ b/src/data/qa.equates.s @@ -0,0 +1,193 @@ +*====================================================== +* Equates used by all programs in the QuickASM system + +ToolNum = 1 +userorsys = $8000 +ToolType = userorsys + +versionnum equ $01016410 + + dum 1 ;Languate ID #s +shellid ds 1 +asmid ds 1 +linkid ds 1 +editid ds 1 +projectid ds 1 +rezid ds 1 +utilid ds 1 +externalid ds 1 + dend + + dum $00 ;Message ID #s +nomessage ds 1 + dend + + dum 1 ;Application message types +startmess ds 1 +runmess ds 1 +eventmess ds 1 +shutdownmess ds 1 + dend + + dum 1 ;Compiler message types +afromcmd ds 1 +afromname ds 1 +afromhandle ds 1 +maxamessage = * + dend + + dum 1 ;Linker message types +lfromcmd ds 1 +lfromname ds 1 +lfromhandle ds 1 +lquick ds 1 +lfromprojfile ds 1 +lfromprojhandle ds 1 +maxlmessage = * + dend + + dum 0 ;Command table record +ename ds 16 +etype ds 2 +eid ds 2 +eflags ds 2 ;b15 = restartable + ;b14 = active (running) +euserid ds 2 +edphandle ds 4 +edp ds 2 +eaddress ds 4 +emesstype ds 2 +emesssub ds 4 + +eRecSize = * + dend + + +**** Vector ID #'s + ; Number Name + dum 1 ; ------------------------------ +vprintchar ds 1 ;_QADrawChar Vector +vprintstr ds 1 ;_QADrawString Vector +verrchar ds 1 ;_QADrawErrChar Vector +verrstr ds 1 ;_QADrawErrString Vector +vprintblk ds 1 ;_QADrawCStr +verrblk ds 1 ;_QADrawErrCStr +vputop ds 1 ;_QAPutOpcode Vector +vputbyte ds 1 ;_QAPutByte Vector +veval ds 1 ;_QAEval Vector +vrelcorrect ds 1 ;_QARelCorrect Vector +vkeyavail ds 1 ;_QAKeyAvail Vector +vgetchar ds 1 ;_QAGetChar Vector +vgetline ds 1 ;_QAGetLine Vector +vtabtocol ds 1 ;_QATabToCol Vector +vexeccmd ds 1 ;EXEC program Vector +vkeymac ds 1 ;KeyBoard macro program Vector +vusr ds 1 ;USR program Vector +vuser ds 1 ;USER program Vector +vxref ds 1 ;XREF program Vector +vprintstrl ds 1 ;print a class.1 string to current window +verrstrl ds 1 ;print a class.1 string to ERR window +vtoolmacs ds 1 ;HANDLE to built in ToolBOX Macs + +maxvectors = *-1 + dend + +*====================================================== +* ToolSet Error Codes + +qatoolerr = ToolNum*256.userorsys + + dum qatoolerr +qanotstarted ds 1 +qabadcmdfile ds 1 +qacmdnotfound ds 1 +qalinknotavail ds 1 +qalangnotavail ds 1 +qabadvectornum ds 1 +qaalreadyactive ds 1 +qaunknowntypestr ds 1 +qatimeleverr ds 1 +qatotalerrleverr ds 1 +qabadpathname ds 1 +qanotnumber ds 1 +qanoword ds 1 +qabadinput ds 1 +qaeof ds 1 + dend + +*------------------------------------------------------ +* Assember/Linker Equates + +asmmemid = $100 +linkmemid = $100 + +oldshell = 0 ;temporary DO flag +maxsymbols = $2000 + +*====================================================== +* GSOS equates * call ID numbers + +* Set 'Class1' to $2000 to use Class 1 calls, $0000 for Class 0 calls + +prodos = $E100A8 +prodosIL = $E100B0 +inline = 1 ;stack or inline? + +_Create = $0001.Class1 +_Destroy = $0002.Class1 +_OSShutdown = $2003 ;class '1' only +_ChangePath = $0004.Class1 +_SetFileInfo = $0005.Class1 +_GetFileInfo = $0006.Class1 +_Volume = $0008.Class1 +_SetPrefix = $0009.Class1 +_GetPrefix = $000A.Class1 +_ClearBackup = $000B.Class1 +_SetSysPrefs = $200C ;class '1' only +_Null = $200D ;class '1' only +_ExpandPath = $000E.Class1 +_GetSysPrefs = $200F ;class '1' only +_Open = $0010.Class1 +_Newline = $0011.Class1 +_Read = $0012.Class1 +_Write = $0013.Class1 +_Close = $0014.Class1 +_Flush = $0015.Class1 +_SetMark = $0016.Class1 +_GetMark = $0017.Class1 +_SetEOF = $0018.Class1 +_GetEOF = $0019.Class1 +_SetLevel = $001A.Class1 +_GetLevel = $001B.Class1 +_GetDirEntry = $001C.Class1 +_BeginSession = $201D ;class '1' only +_EndSession = $201E ;class '1' only +_SessionStatus = $201F ;class '1' only +_GetDevNumber = $0020.Class1 +_GetLastDev = $0021.Class1 +_ReadBlock = $0022 ;class '0' only +_WriteBlock = $0023 ;class '0' only +_Format = $0024.Class1 +_EraseDisk = $0025.Class1 +_ResetCache = $2026 ;class '1' only +_GetName = $0027.Class1 +_GetBootVol = $0028.Class1 +_Quit = $0029.Class1 +_GetVersion = $002A.Class1 +_GetFSTInfo = $202B ;class '1' only +_DInfo = $002C.Class1 +_DStatus = $202D ;class '1' only +_DControl = $202E ;class '1' only +_DRead = $202F ;class '1' only +_DWrite = $2030 ;class '1' only +_AllocInterrupt = $0031 ;P16 call +_BindInt = $2031 ;GS/OS call +_DeallocInterrupt = $0032 ;P16 call +_UnbindInt = $2032 ;GS/OS call +_AddNotifyProc = $2034 ;class '1' only +_DelNotifyProc = $2035 ;class '1' only +_DRename = $2036 ;class '1' only +_GetStdRefNum = $2037 ;class '1' only +_GetRefNum = $2038 ;class '1' only +_GetRefInfo = $2039 ;class '1' only + diff --git a/src/data/toolmacs.s b/src/data/toolmacs.s new file mode 100644 index 0000000..8dd32a4 --- /dev/null +++ b/src/data/toolmacs.s @@ -0,0 +1,1383 @@ + lst off + xc + xc + exp only + org $0000 ;must org at $00 + +toolbox equ $0000 +prodos equ $FFFF + +tdf mac +len dfb strend-len + str ]1 + dw ]2 + dw toolbox ;used to calculate hash marks +]count = ]count+1 +strend eom + +pdf mac +len dfb strend-len + str ]2 + dw ]1 + dw prodos ;used to calculate hash marks +strend eom + + +opc mac + usr ]1 + adrl ]2 + dw ]3 + eom + +]count = 0 + +*** Address Table **** + + adrl a + adrl b + adrl c + adrl d + adrl e + adrl f + adrl g + adrl h + adrl i + adrl j + adrl k + adrl l + adrl m + adrl n + adrl o + adrl p + adrl q + adrl r + adrl s + adrl t + adrl u + adrl v + adrl w + adrl x + adrl y + adrl z + adrl p16 + adrl gsos + +****************************************** +* Insert tool numbers and names here * +****************************************** + +a tdf '_AbsOff';$1009 + tdf '_AbsOn';$0F09 + tdf '_ACEBootInit';$011D + tdf '_ACECompBegin';$0B1D + tdf '_ACECompress';$091D + tdf '_ACEExpand';$0A1D + tdf '_ACEExpBegin';$0C1D + tdf '_ACEInfo';$071D + tdf '_ACEReset';$051D + tdf '_ACEShutDown';$031D + tdf '_ACEStartUp';$021D + tdf '_ACEStatus';$061D + tdf '_ACEVersion';$041D + tdf '_Activate';$1034 + tdf '_ADBBootInit';$0109 + tdf '_ADBReset';$0509 + tdf '_ADBShutDown';$0309 + tdf '_ADBStartUp';$0209 + tdf '_ADBStatus';$0609 + tdf '_ADBVersion';$0409 + tdf '_AddFamily';$0D1B + tdf '_AddFontVar';$141B + tdf '_AddPt';$8004 + tdf '_AddResource';$0C1E + tdf '_AddToOOMQueue';$0C02 + tdf '_AddToQueue';$2E03 + tdf '_AddToRunQ';$1F05 + tdf '_Alert';$1715 + tdf '_AlertWindow';$590E + tdf '_AllNotesOff';$0D19 + tdf '_AllocGen';$0919 + tdf '_AsyncADBReceive';$0D09 + dw $00,$00 + +b tdf '_BeginUpdate';$1E0E + tdf '_BlockMove';$2B02 + tdf '_BringToFront';$240E + tdf '_Button';$0D06 + dw $00,$00 + +c tdf '_CalcMask';$0E12 + tdf '_CalcMenuSize';$1C0F + tdf '_CallCtlDefProc';$2C10 + tdf '_CautionAlert';$1A15 + tdf '_CharBounds';$AC04 + tdf '_CharWidth';$A804 + tdf '_CheckHandle';$1E02 + tdf '_CheckMItem';$320F + tdf '_CheckUpdate';$0A0E + tdf '_ChooseCDA';$1105 + tdf '_ChooseFont';$161B + tdf '_ClampMouse';$1C03 + tdf '_ClearMouse';$1B03 + tdf '_ClearScreen';$1504 + tdf '_ClearSRQTable';$1609 + tdf '_ClipRect';$2604 + tdf '_CloseAllNDAs';$1D05 + tdf '_CloseDialog';$0C15 + tdf '_CloseNDA';$1605 + tdf '_CloseNDAByWinPtr';$1C05 + tdf '_ClosePicture';$B904 + tdf '_ClosePoly';$C204 + tdf '_ClosePort';$1A04 + tdf '_CloseResourceFile';$0B1E + tdf '_CloseRgn';$6E04 + tdf '_CloseWindow';$0B0E + tdf '_ClrHeartBeat';$1403 + tdf '_CMLoadResource';$3210 + tdf '_CMReleaseResource';$3310 + tdf '_CompactMem';$1F02 + tdf '_CompileText';$600E + tdf '_CopyPixels';$0912 + tdf '_CopyRgn';$6904 + tdf '_CountFamilies';$091B + tdf '_CountFonts';$101B + tdf '_CountMItems';$140F + tdf '_CountResources';$221E + tdf '_CountTypes';$201E + tdf '_CreateList';$091C + tdf '_CreateResourceFile';$091E + tdf '_CStringBounds';$AE04 + tdf '_CStringWidth';$AA04 + tdf '_CtlBootInit';$0110 + tdf '_CtlNewRes';$1210 + tdf '_CtlReset';$0510 + tdf '_CtlShutDown';$0310 + tdf '_CtlStartUp';$0210 + tdf '_CtlStatus';$0610 + tdf '_CtlTextDev';$160C + tdf '_CtlVersion';$0410 + dw $00,$00 + +d tdf '_DeallocGen';$0A19 + tdf '_Dec2Int';$280B + tdf '_Dec2Long';$290B + tdf '_DecStrNum';$0A0A + tdf '_DefaultFilter';$3615 + tdf '_DeleteFromQueue';$2F03 + tdf '_DeleteID';$2103 + tdf '_DeleteMenu';$0E0F + tdf '_DeleteMItem';$100F + tdf '_DelHeartBeat';$1303 + tdf '_DeskBootInit';$0105 + tdf '_DeskReset';$0505 + tdf '_DeskShutDown';$0305 + tdf '_DeskStartUp';$0205 + tdf '_DeskStatus';$0605 + tdf '_Desktop';$0C0E + tdf '_DeskVersion';$0405 + tdf '_DetachResource';$181E + tdf '_DialogBootInit';$0115 + tdf '_DialogReset';$0515 + tdf '_DialogSelect';$1115 + tdf '_DialogShutDown';$0315 + tdf '_DialogStartUp';$0215 + tdf '_DialogStatus';$0615 + tdf '_DialogVersion';$0415 + tdf '_DictDelete';$0B34 + tdf '_DictDump';$0C34 + tdf '_DictInit';$0E34 + tdf '_DictInsert';$0A34 + tdf '_DiffRgn';$7304 + tdf '_DisableDItem';$3915 + tdf '_DisableMItem';$310F + tdf '_DisposeAll';$1102 + tdf '_DisposeControl';$0A10 + tdf '_DisposeHandle';$1002 + tdf '_DisposeMenu';$2E0F + tdf '_DisposeRgn';$6804 + tdf '_DlgCopy';$1315 + tdf '_DlgCut';$1215 + tdf '_DlgDelete';$1515 + tdf '_DlgPaste';$1415 + tdf '_DoWindows';$0906 + tdf '_DragControl';$1710 + tdf '_DragRect';$1D10 + tdf '_DragWindow';$1A0E + tdf '_DrawChar';$A404 + tdf '_DrawControls';$1010 + tdf '_DrawCString';$A604 + tdf '_DrawDialog';$1615 + tdf '_DrawIcon';$0B12 + tdf '_DrawInfoBar';$550E + tdf '_DrawMember';$0C1C + tdf '_DrawMember2';$111C + tdf '_DrawMenuBar';$2A0F + tdf '_DrawOneCtl';$2510 + tdf '_DrawPicture';$BA04 + tdf '_DrawPopUp';$3D0F + tdf '_DrawString';$A504 + tdf '_DrawText';$A704 + tdf '_DUBootInit';$0118 + tdf '_DUReset';$0518 + tdf '_DUShutDown';$0318 + tdf '_DUStartUp';$0218 + tdf '_DUStatus';$0618 + tdf '_DUVersion';$0418 + dw $00,$00 + +e tdf '_ElemNum';$0B0A + tdf '_EMBootInit';$0106 + tdf '_EmptyRgn';$7804 + tdf '_EMReset';$0506 + tdf '_EMShutDown';$0306 + tdf '_EMStartUp';$0206 + tdf '_EMStatus';$0606 + tdf '_EMVersion';$0406 + tdf '_EnableDItem';$3A15 + tdf '_EnableMItem';$300F + tdf '_EndFrameDrawing';$5B0E + tdf '_EndInfoDrawing';$510E + tdf '_EndUpdate';$1F0E + tdf '_EqualPt';$8304 + tdf '_EqualRect';$5104 + tdf '_EqualRgn';$7704 + tdf '_EraseArc';$6404 + tdf '_EraseControl';$2410 + tdf '_EraseOval';$5A04 + tdf '_ErasePoly';$BE04 + tdf '_EraseRect';$5504 + tdf '_EraseRgn';$7B04 + tdf '_EraseRRect';$5F04 + tdf '_ErrorSound';$0915 + tdf '_ErrorWindow';$620E + tdf '_ErrWriteBlock';$1F0C + tdf '_ErrWriteChar';$190C + tdf '_ErrWriteCString';$210C + tdf '_ErrWriteLine';$1B0C + tdf '_ErrWriteString';$1D0C + tdf '_EventAvail';$0B06 + dw $00,$00 + +f tdf '_FakeMouse';$1906 + tdf '_FamNum2ItemID';$1B1B + tdf '_FemaleBootInit';$0133 + tdf '_FemaleReset';$0533 + tdf '_FemaleShutDown';$0333 + tdf '_FemaleSpeak';$0933 + tdf '_FemaleStartUp';$0233 + tdf '_FemaleStatus';$0633 + tdf '_FemaleVersion';$0433 + tdf '_FFGeneratorStatus';$1108 + tdf '_FFSetUpSound';$1508 + tdf '_FFSoundDoneStatus';$1408 + tdf '_FFSoundStatus';$1008 + tdf '_FFStartPlaying';$1608 + tdf '_FFStartSound';$0E08 + tdf '_FFStopSound';$0F08 + tdf '_FillArc';$6604 + tdf '_FillOval';$5C04 + tdf '_FillPoly';$C004 + tdf '_FillRect';$5704 + tdf '_FillRgn';$7D04 + tdf '_FillRRect';$6104 + tdf '_FindControl';$1310 + tdf '_FindDItem';$2415 + tdf '_FindFamily';$0A1B + tdf '_FindFontStats';$111B + tdf '_FindHandle';$1A02 + tdf '_FindTargetCtl';$2610 + tdf '_FindWindow';$170E + tdf '_Fix2Frac';$1C0B + tdf '_Fix2Long';$1B0B + tdf '_Fix2X';$1E0B + tdf '_FixAppleMenu';$1E05 + tdf '_FixATan2';$170B + tdf '_FixDiv';$110B + tdf '_FixFontMenu';$151B + tdf '_FixMenuBar';$130F + tdf '_FixMul';$0F0B + tdf '_FixRatio';$0E0B + tdf '_FixRound';$130B + tdf '_FlashMenuBar';$0C0F + tdf '_FlushEvents';$1506 + tdf '_FMBootInit';$011B + tdf '_FMGetCurFID';$1A1B + tdf '_FMGetSysFID';$191B + tdf '_FMReset';$051B + tdf '_FMSetSysFont';$181B + tdf '_FMShutDown';$031B + tdf '_FMStartUp';$021B + tdf '_FMStatus';$061B + tdf '_FMVersion';$041B + tdf '_ForceBufDims';$CC04 + tdf '_FPNum';$090A + tdf '_Frac2Fix';$1D0B + tdf '_Frac2X';$1F0B + tdf '_FracCos';$150B + tdf '_FracDiv';$120B + tdf '_FracMul';$100B + tdf '_FracSin';$160B + tdf '_FracSqrt';$140B + tdf '_FrameArc';$6204 + tdf '_FrameOval';$5804 + tdf '_FramePoly';$BC04 + tdf '_FrameRect';$5304 + tdf '_FrameRgn';$7904 + tdf '_FrameRRect';$5D04 + tdf '_FreeMem';$1B02 + tdf '_FrontWindow';$150E + tdf '_FWEntry';$2403 + dw $00,$00 + +g tdf '_GetAbsClamp';$2B03 + tdf '_GetAbsScale';$1309 + tdf '_GetAddr';$1603 + tdf '_GetAddress';$0904 + tdf '_GetAlertStage';$3415 + tdf '_GetArcRot';$B104 + tdf '_GetBackColor';$A304 + tdf '_GetBackPat';$3504 + tdf '_GetBarColors';$180F + tdf '_GetCaretTime';$1206 + tdf '_GetCharExtra';$D504 + tdf '_GetClip';$2504 + tdf '_GetClipHandle';$C704 + tdf '_GetCodeResConverter';$3403 + tdf '_GetColorEntry';$1104 + tdf '_GetColorTable';$0F04 + tdf '_GetContentDraw';$480E + tdf '_GetContentOrigin';$3E0E + tdf '_GetContentRgn';$2F0E + tdf '_GetControlDItem';$1E15 + tdf '_GetCtlAction';$2110 + tdf '_GetCtlDpage';$1F10 + tdf '_GetCtlHandleFromID';$3010 + tdf '_GetCtlID';$2A10 + tdf '_GetCtlMoreFlags';$2E10 + tdf '_GetCtlParamPtr';$3510 + tdf '_GetCtlParams';$1C10 + tdf '_GetCtlRefCon';$2310 + tdf '_GetCtlTitle';$0D10 + tdf '_GetCtlValue';$1A10 + tdf '_GetCurResourceApp';$141E + tdf '_GetCurResourceFile';$121E + tdf '_GetCursorAdr';$8F04 + tdf '_GetDAStrPtr';$1405 + tdf '_GetDataSize';$400E + tdf '_GetDblTime';$1106 + tdf '_GetDefButton';$3715 + tdf '_GetDefProc';$310E + tdf '_GetDItemBox';$2815 + tdf '_GetDItemType';$2615 + tdf '_GetDItemValue';$2E15 + tdf '_GetErrGlobals';$0E0C + tdf '_GetErrorDevice';$140C + tdf '_GetFamInfo';$0B1B + tdf '_GetFamNum';$0C1B + tdf '_GetFGSize';$CF04 + tdf '_GetFirstDItem';$2A15 + tdf '_GetFirstWindow';$520E + tdf '_GetFont';$9504 + tdf '_GetFontFlags';$9904 + tdf '_GetFontGlobals';$9704 + tdf '_GetFontID';$D104 + tdf '_GetFontInfo';$9604 + tdf '_GetFontLore';$D904 + tdf '_GetForeColor';$A104 + tdf '_GetFrameColor';$100E + tdf '_GetFuncPtr';$0B01 + tdf '_GetGrafProcs';$4504 + tdf '_GetHandleSize';$1802 + tdf '_GetIndResource';$231E + tdf '_GetIndType';$211E + tdf '_GetInfoDraw';$4A0E + tdf '_GetInfoRefCon';$350E + tdf '_GetInGlobals';$0C0C + tdf '_GetInputDevice';$120C + tdf '_GetInterruptState';$3103 + tdf '_GetIntStateRecSize';$3203 + tdf '_GetIRQEnable';$2903 + tdf '_GetIText';$1F15 + tdf '_GetKeyTranslation';$1B06 + tdf '_GetLEDefProc';$2414 + tdf '_GetListDefProc';$0E1C + tdf '_GetLoadSegInfo';$0F11 + tdf '_GetMapHandle';$261E + tdf '_GetMasterSCB';$1704 + tdf '_GetMaxGrow';$420E + tdf '_GetMenuBar';$0A0F + tdf '_GetMenuFlag';$200F + tdf '_GetMenuMgrPort';$1B0F + tdf '_GetMenuTitle';$220F + tdf '_GetMHandle';$160F + tdf '_GetMItem';$250F + tdf '_GetMItemFlag';$270F + tdf '_GetMItemMark';$340F + tdf '_GetMItemStyle';$360F + tdf '_GetMouse';$0C06 + tdf '_GetMouseClamp';$1D03 + tdf '_GetMTitleStart';$1A0F + tdf '_GetNewDItem';$3315 + tdf '_GetNewID';$2003 + tdf '_GetNewModalDialog';$3215 + tdf '_GetNextDItem';$2B15 + tdf '_GetNextEvent';$0A06 + tdf '_GetNextWindow';$2A0E + tdf '_GetNumNDAs';$1B05 + tdf '_GetOpenFileRefNum';$1F1E + tdf '_GetOSEvent';$1606 + tdf '_GetOutGlobals';$0D0C + tdf '_GetOutputDevice';$130C + tdf '_GetPage';$460E + tdf '_GetPen';$2904 + tdf '_GetPenMask';$3304 + tdf '_GetPenMode';$2F04 + tdf '_GetPenPat';$3104 + tdf '_GetPenSize';$2D04 + tdf '_GetPenState';$2B04 + tdf '_GetPicSave';$3F04 + tdf '_GetPixel';$8804 + tdf '_GetPolySave';$4304 + tdf '_GetPopUpDefProc';$3B0F + tdf '_GetPort';$1C04 + tdf '_GetPortLoc';$1E04 + tdf '_GetPortRect';$2004 + tdf '_GetRectInfo';$4F0E + tdf '_GetResourceAttr';$1B1E + tdf '_GetResourceSize';$1D1E + tdf '_GetRgnSave';$4104 + tdf '_GetRomFont';$D804 + tdf '_GetROMResource';$3503 + tdf '_GetSCB';$1304 + tdf '_GetScrap';$0D16 + tdf '_GetScrapCount';$1216 + tdf '_GetScrapHandle';$0E16 + tdf '_GetScrapPath';$1016 + tdf '_GetScrapSize';$0F16 + tdf '_GetScrapState';$1316 + tdf '_GetScroll';$440E + tdf '_GetSoundVolume';$0C08 + tdf '_GetSpaceExtra';$9F04 + tdf '_GetStandardSCB';$0C04 + tdf '_GetStructRgn';$2E0E + tdf '_GetSysBar';$110F + tdf '_GetSysField';$4904 + tdf '_GetSysFont';$B304 + tdf '_GetSysWFlag';$4C0E + tdf '_GetTableAddress';$0B08 + tdf '_GetTextFace';$9B04 + tdf '_GetTextMode';$9D04 + tdf '_GetTextSize';$D304 + tdf '_GetTick';$2503 + tdf '_GetTitleWidth';$1E0F + tdf '_GetTSPtr';$0901 + tdf '_GetUpdateRgn';$300E + tdf '_GetUserField';$4704 + tdf '_GetUserID';$1011 + tdf '_GetUserID2';$2111 + tdf '_GetVector';$1103 + tdf '_GetVisHandle';$C904 + tdf '_GetVisRgn';$B504 + tdf '_GetWAP';$0C01 + tdf '_GetWControls';$330E + tdf '_GetWFrame';$2C0E + tdf '_GetWindowMgrGlobals';$580E + tdf '_GetWKind';$2B0E + tdf '_GetWMgrPort';$200E + tdf '_GetWRefCon';$290E + tdf '_GetWTitle';$0E0E + tdf '_GetZoomRect';$370E + tdf '_GlobalToLocal';$8504 + tdf '_GrafOff';$0B04 + tdf '_GrafOn';$0A04 + tdf '_GrowSize';$1E10 + tdf '_GrowWindow';$1B0E + dw $00,$00 + +h tdf '_HandToHand';$2A02 + tdf '_HandToPtr';$2902 + tdf '_Hex2Int';$240B + tdf '_Hex2Long';$250B + tdf '_HexIt';$2A0B + tdf '_HideControl';$0E10 + tdf '_HideCursor';$9004 + tdf '_HideDItem';$2215 + tdf '_HideMenuBar';$450F + tdf '_HidePen';$2704 + tdf '_HideWindow';$120E + tdf '_HiliteControl';$1110 + tdf '_HiliteMenu';$2C0F + tdf '_HiliteWindow';$220E + tdf '_HiWord';$180B + tdf '_HLock';$2002 + tdf '_HLockAll';$2102 + tdf '_HomeMouse';$1A03 + tdf '_HomeResourceFile';$151E + tdf '_HUnlock';$2202 + tdf '_HUnlockAll';$2302 + dw $00,$00 + +i tdf '_IMBootInit';$010B + tdf '_IMReset';$050B + tdf '_IMShutDown';$030B + tdf '_IMStartUp';$020B + tdf '_IMStatus';$060B + tdf '_IMVersion';$040B + tdf '_InflateTextBuffer';$D704 + tdf '_InitColorTable';$0D04 + tdf '_InitCursor';$CA04 + tdf '_InitialLoad';$0911 + tdf '_InitialLoad2';$2011 + tdf '_InitMouse';$1803 + tdf '_InitPalette';$2F0F + tdf '_InitPort';$1904 + tdf '_InitTextDev';$150C + tdf '_InsertMenu';$0D0F + tdf '_InsertMItem';$0F0F + tdf '_InsertMItem2';$3F0F + tdf '_InsetRect';$4C04 + tdf '_InsetRgn';$7004 + tdf '_InstallCDA';$0F05 + tdf '_InstallFont';$0E1B + tdf '_InstallNDA';$0E05 + tdf '_InstallWithStats';$1C1B + tdf '_Int2Dec';$260B + tdf '_Int2Hex';$220B + tdf '_IntSource';$2303 + tdf '_InvalCtls';$3710 + tdf '_InvalRect';$3A0E + tdf '_InvalRgn';$3B0E + tdf '_InvertArc';$6504 + tdf '_InvertOval';$5B04 + tdf '_InvertPoly';$BF04 + tdf '_InvertRect';$5604 + tdf '_InvertRgn';$7C04 + tdf '_InvertRRect';$6004 + tdf '_IsDialogEvent';$1015 + tdf '_ItemID2FamNum';$171B + dw $00,$00 + +j dw $00,$00 + +k tdf '_KillControls';$0B10 + tdf '_KillPicture';$BB04 + tdf '_KillPoly';$C304 + dw $00,$00 + +l tdf '_LEActivate';$0F14 + tdf '_LEBootInit';$0114 + tdf '_LEClick';$0D14 + tdf '_LECopy';$1314 + tdf '_LECut';$1214 + tdf '_LEDeactivate';$1014 + tdf '_LEDelete';$1514 + tdf '_LEDispose';$0A14 + tdf '_LEFromScrap';$1914 + tdf '_LEGetScrapLen';$1C14 + tdf '_LEGetTextHand';$2214 + tdf '_LEGetTextLen';$2314 + tdf '_LEIdle';$0C14 + tdf '_LEInsert';$1614 + tdf '_LEKey';$1114 + tdf '_LENew';$0914 + tdf '_LEPaste';$1414 + tdf '_LEReset';$0514 + tdf '_LEScrapHandle';$1B14 + tdf '_LESetCaret';$1F14 + tdf '_LESetHilite';$1E14 + tdf '_LESetJust';$2114 + tdf '_LESetScrapLen';$1D14 + tdf '_LESetSelect';$0E14 + tdf '_LESetText';$0B14 + tdf '_LEShutDown';$0314 + tdf '_LEStartUp';$0214 + tdf '_LEStatus';$0614 + tdf '_LETextBox';$1814 + tdf '_LETextBox2';$2014 + tdf '_LEToScrap';$1A14 + tdf '_LEUpdate';$1714 + tdf '_LEVersion';$0414 + tdf '_LGetPathname';$1111 + tdf '_LGetPathname2';$2211 + tdf '_Line';$3D04 + tdf '_LineTo';$3C04 + tdf '_ListBootInit';$011C + tdf '_ListReset';$051C + tdf '_ListShutDown';$031C + tdf '_ListStartUp';$021C + tdf '_ListStatus';$061C + tdf '_ListVersion';$041C + tdf '_LoadAbsResource';$271E + tdf '_LoaderBootInit';$0111 + tdf '_LoaderReset';$0511 + tdf '_LoaderShutDown';$0311 + tdf '_LoaderStartUp';$0211 + tdf '_LoaderStatus';$0611 + tdf '_LoaderVersion';$0411 + tdf '_LoadFont';$121B + tdf '_LoadOneTool';$0F01 + tdf '_LoadResource';$0E1E + tdf '_LoadScrap';$0A16 + tdf '_LoadSegName';$0D11 + tdf '_LoadSegNum';$0B11 + tdf '_LoadSysFont';$131B + tdf '_LoadTools';$0E01 + tdf '_LocalToGlobal';$8404 + tdf '_Long2Dec';$270B + tdf '_Long2Fix';$1A0B + tdf '_Long2Hex';$230B + tdf '_LongDivide';$0D0B + tdf '_LongMul';$0C0B + tdf '_LoWord';$190B + dw $00,$00 + +m tdf '_MakeNextCtlTarget';$2710 + tdf '_MakeThisCtlTarget';$2810 + tdf '_MaleBootInit';$0132 + tdf '_MaleReset';$0532 + tdf '_MaleShutDown';$0332 + tdf '_MaleSpeak';$0932 + tdf '_MaleStartUp';$0232 + tdf '_MaleStatus';$0632 + tdf '_MaleVersion';$0432 + tdf '_MapPoly';$C504 + tdf '_MapPt';$8A04 + tdf '_MapRect';$8B04 + tdf '_MapRgn';$8C04 + tdf '_MarkResourceChange';$101E + tdf '_MatchResourceHandle';$1E1E + tdf '_MaxBlock';$1C02 + tdf '_MenuBootInit';$010F + tdf '_MenuGlobal';$230F + tdf '_MenuKey';$090F + tdf '_MenuNewRes';$290F + tdf '_MenuRefresh';$0B0F + tdf '_MenuReset';$050F + tdf '_MenuSelect';$2B0F + tdf '_MenuShutDown';$030F + tdf '_MenuStartUp';$020F + tdf '_MenuStatus';$060F + tdf '_MenuVersion';$040F + tdf '_MessageByName';$1701 + tdf '_MessageCenter';$1501 + tdf '_MidiBootInit';$0120 + tdf '_MidiClock';$0B20 + tdf '_MidiControl';$0920 + tdf '_MidiConvert';$1320 + tdf '_MidiDevice';$0A20 + tdf '_MidiInfo';$0C20 + tdf '_MidiPlaySeq';$1120 + tdf '_MidiReadPacket';$0D20 + tdf '_MidiRecordSeq';$0F20 + tdf '_MidiReset';$0520 + tdf '_MidiShutDown';$0320 + tdf '_MidiStartUp';$0220 + tdf '_MidiStatus';$0620 + tdf '_MidiStopPlay';$1220 + tdf '_MidiStopRecord';$1020 + tdf '_MidiVersion';$0420 + tdf '_MidiWritePacket';$0E20 + tdf '_MMBootInit';$0102 + tdf '_MMReset';$0502 + tdf '_MMShutDown';$0302 + tdf '_MMStartUp';$0202 + tdf '_MMStatus';$0602 + tdf '_MMVersion';$0402 + tdf '_ModalDialog';$0F15 + tdf '_ModalDialog2';$2C15 + tdf '_Move';$3B04 + tdf '_MoveControl';$1610 + tdf '_MovePortTo';$2204 + tdf '_MoveTo';$3A04 + tdf '_MoveWindow';$190E + tdf '_MTBootInit';$0103 + tdf '_MTReset';$0503 + tdf '_MTShutDown';$0303 + tdf '_MTStartUp';$0203 + tdf '_MTStatus';$0603 + tdf '_MTVersion';$0403 + tdf '_Multiply';$090B + tdf '_Munger';$2803 + dw $00,$00 + +n tdf '_NewControl';$0910 + tdf '_NewControl2';$3110 + tdf '_NewDItem';$0D15 + tdf '_NewHandle';$0902 + tdf '_NewList';$101C + tdf '_NewList2';$161C + tdf '_NewMenu';$2D0F + tdf '_NewMenu2';$3E0F + tdf '_NewMenuBar';$150F + tdf '_NewMenuBar2';$430F + tdf '_NewModalDialog';$0A15 + tdf '_NewModelessDialog';$0B15 + tdf '_NewRgn';$6704 + tdf '_NewWindow';$090E + tdf '_NewWindow2';$610E + tdf '_NextMember';$0B1C + tdf '_NextMember2';$121C + tdf '_NoteAlert';$1915 + tdf '_NotEmptyRect';$5204 + tdf '_NoteOff';$0C19 + tdf '_NoteOn';$0B19 + tdf '_NotifyCtls';$2D10 + tdf '_NSBootInit';$0119 + tdf '_NSReset';$0519 + tdf '_NSSetUpdateRate';$0E19 + tdf '_NSSetUserUpdateRtn';$0F19 + tdf '_NSShutDown';$0319 + tdf '_NSStartUp';$0219 + tdf '_NSStatus';$0619 + tdf '_NSVersion';$0419 + dw $00,$00 + +o tdf '_ObscureCursor';$9204 + tdf '_OffsetPoly';$C404 + tdf '_OffsetRect';$4B04 + tdf '_OffsetRgn';$6F04 + tdf '_OpenNDA';$1505 + tdf '_OpenPicture';$B704 + tdf '_OpenPoly';$C104 + tdf '_OpenPort';$1804 + tdf '_OpenResourceFile';$0A1E + tdf '_OpenRgn';$6D04 + tdf '_OSEventAvail';$1706 + dw $00,$00 + +p tdf '_PackBytes';$2603 + tdf '_PaintArc';$6304 + tdf '_PaintOval';$5904 + tdf '_PaintPixels';$7F04 + tdf '_PaintPoly';$BD04 + tdf '_PaintRect';$5404 + tdf '_PaintRgn';$7A04 + tdf '_PaintRRect';$5E04 + tdf '_ParamText';$1B15 + tdf '_Parse';$0934 + tdf '_PenNormal';$3604 + tdf '_PicComment';$B804 + tdf '_PinRect';$210E + tdf '_PMActive';$0613 + tdf '_PMBootInit';$0113 + tdf '_PMLoadDriver';$3513 + tdf '_PMReset';$0513 + tdf '_PMShutDown';$0313 + tdf '_PMStartUp';$0213 + tdf '_PMUnloadDriver';$3413 + tdf '_PMVersion';$0413 + tdf '_PopUpMenuSelect';$3C0F + tdf '_PosMouse';$1E03 + tdf '_PostEvent';$1406 + tdf '_PPToPort';$D604 + tdf '_PrChoosePrinter';$1613 + tdf '_PrCloseDoc';$0F13 + tdf '_PrClosePage';$1113 + tdf '_PrControl';$1313 + tdf '_PrDefault';$0913 + tdf '_PrDevAsyncRead';$2113 + tdf '_PrDevClose';$1F13 + tdf '_PrDevOpen';$1C13 + tdf '_PrDevPrChanged';$1913 + tdf '_PrDevRead';$1D13 + tdf '_PrDevShutDown';$1B13 + tdf '_PrDevStartup';$1A13 + tdf '_PrDevStatus';$2013 + tdf '_PrDevWrite';$1E13 + tdf '_PrDevWriteBack';$2213 + tdf '_PrDriverVer';$2313 + tdf '_PrError';$1413 + tdf '_PrGetDocName';$3613 + tdf '_PrGetNetworkName';$2B13 + tdf '_PrGetPgOrientation';$3813 + tdf '_PrGetPortDvrName';$2913 + tdf '_PrGetPrinterDvrName';$2813 + tdf '_PrGetPrinterSpecs';$1813 + tdf '_PrGetUserName';$2A13 + tdf '_PrGetZoneName';$2513 + tdf '_PrJobDialog';$0C13 + tdf '_PrOpenDoc';$0E13 + tdf '_PrOpenPage';$1013 + tdf '_PrPicFile';$1213 + tdf '_PrPixelMap';$0D13 + tdf '_PrPortVer';$2413 + tdf '_PrSetDocName';$3713 + tdf '_PrSetError';$1513 + tdf '_PrStlDialog';$0B13 + tdf '_PrValidate';$0A13 + tdf '_Pt2Rect';$5004 + tdf '_PtInRect';$4F04 + tdf '_PtInRgn';$7504 + tdf '_PtrToHand';$2802 + tdf '_PurgeAll';$1302 + tdf '_PurgeHandle';$1202 + tdf '_PutScrap';$0C16 + dw $00,$00 + +q tdf '_QDAuxBootInit';$0112 + tdf '_QDAuxReset';$0512 + tdf '_QDAuxShutDown';$0312 + tdf '_QDAuxStartUp';$0212 + tdf '_QDAuxStatus';$0612 + tdf '_QDAuxVersion';$0412 + tdf '_QDBootInit';$0104 + tdf '_QDReset';$0504 + tdf '_QDShutDown';$0304 + tdf '_QDStartUp';$0204 + tdf '_QDStatus';$0604 + tdf '_QDVersion';$0404 + dw $00,$00 + +r tdf '_Random';$8604 + tdf '_RdAbs';$1109 + tdf '_ReadAsciiTime';$0F03 + tdf '_ReadBParam';$0C03 + tdf '_ReadBRam';$0A03 + tdf '_ReadChar';$220C + tdf '_ReadDocReg';$1808 + tdf '_ReadKeyMicroData';$0A09 + tdf '_ReadKeyMicroMemory';$0B09 + tdf '_ReadLine';$240C + tdf '_ReadMouse';$1703 + tdf '_ReadMouse2';$3303 + tdf '_ReadRamBlock';$0A08 + tdf '_ReadTimeHex';$0D03 + tdf '_RealFreeMem';$2F02 + tdf '_ReAllocHandle';$0A02 + tdf '_RectInRgn';$7604 + tdf '_RectRgn';$6C04 + tdf '_RefreshDesktop';$390E + tdf '_ReleaseResource';$171E + tdf '_ReleaseROMResource';$3603 + tdf '_RemoveCDA';$2105 + tdf '_RemoveDItem';$0E15 + tdf '_RemoveFromOOMQueue';$0D02 + tdf '_RemoveFromRunQ';$2005 + tdf '_RemoveNDA';$2205 + tdf '_RemoveResource';$0F1E + tdf '_RenamePathname';$1311 + tdf '_ResetAlertStage';$3515 + tdf '_ResetMember';$0F1C + tdf '_ResetMember2';$131C + tdf '_ResizeWindow';$5C0E + tdf '_ResourceBootInit';$011E + tdf '_ResourceConverter';$281E + tdf '_ResourceReset';$051E + tdf '_ResourceShutDown';$031E + tdf '_ResourceStartUp';$021E + tdf '_ResourceStatus';$061E + tdf '_ResourceVersion';$041E + tdf '_RestAll';$0C05 + tdf '_Restart';$0A11 + tdf '_RestoreBufDims';$CE04 + tdf '_RestoreHandle';$0B02 + tdf '_RestoreTextState';$1401 + tdf '_RestScrn';$0A05 + dw $00,$00 + +s tdf '_SANEBootInit';$010A + tdf '_SANEReset';$050A + tdf '_SANEShutDown';$030A + tdf '_SANEStartUp';$020A + tdf '_SANEStatus';$060A + tdf '_SANEVersion';$040A + tdf '_SaveAll';$0B05 + tdf '_SaveBufDims';$CD04 + tdf '_SaveScrn';$0905 + tdf '_SaveTextState';$1301 + tdf '_Say';$0F34 + tdf '_ScalePt';$8904 + tdf '_SchAddTask';$0907 + tdf '_SchBootInit';$0107 + tdf '_SchFlush';$0A07 + tdf '_SchReset';$0507 + tdf '_SchShutDown';$0307 + tdf '_SchStartUp';$0207 + tdf '_SchStatus';$0607 + tdf '_SchVersion';$0407 + tdf '_ScrapBootInit';$0116 + tdf '_ScrapReset';$0516 + tdf '_ScrapShutDown';$0316 + tdf '_ScrapStartUp';$0216 + tdf '_ScrapStatus';$0616 + tdf '_ScrapVersion';$0416 + tdf '_ScrollRect';$7E04 + tdf '_SDivide';$0A0B + tdf '_SectRect';$4D04 + tdf '_SectRgn';$7104 + tdf '_SeedFill';$0D12 + tdf '_SelCtlIcons';$1810 + tdf '_SelectMember';$0D1C + tdf '_SelectMember2';$141C + tdf '_SelectWindow';$110E + tdf '_SelIText';$2115 + tdf '_SendBehind';$140E + tdf '_SendEventToCtl';$2910 + tdf '_SendInfo';$0909 + tdf '_SeqAllNotesOff';$0D1A + tdf '_SeqBootInit';$011A + tdf '_SeqClearIncr';$0A1A + tdf '_SeqGetLoc';$0C1A + tdf '_SeqGetTimer';$0B1A + tdf '_SeqReset';$051A + tdf '_SeqSetIncr';$091A + tdf '_SeqSetInstTable';$121A + tdf '_SeqSetTrkInfo';$0E1A + tdf '_SeqShutDown';$031A + tdf '_SeqStartInts';$131A + tdf '_SeqStartUp';$021A + tdf '_SeqStatus';$061A + tdf '_SeqStepSeq';$101A + tdf '_SeqStopInts';$141A + tdf '_SeqVersion';$041A + tdf '_ServeMouse';$1F03 + tdf '_SetAbsClamp';$2A03 + tdf '_SetAbsScale';$1209 + tdf '_SetAllSCBs';$1404 + tdf '_SetArcRot';$B004 + tdf '_SetAutoKeyLimit';$1A06 + tdf '_SetBackColor';$A204 + tdf '_SetBackPat';$3404 + tdf '_SetBarColors';$170F + tdf '_SetBufDims';$CB04 + tdf '_SetCharExtra';$D404 + tdf '_SetClip';$2404 + tdf '_SetClipHandle';$C604 + tdf '_SetColorEntry';$1004 + tdf '_SetColorTable';$0E04 + tdf '_SetContentDraw';$490E + tdf '_SetContentOrigin';$3F0E + tdf '_SetContentOrigin2';$570E + tdf '_SetCtlAction';$2010 + tdf '_SetCtlID';$2B10 + tdf '_SetCtlMoreFlags';$2F10 + tdf '_SetCtlParamPtr';$3410 + tdf '_SetCtlParams';$1B10 + tdf '_SetCtlRefCon';$2210 + tdf '_SetCtlTitle';$0C10 + tdf '_SetCtlValue';$1910 + tdf '_SetCurResourceApp';$131E + tdf '_SetCurResourceFile';$111E + tdf '_SetCursor';$8E04 + tdf '_SetDAFont';$1C15 + tdf '_SetDAStrPtr';$1305 + tdf '_SetDataSize';$410E + tdf '_SetDefaultTPT';$1601 + tdf '_SetDefButton';$3815 + tdf '_SetDefProc';$320E + tdf '_SetDItemBox';$2915 + tdf '_SetDItemType';$2715 + tdf '_SetDItemValue';$2F15 + tdf '_SetDocReg';$1708 + tdf '_SetEmptyRgn';$6A04 + tdf '_SetErrGlobals';$0B0C + tdf '_SetErrorDevice';$110C + tdf '_SetEventMask';$1806 + tdf '_SetFont';$9404 + tdf '_SetFontFlags';$9804 + tdf '_SetFontID';$D004 + tdf '_SetForeColor';$A004 + tdf '_SetFrameColor';$0F0E + tdf '_SetGrafProcs';$4404 + tdf '_SetHandleSize';$1902 + tdf '_SetHeartBeat';$1203 + tdf '_SetInfoDraw';$160E + tdf '_SetInfoRefCon';$360E + tdf '_SetInGlobals';$090C + tdf '_SetInputDevice';$0F0C + tdf '_SetInterruptState';$3003 + tdf '_SetIntUse';$B604 + tdf '_SetIText';$2015 + tdf '_SetKeyTranslation';$1C06 + tdf '_SetMasterSCB';$1604 + tdf '_SetMaxGrow';$430E + tdf '_SetMenuBar';$390F + tdf '_SetMenuFlag';$1F0F + tdf '_SetMenuID';$370F + tdf '_SetMenuTitle2';$400F + tdf '_SetMItem';$240F + tdf '_SetMItem2';$410F + tdf '_SetMItemBlink';$280F + tdf '_SetMItemFlag';$260F + tdf '_SetMItemID';$380F + tdf '_SetMItemMark';$330F + tdf '_SetMItemName';$3A0F + tdf '_SetMItemName2';$420F + tdf '_SetMItemStyle';$350F + tdf '_SetMnuTitle';$210F + tdf '_SetMouse';$1903 + tdf '_SetMouseLoc';$9304 + tdf '_SetMTitleStart';$190F + tdf '_SetMTitleWidth';$1D0F + tdf '_SetOrgnMask';$340E + tdf '_SetOrigin';$2304 + tdf '_SetOutGlobals';$0A0C + tdf '_SetOutputDevice';$100C + tdf '_SetPage';$470E + tdf '_SetPenMask';$3204 + tdf '_SetPenMode';$2E04 + tdf '_SetPenPat';$3004 + tdf '_SetPenSize';$2C04 + tdf '_SetPenState';$2A04 + tdf '_SetPicSave';$3E04 + tdf '_SetPolySave';$4204 + tdf '_SetPort';$1B04 + tdf '_SetPortLoc';$1D04 + tdf '_SetPortRect';$1F04 + tdf '_SetPortSize';$2104 + tdf '_SetPt';$8204 + tdf '_SetPurge';$2402 + tdf '_SetPurgeAll';$2502 + tdf '_SetPurgeStat';$0F1B + tdf '_SetRandSeed';$8704 + tdf '_SetRect';$4A04 + tdf '_SetRectRgn';$6B04 + tdf '_SetResourceAttr';$1C1E + tdf '_SetResourceFileDepth';$251E + tdf '_SetResourceID';$1A1E + tdf '_SetResourceLoad';$241E + tdf '_SetRgnSave';$4004 + tdf '_SetSayGlobals';$0D34 + tdf '_SetSCB';$1204 + tdf '_SetScrapPath';$1116 + tdf '_SetScroll';$450E + tdf '_SetSolidBackPat';$3804 + tdf '_SetSolidPenPat';$3704 + tdf '_SetSoundMIRQV';$1208 + tdf '_SetSoundVolume';$0D08 + tdf '_SetSpaceExtra';$9E04 + tdf '_SetStdProcs';$8D04 + tdf '_SetSwitch';$1306 + tdf '_SetSysBar';$120F + tdf '_SetSysField';$4804 + tdf '_SetSysFont';$B204 + tdf '_SetSysWindow';$4B0E + tdf '_SetTextFace';$9A04 + tdf '_SetTextMode';$9C04 + tdf '_SetTextSize';$D204 + tdf '_SetTSPtr';$0A01 + tdf '_SetUserField';$4604 + tdf '_SetUserSoundIRQV';$1308 + tdf '_SetVector';$1003 + tdf '_SetVisHandle';$C804 + tdf '_SetVisRgn';$B404 + tdf '_SetWFrame';$2D0E + tdf '_SetWindowIcons';$4E0E + tdf '_SetWRefCon';$280E + tdf '_SetWTitle';$0D0E + tdf '_SetZoomRect';$380E + tdf '_SFAllCaps';$0D17 + tdf '_SFBootInit';$0117 + tdf '_SFGetFile';$0917 + tdf '_SFGetFile2';$0E17 + tdf '_SFMultiGet2';$1417 + tdf '_SFPGetFile';$0B17 + tdf '_SFPGetFile2';$1017 + tdf '_SFPMultiGet2';$1517 + tdf '_SFPPutFile';$0C17 + tdf '_SFPPutFile2';$1117 + tdf '_SFPutFile';$0A17 + tdf '_SFPutFile2';$0F17 + tdf '_SFReScan';$1317 + tdf '_SFReset';$0517 + tdf '_SFShowInvisible';$1217 + tdf '_SFShutDown';$0317 + tdf '_SFStartUp';$0217 + tdf '_SFStatus';$0617 + tdf '_SFVersion';$0417 + tdf '_ShowControl';$0F10 + tdf '_ShowCursor';$9104 + tdf '_ShowDItem';$2315 + tdf '_ShowHide';$230E + tdf '_ShowMenuBar';$460F + tdf '_ShowPen';$2804 + tdf '_ShowWindow';$130E + tdf '_ShutDownTools';$1901 + tdf '_SizeWindow';$1C0E + tdf '_SolidPattern';$3904 + tdf '_SortList';$0A1C + tdf '_SortList2';$151C + tdf '_SoundBootInit';$0108 + tdf '_SoundReset';$0508 + tdf '_SoundShutDown';$0308 + tdf '_SoundStartUp';$0208 + tdf '_SoundStatus';$0608 + tdf '_SoundVersion';$0408 + tdf '_SpecialRect';$0C12 + tdf '_SpeechBootInit';$0134 + tdf '_SpeechReset';$0534 + tdf '_SpeechShutDown';$0334 + tdf '_SpeechStartUp';$0234 + tdf '_SpeechStatus';$0634 + tdf '_SpeechVersion';$0434 + tdf '_SRQPoll';$1409 + tdf '_SRQRemove';$1509 + tdf '_StartDrawing';$4D0E + tdf '_StartFrameDrawing';$5A0E + tdf '_StartInfoDrawing';$500E + tdf '_StartSeq';$0F1A + tdf '_StartSeqRel';$151A + tdf '_StartUpTools';$1801 + tdf '_StatusID';$2203 + tdf '_StatusTextDev';$170C + tdf '_StillDown';$0E06 + tdf '_StopAlert';$1815 + tdf '_StopSeq';$111A + tdf '_StringBounds';$AD04 + tdf '_StringWidth';$A904 + tdf '_SubPt';$8104 + tdf '_SyncADBReceive';$0E09 + tdf '_SysBeep';$2C03 + tdf '_SysFailMgr';$1503 + tdf '_SystemClick';$1705 + tdf '_SystemEdit';$1805 + tdf '_SystemEvent';$1A05 + tdf '_SystemTask';$1905 + dw $00,$00 + +t tdf '_TaskMaster';$1D0E + tdf '_TaskMasterContent';$5D0E + tdf '_TaskMasterDA';$5F0E + tdf '_TaskMasterKey';$5E0E + tdf '_TEActivate';$0F22 + tdf '_TEBootInit';$0122 + tdf '_TEClear';$1922 + tdf '_TEClick';$1122 + tdf '_TECopy';$1722 + tdf '_TECut';$1622 + tdf '_TEDeactivate';$1022 + tdf '_TEGetDefProc';$2222 + tdf '_TEGetInternalProc';$2622 + tdf '_TEGetLastError';$2722 + tdf '_TEGetRuler';$2322 + tdf '_TEGetSelection';$1C22 + tdf '_TEGetSelectionStyle';$1E22 + tdf '_TEGetText';$0C22 + tdf '_TEGetTextInfo';$0D22 + tdf '_TEIdle';$0E22 + tdf '_TEInsert';$1A22 + tdf '_TEKey';$1422 + tdf '_TEKill';$0A22 + tdf '_TENew';$0922 + tdf '_TEOffsetToPoint';$2022 + tdf '_TEPaintText';$1322 + tdf '_TEPaste';$1822 + tdf '_TEPointToOffset';$2122 + tdf '_TEReplace';$1B22 + tdf '_TEReset';$0522 + tdf '_TEScroll';$2522 + tdf '_TESetRuler';$2422 + tdf '_TESetSelection';$1D22 + tdf '_TESetText';$0B22 + tdf '_TEShutDown';$0322 + tdf '_TEStartUp';$0222 + tdf '_TEStatus';$0622 + tdf '_TestControl';$1410 + tdf '_TEStyleChange';$1F22 + tdf '_TEUpdate';$1222 + tdf '_TEVersion';$0422 + tdf '_TextBootInit';$010C + tdf '_TextBounds';$AF04 + tdf '_TextReadBlock';$230C + tdf '_TextReset';$050C + tdf '_TextShutDown';$030C + tdf '_TextStartUp';$020C + tdf '_TextStatus';$060C + tdf '_TextVersion';$040C + tdf '_TextWidth';$AB04 + tdf '_TextWriteBlock';$1E0C + tdf '_TickCount';$1006 + tdf '_TLBootInit';$0101 + tdf '_TLMountVolume';$1101 + tdf '_TLReset';$0501 + tdf '_TLShutDown';$0301 + tdf '_TLStartUp';$0201 + tdf '_TLStatus';$0601 + tdf '_TLTextMountVolume';$1201 + tdf '_TLVersion';$0401 + tdf '_TotalMem';$1D02 + tdf '_TrackControl';$1510 + tdf '_TrackGoAway';$180E + tdf '_TrackZoom';$260E + dw $00,$00 + +u tdf '_UDivide';$0B0B + tdf '_UnionRect';$4E04 + tdf '_UnionRgn';$7204 + tdf '_UniqueResourceID';$191E + tdf '_UnloadOneTool';$1001 + tdf '_UnloadScrap';$0916 + tdf '_UnloadSeg';$0E11 + tdf '_UnloadSegNum';$0C11 + tdf '_UnPackBytes';$2703 + tdf '_UpdateDialog';$2515 + tdf '_UpdateResourcefile';$0D1E + tdf '_UserShutDown';$1211 + dw $00,$00 + +v tdf '_ValidRect';$3C0E + tdf '_ValidRgn';$3D0E + tdf '_VDBootInit';$0121 + tdf '_VDGetFeatures';$1B21 + tdf '_VDGGControl';$1D21 + tdf '_VDGGStatus';$1E21 + tdf '_VDInControl';$1C21 + tdf '_VDInConvAdj';$0C21 + tdf '_VDInGetStd';$0B21 + tdf '_VDInSetStd';$0A21 + tdf '_VDInStatus';$0921 + tdf '_VDKeyControl';$0D21 + tdf '_VDKeyGetKBCol';$1221 + tdf '_VDKeyGetKDiss';$1421 + tdf '_VDKeyGetKGCol';$1121 + tdf '_VDKeyGetKRCol';$1021 + tdf '_VDKeyGetNKDiss';$1621 + tdf '_VDKeySetKCol';$0F21 + tdf '_VDKeySetKDiss';$1321 + tdf '_VDKeySetNKDiss';$1521 + tdf '_VDKeyStatus';$0E21 + tdf '_VDOutControl';$1921 + tdf '_VDOutGetStd';$1821 + tdf '_VDOutSetStd';$1721 + tdf '_VDOutStatus';$1A21 + tdf '_VDReset';$0521 + tdf '_VDShutDown';$0321 + tdf '_VDStartUp';$0221 + tdf '_VDStatus';$0621 + tdf '_VDVersion';$0421 + dw $00,$00 + +w tdf '_WaitCursor';$0A12 + tdf '_WaitMouseUp';$0F06 + tdf '_WindBootInit';$010E + tdf '_WindDragRect';$530E + tdf '_WindNewRes';$250E + tdf '_WindowGlobal';$560E + tdf '_WindReset';$050E + tdf '_WindShutDown';$030E + tdf '_WindStartUp';$020E + tdf '_WindStatus';$060E + tdf '_WindVersion';$040E + tdf '_WriteBParam';$0B03 + tdf '_WriteBRam';$0903 + tdf '_WriteChar';$180C + tdf '_WriteCString';$200C + tdf '_WriteLine';$1A0C + tdf '_WriteRamBlock';$0908 + tdf '_WriteResource';$161E + tdf '_WriteString';$1C0C + tdf '_WriteTimeHex';$0E03 + dw $00,$00 + +x tdf '_X2Fix';$200B + tdf '_X2Frac';$210B + tdf '_XorRgn';$7404 + dw $00,$00 + +y dw $00,$00 + +z tdf '_ZeroScrap';$0B16 + tdf '_ZoomWindow';$270E + dw $00,$00 + +gsos pdf $2034;'_GSOS:addnotifyproc' + pdf $201D;'_GSOS:beginsession' + pdf $2031;'_GSOS:bindint' + pdf $2004;'_GSOS:changepath' + pdf $200B;'_GSOS:clearbackup' + pdf $2014;'_GSOS:close' + pdf $2001;'_GSOS:create' + pdf $202E;'_GSOS:dcontrol' + pdf $2035;'_GSOS:delnotifyproc' + pdf $2002;'_GSOS:destroy' + pdf $202C;'_GSOS:dinfo' + pdf $202F;'_GSOS:dread' + pdf $2036;'_GSOS:drename' + pdf $202D;'_GSOS:dstatus' + pdf $2030;'_GSOS:dwrite' + pdf $201E;'_GSOS:endsession' + pdf $2025;'_GSOS:erasedisk' + pdf $200E;'_GSOS:expandpath' + pdf $2015;'_GSOS:flush' + pdf $2024;'_GSOS:format' + pdf $2028;'_GSOS:getbootvol' + pdf $2020;'_GSOS:getdevnumber' + pdf $201C;'_GSOS:getdirentry' + pdf $2019;'_GSOS:geteof' + pdf $2006;'_GSOS:getfileinfo' + pdf $202B;'_GSOS:getfstinfo' + pdf $201B;'_GSOS:getlevel' + pdf $2017;'_GSOS:getmark' + pdf $2027;'_GSOS:getname' + pdf $200A;'_GSOS:getprefix' + pdf $2039;'_GSOS:getrefinfo' + pdf $2038;'_GSOS:getrefnum' + pdf $2037;'_GSOS:getstdrefnum' + pdf $200F;'_GSOS:getsysprefs' + pdf $202A;'_GSOS:getversion' + pdf $2011;'_GSOS:newline' + pdf $200D;'_GSOS:null' + pdf $2010;'_GSOS:open' + pdf $2003;'_GSOS:osshutdown' + pdf $2029;'_GSOS:quit' + pdf $2012;'_GSOS:read' + pdf $2026;'_GSOS:resetcache' + pdf $201F;'_GSOS:sessionstatus' + pdf $2018;'_GSOS:seteof' + pdf $2005;'_GSOS:setfileinfo' + pdf $201A;'_GSOS:setlevel' + pdf $2016;'_GSOS:setmark' + pdf $2009;'_GSOS:setprefix' + pdf $200C;'_GSOS:setsysprefs' + pdf $2032;'_GSOS:unbindint' + pdf $2008;'_GSOS:volume' + pdf $2013;'_GSOS:write' + dw $00,$00 +p16 + pdf $0031;'_P16:allocinterrupt' + pdf $0004;'_P16:changepath' + pdf $000B;'_P16:clearbackupbit' + pdf $0014;'_P16:close' + pdf $0001;'_P16:create' + pdf $0032;'_P16:deallocateinterrupt' + pdf $0002;'_P16:destroy' + pdf $002C;'_P16:dinfo' + pdf $0025;'_P16:erasedisk' + pdf $0015;'_P16:flush' + pdf $0024;'_P16:format' + pdf $0028;'_P16:getbootvol' + pdf $0020;'_P16:getdevnum' + pdf $001C;'_P16:getdirentry' + pdf $0019;'_P16:geteof' + pdf $0006;'_P16:getfileinfo' + pdf $0021;'_P16:getlastdev' + pdf $001B;'_P16:getlevel' + pdf $0017;'_P16:getmark' + pdf $0027;'_P16:getname' + pdf $000A;'_P16:getprefix' + pdf $002A;'_P16:getversion' + pdf $0011;'_P16:newline' + pdf $0010;'_P16:open' + pdf $0029;'_P16:quit' + pdf $0012;'_P16:read' + pdf $0022;'_P16:readblock' + pdf $0018;'_P16:seteof' + pdf $0005;'_P16:setfileinfo' + pdf $001A;'_P16:setlevel' + pdf $0016;'_P16:setmark' + pdf $0009;'_P16:setprefix' + pdf $0008;'_P16:volume' + pdf $0013;'_P16:write' + pdf $0023;'_P16:writeblock' + dw $00,$00 + + adrl $00 ;must be here!! + + lst +tools equ ]count + lst off + + typ $06 + sav qasystem/toolmacs + + diff --git a/src/docs/qasm.docs b/src/docs/qasm.docs new file mode 100644 index 0000000..1a5859e --- /dev/null +++ b/src/docs/qasm.docs @@ -0,0 +1,492 @@ + + QuickASM Shell v0.40 by Lane Roath + +The QuickASM shell combines the best of both worlds; Graphics and Text. With this shell you can use a graphical, multi-window system similar to MPW on the Macintosh or a text based system similar to APW on the GS. Not only that, but you can switch between the two at will with a single keypress! + +This version of the QuickASM shell is NOT completed, but should give you enough of a base to do serious development work in. "Not Implemented" details those features of the graphics enviroment which have not been implemented at this time. + +Not Implemented + +"Project" has not even begun to be implemented! However, the single option "Build Project" does allow you to select a Merlin 16+ link file to use as a bases for linking ( ___ BUGGY ___). If you have an open source window, this option will try to use it as the link file. (ie, open your link file, then edit your documents. When ready to link, just select the link file's window and choose this option!) Later, this will instead look (only???) at QuickASM project files & will work on the open project if there is one. + +"Apple" - "Help" provides no such thing! Must learn the list manager... + +"Document" - "Label/Line #" does nothing at this point. Use "Find" instead. + +"Tools" - does nothing! (the SFDialog does appear, but nothing happens). + +"GS/OS" - the only option that works is "Delete". + +"Transfer" - "Launch..." allows selection of the file, but will probably crash your system + (___BUGGY___). The file list (ie, Merlin 16+) is not implemented! + + Text Mode + +This should all work, but extensive testing has NOT been done. To return to the graphics enviroment simply press the ESC key at the "CMD:" prompt. + +To be done + +"Fix Source" instead of just changing $A0 to tabs, need to format each line and replace it in the document. MUCH slower, but needed because otherwise we can't fix sources from QuickEdit or APW. Also, we leave lines which Merlin prints correctly but doesn't modify (ie, all spaces are $20) in a bad state (ie, comments with no ; preceding them). + +QuickLink we need to have a way to link a project using the QuickLink.S file method, preferably with a hot key associated with it (*Ll?). This would be an "interm" idea until our project stuff is done??? + +_________________________________________________________________________ + + QuickASM Technical Information Jan 9, 1990 - 1st revision +_________________________________________________________________________ + +Introduction + +This document will attempt give some insight on developing applications and utilities that execute under the QuickASM development environment. It describes what is available under the development system and gives examples on using the QuickASM toolset, writing SHELL programs, shell applications, utilities, additional compilers/assemblers, additional linkers, and adding additional features to the QuickASM GS assembler (such as keyboard macros, USR opcodes, and USER files). + +The QuickASM development system has been designed to allow the Apple //GS software developer the flexibility and power he needs along with the ability to allow his development environment grow as his needs change. The basic system includes TWO different interfaces: a text based command line interface is available for those developers who enjoy the traditional text based programming environment similar to that of the Apple Programmer's Workshop, and a full SHR "desktop" environment that includes pull down menus, multiple edit windows, and the ability for multiple "shell applications" to execute simultaneously on the desktop. + +Combined with the ability to easily add new commands and shell applications (including new compilers and linkers!) the QuickASM development system will be hard to beat for a long time to come, and will constantly be updated. + +The QuickASM development environment has been designed with both APW and Merlin users in mind. It combines the power and flexibility of the APW programming environment with the ease of use and SPEED of Merlin 16+. APW users have only DREAMED they could achieve the speed of Merlin under their APW shell, and Merlin users could only wish for APW expandability and power! With QuickASM, you have the best of both worlds! + +At the heart of the system is a Merlin 16+ compatible 65816 macro assembler, which, along with being 100%+ Merlin compatible at source code and link file levels, has over 40 new features (including built in GS ToolBox macros) and psuedo opcodes for even more assembly language power. Have you ever scratched your head and thought "I wish I could do this...in Merlin??" Well...now you can! + +The QuickASMGS linker is also 100%+ Merlin compatible and all of your current Merlin linker command files will work perfectly without change. But we weren't satisfied with that! The QuickASM linker is also 25% faster than the Merlin linkers, generates SMALLER object files, supports GS resources, has an "auto-EXPRESS" feature (to create EXPRESSLOAD files), allows expression evaluation (like "DS reserved*2"...where "reserved" is a label in your assembly source!!!), and allows much more flexibility in program design by allowing a greater number of segments, multiple SAV's and a variety of other time and space saving features. + +The QuickASM development system also includes 2 utilities for working with resource forks in your application. First, the resource compiler allows you to compile text files into resources, much like APW's REZ program. Second, the resource editor allows you to visually edit, change ID's, cut, copy, and paste resources between different programs. The resource editor has been designed to use "resource translators" so as more resource types are defined, simply adding a new translator will allow you to graphically edit the new resource. Coupled with the linker's ability to automatically link resources from "resource libraries", the QuickASM development environment delivers more power to develop programs utilizing resources than any other development system on the market. + + *** A resource de-compiler will also be available that will create a resource compiler compatible text file from existing resources. *** + +Also in the works is a Project Manager that will allow the developer to create "projects" that will automatically "remember" prefix settings, source files, link orders, and final "load file" segment types and position. If you are familiar with Lightspeed Pascal for the Macintosh....we have a treat for you! *** NOTE **** if you have suggestions for the project manager, be sure to let Lane know about them soon!!! + +The QuickASM development system also includes a symbolic debugger (much like the APW DEBUG program) that allows the programmer to step, trace, and execute any GS program, along with setting breakpoints, viewing memory, 65816 registers, and the stack. If the program has been created with the QuickASM linker, you will also have the ability to access variables, subroutines, etc. by LABEL!!!! + + +Definitions + +Throughout this information, you will encounter several terms which, generally speaking, may cause some confusion. The following definitions will make things clearer. + +Application - Unless otherwise noted, "application" will describe a QuickASM "shell application", a program that has been specifically written to run under the QuickASM shell environment. The best way to understand these programs is to consider them to be "shell desk accessories". When these programs are executed by the user they remain active on the QuickASM "desktop" until they are closed by the user. Normally (but not limited to), these applications will put a window on the desktop and allow the user to do some action. These programs are passed "messages" by the QuickASM shell, that tell the application what action it is to take. Multiple "applications" may be open at once on the desktop and the QuickASM shell acts like a "multifinder" allowing each to handle it's own events. + +Compiler - Throughout this discussion, the term "compiler" will be used to designate any program that converts the user's source code files into files that a "linker" will use to create the final GS program file. The QuickASM 65816 assembler is one example of such a program. Additional "compilers" may be added to the QuickASM development system simply by following the "Compiler Requirements" below. We anticipate other compilers, such as BASIC, PASCAL and C to become available in the future. We are also working on a Merlin compatible assembler that creates link files that are compatible with the APW linker. + +Linker - the term "linker" describes any program that takes output files from different "compilers" and creates an Apple //GS "load" file from them. The QuickASM linker currently accepts Merlin type LNK files ($F8) and imediately creates GS programs in OMF format. + +External Command - An external command is a disk based command, such as TYPE or DUMP. These programs are only in memory while it is executing, and is shutdown after completing its task. These programs are located in the "COMMANDS" directory (prefix #6) and are available in either the command line or graphics interface. + +Internal Command - Internal commands are those commands built into the QuickASM system, such as CATALOG or DELETE. These commands are always available to the user, from either the command line or graphics shell. + + +Inside the Environment + +When the user launches the file QASM, the QuickASM development system goes through a rather complex boot process to initialize itself. Actually, the QASM file is simply an init file responsible for: + +Startup: + +1: Starting up the Tool Locator, Memory Manager, Miscellaneous Tools, ADB toolset, Integer Math toolset, SANE toolset, the resource Manager, and the Text Toolset (the Text Toolset is also initialized for BASIC style input/output, the screen is cleared and the cursor is moved to home. + +2: Loading the file QASYSTEM/QATOOLS using _InitialLoad, installing it as a USER toolset, and calling _QABootInit. + +3: Loading the file QASYSTEM/QAINTCMD using _InitialLoad, to load the system's internal commands. The handle to this program file is saved to pass to the QA toolset. + +4: Loading the file QASYSTEM/QAPREFS, which is the user's preference file and again saving the handle to this file for later. + +5: Reading the user's command table (file: QASYSTEM/QACMD), which is simply a TXT or SRC file in the following format: + +Command Name Type ID # Comment +TYPE E 12 ;List a TXT file + +The COMMAND NAME is a valid ProDOS pathname that may be no longer than 15 characters in length. It is this name that the user will type at the command line to access the command. The commmand name may consist of upper or lower case letters, but the commands are considered case-INSENSITIVE. + +The TYPE is a letter designating the type of the command: C for compiler, L for linker, I for internal command, E for external command, and A for application. The type letter may be preceded by a '*' to allow the program to be restartable from memory. + +The ID NUMBER is any number from 1 to 65535 that will be used internally by the system. Duplicate IDs are allowed, but the file used by any duplicate ID numbers will be the name of the file that comes first in the list. This allows the user to have multiple commands that do the same thing. + +For example: + +CATALOG *E 1 ;this is the catalog command +CAT E 1 ;this will execute CATALOG +DIR E 1 ;again, same as CATALOG + +The COMMENT field is not required but may be used +to describe the command. + +The command file is read and stored into records of the following format: + + Offset # bytes Description + + 0 16 Command Name (P-Str, all caps) + +16 2 Type (L=1,C=2,I=3,E=4,A=5) + +18 2 ID Number (1-65535) + +20 2 Flags (b15=restartable, all others 0) + +22 2 UserID (must be zero) + +24 4 DP Handle (must be zero) + +28 2 DP address (must be zero) + +30 4 Load Address (must be zero) + +34 2 Message (must be zero) + +36 4 Message subtype (must be zero) + +The INIT program should do a _QAGetCmdRecSize():recsize call to determine the length of each individual record. The current version of the toolset will return 40. This allows the extension of the records in the future as well as maintaining backward compatiblity. + + ** The handle to this array of commands MUST be passed to the QAToolSet. ** + + +6: The init file must then check bit 15 of the INITFLAGS field in the QAPREFS file (which has already been loaded) and if the bit is set to 1, the init file loads the file QASYSTEM/QAGRAF using _InitialLoad. If the bit is 0 the file QASYSTEM/QATEXT is loaded using _InitialLoad. In each case, a new USERID is obtained and a $100 byte direct page is obtained from the memory manager (use the new userid) + +7: _QAStartUp is then called, using the USERID of the INIT file, and a MODEFLAGS field of $00008000 (for QAGRAF) or $00000000 (for QATEXT). + +8: _QASetCmdHdl is called with the handle to the command table array. _QASetParmHdl is called with the handle to QAPREFS. + +9: Next, the A register is loaded with the userid of the QAGRAF or QATEXT program and the D register is loaded with the value of the $100 byte block obtained from the memory manager, the X and Y registers are currently undefined and should be set to zero. Finally, a JSL is executed to call the shell program. + +Any Errors obtained at any of these levels are considered FATAL and are reported to the user using the TEXT TOOLS. All necessary shutdown is performed, (_UserShutdown, disposing of memory, etc) and control is passed back to the launching application via a GS/OS QUIT call. + + +ShutDown + +When control passes back to the INIT file via RTL from the shell program, the status of the carry flag is checked to determine if a fatal error occurred in the shell. If carry clear, no error occurred and shutdown may proceed as normal, otherwise the error code is reported to the user via TEXT tools, shutdown is completed as described below and a GS/OS QUIT call is performed. + +If no error occurred from the shell, a _QAGetQuitParms call is executed to check whether another application is to be launched or not and the GS/OS QUIT call is called accordingly after all shutdown is completed. + +The INIT file must do the following: + +1: Disposing of any memory that it may have obtained (commandtblhdl,parmhandle, etc). + +2: If QATEXT or QAGraf was started up, a _UserShutDown call must be made to remove it from memory. (_UserShutdown will dispose of the DP handle used for it automatically if the INIT file used the shell's USERID when it requested the handle) + +3: If _QAStartup was called and successful, the INIT file MUST, before calling _QAShutdown, do a _QADispose which will shutdown any and all external programs (applications, compilers, etc.) that may still be executing. The graphics shell should have done this already, but the text shell may not have....if it has already been called, no harm will be done, and it is better to be safe, than sorry! + +4: ShutDown all toolsets that were started. + +5: Make a GS/OS QUIT call (using results of _QAGetQuitParms if necessary..see above) to return to the system. + + +QATEXT/QAGRAF + +These two programs are the user interface that link the user to the QAToolset and the commands, and applications available to him. QATEXT is a command line interface (much like APW) and QAGRAF is a desktop environment. In either case these programs are responsible for: + +1: When control is passed to the program it is via JSL, the A reg is set to it's USERID and the D register is set to a $100 byte block of direct page. The shell must use its OWN userid for obtaining memory, and if it needs more than $100 bytes of DP it should do a _FindHandle, and a _SetHandleSize. + +2: Before taking ANY steps (after saving the DP and USERID) the shell program should do a _QAStatus call (make sure you use PEA $00, not PHA, etc) to determine if the QATools are started up. If an error is returned, or the result is $00, the shell was not launched by the QuickASM development environment and should immediatly execute a GS/OS QUIT call. + +3: After determining that QATools are active, the shell must load and startup any and all toolsets that it requires other than those started by the INIT program (see above). If the shell will be using the Event Manager (or TASKMASTER), it must do a _QAGetModeFlags, set bit 14 (remember MODEFLAGS is a long word!) and do a _QASetModeFlags. + +4: After the shell has started up the tools it needs, setup anything else it needs (menus, windows, etc), the shell must use the call _QASetVector to set pointers to routines that will handle the I/O for commands, compilers, linkers, and applications. Text based shells need not set these vectors as the QATools defaults to standard text input and output. + +Vectors of significance to the SHELL are described below: + +**** Important **** + +All vectors are called in full native mode (16 bit A,X,Y) with a JSL. The routines must preserve the D and B registers and return via RTL in full native mode. If an error occured, the carry must be set with the error code in A, else carry is clear with the registers set as defined below: + +*************************************************************** +These vector numbers are NOT SET in stone....you should use the QA.EQUATES file and use the name of the vector preceded with a 'v'. Thus, to access the PrintChar vector use '#vPrintChar'. + +**************************************************************** + +Vector # Name Description + +1 - PrintChar - Print character in A reg (low byte only, high undefined) to current display window. +2 - PrintStr - Print Pascal type string (ptr low in A, ptr high in X) to current display window. +3 - ErrChar - Print character in A reg (low byte only, high undefined) to current error output window. +4 - ErrStr - Print Pascal type string (ptr low in A, ptr high in X) to current error output window. +10 - Keyavail - Return $FFFF (true) in A if keypress, autokey available in queue. Return $0000 (false) if no keypress available. ALWAYS leave keypress in queue! +11 - GetChar - Return pending keyboard character (high bit set) in low byte in A. Return keyboard modifiers at time of press (format of $C025 keyboard register) in high byte of A. Remove keypress from queue. +12 - GetLine - Get a line of input from user. On entry, the A register holds the low word of a pointer to the parameter table, the X register holds the high word of the pointer. The parameter table is defined below. The routine should return the user's input line at the address pointed to by the LINESTR field in the table. The high bits of all input characters MUST be clear, and a character must be appended to the end of the string. LINEPTR is a Pascal Type string (with a length byte) and should be returned as such. On entry, LINESTR will hold the default text to use, or will be a NULL string if none. PROMPTPTR is a pointer to a promptstr that should be used to ask the user for input. The MAXLEN field is the maximum length of the string that the user may enter. If an error occurs, the carry should be set, and the A holds the error code on return. If no error occurs, the carry must be clear, and the A register holds $0000 if the user chose to ACCEPT the line, or $FFFF if the user canceled the operation. If CANCEL is selected, the original LINESTR MUST NOT be changed in any way. + +GetLine Parameter Table: ++0 MaxLen word ++2 PromptPtr Long ++6 LineStrPtr Long + +16 TabToColumn - Move cursor X position to value in A + register, if current X is >= value, + simply move X pos forward one pos, + scrolling if necessary. + +5: Once all vectors are setup, the Shell starts its main event loop. During each pass through this loop, it must do the following things: + +Call _QAGetQuitFlag and if the result is true, the user has selected quit somewhere (it may not be from within the shell, so you MUST check this flag) and the shell must take whatever action it needs to quit the program (see "shutdown" below). + +Call _QARun. This procedure requires nothing of the shell itself, no parameters or results, it simply passes a RUN message to any shell applications that may be executing. + +If after recieving an event (either from TaskMaster or the event manager), that cannot be handled by the shell itself, it must call _QAEvent with the pointer to the event record (or taskrecord) and a flag describing whether the record is an event record or a task record. This allows shell applications to handle events that were intended for them. + +6: In order for the shell to execute commands that are built into the system, either external programs (commands) or internal commands, it must pass a pointer to a cmd line to the routine (_QAParse) which will determine if the command is a valid command or not, and return a type ID (1..5) and a command ID (1.65536) of a valid command, or an error if not. To actually execute the command, the shell simply calls _QAExecCommand with the typeid and commandid of the command it wants to execute, the toolbox handles all loading and unloading, obtains the necessary DP for the utility, and calls it. Most commands will require that a previous _QASetCommandLine be executed so that it may retrieve whatever parameters it needs to do its job. Even if the shell is not using a command line interface...it MUST place SOMETHING in the system command line string before calling _QAExecCommand. *** See Below....About Command Lines *** + +_QAExecCommand will return no error (carry clear..toolbox convention) if the command reported no error, and the error code (carry set) in A if an error occurred or the command was not valid. The shell should report this error to the user in what ever means it sees fit. + + +Shell Shutdown + +When the system QUITFLAG is TRUE (via _QAGetQuitFlag) the shell must do the following before returning via RTL to the INIT program. + +Call _QADispose before shutting down any tools or disposing of any system handles or pointers. This will pass shutdown messages to any currently executing applications that may require them. It will also release any and all memory given to these applications and delete their USERIDs from the list of active IDs. + +Call _QAResetVectors. This call resets the internal vectors to their default values, so the shell doesn't get called after it's been unloaded. + +Dispose of any memory that the shell has acquired for it's own use. + +Shutdown any tools (excluding those started by the INIT file..see above) + +Exit via RTL with carry clear indicating NO FATAL ERROR. If the Shell can't startup correctly (can't load a tool, etc) it should exit carry set, with error code in A, so the INIT file can report it to user and shutdown the system. + + +***** More about Command Lines ***** + +The QAToolSet keeps it's own internal command line so that external commands and applications can get required parameters from them. This command line is a PType string (with a length byte) that consists of ASCII characters >=$20 (i.e. no control characters) and high bits clear. The string is also terminated by a char ($0D) and this byte is included in the length count. The MAXIMUM length of this command line is 255 characters and 1 length byte for a total of 256 bytes. + +A shell program uses the call _QASetCommandline to set this command line in the system. It will automatically append any needed as well as remove control characters. Most (if not all) commands executed via _QAExecCommand will expect this command line to be valid as they will use the call _QAGetCommandLine to get their info. They will also expect to find a command word (i.e CATALOG) at the beginning of the system command line. The command word is not important in what it says.....just that it be there. External commands DO NOT check what the characters are (or else the user would not be able to rename his commands), but they do "skip" over this word to get to their parameters. Thus, any shell wishing to call _QAExecCommand MUST put at least one alphanumeric character, a space, any required paramters, and a into the system command line using _QASetCommandLine, before calling _QAExecCommand. + +________________________________________________________________________ + + QuickASM GS Beta Test Docs +________________________________________________________________________ + + +QuickASM is copyright 1990, QuickSoft Software Development +Merlin is copyright 1989, Roger Wagner Publishing and Glen Bredon + +This file is a brief introduction to the QuickASM development environment. This is a temporary documentation file and it in no way covers EVERYTHING available in the system. It is simply a brief set of instructions in order to get you up and running. If you are recieving this file, you will also be receiving a more complete set of doc files as soon as they become available. If you are not interested in beta testing this development system or are not interested in receiving any more "junk" mail concerning this development system please contact us and we will leave you alone. You have been selected to receive these files because you have shown some interest in "taking a look" at what we have put together and because we value your input. If you find things that you would like to have included in the system, or if you find incompatibilities with QuickASM and Merlin....or if you (heaven forbid) find a bug or two, please contact either Lane Roath at 318-949-8264 (GEnie:L.Roath/Delphi:LRoath) or myself, Shawn Quick at (406) 752-0193. + +We are asking you to test this system as thoroughly as you have the time to do so. With any program as complex as this development system, there are FAR more possibilities than the author can test...although I have done a very thorough job of debugging as the programs were being developed. I guess basically what I am asking is that you do anything and everything that you can think of to MAKE it break. You will undoubtably find sections of the environment that may not run as quickly as you would like (the editor for example), and these problems will be remedied in the near future. + +Thanks for you time, and your input.....when the system is ready for release you will be rewarded for your efforts with a final copy of the system.....that I GUARANTEE will become your "official" development environment!!! + + +In order to succesfully get the system running you will need the following files in their respective directories: + +QASM S16 ;the initial "boot" file (the one you launch) +QASYSTEM DIR ;System directory + QAINTCMD TOL ;Internal command handlers + QATOOLS TOL ;QuickASM ToolSet + QATEXT EXE ;The TEXT (command line) shell program + QAGRAF EXE ;The desktop shell (Lane's in charge of this) + QAPREFS BIN ;User Parameter file + QACMD TXT ;User Command File + TOOLMACS BIN ;Built in ToolBox Macros + QUICKLINK.S TXT ;System QuickLink command file + LOGIN TXT ;User LOGIN file (not implemented) +UTILITY DIR ;External Command/Languages Directory + QASMGS EXE ;QuickASM 65816 assembler + QLINKGS EXE ;QuickASM Linker + CATALOG EXE ;External Catalog command (not necessary) + DUMP EXE ;External file dump utility (originally by G. Bredon) + + +The QuickASM development environment has been designed to be modular. Allowing you to modify it to work the way you work. It is 100% Merlin 16+ compatible at both the source and link levels, and also includes two separate user interfaces: a text based command line interface (much like APW) and a SHR "desktop" environment (though not completed yet) that works like a "multifinder" allowing multiple "utility" programs to be active at once. The system will also allow the addition of new compilers, assemblers and linkers as they become available (such as a BASIC compiler, Pascal, or an APW compatible assembler/linker) as well as external commands and utilities much like the APW environment. + +In addition to the Merlin compatible assembler and linker, the development system also includes a symbolic debugger (like APW's debug, only allowing symbolic addresses to be used) *** still in alpha testing ***, a resource compiler, decompiler, and visual resource editor *** late alpha stage ***. +Along with these utilities, you may also look forward to a complete PROJECT MANAGER (much like Lightspeed Pascal for the Macintosh), disk utilities, and a powerful EXEC language, plus keyboard macros, USR and USER files. +(*** although these files are not present in this version....the entire system has been designed to support these automatically, and in fact, all of the above mentioned programs exist in one form or another on my hard disk...just waiting for more intensive debugging!!!! ***) + +Design Philosphies + +In writing the QuickASM development system, I have tried to keep several goals in mind. + +I wanted to create a development environment that professional Apple // developers would find powerful enough to handle any programming challenge presented to them and yet be intuitive enough that developers weren't constantly having to search through menus, or type long commands over and over, etc. + +I wanted to design the FASTEST possible //GS assembler system that combined the speed of LISA, the popularity of Merlin, and the power and expandability of APW. + +I wanted a development environment interface that would act as a "multifinder" that would allow multiple "applications" and utilities to be available simultaneously on the "desktop". + +I wanted this new development system to be completely compatible with my already huge library of source code from my 10 years of Apple // programming. + +I wanted the development system to grow and change as my needs changed. I was looking for an environment that could be updated, expanded, etc. without constantly having to mail in for "update disks". I needed an environment that third parties could add to, user's could add to, and would always be "up to date" + +I wanted a development system that was integrated, yet separate. This modularity would allow it change and yet still support utilities and programs that were written for older versions. Whether I wanted "bare bones" text based programming, or a powerful "desktop" based environment. + +I wanted a development environment that ran in a minimal memory configuration....yet take advantage of ALL the memory I had available. QuickASM will run quite effectively with 512K....and will still take advantage of 8 megs if you have it!!! + +And most of all....I wanted a development environment that was RESPONSIVE to the base of programmers who are using it. QuickASM comes with a detailed set of technical information describing EVERY aspect of the systems internal functions. Many example programs are included which show how to add any type of utility, command, compiler/assembler, linker, built in macros, new opcodes, new shell programs, etc. If you ever have said "I wish..." QuickASM probably CAN! + +QuickASM was originally created with the Merlin 16+ assembler (thanks Glen and Roger!!) and now that it is "old" enough (meaning it can assemble/link itself) it is actually used to develop itself!!!! + +About the SHELL + +Within this initial beta release you will find only the text based development environment. Lane Roath is working on the graphics/desktop shell which will be completed within a week or two. + +After booting/launching the QASM program file you will be presented with your desired user interface (text/graphics) as set within your system preferences file. This is your interface to the entire development system that you have defined within your user command file (QASYSTEM/QACMD). Adding a new external command, utility program, or even new compilers/assemblers or linkers is as easy as entering the command in your system command table. + +(*** the final docs will give technical information regarding how to write new commands and utilities as well as how to add new commands to the command table ***) + +In order to get a listing of the currently defined/installed commands, simply enter HELP at the command line, or choose help from the menu bar. + +All of the currently defined commands are straightforward except maybe the command ASML. ASML is equivilent to the Merlin "QuickLink" (OA-6 from the editor). This command will assemble the file given as a parameter in the command line (no .S extension), and link the resulting object file into an executable GS program file. ASML stands for assemble and link, and the "quicklink" function is described below in the section "About the Linker". +(*** ASMLG, though valid as a command is not supported in this version ***) + + +About the Assembler + +The QuickASM assembler is initiated via the "ASM filename" command from the command line. There are various aliases to the ASM command, such as COMPILE, ASSEMBLE, etc and all serve the same purpose. + +The assembler itself is 100%+ Merlin 16+ compatible and will correctly assemble ALL Merlin source codes. There are a variety of new features that the assembler supports and some of the most important features are described below: + +LUP - The LUP opcode now supports up to 16 levels of nesting. This can be very helpful for building tables, etc...but it also can get confusing. Remember that any LUP's that are found within another LUP structure will be expanded multiple times. Merlin 16 allows LUP 0 and will in effect turn off assembly until the matching --^ opcode is encountered. QuickASM will generate an appropriate error message for any LUP operand that evaluates to a value less than 1. + +EVL - The EVL (Evaluate) psuedo opcode enables algebraic operand evaluation for ALL operands and not just those enclosed in braces {}. EVL supports ON and OFF in the operand field to enable and disable this feature. + +ENC - The ENC (encode) opcode expects an 8 bit operand and instructs the assembler to EOR every byte put into the object code with the operand value. ENC without an operand will restablish normal object code generation, as will ENC $00. This is useful for "hiding" text or object code within the resulting disk files. The program code itself is responsible for "un-encoding" these bytes before using them in the program. If the assembler finds that the ENC opcode is inappropriate (for example in REL code sections) an error message is generated. ENC is useful for hiding copyright messages and serial numbers within programs. + +TBX - TBX (toolbox) enables/disables the automatic recognition of the built in GS Toolbox macros. It supports the following operands: + +TBX ON (or none) - enables toolbox macro recognition +TBX OFF - disables toolbox macro recognition +TBX LC - enables recognition and all expanded macros are listed in LowerCase. +TBX UC - enables recognition and expanded macros are listed in UpperCase. + +The GS toolbox macros are all defined using the toolbox name preceded with an "_". For example: _NewHandle. + +TBX also enables built in GS type macros such as PSL (pushlong), PSW (pushword), JNE (Jump if not =), TLL (toolcall) etc. (** A complete list of these standard GS macros will be included in the final docs **) + +If you wish to use your own toolbox macros or change the built in macros, simply create a macro in your source file that has the same name as the built in macro. For example: + + TLL mac ;my macro def + ldx #]1 + jsl $e10000 + bcc ]2 + eom + +The above macro would then REPLACE the built in macro called TLL and all calls to this macro would then come from this new definition. + +GS/OS (as well as ProDOS 16 and ProDOS 8) macros are also included for ease in making DOS calls. These macros are called by the syntax: + +_GSOS:Open parameterlist or, +_P16:Open paramlist +_P8:Open paramlist + +IN ORDER to use the built in ToolBox or DOS macros, you MUST use the SHELL command TOOLMACS before using the macros in your assemblies. This command need only be executed once (usually within your LOGIN file) and simply loads the macro definitions into memory for access by the assembler (or ANY other utility, like the symbolic debugger!!! ). If you wish to save memory, and do not use the built in macros, simply do not execute the TOOLMACS command. + + +DUP - DUP (duplicate) supports both ON and OFF in its operand and will enable/disable the ability of the assembler to ignore duplicate label errors if the labels are EQUated to the same value. + +SYM - The SYM opcode will print the symbol table on the second pass of the assembly. This is the equivilent of the symbol table printout in Merlin at the end of assembly with listing on. QuickASM will NOT print the symbol table at the end of assembly UNLESS a SYM opcode has been encountered. + +(*** In the future, SYM will also allow alphabetic and numeric listing of the symbol table, as well as saving the symbol table to disk for use by other assemblies (a kind of "preassembled" equate files ***) + +RND - RND (random) will assign a 32 bit random number to the label in the label column of the RND line. Thus the line: + +mylable RND ;random number + +PEK - PEK (peek) will assign the label in the label column the 8 bit value at the memory location in the operand. Example: + +mylable PEK $E0C000 ;read the current keyboard location + +will assign mylable the value of memory location $E0C000 at the time of the assembly. + +MTX - MTX (mousetext) is similar to the ASC psuedo-op but the characters are converted to mouse text before being placed in the object code. + +LIB - LIB (library) is similar to USE except that the file is not accessed on the second pass of the assembly. LIB files will contain EQUs and macro definitions that are only needed on the first pass of the assembly. Using LIB instead of USE for these types of files will speed your assembly times. Caution: because LIB files are only accessed on the first pass of assembly, NO CODE MAY BE GENERATED within these files or errors will occur. + +BEL - Beeps the GS's speaker on the second pass of the assembly. Most likely used at the end of a source code listing to signal that assembly is complete. + +XC- - XC- (XC minus) is the reverse of the XC opcode in Merlin. XC OFF is also supported. + +DL - DL (Define Long) simply another name for the ADRL psuedo-op. +BYT - BYT (Byte) same as DFB, or DB +BTR - (Branch if True) equivilent to BNE +BFL - (Branch if False) same as BEQ + + +Other Additions: + +Macro Nesting levels have been expanded to 16 levels +DO/FIN nesting expanded to 16 levels + +IF supports " IF XC" (like IF MX) to determine whether or not extended opcodes have been enabled. XC returns 0 if 6502 mode selected, 1 if 65C02 mode selected, and 3 if 65816 mode selected. Useful in macros where PEA might be used if 65816 enabled and LDA, PHA, LDA, PHA would be used for the 6502. + +The assembler creates Merlin type LNK files ($f8) that are DIRECTLY compatible with the Merlin Linkers (and vice versa). + +The assembler also supports the math operator MOD which is '//', thus 10 mod 3 would be expressed as: 10//3 and would evaluate to 1 (one). 10 div 3 = 3 with remainder of 1. + +Things to consider: + +The assembler is slightly slower than Merlin 16+ on assembly times. There are two reasons for this (both of which will be fixed in a short while). First, the macro expansion code is "slightly" sloppy and this is the main bottleneck in the assemblies. Second, because of the "modularity" of the development system, the assembler has been written to support a variety of different environments that it may be run under. For example, whether or not the Event Manager is active, whether there is a keyboard macro program installed, and/or whether the EXEC language has called the assembler. Therefore, reading the keyboard to see if the user would like to pause the listing, cancel the assembler, etc. requires a toolbox call instead of a simple read of the keyboard location. In large source files, the keyboard may be read up to 100,000 times. This overhead has been found to slow assemblies by approximately 12 seconds on a 25,000 line source code. We have developed a method that will prevent this, but at this time the code is not in place....simply twiddle your thumbs for a few seconds longer per assembly. + +The assembler has been designed internally to support "precompiled" source code files.....such as those found in the LISA assembler system. It is anticipated that this precompilation of source code files (by a special editor or utility program) will cut assembly times by 50%!!!!! This is our ultimate goal. The format for this precompilation has been designed on paper, but until I can find a day or two to write a program to convert source codes....we'll have to wait. + +- USR opcodes are not supported in this version. The USR routine is tied to a routine that compresses the text of the QuickASM opcodes (like LDA) and places them in the object code. This is so QuickASM can assemble itself while in the development process. USR opcodes (as well as new user opcodes that can have ANY name) will be available when the shell is complete. + +KBD is not available in this version of the assembler..although labels defined via KBD will use a value passed to it from the Linker. We have to settle on a GetLine routine that will work from both text and graphics modes and when that's settled KBD will be as normal! + +About the Linker + +The QuickASM Linker is a superset of the Merlin 16+ linker. It supports all of the Merlin linker opcodes (except LIB...which we have decided is much more work than its worth...we have never known anyone who uses it..but if YOU do and want it....it can be put in). There are also many other features that have been added to make the linker much more powerful. + +The QuickASM linker is ALWAYS a two pass linker (like the Version 2 Merlin linker)...but you will find that link times are comparable with the Merlin 1 pass linker. When using OMF version 2 you will also find that the final GS load files (programs) will be much smaller than the exact same program linked with the Merlin linker. Multi segmented files are supported (multiple SAVs) and dynamic segments are also supported. + +New Linker opcodes: + +AUX - places value of operand in the auxtype of the output file. Similar to ADR. +PFX - sets prefix 0 to text in operand. You may also use CMD PREFIX /DISK + +IMP - Import. IMP filename. will allow ANY type of file to be linked into the output file. Inserts the file's filename into the ENTry table so that other REL files may reference it. Similar to Merlin's ability to link a BINary file....except it allows ANY file type. Periods in the filename are converted to underlines. + +REZ - REZ filename. Copies the resource fork of "filename" into the resource fork of the output file. This allows you to have a file of resources (created with REZ, etc) that are placed into to final load file at link time, without having to REZ EVERY TIME!!! + +ZIP - Automatically converts the final output file to EXPRESSLOAD format. + (** not quite working yet **) + +POS/LEN - currently ignored because I HAVE NO IDEA what they do, nor how to use them in Merlin. When I find out, you'll be the first to know!!! + + +The QuickASM linker also supports expression evaluation as in the assembler. Algabraic evaluation is done within braces {}. AND you may use ENTry labels within the linker. For example, if an assembly source has an entry label called STORAGE contained within it, you may use STORAGE within the link file as long as it's use follows a "LNK filename" of the file containing the entry. This could be used, for example, as the operand in a linker DS opcode to reserve variable space. + +The linker supports all expression types (binary,hex decimal,label) and all operands (+-<=>/*&.! and // (mod)). The assembler convention of "*" (current program address) is NOT supported within the linker. + + +QuickLINK + +If you are a Merlin user you will no doubt know how useful Merlin QuickLink (OA-6) feature is. But if you ever want to do anything more in your link file besides an ASM, LNK, and a SAV, you have to create a .cmd file and type LINK xyz whenever you want to link the file. With QuickASM, the quicklink function works slightly differently. When QuickLink is chosen (currently ASML from the shell, but the editors will soon support it) the linker searches the current prefix (0) for a file named QUICKLINK.S and if found uses this as the link cmd file. Failing to find the file in the current prefix, the linker searches the system directory (QASYSTEM) for a file of the same name (QUICKLINK.S) and will use that. Normally, the system file will simply be an OVR ALL, ASM filename, LNK filename, and a SAV filename (which will accomplish the same as the Merlin quicklink function). But if you need more flexibility, simply create a cmd file with the commands you need and save it in your work directory as QUICKLINK.S. Whenever you need to do a link, OA-6 (from the editor) or ASML filename (from the shell) will execute this file and link your program with the FULL power of the linker. + +Because the QuickLink function must operate with varying filenames, three variables have been defined for use within these files: + +]1 = the filename of the source program itself (no .S extension) +]2 = the filename that the assembler/compiler used to save the LNK file +]3 = the filename used for the LNK file minus the last 2 characters. + +Whenever the linker encounters these variables in a QuickLink file, it replaces them with the respective filename. Think of them as Link Macros, because the substitution is done exactly like that of assembler macros. + +The standard QuickLink file would therefore look like this: + + OVR ALL ;assemble no matter what + ASM ]1 ;assemble filename passed in command line + LNK ]2 ;link the file created by the assembler + SAV ]3 ;Drop the last 2 chars (usually .L) from + ;the name to save the output file. + +ONLY the "]x" part of the line is substituted so you may use lines like this: + + ASM ]2.L + +which would expand to: + + ASM filename.L + + +About the Editor + +The editor is pretty straightforward, (** and currently the "weak link" of the system **) The command structure is the same as the Merlin full screen editor, with these exceptions: + +-Replace (OA-R) is not completed + +-Goto line number or label (OA-L in Merlin) has been changed to OA-Jump + +-OA-L is now "load" + +-the keypad "Clear" key is used to clear the current buffer as in NEW + +-Undo is not supported. + +- The command box (OA-O) supports PREFIX (PFX), CATALOG, and NEW. + +- BE CAREFUL with the mouse......(** in fact, don't even THINK about touching it unless you can return it to it's original position otherwise you won't be able to leave the editor without rebooting......**) I'll FIX it, don't worry. + +The editor may not seem like the most responsive sports car you've ever +driven, but it is acceptable. Optimization is high on my priority list. I also intend to allow the user to select his command keys and to make find/replace, and moving throughout the document much quicker. (In fact, Shawn has a new editor which should be as fast as ROSE, and much smaller than the current editor to boot!) + +We will also make available a full SHR based text editor that will allow, multiple windows, color text, multiple fonts and point sizes, etc. The ULTIMATE "pretty" source file editor!!! (ie, based on WordWorks) + +Well, those are some "hilites" of the system. I hope you enjoy it, and I really appreciate your help in finalizing everything. As always, suggestions are WELCOME, whatever you would like to see just let either Lane or myself know. + +Questions/Comments/Problems....(want to help write some utilities!!! hint hint!!!) + +Thanks..... +Shawn Quick and Lane Roath + + diff --git a/src/docs/shell.docs b/src/docs/shell.docs new file mode 100644 index 0000000..ee54abc --- /dev/null +++ b/src/docs/shell.docs @@ -0,0 +1,34 @@ + + QuickASM Shell v0.40 + +The QuickASM shell combines + +This version of the + +_________Not Implemented________ + +"Project" has not even + +"Apple" - "Help" provides + +"Document" - "Label/Line #" does + "Margins & Tabs" still uses + +"Tools" - does nothing! + +"GS/OS" - the only + +"Transfer" - "Launch..." allows + (___BUGGY___). The file + +____ Text Mode ____ + +This should all work, + +_____To be done_____ + +"Fix Source" instead of just + +Tabs At this time + +QuickLink we need to diff --git a/src/docs/zak.idea b/src/docs/zak.idea new file mode 100644 index 0000000..a78d722 --- /dev/null +++ b/src/docs/zak.idea @@ -0,0 +1,28 @@ +Item 2405541 90/06/26 21:14 + +From: S.QUICK1 Shawn Quick + +To: BRYAN.ZAK Bryan M. + +cc: L.ROATH Lane Roath + +Sub: QASM help + +Bryan, I thought of +#util and it + +SoftDisk or as shareware + +Not all of these + +The utilities are the + +The QuickASM shell already + +I think the Softdisk + +Get back to me + +Shawn + + diff --git a/src/edit/edit.1.s b/src/edit/edit.1.s new file mode 100644 index 0000000..64a591b --- /dev/null +++ b/src/edit/edit.1.s @@ -0,0 +1,4719 @@ +findword rts +findreplace php + rep $30 + jsr getreplace + plp + rts + +find + php + rep $30 + stz :findpos + lda position + sta :oldpos + lda pos + and #$ff + clc + adc position + bcs :atend + inc + beq :atend + cmp flen + blt :fp +:atend lda #$00 + sta findstr +:fp sta :pos + tay + beq :sta + sep $20 +]l lda [fileptr],y + and #$7f + cmp #$0d + beq :sta0 + dey + bne ]l + bra :sta1 +:sta0 iny +:sta1 rep $30 +:sta sty :linepos + lda linenum + sta :line + lda findstr + and #$ff + bne :find + jsr getfind + jcs :xit + lda findstr + and #$ff + jeq :xit + sep $30 + ldx findstr +]l lda findstr,x + and #$7f + cmp #'a' + blt :lc1 + cmp #'z'+1 + bge :lc1 + and #$5f +:lc1 sta findstr,x + dex + bne ]l + rep $30 + stz :pos + stz :linepos + lda #$01 + sta :line +:find ldy :pos + sep $20 +:f0 ldx #$01 +]f cpy flen + bge :notfound +:f2 lda [fileptr],y + and #$7f + cmp #$0d + beq :no1 + cmp #'a' + blt :f1 + cmp #'z'+1 + bge :f1 + and #$5f +:f1 cmp findstr,x + bne :nexty + inx + iny + txa + cmp findstr + blt ]f + beq ]f + sty :findpos + jmp :done ;found here +:nexty iny + bra :f0 +:no1 iny + sty :linepos +:no rep $30 + sty :pos + inc :line + jmp :find +:notfound rep $30 + stz gotoposition + jsr gotopos + stz findstr + jmp :xit +:done rep $30 + lda :line + sta gotolnum + jsr gotoline + lda :findpos + beq :xit + sec + sbc :linepos + bcc :xit + tax + lda findstr + and #$ff + pha + txa + sec + sbc 1,s + sta 1,s + pla + bcc :xit + and #$ff + sta pos + jsr poscurs +:xit plp + rts +:oldpos ds 2 +:pos ds 2 +:line ds 2 +:linepos ds 2 +:findpos ds 2 + +checkcommands php + rep $30 + lda commandlen + and #$00ff + jeq :sec + sta :len + stz :which + stz :max +:loop rep $20 + ldy :max + lda cstrings,y + and #$ff + jeq :sec + pha + clc + adc :max + sta :max + pla + cmp :len + bne :next + ldx #$00 +:find sep $20 + lda externname,x + and #$7f + cmp #'a' + blt :ok + cmp #'z'+1 + bge :ok + and #$5f +:ok cmp cstrings+1,y + bne :next + inx + iny + cpy :max + blt :find + jmp :found +:next rep $30 + inc :which + inc :max + jmp :loop +:found rep $30 + lda :which + asl + tax + lda croutines,x + sta :jsr+1 +:jsr jsr $ffff + jmp :clc +:sec rep $30 + lda #$00 + plp + sec + rts +:clc plp + clc + rts + +:which ds 2 +:max ds 2 +:len ds 2 + +cstrings str 'PFX' + str 'PREFIX' + str 'CATALOG' + str 'CAT' + str 'NEW' + hex 0000 + str 'DELETE' + +croutines dw setprefix + dw setprefix + dw docatalog + dw docatalog + dw donew + dw delete + + mx %00 +delete tll $2c03 + tll $2c03 + lda #$00 + clc + rts + +donew php + rep $30 + jsr newdoc + jsr drawfname + jsr gotoline + lda #$00 + plp + clc + rts + + mx %00 +docatalog lda instring + and #$ff + sta :len + cmp commandlen + jlt :xit + jeq :current + lda commandlen + and #$ff + tax + inx + ldy #$00 + sep $20 +]flush cpx :len + blt :fl + beq :fl + jmp :current +:fl lda instring,x + inx + and #$7f + cmp #' ' + jlt :current + beq ]flush + + sta :pfx+1 + ldy #$01 +:save +]lup cpy #64 + bge :setit + lda instring,x + and #$7f + cmp #'/' + beq :sta + cmp #'.' + beq :sta + cmp #'0' + blt :setit + cmp #'9'+1 + blt :sta + cmp #'A' + blt :setit + cmp #'Z'+1 + blt :sta + cmp #'a' + blt :setit + cmp #'z'+1 + bge :setit + and #$5f +:sta sta :pfx+1,y + iny + inx + cpx :len + blt ]lup + beq ]lup +:setit sep $20 + tya + sta :pfx + rep $30 + jmp :showcat +:current rep $30 + jsl prodos + dw $0a + adrl :pfxparm + jcs :err + sep $20 + dec :pfx + jmp :showcat +:xit +:err rep $30 + lda #syntaxerr +:err1 jsr doerror + lda #$00 + sec + rts +:nomem rep $30 + lda #outofmem + jmp :err1 + +:showcat rep $30 + stz :openflag + stz :close + stz :handle + stz :handle+2 + jsl prodos + dw $06 + adrl :info + jcs :caterr + lda :type + cmp #$0f + jne :nodir + jsl prodos + dw $10 + adrl :open + jcs :caterr + sec + ror :openflag + lda :open + sta :eof + sta :close + sta :read + jsl prodos + dw $19 + adrl :eof + jcs :caterr + + psl #$00 + psl :eof1 + lda userid + pha + pea $C000 + psl #$00 + tll $0902 + plx + ply + jcs :nomem + stx :handle + stx zpage + sty :handle+2 + sty zpage+2 + lda :eof1 + sta :request + lda :eof1+2 + sta :request+2 + ldy #$02 + lda [zpage] + sta :buffer + lda [zpage],y + sta :buffer+2 + jsl prodos + dw $12 + adrl :read + jcs :caterr + jsl prodos + dw $14 + adrl :close + jcs :caterr + stz :openflag + + jsr erasebox + jsr drawbox1 + + lda :handle + sta dirzp + lda :handle+2 + sta dirzp+2 + ldy #$02 + lda [dirzp] + tax + lda [dirzp],y + sta dirzp+2 + stx dirzp + + do 0 + lda dirzp + clc + adc #$04 + sta dirzp + bcc :adc1 + inc dirzp+2 + fin + +:adc1 ldy #$23 + lda [dirzp],y + and #$00ff + sta :entrylen + iny + lda [dirzp],y + and #$ff + sta :entper + iny + lda [dirzp],y + sta :count + stz :filepos + + +:adc ldy #$04 + lda [dirzp],y + and #$0f + sta :entlen + lda #6 + sta mycv + lda #22-7 + sta mych + jsl textbascalc + pea "/" + tll $180c + ldy #$05 + ldx #$01 +]lup lda [dirzp],y + phy + phx + and #$7f + pha + tll $180c + plx + ply + iny + inx + cpx :entlen + blt ]lup + beq ]lup + + jsl print + dfb 22-7 + dfb 7 + asc "-----name-------typ---aux----len---------date------",00 + + stz :catwhich + jsr :catdraw +:key + do mouse +;jsr initmouse + stz mousecr + stz mousecrchar +:key2 jsr mousekey + bmi :and7f + else +:key2 + fin ;--- mouse --- + + jsl keyscan + bpl :key2 +:and7f and #$7f + cmp #$1b + jeq :showxit + cmp #$0d + jeq :showxit + cmp #$0a + jeq :down + cmp #$0b + bne :key + jmp :up +:showxit jsr erasebox1 + lda #$01 +:catxit pha + lda :handle + ora :handle+2 + beq :nodis + psl :handle + _Disposehandle +:nodis pla + clc + rts + +:nodir rep $30 + lda #notdir +:caterr rep $30 + jsr doerror + bit :openflag + bpl :cat1 + jsl prodos + dw $14 + adrl :close +:cat1 lda #$00 + jmp :catxit + +:up lda :filepos + beq :upxit + dec :filepos + lda #$8000 + sta :catwhich + jsr catscrolldn + jsr :catdraw +:upxit jmp :key +:down lda :filepos + clc + adc #catentries + cmp :count + bge :upxit + inc :filepos + lda #$4000 + sta :catwhich + jsr catscrollup + jsr :catdraw + jmp :key + +:count ds 2 +:entrylen ds 2 +:filepos ds 2 +:entper ds 2 + +:len ds 2 +:handle ds 4 +:openflag ds 2 + +:open dw $00 + adrl :pfx + adrl $00 +:info adrl :pfx + dw $00 +:type dw $00 + adrl $00 + ds 14,0 +:read dw $00 +:buffer adrl $00 +:request adrl $00 +:transfer adrl $00 +:eof dw $00 +:eof1 adrl $00 +:close dw $00 + +:pfxparm dw $00 + adrl :pfx + +:pfx ds 68,0 + +:cdpos ds 2 +:catwhich ds 2 + +:catdraw php + rep $30 + lda #08 + sta mycv + lda :filepos + sta :cdpos + sta :cdcount +:cdloop lda :cdpos + cmp :count + jge :cdxit + lda mycv + cmp #8+catentries + jge :cdxit + lda #22-7 + sta mych + jsl textbascalc + +:pha pha + pha + lda :cdcount + inc + pha + lda :entper + pha + tll $0b0b + pla + sta :blocknum + pla + sta :remain + lda :blocknum + xba + asl ;* $200 + clc + adc #$04 + sta :ypos + + pha + pha + lda :entrylen + pha + lda :remain + pha + tll $090b + pla + plx + clc + adc :ypos + sta :ypos + + ldy :ypos + lda [dirzp],y + and #$f0 + bne :cshow +:inccd inc :cdcount + jmp :pha +:cshow bit :catwhich + bvc :cshow1 + lda mycv + inc + cmp #8+catentries + jlt :inccv +:cshow1 jsr :printent + bit :catwhich + bmi :cdxit +:inccv inc mycv + inc :cdcount + inc :cdpos + jmp :cdloop +:cdxit plp + rts + +:printent php + rep $30 + ldy :ypos + lda [dirzp],y + and #$0f + beq :inccd + sta :entlen + iny + ldx #$01 +]lup lda [dirzp],y + and #$7f + ora #$80 + phx + phy + pha + tll $180c + ply + plx + inx + iny + cpx :entlen + blt ]lup + beq ]lup +]lup cpx #$11 + bge :dtype + lda #$a0 + phx + pha + tll $180c + plx + inx + jmp ]lup +:dtype lda :ypos + clc + adc #$10 + tay + lda [dirzp],y + and #$ff + pha + asl + clc + adc 1,s + plx + tax + lda filetypelist,x + phx + pha + tll $180c + plx + inx + lda filetypelist,x + phx + pha + tll $180c + plx + inx + lda filetypelist,x + pha + tll $180c + + pea $a0 + tll $180c + pea $a0 + tll $180c +:daux pea #"$" + tll $180c + lda :ypos + clc + adc #$1f + tay + lda [dirzp],y + jsr :prbytel + + pea $a0 + tll $180c + pea $a0 + tll $180c +:dlen pea #"$" + tll $180c + lda :ypos + clc + adc #$15 + tay + lda [dirzp],y + jsr :prbytel + pea $a0 + tll $180c + pea $a0 + tll $180c + + lda :ypos + clc + adc #$21 + tay + lda [dirzp],y + sta :year + iny + iny + lda [dirzp],y + sta :time + + lda :year + and #%11111 + sta :decimal + cmp #$0a + bge :d1 + pea #" " + tll $180c +:d1 psl #:decimal + pea $0000 + jsl printdec + pea #"-" + tll $180c + + lda :year + lsr + lsr + lsr + lsr + lsr + and #%1111 + dec + asl + asl + tax + + lda ftmonths,x + phx + pha + tll $180c + plx + inx + lda ftmonths,x + phx + pha + tll $180c + plx + inx + lda ftmonths,x + pha + tll $180c + pea #"-" + tll $180c + + lda :year + xba + lsr + and #%1111111 + sta :decimal + cmp #$0a + bge :d2 + pea #"0" + tll $180c +:d2 psl #:decimal + pea $0000 + jsl printdec + pea #" " + tll $180c + pea #" " + tll $180c + + lda :time + xba + and #%11111 + sta :decimal + cmp #$0a + bge :d3 + pea #" " + tll $180c +:d3 psl #:decimal + pea $0000 + jsl printdec + pea #":" + tll $180c + + lda :time + and #%111111 + sta :decimal + cmp #$0a + bge :d4 + pea #"0" + tll $180c +:d4 psl #:decimal + pea $0000 + jsl printdec + + plp + rts + + +:cdcount ds 2 +:ypos ds 2 +:entlen ds 2 +:blocknum ds 2 +:remain ds 2 +:decimal ds 2 +:year ds 2 +:time ds 2 + +:prbytel php + rep $30 + sta :byte + xba + jsr :prbyte + lda :byte + jsr :prbyte + plp + rts +:byte ds 2 + +:prbyte php + rep $30 + pha + lsr + lsr + lsr + lsr + and #$0F + jsr :nib + pla + and #$F + jsr :nib + plp + rts +:nib ora #"0" + cmp #"9"+1 + blt :ok + adc #"A"-"9"-2 +:ok and #$7F + pha + tll $180c + rts + + +catscrollup + ;fast scroll routine + phy + php + phb + rep $30 + ldy #32 ;get ready for each column +:start pea $0101 + plb + plb + lda $4a8,y + sta $428,y + lda $528,Y + sta $4A8,Y + lda $5A8,Y + sta $528,Y + lda $628,Y + sta $5A8,Y + lda $6A8,Y + sta $628,Y + lda $728,Y + sta $6A8,Y + lda $7A8,Y + sta $728,Y + lda $450,Y + sta $7A8,Y + +* php +* sep $20 +* lda #$A0 ;last line gets cleared +* xba +* lda #$A0 +* plp +* sta $450,Y + pea $0000 + plb + plb +* rep $30 +:lda2 + lda $4a8,y + sta $428,y + lda $528,Y + sta $4A8,Y + lda $5A8,Y + sta $528,Y + lda $628,Y + sta $5A8,Y + lda $6A8,Y + sta $628,Y + lda $728,Y + sta $6A8,Y + lda $7A8,Y + sta $728,Y + lda $450,Y + sta $7A8,Y + +* php +* sep $20 +* lda #$A0 ;last line gets cleared +* xba +* lda #$A0 +* plp +* sta $450,Y + dey ;decrement index + dey + cpy #6 + blt :exit ;if not done with screen.. + brl :start ;continue +:exit plb + plp ;restore flags + ply + rts ;and return + +catscrolldn + phy + php + phb + rep $30 + ldy #32 ;get ready for each column +:start pea $0101 + plb + plb + lda $7A8,Y + sta $450,Y + lda $728,Y + sta $7A8,Y + lda $6A8,Y + sta $728,Y + lda $628,Y + sta $6A8,Y + lda $5A8,Y + sta $628,Y + lda $528,Y + sta $5A8,Y + lda $4A8,Y + sta $528,Y + lda $428,Y + sta $4A8,Y +** lda $780,Y +* sta $428,Y + +* php +* sep $20 +* lda #$A0 ;last line gets cleared +* xba +* lda #$A0 +* plp +* sta $780,Y + + pea $0000 + plb + plb +* rep $30 +:lda2 + lda $7A8,Y + sta $450,Y + lda $728,Y + sta $7A8,Y + lda $6A8,Y + sta $728,Y + lda $628,Y + sta $6A8,Y + lda $5A8,Y + sta $628,Y + lda $528,Y + sta $5A8,Y + lda $4A8,Y + sta $528,Y + lda $428,Y + sta $4A8,Y +* lda $780,Y +* sta $428,Y + +* php +* sep $20 +* lda #$A0 ;last line gets cleared +* xba +* lda #$A0 +* plp +* sta $780,Y + dey ;decrement index + dey + cpy #6 + blt :exit ;if not done with screen.. + jmp :start ;continue +:exit plb + plp ;restore flags + ply + rts ;and return + + +catscrollup1 + ;fast scroll routine + phy + php + phb + rep $30 + ldy #20 ;get ready for each column +:start pea $0101 + plb + plb + lda $4a8,y + sta $428,y + lda $528,Y + sta $4A8,Y + lda $5A8,Y + sta $528,Y + lda $628,Y + sta $5A8,Y + lda $6A8,Y + sta $628,Y + lda $728,Y + sta $6A8,Y + lda $7A8,Y + sta $728,Y + lda $450,Y + sta $7A8,Y + +* php +* sep $20 +* lda #$A0 ;last line gets cleared +* xba +* lda #$A0 +* plp +* sta $450,Y + pea $0000 + plb + plb +:lda2 + lda $4a8,y + sta $428,y + lda $528,Y + sta $4A8,Y + lda $5A8,Y + sta $528,Y + lda $628,Y + sta $5A8,Y + lda $6A8,Y + sta $628,Y + lda $728,Y + sta $6A8,Y + lda $7A8,Y + sta $728,Y + lda $450,Y + sta $7A8,Y + +* php +* sep $20 +* lda #$A0 ;last line gets cleared +* xba +* lda #$A0 +* plp +* sta $450,Y + dey ;decrement index + dey + cpy #6 + blt :exit ;if not done with screen.. + jmp :start ;continue +:exit plb + plp ;restore flags + ply + rts ;and return + +catscrolldn1 + phy + php + phb + rep $30 + ldy #20 ;get ready for each column +:start pea $0101 + plb + plb + lda $7A8,Y + sta $450,Y + lda $728,Y + sta $7A8,Y + lda $6A8,Y + sta $728,Y + lda $628,Y + sta $6A8,Y + lda $5A8,Y + sta $628,Y + lda $528,Y + sta $5A8,Y + lda $4A8,Y + sta $528,Y + lda $428,Y + sta $4A8,Y +** lda $780,Y +* sta $428,Y + +* php +* sep $20 +* lda #$A0 ;last line gets cleared +* xba +* lda #$A0 +* plp +* sta $780,Y + + pea $0000 + plb + plb +:lda2 + lda $7A8,Y + sta $450,Y + lda $728,Y + sta $7A8,Y + lda $6A8,Y + sta $728,Y + lda $628,Y + sta $6A8,Y + lda $5A8,Y + sta $628,Y + lda $528,Y + sta $5A8,Y + lda $4A8,Y + sta $528,Y + lda $428,Y + sta $4A8,Y +* lda $780,Y +* sta $428,Y + +* php +* sep $20 +* lda #$A0 ;last line gets cleared +* xba +* lda #$A0 +* plp +* sta $780,Y + dey ;decrement index + dey + cpy #6 + blt :exit ;if not done with screen.. + jmp :start ;continue +:exit plb + plp ;restore flags + ply + rts ;and return + + + + + mx %00 +setprefix lda instring + and #$ff + sta :len + cmp commandlen + jlt :xit + jeq :xit + lda commandlen + and #$ff + tax + inx + ldy #$00 + sep $20 +]flush cpx :len + blt :fl + beq :fl + jmp :err +:fl lda instring,x + inx + and #$7f + cmp #' ' + jlt :xit + beq ]flush + + sta :pfx+1 + ldy #$01 +:save +]lup cpy #64 + bge :setit + lda instring,x + and #$7f + cmp #'/' + beq :sta + cmp #'.' + beq :sta + cmp #'0' + blt :setit + cmp #'9'+1 + blt :sta + cmp #'A' + blt :setit + cmp #'Z'+1 + blt :sta + cmp #'a' + blt :setit + cmp #'z'+1 + bge :setit + and #$5f +:sta sta :pfx+1,y + iny + inx + cpx :len + blt ]lup + beq ]lup +:setit sep $20 + tya + sta :pfx + rep $30 + + jsl prodos + dw $09 + adrl :pfxparm + jcs :err1 + jsl prodos + dw $0a + adrl mypfxparm + lda #$00 + clc + rts +:xit +:err rep $30 + lda #syntaxerr + jsr doerror + lda #$00 + sec + rts + +:err1 pha + jsl prodos + dw $09 + adrl mypfxparm + pla + jmp :err + +:len ds 2 + +:pfxparm dw $00 + adrl :pfx + +:pfx ds 68,0 + +runcommand php + plp + sec + rts + rep $30 + stz extdplen ;zero out all variables + stz extdpadd + stz extuserid + stz extadd + stz extadd+2 + stz dpsave + stz stacksave + stz extdphdl + stz extdphdl+2 + stz extrunflag + + jsl prodos + dw $06 ;file info + adrl :infoparm + bcc :chktype + jmp :xit + +:chktype lda :type + cmp #$b5 ;EXE file? + jne :xit + + do 0 + pha + pea $5000 + tll $2003 + pla + fin + + pha + pha + pha + pha + pha + pea $0000 + + psl #externpath + pea $FFFF + + tll $0911 ;InitialLoad..load the file +* brk $02 + + tll $2C03 + sec + ror equitflag + jmp :remove + + bcs :remove ;error loading?? + pla + sta extuserid ;Save new userid + pla + sta :extjsl+1 ;save Init address + sta extadd ;save it again + pla + sep $20 + sta :extjsl+3 ;do the high byte + sta extadd+2 + rep $20 + pla + sta extdpadd ;Get DP address + pla + sta extdplen ;Get length of DP + jmp :ok ;go run it... + +:remove nop ;brk $02 +:remove1 tsc ;remove bad parameters from stack + clc + adc #10 + tcs + jml :norun ;fall through and don't run it! + +:ok lda extdplen ;Was DP assigned? + bne :setup ;Yes...so just setup our stuff + psl #$00 ;We need to get some DP for Script + psl #1024 ;$400 bytes + lda extuserid ;Use it's UserID + pha + pea $c015 ;DP attributes + psl #$00 ;must be bank $00 + tll $0902 ;NewHandle + pla ;get the low handle + plx ;high handle + jcs :norun ;Error? + sta zpage ;dereference it + sta extdphdl ;and also save handle for Shutdown + stx zpage+2 ;do the High word + stx extdphdl+2 + lda [zpage] + sta extdpadd ;we just need the low word b'cuz it's bank $00 + lda #1024 ;tell setup that we got $400 bytes + sta extdplen +:setup lda extadd + ora extadd+2 + jeq :norun + lda extadd + sta zpage + lda extadd+2 + sta zpage+2 + ldx #$00 + ldy #24 ;offset to ID word + lda [zpage],y + cmp #$01 ;QuickEdit ID? + jne :norun + iny + iny + sep $20 +]lup lda [zpage],y + cmp asciiid,x + bne :norun + iny + inx + cpx #$05 ;"QUICK" + blt ]lup + rep $20 + tll $2c03 +:setup1 phd + pla + sta dpsave ;save our current DP + tsc ;Save our current stack + sta stacksave + php ;save the interupt status + sei ;turn of interupts so no problems + do 0 + ldal $e100a8 ;replace P16 vectors + sta p16vec + ldal $e100a8+2 + sta p16vec+2 + ldal $e100b0 + sta p16vec1 + ldal $e100b0+2 + sta p16vec1+2 + lda p16jmp + stal $e100a8 + lda p16jmp+2 + stal $e100a8+2 + lda p16jmp1 + stal $e100b0 + lda p16jmp1+2 + stal $e100b0+2 + fin + plp ;restore interupts + + sec + ror extrunflag ;set high bit + lda extdpadd ;set DP to Script DP + pha + pld + clc ;add in the length to set up stack + adc extdplen + tcs ;put it in stack + lda extuserid ;A=Scripts UserID +* ldx #hsvectors ;X=Low word of vectortbl address +* ldy #^hsvectors ;Y=High word of vectortbl address + jmp :extjsl ;go call the script init routine + +:norun rep $30 + phd ;if we get here...there was some error + pla ;save some stuff needed below + sta dpsave + tsc + sta stacksave + jmp :restore ;and fall through to the RESTORE routine + +:extjsl jsl $FFFFFF ;this gets modified above..to call script + +:restore clc ;OK make sure everything is kosher + xce + phk + plb + rep $30 + lda stacksave ;restore "our" stack + tcs + lda dpsave ;restore "our" DP + pha + pld + + bit extrunflag ;did we run the utility? + bpl :xit ;minus=yes + + php ;save the interupt status + sei ;turn of interupts so no problems + do 0 + lda p16vec + stal $e100a8 ;replace P16 vectors + lda p16vec+2 + stal $e100a8+2 + lda p16vec1 + stal $e100b0 + lda p16vec1+2 + stal $e100b0+2 + fin + plp ;restore interupts +:xit jsr unloadext ;and continue!!! + plp + rts + +:infoparm adrl externpath + dw $00 +:type dw $00 + ds 20,0 + +:busy ds 2,0 + +p16jmp jml p16quit +p16jmp1 jml p16quit1 + +p16qhandle + clc ;OK make sure everything is kosher + xce + phk + plb + rep $30 + lda stacksave ;restore "our" stack + tcs + lda dpsave ;restore "our" DP + pha + pld + + bit extrunflag ;did we run the utility? + bpl :xit ;minus=yes + + php ;save the interupt status + sei ;turn of interupts so no problems + do 0 + lda p16vec + stal $e100a8 ;replace P16 vectors + lda p16vec+2 + stal $e100a8+2 + lda p16vec1 + stal $e100b0 + lda p16vec1+2 + stal $e100b0+2 + fin + plp ;restore interupts + +:xit jsr unloadext + plp + rts + +p16quit phb ;save the environment + phk + plb + sty p16y ;save the Y reg + php + sep $20 + lda $05,s ;get bank of call + pha + plb ;set to current bank + ldy #$01 + lda ($03,s),y ;read the command num of p16 call + cmp #$29 ;is it QUIT? + beq p16qhandle ;yes, so shutdown/restore everything + plp ;if not restore what we changed + phk + plb + ldy p16y ;restore the Y + plb ;and the bank +p16vec jml $FFFFFF ;jump to P16 entry vector +p16y ds 2 + +p16quit1 phb ;save the current bank + phk + plb ;set to our bank + php ;save the processor + sep $20 + lda $06,s ;get command num from stack + cmp #$29 ;quit? + beq p16qhandle ;yes so restore/shutdown external + plp ;restore what we changed and call + plb ;old P16 vector +p16vec1 jml $FFFFFF + +unloadext rts + php + rep $30 + + lda extuserid ;check for valid UserID + beq :handle ;Script doesn't exist!=> + + pea $00 ;Free Script memory + lda extuserid + pha + pea $00 + tll $1211 ;User ShutDown + pla ;Don't know the meaning of this! + +* lda extuserid +* pha +* tll $2103 ;delete id + +:handle lda extdphdl ;Check for valid DP handle + ora extdphdl+2 + beq :xit ;if = then no DP was allocated by us. + psl extdphdl + _Disposehandle ;Kill the handle +:xit stz extuserid + stz extdphdl + stz extdphdl+2 + stz extrunflag + plp + rts ;and Return + +asciiid asc 'QUICK' + +extdpadd ds 2,0 ;Script DP address +extdplen ds 2,0 ;Script DP length +extuserid ds 2,0 ;Script UserID +extdphdl ds 4,0 ;Script DP Handle +extadd ds 4,0 ;Script Init Address +extrunflag ds 2,0 ;flag indicating "running" application + +externdflt dw externname-extpath +externpath dfb externname-extpath +extpath asc '/PROFILE/' ;Name of the script file. +externname ds 64,0 +commandlen ds 2 + + + +drawbox php + rep $30 + lda termcv + sta :cv + lda termch + sta :ch + lda #$05 + sta termcv + lda #40 + sta termch + jsl setch + sep $20 + ldx #$0000 +:main ldy #40 +:loop phy + phx + jsl pickchar + plx + ply + sta boxbuff,x + cpy #40 + beq :left + cpy #40+36 + beq :right + lda termcv + cmp #$05 + beq :top + cmp #$05+6 + beq :bottom + lda #" " + jmp :next +:left lda #$DA-$80 + jmp :next +:right lda #$DF-$80 + jmp :next +:top lda #$CC-$80 + jmp :next +:bottom lda #"_" +:next phx + phy + jsl storchar + ply + plx + inx + iny + cpy #40+36 + blt :loop + beq :loop + lda termcv + inc + cmp #5+7 + bge :done + sta termcv + phx + jsl setch + plx + jmp :main +:done rep $30 + lda :cv + sta termcv + lda :ch + sta termch + jsl setch + plp + rts +:ch ds 2 +:cv ds 2 + +erasebox php + rep $30 + lda termcv + sta :cv + lda termch + sta :ch + lda #$05 + sta termcv + lda #40 + sta termch + jsl setch + sep $20 + ldx #$0000 +:main ldy #40 +:loop lda boxbuff,x +:next phx + phy + jsl storchar + ply + plx + inx + iny + cpy #40+36 + blt :loop + beq :loop + lda termcv + inc + cmp #5+7 + bge :done + sta termcv + phx + jsl setch + plx + jmp :main +:done rep $30 + lda :cv + sta termcv + lda :ch + sta termch + jsl setch + plp + rts +:ch ds 2 +:cv ds 2 + + +]top equ 5 +]bottom equ 17 +]left equ 10 +]right equ 70 + +drawbox1 php + rep $30 + lda termcv + sta :cv + lda termch + sta :ch + lda #]top + sta termcv + lda #]left + sta termch + jsl setch + sep $20 + ldx #$0000 +:main ldy #]left +:loop phy + phx + jsl pickchar + plx + ply + sta boxbuff,x + cpy #]left + beq :left + cpy #]right + beq :right + lda termcv + cmp #]top + beq :top + cmp #]bottom + beq :bottom + lda #" " + jmp :next +:left lda #$DA-$80 + jmp :next +:right lda #$DF-$80 + jmp :next +:top lda #$CC-$80 + jmp :next +:bottom lda #"_" +:next phx + phy + jsl storchar + ply + plx + inx + iny + cpy #]right + blt :loop + beq :loop + lda termcv + inc + cmp #]bottom+1 + bge :done + sta termcv + phx + jsl setch + plx + jmp :main +:done rep $30 + lda :cv + sta termcv + lda :ch + sta termch + jsl setch + plp + rts +:ch ds 2 +:cv ds 2 + +drawbox1a php + rep $30 + lda termcv + sta :cv + lda termch + sta :ch + lda #]top + sta termcv + lda #]left + sta termch + jsl setch + sep $20 + ldx #$0000 +:main ldy #]left +:loop cpy #]left + beq :left + cpy #]right + beq :right + lda termcv + cmp #]top + beq :top + cmp #]bottom + beq :bottom + lda #" " + jmp :next +:left lda #$DA-$80 + jmp :next +:right lda #$DF-$80 + jmp :next +:top lda #$CC-$80 + jmp :next +:bottom lda #"_" +:next phx + phy + jsl storchar + ply + plx + inx + iny + cpy #]right + blt :loop + beq :loop + lda termcv + inc + cmp #]bottom+1 + bge :done + sta termcv + phx + jsl setch + plx + jmp :main +:done rep $30 + lda :cv + sta termcv + lda :ch + sta termch + jsl setch + plp + rts +:ch ds 2 +:cv ds 2 + + + +erasebox1 php + rep $30 + lda termcv + sta :cv + lda termch + sta :ch + lda #]top + sta termcv + lda #]left + sta termch + jsl setch + sep $20 + ldx #$0000 +:main ldy #]left +:loop lda boxbuff,x +:next phx + phy + jsl storchar + ply + plx + inx + iny + cpy #]right + blt :loop + beq :loop + lda termcv + inc + cmp #]bottom+1 + bge :done + sta termcv + phx + jsl setch + plx + jmp :main +:done rep $30 + lda :cv + sta termcv + lda :ch + sta termch + jsl setch + plp + rts +:ch ds 2 +:cv ds 2 + + +]top equ 7 +]bottom equ 17 +]left equ 10+3 +]right equ 34+1 + +drawbox2 php + rep $30 + lda termcv + sta :cv + lda termch + sta :ch + lda #]top + sta termcv + lda #]left + sta termch + jsl setch + sep $20 + ldx #$0000 +:main ldy #]left +:loop lda termcv + cmp #]top + beq :top + cmp #]bottom + beq :bottom +:loop2 cpy #]left + beq :left + cpy #]right + beq :right +:spc lda #" " + jmp :next +:left lda #$DA-$80 + jmp :next +:right lda #$DF-$80 + jmp :next +:top cpy #]right + beq :spc + cpy #]left + beq :spc + lda #"_" ;#$CC-$80 + jmp :next +:bottom cpy #]right + beq :ul + cpy #]left + beq :ul + lda #$dc-$80 ;#"_" + jmp :next +:ul lda #"_" +:next phx + phy + jsl storchar + ply + plx + inx + iny + cpy #]right + blt :loop + beq :loop + lda termcv + inc + cmp #]bottom+1 + bge :done + sta termcv + phx + jsl setch + plx + jmp :main +:done rep $30 + lda :cv + sta termcv + lda :ch + sta termch + jsl setch + plp + rts +:ch ds 2 +:cv ds 2 + + +insertcr rep $30 ;NOT a subroutine + lda flen + cmp #$ffff + bge :cmdxit + sep $20 + ldy pos + lda #$8d + sta linebuff+1,y + lda pos + sta oldlen + inc + sta linebuff + rep $30 + lda #$ffff + sta dirty + jsr savebuff + rep $30 + jsr updatescreen + + lda termcv + inc + cmp #22 + blt :dok + jsl scroll + lda #21 +:dok sta termcv + jsl setch + jsr foreptr + jsr getbuff + jsr drawline + stz pos + stz pos1 + jsr poscurs + rep $30 + inc linenum + jsr drawcpos + +:cmdxit plp + clc + rts + + do 0 + jsr drawcpos + jsr getbuff + jsr drawline + stz pos + stz pos1 + inc linenum + jsr poscurs + jsr setfflags + fin + +loadfile rep $30 ;NOT a subroutine!!!! + stz getname + stz :flag + + jsr getfname + lda getname + and #$ff + beq :all + cmp #$ff + jeq :cmdxit + + sec + ror :flag + tax + sep $20 +:m1 lda getname,x + sta efilename,x + dex + bpl :m1 + rep $20 + jmp :l + +:all lda alldirty + beq :l + +:l stz :openflag + stz :merlin + stz :toolarge + stz :loaded + + lda linenum + sta gotolnum + +:sep sep $30 + ldx efilename +]lup lda efilename,x + and #$7f + cmp #'a' + blt :uc1 + cmp #'z'+1 + bge :uc1 + and #$5f +:uc1 sta :filename,x + sta loadfilename,x + dex + bpl ]lup + rep $30 + + jsr drawbox + bit :flag + jmi :rep + jsr drawesccan + jsl print + dfb 44 + dfb 7 + asc "Load which file:",00 + jsl getline + adrl :filename + dfb 15 + dfb 44 + dfb 10 + php + jsr drawesc + plp + jcs :sfplp +:rep rep $30 + lda :filename + and #$00FF + jeq :sfplp + jsl print + dfb 44 + dfb 7 + asc "Loading... ",00 + stz :openflag + lda :filename + and #$ff + cmp #3 + blt :ginfo + tax + lda :filename,x + and #$7f + cmp #'S' + beq :gdex + cmp #'s' + bne :ginfo +:gdex dex + lda :filename,x + and #$7f + cmp #'.' + bne :ginfo + sec + ror :merlin +:ginfo jsl prodos + dw $06 + adrl :info + bcc :gtype + jmp :err + + do 0 + cmp #$46 + jne :err +:chk bit :merlin + jmi :err + sec + ror :merlin + sta :errcode + lda :filename + and #$00ff + cmp #14 + blt :chkmerlin +:ec lda :errcode + jmp :err +:chkmerlin lda :filename + and #$00ff + tax + lda :filename,x + and #$7f + cmp #'/' + bne :cm + sep $20 + dec :filename + rep $30 + jmp :ginfo +:cm lda :filename + and #$ff + inc + tax + sep $20 + lda #'.' + sta :filename,x + inx + lda #'S' + sta :filename,x + txa + sta :filename + rep $20 + jmp :ginfo + fin + +:gtype lda :type + cmp #$04 ;text + beq :doopen + cmp #$b0 ;SRC + beq :srcb0 + cmp #$1a + beq :apw + jmp :nottxt +:srcb0 stz :merlin + jmp :doopen + +:nottxt lda #nottext + jmp :err + +:apw jmp loadapw + +:doopen jsl prodos + dw $10 + adrl :open + jcs :err + sec + ror :openflag + lda :open + sta :read + sta :close + sta :eof + jsl prodos + dw $19 ;get eof + adrl :eof + lda :eof+2 + sta :request + cmp #$ffff + beq :too + lda :eof+4 + beq :z +:too sec + ror :toolarge + lda #$fffe + sta :request +:z + stz :request+2 + + lda fileptr + sta :where + lda fileptr+2 + sta :where+2 + + jsr newdoc1 ;everything is wasted here.... + + jsl prodos + dw $12 + adrl :read + jcs :err + + jsl prodos + dw $14 + adrl :close + stz :openflag + + lda :request+4 + sta flen + sta editlen + + stz gotolnum + sec + ror :loaded + +:sfplp rep $30 + bit :openflag + bpl :set + jsl prodos + dw $14 + adrl :close + stz :openflag + +:set bit :loaded + bpl :bit + + bit :merlin + bpl :zero + sep $20 +:tabson ldx #$07 +]lup lda tabs1,x + sta tabs,x + dex + bpl ]lup + +:zero sep $30 + ldx :filename +]lup lda :filename,x + and #$7f + cmp #'a' + blt :uc + cmp #'z'+1 + bge :uc + and #$5f +:uc sta efilename,x + dex + bpl ]lup + rep $30 + +:bit bit :toolarge + bpl :sfplp1 + jmp :toolarge1 +:sfplp1 jsr erasebox + jsr gotoline + jsr drawmem + jsr drawtabs + jsr drawfname +:cmdxit plp + clc + rts +:err rep $30 + jsr doerror + stz :toolarge + jmp :sfplp + +:toolarge1 lda #toobigerr + jmp :err + +:merlin ds 2 +:errcode ds 2 +:toolarge ds 2 +:loaded ds 2 +:openflag ds 2 +:flag ds 2 +:close ds 2 +:open ds 2 + adrl :filename + adrl $0000 +:read ds 2 +:where adrl $00 +:request adrl $00 + adrl $00 +:info adrl :filename + ds 2 +:type ds 2 +:aux ds 4 + ds 16 +:eof ds 6 + +:filename ds 20 + + +checkload php + rep $30 + stz :flag + psl #tempbuff + pea 128 + _QAGetCmdLine + ldx #tempbuff + ldy #^tempbuff + jsr parsepath + bcc :load + plp + sec + rts +:load + sec + ror :flag + lda filename + and #$ff + tax + sep $20 +:m1 lda filename,x + sta efilename,x + dex + bpl :m1 + rep $20 + jmp :l + +:all lda alldirty + beq :l + +:l stz :openflag + stz :merlin + stz :toolarge + stz :loaded + + lda linenum + sta gotolnum + +:sep sep $30 + ldx efilename +]lup lda efilename,x + and #$7f + cmp #'a' + blt :uc1 + cmp #'z'+1 + bge :uc1 + and #$5f +:uc1 sta filename,x + sta loadfilename,x + dex + bpl ]lup + stz efilename + stz loadfilename + + rep $30 + lda filename + and #$00FF + jeq :sfplp + stz :openflag + sep $30 + ldx filename + lda filename,x + and #$7f + cmp #'/' + beq :nosufx + cpx #63 + bge :nosufx + inx + lda #'.' + sta filename,x + inx + lda #'S' + sta filename,x + stx filename + rep $30 + sec + ror :merlin +:nosufx rep $30 +:ginfo jsl prodos + dw $06 + adrl :info + bcc :gtype + jmp :err + +:gtype lda :type + cmp #$04 ;text + beq :doopen + cmp #$b0 ;SRC + beq :srcb0 +* cmp #$1a +* beq :apw + jmp :nottxt +:srcb0 stz :merlin + jmp :doopen + +:nottxt lda #nottext + jmp :err + +:apw jmp loadapw + +:doopen jsl prodos + dw $10 + adrl :open + jcs :err + sec + ror :openflag + lda :open + sta :read + sta :close + sta :eof + jsl prodos + dw $19 ;get eof + adrl :eof + lda :eof+2 + sta :request + cmp #$ffff + beq :too + lda :eof+4 + beq :z +:too sec + ror :toolarge + lda #$fffe + sta :request +:z + stz :request+2 + + lda fileptr + sta :where + lda fileptr+2 + sta :where+2 + + jsr newdoc1 ;everything is wasted here.... + + jsl prodos + dw $12 + adrl :read + jcs :err + + jsl prodos + dw $14 + adrl :close + stz :openflag + + lda :request+4 + sta flen + sta editlen + + stz gotolnum + sec + ror :loaded + +:sfplp rep $30 + bit :openflag + bpl :set + jsl prodos + dw $14 + adrl :close + stz :openflag + +:set bit :loaded + bpl :bit + + bit :merlin + bpl :zero + sep $20 +:tabson ldx #$07 +]lup lda tabs1,x + sta tabs,x + dex + bpl ]lup + +:zero sep $30 + ldx filename +]lup lda filename,x + and #$7f + cmp #'a' + blt :uc + cmp #'z'+1 + bge :uc + and #$5f +:uc sta efilename,x + dex + bpl ]lup + rep $30 + +:bit bit :toolarge + bpl :sfplp1 + jmp :toolarge1 +:sfplp1 jsr gotoline + jsr drawmem + jsr drawtabs + jsr drawfname +:cmdxit plp + clc + rts +:err rep $30 + pha + jsr drawbox + pla + jsr doerror + jsr erasebox + stz :toolarge + jmp :sfplp + +:toolarge1 lda #toobigerr + jmp :err + +:merlin ds 2 +:errcode ds 2 +:toolarge ds 2 +:loaded ds 2 +:openflag ds 2 +:flag ds 2 +:close ds 2 +:open ds 2 + adrl filename + adrl $0000 +:read ds 2 +:where adrl $00 +:request adrl $00 + adrl $00 +:info adrl filename + ds 2 +:type ds 2 +:aux ds 4 + ds 16 +:eof ds 6 + +filename ds 130,0 +tempbuff ds 256,0 + +ptr = 0 + +parsepath php + rep $30 +:get stx ptr + sty ptr+2 + stz filename +:go ldy #1 + sep $20 + lda [ptr] + beq :nopath +]lup lda [ptr],y + and #$7F + cmp #' ' + blt :nopath + bne :l1 + iny + jmp ]lup +:l1 iny + lda [ptr],y + and #$7F + cmp #' ' + blt :nopath + bne :l1 +:l2 iny + lda [ptr],y + and #$7F + cmp #' ' + blt :nopath + beq :l2 + cmp #';' + beq :nopath + rep $30 + dey + jsr :getword ;look for pathname or save + bcc :nopath + lda #$0000 + jmp :error +:nopath rep $30 + lda #$46 +* _getprefix :pfx +:error plp + cmp :one + rts +:pfx dw $00 + adrl filename + +:getword php + sep $30 + ldx #0 ;no chars yet! + stx filename +]loop + iny + lda [ptr],y ;get pathname till eol or delimiter found + and #$7F + clc + beq :done ; 0 = end of line! + cmp #'.' + blt :done + inx ;part of path, count & store it + cpx #65 + bge :done ;let's not let the bad boys in! + cmp #'a' + blt :sta + cmp #'z'+1 + bge :sta + and #$5F +:sta sta filename,x ;update pathname & it's length + stx filename + bra ]loop +:done lda filename + plp + cmp :one + rts +:one dw $01 + + + +showhelp rep $30 + + plp + clc + rts + + lda termch + pha + lda termcv + pha + jsr drawbox1 + jsl print + dfb 18 + dfb 8 + asc "No Help available. ",00 + lda #20 + sta mych + lda #7 + sta mycv + jsl textbascalc + +:pkey jsl keyscan + bpl :pkey + jsr erasebox1 + pla + sta termcv + pla + sta termch + jsl setch + plp + clc + rts + +]left equ 20 + +exitquestion + php + rep $30 + jsr drawbox + jsr drawesccan1 + jsl print + dfb 47 + dfb 7 + asc "Release buffer memory?",00 + sep $30 + jsr yesno + dfb 51+3 + dfb 9 + rep $30 + and #$00ff + pha + php + jsr erasebox + jsr drawesc + plp + pla + bcs :sec + cmp #$01 + blt :clc + lda #$ffff + sta superquit +:clc plp + clc + rts +:sec plp + sec + rts + +aboutsd + do softdisk + php + rep $30 +* jsr erasebox1 + jsr drawbox1a + + jsl print + dfb ]left + dfb 12-6 + asc "Another fine program from:",00 + jsl print + dfb ]left + dfb 14-6 + asc " SoftDisk Publishing, Inc.",00 + jsl print + dfb ]left + dfb 15-6 + asc " 606 Common Street",00 + + jsl print + dfb ]left + dfb 16-6 + asc " Shreveport, LA 71101"00 + + + + jsl print + dfb ]left-4 + dfb 18-6 + asc "For more information on SoftDisk, or to subscribe",00 + jsl print + dfb ]left-4 + dfb 19-6 + asc " to our monthly disk magazine that contains more",00 + jsl print + dfb ]left-4 + dfb 20-6 + asc " GREAT programs like this one....call us at:",00 + + jsl print + dfb ]left-4 + dfb 22-6 + asc " 1-800-831-2694",00 + + plp + rts + else + rts + fin + + +getfname + rep $30 + lda termch + sta :tch + lda termcv + sta :tcv + stz :iflag + stz :handle + stz :handle+2 +:current rep $30 + stz :count + stz :errflag + stz getname + jsl prodos + dw $0a + adrl :pfxparm + sep $20 + dec :pfx + +:showcat rep $30 + stz :openflag + stz :close + stz :handle + stz :handle+2 + jsl prodos + dw $06 + adrl :info + jcs :caterr + lda :type + cmp #$0f + jne :nodir + jsl prodos + dw $10 + adrl :open + jcs :caterr + sec + ror :openflag + lda :open + sta :eof + sta :close + sta :read + jsl prodos + dw $19 + adrl :eof + jcs :caterr + + psl #$00 + psl :eof1 + lda userid + pha + pea $C000 + psl #$00 + tll $0902 + plx + ply + jcs :nomem + stx :handle + stx zpage + sty :handle+2 + sty zpage+2 + lda :eof1 + sta :request + lda :eof1+2 + sta :request+2 + ldy #$02 + lda [zpage] + sta :buffer + lda [zpage],y + sta :buffer+2 + jsl prodos + dw $12 + adrl :read + jcs :caterr + jsl prodos + dw $14 + adrl :close + jcs :caterr + stz :openflag + jmp :bx +:caterr rep $30 + + bit :openflag + bpl :nodir + jsl prodos + dw $14 + adrl :close + stz :openflag + jcs :caterr +:nodir +:nomem sec + ror :errflag + +:bx rep $30 + bit :iflag + jmi :h + jsr drawbox1 + jsr drawbox2 + lda #$07 + ldx #50-4 + ldy #$00 + jsr drawbutton + lda #$07+2 + ldx #50-4 + ldy #$8000 + jsr drawbutton + lda #$07+4 + ldx #50-4 + ldy #$8000 + jsr drawbutton + lda #$07+6 + ldx #50-4 + ldy #$ffff + jsr drawbutton + + jsl print + hex 3208 + asc "Drive: ",00 + jsl print + hex 320A + asc "Open: ",00 + jsl print + hex 320C + asc "Close: ",00 + jsl print + hex 320E + asc "Cancel:",00 + +:h sec + ror :iflag + jsr :erase1 + bit :errflag + bpl :deref + stz :entrylen + stz :entper + stz :count + stz :filepos + stz :selectpos + jmp :adc3 +:deref lda :handle + sta dirzp + lda :handle+2 + sta dirzp+2 + ldy #$02 + lda [dirzp] + tax + lda [dirzp],y + sta dirzp+2 + stx dirzp + + +:adc1 ldy #$23 + lda [dirzp],y + and #$00ff + sta :entrylen + iny + lda [dirzp],y + and #$ff + sta :entper + iny + lda [dirzp],y + sta :count + stz :filepos + stz :selectpos + +:adc ldy #$04 + lda [dirzp],y + and #$0f + sta :entlen +:adc3 rep $30 + lda #6 + sta mycv + lda #22-7 + sta mych + jsl textbascalc + jsl prodos + dw $0a + adrl :pfxparm + ldx #$01 + lda :pfx + and #$ff + beq :c + tay +]lup lda :pfx,x + phy + phx + and #$7f + pha + tll $180c + plx + ply + inx + dey + bne ]lup +:c +]lup cpx #$40-8 + bge :scd + phx + pea $a0 + tll $180c + plx + inx + jmp ]lup +:scd stz :catwhich + jsr :catdraw + lda #$00 + jsr :select +:key + do mouse +;jsr initmouse + lda #$8d + sta mousecrchar + lda #$FFFF + sta mousecr +:key2 jsr mousekey + bmi :and7f + else +:key2 + fin ;--- mouse --- + + jsl keyscan + bpl :key2 +:and7f and #$7f + cmp #$1b + jeq :tab + cmp #$0d + jeq :showxitcr + cmp #$7f + jeq :showxitesc + cmp #$09 + jeq :tab1 + ldy :count + beq :key + cmp #$0a + jeq :down + cmp #$0b + jeq :up + jmp :key +:showxitcr rep $30 + jsr :but2 + lda getname + and #$ff + jeq :key + jsl prodos + dw $06 + adrl :info1 + jcs :key + lda :type1 + cmp #$0f + beq :crdir + cmp #$04 + beq :eb1 + cmp #$b0 + beq :eb1 + cmp #$1a + beq :eb1 + jmp :key +:crdir lda :pfx + and #$ff + tax + sep $20 + clc + adc getname + cmp #64 + bge :bell + sta :pfx + ldy #$01 + inx +]lup lda getname,y + sta :pfx,x + iny + inx + cpy #$10 + blt ]lup + jmp :pfxset1 +:bell rep $20 + tll $2c03 + jmp :key +:showxitesc lda #$ff + sta getname + jsr :but4 +:eb1 jsr erasebox1 + lda #$01 +:catxit pha + lda :handle + ora :handle+2 + beq :nodis + psl :handle + _Disposehandle +:nodis rep $30 + lda :tch + sta termch + lda :tcv + sta termcv + jsl setch + pla + clc + rts +:tch ds 2 +:tcv ds 2 +:errflag ds 2 + +:tab jmp :poppfx +:tab1 jmp :newdisk + +:up lda :selectpos + beq :upxit + cmp :filepos + beq :ups + jsr :erase + dec :selectpos + lda :selectpos + sec + sbc :filepos + jsr :select + jmp :key + +:ups lda #$8000 + sta :catwhich + jsr :erase + jsr catscrolldn1 + dec :filepos + dec :selectpos + jsr :catdraw + lda #$00 + jsr :select +:upxit jmp :key +:down lda :selectpos + sec + sbc :filepos + bcc :down1 + cmp #catentries-1 + bge :down1 + lda :selectpos + inc + cmp :count + bge :upxit + sta :selectpos + jsr :erase + lda :selectpos + sec + sbc :filepos + jsr :select + jmp :key +:down1 lda :filepos + clc + adc #catentries + cmp :count + bge :upxit + inc :filepos + inc :selectpos + jsr :erase + jsr catscrollup1 + lda #$4000 + sta :catwhich + jsr :catdraw + lda #catentries-1 + jsr :select + jmp :key + +:select php + rep $30 + stz getname + ldx :count + jeq :sexit + clc + adc #$08 + sta termcv + sta :oldselect + lda #22-7 + sta termch + lda termcv + jsl setch + lda termch + tay + stz :sbit + ldx #$00 + sep $20 +:sloop1 jsl pickchar + and #$7f + bit :sbit + bmi :scmp + cmp #'.' + beq :son + cmp #'0' + blt :soff + cmp #'9'+1 + blt :son + cmp #'A' + blt :soff + cmp #'Z'+1 + blt :son + cmp #'a' + blt :soff + cmp #'z'+1 + bge :soff +:son sta getname+1,x + inx + pha + txa + sta getname + pla + jmp :scmp +:soff sec + ror :sbit +:scmp cmp #$40 + blt :stor + cmp #$60 + bge :stor + sec + sbc #$40 +:stor jsl storchar + iny + cpy #34 + blt :sloop1 + rep $20 +:sexit nop ;jsr showpath + plp + rts +:sbit ds 2 + + +:newdisk rep $30 + jsr :but1 + jsl prodos + dw $21 + adrl :lastdev + lda :lastdev + sta :ldev1 +]loop inc :lastdev + lda :lastdev + cmp :ldev1 + jeq :nonew + sta :devname + jsl prodos + dw $2c + adrl :devname + bcc :dpfxset1 + cmp #$11 + bne ]loop + stz :lastdev + jmp ]loop +:dpfxset1 jsl prodos + dw $08 + adrl :volume + jcs ]loop + lda :volname + sta zpage + lda :volname+2 + sta zpage+2 + lda [zpage] + and #$ff + tay + sep $20 +]lup lda [zpage],y + sta :pfx,y + dey + bpl ]lup + rep $30 + jmp :pfxset1 +:lastdev ds 2 +:ldev1 ds 2 +:devname ds 2 + adrl :devname1 +:devname1 ds 33,0 +:volume adrl :devname1 +:volname adrl $00 + ds 4 + ds 4 + dw $00 + +:poppfx rep $30 + jsr :but3 + stz :pfx + jsl prodos + dw $0a + adrl :pfxparm2 + lda :pfx + and #$00ff + beq :nonew + dec + beq :nonew + tay +]lup lda :pfx,y + and #$7f + cmp #'/' + beq :pfxset + dey + cpy #$03 + bge ]lup + jmp :nonew +:pfxset cpy #$02 + blt :nonew + tya + sep $20 + sta :pfx +:pfxset1 rep $20 + jsl prodos + dw $09 + adrl :pfxparm2 + lda :handle + ora :handle+2 + beq :np1 + psl :handle + _Disposehandle + stz :handle + stz :handle+2 +:np1 jmp :current +:nonew rep $30 + jmp :key + +:savech php + rep $30 + lda termch + sta :sch1 + lda termcv + sta :sch2 + sta termch + stx termcv + jsl setch + plp + rts +:rstch php + rep $30 + lda :sch1 + sta termch + lda :sch2 + sta termcv + jsl setch + plp + rts +:sch1 ds 2 +:sch2 ds 2 + +:but1 php + rep $30 + lda #$08 + jsr :invbut + plp + rts +:but2 php + rep $30 + lda #$0A + jsr :invbut + plp + rts +:but3 php + rep $30 + lda #$0C + jsr :invbut + plp + rts +:but4 php + rep $30 + lda #$0E + jsr :invbut + plp + rts + + +:invbut php + rep $30 + tax + lda #$30 + jsr :savech + ldy #$30 +]lup jsl pickchar + and #$7f + cmp #$40 + blt :ibok + cmp #$60 + bge :ibok + sec + sbc #$40 +:ibok jsl storchar + iny + cpy #$40 + blt ]lup + + ldx #$7000 +]lup sec + sbc #$01 + dex + bne ]lup + + ldy #$30 +]lup jsl pickchar + ora #$80 + jsl storchar + iny + cpy #$40 + blt ]lup + jsr :rstch + plp + rts + +:erase php + rep $30 + lda :oldselect + sta termcv + sta :oldselect + lda #22-7 + sta termch + lda termcv + jsl setch + lda termch + tay + sep $20 +:sloop2 jsl pickchar + cmp #$01 + blt :ora + cmp #$20 + bge :ora + clc + adc #$40 +:ora ora #$80 + jsl storchar + iny + cpy #34 + blt :sloop2 + rep $20 + plp + rts + +:erase1 php + rep $30 + lda #$08 + sta termcv +:e1l1 lda #22-7 + sta termch + lda termcv + jsl setch + lda termch + tay + sep $20 +:sloop21 lda #$a0 + jsl storchar + iny + cpy #34 + blt :sloop21 + rep $30 + inc termcv + lda termcv + cmp #8+catentries + blt :e1l1 + rep $20 + plp + rts + +:count ds 2 +:entrylen ds 2 +:filepos ds 2 +:entper ds 2 +:selectpos ds 2 +:oldselect ds 2 +:len ds 2 +:handle ds 4 +:openflag ds 2 + +:open dw $00 + adrl :pfx + adrl $00 +:info adrl :pfx + dw $00 +:type dw $00 + adrl $00 + ds 14,0 +:info1 adrl getname + dw $00 +:type1 dw $00 + adrl $00 + ds 14,0 +:read dw $00 +:buffer adrl $00 +:request adrl $00 +:transfer adrl $00 +:eof dw $00 +:eof1 adrl $00 +:close dw $00 + +:pfxparm dw $00 + adrl :pfx +:pfxparm2 dw $00 + adrl :pfx + +:pfx ds 129,0 + +:iflag ds 2 + +:cdpos ds 2 +:catwhich ds 2 + +:catdraw php + rep $30 + lda #08 + sta mycv + lda :filepos + sta :cdpos + sta :cdcount +:cdloop lda :cdpos + cmp :count + jge :cdxit + lda mycv + cmp #8+catentries + jge :cdxit + lda #22-7 + sta mych + jsl textbascalc + +:pha pha + pha + lda :cdcount + inc + pha + lda :entper + pha + tll $0b0b + pla + sta :blocknum + pla + sta :remain + lda :blocknum + xba + asl ;* $200 + clc + adc #$04 + sta :ypos + + pha + pha + lda :entrylen + pha + lda :remain + pha + tll $090b + pla + plx + clc + adc :ypos + sta :ypos + + ldy :ypos + lda [dirzp],y + and #$f0 + bne :cshow +:inccd inc :cdcount + jmp :pha +:cshow bit :catwhich + bvc :cshow1 + lda mycv + inc + cmp #8+catentries + jlt :inccv +:cshow1 jsr :printent + bit :catwhich + bmi :cdxit +:inccv inc mycv + inc :cdcount + inc :cdpos + jmp :cdloop +:cdxit plp + rts + +:printent php + rep $30 +* pea $FF +* pea $80 +* tll $0a0c +* lda :cdpos +* cmp :selectpos +* bne :ly +* pea $FF +* pea $00 +* tll $0a0c +:ly ldy :ypos + lda [dirzp],y + and #$0f + beq :inccd + sta :entlen + iny + ldx #$01 +]lup lda [dirzp],y + and #$7f + phx + phy + pha + tll $180c + ply + plx + inx + iny + cpx :entlen + blt ]lup + beq ]lup +]lup cpx #$11 + bge :dtype + lda #$a0 + phx + pha + and #$7f + tll $180c + plx + inx + jmp ]lup +:dtype lda :ypos + clc + adc #$10 + tay + lda [dirzp],y + and #$ff + pha + asl + clc + adc 1,s + plx + tax + lda filetypelist,x + phx + pha + and #$7f + tll $180c + plx + inx + lda filetypelist,x + phx + pha + and #$7f + tll $180c + plx + inx + lda filetypelist,x + pha + and #$7f + tll $180c + + do 0 + pea $20 + tll $180c + pea $20 + tll $180c +:daux pea #'$' + tll $180c + lda :ypos + clc + adc #$1f + tay + lda [dirzp],y + jsr :prbytel + + pea $20 + tll $180c + pea $20 + tll $180c +:dlen pea #'$' + tll $180c + lda :ypos + clc + adc #$15 + tay + lda [dirzp],y + jsr :prbytel + pea $20 + tll $180c + pea $20 + tll $180c + + lda :ypos + clc + adc #$21 + tay + lda [dirzp],y + sta :year + iny + iny + lda [dirzp],y + sta :time + + lda :year + and #%11111 + sta :decimal + cmp #$0a + bge :d1 + pea #' ' + tll $180c +:d1 psl #:decimal + pea $0000 + jsl printdec + pea #'-' + tll $180c + + lda :year + lsr + lsr + lsr + lsr + lsr + and #%1111 + dec + asl + asl + tax + + lda ftmonths,x + phx + pha + and #$7f + tll $180c + plx + inx + lda ftmonths,x + phx + pha + and #$7f + tll $180c + plx + inx + lda ftmonths,x + pha + and #$7f + tll $180c + pea #'-' + tll $180c + + lda :year + xba + lsr + and #%1111111 + sta :decimal + cmp #$0a + bge :d2 + pea #'0' + tll $180c +:d2 psl #:decimal + pea $0000 + jsl printdec + pea #' ' + tll $180c + pea #' ' + tll $180c + + lda :time + xba + and #%11111 + sta :decimal + cmp #$0a + bge :d3 + pea #' ' + tll $180c +:d3 psl #:decimal + pea $0000 + jsl printdec + pea #':' + tll $180c + + lda :time + and #%111111 + sta :decimal + cmp #$0a + bge :d4 + pea #'0' + tll $180c +:d4 psl #:decimal + pea $0000 + jsl printdec + + fin +* pea $FF +* pea $80 +* tll $0a0c + + plp + rts + + +:cdcount ds 2 +:ypos ds 2 +:entlen ds 2 +:blocknum ds 2 +:remain ds 2 +:decimal ds 2 +:year ds 2 +:time ds 2 + +:prbytel php + rep $30 + sta :byte + xba + jsr :prbyte + lda :byte + jsr :prbyte + plp + rts +:byte ds 2 + +:prbyte php + rep $30 + pha + lsr + lsr + lsr + lsr + and #$0F + jsr :nib + pla + and #$F + jsr :nib + plp + rts +:nib ora #"0" + cmp #"9"+1 + blt :ok + adc #"A"-"9"-2 +:ok and #$7F + pha + tll $180c + rts + + +drawbutton php + rep $30 + sta :temp + sty :flag + lda termch + pha + lda termcv + pha + lda :temp + sta termcv + stx termch + stx :temp + jsl setch + + bit :flag + bmi :1 + + ldx #$00 + ldy :temp + iny +]lup lda #"_" + phx + phy + jsl storchar + ply + plx + iny + inx + cpx #20-2 + blt ]lup +:1 inc termcv + jsl setch + + ldy :temp + lda #$da-$80 + jsl storchar + iny + lda #$20 + jsl storchar + iny + ldx #$00 +]lup lda #$a0 + jsl storchar + iny + inx + cpx #20-4 + blt ]lup + lda #$20 + jsl storchar + iny + lda #$df-$80 + jsl storchar + inc termcv + jsl setch + ldy :temp + iny + ldx #$00 +]lup bit :flag + bvs :n + lda #$dc-$80 + bra :jsl +:n lda #$cc-$80 +:jsl jsl storchar + iny + inx + cpx #20-2 + blt ]lup + +:xit rep $30 + pla + sta termcv + pla + sta termch + plp + rts +:temp ds 2 +:flag ds 2 + + +clrescreen ;ent ;routine clears the editor screen + ;top 2 and bottom 2 lines left alone + phy + php + phb + rep $30 + ldy #$26 ;get ready for each column +:start pea $0101 + plb + plb + lda #$A0A0 + sta $6D0,Y + sta $650,Y + sta $5D0,Y + sta $550,Y + sta $4D0,Y + sta $450,Y + sta $7A8,Y + sta $728,Y + sta $6A8,Y + sta $628,Y + sta $5A8,Y + sta $528,Y + sta $4A8,Y + sta $428,Y + sta $780,Y + sta $700,Y + sta $680,Y + sta $600,Y + sta $580,Y + sta $500,Y + pea #$0000 + plb + plb + sta $6D0,Y + sta $650,Y + sta $5D0,Y + sta $550,Y + sta $4D0,Y + sta $450,Y + sta $7A8,Y + sta $728,Y + sta $6A8,Y + sta $628,Y + sta $5A8,Y + sta $528,Y + sta $4A8,Y + sta $428,Y + sta $780,Y + sta $700,Y + sta $680,Y + sta $600,Y + sta $580,Y + sta $500,Y + dey ;decrement index + dey + bmi :exit ;if not done with screen.. + jmp :start ;continue +:exit plb + plp ;restore flags + ply + rtl ;and return + + +scrtbl ;ent ;table of screen offsets + dw $400 + dw $480 + dw $500 + dw $580 + dw $600 + dw $680 + dw $700 + dw $780 + dw $428 + dw $4A8 + dw $528 + dw $5A8 + dw $628 + dw $6A8 + dw $728 + dw $7A8 + dw $450 + dw $4D0 + dw $550 + dw $5D0 + dw $650 + dw $6D0 + dw $750 + dw $7D0 + + + mx %11 +inczp inc zpage1 + bne :1 + inc zpage1+1 +:1 rts + +yesno pla ;get return address + sta zpage1 ;and store in zero page + pla + sta zpage1+$1 + jsr inczp ;point it at cursor position + ldy #$00 + lda (zpage1),y ;get cursor horizontal + sta :pos1 ;store in this subroutine + sta :pos2 + jsr inczp + lda (zpage1),y ;get cursor vertical + sta :pos1+$1 ;save value in subroutine + sta :pos2+$1 + lda zpage1+$1 ;put new return address on + pha ;stack + lda zpage1 + pha + stz :pos ;initialize our position + jsr :prno +:wait + do mouse +;jsr initmouse + sec + ror mousecr+1 + lda #$8d + sta mousecrchar +:wait2 jsr mousekey + bmi :kand + else +:wait2 + fin ;--- mouse --- + + jsl keyscan ;get a key + bpl :wait2 ;wait if not valid +:kand and #$7f + do mouse + stz mousecr+1 ;only w/mouse usage + fin +:key cmp #$1B ;? + beq :esc + cmp #$0D ;? + beq :cr + cmp #$0a + beq :wait + cmp #$0b + beq :wait + cmp #'Y' ;check for "Y" and "N" + beq :yes ;chars + cmp #'y' + beq :yes + cmp #'N' + beq :no + cmp #'n' + beq :no + cmp #$08 ;backspace? + beq :bs + cmp #$15 ;right arrow? + beq :rs +:err jsr :bell ;error encountered + jmp :wait ;get another char +:bell rep $30 + tll $2c03 + sep $30 + rts +:esc sec ;indicate escape pressed + rts ;return +:cr lda :pos ;get answer + clc ;ok char + rts ;return +:yes lda #$01 ;signal "YES" + clc + rts ;return +:no lda #$00 ;nope.. + clc ;valid answer + rts ;return +:bs jsr :prno + + stz :pos ;signal "NO" + jmp :wait ;wait for another char +:rs jsr :pryes + lda #$01 ;signal "YES" + sta :pos ;and save it + jmp :wait ;get another char + +:pos hex 00 + +:prno jsl print +:pos1 hex 0000 + dfb 'O'&$1f + asc ' No ' ;print an inverted no + dfb 'N'&$1f + asc ' Yes ',00 + rts + +:pryes jsl print ;print an inverted yes +:pos2 hex 1f17 + asc ' No ' + dfb 'O'&$1f + asc ' Yes ' + dfb 'N'&$1f + hex 00 + rts + + +*-----------------------------------------------* +* Name : GETLINE * +* Function : GET A LINE OF INPUT * +* Input : JSL GETLINE * +* ADRL
* +* HEX * +* HEX CH/CV * +* Output : CARRY * +* CLEAR : INPUT LINE VALID * +* SET : ESCAPE KEY PRESSED * +* Volatile : NOTHING * +* Calls : GETKEY, STORCHAR, SETCH * +*-----------------------------------------------* + +getline ;ent ;read in a line of text + php + phb + phk + plb + rep $30 + sta :asave + stx :xsave + sty :ysave + lda termch + sta :oldch + lda termcv + sta :oldcv + lda cursor + sta :curs + lda #' ' + sta cursor + lda 3,s + sta tempzp + lda 5,s + and #$00FF + sta tempzp+2 + inc tempzp + bne :zp1 + inc tempzp+2 +:zp1 ldy #$02 + lda [tempzp] + sta tempzp1 + lda [tempzp],y + sta tempzp1+2 + iny + iny + lda [tempzp],y + and #$FF + sta :maxlen + iny + lda [tempzp],y + sep $20 + sta termch + sta :prompt + xba + sta termcv + rep $30 + jsl setch + lda #$06 + clc + adc tempzp + sta tempzp + lda #$00 + adc tempzp+2 + sta tempzp+2 + sep $20 + sta 5,s + rep $20 + lda tempzp + sta 3,s + stz :cflag + sep $30 +:start ldy #$FF ;transfer current +:trnsfr iny ;string to buffer + lda [tempzp1],y + sta buffer,y + cpy buffer + blt :trnsfr + ldy buffer ;get length of current + iny ;string + lda #$00 + sta buffer,y ;place marker at end + sta :pos ;initialize position + inc :pos ;position 1 +:loop jsr :prline ;show the string + ldy :pos ;get our pos + dey + tya + clc + adc :prompt ;add with offset + sta termch ;and move cursor. + jsl setch + + do mouse + sec + ror mousecr+1 + lda #$9b ;escape w/mouse control + sta mousecrchar + fin + + jsr getkey ;get a key from keyboard + ora #$80 ;set high bit + sta :char ;and save it + cmp #$8b + beq :loop + cmp #$8a + beq :loop + cmp #$9B ;is it ? + beq :key1 ;yes.. + cmp #$8D ;? + beq :key2 + cmp #$88 ;back space? + beq :key3 + cmp #$FF ;delete? + beq :key4 + cmp #$95 ;right arrow? + beq :key5 + cmp #$99 ;control-y? + beq :key6 + cmp #$A0 ;valid char? + blt :bell + cmp #$45+$80 + beq :key7 + cmp #$65+$80 + beq :key7 + cmp #$FF + bge :bell +:k7ins jsr :insert ;ok, so insert it + jmp :loop +:key1 jmp :esc ;jump to key handler routines +:key2 jmp :cr +:key3 jmp :bkspc +:key4 jmp :delete +:key5 jmp :rghtarr +:key6 jmp :cntrly +:key7 jmp :ekey +:bell rep $30 + tll $2C03 + sep $30 + jmp :loop + +:ekey pha + lda $E0C061 + tax + pla + cpx #$80 + blt :k7ins + lda cursor + and #$7F + cmp #' ' + beq :ul + lda #' ' + sta cursor + jmp :loop +:ul lda #"_" + sta cursor + jmp :loop + +:cr ldy #$00 ;execute a carriage return +:mov lda buffer,y + sta [tempzp1],y + iny + cpy :maxlen + bne :mov ;done with move? + lda buffer,y ;get last char + sta [tempzp1],y ;move it + lda buffer ;get length of input string + cmp :maxlen ;greater than maximum? + blt :setsize ;no=> + lda :maxlen ;yes, so get maximum +:setsize ldy #$00 ;set index to length byte + sta [tempzp1],y ;store length + lda :cflag ;read change flag + beq :crout ;if zero, don't move STRING + lda #$00 + jsl bascalc ;move cursor there + ldy #$32 ;reset counter + ldx #$00 ;loop counter +:restr lda topbuff,x ;get a char + jsl storchar ;restore it on screen + inx ;increment counter + iny ;increment pos + cpy #$50 ;end of screen? + blt :restr ;nope=> +:crout clc ;signal + php ;save status + jmp :exit ;exit + +:esc lda :cflag :read + beq :escout ;if zero, exit + lda termcv ;save cv value + pha ;save it + lda #$00 + jsl bascalc ;set base address + ldy #$32 ;set screen pos + ldx #$00 ;set counter +:res lda topbuff,x ;get a char + jsl storchar ;restore it + inx ;increment counter + iny ;increment screen pos + cpy #$50 ;end of screen? + blt :res ;nope=> + pla ;get cv value + sta termcv ;save it + jsl setch ;set cursor + stz :cflag ;reset change flag + jmp :start ;do it all over! +:escout sec ;signal pressed + php ;put on stack +:exit rep $30 + lda :oldch ;get old cursor ch + sta termch ;restore it + lda :oldcv ;get old cv + sta termcv ;restore it + jsl setch ;set ch/cv + lda :curs + sta cursor + lda :asave ;restore a-reg + ldy :ysave ;restore y-reg + ldx :asave ;restore x-reg + plp ;restore status + bcs :sec + plb + plp + clc + rtl +:sec plb + plp + sec + rtl ;and return + mx %11 + +:delete lda :pos ;get our position + cmp #$01 ;at the beginning? + beq :nodel ;yes=> + tay ;put value in y-reg +:delmov lda buffer,y ;get a char + beq :delsize ;if at end, continue + dey ;move it left + sta buffer,y ;store it + iny ;get ready for next char + iny + bne :delmov ;continue until done +:delsize dey + sta buffer,y ;move last char + dec buffer ;decrement length + dec termch ;our cursor pos + dec :pos ;and our pos in line + jsr :change ;set the change flag + jmp :loop ;return for more +:nodel rep $30 ;beeeeep! + tll $2C03 + sep $30 + jmp :loop ;continue + +:bkspc lda :pos :get + cmp #$01 ;at left edge? + beq :nobkspc ;yes=> + dec :pos ;decrement position + dec termch ;cursor position + jmp :loop ;and continue +:nobkspc jmp :loop ;continue + +:rghtarr ldy :pos :get + dey ;set for correct value + cpy buffer ;compare with length + bge :norght ;can't go Right + cpy :maxlen ;greater than max? + bge :norght ;yes=> + inc :pos ;otherwise, increment pos + inc termch ;cursor, + jmp :loop ;and continue +:norght jmp :nobkspc ;ring the bell + +:cntrly ldy :pos :get + dey ;modify it + sty buffer ;set length to that value + iny ;set y to end + lda #$00 ;get e.o.l marker + sta buffer,y ;indicating end of line + jsr :change ;set change flag + jmp :loop ;continue + +:insert lda :pos + cmp #$02 + bge :ins1 + stz buffer + stz buffer+1 + lda #$01 + sta :pos + +:ins1 lda cursor ;get current cursor type + and #$7F ;clear high bit + cmp #$20 ;is it a space? + beq :solid ;yes=> + lda buffer ;get length byte + cmp #$FE ;full? + bge :full ;yes=> + ldy :pos ;get our position + dey + cpy :maxlen ;at max length? + bge :full ;yes=> + iny ;reset y-reg + ldy buffer ;get length byte + iny ;add one +:movrt dey ;set for previous char + lda buffer+1,y ;get the char + iny ;move it right + sta buffer+1,y ;store it + dey ;ready for next char + cpy :pos ;done? + bge :movrt ;no, so loop + ldy :pos ;get :pos + lda :char ;get last char pressed + sta buffer,y ;insert in string + inc buffer ;increment length + inc :pos ;increment our position + inc termch ;our cursor pos + jsr :change ;set the change flag + rts ;return to main return + + +:solid lda buffer ;get length + cmp #$FE ;are we full? + bge :full ;yes=> + ldy :pos ;get our pos + dey + cpy :maxlen ;at max length? + bge :full ;yes, so can't insert + iny + cpy buffer ;at the end? + blt :ins ;no, so no problems + iny ;otherwise, move e.o.l. char + lda #$00 + sta buffer,y + dey +:ins lda :char ;get the char + sta buffer,y ;insert it + inc termch ;increment cursor + lda buffer ;get length + cmp :pos ;compare with position + bge :insmid + inc buffer ;increment length +:insmid inc :pos ;increment our position + jsr :change ;set change flag + rts ;return +:full rep $30 ;ring bell + tll $2C03 + sep $30 + rts ;return + +:prline pha ;save the registers + tya + pha + lda :prompt ;get start position + sta termch ;store in cursor + jsl setch ;move cursor to it + ldy #$00 ;reset index +:prt lda buffer+1,y ;get a char + beq :end ;if done, continue + cpy :maxlen ;at our max length? + bge :end ;yes, so stop + jsr :prntchar ;otherwise, print the char + iny ;increment index + bne :prt ;go back for more +:end lda #$A0 ;get a space char +:clr cpy :maxlen ;have we printed all chars + bge :lineout ;yes, so exit + jsr :prntchar ;otherwise, clear to end + iny + bne :clr +:lineout pla ;restore registers + tay + pla + rts ;and return + +:change php + sep $30 + lda termch :save + pha + lda termcv + pha + lda :cflag ;read change flag + bmi :mexit ;if already set exit + lda #$FF ;get a negative value + sta :cflag ;set the flag + lda #$00 + jsl bascalc ;set base address + ldx #$00 ;reset loop counter + ldy #$32 ;get position counter +:movit jsl pickchar ;get a char + sta topbuff,x ;save it in buffer + lda #$A0 ;get a space char + jsl storchar ;clear a position + iny ;increment position + inx ;increment counter + cpy #$50 ;at end of screen? + blt :movit ;nope=> + lda #$3C + sta termch + sta mych + stz termcv + stz mycv + jsl textbascalc + jsl setch + rep $30 + psl #:escstr + jsl drawstr + sep $30 +:mexit pla ;restore old cursor pos + sta termcv + pla + sta termch + jsl setch ;set values + plp + rts ;and return + +:prntchar phy + php + sep $30 + ldy termch + ora #$80 + jsl storchar + inc termch + plp + ply + rts + +:escstr str "Escape: Erase entry" + +:asave ds 2 +:ysave ds 2 +:xsave ds 2 +:oldch ds 2 +:oldcv ds 2 +:cflag ds 2 +:char ds 2 +:prompt ds 2 +:pos ds 2 +:maxlen ds 2 +:curs ds 2 + +buffer ds 275,0 +topbuff ds 40,0 + +keyscan ;ent ;read the keyboard using the + php ;event manager. + phb + phk + plb + rep $30 + bit emstarted + bmi :emyes + sep $20 + ldal $E0C000 + bmi :hwyes + jmp :no +:hwyes pha + ldal $E0C010 + ldal $E0C025 + sta emod+1 + pla + rep $20 + and #$00FF + jmp :yes1 +:emyes pha + pea $FFFF + psl #event + tll $0A06 ;getnextevent + pla + beq :no + lda event + cmp #$03 + beq :yes + cmp #$05 + beq :yes +:no plb + plp + rep $80 + rtl +:yes lda emess + and #$00FF + ora #$0080 +:yes1 plb + plp + sep $80 + rtl + + +memfull php + rep $30 + jsr drawbox + jsl print + dfb 44 + dfb 7 + asc "Memory Full",00 + lda selecting + pha + lda #$8000 + sta selecting + jsr getkey + pla + sta selecting + jsr erasebox + plp + rts + +getfind php + rep $30 + jsr drawbox + stz findstr + jsl print + dfb 44 + dfb 7 + asc "Text to FIND:",00 + jsl getline + adrl findstr + dfb 30 + dfb 44 + dfb 10 + php + jsr erasebox + plp + bcs :sec + plp + clc + rts +:sec plp + sec + rts + +getreplace php + rep $30 + jsr drawbox + stz findstr + stz replacestr + jsl print + dfb 44 + dfb 7 + asc "Change: ",00 + jsl print + dfb 44 + dfb 7+2 + asc " To: ",00 + + jsl getline + adrl findstr + dfb 20 + dfb 44+9 + dfb 7 + bcs :erase + + jsl getline + adrl replacestr + dfb 20 + dfb 44+9 + dfb 7+2 + bcs :sec + +:erase php + jsr erasebox + plp + bcs :sec + plp + clc + rts +:sec plp + sec + rts + + +doerror php + rep $30 + and #$00ff + sta :errcode + jsl print + dfb 44 + dfb 7 + asc " ",00 + stz :which +:loop lda :which + asl + tax + lda :tbl,x + beq :nocode + cmp :errcode + beq :found + inc :which + jmp :loop +:found lda :which + asl + tax + lda :tbl1,x + sta :add+1 + sta :add1+1 + + lda #44 + sta mych + lda #7 + sta mycv + jsl textbascalc +:add lda $ffff + and #$00ff + sta :len + ldx #$01 +]lup phx +:add1 lda $ffff,x + and #$007f + jsl drawchar + plx + inx + cpx :len + blt ]lup + beq ]lup + jmp :wait +:nocode jsl print + dfb 44 + dfb 7 + asc "GS/OS Error $",00 + lda #57 + sta mych + lda #7 + sta mycv + jsl textbascalc + lda :errcode + jsl prbyte +:wait tll $2C03 +:key jsl keyscan + bpl :key + plp + rts + +:which ds 2 +:errcode ds 2 +:len ds 2 + +:tbl dw nottext + dw toobigerr + dw syntaxerr + dw $07 ;ProDOS busy + dw $27 ;I/O error + dw $28 ;No Device + dw $2b ;Write Protected + dw $2f ;No Device + dw $40 ;bad pathname + dw $44 ;directory not found + dw $45 ;volume not found + dw $46 ;file not found + dw $47 ;duplicate filename + dw $48 ;disk full + dw $49 ;volume full + dw outofmem + dw notdir + dw $4e ;File locked + dw $0000 + +:tbl1 dw :str1 + dw :str2 + dw :str3 + dw :str4 + dw :str5 + dw :str6 + dw :str7 + dw :str8 + dw :str9 + dw :str10 + dw :str11 + dw :str12 + dw :str13 + dw :str14 + dw :str15 + dw :str16 + dw :str17 + dw :str18 + +:str1 str 'Not a TXT/SRC file.' +:str2 str 'File too Large!' +:str3 str 'Syntax Error' +:str4 str 'ProDOS busy' +:str5 str 'I/O error' +:str6 str 'No Device Connected' +:str7 str 'Write Protected' +:str8 str 'No Device Connected' +:str9 str 'Bad Pathname' +:str10 str 'Directory not Found' +:str11 str 'Volume not Found' +:str12 str 'File not Found' +:str13 str 'Duplicate Filename' +:str14 str 'Disk Full' +:str15 str 'Volume Full' +:str16 str 'Not Enough Memory' +:str17 str 'Not Subdirectory' +:str18 str 'File Locked' + + do library +userid ext + else +userid ds 2,0 + fin + +editlen ds 4,0 +dphandle ds 4,0 +dppointer ds 2,0 + +efilename ds 130,0 +loadfilename ds 130,0 +getname ds 67,0 + +pfxsave ds 67,0 +mypfx ds 67,0 +pfxparm dw $00 + adrl pfxsave +mypfxparm dw $00 + adrl mypfx + +dpsave ds 2 +stacksave ds 2 + +event ds 2 ;event record...use by taskmaster +emess ds 4 ;event message +ewhen ds 4 ;tick count +ewhere +cursy ds 2 ;cursor y in global coords +cursx ds 2 ;cursor x in global coords +emod ds 2 ;modifier keys + +instring ds 256,0 + diff --git a/src/edit/edit.apw.s b/src/edit/edit.apw.s new file mode 100644 index 0000000..6eb5965 --- /dev/null +++ b/src/edit/edit.apw.s @@ -0,0 +1,869 @@ + +loadapw rep $30 + stz :toolarge + stz :merlin + stz :openflag + stz :loaded + stz apwlen + stz apwlen+2 +:open jsl prodos + dw $10 ;open + adrl :oparm + bcc :ref + jmp :err +:ref lda :oparm + sta :rparm + sta :cparm + sec + ror :openflag + lda #300 ;Read Header + sta :rin +:r1 jsl prodos + dw $12 + adrl :rparm + bcc :save + jmp :err +:save jsr newdoc1 + +:loop rep $30 + jsr :readtwo + bcs :done1 + tay + and #$FF00 + cmp #$D000 + bne :n1 + jsr :docr + bcs :done1 + bra :loop +:n1 cmp #$D800 + bge :loop + jsr :dotext + bcc :loop +:done1 and #$00ff + cmp #$4C + beq :done + jmp :err + +:done rep $30 + lda #$00 + sta gotolnum + sec + ror :loaded + +:sfplp rep $30 + bit :openflag + bpl :set + jsl prodos + dw $14 + adrl :cparm + stz :openflag + +:set bit :loaded + bpl :bit + + bit :merlin + bpl :zero + sep $20 +:tabson ldx #$07 +]lup lda tabs1,x + sta tabs,x + dex + bpl ]lup + +:zero sep $30 + ldx loadfilename +]lup lda loadfilename,x + and #$7f + cmp #'a' + blt :uc + cmp #'z'+1 + bge :uc + and #$5f +:uc sta efilename,x + dex + bpl ]lup +:bit rep $30 + bit :toolarge + bpl :sfplp1 + jmp :toolarge1 +:sfplp1 jsr erasebox + lda apwlen+2 + beq :norm + lda #$ffff + sta flen + sta editlen + jmp :norm1 +:norm lda apwlen + sta flen + sta editlen + +:norm1 jsr gotoline + jsr drawmem + jsr drawtabs + jsr drawfname +:cmdxit plp + clc + rts +:err rep $30 + and #$00ff + jsr doerror + stz :toolarge + jmp :sfplp +:toolarge1 lda #toobigerr + jmp :err + +:merlin ds 2 +:errcode ds 2 +:toolarge ds 2 +:loaded ds 2 +:openflag ds 2 +:flag ds 2 +:cparm ds 2 +:oparm ds 2 + adrl loadfilename + adrl $0000 +:rparm ds 2 +:where adrl :databuff +:rin adrl $00 + adrl $00 +:info adrl loadfilename + ds 2 +:type ds 2 +:aux ds 4 + ds 16 +:eof ds 6 + +:databuff ds 512,0 + +:readtwo php + rep $30 + lda #$02 + sta :rin + stz :rin+2 + jsr :read + bcs :rsec + lda :databuff + plp + clc + rts +:rsec plp + sec + rts + +:read php + rep $30 + jsl prodos + dw $12 + adrl :rparm + bcc :rok + jmp :bad +* cmp #$4C +* jeq :bad +* jsl p8error +* bcc :read +* bra :bad +:rok plp + clc + rts +:bad plp + sec + rts + +:dotext php + rep $30 + tya ;Get Linerec Value + and #$00FF + sta :rin + jsr :read + bcs :txtbad + sep $30 + ldy :databuff + beq :t4 +:t1 lda #$20 + jsr :stuffit + bcs :tmem + dey + bne :t1 ;Add Spaces +:t4 lda :databuff+$1 + and #$7F + sta :len + ldy #$00 +:t2 cpy :len + beq :t3 + lda :databuff+$2,Y + and #$7F + cmp #$20 + blt :t0 + jsr :stuffit + bcs :tmem +:t0 iny + bra :t2 +:t3 lda :databuff+$1 + bpl :txit + lda #$0D + jsr :stuffit + bcs :tmem +:txit plp + clc + rts +:tmem lda #toobigerr +:txtbad plp + sec + rts + +:len hex 0000 + +:docr php + tya ;Get LineRec Value + sep $30 + tay + cpy #$00 + beq :cr2 +:cr1 lda #$20 ;SpaceChar + jsr :stuffit + bcs :memcr + dey + bne :cr1 +:cr2 lda #$0D + jsr :stuffit + bcs :memcr1 + plp + clc + rts +:memcr ply ;Remove counter +:memcr1 lda #toobigerr + plp + sec + rts + + +:stuffit phy + phx + php + rep $30 + ldy apwlen+2 + bne :full + ldy apwlen + cmp #$ffff + beq :full + sep $20 + sta [fileptr],y + rep $20 + inc apwlen + bne :ok + inc apwlen+2 +:ok plp + plx + ply + clc + rts +:full sec + ror :toolarge + plp + plx + ply + sec + rts + +apwlen ds 4 + + +saveapw rep $30 + lda #$00 + sta :mylen + sta :mylen+2 + sta :openflag + sta :loaded + + lda flen + bne :sapw + clc + jmp :sapwout +:sapw lda loadfilename + and #$ff + beq :pd + tax + lda loadfilename,x + and #$7f + cmp #'!' + bne :pd + sep $20 + dec loadfilename + rep $20 +:pd jsl prodos + dw $06 + adrl :iparm + bcs :create + lda :ftype + cmp #$1A + beq :open + lda #$1A + sta :ftype +:q1 jsl prodos + dw $05 ;set info + adrl :iparm + bcc :open + jmp :errout +:create jsl prodos + dw $01 + adrl :crparm + bcc :open + cmp #$47 + beq :open + jmp :errout +:open jsl prodos + dw $10 + adrl :opnparm + bcc :o1 + jmp :errout +:o1 lda :opnparm + sta :wparm + sta :cparm + sec + ror :openflag + jsr :write + bcs :errout + jsl prodos + dw $14 + adrl :cparm + stz :openflag + sec + ror :loaded + clc + jmp :sapwout +:errout rep $30 + pha + bit :openflag + bpl :err1 + jsl prodos + dw $14 + adrl :cparm + stz :openflag +:err1 pla + and #$00ff + jsr doerror + sec + jmp :sapwout + +:sapwout rep $30 + + bit :loaded + bpl :sfplp + + stz alldirty + + sep $30 + ldx loadfilename +]lup lda loadfilename,x + and #$7f + cmp #'a' + blt :uc + cmp #'z'+1 + bge :uc + and #$5f +:uc sta efilename,x + dex + bpl ]lup + + rep $30 + + jsr drawfname + +:sfplp rep $30 + jsr erasebox + sep $30 + plp ;pull off processor placed by COMMANDS + clc + rts + + +:iparm adrl loadfilename + dw $00 +:ftype dw $00 + ds 20,0 +:crparm adrl loadfilename + dw $e3 + dw $1a + adrl $0000 + dw $01 + adrl $00 + +:opnparm dw $00 + adrl loadfilename + adrl $0000 + +:wparm dw $00 +:buff adrl $0000 +:ct adrl $0000 +:trans adrl $0000 + +:cparm dw $00 +:openflag ds 2 +:eofparm ds 2 +:eof adrl $0000 + +:smark dw $00 +:pos adrl $12c + +:mylen ds 4 +:loaded ds 2 + +:write rep $30 + lda #:header + sta :buff + lda #^:header + sta :buff+$2 + lda #$12C + sta :ct + lda #$00 + sta :done + lda :opnparm + sta :smark + sta :eofparm +:wrt jsl prodos + dw $13 + adrl :wparm + bcc :l + jmp :werr +:l lda :done + bne :exit + jsr :gline + rep $30 + lda :length + and #$00ff + sta :ct + lda #$00 + sta :ct+$2 + lda #:line + sta :buff + lda #^:line + sta :buff+$2 + jmp :wrt +:exit lda #<:end + sta :buff + lda #^:end + sta :buff+$2 + lda #$04 + sta :ct + lda #$00 + sta :ct+2 + jsl prodos + dw $13 + adrl :wparm + bcc :q2 + jmp :werr +:q2 jsl prodos + dw $17 ;getmark + adrl :smark + bcc :q3 + jmp :werr +:q3 ldy #$02 +:e1 sep $20 + lda :pos,y + sta :eof,y + dey + bpl :e1 + rep $20 +:q4 jsl prodos + dw $18 + adrl :eofparm + bcc :q5 + jmp :werr +:q5 clc + rts + +:werr sec + rts + +:header hex 2e2200004f3d3d3d + hex 3d3d7c3d3d3d3d7c + hex 3d3d3d3d7c3d3d3d + hex 3d7c3d3d3d3d7c3d + hex 3d3d3d7c3d3d3d3d + hex 7c3d3d3d3d7c3d3d + hex 3d3d7c3d3d3d3d7c + hex 3d3d3d3d7c3d3d3d + hex 3d7c3d3d3d3d7c3d + hex 3d3d3d7c3d3d3d3d + hex 7c3d3d3d00002c22 + hex 02 + ds 211,0 +:end hex 00d0ffff + + +:gline rep $30 + lda #$00 + sta :line + sta :line+$2 + sta :length + sta :glct + sta :spc + sta :tflag + sta :txt + jmp :main +:m1 sep $30 + dec :glct +:main sep $30 + lda :glct + cmp #$50 + jeq :glexit + jsr :gchar + bcs :glend + and #$7F + sta :char + inc :glct + lda :char + cmp #$0D + beq :cr + cmp #$20 + blt :m1 + beq :spc1 + inc :tflag +:0 inc :txt + jmp :1 +:spc1 lda :tflag + bne :0 + inc :spc +:1 ldy :txt + dey + lda :char + sta :line1,y + jmp :main +:cr lda :tflag + beq :crrec + lda #$80 + bne :2 +:glexit lda #$00 +:2 ora :txt + sta :line+$3 + lda :spc + sta :line+$2 + lda #$00 + sta :line+$1 + lda :txt + clc + adc #$02 + sta :line + adc #$02 + sta :length + rts +:crrec lda :spc + sta :line + lda #$D0 + sta :line+$1 + lda #$02 + sta :length + rts +:glend lda #$01 + sta :done + jmp :cr + mx %00 + + +:gchar php + rep $30 + ldy :mylen + lda [fileptr],y + and #$ff + iny + beq :gdone + sty :mylen + cpy flen + bge :gdone + plp + clc + rts +:gdone sec + ror :done + plp + sec + rts + +:glct hex 0000 +:tflag hex 0000 +:spc hex 0000 +:txt hex 0000 +:char hex 0000 + +:done hex 0000 +:length hex 0000 +:line hex 00000000 +:line1 ds 275,0 + + +gopos rep $30 + and #$7f + sec + sbc #$30 + dec + sta :temp + pha + pha + lda flen + pha + pea $8 ;divide by 9 + tll $0b0b + pla + plx + pha + pha + pha + lda :temp + pha + tll $090b + pla + sta gotoposition + pla + jsr gotopos + stz gotoposition + jsr getbuff + jsr drawline + stz pos + jsr poscurs +:cmdxit sep $30 + plp + clc + rts +:temp ds 2 + +drawstr ;ent + php + phb + phk + plb + phd + rep $30 + pha + phx + phy + tsc + tcd + lda [14] + and #$00FF + sta :len + beq :xit + phy + ldy #$01 +]lup cpy :len + blt :next + beq :next + bra :xit1 +:next lda [14],y + and #$7F + phy + jsl drawchar + ply + iny + bra ]lup +:xit1 ply +:xit ldx #12 +]lup lda $00,X + sta $04,X + dex + dex + bne ]lup + tsc + clc + adc #$04 + tcs + ply + plx + pla + pld + plb + plp + rtl +:len ds 2 + +drawchar ;ent + phx + php + rep $30 + and #$7F + cmp #$0D + beq :cr + pha + tll $180C + sep $20 + lda tcursx + inc + sta tcursx + lda tcursx + cmp #80 + blt :xit +:cr1 rep $30 + lda #$00 + sta tcursx + lda tcursy + inc + cmp #24 + blt :st + lda #23 +:st sta tcursy +:xit plp + plx + rtl + mx %00 +:cr pha + tll $180C + pea $0A + tll $180C + jmp :cr1 + +ffeed rtl + + +printdec ;ent + php + phb + phd + phk + plb + rep $30 + stz :first + tsc + tcd + lda $08 + sta :flags + lda [$0A] + ldx #$00 +]lup cmp #10000 + blt :thous + inx + sec + sbc #10000 + jmp ]lup +:thous sta :number + txa + clc + adc #$30 + jsr :draw + ldx #$00 + lda :number +]lup cmp #1000 + blt :hun + inx + sec + sbc #1000 + jmp ]lup +:hun sta :number + txa + clc + adc #$30 + jsr :draw + ldx #$00 + lda :number +]lup cmp #100 + blt :ten + inx + sec + sbc #100 + jmp ]lup +:ten sta :number + txa + clc + adc #$30 + jsr :draw + ldx #$00 + lda :number +]lup cmp #10 + blt :one + inx + sec + sbc #10 + jmp ]lup +:one sta :number + txa + clc + adc #$30 + jsr :draw + sec + ror :first + lda :number + clc + adc #$30 + jsr :draw +:xit ldx #$06 +]lup lda 0,x + sta 6,x + dex + dex + bpl ]lup + rep $30 + tsc + clc + adc #6 + tcs + pld + plb + plp + rtl + +:draw cmp #'0' + beq :zero + jsl drawchar + sec + ror :first + rts +:zero bit :first + bmi :zeroout + bit :flags + bpl :rts + bvs :zeroout + lda #$20 +:zeroout jsl drawchar +:rts rts + +:number ds 2 +:flags ds 2 +:first ds 2 + +tprbytel ;ent + php + phb + phk + plb + rep $30 + sta :byte + xba + jsl prbyte + lda :byte + jsl prbyte + plb + plp + rtl +:byte ds 2 + +prbyte ;ent + pha + phy + phx + php + phb + phk + plb + rep $30 + pha + lsr + lsr + lsr + lsr + and #$0F + jsr :nib + pla + and #$F + jsr :nib + plb + plp + plx + ply + pla + rtl +:nib ora #"0" + cmp #"9"+1 + blt :ok + adc #"A"-"9"-2 +:ok and #$7F + jsl drawchar + rts + diff --git a/src/edit/edit.cmd.s b/src/edit/edit.cmd.s new file mode 100644 index 0000000..17bc49f --- /dev/null +++ b/src/edit/edit.cmd.s @@ -0,0 +1,22 @@ +*====================================================== +* Link file for QuickEdit v2.00 + +* Written by Lane Roath +*====================================================== + + asm edit + + do err + else + + lnk obj/edit.l + + ds 1000 + + fin + + typ exe + sav utility/newedit + + end + diff --git a/src/edit/edit.equs.s b/src/edit/edit.equs.s new file mode 100644 index 0000000..0a27360 --- /dev/null +++ b/src/edit/edit.equs.s @@ -0,0 +1,81 @@ +*====================================================== +* Equates for QuickEdit v2.00... written by Lane Roath + +cda equ 0 ;0=EXE file,1=CDA +library equ 0 ;is QE a part of another program? +softdisk equ 0 ;include SOFTDISK code? +mouse equ 0 ;allow mouse control? + +debug equ 0 ;Must be ZERO +right equ 80 ;right margin value +catentries equ 9 ;how many "catalog" entries to show + +dplength equ $100 + + dum 1 +toobigerr ds 1 +nottext ds 1 +syntaxerr ds 1 +outofmem ds 1 +notdir ds 1 + dend + + dum $00 ;zero page usage +zpage ds 4 +zpage1 ds 4 +fileptr ds 4 +tempzp ds 4 +tempzp1 ds 4 +basl ds 2 + +cliphandle ds 4 +editbufhdl ds 4 + +termch ds 2 +termcv ds 2 +mych ds 2 +mycv ds 2 +base ds 2 +tcursx ds 2 +tcursy ds 2 + +dirzp ds 4 + +asynckey ds 2 +showcr ds 2 +superquit ds 2 +loaderstat ds 2 +oflag ds 2 +linenum ds 2 +gotolnum ds 2 +gotoposition ds 2 +marker ds 2 +xval ds 2 +yval ds 2 +aval ds 2 +emstarted ds 2 +intstatus ds 2 +textdevice ds 4 +texttype ds 2 +textor ds 2 +textand ds 2 +grafentry ds 2 +flen ds 2 +oldlen ds 2 +pos ds 2 +pos1 ds 2 +eof ds 2 +sof ds 2 +position ds 2 +dirty ds 2 +alldirty ds 2 +selstart ds 2 +selend ds 2 +selecting ds 2 +selectflag ds 2 +equitflag ds 2 +workspace ds 16 + + err */$100 + dend + diff --git a/src/edit/edit.macs.s b/src/edit/edit.macs.s new file mode 100644 index 0000000..7bee41a --- /dev/null +++ b/src/edit/edit.macs.s @@ -0,0 +1,84 @@ +^RESTOREHANDLE MAC + PHL ]1 + Tool $B02 + <<< +^CHECKHANDLE MAC + PHL ]1 + Tool $1E02 + <<< +^SETPURGE MAC + PHWL ]1;]2 + Tool $2402 + <<< +^NEWHANDLE MAC + P2SL ]1 + PxW ]2;]3 + PHL ]4 + Tool $902 + <<< +^GETNEWID MAC + P1SW ]1 + Tool $2003 + <<< +PHWL MAC + PHW ]1 + PHL ]2 + <<< +PXW MAC + DO ]0/1 + PHW ]1 + DO ]0/2 + PHW ]2 + DO ]0/3 + PHW ]3 + DO ]0/4 + PHW ]4 + FIN + FIN + FIN + FIN + <<< +P2SL MAC + PHA + PHA + IF #=]1 + PEA ^]1 + ELSE + PHW ]1+2 + FIN + PHW ]1 + <<< +PHL MAC + IF #=]1 + PEA ^]1 + ELSE + PHW ]1+2 + FIN + PHW ]1 + <<< +P1SW MAC + PHA + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +PHW MAC + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< + diff --git a/src/edit/edit.s b/src/edit/edit.s new file mode 100644 index 0000000..1d361fc --- /dev/null +++ b/src/edit/edit.s @@ -0,0 +1,5515 @@ + lst off + ttl "QuickEdit v2.00d2" + tr on + lstdo off + cas in + exp off +*====================================================== +* QuickEdit -- for use with the QuickAsm system + +* Written by Shawn Quick & ReWritten by Lane Roath + +* Copyright (c) 1988-1990 QuickSoft & Ideas From the Deep +*------------------------------------------------------ +* 29-Feb-89 2.00 :d1- start rewrite +*====================================================== + + xc + xc + mx %00 + rel + + use 4/util.macs + use qatools.macs + use edit.macs + put 2/qa.equates + put edit.equs + +*------------------------------------------------------ + +editor + phb + phd + phk + plb + rep $30 + sta userid + tdc + sta editdp + sta dppointer + pea 0 + _QAStatus + pla + bne :runit + + pld + plb + plp + rep $30 + jsl $e100a8 ;error- quit + dw $29 + adrl :q +:q adrl $0 + dw $0 +:runit + rep $30 + pea 0 + pea 0 + _QACompilerActive + _QALinkerActive + pla + ora 1,s + sta 1,s + pla + jne :allout + + pea 0 + psl #$00 + lda userid + pha + _QAGetMessagebyID + pla + plx + ply + cmp #startmess + beq :runit1 + pld + plb + clc + rtl + +:runit1 stz superquit + sep $20 + ldal $e0c029 + sta grafentry + ldal $E100BC + jeq :editerr + rep $20 + stz emstarted + + lda userid + bne :haveuser + ~GetNewID #$5000 ;get a user id if a CDA + pla + sta userid +:haveuser + lda dppointer + bne :havedp + phd + tsc + sec + sbc #5 + tcs + inc + pha + pld + + ~NewHandle #0;#dplength;userid;#$C015;#0 + bcc :derefdp + plx + plx + tsc + clc + adc #5 + tcs + pld + brl :editerr +:derefdp + pla + sta dphandle + sta 0 + pla + sta dphandle+2 + sta 2 + lda [0] + sta dppointer + tsc + clc + adc #5 + tcs + pld + lda dppointer + pha + pld + ldx #0 +]lup stz 0,X ;init direct page + inx + inx + cpx #dplength + blt ]lup +:havedp +* lda editbufhdl +* ora editbufhdl+2 +* beq :needbuf +* psl editbufhdl +* tll $1E02 + ~CheckHandle editbufhdl ;is our text handle valid? + bcs :needbuf + lda editbufhdl + sta zpage + lda editbufhdl+2 + sta zpage+2 + ldy #$02 + lda [zpage] ; yes- still point to valid data? + ora [zpage],y + bne :havebuffer +:rstrbuf +* psl editbufhdl +* tll $0B02 ;restorehandle + ~RestoreHandle editbufhdl ; no- reallocate it! + jcs :editerr + jsr newdoc1 + bra :havebuffer + +:needbuf psl #$00 + psl #$10000 + pea 0 + _QAGetShellID + pla + ora #$100 + pha ;allocate text buffer + pea $0010 + psl #$00 + _NewHandle + bcc :deref + plx + plx + brl :editerr +:deref + pll editbufhdl + jsr newdoc1 + +:havebuffer +* pea 0 +* psl editbufhdl +* tll $2402 ;no more purging... + ~SetPurge #0;editbufhdl ;don't allow purge while in use + +* stz equitflag +* stz superquit +* stz dirty +* stz intstatus +* stz loaderstat + + do mouse + pea $00 + tll $1803 ;init mouse + jsr initmouse + fin + + pha + tll $0606 ;event manager active?? + pla + beq :noem + sec + ror emstarted + +:noem psl editbufhdl + tll $2002 + + lda editbufhdl + sta zpage + lda editbufhdl+2 + sta zpage+2 + + ldy #$02 + lda [zpage] + sta fileptr + lda [zpage],y + sta fileptr+2 + + stz loaderstat +:init + jsr initedit + jsr selectoff +:loop rep $30 + jsr drawcpos + + do debug + jsr showinfo + fin + + bit equitflag + jmi :editout + + do mouse + stz mousecr + stz mousecrchar ;init if mouse is in use + fin + + jsr getkey + sep $30 + and #$7F + sta :char + bit selecting+1 + bpl :sel1 + cmp #$0a + beq :sel1 + cmp #$0b + beq :sel1 + cmp #$15 + beq :sel0 + cmp #$08 + beq :sel0 + and #$5f + cmp #'C' + beq :sel0 + cmp #'X' + beq :sel0 +:sel3 jsr selectoff + jmp :loop +:sel0 lda emod+1 + bit emstarted+1 + bmi :sel2 + and #%10000000 + beq :sel3 + bra :sel1 +:sel2 and #%00000001 + beq :sel3 +:sel1 lda :char + cmp #$0d + beq :c + bit oflag + bmi :nomod +:c stz oflag + jsr commands + bcc :loop + lda :char + jsr keypads + bcc :loop + lda :char + jsr controls + bcc :loop +:nomod lda cursor + stz oflag + and #$7F + cmp #'_' + beq :insert + ldx pos + inx + cpx linebuff + bge :insert + dex +:over lda :char + sta linebuff+1,x + sec + ror dirty + lda termch + cmp #right-1 + bge :dl + inc pos +:dl jsr drawline + jsr poscurs + jmp :loop +:insert ldx linebuff + cpx #$FF + jge :loop + ldx pos + cpx linebuff + bge :ldx + ldx linebuff +]lup lda linebuff,x + sta linebuff+1,x + dex + beq :ldx + cpx pos + bge ]lup +:ldx ldx pos + lda :char + sta linebuff+1,x + sec + ror dirty + inc linebuff + lda termch + cmp #right-1 + bge :dl1 + inc pos +:dl1 rep $30 + jsr drawline + jsr poscurs + jmp :loop + +:editout rep $30 + jsr savebuff +* jsr exitquestion +* bcc :lds +* stz equitflag +* jmp :loop +:lds +:pfx + do 0 + jsl prodos + dw $0a + adrl mypfxparm + jsl prodos + dw $09 ;setpfx + adrl pfxparm + fin + + lda flen + sta editlen + psl editbufhdl + tll $2202 + psl dphandle + _disposehandle + stz dphandle + stz dphandle+2 + stz dppointer + sep $20 + ldal $E0C027 + and #%10111111 + ora intstatus + stal $E0C027 + rep $20 + lda texttype + pha + psl textdevice + tll $100C ;setoutputdevice + lda textand + pha + lda textor + pha + tll $0A0C + + bit emstarted + bpl :super + pha + pea %0000010000101110 + pea 0 + tll $1506 ;flush events + pla +:super + do cda.library + bit superquit + bpl :pldxit + fin + jsl shutdown +:pldxit rep $30 + sep $20 + lda grafentry + stal $e0c029 +:allout rep $30 + pld + plb + clc + rtl + +:editerr rep $30 + psl #:es1 + tll $200c + ldy #20 + ldal $e0c01f + and #$80 + beq :c1 +]lup phy + pea $20 + tll $180c + ply + dey + bne ]lup +:c1 psl #:es2 + tll $200c + ldy #20 + ldal $e0c01f + and #$80 + beq :c2 +]lup phy + pea $20 + tll $180c + ply + dey + bne ]lup +:c2 psl #:es3 + tll $200c + pha + pea $0000 + tll $220c + pla + jmp :pldxit + pld + plb + rtl + +:char ds 2 +:es1 hex 0c0d0d0d0d0d0d0d0d,00 +:es2 asc ' Unable to run QuickEDIT',8d,00 +:es3 asc 'Insufficient memory or GS/OS not active',0d,00 + +editsdown ent +shutdown + php + phb + phd + phk + plb + rep $30 + + lda editbufhdl + ora editbufhdl+2 + beq :nobuffer + pea 2 + psl editbufhdl + tll $2402 ;set purge + + do 0 ;cda!1 + psl editbufhdl + _Disposehandle + stz editbufhdl + stz editbufhdl+2 + fin + +:nobuffer lda dphandle + ora dphandle+2 + beq :nodp + psl dphandle + _Disposehandle + stz dphandle + stz dphandle+2 + stz dppointer +:nodp lda userid + beq :nouserid +* pha +* tll $2103 +* stz userid +:nouserid + jsl inittext + psl #:str + tll $1c0c + pld + plb + rtl + +:str str 0d,'Shell.',0d,0d +shutdownrtl + rtl + +inittext php + rep $30 + pea $00 + psl #$03 + tll $100c + pea $00 + psl #$03 + tll $0f0c + pea $00 + psl #$03 + tll $110c + + pea $00 + tll $150c + pea $01 + tll $150c + pea $02 + tll $150c + + pea #$ff + pea #$80 + tll $0a0c + + pea #$ff + pea #$80 + tll $090c + + pea $0c + tll $180c + plp + rtl + + + +newdoc jsr newdoc1 + jsr drawfname + jsr drawmem + stz gotolnum + lda #-1 + sta linenum ;fool goto line!! + jsr gotoline + rts + +newdoc1 php + sep $20 +:tabsoff ldx #$07 +]lup stz tabs,x ;zero out tabs + dex + bpl ]lup +:dtabs ldx #$07 +]lup lda dtabs,x + sta tabs1,x + sta tabs,x + dex + bpl ]lup + jsr drawtabs + rep $20 + stz linenum + stz flen + stz editlen + stz showcr + stz pos + stz pos1 + stz position + stz dirty + stz selecting + stz efilename + stz alldirty + stz marker + lda #$FFFF + sta selstart + sta selend + plp + rts + + put edit.1 + +cmdxit sep $30 + plp + clc + rts + +keypads php + sep $30 + and #$7F + cmp #'a' + blt :schar + cmp #'z'+1 + bge :schar + and #$5F +:schar sta :char + lda emod+1 + bit emstarted+1 + bmi :emmod + bit #%00010000 + beq :xit + jmp :chk +:emmod bit #%00100000 + beq :xit +:chk ldx #$00 +]lup lda :tbl,x + beq :xit1 + cmp :char + beq :found + inx + jmp ]lup +:found rep $30 + txa + asl + tax + lda :tbl1,x + sta :jmp+1 + lda dirty + beq :sep + jsr savebuff + jsr getbuff + jsr drawline + jsr poscurs +:sep sep $30 + lda :char +:jmp jmp $FFFF +:cmdxit sep $30 + plp + clc + rts +:xit lda :char + plp + sec + rts +:xit1 lda :char + plp + clc + rts +:char ds 2 + + +:tbl dfb 'X'&$1f + +:tbl1 dw :donew + dw $00 + +:donew rep $30 + jsr drawbox + stz :string + jsr drawesccan1 + jsl print + dfb 47 + dfb 7 + asc "CLEAR current contents?",00 + sep $30 + jsr yesno + dfb 51+3 + dfb 9 + rep $30 + pha + php + jsr erasebox + jsr drawesc + plp + pla + bcs :cbplp1 + and #$ff + beq :cbplp1 + jsr newdoc + jsr drawfname + jsr gotoline +:cbplp1 jmp :cmdxit +:string ds 33,0 + + +commands php + sep $30 + and #$7F + cmp #'a' + blt :schar + cmp #'z'+1 + bge :schar + and #$5F +:schar sta :char + lda emod+1 + bit emstarted+1 + bmi :emmod + and #%10000000 + beq :xit + jmp :chk +:emmod and #%00000001 + beq :xit +:chk ldx #$00 +]lup lda :tbl,x + beq :xit1 + cmp :char + beq :found + inx + jmp ]lup +:found rep $30 + txa + asl + tax + lda :tbl1,x + sta :jmp+1 + lda dirty + beq :sep + jsr savebuff + jsr getbuff + jsr drawline + jsr poscurs +:sep sep $30 + lda :char +:jmp jmp $FFFF +:cmdxit sep $30 + plp + clc + rts +:xit sep $30 + lda :char + and #$ff + plp + sec + rts +:xit1 lda :char + and #$ff + plp + clc + rts +:char ds 2 + + +:tbl dfb 'Q' ;Quit + dfb 'E' ;Toggle cursor + dfb 'M' ;show + hex 0b ;up 10 lines + hex 0a ;down 10 lines + hex 08 ;up 24 lines + hex 15 ;down 24 lines + dfb '9' ;eof + dfb 'N' ;eof + dfb 'B' ;beginning of file + dfb '1' ;beginning of file + dfb 'Z' ;center current line + dfb 'D' ;delete current line + dfb 'I' ;insert line + hex 09 ;insert line (same as 'I') + dfb 'J' ;goto line number/label + hex 7f ;delete line above + dfb 'S' ;save file + dfb '-' ;tabs off + dfb '_' ;tabs off + dfb '+' ;default tabs on + dfb '=' ;default tabs on + dfb '0' ;set/clear tabs + dfb 'C' ;copy command + hex 1b ;quit + dfb 'O' ;open command box + dfb 'L' ;load file + dfb 'P' ;show prefix (status box) + dfb 'A' ;Assemble + dfb '/' ;status box + dfb '?' ;status box + hex 0D ;insert CR + dfb '2' ;go relative position + dfb '3' + dfb '4' + dfb '5' + dfb '6' + dfb '7' + dfb '8' + dfb 'T' ;goto marker + dfb 'X' ;cut + dfb 'V' ;paste + dfb 'Y' ;select all + dfb 'W' ;find word + dfb 'F' ;find + dfb 'R' ;find/replace + hex 00 ;must end with $00 + +:tbl1 dw :quit + dw :cursor + dw :showcr + dw :up10 + dw :dn10 + dw :up24 + dw :dn24 + dw :goend + dw :goend + dw :gobegin + dw :gobegin + dw :crupdate + dw :delline + dw :insline + dw :insline + dw :gotolabel + dw :delline1 + dw :savefile + dw :tabsoff + dw :tabsoff + dw :tabson + dw :tabson + dw :settabs + dw :copy + dw :superquit + dw :extcommand + dw loadfile + dw :prefix1 + dw :asm ;:marker + dw :prefix + dw :prefix + dw insertcr + dw gopos + dw gopos + dw gopos + dw gopos + dw gopos + dw gopos + dw gopos + dw :marker + dw :cut + dw :paste + dw :selall + dw :findword + dw :find + dw :replace + + +:findword jsr findword + jmp :cmdxit +:find jsr find + jmp :cmdxit +:replace jsr findreplace + jmp :cmdxit + +:asm rep $30 + + do 0 + stz automode + stz asmpath + lda flen + sta editlen + + jsl inittext + + phd + lda globalptr + tcd + clc + adc #goasmptr + sta :jsl+1 + stz shellerrors + stz objcodesaved + stz keyquit + stz gobjaux + stz gobjaux+2 + stz gobjtype + lda #$02 + sta asmhdlid + lda editbufhdl + sta asmfileptr + lda editbufhdl+2 + sta asmfileptr+2 + lda editlen + sta asmfilelen + stz asmfilelen+2 + lda #$01 + sta asmhdlid + +:jsl jsl $000000 + rep $30 + tay + phk + plb + pld + + pha + psl #:keystr + tll $1c0c + sep $20 +:k1 ldal $e0c000 + bpl :k1 + ldal $e0c010 + rep $20 + pea $01 ;pascal... + psl #$03 ;turn on 80 column + tll $100c + pea $01 + tll $150c + + pea $02 + psl #textdriver + tll $100C ;setoutputdevice + + pea $FF + pea $80 + tll $0A0C + + jsl clrscreen + jsr editscreen + + stz termcv + stz termch + sta oflag + + lda #$FFFF + sta sof + jsl setch + + lda linenum + sta gotolnum + jsr gotoline + + pla + fin + + jmp :cmdxit +:keystr str 'Press a key.',0d + +:marker rep $30 + lda marker + sta gotolnum + jsr gotoline + jmp :cmdxit + +]left equ 24 + +:prefix1 jmp :cmdxit + +:prefix rep $30 + lda termch + pha + lda termcv + pha + jsr drawbox1 + + jsl print + dfb ]left + dfb 12-6 + asc " QuickEdit v2.00d2",00 + jsl print + dfb ]left + dfb 13-6 + asc " by",00 + jsl print + dfb ]left + dfb 14-6 + asc "Shawn Quick & Lane Roath",00 + jsl print + + do softdisk + dfb ]left-5 + dfb 16-6 + asc "copyright 1989, SoftDisk Publishing, Inc.",00 + else + dfb ]left-1 + dfb 16-6 + asc "copyright 1989, QuickSoft Software",00 + fin + + jsl print + dfb ]left + dfb 17-6 + asc " All Rights Reserved.",00 + + + jsl print + dfb 18 + dfb 16 + asc "Prefix: ",00 + lda #26 + sta mych + lda #16 + sta mycv + jsl textbascalc + jsl prodos + dw $0a + adrl :pparm + jcc :pprt + sta :pfx +:pprt lda :pfx + and #$00ff + sta :plen + jeq :pinfo + ldx #$00 +]lup lda :pfx+1,x + phx + jsl drawchar + plx + inx + cpx :plen + bge :pinfo + cpx #70-26 + blt ]lup +:pinfo jsl print + dfb ]left + dfb 9+4 + asc "Memory: Used: ",00 + lda #]left+15 + sta mych + lda #9+4 + sta mycv + jsl textbascalc + psl #flen + pea $0000 + jsl printdec + lda flen + eor #$FFFF + sta :pfree + jsl print + dfb ]left+22 + dfb 9+4 + asc "Free: ",00 + lda #]left+28 + sta mych + lda #9+4 + sta mycv + jsl textbascalc + psl #:pfree + pea $0000 + jsl printdec + + jsl print + dfb ]left+9 + dfb 9+5 + asc "Clip: ",00 + lda cliphandle + ora cliphandle+2 + beq :czero + psl #$00 + psl cliphandle + _gethandlesize + pll :pfree + bra :pclip +:czero stz :pfree + stz :pfree+2 +:pclip lda #]left+15 + sta mych + lda #9+5 + sta mycv + jsl textbascalc + psl #:pfree + pea $0000 + jsl printdec + + +:pkey2 jsl keyscan + bpl :pkey2 + and #$7f + cmp #$1b + beq :done +* jmp :about +:done ;jsr initmouse + jsr erasebox1 + pla + sta termcv + pla + sta termch + jsl setch + jmp :cmdxit + +:about jsr aboutsd + ;jsr initmouse +:pkeysd jsl keyscan + bpl :pkeysd + jmp :done + +:plen ds 2 +:pfree ds 4 +:pparm dw $00 + adrl :pfx +:pfx ds 68,0 + +:extcommand rep $30 + jsr drawbox + stz instring + stz commandlen + jsr drawesccan + jsl print + dfb 44 + dfb 7 + asc "Command?",00 + jsl getline + adrl instring + dfb 30 + dfb 44 + dfb 10 + php + jsr drawesc + plp + lda #$00 + bcs :dcplp + rep $30 + sep $20 + lda instring + beq :dcplp + sta :len1 + ldx #$00 +]lup cpx :len1 + bge :run + lda instring+1,x + and #$7f + cmp #' ' + beq :run + cmp #'a' + blt :sta + cmp #'z'+1 + bge :sta + and #$5f +:sta sta externname,x + inx + jmp ]lup +:run txa + and #$00ff + sta commandlen + clc + adc externdflt + sta externpath + rep $30 + jsr checkcommands + bcc :dcplp + lda #syntaxerr + jsr doerror + lda #$00 + jmp :dcplp + + jsr runcommand + +:dcplp rep $30 + and #$00ff + beq :dc1 + jmp :cmdxit +:dc1 jsr erasebox + jmp :cmdxit + +:len1 ds 2,0 +:string1 ds 65 + +:superquit rep $30 + lda #$FFFF + sta equitflag + sta superquit + jmp :cmdxit + +:copy rep $30 + bit selecting + jmi :copy1 + lda position + sta selstart + pha + ldx eof + beq :copyyes + lda flen + bra :copy0 +:copyyes jsr foreptr + lda position + dec +:copy0 sta selend + pla + sta position + sec + ror selecting + jsr drawline + jmp :cmdxit + +:copy1 jsr copyselect + lda selstart + sta gotoposition + jsr selectoff1 + jsr gotopos + jsr drawmem + jmp :cmdxit + +:cut rep $30 + bit selecting + bmi :cut1 + lda position + sta selstart + pha + ldx eof + beq :copyyes1 + lda flen + jmp :cut0 +:copyyes1 jsr foreptr + lda position + dec +:cut0 sta selend + pla + sta position + sec + ror selecting + jsr drawline + jmp :cmdxit + +:cut1 jsr copyselect + bcs :cutxit + psl #$00 + psl cliphandle + _GetHandlesize + pla + plx + ldx selend + ldy selstart + jsr deletetext + lda selstart + sta gotoposition + jsr selectoff1 + jsr gotopos + jsr drawmem +:cutxit jmp :cmdxit + +:paste rep $30 + lda cliphandle + ora cliphandle+2 + bne :paste1 + jmp :cmdxit + +:paste1 psl #$00 + psl cliphandle + _GetHandleSize + pla + plx + sta workspace + lda position + clc + adc workspace + tay + ldx position + lda workspace + jsr inserttext + jcs :cmdxit + psl cliphandle + lda position + clc + adc fileptr + tax + lda #$00 + adc fileptr+2 + pha + phx + psl #$00 + psl cliphandle + _GetHandleSize + tll $2902 ;_HandToPtr + jsr drawmem + lda position + jsr updatescreen + jsr drawcpos + jsr getbuff + jsr drawline + jsr poscurs + jsr setfflags + +:pastexit jmp :cmdxit + +:selall rep $30 + lda position + sta selstart + lda flen + sta selend + sta gotoposition + lda #$8000 + sta selecting + jsr gotopos + jmp :cmdxit + + mx %11 +:settabs + lda termch + sta :ch + lda termcv + sta :cv + lda cursor + sta :curs + lda #$16 + sta termcv + lda #$01 + sta termch + jsl setch + lda #' ' + sta cursor + ldx #$07 +]lup lda tabs,x + sta tabstemp,x + dex + bpl ]lup +:stloop + do mouse + sec + ror mousecr+1 ;setup for mouse + lda #'S' + sta mousecrchar + fin + + jsr getkey + and #$7F + cmp #$1B + jeq :stcan + cmp #$0D + jeq :stcr + and #$5F + cmp #'C' + beq :stclr + cmp #'S' + beq :set + cmp #'R' + jeq :reset + cmp #$08 + beq :stbs + cmp #$15 + beq :stra + cmp #'D' + beq :default + jmp :stloop +:default ldx #$07 +]lup lda dtabs,x + sta tabs,x + dex + bpl ]lup + jsr drawtabs + jmp :stloop +:stbs lda termch + cmp #$02 + jlt :stloop + dec + sta termch + jsl setch + jmp :stloop +:stra lda termch + cmp #right-2 + jge :stloop + inc + sta termch + jsl setch + jmp :stloop +:stclr ldx #$07 +]lup stz tabs,x ;zero out tabs + dex + bpl ]lup + jsr drawtabs + jmp :stloop +:set ldx #$07 + ldy #$00 +]lup lda tabs,x + beq :sdex + iny +:sdex dex + bpl ]lup + cpy #$08 + blt :set2 + rep $30 + tll $2C03 + sep $30 + jmp :stloop +:set2 lda termch + sta :temp + ldx #$00 +]lup lda tabs,x + beq :stset1 + cmp :temp + jeq :stloop + bge :sthere + inx + cpx #$08 + blt ]lup + jmp :stloop +:sthere stx :temp + ldx #$08 +]lup lda tabs,x + sta tabs+1,x + dex + cpx #$FF + beq :zero + cpx :temp + bge ]lup + jmp :ldx1 +:zero ldx #$00 + bra :stset1 +:ldx1 ldx :temp +:stset1 lda termch + sta tabs,x + jsr drawtabs + jmp :stloop + +:reset ldx #$07 + lda termch +]lup cmp tabs,x + beq :kill + dex + bpl ]lup + jmp :stloop +:kill lda tabs+1,x + sta tabs,x + inx + cpx #$08 + blt :kill + stz tabs+7 + stz tabs+8 + jsr drawtabs + jmp :stloop +:stcan ldx #$07 +]lup lda tabstemp,x + sta tabs,x + dex + bpl ]lup + jsr drawtabs + jmp :stxit +:stcr ldx #$07 +]lup lda tabs,x + sta tabs1,x + dex + bpl ]lup + jsr drawtabs + rep $30 + lda linenum + sta gotolnum + jsr gotoline + sep $30 + jmp :stxit1 +:stxit lda :cv + sta termcv + lda :ch + sta termch + jsl setch +:stxit1 lda :curs + sta cursor + jmp :cmdxit + +:temp ds 2 +:ch ds 2 +:cv ds 2 +:curs ds 2 + + mx %11 +:tabsoff ldx #$07 +]lup lda tabs,x + sta tabs1,x + stz tabs,x + dex + bpl ]lup + rep $30 + jsr drawtabs + lda linenum + sta gotolnum + jsr gotoline + jsr getbuff + jsr drawline + stz pos + jsr poscurs + jmp :cmdxit + + mx %11 +:tabson ldx #$07 +]lup lda tabs1,x + sta tabs,x + dex + bpl ]lup + jsr drawtabs + rep $30 + lda linenum + sta gotolnum + jsr gotoline + jsr getbuff + jsr drawline + stz pos + jsr poscurs + jmp :cmdxit + +:savefile rep $30 + lda flen + bne :sstz + jmp :cmdxit +:sstz stz :openflag + stz :loaded + jsr drawbox + jsr drawesccan + + sep $30 + ldx efilename +]lup lda efilename,x + and #$7f + cmp #'a' + blt :uc1 + cmp #'z'+1 + bge :uc1 + and #$5f +:uc1 sta :filename,x + dex + bpl ]lup + rep $30 + + jsl print + dfb 44 + dfb 7 + asc "SAVE file as:",00 + jsl getline + adrl :filename + dfb 15 + dfb 44 + dfb 10 + php + jsr drawesc + plp + jcs :sfplp + rep $30 + lda :filename + and #$00FF + jeq :sfplp + jsl print + dfb 44 + dfb 7 + asc "Saving... ",00 + + lda flen + sta editlen + sta :request + sta :eof+2 + stz :openflag + + lda :filename + and #$ff + tax + lda :filename,x + and #$7f + cmp #'!' + bne :notapw + lda :filename + and #$ff + tax + sep $20 +:lfn lda :filename,x + sta loadfilename,x + dex + bpl :lfn + rep $20 + jmp saveapw + +:notapw lda :filename + and #$ff + cmp #3 + blt :notmerlin + tax + lda :filename,x + and #$5f + cmp #'S' + bne :notmerlin + dex + lda :filename,x + and #$7f + cmp #'.' + bne :notmerlin + jmp :merlin +:notmerlin + ldy #$00 + sep $20 +]lup lda [fileptr],y + and #$7f + sta [fileptr],y + iny + cpy editlen + blt ]lup + rep $20 +:merlin + jsl prodos + dw $01 + adrl :create + jsl prodos + dw $06 + adrl :info + jcs :err + lda :type + cmp #$b0 + beq :p16open + cmp #$1a + beq :settxt + cmp #$04 + bne :badtype + lda #$04 + sta :type + lda :aux + and #$fffe + sta :aux + bra :p16 +:settxt lda #$04 + sta :type + stz :aux +:p16 jsl prodos + dw $05 + adrl :info + jcs :err + jmp :p16open +:badtype lda #nottext + jmp :err +:p16open jsl prodos + dw $10 + adrl :open + jcs :err + sec + ror :openflag + lda :open + sta :write + sta :close + sta :eof + stz :request+2 + stz :eof+4 + lda fileptr + sta :where + lda fileptr+2 + sta :where+2 + jsl prodos + dw $18 + adrl :eof + jcs :err + jsl prodos + dw $13 + adrl :write + jcs :err + + jsl prodos + dw $14 + adrl :close + stz :openflag + + sec + ror :loaded + + stz alldirty + + sep $30 + ldx :filename +]lup lda :filename,x + and #$7f + cmp #'a' + blt :uc + cmp #'z'+1 + bge :uc + and #$5f +:uc sta efilename,x + dex + bpl ]lup + rep $30 + + jsr drawfname + +:sfplp rep $30 + bit :openflag + bpl :sfplp1 + jsl prodos + dw $14 + adrl :close + stz :openflag +:sfplp1 jsr erasebox + jmp :cmdxit +:err jsr doerror + jmp :sfplp + +:loaded ds 2 +:openflag ds 2 +:close ds 2 +:open ds 2 + adrl :filename + adrl $0000 +:write ds 2 +:where adrl $00 +:request adrl $00 + adrl $00 +:info adrl :filename + ds 2 +:type ds 2 +:aux ds 4 + ds 16 +:eof ds 6 + +:filename ds 16,0 + +:create adrl :filename + dw $E3 + dw $04 + adrl $00 + dw $01 + adrl $0000 + +:gotolabel rep $30 + jsr drawbox + stz :string + jsr drawesccan + jsl print + dfb 44 + dfb 7 + asc "JUMP to:",00 + jsl getline + adrl :string + dfb 28 + dfb 44 + dfb 10 + php + jsr erasebox + jsr drawesc + plp + bcs :cbplp + rep $30 + lda :string + and #$FF + beq :cbplp + lda :string+1 + and #$7F + cmp #'0' + blt :label + cmp #'9'+1 + bge :label + pha + psl #:string+1 + lda :string + and #$FF + pha + pea $00 + tll $280B + pla + sta gotolnum + jsr gotoline +:cbplp jmp :cmdxit + +:label sep $30 + ldx :string +]lup lda :string,x + cpx #$00 + beq :sl8 + and #$7f + cmp #'a' + blt :sl8 + cmp #'z'+1 + bge :sl8 + and #$5f +:sl8 sta glabstr,x + dex + bpl ]lup + rep $30 + lda #$ffff + sta gotolnum + jsr gotolable + jmp :cmdxit +:string ds 30 + + +:insline rep $30 + jsr savebuff + lda flen + cmp #$FFFF + jge :nomem + jsr setfflags + lda #$FFFF + sta dirty + stz oldlen + lda #$0D01 + sta linebuff + jsr savebuff +:crup jsl setch + jsr updatescreen + jsr drawcpos + jsr getbuff + stz pos + jsr drawline + jsr poscurs + jsr setfflags + jmp :cmdxit +:nomem jsr memfull + jmp :cmdxit +:crtemp ds 2 + +:delline rep $30 + lda position + cmp flen + jge :cmdxit + lda position + sta :dpos + jsr foreptr + sep $20 + lda fileptr+2 + sta :mvn+1 + sta :mvn+2 + rep $30 + ldy :dpos + ldx position + lda flen + sec + sbc position + dec + cmp #$FFFF + beq :ateof + phb +:mvn mvn $00,$00 + plb + lda flen + sec + sbc oldlen + sta flen + jmp :dupd +:ateof lda :dpos + sta flen +:dupd lda :dpos + sta position + jsr updatescreen + jsr drawcpos + jsr getbuff + jsr drawline + jsr poscurs + jsr drawmem + jsr setfflags + jmp :cmdxit +:dpos ds 2 + +:delline1 rep $30 + lda sof + jne :cmdxit + lda position + sta :dpos + jsr backptr + jsr getbuff + sep $20 + lda fileptr+2 + sta :mvn1+1 + sta :mvn1+2 + rep $30 + ldy position + ldx :dpos + lda flen + sec + sbc :dpos + dec + cmp #$FFFF + beq :eof1 + phb +:mvn1 mvn $00,$00 + plb +:eof1 lda flen + sec + sbc oldlen + sta flen + dec linenum + lda termcv + beq :sch1 + dec +:ok sta termcv +:sch1 jsl setch + jmp :dupd1 +:eof12 lda :dpos + sta flen +:dupd1 jsr updatescreen + jsr drawcpos + jsr getbuff + jsr drawline + jsr poscurs + jsr drawmem + jsr setfflags + jmp :cmdxit + + +:gobegin rep $30 + stz findstr + stz replacestr + lda sof + jne :cmdxit + lda #$0001 + sta gotolnum + jsr gotoline + jmp :cmdxit + +:goend rep $30 + stz findstr + stz replacestr + lda eof + jne :cmdxit + lda #$FFFF + sta gotolnum + jsr gotoline + jmp :cmdxit + +:up10 rep $30 + lda sof + jne :cmdxit + lda dirty + beq :u1 + jsr savebuff +:u1 lda linenum + sec + sbc #10 + bcs :u10ok + lda #$01 +:u10ok sta gotolnum + lda #10 + jsr selbackward + jsr gotoline + jmp :cmdxit + +:dn10 rep $30 + lda eof + jne :cmdxit + lda dirty + beq :d1 + jsr savebuff +:d1 lda linenum + clc + adc #10 + bcc :d10ok + lda #$FFFF +:d10ok sta gotolnum + lda #10 + jsr selforward + jsr gotoline + jmp :cmdxit + +:up24 rep $30 + lda sof + jne :cmdxit + lda dirty + beq :u2 + jsr savebuff +:u2 lda linenum + sec + sbc #24 + bcs :u24ok + lda #$01 +:u24ok sta gotolnum + lda #24 + jsr selbackward + jsr gotoline + jmp :cmdxit + +:dn24 rep $30 + lda eof + jne :cmdxit + lda dirty + beq :d2 + jsr savebuff +:d2 lda linenum + clc + adc #24 + bcc :d24ok + lda #$FFFF +:d24ok sta gotolnum + lda #24 + jsr selforward + jsr gotoline + jmp :cmdxit + + + mx %11 +:quit lda #$FF + sta equitflag + sta equitflag+1 + jmp :cmdxit + +:cursor lda cursor + and #$7F + cmp #'_' + beq :ow + lda #"_" + sta cursor + jmp :cmdxit +:ow lda #' ' + sta cursor + jmp :cmdxit + +:showcr lda showcr + bne :soff + lda #$FF + sta showcr + sta showcr+1 + jmp :crupdate +:soff + stz showcr + stz showcr+1 + +:crupdate rep $30 + lda linenum + sta gotolnum + jsr gotoline + jmp :cmdxit + mx %11 + +controls php + sep $30 + ldx #$00 + sta :char + cmp #$7F + jeq :delete + cmp #$20 + bge :plp +]lup lda :tbl,x + beq :plp1 + cmp :char + beq :found + inx + jmp ]lup +:found rep $30 + txa + asl + tax + lda :tbl1,x + sta :jmp+1 + sep $30 +:jmp jmp $FFFF +:plp lda :char + plp + sec + rts +:plp1 lda :char + plp + clc + rts +:char ds 2 + +:tbl hex 08 ;backspace char + hex 15 ;right arrow + hex 0d ;carriage return + hex 0a ;down arrow + hex 0b ;up arrow + hex 1b ;escape + hex 09 ;tab + hex 0e ;^N eoln + hex 0f ;^O insert next char + hex 02 ;^B beginning of line + hex 14 ;^T set marker + dfb 'Y'&$1f ;^Y truncate line + dfb 'X'&$1f ;^X cancel find/replace + hex 00 ;must end with zero + +:tbl1 dw :bspace + dw :rarrow + dw :cr + dw :darrow + dw :uarrow + dw :esc + dw :tab + dw :controln + dw :controlo + dw :controlb + dw :controla + dw :controly + dw :controlx + +:tab lda #$09 + plp + sec + rts +:controlx jsr controlx + jmp :ctrlxit +:controly jsr controly + jmp :ctrlxit + +:controlo sec + ror oflag + jmp :ctrlxit + +:controln lda #$FF + sta pos + jsr poscurs + jmp :ctrlxit + +:controlb + stz pos + jsr poscurs + jmp :ctrlxit + +:controla lda linenum + sta marker + lda linenum+1 + sta marker+1 + jmp :ctrlxit + +:esc lda #$FF + sta equitflag + sta equitflag+1 +:ctrlxit plp + clc + rts + +:cr rep $30 + jsr savebuff + lda flen + cmp #$FFFF + jge :nomem + jsr setfflags + lda eof + sta :crtemp + jsr foreptr + lda #$FFFF + sta dirty + stz oldlen + lda #$0D01 + sta linebuff + jsr savebuff + lda :crtemp + bne :crup + inc linenum + lda termcv + inc + cmp #22 + blt :s + jsl scroll + lda #21 +:s sta termcv +:crup jsl setch + jsr updatescreen +* jsr showcv + jsr drawcpos + jsr getbuff + stz pos + jsr drawline + jsr poscurs + jsr setfflags +:cmdxit plp + clc + rts +:nomem jsr memfull + jmp :cmdxit +:crtemp ds 2 + + mx %11 +:darrow lda dirty + beq :dn + jsr savebuff +:dn lda eof + bne :darx + lda termch + sta :ch + jsr foreptr + lda termcv + inc + cmp #22 + blt :dok + jsl scroll + lda #21 +:dok sta termcv + jsl setch + bit selecting+1 + bpl :dg + lda position + sta selend + lda position+1 + sta selend+1 +:dg jsr getbuff + jsr drawline + lda :ch + sta oldch + jsr setpos + jsr poscurs + rep $30 + inc linenum + jsr drawcpos +* jsr showcv +:darx plp + clc + rts +:ch ds 2 + mx %11 + +:uarrow lda dirty + beq :up + jsr savebuff +:up rep $30 + bit selecting + bpl :nosel + lda selend + pha + stz selend + jsr drawline + pla + sta selend +:nosel lda position + sta :pos + lda termch + sta :ch + jsr backptr + lda position + cmp :pos + bne :tcv + + sep $30 + lda sof + bne :uarx +:tcv sep $30 + lda termcv + beq :bs + dec + jmp :uok +:bs jsl bscroll + lda #00 +:uok sta termcv + jsl setch + bit selecting+1 + bpl :ug + rep $30 + lda position + sta selend + cmp selstart + bge :ug + jsr selectoff1 +:ug sep $30 + jsr getbuff + jsr drawline + lda :ch + sta oldch + jsr setpos + jsr poscurs + rep $30 + dec linenum + jsr drawcpos +* jsr showcv +:uarx plp + clc + rts +:pos ds 2 + mx %11 + +:rarrow lda linebuff + beq :bxit + lda termch + cmp #right-1 + bge :bxit + lda pos + inc + cmp linebuff + bge :bxit + inc pos + lda pos + cmp #255 + blt :rpos + lda #255 + sta pos +:rpos jsr poscurs + jmp :bxit +:bspace lda linebuff + beq :bxit + lda pos + beq :bxit + cmp #right + blt :bdec + lda #right + sta pos +:bdec dec pos + jsr poscurs +:bxit plp + clc + rts + +:delete lda linebuff + beq :dxit + ldx pos + beq :dxit +]lup cpx linebuff + bge :ddec +:d lda linebuff+1,x + sta linebuff,x + inx + jmp ]lup +:ddec dec linebuff + dec pos + sec + ror dirty + jsr drawline + jsr poscurs +:dxit plp + clc + rts + +controlx php + rep $30 + stz findstr + stz replacestr + plp + rts + +controly php + sep $30 + ldx pos + beq :cy + inx + stx linebuff + lda #$0d + sta linebuff,x +:cy1 lda #$ff + sta dirty + sta dirty+1 + jsr savebuff + jsr getbuff + jsr drawline + jsr poscurs + jmp :xit +:cy stz pos + lda #$01 + sta linebuff + lda #$0d + sta linebuff+1 + jmp :cy1 +:xit plp + rts + +selectoff php + rep $30 + jsr selectoff1 ;why duplicate? + lda position + sta gotoposition + jsr gotopos + plp + rts + +selectoff1 php + rep $30 + lda #$ffff + sta selstart + sta selend + stz selecting + lda #$80 + sta selectflag + plp + rts + +inserttext php + rep $30 + sta :ct + stx :source + sty :dest + clc + adc flen + bcs :toobig + lda fileptr + clc + adc :source + tax + lda fileptr+2 + adc #$00 + pha + phx + lda fileptr + clc + adc :dest + tax + lda fileptr+2 + adc #$00 + pha + phx + pea 0 + lda flen + sec + sbc :source + pha + tll $2b02 ;_BlockMove + lda :ct + clc + adc flen + sta flen + plp + clc + rts + +:toobig jsr memfull + plp + sec + rts + +:ct ds 2 +:source ds 2 +:dest ds 2 + +deletetext php + rep $30 + sta :ct + stx :source + sty :dest + lda flen + sec + sbc :ct + bcs :ok + stz flen + plp + clc + rts +:ok lda fileptr + clc + adc :source + tax + lda fileptr+2 + adc #$00 + pha + phx + lda fileptr + clc + adc :dest + tax + lda fileptr+2 + adc #$00 + pha + phx + pea 0 + lda flen + sec + sbc :source + pha + tll $2b02 ;_BlockMove + lda flen + sec + sbc :ct + bcs :f + lda #$00 +:f sta flen + plp + clc + rts +:ct ds 2 +:source ds 2 +:dest ds 2 + + +selforward php + rep $30 + bit selecting + bpl :xit + and #$ff + sta :ct + stz eof +]lup lda :ct + beq :done + jsr foreptr + dec :ct + bra ]lup +:done lda position + sta selend +:xit plp + rts +:ct ds 2 + +selbackward php + rep $30 + bit selecting + bpl :xit + and #$ff + sta :ct + stz eof +]lup lda :ct + beq :done + jsr backptr + dec :ct + bra ]lup +:done lda position + sta selend + cmp selstart + bge :xit + jsr selectoff1 +:xit plp + rts +:ct ds 2 + +*------------------------------------------------------ +copyselect php + rep $30 + lda cliphandle + ora cliphandle+2 + bne :resize + psl #$00 + psl #$01 + lda userid + ora #$900 + pha + pea 0 + psl #$00 + _Newhandle + plx + ply + jcs :err + stx cliphandle + sty cliphandle+2 +:resize lda position + pha + lda sof + pha + lda eof + pha + stz eof + stz sof + lda selend + sta position + jsr foreptr + lda position + ldy eof + beq :1 + lda flen +:1 sta selend + sec + sbc selstart + pea 0 + pha + psl cliphandle + _SetHandleSize + ply + sty eof + ply + sty sof + ply + sty position + jcs :err + lda selstart + clc + adc fileptr + tax + lda #$00 + adc fileptr+2 + pha + phx + psl cliphandle + psl #$00 + psl cliphandle + _GetHandleSize + tll $2802 ;_PtrToHand + plp + clc + rts + +:err jsr memfull + plp + sec + rts + + mx %00 +initedit php + rep $30 + stz findstr + stz replacestr + stz cliphandle + stz cliphandle+2 + lda editlen + sta flen + stz pos + stz pos1 + stz linebuff + stz position + stz eof + stz dirty + stz selecting + lda #$FFFF + sta selstart + sta selend + sta selstart + sta selend + stz termcv + stz termch + + pha + psl #$00 + tll $130C + pll textdevice + pla + sta texttype + + pha + pha + tll $0D0C + pla + sta textor + pla + sta textand + + pea $01 ;pascal... + psl #$03 ;turn on 80 column + tll $100c + pea $01 + tll $150c + + pea $02 + psl #textdriver + tll $100C ;setoutputdevice + + pea $FF + pea $80 + tll $0A0C + + jsl clrscreen + jsr editscreen + + stz termcv + stz termch + sta oflag + + lda #$FFFF + sta sof + jsl setch + + jsr checkload + + lda linenum + sta gotolnum + jsr gotoline + + sep $20 + ldal $E0C029 + and #$7F + stal $E0C029 + rep $20 + plp + rts + +*------------------------------------------------------ +savebuff + +]y1 equ workspace +]y2 equ ]y1+2 +]len equ ]y2+2 +]where equ ]len+2 +]len1 equ ]where+2 + + php + rep $30 + lda dirty + bne :save + plp + rts +:save sec + ror alldirty + lda linebuff + and #$00FF + sta ]len1 + bne :tax + lda #$0D01 + sta linebuff + and #$00FF + sta ]len1 +:tax tax + lda linebuff,x + and #$7F + cmp #$0D + beq :olen + cpx #$FF + beq :noinc + inx +:noinc lda #$0D + sta linebuff,x + txa + and #$00FF + sta ]len1 +:olen lda oldlen + and #$00FF + sta oldlen + lda ]len1 + sec + sbc oldlen + jeq :replace + jcs :bigger +:smaller lda position + clc + adc oldlen + sta ]len + lda flen + sec + sbc ]len + dec + sta ]y2 + lda oldlen + sec + sbc ]len1 + and #$00FF + sta ]y1 + lda flen + sec + sbc ]y1 + sta flen + sep $20 + lda fileptr+2 + sta :mvn+1 + sta :mvn+2 + rep $20 + ldx ]len + lda position + clc + adc ]len1 + tay + lda ]y2 + cmp #$FFFF + jeq :replace + phb +:mvn mvn $00,$00 + plb + jmp :replace +:bigger and #$00FF + sta ]y1 ;num of bytes to move + lda position + cmp flen + jeq :add + clc + adc oldlen + sta ]y2 ;temp + lda flen + sec + sbc ]y2 +* dec + sta ]y2 ;for mvp call + sep $20 + lda fileptr+2 + sta :mvp+1 + sta :mvp+2 + rep $20 + ldx flen + txa + clc + adc ]y1 + bcs :memerr + sta flen + tay + lda ]y2 + phb +:mvp mvp $00,$00 + plb + jmp :replace +:memerr jsr memfull + jmp :xit +:add lda ]y1 + clc + adc flen + bcs :memerr + sta flen +:replace rep $30 + sep $20 + lda #^linebuff + sta :mvn1+2 + lda fileptr+2 + sta :mvn1+1 + rep $20 + lda ]len1 + and #$00FF + beq :xit + dec + ldx #linebuff+1 + ldy position + phb +:mvn1 mvn $00,$00 + plb +:xit rep $30 + jsr drawmem + jsr setfflags + stz dirty + plp + rts + +getbuff php + rep $30 + stz oldlen + lda eof + jne :newline +:main ldy position + cpy flen + bge :newline + ldx #$00 + sep $20 +:loop lda [fileptr],y + sta linebuff+1,x + and #$7F + iny + inx + cmp #$0D + beq :next + cpx #$FF + bge :next1 + cpy flen + blt :loop + jmp :next +:next1 ldx #$FF +:next txa + sta linebuff + lda linebuff,x + and #$7F + cmp #$0D + beq :plp + lda linebuff + cmp #$FF + bge :stacr + inx + inc linebuff +:stacr lda #$0D + sta linebuff,x +:plp lda linebuff + sta oldlen + stz dirty + stz dirty+1 + plp + rts + mx %00 +:newline lda #$0D01 + sta linebuff + stz oldlen + stz dirty + plp + rts + mx %00 + +setrange php + rep $30 + lda selstart + cmp selend + beq :couldbe + bge :off +:couldbe lda position + cmp selstart + blt :off + cmp selend + beq :on + bge :off +:on + stz selectflag + plp + rts +:off lda #$80 + sta selectflag +* stz selecting + plp + rts + +setfflags php + rep $30 + stz eof + stz sof + lda position + bne :seof + dec sof +:seof cmp flen + blt :plp + dec eof +:plp plp + rts + +backptr php + rep $30 + stz sof + stz eof + stz :crflag + ldy position + bne :move +:sof jmp :plp + +:move sep $20 + +]loop dey + cpy #$FFFF + beq :endxit + lda [fileptr],y + and #$7F + cmp #$0D + beq :cr +:first sec + ror :crflag + jmp ]loop +:cr bit :crflag + bpl :first +:endxit iny +:xit sty position +:plp rep $30 + lda position + bne :qeof + ldy #$FFFF + sty sof +:qeof cmp flen + blt :plp1 + lda #$FFFF + sta eof +:plp1 plp + rts +:crflag ds 2 + mx %00 + + + do 1 +gotoline php + rep $30 + lda #$01 + sta :line + stz position + stz :offset + stz :ct + ldy #$00 +:nline rep $30 + lda :offset + asl + tax + lda position + sta :array,x + inc :offset + inc :ct + lda :offset + cmp #12 + blt :gline + stz :offset +:gline lda :line + cmp gotolnum + bge :done + sep $20 +]lup lda [fileptr],y + and #$7f + cmp #$0d + beq :eoln + iny + cpy flen + blt ]lup + bra :done +:eoln iny + sty position + inc :line + bne :nline + inc :line+1 + bra :nline +:done rep $30 + stz termch + stz pos + lda :line + sta linenum + lda position + sta :pos + lda :ct + cmp #12 + blt :garray +]sbc cmp #12 + blt :goffset + sec + sbc #12 + jmp ]sbc +:goffset inc + cmp #12 + blt :asl + lda #$00 +:asl asl + tax + lda :array,x + sta position + lda #10 + sta termcv + jmp :set + +:garray dec + sta :offset + lda #$00 + asl + tax + lda :array,x + sta position + lda :offset + sta termcv +:set jsl setch + jsr drawcpos + + jsr drawscreen + stz eof + stz sof + lda :pos + sta position + cmp #$00 + bne :seof + dec sof +:seof cmp flen + blt :gbuff + dec eof +:gbuff jsr getbuff + jsr drawline + jsr poscurs + plp + rts + +:line ds 2 +:offset ds 2 +:ct ds 2 +:array ds 24*2,0 +:pos ds 2 + + + else +gotoline php + rep $30 + stz eof + stz position + lda position + cmp flen + bne :stz + lda #$ffff + sta eof +:stz stz position + stz :offset + stz :ct + lda #$01 + sta sof + sta :line +]lup lda :offset + asl + tax + lda position + sta :array,x + inc :offset + inc :ct + lda :offset + cmp #12 + blt :gline + stz :offset +:gline lda :line + cmp gotolnum + bge :done + lda eof + bne :done + jsr foreptr + inc :line + jmp ]lup +:done + stz termch + stz pos + lda :line + sta linenum + lda position + sta :pos + lda :ct + cmp #12 + blt :garray +]sbc cmp #12 + blt :goffset + sec + sbc #12 + jmp ]sbc +:goffset inc + cmp #12 + blt :asl + lda #$00 +:asl asl + tax + lda :array,x + sta position + lda #10 + sta termcv + jmp :set + +:garray dec + sta :offset + lda #$00 + asl + tax + lda :array,x + sta position + lda :offset +* clc +* adc #$02 + sta termcv +:set jsl setch + jsr drawcpos + + jsr drawscreen +* jsr showch +* jsr showcv + stz eof + stz sof + lda :pos + sta position +* cmp #$00 + bne :seof + dec sof +:seof cmp flen + blt :gbuff + dec eof +:gbuff jsr getbuff + jsr drawline + jsr poscurs + plp + rts + +:line ds 2 +:offset ds 2 +:ct ds 2 +:array ds 24*2,0 +:pos ds 2 + fin + +gotolable php + rep $30 + lda glabstr + and #$ff + jeq :gbuff + sta :len + stz eof + stz position +* lda position + lda flen + bne :stz + lda #$ffff + sta eof +:stz stz position + stz :offset + stz :ct + lda #$01 + sta sof + sta :line +]lup lda :offset + asl + tax + lda position + sta :array,x + inc :offset + inc :ct + lda :offset + cmp #12 + blt :gline + stz :offset +:gline lda :line + cmp gotolnum + bge :done + lda eof + bne :done + ldx #$01 + ldy position + sep $20 +]cmp lda [fileptr],y + and #$7f + cmp #'a' + blt :l1 + cmp #'z'+1 + bge :l1 + and #$5f +:l1 cmp glabstr,x + bne :no + iny + inx + cpy flen + bge :done + cpx :len + blt ]cmp + beq ]cmp + jmp :done +:no rep $30 + jsr foreptr + inc :line + jmp ]lup +:done rep $30 + stz termch + stz pos + lda :line + sta linenum + lda position + sta :pos + lda :ct + cmp #12 + blt :garray +]sbc cmp #12 + blt :goffset + sec + sbc #12 + jmp ]sbc +:goffset inc + cmp #12 + blt :asl + lda #$00 +:asl asl + tax + lda :array,x + sta position + lda #10 + sta termcv + jmp :set + +:garray dec + sta :offset + lda #$00 + asl + tax + lda :array,x + sta position + lda :offset +* clc +* adc #$02 + sta termcv +:set jsl setch + jsr drawcpos + + jsr drawscreen +* jsr showch +* jsr showcv + stz eof + stz sof + lda :pos + sta position +* cmp #$00 + bne :seof + dec sof +:seof cmp flen + blt :gbuff + dec eof +:gbuff rep $30 + jsr getbuff + jsr drawline + jsr poscurs + plp + rts +:len ds 2 +:line ds 2 +:offset ds 2 +:ct ds 2 +:array ds 24*2,0 +:pos ds 2 + + +gotopos php + rep $30 + stz eof + stz position +* lda position + lda flen + bne :stz + lda #$ffff + sta eof +:stz stz position + stz :offset + stz :ct + lda #$01 + sta sof + sta :line +]lup lda :offset + asl + tax + lda position + sta :array,x + inc :offset + inc :ct + lda :offset + cmp #12 + blt :gline + stz :offset +:gline lda position + cmp gotoposition + bge :done + lda eof + bne :done + jsr foreptr + inc :line + jmp ]lup +:done + stz termch + stz pos + lda :line + sta linenum + lda position + sta :pos + lda :ct + cmp #12 + blt :garray +]sbc cmp #12 + blt :goffset + sec + sbc #12 + jmp ]sbc +:goffset inc + cmp #12 + blt :asl + lda #$00 +:asl asl + tax + lda :array,x + sta position + lda #10 + sta termcv + jmp :set + +:garray dec + sta :offset + lda #$00 + asl + tax + lda :array,x + sta position + lda :offset +* clc +* adc #$02 + sta termcv +:set jsl setch + jsr drawcpos + + jsr drawscreen +* jsr showch +* jsr showcv + stz eof + stz sof + lda :pos + sta position +* cmp #$00 + bne :seof + dec sof +:seof cmp flen + blt :gbuff + dec eof +:gbuff jsr getbuff + jsr drawline + jsr poscurs + plp + rts + +:line ds 2 +:offset ds 2 +:ct ds 2 +:array ds 24*2,0 +:pos ds 2 + + + +foreptr php + rep $30 + stz eof + stz sof + ldy position + cpy flen + bge :plp + ldx #$00 + sep $20 +:loop lda [fileptr],y + and #$7F + iny + inx + cmp #$0D + beq :cr + cpx #$100 + bge :cr + cpy flen + blt :loop + jmp :cr +:cr sty position +:plp rep $30 + lda position + bne :qeof + ldy #$FFFF + sty sof +:qeof cmp flen + blt :plp1 + lda #$FFFF + sta eof +:plp1 plp + rts + mx %00 +:pos ds 2 + +drawscreen php + rep $30 +* lda flen +* bne :sta +* plp +* rts +:sta lda position + sta :pos + lda termcv + sta :cv + stz termcv + jsl setch + jsr setfflags + lda eof + bne :done +:main ldy position + ldx #$00 + cpy flen + bge :docr + sep $20 +:loop lda [fileptr],y + sta linebuff+1,x + and #$7F + iny + inx + cmp #$0D + beq :next + cpx #$100 + bge :next1 + cpy flen + blt :loop +:docr sep $20 + lda #$0D + sta linebuff+1,x + inx + jmp :next +:next1 ldx #$FF +:next txa + sta linebuff + rep $30 + jsr drawline + lda termcv + inc + sta termcv + cmp #22 + bge :done + jsl setch + bit eof + bmi :done + jsr foreptr + jmp :main +:done sep $20 + lda termcv + cmp #22 + bge :done1 + jsl setch + ldy #$00 +]clr lda #" " + phy + jsl storchar + ply + iny + cpy #right + blt ]clr + lda termcv + inc + sta termcv + jmp :done +:done1 lda :cv + sta termcv + jsl setch + rep $30 + lda :pos + sta position + jsr setfflags + jsr getbuff + plp + rts +:pos ds 2 +:cv ds 2 + +updatescreen php + rep $30 +:sta lda position + sta :pos + lda termcv + sta :cv + jsl setch + jsr setfflags + lda flen + jeq :done + lda eof + bne :done +:main ldy position + ldx #$00 + cpy flen + bge :docr + sep $20 +:loop lda [fileptr],y + sta linebuff+1,x + and #$7F + iny + inx + cmp #$0D + beq :next + cpx #$100 + bge :next1 + cpy flen + blt :loop +:docr sep $20 + lda #$0D + sta linebuff+1,x + inx + jmp :next +:next1 ldx #$FF +:next txa + sta linebuff + rep $30 + jsr drawline + lda termcv + inc + sta termcv + cmp #22 + bge :done + jsl setch + bit eof + bmi :done + jsr foreptr + jmp :main +:done sep $20 + lda termcv + cmp #22 + bge :done1 + jsl setch + ldy #$00 +]clr lda #" " + phy + jsl storchar + ply + iny + cpy #right + blt ]clr + lda termcv + inc + sta termcv + jmp :done +:done1 lda :cv + sta termcv + jsl setch + rep $30 + lda :pos + sta position + jsr setfflags + plp + rts +:pos ds 2 +:cv ds 2 + + +drawline pha + phx + phy + php + sep $30 + jsr modify + jsr setrange + stz :litflag + ldy #$00 + sty :ch + sty :tabct + lda linebuff + jeq :xit + ldx #$07 + lda #$00 +]lup ora tabs,x + dex + bpl ]lup + ldx #$00 + cmp #$00 + jeq :normal + lda linebuff+1 + and #$7F + cmp #';' + jeq :docomment + cmp #'*' + jeq :normal + cmp #$0D + jeq :normal +:loop lda :ch + cmp #right + jge :xit + inx + cpx linebuff + blt :ok + beq :ok + jmp :xit +:ok lda linebuff,x + cmp #$A0 + beq :tab + and #$7F + cmp #';' + beq :comment + cmp #$09 + beq :tab + cmp #$27 + beq :literal + cmp #$22 + beq :literal + cmp #$0D + bne :ora + lda showcr + beq :loop + bit selectflag + bmi :ncr + lda #$46+$80 + bra :phx +:ncr lda #$4D+$80 + bra :phx +:ora cmp #$20 + blt :phx +* ora selectflag +:phx phx + ldy :ch + jsl storchar1 + plx +:incch inc :ch + jmp :loop +:literal pha + lda #$80 + eor :litflag + sta :litflag + pla + jmp :ora +:comment bit :litflag + bmi :cjmp + dex + lda linebuff,x + and #$7F + cmp #$20 + jeq :docomment + cmp #$09 + jeq :docomment + inx + lda #';' +:cjmp jmp :ora +:tab ldy :tabct + cpy #$08 + bge :space + inc :tabct + lda tabs,y + beq :space + cmp :ch + blt :space + beq :space + sta :tabval + ldy :ch + sta :ch +]lup cpy :tabval + blt :s1 + jmp :loop +:s1 lda #' ' +* ora selectflag + phy + jsl storchar1 + ply + iny + jmp ]lup +:space lda #$20 + jmp :ora +:xit sep $30 + ldy :ch + dey +]lup iny + cpy #right + bge :plp1 + lda #' ' +* ora selectflag + phy + jsl storchar1 + ply + jmp ]lup +:plp1 plp + ply + plx + pla + rts + +:docomment phx + ldx #$07 +:xloop lda tabs,x + beq :dext + cmp :ch + blt :space1 + beq :space1 + sta :tabval + ldy :ch + sta :ch +]lup cpy :tabval + blt :s11 + jmp :cplx +:s11 lda #' ' +* ora selectflag + phy + jsl storchar1 + ply + iny + jmp ]lup +:space1 lda #$20 +* ora selectflag + ldy :ch + jsl storchar1 + plx + phx + beq :cplx + lda linebuff,x + and #$7F + cmp #$20 + beq :cplx + cmp #$09 + beq :cplx +:dcinx inc :ch + jmp :cplx +:dext dex + bpl :xloop +:cplx plx + +:normal lda :ch + cmp #right + jge :xit + inx + cpx linebuff + blt :ok3 + beq :ok3 + jmp :xit +:ok3 lda linebuff,x + and #$7F + cmp #$0D + bne :nora + lda showcr + beq :normal + bit selectflag + bmi :nncr + lda #$46+$80 + bra :phx2 +:nncr lda #$4D+$80 + bra :phx2 +:nora cmp #$09 + bne :nora1 + lda #$20 +:nora1 cmp #$20 + blt :phx2 +* ora selectflag +:phx2 phx + ldy :ch + jsl storchar1 + plx + inc :ch + jmp :normal + +:ch ds 2 +:tabct ds 2 +:tabval ds 2 +:schar ds 2 +:litflag ds 2 + +modify php + sep $30 + lda #$A0 + sta :space + lda linebuff + jeq :mxit + lda #$00 + ldx #$07 +]lup ora tabs,x + dex + bpl ]lup + cmp #$00 + jeq :20 + lda linebuff+1 + and #$7F + cmp #'*' + jeq :20 + cmp #';' + beq :20 + stz :spacect + stz :spacect+1 + lda #$80 + sta :eorflag + ldx #$01 +]lup lda linebuff,x + and #$7F + cmp #$27 + beq :literal + cmp #$22 + beq :literal + cmp #$20 + bne :inx + lda :space + sta linebuff,x +:inx cmp #$A0 + beq :incsp + cmp #$09 + beq :incsp + cmp #';' + bne :inx1 + bit :space + bpl :inx1 + dex + beq :stz1 + lda linebuff,x + inx + and #$7F + cmp #$20 + beq :stz + cmp #$09 + beq :stz + jmp :inx1 +:incsp inc :spacect + ldy :spacect + cpy #$08 + bge :stz + lda tabs,y + bne :inx1 + bra :stz +:stz1 inx +:stz stz :eorflag + lda #$20 + sta :space +:inx1 inx + cpx linebuff + blt ]lup + beq ]lup + jmp :mxit +:literal pha + lda :space + eor :eorflag + sta :space + pla + jmp :inx +:20 ldx linebuff +]lup lda linebuff,x + and #$7F + cmp #$20 + bne :dex + sta linebuff,x +:dex dex + bne ]lup +:mxit plp + rts + +:char ds 2 +:space ds 2 +:spacect ds 2 +:eorflag ds 2 + +poscurs pha + phx + phy + php + sep $30 + jsr modify + stz :litflag + stz aval + stz aval+1 + ldy #$00 + sty :ch + sty :tabct + lda pos + cmp linebuff + blt :ldx + ldx linebuff + beq :stapos + lda linebuff,x + and #$7F + cmp #$0D + bne :stapos + dex +:stapos stx pos + +:ldx ldx pos + lda linebuff + jeq :xit + ldx #$07 + lda #$00 +]lup ora tabs,x + dex + bpl ]lup + ldx #$00 + cmp #$00 + jeq :normal + lda linebuff+1 + and #$7F + cmp #';' + jeq :docomment + cmp #'*' + jeq :normal + cmp #$0D + jeq :normal +:loop stz :incflag + inx + cpx pos + blt :lb + beq :lb + jmp :xit +:lb cpx linebuff + blt :ok + beq :ok + jmp :xit +:ok lda linebuff,x + cmp #$A0 + beq :tab + and #$7F + cmp #';' + beq :comment + cmp #$09 + beq :tab + cmp #$27 + beq :literal + cmp #$22 + beq :literal +:ora +:space +:incch inc :ch + jmp :loop +:literal pha + lda #$80 + eor :litflag + sta :litflag + pla + jmp :ora +:comment bit :litflag + bmi :cjmp + dex + lda linebuff,x + and #$7F + cmp #$20 + jeq :docomment + cmp #$09 + jeq :docomment + inx + lda #';' +:cjmp jmp :ora +:tab cpx pos + blt :tab1 + bit :litflag + bmi :tab1 + inx + cpx linebuff + beq :chkcomm + bge :tab2 +:chkcomm lda linebuff,x + dex + and #$7F + cmp #';' + bne :tab1 + sec + ror :incflag + jmp :docomment +:tab2 dex +:tab1 ldy :tabct + cpy #$08 + bge :space + inc :tabct + lda tabs,y + beq :space + cmp :ch + blt :space + beq :space + sta :ch + jmp :loop + +:xit stx pos1 + rep $30 + lda :ch + and #$00FF + cmp #right + blt :s + lda #right-1 +:s sta termch + lda termcv + jsl setch + plp + ply + plx + pla + rts + mx %11 + +:docomment phx + ldx #$07 +:xloop lda tabs,x + beq :dext + cmp :ch + blt :space1 + beq :space1 + sta :ch + sta aval + jmp :cplx +:space1 plx + phx + beq :cplx + lda linebuff,x + and #$7F + cmp #$20 + beq :cplx1 + cmp #$09 + bne :dcinx +:cplx1 bit :incflag + bpl :cplx +:dcinx inc :ch + jmp :cplx +:dext dex + bpl :xloop +:cplx plx + +:normal inx + cpx pos + blt :ok3 + beq :ok3 + jmp :xit +:ok3 lda linebuff,x + and #$7F + inc :ch + jmp :normal + +:ch ds 2 +:tabct ds 2 +:tabval ds 2 +:schar ds 2 +:litflag ds 2 +:incflag ds 2 + +setpos pha + phx + phy + php + sep $30 + jsr modify + stz :litflag + stz aval + stz aval+1 + lda #$FF + sta pos + ldy #$00 + sty :ch + sty :tabct + lda pos + cmp linebuff + blt :ldx + ldx linebuff + beq :stapos + lda linebuff,x + and #$7F + cmp #$0D + bne :stapos + dex +:stapos stx pos + +:ldx ldx pos + lda linebuff + jeq :xit + ldx #$07 + lda #$00 +]lup ora tabs,x + dex + bpl ]lup + ldx #$00 + cmp #$00 + jeq :normal + lda linebuff+1 + and #$7F + cmp #';' + jeq :docomment + cmp #'*' + jeq :normal + cmp #$0D + jeq :normal +:loop stz :incflag + lda :ch + cmp oldch + blt :i1 + jmp :xit +:i1 inx + cpx pos + blt :lb + beq :lb + jmp :xit +:lb cpx linebuff + blt :ok + beq :ok + jmp :xit +:ok lda linebuff,x + cmp #$A0 + beq :tab + and #$7F + cmp #';' + beq :comment + cmp #$09 + beq :tab + cmp #$27 + beq :literal + cmp #$22 + beq :literal +:ora +:space +:incch inc :ch + jmp :loop +:literal pha + lda #$80 + eor :litflag + sta :litflag + pla + jmp :ora +:comment bit :litflag + bmi :cjmp + dex + lda linebuff,x + and #$7F + cmp #$20 + jeq :docomment + cmp #$09 + jeq :docomment + inx + lda #';' +:cjmp jmp :ora +:tab cpx pos + blt :tab1 + bit :litflag + bmi :tab1 + inx + cpx linebuff + beq :chkcomm + bge :tab2 +:chkcomm lda linebuff,x + dex + and #$7F + cmp #';' + bne :tab1 + sec + ror :incflag + jmp :docomment +:tab2 dex +:tab1 ldy :tabct + cpy #$08 + bge :space + inc :tabct + lda tabs,y + beq :space + cmp :ch + blt :space + beq :space + sta :ch + jmp :loop + +:xit stx pos1 + stx pos + rep $30 + lda :ch + and #$00FF + cmp #right + blt :s + lda #right-1 +:s sta termch + lda termcv + jsl setch + plp + ply + plx + pla + rts + mx %11 + +:docomment phx + ldx #$07 +:xloop lda tabs,x + beq :dext + cmp :ch + blt :space1 + beq :space1 + sta :ch + sta aval + jmp :cplx +:space1 plx + phx + beq :cplx + lda linebuff,x + and #$7F + cmp #$20 + beq :cplx1 + cmp #$09 + bne :dcinx +:cplx1 bit :incflag + bpl :cplx +:dcinx inc :ch + jmp :cplx +:dext dex + bpl :xloop +:cplx plx + +:normal lda :ch + cmp oldch + blt :norm1 + jmp :xit +:norm1 inx + cpx pos + blt :ok3 + beq :ok3 + jmp :xit +:ok3 lda linebuff,x + and #$7F + inc :ch + jmp :normal + +:ch ds 2 +:tabct ds 2 +:tabval ds 2 +:schar ds 2 +:litflag ds 2 +:incflag ds 2 + +oldch ds 2 + +tabs dfb 12,18,30,0,0,0,0,0,0,0,0,0,0 ;no tabs >= right +tabs1 dfb 12,18,30,0,0,0,0,0,0,0,0,0,0 ;no tabs >= right + asc 'TABS' +dtabs dfb 12,18,30,0,0,0,0,0,0,0,0,0,0 ;no tabs >= right +tabstemp ds 16,0 + +*------------------------------------------------------ +getkey php + rep $30 + stz emod + lda termch + tay + jsl pickchar + sta :char + stz :on +:loop jsr :invert + lda #$04 + sta :ct1 +:key2 lda #$80 + sta :ct +:key + do mouse + jsr mousekey ;optional mouse control + fin + + bmi :xit + jsl keyscan + bpl :dec + cmp #$89 ;tab? + bne :xit + lda #$a0 + jmp :xit +:dec rep $20 + dec :ct + bne :key + bit emstarted + bmi :loop + dec :ct1 + bne :key2 + jmp :loop +:xit pha + lda termch + tay + lda :char + jsl storchar + pla + plp + rts +:invert bit :on + bpl :block + lda termch + tay + lda :char + bit selecting + bmi :s1 + jsl storchar +:s1 stz :on + rts +:block lda cursor + ora #$80 + cmp #"_" + bne :block1 + lda termch + tay + lda #"_" + bit selecting + bmi :s2 + jsl storchar +:s2 sec + ror :on + rts +:block1 bit selecting + bmi :s3 + jsl invert +:s3 sec + ror :on + rts + +:char ds 2 +:ct ds 2 +:on ds 2 +:ct1 ds 2 + +*------------------------------------------------------ +initmouse + do mouse ;no mouse at this time! + php + rep $30 + bit emstarted + bpl :nomouse + pea $80 + pea $80 + tll $1e03 + plp + rts +:nomouse pea $80 + pea $80 + tll $1e03 + plp + rts + +mousekey php + rep $30 + stz mousecr + pha + pha + pha + tll $1703 + pla + sta mousestat + pla + sta mouseypos + pla + sta mousexpos + jcs :nomouse +:x lda mousexpos + cmp #$70 + blt :left + cmp #$90 + bge :right + lda mouseypos + cmp #$70 + blt :up + cmp #$90 + bge :down + lda mousestat + bit #$8000 + bne :mdown0 +* stz mouselast + jmp :nomouse +:mdown0 sep $20 + ldal $e0c030 + rep $20 + lda mouselast + beq :nomouse + and #$7f + ora #$80 + jmp :keyxit +:left lda #$08+$80 + stz mouselast + jmp :keyxit +:right lda #$15+$80 + stz mouselast + jmp :keyxit +:up lda #$0b+$80 + sta mouselast + jmp :keyxit +:down lda #$0a+$80 + sta mouselast + jmp :keyxit +:keyxit and #$ff + pha + lda mousestat + bmi :pla +* jsr initmouse +:pla pla +:kx1 and #$ff + plp + sep $80 + rts +:nomouse + pha + lda mousestat + bmi :pla1 +* jsr initmouse +:pla1 pla + plp + rep $80 + rts + +mouseypos ds 2 +mousexpos ds 2 +mousestat ds 2 +mouselast ds 2 +mousecr ds 2 +mousecrchar ds 2 + + else + rts ;--- no mouse control --- + fin +*------------------------------------------------------ +showcv php + rep $30 + lda andflag + pha + lda orflag + pha + stz orflag + lda #$7f + sta andflag + psl #linenum + pea #$0000 ;was 8000 + jsl printdec + pla + sta orflag + pla + sta andflag + plp + rts + +showch php + rep $30 + lda termch + pha + inc + sta termch + lda andflag + pha + lda orflag + pha + stz orflag + lda #$7f + sta andflag +:psl psl #termch + pea $0000 + jsl printdec + pla + sta orflag + pla + sta andflag + pla + sta termch + plp + rts + +print php + phb + phk + plb + sep $30 + lda termch + sta :ch + lda termcv + sta :cv + lda 5,s ; get bank of data + pha + plb + ldy #$01 ; add 1 to return address + lda (3,s),y + sta termch + iny + lda (3,s),y + sta termcv + iny + sep $30 + jsl setch + ldy #$03 +:loop lda (3,s),y ; get a character to print + beq :fix ; 0 = end of string + phy + ldy termch + pha + and #$7f + cmp #'N'&$1f + beq :normal + cmp #'O'&$1f + bne :pla + stz orflag + lda #$7f + sta andflag + jmp :pla1 +:normal lda #$7f + sta andflag + lda #$80 + sta orflag +:pla1 pla + jmp :ply +:pla pla + and andflag + ora orflag + cmp #$40 + blt :s + cmp #$60 + bge :s + sec + sbc #$40 +:s jsl storchar ; print ascii character + inc termch +:ply ply + iny ; y = y + 1 + bra :loop ; next character + +:fix rep $30 + tya + sta :len + lda 3,s ; get low word of return address + clc + adc :len ; add to length of string + sta 3,s ; put back in place + sep $30 + lda :cv + sta termcv + lda :ch + sta termch + jsl setch + plb + plp + rtl + +:len hex 0000 +:ch ds 2 +:cv ds 2 + +*------------------------------------------------------ +editscreen php + sep $30 + stz mych + lda #$17 + sta mycv + jsl textbascalc + ldy #$00 +]lup lda #' ' + jsr textstore + iny + cpy #80 + blt ]lup + + jsr drawtabs + jsr drawbottom + jsr drawcpos + jsr drawmem + + plp + rts + +drawbottom php + sep $30 + lda termch + pha + lda termcv + pha + jsr drawfname + jsr drawname + jsr drawcpos + jsr drawscroll + pla + sta termcv + pla + sta termch + jsl setch + plp + rts + +drawscroll rts ;lda #$02 + sta termcv + jsl setch + ldy #right + lda #$D2-$80 + jsl storchar +]lup lda termcv + inc + cmp #21 + bge :end + sta termcv + jsl setch + ldy #right + lda #$D6-$80 + jsl storchar + jmp ]lup +:end sta termcv + jsl setch + lda #$D1-$80 + ldy #right + jsl storchar + rts + +showpath rts ;php + sep $30 + jsl print + hex 0000 + asc "File: ",00 + stz mycv + lda #$06 + sta mych + jsl textbascalc + rep $30 + lda getname + and #$00FF + bne :n + psl #:nonestr + jmp :d +:n psl #getname +:d jsl drawstr + plp + rts +:nonestr str 'None' + mx %11 + + +drawfname rts ;php + sep $30 + jsl print + hex 0000 + asc "File: ",00 + stz mycv + lda #$06 + sta mych + jsl textbascalc + rep $30 + lda efilename + and #$00FF + bne :n + psl #:nonestr + jmp :d +:n psl #efilename +:d jsl drawstr + plp + rts +:nonestr str 'None' + mx %11 + +drawname rts ;php + jsl print + hex 1e00 + asc "*** QuickEDIT ***",00 + plp +drawesc rts ;php + jsl print + hex 3f00 + asc "Escape: CDA Menu",00 + plp + rts + +drawesccan rts ;php + sep $30 + jsl print + hex 3c00 + asc " Escape: Edit",00 + plp + rts + +drawesccan1 rts ;php + sep $30 + jsl print + hex 3c00 + asc " Escape: Cancel",00 + plp + rts + +drawcpos php + rep $30 + lda #$7f + sta andflag + stz orflag + + lda dirty + bne :plus + jsl print + hex 0017 + asc " Line:",00 + jmp :sep +:plus jsl print + hex 0017 + asc "+Line:",00 +:sep + sep $20 + lda #$06 + sta mych + lda #23 + sta mycv + rep $20 + jsl textbascalc + jsr showcv + sep $20 + lda mych + sta :ch + lda mycv + sta :ch+1 + rep $20 + jsl print +:ch hex 0000 + asc " Col:",00 + lda :ch + clc + adc #06 + sta mych + jsl textbascalc + jsr showch + lda #' ' + jsl drawchar + lda #' ' + jsl drawchar + lda #' ' + jsl drawchar + + do 0 + lda selecting + jsl tprbytel + lda #' ' + jsl drawchar + lda selectflag + jsl prbyte + lda #' ' + jsl drawchar + lda selstart + jsl tprbytel + lda #' ' + jsl drawchar + lda selend + jsl tprbytel + + lda #' ' + jsl drawchar + lda flen + jsl tprbytel + + lda #' ' + jsl drawchar + lda #' ' + jsl drawchar + lda #' ' + jsl drawchar + fin + + lda #$80 + sta orflag + plp + rts + +drawmem php + rep $30 + stz orflag + lda #$0000 + sec + sbc flen + sta :size + lda #$01 + sbc #$00 + sta :size+2 + lup 10 + lsr :size+$2 + ror :size + --^ + psl :size + psl #:str + pea $04 + pea $00 + tll $270B + sep $30 + ldy #$00 +]lup lda :str,y + ora #$80 + sta :str,y + iny + cpy #$07 + blt ]lup + + jsl print + hex 4317 +:str ds 4,0 + asc "K Avail.",00 + lda #$80 + sta orflag + plp + rts +:size ds 4 + +drawtabs php + sep $30 + lda termch + pha + lda termcv + pha + stz termch + lda #$16 ;#$01 + sta termcv + jsl setch + ldy #$00 + lda #'-' + jsl storchar + ldy #$01 +]lup sty :ct + ldx #$00 +:which lda tabs,x + beq :inx + cmp :ct + beq :yes +:inx inx + cpx #$08 + blt :which + lda #'-' + jmp :ldy +:yes lda #'|' +:ldy ldy :ct + jsl storchar + ldy :ct + iny + cpy #right + blt ]lup + ldy #right-1 + lda #'-' + jsl storchar + pla + sta termcv + pla + sta termch + jsl setch + plp + rts +:ct ds 2 + mx %00 + + do debug +showinfo php + rep $30 + sep $20 + stz mych + lda #23 + sta mycv + rep $20 + jsl textbascalc + lda flen + jsl tprbytel + lda #' ' + jsl drawchar + lda linebuff + and #$00FF + jsl prbyte + lda oldlen + jsl prbyte + lda #' ' + jsl drawchar + lda position + jsl tprbytel + lda #' ' + jsl drawchar + lda pos + jsl prbyte + lda pos1 + jsl prbyte + + lda #' ' + jsl drawchar + + lda aval + jsl tprbytel +* lda xval +* jsl tprbytel +* lda yval +* jsl tprbytel + + jsl setch + plp + rts + fin + +***** RAM based TEXT driver for editor ***** +* (faster than GS text tools...but still compatible with them!) + +textdriver + jmp textinit ;needed entry vectors + jmp textread + jmp textwrite + jmp textstatus + jmp textcontrol + +textinit php + phb + phd + phk + plb + rep $30 + lda editdp + tcd + stz mych + stz mycv + lda mycv + asl + tax + lda scrtbl,x + sta base + jsl clrscreen + pld + plb + plp + rtl + +textwrite php + phb + phd + phk + plb + rep $30 + lda editdp + tcd + sep $20 + sta :char + and #$7F + cmp #$20 + bge :normal + jmp :control +:normal lda mych + and #$00FF + tay + lda :char + and andflag + ora orflag + jsr textstore + inc mych + lda mych + cmp #80 + blt :r + stz mych + inc mycv + lda mycv + cmp #24 + blt :r + lda #23 + sta mycv + rep $30 + jsl scroll + lda mycv + asl + tax + lda scrtbl,x + sta base +:r pld + plb + plp + rtl + + mx %10 +:control cmp #$0D + beq :cr + jmp :r +:cr + stz mych + sep $20 + inc mycv + lda mycv + cmp #24 + blt :crn + lda #23 + sta mycv + rep $30 + jsl scroll +:crn rep $30 + lda mycv + and #$00FF + asl + tax + lda scrtbl,x + sta base + jmp :r +:char ds 2 +:basl ds 2 + +andflag dw $7f +orflag dw $80 + +textread rtl +textcontrol rtl +textstatus php + rep $30 + lda #$00 + plp + clc + rtl + +textstore phy + php + phb + rep $30 + sty :y + sei + ldy basl + phy + ldy base + sty basl + sep $30 + ldy :y + pea $0000 + plb + plb + pha ;save the character + tya ;get character position + lsr ;divide by 2 + tay ;restore screen pos + bcs :storeit ;if so, then ok + pea $0101 + plb + plb +:storeit pla ;get char to store + cmp #$40 + blt :ok + cmp #$60 + bge :ok + sec + sbc #$40 +:ok sta (basl),y ;put char on screen + rep $30 + ply + sty basl + plb + plp + ply + rts ;return + +:y ds 2 + +textbascalc + phx + php + rep $30 + lda mycv + and #$00FF + asl + tax + lda scrtbl,x + sta base + plp + plx + rtl + +*-----------------------------------------------* +* Name : BASCALC * +* Function : CALC BASE ADDR FOR SCREEN LINE * +* Input : AC=CV * +* Output : BASL/BASH * +* Volatile : NOTHING * +* Calls : NONE * +*-----------------------------------------------* + +bascalc + pha + phx + php + rep $30 + and #$00FF + asl + tax ;get index for line # + lda scrtbl,x ;get l.o. byte + sta basl ;store in basl + plp ;restore interupts + plx + pla ;restore a-reg + rtl ;return to caller + mx %11 + +*-----------------------------------------------* +* Name : STORCHAR * +* Function : STORE A CHAR ON SCREEN * +* Input : AC=CHAR * +* Y=CH POS * +* Output : CHAR ON SCREEN * +* Volatile : NOTHING * +* Calls : NONE * +*-----------------------------------------------* + +storchar + phb + phx + phy + php + sep $30 + pea $0000 + plb + plb + pha ;save the character + tya ;get character position + lsr ;divide by 2 + tay ;restore screen pos + bcs :storeit ;if so, then ok + pea $0101 + plb + plb +:storeit pla ;get char to store +* andl andflag +* oral orflag + sta (basl),y ;put char on screen + plp + ply + plx + plb + rtl ;return + +storchar1 + phb + phx + phy + php + sep $30 + pea $0000 + plb + plb + pha ;save the character + tya ;get character position + lsr ;divide by 2 + tay ;restore screen pos + bcs :storeit ;if so, then ok + pea $0101 + plb + plb +:storeit pla ;get char to store + cmp #$4d+$80 + beq :sta2 + cmp #$46+$80 + beq :sta2 + cmp #$40 + blt :sta1 + cmp #$5f+1 + bge :sta1 +:sec sec + sbc #$40 + bra :sta1 +:sta2 and #$7f + bra :sta +:sta1 ora selectflag +:sta sta (basl),y ;put char on screen + plp + ply + plx + plb + rtl ;return + +*-----------------------------------------------* +* Name : PICKCHAR * +* Function : GET A CHAR FROM SCREEN * +* Input : Y=CH POSITION * +* Output : AC=CHAR * +* Volatile : NOTHING * +* Calls : NONE * +*-----------------------------------------------* + +pickchar + phx + phy + php + phb + sep $30 + pea $0000 + plb + plb + tya ;get character position + lsr ;divide by 2 + tay ;restore screen pos + bcs :pickit ;if so, then ok + pea $0101 + plb + plb +:pickit lda (basl),y ;put char on screen + plb + plp + ply + plx + rtl ;return + +*-----------------------------------------------* +* Name : SETCH * +* Function : MOVE CURSOR TO CH/CV * +* Input : CH/CV * +* Output : CURSOR POSITION * +* Volatile : NOTHING * +* Calls : NONE * +*-----------------------------------------------* + +setch + pha ;save the a-reg + php + sep $30 + lda termch ;get our ch value + stal $57B ;store in 80 col ch + stal $24 +:chcont lda termcv ;get our cv value + stal $25 ;store in monitor cv + stal $5FB ;store in 80 col cv + jsl bascalc ;calculate base address + plp + pla ;restore a-reg + rtl ;return + +*-----------------------------------------------* +* Name : INVERT * +* Function : INVERT THE CHAR AT CH/CV * +* Input : NOTHING * +* Output : CHAR AT CH/CV INVERTED * +* Volatile : NOTHING * +* Calls : PICKCHAR, STORCHAR * +*-----------------------------------------------* + +invert + phb + pha ;save the a-reg + phy ;save the y-reg + phx + php + sep $30 + pea $0000 + plb + plb + lda termch + tay + jsl pickchar ;get char at cursor + cmp #$46 + beq :cr1 + cmp #$4D + beq :cr + cmp #$80 + bge :inv + cmp #$20 + bge :normal + clc + adc #$40 +:normal ora #$80 ;convert to normal char + bne :stuffit +:inv and #$7F ;convert to inverse char + cmp #$60 + bge :stuffit + cmp #$40 + blt :stuffit + sec + sbc #$40 +:stuffit jsl storchar ;put it back + plp + plx + ply ;get y value + pla ;restore a-reg + plb + rtl ;return + +:cr lda #$46 + bra :stuffit +:cr1 lda #$4D + bra :stuffit + +*====================================================== +scroll ;fast scroll routine + phy + php + phb + rep $30 + ldy #$26 ;get ready for each column +:start pea $0101 + plb + plb + lda $480,y + sta $400,y + lda $500,y + sta $480,y + lda $580,Y ;scroll one column + sta $500,Y + lda $600,Y + sta $580,Y + lda $680,Y + sta $600,Y + lda $700,Y + sta $680,Y + lda $780,Y + sta $700,Y + lda $428,Y + sta $780,Y + lda $4A8,Y + sta $428,Y + lda $528,Y + sta $4A8,Y + lda $5A8,Y + sta $528,Y + lda $628,Y + sta $5A8,Y + lda $6A8,Y + sta $628,Y + lda $728,Y + sta $6A8,Y + lda $7A8,Y + sta $728,Y + lda $450,Y + sta $7A8,Y + lda $4D0,Y + sta $450,Y + lda $550,Y + sta $4D0,Y + lda $5D0,Y + sta $550,Y + lda $650,Y + sta $5D0,Y + lda $6D0,Y + sta $650,Y + lda selecting + bmi :inv1 + pea #$A0A0 + pla + bra :sta1 +:inv1 pea #$2020 + pla +:sta1 sta $6D0,Y + pea $0000 + plb + plb +:lda2 + lda $480,y + sta $400,y + lda $500,y + sta $480,y + lda $580,Y ;scroll an odd column + sta $500,Y + lda $600,Y + sta $580,Y + lda $680,Y + sta $600,Y + lda $700,Y + sta $680,Y + lda $780,Y + sta $700,Y + lda $428,Y + sta $780,Y + lda $4A8,Y + sta $428,Y + lda $528,Y + sta $4A8,Y + lda $5A8,Y + sta $528,Y + lda $628,Y + sta $5A8,Y + lda $6A8,Y + sta $628,Y + lda $728,Y + sta $6A8,Y + lda $7A8,Y + sta $728,Y + lda $450,Y + sta $7A8,Y + lda $4D0,Y + sta $450,Y + lda $550,Y + sta $4D0,Y + lda $5D0,Y + sta $550,Y + lda $650,Y + sta $5D0,Y + lda $6D0,Y + sta $650,Y + lda $750,Y + lda selecting + bmi :inv2 + pea #$A0A0 + pla + bra :sta2 +:inv2 pea #$2020 + pla +:sta2 sta $6D0,Y + dey ;decrement index + dey + bmi :exit ;if not done with screen.. + brl :start ;continue +:exit plb + plp ;restore flags + ply + rtl ;and return + +*------------------------------------------------------ +bscroll ;fast back scroll routine + phy + php + phb + rep $30 + ldy #$26 ;get ready for each column +:start pea $0101 + plb + plb + lda $650,Y ;scroll one column + sta $6D0,Y + lda $5D0,Y + sta $650,Y + lda $550,Y + sta $5D0,Y + lda $4D0,Y + sta $550,Y + lda $450,Y + sta $4D0,Y + lda $7A8,Y + sta $450,Y + lda $728,Y + sta $7A8,Y + lda $6A8,Y + sta $728,Y + lda $628,Y + sta $6A8,Y + lda $5A8,Y + sta $628,Y + lda $528,Y + sta $5A8,Y + lda $4A8,Y + sta $528,Y + lda $428,Y + sta $4A8,Y + lda $780,Y + sta $428,Y + lda $700,Y + sta $780,Y + lda $680,Y + sta $700,Y + lda $600,Y + sta $680,Y + lda $580,Y + sta $600,Y + lda $500,Y + sta $580,Y + lda $480,Y + sta $500,y + lda $400,y + sta $480,y + lda selecting + bmi :inv1 + pea #$A0A0 + pla + bra :sta1 +:inv1 pea #$2020 + pla +:sta1 sta $400,Y + pea $0000 + plb + plb +:lda2 + lda $650,Y ;scroll one column + sta $6D0,Y + lda $5D0,Y + sta $650,Y + lda $550,Y + sta $5D0,Y + lda $4D0,Y + sta $550,Y + lda $450,Y + sta $4D0,Y + lda $7A8,Y + sta $450,Y + lda $728,Y + sta $7A8,Y + lda $6A8,Y + sta $728,Y + lda $628,Y + sta $6A8,Y + lda $5A8,Y + sta $628,Y + lda $528,Y + sta $5A8,Y + lda $4A8,Y + sta $528,Y + lda $428,Y + sta $4A8,Y + lda $780,Y + sta $428,Y + lda $700,Y + sta $780,Y + lda $680,Y + sta $700,Y + lda $600,Y + sta $680,Y + lda $580,Y + sta $600,Y + lda $500,Y + sta $580,Y + lda $480,Y + sta $500,y + lda $400,y + sta $480,y + lda selecting + bmi :inv2 + pea #$A0A0 + pla + bra :sta2 +:inv2 pea #$2020 + pla +:sta2 sta $400,Y + dey ;decrement index + dey + bmi :exit ;if not done with screen.. + brl :start ;continue +:exit plb + plp ;restore flags + ply + rtl ;and return + +*====================================================== +clrscreen + phy + php + phb + rep $30 + ldy #$26 ;get ready for each column +:start pea $0101 + plb + plb + lda #$A0A0 + sta $7D0,Y + sta $750,Y + sta $6D0,Y + sta $650,Y + sta $5D0,Y + sta $550,Y + sta $4D0,Y + sta $450,Y + sta $7A8,Y + sta $728,Y + sta $6A8,Y + sta $628,Y + sta $5A8,Y + sta $528,Y + sta $4A8,Y + sta $428,Y + sta $780,Y + sta $700,Y + sta $680,Y + sta $600,Y + sta $580,Y + sta $500,Y + sta $480,Y + sta $400,Y ;clear it + pea #$0000 + plb + plb + sta $7D0,Y + sta $750,Y + sta $6D0,Y + sta $650,Y + sta $5D0,Y + sta $550,Y + sta $4D0,Y + sta $450,Y + sta $7A8,Y + sta $728,Y + sta $6A8,Y + sta $628,Y + sta $5A8,Y + sta $528,Y + sta $4A8,Y + sta $428,Y + sta $780,Y + sta $700,Y + sta $680,Y + sta $600,Y + sta $580,Y + sta $500,Y + sta $480,Y + sta $400,Y ;clear it + dey ;decrement index + dey + bmi :exit ;if not done with screen.. + brl :start ;continue +:exit plb + plp ;restore flags + ply + rtl ;and return + + put edit.apw + put edit.types + +*====================================================== +* Variable storage + +rtl rtl +asm rtl + +cursor dw "_" + + dum * ;reseved space in linker! + +automode ds 2 +asmpath ds 256 + +glabstr ds 30 + +editdp ds 2 + +findstr ds 32 +replacestr ds 32 + +linebuff ds 275 + +boxbuff ds 20*60 ;20 lines by 60 chars + + dend + + ent cursor + ent linenum + + sav obj/edit.l + diff --git a/src/edit/edit.types.s b/src/edit/edit.types.s new file mode 100644 index 0000000..5f557dc --- /dev/null +++ b/src/edit/edit.types.s @@ -0,0 +1,278 @@ + lst off + + do 1 +filetypelist + ASC 'NON' + ASC 'BAD' + ASC '$02' + ASC '$03' + ASC 'TXT' + ASC '$05' + ASC 'BIN' + ASC '$07' + ASC '$08' + ASC '$09' + ASC '$0A' + ASC '$0B' + ASC '$0C' + ASC '$0D' + ASC '$0E' + ASC 'DIR' + ASC '$10' + ASC '$11' + ASC '$12' + ASC '$13' + ASC '$14' + ASC '$15' + ASC 'PFS' + ASC '$17' + ASC '$18' + ASC 'ADB' + ASC 'AWP' + ASC 'ASP' + ASC '$1C' + ASC '$1D' + ASC '$1E' + ASC '$1F' + ASC '$20' + ASC '$21' + ASC '$22' + ASC '$23' + ASC '$24' + ASC '$25' + ASC '$26' + ASC '$27' + ASC '$28' + ASC '$29' + ASC '$2A' + ASC '$2B' + ASC '$2C' + ASC '$2D' + ASC '$2E' + ASC '$2F' + ASC '$30' + ASC '$31' + ASC '$32' + ASC '$33' + ASC '$34' + ASC '$35' + ASC '$36' + ASC '$37' + ASC '$38' + ASC '$39' + ASC '$3A' + ASC '$3B' + ASC '$3C' + ASC '$3D' + ASC '$3E' + ASC '$3F' + ASC '$40' + ASC '$41' + ASC '$42' + ASC '$43' + ASC '$44' + ASC '$45' + ASC '$46' + ASC '$47' + ASC '$48' + ASC '$49' + ASC '$4A' + ASC '$4B' + ASC '$4C' + ASC '$4D' + ASC '$4E' + ASC '$4F' + ASC '$50' + ASC '$51' + ASC '$52' + ASC '$53' + ASC '$54' + ASC '$55' + ASC '$56' + ASC '$57' + ASC '$58' + ASC '$59' + ASC '$5A' + ASC '$5B' + ASC '$5C' + ASC '$5D' + ASC '$5E' + ASC '$5F' + ASC '$60' + ASC '$61' + ASC '$62' + ASC '$63' + ASC '$64' + ASC '$65' + ASC '$66' + ASC '$67' + ASC '$68' + ASC '$69' + ASC '$6A' + ASC '$6B' + ASC '$6C' + ASC '$6D' + ASC '$6E' + ASC '$6F' + ASC '$70' + ASC '$71' + ASC '$72' + ASC '$73' + ASC '$74' + ASC '$75' + ASC '$76' + ASC '$77' + ASC '$78' + ASC '$79' + ASC '$7A' + ASC '$7B' + ASC '$7C' + ASC '$7D' + ASC '$7E' + ASC '$7F' + ASC '$80' + ASC '$81' + ASC '$82' + ASC '$83' + ASC '$84' + ASC '$85' + ASC '$86' + ASC '$87' + ASC '$88' + ASC '$89' + ASC '$8A' + ASC '$8B' + ASC '$8C' + ASC '$8D' + ASC '$8E' + ASC '$8F' + ASC '$90' + ASC '$91' + ASC '$92' + ASC '$93' + ASC '$94' + ASC '$95' + ASC '$96' + ASC '$97' + ASC '$98' + ASC '$99' + ASC '$9A' + ASC '$9B' + ASC '$9C' + ASC '$9D' + ASC '$9E' + ASC '$9F' + ASC '$A0' + ASC '$A1' + ASC '$A2' + ASC '$A3' + ASC '$A4' + ASC '$A5' + ASC '$A6' + ASC '$A7' + ASC '$A8' + ASC '$A9' + ASC '$AA' + ASC 'BAS' + ASC 'TDF' + ASC 'DAT' + ASC '$AE' + ASC '$AF' + ASC 'SRC' + ASC 'OBJ' + ASC 'LIB' + ASC 'S16' + ASC 'RTL' + ASC 'EXE' + ASC 'PIF' + ASC 'TIF' + ASC 'NDA' + ASC 'CDA' + ASC 'TOL' + ASC 'DRV' + ASC '$BC' + ASC 'FST' + ASC '$BE' + ASC 'DOC' + ASC 'PNT' + ASC 'PIC' + ASC '$C2' + ASC '$C3' + ASC '$C4' + ASC '$C5' + ASC '$C6' + ASC '$C7' + ASC 'FON' + ASC 'FND' + ASC 'ICN' + ASC '$CB' + ASC '$CC' + ASC '$CD' + ASC '$CE' + ASC '$CF' + ASC '$D0' + ASC '$D1' + ASC '$D2' + ASC '$D3' + ASC '$D4' + ASC '$D5' + ASC '$D6' + ASC '$D7' + ASC '$D8' + ASC '$D9' + ASC '$DA' + ASC '$DB' + ASC '$DC' + ASC '$DD' + ASC '$DE' + ASC '$DF' + ASC 'TEL' + ASC '$E1' + ASC 'ATK' + ASC '$E3' + ASC '$E4' + ASC '$E5' + ASC '$E6' + ASC '$E7' + ASC '$E8' + ASC '$E9' + ASC '$EA' + ASC '$EB' + ASC '$EC' + ASC '$ED' + ASC '$EE' + ASC 'PAS' + ASC '$F0' + ASC '$F1' + ASC '$F2' + ASC '$F3' + ASC '$F4' + ASC '$F5' + ASC '$F6' + ASC '$F7' + ASC 'LNK' + ASC 'DOS' + ASC 'INT' + ASC 'IVR' + ASC 'BAS' + ASC 'VAR' + ASC 'REL' + ASC 'SYS' + fin + +ftmonths + asc 'Jan-' + asc 'Feb-' + asc 'Mar-' + asc 'Apr-' + asc 'May-' + asc 'Jun-' + asc 'Jul-' + asc 'Aug-' + asc 'Sep-' + asc 'Oct-' + asc 'Nov-' + asc 'Dec-' + + lst rtn + diff --git a/src/exe/ascii.s b/src/exe/ascii.s new file mode 100644 index 0000000..5acdbae --- /dev/null +++ b/src/exe/ascii.s @@ -0,0 +1 @@ + ìóô ïææ ôôì ¢ÁÓÃÉÉ ÑõéãëÁÓÍ ãí䢠ôò ïî åøð ïæ檽½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ª Äéóðìáù diff --git a/src/exe/cat.cmd.s b/src/exe/cat.cmd.s new file mode 100644 index 0000000..100dbe1 --- /dev/null +++ b/src/exe/cat.cmd.s @@ -0,0 +1 @@ + áóí ãáôáìïç ìîë ²¯ïâê¯ãáôáìïç®ì äó ³°° óáö ²¯õôéìéôù¯ãáôáìïç diff --git a/src/exe/cat.macs.s b/src/exe/cat.macs.s new file mode 100644 index 0000000..d715c7c --- /dev/null +++ b/src/exe/cat.macs.s @@ -0,0 +1 @@ +þÑÁÉîéô×éìäÃáòä ÍÁàðóì Ý± ðó÷ Ý² ðóì Ý³ ðó÷ Ý´ ðóì Ýµ õôïïì ¤³Á ¼¼¼þÑÁÓôáôõó ÍÁà ðèá  õôïïì ¤°¶  ¼¼¼ ßÑÁÄòá÷Óôòéîç íáã  õôïïì ¤°Á  ¼¼¼ þÑÁÇåôÃíäÌéîå ÍÁà ðóì Ý±  ðó÷ Ý²  õôïïì ¤±Â  ¼¼¼ þÑÁÒåáäÄéò ÍÁà ðóì Ý±  ðóì Ý²  ðó÷ Ý³  õôïïì ¤³¹  ¼¼¼ ßÑÁÄòá÷ÃèáòØ íáã  õôïïì ¤µÄ  ¼¼¼ ðóì ÍÁà ÉÆ £½Ý±  Ðõóè×ïòä £Þݱ  ÅÌÓÅ  Ðõóè×ïòä Ý±«²  ÆÉΠ Ðõóè×ïòä Ý±  ¼¼¼ Ðõóè×ïòä ÍÁà ÉÆ £½Ý±  ÐÅÁ Ý±  ÅÌÓÅ  ÉÆ Íد²  ÌÄÁ Ý±«±  ÐÈÁ  ÆÉΠ ÌÄÁ Ý±  ÐÈÁ  ÆÉΠ ¼¼¼ ðó÷ ÍÁà ÉÆ £½Ý±  ÐÅÁ Ý±  ÅÌÓÅ  ÉÆ Íد²  ÌÄÁ Ý±«±  ÐÈÁ  ÆÉΠ ÌÄÁ Ý±  ÐÈÁ  ÆÉΠ ¼¼¼ ðìì ÍÁà ÄÏ Ý°  Ðõìì×ïòä Ý±  Ðõìì×ïòä Ý±«²  ÅÌÓÅ  Ðõìì×ïòä  Ðõìì×ïòä  ÆÉΠ ¼¼¼ Ðõìì×ïòä ÍÁà ÐÌø  ÄÏ Ý°  ÓÔø Ý±  ÆÉΠ ÉÆ Íد²  ÐÌø  ÄÏ Ý°  ÓÔø Ý±«±  ÆÉΠ ÆÉΠ ¼¼¼ ôìì ÍÁà ìäø £Ý±  êó젤ű°°°°  ¼¼¼ ßÇÓÏÓ ÍÁà äï éîìéîå  êóì ðòïäïó  ä÷ Ý±  áäòì Ý²  åìóå  ðó젣ݲ  ðåá Ý±  êóì ðòïäïóÉÌ  æéî  ¼¼¼ ßÑÁÓôáôõó íáã  õôïïì ¤°¶  ¼¼¼ ßÑÁÄòá÷Ãèáò íáã  õôïïì ¤°¹  ¼¼¼ ßÑÁÄòá÷Óôò íáã  õôïïì ¤°Á  ¼¼¼ ßÑÁÐòÂùôåÌ íáã  õôïïì ¤°Ã  ¼¼¼ ßÑÁÄòá÷Äåã íáã  õôïïì ¤°Ä  ¼¼¼ ßÑÁËåùÁöáéì íáã  õôïïì ¤°Å  ¼¼¼ ßÑÁÇåôÃèáò íáã  õôïïì ¤°Æ  ¼¼¼ ßÑÁÃìåáòËåù ÍÁà õôïïì ¤¶Ä ¼¼¼ ßÑÁÇåôÃíäÌéîå íáã  õôïïì ¤±Â  ¼¼¼ ßÑÁÔùð²Ôøô íáã  õôïïì ¤³·  ¼¼¼ ßÑÁÄòá÷Èåø íáã  õôïïì ¤µÁ  ¼¼¼ ßÑÁÄòá÷ÃÓôò íáã  õôïïì ¤µÂ  ¼¼¼ þÑÁÇåô×ïòä ÍÁà ðèá  ðèá  ðóì Ý±  ðó÷ Ý²  ðó÷ Ý³  õôïïì ¤¶±  ¼¼¼ ßÑÁÄáôåÔéíå íáã  õôïïì ¤¶²  ¼¼¼ ßÑÁÄòá÷ÃÒ íáã  õôïïì ¤¶³  ¼¼¼ ßÑÁÄòá÷Óðáãå íáã  õôïïì ¤¶´  ¼¼¼ þÑÁÄòá÷Öåòóéïî íáã  ðóì Ý±  õôïïì ¤¶µ  ¼¼¼ õôïïì íáã  ìäø £Ý±ª²µ¶«ÔïïìÎõí  äï õóåòïòóùó  êó젤ű°°°¸  åìóå  êó젤ű°°°°  æéî  ¼¼¼ êíìé íáã  éæ íø  òå𠤳°  æéî  ìäø £Ý²ðáòíó  ìäᠣݱ  êóò äïó  íø ¥°°  åïí  diff --git a/src/exe/catalog.s b/src/exe/catalog.s new file mode 100644 index 0000000..3903ace --- /dev/null +++ b/src/exe/catalog.s @@ -0,0 +1 @@ + ìóô ïææ ôò øã øã íø ¥°°ª½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ª Ãáôáìïç õôéìéôù æïò diff --git a/src/exe/del.cmd.s b/src/exe/del.cmd.s new file mode 100644 index 0000000..39fede8 --- /dev/null +++ b/src/exe/del.cmd.s @@ -0,0 +1 @@ + áóí äåì ìîë ²¯ïâê¯äåì®ì äó ³°° óáö ²¯õôéìéôù¯äåìåôå diff --git a/src/exe/dump.s b/src/exe/dump.s new file mode 100644 index 0000000..07c9b46 --- /dev/null +++ b/src/exe/dump.s @@ -0,0 +1 @@ + ìóô ïææ ôò ïî åøð ïîìù øã øã íø ¥°° òå쪽½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ãó÷è ½ ¤³·ðîô ½ ¤¶° »íéóã õóåãèòãîô ½ ¤¶´ »ãèáò ãïõîô ðåò ìéîåöåòó ½ ¤¶¶ »½± éæ ìé⬠åìóå ½ öåòóîõíóôáãëðîô ½ ¤¶¸óéúå ½ ¤¶Ã »óáöå æïò åïæììåî ½ ¤·° »óáöå æïò ìáâìåîòåã ½ ¤·² »óáöå æïò òåãïòä ôùðåïðîä ½ ¤·´ »óáöå æïò ïðåòáîä ôùðåöåòóîõí ½ ¤·¶ »ïíæ öåòóéïî ­±çåôéîæï ½ ¤°¶ïðåî ½ ¤±°òåáä ½ ¤±²ãìïóå ½ ¤±´óåôíáòë ½ ¤±¶çåôåïæ ½ ¤±¹ª½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ õóå ´¯õôéì®íáãó õóå ñáôïïìó®íáãó÷òéôåãèò íáã ßÑÁÄòá÷Ãèáò ¼¼¼ßíùòåáä íáã êóò äïòåáä íø ¥°° ¼¼¼ðòéîô íáã êóò óåîäíóç áóã Ý±¬°° íø ¥±± ¼¼¼ðòâù íáã éæ íø¼³ óåð ¥°°±±°°°° æéî ìäá âõææåò«Ý± êóò ðòâùôå ¼¼¼ðò´âõ íáã ðò²âõ Ý±«² ðò²âõ Ý± ¼¼¼ðò²âõ íáã éæ íø¼³ óåð ¥°°±±°°°° æéî ìäø âõææåò«Ý±«± ìäù âõææåò«Ý± êóò ðò÷ïòä ¼¼¼ðò³âù íáã éæ íø¼³ óåð ¥°°±±°°°° æéî ìäá Ý±«² ìäø Ý±«± ìäù Ý± êóò ðòìïîç ¼¼¼ðò³âõ íáã ðò³âù âõææåò«Ý± ¼¼¼ðòèåáä íáã óôú ãèòãîô êóò ëåùãèë ðòéîô Ý± êóò ôáâéô ¼¼¼ª­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ äõííù ° »ïææóåôó éîôï ïíæ èåáäåòâùôåãîô áäòì °òåóóðã áäòì °ìåîçôè áäòì °ïìäëéîä äæâ °ìáâìåî äæâ ±°îõíìåî äæâ ´öåòóéïî äæâ ²âáîëóéúå áäòì °äâáîëóéúëéîä áäòì ¤±°°°ïòç áäòì °áìéçî áäòì °îõíóåø äæâ °¬°óåçîõí äá ±åîôòù áäòì °äéóðîáíå äá ìïáäîáíåäéóðäáôá äá äáôáìïáäîáíå áóã § §óåçîáíå áóã § §äáôá äåî䪽½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ª Ïðôéïîáì diff --git a/src/exe/time.s b/src/exe/time.s new file mode 100644 index 0000000..200f7e3 --- /dev/null +++ b/src/exe/time.s @@ -0,0 +1 @@ + ìóô ïææ ôò øã øã íø ¥°°ª½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ª äáôå¯ôéíå õôéìéôù æïò diff --git a/src/intcmd/intcmd.macs.s b/src/intcmd/intcmd.macs.s new file mode 100644 index 0000000..be24649 --- /dev/null +++ b/src/intcmd/intcmd.macs.s @@ -0,0 +1,163 @@ +_GSOS MAC + do inline + jsl prodos + dw ]1 + adrl ]2 + else + psl #]2 + pea ]1 + jsl prodosIL + fin + <<< +_DISPOSEHANDLE MAC + Tool $1002 + <<< +^PURGEALL MAC + PHW ]1 + Tool $1302 + <<< +_COMPACTMEM MAC + Tool $1F02 + <<< +_HLOCK MAC + Tool $2002 + <<< +~QAGetWord MAC + pha + pha + psl ]1 + phw ]2 + phw ]3 +_QAGetWord mac ;_QAGetWord(@Text,Offset,MaxLen):BegOffset,EndOffset + utool $61 + <<< +PSL mac + if #,]1 + pea ^]1 + pea ]1 + else + if :,]1 + lda ]1+2 + pha + lda ]1 + pha + else + lda ]1+2 + pha + lda ]1 + pha + fin + fin + eom +PLL mac + if :,]1 + pla + sta ]1 + pla + sta ]1+2 + else + pla + sta ]1 + pla + sta ]1+2 + fin + eom +TOOL mac + ldx #]1 + jsl $E10000 + eom +TLL mac + ldx #]1 + jsl $E10000 + eom +JEQ mac + bne *+5 + jmp ]1 + eom +JGE mac + blt *+5 + jmp ]1 + eom +JLT mac + bge *+5 + jmp ]1 + eom +JCS mac + bcc *+5 + jmp ]1 + eom +_QADRAWCHAR mac + utool $09 + eom +_QADRAWSTRING mac + utool $0A + eom +_QADRAWSTR mac + utool $0A + eom +_QAGETPARMHDL mac + utool $12 + eom +_QAGETCMDHDL mac + utool $14 + eom +_QALOADFILE mac + utool $18 + eom +_QAGETCMDLINE mac + utool $1B + eom +_QASETQUITFLAG mac + utool $1E + eom +_QACOMPILE mac + utool $26 + eom +_QALINK mac + utool $27 + eom +_QAGETVECTOR mac + utool $2E + eom +_QASETVECTOR mac + utool $2F + eom +_QATABTOCOL mac + utool $33 + eom +_QASETCANCELFLAG mac + utool $40 + eom +_QAGETSHELLID mac + utool $55 + eom +_QASETLAUNCH mac + utool $60 + eom +_QADRAWCR mac + utool $63 + <<< +_QADRAWSPACE mac + utool $64 + <<< +UTOOL mac + ldx #]1*256+toolnum + do userorsys + jsl $E10008 + else + jsl $E10000 + fin + eom +PHW MAC + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< + diff --git a/src/intcmd/qaintcmd.cmd.s b/src/intcmd/qaintcmd.cmd.s new file mode 100644 index 0000000..a25f6c2 --- /dev/null +++ b/src/intcmd/qaintcmd.cmd.s @@ -0,0 +1,22 @@ +*====================================================== +* Link file for QASM loader (launch) file + +* Written by Lane Roath +*====================================================== + + asm qaintcmd + + do err + else + + lnk obj/qaintcmd.l + + ds 400 ;DS_Size + + typ RTL + sav qasystem/qaintcmd + + fin + + end + diff --git a/src/intcmd/qaintcmd.s b/src/intcmd/qaintcmd.s new file mode 100644 index 0000000..ab7f465 --- /dev/null +++ b/src/intcmd/qaintcmd.s @@ -0,0 +1,1024 @@ + lst off + tr on + exp off + cas in +*====================================================== +* These are the internal commands available for use by +* QuickASM. Seperate for easy editing, and allows new +* shells to have their own command library files. + +* Written by Shawn Quick and Lane Roath +*------------------------------------------------------ +* 17-Feb-90 0.20 :remove ASCII command +* 06-Feb-90 0.10 :clean up the code, size, speed +*====================================================== + + xc + xc + mx %00 + rel + +Class1 = 0000 + + lst off + use intcmd.macs + put qa.equates + lst rtn + +*====================================================== +* The required command table, preceded by command count + + dw {tblend-tbl}/4 +tbl adrl quitcmd ;ID #1 + adrl prefixcmd ;ID #2 + adrl purgecmd ;ID #3 + adrl helpcmd ;ID #4 + adrl compilecmd ;ID #5 + adrl linkcmd ;ID #6 + adrl showcmd ;ID #7 + adrl quicklinkcmd ;ID #8 + adrl asmlinkgo ;ID #9 + adrl setcmd ;ID #10 + adrl popcmd ;ID #11 + adrl toolmaccmd ;ID #12 + adrl launch ;ID #13 launch with return + adrl SubLaunch ;ID #14 launch with no return + adrl shutdown ;ID #15 reboot system +tblend + +one dw 1 + +*====================================================== +* Quit back to finder (or whatever launched us) + +quitcmd + php + rep $30 + pea $ffff + _QASetQuitFlag + lda #$00 + plp + clc + rtl + +*------------------------------------------------------ +* Shut down the entire computer in a save manner + +shutdown + php + rep $30 + pea $ffff + _QASetQuitFlag + psl #:zero + pea $FFFF ;$FFFF means shutdown + _QASetLaunch + lda #$00 + plp + clc + rtl + +:zero dw 0 ;null path + +*====================================================== +* Launch or SubLaunch an application (SYS,S16,EXE,etc.) + + mx %00 +launch + lda #$C000 ;return and restart + bra dolaunch +SubLaunch + lda #$4000 ;no return and restart +dolaunch + php + phd + phb + phk + plb + rep $30 + sta launchflags + stz tempbuff + stz filename + psl #tempbuff + pea 255 + _QAGetCmdLine + lda tempbuff + and #$ff + beq :nopath + lda tempbuff+1 + and #$7f + cmp #'-' + beq :nospace + cmp #'=' + bne :normal +:nospace sep $30 + pha + lda tempbuff + inc + sta tempbuff-1 + pla + sta tempbuff + lda #' ' + sta tempbuff+1 + rep $30 + ldx #tempbuff-1 + ldy #^tempbuff-1 + bra :getpath +:normal ldx #tempbuff + ldy #^tempbuff +:getpath jsr getpath + bcc :gotpath +:nopath rep $30 + lda #$46 + brl :xit +:gotpath _GSOS _GetFileInfo;:info + jcs :xit + lda :type + and #$FF + cmp #$FF + beq :ok + and #$F0 + cmp #$B0 + bne :5C +:ok pea #$FFFF + _QASetQuitFlag + psl #filename + lda launchflags + pha + _QASetLaunch +:noerr rep $30 + lda #$00 + bra :xit +:5c rep $30 + lda #$5C ;prodos "not executable file" +:xit rep $30 + and #$ff + plb + pld + plp + cmpl one + rtl + +:info adrl filename + dw 0 +:type ds 2 + ds 20 + +*====================================================== +* Remove any of our transient commands from memory +* (*** to be done... allow specifying command to remove! ***) + +purgecmd + php + rep $30 + psl #:str + _QADrawStr + ~PurgeAll #0 + _CompactMem + plp + clc + rtl + +:str str 'Purging memory...',0d + +*====================================================== +* Compile (assemble) a file + +compilecmd + php + rep $30 + pea 0 + _QASetCancelFlag + pea #afromcmd ;compile from command line + psl #$00 ;no subtype + _QACompile + bcs :sec + plp + clc + rtl +:sec plp + sec + rtl + +*====================================================== +* Execute a linker command file + +linkcmd + php + rep $30 + pea 0 + _QASetCancelFlag + pea #lfromcmd + psl #$00 ;no subtype + _QALink + bcs :sec + plp + clc + rtl +:sec plp + sec + rtl + +*====================================================== +* Assemble a file, link the result, and execute the program + +asmlinkgo + rep $30 + lda #$FFFF + sec + rtl + +*====================================================== +* This is mainly for editors... ie, Merlin's oa-6 cmd. +* Looks for the file QUICKLINK.S in the current folder, +* then in 9/QASYSTEM if that fails, and passes it to the linker. + +quicklinkcmd + php + rep $30 + psl #tempbuff + pea 255 + _QAGetCmdLine + ldx #tempbuff + ldy #^tempbuff + jsr getpath + bcc :gotpath + lda #$46 + plp + sec + rtl +:gotpath + rep $30 + pea 0 + _QASetCancelFlag + pea #lquick + psl #filename + _QALink + bcs :sec + plp + clc + rtl +:sec plp + sec + rtl + +*====================================================== +* Show the user what commands are avail. If passed a command name +* look in the help directory for that file & display it. + +helpcmd + php + phb + phd + phk + plb + rep $30 + pha + pha + tsc + inc + tcd + psl #:str + _QADrawString + pea 0 + psl #$00 + _QAGetCmdHdl + plx + stx number + plx + ply + jcs :xit + stx handle + sty handle+2 + psl handle + _Hlock + lda handle + sta 0 + lda handle+2 + sta 2 + ldy #$02 + lda [0] + tax + lda [0],y + sta 2 + stx 0 + stz pos + lda number + beq :noerr + pea #$0d + _QADrawChar +:loop lda number + beq :done + ldx pos + lda :tbl,x + and #$ff + pha + _QATabToCol + pei 2 + pei 0 + _QADrawstring + inc pos + lda pos + cmp #$04 + blt :next + pea $0d + _QADrawChar + stz pos +:next dec number + lda 0 + clc + adc #erecsize + sta 0 + bcc :loop + inc 2 + bra :loop +:done lda pos + beq :cr + pea $0d + _QADrawChar +:cr pea #$0d + _QADrawChar +:noerr lda #$00 +:xit rep $30 + plx + plx + pld + plb + plp + cmpl one + rtl + +:tbl dfb 2,22,42,62 +:str str 0d,'Commands available:',0d + +*====================================================== +* Show the current prefixes & avail. memory + +showcmd + php + phb + phk + plb + rep $30 + pea $0D + _QADrawChar + stz tempbuff + lda #$FFFF + sta :pfxnum + jsl $e100a8 + dw $28 + adrl :boot + jsr convertpath + pea #'*' + _QADrawChar + brl :init +]lup lda :pfxnum + cmp #8 + bge :memory + stz tempbuff + _GSOS _GetPrefix;:pfxnum + + jsr convertpath + + lda :pfxnum + and #$0F + ora #$30 + pha + _QADrawChar +:init pea ':' + _QADrawChar + _QADrawSpace + pea '=' + _QADrawChar + _QADrawSpace + psl #tempbuff + _QADrawstring + _QADrawCR + inc :pfxnum + brl ]lup +:memory + _QADrawCR + + psl #:mem1 + _QADrawString + psl #$00 + tll $1b02 + pll :mem + jsr :printmem + _QADrawCR + + psl #:mem2 + _QADrawString + psl #$00 + tll $2f02 + pll :mem + jsr :printmem + _QADrawCR + + psl #:mem3 + _QADrawString + psl #$00 + tll $1c02 + pll :mem + jsr :printmem + _QADrawCR + + psl #:mem4 + _QADrawString + psl #$00 + tll $1d02 + pll :mem + jsr :printmem + _QADrawCR + _QADrawCR + plb + plp + clc + rtl +:printmem + lup 10 + lsr :mem+2 + ror :mem + --^ + psl :mem + psl #:dstr+1 + pea $04 + pea $00 + tll $270b + psl #:dstr + _QADrawString + pea 'K' + _QADrawChar + rts + +:str str 'Prefix #' +:mem ds 4 +:mem1 str 'Free RAM: ' +:mem2 str 'Real Free RAM: ' +:mem3 str 'Largest Block: ' +:mem4 str 'Total RAM: ' +:dstr str '0000' +:boot adrl tempbuff +:pfxnum ds 2 + adrl tempbuff + +*====================================================== +* Load the 'built in' macros for use by quick asm + +toolmaccmd + php + phb + phk + plb + rep $30 + psl #$00 + pea #vtoolmacs + _QAGetVector + pll handle + lda handle + ora handle+2 + beq :load + psl handle + _DisposeHandle +:load stz handle + stz handle+2 + pea #vtoolmacs + psl handle + _QASetVector + psl #$00 + psl #:name + psl #$00 ;filepos + psl #-1 ;whole file + psl #:types + pea 0 + _QAGetShellId + psl #$00 + pea $0000 + _QALoadfile + plx + ply + jcs :sec + sty handle+2 + stx handle + pea #vtoolmacs + psl handle + _QASetVector + lda #$00 +:sec plb + plp + cmpl one + rtl + +:types hex 00 +:name str '9/QASYSTEM/TOOLMACS' + +*====================================================== +* Back up one level in the current prefix + +popcmd + php + phd + phb + phk + plb + stz setparms + stz tempbuff + stz filename + psl #tempbuff + pea 255 + _QAGetCmdLine + ldx #tempbuff + ldy #^tempbuff + jsr getpath + bcs :nopath + lda filename + and #$ff + beq :nopath + cmp #$02 + bge :syntax + lda filename+1 + and #$7f + cmp #'0' + blt :syntax + cmp #'8' + blt :gp +:syntax lda #$53 ;*** whatever sounds good + brl :err +:gp and #$0f + sta setparms +:nopath rep $30 + lda #^tempbuff + sta pfxptr+2 + lda #tempbuff + sta pfxptr + _GSOS _GetPrefix;setparms + jsr convertpath + lda tempbuff + and #$ff + tax + sep $20 + lda tempbuff,x + and #$7f + cmp #'/' + beq :dec + cmp #':' + bne :count +:dec dex +:count lda tempbuff,x + and #$7f + cmp #':' + beq :end + cmp #'/' + beq :end + dex + cpx #$00 + bne :count + bra :xit +:end txa + cmp #$01 + beq :xit + sta tempbuff + rep $30 + _GSOS _SetPrefix;setparms +:xit plb + pld + plp + clc + rtl + +:err plb + pld + plp + sec + rtl + +*====================================================== +* Set the prefix to something we can use + +prefixcmd + php + phd + phb + phk + plb + rep $30 + stz tempbuff + psl #tempbuff + pea 255 + _QAGetCmdLine + lda #$ffff + sta :pfxnum + sep $30 + lda tempbuff + jeq :nopath + ldx #$00 +]lup inx + lda tempbuff,x + and #$7f + cmp #' ' + jlt :nopath + beq ]lup +]lup inx + lda tempbuff,x + and #$7f + cmp #' ' + jlt :nopath + bne ]lup +]lup inx + lda tempbuff,x + and #$7f + cmp #' ' + jlt :nopath + beq ]lup + cmp #'0' + jlt :gp1 + cmp #'8' + jeq :badnum + cmp #'9' + jeq :badnum + jge :gp1 + tay + inx + lda tempbuff,x + and #$7f + cmp #' ' + jlt :show1 + beq :parm + cmp #'/' + beq :gp1 + cmp #':' + beq :gp1 + brl :badnum +:parm inx + lda tempbuff,x + and #$7f + cmp #' ' + jlt :show1 + beq :parm + dex + rep $30 + tya + and #$0f + sta :pfxnum + sep $30 + ldy #$00 +]lup inx + lda tempbuff,x + and #$7f + cmp #' ' + blt :nopath + beq ]lup + cmp #'a' + blt :s + cmp #'z'+1 + bge :s + and #$5f +:s cmp #'/' + bne :s1 + lda #':' +:s1 sta filename+1 +]lup iny + inx + lda tempbuff,x + and #$7f + cmp #' '+1 + blt :save + cmp #'a' + blt :s2 + cmp #'z'+1 + bge :s2 + and #$5f +:s2 cmp #'/' + bne :s3 + lda #':' +:s3 sta filename+1,y + bra ]lup +:save sty filename + cpy #$00 + beq :nopath + brl :gotpath +:badnum rep $30 + lda #$53 ;GS/OS error $53 + brl :error +:gp1 rep $30 + ldx #tempbuff + ldy #^tempbuff +:getpath rep $30 + jsr getpath + bcc :gotpath +:nopath + rep $30 + jsl showcmd + plb + pld + plp + clc + rtl +:gotpath + rep $30 + stz setparms + lda :pfxnum + cmp #$ffff + beq :fn + sta setparms +:fn lda #filename + sta pfxptr + lda #^filename + sta pfxptr+2 + _GSOS _SetPrefix;setparms + bcs :error + lda #$00 +:error rep $30 + plb + pld + plp + cmpl one + rtl +:show1 + rep $30 + tya + and #$0f + sta :pfxnum + _GSOS _GetPrefix;:pfxnum + jsr convertpath + _QADrawCR + lda :pfxnum + and #$0F + ora #$30 + pha + _QADrawChar +:init pea ':' + _QADrawChar + _QADrawSpace + pea '=' + _QADrawChar + _QADrawSpace + psl #tempbuff + _QADrawstring + _QADrawCR + _QADrawCR + lda #$00 + brl :error + +:pfxnum ds 2 + adrl tempbuff + +*====================================================== +* Set the prefixes according to a base prefix + +setcmd + php + phd + phb + phk + plb + rep $30 + psl #tempbuff + pea 255 + _QAGetCmdLine + ldx #tempbuff + ldy #^tempbuff + jsr getpath + bcc :gotpath + +:nopath rep $30 + jsr setpfx + bcs :error + lda #$00 + brl :error +:gotpath + stz setparms + lda #filename + sta pfxptr + lda #^filename + sta pfxptr+2 + _GSOS _SetPrefix;setparms + bcs :error + jsr setpfx + +:error rep $30 + plb + pld + plp + cmpl one + rtl + +*------------------------------------------------------ +* Set a prefix from the parms... part of SET handler + + mx %00 +setpfx + php + phd + phb + phk + plb + rep $30 + lda #$01 + sta count + sta setparms + phd + psl #$00 + _QAGetParmHdl + tsc + inc + tcd + lda 0 + ora 2 + beq :bad + ldy #$04 + lda [0],y + ora #$8000 + sta [0],y + ldy #$02 + lda [0] + tax + lda [0],y + sta pfxptr+2 + txa + clc + adc #$04+64 ;Skip Prefix 0 + sta pfxptr + bcc :c1 + inc pfxptr+2 +:c1 pld + pla + plx + bra :set +:bad pld + plx + plx + brl :bad1 + +:set lda count + _GSOS _SetPrefix;setparms ; yes- do so! + lda pfxptr + clc + adc #64 + sta pfxptr + bcc :c2 + inc pfxptr+2 +:c2 inc setparms ;next prefix + inc count + lda count + cmp #08 + blt :set + lda #$00 + bra :9 +:bad1 lda #$46 +:9 plb + pld + plp + cmp one + rts + +*------------------------------------------------------ +* Get pathname from parm +* ENTRY: XY = Address of path buffer +* EXIT: filename = returned path + +getpath + +]ptr = 0 + + php + phd + phb + phk + plb + rep $30 + pha + pha + tsc + inc + tcd +:get stx ]ptr + sty ]ptr+2 +:go ldy #1 + sep $20 + lda []ptr] + beq :nopath +]lup lda []ptr],y + and #$7F + cmp #' ' + blt :nopath + bne :l1 + iny + brl ]lup +:l1 iny + lda []ptr],y + and #$7F + cmp #' ' + blt :nopath + bne :l1 +:l2 iny + lda []ptr],y + and #$7F + cmp #' ' + blt :nopath + beq :l2 + cmp #';' + beq :nopath + rep $30 + dey + jsr :getword ;look for pathname or save + bcc :nopath + lda #$0000 + brl :error +:nopath rep $30 + lda #$46 +:error rep $30 + tax + pla + pla + txa + plb + pld + plp + cmp one + rts + +:pfx dw $00 + adrl filename + +*------------------------------------------------------ +:getword php + sep $30 + ldx #0 ;no chars yet! + stx filename +]loop + iny + lda []ptr],y ;get pathname till eol or delimiter found + and #$7F + clc + beq :done ; 0 = end of line! + cmp #'*' + beq :inx + cmp #'.' + blt :done +:inx inx ;part of path, count & store it + cpx #65 + bge :done ;let's not let the bad boys in! + cmp #'a' + blt :sta + cmp #'z'+1 + bge :sta + and #$5F +:sta cmp #'/' + bne :sta1 + lda #':' +:sta1 sta filename,x ;update pathname & it's length + stx filename + bra ]loop +:done lda filename + plp + cmp one + rts + +*------------------------------------------------------ +* Convert pathname to usable format + +convertpath php + sep $30 + ldal tempbuff + beq :plp + tax +]lup ldal tempbuff,x + and #$7f + cmp #'/' + bne :1 + lda #':' +:1 cmp #'a' + blt :2 + cmp #'z'+1 + bge :2 + and #$5f +:2 stal tempbuff,x + dex + bne ]lup +:plp plp + rts + +*====================================================== +* Stuff not needed to be saved to disk + + dum * + +launchflags ds 2 + +handle ds 4 +number ds 2 +pos ds 2 + +setparms ds 2 +pfxptr ds 4 +count ds 2 + +filename ds 130 +tempbuff ds 256 + +DS_Size ENT + dend + + typ RTL ;run time library + sav obj/qaintcmd.l + diff --git a/src/link/link.cmd.s b/src/link/link.cmd.s new file mode 100644 index 0000000..f90a451 --- /dev/null +++ b/src/link/link.cmd.s @@ -0,0 +1,10 @@ + put link.vars + put link.eval + put linker.1 + put linker.2 + put link.errors + asm link.header + lnk utility/qlinkgs.l + typ exe + sav utility/qlinkgs + diff --git a/src/link/link.errors.s b/src/link/link.errors.s new file mode 100644 index 0000000..a0a70a8 --- /dev/null +++ b/src/link/link.errors.s @@ -0,0 +1,197 @@ +dskerror php + rep $30 + sta prodoserr + lda #doserror + jsr linkerror + plp + rts + +linkerror php + rep $30 + sta :errcode + pea 0 + _QAGetWindow + pea $FFFF + _QASetWindow + + _QAIncTotalErrs + cmp #constraint + jeq :xit + cmp #notresolved + jeq :xit +:ldx ldx #$00 +]lup lda errtbl,x + beq :unknown + cmp :errcode + beq :found + inx + inx + inx + inx + jmp ]lup +:unknown psl #unknownstr + jmp :draw +:found inx + inx + phk + phk + pla + and #$00ff + pha + lda errtbl,x + pha +:draw lda #$0d + jsr drawchar + _QADrawString + psl #textstr + _QADrawString +:line pea 0 + lda linenum + pha + pea 0 + pea 0 + _QADrawDec + + lda :errcode + cmp #doserror + jne :period + ldx #$00 +]lup lda gstbl,x + beq :gsnfound + cmp prodoserr + beq :gfound + inx + inx + inx + inx + jmp ]lup +:gfound inx + inx + lda gstbl,x + tax + phk + phk + pla + and #$00ff + pha + phx + lda #$20 + jsr drawchar + _QADrawString + jmp :period +:gsnfound psl #dosstr + lda #$20 + jsr drawchar + _QADrawErrString + lda prodoserr + jsr prbytel +:period lda #'.' + jsr drawchar +* psl #codestr +* _QADrawErrString +* lda :errcode +* jsr prbyte + lda #$0d + jsr drawchar + +:xit rep $30 + _QASetWindow + plp + rts +:errcode ds 2 + +gstbl dw $07,gstr1 + dw $27,gstr2 + dw $28,gstr3 + dw $2b,gstr4 + dw $2e,gstr5 + dw $2f,gstr6 + dw $40,gstr7 + dw $44,gstr8 + dw $45,gstr9 + dw $46,gstr10 + dw $47,gstr11 + dw $48,gstr12 + dw $4e,gstr13 + dw $201,gstr14 + dw mismatch,gstr15 ;error $5C + dw $0000,$0000 + + +errtbl dw syntax,str1 + dw badasmcmd,str2 + dw badcmd,str3 + dw badlable,str4 + dw outofmem,str5 + dw undeflable,str6 + dw badoperand,str7 + dw badrelative,str8 + dw symfull,str9 + dw baddictionary,str10 + dw badexternal,str11 + dw extnotzp,str12 + dw maxsegments,str13 + dw relfull,str14 + dw dupentry,str15 + dw maxfileserr,str16 + dw onesave,str17 + dw badvalue,str18 + dw doserror,str19 + dw badalignop,str20 + dw jmptblfull,str21 + dw baddsop,str22 + dw illegalcmd,str23 + dw filetoolarge,str24 + dw nesterror,str25 + dw forwardref,str26 + + dw $0000,$0000 + +str1 str 'Syntax' +str2 str 'Bad ASM command' +str3 str 'Unrecognized command' +str4 str 'Bad label' +str5 str 'Out of memory' +str6 str 'Undefined label' +str7 str 'Bad operand' +str8 str 'Bad relative address' +str9 str 'Symbol table full' +str10 str 'Bad dictionary entry' +str11 str 'Bad external lable' +str12 str 'External not direct page' +str13 str 'Too many segments' +str14 str 'Relocation dictionary full' +str15 str 'Duplicate ENTry' +str16 str 'Too many files' +str17 str 'Only one SAV allowed' +str18 str 'Bad value' +str19 str 'GS/OS error' +str20 str 'Bad ALIGN' +str21 str 'Jump table full' +str22 str 'Unable to reserve DS space' +str23 str 'Illegal command' +str24 str 'File too large' +str25 str 'Conditional nesting level error' +str26 str 'Illegal forward reference' + + +gstr1 str '' +gstr2 str '' +gstr3 str '' +gstr4 str '' +gstr5 str '' +gstr6 str '' +gstr7 str '' +gstr8 str '' +gstr9 str '' +gstr10 str '' +gstr11 str '' +gstr12 str '' +gstr13 str '' +gstr14 str '' +gstr15 str '' +unknownstr str '' +codestr str ' Code=$' +textstr str ' in line: ' +dosstr str 'GS/OS Code #' + diff --git a/src/link/link.eval.s b/src/link/link.eval.s new file mode 100644 index 0000000..c6aa43b --- /dev/null +++ b/src/link/link.eval.s @@ -0,0 +1,1342 @@ +noop = %0000_0000_0000_0000 +rightbrace = %0100_0001_0000_0001 +gt = %1000_0010_0001_0010 +lt = %1000_0011_0010_0010 +eq = %1000_0100_0100_0010 +noteq = %1000_0101_1000_0010 +plusop = %1000_0110_0000_0011 +minusop = %1000_0111_0000_0011 +multop = %1000_1000_0000_0100 +divop = %1000_1001_0000_0100 +modop = %1000_1010_0000_0100 +evandop = %1000_1011_0000_0101 +evorop = %1000_1100_0000_0101 +eveorop = %1000_1101_0000_0101 +negateop = %0010_1110_0000_0110 +leftbrace = %0100_1111_0000_0111 + +levelmask = %0000_0000_0000_1111 +flagmask = %0000_0000_1111_0000 +mask = %1111_1111_1111_0000 +bracemask = %0100_0000_0000_0000 +negatemask = %0010_0000_0000_0000 + +eval php + rep $30 + txa + and #$ff + tax + sep $20 + ldy #$00 + sty evalrelok + sty shiftct + sty evallevel + stz notfound ;8 bit value + sty lvalue + sty lvalue+2 + sty noshift + sty noshift+2 + lda #$ffff + sta lableused + stx offset ;save our offset + txy ;put starting offset in Y + sep $20 +]lup lda (lineptr),y + cmp #' ' ;flush out all leading spaces + blt :badop1 + bne :start + iny + jmp ]lup +:badop1 pea #badoperand ;push error code on stack + jmp :error + +:imedflag ds 2 + +:start ldx #%00001111 + stx :imedflag +:start1 cmp #'#' ;check for + beq :nexty0 + cmp #',' + beq :nexty1 + cmp #'(' + beq :nexty + cmp #'[' + beq :nexty + jmp :shiftop +:nexty0 rol :imedflag +:nexty1 iny + lda (lineptr),y + cmp #' '+1 + blt :badop1 + jmp :start1 +:nexty iny + lda (lineptr),y + cmp #' '+1 + blt :badop1 +:shiftop xba + lda :imedflag + bit #%00010000 + beq :nshift + xba + bit :imedflag + bvs :main1 + cmp #'^' + beq :shift16 + cmp #'<' + beq :shift0 + cmp #'>' + beq :shift8 + jmp :main1 +:nshift xba + cmp #'|' + beq :shift0 + cmp #'!' + beq :shift0 + cmp #'>' + beq :shift0 + cmp #'<' + beq :shift0 + jmp :main1 +:shift8 lda #8 + sta shiftct + jmp :shift0 +:shift16 lda #16 + sta shiftct +:shift0 iny +:main lda (lineptr),y + cmp #' '+1 + blt :badop1 +:main1 rep $20 + stz xreg + stz yreg + stz xreg+2 + stz yreg+2 + stz estack + stz op + stz top + stz bracevalid + lda #$ffff + sta xrel + sta yrel + sta zrel + sty offset + lda #$8000 + sta number + +:loop rep $30 + ldy offset + jsr getnum + bcc :4 + sta :err+1 + jmp :err +:4 sty offset + bvc :operand + +:number bit number + bmi :numok + pea #badoperand + jmp :error +:numok lsr number + ldy evallevel + beq :numsta + sec + ror bracevalid ;left braces no longer valid +:numsta sta xreg ;save the values in the x register + stx xreg+2 + lda zrel + sta xrel + jmp :loop ;go back for more + +:operand cmp #noop ;no operation OK + beq :opok + + bit #bracemask + beq :chk + + cmp #leftbrace + bne :r + + bit bracevalid + bpl :opok + pea #badopchar + jmp :error + +:r cmp #rightbrace + bne :chk + + bit bracevalid + bmi :opok + pea #badopchar + jmp :error + +:chk bit number ;are we expecting an operand? + bpl :opok + + cmp #negateop ;we can get a NEGATE op if + beq :opok ;waiting for a number + + pea #badoperand + jmp :error + +:opok sta top ;store in temporary op + + and #$8000 ;should we shift brace flag + beq :testops ;and number flag? + lsr bracevalid ;clear high bit + sec + ror number ;set high bit + +:testops bit evalrelok + bpl :check + jmp :alldone ;error will be found by xit routine + +:check ldx evallevel + bne :test + lda top + and #bracemask.negatemask + bne :test + jmp :l2r +:test lda top + beq :checkstack +:test1 lda op + and #levelmask + sta opmask + lda top + and #levelmask + cmp opmask + blt :checkstack + beq :eqexecute + +:push jsr pushstack + bcc :push1 + sta :err+1 + jmp :err +:push1 lda top + cmp #leftbrace + bne :push2 + stz xreg + stz xreg+2 + lda #$ffff + sta xrel + inc evallevel + lda #rightbrace + sta top +:push2 lda top + sta op + lda xreg + sta yreg + lda xreg+2 + sta yreg+2 + lda xrel + sta yrel + jmp :loop +:eqexecute lda op + beq :push2 + cmp #rightbrace + beq :pulllevel + cmp #negateop + beq :push + jsr execute + jmp :push2 ;lda top +:pulllevel jsr execute + dec evallevel + jsr pullstack + jcc :loop + pha + jmp :error + +:l2r lda op + beq :noexec ;anything to do? + jsr execute +:noexec lda top + bne :push2 + jmp :noexec1 + +:checkstack + lda op + beq :noexec1 + jsr execute +:noexec1 lda estack + beq :checkdone + jsr pullstack + bcc :pull1 + sta :err+1 + jmp :err +:pull1 lda op + cmp #negateop + beq :checkstack + jmp :testops + +:checkdone stz op + lda top + beq :alldone + jmp :loop +:alldone bit evalrelok + bpl :done1 + pea #badrelative + jmp :error +:done1 lda evallevel + beq :store + lda #badoperand + jmp :errplp +:store lda xreg + sta noshift + sta lvalue + lda xreg+2 + sta lvalue+2 + sta noshift+2 + lda xrel + sta lableused + ldx shiftct + beq :noerr +]lup lsr lvalue+2 + ror lvalue + dex + bne ]lup +:noerr rep $30 + lda #$00 + jmp :errplp +:err pea $0000 +:error rep $30 +:errpla pla +:errplp rep $30 + bit notfound-1 + bpl :getx + lda #undeflable +:getx ldx offset + and #$ff + plp + cmp :one + rts +:one dw $01 + + +execute php + rep $30 + lda op + and #flagmask + beq :noflags + plp + jmp doflags +:noflags lda op + xba + and #$0f + asl + tax + plp + jmp (:tbl,x) +:tbl dw :rts ;noop + dw doright ;rightbrace + dw doflags ;GT + dw doflags ;LT + dw doflags ;EQ + dw doflags ;notEQ + dw doplus + dw dominus + dw domult + dw dodiv + dw domod + dw doand + dw door + dw doeor + dw donegate + dw doleft + dw :rts ;just in case +:rts rts + +doflags php + rep $30 + stz :yext + stz :xext + lda op ;get the opflags + and #flagmask ;clear any unneeded bits + sta :myflags ;save it + cmp #gt.lt.eq&flagmask ;is it <=>? + jeq :true ;yes so must be true + + lda xrel + bmi :y + cmp #$7fff + beq :y + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #26 + lda [lableptr],y + bit #externalbit + beq :y + dec :xext +:y lda yrel + bmi :test + cmp #$7fff + beq :test + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #26 + lda [lableptr],y + bit #externalbit + beq :test + dec :yext +:test lda :myflags + cmp #gt.lt&flagmask is + bne :stz + lda :myflags + and #gt.lt&flagmask!$FFFF ;clear <> flags + ora #noteq&flagmask ;set not = flag + sta :myflags + +:stz stz :flags + lda yreg + cmp xreg + bne :noteq + lda yreg+2 + cmp xreg+2 + bne :noteq + lda #eq&flagmask + tsb :flags ;tell us it's equal + jmp :xit +:noteq lda #noteq&flagmask ;tell us it's not = + tsb :flags +:trylt lda yreg+2 ;check the signs of the values + eor xreg+2 + bmi :diff + lda yreg + sec + sbc xreg + lda yreg+2 + sbc xreg+2 + bcc :lt + bra :gt +:diff lda yreg+2 + bmi :lt + bra :gt +:lt lda #lt&flagmask + tsb :flags + bra :xit +:gt lda #gt&flagmask + tsb :flags +:xit lda :myflags + cmp #lt&flagmask + beq :lt1 + cmp #gt&flagmask + beq :gt1 + lda :xext + ora :yext + beq :newxit +:bad sec + ror evalrelok + jmp :false +:lt1 lda :xext + ora :yext + beq :newxit + lda :xext + beq :lt2 + lda yreg + cmp #$100 + bne :bad + lda yreg+2 + bne :bad + jmp :newxit +:lt2 lda xreg + cmp #$100 + bne :bad + lda xreg+2 + bne :bad + jmp :newxit +:gt1 lda :xext + ora :yext + beq :newxit + lda :xext + beq :gt2 + lda yreg + cmp #$FF + bne :bad + lda yreg+2 + bne :bad + jmp :newxit +:gt2 lda xreg + cmp #$FF + bne :bad + lda xreg+2 + bne :bad +:newxit lda :flags + and :myflags + beq :false +:true rep $30 + lda #$01 + sta xreg + stz xreg+2 + plp + clc + rts +:false rep $30 + stz xreg + stz xreg+2 + plp + clc + rts +:myflags ds 2 +:flags ds 2 +:yext ds 2 +:xext ds 2 + +donegate php + rep $30 + lda xreg+2 + eor #$ffff + tax + lda xreg + eor #$ffff + inc + bne :sta + inx +:sta sta xreg + stx xreg+2 + plp + rts + +doright +doleft rts + +doplus php + rep $30 + lda xrel + ora yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + lda yreg + clc + adc xreg + sta xreg + lda yreg+2 + adc xreg+2 + sta xreg+2 + plp + rts + +dominus php + rep $30 + + do 0 + lda xrel + jsr prbytel + lda #$20 + jsr drawchar + lda yrel + jsr prbytel + lda #$20 + jsr drawchar + fin + +:lda lda yreg + sec + sbc xreg + sta xreg + lda yreg+2 + sbc xreg+2 + sta xreg+2 + + lda yrel ;were either relative? + and xrel + bmi :plp ;if neither exit + lda yrel ;was just one a relative? + eor xrel + bmi :xrel + lda #$ffff + jmp :sta +:xrel lda yrel + bmi :plp + +:sta sta xrel +:plp + do 0 + lda xrel + jsr prbytel + lda #$20 + jsr drawchar + lda yrel + jsr prbytel + lda #$0d + jsr drawchar + fin + plp + rts + +door php + rep $30 + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + lda yreg + ora xreg + sta xreg + lda yreg+2 + ora xreg+2 + sta xreg+2 + plp + rts +doand php + rep $30 + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + lda yreg + and xreg + sta xreg + lda yreg+2 + and xreg+2 + sta xreg+2 + plp + rts +doeor php + rep $30 + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + lda yreg + eor xreg + sta xreg + lda yreg+2 + eor xreg+2 + sta xreg+2 + plp + rts + +domult php + rep $30 + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + stz val + stz val+$2 + lda yreg + sta myvalue + lda yreg+2 + sta myvalue+2 + ldx #32 +:mloop lsr xreg+$2 + ror xreg + bcc :noadd + lda myvalue + clc + adc val + sta val + lda myvalue+$2 + adc val+$2 + sta val+$2 +:noadd asl myvalue + rol myvalue+$2 + dex + bne :mloop + lda val + sta xreg + lda val+$2 + sta xreg+$2 + plp + rts + +dodiv php + rep $30 + + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + psl #$00 + psl #$00 + lda yreg+2 + pha + lda yreg + pha + lda xreg+2 + pha + lda xreg + pha + tll $0d0b + pla + sta xreg + pla + sta xreg+2 + pla + pla + plp + rts + +domod php + rep $30 + + lda xrel + and yrel + bmi :ok + sec + ror evalrelok + plp + rts + +:ok lda xrel + bpl :ok1 + lda yrel + sta xrel +:ok1 + psl #$00 + psl #$00 + lda yreg+2 + pha + lda yreg + pha + lda xreg+2 + pha + lda xreg + pha + tll $0d0b + pla + pla + pla + sta xreg + pla + sta xreg+2 + plp + rts + + +pushstack php + rep $30 + lda estack + cmp #40 + bge :err + asl + asl + asl + tax + lda yreg + sta evalstack,x + lda yreg+2 + sta evalstack+2,x + lda op + sta evalstack+4,x + lda yrel + sta evalstack+6,x + inc estack + plp + clc + rts +:err lda #evaltoocomplex + plp + sec + rts + +pullstack php + rep $30 + lda estack + beq :err + dec + sta estack + asl + asl + asl + tax + lda evalstack,x + sta yreg + lda evalstack+2,x + sta yreg+2 + lda evalstack+4,x + sta op + lda evalstack+6,x + sta yrel + plp + clc + rts +:err lda #evaltoocomplex + plp + sec + rts + + +getnum php + rep $30 + lda #$FFFF + sta zrel +:nextch lda (lineptr),y + and #$7f + cmp #' '+1 + bge :jmp +:noop pea #noop + jmp :operand +:operandiny iny +:operand rep $30 + pla + plp + rep $41 + rts +:number plp + sep $40 + clc + rts +:error rep $30 + pla + plp + sec + rts + + +:jmp pha + sec + sbc #' ' + asl + tax + pla + jmp (:chartbl,x) + +:flags stz :flag+1 + cmp #'#' + beq :noteq +:fl1 rep $20 + sec + sbc #'<' + asl + tax + lda :flagtbl,x + tsb :flag+1 +:fl2 iny + sep $20 + lda (lineptr),y + cmp #'#' + beq :noteq + cmp #'<' + blt :flag + cmp #'>'+1 + blt :fl1 +:flag pea $0000 + jmp :operand +:noteq rep $20 + lda #noteq + tsb :flag+1 + jmp :fl2 +:flagtbl dw #lt + dw #eq + dw #gt + +:left pea #leftbrace + jmp :operandiny +:minus bit number + bmi :negate + pea #minusop + jmp :operandiny +:negate pea #negateop + jmp :operandiny +:mult bit number + jmi :lable + pea #multop + jmp :operandiny +:plus bit number + bpl :plus1 + iny + jmp :nextch +:plus1 pea #plusop + jmp :operandiny +:mod sty offset + pea #modop + jmp :operandiny +:div ldy offset + iny + lda (lineptr),y + and #$7f + cmp #'/' + beq :mod + dey +:divit pea #divop + jmp :operandiny +:eor pea #eveorop + jmp :operandiny +:or pea #evorop + jmp :operandiny +:and pea #evandop + jmp :operandiny +:checkop bit number + bpl :chkno +:golab jmp :lable +:chkno pea #noop + jmp :operandiny +:right bit number + bmi :golab + pea #rightbrace + jmp :operandiny + +:badop pea #badoperand + jmp :error +:bad +:badchar pea #badopchar + jmp :error +:chartbl + dw $0000 ; + dw :eor ;! + dw :ascii ;" + dw :flags ;# + dw :hex ;$ + dw :binary ;% + dw :and ;& + dw :ascii ;' + dw :bad ;( + dw :checkop ;) + dw :mult ;* + dw :plus ;+ + dw :noop ;, + dw :minus ;- + dw :or ;. + dw :div ;/ + dw :decimal ;0 + dw :decimal ;1 + dw :decimal ;2 + dw :decimal ;3 + dw :decimal ;4 + dw :decimal ;5 + dw :decimal ;6 + dw :decimal ;7 + dw :decimal ;8 + dw :decimal ;9 + dw :lable ;: + dw :noop ;; + dw :flags ;< + dw :flags ;= + dw :flags ;> + dw :lable ;? + dw :lable ;@ + dw :lable ;A + dw :lable ;B + dw :lable ;C + dw :lable ;D + dw :lable ;E + dw :lable ;F + dw :lable ;G + dw :lable ;H + dw :lable ;I + dw :lable ;J + dw :lable ;K + dw :lable ;L + dw :lable ;M + dw :lable ;N + dw :lable ;O + dw :lable ;P + dw :lable ;Q + dw :lable ;R + dw :lable ;S + dw :lable ;T + dw :lable ;U + dw :lable ;V + dw :lable ;W + dw :lable ;X + dw :lable ;Y + dw :lable ;Z + dw :lable ;[ + dw :lable ;\ + dw :checkop ;] + dw :lable ;^ + dw :lable ;_ + dw :lable ;` + dw :lable ;a + dw :lable ;b + dw :lable ;c + dw :lable ;d + dw :lable ;e + dw :lable ;f + dw :lable ;g + dw :lable ;h + dw :lable ;i + dw :lable ;j + dw :lable ;k + dw :lable ;l + dw :lable ;m + dw :lable ;n + dw :lable ;o + dw :lable ;p + dw :lable ;q + dw :lable ;r + dw :lable ;s + dw :lable ;t + dw :lable ;u + dw :lable ;v + dw :lable ;w + dw :lable ;x + dw :lable ;y + dw :lable ;z + dw :left ;{ + dw :lable ;| + dw :right ;} + dw :lable ;~ + dw :lable ; + + +:hex rep $20 + stz val + stz val+2 + stz :valid + sep $20 + iny + lda (lineptr),y + cmp #' '+1 + blt :hexbad +]lup sep $20 + lda (lineptr),y + cmp #'0' + blt :hexout + cmp #'9'+1 + blt :hexdig + cmp #'A' + blt :hexout + cmp #'Z'+1 + blt :hexdiga + cmp #'a' + blt :hexout + cmp #'z'+1 + bge :hexout + and #$5f +:hexdiga sec + sbc #$37 + jmp :hdig +:hexdig sec + sbc #$30 +:hdig sec + ror :valid+1 + rep $20 + and #$0f + asl val + rol val+2 + asl val + rol val+2 + asl val + rol val+2 + asl val + rol val+2 + tsb val + +:hexiny iny + jmp ]lup +:hexout rep $20 + bit :valid + bpl :hexbad + jmp :numout +:hexbad pea #badopchar + jmp :error +:valid ds 2 + +:binary rep $20 + stz val + stz val+2 + stz :valid + sep $20 + iny + lda (lineptr),y + cmp #' '+1 + blt :binbad +]lup sep $20 + lda (lineptr),y + cmp #'_' + beq :biny + cmp #'0' + blt :binout + cmp #'1'+1 + bge :binout + lsr + rep $20 + rol val + rol val+2 + sec + ror :valid +:biny iny + jmp ]lup +:binout rep $20 + bit :valid + bpl :binbad + jmp :numout +:binbad pea #badopchar + jmp :error + +:decimal rep $20 + ldx #$00 + stz val ;past 1st digit... + stz val+$2 + sep $20 +:dlup lda (lineptr),y + cmp #'0' + blt :ddec + cmp #'9'+$1 + bge :ddec +:ddig sta :valstr+$1,X + iny + inx + cpx #10 + blt :dlup +:ddec phy + txy + rep $20 + beq :ddone + lda #cnvttbl + sta deczp +:dloop lda :valstr,x + and #$000F + asl + asl + tay + lda (deczp),Y + adc val + sta val + iny + iny + lda (deczp),Y + adc val+$2 + sta val+$2 + lda deczp + clc + adc #40 + sta deczp + dex + bne :dloop +:ddone rep $20 + ply + jmp :numout + +:ascii sep $20 + sta :deliminator + stz :orflag + iny + cmp #$27 + bge :asclda + sec + ror :orflag +:asclda lda (lineptr),y + cmp #' ' + blt :ascbad + iny + cmp :deliminator + beq :asczero + xba + lda (lineptr),y + cmp #' ' + blt :ascbad + cmp :deliminator + beq :asc1 + xba + tax + iny + lda (lineptr),y + cmp :deliminator + bne :ascbad + rep $20 + txa + xba + sep $20 +:asc2 ora :orflag + xba + ora :orflag + iny + rep $20 + ldx #$00 + jmp :number +:asc1 xba + iny + rep $20 + and #$ff + ora :orflag + ldx #$00 + jmp :number +:asczero rep $20 + ldx #$00 + txa + jmp :number +:ascbad pea #badopchar + jmp :error + +:deliminator ds 2 +:orflag ds 2 + +:lable rep $20 + stz val + stz val+2 + sep $20 +:lsta ldx #$00 +]lup lda (lineptr),y + cmp #'0' + blt :lxit + cmp #'<' + blt :iny + cmp #'>'+1 + blt :lxit + cmp #'}' + beq :brace + cmp #']' + bne :iny + cpx #$00 + bne :lxit + jmp :iny +:brace lda evallevel + bne :lxit +* lda evallevel ;don't need to do this here +* bne :lxit ;unless level>256 + lda #'}' +:iny cpx #$0f + bge :iny1 + sta labstr+1,x +:iny1 iny + inx + jmp ]lup +:lxit txa + cmp #$0f+1 + blt :lx + lda #$0f +:lx sta labstr + sty :next + jsr findlable + bcs :lfound + rep $30 + ldy passnum + bne :errlab + sep $20 + lda #$FF + sta notfound + rep $20 + jmp :lbxit +:errlab lda #undeflable + jmp :errxit +:lfound rep $30 + ldy #26 + lda [lableptr],y + pha + ldy #16 + lda [lableptr],y + ldy #26 + lda [lableptr],y + ora #linkusedbit ;indicate used! + sta [lableptr],y + pla + ora #$8000 + + do 0 + and #$dfff + cmp #$8080 ;Macro??? + bne :lbmi + lda #undeflable + jmp :errxit +:lbmi and #$8000 + bne :lsta1 + lda modeflag + bit #relflag + beq :labcont + bit #dumflag + bne :labcont + ldy #16 + lda [lableptr],y + sta zrel + fin + +:labcont rep $30 +:lsta1 ldy #28 + lda [lableptr],y + sta val + ldy #30 + lda [lableptr],y + sta val+2 +:lbxit ldy :next + +:numout rep $30 +:lda lda val + ldx val+2 + +:clc jmp :number + +:errxit +:sec rep $30 + pha + jmp :error + +:valstr ds 16,0 +:next ds 2 + +evalstack ds 40*8 + +cnvttbl adrl 0,1,2,3,4,5,6,7,8,9 + adrl 0,10,20,30,40,50,60,70,80,90 + adrl 0,100,200,300,400,500,600,700,800,900 + adrl 0,1000,2000,3000,4000,5000,6000,7000,8000,9000 + adrl 0,10000,20000,30000,40000,50000,60000,70000,80000,90000 + adrl 0,100000,200000,300000,400000,500000,600000,700000,800000 + adrl 900000 + adrl 0,1000000,2000000,3000000,4000000,5000000,6000000,7000000 + adrl 8000000,9000000 + adrl 0,10000000,20000000,30000000,40000000,50000000,60000000 + adrl 70000000,80000000,90000000 + adrl 0,100000000,200000000,300000000,400000000,500000000 + adrl 600000000,7000000000,800000000,900000000 + adrl 0,1000000000,2000000000,3000000000,4000000000,5000000000 + adrl 6000000000,7000000000,8000000000,900000000 + diff --git a/src/link/link.express.s b/src/link/link.express.s new file mode 100644 index 0000000..e8d0647 --- /dev/null +++ b/src/link/link.express.s @@ -0,0 +1,1345 @@ +writeexp php + rep $30 + stz :errcode + stz :delflag + jsr randomize + pha + psl #tempname+12 + pea 4 + tll $220b ;int2hex + + jsr einitvars + jcs :errxit + jsr readfile + jcs :errxit + jsr buildexp + jcs :errxit + + jsr writesegments + jcs :errxit + jsr writeexphdr + jcs :errxit + jmp :xit +:errxit rep $30 + sta :errcode +:xit rep $30 + lda infileopen + beq :1 + _close infileopen + stz infileopen +:1 lda eoutfileopen + beq :3 + _close eoutfileopen + stz eoutfileopen +:3 lda :errcode + bne :delete + _Destroy indelete + bcc :rename + sta :errcode + jmp :delete +:rename dec :delflag + _ChangePath renameparm + bcc :2 + sta :errcode +:delete + _Destroy outdelete +:2 rep $30 + lda :errcode + cmp #$00 + beq :good + lda :delflag + beq :p0 + psl #badstr1 + jmp :p +:p0 psl #badstr +:p _QADrawstring + lda :errcode + jsr prbytel + lda #$0d + jsr drawchar + jmp :xit1 +:good psl #goodstr + _QADrawstring +:xit1 lda #$0d + jsr drawchar + plp + lda :errcode + cmp one + rts +:errcode ds 2 +:delflag ds 2 +goodstr str 'successful.',0d +badstr str 'unsuccessful. Error $' +badstr1 str 'unsuccessful, output file DELETED.',0d + +einitvars php + rep $30 + stz remapseg + stz segdataptr + stz segdataptr+2 + stz segdatahdl + stz segdatahdl+2 + stz seghdrptr + stz seghdrptr+2 + stz seghdrhdl + stz seghdrhdl+2 + stz expptr + stz expptr+2 + stz exphdl + stz exphdl+2 + stz currentseg + stz currentseghdr + + stz numsegments + stz infileopen + stz eoutfileopen + ldx #$00 + lda #$00 +]lup sta segdata,x + inx + inx + cpx #32*emaxsegments + blt ]lup + _getfileinfo ininfo + jcs :sec + lda intype + and #$f0 + cmp #$b0 + beq :open + lda #notomf + jmp :sec +:open _open infileopen + jcs :sec + lda infileopen + sta inread + sta ineofparm + + + _Destroy outdelete + _create outcreate + jcs :sec + _open eoutfileopen + jcs :sec + lda eoutfileopen + sta outread + sta outeofparm +:clc plp + clc + rts +:sec plp + sec + rts + +buildexp php + rep $30 + stz expsize+2 + lda numsegments ;(numsegments*10)+2 + asl + pha + asl + asl + clc + adc 1,s + clc + adc #$02+6+4 ;2 for count, 5 for elconst rec+1 for end + sta expsize + pla + lda #expseghdrlen + clc + adc expsize + sta expsize + bcc :stz + inc expsize+2 +:stz stz :ct +]lup lda :ct + cmp numsegments + bge :done + asl + asl + asl + asl + asl + tax + lda segdata+enamelen,x + clc + adc #58+1 + clc + adc expsize + sta expsize + bcc :next + inc expsize+2 +:next inc :ct + bra ]lup +:done + psl #$00 + psl expsize + lda userid + ora #linkmemid + pha + pea $8000 + psl #$00 + _newhandle + plx + ply + jcs :errxit + stx exphdl + sty exphdl+2 + ldy #$02 + lda [exphdl] + sta expptr + lda [exphdl],y + sta expptr+2 + + ldy #$00 + lda #$00 +]lup sta [expptr],y + iny + iny + cpy expsize + blt ]lup + + do 0 + lda expsize+2 + jsr prbytel + lda expsize + jsr prbytel + lda #$0d + jsr drawchar + fin + + pea $00 + jmp :xit +:errxit rep $30 + pha +:xit rep $30 + pla + plp + cmp one + rts +:ct ds 2 + + +writeexphdr php + rep $30 + lda exphdl + ora exphdl+2 + jeq :badhdr + + lda #expseghdrlen+6+5 + sta :size + stz :size+2 + lda numsegments + asl + asl + asl + clc + adc :size + sta :size + lda #$00 + adc :size+2 + sta :size+2 + lda expptr + clc + adc :size + sta zpage + lda expptr+2 + adc :size+2 + sta zpage+2 + stz :size +]lup lda :size + cmp numsegments + bge :setwrite + asl + asl + asl + asl + asl + tax + lda segdata+oldsegnum,x + dec + asl + tay + lda segdata+newsegnum,x + sta [zpage],y + inc :size + bra ]lup +:setwrite lda expsize + sta expbytecnt + sec + sbc #expseghdrlen+6 + sta expdsize + sta explength + lda expsize+2 + sta expbytecnt+2 + sbc #^expseghdrlen+6 + sta expdsize+2 + sta explength+2 + lda numsegments + sta expnum + + ldy #$00 + sep $20 +]lup lda expresshdr,y + sta [expptr],y + iny + cpy #expseghdrlen+5+6 + blt ]lup + rep $20 + + + stz outeof + stz outeof+2 + _setmark outeofparm + jcs :errxit + lda expsize + sta outrequest + lda expsize+2 + sta outrequest+2 + lda expptr + sta outbuffer + lda expptr+2 + sta outbuffer+2 + _write outread + jcs :errxit + + jmp :noerr +:badhdr pea #invalidexphdr + jmp :xit +:noerr pea $00 + jmp :xit +:errxit rep $30 + pha +:xit rep $30 + pla + plp + cmp one + rts +:size ds 2 + + +writesegments php + rep $30 + lda expsize + sta outeof + lda expsize+2 + sta outeof+2 + _seteof outeofparm + bcs :err + _setmark outeofparm + bcs :err + + lda #expseghdrlen+6+5 + sta expoffset + stz expoffset+2 + lda expsize + sta filemark + lda expsize+2 + sta filemark+2 + + lda numsegments + asl + pha + asl + asl + clc + adc 1,s + sta 1,s + pla ;*10 + clc + adc expoffset + sta expoffset + lda #$00 + adc expoffset+2 + sta expoffset+2 + + lda #$02 + sta remapseg + jsr winitsegs + bcs :err + jsr wcode1seg + bcs :err + jsr wdpsegs + bcs :err + jsr wscodesegs + bcs :err + jsr wstatics + bcs :err + jsr wdyncodesegs + bcs :err + jsr wdynsegs + bcs :err + + plp + clc + rts +:err plp + sec + rts + + +wdpsegs +wstatics +wdyncodesegs +wdynsegs + clc + rts + +winitsegs php + rep $30 + stz :ct +]lup lda :ct + cmp numsegments + bge :done + asl + asl + asl + asl + asl + tax + stx :offset + lda segdata+ekind,x + bmi :next ;it's dynamic + bit #$10 ;init segment? + beq :next + lda segdata+processed,x + bne :next + lda segdata+oldsegnum,x + jsr processseg + bcs :err + ldx :offset + lda #$ffff + sta segdata+processed,x + lda remapseg + sta segdata+newsegnum,x + inc remapseg +:next inc :ct + jmp ]lup +:done plp + clc + rts +:err plp + sec + rts +:offset ds 2 +:ct ds 2 + + +wcode1seg php + rep $30 + stz :ct +]lup lda :ct + cmp numsegments + bge :done + asl + asl + asl + asl + asl + tax + stx :offset + lda segdata+ekind,x + bmi :next ;it's dynamic + and #$ff ;code segment? + bne :next + lda segdata+processed,x + bne :next + lda segdata+oldsegnum,x + jsr processseg + bcs :err + ldx :offset + lda #$ffff + sta segdata+processed,x + lda remapseg + sta segdata+newsegnum,x + inc remapseg + jmp :done +:next inc :ct + jmp ]lup +:done plp + clc + rts +:err plp + sec + rts +:offset ds 2 +:ct ds 2 + +wscodesegs php + rep $30 + stz :ct +]lup lda :ct + cmp numsegments + bge :done + asl + asl + asl + asl + asl + tax + stx :offset + lda segdata+ekind,x + bmi :next ;it's dynamic + and #$ff ;code segment? + bne :next + lda segdata+processed,x + bne :next + lda segdata+oldsegnum,x + jsr processseg + bcs :err + ldx :offset + lda #$ffff + sta segdata+processed,x + lda remapseg + sta segdata+newsegnum,x + inc remapseg +:next inc :ct + jmp ]lup +:done plp + clc + rts +:err plp + sec + rts +:offset ds 2 +:ct ds 2 + + +processseg php ;enter with old segnum in A + rep $30 + sta :segnum + + jsr readseg + jcs :errxit + + stz lcsize + stz lcsize+2 + stz relocsize + stz relocsize+2 + + lda segdataptr + sta zpage + lda segdataptr+2 + sta zpage+2 +]lup lda [zpage] + and #$ff + cmp #$00 + jeq :next + cmp #$f1 + jeq :ds + cmp #$f2 + jeq :elconst + cmp #$f5 + jeq :creloc + cmp #$f6 + jeq :cinterseg + cmp #$f7 + jeq :super + cmp #$e2 + jeq :reloc + cmp #$e3 + jeq :interseg + lda #badomfrec + jmp :errxit +:next lda :segnum + dec + asl + asl + asl + asl + asl + tax + stx :xoffset + inc relocsize + bne :n1 + inc relocsize+2 +:n1 lda relocsize + sta segdata+srelocsize,x + lda relocsize+2 + sta segdata+srelocsize+2,x + lda lcsize + clc + adc #$05 + sta lcsize + sta segdata+slcsize,x + lda lcsize+2 + adc #$00 + sta lcsize+2 + sta segdata+slcsize+2,x + jmp :final + +:ds ldy #$01 + lda [zpage],y + clc + adc lcsize + sta lcsize + ldy #$03 + lda [zpage],y + adc lcsize+2 + sta lcsize+2 + lda #$05 + jmp :addlc +:elconst ldy #$01 + lda [zpage],y + clc + adc lcsize + sta lcsize + ldy #$03 + lda [zpage],y + adc lcsize+2 + sta lcsize+2 + ldy #$01 + lda [zpage],y + clc + adc zpage + tax + ldy #$03 + lda [zpage],y + adc zpage+2 + sta zpage+2 + stx zpage + lda #$05 + jmp :addlc +:super ldy #$01 + lda [zpage],y + clc + adc relocsize + sta relocsize + ldy #$03 + lda [zpage],y + adc relocsize+2 + sta relocsize+2 + ldy #$01 + lda [zpage],y + clc + adc zpage + tax + ldy #$03 + lda [zpage],y + adc zpage+2 + sta zpage+2 + stx zpage + lda #$05 + jmp :addreloc + +:reloc lda #11 + jmp :addreloc +:interseg lda #15 + jmp :addreloc +:creloc lda #7 + jmp :addreloc +:cinterseg lda #8 + jmp :addreloc +:addlc clc + adc zpage + sta zpage + lda #$00 + adc zpage+2 + sta zpage+2 + jmp ]lup +:addreloc pha + clc + adc zpage + sta zpage + lda #$00 + adc zpage+2 + sta zpage+2 + pla + clc + adc relocsize + sta relocsize + lda #$00 + adc relocsize+2 + sta relocsize+2 + jmp ]lup + +:final rep $30 + lda remapseg + dec + dec ;this starts at 2 + asl + asl + asl + clc + adc #$06+expseghdrlen+5 + tay + sty :where + lda expoffset + sec + sbc :where + sta [expptr],y + + lda expptr + clc + adc expoffset + sta zpage + lda expptr+2 + adc expoffset+2 + sta zpage+2 + ldy #$02 + ldx :xoffset + lda segdata+headerlen,x + clc + adc filemark + sta [zpage] + lda #$00 + adc filemark+2 + sta [zpage],y + ldy #$04 + lda lcsize + sta [zpage],y + ldy #$06 + lda lcsize+2 + sta [zpage],y + ldy #$02 + lda [zpage] + clc + adc lcsize + sta :temp + lda [zpage],y + adc lcsize+2 + sta :temp+2 + ldy #$08 + lda :temp + sta [zpage],y + ldy #$0a + lda :temp+2 + sta [zpage],y + ldy #$0c + lda relocsize + sta [zpage],y + ldy #$0e + lda relocsize+2 + sta [zpage],y + + ldy #$22 + lda remapseg + sta [seghdrptr],y + + ldx #$0c + ldy #$10 + sep $20 +]lup phy + txy + lda [seghdrptr],y + ply + sta [zpage],y + inx + iny + cpx #32+$c + blt ]lup + ldx :xoffset + lda segdata+enamelen + ldy #$3a + sta [zpage],y + rep $20 + and #$ff + sta :enamelen + ldy #$28 + lda [seghdrptr],y + clc + adc #10 + tax + ldy #$3b + sep $20 +]lup phy + txy + lda [seghdrptr],y + ply + sta [zpage],y + iny + inx + dec :enamelen + bne ]lup + rep $20 + tya + clc + adc expoffset + sta expoffset + lda #$00 + adc expoffset+2 + sta expoffset+2 + ldx :xoffset + lda segdata+headerlen,x + clc + adc filemark + sta filemark + lda #$00 + adc filemark+2 + sta filemark+2 + lda lcsize + clc + adc filemark + sta filemark + lda lcsize+2 + adc filemark+2 + sta filemark+2 + lda relocsize + clc + adc filemark + sta filemark + lda relocsize+2 + adc filemark+2 + sta filemark+2 + jsr writeseg + jcs :errxit +:noerr pea $00 + jmp :xit +:errxit rep $30 + pha +:xit rep $30 + pla + plp + cmp one + rts +:temp ds 4 +:xoffset ds 2 +:enamelen ds 2,0 +:segnum ds 2 +:where ds 2 + +writeseg php + rep $30 + psl #$00 + psl seghdrhdl + _gethandlesize + pll outrequest + lda seghdrptr + sta outbuffer + lda seghdrptr+2 + sta outbuffer+2 + _write outread + jcs :err + psl #$00 + psl segdatahdl + _gethandlesize + pll outrequest + lda segdataptr + sta outbuffer + lda segdataptr+2 + sta outbuffer+2 + _write outread + jcs :err + plp + clc + rts +:err plp + sec + rts + +readseg php + rep $30 + sta :segnum + cmp #$00 + jeq :badseg + dec + cmp numsegments + jge :badseg + asl + asl + asl + asl + asl + tax + stx :offset + lda segdata+fileoffset,x + sta ineof + lda segdata+fileoffset+2,x + sta ineof+2 + _setmark ineofparm + jcs :errxit + lda seghdrhdl + ora seghdrhdl+2 + bne :resize + psl #$00 + psl #$01 + lda userid + ora #linkmemid + pha + pea $0000 + psl #$00 + _newhandle + plx + ply + jcs :errxit + stx seghdrhdl + sty seghdrhdl+2 +:resize psl seghdrhdl + _Hunlock + ldx :offset + pea $00 + lda segdata+headerlen,x + pha + psl seghdrhdl + _sethandlesize + php + pha + psl seghdrhdl + _Hlock + pla + plp + jcs :errxit + ldy #$02 + lda [seghdrhdl] + sta seghdrptr + lda [seghdrhdl],y + sta seghdrptr+2 + + lda seghdrptr + sta inbuffer + lda seghdrptr+2 + sta inbuffer+2 + ldx :offset + lda segdata+headerlen,x + sta inrequest + stz inrequest+2 + _read inread + jcs :errxit + + lda segdatahdl + ora segdatahdl+2 + bne :resize1 + + psl #$00 + psl #$01 + lda userid + ora #linkmemid + pha + pea $0000 + psl #$00 + _newhandle + plx + ply + jcs :errxit + stx segdatahdl + sty segdatahdl+2 +:resize1 psl segdatahdl + _Hunlock + ldx :offset + ldy #$02 + lda [seghdrptr] ;get bytecnt + sec + sbc segdata+headerlen,x + sta inrequest + lda [seghdrptr],y + sbc #$00 + sta inrequest+2 + pha + lda inrequest + pha + psl segdatahdl + _sethandlesize + php + pha + psl segdatahdl + _Hlock + pla + plp + jcs :errxit + ldy #$02 + lda [segdatahdl] + sta segdataptr + lda [segdatahdl],y + sta segdataptr+2 + + lda segdataptr + sta inbuffer + lda segdataptr+2 + sta inbuffer+2 + _read inread + jcs :errxit + lda :segnum + sta currentseg + jmp :noerr +:badseg pea #badsegnum + jmp :xit +:noerr pea $00 + jmp :xit +:errxit rep $30 + pha +:xit rep $30 + pla + plp + cmp one + rts +:offset ds 2 +:segnum ds 2 + +readfile php + rep $30 +:next lda numsegments + cmp #emaxsegments + blt :read + lda #toomanysegs + jmp :errxit +:read _getmark ineofparm + jcs :errxit + lda ineof + sta :offset + lda ineof+2 + sta :offset+2 + lda #:buffer + sta inbuffer + lda #^:buffer + sta inbuffer+2 + lda #44 + sta inrequest + stz inrequest+2 + _read inread + bcc :setup + cmp #$4c + jeq :noerr + jmp :errxit +:setup lda intransfer + cmp #44 + jne :notomf + lda intransfer+2 + jne :notomf + lda :buffer+$F + and #$ff + cmp #$02 + jlt :notver2 + + lda #:namebuff + sta inbuffer + lda #^:namebuff + sta inbuffer+2 + + + lda :buffer+$2a + sec + sbc #44 + sta inrequest + stz inrequest+2 + _read inread + jcs :errxit + + lda :buffer+$2a ;offset to data + sec + sbc :buffer+$28 ;- offset to names + sec + sbc #10 ;-10 (for load name field) = esegname length + sta :len + lda :buffer+$28 + sec + sbc #34 + tax + ldy #$00 + lda :express + and #$ff + sta :len1 + sep $20 + cmp :len + beq :cmp + bge :rep +:cmp +]lup lda :namebuff,x + and #$7f + cmp #'a' + blt :chk + cmp #'z'+1 + bge :chk + and #$5f +:chk cmp :express+1,y + bne :rep + iny + inx + cpy :len1 + blt ]lup + rep $30 + lda #alreadyexpressed + jmp :errxit + +:rep rep $30 + lda numsegments + asl + asl + asl + asl + asl + tax + lda :buffer+$14 ;get kind + sta segdata+ekind,x + lda :offset + sta segdata+fileoffset,x + lda :offset+2 + sta segdata+fileoffset+2,x + lda :buffer+$22 + sta segdata+oldsegnum,x + lda :buffer+$2a + sta segdata+headerlen,x + + lda :buffer+$2a ;offset to data + sec + sbc :buffer+$28 ;- offset to names + sec + sbc #10 ;-10 (for load name field) = esegname length + sta segdata+enamelen,x + + stz segdata+processed,x + + lda :buffer + clc + adc :offset + sta ineof + lda :buffer+2 + adc :offset+2 + sta ineof+2 + inc numsegments + _setmark ineofparm + jcc :next + cmp #$4d ;mark past eof + beq :noerr + jmp :errxit +:noerr pea #$00 + jmp :xit +:notver2 pea #notomf2 + jmp :xit +:notomf pea #notomf + jmp :xit +:errxit rep $30 + pha +:xit rep $30 + pla + plp + cmp one + rts +:offset ds 4 +:len ds 2 +:len1 ds 2 +:express str 'EXPRESSLOAD' +:buffer ds 44,0 +:namebuff ds 100,0 + +random php ;save environment + phb + phk + plb + rep %00111001 + ldx indexi + ldy indexj + lda array-2,x + adc array-2,y + sta array-2,x + dex + dex + bne :dy + ldx #17*2 ;cycle index if at end of +:dy dey ; the array + dey + bne :setix + ldy #17*2 +:setix stx indexi + sty indexj + plb + plp + rts + +indexi da 17*2 ;the relative positions of +indexj da 5*2 ; these indexes is crucial + +array da 1,1,2,3,5,8,13,21,54,75,129,204 + da 323,527,850,1377,2227 + + err *-array-34 + +seed php + rep %00110000 +seed2 phb + phk + plb + pha + ora #1 ;at least one must be odd + sta array + stx array+2 + phx ;push index regs on stack + phy + ldx #30 +]lup sta array+2,x + dex + dex + lda 1,s ;was y + sta array+2,x + dex + dex + lda 3,s ;was x + sta array+2,x + lda 5,s ;original a + dex + dex + bne ]lup + lda #17*2 + sta indexi ;init proper indexes + lda #5*2 ; into array + sta indexj + jsr random ;warm the generator up. + jsr random + ply ;replace all registers + plx + pla + plb + plp + rts + +randomize php + rep %00110000 + lda #0 + pha + pha + pha + pha + ldx #$D03 ;readtimehex + jsl $E10000 + pla + plx + ply + sta 1,s ;trick to pull last word + pla ; fm stack without ruining + bra seed2 ; the previous ones. + + +print php + rep $30 + lda numsegments + jsr prbytel + lda #$0d + jsr drawchar + stz :ct +]lup lda :ct + cmp numsegments + bge :end + asl + asl + asl + asl + asl + sta :offset + tax + lda segdata+oldsegnum,x + jsr prbytel + lda #$20 + jsr drawchar + ldx :offset + lda segdata+ekind,x + jsr prbytel + lda #$20 + jsr drawchar + ldx :offset + lda segdata+headerlen,x + jsr prbytel + + lda #$20 + jsr drawchar + ldx :offset + lda segdata+enamelen,x + jsr prbytel + + + lda #$20 + jsr drawchar + ldx :offset + lda segdata+slcsize+2,x + jsr prbytel + ldx :offset + lda segdata+slcsize,x + jsr prbytel + + lda #$20 + jsr drawchar + ldx :offset + lda segdata+srelocsize+2,x + jsr prbytel + ldx :offset + lda segdata+srelocsize,x + jsr prbytel + + lda #$0d + jsr drawchar + inc :ct + jmp ]lup + +:end plp + rts +:offset ds 2 +:ct ds 2 + +tempname str 'expresstemp0000' + +infileopen ds 2 + adrl filename + adrl $00 + +eoutfileopen ds 2 + adrl tempname + adrl $00 + +outread dw 0 +outbuffer ds 4 +outrequest ds 4 +outtransfer ds 4 +inread dw 0 +inbuffer ds 4 +inrequest ds 4 +intransfer ds 4 +outeofparm ds 2 +outeof ds 4 +ineofparm ds 2 +ineof ds 4 +ininfo adrl filename + ds 2 +intype ds 2 + ds 18,0 +outcreate adrl tempname + dw $e3 + dw $B3 ;general OMF type + adrl $00 + dw $01 + adrl $00 + adrl $00 + +renameparm +outdelete adrl tempname +indelete adrl filename + +segdata ds 32*emaxsegments + +**** + +button pha + php + sep $20 +:1 ldal $e0c010 + ldal $e0c062 + bpl :1 + plp + pla + rts + +expresshdr +expbytecnt ds 4 + adrl $00 +explength ds 4 + dfb 0 + dfb elconst-esegname ;label length + dfb 4 ;numlen +expversion dfb 2 ;version + adrl $10000 ;bank size + dw $8001 ;kind field + dw 0 + adrl $00 ;org + adrl $00 ;align + dfb 0 ;numsex + dfb 0 ;revision +expsegnum dw $01 ;always seg #1 + adrl $00 ;entry + dw eloadname-expresshdr ;disp to names + dw elconst-expresshdr ;disp to data +eloadname asc 'QuickXPRES' +esegname asc 'ExpressLoad' +expseghdrlen equ *-expresshdr +elconst hex f2 +expdsize ds 4 + ds 4,0 ;reserved +expnum ds 2,0 + +one dw $01 + diff --git a/src/link/link.header.s b/src/link/link.header.s new file mode 100644 index 0000000..f51af48 --- /dev/null +++ b/src/link/link.header.s @@ -0,0 +1,501 @@ + lst off + cas in + tr on + exp only + + rel + xc + xc + mx %00 ; make sure we're in 16-bit mode! + + +doexpress = $01 + + use 4/util.macs + use qatools.macs + use 2/qa.equates + + brl start + + put link.vars + +userid ds 2 ;my userid +linkdp ds 2 +filename ds 130,0 +quickname ds 130,0 +txttypes hex 0204B0 +lnktype hex 01f8 + +start php + phb + phd + phk + plb + rep $30 + sta userid + tdc + sta linkdp + pea 0 + _QAStatus + pla + bne :ok + pld + plb + plp + rep $30 + jsl prodos + dw $29 + adrl :quit +:quit adrl $00 + dw $00 + +:ok rep $30 + stz prodoserr + stz quicklink + + pea 0 + psl #$00 + lda userid + pha + _QAGetMessagebyID + pla + sta subtype + pla + sta subtype+2 + pla + sta message + stz filename + lda message + beq :xit1 + cmp #maxlmessage + blt :call + lda #$FFFF + jmp :xit +:call dec + asl + tax + jsr (:tbl,x) + bra :xit +:bad lda #$FFFF + bra :xit +:xit1 lda #$00 +:xit rep $30 + pha + lda userid + ora #linkmemid + pha + _disposeall + pla + pld + plb + plp + cmpl :one + rtl +:one dw $01 + +:tbl dw cmdline + dw txtfile + dw fromhandle + dw doquicklink + dw project1 + dw project2 + +project1 php + rep $30 + lda #$46 + plp + cmp :one + rts +:one dw 1 +project2 php + rep $30 + lda #$46 + plp + cmp :one + rts +:one dw 1 + + +fromhandle php + rep $30 + psl #linkstr + _QADrawString + lda #'.' + jsr drawchar + lda #$0d + jsr drawchar + ldx subtype + ldy subtype+2 + jsl link + bcc :clc +:sec rep $30 + plp + sec + rts +:clc rep $30 + lda #$00 + plp + clc + rts + +txtfile php + rep $30 + psl #asmpath + _QAGetPath + lda asmpath + and #$ff + jeq :notfound + tay + sep $20 +]lup lda asmpath,y + tyx + and #$7f + sta filename,x + dey + bpl ]lup + lda filename + cmp #62 + bge :nosufx + tax + lda filename,x + cmp #'/' + beq :nosufx + cmp #':' + beq :nosufx + + inc filename + inc filename + inx + lda #'.' + sta filename,x + inx + lda #'S' + sta filename,x + +:nosufx rep $30 + psl #$00 + psl #filename + psl #$00 ;filepos + psl #-1 ;whole file + psl #txttypes + lda userid + ora #linkmemid + pha + psl #$00 + pea $8000 + _QALoadfile + plx + ply + jcs :sec + phx + phy + psl #linkstr + _QADrawString + lda #' ' + jsr drawchar + psl #filename + _QADrawString + lda #$0d + jsr drawchar + ply + plx + jsl link + bcc :clc + jmp :sec +:notfound rep $30 + lda #$46 +:sec rep $30 + plp + sec + rts +:clc rep $30 + lda #$0000 + plp + clc + rts + +doquicklink php + rep $30 + lda subtype + ora subtype+2 + bne :file + psl #$00 + psl #qtextend-qtext + lda userid + ora #linkmemid + pha + pea $8000 + psl #$00 + _Newhandle + plx + ply + jcs :sec + phy + phx + + psl #qtext + phy + phx + psl #qtextend-qtext + tll $2802 ;_PtrToHand + psl #quickname + _QAGetPath + lda #^quickname + sta subtype+2 + lda #quickname + sta subtype + jmp :go1 + +:file sep $30 + ldx :fname +]lup lda :fname,x + sta filename,x + dex + bpl ]lup + rep $30 + + psl #$00 + psl #filename + psl #$00 ;filepos + psl #-1 ;whole file + psl #txttypes + lda userid + ora #linkmemid + pha + psl #$00 + pea $8000 + _QALoadfile + plx + ply + bcc :go + cmp #$46 + beq :next + jmp :sec + +:next sep $30 + ldx :fname1 +]lup lda :fname1,x + sta filename,x + dex + bpl ]lup + rep $30 + psl #$00 + psl #filename + psl #$00 ;filepos + psl #-1 ;whole file + psl #txttypes + lda userid + ora #linkmemid + pha + psl #$00 + pea $8000 + _QALoadfile + plx + ply + jcs :sec + +:go phx + phy +:go1 psl #:quickstr + _QADrawString + lda #$FFFF + sta quicklink + psl #:zero + _QASetObjPath + ply + plx + jsl link + bcc :clc + jmp :sec +:notfound rep $30 + lda #$46 +:sec rep $30 + plp + sec + rts +:clc rep $30 + lda #$0000 + plp + clc + rts +:fname str 'QuickLINK.S' +:fname1 str '1:QASYSTEM:QuickLINK.S' +:quickstr str 0d,'Linking.',0d +:zero hex 0000 + +qtext asc ' OVR ALL',0D + asc ' ASM ',5D,'1',0D + asc ' LNK ',5D,'2',0D + asc ' SAV ',5D,'3',0D +qtextend + +cmdline php + rep $30 + psl #asmpath + pea 80 + _QAGetCmdLine + ldy #$01 + sep $30 + lda asmpath + beq :notfound +]lup lda asmpath,y + and #$7f + cmp #' ' + blt :notfound + bne :p1 + iny + jmp ]lup +:p1 iny +]lup lda asmpath,y + and #$7f + cmp #' ' + blt :notfound + beq :p2 + iny + jmp ]lup +:p2 iny +]lup lda asmpath,y + and #$7f + cmp #' ' + blt :notfound + bne :ok + iny + jmp ]lup +:ok ldx #$00 + sta filename+1,x +]get inx + iny + lda asmpath,y + and #$7f + cmp #' '+1 + blt :set + sta filename+1,x + jmp ]get +:notfound jmp :nf1 +:set txa + sta filename + rep $30 + lda filename + and #$ff + cmp #62 + bge :nosuff + tax + lda filename,x + and #$7f + cmp #'/' + beq :nosuff + cmp #':' + beq :nosuff + inx + lda #'.S' + sta filename,x + inx + txa + sep $20 + sta filename + +:nosuff rep $30 + psl #$00 + psl #filename + psl #$00 ;filepos + psl #-1 ;whole file + psl #txttypes + lda userid + ora #linkmemid + pha + psl #$00 + pea $8000 + _QALoadfile + plx + ply + jcs :xit + phy + phx + psl #linkstr + _QADrawString + lda #' ' + jsr drawchar + psl #filename + _QADrawString + lda #$0d + jsr drawchar + plx + ply + jsl link + bcs :xit + jmp :clc +:nf1 rep $30 + lda #$46 + jmp :xit +:clc rep $30 + lda #$0000 +:xit rep $30 + plp + cmp :one + rts +:one dw $01 + +linkstr str 0d,'Linking' + + +prbytel + php + rep $30 + pha + phx + phy + pha + _QAPrbytel + ply + plx + pla + plp + rts + +prbyte + php + rep $30 + pha + phx + phy + pha + _QAPrbyte + ply + plx + pla + plp + rts + + +drawchar phx + phy + pha + php + rep $30 + and #$7f + pha + _QADrawChar +:plp plp + pla + ply + plx + rts + + + put linker.1 + put linker.2 + put link.eval + do doexpress + put link.express + fin + put link.errors + +tempbuff ds 130 + + lst + chk + lst off + + typ exe + sav utility/qlinkgs.l + diff --git a/src/link/link.vars.s b/src/link/link.vars.s new file mode 100644 index 0000000..f35a215 --- /dev/null +++ b/src/link/link.vars.s @@ -0,0 +1,317 @@ + mx %00 +omfprint equ 0 + +maxlinklab equ $4000 ;8192 linker lables +maxfiles equ 100 ;maximum link files +maxsegs equ 256 + +namelen equ 10 ;length of segment names + +syntax equ $01+$80 +doserror equ $02+$80 +mismatch equ $5C + +badasmcmd equ $04 +badcmd equ $06+$80 +badlable equ $07 +outofmem equ $08+$80 +undeflable equ $09 +badoperand equ $0a +badrelative equ $0b +symfull equ $0c+$80 +baddictionary equ $0d+$80 +badexternal equ $0e +extnotzp equ $0f +maxsegments equ $10 +relfull equ $11+$80 +dupentry equ $12 +maxfileserr equ $13+$80 +onesave equ $14+$80 +badvalue equ $15+$80 +badalignop equ $16 +jmptblfull equ $17+$80 +baddsop equ $18+$80 +constraint equ $19+$80 +notresolved equ $20 +illegalcmd equ $21+$80 +filetoolarge equ $22 +nesterror equ $23+$80 +forwardref equ $24 +badopchar equ $25 +evaltoocomplex equ $26 +duplable equ $27 + +*** label bit flags (used in linker) + +linkgeqbit = %0100_0000_0000_0000 +linkequbit = %0010_0000_0000_0000 +linkequ1bit = %0001_0000_0000_0000 +linkentrybit = %0000_1000_0000_0000 +linkabsbit = %0000_0100_0000_0000 +linkusedbit = %0000_0010_0000_0000 +linkequvalid = %0000_0001_0000_0000 +linkentused = %0000_0000_1000_0000 + +*** label bit flags (used in assembler) *** + +localbit = %0000_0000_0000_0001 +variablebit = %0000_0000_0000_0010 +macrobit = %0000_0000_0000_0100 +equatebit = %0000_0000_0000_1000 +externalbit = %0000_0000_0001_0000 +macvarbit = %0000_0000_0010_0000 +linkerbit = %0001_0000_0000_0000 +usedbit = %0010_0000_0000_0000 +entrybit = %0100_0000_0000_0000 +absolutebit = %1000_0000_0000_0000 + + + + +**** Segment Record Offsets **** + dum $00 +kindfield ds 2 +alignfield ds 4 +dsfield ds 4 +orgfield ds 4 + dend + + do doexpress +**** ExpressLoad equates **** + +emaxsegments equ 12 ;only allow 12 segments in EXPRESS + +notomf equ $8001 +notomf2 equ $8002 +toomanysegs equ $8003 +alreadyexpressed equ $8004 +badsegnum equ $8005 +badomfrec equ $8006 +invalidexphdr equ $8007 + + dum $00 +oldsegnum ds 2 +newsegnum ds 2 +ekind ds 2 +fileoffset ds 4 +newfileoffset ds 4 +headerlen ds 2 +enamelen ds 2 +processed ds 2 +slcsize ds 4 +srelocsize ds 4 + dend + fin + +**** DP storage **** + dum $00 +zpage ds 4 +labstr ds 16 ;Lable STR that we are working on +labnum ds 2 ;REC num of current lable +lableft ds 2 ;B-Tree Structures +labright ds 2 +labprev ds 2 +lablocal ds 2 ;REC of Local Lable Tree +labtype ds 2 ;Type of Label +labval ds 4 ;EQU value of Lable +foundlable ds 32 ;lable REC returned from FINDLABLE +globlab ds 2 ;REC of Current Global Lable +myvalue ds 4 +lvalue ds 4 +caseflag ds 2 +lableptr ds 4 +lableptr1 ds 4 +nextlableptr ds 4 +asmnextlable ds 4 +lasmptr ds 4 +lasmptr1 ds 4 +cptr ds 4 +cptr1 ds 4 +clength ds 4 + +tempptr ds 4 +tempptr1 ds 4 +tempptr2 ds 4 +segmentptr ds 4 +relptr ds 4 + +filehandle ds 4 +filelen ds 4 +fileptr ds 4 +flen ds 4 +dirptr ds 4 +dirct ds 2 +linkaddress ds 4 +lineptr ds 4 +jmpptr ds 4 +jmphdl ds 4 +subtype ds 4 + +modeflag ds 2 +doflag = %0000_0000_1000_0000 + + do doexpress +*** Express DP *** +seghdrhdl ds 4 +seghdrptr ds 4 +segdatahdl ds 4 +segdataptr ds 4 +exphdl ds 4 +expptr ds 4 + fin + +xreg ds 4 ;variables used by EVAL +yreg ds 4 +val ds 4 +xrel ds 2 +yrel ds 2 +zrel ds 2 +op ds 2 +top ds 2 +deczp ds 2 + +workspace ds 16 + + lst +here = * + lst off + err */$100 + dend + + +asmpath ds 130,0 +rezpath ds 130,0 + +loadid ds 2 + + do doexpress +currentseg ds 2 +currentseghdr ds 2 +numsegments ds 2 +lcsize ds 4 +relocsize ds 4 +expsize ds 4 +remapseg ds 2 +expoffset ds 4 +filemark ds 4 + fin + +rellength ds 4 +interseg ds 2 +reloffset ds 4 +passnum ds 2 +omfoff1 ds 2 +omfoff2 ds 2 +omfshift ds 2 +omfbytes ds 2 +omfcode ds 2 +omflength ds 2 +linenum ds 2 +maxsegnum ds 2 +message ds 2 +domask ds 2 +dolevel ds 2 + + +orgval ds 4 +adrval ds 4 +globalhdl ds 4 +segmenthdl ds 4 +lnkflag ds 2 +lablect ds 2 +asmlablect ds 2 +cancelflag ds 2 +totalerrs ds 2 +linkversion ds 2 +omfversion ds 2 +verchg ds 2 +lkvchg ds 2 +zipflag ds 2 +notfound ds 2 +opflag ds 2 +shiftct ds 2 +savcount ds 2 +lableused ds 2 +noshift ds 4 +compresshdl ds 4 +outfileopen ds 2 +objok ds 2 +linktype ds 2 +totalbytes ds 4 +omfok ds 2 +bankorg ds 2 ;used to set segment load bank +jmplength ds 2 +dynamic ds 2 +extseg ds 2 +quicklink ds 2 + +linksymhdl ds 4 +linksymtbl ds 4 +linksymnum ds 2 +linknextlbl ds 4 + + +opmask ds 2 ;EVAL variables +number ds 2 +bracevalid ds 2 +estack ds 2 +evallevel ds 2 +evalrelok ds 2 +offset ds 2 +*shiftct ds 2 + + +errlable ds 16,0 +errpos ds 2 + +newlable ds 18,0 + +segheader +bytecnt ds 4 +resspc ds 4,0 +seglength ds 4 +lablen dw namelen*256 +numlen hex 04 +version hex 02 +banksize adrl $10000 +kind dw $1000 + ds 2,0 +org adrl $00 +align adrl $00 +numsex hex 00 + hex 00 +segnum ds 2 +entry adrl $00 +dispname dw 44 +disdata dw 54+namelen +loadname ds namelen +segname ds namelen +lconst hex f2 +lcbytes hex 00000000 + +seghdrlen dw lconst-segheader + + +omfheader1 +blkcount ds 4 +resspc1 ds 4 +seglength1 ds 4 +kind1 hex 00 +lablen1 dfb namelen +numlen1 dfb 4 +version1 dfb 1 +banksize1 adrl $10000 + adrl $00 +org1 adrl $00 +align1 adrl $00 +numsex1 dfb 0 +lcbank dfb 0 +segnum1 dw 0 +entry1 adrl 0 +dispname1 ds namelen*2+4 +lconst1 hex f200000000 + +seghdrlen1 dw lconst1-omfheader1 + +extrabytes ds 2 + diff --git a/src/link/linker.1.s b/src/link/linker.1.s new file mode 100644 index 0000000..6c5066c --- /dev/null +++ b/src/link/linker.1.s @@ -0,0 +1,5505 @@ + + +link php + rep $30 + stz cancelflag + sty filehandle+2 + stx filehandle + pha + pha + phy + phx + tll $1802 + plx + ply + jcs :err + + stx filelen + sty filelen+2 + + ldy #$04 + lda [filehandle],y + and #$7fff ; + sta [filehandle],y + + jsr :getmemory + jcs :err + + ldy #$04 + lda [filehandle],y + ora #$8000 + sta [filehandle],y + + + jsl linker + bcc :noerr + jmp :err +:noerr jsr :disposemem + rep $30 + lda #$00 + plp + clc + rtl +:err rep $30 + sta :errcode + jsr :disposemem + plp + lda :errcode + sec + rtl +:errcode ds 2 + +:getmemory clc + rts + +:disposemem php + rep $30 + lda userid + ora #linkmemid + pha + _disposeall + lda userid + ora #linkmemid+$100 + pha + _disposeall + lda userid + ora #linkmemid+$200 + pha + _disposeall + +:dxit plp + rts + +prodoserr ds 2 +ovrflag ds 2 +ovrallflag ds 2 +info adrl asmpath + ds 2 +ftype ds 2 +aux ds 4 + ds 14 + + +linker php + rep $30 + jsr initvars + psl #$00 + psl #$10000+$8 ;8 bytes for relocation overflow + lda userid + ora #linkmemid + pha + pea $8000 + psl #$00 + tll $0902 + plx + ply + jcs :memerr + txa + sta linksymhdl + tya + sta linksymhdl+2 + + psl #$00 + psl #maxlinklab*4 + ldal userid + ora #linkmemid + pha + pea $8000 + psl #$00 + tll $0902 + plx + ply + jcs :memerr + sty globalhdl+2 + sty workspace+2 + stx globalhdl + stx workspace + ldy #$02 + lda [workspace] + sta lableptr1 + lda [workspace],y + sta lableptr1+2 + lda #$ffff + sta lablect + jsr inclablect + bcs :memerr + jsr newsegment + bcs :memerr + jmp :ready +:memerr rep $30 + pha + jsr disposemem + pla + plp + sec + rtl +:ready rep $30 + _QAInitTotalErrs +:passloop rep $30 + stz linkaddress + stz linkaddress+$2 + stz ovrflag + stz ovrallflag + stz prodoserr + stz savcount + stz linenum + stz domask + stz dolevel + stz modeflag + lda #$01 + sta segnum + + ldy #$02 + lda [filehandle] + sta fileptr + lda [filehandle],y + sta fileptr+$2 + lda filelen + sta flen + lda filelen+$2 + sta flen+$2 + stz doneflag + lda flen + ora flen+$2 + bne :loop + jmp :done ;if file is 0 bytes + +:loop rep $30 + pea 0 + _QAGetCancelFlag + pla + beq :n + lda #$ffff + sta cancelflag +:n lda numfiles + cmp #maxfiles + blt :loop1 + lda #maxfileserr + jmp :lineerr +:loop1 ldy #$00 + sty linebuff + jsr readkey + bcc :bit + and #$7f + cmp #$1b + jeq :xitclc + cmp #'C'&$1f + jeq :xitclc +:bit bit cancelflag + jmi :xitclc + lda doneflag + beq :sep + jmp :done +:sep sep $30 + ldy #$00 + tyx +]getline lda [fileptr],y + phx + tax + ldal converttable,x + plx + sta linebuff+$1,x + bit quicklink + bpl :iny + cmp #']' + bne :iny + pha + phy + iny + lda [fileptr],y + and #$7f + cmp #'1' + beq :path + cmp #'2' + beq :object + cmp #'3' + bne :iply + bra :object1 +:path lda [subtype] + beq :iply + ldy #$01 +]n lda [subtype],y + sta linebuff+1,x + iny + inx + tya + cmp [subtype] + blt ]n + beq ]n + dex + lda 1,s + inc + sta 1,s + bra :iply +:object1 lda #$02 + sta :sbc+1 + bra :p1 +:object lda #$00 + sta :sbc+1 +:p1 phx + rep $30 + psl #asmpath + _QAGetObjPath + sep $30 + plx + lda asmpath + beq :iply + sec +:sbc sbc #$00 + bcc :iply + sta asmpath + ldy #$01 +]n lda asmpath,y + sta linebuff+1,x + iny + inx + cpy asmpath + blt ]n + beq ]n + dex + lda 1,s + inc + sta 1,s +:iply ply + pla +:iny iny + inx + cmp #$0D + beq :parsed +:cpy cpx #80 + jlt ]getline + lda #$0D + sta linebuff+$1,x + rep $10 +]eoln lda [fileptr],y + iny + and #$7F + cmp #$0D + bne ]eoln +:parsed rep $30 + txa + cmp #80 + blt :stalen + lda #80 +:stalen sep $20 + sta linebuff + sta linelen + rep $30 + tya + sta zpage + clc + adc fileptr + sta fileptr + lda #$00 + adc fileptr+$2 + sta fileptr+$2 + lda flen + sec + sbc zpage + sta flen + lda #$00 + sbc flen+$2 + sta flen+$2 + bcc :fdone + lda flen + ora flen+$2 + bne :doline +:fdone lda #$FFFF + sta doneflag +:doline inc linenum + jsr linkline + bcs :lineerr + jmp :loop ;do another line +:done rep $30 + bit passnum + bmi :xitclc + sec + ror passnum + jmp :passloop +:lineerr pha + jsr linkerror + pla + tax + and #$80 + jeq :loop + txa +* jmp :xit +:xitclc rep $30 + lda #$00 +:xit rep $30 + pha + bit outfileopen + bpl :x3 + lda 1,s + cmp #$00 + bne :close + jsr writejmpseg + bcc :close + sta 1,s +:close jsl prodos + dw $14 + adrl closefile +:x3 pea 0 + _QAGetTotalErrs + pla + sta totalerrs + bit cancelflag + bmi :x5 + lda totalerrs + bne :x4 + lda #$0d + jsr drawchar + jsr express + jsr writerez + lda totalbytes + ora totalbytes+2 + beq :xnosave + lda linkversion + beq :x4 + psl #filename + _QADrawString + psl #:savstr + _QADrawString + jmp :savout +:xnosave psl #:nosavstr + _QADrawString +:savout lda #$0d + jsr drawchar +:x4 jsr showendstr +:x5 jsr disposemem + rep $30 + lda cancelflag + beq :x6 + pea $ffff + _QASetCancelflag +:x6 pla + plp + cmpl :one + rtl + +:one dw $01 +:doneflag ds 2 +:savstr str ' saved.' +:nosavstr str 'No object code saved.' + +doneflag ds 2 +linelen ds 2 +linebuff ds 128,0 +opcode ds 36,0 +opcodeword ds 2 +jsrptr ds 2 + +linkline php + rep $30 + ldy #$00 + ldx #$00 + sep $20 + stz newlable + lda linebuff + jeq :done + lda linebuff+1 + and #$7f + cmp #'*' + jeq :done + cmp #';' + jeq :done + cmp #' ' + blt :done + beq :ldy + sta newlable+1 + ldy #$01 + ldx #$01 +]lup iny + lda linebuff,y + and #$7f + cmp #' ' + blt :done + beq :lable + cpx #15 + bge :nosta + sta newlable+1,x +:nosta inx + jmp ]lup +:lable txa + cmp #15 + blt :l1 + lda #15 +:l1 sta newlable + jmp :op + +:ldy ldy #$01 +:op +]lup lda linebuff,y + iny + and #$7f + cmp #';' + beq :done + cmp #' ' + blt :done + beq ]lup + + rep $20 + dey + tyx + jsr getopcode + bcc :done +:err plp + sec + rts +:done plp + clc + rts + +getopcode + php + rep $30 + lda #$ffff + sta jsrptr + stz opcode + stz opcodeword + sep $20 +]lup cpx linelen + blt :get + beq :get + jmp :noop +:get lda linebuff,x + and #$7F + inx + cmp #' ' + beq ]lup + cmp #$0D + beq :noop + cmp #';' + beq :noop + jmp :doop +:noop rep $30 + lda #$00 + plp + clc + rts +:doop rep $30 + dex + ldy #$00 +]lup lda linebuff,x + and #$7F + cmp #' '+$1 + blt :done + cmp #';' + beq :done + cpy #32 + bge :phx + ora #$2000 ;high byte + sta opcode+$1,Y +:phx inx + iny + cpx linelen + blt ]lup + beq ]lup + dex +:done lda #$2020 + sta opcode+$1,Y + tya + and #$1F + sep $20 + sta opcode +]flush lda linebuff,x + cmp #' ' + bne :tya + inx + bra ]flush +:tya rep $30 + txa + clc + adc #linebuff + sta lineptr + jsr doopcodes + bcc :op ;if invalid check macros + jmp :err +:op sta opcodeword + ldy #tblend + jsr chkops + bcs :err +:enter clc + lda jsrptr + sta :jsr+$1 + lda #doflag + bit modeflag + beq :jsr + lda opcodeword + hex c9 + usr 'DO ' + beq :jsr + hex c9 + usr 'FIN ' + beq :jsr + hex c9 + usr 'ELS ' + bne :noerr +:jsr jsr $FFFF +:errchk bcs :operr + jmp :noerr +:operr plp + sec + rts +:noerr lda #$00 + plp + clc + rts +:err rep $30 + lda #syntax +:errout plp + cmpl :one + rts +:one dw $01 + + + +doopcodes + +]op equ workspace + + php + rep $30 + lda opcode + and #$00FF + beq :bad + cmp #$05 + blt :stz +:bad lda #syntax + plp + sec + rts +:stz lda opcode+$1 + xba + sep $30 + asl + asl + asl + rep $20 + asl + asl + asl + sta ]op + lda opcode+$4 + and #$5F5F + tax + beq :clc + cmp #'K' + beq :rep +:clc clc +:rep rep $30 + lda opcode+$3 + and #$1F + rol + tsb ]op + lda ]op + plp + clc + rts + + +chkops rep $30 + lda opcodeword +:find dey + dey + dey + dey + dey + dey + cmp $0000,Y + bcc :find + bne :rts + lda $0002,Y + sta jsrptr + cmp #$FFFF +:rts rts + + mx %00 +cmdop php + rep $30 + ldy #$00 + sep $20 +]lup lda (lineptr),y + and #$7f + cmp #' ' + blt :done + sta tempbuff+1,y + iny + bra ]lup +:done lda #$0d + sta tempbuff+1,y + iny + tya + sta tempbuff + rep $30 + pha + pha + psl #tempbuff + _QAParseCmdLine + plx + stx :type + plx + stx :id + bcs :error + lda :type + cmp #$03 ;internal command? + beq :exec + cmp #$04 ;external command? + bne :bad +:exec lda :type + pha + lda :id + pha + _QAExecCommand + bcs :error + lda #$00 +:error cmp #$00 + beq :clc +:bad lda #badcmd + plp + sec + rts +:clc plp + clc + rts +:type ds 2 +:id ds 2 + + mx %00 +doop stz lvalue + stz lvalue+2 + lda domask + bpl :ok + lda #nesterror + sec + rts +:ok lda dolevel + bne :set + jsr checkdo + bcc :set + ldx #$00 + jsr eval + bcc :set + cmp #undeflable + bne :err + lda #forwardref +:err sec + rts +:set lda domask + bne :shift0 +:shift1 sec + rol domask + jmp :test +:shift0 asl domask +:test lda lvalue + ora lvalue+2 + beq :dooff + lda domask + trb dolevel + jmp condout +:dooff lda domask + tsb dolevel + jmp condout + +elsop lda domask + eor dolevel + sta dolevel + jmp condout + +finop lda domask + trb dolevel + lsr domask + jmp condout + +condout lda dolevel + beq :on + lda #doflag + tsb modeflag + bra :clc +:on lda #doflag + trb modeflag +:clc clc + rts + +checkdo php + rep $30 + stz lvalue + stz lvalue+2 + sep $20 + ldy #$00 +]lup lda (lineptr),y + and #$7f + cmp #' ' + jlt :sec + bne :first + iny + bra ]lup +:first and #$5f + cmp #'P' + beq :pass + cmp #'E' + jne :sec +:chkerr iny + lda (lineptr),y + and #$5f + cmp #'R' + jne :sec + iny + lda (lineptr),y + and #$5f + cmp #'R' + jne :sec + iny + lda (lineptr),y + and #$7f + cmp #' '+1 + jge :sec + rep $30 + pea 0 + _QAReadTotalErrs + pla + sta lvalue + jmp :clc + + mx %10 +:pass iny + lda (lineptr),y + and #$5f + cmp #'A' + bne :sec + iny + lda (lineptr),y + and #$5f + cmp #'S' + bne :sec + iny + lda (lineptr),y + and #$5f + cmp #'S' + bne :sec + iny + lda (lineptr),y + and #$7f + cmp #' '+1 + bge :sec + lda passnum+1 ;we're in 8 bit A here + bne :2 + lda #$00 + sta lvalue + jmp :clc +:2 lda #$01 + sta lvalue + jmp :clc +:sec plp + sec + rts +:clc plp + clc + rts + mx %00 + +optbl dw $0000,$FFFF,$FFFF + opc 'ADR ';adrop;0 + opc 'ALI ';aliop;0 + opc 'ASM ';asmop;0 + opc 'AUX ';adrop;0 +* opc 'BRK ';brkop;0 + opc 'CMD ';cmdop;0 + opc 'DAT ';datop;0 + opc 'DO ';doop;0 + opc 'DS ';dsop;0 + opc 'ELS ';elsop;0 + opc 'END ';endop;0 + opc 'ENT ';entop;0 + opc 'EQU ';equop;0 + opc 'EXT ';extop;0 + opc 'FAS ';rtsop;0 + opc 'FIN ';finop;0 + opc 'GEQ ';geqop;0 + opc 'IF ';ifop;0 + opc 'IMP ';impop;0 + opc 'KBD ';kbdop;0 + opc 'KIN ';kndop;0 + opc 'KND ';kndop;0 + opc 'LEN ';lenop;0 +* opc 'LIB ';libop;0 + opc 'LIN ';lnkop;0 + opc 'LKV ';lkvop;0 + opc 'LNK ';lnkop;0 + opc 'NOL ';nolop;0 + opc 'ORG ';orgop;0 + opc 'OVR ';ovrop;0 + opc 'PFX ';pfxop;0 + opc 'POS ';posop;0 + opc 'PUT ';putop;0 + opc 'REZ ';rezop;0 + opc 'SAV ';savop;0 + opc 'TYP ';typop;0 + opc 'VER ';verop;0 + opc 'ZIP ';zipop;0 + opc '= ';equ1op;0 +tblend dw $FFFF,$FFFF,$FFFF + mx %00 + +rtsop clc + rts + +asmop bit passnum + bpl :pass0 + clc + rts +:pass0 bit lnkflag + bpl :pass00 + lda #badasmcmd + sec + rts +:pass00 rep $30 + jsr purgeasm + jsr getglobals + bcc :d1 + rts +:d1 lda #$FFFF + jsr getpath + bcc :setmode + rts +:setmode stz :errcode + lda ovrflag + ora ovrallflag + bne :doit + + jsl prodos + dw $06 + adrl info + jcs :doserr + lda ftype + cmp #$04 + jne :mismatch + lda aux + and #$01 + jne :clc + lda aux + ora #$01 + sta aux + jsl prodos + dw $05 + adrl info +:doit lda asmlablect + sta linksymnum + lda asmnextlable + sta linknextlbl + lda asmnextlable+2 + sta linknextlbl+2 + + psl linksymtbl + psl linksymhdl + lda asmlablect + pha + psl asmnextlable + _QASetSymTable + + lda linktype + pha + _QASetObjType + stz :errcode + psl #asmpath + _QASetPath + pea #afromname + psl #$00 + _QACompile + php + pha + psl #$00 + psl #$00 + pea 0 + psl #$00 + _QASetSymTable + pla + plp + tay + bcc :kq + cpy #$0000 + beq :kq + sty prodoserr + lda #doserror + sta :errcode +:kq pea 0 + _QAGetObjType + pla + sta linktype + jsr purgeasm + lda :errcode +:memerr rep $30 + pha + lda #$00 + sta asmpath + sta ovrflag + pla + jmp :err +:doserr sta prodoserr + stz asmpath + stz ovrflag + lda #doserror +:err cmpl :one + rts +:one dw $01 +:clc rep $30 + lda #$00 + sta asmpath + sta ovrflag + clc + rts +:mismatch lda #$00 + sta asmpath + sta ovrflag + lda #mismatch + sta prodoserr + lda #doserror + sec + rts +:errcode ds 2 + + mx %00 +entop lda passnum + bne :ok + clc + rts +:ok psl #:str + _QADrawString + lda #$03 ;show entries + jsr traverse + rep $31 + rts +:str str 0d,'Entry Labels:',0d,0d + + mx %00 +datop lda passnum + bne :ok + clc + rts +:ok psl #:date+1 + tll $0F03 ;_ReadAsciiTime + psl #:date + _QADrawString + lda #$0d + jsr drawchar + clc + rts +:date dfb 20 + ds 20,0 + mx %00 + +endop lda #$ffff + sta doneflag + clc + rts + +equop bit passnum + bpl :equ + clc + rts +:equ ldx #$00 + jsr eval + bcc :ok + rts +:ok lda lvalue + sta labval + lda lvalue+2 + sta labval+2 + lda newlable + and #$ff + beq :badlable + cmp #15 + blt :tx1 + lda #15 +:tx1 tax + sep $20 + sta labstr +]lup lda newlable,x + sta labstr,x + dex + bne ]lup + lda newlable+1 + and #$7f + cmp #':'+1 + blt :badlable + cmp #']' + beq :badlable + rep $20 + lda #linkequbit.linkequvalid + jsr insertlable + rts +:badlable rep $30 + lda #badlable.$80 + sec + rts + +equ1op bit passnum + bpl :equ + clc + rts +:equ ldx #$00 + jsr eval + bcc :ok + rts +:ok lda lvalue + sta labval + lda lvalue+2 + sta labval+2 + lda newlable + and #$ff + beq :badlable + cmp #15 + blt :tx1 + lda #15 +:tx1 + tax + sep $20 + sta labstr +]lup lda newlable,x + sta labstr,x + dex + bne ]lup + lda newlable+1 + and #$7f + cmp #':'+1 + blt :badlable + cmp #']' + beq :badlable + rep $20 + lda #linkequ1bit + jsr insertlable + rts +:badlable rep $30 + lda #badlable.$80 + sec + rts + +zipop lda passnum + beq :ok + clc + rts +:ok lda lnkflag + beq :ok1 + lda #illegalcmd + sec + rts +:ok1 sec + ror zipflag +* jsr newsegment + clc + rts ;return error from newsegment + +posop ;I don't know what these do +lenop clc ;or how Merlin uses them so....????? + rts + +extop bit passnum + bpl :equ + clc + rts +:equ lda newlable + and #$ff + bne :equ1 + clc + rts +:equ1 clc + rts + do 0 + ldx #$00 + jsr eval + bcc :ok + rts +:ok lda lvalue + sta labval + lda lvalue+2 + sta labval+2 + lda newlable + and #$ff + beq :badlable + cmp #15 + blt :tx1 + lda #15 +:tx1 + tax + sep $20 + sta labstr +]lup lda newlable,x + sta labstr,x + dex + bne ]lup + lda newlable+1 + and #$7f + cmp #':'+1 + blt :badlable + cmp #']' + beq :badlable + rep $20 + lda #linkgeqbit + jsr insertlable + rts +:badlable rep $30 + lda #badlable.$80 + sec + rts + fin + +geqop bit passnum + bpl :equ + clc + rts +:equ ldx #$00 + jsr eval + bcc :ok + rts +:ok lda lvalue + sta labval + lda lvalue+2 + sta labval+2 + lda newlable + and #$ff + beq :badlable + cmp #15 + blt :tx1 + lda #15 +:tx1 + tax + sep $20 + sta labstr +]lup lda newlable,x + sta labstr,x + dex + bne ]lup + lda newlable+1 + and #$7f + cmp #':'+1 + blt :badlable + cmp #']' + beq :badlable + rep $20 + lda #linkgeqbit + jsr insertlable + rts +:badlable rep $30 + lda #badlable.$80 + sec + rts + +kbdop bit passnum + bpl :equ + clc + rts +:equ ldx #$00 + jsr eval + bcc :ok + rts +:ok lda lvalue + sta labval + lda lvalue+2 + sta labval+2 + lda newlable + and #$ff + beq :badlable + cmp #15 + blt :tx1 + lda #15 +:tx1 + tax + sep $20 + sta labstr +]lup lda newlable,x + sta labstr,x + dex + bne ]lup + lda newlable+1 + and #$7f + cmp #':'+1 + blt :badlable + cmp #']' + beq :badlable + rep $20 + lda #linkgeqbit + jsr insertlable + rts +:badlable rep $30 + lda #badlable.$80 + sec + rts + + +dsop lda passnum + bne :clc + ldx #$00 + jsr eval + bcc :ok + rts +:clc clc + rts +:ok lda segmenthdl+2 + sta segmentptr+2 + lda segmenthdl + sta segmentptr + ldy #$02 + lda [segmentptr] + tax + lda [segmentptr],y + sta segmentptr+2 + stx segmentptr + lda segnum + asl + asl + asl + asl + asl + asl + clc + adc #dsfield + tay + lda lvalue + sta [segmentptr],y + iny + iny + lda lvalue+2 + sta [segmentptr],y + clc + rts + + +kndop lda passnum + bne :clc + ldx #$00 + jsr eval + bcc :ok + rts +:clc clc + rts +:ok lda segmenthdl+2 + sta segmentptr+2 + lda segmenthdl + sta segmentptr + ldy #$02 + lda [segmentptr] + tax + lda [segmentptr],y + sta segmentptr+2 + stx segmentptr + lda segnum + asl + asl + asl + asl + asl + asl + clc + adc #kindfield + tay + lda lvalue + ldx omfversion + cpx #$01 + bne :omf2 + and #$ff +:omf2 sta [segmentptr],y + clc + rts + +aliop lda passnum + bne :clc + ldx #$00 + jsr eval + bcc :ok + rts +:clc clc + rts +:ok lda lvalue + beq :10000 + cmp #$100 + beq :100 +:bad lda #badalignop + sec + rts +:10000 lda lvalue+2 + cmp #$0001 + bne :bad + jmp :ok1 +:100 lda lvalue+2 + bne :bad +:ok1 lda segmenthdl+2 + sta segmentptr+2 + lda segmenthdl + sta segmentptr + ldy #$02 + lda [segmentptr] + tax + lda [segmentptr],y + sta segmentptr+2 + stx segmentptr + lda segnum + asl + asl + asl + asl + asl + asl + clc + adc #alignfield + tay + lda lvalue + sta [segmentptr],y + iny + iny + lda lvalue+2 + sta [segmentptr],y + clc + rts + + + +libop clc + rts + + mx %00 +impop sec + ror lnkflag + bit passnum + bpl :pass0 + clc + rts +:pass0 rep $30 + lda #$00 + jsr getpath + bcc :setmode + rts +:setmode jsl prodos + dw $06 + adrl info + jcs :doserr + lda ftype + cmp #$f8 + jeq :mismatch ;can't import REL files + + psl #:str + _QADrawString + psl #asmpath + _QADrawString + lda #$0d + jsr drawchar + lda aux + sta :aux + psl #$00 + psl #asmpath + psl #$00 ;filepos + psl #-1 ;whole file + psl #:alltypes + lda userid + ora #linkmemid + pha + psl #$00 + pea $8000 + _QALoadfile + plx + ply + jcs :doserr + lda numfiles + asl + asl + asl + asl + asl + phx + tax + stx :offset + pla + sta files,x + sta :handle + tya + sta files+2,x + sta :handle+2 + psl #$00 + psl :handle + _gethandlesize + pll :aux + lda :aux+2 + jne :toolarge + lda :aux + cmp #$FFFE + jge :toolarge + inc :aux + inc :aux + psl :handle + _Hunlock + psl :aux + psl :handle + _sethandlesize + jcs :doserr + psl :handle + _Hlock + dec :aux + dec :aux + lda :handle + sta workspace + lda :handle+2 + sta workspace+2 + ldy #$02 + lda [workspace] + tax + lda [workspace],y + sta workspace+2 + stx workspace + + lda #$00 + ldy :aux + sta [workspace],y + + ldx :offset + lda reloffset + sta files+4,x + lda reloffset+2 + sta files+6,x + lda :aux + sta files+8,x + lda segnum + sta files+10,x + psl :handle + _Hlock + lda :aux + clc + adc reloffset + sta :rel + lda #$00 + adc reloffset+2 + sta :rel+2 +:b jsr :makeentry + bcc :r1 + jmp :err +:r1 rep $30 + php + pha + inc numfiles + lda :aux + clc + adc reloffset + sta reloffset + lda #$00 + adc reloffset+2 + sta reloffset+2 +:l psl :handle + _HUnlock + lda #$00 + sta asmpath + pla + plp + rts +:memerr rep $30 + jmp :doserr +:none rep $30 + lda #$00 + sta asmpath + clc + rts +:mismatch rep $30 + lda #$00 + sta asmpath + lda #mismatch + sta prodoserr + lda #doserror + sec + rts +:toolarge rep $30 + lda #filetoolarge + jmp :err +:doserr rep $30 + sta prodoserr + lda #$00 + sta asmpath + lda #doserror +:err sec + rts +:aux ds 4 +:rel ds 4 +:handle ds 4 +:offset ds 2 +:str str 'Importing File: ' +:alltypes hex 00 + +:makeentry php + sep $30 + ldx asmpath + lda asmpath,x + and #$7f + cmp #':' + bne :loop1 + dex +:loop1 lda asmpath,x + and #$7f + cmp #':' + beq :end + dex + bne :loop1 +:end inx + txy + ldx #$00 +:loop2 lda asmpath,y + and #$7f + cmp #':' + beq :set + cpx #16 + bge :inx + cmp #'.' + bne :sta + lda #'_' +:sta sta labstr+1,x +:inx inx + iny + cpy asmpath + blt :loop2 + beq :loop2 +:set txa + cmp #15 + blt :set1 + lda #15 +:set1 sta labstr + rep $30 + lda reloffset + sta labval + lda reloffset+2 + sta labval+2 + lda #linkentrybit + jsr insertlable + bcs :sec + ldy #24 + lda segnum + sta [lableptr],y + plp + clc + rts +:sec plp + sec + rts + + mx %00 +lnkop sec + ror lnkflag + bit passnum + bpl :pass0 + clc + rts +:pass0 rep $30 + stz :errvalid + stz :erraddress + stz :erraddress+2 + stz :dsvalid + + lda #$00 + jsr getpath + bcc :setmode + rts +:setmode jsl prodos + dw $06 + adrl info + jcs :doserr + lda ftype + cmp #$f8 + jne :mismatch + + psl #:str + _QADrawString + psl #asmpath + _QADrawString + lda #$0d + jsr drawchar + lda aux + sta :aux + + psl #$00 + psl #asmpath + psl #$00 ;filepos + psl #-1 ;whole file + psl #lnktype + lda userid + ora #linkmemid + pha + psl #$00 + pea $8000 + _QALoadfile + plx + ply + jcs :doserr + + + + lda numfiles + asl + asl + asl + asl + asl + phx + tax + stx :offset + pla + sta files,x + sta :handle + tya + sta files+2,x + sta :handle+2 + lda reloffset + sta files+4,x + lda reloffset+2 + sta files+6,x + lda :aux + sta files+8,x + lda segnum + sta files+10,x + psl :handle + _Hlock + lda :aux + clc + adc reloffset + sta :rel + lda #$00 + adc reloffset+2 + sta :rel+2 + jsr :dsfill + bcc :b + jmp :err +:b jsr buildentries + rep $30 + php + pha + inc numfiles + lda :aux + clc + adc reloffset + sta reloffset + lda #$00 + adc reloffset+2 + sta reloffset+2 + bit :errvalid + bpl :l + lda :rel+2 + cmp :erraddress+2 + blt :l + bne :constr + lda :rel + cmp :erraddress + blt :l + beq :l +:constr jsr :constrainterr + lda #constraint + sta 1,s + lda #$01 + lda 3,s + ora #$01 + sta 3,s +:l psl :handle + _HUnlock + lda #$00 + sta asmpath + pla + plp + rts +:memerr rep $30 + jmp :doserr +:none rep $30 + lda #$00 + sta asmpath + clc + rts +:mismatch rep $30 + lda #$00 + sta asmpath + lda #mismatch + sta prodoserr + lda #doserror + sec + rts +:doserr rep $30 + sta prodoserr + lda #$00 + sta asmpath + lda #doserror +:err sec + rts + +:aux ds 2 +:rel ds 4 +:handle ds 4 +:offset ds 2 +:str str 'Loading File: ' +:dsvalid ds 2 +:errvalid ds 2 +:erraddress ds 4 +:dsy ds 2 + +:dsfill php + rep $30 + stz :dsvalid + stz :errvalid + lda :handle + sta workspace + lda :handle+2 + sta workspace+2 + ldy #$02 + lda [workspace] + tax + lda [workspace],y + sta workspace+2 + stx workspace + lda :aux + clc + adc workspace + sta workspace + bcc :1 + inc workspace+2 +:1 ldy #$00 +:loop lda [workspace],y + and #$f0 + beq :check + cmp #$f0 + jeq :8 + cmp #%11000000 ;DS? + beq :ds + cmp #%11100000 ;ERR? + beq :dserr + jmp :4 +:ds bit :dsvalid + jmi :4 + sty :dsy + sec + ror :dsvalid + jmp :4 +:dserr iny + lda [workspace],y + sta :temp + iny + iny + lda [workspace],y + and #$ff + sta :temp+2 + bit :errvalid + bpl :first + lda :erraddress+2 + cmp :temp+2 + blt :finy + bne :first + lda :erraddress + cmp :temp + blt :finy +:first sec + ror :errvalid + lda :temp + sta :erraddress + lda :temp+2 + sta :erraddress+2 +:finy iny + jmp :loop + +:check + bit :dsvalid + jpl :xit + ldy :dsy + lda :aux + and #$FF + eor #$FF + inc + cmp #$100 + blt :smore + jmp :xit +:smore sta :more + iny + iny + iny + lda [workspace],y + and #$ff + sta :byte + psl :handle + _Hunlock + psl #$00 + psl :handle + _gethandlesize + pll :size + lda :more + clc + adc :size + sta :size + bcc :l1 + inc :size+2 +:l1 psl :size + psl :handle + _sethandlesize + php + pha + psl :handle + _Hlock + pla + plp + bcc :deref + lda #baddsop + plp + sec + rts +:deref lda :handle + sta workspace + lda :handle+2 + sta workspace+2 + ldy #$02 + lda [workspace] + tax + lda [workspace],y + sta workspace+2 + stx workspace + + lda :aux + clc + adc workspace + sta :src + lda #$00 + adc workspace+2 + sta :src+2 + lda :src + clc + adc :more + sta :dest + lda :src+2 + adc #$00 + sta :dest+2 + psl :src + psl :dest + pea $00 + lda :more + pha + tll $2b02 ;_Blockmove + ldy :aux + ldx #$00 + sep $20 + lda :byte +]lup sta [workspace],y + iny + inx + cpx :more + blt ]lup + rep $20 + jmp :set +:4 tya + clc + adc #$04 + tay + jmp :loop +:8 tya + clc + adc #$08 + tay + jmp :loop +:set lda :aux + clc + adc :more + bcc :fine + lda #baddsop + plp + sec + rts +:fine sta :aux + ldx :offset + sta files+8,x +:xit plp + clc + rts +:size ds 4 +:more ds 2 +:src ds 4 +:dest ds 4 +:byte ds 2 +:temp ds 4 + +:constrainterr php + rep $30 + pea 0 + _QAGetWindow + pea $ffff + _QASetwindow + psl #:cstr + _QADrawString + lda :erraddress+$2 + and #$ff + beq :c1 + jsr prbyte +:c1 lda :erraddress + jsr prbytel + psl #:cstr1 + _QADrawString + lda :rel + sec + sbc :erraddress + sta :ctemp + lda :rel+2 + sbc :erraddress+2 + sta :ctemp+2 + and #$ff + beq :c2 + jsr prbyte +:c2 lda :ctemp + jsr prbytel + lda #$0d + jsr drawchar + _QASetWindow + plp + rts +:cstr str 0d,'Constraint at $' +:cstr1 str '. Excess = $' +:ctemp ds 4 + + + +buildentries + php + rep $30 + lda numfiles + asl + asl + asl + asl + asl + tax + phx + lda files+2,x + sta tempptr+2 + lda files,x + sta tempptr + ldy #$02 + lda [tempptr] + tax + lda [tempptr],y + sta tempptr+2 + stx tempptr + plx + lda files+4,x + sta :offset + sta reloffset + lda files+6,x + sta reloffset+2 + sta :offset+2 + + lda files+8,x + clc + adc tempptr + sta tempptr1 + lda #$00 + adc tempptr+2 + sta tempptr1+2 +]lup lda [tempptr1] + and #$ff + beq :syms + and #$f0 + cmp #$f0 + beq :8 + lda #$04 + clc + adc tempptr1 + sta tempptr1 + lda #$00 + adc tempptr1+2 + sta tempptr1+2 + jmp ]lup +:8 lda #$04 + clc + adc tempptr1 + sta tempptr1 + lda #$00 + adc tempptr1+2 + sta tempptr1+2 + jmp ]lup +:syms inc tempptr1 + bne :s1 + inc tempptr1+2 +:s1 lda [tempptr1] + and #$ff + jeq :done + pha + and #$80 + jne :next + lda 1,s + and #$40 + jeq :next ;not an entry + lda 1,s + and #%00011111 + inc + tay + phy + lda [tempptr1],y + sta labval + iny + iny + lda [tempptr1],y + and #$00ff + sta labval+2 + lda 3,s + and #%00100000 + bne :abs + + lda labval + sec + sbc #$8000 + sta labval + lda labval+2 + sbc #$00 + sta labval+2 + lda labval + clc + adc :offset + sta labval + lda labval+2 + adc :offset+2 + sta labval+2 + lda 1,s + tay + lda labval + sta [tempptr1],y + iny + iny + sep $20 + lda labval+2 + sta [tempptr1],y + rep $20 +:abs ply + lda 1,s + and #%00011111 + cmp #15 + blt :tx1 + lda #15 +:tx1 + tay + tax + sep $20 + sta labstr + beq :in +]lup lda [tempptr1],y + sta labstr,x + dey + dex + bne ]lup +:in rep $20 + lda 1,s + and #%00100000 + beq :rel + lda #linkentrybit.linkabsbit + jmp :ins +:rel lda #linkentrybit +:ins jsr insertlable + bcc :ok2 + plx ;remove junk from stack + plp + sec + rts +:ok2 ldy #24 + lda segnum + sta [lableptr],y +:next pla + and #%00011111 + clc + adc #4 + clc + adc tempptr1 + sta tempptr1 + lda #$00 + adc tempptr1+2 + sta tempptr1+2 + jmp :s1 + +:done plp + clc + rts + +:offset ds 4 + +buildfinal + php + rep $30 + bit cancelflag + jmi :cancel + asl + asl + asl + asl + asl + tax + lda files+10,x + cmp segnum + beq :phx + plp + clc + rts +:phx phx + lda files,x + sta tempptr + sta :handle + lda files+2,x + sta tempptr+2 + sta :handle+2 + pha + lda tempptr + pha + _Hlock + ldy #$02 + lda [tempptr] + tax + lda [tempptr],y + sta tempptr+2 + stx tempptr + plx + lda files+4,x + sta :offset + sta reloffset + lda files+6,x + sta reloffset+2 + + phx + psl #:str + _QADrawString + lda reloffset+2 + xba + and #$ff + beq :l1 + jsr prbyte +:l1 lda reloffset+2 + and #$ff + beq :l2 + jsr prbyte +:l2 lda reloffset + jsr prbytel + lda #$a0 + jsr drawchar + lda #$0d + jsr drawchar + plx + + + lda files+8,x + clc + adc tempptr + sta tempptr1 + lda #$00 + adc tempptr+2 + sta tempptr1+2 + stz omfok + jsr checkorg + bcs :o1 + lda #$ffff + sta omfok +:o1 ldy #$00 +]lup sep $20 + lda [tempptr1],y + beq :found + and #$f0 + cmp #$f0 + beq :81 + rep $20 + tya + clc + adc #$04 + tay + jmp ]lup +:81 rep $20 + tya + clc + adc #$08 + tay + jmp ]lup +:found rep $30 + iny + tya + clc + adc tempptr1 + sta tempptr2 + lda tempptr1+2 + adc #$0 + sta tempptr2+2 +]lup rep $30 + bit cancelflag + jmi :cancel + lda rellength+2 + beq :f1 + lda #relfull + plp + sec + rts +:f1 lda [tempptr1] + and #$ff + beq :syms + tax + jsr readkey + bcc :tx + and #$7f + cmp #$1b + jeq :cancel + cmp #'C'&$1f + jeq :cancel +:tx txa + pha + jsr relocatefinal + bcc :pla + pha + jsr linkerror + pla +:pla pla + and #$f0 + cmp #$f0 + beq :8 + lda #$04 + clc + adc tempptr1 + sta tempptr1 + lda #$00 + adc tempptr1+2 + sta tempptr1+2 + jmp ]lup +:8 lda #$04 + clc + adc tempptr1 + sta tempptr1 + lda #$00 + adc tempptr1+2 + sta tempptr1+2 + jmp ]lup +:cancel rep $30 + sec + ror cancelflag +:syms rep $30 + psl :handle + _HUnlock +:done1 rep $30 + plp + clc + rts +:handle ds 4 +:offset ds 2 + +:str str 'Linking at $' + +insertomf php + rep $30 + lda linkversion + beq :clc + bit omfok + bpl :clc + lda omflength + bne :1 +:clc plp + clc + rts +:1 ldy rellength + sep $20 + lda omfcode + sta [relptr],y + + do omfprint + phy + jsr prbyte + ply + fin + + iny + lda omfbytes + sta [relptr],y + + do omfprint + phy + jsr prbyte + ply + fin + + iny + lda omfshift + sta [relptr],y + + do omfprint + phy + jsr prbyte + lda #$a0 + jsr drawchar + ply + fin + + iny + rep $20 + lda omfoff1 + sta [relptr],y + + do omfprint + phy + jsr prbytel + lda #$a0 + jsr drawchar + ply + fin + + iny + iny + lda omfcode + cmp #$f5 + beq :f5 + sep $20 + lda interseg + sta [relptr],y + rep $30 + + do omfprint + phy + jsr prbyte + lda #$a0 + jsr drawchar + ply + fin + + iny +:f5 + lda omfoff2 + sta [relptr],y + + do omfprint + phy + jsr prbytel + ply + fin + + lda omflength + clc + adc rellength + sta rellength + bcc :3 + inc rellength+2 +:3 + do omfprint + pha + lda #$a0 + jsr drawchar + pla + jsr prbytel + lda #$0d + jsr drawchar + sep $20 +:b ldal $e0c061 + bmi :b + fin + + rep $20 + plp + clc + rts +:offset ds 2 + +relocatefinal + php + rep $30 + stz interseg + stz omflength + and #$f0 + sta :cmd + cmp #%11110000 + jeq :long + and #%11100000 + jeq :byte1 + cmp #%10000000 + jeq :byte2 + cmp #%10100000 + jeq :rev2 + cmp #%01000000 + jeq :byte1hi + cmp #%00100000 + jeq :byte3 + jmp :clc +:baddict rep $30 + lda #baddictionary + plp + sec + rts +:byte2 lda :cmd + and #%00010000 + beq :b21 + jmp :byte2ext ;get value here +:b21 ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda [tempptr],y + sec + sbc #$8000 + clc + adc reloffset + sta [tempptr],y + sta omfoff2 + stz omfshift + lda #$f5 + sta omfcode + lda #$02 + sta omfbytes + lda #$07 + sta omflength + jsr insertomf + jcc :clc + jmp :sec + +:byte2ext lda :cmd + and #%00010000 + jeq :clc + ldy #$03 + lda [tempptr1],y + and #$ff + jsr getexternal + jcs :sec + ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda [tempptr],y + sec + sbc #$8000 + clc + adc foundlable+28 + sta [tempptr],y + sta omfoff2 + lda foundlable+26 + and #$0020 + jne :clc + lda #$02 + sta omfbytes + stz omfshift + bit interseg + bmi :interseg1 + lda #$f5 + sta omfcode + lda #$07 + sta omflength + jmp :ins1 +:interseg1 lda #$f6 + sta omfcode + lda #$08 + sta omflength + jsr isegwarning +:ins1 jsr insertomf + jmp :clc + +:rev2 lda :cmd + and #%00010000 + beq :b22 + jmp :rev2ext ;get value here +:b22 ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda [tempptr],y + xba + sec + sbc #$8000 + clc + adc reloffset + sta omfoff2 + xba + sta [tempptr],y + lda #-8 + sta omfshift + lda #$01 + sta omfbytes + lda #$f5 + sta omfcode + lda #$07 + sta omflength + jsr insertomf + lda rellength+2 + jne :clc + stz omfshift + lda #$01 + sta omfbytes + lda #$f5 + sta omfcode + lda #$07 + sta omflength + inc omfoff1 + jsr insertomf + jmp :clc +:rev2ext lda :cmd + and #%00010000 + jeq :clc + ldy #$03 + lda [tempptr1],y + and #$ff + jsr getexternal + jcs :sec + ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda [tempptr],y + xba + sec + sbc #$8000 + clc + adc foundlable+28 + sta omfoff2 + xba + sta [tempptr],y + + lda foundlable+26 + and #$0020 + jne :clc + + bit interseg + bmi :interseg2 + + lda #-8 + sta omfshift + lda #$01 + sta omfbytes + lda #$f5 + sta omfcode + lda #$07 + sta omflength + jsr insertomf + lda rellength+2 + jne :clc + stz omfshift + lda #$01 + sta omfbytes + lda #$f5 + sta omfcode + lda #$07 + sta omflength + inc omfoff1 + jsr insertomf + jmp :clc +:interseg2 + lda #-8 + sta omfshift + lda #$01 + sta omfbytes + lda #$f6 + sta omfcode + lda #$08 + sta omflength + jsr isegwarning + jsr insertomf + lda rellength+2 + jne :clc + stz omfshift + lda #$01 + sta omfbytes + lda #$f6 + sta omfcode + lda #$08 + sta omflength + inc omfoff1 + jsr isegwarning + jsr insertomf + jmp :clc + +:byte3 lda :cmd + and #%00010000 + beq :b25 + jmp :byte3ext ;get value here +:b25 ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda [tempptr],y + sta :lowbyte + iny + iny + lda [tempptr],y + and #$ff + sta :lowbyte+2 + dey + dey + lda :lowbyte + sec + sbc #$8000 + sta :lowbyte + lda :lowbyte+2 + sbc #$00 + sta :lowbyte+2 + lda :lowbyte + clc + adc reloffset + sta omfoff2 + sta [tempptr],y + iny + iny + lda :lowbyte+2 + adc reloffset+2 ;*** + sep $20 + sta [tempptr],y + rep $20 + lda #$f5 + sta omfcode + stz omfshift + lda #$03 + sta omfbytes + lda #$07 + sta omflength + jsr insertomf + jmp :clc +:byte3ext lda :cmd + and #%00010000 + jeq :clc + ldy #$03 + lda [tempptr1],y + and #$ff + jsr getexternal + jcs :sec + ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda [tempptr],y + sec + sbc #$8000 + sta :lowbyte + php + iny + iny + lda [tempptr],y + and #$ff + plp + sbc #$00 + sta :lowbyte+2 + dey + dey + lda :lowbyte + clc + adc foundlable+28 + sta omfoff2 + sty :omfy + sta [tempptr],y + iny + iny + lda :lowbyte+2 + adc foundlable+30 + sep $20 + sta [tempptr],y + rep $20 + lda foundlable+26 + and #$0020 ;absolute lable? + jne :clc + + bit interseg + bmi :interseg3 + lda #$f5 + sta omfcode + lda #$03 + sta omfbytes + stz omfshift + lda #$07 + sta omflength + jsr insertomf + jmp :clc +:interseg3 stz dynamic + lda #$f6 + sta omfcode + lda #$03 + sta omfbytes + stz omfshift + lda #$08 + sta omflength + ldy #$01 + lda [tempptr1],y + tay + iny + iny + jsr jumpentry + jcs :sec + phy + bit dynamic + bpl :isep + ldy :omfy + lda omfoff2 + sta [tempptr],y + dey + lda [tempptr],y + and #$ff + cmp #$22 ;is it a jsl?? + beq :isep + jsr isegwarning +:isep lda interseg + ply + sep $20 + sta [tempptr],y ;save the segment number in object code + rep $20 + jsr insertomf + jmp :clc +:omfy ds 2 + +:byte1 lda :cmd + and #%00010000 + beq :b23 + jmp :byte1ext ;get value here +:b23 ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda [tempptr],y + and #$ff + clc + adc reloffset + sep $20 + sta [tempptr],y + rep $20 + sta omfoff2 + stz omfshift + lda #$07 + sta omflength + lda #$01 + sta omfbytes + lda #$f5 + sta omfcode + jsr insertomf + jmp :clc + +:byte1ext lda :cmd + and #%00010000 + jeq :clc + ldy #$03 + lda [tempptr1],y + and #$ff + jsr getexternal + jcs :sec + ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda [tempptr],y + and #$ff + clc + adc foundlable+28 + sta omfoff2 + sep $20 + sta [tempptr],y + rep $20 + lda foundlable+26 + and #$0020 + jne :clc + + bit interseg + bmi :interseg4 + stz omfshift + lda #$07 + sta omflength + lda #$01 + sta omfbytes + lda #$f5 + sta omfcode + jsr insertomf + jmp :clc +:interseg4 stz omfshift + lda #$08 + sta omflength + lda #$01 + sta omfbytes + lda #$f6 + sta omfcode + jsr isegwarning + jsr insertomf + jmp :clc + +:byte1hi lda :cmd + and #%00010000 + beq :b24 + jmp :baddict ;get value here +:b24 ldy #$03 + lda [tempptr1],y + and #$ff + sta :lowbyte + ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda [tempptr],y + and #$ff + xba + ora :lowbyte + sec + sbc #$8000 + clc + adc reloffset + sta omfoff2 + xba + sep $20 + sta [tempptr],y + rep $20 + lda #$f5 + sta omfcode + lda #$07 + sta omflength + lda #-8 + sta omfshift + lda #$01 + sta omfbytes + jsr insertomf + jmp :clc +:byte1hiext lda :cmd + and #%00010000 + jeq :clc +:b1hi rep $30 + ldy #$05 + lda [tempptr1],y + sta :lowbyte + ldy #$03 + lda [tempptr1],y + and #$ff + jsr getexternal + jcs :sec + ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 +* lda [tempptr],y +* and #$ff +* xba +* ora :lowbyte + lda :lowbyte + sec + sbc #$8000 + clc + adc foundlable+28 + sta omfoff2 + xba + sep $20 + sta [tempptr],y + rep $20 + lda foundlable+26 + and #$0020 + jne :clc + + bit interseg + bmi :interseg5 + lda #$f5 + sta omfcode + lda #$07 + sta omflength + lda #-8 + sta omfshift + lda #$01 + sta omfbytes + jsr insertomf + jmp :clc +:interseg5 lda #$f6 + sta omfcode + lda #$08 + sta omflength + lda #-8 + sta omfshift + lda #$01 + sta omfbytes + jsr isegwarning + jsr insertomf + jmp :clc + +:long ldy #$04 + lda [tempptr1],y + and #$ff + sta :cmd + cmp #%11010000 + beq :la1 + cmp #%11010001 + jeq :la2 + cmp #%11010111 + jeq :la5 + cmp #%11010100 + jeq :la3 + cmp #%11010101 + jeq :la4 + lda #baddictionary + jmp :sec + +:la1 ldy #$05 + lda [tempptr1],y + sta :lowbyte + iny + iny + lda [tempptr1],y + and #$ff + sta :lowbyte+2 + lda :lowbyte + sec + sbc #$8000 + sta :lowbyte + lda :lowbyte+2 + sbc #$00 + sta :lowbyte+2 + lda reloffset + clc + adc :lowbyte + sta :lowbyte + sta omfoff2 + lda reloffset+2 + adc :lowbyte+2 + sta :lowbyte+2 + ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda :lowbyte+2 + sep $20 + sta [tempptr],y + rep $20 + lda #$f5 + sta omfcode + lda #$07 + sta omflength + lda #$01 + sta omfbytes + lda #-16 + sta omfshift + jsr insertomf + jmp :clc +:la2 ldy #$05 + lda [tempptr1],y + sta :lowbyte + iny + iny + lda [tempptr1],y + and #$ff + sta :lowbyte+2 + lda :lowbyte + sec + sbc #$8000 + sta :lowbyte + lda :lowbyte+2 + sbc #$00 + sta :lowbyte+2 + lda reloffset + clc + adc :lowbyte + sta :lowbyte + sta omfoff2 + lda reloffset+2 + adc :lowbyte+2 + sta :lowbyte+2 + ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda :lowbyte+1 + sta [tempptr],y + + lda #$f5 + sta omfcode + lda #$07 + sta omflength + lda #$02 + sta omfbytes + lda #-8 + sta omfshift + jsr insertomf + jmp :clc + +:la3 ldy #$03 + lda [tempptr1],y + and #$ff + jsr getexternal + jcs :sec + ldy #$05 + lda [tempptr1],y + sec + sbc #$8000 + sta :lowbyte + iny + iny + lda [tempptr1],y + and #$ff + sbc #$00 + sta :lowbyte+2 + ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda foundlable+28 + clc + adc :lowbyte + sta omfoff2 + lda foundlable+30 + adc :lowbyte+2 + sep $20 + sta [tempptr],y + rep $20 + lda foundlable+26 + and #$0020 + jne :clc + + lda #$f6 + sta omfcode + lda #$08 + sta omflength + lda #$01 + sta omfbytes + lda #-16 + sta omfshift + jsr isegwarning + jsr insertomf + jmp :clc +:la4 ldy #$03 + lda [tempptr1],y + and #$ff + jsr getexternal + jcs :sec + + ldy #$05 + lda [tempptr1],y + sec + sbc #$8000 + sta :lowbyte + iny + iny + lda [tempptr1],y + and #$ff + sbc #$00 + sta :lowbyte+2 + + ldy #$01 + lda [tempptr1],y + tay + clc + adc reloffset + sta omfoff1 + lda foundlable+28 + clc + adc :lowbyte + sta :lowbyte + sta omfoff2 + lda foundlable+30 + adc :lowbyte+2 + sta :lowbyte+2 + lda :lowbyte+1 + sta [tempptr],y + + lda foundlable+26 + and #$0020 + jne :clc + + lda #$f6 + sta omfcode + lda #$08 + sta omflength + lda #$02 + sta omfbytes + lda #-8 + sta omfshift + jsr isegwarning + jsr insertomf + jmp :clc +:la5 jmp :b1hi + +:clc plp + clc + rts +:sec plp + sec + rts +:cmd ds 2 +:lowbyte ds 4 + + +getexternal php + rep $30 + and #$ff + sta :refnum + stz :zpage + lda segnum + sta extseg + + ldy #$00 +]lup sep $20 + sty :offset + lda [tempptr2],y + beq :notfound + bpl :next + rep $20 + and #%00011111 + pha + tya + clc + adc 1,s + inc + plx + tay + lda [tempptr2],y + and #$ff + cmp :refnum + beq :found +:next rep $20 + ldy :offset + lda [tempptr2],y + and #%00011111 + clc + adc #4 + clc + adc :offset + tay + jmp ]lup +:notfound rep $20 + lda labstr + and #$0f + tay + ldx #$01 +]lup sep $20 + lda labstr,x + phx + phy + jsr drawchar + ply + plx + inx + dey + bne ]lup + rep $20 + psl #:notres + _QADrawString + ldy #$01 + lda [tempptr1],y + clc + adc reloffset + pha + lda #$00 + adc reloffset+2 + and #$ff + beq :e1 + jsr prbyte +:e1 pla + jsr prbytel + lda #$0d + jsr drawchar + +:notfound1 rep $20 + lda #notresolved + plp + sec + rts +:found sep $20 + iny + lda [tempptr2],y + cmp #$01 + bge :f1 + sec + ror :zpage+1 +:f1 rep $20 + ldy :offset + lda [tempptr2],y + and #%00011111 + cmp #15 + blt :tx1 + lda #15 +:tx1 + sta :offset + ldx #$00 + iny + sep $20 + sta labstr +]lup cpx :offset + beq :search + lda [tempptr2],y + and #$7f + sta labstr+1,x + inx + iny + jmp ]lup +:search rep $20 + stz :cased +:find jsr findlable + bcs :itsfound + bit :cased + jmi :notfound + jsr caselable + sec + ror :cased + jmp :find +:itsfound ldy #26 + lda [lableptr],y + ora #linkentused + sta [lableptr],y +:itsfound2 lda foundlable+26 + bit #linkentrybit + jeq :notfound + lda foundlable+24 ;get lable's seg number + sta extseg + cmp segnum + beq :bit + sec + ror interseg ;indicate an intersegment call + sep $20 + sta interseg + rep $20 +:bit bit :zpage + bpl :clc + lda foundlable+29 + beq :clc + lda #extnotzp + plp + sec + rts +:clc plp + clc + rts + +:refnum ds 2 +:zpage ds 2 +:offset ds 2 +:cased ds 2 +:notres str ' not resolved at $' + + mx %00 +lkvop bit passnum + bpl :ver + clc + rts +:ver bit lkvchg + bpl :ver1 + clc + rts +:ver1 ldx #$00 + jsr eval + bcc :ok + rts +:ok lda lvalue + cmp #$03 + blt :ok1 +:bad lda #badvalue + sec + rts +:ok1 and #$ff + sta linkversion + sec + ror lkvchg + cmp #$00 ;absolute linker? + bne :clc + lda #$06 ;BIN type + sta linktype +:clc clc + rts + +nolop php + rep $30 + do oldshell + lda #$00 + ldx goffset + sta linklstflag,x + fin + plp + clc + rts + +checkorg php + rep $30 + lda linkversion + jeq :sec + lda segmenthdl+2 + sta segmentptr+2 + lda segmenthdl + sta segmentptr + ldy #$02 + lda [segmentptr] + tax + lda [segmentptr],y + sta segmentptr+2 + stx segmentptr + lda segnum + asl + asl + asl + asl + asl + asl + clc + adc #orgfield + tay + lda [segmentptr],y + iny + iny + ora [segmentptr],y + bne :sec + plp + clc + rts +:sec plp + sec + rts + + +orgop ldx #$00 + jsr eval + bcc :ok + rts +:ok lda linkversion + jeq :abs + lda segmenthdl+2 + sta segmentptr+2 + lda segmenthdl + sta segmentptr + ldy #$02 + lda [segmentptr] + tax + lda [segmentptr],y + sta segmentptr+2 + stx segmentptr + lda segnum + asl + asl + asl + asl + asl + asl + clc + adc #orgfield + tay + lda lvalue + sta [segmentptr],y + iny + iny + lda lvalue+2 + sta [segmentptr],y +* clc +* rts +:abs lda lvalue + sta reloffset + sta orgval + lda lvalue+2 + sta reloffset+2 + sta orgval+2 + clc + rts + +adrop ldx #$00 + jsr eval + bcc :ok + rts +:ok lda lvalue + sta orgval + sta adrval + lda lvalue+2 + sta orgval+2 + sta adrval+2 + clc + rts + + + +ovrop ldy #$00 +]lup lda (lineptr),y + iny + and #$7f + cmp #' ' + blt :one + beq ]lup + and #$5f + cmp #'A' + beq :all + cmp #'F' + beq :off + cmp #';' + beq :one + jmp ]lup +:one lda #$ffff + sta ovrflag + clc + rts +:all lda #$ffff + sta ovrflag + sta ovrallflag + clc + rts +:off lda #$00 + sta ovrflag + sta ovrallflag + clc + rts + +pfxop lda #$00 + jsr getpath + bcc :setpfx + rts +:setpfx jsl prodos + dw $09 ;setpfx + adrl :pfxparm + bcc :rts + sta prodoserr + lda #doserror + sec +:rts rts +:pfxparm dw $00 + adrl asmpath + + mx %00 +putop lda #$ffff + jsr getpath + bcc :setmode + rts +:setmode rep $30 + jsl prodos + dw $06 + adrl info + jcs :err + lda ftype + cmp #$04 + bne :mismatch + lda aux + and #$01 + bne :clc + lda #$ffff + sta ovrflag + lda aux + ora #$01 + sta aux + jsl prodos + dw $05 + adrl info + lda #$00 + sta asmpath + clc + rts +:clc lda #$00 + sta asmpath + clc + rts +:mismatch lda #$00 + sta asmpath + lda #mismatch +:err rep $30 + sta prodoserr + lda #doserror + sec + rts + +ifop lda #$ffff + jsr getpath + bcc :setmode + rts +:setmode rep $30 + jsl prodos + dw $06 + adrl info + jcs :err + lda ftype + cmp #$04 + bne :mismatch + lda aux + and #$01 + bne :clc + lda #$ffff + sta ovrallflag + lda aux + ora #$01 + sta aux + jsl prodos + dw $05 + adrl info + lda #$00 + sta asmpath + clc + rts +:clc lda #$00 + sta asmpath + clc + rts +:mismatch lda #$00 + sta asmpath + lda #mismatch +:err rep $30 + sta prodoserr + lda #doserror + sec + rts + + +savop lda #$00 + sta asmpath + lda linkversion + bne :gslink +* lda savcount +* beq :gslink +* lda #onesave +* sec +* rts +:gslink inc savcount + lda #$0000 + jsr getpath + bcc :goodfile + rts +:goodfile bit passnum + bmi :pass1 + stz reloffset + stz reloffset+2 + jsr newsegment + rts +:clc clc + rts +:pass1 stz reloffset + stz reloffset+2 + stz :ct + stz rellength + stz rellength+2 + + psl #:str + _QADrawString + lda linksymhdl + sta relptr + lda linksymhdl+2 + sta relptr+2 + ldy #$02 + lda [relptr] + tax + lda [relptr],y + sta relptr+2 + stx relptr +]lup jsr readkey + bcc :k1 + and #$7f + cmp #$1b + beq :can + cmp #'C'&$1f + bne :k1 +:can sec + ror cancelflag + jmp :clc2 +:k1 +]lup1 lda :ct + cmp numfiles + beq :clc1 + jsr buildfinal + bcc :inc + rts +:inc inc :ct + jmp ]lup +:clc1 jsr dosegname + bit cancelflag + bmi :cancel + jsr checkorg + bcs :sav + jsr compress + bcc :sav + jmp :ssxit +:sav jsr readkey + bcc :can1 + cmp #$1b + beq :cancel + cmp #'C'&$1f + beq :cancel +:can1 bit cancelflag + bmi :cancel + jsr saveseg + bcc :clc2 + inc segnum + jmp :ssxit +:clc2 inc segnum + clc + jmp :ssxit +:cancel sec + ror cancelflag + lda #$00 +:ssxit pha + php + rep $30 + lda compresshdl + ora compresshdl+2 + beq :plp + psl compresshdl + _disposehandle + stz compresshdl + stz compresshdl+2 +:plp plp + pla + rts + +:ct ds 2 +:str hex 010d + +compress php + rep $30 + lda omfversion + cmp #$02 + blt :clc + stz compresshdl + stz compresshdl+2 + lda rellength + bne :ok +:clc plp + clc + rts +:ok + lda lablen + xba + and #$00ff + sta :len + psl #:str + _QADrawString + ldx #$00 +]lup lda segname,x + phx + jsr drawchar + plx + inx + cpx :len + blt ]lup + lda #$0d + jsr drawchar + ldy rellength + lda #$00 + sep $20 + sta [relptr],y + rep $20 + + psl #$00 + lda rellength + clc + adc #$10 + bcc :pea00 + pea $01 + jmp :pea02 +:pea00 pea $00 +:pea02 pha + ldal userid + ora #linkmemid + pha + pea $8000 + psl #$00 + tll $0902 + plx + ply + jcs :badcompress + stx cptr + stx compresshdl + sty cptr+2 + sty compresshdl+2 + ldy #$02 + lda [cptr] + tax + lda [cptr],y + sta cptr+2 + stx cptr + stz clength + jsr super02 + jsr super03 + jsr superiseg1 + jsr superisegn + jsr comflush + lda clength + sta rellength + plp + clc + rts + +:badcompress rep $30 + jsr prbytel + psl #:badstr + _QADrawString + plp + clc + rts + +:len ds 4 +:str str 'Compressing Segment: ' +:badstr str 'Unable to compress...' + +super02 php + rep $30 + lda relptr + sta cptr1 + lda relptr+2 + sta cptr1+2 + lda #$01 + sta :bytes + stz :patches + lda #$FF00 + sta :page ;bug here when first patch is in +;page $FF of segment + lda clength + sta :oldclen + clc + adc #$06 + sta :countbyte + stz :count + inc + sta :pos + +:s1 ldy #$00 + lda [cptr1],y + and #$ff + sta :cmd + ldx :pos + ldy #$00 + lda [cptr1],y + and #$ff + jeq :donef5 + lda [cptr1],y + cmp #$02F5 ;super 2 type + jne :next1 + iny + iny + lda [cptr1],y + and #$ff + bne :next1 ;shift must be zero + + phy + dey + dey + sep $20 + lda #$05 + sta [cptr1],y + rep $20 + ply + + iny + lda [cptr1],y + and #$ff00 + cmp :page + beq :save + sec + sbc :page + xba + ora #$80 + pha + phy + ldy :countbyte + lda :count + bne :p + dex + dec :bytes + jmp :r +:p dec + sep $20 + sta [cptr],y +:r rep $20 + ply + pla + phy + dec + cmp #$80 + beq :rep + txy + sep $20 + sta [cptr],y + inx + rep $20 + inc :bytes +:rep rep $20 + stz :count + stx :countbyte + inx + inc :bytes + ply +:save inc :count + lda [cptr1],y + pha + and #$ff00 + sta :page + pla + phy + txy + sep $20 + sta [cptr],y + rep $20 + inx + inc :bytes + inc :patches + ply + stx :pos +:next1 lda :cmd + cmp #$f6 + beq :8 + cmp #$06 + beq :8 + lda #$07 + jmp :adc +:8 lda #$08 +:adc clc + adc cptr1 + sta cptr1 + bcc :next2 + inc cptr1+2 +:next2 jmp :s1 +:donef5 ldy :countbyte + lda :count + dec + sep $20 + sta [cptr],y + rep $20 + lda :patches + bne :insert + plp + rts +:insert ldy :oldclen + lda #$f7 + sep $20 + sta [cptr],y + rep $20 + iny + lda :bytes + inc ;to count for super "type" byte + sta [cptr],y + iny + iny + lda #$00 + sta [cptr],y + iny + iny + sep $20 + lda #$00 + sta [cptr],y + rep $20 + lda :bytes + clc + adc #$06 + clc + adc :oldclen + sta clength + plp + rts +:oldclen ds 2 +:bytes ds 2 +:len ds 2 +:pos ds 2 +:length ds 4 +:page ds 2 +:cmd ds 2 +:countbyte ds 2 +:count ds 2 +:patches ds 2 + +super03 php + rep $30 + lda relptr + sta cptr1 + lda relptr+2 + sta cptr1+2 + lda #$01 + sta :bytes + stz :patches + lda #$FF00 + sta :page ;bug here when first patch is in +;page $FF of segment + lda clength + sta :oldclen + clc + adc #$06 + sta :countbyte + stz :count + inc + sta :pos + +:s1 ldy #$00 + lda [cptr1],y + and #$ff + sta :cmd + ldx :pos + ldy #$00 + lda [cptr1],y + and #$ff + jeq :donef5 + lda [cptr1],y + cmp #$03F5 ;super 2 type + jne :next1 + iny + iny + lda [cptr1],y + and #$ff + bne :next1 ;shift must be zero + + phy + dey + dey + sep $20 + lda #$05 + sta [cptr1],y + rep $20 + ply + + iny + lda [cptr1],y + and #$ff00 + cmp :page + beq :save + sec + sbc :page + xba + ora #$80 + pha + phy + ldy :countbyte + lda :count + bne :p + dex + dec :bytes + jmp :r +:p dec + sep $20 + sta [cptr],y +:r rep $20 + ply + pla + phy + dec + cmp #$80 + beq :rep + txy + sep $20 + sta [cptr],y + inx + rep $20 + inc :bytes +:rep rep $20 + stz :count + stx :countbyte + inx + inc :bytes + ply +:save inc :count + lda [cptr1],y + pha + and #$ff00 + sta :page + pla + phy + txy + sep $20 + sta [cptr],y + rep $20 + inx + inc :bytes + inc :patches + ply + stx :pos +:next1 lda :cmd + cmp #$f6 + beq :8 + cmp #$06 + beq :8 + lda #$07 + jmp :adc +:8 lda #$08 +:adc clc + adc cptr1 + sta cptr1 + bcc :next2 + inc cptr1+2 +:next2 jmp :s1 +:donef5 ldy :countbyte + lda :count + dec + sep $20 + sta [cptr],y + rep $20 + lda :patches + bne :insert + plp + rts +:insert ldy :oldclen + lda #$f7 + sep $20 + sta [cptr],y + rep $20 + iny + lda :bytes + inc ;to count for super "type" byte + sta [cptr],y + iny + iny + lda #$00 + sta [cptr],y + iny + iny + sep $20 + lda #$01 ;super reloc3 + sta [cptr],y + rep $20 + lda :bytes + clc + adc #$06 + clc + adc :oldclen + sta clength + plp + rts +:oldclen ds 2 +:bytes ds 2 +:len ds 2 +:pos ds 2 +:length ds 4 +:page ds 2 +:cmd ds 2 +:countbyte ds 2 +:count ds 2 +:patches ds 2 + +superiseg1 php + rep $30 + lda relptr + sta cptr1 + lda relptr+2 + sta cptr1+2 + lda #$01 + sta :bytes + stz :patches + lda #$FF00 + sta :page ;bug here when first patch is in +;page $FF of segment + lda clength + sta :oldclen + clc + adc #$06 + sta :countbyte + stz :count + inc + sta :pos + +:s1 ldy #$00 + lda [cptr1],y + and #$ff + sta :cmd + ldx :pos + ldy #$00 + lda [cptr1],y + and #$ff + jeq :donef5 + lda [cptr1],y + cmp #$03F6 ;super 2 type + jne :next1 + iny + iny + lda [cptr1],y + and #$ff + jne :next1 ;shift must be zero + + sep $20 + lda #$06 + sta [cptr1] + rep $20 + + iny + lda [cptr1],y + and #$ff00 + cmp :page + beq :save + sec + sbc :page + xba + ora #$80 + pha + phy + ldy :countbyte + lda :count + bne :p + dex + dec :bytes + jmp :r +:p dec + sep $20 + sta [cptr],y +:r rep $20 + ply + pla + phy + dec + cmp #$80 + beq :rep + txy + sep $20 + sta [cptr],y + inx + rep $20 + inc :bytes +:rep rep $20 + stz :count + stx :countbyte + inx + inc :bytes + ply +:save inc :count + lda [cptr1],y + pha + and #$ff00 + sta :page + pla + phy + txy + sep $20 + sta [cptr],y + rep $20 + inx + inc :bytes + inc :patches + ply + stx :pos +:next1 lda :cmd + cmp #$f6 + beq :8 + cmp #$06 + beq :8 + lda #$07 + jmp :adc +:8 lda #$08 +:adc clc + adc cptr1 + sta cptr1 + bcc :next2 + inc cptr1+2 +:next2 jmp :s1 +:donef5 ldy :countbyte + lda :count + dec + sep $20 + sta [cptr],y + rep $20 + lda :patches + bne :insert + plp + rts +:insert ldy :oldclen + lda #$f7 + sep $20 + sta [cptr],y + rep $20 + iny + lda :bytes + inc ;to count for super "type" byte + sta [cptr],y + iny + iny + lda #$00 + sta [cptr],y + iny + iny + sep $20 + lda #$02 ;super interseg1 + sta [cptr],y + rep $20 + lda :bytes + clc + adc #$06 + clc + adc :oldclen + sta clength + plp + rts +:oldclen ds 2 +:bytes ds 2 +:len ds 2 +:pos ds 2 +:length ds 4 +:page ds 2 +:cmd ds 2 +:countbyte ds 2 +:count ds 2 +:patches ds 2 + +superisegn php + rep $30 + lda #12 + sta :subval + stz :findval + lda #13 + sta :currentseg +:main rep $30 + lda :currentseg + sec + sbc :subval + sta :thisseg + lda relptr + sta cptr1 + lda relptr+2 + sta cptr1+2 + lda #$01 + sta :bytes + stz :patches + lda #$FF00 + sta :page ;bug here when first patch is in +;page $FF of segment + lda clength + sta :oldclen + clc + adc #$06 + sta :countbyte + stz :count + inc + sta :pos + +:s1 ldy #$00 + lda [cptr1],y + and #$ff + sta :cmd + ldx :pos + ldy #$00 + lda [cptr1],y + and #$ff + jeq :donef5 + lda [cptr1],y + cmp #$02F6 ;super 2 type + jne :next1 + iny + iny + lda [cptr1],y + and #$ff + cmp :findval + jne :next1 ;shift must be zero + iny + iny + iny + lda [cptr1],y + and #$ff + cmp :thisseg + jne :next1 + dey + dey + dey + phy + dey + dey + sep $20 + lda #$06 + sta [cptr1],y + rep $20 + ply + + iny + lda [cptr1],y + and #$ff00 + cmp :page + beq :save + sec + sbc :page + xba + ora #$80 + pha + phy + ldy :countbyte + lda :count + bne :p + dex + dec :bytes + jmp :r +:p dec + sep $20 + sta [cptr],y +:r rep $20 + ply + pla + phy + dec + cmp #$80 + beq :rep + txy + sep $20 + sta [cptr],y + inx + rep $20 + inc :bytes +:rep rep $20 + stz :count + stx :countbyte + inx + inc :bytes + ply +:save inc :count + lda [cptr1],y + pha + and #$ff00 + sta :page + pla + phy + txy + sep $20 + sta [cptr],y + rep $20 + inx + inc :bytes + inc :patches + + ply + stx :pos +:next1 lda :cmd + cmp #$f6 + beq :8 + cmp #$06 + beq :8 + lda #$07 + jmp :adc +:8 lda #$08 +:adc clc + adc cptr1 + sta cptr1 + bcc :next2 + inc cptr1+2 +:next2 jmp :s1 +:donef5 ldy :countbyte + lda :count + dec + sep $20 + sta [cptr],y + rep $20 + lda :patches + bne :insert + plp + rts +:insert ldy :oldclen + lda #$f7 + sep $20 + sta [cptr],y + rep $20 + iny + lda :bytes + inc ;to count for super "type" byte + sta [cptr],y + iny + iny + lda #$00 + sta [cptr],y + iny + iny + sep $20 + lda :currentseg ;super intersegN + inc ;type byte is 1+n + sta [cptr],y + rep $20 + lda :bytes + clc + adc #$06 + clc + adc :oldclen + sta clength + inc :currentseg + lda :currentseg + cmp #25 + jlt :main + pha + lda #$f0 + sta :findval + lda #24 + sta :subval + pla + cmp #37 + jlt :main + plp + rts +:oldclen ds 2 +:bytes ds 2 +:len ds 2 +:pos ds 2 +:length ds 4 +:page ds 2 +:cmd ds 2 +:countbyte ds 2 +:count ds 2 +:patches ds 2 +:currentseg ds 2 +:findval ds 2 +:subval ds 2 +:thisseg ds 2 + +comflush php + rep $30 + lda relptr + sta cptr1 + lda relptr+2 + sta cptr1+2 +]lup ldy #$00 + lda [cptr1],y + and #$ff + jeq :xit + sta :cmd + cmp #$f6 + beq :sta + cmp #$f5 + beq :sta + cmp #$05 + jeq :05 + cmp #$06 + jeq :06 +:sta ldx clength + lda [cptr1],y + phy + txy + sta [cptr],y + ply + iny + iny + inx + inx + lda [cptr1],y + phy + txy + sta [cptr],y + ply + iny + iny + inx + inx + lda [cptr1],y + phy + txy + sta [cptr],y + ply + iny + iny + inx + inx + + lda :cmd + cmp #$f6 + beq :f6 + sep $20 + lda [cptr1],y + phy + txy + sta [cptr],y + ply + iny + inx + jmp :sta1 + +:f6 lda [cptr1],y + phy + txy + sta [cptr],y + ply + inx + inx +:sta1 rep $30 + stx clength + stx rellength + lda :cmd + cmp #$f6 + beq :06 +:05 lda cptr1 + clc + adc #$07 + sta cptr1 + jmp :08 +:06 lda cptr1 + clc + adc #$08 + sta cptr1 +:08 bcc :09 + inc cptr1+2 +:09 jmp ]lup +:xit + ldy #$00 + lda relptr + sta cptr1 + lda relptr+2 + sta cptr1+2 + sep $20 +]lup lda [cptr],y + sta [cptr1],y + iny + cpy clength + blt ]lup + rep $30 + + plp + rts + +:cmd ds 2 + +showcodelen + php + rep $30 + + psl #:str + _QADrawString + + lda segnum + jsr prbyte + + psl #:str1 + _QADrawString + + lda seglength + jsr prbytel + + lda #$0d + jsr drawchar + plp + clc + rts +:str str 'Code length of segment ' +:str1 str ' = $' +:len ds 2 + +showjmplen + php + rep $30 + + psl #:str + _QADrawString + + lda bytecnt+2 + xba + and #$ff + beq :1 + jsr prbyte +:1 lda bytecnt+2 + and #$ff + beq :2 + jsr prbyte +:2 lda bytecnt + xba + and #$ff + beq :3 + jsr prbyte +:3 lda bytecnt + and #$ff + jsr prbyte + + lda #$0d + jsr drawchar + plp + clc + rts +:str str 0d,'Jump table segment length = $' + + +dosegname php + rep $30 + stz :segflag + lda segnum + cmp #$01 + beq :ldy + lda #$ffff + sta :segflag +:ldy ldy #$00 + sep $20 + lda #' ' +]lup sta segname,y + bit :segflag + bmi :i1 + sta loadname,y +:i1 iny + cpy #10 + blt ]lup + rep $20 + lda asmpath + and #$ff + sta :length + tax + lda asmpath,x + and #$7f + cmp #':' + bne :chklen + dec :length +:chklen lda :length + bne :ldx + jmp :segment +:ldx ldx #$01 + ldy #$00 + sep $20 +]lup cpx :length + blt :1 + beq :1 + jmp :segment +:1 lda asmpath,x + and #$7f + cmp #' '+1 + blt :segment + cmp #':' + bne :sta + ldy #$00 + lda #' ' +]clr sta segname,y + bit :segflag + bmi :iny + sta loadname,y +:iny iny + cpy #10 + blt ]clr + ldy #$00 + inx + jmp ]lup +:sta cpy #10 + bge :sta1 +:sta2 sta segname,y + bit :segflag + bmi :sta1 + sta loadname,y +:sta1 iny + inx + jmp ]lup +:segment + rep $30 + plp + rts +:length ds 2 +:segflag ds 2 + +saveseg php + rep $30 + lda linksymhdl + sta workspace + lda linksymhdl+2 + sta workspace+2 + ldy #$02 + lda [workspace] + sta relptr + lda [workspace],y + sta relptr+2 + stz bytecnt + stz bytecnt+2 + stz seglength + stz seglength+2 + lda seghdrlen + sta bytecnt + stz :ct +]lup lda :ct + cmp numfiles + beq :bytes + asl + asl + asl + asl + asl + tax + lda files+10,x + cmp segnum + bne :next + lda files+8,x + clc + adc seglength + sta seglength + bcc :next + inc seglength+2 +:next inc :ct + jmp ]lup +:bytes ldy rellength + inc rellength + lda #$00 + sep $20 + sta [relptr],y + rep $20 +:23 lda rellength + clc + adc bytecnt + sta bytecnt + bcc :3 + inc bytecnt+2 +:3 lda seglength + clc + adc bytecnt + sta bytecnt + lda seglength+2 + adc bytecnt+2 + sta bytecnt+2 + + bit outfileopen + jmi :writeit + lda asmpath + and #$00ff + tax + sep $20 +]lup lda asmpath,x + sta filename,x + dex + bpl ]lup + rep $20 + lda linktype + sta :ftype + stz :auxtype + stz :auxtype+2 + lda linkversion + bne :omf + lda orgval + sta :auxtype + jmp :i +:omf lda adrval + sta :auxtype +:i + jsl prodos + dw $06 + adrl :finfo + bcs :createit + lda :ftype1 + cmp linktype + beq :setinfo + lda #mismatch + jmp :gsoserr + +:createit jsl prodos + dw $01 + adrl :create + bcc :op + +:setinfo lda linktype + sta :ftype1 + + stz :auxtype1 + stz :auxtype1+2 + lda linkversion + bne :omf1 + lda orgval + sta :auxtype1 + jmp :i1 +:omf1 lda adrval + sta :auxtype1 +:i1 + jsl prodos + dw $05 + adrl :finfo + jcs :gsoserr + +:op jsl prodos + dw $10 + adrl :open + jcs :gsoserr + lda :open + sta :eof + sta :write + sta closefile + sec + ror outfileopen + +:writeit lda linkversion + jeq :abs + + lda extrabytes + beq :write1 + lda #$200 + sec + sbc extrabytes + sta extrabytes + + lda #zeros + sta :buffer + lda #^zeros + sta :buffer+2 + lda extrabytes + sta :request + stz :request+2 + + lda extrabytes + clc + adc totalbytes + sta totalbytes + bcc :tb1 + inc totalbytes+2 +:tb1 stz extrabytes + jsl prodos + dw $13 + adrl :write + jcs :gsoserr + +:write1 lda seglength + sta lconst+1 + lda seglength+2 + sta lconst+3 + + jsr setfields + + lda #^segheader + sta :buffer+2 + lda #segheader + sta :buffer + lda bytecnt + clc + adc #5 + sta bytecnt + bcc :6 + inc bytecnt+2 +:6 lda seghdrlen + clc + adc #$05 + sta :request + stz :request+2 + jsr showcodelen + lda :request + clc + adc totalbytes + sta totalbytes + lda :request+2 + adc totalbytes+2 + sta totalbytes+2 + lda omfversion + cmp #$02 + bge :p16 + lda #^omfheader1 + sta :buffer+2 + lda #omfheader1 + sta :buffer + jsr setomf1 +:p16 jsl prodos + dw $13 + adrl :write + jcs :gsoserr + +:abs + stz :ct +]lup lda :ct + cmp numfiles + jeq :dictionary + asl + asl + asl + asl + asl + tax + lda files+10,x + cmp segnum + jne :next1 + lda files+8,x + sta :request + stz :request+2 + lda files,x + sta :handle + sta workspace + lda files+2,x + sta :handle+2 + sta workspace+2 + psl :handle + _HLock + ldy #$02 + lda [workspace] + sta :buffer + lda [workspace],y + sta :buffer+2 + + lda :request + clc + adc totalbytes + sta totalbytes + lda :request+2 + adc totalbytes+2 + sta totalbytes+2 + + jsl prodos + dw $13 + adrl :write + + php + pha + phx + _getmark :eof + _seteof :eof + psl :handle + _HUnlock + psl :handle + _disposehandle + plx + pla + plp + jcs :gsoserr + +:next1 inc :ct + jmp ]lup + +:dictionary lda linkversion + jeq :abs1 + lda rellength + sta :request + stz :request+2 + lda relptr + sta :buffer + lda relptr+2 + sta :buffer+2 + + lda :request + clc + adc totalbytes + sta totalbytes + lda :request+2 + adc totalbytes+2 + sta totalbytes+2 + + jsl prodos + dw $13 + adrl :write + jcs :gsoserr + + plp + clc + rts +:abs1 jsl prodos + dw $14 + adrl closefile + stz outfileopen + stz closefile + lda linkversion + bne :gsplp + lda #$0d + jsr drawchar + psl #asmpath + _QADrawString + psl #:savstr + _QADrawString +:gsplp plp + clc + rts +:gsoserr rep $30 + sta prodoserr + jsl prodos + dw $14 + adrl closefile + stz outfileopen + lda #doserror + plp + sec + rts + +:savstr str ' saved.' +:mystr str 'Rel length $' +:handle ds 4 +:ct ds 2 +:open dw $00 + adrl asmpath + adrl $00 +:eof dw $00 + adrl $00 +:create adrl asmpath + dw $e3 +:ftype dw $b3 ;exe for now +:auxtype adrl $00 + dw $01 + adrl $00 +:write dw $00 +:buffer adrl $00 +:request adrl $00 + adrl $00 +:finfo adrl asmpath + ds 2,0 +:ftype1 ds 2 +:auxtype1 ds 4,0 + ds 16,0 + +closefile dw $00 + + +setfields php + rep $30 + lda segmenthdl+2 + sta segmentptr+2 + lda segmenthdl + sta segmentptr + ldy #$02 + lda [segmentptr] + tax + lda [segmentptr],y + sta segmentptr+2 + stx segmentptr + lda segnum + asl + asl + asl + asl + asl + asl + sta :offset + clc + adc #kindfield + tay + lda [segmentptr],y + sta kind + lda :offset + clc + adc #dsfield + tay + lda [segmentptr],y + sta resspc + iny + iny + lda [segmentptr],y + sta resspc+2 + lda resspc + clc + adc seglength + sta seglength + lda resspc+2 + adc seglength+2 + sta seglength+2 + + lda :offset + clc + adc #orgfield + tay + lda [segmentptr],y + sta org + iny + iny + lda [segmentptr],y + sta org+2 + + lda :offset + clc + adc #alignfield + tay + lda [segmentptr],y + sta align + iny + iny + lda [segmentptr],y + sta align+2 + +:xit plp + rts +:offset ds 2 + + mx %00 +typop ldy #$00 +]lup lda (lineptr),y + and #$7f + cmp #' ' + blt :bad + bne :start + iny + jmp ]lup +:start jsr :check + rep $30 + bcc :eval + sta lvalue + jmp :ok1 +:eval ldx #$00 + jsr eval + bcc :ok1 +:bad lda #badoperand + jmp :sec1 +:sec1 sec + rts +:ok1 lda lvalue + and #$00FF + sta linktype + clc + rts + +:check sep $30 + and #$7f + cmp #'a' + blt :c0 + cmp #'z'+1 + bge :c0 + and #$5f +:c0 sta :typ+1 + iny + lda (lineptr),y + and #$7f + cmp #' '+1 + blt :chkbad + cmp #'a' + blt :c1 + cmp #'z'+1 + bge :c1 + and #$5f +:c1 sta :typ+2 + iny + lda (lineptr),y + and #$7f + cmp #' '+1 + blt :chkbad + cmp #'a' + blt :c2 + cmp #'z'+1 + bge :c2 + and #$5f +:c2 sta :typ+3 + lda #$03 + sta :typ + rep $30 + pea 0 + psl #:typ + _QAConvertTxt2Typ + ply + bcc :found +:chkbad rep $20 + clc + rts +:found rep $20 + tya + sec + rts +:typ ds 5 + + +verop bit passnum + bpl :ver + clc + rts +:ver bit verchg + bpl :ver1 + clc + rts +:ver1 ldx #$00 + jsr eval + bcc :ok + rts +:ok lda lvalue + beq :bad + cmp #$03 + blt :ok1 +:bad lda #badvalue + sec + rts +:ok1 and #$ff + sta omfversion + sec + ror verchg + clc + rts + +showendstr php + rep $30 + lda cancelflag + jmi :plp + + lda linkversion + bne :gs + psl #:absstr + _QADrawString + jmp :all + +:gs psl #:gsstr + _QADrawString + pea 0 + lda omfversion + pha + pea 0 + pea 0 + _QADrawDec + jsr :comma + +:all psl totalbytes + pea 0 + pea 0 + _QADrawDec + + psl #:str2 + _QADrawString + + pea 0 + lda totalerrs + pha + pea 0 + pea 0 + _QADrawDec + +:end lda #$0d + jsr drawchar + jsr drawchar + + jsr calctime + +:plp plp + rts +:absstr str 0d,'End of absolute linker command file, ' +:gsstr str 0d,'End of GS-linker command file, OMF version ' +:str2 str ' bytes, errors: ' + +:comma php + rep $30 + lda #',' + jsr drawchar + lda #' ' + jsr drawchar + plp + rts +calctime php + rep $30 + pha + pha + pha + _QAEndTiming + pla + sta :hours + pla + sta :minutes + pla + sta :seconds + + stz :flag + + psl #:str1 + _QADrawString + + lda :hours + beq :mins + pea 0 + lda :hours + pha + pea 0 + pea 0 + _QADrawDec + + psl #:str2 + _QADrawString + lda :hours + jsr :plural + inc :flag +:mins lda :minutes + beq :secs + lda :flag + beq :m1 + jsr :spc +:m1 pea 0 + lda :minutes + pha + pea 0 + pea 0 + _QADrawDec + + psl #:str3 + _QADrawString + lda :minutes + jsr :plural + inc :flag +:secs lda :flag + beq :s0 + lda :seconds + beq :end + jsr :spc + jmp :s1 +:s0 lda :seconds + bne :s1 + lda #'<' + jsr drawchar + lda #$20 + jsr drawchar + inc :seconds +:s1 pea 0 + lda :seconds + pha + pea 0 + pea 0 + _QADrawDec + + psl #:str4 + _QADrawString + lda :seconds + jsr :plural +:end lda #'.' + jsr drawchar + lda #$0d + jsr drawchar + jsr drawchar + plp + rts +:plural php + rep $30 + cmp #$01 + beq :c + lda #'s' + jsr drawchar +:c plp + rts +:spc php + rep $30 + lda #',' + jsr drawchar + lda #' ' + jsr drawchar + plp + rts + +:flag ds 2 +:hours ds 2 +:minutes ds 2 +:seconds ds 2 +:str1 str 'Elapsed time (total) = ' +:str2 str ' hour' +:str3 str ' minute' +:str4 str ' second' + + + mx %00 +purgeasm php + rep $30 + lda userid + ora #linkmemid+$100 + pha + _Disposeall + plp + rts + +getglobals php + rep $30 + +:reset lda #$ffff + sta asmlablect + jsr incasmlablect + bcc :ok + plp + sec + rts +:ok lda #^symtable + sta linksymtbl+2 + lda #symtable + sta linksymtbl + + lda linksymhdl + sta workspace + lda linksymhdl+2 + sta workspace+2 + + lda [workspace] + tax + ldy #$02 + lda [workspace],y + sta workspace+2 + stx workspace + lda #$0000 + tay +]lup sta [workspace],y + iny + iny + cpy #maxsymbols*4 + blt ]lup + + lda #$ffff + ldx #$00 +]lup sta symtable,x + inx + inx + cpx #128*2 + blt ]lup + + lda #$01 ;move lables to asm + jsr traverse + plp + clc + rts + +initvars php + rep $30 + lda #$b3 + sta linktype + stz rezpath + stz filename + stz zipflag + stz objok + stz orgval + stz orgval+2 + stz adrval + stz adrval+2 + stz outfileopen + stz segmentptr + stz segmentptr+2 + stz segmenthdl + stz segmenthdl+2 + stz jmphdl + stz jmphdl+2 + stz jmpptr + stz jmpptr+2 + stz jmplength + stz segnum + stz maxsegnum + stz lableptr + stz lableptr+2 + stz lableptr1 + stz lableptr1+2 + stz cancelflag + stz totalerrs + stz lnkflag + stz passnum + stz numfiles + stz asmlablect + stz caseflag + stz reloffset + stz reloffset+2 + stz omfok + stz linksymnum + stz linksymtbl + stz linksymtbl+2 + stz linksymhdl + stz linksymhdl+2 + do oldshell + lda #$ffff + sta linklstflag,x + fin + stz globalhdl + stz globalhdl+2 + stz verchg + stz lkvchg + lda #$01 + sta linkversion + lda #$02 + sta omfversion + stz totalbytes + stz totalbytes+2 + stz savcount + lda #$ffff + sta dynamic + ldx #$00 + lda #$ffff +]lup sta globaltbl,x + sta symtable,x + inx + inx + cpx #256 + blt ]lup + + _QAStartTiming + + plp + rts +:s ds 2 + + +disposemem php + rep $30 + lda userid + ora #linkmemid + pha + _disposeall + lda userid + ora #linkmemid+$100 + pha + _disposeall + lda userid + ora #linkmemid+$200 + pha + _disposeall + stz linksymhdl + stz linksymhdl+2 + stz globalhdl + stz globalhdl+2 + stz segmenthdl + stz segmenthdl+2 + plp + rts + +readkey php + rep $30 + phx + phy + pea 0 + _QAKeyAvail + pla + beq :clc + pha + _QAGetChar + pla + and #$7f + ply + plx + plp + sec + rts +:clc ply + plx + plp + clc + rts + +zeros ds 512,0 + diff --git a/src/link/linker.2.s b/src/link/linker.2.s new file mode 100644 index 0000000..da55f31 --- /dev/null +++ b/src/link/linker.2.s @@ -0,0 +1,1898 @@ + mx %00 +rezop lda passnum + bne :ok + clc + rts +:ok lda rezpath + beq :ok0 + lda #illegalcmd + sec + rts +:ok0 lda #$00 + jsr getpath + bcc :ok1 + rts +:ok1 sep $30 + ldx asmpath +]lup lda asmpath,x + sta rezpath+1,x + dex + bpl ]lup + rep $30 + lda rezpath + xba + and #$FF + sta rezpath + clc + rts + +rezbuffsize = $1000 + +writerez php + rep $30 + lda linkversion + beq :clc + lda rezpath + beq :clc + xba + sta rezpath + lda filename + and #$FF + beq :clc ;no SAV was done + psl #:str + _QADrawString + psl #rezpath+1 + _QADrawString + lda #$0d + jsr drawchar + lda #$0d + jsr drawchar + lda rezpath + xba + sta rezpath + jsr writerez1 +:clc plp + clc + rts +:str str 'Importing RESOURCES from: ' + +writerez1 php + sep $30 + ldx filename +]lup lda filename,x + sta asmpath+1,x + dex + bpl ]lup + rep $30 + stz :outref + stz :rezref + stz :handle + stz :handle+2 + lda asmpath + xba + and #$ff + sta asmpath + stz :outtype + stz :outaux + stz :outaux+2 + stz :outstor + stz :outacc + jsl prodos + dw $2006 ;GSOS Open + adrl :outinfo + jcs :err + lda :outstor + cmp #$0005 + beq :copy + psl :outaux + lda :outtype + pha + lda :outacc + pha + psl #asmpath + tll $091e ;_CreateResourceFile + jcs :err +:copy psl #$00 + psl #rezbuffsize + lda userid + ora #linkmemid + pha + pea $8000 + psl #$00 + _newhandle + plx + ply + jcs :err + sty :handle+2 + sty zpage+2 + stx :handle + stx zpage + ldy #$02 + lda [zpage] + sta :buffer1 + lda [zpage],y + sta :buffer1+2 + jsl prodos + dw $2010 + adrl :rezopen + jcs :err + jsl prodos + dw $2010 + adrl :outopen + jcs :err + lda :outref + sta :eofref + jsl prodos + dw $2018 + adrl :eofparm + jcs :err +:loop lda #rezbuffsize + sta :request1 + stz :request1+2 + stz :transfer1 + stz :transfer1+2 + lda :rezref + sta :readref + jsl prodos + dw $2012 + adrl :readparm + bcc :write + cmp #$4c + jne :err + lda :transfer1 + ora :transfer1+2 + beq :noerr +:write lda :transfer1 + sta :request1 + lda :transfer1+2 + sta :request1+2 + stz :transfer1 + stz :transfer1+2 + lda :outref + sta :readref + jsl prodos + dw $2013 + adrl :readparm + jcs :err + jmp :loop +:noerr lda #$00 +:err pha + cmp #$00 + beq :close + sta prodoserr + lda #doserror + jsr linkerror + stz prodoserr +:close lda :outref + beq :c1 + sta :closeref + jsl prodos + dw $2014 + adrl :closeparm +:c1 lda :rezref + beq :pla + sta :closeref + jsl prodos + dw $2014 + adrl :closeparm +:pla lda :handle + ora :handle+2 + beq :pla1 + psl :handle + _disposehandle + stz :handle + stz :handle+2 +:pla1 pla + plp + cmp one + rts + +:handle ds 4 +:eofparm dw 3 +:eofref dw 0 + dw 0 + adrl 0 +:readparm dw 4 +:readref dw 0 +:buffer1 adrl 0 +:request1 adrl 0 +:transfer1 adrl 0 + +:rezopen dw 4 +:rezref dw 0 + adrl rezpath + dw 1 ;read only + dw 1 ;resource fork +:outopen dw 4 +:outref dw 0 + adrl asmpath + dw 0 ;read write + dw 1 + +:outinfo dw 5 + adrl asmpath +:outacc dw 0 +:outtype dw 0 +:outaux adrl 0 +:outstor dw 0 + +:closeparm dw 1 +:closeref ds 2 + +express php + rep $30 + lda linkversion + beq :clc + bit zipflag + bpl :clc + psl #:str + _QADrawString + psl #filename + _QADrawString + psl #:str1 + _QADrawString + do doexpress + jsr writeexp + fin +:clc plp + clc + rts +:str str 'Expressing: ' +:str1 str '....' + + + +setomf1 php + rep $30 + lda resspc + sta resspc1 + lda resspc+2 + sta resspc1+2 + lda seglength + sta seglength1 + lda seglength+2 + sta seglength1+2 + lda org + sta org1 + lda org+2 + sta org1+2 + lda align + sta align1 + lda align+2 + sta align1+2 + + + lda lconst+1 + sta lconst1+1 + lda lconst+3 + sta lconst1+3 + + lda segnum + sta segnum1 + lda kind + sep $20 + sta kind1 + ldx #$00 +]lup lda dispname,x + sta dispname1,x + inx + cpx #namelen*2+4 + blt ]lup + + rep $20 + lda bytecnt + sta :count + lda bytecnt+2 + sta :count+2 + lda :count + and #$1ff + sta extrabytes + lup 9 + lsr :count+2 + ror :count + --^ + lda extrabytes + beq :noinc + inc :count + bne :noinc + inc :count+2 +:noinc lda :count + sta blkcount + lda :count+2 + sta blkcount+2 + + plp + rts +:count ds 4 + +jumpentry php + rep $30 + phy + phx + lda linkversion + jeq :clc + + lda segmenthdl+2 + sta segmentptr+2 + lda segmenthdl + sta segmentptr + ldy #$02 + lda [segmentptr] + tax + lda [segmentptr],y + sta segmentptr+2 + stx segmentptr + lda foundlable+24 + asl + asl + asl + asl + asl + asl + clc + adc #kindfield + tay + lda [segmentptr],y + ldx omfversion + cpx #$02 + blt :80 + bit #$8000 + beq :clc + jmp :enter +:80 bit #$80 + beq :clc +:enter jsr newjmpentry + bcs :sec + psl jmphdl + _hlock + lda interseg + and #$7fff + sta jseg + lda omfoff2 + sta joffset + lda omfoff2+2 + sta joffset+2 + ldy jmplength + ldx #$00 + sep $20 +]lup lda jmptblrec,x + sta [jmpptr],y + inx + iny + cpx #jmptblend-jmptblrec + blt ]lup + rep $20 + lda jmplength + sty jmplength + ldx omfversion + cpx #$03 + bge :noadd + clc + adc #$08 +:noadd clc + adc #jjsl-jmptblrec + sta omfoff2 + lda maxsegnum + ora #$8000 + sta interseg + sec + ror dynamic +:clc psl jmphdl + _hunlock + plx + ply + plp + clc + rts +:sec pha + lda jmphdl + ora jmphdl+2 + beq :sec1 + psl jmphdl + _hunlock +:sec1 pla + plx + ply + plp + clc + rts + +jmptblrec + dw $00 ;userid + dw $01 ;load file number +jseg dw $00 +joffset adrl $00 +jjsl jsl $00000000 +jmptblend + +newjmpentry php + rep $30 + lda jmphdl + ora jmphdl+2 + bne :resize + psl #$00 + psl #jmptblend-jmptblrec + lda userid + ora #linkmemid + pha + pea $8000 + psl #$00 + _newhandle + plx + ply + jcs :err + sty jmphdl+2 + stx jmphdl + sty jmpptr+2 + stx jmpptr + ldy #$02 + lda [jmpptr] + tax + lda [jmpptr],y + sta jmpptr+2 + stx jmpptr + jmp :clc +:resize psl jmphdl + _HUnlock + psl #$00 + psl jmphdl + _gethandlesize + pll :size + lda :size + clc + adc #jmptblend-jmptblrec + sta :size + lda :size+2 + adc #^jmptblend-jmptblrec + sta :size+2 + lda :size+2 + bne :toobig + psl :size + psl jmphdl + _sethandlesize + bcs :err + psl jmphdl + _Hlock + ldy #$02 + lda [jmphdl] + sta jmpptr + lda [jmphdl],y + sta jmpptr+2 + jmp :clc +:toobig lda #jmptblfull + jmp :err +:clc plp + clc + rts +:err plp + sec + rts +:size ds 4 + +writejmpseg php + rep $30 + + lda linkversion + jeq :clc + bit outfileopen + jpl :clc + lda jmplength + jeq :clc + lda jmphdl + ora jmphdl+2 + jeq :clc + lda closefile + sta :write + + jsr dosegname + sep $30 + ldx #$01 +]lup lda :jmpname,x + sta segname-1,x + inx + cpx :jmpname + blt ]lup + beq ]lup +]lup cpx #namelen + bge :setup + lda #$20 + sta segname-1,x + inx + bra ]lup +:setup rep $30 + stz align + stz align+2 + stz resspc + stz resspc+2 + stz org + stz org+2 + lda #$1002 + sta kind + + lda #zeros + sta :buffer + lda #^zeros + sta :buffer+2 + + lda extrabytes + beq :write1 + lda #$200 + sec + sbc extrabytes + sta extrabytes + + lda extrabytes + sta :request + stz :request+2 + + lda :request + clc + adc totalbytes + sta totalbytes + lda :request+2 + adc totalbytes+2 + sta totalbytes+2 + stz extrabytes + jsl prodos + dw $13 + adrl :write + jcs :doserr + +:write1 lda jmplength + sta lconst+1 + sta seglength + stz lconst+3 + stz seglength+2 + lda omfversion + cmp #$03 + bge :noadd + lda lconst+1 + clc + adc #$08 + sta lconst+1 + sta seglength + bcc :noadd + inc lconst+3 + inc seglength+2 +:noadd lda lconst+1 + clc + adc #$04 + sta lconst+1 + sta seglength + bcc :noadd2 + inc lconst+3 + inc seglength+2 +:noadd2 lda seghdrlen + clc + adc lconst+1 + sta bytecnt + lda #$00 + adc lconst+3 + sta bytecnt+2 + lda bytecnt + clc + adc #$06 ;1 byte $00 (end), 5 for lconst ($f2) + sta bytecnt + bcc :noadd1 + inc bytecnt+2 +:noadd1 jsr showjmplen + lda maxsegnum + sta segnum + lda #segheader + sta :buffer + lda #^segheader + sta :buffer+2 + + stz :request+2 + lda seghdrlen + clc + adc #$05 + sta :request + bcc :n1 + inc :request+2 + +:n1 lda omfversion + cmp #$02 + bge :writehdr + lda #omfheader1 + sta :buffer + lda #^omfheader1 + sta :buffer+2 + jsr setomf1 +:writehdr + lda :request + clc + adc totalbytes + sta totalbytes + lda :request+2 + adc totalbytes+2 + sta totalbytes+2 + + jsl prodos + dw $13 + adrl :write + jcs :doserr + + lda omfversion + cmp #$03 + bge :omf3 + + lda #zeros + sta :buffer + lda #^zeros + sta :buffer+2 + stz :request+2 + lda #$08 + sta :request + + lda :request + clc + adc totalbytes + sta totalbytes + lda :request+2 + adc totalbytes+2 + sta totalbytes+2 + + jsl prodos + dw $13 + adrl :write + jcs :doserr + +:omf3 + psl jmphdl + _hlock + lda jmphdl + sta jmpptr + lda jmphdl+2 + sta jmpptr+2 + lda [jmpptr] + sta :buffer + ldy #$02 + lda [jmpptr],y + sta :buffer+2 + psl #$00 + psl jmphdl + _gethandlesize + pll :request + + lda :request + clc + adc totalbytes + sta totalbytes + lda :request+2 + adc totalbytes+2 + sta totalbytes+2 + + jsl prodos + dw $13 + adrl :write + jcs :doserr + + lda #zeros + sta :buffer + lda #^zeros + sta :buffer+2 + stz :request+2 + lda #$05 + sta :request + + lda :request + clc + adc totalbytes + sta totalbytes + lda :request+2 + adc totalbytes+2 + sta totalbytes+2 + jsl prodos + dw $13 + adrl :write + jcs :doserr + + lda :write + sta :eof + _getmark :eof + _seteof :eof +:clc plp + clc + rts +:sec plp + sec + rts +:doserr sta prodoserr + lda #doserror + jmp :sec +:jmpname str 'SEGJPTABLE' +:eof dw $00 + adrl $00 +:write dw $00 +:buffer ds 4 +:request ds 4 + ds 4 + + +isegwarning php + rep $30 + lda linkversion + jeq :xit + lda segnum + cmp extseg + jeq :xit + lda segmenthdl+2 + sta segmentptr+2 + lda segmenthdl + sta segmentptr + ldy #$02 + lda [segmentptr] + tax + lda [segmentptr],y + sta segmentptr+2 + stx segmentptr + lda extseg + asl + asl + asl + asl + asl + asl + clc + adc #kindfield + tay + lda [segmentptr],y + ldx omfversion + cpx #$02 + blt :80 + bit #$8000 + beq :xit + jmp :err +:80 bit #$0080 + beq :xit +:err rep $30 + pea 0 + _QAGetWindow + pea $ffff + _QASetWindow + psl #:str + _QADrawString + lda omfoff1 + jsr prbytel + lda #$0d + jsr drawchar + lda #$0d + jsr drawchar + _QAIncTotalErrs + _QASetWindow +:xit plp + rts +:str str 0d,'Illegal reference to a dynamic segment at $' + + +caselable php +:doit sep $30 + ldx labstr + beq :xit +]loop ldy labstr,x + lda converttable1,y + sta labstr,x + dex + bne ]loop +:xit plp + rts + +findlable +]ct equ workspace +]offset equ ]ct+$2 +]pos equ ]offset+$2 +]pos1 equ ]pos+$2 +]len1 equ ]pos1+$2 +]len2 equ ]len1+$2 +*]eval equ ]len2+2 + +:entry php + rep $30 +:normal bit caseflag +* bpl :macentry + jsr caselable +:macentry stz labtype + lda lablect + beq :notfound + lda labstr + and #$000F + beq :notfound + sta ]len1 + lda labstr+$1 + and #$7F + jmp :global +:global asl + tax + lda globaltbl,x + bmi :notfound + sta ]pos +:gloop +]lup lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + stz ]offset + ldy #$00 + lda [lableptr],y + and #$0F + sta ]len2 + sep $20 + iny + iny + ldx #$02 ;start at byte 2 +]lup1 cpx #$10 + bge :movefound + cpx ]len1 + blt :1 + beq :1 + jmp :goleft1 +:notfound plp + clc + rts +:1 cpx ]len2 + blt :2 + beq :2 + jmp :goright +:2 lda labstr,x + cmp [lableptr],y + bne :next + iny + inx + jmp ]lup1 +:next blt :goleft + jmp :goright +:goleft1 lda ]len1 + cmp ]len2 + beq :movefound +:goleft rep $30 + ldy #18 ;leftptr + lda [lableptr],y + bmi :notfound + sta ]pos + jmp ]lup +:goright rep $30 + ldy #20 ;leftptr + lda [lableptr],y + bmi :notfound + sta ]pos + jmp ]lup + +:movefound rep $30 + lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #26 + lda [lableptr],y + bit #linkequbit + beq :ldy + bit #linkequvalid + bne :ldy + jmp :notfound +:ldy ldy #$00 + ldx #$00 +]lup lda [lableptr],y + sta foundlable,x + inx + inx + iny + iny + cpx #32 + blt ]lup +:mfplp plp + sec + rts + +insertlable +]ct equ workspace +]offset equ ]ct+$2 +]pos equ ]offset+$2 +]pos1 equ ]pos+$2 +]len1 equ ]pos1+$2 +]len2 equ ]len1+$2 + +:entry php + rep $30 + sta labtype + lda lablect + cmp #maxlinklab ;max number of lables + blt :ne1 + lda #symfull ;symtable full + jmp :error +:ne1 jsr caselable +:ne11 lda labstr + and #$FF + bne :ne2 + lda #badlable + jmp :error +:ne2 +:ne22 sta ]len1 + lda labstr+$1 ;first byte of string + and #$7F +:asl01 asl + tax + lda globaltbl,x + bpl :start + lda #$FFFF + sta ]pos ;no previous + lda lablect + sta globaltbl,x +:save rep $30 + jsr :saveit +:nosave lda #$00 + plp + clc + rts +:start sta ]pos +]lup lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + stz ]offset + ldy #$00 + sep $20 + lda [lableptr],y + sta ]len2 + iny + iny + ldx #$02 ;start at byte 2 +]lup1 cpx #$10 + jeq :error + cpx ]len1 + blt :1 + beq :1 + jmp :goleft1 +:1 cpx ]len2 + blt :2 + beq :2 + jmp :goright +:2 lda [lableptr],y + cmp labstr,x + bne :next + iny + inx + jmp ]lup1 +:next rep $30 + blt :goright + jmp :goleft +:goleft1 rep $30 + lda ]len1 + cmp ]len2 + bne :goleft +:replace ldy #26 #26 + lda [lableptr],y + bit #linkequbit + beq :duperr + bit #linkequvalid + beq :ora + +:duperr sep $30 + ldx #$00 +]mov lda labstr,x + sta errlable,x + inx + cpx #16 + blt ]mov + rep $30 + lda labtype + bit #linkentrybit + bne :dup + lda #duplable + plp + sec + rts +:dup lda #dupentry + plp + sec + rts +:ora ora #linkequvalid.$8000 + sta [lableptr],y + iny + iny + lda labval ;replace equate + sta [lableptr],y + iny + iny + lda labval+$2 + sta [lableptr],y + ldy #$00 +]test lda [lableptr],y + tyx + sta foundlable,x + iny + iny + cpy #32 + blt ]test + jmp :nosave +:goleft rep $30 + ldy #18 ;leftptr + lda [lableptr],y + bpl :p1 + lda lablect + sta [lableptr],y + jmp :save +:p1 sta ]pos + jmp ]lup +:goright rep $30 + ldy #20 ;leftptr + lda [lableptr],y + bpl :p2 + lda lablect + sta [lableptr],y + jmp :save +:p2 sta ]pos + jmp ]lup +:error plp + sec + rts +:saveit sta labnum + pha + lda ]pos + sta labprev + lda labtype + ora #$8000 + sta labtype +:si1 lda #$FFFF + sta lableft + sta labright + sta lablocal + pla + sta ]pos ;for movefound + asl + asl + tay + lda nextlableptr + sta [lableptr1],y + sta lableptr + iny + iny + lda nextlableptr+2 + sta [lableptr1],y + sta lableptr+2 + ldx #$00 +]test lda labstr,x + txy + sta [lableptr],y + sta foundlable,x + inx + inx + cpx #32 + blt ]test + jsr inclablect + rts + +drawlabstr php + rep $30 + lda labstr + and #$0f + beq :cr + tay + ldx #$01 +]l lda labstr,x + phx + phy + jsr drawchar + ply + plx + inx + dey + bne ]l +:cr lda #$0d + jsr drawchar + plp + rts + + + +insertlableasm +]ct equ workspace +]offset equ ]ct+$2 +]pos equ ]offset+$2 +]pos1 equ ]pos+$2 +]len1 equ ]pos1+$2 +]len2 equ ]len1+$2 + +:entry php + rep $30 + sta labtype + + jsr caselable ;*** check case sensitivity flag + + lda asmlablect + cmp #maxsymbols ;max number of lables + blt :ne1 + lda #symfull ;symtable full + jmp :error +:ne1 lda labstr + and #$FF + bne :ne2 + lda #badlable + jmp :error +:ne2 +:ne22 sta ]len1 + lda labstr+$1 ;first byte of string + and #$7F +:global cmp #']' + bne :asl01 + pha + lda labtype + ora #$02 + sta labtype + pla +:asl01 asl + tax + lda symtable,x + bpl :start + lda #$FFFF + sta ]pos ;no previous + lda asmlablect + sta symtable,x +:save rep $30 + jsr :saveit + bcc :nosave + plp + sec + rts +:nosave lda #$00 + plp + clc + rts +:start sta ]pos +]lup lda ]pos + asl + asl + tay + lda [lasmptr1],y + sta lasmptr + iny + iny + lda [lasmptr1],y + sta lasmptr+2 + stz ]offset + ldy #$00 + sep $20 + lda [lasmptr],y + sta ]len2 + iny + iny + ldx #$02 ;start at byte 2 +]lup1 cpx #$10 + jeq :error + cpx ]len1 + blt :1 + beq :1 + jmp :goleft1 +:1 cpx ]len2 + blt :2 + beq :2 + jmp :goright +:2 lda [lasmptr],y + cmp labstr,x + bne :next + iny + inx + jmp ]lup1 +:next rep $30 + blt :goright + jmp :goleft +:goleft1 rep $30 + lda ]len1 + cmp ]len2 + bne :goleft +:replace ldy #26 ;offset to equ type + lda labtype + ora #$8008 + sta [lasmptr],y + iny + iny + lda labval ;replace equate + sta [lasmptr],y + iny + iny + lda labval+$2 + sta [lasmptr],y + ldx #$00 + ldy #$00 +]test lda [lasmptr],y + sta foundlable,x + inx + inx + iny + iny + cpx #32 + blt ]test + jmp :nosave +:goleft rep $30 + ldy #18 ;leftptr + lda [lasmptr],y + bpl :p1 + lda asmlablect + sta [lasmptr],y + jmp :save +:p1 sta ]pos + jmp ]lup +:goright rep $30 + ldy #20 ;leftptr + lda [lasmptr],y + bpl :p2 + lda asmlablect + sta [lasmptr],y + jmp :save +:p2 sta ]pos + jmp ]lup +:error plp + sec + rts +:saveit sta labnum + pha + lda ]pos + sta labprev + lda labtype + ora #$8008 ;absolute/equated lable + sta labtype +:si1 lda #$FFFF + sta lableft + sta labright + sta lablocal + pla + sta ]pos ;for movefound + asl + asl + tay + lda asmnextlable + sta [lasmptr1],y + sta lasmptr + iny + iny + lda asmnextlable+2 + sta [lasmptr1],y + sta lasmptr+2 + ldy #$00 + ldx #$00 +]test lda labstr,x + sta [lasmptr],y + sta foundlable,x + inx + inx + iny + iny + cpx #32 + blt ]test + jsr incasmlablect + rts + +traverse php + rep $30 + sta twhich + asl + tax + lda :tbl,x + sta :jsr+1 + stz tct + + lda #$00 + sta :main + sta :recurslev +:loop lda :main + asl + tax + lda globaltbl,x + jmi :next + pha + jsr :showtree +:next inc :main + lda :main + cmp #128 + blt :loop + lda twhich + cmp #$02 + blt :p + cmp #$04 + bge :p + lda tct + beq :p1 + lda #$0d + jsr drawchar +:p1 lda #$0d + jsr drawchar +:p plp + rts +:main ds 2 +:recurslev ds 2 +:treechar ds 2 +:which ds 2 + +:showtree inc :recurslev + lda lableptr+2 + pha + lda lableptr + pha + lda 7,s + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #18 + lda #'R' + sta :char + lda [lableptr],y + bmi :next2 + pha + jsr :showtree + lda #'L' + sta :char +:next2 jsr :print + lda #'R' + sta :char + ldy #20 + lda [lableptr],y + bmi :done + pha + jsr :showtree +:done pla + sta lableptr + pla + sta lableptr+2 + pla + plx + pha + dec :recurslev + rts + +:print ldx #$00 +]lup txy + lda [lableptr],y + sta labstr,x + inx + inx + cpx #32 + blt ]lup +:jsr jsr $ffff + sep $20 +:but ldal $e0c061 + bmi :but + rep $20 + rts + +:char ds 2 +:len ds 2 +:offset ds 2 +:bytes ds 2 + +:tbl dw clrlocals + dw move2asm + dw showsyms + dw showents + dw rts + dw rts + +rts clc + rts + +showents lda labtype + bit #linkentrybit + bne showsyms + rts + +showsyms ldx tct + beq :lab + lda :tbl,x + and #$ff + pha + _QATabToCol +:lab lda twhich + cmp #$03 + bne :lab1 + lda labtype + bit #linkentused + bne :lab1 + lda #'?' + jsr drawchar +:lab1 lda labstr + and #$ff + tay + ldx #$01 +]lup cpy #$00 + beq :done + lda labstr,x + and #$7f + phy + phx + jsr drawchar + plx + ply + inx + dey + jmp ]lup +:done lda #' ' + jsr drawchar + lda #'=' + jsr drawchar + lda #'$' + jsr drawchar + + lda labval+2 + xba + and #$ff + beq :d1 + jsr prbyte +:d1 lda labval+2 + and #$ff + beq :d2 + jsr prbyte +:d2 lda labval + jsr prbytel + inc tct + lda tct + cmp #$03 + blt :r + lda #$0d + jsr drawchar + stz tct +:r rts + +:tbl dfb 0,25,50 + +tct ds 2 +twhich ds 2 + +move2asm lda linksymhdl + sta lasmptr1 + lda linksymhdl+2 + sta lasmptr1+2 + ldy #$02 + lda [lasmptr1] + tax + lda [lasmptr1],y + sta lasmptr1+2 + stx lasmptr1 + lda labtype + bit #linkgeqbit + bne :insert + and #linkequbit.linkequvalid + cmp #linkequbit.linkequvalid + beq :insert + rts +:insert lda #absolutebit.linkerbit + sta labtype + jsr insertlableasm +clrlocals + ldy #26 + lda [lableptr],y + and #linkequvalid!$FFFF + sta [lableptr],y + rts + + +newsegment php + rep $30 + lda segnum + cmp #maxsegs + blt :ok + lda #maxsegments +:sec plp + sec + rts +:ok inc segnum + inc maxsegnum + lda segmenthdl + ora segmenthdl+2 + bne :resize + psl #$00 + pea $0000 + lda segnum + inc + asl + asl + asl + asl + asl + asl + pha + ldal userid + ora #linkmemid+$200 + pha + pea $00 + psl #$00 + tll $0902 + plx + ply + jcs :sec1 + stx segmenthdl + sty segmenthdl+2 +:resize psl segmenthdl + _HUnlock + pea $00 + lda segnum + inc + asl + asl + asl + asl + asl + asl + pha + psl segmenthdl + tll $1902 ;set handle size + jcs :sec1 + psl segmenthdl + _Hlock + lda segmenthdl + sta segmentptr + lda segmenthdl+2 + sta segmentptr+2 + ldy #$02 + lda [segmentptr] + tax + lda [segmentptr],y + sta segmentptr+2 + stx segmentptr + lda segnum + asl + asl + asl + asl + asl + asl + tay + sty :offset + ldx #$00 + lda #$00 +]lup sta [segmentptr],y + inx + inx + iny + iny + cpx #64 + blt ]lup + + lda :offset + clc + adc #kindfield + tay + lda #$1000 ;init kind to $1000 + sta [segmentptr],y + + plp + clc + rts +:sec1 rep $30 + psl segmenthdl + _HLock + lda #outofmem + plp + sec + rts +:offset ds 2 + +inclablect php + rep $30 + inc lablect + lda lablect + and #%11111111 + bne :normal + psl #$00 + psl #$2000 + ldal userid + ora #linkmemid + pha + pea $8004 ;page aligned/locked + psl #$00 + tll $0902 + plx + ply + jcs :sec + sei + pei 0 + pei 2 + stx 0 + sty 2 + ldy #$02 + lda [0] + sta nextlableptr + lda [0],y + sta nextlableptr+2 + pla + sta 2 + pla + sta 0 + plp + clc + rts +:normal lda nextlableptr + clc + adc #32 + sta nextlableptr + bcc :rts + inc nextlableptr+2 +:rts plp + clc + rts +:sec lda #symfull + plp + sec + rts + +incasmlablect php + rep $30 + inc asmlablect + lda asmlablect + and #%11111111 + bne :normal + psl #$00 + psl #$2000 + lda userid + ora #linkmemid+$100 + pha + pea $8004 ;page aligned/locked + psl #$00 + tll $0902 + plx + ply + jcs :sec + sei + pei 0 + pei 2 + stx 0 + sty 2 + ldy #$02 + lda [0] + sta asmnextlable + lda [0],y + sta asmnextlable+2 + pla + sta 2 + pla + sta 0 + plp + clc + rts +:normal lda asmnextlable + clc + adc #32 + sta asmnextlable + bcc :rts + inc asmnextlable+2 +:rts plp + clc + rts +:sec lda #symfull + plp + sec + rts + +getpath php + rep $30 + and #$FF + sta :sflag + stz asmpath + stz asmpath+2 + sep $30 + ldy #$00 +]flush lda (lineptr),y + and #$7f + cmp #' ' + blt :bad + bne :first + iny + jmp ]flush +:first cmp #'.' + jeq :backup + jmp :ok +:bad pea #badoperand + jmp :error +:ok ldx #$00 +:return sep $30 +:save lda (lineptr),y + and #$7f + cmp #' '+1 + blt :done + cmp #'/' + bne :cmp + lda #':' +:cmp cmp #'a' + blt :store + cmp #'z'+1 + bge :store + and #$5f +:store cpx #128 + bge :inx + + cmp #'A' + blt :sta1 + cmp #'Z'+1 + bge :sta1 + ora #$20 +:sta1 + sta asmpath+1,x +:inx inx + iny + jmp :save +:done cpx #64 + blt :len + ldx #64 +:len stx asmpath + lda :sflag + beq :plp + lda asmpath + cmp #63 + bge :plp + tax + lda asmpath,x + and #$7f + cmp #'/' + beq :plp + lda asmpath + inc + inc + sta asmpath + lda #'.' + sta asmpath+1,x + inx + lda #'S' + sta asmpath+1,x +:plp sep $30 + lda asmpath + beq :syn + plp + clc + rts +:syn rep $30 + lda #syntax + plp + sec + rts + mx %11 + +:backup stz :level +:loop sty :y + iny + lda (lineptr),y + and #$7f + cmp #' '+1 + blt :pfx + cmp #'.' + bne :pfx + iny + lda (lineptr),y + and #$7f + cmp #' '+1 + blt :pfx + cmp #'/' + bne :pfx + inc :level + iny + sty :y + lda (lineptr),y + and #$7f + cmp #'.' + beq :loop +:pfx ldx #$00 + lda :level + beq :noexp + rep $30 + stz asmpath + _getprefix :pfxparm + sep $30 + ldx asmpath + beq :noexp +]lup lda asmpath,x + and #$7f + cmp #'/' + bne :store1 + lda #':' +:store1 sta asmpath,x + dex + bne ]lup + ldx asmpath + lda asmpath,x + cmp #':' + bne :exp + dex +:exp cpx #$00 + beq :noexp + lda asmpath,x + cmp #':' + bne :dex + dec :level + beq :noexp +:dex dex + jmp :exp +:noexp stx asmpath + ldy :y + jmp :return +:xit pea $00 +:error rep $30 + pla + plp + cmp :one + rtl +:one ds 2 +:temp ds 2 +:level ds 2 +:y ds 2 +:sflag ds 2,0 +:pfxparm dw $00 + adrl asmpath + + + + +converttable + hex 0D0D0D0D0D0D0D0D0D200D0D0D0D0D0D + hex 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D + asc ' !"#$%&' + hex 27 ;the ' character + asc '()*+,-./' + asc '0123456789' + asc ':;<=>?@' + asc 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '[\]^_`' + asc 'abcdefghijklmnopqrstuvwxyz' + asc '{|}~ ' ;DEL is last character + hex 0D0D0D0D0D0D0D0D0D200D0D0D0D0D0D + hex 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D + asc ' !"#$%&' + hex 27 ;the ' character + asc '()*+,-./' + asc '0123456789' + asc ':;<=>?@' + asc 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '[\]^_`' + asc 'abcdefghijklmnopqrstuvwxyz' + asc '{|}~ ' ;DEL is last character +converttable1 + hex 20202020202020202020202020202020 + hex 20202020202020202020202020202020 + asc ' !"#$%&' + hex 27 ;the ' character + asc '()*+,-./' + asc '0123456789' + asc ':;<=>?@' + asc 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '[\]^_`' + asc 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '{|}~ ' ;DEL is last character + hex 20202020202020202020202020202020 + hex 20202020202020202020202020202020 + asc ' !"#$%&' + hex 27 ;the ' character + asc '()*+,-./' + asc '0123456789' + asc ':;<=>?@' + asc 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '[\]^_`' + asc 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + asc '{|}~ ' ;DEL is last character + + +numfiles ds 2 +files ds maxfiles*32 + +symtable ds 256,0 +globaltbl ds 256,0 + diff --git a/src/macs/intcmd.macs.s b/src/macs/intcmd.macs.s new file mode 100644 index 0000000..71defc9 --- /dev/null +++ b/src/macs/intcmd.macs.s @@ -0,0 +1,163 @@ +_GSOS MAC + do inline + jsl prodos + dw ]1 + adrl ]2 + else + psl #]2 + pea ]1 + jsl prodosIL + fin + <<< +_DISPOSEHANDLE MAC + Tool $1002 + <<< +^PURGEALL MAC + PHW ]1 + Tool $1302 + <<< +_COMPACTMEM MAC + Tool $1F02 + <<< +_HLOCK MAC + Tool $2002 + <<< +~QAGetWord MAC + pha + pha + psl ]1 + phw ]2 + phw ]3 +_QAGetWord mac ;_QAGetWord(@Text,Offset,MaxLen):BegOffset,EndOffset + utool $61 + <<< +PSL mac + if #,]1 + pea ^]1 + pea ]1 + else + if :,]1 + lda ]1+2 + pha + lda ]1 + pha + else + lda ]1+2 + pha + lda ]1 + pha + fin + fin + eom +PLL mac + if :,]1 + pla + sta ]1 + pla + sta ]1+2 + else + pla + sta ]1 + pla + sta ]1+2 + fin + eom +TOOL mac + ldx #]1 + jsl $E10000 + eom +TLL mac + ldx #]1 + jsl $E10000 + eom +JEQ mac + bne *+5 + jmp ]1 + eom +JGE mac + blt *+5 + jmp ]1 + eom +JLT mac + bge *+5 + jmp ]1 + eom +JCS mac + bcc *+5 + jmp ]1 + eom +_QADRAWCHAR mac + utool $09 + eom +_QADRAWSTRING mac + utool $0A + eom +_QADRAWSTR mac + utool $0A + eom +_QAGETPARMHDL mac + utool $12 + eom +_QAGETCMDHDL mac + utool $14 + eom +_QALOADFILE mac + utool $18 + eom +_QAGETCMDLINE mac + utool $1B + eom +_QASETQUITFLAG mac + utool $1E + eom +_QACOMPILE mac + utool $26 + eom +_QALINK mac + utool $27 + eom +_QAGETVECTOR mac + utool $2E + eom +_QASETVECTOR mac + utool $2F + eom +_QATABTOCOL mac + utool $33 + eom +_QASETCANCELFLAG mac + utool $40 + eom +_QAGETSHELLID mac + utool $55 + eom +_QASETLAUNCH mac + utool $60 + eom +_QADRAWCR mac + utool $63 + <<< +_QADRAWSPACE mac + utool $64 + <<< +UTOOL mac + ldx #]1*256+toolnum + do userorsys + jsl $E10008 + else + jsl $E10000 + fin + eom +PHW MAC + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< + diff --git a/src/macs/qatools.macs.s b/src/macs/qatools.macs.s new file mode 100644 index 0000000..3ae6905 --- /dev/null +++ b/src/macs/qatools.macs.s @@ -0,0 +1,599 @@ +_QABootInit mac ;_QABootInit() + utool $01 + <<< +~QAStartup MAC + psw ]1 + psl ]2 +_QAStartup mac ;_QAStartup(userid,modeflags/4) + utool $02 + <<< +_QAShutdown mac ;_QAShutdown() + utool $03 + <<< +~QAVersion MAC + pha +_QAVersion mac ;_QAVersion():versionnum + utool $04 + <<< +_QAReset mac ;_QAReset() + utool $05 + <<< +~QAStatus MAC + pha +_QAStatus mac ;_QAStatus():statflag + utool $06 + <<< +~QADrawChar MAC + phw ]1 +_QADrawChar mac ;_QADrawChar(char) + utool $09 + <<< +~QADrawString MAC +~QADrawStr MAC + psl ]1 +_QADrawString mac ;_QADrawString(@strptr) +_QADrawStr mac + utool $0A + <<< +~QAPrByte MAC + psw ]1 +_QAPrByte mac ;_QAPrByte(byteval) + utool $0B + <<< +~QAPrByteL MAC + psw ]1 +_QAPrByteL mac ;_QAPrByteL(hexval) + utool $0C + <<< +~QADrawDec MAC + psl ]1 + psw ]2 + ps2 ]3 +_QADrawDec mac ;_QADrawDec(longint/4,flags,fieldsize) + utool $0D + <<< +~QAKeyAvail MAC + pha +_QAKeyAvail mac ;_QAKeyAvail():availflag + utool $0E + <<< +~QAGetChar MAC + pha +_QAGetChar mac ;_QAGetChar():char (char in low/modifiers in high) + utool $0F + <<< +_QAGetLine mac ;_QAGetLine(@linestr) + utool $10 + <<< +~QASetParmHdl MAC + psl ]1 +_QASetParmHdl mac ;_QASetParmHdl(parmhandle) + utool $11 + <<< +~QAGetParmHdl MAC + pha + pha +_QAGetParmHdl mac ;_QAGetParmHdl():parmhandle + utool $12 + <<< +~QASetCmdHdl MAC + psl ]1 + psw ]2 +_QASetCmdHdl mac ;_QASetCmdHdl(commandhandle,numcmds) + utool $13 + <<< +~QAGetCmdHdl MAC + pha + pha + pha +_QAGetCmdHdl mac ;_QAGetCmdHdl():commandhandle,numcmds + utool $14 + <<< +~QAReadTotalErrs MAC + pha +_QAReadTotalErrs mac ;_QAReadTotalErrs():totalerrs + utool $15 + <<< +~QAGetModeFlags MAC + pha + pha +_QAGetModeFlags mac ;_QAGetModeFlags():modeflags/4 + utool $16 + <<< +~QASetModeFlags MAC + psl ]1 +_QASetModeFlags mac ;_QASetModeFlags(modeflags/4) + utool $17 + <<< +_QALoadFile mac ;_QALoadfile(@filename,filepos/4,length/4,@typelist,userid,address/4,memattrib):filehandle/4 + utool $18 + <<< +_QASaveFile mac ;_QASavefile(filehandle/4,@filename,filetype,auxtype/4) + utool $19 + <<< +~QASetCmdLine MAC + psl ]1 +_QASetCmdLine mac ;_QASetCmdLine(@strptr) + utool $1A + <<< +~QAGetCmdLine MAC + psl ]1 + psw ]2 +_QAGetCmdLine mac ;_QAGetCmdLine(@strptr,maxlen) + utool $1B + <<< +~QAParseCmdLine MAC + pha + pha + psl ]1 +_QAParseCmdLine mac ;_QAParseCmdLine(@strptr):cmdid,cmdtype + utool $1C + <<< +~QAGetQuitFlag MAC + pha +_QAGetQuitFlag mac ;_QAGetQuitFlag():quitflag + utool $1D + <<< +~QASetQuitFlag MAC + psw ]1 +_QASetQuitFlag mac ;_QASetQuitFlag(quitflag) + utool $1E + <<< +~QASetCmdTbl MAC + psl ]1 +_QASetCmdTbl mac ;_QASetCmdTbl(@cmdtbl) + utool $1F + <<< +~QAGetCmdTbl MAC + pha + pha +_QAGetCmdTbl mac ;_QAGetCmdTbl():@cmdtbl + utool $20 + <<< +~QAExecCommand MAC + psw ]1 + psw ]2 +_QAExecCommand mac ;_QAExecCommand(cmdtype,cmdid) + utool $21 + <<< +~QAGetMessagebyID MAC + pha + pha + pha + psw ]1 +_QAGetMessagebyID mac ;_QAGetMessagebyID(userid):message,subtype/4 + utool $22 + <<< +_QARun mac ;_QARun() + utool $23 + <<< +_QADispose mac ;_QADispose() + utool $24 + <<< +~QAShutdownID MAC + psw ]1 +_QAShutdownID mac ;_QAShutDownID(userid) + utool $25 + <<< +~QACompile MAC + psw ]1 + psl ]2 +_QACompile mac ;_QACompile(message,subtype/4) + utool $26 + <<< +~QALink MAC + psw ]1 + psl ]2 +_QALink mac ;_QALink(message,subtype/4) + utool $27 + <<< +~QACompilerActive MAC + pha +_QACompilerActive mac ;_QAComplierActive():activeflag + utool $28 + <<< +~QALinkerActive MAC + pha +_QALinkerActive mac ;_QALinkerActvie():activeflag + utool $29 + <<< +~QAGetCompileID MAC + pha +_QAGetCompileID mac ;_QAGetCompileID():compileID + utool $2A + <<< +~QASetCompileID MAC + psw ]1 +_QASetCompileID mac ;_QASetCompileID(compileID) + utool $2B + <<< +~QAGetLinkID MAC + pha +_QAGetLinkID mac ;_QAGetLinkID():linkID + utool $2C + <<< +~QASetLinkID MAC + psw ]1 +_QASetLinkID mac ;_QASetLinkID(linkID) + utool $2D + <<< +~QAGetVector MAC + pha + pha + psw ]1 +_QAGetVector mac ;_QAGetVector(vect#):@address + utool $2E + <<< +~QASetVector MAC + psw ]1 + psl ]2 +_QASetVector mac ;_QASetVector(vect#,@address) + utool $2F + <<< +_QAResetVectors mac ;_QAResetVectors() + utool $30 + <<< +~QAEvent MAC + psl ]1 + psw ]2 +_QAEvent mac ;_QAEvent(@eventptr,taskflag) + utool $31 + <<< +~QAGetCmdRecSize MAC + pha +_QAGetCmdRecSize mac ;_QAGetCmdRecSize():recordsize + utool $32 + <<< +~QATabtoCol MAC + psw ]1 +_QATabtoCol mac ;_QATabtoCol(columnnum) + utool $33 + <<< +~QAErrorMsg MAC + psw ]1 +_QAErrorMsg mac ;_QAErrorMsg(ErrorCode) + utool $34 + <<< +~QABarGraph MAC + psw ]1 + psl ]2 +_QABarGraph mac ;_QABarGraph(percent,@Message) + utool $35 + <<< +~QAConvertPath MAC + psl ]1 + psl ]2 +_QAConvertPath mac ;_QAConvertPath(@oldpath,@newpath) + utool $36 + <<< +~QATyp2Txt MAC + psw ]1 + psl ]2 +_QATyp2Txt mac +_QAConvertTyp2Txt mac ;_QAConvertTyp2Txt(filetype,@typestr) + utool $37 + <<< +~QATxt2Typ MAC + pha + psl ]1 +_QATxt2Typ mac +_QAConvertTxt2Typ mac ;_QAConvertTxt2Typ(@typestr):type + utool $38 + <<< +~QAReadDir MAC + psl ]1 + psl ]2 + psw ]3 +_QAReadDir mac ;_QAReadDir(@pathname,@doroutine,flags) + utool $39 + <<< +~QAInitWildcard MAC + psl ]1 + psw ]2 + psl ]3 + psw ]4 + psl ]5 +_QAInitWildcard mac ;_QAInitWildcard(@wcstr,ft,aux/4,ftmask,auxmask/4) + utool $3A + <<< +_QAUndefined mac ;_QAUndefined() + utool $3B + <<< +_QAInitTotalErrs mac ;_QAInitTotalErrs() + utool $3C + <<< +_QAIncTotalErrs mac ;_QAIncTotalErrs() + utool $3D + <<< +~QAGetTotalErrs MAC + pha +_QAGetTotalErrs mac ;_QAGetTotalErrs():totalerrs + utool $3E + <<< +~QAGetCancelFlag MAC + pha +_QAGetCancelFlag mac ;_QAGetCancelFlag():cancelflag + utool $3F + <<< +~QASetCancelFlag MAC + psw ]1 +_QASetCancelFlag mac ;_QASetCancelFlag(cancelflag) + utool $40 + <<< +_QAStartTiming mac ;_QAStartTiming() + utool $41 + <<< +~QAEndTiming MAC + pha + pha + pha +_QAEndTiming mac ;_QAEndTiming():hours,minutes,seconds + utool $42 + <<< +~QAGetSymTable MAC + pha + pha + pha + pha + pha +_QAGetSymTable mac ;_QAGetSymTable():@table,symhandle/4,numlabels + utool $43 + <<< +~QASetSymTable MAC + psl ]1 + psl ]2 + psw ]3 +_QASetSymTable mac ;_QASetSymTable(@table,symhandle/4,numlabels) + utool $44 + <<< +~QASetPath MAC + psl ]1 +_QASetPath mac ;_QASetPath(@pathname) + utool $45 + <<< +~QAGetPath MAC + psl ]1 +_QAGetPath mac ;_QAGetPath(@pathname) + utool $46 + <<< +~QAGetObjType MAC + pha +_QAGetObjType mac ;_QAGetObjType():type + utool $47 + <<< +~QASetObjType MAC + psw ]1 +_QASetObjType mac ;_QASetObjType(type) + utool $48 + <<< +~QAGetObjPath MAC + psl ]1 +_QAGetObjPath mac ;_QAGetObjPath(@pathname) + utool $49 + <<< +~QASetObjPath MAC + psl ]1 +_QASetObjPath mac ;_QASetObjPath(@pathname) + utool $4A + <<< +~QACallUSR MAC + pha + psw ]1 + psl ]2 +_QACallUSR mac ;_QACallUSR(opcode,@operand):handled + utool $4B + <<< +~QACallUser MAC + psw ]1 + psw ]2 + psl ]3 + psl ]4 +_QACallUser mac ;_QACallUser(rngstart,rngend,texthandle/4,textlen/4) + utool $4C + <<< +~QAGoEval MAC + pha + pha + psl ]1 + psw ]2 +_QAGoEVAL mac ;_QAGoEVAL(@operand,offset):value/4 + utool $4D + <<< +~QAGoPutByte MAC + psw ]1 +_QAGoPutByte mac ;_QAGoPutByte(byte) + utool $4E + <<< +~QAGoPutOpcode MAC + psw ]1 +_QAGoPutOpcode mac ;_QAGoPutOpcode(opcodebyte) + utool $4F + <<< +_QAGoRelcorrect mac ;_QAGoRelcorrect() + utool $50 + <<< +~QADrawErrChar MAC + psw ]1 +_QADrawErrChar mac ;_QADrawErrChar(char) + utool $51 + <<< +~QADrawErrStr MAC + psl ]1 +_QADrawErrStr mac +_QADrawErrString mac ;_QADrawErrString(@strptr) + utool $52 + <<< +~QAGetWindow MAC + pha + pha +_QAGetWindow mac ;_QAGetWindow():windowtype + utool $53 + <<< +~QASetWindow MAC + psl ]1 +_QASetWindow mac ;_QASetWindow(windowtype) + utool $54 + <<< +~QAGetShellID MAC + pha +_QAGetShellID mac ;_QAGetShellID():userid + utool $55 + <<< +~QASetShellID MAC + psw ]1 +_QASetShellID mac ;_QASetShellID(userid) + utool $56 + <<< +~QAGotoXY MAC + psw ]1 + psw ]2 +_QAGotoXY mac ;_QAGotoXY(X,Y) + utool $57 + <<< +~QAGetXY MAC + pha + pha +_QAGetXY mac ;_QAGetXY():X,Y + utool $58 + <<< +~QAPrNibble MAC + psw ]1 +_QAPrNibble mac ;_QAPrNibble(nibval) + utool $59 + <<< +~QADrawHex MAC + psl ]1 + psw ]2 + psw ]3 +_QADrawHex mac ;_QADrawHex(hexval/4,flags,fieldsize) + utool $5A + <<< +~QADrawCStr mac +~QADrawCString mac + psl ]1 +_QADrawCStr mac +_QADrawCString mac +_QADrawBlock mac ;_QADrawBlock(@CBlock) + utool $5B + <<< +~QADrawErrCStr MAC + psl ]1 +_QADrawErrCStr mac +_QADrawErrBlock mac ;_QADrawErrBlock(@CBlock) + utool $5C + <<< +~QADrawCharX MAC + psw ]1 + psw ]2 +_QADrawCharX mac ;_QADrawCharX(char,count) + utool $5D + <<< +~QADrawECharX MAC + psw ]1 + psw ]2 +_QADrawECharX mac ;_QADrawECharX(char,count) + utool $5E + <<< +~QAGetLaunch MAC + pha + pha + pha +_QAGetLaunch mac ;_QAGetLaunch():@path,flags + utool $5F + <<< +~QASetLaunch MAC + psl ]1 + psw ]2 +_QASetLaunch mac ;_QASetLaunch(@path,flags) + utool $60 + <<< +~QAGetWord MAC + pha + pha + psl ]1 + psw ]2 + psw ]3 +_QAGetWord mac ;_QAGetWord(@Text,Offset,MaxLen):BegOffset,EndOffset + utool $61 + <<< +~QADateTime mac + psl ]1 + psw ]2 +_QADateTime mac ;_QADateTime(@Date,flags) + utool $62 + <<< +_QADrawCR mac ;_QADrawCR() + utool $63 + <<< +_QADrawSpace mac ;_QADrawSpace() + utool $64 + <<< +~QADrawVersion mac + psl ]1 +_QADrawVersion mac ;_QADrawVersion(Version/4) + utool $65 + <<< +~QADrawBox MAC + pha + pha + psw ]1 + psw ]2 + psw ]3 + psw ]4 +_QADrawBox MAC ;_QADrawBox(x,y,width,height):buffhdl + utool $66 + <<< +~QAEraseBox MAC + psl ]1 +_QAEraseBox MAC ;_QAEraseBox(buffhdl) + utool $67 + <<< +~QAConvertStr MAC + pha + psl ]1 + psl ]2 + psw ]3 +_QAConvertStr MAC ;_QAConvertStr(@string/class.1,@buffer/class.1,cmdcode):rtncode + utool $68 + <<< +~QADrawStrL MAC + psl ]1 +_QADrawStrL MAC ;_QADrawStrL(@string/class.1) + utool $69 + <<< +~QADrawErrStrL MAC + psl ]1 +_QADrawErrStrL MAC ;_QADrawErrStrL(@strptr/class.1) + utool $6A + <<< +~QAGetKeyAdrs MAC + pha + pha +_QAGetKeyAdrs MAC ;_QAGetKeyAdrs():keyaddress/4 + utool $6B + <<< +~QANextLine MAC + pha + pha + psl ]1 + psw ]2 + psw ]3 +_QANextLine mac ;_QANextLine(@Text,Offset,MaxLen):NewLineOffset + utool $6C + <<< +_QAClearKey MAC ;_QAClearKey() + utool $6D + <<< +_QAParseWord MAC ;_QAParseWord(???):??? + utool $6E + <<< +utool mac + ldx #]1*256+ToolNum + do userorsys + jsl $E10008 + else + jsl $E10000 + fin + <<< + + diff --git a/src/macs/tool.macs.s b/src/macs/tool.macs.s new file mode 100644 index 0000000..a61e9f1 --- /dev/null +++ b/src/macs/tool.macs.s @@ -0,0 +1,243 @@ +_NEWHANDLE MAC + Tool $902 + <<< +_DISPOSEHANDLE MAC + Tool $1002 + <<< +_GETHANDLESIZE MAC + Tool $1802 + <<< +_SETHANDLESIZE MAC + Tool $1902 + <<< +_HLOCK MAC + Tool $2002 + <<< +_HUNLOCK MAC + Tool $2202 + <<< +^READTIMEHEX MAC + PHS 4 + Tool $D03 + <<< +^READASCIITIME MAC + PHL ]1 + Tool $F03 + <<< +^GETNEXTEVENT MAC + PHA + PHWL ]1;]2 + Tool $A06 + <<< +^SETVECTOR MAC + PHWL ]1;]2 + Tool $1003 + <<< +^GETVECTOR MAC + P2SW ]1 + Tool $1103 + <<< +PHWL MAC + PHW ]1 + PHL ]2 + <<< +P2SW MAC + PHA + PHA + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +PSW MAC + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +PSL mac + if #,]1 + pea ^]1 + pea ]1 + else + if :,]1 + lda ]1+2 + pha + lda ]1 + pha + else + lda ]1+2 + pha + lda ]1 + pha + fin + fin + eom +PLL mac + if :,]1 + pla + sta ]1 + pla + sta ]1+2 + else + pla + sta ]1 + pla + sta ]1+2 + fin + eom +TOOL mac + ldx #]1 + jsl $E10000 + eom +TLL mac + ldx #]1 + jsl $E10000 + eom +JMI mac + bpl *+5 + jmp ]1 + eom +JPL mac + bmi *+5 + jmp ]1 + eom +JNE mac + beq *+5 + jmp ]1 + eom +JEQ mac + bne *+5 + jmp ]1 + eom +JGE mac + blt *+5 + jmp ]1 + eom +JLT mac + bge *+5 + jmp ]1 + eom +JCS mac + bcc *+5 + jmp ]1 + eom +JCC mac + bcs *+5 + jmp ]1 + eom +_QAGotoXY mac + utool $57 + eom +_QADRAWSTRING mac + utool $0A + <<< +_QADRAWSTR mac + utool $0A + <<< +_QAPRBYTE mac + utool $0B + <<< +_QAPRBYTEL mac + utool $0C + <<< +_QADRAWDEC mac + utool $0D + <<< +_QAKEYAVAIL mac + utool $0E + <<< +_QAGETCHAR mac + utool $0F + <<< +_QAGETCMDLINE mac + utool $1B + <<< +_QARUN mac + utool $23 + <<< +_QADRAWERRCHAR mac + utool $51 + <<< +_QADRAWERRSTRING mac + utool $52 + <<< +_QADRAWHEX mac + utool $5A + <<< +^QADRAWCSTRING mac + psl ]1 + utool $5B + <<< +_QADRAWCHARX mac + utool $5D + <<< +~QAGetWord MAC + pha + pha + psl ]1 + psw ]2 + utool $61 + <<< +_GSOS MAC + do inline + jsl prodos + dw ]1 + adrl ]2 + else + psl #]2 + pea ]1 + jsl prodosIL + fin + <<< +UTOOL mac + ldx #]1*256+toolnum + do userorsys + jsl $E10008 + else + jsl $E10000 + fin + <<< +PHL MAC + IF #=]1 + PEA ^]1 + ELSE + PHW ]1+2 + FIN + PHW ]1 + <<< +PHW MAC + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +PHS MAC + DO ]0 + LUP ]1 + PHA + --^ + ELSE + PHA + FIN + <<< + + diff --git a/src/macs/toolmacs.s b/src/macs/toolmacs.s new file mode 100644 index 0000000..b18fa03 --- /dev/null +++ b/src/macs/toolmacs.s @@ -0,0 +1,1382 @@ + lst off + xc + xc + exp only + org $0000 ;must org at $00 + +toolbox equ $0000 +prodos equ $FFFF + +tdf mac +len dfb strend-len + str ]1 + dw ]2 + dw toolbox ;used to calculate hash marks +]count = ]count+1 +strend eom + +pdf mac +len dfb strend-len + str ]2 + dw ]1 + dw prodos ;used to calculate hash marks +strend eom + + +opc mac + usr ]1 + adrl ]2 + dw ]3 + eom + +]count = 0 + +*** Address Table **** + + adrl a + adrl b + adrl c + adrl d + adrl e + adrl f + adrl g + adrl h + adrl i + adrl j + adrl k + adrl l + adrl m + adrl n + adrl o + adrl p + adrl q + adrl r + adrl s + adrl t + adrl u + adrl v + adrl w + adrl x + adrl y + adrl z + adrl p16 + adrl gsos + +****************************************** +* Insert tool numbers and names here * +****************************************** + +a tdf '_AbsOff';$1009 + tdf '_AbsOn';$0F09 + tdf '_ACEBootInit';$011D + tdf '_ACECompBegin';$0B1D + tdf '_ACECompress';$091D + tdf '_ACEExpand';$0A1D + tdf '_ACEExpBegin';$0C1D + tdf '_ACEInfo';$071D + tdf '_ACEReset';$051D + tdf '_ACEShutDown';$031D + tdf '_ACEStartUp';$021D + tdf '_ACEStatus';$061D + tdf '_ACEVersion';$041D + tdf '_Activate';$1034 + tdf '_ADBBootInit';$0109 + tdf '_ADBReset';$0509 + tdf '_ADBShutDown';$0309 + tdf '_ADBStartUp';$0209 + tdf '_ADBStatus';$0609 + tdf '_ADBVersion';$0409 + tdf '_AddFamily';$0D1B + tdf '_AddFontVar';$141B + tdf '_AddPt';$8004 + tdf '_AddResource';$0C1E + tdf '_AddToOOMQueue';$0C02 + tdf '_AddToQueue';$2E03 + tdf '_AddToRunQ';$1F05 + tdf '_Alert';$1715 + tdf '_AlertWindow';$590E + tdf '_AllNotesOff';$0D19 + tdf '_AllocGen';$0919 + tdf '_AsyncADBReceive';$0D09 + dw $00,$00 + +b tdf '_BeginUpdate';$1E0E + tdf '_BlockMove';$2B02 + tdf '_BringToFront';$240E + tdf '_Button';$0D06 + dw $00,$00 + +c tdf '_CalcMask';$0E12 + tdf '_CalcMenuSize';$1C0F + tdf '_CallCtlDefProc';$2C10 + tdf '_CautionAlert';$1A15 + tdf '_CharBounds';$AC04 + tdf '_CharWidth';$A804 + tdf '_CheckHandle';$1E02 + tdf '_CheckMItem';$320F + tdf '_CheckUpdate';$0A0E + tdf '_ChooseCDA';$1105 + tdf '_ChooseFont';$161B + tdf '_ClampMouse';$1C03 + tdf '_ClearMouse';$1B03 + tdf '_ClearScreen';$1504 + tdf '_ClearSRQTable';$1609 + tdf '_ClipRect';$2604 + tdf '_CloseAllNDAs';$1D05 + tdf '_CloseDialog';$0C15 + tdf '_CloseNDA';$1605 + tdf '_CloseNDAByWinPtr';$1C05 + tdf '_ClosePicture';$B904 + tdf '_ClosePoly';$C204 + tdf '_ClosePort';$1A04 + tdf '_CloseResourceFile';$0B1E + tdf '_CloseRgn';$6E04 + tdf '_CloseWindow';$0B0E + tdf '_ClrHeartBeat';$1403 + tdf '_CMLoadResource';$3210 + tdf '_CMReleaseResource';$3310 + tdf '_CompactMem';$1F02 + tdf '_CompileText';$600E + tdf '_CopyPixels';$0912 + tdf '_CopyRgn';$6904 + tdf '_CountFamilies';$091B + tdf '_CountFonts';$101B + tdf '_CountMItems';$140F + tdf '_CountResources';$221E + tdf '_CountTypes';$201E + tdf '_CreateList';$091C + tdf '_CreateResourceFile';$091E + tdf '_CStringBounds';$AE04 + tdf '_CStringWidth';$AA04 + tdf '_CtlBootInit';$0110 + tdf '_CtlNewRes';$1210 + tdf '_CtlReset';$0510 + tdf '_CtlShutDown';$0310 + tdf '_CtlStartUp';$0210 + tdf '_CtlStatus';$0610 + tdf '_CtlTextDev';$160C + tdf '_CtlVersion';$0410 + dw $00,$00 + +d tdf '_DeallocGen';$0A19 + tdf '_Dec2Int';$280B + tdf '_Dec2Long';$290B + tdf '_DecStrNum';$0A0A + tdf '_DefaultFilter';$3615 + tdf '_DeleteFromQueue';$2F03 + tdf '_DeleteID';$2103 + tdf '_DeleteMenu';$0E0F + tdf '_DeleteMItem';$100F + tdf '_DelHeartBeat';$1303 + tdf '_DeskBootInit';$0105 + tdf '_DeskReset';$0505 + tdf '_DeskShutDown';$0305 + tdf '_DeskStartUp';$0205 + tdf '_DeskStatus';$0605 + tdf '_Desktop';$0C0E + tdf '_DeskVersion';$0405 + tdf '_DetachResource';$181E + tdf '_DialogBootInit';$0115 + tdf '_DialogReset';$0515 + tdf '_DialogSelect';$1115 + tdf '_DialogShutDown';$0315 + tdf '_DialogStartUp';$0215 + tdf '_DialogStatus';$0615 + tdf '_DialogVersion';$0415 + tdf '_DictDelete';$0B34 + tdf '_DictDump';$0C34 + tdf '_DictInit';$0E34 + tdf '_DictInsert';$0A34 + tdf '_DiffRgn';$7304 + tdf '_DisableDItem';$3915 + tdf '_DisableMItem';$310F + tdf '_DisposeAll';$1102 + tdf '_DisposeControl';$0A10 + tdf '_DisposeHandle';$1002 + tdf '_DisposeMenu';$2E0F + tdf '_DisposeRgn';$6804 + tdf '_DlgCopy';$1315 + tdf '_DlgCut';$1215 + tdf '_DlgDelete';$1515 + tdf '_DlgPaste';$1415 + tdf '_DoWindows';$0906 + tdf '_DragControl';$1710 + tdf '_DragRect';$1D10 + tdf '_DragWindow';$1A0E + tdf '_DrawChar';$A404 + tdf '_DrawControls';$1010 + tdf '_DrawCString';$A604 + tdf '_DrawDialog';$1615 + tdf '_DrawIcon';$0B12 + tdf '_DrawInfoBar';$550E + tdf '_DrawMember';$0C1C + tdf '_DrawMember2';$111C + tdf '_DrawMenuBar';$2A0F + tdf '_DrawOneCtl';$2510 + tdf '_DrawPicture';$BA04 + tdf '_DrawPopUp';$3D0F + tdf '_DrawString';$A504 + tdf '_DrawText';$A704 + tdf '_DUBootInit';$0118 + tdf '_DUReset';$0518 + tdf '_DUShutDown';$0318 + tdf '_DUStartUp';$0218 + tdf '_DUStatus';$0618 + tdf '_DUVersion';$0418 + dw $00,$00 + +e tdf '_ElemNum';$0B0A + tdf '_EMBootInit';$0106 + tdf '_EmptyRgn';$7804 + tdf '_EMReset';$0506 + tdf '_EMShutDown';$0306 + tdf '_EMStartUp';$0206 + tdf '_EMStatus';$0606 + tdf '_EMVersion';$0406 + tdf '_EnableDItem';$3A15 + tdf '_EnableMItem';$300F + tdf '_EndFrameDrawing';$5B0E + tdf '_EndInfoDrawing';$510E + tdf '_EndUpdate';$1F0E + tdf '_EqualPt';$8304 + tdf '_EqualRect';$5104 + tdf '_EqualRgn';$7704 + tdf '_EraseArc';$6404 + tdf '_EraseControl';$2410 + tdf '_EraseOval';$5A04 + tdf '_ErasePoly';$BE04 + tdf '_EraseRect';$5504 + tdf '_EraseRgn';$7B04 + tdf '_EraseRRect';$5F04 + tdf '_ErrorSound';$0915 + tdf '_ErrorWindow';$620E + tdf '_ErrWriteBlock';$1F0C + tdf '_ErrWriteChar';$190C + tdf '_ErrWriteCString';$210C + tdf '_ErrWriteLine';$1B0C + tdf '_ErrWriteString';$1D0C + tdf '_EventAvail';$0B06 + dw $00,$00 + +f tdf '_FakeMouse';$1906 + tdf '_FamNum2ItemID';$1B1B + tdf '_FemaleBootInit';$0133 + tdf '_FemaleReset';$0533 + tdf '_FemaleShutDown';$0333 + tdf '_FemaleSpeak';$0933 + tdf '_FemaleStartUp';$0233 + tdf '_FemaleStatus';$0633 + tdf '_FemaleVersion';$0433 + tdf '_FFGeneratorStatus';$1108 + tdf '_FFSetUpSound';$1508 + tdf '_FFSoundDoneStatus';$1408 + tdf '_FFSoundStatus';$1008 + tdf '_FFStartPlaying';$1608 + tdf '_FFStartSound';$0E08 + tdf '_FFStopSound';$0F08 + tdf '_FillArc';$6604 + tdf '_FillOval';$5C04 + tdf '_FillPoly';$C004 + tdf '_FillRect';$5704 + tdf '_FillRgn';$7D04 + tdf '_FillRRect';$6104 + tdf '_FindControl';$1310 + tdf '_FindDItem';$2415 + tdf '_FindFamily';$0A1B + tdf '_FindFontStats';$111B + tdf '_FindHandle';$1A02 + tdf '_FindTargetCtl';$2610 + tdf '_FindWindow';$170E + tdf '_Fix2Frac';$1C0B + tdf '_Fix2Long';$1B0B + tdf '_Fix2X';$1E0B + tdf '_FixAppleMenu';$1E05 + tdf '_FixATan2';$170B + tdf '_FixDiv';$110B + tdf '_FixFontMenu';$151B + tdf '_FixMenuBar';$130F + tdf '_FixMul';$0F0B + tdf '_FixRatio';$0E0B + tdf '_FixRound';$130B + tdf '_FlashMenuBar';$0C0F + tdf '_FlushEvents';$1506 + tdf '_FMBootInit';$011B + tdf '_FMGetCurFID';$1A1B + tdf '_FMGetSysFID';$191B + tdf '_FMReset';$051B + tdf '_FMSetSysFont';$181B + tdf '_FMShutDown';$031B + tdf '_FMStartUp';$021B + tdf '_FMStatus';$061B + tdf '_FMVersion';$041B + tdf '_ForceBufDims';$CC04 + tdf '_FPNum';$090A + tdf '_Frac2Fix';$1D0B + tdf '_Frac2X';$1F0B + tdf '_FracCos';$150B + tdf '_FracDiv';$120B + tdf '_FracMul';$100B + tdf '_FracSin';$160B + tdf '_FracSqrt';$140B + tdf '_FrameArc';$6204 + tdf '_FrameOval';$5804 + tdf '_FramePoly';$BC04 + tdf '_FrameRect';$5304 + tdf '_FrameRgn';$7904 + tdf '_FrameRRect';$5D04 + tdf '_FreeMem';$1B02 + tdf '_FrontWindow';$150E + tdf '_FWEntry';$2403 + dw $00,$00 + +g tdf '_GetAbsClamp';$2B03 + tdf '_GetAbsScale';$1309 + tdf '_GetAddr';$1603 + tdf '_GetAddress';$0904 + tdf '_GetAlertStage';$3415 + tdf '_GetArcRot';$B104 + tdf '_GetBackColor';$A304 + tdf '_GetBackPat';$3504 + tdf '_GetBarColors';$180F + tdf '_GetCaretTime';$1206 + tdf '_GetCharExtra';$D504 + tdf '_GetClip';$2504 + tdf '_GetClipHandle';$C704 + tdf '_GetCodeResConverter';$3403 + tdf '_GetColorEntry';$1104 + tdf '_GetColorTable';$0F04 + tdf '_GetContentDraw';$480E + tdf '_GetContentOrigin';$3E0E + tdf '_GetContentRgn';$2F0E + tdf '_GetControlDItem';$1E15 + tdf '_GetCtlAction';$2110 + tdf '_GetCtlDpage';$1F10 + tdf '_GetCtlHandleFromID';$3010 + tdf '_GetCtlID';$2A10 + tdf '_GetCtlMoreFlags';$2E10 + tdf '_GetCtlParamPtr';$3510 + tdf '_GetCtlParams';$1C10 + tdf '_GetCtlRefCon';$2310 + tdf '_GetCtlTitle';$0D10 + tdf '_GetCtlValue';$1A10 + tdf '_GetCurResourceApp';$141E + tdf '_GetCurResourceFile';$121E + tdf '_GetCursorAdr';$8F04 + tdf '_GetDAStrPtr';$1405 + tdf '_GetDataSize';$400E + tdf '_GetDblTime';$1106 + tdf '_GetDefButton';$3715 + tdf '_GetDefProc';$310E + tdf '_GetDItemBox';$2815 + tdf '_GetDItemType';$2615 + tdf '_GetDItemValue';$2E15 + tdf '_GetErrGlobals';$0E0C + tdf '_GetErrorDevice';$140C + tdf '_GetFamInfo';$0B1B + tdf '_GetFamNum';$0C1B + tdf '_GetFGSize';$CF04 + tdf '_GetFirstDItem';$2A15 + tdf '_GetFirstWindow';$520E + tdf '_GetFont';$9504 + tdf '_GetFontFlags';$9904 + tdf '_GetFontGlobals';$9704 + tdf '_GetFontID';$D104 + tdf '_GetFontInfo';$9604 + tdf '_GetFontLore';$D904 + tdf '_GetForeColor';$A104 + tdf '_GetFrameColor';$100E + tdf '_GetFuncPtr';$0B01 + tdf '_GetGrafProcs';$4504 + tdf '_GetHandleSize';$1802 + tdf '_GetIndResource';$231E + tdf '_GetIndType';$211E + tdf '_GetInfoDraw';$4A0E + tdf '_GetInfoRefCon';$350E + tdf '_GetInGlobals';$0C0C + tdf '_GetInputDevice';$120C + tdf '_GetInterruptState';$3103 + tdf '_GetIntStateRecSize';$3203 + tdf '_GetIRQEnable';$2903 + tdf '_GetIText';$1F15 + tdf '_GetKeyTranslation';$1B06 + tdf '_GetLEDefProc';$2414 + tdf '_GetListDefProc';$0E1C + tdf '_GetLoadSegInfo';$0F11 + tdf '_GetMapHandle';$261E + tdf '_GetMasterSCB';$1704 + tdf '_GetMaxGrow';$420E + tdf '_GetMenuBar';$0A0F + tdf '_GetMenuFlag';$200F + tdf '_GetMenuMgrPort';$1B0F + tdf '_GetMenuTitle';$220F + tdf '_GetMHandle';$160F + tdf '_GetMItem';$250F + tdf '_GetMItemFlag';$270F + tdf '_GetMItemMark';$340F + tdf '_GetMItemStyle';$360F + tdf '_GetMouse';$0C06 + tdf '_GetMouseClamp';$1D03 + tdf '_GetMTitleStart';$1A0F + tdf '_GetNewDItem';$3315 + tdf '_GetNewID';$2003 + tdf '_GetNewModalDialog';$3215 + tdf '_GetNextDItem';$2B15 + tdf '_GetNextEvent';$0A06 + tdf '_GetNextWindow';$2A0E + tdf '_GetNumNDAs';$1B05 + tdf '_GetOpenFileRefNum';$1F1E + tdf '_GetOSEvent';$1606 + tdf '_GetOutGlobals';$0D0C + tdf '_GetOutputDevice';$130C + tdf '_GetPage';$460E + tdf '_GetPen';$2904 + tdf '_GetPenMask';$3304 + tdf '_GetPenMode';$2F04 + tdf '_GetPenPat';$3104 + tdf '_GetPenSize';$2D04 + tdf '_GetPenState';$2B04 + tdf '_GetPicSave';$3F04 + tdf '_GetPixel';$8804 + tdf '_GetPolySave';$4304 + tdf '_GetPopUpDefProc';$3B0F + tdf '_GetPort';$1C04 + tdf '_GetPortLoc';$1E04 + tdf '_GetPortRect';$2004 + tdf '_GetRectInfo';$4F0E + tdf '_GetResourceAttr';$1B1E + tdf '_GetResourceSize';$1D1E + tdf '_GetRgnSave';$4104 + tdf '_GetRomFont';$D804 + tdf '_GetROMResource';$3503 + tdf '_GetSCB';$1304 + tdf '_GetScrap';$0D16 + tdf '_GetScrapCount';$1216 + tdf '_GetScrapHandle';$0E16 + tdf '_GetScrapPath';$1016 + tdf '_GetScrapSize';$0F16 + tdf '_GetScrapState';$1316 + tdf '_GetScroll';$440E + tdf '_GetSoundVolume';$0C08 + tdf '_GetSpaceExtra';$9F04 + tdf '_GetStandardSCB';$0C04 + tdf '_GetStructRgn';$2E0E + tdf '_GetSysBar';$110F + tdf '_GetSysField';$4904 + tdf '_GetSysFont';$B304 + tdf '_GetSysWFlag';$4C0E + tdf '_GetTableAddress';$0B08 + tdf '_GetTextFace';$9B04 + tdf '_GetTextMode';$9D04 + tdf '_GetTextSize';$D304 + tdf '_GetTick';$2503 + tdf '_GetTitleWidth';$1E0F + tdf '_GetTSPtr';$0901 + tdf '_GetUpdateRgn';$300E + tdf '_GetUserField';$4704 + tdf '_GetUserID';$1011 + tdf '_GetUserID2';$2111 + tdf '_GetVector';$1103 + tdf '_GetVisHandle';$C904 + tdf '_GetVisRgn';$B504 + tdf '_GetWAP';$0C01 + tdf '_GetWControls';$330E + tdf '_GetWFrame';$2C0E + tdf '_GetWindowMgrGlobals';$580E + tdf '_GetWKind';$2B0E + tdf '_GetWMgrPort';$200E + tdf '_GetWRefCon';$290E + tdf '_GetWTitle';$0E0E + tdf '_GetZoomRect';$370E + tdf '_GlobalToLocal';$8504 + tdf '_GrafOff';$0B04 + tdf '_GrafOn';$0A04 + tdf '_GrowSize';$1E10 + tdf '_GrowWindow';$1B0E + dw $00,$00 + +h tdf '_HandToHand';$2A02 + tdf '_HandToPtr';$2902 + tdf '_Hex2Int';$240B + tdf '_Hex2Long';$250B + tdf '_HexIt';$2A0B + tdf '_HideControl';$0E10 + tdf '_HideCursor';$9004 + tdf '_HideDItem';$2215 + tdf '_HideMenuBar';$450F + tdf '_HidePen';$2704 + tdf '_HideWindow';$120E + tdf '_HiliteControl';$1110 + tdf '_HiliteMenu';$2C0F + tdf '_HiliteWindow';$220E + tdf '_HiWord';$180B + tdf '_HLock';$2002 + tdf '_HLockAll';$2102 + tdf '_HomeMouse';$1A03 + tdf '_HomeResourceFile';$151E + tdf '_HUnlock';$2202 + tdf '_HUnlockAll';$2302 + dw $00,$00 + +i tdf '_IMBootInit';$010B + tdf '_IMReset';$050B + tdf '_IMShutDown';$030B + tdf '_IMStartUp';$020B + tdf '_IMStatus';$060B + tdf '_IMVersion';$040B + tdf '_InflateTextBuffer';$D704 + tdf '_InitColorTable';$0D04 + tdf '_InitCursor';$CA04 + tdf '_InitialLoad';$0911 + tdf '_InitialLoad2';$2011 + tdf '_InitMouse';$1803 + tdf '_InitPalette';$2F0F + tdf '_InitPort';$1904 + tdf '_InitTextDev';$150C + tdf '_InsertMenu';$0D0F + tdf '_InsertMItem';$0F0F + tdf '_InsertMItem2';$3F0F + tdf '_InsetRect';$4C04 + tdf '_InsetRgn';$7004 + tdf '_InstallCDA';$0F05 + tdf '_InstallFont';$0E1B + tdf '_InstallNDA';$0E05 + tdf '_InstallWithStats';$1C1B + tdf '_Int2Dec';$260B + tdf '_Int2Hex';$220B + tdf '_IntSource';$2303 + tdf '_InvalCtls';$3710 + tdf '_InvalRect';$3A0E + tdf '_InvalRgn';$3B0E + tdf '_InvertArc';$6504 + tdf '_InvertOval';$5B04 + tdf '_InvertPoly';$BF04 + tdf '_InvertRect';$5604 + tdf '_InvertRgn';$7C04 + tdf '_InvertRRect';$6004 + tdf '_IsDialogEvent';$1015 + tdf '_ItemID2FamNum';$171B + dw $00,$00 + +j dw $00,$00 + +k tdf '_KillControls';$0B10 + tdf '_KillPicture';$BB04 + tdf '_KillPoly';$C304 + dw $00,$00 + +l tdf '_LEActivate';$0F14 + tdf '_LEBootInit';$0114 + tdf '_LEClick';$0D14 + tdf '_LECopy';$1314 + tdf '_LECut';$1214 + tdf '_LEDeactivate';$1014 + tdf '_LEDelete';$1514 + tdf '_LEDispose';$0A14 + tdf '_LEFromScrap';$1914 + tdf '_LEGetScrapLen';$1C14 + tdf '_LEGetTextHand';$2214 + tdf '_LEGetTextLen';$2314 + tdf '_LEIdle';$0C14 + tdf '_LEInsert';$1614 + tdf '_LEKey';$1114 + tdf '_LENew';$0914 + tdf '_LEPaste';$1414 + tdf '_LEReset';$0514 + tdf '_LEScrapHandle';$1B14 + tdf '_LESetCaret';$1F14 + tdf '_LESetHilite';$1E14 + tdf '_LESetJust';$2114 + tdf '_LESetScrapLen';$1D14 + tdf '_LESetSelect';$0E14 + tdf '_LESetText';$0B14 + tdf '_LEShutDown';$0314 + tdf '_LEStartUp';$0214 + tdf '_LEStatus';$0614 + tdf '_LETextBox';$1814 + tdf '_LETextBox2';$2014 + tdf '_LEToScrap';$1A14 + tdf '_LEUpdate';$1714 + tdf '_LEVersion';$0414 + tdf '_LGetPathname';$1111 + tdf '_LGetPathname2';$2211 + tdf '_Line';$3D04 + tdf '_LineTo';$3C04 + tdf '_ListBootInit';$011C + tdf '_ListReset';$051C + tdf '_ListShutDown';$031C + tdf '_ListStartUp';$021C + tdf '_ListStatus';$061C + tdf '_ListVersion';$041C + tdf '_LoadAbsResource';$271E + tdf '_LoaderBootInit';$0111 + tdf '_LoaderReset';$0511 + tdf '_LoaderShutDown';$0311 + tdf '_LoaderStartUp';$0211 + tdf '_LoaderStatus';$0611 + tdf '_LoaderVersion';$0411 + tdf '_LoadFont';$121B + tdf '_LoadOneTool';$0F01 + tdf '_LoadResource';$0E1E + tdf '_LoadScrap';$0A16 + tdf '_LoadSegName';$0D11 + tdf '_LoadSegNum';$0B11 + tdf '_LoadSysFont';$131B + tdf '_LoadTools';$0E01 + tdf '_LocalToGlobal';$8404 + tdf '_Long2Dec';$270B + tdf '_Long2Fix';$1A0B + tdf '_Long2Hex';$230B + tdf '_LongDivide';$0D0B + tdf '_LongMul';$0C0B + tdf '_LoWord';$190B + dw $00,$00 + +m tdf '_MakeNextCtlTarget';$2710 + tdf '_MakeThisCtlTarget';$2810 + tdf '_MaleBootInit';$0132 + tdf '_MaleReset';$0532 + tdf '_MaleShutDown';$0332 + tdf '_MaleSpeak';$0932 + tdf '_MaleStartUp';$0232 + tdf '_MaleStatus';$0632 + tdf '_MaleVersion';$0432 + tdf '_MapPoly';$C504 + tdf '_MapPt';$8A04 + tdf '_MapRect';$8B04 + tdf '_MapRgn';$8C04 + tdf '_MarkResourceChange';$101E + tdf '_MatchResourceHandle';$1E1E + tdf '_MaxBlock';$1C02 + tdf '_MenuBootInit';$010F + tdf '_MenuGlobal';$230F + tdf '_MenuKey';$090F + tdf '_MenuNewRes';$290F + tdf '_MenuRefresh';$0B0F + tdf '_MenuReset';$050F + tdf '_MenuSelect';$2B0F + tdf '_MenuShutDown';$030F + tdf '_MenuStartUp';$020F + tdf '_MenuStatus';$060F + tdf '_MenuVersion';$040F + tdf '_MessageByName';$1701 + tdf '_MessageCenter';$1501 + tdf '_MidiBootInit';$0120 + tdf '_MidiClock';$0B20 + tdf '_MidiControl';$0920 + tdf '_MidiConvert';$1320 + tdf '_MidiDevice';$0A20 + tdf '_MidiInfo';$0C20 + tdf '_MidiPlaySeq';$1120 + tdf '_MidiReadPacket';$0D20 + tdf '_MidiRecordSeq';$0F20 + tdf '_MidiReset';$0520 + tdf '_MidiShutDown';$0320 + tdf '_MidiStartUp';$0220 + tdf '_MidiStatus';$0620 + tdf '_MidiStopPlay';$1220 + tdf '_MidiStopRecord';$1020 + tdf '_MidiVersion';$0420 + tdf '_MidiWritePacket';$0E20 + tdf '_MMBootInit';$0102 + tdf '_MMReset';$0502 + tdf '_MMShutDown';$0302 + tdf '_MMStartUp';$0202 + tdf '_MMStatus';$0602 + tdf '_MMVersion';$0402 + tdf '_ModalDialog';$0F15 + tdf '_ModalDialog2';$2C15 + tdf '_Move';$3B04 + tdf '_MoveControl';$1610 + tdf '_MovePortTo';$2204 + tdf '_MoveTo';$3A04 + tdf '_MoveWindow';$190E + tdf '_MTBootInit';$0103 + tdf '_MTReset';$0503 + tdf '_MTShutDown';$0303 + tdf '_MTStartUp';$0203 + tdf '_MTStatus';$0603 + tdf '_MTVersion';$0403 + tdf '_Multiply';$090B + tdf '_Munger';$2803 + dw $00,$00 + +n tdf '_NewControl';$0910 + tdf '_NewControl2';$3110 + tdf '_NewDItem';$0D15 + tdf '_NewHandle';$0902 + tdf '_NewList';$101C + tdf '_NewList2';$161C + tdf '_NewMenu';$2D0F + tdf '_NewMenu2';$3E0F + tdf '_NewMenuBar';$150F + tdf '_NewMenuBar2';$430F + tdf '_NewModalDialog';$0A15 + tdf '_NewModelessDialog';$0B15 + tdf '_NewRgn';$6704 + tdf '_NewWindow';$090E + tdf '_NewWindow2';$610E + tdf '_NextMember';$0B1C + tdf '_NextMember2';$121C + tdf '_NoteAlert';$1915 + tdf '_NotEmptyRect';$5204 + tdf '_NoteOff';$0C19 + tdf '_NoteOn';$0B19 + tdf '_NotifyCtls';$2D10 + tdf '_NSBootInit';$0119 + tdf '_NSReset';$0519 + tdf '_NSSetUpdateRate';$0E19 + tdf '_NSSetUserUpdateRtn';$0F19 + tdf '_NSShutDown';$0319 + tdf '_NSStartUp';$0219 + tdf '_NSStatus';$0619 + tdf '_NSVersion';$0419 + dw $00,$00 + +o tdf '_ObscureCursor';$9204 + tdf '_OffsetPoly';$C404 + tdf '_OffsetRect';$4B04 + tdf '_OffsetRgn';$6F04 + tdf '_OpenNDA';$1505 + tdf '_OpenPicture';$B704 + tdf '_OpenPoly';$C104 + tdf '_OpenPort';$1804 + tdf '_OpenResourceFile';$0A1E + tdf '_OpenRgn';$6D04 + tdf '_OSEventAvail';$1706 + dw $00,$00 + +p tdf '_PackBytes';$2603 + tdf '_PaintArc';$6304 + tdf '_PaintOval';$5904 + tdf '_PaintPixels';$7F04 + tdf '_PaintPoly';$BD04 + tdf '_PaintRect';$5404 + tdf '_PaintRgn';$7A04 + tdf '_PaintRRect';$5E04 + tdf '_ParamText';$1B15 + tdf '_Parse';$0934 + tdf '_PenNormal';$3604 + tdf '_PicComment';$B804 + tdf '_PinRect';$210E + tdf '_PMActive';$0613 + tdf '_PMBootInit';$0113 + tdf '_PMLoadDriver';$3513 + tdf '_PMReset';$0513 + tdf '_PMShutDown';$0313 + tdf '_PMStartUp';$0213 + tdf '_PMUnloadDriver';$3413 + tdf '_PMVersion';$0413 + tdf '_PopUpMenuSelect';$3C0F + tdf '_PosMouse';$1E03 + tdf '_PostEvent';$1406 + tdf '_PPToPort';$D604 + tdf '_PrChoosePrinter';$1613 + tdf '_PrCloseDoc';$0F13 + tdf '_PrClosePage';$1113 + tdf '_PrControl';$1313 + tdf '_PrDefault';$0913 + tdf '_PrDevAsyncRead';$2113 + tdf '_PrDevClose';$1F13 + tdf '_PrDevOpen';$1C13 + tdf '_PrDevPrChanged';$1913 + tdf '_PrDevRead';$1D13 + tdf '_PrDevShutDown';$1B13 + tdf '_PrDevStartup';$1A13 + tdf '_PrDevStatus';$2013 + tdf '_PrDevWrite';$1E13 + tdf '_PrDevWriteBack';$2213 + tdf '_PrDriverVer';$2313 + tdf '_PrError';$1413 + tdf '_PrGetDocName';$3613 + tdf '_PrGetNetworkName';$2B13 + tdf '_PrGetPgOrientation';$3813 + tdf '_PrGetPortDvrName';$2913 + tdf '_PrGetPrinterDvrName';$2813 + tdf '_PrGetPrinterSpecs';$1813 + tdf '_PrGetUserName';$2A13 + tdf '_PrGetZoneName';$2513 + tdf '_PrJobDialog';$0C13 + tdf '_PrOpenDoc';$0E13 + tdf '_PrOpenPage';$1013 + tdf '_PrPicFile';$1213 + tdf '_PrPixelMap';$0D13 + tdf '_PrPortVer';$2413 + tdf '_PrSetDocName';$3713 + tdf '_PrSetError';$1513 + tdf '_PrStlDialog';$0B13 + tdf '_PrValidate';$0A13 + tdf '_Pt2Rect';$5004 + tdf '_PtInRect';$4F04 + tdf '_PtInRgn';$7504 + tdf '_PtrToHand';$2802 + tdf '_PurgeAll';$1302 + tdf '_PurgeHandle';$1202 + tdf '_PutScrap';$0C16 + dw $00,$00 + +q tdf '_QDAuxBootInit';$0112 + tdf '_QDAuxReset';$0512 + tdf '_QDAuxShutDown';$0312 + tdf '_QDAuxStartUp';$0212 + tdf '_QDAuxStatus';$0612 + tdf '_QDAuxVersion';$0412 + tdf '_QDBootInit';$0104 + tdf '_QDReset';$0504 + tdf '_QDShutDown';$0304 + tdf '_QDStartUp';$0204 + tdf '_QDStatus';$0604 + tdf '_QDVersion';$0404 + dw $00,$00 + +r tdf '_Random';$8604 + tdf '_RdAbs';$1109 + tdf '_ReadAsciiTime';$0F03 + tdf '_ReadBParam';$0C03 + tdf '_ReadBRam';$0A03 + tdf '_ReadChar';$220C + tdf '_ReadDocReg';$1808 + tdf '_ReadKeyMicroData';$0A09 + tdf '_ReadKeyMicroMemory';$0B09 + tdf '_ReadLine';$240C + tdf '_ReadMouse';$1703 + tdf '_ReadMouse2';$3303 + tdf '_ReadRamBlock';$0A08 + tdf '_ReadTimeHex';$0D03 + tdf '_RealFreeMem';$2F02 + tdf '_ReAllocHandle';$0A02 + tdf '_RectInRgn';$7604 + tdf '_RectRgn';$6C04 + tdf '_RefreshDesktop';$390E + tdf '_ReleaseResource';$171E + tdf '_ReleaseROMResource';$3603 + tdf '_RemoveCDA';$2105 + tdf '_RemoveDItem';$0E15 + tdf '_RemoveFromOOMQueue';$0D02 + tdf '_RemoveFromRunQ';$2005 + tdf '_RemoveNDA';$2205 + tdf '_RemoveResource';$0F1E + tdf '_RenamePathname';$1311 + tdf '_ResetAlertStage';$3515 + tdf '_ResetMember';$0F1C + tdf '_ResetMember2';$131C + tdf '_ResizeWindow';$5C0E + tdf '_ResourceBootInit';$011E + tdf '_ResourceConverter';$281E + tdf '_ResourceReset';$051E + tdf '_ResourceShutDown';$031E + tdf '_ResourceStartUp';$021E + tdf '_ResourceStatus';$061E + tdf '_ResourceVersion';$041E + tdf '_RestAll';$0C05 + tdf '_Restart';$0A11 + tdf '_RestoreBufDims';$CE04 + tdf '_RestoreHandle';$0B02 + tdf '_RestoreTextState';$1401 + tdf '_RestScrn';$0A05 + dw $00,$00 + +s tdf '_SANEBootInit';$010A + tdf '_SANEReset';$050A + tdf '_SANEShutDown';$030A + tdf '_SANEStartUp';$020A + tdf '_SANEStatus';$060A + tdf '_SANEVersion';$040A + tdf '_SaveAll';$0B05 + tdf '_SaveBufDims';$CD04 + tdf '_SaveScrn';$0905 + tdf '_SaveTextState';$1301 + tdf '_Say';$0F34 + tdf '_ScalePt';$8904 + tdf '_SchAddTask';$0907 + tdf '_SchBootInit';$0107 + tdf '_SchFlush';$0A07 + tdf '_SchReset';$0507 + tdf '_SchShutDown';$0307 + tdf '_SchStartUp';$0207 + tdf '_SchStatus';$0607 + tdf '_SchVersion';$0407 + tdf '_ScrapBootInit';$0116 + tdf '_ScrapReset';$0516 + tdf '_ScrapShutDown';$0316 + tdf '_ScrapStartUp';$0216 + tdf '_ScrapStatus';$0616 + tdf '_ScrapVersion';$0416 + tdf '_ScrollRect';$7E04 + tdf '_SDivide';$0A0B + tdf '_SectRect';$4D04 + tdf '_SectRgn';$7104 + tdf '_SeedFill';$0D12 + tdf '_SelCtlIcons';$1810 + tdf '_SelectMember';$0D1C + tdf '_SelectMember2';$141C + tdf '_SelectWindow';$110E + tdf '_SelIText';$2115 + tdf '_SendBehind';$140E + tdf '_SendEventToCtl';$2910 + tdf '_SendInfo';$0909 + tdf '_SeqAllNotesOff';$0D1A + tdf '_SeqBootInit';$011A + tdf '_SeqClearIncr';$0A1A + tdf '_SeqGetLoc';$0C1A + tdf '_SeqGetTimer';$0B1A + tdf '_SeqReset';$051A + tdf '_SeqSetIncr';$091A + tdf '_SeqSetInstTable';$121A + tdf '_SeqSetTrkInfo';$0E1A + tdf '_SeqShutDown';$031A + tdf '_SeqStartInts';$131A + tdf '_SeqStartUp';$021A + tdf '_SeqStatus';$061A + tdf '_SeqStepSeq';$101A + tdf '_SeqStopInts';$141A + tdf '_SeqVersion';$041A + tdf '_ServeMouse';$1F03 + tdf '_SetAbsClamp';$2A03 + tdf '_SetAbsScale';$1209 + tdf '_SetAllSCBs';$1404 + tdf '_SetArcRot';$B004 + tdf '_SetAutoKeyLimit';$1A06 + tdf '_SetBackColor';$A204 + tdf '_SetBackPat';$3404 + tdf '_SetBarColors';$170F + tdf '_SetBufDims';$CB04 + tdf '_SetCharExtra';$D404 + tdf '_SetClip';$2404 + tdf '_SetClipHandle';$C604 + tdf '_SetColorEntry';$1004 + tdf '_SetColorTable';$0E04 + tdf '_SetContentDraw';$490E + tdf '_SetContentOrigin';$3F0E + tdf '_SetContentOrigin2';$570E + tdf '_SetCtlAction';$2010 + tdf '_SetCtlID';$2B10 + tdf '_SetCtlMoreFlags';$2F10 + tdf '_SetCtlParamPtr';$3410 + tdf '_SetCtlParams';$1B10 + tdf '_SetCtlRefCon';$2210 + tdf '_SetCtlTitle';$0C10 + tdf '_SetCtlValue';$1910 + tdf '_SetCurResourceApp';$131E + tdf '_SetCurResourceFile';$111E + tdf '_SetCursor';$8E04 + tdf '_SetDAFont';$1C15 + tdf '_SetDAStrPtr';$1305 + tdf '_SetDataSize';$410E + tdf '_SetDefaultTPT';$1601 + tdf '_SetDefButton';$3815 + tdf '_SetDefProc';$320E + tdf '_SetDItemBox';$2915 + tdf '_SetDItemType';$2715 + tdf '_SetDItemValue';$2F15 + tdf '_SetDocReg';$1708 + tdf '_SetEmptyRgn';$6A04 + tdf '_SetErrGlobals';$0B0C + tdf '_SetErrorDevice';$110C + tdf '_SetEventMask';$1806 + tdf '_SetFont';$9404 + tdf '_SetFontFlags';$9804 + tdf '_SetFontID';$D004 + tdf '_SetForeColor';$A004 + tdf '_SetFrameColor';$0F0E + tdf '_SetGrafProcs';$4404 + tdf '_SetHandleSize';$1902 + tdf '_SetHeartBeat';$1203 + tdf '_SetInfoDraw';$160E + tdf '_SetInfoRefCon';$360E + tdf '_SetInGlobals';$090C + tdf '_SetInputDevice';$0F0C + tdf '_SetInterruptState';$3003 + tdf '_SetIntUse';$B604 + tdf '_SetIText';$2015 + tdf '_SetKeyTranslation';$1C06 + tdf '_SetMasterSCB';$1604 + tdf '_SetMaxGrow';$430E + tdf '_SetMenuBar';$390F + tdf '_SetMenuFlag';$1F0F + tdf '_SetMenuID';$370F + tdf '_SetMenuTitle2';$400F + tdf '_SetMItem';$240F + tdf '_SetMItem2';$410F + tdf '_SetMItemBlink';$280F + tdf '_SetMItemFlag';$260F + tdf '_SetMItemID';$380F + tdf '_SetMItemMark';$330F + tdf '_SetMItemName';$3A0F + tdf '_SetMItemName2';$420F + tdf '_SetMItemStyle';$350F + tdf '_SetMnuTitle';$210F + tdf '_SetMouse';$1903 + tdf '_SetMouseLoc';$9304 + tdf '_SetMTitleStart';$190F + tdf '_SetMTitleWidth';$1D0F + tdf '_SetOrgnMask';$340E + tdf '_SetOrigin';$2304 + tdf '_SetOutGlobals';$0A0C + tdf '_SetOutputDevice';$100C + tdf '_SetPage';$470E + tdf '_SetPenMask';$3204 + tdf '_SetPenMode';$2E04 + tdf '_SetPenPat';$3004 + tdf '_SetPenSize';$2C04 + tdf '_SetPenState';$2A04 + tdf '_SetPicSave';$3E04 + tdf '_SetPolySave';$4204 + tdf '_SetPort';$1B04 + tdf '_SetPortLoc';$1D04 + tdf '_SetPortRect';$1F04 + tdf '_SetPortSize';$2104 + tdf '_SetPt';$8204 + tdf '_SetPurge';$2402 + tdf '_SetPurgeAll';$2502 + tdf '_SetPurgeStat';$0F1B + tdf '_SetRandSeed';$8704 + tdf '_SetRect';$4A04 + tdf '_SetRectRgn';$6B04 + tdf '_SetResourceAttr';$1C1E + tdf '_SetResourceFileDepth';$251E + tdf '_SetResourceID';$1A1E + tdf '_SetResourceLoad';$241E + tdf '_SetRgnSave';$4004 + tdf '_SetSayGlobals';$0D34 + tdf '_SetSCB';$1204 + tdf '_SetScrapPath';$1116 + tdf '_SetScroll';$450E + tdf '_SetSolidBackPat';$3804 + tdf '_SetSolidPenPat';$3704 + tdf '_SetSoundMIRQV';$1208 + tdf '_SetSoundVolume';$0D08 + tdf '_SetSpaceExtra';$9E04 + tdf '_SetStdProcs';$8D04 + tdf '_SetSwitch';$1306 + tdf '_SetSysBar';$120F + tdf '_SetSysField';$4804 + tdf '_SetSysFont';$B204 + tdf '_SetSysWindow';$4B0E + tdf '_SetTextFace';$9A04 + tdf '_SetTextMode';$9C04 + tdf '_SetTextSize';$D204 + tdf '_SetTSPtr';$0A01 + tdf '_SetUserField';$4604 + tdf '_SetUserSoundIRQV';$1308 + tdf '_SetVector';$1003 + tdf '_SetVisHandle';$C804 + tdf '_SetVisRgn';$B404 + tdf '_SetWFrame';$2D0E + tdf '_SetWindowIcons';$4E0E + tdf '_SetWRefCon';$280E + tdf '_SetWTitle';$0D0E + tdf '_SetZoomRect';$380E + tdf '_SFAllCaps';$0D17 + tdf '_SFBootInit';$0117 + tdf '_SFGetFile';$0917 + tdf '_SFGetFile2';$0E17 + tdf '_SFMultiGet2';$1417 + tdf '_SFPGetFile';$0B17 + tdf '_SFPGetFile2';$1017 + tdf '_SFPMultiGet2';$1517 + tdf '_SFPPutFile';$0C17 + tdf '_SFPPutFile2';$1117 + tdf '_SFPutFile';$0A17 + tdf '_SFPutFile2';$0F17 + tdf '_SFReScan';$1317 + tdf '_SFReset';$0517 + tdf '_SFShowInvisible';$1217 + tdf '_SFShutDown';$0317 + tdf '_SFStartUp';$0217 + tdf '_SFStatus';$0617 + tdf '_SFVersion';$0417 + tdf '_ShowControl';$0F10 + tdf '_ShowCursor';$9104 + tdf '_ShowDItem';$2315 + tdf '_ShowHide';$230E + tdf '_ShowMenuBar';$460F + tdf '_ShowPen';$2804 + tdf '_ShowWindow';$130E + tdf '_ShutDownTools';$1901 + tdf '_SizeWindow';$1C0E + tdf '_SolidPattern';$3904 + tdf '_SortList';$0A1C + tdf '_SortList2';$151C + tdf '_SoundBootInit';$0108 + tdf '_SoundReset';$0508 + tdf '_SoundShutDown';$0308 + tdf '_SoundStartUp';$0208 + tdf '_SoundStatus';$0608 + tdf '_SoundVersion';$0408 + tdf '_SpecialRect';$0C12 + tdf '_SpeechBootInit';$0134 + tdf '_SpeechReset';$0534 + tdf '_SpeechShutDown';$0334 + tdf '_SpeechStartUp';$0234 + tdf '_SpeechStatus';$0634 + tdf '_SpeechVersion';$0434 + tdf '_SRQPoll';$1409 + tdf '_SRQRemove';$1509 + tdf '_StartDrawing';$4D0E + tdf '_StartFrameDrawing';$5A0E + tdf '_StartInfoDrawing';$500E + tdf '_StartSeq';$0F1A + tdf '_StartSeqRel';$151A + tdf '_StartUpTools';$1801 + tdf '_StatusID';$2203 + tdf '_StatusTextDev';$170C + tdf '_StillDown';$0E06 + tdf '_StopAlert';$1815 + tdf '_StopSeq';$111A + tdf '_StringBounds';$AD04 + tdf '_StringWidth';$A904 + tdf '_SubPt';$8104 + tdf '_SyncADBReceive';$0E09 + tdf '_SysBeep';$2C03 + tdf '_SysFailMgr';$1503 + tdf '_SystemClick';$1705 + tdf '_SystemEdit';$1805 + tdf '_SystemEvent';$1A05 + tdf '_SystemTask';$1905 + dw $00,$00 + +t tdf '_TaskMaster';$1D0E + tdf '_TaskMasterContent';$5D0E + tdf '_TaskMasterDA';$5F0E + tdf '_TaskMasterKey';$5E0E + tdf '_TEActivate';$0F22 + tdf '_TEBootInit';$0122 + tdf '_TEClear';$1922 + tdf '_TEClick';$1122 + tdf '_TECopy';$1722 + tdf '_TECut';$1622 + tdf '_TEDeactivate';$1022 + tdf '_TEGetDefProc';$2222 + tdf '_TEGetInternalProc';$2622 + tdf '_TEGetLastError';$2722 + tdf '_TEGetRuler';$2322 + tdf '_TEGetSelection';$1C22 + tdf '_TEGetSelectionStyle';$1E22 + tdf '_TEGetText';$0C22 + tdf '_TEGetTextInfo';$0D22 + tdf '_TEIdle';$0E22 + tdf '_TEInsert';$1A22 + tdf '_TEKey';$1422 + tdf '_TEKill';$0A22 + tdf '_TENew';$0922 + tdf '_TEOffsetToPoint';$2022 + tdf '_TEPaintText';$1322 + tdf '_TEPaste';$1822 + tdf '_TEPointToOffset';$2122 + tdf '_TEReplace';$1B22 + tdf '_TEReset';$0522 + tdf '_TEScroll';$2522 + tdf '_TESetRuler';$2422 + tdf '_TESetSelection';$1D22 + tdf '_TESetText';$0B22 + tdf '_TEShutDown';$0322 + tdf '_TEStartUp';$0222 + tdf '_TEStatus';$0622 + tdf '_TestControl';$1410 + tdf '_TEStyleChange';$1F22 + tdf '_TEUpdate';$1222 + tdf '_TEVersion';$0422 + tdf '_TextBootInit';$010C + tdf '_TextBounds';$AF04 + tdf '_TextReadBlock';$230C + tdf '_TextReset';$050C + tdf '_TextShutDown';$030C + tdf '_TextStartUp';$020C + tdf '_TextStatus';$060C + tdf '_TextVersion';$040C + tdf '_TextWidth';$AB04 + tdf '_TextWriteBlock';$1E0C + tdf '_TickCount';$1006 + tdf '_TLBootInit';$0101 + tdf '_TLMountVolume';$1101 + tdf '_TLReset';$0501 + tdf '_TLShutDown';$0301 + tdf '_TLStartUp';$0201 + tdf '_TLStatus';$0601 + tdf '_TLTextMountVolume';$1201 + tdf '_TLVersion';$0401 + tdf '_TotalMem';$1D02 + tdf '_TrackControl';$1510 + tdf '_TrackGoAway';$180E + tdf '_TrackZoom';$260E + dw $00,$00 + +u tdf '_UDivide';$0B0B + tdf '_UnionRect';$4E04 + tdf '_UnionRgn';$7204 + tdf '_UniqueResourceID';$191E + tdf '_UnloadOneTool';$1001 + tdf '_UnloadScrap';$0916 + tdf '_UnloadSeg';$0E11 + tdf '_UnloadSegNum';$0C11 + tdf '_UnPackBytes';$2703 + tdf '_UpdateDialog';$2515 + tdf '_UpdateResourcefile';$0D1E + tdf '_UserShutDown';$1211 + dw $00,$00 + +v tdf '_ValidRect';$3C0E + tdf '_ValidRgn';$3D0E + tdf '_VDBootInit';$0121 + tdf '_VDGetFeatures';$1B21 + tdf '_VDGGControl';$1D21 + tdf '_VDGGStatus';$1E21 + tdf '_VDInControl';$1C21 + tdf '_VDInConvAdj';$0C21 + tdf '_VDInGetStd';$0B21 + tdf '_VDInSetStd';$0A21 + tdf '_VDInStatus';$0921 + tdf '_VDKeyControl';$0D21 + tdf '_VDKeyGetKBCol';$1221 + tdf '_VDKeyGetKDiss';$1421 + tdf '_VDKeyGetKGCol';$1121 + tdf '_VDKeyGetKRCol';$1021 + tdf '_VDKeyGetNKDiss';$1621 + tdf '_VDKeySetKCol';$0F21 + tdf '_VDKeySetKDiss';$1321 + tdf '_VDKeySetNKDiss';$1521 + tdf '_VDKeyStatus';$0E21 + tdf '_VDOutControl';$1921 + tdf '_VDOutGetStd';$1821 + tdf '_VDOutSetStd';$1721 + tdf '_VDOutStatus';$1A21 + tdf '_VDReset';$0521 + tdf '_VDShutDown';$0321 + tdf '_VDStartUp';$0221 + tdf '_VDStatus';$0621 + tdf '_VDVersion';$0421 + dw $00,$00 + +w tdf '_WaitCursor';$0A12 + tdf '_WaitMouseUp';$0F06 + tdf '_WindBootInit';$010E + tdf '_WindDragRect';$530E + tdf '_WindNewRes';$250E + tdf '_WindowGlobal';$560E + tdf '_WindReset';$050E + tdf '_WindShutDown';$030E + tdf '_WindStartUp';$020E + tdf '_WindStatus';$060E + tdf '_WindVersion';$040E + tdf '_WriteBParam';$0B03 + tdf '_WriteBRam';$0903 + tdf '_WriteChar';$180C + tdf '_WriteCString';$200C + tdf '_WriteLine';$1A0C + tdf '_WriteRamBlock';$0908 + tdf '_WriteResource';$161E + tdf '_WriteString';$1C0C + tdf '_WriteTimeHex';$0E03 + dw $00,$00 + +x tdf '_X2Fix';$200B + tdf '_X2Frac';$210B + tdf '_XorRgn';$7404 + dw $00,$00 + +y dw $00,$00 + +z tdf '_ZeroScrap';$0B16 + tdf '_ZoomWindow';$270E + dw $00,$00 + +gsos pdf $2034;'_GSOS:addnotifyproc' + pdf $201D;'_GSOS:beginsession' + pdf $2031;'_GSOS:bindint' + pdf $2004;'_GSOS:changepath' + pdf $200B;'_GSOS:clearbackup' + pdf $2014;'_GSOS:close' + pdf $2001;'_GSOS:create' + pdf $202E;'_GSOS:dcontrol' + pdf $2035;'_GSOS:delnotifyproc' + pdf $2002;'_GSOS:destroy' + pdf $202C;'_GSOS:dinfo' + pdf $202F;'_GSOS:dread' + pdf $2036;'_GSOS:drename' + pdf $202D;'_GSOS:dstatus' + pdf $2030;'_GSOS:dwrite' + pdf $201E;'_GSOS:endsession' + pdf $2025;'_GSOS:erasedisk' + pdf $200E;'_GSOS:expandpath' + pdf $2015;'_GSOS:flush' + pdf $2024;'_GSOS:format' + pdf $2028;'_GSOS:getbootvol' + pdf $2020;'_GSOS:getdevnumber' + pdf $201C;'_GSOS:getdirentry' + pdf $2019;'_GSOS:geteof' + pdf $2006;'_GSOS:getfileinfo' + pdf $202B;'_GSOS:getfstinfo' + pdf $201B;'_GSOS:getlevel' + pdf $2017;'_GSOS:getmark' + pdf $2027;'_GSOS:getname' + pdf $200A;'_GSOS:getprefix' + pdf $2039;'_GSOS:getrefinfo' + pdf $2038;'_GSOS:getrefnum' + pdf $2037;'_GSOS:getstdrefnum' + pdf $200F;'_GSOS:getsysprefs' + pdf $202A;'_GSOS:getversion' + pdf $2011;'_GSOS:newline' + pdf $200D;'_GSOS:null' + pdf $2010;'_GSOS:open' + pdf $2003;'_GSOS:osshutdown' + pdf $2029;'_GSOS:quit' + pdf $2012;'_GSOS:read' + pdf $2026;'_GSOS:resetcache' + pdf $201F;'_GSOS:sessionstatus' + pdf $2018;'_GSOS:seteof' + pdf $2005;'_GSOS:setfileinfo' + pdf $201A;'_GSOS:setlevel' + pdf $2016;'_GSOS:setmark' + pdf $2009;'_GSOS:setprefix' + pdf $200C;'_GSOS:setsysprefs' + pdf $2032;'_GSOS:unbindint' + pdf $2008;'_GSOS:volume' + pdf $2013;'_GSOS:write' + dw $00,$00 +p16 + pdf $0031;'_P16:allocinterrupt' + pdf $0004;'_P16:changepath' + pdf $000B;'_P16:clearbackupbit' + pdf $0014;'_P16:close' + pdf $0001;'_P16:create' + pdf $0032;'_P16:deallocateinterrupt' + pdf $0002;'_P16:destroy' + pdf $002C;'_P16:dinfo' + pdf $0025;'_P16:erasedisk' + pdf $0015;'_P16:flush' + pdf $0024;'_P16:format' + pdf $0028;'_P16:getbootvol' + pdf $0020;'_P16:getdevnum' + pdf $001C;'_P16:getdirentry' + pdf $0019;'_P16:geteof' + pdf $0006;'_P16:getfileinfo' + pdf $0021;'_P16:getlastdev' + pdf $001B;'_P16:getlevel' + pdf $0017;'_P16:getmark' + pdf $0027;'_P16:getname' + pdf $000A;'_P16:getprefix' + pdf $002A;'_P16:getversion' + pdf $0011;'_P16:newline' + pdf $0010;'_P16:open' + pdf $0029;'_P16:quit' + pdf $0012;'_P16:read' + pdf $0022;'_P16:readblock' + pdf $0018;'_P16:seteof' + pdf $0005;'_P16:setfileinfo' + pdf $001A;'_P16:setlevel' + pdf $0016;'_P16:setmark' + pdf $0009;'_P16:setprefix' + pdf $0008;'_P16:volume' + pdf $0013;'_P16:write' + pdf $0023;'_P16:writeblock' + dw $00,$00 + + adrl $00 ;must be here!! + + lst +tools equ ]count + lst off + + typ $06 + sav qasystem/toolmacs + diff --git a/src/main.s b/src/main.s new file mode 100644 index 0000000..e0dbf96 --- /dev/null +++ b/src/main.s @@ -0,0 +1,225 @@ + ;lst on +* +* main.s +* Merlin32 Test +* +* Created by Lane Roathe on 8/26/19. +* Copyright © 2019 Ideas From the Deep. All rights reserved. +* + +exprdp = $A5 +expr = $6789 +exprL = $123456 +//]XCODESTART ; Keep this at the start and put your code after this + + lda expr,S + lda (expr,S),Y + lda #expr + lda (expr,X) + lda (expr),y + lda (expr) + lda [exprL],x + lda [exprL] + lda expr,x + lda expr,y + mvp expr,expr1 + lda expr + lda expr + ldal expr + jmp expr + jmp (expr) + lda #exprL + lda #^exprL + lda #|exprL + + end + +*========================================================== +* monitor addresses + + +TEXT = $FB39 ;Reset text window +TABV = $FB5B ;Complete vtab, using contents of 'A' +MONBELL = $FBE4 ;random bell noise! +HOME = $FC58 ;Clear text window +WAIT = $FCA8 ;delay routine +CROUT = $FD8E ;Print a CR +PRBYTE = $FDDA ;Print 'A' as a hex number +PRHEX = $FDE3 ;as above, but bits 0-3 only +COUT = $FDED ;Monitor char out +MOVE = $FE2C ;memory move routine +INVERSE = $FE80 ;Print in inverse +NORMAL = $FE84 ;Normal print + +* Jump Vectors +CONNECT = $3EA ;Connect DOS +DOSWARM = $3D0 ;exit to DOS prompt +RSTVEC = $3F2 ;reset vector + +TSTADDR = $1000 ;absolute address for testing + +*========================================================== +* Data Index DUM section test + + DUM 0 +dum0 ds 1 ;fractional byte +dum1 ds 1 +dumSize = * + DEND + +*========================================================== +* zero page (all zp var names are prefixed with _) + + DUM 0 + +_ptr ds 2 +_tmp ds 2 + +_num1 ds dumSize ;first and second operand values + +; test ORG with DUM section + + ORG $20 + +_LFT ds 1 ;Window edge 0..39 + + DEND + +*========================================================== +* Program Entry + +;Issue #26 - This should start at the ORG in the linkscript, not at the last ORG in the DUM sections. +START + +; PUT current issue here, so it's the first thing assembled. +; The rest below are unit tests to make sure future changes don't break existing code! + + +; START OF TESTS KNOWN TO HAVE PASSED IN PREVIOUS BUILDS + +; --- Test all instructions in all their modes, with as many variants as possible --- + + + + +;adc (ZP,x) + adc (0,x) + adc ($80,x) + adc (_tmp,x) + adc (_tmp+0,x) + adc (_tmp+$10,x) + adc ($10+_tmp,x) + adc (_tmp+dum0,x) + adc (_tmp+dum1,x) + adc (_tmp+dum1+1,x) + adc (_tmp+dum0+dum1,x) + + adc 0 + adc $80 + adc _tmp + adc #0 + adc #$1111 + adc $1111 + +; --- Other tests that have proven helpful --- + +; Tests regarding issues with math and zp,x + sta TSTADDR+dum0 + sta TSTADDR+_num1+dum0 + sta TSTADDR+_num1+dum0,x + + lda _num1+dum0 + adc _num1+dum1 + sbc _num1+dum1 + bit _num1+dum0 + sta _num1+dum0 ;(FIXED): can't use sta _num1+dum0 + stz _num1+dum0 + + lda _num1+dum0,x + adc _num1+dum0,x + sbc _num1+dum0,x + bit _num1+dum0,x + sta _num1+dum0,x + stz _num1+dum0,x + + lda _num1+dum0,y ;these assemble to abs accesses: lda $00C0,y + adc _num1+dum0,y + sbc _num1+dum0,y + sta _num1+dum0,y + +; Label & branching tests +GetKey ldx $C000 + bpl GetKey +]loop + dex + bne ]loop + + tya + and #1 + beq :err + + tya + and #1 + bne :good +:err + lda #0 +:good + bne myQuit + nop + hex 2C ;bit + lda #1 +myQuit + jmp DOSWARM + +; --- Tests used when addressing issues opened against Merlin32 --- + +;Issue #26 (lroathe) - ORG in DUM section is ignored, but can't mess up code ORG + + org $2000 + + lda _LFT + ldx #_LFT + cpx #$20 + + org ;return to ongoing address + + +;Issue #16 (fadden) - Byte reference modifiers are ignored (no way to force DP) + lda <$fff0 ;zp + lda >$fff0 ;ABS (lo word) + lda ^$fff0 ;ABS (hi word) + lda |$fff0 ;ABS (long in 65816 mode) + + lda <$fff0+24 ;zp + lda >$fff0+24 ;ABS (lo word) + lda ^$fff0+24 ;ABS (hi word) + lda |$fff0+24 ;ABS (long in 65816 mode) + + lda #<$fff0+24 ;byte + lda #>$fff0+24 ;page + lda #^$fff0+24 ;bank + + lda #<$fff0 ;byte + lda #>$fff0 ;page + lda #^$fff0 ;bank + + lda $0008 ;ZP + lda $08 ;ZP + lda $ffff-$fff7 ;ZP + lda $fff0+24 ;ABS (long in 65816 mode) + + +;Issue #8 fadden) - STX zp,y fails to assemble + org $00bc + +L00BC bit L00BC + + org + + stx $bc,y + + ldx L00BC,y + stx L00BC,y + +//]XCODEEND ; Keep this at the end and put your code above this diff --git a/src/merlin_convert.s b/src/merlin_convert.s new file mode 100644 index 0000000..23cf9b3 --- /dev/null +++ b/src/merlin_convert.s @@ -0,0 +1,4002 @@ + lst off +asm php + rep $30 + sty filehandle+2 + stx filehandle + pea 0 + _QAKeyAvail + pla + beq :k + pha + _QAGetChar + pla +:k + stz errorct + stz keyflag + +:getlen pha + pha + psl filehandle + tll $1802 + plx + ply + jcs :incerr + cpx #$00 + bne :dec1 + dey +:dec1 dex + +:nodec stx filelen + sty filelen+2 + + ldy #$04 + lda [filehandle],y + and #$7fff ; + sta [filehandle],y + + jsr getmemory + jcs :incerr + + jsr initasm + + lda #linebuff+1 + sta lineptr + lda #^linebuff + sta lineptr+2 + +:dopass rep $30 + ldy #$04 + lda [filehandle],y + ora #$8000 + sta [filehandle],y + + ldy #$02 + lda [filehandle] + sta fileptr + lda [filehandle],y + sta fileptr+$2 + lda filelen + sta flen + lda filelen+$2 + sta flen+$2 + + lda flen + ora flen+$2 + bne :init + jmp :alldone ;if file is 0 bytes + +:init jsr initpass + +:lineloop + rep $30 + pea 0 + _QAKeyAvail + pla + beq :nokey + jsr dokeypress + +:nokey sep $20 + lda passnum + beq :l2 + + lda objfull + beq :l1 + lda #objectfull + jmp :perr1 +:l1 lda reloffset+2 + beq :l2 + lda #relflag + bit modeflag + beq :l2 + lda #relfilefull + jmp :perr1 +:l2 lda prodoserr + beq :l3 + lda #doserror + jmp :perr1 + +:l3 lda #$01 + trb macflag + + lda putuse + beq :doline + tsb modeflag + stz putuse + rep $20 + stz linenum + sep $20 + +:doline lda doneflag + beq :line + jmp :donepass + +:line rep $30 + stz opcode + stz linebuff + stz labstr + stz linelabtxt + stz comment + stz linehaslab + + lda #$2020 + sta opcode+1 + sta opcode+3 + sta opcode+5 + + lda #$ffff + sta linelable + +:test sep $30 + lda macflag + bpl :sep ;mac working? + bit #%00100000 + bne :int + bit #%01000000 + beq :sep +:ext jsr expandmac + jcs :perr1 ;there was an error expanding + jmp :macentry +:int jsr expandint + jcs :perr1 + jmp :macentry + +:sep rep $30 + lda lastlen + clc + adc fileptr + sta fileptr + bcc :i1 + inc fileptr+2 +:i1 lda flen + sec + sbc lastlen + sta flen + bcs :test0 +:dec dec flen+2 + bpl :readline +:setflag lda #$ffff + sta doneflag + jmp :done +:test0 bne :readline + lda flen+2 + beq :setflag +:readline + rep $30 ;increment the line counter + inc linenum +;do tests here..... + + rep $30 + lda fileptr + sta printptr + lda fileptr+2 + sta printptr+2 + + sep $30 + ldy #$00 + + lda [fileptr] + tax + lda inputtbl,x + cmp #' ' + blt :sjmp ;to savlen => + beq :getopcode + cmp #'*' + beq :c + cmp #';' + beq :c + jmp :glabel +:c jmp :comment + +:glabel sta labstr+1 + sta linehaslab + ldx #$01 +:gliny iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' '+1 + blt :glabdone +:cpx cpx #$0f + bge :gliny + sta labstr+1,x + inx + jmp :gliny + +:sjmp jmp :savlen +:cjmp jmp :comment + +:glabdone cpx #$10 + blt :gl2 + ldx #$0f +:gl2 stx labstr + cmp #' ' + blt :sjmp + +:getopcode +:giny iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + blt :sjmp + beq :giny + cmp #';' + beq :cjmp + + sta opcode+1 + + ldx #$01 +:goiny iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' '+1 + blt :godone + cpx #31 + bge :goiny + sta opcode+1,x + inx + jmp :goiny + +:godone cpx #32 + blt :go2 + ldx #31 +:go2 stx opcode + cmp #' ' + blt :sjmp + +:getoperand +:giny1 iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + blt :sjmp + beq :giny1 + cmp #';' + beq :comment + + + ldx #$00 + phx + dey +:goiny1 iny + lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' ;read in the rest of the line + blt :gotoper + beq :chklit + cmp #$27 + beq :lit + cmp #$22 + beq :lit + jmp :cpx1 +:chklit xba + lda 1,s + bne :xba + xba + jmp :gotoper +:lit cmp 1,s + beq :litoff + xba + lda 1,s + beq :s + jmp :xba +:s xba + sta 1,s + jmp :cpx1 +:litoff xba + lda #$00 + sta 1,s +:xba xba +:cpx1 cpx #128 + bge :goiny1 + sta linebuff+1,x + inx + jmp :goiny1 + +:gotoper cpx #128 + blt :go3 + ldx #128 +:go3 stx linebuff + xba + pla + xba + cmp #' ' + blt :savlen ;should always be taken... + bne :comment + +:comment ldx passnum ;only read the comment on pass 2 + bne :cp1 +:cp0 iny + lda [fileptr],y + tax + lda inputtbl,x + cmp #' ' + bge :cp0 + jmp :savlen + bra :cp0 +:cp1 ldx #$00 +:cf1 lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' + blt :savcom + bne :c2 + iny + bra :cf1 +:c2 lda [fileptr],y + phx + tax + lda inputtbl,x + plx + cmp #' ' + blt :savcom + iny + cpx #128 + bge :c2 + sta comment+1,x + inx + bra :c2 +:savcom stx comment + +:savlen iny + sty lastlen + ldx linebuff + lda #$0d + sta linebuff+1,x + inc linebuff + +:macentry sep $30 + lda labstr ;was there a lable or + ora opcode ;an opcode? + bne :process + jsr initline + clc + jmp :printline ;nothing to process so just + ;list the line if necessary + +:process + jsr initline + lda passnum + beq :al + lda #controld + bit keyflag + beq :al + trb keyflag + lda listflag + and #$80 + sta oldlstflag + lda listflag + eor #$80 + sta listflag +:al jsr asmline ;go process line + bcc :printline + jmp :perr +:perr1 rep $30 + and #$FF +:perr rep $30 + pha + lda #$0d + jsr drawchar + lda 1,s + jsr asmerror + + lda passnum + beq :perrpla + + lda listflag + pha + ora #$8080 + and #%00011101_00011101!$FFFF + sta listflag + jsr printline + pla + and #$7fff ;clear line list flag + sta listflag + lda #$0d + jsr drawchar +:perrpla pla + and #$80 + beq :printline + jmp :alldone + +:printline + sep $20 + do 1 + lda passnum + beq :nopr + lda listflag+1 + bpl :nopr + bit #lstdoon + beq :printmac + lda dolevel + ora dolevel+1 + bne :nopr + else + ldal $e0c061 + bpl :nopr + jmp :print + fin +:printmac lda macflag + bit #%01100000 + beq :print ;no macros expanding + lda modeflag+1 + bit #expflag + bne :print + lda macflag + bit #%00000001 + beq :nopr +:print jsr printline +:nopr jmp :lineloop + +:done sep $30 + lda modeflag + and #putflag.useflag + beq :donepass + jsr putuseend + lda doneflag + bne :donepass + jmp :lineloop + +:donepass rep $30 + lda #cancelflag + bit keyflag + bne :pn + + lda macflag + and #$80 ;is a macro still in progress? + beq :pn + lda #$0d + jsr drawchar + lda #badmacro + jsr asmerror + lda #$00 + jmp :asmerrout + +:pn lda passnum + bne :alldone + lda #$FFFF + sta passnum + + jmp :dopass ;go do next pass + +:alldone sep $30 + stz prodoserr + stz prodoserr+1 + jsr closedsk + bcc :nderr + rep $30 + pha + _QAIncTotalErrs + pla + jsr dskerror +:nderr rep $30 + pea 0 + _QAGetTotalErrs + pla + sta errorct + sep $30 + lda #cancelflag + and keyflag + ora errorct + ora errorct+1 + bne :ad0 + bit listflag + bpl :ad0 + lda #symflag + bit modeflag1 + beq :ad0 +:symbols jsr drawlables +:ad0 rep $30 + lda #$00 +:incerr +:asmerrout rep $30 + sta :errcode + jsr showendstr + jsr disposemem + lda #cancelflag + and keyflag + tay + + lda :errcode + plp + cmpl :one + rtl +:one dw $01 +:errcode ds 2 +:symstr str 0d,'Print Symbol Table?',06 + + + + +showendstr php + rep $30 + lda #cancelflag + bit keyflag + jne :cr + psl #:str1 + _QADrawString + + psl totbytes + pea 0 + pea 0 + _QADrawDec + + psl #:str2 + _QADrawString + pea 0 + lda errorct + pha + pea 0 + pea 0 + _QADrawDec + + psl #:str3 + _QADrawString + + pea 0 + lda totallines + pha + pea 0 + pea 0 + _QADrawDec + + psl #:str4 + _QADrawString + + pea 0 + lda globalct + pha + pea 0 + pea 0 + _QADrawDec + + psl #:str5 + _QADrawString + jsr calctime + +:plp plp + rts +:cr lda #$0d + jsr drawchar + jmp :plp + +:str1 str 0d,'End of QuickASM assembly. ' +:str2 str ' bytes, ' +:str3 str ' errors, ' +:str4 str ' lines, ' +:str5 str ' symbols.',0d,0d + + +calctime php + rep $30 + pha + pha + pha + _QAEndTiming + pla + sta :hours + pla + sta :minutes + pla + sta :seconds + stz :flag + + psl #:str1 + _QADrawString + lda :hours + beq :mins + pea 0 + pha + pha + pea 0 + pea 0 + _QADrawDec + psl #:str2 + _QADrawString + + lda :hours + jsr :plural + inc :flag + +:mins lda :minutes + beq :secs + lda :flag + beq :m1 + jsr :spc +:m1 pea 0 + lda :minutes + pha + pea 0 + pea 0 + _QADrawDec + psl #:str3 + _QADrawString + lda :minutes + jsr :plural + inc :flag +:secs lda :flag + beq :s0 + lda :seconds + beq :end + jsr :spc + jmp :s1 +:s0 lda :seconds + bne :s1 + lda #'<' + jsr drawchar + lda #$20 + jsr drawchar + inc :seconds +:s1 pea 0 + lda :seconds + pha + pea 0 + pea 0 + _QADrawDec + psl #:str4 + _QADrawString + lda :seconds + jsr :plural +:end lda #'.' + jsr drawchar + lda #$0d + jsr drawchar + jsr drawchar + plp + rts +:plural php + rep $30 + cmp #$01 + beq :c + lda #'s' + jsr drawchar +:c plp + rts +:spc php + rep $30 + lda #',' + jsr drawchar + lda #' ' + jsr drawchar + plp + rts + +:flag ds 2 +:hours ds 2 +:minutes ds 2 +:seconds ds 2 +:str1 str 'Elapsed time = ' +:str2 str ' hour' +:str3 str ' minute' +:str4 str ' second' + + +numbytes = 8 + +printline php + sep $30 + stz :objoutflag + stz :objoutflag+1 + + lda listflag+1 + bit #%00000100 + jne :equate + + lda #dumflag + bit modeflag + jne :noobjcode + + lda #%00000001 + bit macflag + bne :objptr + bit listflag+1 + jeq :noobjcode + +:objptr lda listflag+1 + bit #%00100000 + bne :tradr + lda lineobjptr+2 + jsr prbyte +:tradr rep $30 + lda lineobjptr + jsr prbytel + sep $30 + lda #':' + jsr drawchar + lda #' ' + jsr drawchar + +:noobjptr + rep $10 + + ldy #$00 + ldx bytesout + beq :noobjcode + stx :objoutflag + bmi :group1 + cpx #$05 + blt :objloop + ldx #$04 +:objloop lda bytesout+2,y + jsr prbyte + cpx #$01 + beq :plx0 + lda #' ' + jsr drawchar +:plx0 iny + dex + bne :objloop + rep $20 + lda bytesout + sec + sbc #$04 + bcs :s1 + lda #$00 +:s1 sta bytesout + jmp :noobjcode + +:group1 rep $30 + txa + and #$7fff + tax + sep $20 + cpx #$05 + blt :objloop1 + ldx #$04 +:objloop1 lda bytesout+2 + phx + jsr prbyte + lda 1,s + cmp #$01 + beq :plx1 + lda #' ' + jsr drawchar +:plx1 plx + dex + bne :objloop1 + rep $30 + lda bytesout + and #$7fff + sec + sbc #$04 + beq :z + bcs :or +:z stz bytesout + jmp :noobjcode +:or ora #$8000 + sta bytesout + jmp :noobjcode + + +:noobjcode sep $30 + lda listflag+1 + bit #branchlst + bne :branch + jmp :line + +:branch +* rep $30 +* pea #14 +* _QATabToCol + sep $30 + lda #'=' + jsr drawchar + lda bytesout+3 + bpl :bpos + rep $30 + ora #$FF00 + jmp :bpha +:bpos rep $30 + and #$ff +:bpha pha + lda lineobjptr + clc + adc #$02 + clc + adc 1,s + plx + jsr prbytel + jmp :line + +:equate rep $30 + pea #12 + _QATabToCol + sep $30 + lda #'=' + jsr drawchar + lda equateval+2 + beq :eq1 + jsr prbyte +:eq1 lda equateval+1 + beq :eq2 + jsr prbyte +:eq2 lda equateval + jsr prbyte + +:line rep $30 + pea #20 ;pos of line number + _QATabToCol + sep $30 + lda modeflag + bit #putflag.useflag + bne :file + lda #' ' + jsr drawchar + jmp :l1 +:file lda #'>' + jsr drawchar +:l1 rep $30 + pea 0 + lda linenum + pha + pea 0 + pea 0 + _QADrawDec + lda #' ' + jsr drawchar +* rep $30 +* lda tabs +* and #$ff +* pha +* _QATabToCol +:sp2 sep $30 + lda [printptr] + and #$7f + cmp #' ' + jlt :xit + beq :opcode + cmp #';' + beq :comment + cmp #'*' + jeq :comment1 + ldy #$00 +]lup lda [printptr],y + and #$7f + cmp #' '+1 + blt :opcode + jsr drawchar + iny + jmp ]lup +:opcode rep $30 + lda tabs+1 + and #$ff + pha + _QATabToCol + psl #opcode + tll $1c0c + lda tabs+2 + and #$ff + pha + _QATabToCol + sep $20 + lda linebuff + beq :comment + dec linebuff + rep $20 + psl #linebuff + tll $1c0c +:comment rep $30 + lda tabs+3 + and #$ff + pha + _QATabToCol +:comment1 rep $30 + psl #comment + tll $1c0c +:xit rep $30 + jsr printcycles + lda #$0d + jsr drawchar + jsr checkpause + +:trunc rep $30 + lda passnum + jeq :plp + lda :objoutflag + jeq :plp + lda bytesout + jeq :plp + lda listflag+1 + bit #%00000010 + jne :plp + bit #%00000001 + jeq :plp + lda #$ffff + sta :crout + lda lineobjptr + clc + adc #$04 + sta lineobjptr + bcc :t0 + inc lineobjptr+2 +:t0 lda bytesout + jmi :group2 + lda #$06 + sta :pos + jmp :t2 +:t1 rep $30 + lda lineobjptr + clc + adc #numbytes + sta lineobjptr + bcc :t2 + inc lineobjptr+2 +:t2 lda bytesout + jeq :tcrout + sep $30 + lda listflag+1 + bit #%00100000 + bne :tradr1 + lda lineobjptr+2 + jsr prbyte +:tradr1 rep $30 + lda lineobjptr + jsr prbytel + sep $30 + lda #':' + jsr drawchar + lda #' ' + jsr drawchar + ldx #$00 +:tlup lda bytesout + jeq :tcrout + cpx #numbytes + bge :tcr + ldy :pos + lda bytesout,y + jsr prbyte + lda #$20 + jsr drawchar + inx + inc :pos + dec bytesout + stz :crout + jmp :tlup +:tcr lda #$0d + jsr drawchar + lda #$ffff + sta :crout + jsr checkpause + jmp :t1 +:tcrout lda :crout + bne :tc + lda #$0d + jsr drawchar + jsr checkpause +:tc jmp :plp + +:group2 rep $30 + lda bytesout + and #$7fff + sta bytesout + lda #$ffff + sta :crout + jmp :t21 +:t11 rep $30 + lda lineobjptr + clc + adc #numbytes + sta lineobjptr + bcc :t21 + inc lineobjptr+2 +:t21 lda bytesout + beq :tcr12 + sep $30 + lda listflag+1 + bit #%00100000 + bne :tradr11 + lda lineobjptr+2 + jsr prbyte +:tradr11 rep $30 + lda lineobjptr + jsr prbytel + sep $30 + lda #':' + jsr drawchar + lda #' ' + jsr drawchar +:tlup1 rep $30 + ldx #$00 +:tlup12 lda bytesout + beq :tcr12 + cpx #numbytes + bge :tcr1 + lda bytesout+2 + phx + jsr prbyte + lda #$20 + jsr drawchar + stz :crout + plx + inx + dec bytesout + jmp :tlup12 +:tcr1 lda #$0d + jsr drawchar + lda #$ffff + sta :crout + jmp :t11 +:tcr12 bit :crout + bmi :plp + lda #$0d + jsr drawchar +:plp plp + rts +:pos ds 2 +:crout ds 2 +:objoutflag ds 2 + + +printcycles php + sep $30 + lda #cycflag + bit modeflag+1 + bne :show +:xit plp + rts +:show lda linecycles + beq :xit + rep $30 + pea #71 ;column for cycle count + _QATabToCol + sep $30 + lda #$20 + jsr drawchar + lda linecycles + and #$0f + ora #$30 + jsr drawchar + lda #' ' + ldy cyclemarks + beq :d1 + cpy #$02 + bge :2 + lda #$27 + jmp :d1 +:2 lda #$22 +:d1 jsr drawchar + lda #',' + jsr drawchar + + bit cycflags + bmi :mx + rep $30 + lda cycles + jsr prbytel + jmp :xit + + mx %11 +:mx bit mxflag + bmi :m1 + bvc :m0x0 + lda #$01 + jsr prbyte + jmp :xit +:m0x0 lda #$00 + jsr prbyte + jmp :xit +:m1 bvc :m1x0 + lda #$11 + jsr prbyte + jmp :xit +:m1x0 lda #$10 + jsr prbyte + jmp :xit + + +dokeypress php + rep $30 + pea 0 + _QAKeyAvail + pla + beq :clc + pha + _QAGetChar + pla + sep $20 + and #$7f + xba + sta keymod + xba + cmp #$20 + bne :nopause +:pause lda #pauseflag + tsb keyflag + sep $20 + jmp :sec +:nopause cmp #$1b + beq :cancel + cmp #'C'&$9f + bne :list +:cancel lda #$ff + sta doneflag + sta doneflag+1 + sta passnum + sta passnum+1 + lda #putflag.useflag + trb modeflag + lda #cancelflag + tsb keyflag + + rep $30 + phx + pea $FFFF + _QASetCancelFlag + plx + sep $30 + jmp :sec + +:list cmp #'D'&$9f + bne :sec + lda #controld + tsb keyflag +* sta keyflag + jmp :sec +:clc plp + clc + rts +:sec plp + sec + rts + +keymod ds 2 + +checkpause php + rep $30 + lda #pauseflag + bit keyflag + beq :perrpla + trb keyflag + lda #cancelflag + bit keyflag + bne :perrpla +:kl1 jsr dokeypress + bcc :kl1 +:perrpla plp + rts + + + +getmemory + php + rep $30 + stz :purgeflag + stz lableptr + stz lableptr+$2 + stz lableptr1 + stz lableptr1+$2 + stz nextlableptr + stz nextlableptr+2 + stz objhdl + stz objhdl+$2 + stz objzpptr + stz objzpptr+$2 + stz relptr + stz relptr+$2 + stz macptr + stz macptr+2 + lda #initobjsize + sta objsize + + + pea 0 + _QALinkerActive + pla + jeq :normal + + psl #$00 + psl #$00 + pea 0 + psl #$00 + _QAGetSymTable + pll nextlableptr + pla + sta lablect + pll linksymhdl + pll linksymtbl + + lda linksymhdl + ora linksymhdl+2 + jeq :normal + lda linksymtbl + ora linksymtbl+2 + jeq :normal + + ldy #$00 +]lup lda [linksymtbl],y + sta atable,y + iny + iny + cpy #128*2 + blt ]lup + + lda linksymhdl + sta workspace + lda linksymhdl+2 + sta workspace+2 + ldy #$02 + lda [workspace] + tax + lda [workspace],y + sta lableptr1+2 + stx lableptr1 + jmp :all + +:normal rep $30 + lda #$ffff + sta lablect ;so memory is allocated + jsr inclablect + bcc :symok + plp + sec + rts + +:symok rep $30 + ldx #$00 + lda #$FFFF +]lup sta atable,x + inx + inx + cpx #128*2 + blt ]lup + +:m1 psl #$00 + psl #maxsymbols*4 + lda userid + ora #asmmemid + pha + pea $8000 ;locked page aligned + psl #$00 + tll $0902 + plx + ply + bcc :m1out + jsr :purge + bcc :m1 + jmp :err +:m1out + stx workspace + sty workspace+2 + ldy #$02 + lda [workspace] + sta lableptr1 + lda [workspace],y + and #$00FF + sta lableptr1+$2 + + rep $30 + lda #$0000 + tay +]lup sta [lableptr1],y + iny + iny + cpy #maxsymbols*4 + blt ]lup + +:all rep $30 +:g1 psl #$00 + psl #initobjsize+1 + lda userid + ora #asmmemid + pha + pea $8000 ;locked page aligned no bank cross + psl #$00 + tll $0902 + plx + ply + bcc :m2out + jsr :purge + bcc :g1 + jmp :err +:m2out + jcs :xit + stx objhdl + stx workspace + sty objhdl+2 + sty workspace+2 + ldy #$02 + lda [workspace] + sta objzpptr + lda [workspace],y + sta objzpptr+$2 + lda #$0000 + ldy #$0000 +]lup sta [objzpptr],y + iny + iny + beq :next + cpy objsize + blt ]lup +:next rep $30 + psl #$00 + psl #macsize + lda userid + ora #asmmemid + pha + pea $8000 + psl #$00 + tll $0902 + plx + ply + bcc :m3out + jsr :purge + bcc :next + jmp :err +:m3out + stx macptr + sty macptr+2 + ldy #02 + lda [macptr] + tax + lda [macptr],y + sta macptr+2 + stx macptr + stz macvarptr + + lda #$00 + +:xit rep $30 +:err + plp + cmp :one + rts +:one dw $01 +:purgeflag ds 2 + +:purge bit :purgeflag + bmi :psec + jmp :psec + sec + ror :purgeflag + pea $00 + tll $1302 ;purgeall + tll $1f02 ;compactmem + clc + rts +:psec sec + rts + +disposemem php + rep $30 + ldal userid + ora #memid + pha + _disposeall + ldal userid + ora #putid + pha + _disposeall + ldal userid + ora #useid + pha + _disposeall + plp + rts + +initasm php + rep $30 + stz rellabct + _QAInitTotalErrs + + psl #$00 + pea #vtoolmacs + _QAGetVector + pll extmacptr + + pea 0 + _QALinkerActive + pla + beq :norm + lda lablect + sta globalct + bra :all +:norm stz globalct +:all stz keyflag + stz passnum + stz extcount + stz entcount + stz totallines + stz maclocal + stz macvarptr + stz prodoserr + stz errorct + stz dskopen + stz dskwrite + stz dskeofparm + stz dskpath + stz dskclose + stz objfull + stz titlestr + lda #$06 + sta objtype + + ldx #$0000 +]lup stz putbuffer,x + stz usebuffer,x + inx + inx + cpx #maxput*16 + blt ]lup + + ldx #$0000 +]lup stz lupbuffer,x + inx + inx + cpx #maxlup*16 + blt ]lup + + _QAStartTiming + + jsr randomize + + plp + rts +:s ds 2 + +initpass php + sep $30 + stz encval + stz putuse + stz macflag + stz checksum + stz crc16 + stz crc16+1 + stz cycflags + + lda #$FF + sta tbxand + lda #%11000000 ;full native mode + sta xcflag + stz mxflag + + rep $30 + + do oldshell + ldx goffset + lda idactive,x + bit #linkflag + beq :nolink + else + jmp :nolink + fin + + do oldshell + lda linklstflag,x + sep $30 + and #%10000000 + ora #%01000000 + jmp :linkent + fin + +:nolink sep $30 + lda #%11000000 +:linkent sta listflag ;both list and lstdo ON + lda #controld + and keyflag + eor listflag + sta listflag + lda #controld + trb keyflag + + rep $30 + lda passnum + beq :p1mode + lda #dskflag!$FFFF + trb modeflag + jmp :p2mode +:p1mode stz modeflag +:p2mode lda #expflag*256.caseflag + tsb modeflag + stz modeflag1 + + stz doneflag + stz dolevel + stz maclevel + stz putlevel + stz uselevel + stz linenum + stz domask + + stz cycles + stz linecycles + stz cyclemarks + stz cycleavg + + + lda #$ffff + sta globlab + sta oldglob + + stz dumor ;force to absolute + + lda #$8000 + sta orgor + sta objptr + sta orgval + sta oldobj + stz objptr+2 + stz orgval+2 + stz oldobj+2 + stz objct + stz objoffset + stz objoffset+2 + stz oldoffset + stz oldoffset+2 + stz reloffset + stz reloffset+2 + stz totbytes + stz totbytes+2 + stz doneflag + stz lastlen + stz dsfill + stz dsoffset + stz errvalid + stz erraddress + stz erraddress+2 + stz luplevel + plp + rts + +initline php + lda passnum + bne :pass2 +:pass1 rep $30 + lda #$FFFF + sep $30 + + rep $30 + +:jmp jmp :all +:pass2 sep $30 + lda listflag + sta listflag+1 + rep $30 + stz bytesout + + stz relout + lda reloffset + sta linerel + inc totallines + stz linecycles + stz cyclemarks + +:all rep $30 + lda #$FFFF + sep $30 + stz clrglob + stz forcelong + sta notfound + rep $30 + stz opflags + stz merrcode + sta fllast + sta lableused + lda objptr + sta lineobjptr + lda objptr+2 + sta lineobjptr+2 + +:xit plp + rts + +inclablect php + rep $30 + inc lablect + lda lablect + and #%11111111 + bne :normal + psl #$00 + psl #$2000 + lda userid + ora #asmmemid + pha + pea $8004 ;page aligned/locked + psl #$00 + tll $0902 + plx + ply + jcs :sec + sei + pei 0 + pei 2 + stx 0 + sty 2 + ldy #$02 + lda [0] + sta nextlableptr + lda [0],y + sta nextlableptr+2 + pla + sta 2 + pla + sta 0 + jmp :rts +:normal lda nextlableptr + clc + adc #32 + sta nextlableptr + bcc :rts + inc nextlableptr+2 +:rts plp + clc + rts +:sec lda #symfull + plp + sec + rts + + +asmline + php + sep $30 + lda macflag + bpl :asmline + and #$7e + bne :asmline + jsr definemacro + bcs :s + plp + clc + rts +:s plp + sec + rts + +:asmline lda modeflag + bit #lupflag + beq :lb + jsr checklup ;setup LUP lable +:lb lda labstr + ora opcode + bne :asm + lda #noerror + jmp :clc + +:asm lda labstr ;was a lable defined? + beq :opcode +:dolable + ldy passnum + beq :passone + lda labstr+1 ;get the first char + cmp #':' + bne :passone ;local lable? + ldy dolevel + bne :opcode + ldy dolevel+1 + bne :opcode + bit globlab+1 ;any global labels defined? + bpl :opcode + lda #undeflable + jmp :clc + +:passone jsr definelable + bcc :opcode + tay + lda modeflag + and #doflag + bne :opcode + cpy #duplable + beq :mis + cpy #misalignment + beq :mis + lda macflag + and #%11000000 + cmp #%11000000 + bne :bit + jmp :mis +:mis lda opcode + beq :bit + sty merrcode + jsr getopcode + sep $30 + ldy merrcode + jmp :bit +:opcode ldy opcode + beq :bit + jsr getopcode + sep $30 + bcs :clc +:noop lda #$00 +:clc tay +:bit bit clrglob + bpl :xit + bvc :xit + lda oldglob + sta globlab + lda oldglob+1 + sta globlab+1 +:xit rep $30 + tya + and #$ff + plp + cmp :one + rts +:one dw $0001 + + +getopcode ;ALWAYS returns in 16 bit mode + sep $30 + stz forcelong + + lda opcode + bne :1 + rep $30 + clc + rts + +:1 rep $30 + lda opcode+$1 + xba + sep $30 + asl + asl + asl + rep $20 + asl + asl + asl + sta workspace + lda opcode+$4 + and #$5F5F + beq :clc + cmp #$4C + beq :last + cmp #$4F44 + beq :last + sep $20 + sec + ror forcelong + rep $20 +:clc clc +:last lda opcode+$3 + and #$1F + rol + ora workspace + + rep $30 + tay ;now get the table offset + lda opcode+1 + and #$1f + asl + tax + tya + jsr (opcodelookup,x) + bcc :op + sta opcodeword + jmp :macs + +:op sta opcodeword + sty opdata + sty :jmp+1 + stx opflags + + bit forcelong-1 + bpl :normop + jsr domac1 + bcs :mfound + +:normop sep $30 + bit xcflag + bvs :opf ;65816 mode? + bmi :65c02 + bit opflags+1 + bmi :badop + bvc :opf + jmp :badop +:65c02 bit opflags+1 + bvs :badop +:opf lda opflags+1 + + bit #>macro + bne :cond + + bit #>conditional + bne :cond + + xba + lda #doflag + bit modeflag + bne :noerr + xba + + bit #>branch + bne :branch + bit #>onebyte + bne :onebyte + bit #>general + bne :general +:cond rep $30 +:jmp jmp $FFFF +:onebyte rep $30 + lda opdata + jmp putopcode +:general rep $30 + jmp generalop +:branch rep $30 + lda opdata + jmp dobranch + +:noerr rep $30 + clc + rts +:badop rep $30 + lda #badopcode + sec + rts +:mfound rep $30 + lda #$FFFF + jmp :m1 +:macs rep $30 + lda #$0000 ;we need to search +:m1 jsr domacros + rts + + +domacros php ;enter with $00 in A to search + sep $30 ;otherwise lableptr must point + tay + lda #doflag ;to the macro to be expanded + bit modeflag + beq :ok + plp + clc + rts +:ok tya + cmp #$00 + bne :nofind + ldx opcode + cpx #$10 + blt :move + ldx #$0f +:move lda opcode,x + sta labstr,x + dex + bpl :move + lda macflag + sta :mflag + stz macflag + jsr findlable + ldy :mflag + sty macflag + bcc :builtin ;not found so try built in macs + bcc :bad + rep $20 + ldy #26 + lda [lableptr],y + and #$8004 + cmp #$8004 + bne :sec +:nofind +:setup sep $30 + lda macflag + sta :mflag + lda #$c1 ;expand and init + tsb macflag + ldy #$00 + sty macvarpos + sty macvarpos+1 + jsr initmac + bcc :clc + ldy :mflag + sty macflag + plp + sec + rts +:clc rep $30 + plp + clc + rts +:bad rep $30 + lda #badopcode + plp + sec ;return clear if handled opcode + rts +:sec rep $30 + lda #notmacro + plp + sec ;return clear if handled opcode + rts +:mflag ds 2 + +:builtin sep $30 + lda #tbxflag + bit modeflag+1 + bne :bok +:bd jmp :bad +:bd1 jmp :bok1 +:bok lda opcode + cmp #$02 + blt :bd + lda opcode+1 + cmp #'_' + bne :bd1 + lda opcode+2 + and #$5f + cmp #'A' + blt :bd1 + cmp #'Z'+1 + bge :bd1 + cmp #'P' + beq :dos16 + cmp #'G' + bne :nodos + ldy opcode + cpy #7 + blt :nodos + ldy #$03 +]l lda opcode,y + cmp #':' + beq :cmp1 + and #$5f +:cmp1 cmp :gsosstr,y + bne :nodos1 + iny + cpy #$07 + blt ]l + jmp :gsos +:dos16 ldy opcode + cpy #6 + blt :nodos + ldy #$03 +]l lda opcode,y + cmp :dos16str,y + bne :nodos1 + iny + cpy #$06 + blt ]l + jmp :dos161 +:nodos1 lda opcode+2 + and #$5f +:nodos rep $30 + and #$ff + sec + sbc #'A' + asl + asl + tay + + lda extmacptr + ora extmacptr+2 + beq :bd1 + lda extmacptr + sta workspace + lda extmacptr+2 + sta workspace+2 + phy + ldy #$04 + lda [workspace],y + ora #$8000 + sta [workspace],y + ldy #$02 + lda [workspace] + sta workspace+4 + lda [workspace],y + sta workspace+6 + ply + lda [workspace+4],y + tax + iny + iny + lda [workspace+4],y + tay + txa + clc + adc workspace+4 + sta workspace+4 + tya + adc workspace+6 + sta workspace+6 + +:main sep $30 + lda [workspace+4] + beq :nf1 + sta :length + stz :length+1 + + ldy #$01 + lda [workspace+4],y + cmp opcode + bne :next + ldy #$04 ;now we're at the first char to CMP + ldx #$02 +:find lda [workspace+4],y + and #$7f + cmp opcode-1,y + beq :inx + and #$5f ;set to uppercase + cmp opcode-1,y + beq :inx + ora #$20 + cmp opcode-1,y + bne :next +:inx iny + inx + cpx opcode + blt :find + jmp :found + +:next rep $30 + lda :length + clc + adc workspace+4 + sta workspace+4 + bcc :main + inc workspace+6 + jmp :main + +:nf1 rep $30 + ldy #$04 + lda [workspace],y + and #$7FFF + sta [workspace],y + jmp :bad1 + +:found rep $30 + ldy #$01 + lda [workspace+4],y + and #$ff + inc + inc ;to account for the two len bytes + tay + lda [workspace+4],y + + pha + ldy #$04 + lda [workspace],y + and #$7FFF + sta [workspace],y + +:num lda #$2406 ;length and '$' + sta linebuff + sep $30 + ldy #$02 + lda 2,s + lsr + lsr + lsr + lsr + ora #'0' + cmp #'9'+1 + blt :ok1 + adc #'A'-'9'-2 +:ok1 sta linebuff,y + iny + lda 2,s + and #$0f + ora #'0' + cmp #'9'+1 + blt :ok2 + adc #'A'-'9'-2 +:ok2 sta linebuff,y + iny + lda 1,s + lsr + lsr + lsr + lsr + ora #'0' + cmp #'9'+1 + blt :ok3 + adc #'A'-'9'-2 +:ok3 sta linebuff,y + iny + lda 1,s + and #$0f + ora #'0' + cmp #'9'+1 + blt :ok4 + adc #'A'-'9'-2 +:ok4 sta linebuff,y + lda #$0d + sta linebuff+6 + rep $30 + pla ;remove from stack + + lda #tlltxt1 + ldx #^tlltxt1 + jsr initinternal + stz linebuff + bcc :bcc + jmp :bsec + +:bok1 rep $30 + lda opcodeword + jsr mactbl + bcs :bad1 + txa + tyx + jsr initinternal + bcc :bcc +:bsec plp + sec + rts +:bcc plp + clc + rts +:bad1 rep $30 + lda #badopcode + plp + sec ;return clear if handled opcode + rts + +:dos161 rep $30 + lda #'Z'+1-'A' + jmp :asl +:gsos rep $30 + lda #'Z'+2-'A' +:asl asl + asl + tay + rep $30 + lda extmacptr + ora extmacptr+2 + jeq :bd1 + lda extmacptr + sta workspace + lda extmacptr+2 + sta workspace+2 + phy + ldy #$04 + lda [workspace],y + ora #$8000 + sta [workspace],y + ldy #$02 + lda [workspace] + sta workspace+4 + lda [workspace],y + sta workspace+6 + ply + lda [workspace+4],y + tax + iny + iny + lda [workspace+4],y + tay + txa + clc + adc workspace+4 + sta workspace+4 + tya + adc workspace+6 + sta workspace+6 + +:main1 rep $30 + lda [workspace+4] + and #$ff + beq :nf2 + sta :length + + sep $30 + ldy #$01 + lda [workspace+4],y + cmp opcode + bne :next1 + iny ;get to the "_" + iny ;first letter must already match + iny ;now we're at the first char to CMP + ldx #$02 +:find1 lda [workspace+4],y + and #$7f + cmp opcode-1,y + beq :inx1 + and #$5f ;set to uppercase + cmp opcode-1,y + bne :next1 +:inx1 iny + inx + cpx opcode + blt :find1 + jmp :found1 + +:next1 rep $30 + lda :length + clc + adc workspace+4 + sta workspace+4 + bcc :main1 + inc workspace+6 + jmp :main1 + +:nf2 rep $30 + ldy #$04 + lda [workspace],y + and #$7FFF + sta [workspace],y + jmp :bad1 + +:found1 rep $30 + lda opcode + and #$ff + inc + inc ;to account for the two len bytes + tay + lda [workspace+4],y + + pha + ldy #$04 + lda [workspace],y + and #$7FFF + sta [workspace],y + + sep $30 + ldy #$00 + lda 2,s + lsr + lsr + lsr + lsr + ora #'0' + cmp #'9'+1 + blt :ok11 + adc #'A'-'9'-2 +:ok11 sta dosnum,y + iny + lda 2,s + and #$0f + ora #'0' + cmp #'9'+1 + blt :ok22 + adc #'A'-'9'-2 +:ok22 sta dosnum,y + iny + lda 1,s + lsr + lsr + lsr + lsr + ora #'0' + cmp #'9'+1 + blt :ok33 + adc #'A'-'9'-2 +:ok33 sta dosnum,y + iny + lda 1,s + and #$0f + ora #'0' + cmp #'9'+1 + blt :ok44 + adc #'A'-'9'-2 +:ok44 sta dosnum,y + rep $30 + pla ;remove from stack + + lda #dostxt1 + ldx #^dostxt1 + jsr initinternal + bcc :bcc2 + jmp :bsec +:bcc2 jmp :bcc + + +:length ds 2,0 +:gsosstr str '_GSOS:' +:dos16str str '_P16:' +:high ds 2 +:low ds 2 + +domac1 php + sep $30 + lda #doflag + bit modeflag + beq :ok +:clc plp + clc + rts +:ok sep $30 + ldx opcode + beq :clc + phx + + ldx labstr +]lup lda labstr,x + sta linelabtxt,x + dex + bpl ]lup + + plx +]lup lda opcode,x + sta labstr,x + dex + bpl ]lup + lda macflag + sta :mflag + stz macflag + jsr findlable + ldy :mflag + sty macflag + bcc :restore ;notfound + rep $20 + ldy #26 + lda [lableptr],y + and #$8004 + cmp #$8004 + bne :restore + plp + sec + rts + +:restore sep $30 + ldx linelabtxt +]lup lda linelabtxt,x + sta labstr,x + dex + bpl ]lup + plp + clc + rts +:hash ds 2 +:mflag ds 2 + + mx %00 + +amxindex = %0000_0000_0001 +amyindex = %0000_0000_0010 +amstack = %0000_0000_0100 +amround = %0000_0000_1000 +amsquare = %0000_0001_0000 +amforce8 = %0000_0010_0000 +amforce16 = %0000_0100_0000 +amforce24 = %0000_1000_0000 +amacc = %0001_0000_0000 +amimed = %0010_0000_0000 +ammask = amforce8.amforce16.amforce24!$FFFF + +tbld = 0 +tbldx = amxindex +tbldy = amyindex +tblds = amstack +tbld1 = amround +tbldx1 = amxindex+amround +tbldy1 = amyindex+amround +tbldsy = amstack+amround+amyindex +tbld2 = amsquare +tbldy2 = amyindex+amsquare +tblal = amforce24 +tblalx = amforce24+amxindex +tblacc = amacc +tblimed = amimed + +addmode php + sep $30 + stz myvalue + stz myvalue+1 + bit forcelong + bpl :long + lda #amforce16 + tsb myvalue + jmp :init +:long lda opcodeword + lsr + bcc :init + lda #amforce24 + tsb myvalue +:init ldy #$00 +]flush lda [lineptr],y + cmp #' ' + jlt :zero + beq :iny + cmp #';' + jeq :zero + jmp :first +:iny iny + jmp ]flush + +:first sta firstchar+1 + sty firstchar + cmp #'#' + bne :address +:imed pea #amimed + jmp :xit +:address cmp #'(' + beq :round + cmp #'[' + beq :square + cmp #'<' + beq :force8 + cmp #'|' + beq :force16 + cmp #'!' + beq :force16 + cmp #'>' + beq :force24 + jmp :index +:force8 lda #amforce8 + tsb myvalue + jmp :index +:force16 lda #amforce16 + tsb myvalue + jmp :index +:force24 lda #amforce24 + tsb myvalue + jmp :index +:round lda #amround + tsb myvalue + jmp :index +:square lda #amsquare + tsb myvalue +:index iny + lda [lineptr],y + cmp #' '+1 + blt :modexit + cmp #';' + beq :modexit + cmp #',' + bne :index +:index1 iny + lda [lineptr],y + and #$5f + cmp #'Y' + beq :yindex + cmp #'X' + beq :xindex + cmp #'S' + beq :stack +:badmode lda #badaddress + jmp :errxit +:xindex lda #amxindex + tsb myvalue + lda myvalue + and #amround + beq :modexit + lda myvalue+1 + and #amround + bne :badmode + stz myvalue+1 + iny + lda [lineptr],y + cmp #')' + bne :modexit + lda #amround + tsb myvalue+1 + jmp :modexit +:yindex lda #amyindex + tsb myvalue + dey + dey + lda [lineptr],y + cmp #']' + beq :rsfound + cmp #')' + beq :rrfound + jmp :modexit +:rsfound lda #amsquare + tsb myvalue+1 + jmp :modexit +:rrfound lda #amround + tsb myvalue+1 +:modexit lda myvalue + and #amround.amsquare + beq :allok + and myvalue+1 ;make sure all braces are there + bne :allok + lda myvalue + and #amyindex + bne :badmode1 + dey + lda [lineptr],y + cmp #')' + beq :rr2 + cmp #']' + bne :badmode1 + lda myvalue + and #amsquare + bne :allok + jmp :badmode1 +:rr2 lda myvalue + and #amround + bne :allok +:badmode1 lda #badaddress + jmp :errxit + +:stack lda #amstack + tsb myvalue + lda myvalue + and #amround + beq :modexit + stz myvalue+1 + iny + lda [lineptr],y + cmp #')' + bne :badmode1 + lda #amround + tsb myvalue+1 + iny + lda [lineptr],y + cmp #',' + bne :badmode1 + iny + lda [lineptr],y + and #$5f + cmp #'Y' + bne :badmode1 + lda #amyindex + tsb myvalue + jmp :modexit +:allok rep $30 + lda myvalue + and #$ff + plp + clc + rts +:zero pea #amacc +:xit rep $30 + pla + plp + clc + rts +:errxit rep $30 + and #$ff + plp + sec + rts + +addmodetbl dfb 6*3 + dfb 7*3 + dfb 8*3 + dfb $FF + dfb 19*3 + dfb $FF + dfb $FF + dfb $FF + dfb 9*3 + dfb 10*3 + dfb 11*3 + dfb $FF + dfb $FF + dfb $FF + dfb 20*3 + dfb $FF + dfb 12*3 + dfb $FF + dfb 13*3 + ds 109,$FF + dfb 17*3 + dfb 18*3 + ds 126,$FF + dfb 1*3 + ds 255,$FF + dfb 0*3 + ds 511,$FF + dfb 14*3 + dfb 15*3 + dfb 16*3 + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb 21*3 + dfb 22*3 + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + dfb $FF + ds 109,$FF + dfb 17*3 + dfb 18*3 + +lastmode ds 2 + +generalop php + rep $30 + lda #$ff00 + sta :evalflag + jsr addmode + bcc :doit + plp + sec + rts +:doit + sta :mode + sta lastmode + bit #amimed + jne :imediate + bit #amacc + jne :onebyte + + bit #amforce16.amforce24 + bne :nodp + + lda :mode + tax + lda addmodetbl,x + and #$FF + cmp #$FF + jeq :bad + tay + sep $20 + bit xcflag + bpl :get + iny + bvc :get + iny + +:get lda (opdata),y + bne :putdp + lda :mode + and #amforce8 + beq :nodp + jmp :bad + +:putdp sta :opcode + stz :evalflag+1 + ldx #$00 + jsr eval + sta :evalflag + bcc :dpok + ldy passnum + beq :p12 +:err plp + sec + rts +:p12 cmp #undeflable + bne :err + lda :mode + bit #amsquare.amround + beq :nodp + lda #00 + xba + lda #forwardref + jmp :err + +:dpok rep $30 + lda lvalue+2 + bne :notdp + lda lvalue + cmp #$0100 + bge :notdp + lda :opcode + jsr putopcode + lda lvalue + jsr putbyte + plp + jmp relcorrect +:notdp lda :mode + and #amround.amsquare + bne :bad + +:nodp rep $30 + lda :mode + and #amforce8.amforce16!$FFFF + clc + adc #$400 + tax + lda addmodetbl,x + and #$FF + cmp #$FF + beq :bad + tay + sep $20 + bit xcflag + bpl :get1 + iny + bvc :get1 + iny +:get1 lda (opdata),y + beq :bad + ldx passnum + beq :p1 + jsr putopcode + bit :evalflag+1 + bpl :p3 + ldx #$00 + jsr eval + bcc :p2 +:plp plp + sec + rts +:p3 lda :evalflag + beq :p2 + plp + sec + rts +:p1 rep $30 + lda :mode + bit #amforce24 + beq :p11 + lda #$04 + plp + jmp incobjptr +:p11 lda #$03 + plp + jmp incobjptr + + mx %10 +:p2 lda lvalue + jsr putbyte + lda lvalue+1 + jsr putbyte + lda :mode + bit #amforce24 + beq :plp1 + lda lvalue+2 + jsr putbyte +:plp1 plp + jmp relcorrect + +:bad rep $30 + lda #badaddress + plp + sec + rts + + mx %00 +:onebyte sep $20 + ldy #1*3 + bit xcflag + bpl :ob1 + iny + bvc :ob1 + iny +:ob1 lda (opdata),y + beq :bad + jsr putopcode + plp + clc + rts + +:imediate rep $30 + lda :mode + and #amforce8.amforce16!$FFFF + tax + lda addmodetbl,x + and #$FF + cmp #$FF + beq :bad + tay + sep $20 + bit xcflag + bpl :get2 + iny + bvc :get2 + iny +:get2 lda (opdata),y + beq :bad + jsr putopcode + lda passnum + beq :putimed + ldx #$00 + jsr eval + bcc :putimed + plp + sec + rts +:putimed lda lvalue + jsr putbyte + lda opflags + bit #mX.mY + bne :indexreg + bit mxflag + bmi :imedout +:puttwo lda lvalue+1 + jsr putbyte + jmp :imedout +:indexreg bit mxflag + bvc :puttwo +:imedout plp + jmp relcorrect + +:mode ds 2 +:opcode ds 2 +:evalflag ds 2 + +putopcode php + rep $30 + inc linerel + sep $30 + pha + lda #cycflag + bit modeflag+1 + beq :pla + lda 1,s + jsr countcycles +:pla pla + xba + jmp put + +putbyte php + sep $30 + xba + inc relout +put lda passnum + bne :p22 + rep $30 + inc objptr + bne :off1 + inc objptr+2 +:off1 inc objoffset + bne :plp1 + inc objoffset+2 +:plp1 plp + clc + rts + + mx %11 +:p22 lda #dumflag + bit modeflag + bne :pass1 +:pass2 rep $10 + ldy objct + cpy objsize + blt :xba + lda #$ff + sta objfull+1 + sta objfull + lda #dskflag + bit modeflag + beq :nostore + tax + rep $20 + lda dskopen + jsr writedsk + bcc :reset + phx + jsr dskerror + plx +:reset txa + sep $20 + jmp :pass2 +:xba xba + eor encval + sta [objzpptr],y + xba + iny + sty objct +:nostore ldy bytesout + xba + sta bytesout+2,y + iny + sty bytesout + bit orgval+3 + bmi :sep + ldy objptr + sty orgval + ldy objptr+2 + sty orgval+2 + xba + lda #$80 + tsb orgval+3 + xba +:sep sep $30 + tay + eor checksum + sta checksum + lda #crcflag + bit modeflag+1 + beq :i2 + tya + jsr calccrc +:i2 lda #%00000001 + tsb listflag+1 + rep $30 + inc totbytes + bne :rel + inc totbytes+2 +:rel bit modeflag-1 ;rel active? + bpl :pass1 + inc reloffset + bne :pass1 + inc reloffset+2 +:pass1 rep $30 + inc objptr + bne :off + inc objptr+2 +:off inc objoffset + bne :plp + inc objoffset+2 +:plp plp + clc + rts + +calccrc rts + +countcycles php ;must set to 16 bit mode + rep $30 + and #$ff + asl + asl + tax + lda cycletbl,x + and #$ff + clc + adc linecycles + sta linecycles + sep $20 + lda mxflag + asl + rol + rol + and cycletbl+1,x + cmp cycletbl+1,x + beq :1 + sed + lda cycletbl+2,x + clc + adc linecycles + sta linecycles + cld + +:1 lda cycletbl+3,x + lsr + bcc :2 + lda mxflag+1 + and #$40 + beq :inc + + bit cycflags + bvc :noavg + inc cycleavg ;put in avg code here + lda cycleavg + and #$01 + beq :inc + jmp :2 +:noavg inc cyclemarks + jmp :2 +:inc sed + lda linecycles + clc + adc #$01 + sta linecycles + cld +:2 + +:done rep $30 + sed + lda linecycles + clc + adc cycles + sta cycles + cld + plp + rts + +relcorrect php + sep $30 + lda passnum + beq :xit1 + lda modeflag + bit #relflag + beq :xit1 + bit #dumflag + bne :xit1 + bit lableused+1 + bmi :xit1 + bit notfound + bmi :xit1 + + rep $30 + ldy relct + cpy #relsize-16 ;just in case!! + blt :setflags +:err1 jmp :err +:xit1 jmp :xit + +:setflags lda #$0f + sta :flags + stz :external + lda noshift ;get low byte of unshifted value + sta :refnum + lda shiftct + beq :l + cmp #$10 + jeq :ff + ldy relout + cpy #$02 + blt :s8 + jmp :ff +:s8 cmp #$08 + bne :l + lda #%01000000 + tsb :flags +:l lda lableused + cmp #$7fff + beq :noext + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldx #$00 + ldy #26 + lda [lableptr],y + and #$10 + beq :noext + tsb :flags + ldy #22 + lda [lableptr],y + sta :refnum + lda #$8000 + tsb :external + lda shiftct + beq :noext + lda #$ff + sta :flags + lda #$4000 + tsb :external +:noext lda relout + cmp #$03 + blt :twobytes + lda #%00100000 + tsb :flags + jmp :insert +:twobytes cmp #$01 + beq :insert + lda #$80 + tsb :flags +:insert ldy relct + lda :flags + sta [relptr],y + iny + lda linerel + sta [relptr],y + iny + iny + lda :refnum + sta [relptr],y + iny + bit :external + bvc :stz + lda #$d0 + bit :external + bpl :noext1 + ora #%00000100 +:noext1 ldx shiftct + cpx #$10 + beq :ffsta + ldx relout + cpx #$02 + blt :ob1 + ora #%00000001 + jmp :ffsta +:ob1 ldx shiftct + cpx #$08 + bne :ffsta + ora #%00000011 +:ffsta sta [relptr],y + iny + lda noshift + sta [relptr],y + iny + iny + lda noshift+2 + sta [relptr],y + iny +:stz sty relct + jmp :xit +:ff lda #$ff + sta :flags + lda #$4000 + tsb :external + jmp :l +:xit sep $30 + lda #$80 + tsb lableused+1 + tsb notfound + rep $30 + stz relout + lda reloffset + sta linerel + plp + clc + rts +:err sep $30 + lda #$80 + tsb lableused+1 + tsb notfound + rep $30 + stz relout + lda reloffset + sta linerel + lda #relfull + plp + sec + rts +:flags ds 2 +:refnum ds 2 +:external ds 2 + +:show1 phx + pha + phy + php + rep $30 + jsr prbyte + lda #$20 + jsr drawchar + plp + ply + pla + plx + rts +:show1cr phx + pha + phy + php + rep $30 + jsr prbyte + lda #$0d + jsr drawchar + plp + ply + pla + plx + rts +:show2 phx + pha + phy + php + rep $30 + jsr prbytel + lda #$20 + jsr drawchar + plp + ply + pla + plx + rts + + +incobjptr php + rep $30 + pha + clc + adc objptr + sta objptr + bcc :offset + inc objptr+2 +:offset pla + clc + adc objoffset + sta objoffset + bcc :xit + inc objoffset+2 +:xit plp + clc + rts + +xref rts + +xlabnum equ 0 +xdoflag equ xlabnum+2 +xlnum equ xdoflag+2 +xlnum1 equ xlnum+2 +xflag equ xlnum1+2 +xend equ xflag+2 + +xrefrec ds 10,0 + +defineall php + sep $30 + jmp define +definelable + php + sep $30 + lda modeflag + and #doflag + beq define + plp + sec ;tell caller do flag is off + rts +define ldy #$00 + lda labstr+1 + cmp #':' + beq :l + cmp #']' + bne :statype + iny +:l iny +:statype rep $30 + sty labtype + lda passnum + jne :pass1 ;bne :pass1 +:pass0 lda #$ffff + sta fllast + jsr findlable + bcc :p0insert + ldy #26 + lda [lableptr],y + bit #variablebit + bne :p0var + bit #entrybit + bne :p0insert + bit macflag-1 + bvs :p0insert + jmp :dup +:p0var ldy #16 + lda [lableptr],y + sta linelable + ldy #28 + lda [lableptr],y + sta varval + lda objptr + sta [lableptr],y + ldy #30 + lda [lableptr],y + sta varval+2 + lda objptr+2 + sta [lableptr],y + jmp :noerr +:p0insert lda objptr + sta labval + lda objptr+2 + sta labval+2 + jsr insertlable + bcs :err ;error returned in A + ldy #16 + lda [lableptr],y + sta linelable + stz varval + stz varval+2 + jmp :noerr +:err pha + jmp :xit + +:pass1 lda #$ffff + sta fllast + jsr findlable + bcc :undef ;not found on second pass + ldy #16 + lda [lableptr],y + sta linelable + ldy #26 + lda [lableptr],y + bit #variablebit + bne :p1var + bit #$20.$10.$08.$04.$01.linkerbit ;ext,macvar,macro, + beq :checkmis ; locals, or linkerequ's + jmp :noerr +:p1var ldy #28 + lda [lableptr],y + sta varval + lda objptr + sta [lableptr],y + ldy #30 + lda [lableptr],y + sta varval+2 + lda objptr+2 + sta [lableptr],y + jmp :noerr +:checkmis ldy #28 + lda [lableptr],y + cmp objptr + bne :misal + ldy #30 + lda [lableptr],y + cmp objptr+2 + beq :noerr +:misal ldy #28 + lda [lableptr],y ;reset object pointer so we don't + sta objptr ;generate more misalign errors + ldy #30 + lda [lableptr],y + sta objptr+$2 + pea #misalignment + jmp :xit +:undef pea #undeflable + jmp :xit +:dup pea #duplable + jmp :xit +:noerr pea #$00 +:xit rep $30 + bit linelable + bmi :geterr + ldy #26 + lda [lableptr],y + and #%111111.linkerbit ;no macvars,externals,equates,macros,variables, + bne :geterr ;locals or linkerequ's... + lda globlab + sta oldglob + ldy #16 + lda [lableptr],y + sta globlab + lda #$0080 + tsb clrglob +:geterr pla + and #$ff + stz fllast + dec fllast + plp + cmp :one + rts +:one dw $01 + +varval ds 4 + +findlabval +findlable + +]ct equ workspace +]offset equ ]ct+$2 +]pos equ ]offset+$2 +]pos1 equ ]pos+$2 +]len1 equ ]pos1+$2 +]len2 equ ]len1+$2 + +:entry php + sep $30 + bit macflag + bvc :normal + lda labstr + jeq :notfound + lda labstr+1 + and #$7f + cmp #']' + beq :normal + cmp #'@' + beq :normal + jsr macfind + bcc :macentry + plp + sec + rts +:normal lda labstr+1 + cmp #'@' + jeq :builtin +:nobuilt lda modeflag + bit #caseflag + beq :macentry + jsr caselable +:macentry stz labtype + stz labtype+1 + lda lablect + ora lablect+1 + beq :notfound + lda labstr + beq :notfound + sta ]len1 + stz ]len1+1 + lda labstr+$1 + cmp #':' ;local lable? + rep $30 + bne :global + lda globlab + bmi :notfound + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #24 + lda [lableptr],y + bmi :notfound ;none defined + sta ]pos + jmp :gloop +:global and #$ff + asl + tax + lda atable,x + bmi :notfound + sta ]pos +:gloop +]lup lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + stz ]offset + lda [lableptr] + and #$0f + sta ]len2 + sep $20 + ldx #$02 ;start at byte 2 + txy +]lup1 cpx #$10 + bge :movefound + cpx ]len1 + blt :1 + beq :1 + jmp :goleft1 +:nf1 lda ]pos + sta fllast +:notfound plp + clc + rts +:1 cpx ]len2 + blt :2 + beq :2 + jmp :goright +:2 lda labstr,x + cmp [lableptr],y + bne :next + iny + inx + jmp ]lup1 +:next blt :goleft + jmp :goright +:goleft1 lda ]len1 + cmp ]len2 + beq :movefound +:goleft rep $30 + ldy #18 + lda [lableptr],y + bmi :nf1 + sta ]pos + jmp ]lup +:goright rep $30 + ldy #20 + lda [lableptr],y + bmi :nf1 + sta ]pos + jmp ]lup + +:movefound rep $30 + lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + plp + sec + rts +:builtin jmp :nobuilt + +caselable php +:doit sep $30 + ldx labstr + beq :xit +]loop ldy labstr,x + lda converttable,y + sta labstr,x + dex + bne ]loop +:xit plp + rts + + +insertlable + +]ct equ workspace +]offset equ ]ct+$2 +]pos equ ]offset+$2 +]pos1 equ ]pos+$2 +]len1 equ ]pos1+$2 +]len2 equ ]len1+$2 + +:entry php + rep $30 + + stz labtype + lda lablect + cmp #maxsymbols ;max number of lables + blt :ne1 + lda #symfull ;symtable full + jmp :error +:ne1 lda labstr + and #$FF + bne :ne2 + lda #badlable + jmp :error +:ne2 bit macflag-1 + bvc :ne22 + lda labstr+1 + and #$7f + cmp #']' + beq :ne12 + plp + jmp macinsert +:ne12 lda labstr + and #$ff +:ne22 sta ]len1 + bit fllast + bmi :ne222 + jmp :fastinsert +:ne222 + lda labstr+$1 ;first byte of string + and #$7F + cmp #':' ;local lable? + beq :local + jmp :global +:local lda #$01 + sta labtype ;b0=Local Lable + lda globlab + bmi :udf + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #24 + lda [lableptr],y + jpl :start + lda globlab + bra :ne3 +:udf lda #undeflable + jmp :error +:ne3 sta ]pos + sta labprev + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #24 + lda lablect + sta [lableptr],y ;set local ptr for GLable + jmp :save +:global ldx #$00 + stx labtype + cmp #']' + bne :asl01 + ldx #$02 + stx labtype +:asl01 asl + tax + lda atable,x + bpl :start + lda #$FFFF + sta ]pos ;no previous + lda lablect + sta atable,x +:save rep $30 + jsr :saveit + bcc :nosave + plp + sec + rts +:nosave lda #$00 + plp + clc + rts +:start sta ]pos +]lup lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + stz ]offset + sep $20 + lda [lableptr] + sta ]len2 + stz ]len2+1 + ldx #$02 ;start at byte 2 + txy +]lup1 cpx #$10 + jeq :error2 + cpx ]len1 + blt :1 + beq :1 + jmp :goleft1 +:1 cpx ]len2 + blt :2 + beq :2 + jmp :goright +:2 lda [lableptr],y + cmp labstr,x + bne :next + iny + inx + jmp ]lup1 +:next rep $30 + blt :goright + jmp :goleft +:goleft1 rep $30 + lda ]len1 + cmp ]len2 + bne :goleft +:replace ldy #26 ;offset to equ value + lda labtype + sta [lableptr],y + iny + iny + lda labval ;replace equate + sta [lableptr],y + iny + iny + lda labval+$2 + and #$00ff + sta [lableptr],y + jmp :nosave +:goleft rep $30 + ldy #18 ;leftptr + lda [lableptr],y + bpl :p1 + lda lablect + sta [lableptr],y + jmp :save +:p1 sta ]pos + jmp ]lup +:goright rep $30 + ldy #20 ;leftptr + lda [lableptr],y + bpl :p2 + lda lablect + sta [lableptr],y + jmp :save +:p2 sta ]pos + jmp ]lup +:error2 rep $30 + lda #badlable +:error plp + sec + rts +:saveit sta labnum + pha + lda ]pos + sta labprev + lda labtype + ora orgor + sta labtype + lda #dumflag + bit modeflag + beq :si1 + lda labtype + ora dumor ;#$8000 + sta labtype +:si1 lda #$FFFF + sta lableft + sta labright + sta lablocal + lda labval+2 + and #$ff + sta labval+2 + pla + sta ]pos ;for movefound + asl + asl + tay + lda nextlableptr + sta [lableptr1],y + sta lableptr + pha ;for mvn below + iny + iny + lda nextlableptr+2 + sta [lableptr1],y + sta lableptr+2 + sep $20 + sta :mvn+1 + rep $20 + ply ;low of destination + tdc + clc + adc #labstr + tax ;source low word + lda #31 ;MVN + phb +:mvn mvn $000000,$000000 + plb + ldy #26 + lda [lableptr],y + bpl :and + inc rellabct +:and bit #localbit + bne :xref + inc globalct +:xref ldx #$00 + jsr xref + jsr inclablect + rts +:fastinsert lda fllast + sta ]pos + ldx #$00 + lda labstr+1 + and #$7f + cmp #':' + beq :filocal + cmp #']' + bne :figlobal +:fivar inx +:filocal inx +:figlobal stx labtype + lda ]pos + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + + ldy #$00 + sep $20 + lda [lableptr] + sta ]len2 + ldy #$02 + tyx ;start at byte 2 +]lup1 cpx #$10 + jeq :error2 + cpx ]len1 + blt :fi1 + beq :fi1 + jmp :figoleft1 +:fi1 cpx ]len2 + blt :fi2 + beq :fi2 + jmp :figoright +:fi2 lda [lableptr],y + cmp labstr,x + bne :finext + iny + inx + jmp ]lup1 +:finext rep $30 + blt :figoright + jmp :figoleft +:figoleft1 rep $30 + lda ]len1 + cmp ]len2 + bne :figoleft +:fireplace rep $30 + ldy #26 ;offset to equ value + lda labtype + sta [lableptr],y + iny + iny + lda labval ;replace equate + sta [lableptr],y + iny + iny + lda labval+$2 + and #$00ff + sta [lableptr],y + jmp :nosave +:figoright rep $30 + ldy #20 + jmp :figo +:figoleft rep $30 + ldy #18 +:figo lda lablect + sta [lableptr],y + jmp :save + + +printlab phy + phx + pha + php + sep $30 + lda labstr + tay + ldx #$01 +]lup cpy #$00 + beq :xit + lda labstr,x + jsr drawchar + inx + dey + jmp ]lup +:xit plp + pla + plx + ply + rts + +drawlables php + rep $30 + lda #$00 + sta :main + sta :recurslev +:loop lda :main + asl + tax + lda #' ' + sta :treechar + lda atable,x + jmi :next + pha + jsr :showtree +:next inc :main + lda :main + cmp #128 + blt :loop + plp + rts +:main ds 2 + +:recurslev ds 2 +:treechar ds 2 + + mx %00 +:showtree inc :recurslev + lda lableptr+2 + pha + lda lableptr + pha + lda 7,s + asl + asl + tay + lda [lableptr1],y + sta lableptr + iny + iny + lda [lableptr1],y + sta lableptr+2 + ldy #18 + lda #'R' + sta :char + lda [lableptr],y + bmi :next1 + pha + jsr :showtree + lda #'L' + sta :char +:next1 jsr :print + lda #'R' + sta :char + ldy #20 + lda [lableptr],y + bmi :done + pha + jsr :showtree +:done pla + sta lableptr + pla + sta lableptr+2 + pla + plx + pha + dec :recurslev + rts + +:char ds 2 + +:print ldy #$00 + sty :offset + lda [lableptr],y + and #$0F + sta :len + sta :bytes + bne :p1 + jmp :pxit +:p1 ldal $E0C061 + bmi :p1 + lda :recurslev + phx + phy + jsr prbyte + lda #' ' + jsr drawchar + lda :char + jsr drawchar + lda #' ' + jsr drawchar + lda :treechar + jsr drawchar + lda #' ' + jsr drawchar + ply + plx + ldx #$01 + iny + phx + phy + lda [lableptr],y + and #$7F + lda #' ' + jsr drawchar + lda #' ' + jsr drawchar + lda #' ' + jsr drawchar + lda :bytes + clc + adc #$03 + sta :bytes +:ply ply + plx +]lup lda [lableptr],y + and #$7F + phx + phy + jsr drawchar + ply + plx + iny + inx + cpx :len + blt ]lup + beq ]lup + lda #$14 + sec + sbc :bytes + tax +]lup lda #' ' + phx + jsr drawchar + plx + dex + bpl ]lup + lda #'$' + jsr drawchar + ldy #28+2 + ldx #$03 +]lup lda [lableptr],y + and #$FF + phx + phy + jsr prbyte + ply + plx + dey + dex + bne ]lup + lda #' ' + jsr drawchar + lda #' ' + jsr drawchar + lda :offset + clc + adc #26 + tay + lda [lableptr],y + jsr prbytel + lda #' ' + jsr drawchar + lda :offset + clc + adc #16 + tay + lda [lableptr],y + jsr prbytel + + lda #$0D + jsr drawchar + ldy #24 ;offset to local labels + lda [lableptr],y + bmi :rts + pha + lda #'/' + sta :treechar + pla + pha + jsr :showtree + pha + lda #' ' + sta :treechar + pla +:rts +:pxit rts + +:len ds 2 +:offset ds 2 +:bytes ds 2 diff --git a/src/merlin_orig.s b/src/merlin_orig.s new file mode 100644 index 0000000..be94a3a --- /dev/null +++ b/src/merlin_orig.s @@ -0,0 +1 @@ +áóí ðèð òå𠤳° óôù æéìåèáîäì嫲 óôø æéìåèáîäìå ðåá ° ßÑÁËåùÁöáéì ðìá âåñ ºë ðèá ßÑÁÇåôÃèáò ðìáºë óôú åòòïòãô óôú ëåùæìáçºçåôìåî ðèá ðèá ðóì æéìåèáîäìå ôìì ¤±¸°² ðìø ðìù êãó ºéîãåòò ãðø £¤°° âîå ºäåã± äåùºäåã± äåøºîïäåã óôø æéìåìåî óôù æéìåìå ìäù £¤°´ ìäá Ûæéìåèáîäìåݬù áîä £¤·æææ » óôá Ûæéìåèáîäìåݬù êóò çåôíåíïòù êãó ºéîãåòò êóò éîéôáóí ìäá £ìéîåâõæ櫱 óôá ìéîåðôò ìäá £Þìéîåâõææ óôá ìéîåðôò«²ºäïðáóó òå𠤳° ìäù £¤°´ ìäá Ûæéìåèáîäìåݬù ïòá £¤¸°°° óôá Ûæéìåèáîäìåݬù ìäù £¤°² ìäá ÛæéìåèáîäìåÝ óôá æéìåðôò ìäá Ûæéìåèáîäìåݬù óôá æéìåðôò«¤² ìäá æéìåìåî óôá æìåî ìäá æéìåìå² óôá æìå² ìäá æìåî ïòá æìå² âîå ºéîéô êíð ºáììäïîå »éæ æéìå éó ° âùôåóºéîéô êóò éîéôðáóóºìéîåìïïð òå𠤳° ðåá ° ßÑÁËåùÁöáéì ðìá âåñ ºîïëåù êóò äïëåùðòåóóºîïëåù óå𠤲° ìäá ðáóóîõí âåñ ºì² ìäá ïâêæõìì âåñ ºì± ìäá £ïâêåãôæõìì êíð ºðåòò±ºì± ìäá òåìïææóåô«² âåñ ºì² ìäá £òåìæìáç âéô íïäåæìáç âåñ ºì² ìäá £òåìæéìåæõìì êíð ºðåòò±ºì² ìäá ðòïäïóåòò âåñ ºì³ ìäá £äïóåòòïò êíð ºðåòò±ºì³ ìäá £¤°± ôòâ íáãæìáç ìäá ðõôõóå âåñ ºäïìéîå ôóâ íïäåæìáç óôú ðõôõóå òå𠤲° óôú ìéîåîõí óå𠤲°ºäïìéîå ìäá äïîåæìáç âåñ ºìéîå êíð ºäïîåðáóóºìéîå òå𠤳° óôú ïðãïäå óôú ìéîåâõææ óôú ìáâóôò óôú ìéîåìáâôøô óôú ãïííåîô óôú ìéîåèáóìáâ ìäá £¤²°²° óôá ïðãïä嫱 óôá ïðãïä嫳 óôá ïðãïä嫵 ìäá £¤ææææ óôá ìéîåìáâìåºôåóô óå𠤳° ìäá íáãæìáç âðì ºóåð »íáã ÷ïòëéîç¿ âéô £¥°°±°°°°° âîå ºéîô âéô £¥°±°°°°°° âåñ ºóåðºåøô êóò åøðáîäíáã êãó ºðåòò± »ôèåòå ÷áó áî åòòïò åøðáîäéîç êíð ºíáãåîôòùºéîô êóò åøðáîäéîô êãó ºðåòò± êíð ºíáãåîôòùºóåð òå𠤳° ìäá ìáóôìåî ãìã áäã æéìåðôò óôá æéìåðôò âã㠺鱠éîã æéìåðôò«²ºé± ìäá æìåî óåã óâã ìáóôìåî óôá æìåî âãó ºôåóô°ºäåã äåã æìå âðì ºòåáäìéîåºóåôæìáç ìäá £¤ææææ óôá äïîåæìáç êíð ºäïîåºôåóô° âîå ºòåáäìéîå ìäá æìå âåñ ºóåôæìáçºòåáäìéîå òå𠤳° »éîãòåíåîô ôèå ìéîå ãïõîôåò éîã ìéîåîõí»äï ôåóôó èåòå®®®®® òå𠤳° ìäá æéìåðôò óôá ðòéîôðôò ìäá æéìåðôò«² óôá ðòéîôðôò«² óå𠤳° ìäù £¤°° ìäá ÛæéìåðôòÝ ôáø ìäá éîðõôôâì¬ø ãí𠣧 § âìô ºóêíð »ôï óáöìåî ½¾ âåñ ºçåôïðãïäå ãí𠣧ª§ âåñ ºã ãí𠣧»§ âåñ ºã êíð ºçìáâåìºã êíð ºãïííåîôºçìáâåì óôá ìáâóôò«± óôá ìéîåèáóìáâ ìäø £¤°±ºçìéîù éîù ìäá Ûæéìåðôòݬù ðèø ôáø ìäá éîðõôôâì¬ø ðìø ãí𠣧 §«± âìô ºçìáâäïîåºãðø ãðø £¤°æ âçå ºçìéîù óôá ìáâóôò«±¬ø éîø êíð ºçìéîùºóêíð êíð ºóáöìåîºãêíð êíð ºãïííåîôºçìáâäïîå ãðø £¤±° âìô ºçì² ìäø £¤°æºçì² óôø ìáâóôò ãí𠣧 § âìô ºóêíðºçåôïðãïäåºçéîù éîù ìäá Ûæéìåðôòݬù ôáø ìäá éîðõôôâì¬ø ãí𠣧 § âìô ºóêíð âåñ ºçéîù ãí𠣧»§ âåñ ºãêíð óôá ïðãïä嫱 ìäø £¤°±ºçïéîù éîù ìäá Ûæéìåðôòݬù ðèø ôáø ìäá éîðõôôâì¬ø ðìø ãí𠣧 §«± âìô ºçïäïîå ãðø £³± âçå ºçïéîù óôá ïðãïä嫱¬ø éîø êíð ºçïéîùºçïäïîå ãðø £³² âìô ºçï² ìäø £³±ºçï² óôø ïðãïäå ãí𠣧 § âìô ºóêíðºçåôïðåòáîäºçéîù± éîù ìäá Ûæéìåðôòݬù ôáø ìäá éîðõôôâì¬ø ãí𠣧 § âìô ºóêíð âåñ ºçéîù± ãí𠣧»§ âåñ ºãïííåîô ìäø £¤°° ðèø äåùºçïéîù± éîù ìäá Ûæéìåðôòݬù ðèø ôáø ìäá éîðõôôâì¬ø ðìø ãí𠣧 § »òåáä éî ôèå òåóô ïæ ôèå ìéîå âìô ºçïôïðåò âåñ ºãèëìéô ãí𠣤²· âåñ ºìéô ãí𠣤²² âåñ ºìéô êíð ºãðø±ºãèëìéô øâá ìäá ±¬ó âîå ºøâá øâá êíð ºçïôïðåòºìéô ãí𠱬ó âåñ ºìéôïææ øâá ìäá ±¬ó âåñ ºó êíð ºøâáºó øâá óôá ±¬ó êíð ºãðø±ºìéôïææ øâá ìäá £¤°° óôá ±¬óºøâá øâáºãðø± ãðø £±²¸ âçå ºçïéîù± óôá ìéîåâõæ櫱¬ø éîø êíð ºçïéîù±ºçïôïðåò ãðø £±²¸ âìô ºçï³ ìäø £±²¸ºçï³ óôø ìéîåâõææ øâá ðìá øâá ãí𠣧 § âìô ºóáöìåî »óèïõìä áì÷áùó âå ôáëåî®®® âîå ºãïííåîôºãïííåîô ìäø ðáóóîõí »ïîìù òåáä ôèå ãïííåîô ïî ðáóó ² âîå ºãð±ºãð° éîù ìäá Ûæéìåðôòݬù ôáø ìäá éîðõôôâì¬ø ãí𠣧 § âçå ºãð° êíð ºóáöìåî âòá ºãð°ºãð± ìäø £¤°°ºãæ± ìäá Ûæéìåðôòݬù ðèø ôáø ìäá éîðõôôâì¬ø ðìø ãí𠣧 § âìô ºóáöãïí âî堺㲠éîù âòá ºã決㲠ìäá Ûæéìåðôòݬù ðèø ôáø ìäá éîðõôôâì¬ø ðìø ãí𠣧 § âìô ºóáöãïí éîù ãðø £±²¸ âç堺㲠óôá ãïííåîô«±¬ø éîø âòᠺ㲺óáöãïí óôø ãïííåîôºóáöìåî éîù óôù ìáóôìåî ìäø ìéîåâõææ ìäá £¤°ä óôá ìéîåâõæ櫱¬ø éîã ìéîåâõææºíáãåîôòù óå𠤳° ìäá ìáâóôò »÷áó ôèåòå á ìáâìå ïò ïòá ïðãïäå »áî ïðãïäå¿ âîå ºðòïãåóó êóò éîéôìéîå ãìã êíð ºðòéîôìéîå »îïôèéîç ôï ðòïãåóó óï êõóô »ìéóô ôèå ìéîå éæ îåãåóóáòùºðòïãåóó êóò éîéôìéîå ìäá ðáóóîõí âåñ ºáì ìäá £ãïîôòïìä âéô ëåùæìáç âåñ ºáì ôòâ ëåùæìáç ìäá ìéóôæìáç áîä £¤¸° óôá ïìäìóôæìáç ìäá ìéóôæìáç åïò £¤¸° óôá ìéóôæìáçºáì êóò áóíìéîå »çï ðòïãåóó ìéîå âãã ºðòéîôìéîå êíð ºðåòòºðåòò± òå𠤳° áîä £¤Æƺðåòò òå𠤳° ðèá ìäá £¤°ä êóò äòá÷ãèáò ìäá ±¬ó êóò áóíåòòïò ìäá ðáóóîõí âåñ ºðåòòðìá ìäá ìéóôæìáç ðèá ïòá £¤¸°¸° áîä £¥°°°±±±°±ß°°°±±±°±¡¤ÆÆÆÆ óôá ìéóôæìáç êóò ðòéîôìéîå ðìá áîä £¤·æææ »ãìåáò ìéîå ìéóô æìáç óôá ìéóôæìáç ìäá £¤°ä êóò äòá÷ãèáòºðåòòðìá ðìá áîä £¤¸° âåñ ºðòéîôìéîå êíð ºáììäïîåºðòéîôìéîå óå𠤲° äï ± ìäá ðáóóîõí âåñ ºîïðò ìäá ìéóôæìá竱 âðì ºîïðò âéô £ìóôäïïî âåñ ºðòéîôíáã ìäá äïìåöåì ïòá äïìåöå쫱 âîå ºîïðò åìóå ìäáì ¤å°ã°¶± âðì ºîïðò êíð ºðòéîô æéîºðòéîôíáã ìäá íáãæìáç âéô £¥°±±°°°°° âåñ ºðòéîô »îï íáãòïó åøðáîäéîç ìäá íïäåæìá竱 âéô £åøðæìáç âîå ºðòéîô ìäá íáãæìáç âéô £¥°°°°°°°± âåñ ºîïðòºðòéîô êóò ðòéîôìéîåºîïðò êíð ºìéîåìïïðºäïîå óå𠤳° ìäá íïäåæìáç áîä £ðõôæìáç®õóåæìáç âåñ ºäïîåðáóó êóò ðõôõóååîä ìäá äïîåæìáç âîå ºäïîåðáóó êíð ºìéîåìïïðºäïîåðáóó òå𠤳° ìäá £ãáîãåìæìáç âéô ëåùæìáç âîå ºðî ìäá íáãæìáç áîä £¤¸° »éó á íáãòï óôéìì éî ðòïçòåóó¿ âåñ ºðî ìäá £¤°ä êóò äòá÷ãèáò ìäá £âáäíáãòï êóò áóíåòòïò ìäá £¤°° êíð ºáóíåòòïõôºðî ìäá ðáóóîõí âîå ºáììäïîå ìäá £¤ÆÆÆÆ óôá ðáóóîõí êíð ºäïðáóó »çï äï îåøô ðáóóºáììäïîå óå𠤳° óôú ðòïäïóåòò óôú ðòïäïóåòò«± êóò ãìïóåäóë âãã ºîäåòò òå𠤳° ðèá ßÑÁÉîãÔïôáìÅòòó ðìá êóò äóëåòòïòºîäåòò òå𠤳° ðåá ° ßÑÁÇåôÔïôáìÅòòó ðìá óôá åòòïòãô óå𠤳° ìäá £ãáîãåìæìáç áîä ëåùæìáç ïòá åòòïòãô ïòá åòòïòãô«± âîå ºáä° âéô ìéóôæìáç âðì ºáä° ìäá £óùíæìáç âéô íïäåæìáç± âåñ ºáä°ºóùíâïìó êóò äòá÷ìáâìåóºáä° òå𠤳° ìäá £¤°°ºéîãåòòºáóíåòòïõô òå𠤳° óôá ºåòòãïäå êóò óèï÷åîäóôò êóò äéóðïóåíåí ìäá £ãáîãåìæìáç áîä ëåùæìáç ôáù ìäá ºåòòãïäå ðìð ãíðì ºïîå òôìºïîå ä÷ ¤°±ºåòòãïäå ä󠲺óùíóôò óôò °ä¬§Ðòéîô Óùíâïì Ôáâì忧¬°¶óèï÷åîäóôò ðèð òå𠤳° ìäá £ãáîãåìæìáç âéô ëåùæìáç êîå ºãò ðóì £ºóôò± ßÑÁÄòá÷Óôòéîç ðóì ôïôâùôåó ðåá ° ðåá ° ßÑÁÄòá÷Äåã ðóì £ºóôò² ßÑÁÄòá÷Óôòéîç ðåá ° ìäá åòòïòãô ðèá ðåá ° ðåá ° ßÑÁÄòá÷Äåã ðóì £ºóôò³ ßÑÁÄòá÷Óôòéîç ðåá ° ìäá ôïôáììéîåó ðèá ðåá ° ðåá ° ßÑÁÄòá÷Äåã ðóì £ºóôò´ ßÑÁÄòá÷Óôòéîç ðåá ° ìäá çìïâáìãô ðèá ðåá ° ðåá ° ßÑÁÄòá÷Äåã ðóì £ºóôòµ ßÑÁÄòá÷Óôòéîç êóò ãáìãôéíåºðìð ðìð òôóºãò ìäá £¤°ä êóò äòá÷ãèáò êíð ºðìðºóôò± óôò °ä¬§Åîä ïæ ÑõéãëÁÓÍ áóóåíâìù® §ºóôò² óôò § âùôåó¬ §ºóôò³ óôò § åòòïòó¬ §ºóôò´ óôò § ìéîåó¬ §ºóôòµ óôò § óùíâïì󮧬°ä¬°äãáìãôéíå ðèð òå𠤳° ðèá ðèá ðèá ßÑÁÅîäÔéíéîç ðìá óôá ºèïõòó ðìá óôá ºíéîõôåó ðìá óôá ºóåãïîäó óôú ºæìáç ðóì £ºóôò± ßÑÁÄòá÷Óôòéîç ìäá ºèïõòó âåñ ºíéîó ðåá ° ðèá ðèá ðåá ° ðåá ° ßÑÁÄòá÷Äåã ðóì £ºóôò² ßÑÁÄòá÷Óôòéîç ìäá ºèïõòó êóò ºðìõòáì éîã ºæìáçºíéîó ìäá ºíéîõôåó âåñ ºóåãó ìäá ºæìáç âåñ ºí± êóò ºóðãºí± ðåá ° ìäá ºíéîõôåó ðèá ðåá ° ðåá ° ßÑÁÄòá÷Äåã ðóì £ºóôò³ ßÑÁÄòá÷Óôòéîç ìäá ºíéîõôåó êóò ºðìõòáì éîã ºæìáçºóåãó ìäá ºæìáç âåñ ºó° ìäá ºóåãïîäó âåñ ºåîä êóò ºóðã êíð ºó±ºó° ìäá ºóåãïîäó âîå ºó± ìäá £§¼§ êóò äòá÷ãèáò ìäá £¤²° êóò äòá÷ãèáò éîã ºóåãïîäóºó± ðåá ° ìäá ºóåãïîäó ðèá ðåá ° ðåá ° ßÑÁÄòá÷Äåã ðóì £ºóôò´ ßÑÁÄòá÷Óôòéîç ìäá ºóåãïîäó êóò ºðìõòáìºåîä ìäá £§®§ êóò äòá÷ãèáò ìäá £¤°ä êóò äòá÷ãèáò êóò äòá÷ãèáò ðìð òôóºðìõòáì ðèð òå𠤳° ãí𠣤°± âåñ ºã ìäá £§ó§ êóò äòá÷ãèáòºã ðìð òôóºóðã ðèð òå𠤳° ìäá £§¬§ êóò äòá÷ãèáò ìäá £§ § êóò äòá÷ãèáò ðìð òôóºæìáç ä󠲺èïõòó ä󠲺íéîõôåó ä󠲺óåãïîäó ä󠲺óôò± óôò §Åìáðóåä ôéíå ½ §ºóôò² óôò § èïõò§ºóôò³ óôò § íéîõô姺óôò´ óôò § óåãïîä§îõíâùôåó ½ ¸ðòéîôìéîå ðèð óå𠤳° óôú ºïâêïõôæìáç óôú ºïâêïõôæìá竱 ìäá ìéóôæìá竱 âéô £¥°°°°°±°° êîå ºåñõáôå ìäá £äõíæìáç âéô íïäåæìáç êîå ºîïïâêãïäå ìäá £¥°°°°°°°± âéô íáãæìáç âîå ºïâêðôò âéô ìéóôæìá竱 êåñ ºîïïâêãïäåºïâêðôò ìäá ìéóôæìá竱 âéô £¥°°±°°°°° âîå ºôòáäò ìäá ìéîåïâêðôò«² êóò ðòâùôåºôòáäò òå𠤳° ìäá ìéîåïâêðôò êóò ðòâùôåì óå𠤳° ìäá £§º§ êóò äòá÷ãèáò ìäá £§ § êóò äòá÷ãèáòºîïïâêðôò òå𠤱° ìäù £¤°° ìäø âùôåóïõô âåñ ºîïïâêãïäå óôø ºïâêïõôæìáç âíé ºçòïõð± ãðø £¤°µ âìô ºïâêìïïð ìäø £¤°´ºïâêìïïð ìäá âùôåóïõô«²¬ù êóò ðòâùôå ãðø £¤°± âåñ ºðìø° ìäá £§ § êóò äòá÷ãèáòºðìø° éîù äåø âîå ºïâêìïïð òå𠤲° ìäá âùôåóïõô óåã óâã £¤°´ âãó ºó± ìäá £¤°°ºó± óôá âùôåóïõô êíð ºîïïâêãïäåºçòïõð± òå𠤳° ôøá áîä £¤·æææ ôáø óå𠤲° ãðø £¤°µ âìô ºïâêìïïð± ìäø £¤°´ºïâêìïïð± ìäá âùôåóïõô«² ðèø êóò ðòâùôå ìäá ±¬ó ãí𠣤°± âåñ ºðìø± ìäá £§ § êóò äòá÷ãèáòºðìø± ðìø äåø âîå ºïâêìïïð± òå𠤳° ìäá âùôåóïõô áîä £¤·æææ óåã óâã £¤°´ âåñ ºú âãó ºïòºú óôú âùôåóïõô êíð ºîïïâêãïäåºïò ïòá £¤¸°°° óôá âùôåóïõô êíð ºîïïâêãïäåºîïïâêãïäå óå𠤳° ìäá ìéóôæìá竱 âéô £âòáîãèìóô âîå ºâòáîãè êíð ºìéîåºâòáîãèª òå𠤳°ª ðåá £±´ª ßÑÁÔáâÔïÃïì óå𠤳° ìäá £§½§ êóò äòá÷ãèáò ìäá âùôåóïõô«³ âðì ºâðïó òå𠤳° ïòá £¤ÆÆ°° êíð ºâðèáºâðïó òå𠤳° áîä £¤ææºâðèá ðèá ìäá ìéîåïâêðôò ãìã áäã £¤°² ãìã áäã ±¬ó ðìø êóò ðòâùôåì êíð ºìéîåºåñõáôå òå𠤳° ðåá £±² ßÑÁÔáâÔïÃïì óå𠤳° ìäá £§½§ êóò äòá÷ãèáò ìäá åñõáôåöá쫲 âåñ ºåñ± êóò ðòâùôåºåñ± ìäá åñõáôåöá쫱 âåñ ºåñ² êóò ðòâùôåºåñ² ìäá åñõáôåöáì êóò ðòâùôåºìéîå òå𠤳° ðåá £²° »ðïó ïæ ìéîå îõíâåò ßÑÁÔáâÔïÃïì óå𠤳° ìäá íïäåæìáç âéô £ðõôæìáç®õóåæìáç âîå ºæéìå ìäá £§ § êóò äòá÷ãèáò êíð ºì±ºæéìå ìäá £§¾§ êóò äòá÷ãèáòºì± òå𠤳° ðåá ° ìäá ìéîåîõí ðèá ðåá ° ðåá ° ßÑÁÄòá÷Äåã ìäá £§ § êóò äòá÷ãèáòª òå𠤳°ª ìäá ôáâóª áîä £¤ææª ðè᪠ßÑÁÔáâÔïÃïìºóð² óå𠤳° ìäá ÛðòéîôðôòÝ áîä £¤·æ ãí𠣧 § êìô ºøéô âåñ ºïðãïäå ãí𠣧»§ âåñ ºãïííåîô ãí𠣧ª§ êåñ ºãïííåîô± ìäù £¤°°Ýìõð ìäá Ûðòéîôðôòݬù áîä £¤·æ ãí𠣧 §«± âìô ºïðãïäå êóò äòá÷ãèáò éîù êíð Ýìõðºïðãïäå òå𠤳° ìäá ôáâó«± áîä £¤ææ ðèá ßÑÁÔáâÔïÃïì ðóì £ïðãïäå ôìì ¤±ã°ã ìäá ôáâó«² áîä £¤ææ ðèá ßÑÁÔáâÔïÃïì óå𠤲° ìäá ìéîåâõææ âåñ ºãïííåîô äåã ìéîåâõææ òå𠤲° ðóì £ìéîåâõææ ôìì ¤±ã°ãºãïííåîô òå𠤳° ìäá ôáâó«³ áîä £¤ææ ðèá ßÑÁÔáâÔïÃïìºãïííåîô± òå𠤳° ðóì £ãïííåîô ôìì ¤±ã°ãºøéô òå𠤳° êóò ðòéîôãùãìåó ìäá £¤°ä êóò äòá÷ãèáò êóò ãèåãëðáõóåºôòõîã òå𠤳° ìäá ðáóóîõí êåñ ºðìð ìäá ºïâêïõôæìáç êåñ ºðìð ìäá âùôåóïõô êåñ ºðìð ìäá ìéóôæìá竱 âéô £¥°°°°°°±° êîå ºðìð âéô £¥°°°°°°°± êåñ ºðìð ìäá £¤ææææ óôá ºãòïõô ìäá ìéîåïâêðôò ãìã áäã £¤°´ óôá ìéîåïâêðôò âãã ºô° éîã ìéîåïâêðôò«²ºô° ìäá âùôåóïõô êíé ºçòïõð² ìäá £¤°¶ óôá ºðïó êíð ºô²ºô± òå𠤳° ìäá ìéîåïâêðôò ãìã áäã £îõíâùôåó óôá ìéîåïâêðôò âãã ºô² éîã ìéîåïâêðôò«²ºô² ìäá âùôåóïõô êåñ ºôãòïõô óå𠤳° ìäá ìéóôæìá竱 âéô £¥°°±°°°°° âîå ºôòáäò± ìäá ìéîåïâêðôò«² êóò ðòâùôåºôòáäò± òå𠤳° ìäá ìéîåïâêðôò êóò ðòâùôåì óå𠤳° ìäá £§º§ êóò äòá÷ãèáò ìäá £§ § êóò äòá÷ãèáò ìäø £¤°°ºôìõð ìäá âùôåóïõô êåñ ºôãòïõô ãðø £îõíâùôåó âçå ºôãò ìäù ºðïó ìäá âùôåóïõô¬ù êóò ðòâùôå ìäá £¤²° êóò äòá÷ãèáò éîø éîã ºðïó äåã âùôåóïõô óôú ºãòïõô êíð ºôìõðºôãò ìäá £¤°ä êóò äòá÷ãèáò ìäá £¤ææææ óôá ºãòïõô êóò ãèåãëðáõóå êíð ºô±ºôãòïõô ìäá ºãòïõô âîå ºôã ìäá £¤°ä êóò äòá÷ãèáò êóò ãèåãëðáõóåºôã êíð ºðìðºçòïõð² òå𠤳° ìäá âùôåóïõô áîä £¤·æææ óôá âùôåóïõô ìäá £¤ææææ óôá ºãòïõô êíð ºô²±ºô±± òå𠤳° ìäá ìéîåïâêðôò ãìã áäã £îõíâùôåó óôá ìéîåïâêðôò âãã ºô²± éîã ìéîåïâêðôò«²ºô²± ìäá âùôåóïõô âåñ ºôãò±² óå𠤳° ìäá ìéóôæìá竱 âéô £¥°°±°°°°° âîå ºôòáäò±± ìäá ìéîåïâêðôò«² êóò ðòâùôåºôòáäò±± òå𠤳° ìäá ìéîåïâêðôò êóò ðòâùôåì óå𠤳° ìäá £§º§ êóò äòá÷ãèáò ìäá £§ § êóò äòá÷ãèáòºôìõð± òå𠤳° ìäø £¤°°ºôìõð±² ìäá âùôåóïõô âåñ ºôãò±² ãðø £îõíâùôåó âçå ºôãò± ìäá âùôåóïõô«² ðèø êóò ðòâùôå ìäá £¤²° êóò äòá÷ãèáò óôú ºãòïõô ðìø éîø äåã âùôåóïõô êíð ºôìõ𱲺ôãò± ìäá £¤°ä êóò äòá÷ãèáò ìäá £¤ææææ óôá ºãòïõô êíð ºô±±ºôãò±² âéô ºãòïõô âíé ºðìð ìäá £¤°ä êóò äòá÷ãèáòºðìð ðìð òôóºðïó ä󠲺ãòïõô ä󠲺ïâêïõôæìáç äó ²ðòéîôãùãìåó ðèð óå𠤳° ìäá £ãùãæìáç âéô íïäåæìá竱 âîå ºóèï÷ºøéô ðìð òôóºóèï÷ ìäá ìéîåãùãìåó âåñ ºøéô òå𠤳° ðåá £·± »ãïìõíî æïò ãùãìå ãïõîô ßÑÁÔáâÔïÃïì óå𠤳° ìäá £¤²° êóò äòá÷ãèáò ìäá ìéîåãùãìåó áîä £¤°æ ïòá £¤³° êóò äòá÷ãèáò ìäá £§ § ìäù ãùãìåíáòëó âåñ ºä± ãðù £¤°² âçå º² ìäá £¤²· êíð ºä±º² ìäá £¤²²ºä± êóò äòá÷ãèáò ìäá £§¬§ êóò äòá÷ãèáò âéô ãùãæìáçó âíé ºíø òå𠤳° ìäá ãùãìåó êóò ðòâùôåì êíð ºøéô íø ¥±±ºíø âéô íøæìáç âíé ºí± âöã ºí°ø° ìäá £¤°± êóò ðòâùôå êíð ºøéôºí°ø° ìäá £¤°° êóò ðòâùôå êíð ºøéôºí± âöã ºí±ø° ìäá £¤±± êóò ðòâùôå êíð ºøéôºí±ø° ìäá £¤±° êóò ðòâùôå êíð ºøéôäïëåùðòåóó ðèð òå𠤳° ðåá ° ßÑÁËåùÁöáéì ðìá âåñ ºãìã ðèá ßÑÁÇåôÃèáò ðìá óå𠤲° áîä £¤·æ øâá óôá ëåùíïä øâá ãí𠣤²° âîå ºîïðáõóåºðáõóå ìäá £ðáõóåæìáç ôóâ ëåùæìáç óå𠤲° êíð ºóåãºîïðáõóå ãí𠣤±â âåñ ºãáîãåì ãí𠣧禤¹æ âîå ºìéóôºãáîãåì ìäá £¤ææ óôá äïîåæìáç óôá äïîåæìá竱 óôá ðáóóîõí óôá ðáóóîõí«± ìäá £ðõôæìáç®õóåæìáç ôòâ íïäåæìáç ìäá £ãáîãåìæìáç ôóâ ëåùæìáç òå𠤳° ðèø ðåá ¤ÆÆÆÆ ßÑÁÓåôÃáîãåìÆìáç ðìø óå𠤳° êíð ºóåãºìéóô ãí𠣧ħ¦¤¹æ âîå ºóåã ìäá £ãïîôòïìä ôóâ ëåùæìáçª óôá ëåùæìáç êíð ºóåãºãìã ðìð ãìã òôóºóåã ðìð óåã òôóëåùíïä äó ²ãèåãëðáõóå ðèð òå𠤳° ìäá £ðáõóåæìáç âéô ëåùæìáç âåñ ºðåòòðìá ôòâ ëåùæìáç ìäá £ãáîãåìæìáç âéô ëåùæìáç âîå ºðåòòðìáºëì± êóò äïëåùðòåóó âãã ºë챺ðåòòðìá ðìð òôóçåôíåíïòù ðèð òå𠤳° óôú ºðõòçåæìáç óôú ìáâìåðôò óôú ìáâìåðôò«¤² óôú ìáâìåðôò± óôú ìáâìåðôò±«¤² óôú îåøôìáâìåðôò óôú îåøôìáâìåðôò«² óôú ïâêèäì óôú ïâêèä쫤² óôú ïâêúððôò óôú ïâêúððôò«¤² óôú òåìðôò óôú òåìðôò«¤² óôú íáãðôò óôú íáãðôò«² ìäá £éîéôïâêóéúå óôá ïâêóéúå ðåá ° ßÑÁÌéîëåòÁãôéöå ðìá êåñ ºîïòíáì ðóì £¤°° ðóì £¤°° ðåá ° ðóì £¤°° ßÑÁÇåôÓùíÔáâìå ðìì îåøôìáâìåðôò ðìá óôá ìáâìåãô ðìì ìéîëóùíèäì ðìì ìéîëóùíôâì ìäá ìéîëóùíèäì ïòá ìéîëóùíèä쫲 êåñ ºîïòíáì ìäá ìéîëóùíôâì ïòá ìéîëóùíôâ쫲 êåñ ºîïòíáì ìäù £¤°°Ýìõð ìäá Ûìéîëóùíôâìݬù óôá áôáâìå¬ù éîù éîù ãðù £±²¸ª² âìô Ýìõð ìäá ìéîëóùíèäì óôá ÷ïòëóðáãå ìäá ìéîëóùíèä쫲 óôá ÷ïòëóðáã嫲 ìäù £¤°² ìäá Û÷ïòëóðáãåÝ ôáø ìäá Û÷ïòëóðáãåݬù óôá ìáâìåðôò±«² óôø ìáâìåðôò± êíð ºáììºîïòíáì òå𠤳° ìäá £¤ææææ óôá ìáâìåãô »óï íåíïòù éó áììïãáôåä êóò éîãìáâìåãô âãã ºóùíïë ðìð óåã òôóºóùíïë òå𠤳° ìäø £¤°° ìäá £¤ÆÆÆÆÝìõð óôá áôáâìå¬ø éîø éîø ãðø £±²¸ª² âìô Ýìõðºí± ðóì £¤°° ðóì £íáøóùíâïìóª´ ìäá õóåòéä ïòá £áóííåíéä ðèá ðåá ¤¸°°° »ìïãëåä ðáçå áìéçîåä ðóì £¤°° ôìì ¤°¹°² ðìø ðìù âãã ºí±ïõô êóò ºðõòçå âãã ºí± êíð ºåòòºí±ïõô óôø ÷ïòëóðáãå óôù ÷ïòëóðáã嫲 ìäù £¤°² ìäá Û÷ïòëóðáãåÝ óôá ìáâìåðôò± ìäá Û÷ïòëóðáãåݬù áîä £¤°°ÆÆ óôá ìáâìåðôò±«¤² òå𠤳° ìäá £¤°°°° ôáùÝìõð óôá Ûìáâìåðôò±Ý¬ù éîù éîù ãðù £íáøóùíâïìóª´ âìô Ýìõðºáìì òå𠤳°ºç± ðóì £¤°° ðóì £éîéôïâêóéú嫱 ìäá õóåòéä ïòá £áóííåíéä ðèá ðåá ¤¸°°° »ìïãëåä ðáçå áìéçîåä îï âáîë ãòïóó ðóì £¤°° ôìì ¤°¹°² ðìø ðìù âãã ºí²ïõô êóò ºðõòçå âã㠺籠êíð ºåòòºí²ïõô êãó ºøéô óôø ïâêèäì óôø ÷ïòëóðáãå óôù ïâêèä쫲 óôù ÷ïòëóðáã嫲 ìäù £¤°² ìäá Û÷ïòëóðáãåÝ óôá ïâêúððôò ìäá Û÷ïòëóðáãåݬù óôá ïâêúððôò«¤² ìäá £¤°°°° ìäù £¤°°°°Ýìõð óôá Ûïâêúððôòݬù éîù éîù âåñ ºîåøô ãðù ïâêóéúå âìô Ýìõðºîåøô òå𠤳° ðóì £¤°° ðóì £íáãóéúå ìäá õóåòéä ïòá £áóííåíéä ðèá ðåá ¤¸°°° ðóì £¤°° ôìì ¤°¹°² ðìø ðìù âãã ºí³ïõô êóò ºðõòçå âãã ºîåøô êíð ºåòòºí³ïõô óôø íáãðôò óôù íáãðôò«² ìäù £°² ìäá ÛíáãðôòÝ ôáø ìäá Ûíáãðôòݬù óôá íáãðôò«² óôø íáãðôò óôú íáãöáòðôò ìäá £¤°°ºøéô òå𠤳°ºåòò ðìð ãíð ºïîå òôóºïîå ä÷ ¤°±ºðõòçåæìáç ä󠲺ðõòçå âéô ºðõòçåæìáç âíé ºðóåã êíð ºðóåã óåã òïò ºðõòçåæìáç ðåá ¤°° ôìì ¤±³°² »ðõòçåáìì ôìì ¤±æ°² »ãïíðáãôíåí ãìã òôóºðóåã óåã òôóäéóðïóåíåí ðèð òå𠤳° ìäáì õóåòéä ïòá £íåíéä ðèá ßäéóðïóåáìì ìäáì õóåòéä ïòá £ðõôéä ðèá ßäéóðïóåáìì ìäáì õóåòéä ïòá £õóåéä ðèá ßäéóðïóåáìì ðìð òôóéîéôáóí ðèð òå𠤳° óôú òåììáâãô ßÑÁÉîéôÔïôáìÅòòó ðóì £¤°° ðåá £öôïïìíáãó ßÑÁÇåôÖåãôïò ðìì åøôíáãðôò ðåá ° ßÑÁÌéîëåòÁãôéöå ðìá âåñ ºîïòí ìäá ìáâìåãô óôá çìïâáìãô âòá ºáììºîïòí óôú çìïâáìãôºáìì óôú ëåùæìáç óôú ðáóóîõí óôú åøôãïõîô óôú åîôãïõîô óôú ôïôáììéîåó óôú íáãìïãáì óôú íáãöáòðôò óôú ðòïäïóåòò óôú åòòïòãô óôú äóëïðåî óôú äóë÷òéôå óôú äóëåïæðáòí óôú äóëðáôè óôú äóëãìïóå óôú ïâêæõìì óôú ôéôìåóôò ìäá £¤°¶ óôá ïâêôùðå ìäø £¤°°°°Ýìõð óôú ðõôâõææåò¬ø óôú õóåâõææåò¬ø éîø éîø ãðø £íáøðõôª±¶ âìô Ýìõð ìäø £¤°°°°Ýìõð óôú ìõðâõææåò¬ø éîø éîø ãðø £íáøìõ𪱶 âìô Ýìõð ßÑÁÓôáòôÔéíéîç êóò òáîäïíéúå ðìð òôóºó äó ²éîéôðáóó ðèð óå𠤳° óôú åîãöáì óôú ðõôõóå óôú íáãæìáç óôú ãèåãëóõí óôú ãò㱶 óôú ãò㱶«± óôú ãùãæìáçó ìäá £¤ÆÆ óôá ôâøáîä ìäá £¥±±°°°°°°  »æõìì îáôéöå íïäå óôá øãæìáç óôú íøæìáç òå𠤳° äï ïìäóèåìì ìäø çïææóåô ìäá éäáãôéöå¬ø âéô £ìéîëæìáç âåñ ºîïìéîë åìóå êíð ºîïìéîë æéî äï ïìäóèåìì ìäá ìéîëìóôæìáç¬ø óå𠤳° áîä £¥±°°°°°°° ïòá £¥°±°°°°°° êíð ºìéîëåîô æéîºîïìéîë óå𠤳° ìäá £¥±±°°°°°°ºìéîëåîô óôá ìéóôæìáç »âïôè ìéóô áîä ìóôäï ÏΠìäá £ãïîôòïìä áîä ëåùæìáç åïò ìéóôæìáç óôá ìéóôæìáç ìäá £ãïîôòïìä ôòâ ëåùæìáç òå𠤳° ìäá ðáóóîõí âåñ ºð±íïäå ìäá £äóëæìá硤ÆÆÆÆ ôòâ íïäåæìáç êíð ºð²íïäåºð±íïäå óôú íïäåæìáçºð²íïäå ìäá £åøðæìá窲µ¶®ãáóåæìáç ôóâ íïäåæìáç óôú íïäåæìáç± óôú äïîåæìáç óôú äïìåöåì óôú íáãìåöåì óôú ðõôìåöåì óôú õóåìåöåì óôú ìéîåîõí óôú äïíáóë óôú ãùãìåó óôú ìéîåãùãìåó óôú ãùãìåíáòëó óôú ãùãìåáöç ìäá £¤ææææ óôá çìïâìáâ óôá ïìäçìïâ óôú äõíïò »æïòãå ôï áâóïìõôå ìäá £¤¸°°° óôá ïòçïò óôá ïâêðôò óôá ïòçöáì óôá ïìäïâê óôú ïâêðôò«² óôú ïòçöá쫲 óôú ïìäïâꫲ óôú ïâêãô óôú ïâêïææóåô óôú ïâêïææóåô«² óôú ïìäïææóåô óôú ïìäïææóåô«² óôú òåìïææóåô óôú òåìïææóåô«² óôú ôïôâùôåó óôú ôïôâùôåó«² óôú äïîåæìáç óôú ìáóôìåî óôú äóæéìì óôú äóïææóåô óôú åòòöáìéä óôú åòòáääòåóó óôú åòòáääòåóó«² óôú ìõðìåöåì ðìð òôóéîéôìéîå ðèð ìäá ðáóóîõí âîå ºðáóó²ºðáóó± òå𠤳° ìäá £¤ÆÆÆÆ óå𠤳° òå𠤳°ºêíð êíð ºáììºðáóó² óå𠤳° ìäá ìéóôæìáç óôá ìéóôæìá竱 òå𠤳° óôú âùôåóïõô óôú òåìïõô ìäá òåìïææóåô óôá ìéîåòåì éîã ôïôáììéîåó óôú ìéîåãùãìåó óôú ãùãìåíáòëóºáìì òå𠤳° ìäá £¤ÆÆÆÆ óå𠤳° óôú ãìòçìïâ óôú æïòãåìïîç óôá îïôæïõîä òå𠤳° óôú ïðæìáçó óôú íåòòãïäå óôá æììáóô óôá ìáâìåõóåä ìäá ïâêðôò óôá ìéîåïâêðôò ìäá ïâêðôò«² óôá ìéîåïâêðôò«²ºøéô ðìð òôóéîãìáâìåãô ðèð òå𠤳° éîã ìáâìåãô ìäá ìáâìåãô áîä £¥±±±±±±±± âîå ºîïòíáì ðóì £¤°° ðóì £¤²°°° ìäá õóåòéä ïòá £áóííåíéä ðèá ðåá ¤¸°°´ »ðáçå áìéçîåä¯ìïãëåä ðóì £¤°° ôìì ¤°¹°² ðìø ðìù êãó ºóåã óåé ðåé ° ðåé ² óôø ° óôù ² ìäù £¤°² ìäá Û°Ý óôá îåøôìáâìåðôò ìäá Û°Ý¬ù óôá îåøôìáâìåðôò«² ðìá óôá ² ðìá óôá ° êíð ºòôóºîïòíáì ìäá îåøôìáâìåðôò ãìã áäã £³² óôá îåøôìáâìåðôò âãã ºòôó éîã îåøôìáâìåðôò«²ºòôó ðìð ãìã òôóºóåã ìäá £óùíæõìì ðìð óåã òôóáóíìéîå ðèð óå𠤳° ìäá íáãæìáç âðì ºáóíìéîå áîä £¤·å âîå ºáóíìéîå êóò äåæéîåíáãòï âãó ºó ðìð ãìã òôóºó ðìð óåã òôóºáóíìéîå ìäá íïäåæìáç âéô £ìõðæìáç âåñ ºìâ êóò ãèåãëìõð »óåôõð ÌÕÐ ìáâìåºìâ ìäá ìáâóôò ïòá ïðãïäå âîå ºáóí ìäá £îïåòòïò êíð ºãìãºáóí ìäá ìáâóôò »÷áó á ìáâìå äåæéîåä¿ âåñ ºïðãïäåºäïìáâìå ìäù ðáóóîõí âåñ ºðáóóïîå ìäá ìáâóôò«± »çåô ôèå æéòóô ãèáò ãí𠣧º§ âîå ºðáóóïîå »ìïãáì ìáâìå¿ ìäù äïìåöåì âîå ºïðãïäå ìäù äïìåöå쫱 âîå ºïðãïäå âéô çìïâìá⫱ »áîù çìïâáì ìáâåìó äåæéîåä¿ âðì ºïðãïäå ìäá £õîäåæìáâìå êíð ºãìãºðáóóïîå êóò äåæéîåìáâìå âãã ºïðãïäå ôáù ìäá íïäåæìáç áîä £äïæìáç âîå ºïðãïäå ãðù £äõðìáâìå âåñ ºíéó ãðù £íéóáìéçîíåîô âåñ ºíéó ìäá íáãæìáç áîä £¥±±°°°°°° ãíð £¥±±°°°°°° âîå ºâéô êíð ºíéóºíéó ìäá ïðãïäå âåñ ºâéô óôù íåòòãïäå êóò çåôïðãïäå óå𠤳° ìäù íåòòãïäå êíð ºâéôºïðãïäå ìäù ïðãïäå âåñ ºâéô êóò çåôïðãïäå óå𠤳° âãó ºãìãºîïïð ìäá £¤°°ºãìã ôáùºâéô âéô ãìòçìïâ âðì ºøéô âöã ºøéô ìäá ïìäçìïâ óôá çìïâìáâ ìäá ïìäçìï⫱ óôá çìïâìá⫱ºøéô òå𠤳° ôùá áîä £¤ææ ðìð ãíð ºïîå òôóºïîå ä÷ ¤°°°±çåôïðãïäå  »ÁÌ×ÁÙÓ òåôõòîó éî ±¶ âéô íïäå óå𠤳° óôú æïòãåìïîç ìäá ïðãïäå âîå º± òå𠤳° ãìã òô󺱠òå𠤳° ìäá ïðãïä嫤± øâá óå𠤳° áóì áóì áóì òå𠤲° áóì áóì áóì óôá ÷ïòëóðáãå ìäá ïðãïä嫤´ áîä £¤µÆµÆ âåñ ºãìã ãí𠣤´Ã âåñ ºìáóô ãí𠣤´Æ´´ âåñ ºìáóô óå𠤲° óåã òïò æïòãåìïîç òå𠤲°ºãìã ãìãºìáóô ìäá ïðãïä嫤³ áîä £¤±Æ òïì ïòá ÷ïòëóðáãå òå𠤳° ôáù »îï÷ çåô ôèå ôáâìå ïææóåô ìäá ïðãïä嫱 áîä £¤±æ áóì ôáø ôùá êóò ¨ïðãïäåìïïëõð¬ø© âãã ºïð óôá ïðãïäå÷ïòä êíð ºíáãóºïð óôá ïðãïäå÷ïòä óôù ïðäáôá óôù ºêí𫱠óôø ïðæìáçó âéô æïòãåìïîç­± âðì ºîïòíïð êóò äïíáã± âãó ºíæïõîäºîïòíïð óå𠤳° âéô øãæìáç âöó ºïðæ »¶µ¸±¶ íïäå¿ âíé º¶µã°² âéô ïðæìáçó«± âíé ºâáäïð âöã ºïðæ êíð ºâáäï𺶵㰲 âéô ïðæìáçó«± âöó ºâáäïðºïðæ ìäá ïðæìáçó«± âéô £¾íáãòï âîå ºãïîä âéô £¾ãïîäéôéïîáì âîå ºãïîä øâá ìäá £äïæìáç âéô íïäåæìáç âîå ºîïåòò øâá âéô £¾âòáîãè âîå ºâòáîãè âéô £¾ïîåâùôå âîå ºïîåâùôå âéô £¾çåîåòáì âîå ºçåîåòáìºãïîä òå𠤳°ºêíð êíð ¤ÆÆÆƺïîåâùôå òå𠤳° ìäá ïðäáôá êíð ðõôïðãïäåºçåîåòáì òå𠤳° êíð çåîåòáìïðºâòáîãè òå𠤳° ìäá ïðäáôá êíð äïâòáîãèºîïåòò òå𠤳° ãìã òôóºâáäïð òå𠤳° ìäá £âáäïðãïäå óåã òôóºíæïõîä òå𠤳° ìäá £¤ÆÆÆÆ êíð ºí±ºíáãó òå𠤳° ìäá £¤°°°° »÷å îååä ôï óåáòãèºí± êóò äïíáãòïó òôóäïíáãòïó ðèð  »åîôåò ÷éôè ¤°° éî Á ôï óåáòãè óå𠤳° »ïôèåò÷éóå ìáâìåðôò íõóô ðïéîô ôáù ìäá £äïæìáç »ôï ôèå íáãòï ôï âå åøðáîäåä âéô íïäåæìáç âåñ ºïë ðìð ãìã òôóºïë ôùá ãí𠣤°° âîå ºîïæéîä ìäø ïðãïäå ãðø £¤±° âìô ºíïöå ìäø £¤°æºíïöå ìäá ïðãïäå¬ø óôá ìáâóôò¬ø äåø âðì ºíïöå ìäá íáãæìáç óôá ºíæìáç óôú íáãæìáç êóò æéîäìáâìå ìäù ºíæìáç óôù íáãæìáç âãã ºâõéìôéî »îïô æïõîä óï ôòù âõéìô éî íáãó âãã ºâáä òå𠤲° ìäù £²¶ ìäá Ûìáâìåðôòݬù áîä £¤¸°°´ ãí𠣤¸°°´ âîå ºóåãºîïæéîäºóåôõð óå𠤳° ìäá íáãæìáç óôá ºíæìáç ìäá £¤ã± »åøðáîä áîä éîéô ôóâ íáãæìáç ìäù £¤°° óôù íáãöáòðïó óôù íáãöáòðïó«± êóò éîéôíáã âãã ºãìã ìäù ºíæìáç óôù íáãæìáç ðìð óåã òôóºãìã òå𠤳° ðìð ãìã òôóºâáä òå𠤳° ìäá £âáäïðãïäå ðìð óåã »òåôõòî ãìåáò éæ èáîäìåä ïðãïäå òôóºóåã òå𠤳° ìäá £îïôíáãòï ðìð óåã »òåôõòî ãìåáò éæ èáîäìåä ïðãïäå òôóºíæìáç ä󠲺âõéìôéî óå𠤳° ìäá £ôâøæìáç âéô íïäåæìá竱 âîå ºâïëºâä êíð ºâáäºâä± êíð ºâï뱺âïë ìäá ïðãïäå ãí𠣤°² âìô ºâä ìäá ïðãïä嫱 ãí𠣧ߧ âîå ºâä± ìäá ïðãïä嫲 áîä £¤µæ ãí𠣧Á§ âìô ºâä± ãí𠣧ڧ«± âçå ºâä± ãí𠣧Ч âåñ ºäï󱶠ãí𠣧ǧ âîå ºîïäïó ìäù ïðãïäå ãðù £· âìô ºîïäïó ìäù £¤°³Ýì ìäá ïðãïäå¬ù ãí𠣧º§ âåñ ºãíð± áîä £¤µæºãíð± ãíð ºçóïóóôò¬ù âîå ºîïäïó± éîù ãðù £¤°· âìô Ýì êíð ºçóïóºäï󱶠ìäù ïðãïäå ãðù £¶ âìô ºîïäïó ìäù £¤°³Ýì ìäá ïðãïäå¬ù ãíð ºäïó±¶óôò¬ù âîå ºîïäïó± éîù ãðù £¤°¶ âìô Ýì êíð ºäï󱶱ºîïäïó± ìäá ïðãïä嫲 áîä £¤µæºîïäïó òå𠤳° áîä £¤ææ óåã óâã £§Á§ áóì áóì ôáù ìäá åøôíáãðôò ïòá åøôíáãðôò«² âåñ ºâä± ìäá åøôíáãðôò óôá ÷ïòëóðáãå ìäá åøôíáãðôò«² óôá ÷ïòëóðáã嫲 ðèù ìäù £¤°´ ìäá Û÷ïòëóðáãåݬù ïòá £¤¸°°° óôá Û÷ïòëóðáãåݬù ìäù £¤°² ìäá Û÷ïòëóðáãåÝ óôá ÷ïòëóðáãå«´ ìäá Û÷ïòëóðáãåݬù óôá ÷ïòëóðáã嫶 ðìù ìäá Û÷ïòëóðáã嫴ݬù ôáø éîù éîù ìäá Û÷ïòëóðáã嫴ݬù ôáù ôøá ãìã áäã ÷ïòëóðáãå«´ óôá ÷ïòëóðáãå«´ ôùá áäã ÷ïòëóðáã嫶 óôá ÷ïòëóðáã嫶ºíáéî óå𠤳° ìäá Û÷ïòëóðáãå«´Ý âåñ ºîæ± óôá ºìåîçôè óôú ºìåîçô諱 ìäù £¤°± ìäá Û÷ïòëóðáã嫴ݬù ãíð ïðãïäå âîå ºîåøô ìäù £¤°´ »îï÷ ÷å§òå áô ôèå æéòóô ãèáò ôï ÃÍРìäø £¤°²ºæéîä ìäá Û÷ïòëóðáã嫴ݬù áîä £¤·æ ãíð ïðãïäå­±¬ù âåñ ºéîø áîä £¤µæ »óåô ôï õððåòãáóå ãíð ïðãïäå­±¬ù âåñ ºéîø ïòá £¤²° ãíð ïðãïäå­±¬ù âîå ºîåøôºéîø éîù éîø ãðø ïðãïäå âìô ºæéîä êíð ºæïõîäºîåøô òå𠤳° ìäá ºìåîçôè ãìã áäã ÷ïòëóðáãå«´ óôá ÷ïòëóðáãå«´ âãã ºíáéî éîã ÷ïòëóðáã嫶 êíð ºíáéîºîæ± òå𠤳° ìäù £¤°´ ìäá Û÷ïòëóðáãåݬù áîä £¤·ÆÆÆ óôá Û÷ïòëóðáãåݬù êíð ºâá䱺æïõîä òå𠤳° ìäù £¤°± ìäá Û÷ïòëóðáã嫴ݬù áîä £¤ææ éîã éîã »ôï áããïõîô æïò ôèå ô÷ï ìåî âùôåó ôáù ìäá Û÷ïòëóðáã嫴ݬù ðèá ìäù £¤°´ ìäá Û÷ïòëóðáãåݬù áîä £¤·ÆÆÆ óôá Û÷ïòëóðáãåݬùºîõí ìäá £¤²´°¶ »ìåîçôè áîä §¤§ óôá ìéîåâõææ óå𠤳° ìäù £¤°² ìäá ²¬ó ìóò ìóò ìóò ìóò ïòá £§°§ ãí𠣧¹§«± âìô ºïë± áäã £§Á§­§¹§­²ºïë± óôá ìéîåâõææ¬ù éîù ìäá ²¬ó áîä £¤°æ ïòá £§°§ ãí𠣧¹§«± âìô ºïë² áäã £§Á§­§¹§­²ºïë² óôá ìéîåâõææ¬ù éîù ìäá ±¬ó ìóò ìóò ìóò ìóò ïòá £§°§ ãí𠣧¹§«± âìô ºïë³ áäã £§Á§­§¹§­²ºïë³ óôá ìéîåâõææ¬ù éîù ìäá ±¬ó áîä £¤°æ ïòá £§°§ ãí𠣧¹§«± âìô ºïë´ áäã £§Á§­§¹§­²ºïë´ óôá ìéîåâõææ¬ù ìäá £¤°ä óôá ìéîåâõæ櫶 òå𠤳° ðìá »òåíïöå æòïí óôáãë ìäá £ôììôøô± ìäø £Þôììôøô± êóò éîéôéîôåòîáì óôú ìéîåâõææ âãã ºâãã êíð ºâóåãºâïë± òå𠤳° ìäá ïðãïäå÷ïòä êóò íáãôâì âãó ºâáä± ôøá ôùø êóò éîéôéîôåòîáì âãã ºâããºâóåã ðìð óåã òôóºâãã ðìð ãìã òôóºâáä± òå𠤳° ìäá £âáäïðãïäå ðìð óåã »òåôõòî ãìåáò éæ èáîäìåä ïðãïäå òôóºäï󱶱 òå𠤳° ìäá £§Ú§«±­§Á§ êíð ºáóìºçóïó òå𠤳° ìäá £§Ú§«²­§Á§ºáóì áóì áóì ôáù òå𠤳° ìäá åøôíáãðôò ïòá åøôíáãðôò«² êåñ ºâä± ìäá åøôíáãðôò óôá ÷ïòëóðáãå ìäá åøôíáãðôò«² óôá ÷ïòëóðáã嫲 ðèù ìäù £¤°´ ìäá Û÷ïòëóðáãåݬù ïòá £¤¸°°° óôá Û÷ïòëóðáãåݬù ìäù £¤°² ìäá Û÷ïòëóðáãåÝ óôá ÷ïòëóðáãå«´ ìäá Û÷ïòëóðáãåݬù óôá ÷ïòëóðáã嫶 ðìù ìäá Û÷ïòëóðáã嫴ݬù ôáø éîù éîù ìäá Û÷ïòëóðáã嫴ݬù ôáù ôøá ãìã áäã ÷ïòëóðáãå«´ óôá ÷ïòëóðáãå«´ ôùá áäã ÷ïòëóðáã嫶 óôá ÷ïòëóðáã嫶ºíáéî± òå𠤳° ìäá Û÷ïòëóðáãå«´Ý áîä £¤ææ âåñ ºîæ² óôá ºìåîçôè óå𠤳° ìäù £¤°± ìäá Û÷ïòëóðáã嫴ݬù ãíð ïðãïäå âîå ºîåøô± éîù »çåô ôï ôèå ¢ß¢ éîù »æéòóô ìåôôåò íõóô áìòåáäù íáôãè éîù »îï÷ ÷å§òå áô ôèå æéòóô ãèáò ôï ÃÍРìäø £¤°²ºæéîä± ìäá Û÷ïòëóðáã嫴ݬù áîä £¤·æ ãíð ïðãïäå­±¬ù âåñ ºéîø± áîä £¤µæ »óåô ôï õððåòãáóå ãíð ïðãïäå­±¬ù âîå ºîåøô±ºéîø± éîù éîø ãðø ïðãïäå âìô ºæéîä± êíð ºæïõî䱺îåøô± òå𠤳° ìäá ºìåîçôè ãìã áäã ÷ïòëóðáãå«´ óôá ÷ïòëóðáãå«´ âãã ºíáéî± éîã ÷ïòëóðáã嫶 êíð ºíáéîæ² òå𠤳° ìäù £¤°´ ìäá Û÷ïòëóðáãåݬù áîä £¤·ÆÆÆ óôá Û÷ïòëóðáãåݬù êíð ºâá䱺æïõîä± òå𠤳° ìäá ïðãïäå áîä £¤ææ éîã éîã »ôï áããïõîô æïò ôèå ô÷ï ìåî âùôåó ôáù ìäá Û÷ïòëóðáã嫴ݬù ðèá ìäù £¤°´ ìäá Û÷ïòëóðáãåݬù áîä £¤·ÆÆÆ óôá Û÷ïòëóðáãåݬù óå𠤳° ìäù £¤°° ìäá ²¬ó ìóò ìóò ìóò ìóò ïòá £§°§ ãí𠣧¹§«± âìô ºïë±± áäã £§Á§­§¹§­²ºïë±± óôá äïóîõí¬ù éîù ìäá ²¬ó áîä £¤°æ ïòá £§°§ ãí𠣧¹§«± âìô ºïë²² áäã £§Á§­§¹§­²ºïë²² óôá äïóîõí¬ù éîù ìäá ±¬ó ìóò ìóò ìóò ìóò ïòá £§°§ ãí𠣧¹§«± âìô ºïë³³ áäã £§Á§­§¹§­²ºïë³³ óôá äïóîõí¬ù éîù ìäá ±¬ó áîä £¤°æ ïòá £§°§ ãí𠣧¹§«± âìô ºïë´´ áäã £§Á§­§¹§­²ºïë´´ óôá äïóîõí¬ù òå𠤳° ðìá »òåíïöå æòïí óôáãë ìäá £äïóôøô± ìäø £Þäïóôøô± êóò éîéôéîôåòîáì âãã ºâãã² êíð ºâóåãºâãã² êíð ºâããºìåîçôè ä󠲬°ºçóïóóôò óôò §ßÇÓÏÓº§ºäïó±¶óôò óôò §ßб¶º§ºèéçè ä󠲺ìï÷ äó ²äïíáã± ðèð óå𠤳° ìäá £äïæìáç âéô íïäåæìáç âåñ ºïëºãìã ðìð ãìã òôóºïë óå𠤳° ìäø ïðãïäå âåñ ºãìã ðèø ìäø ìáâóôòÝìõð ìäá ìáâóôò¬ø óôá ìéîåìáâôøô¬ø äåø âðì Ýìõð ðìøÝìõð ìäá ïðãïäå¬ø óôá ìáâóôò¬ø äåø âðì Ýìõð ìäá íáãæìáç óôá ºíæìáç óôú íáãæìáç êóò æéîäìáâìå ìäù ºíæìáç óôù íáãæìáç âãã ºòåóôïòå »îïôæïõîä òå𠤲° ìäù £²¶ ìäá Ûìáâìåðôòݬù áîä £¤¸°°´ ãí𠣤¸°°´ âîå ºòåóôïòå ðìð óåã òôóºòåóôïòå óå𠤳° ìäø ìéîåìáâôøôÝìõð ìäá ìéîåìáâôøô¬ø óôá ìáâóôò¬ø äåø âðì Ýìõð ðìð ãìã òôóºèáóè ä󠲺íæìáç äó ² íø ¥°°áíøéîäåø ½ ¥°°°°ß°°°°ß°°°±áíùéîäåø ½ ¥°°°°ß°°°°ß°°±°áíóôáãë ½ ¥°°°°ß°°°°ß°±°°áíòïõîä ½ ¥°°°°ß°°°°ß±°°°áíóñõáòå ½ ¥°°°°ß°°°±ß°°°°áíæïòã帠½ ¥°°°°ß°°±°ß°°°°áíæïòã屶 ½ ¥°°°°ß°±°°ß°°°°áíæïòãå²´ ½ ¥°°°°ß±°°°ß°°°°áíáãã ½ ¥°°°±ß°°°°ß°°°°áíéíåä ½ ¥°°±°ß°°°°ß°°°°áííáóë ½ áíæïòã帮áíæïòã屶®áíæïòãå²´¡¤ÆÆÆÆôâìä ½ °ôâìäø ½ áíøéîäåøôâìäù ½ áíùéîäåøôâìäó ½ áíóôáãëôâìä± ½ áíòïõîäôâìäø± ½ áíøéîäåø«áíòïõîäôâìäù± ½ áíùéîäåø«áíòïõîäôâìäóù ½ áíóôáãë«áíòïõîä«áíùéîäåøôâìä² ½ áíóñõáòåôâìäù² ½ áíùéîäåø«áíóñõáòåôâìáì ½ áíæïòãå²´ôâìáìø ½ áíæïòãå²´«áíøéîäåøôâìáãã ½ áíáããôâìéíåä ½ áíéíåäáääíïäå ðèð óå𠤳° óôú íùöáìõå óôú íùöáìõ嫱 âéô æïòãåìïîç âðì ºìïîç ìäá £áíæïòã屶 ôóâ íùöáìõå êíð ºéîéôºìïîç ìäá ïðãïäå÷ïòä ìóò âãã ºéîéô ìäá £áíæïòãå²´ ôóâ íùöáìõåºéîéô ìäù £¤°°Ýæìõóè ìäá Ûìéîåðôòݬù ãí𠣧 § êìô ºúåòï âåñ ºéîù ãí𠣧»§ êåñ ºúåòï êíð ºæéòóôºéîù éîù êíð Ýæìõóèºæéòóô óôá æéòóôãèáò«± óôù æéòóôãèáò ãí𠣧£§ âîå ºáääòåóóºéíåä ðåá £áíéíåä êíð ºøéôºáääòåóó ãí𠣧¨§ âåñ ºòïõîä ãí𠣧ۧ âåñ ºóñõáòå ãí𠣧¼§ âåñ ºæïòã帠ãí𠣧ü§ âåñ ºæïòã屶 ãí𠣧¡§ âåñ ºæïòã屶 ãí𠣧¾§ âåñ ºæïòãå²´ êíð ºéîäåøºæïòã帠ìäá £áíæïòã帠ôóâ íùöáìõå êíð ºéîäåøºæïòã屶 ìäá £áíæïòã屶 ôóâ íùöáìõå êíð ºéîäåøºæïòãå²´ ìäá £áíæïòãå²´ ôóâ íùöáìõå êíð ºéîäåøºòïõîä ìäá £áíòïõîä ôóâ íùöáìõå êíð ºéîäåøºóñõáòå ìäá £áíóñõáòå ôóâ íùöáìõåºéîäåø éîù ìäá Ûìéîåðôòݬù ãí𠣧 §«± âìô ºíïäåøéô ãí𠣧»§ âåñ ºíïäåøéô ãí𠣧¬§ âîå ºéîäåøºéîäåø± éîù ìäá Ûìéîåðôòݬù áîä £¤µæ ãí𠣧٧ âåñ ºùéîäåø ãí𠣧ا âåñ ºøéîäåø ãí𠣧ӧ âåñ ºóôáãëºâáäíïäå ìäá £âáäáääòåóó êíð ºåòòøéôºøéîäåø ìäá £áíøéîäåø ôóâ íùöáìõå ìäá íùöáìõå áîä £áíòïõîä âåñ ºíïäåøéô ìäá íùöáìõ嫱 áîä £áíòïõîä âîå ºâáäíïäå óôú íùöáìõ嫱 éîù ìäá Ûìéîåðôòݬù ãí𠣧©§ âîå ºíïäåøéô ìäá £áíòïõîä ôóâ íùöáìõ嫱 êíð ºíïäåøéôºùéîäåø ìäá £áíùéîäåø ôóâ íùöáìõå äåù äåù ìäá Ûìéîåðôòݬù ãí𠣧ݧ âåñ ºòóæïõîä ãí𠣧©§ âåñ ºòòæïõîä êíð ºíïäåøéôºòóæïõîä ìäá £áíóñõáòå ôóâ íùöáìõ嫱 êíð ºíïäåøéôºòòæïõîä ìäá £áíòïõîä ôóâ íùöáìõ嫱ºíïäåøéô ìäá íùöáìõå áîä £áíòïõîä®áíóñõáòå âåñ ºáììïë áîä íùöáìõ嫱 »íáëå óõòå áìì âòáãåó áòå ôèåòå âîå ºáììïë ìäá íùöáìõå áîä £áíùéîäåø âîå ºâáäíïäå± äåù ìäá Ûìéîåðôòݬù ãí𠣧©§ âåñ ºòò² ãí𠣧ݧ âîå ºâáäíïäå± ìäá íùöáìõå áîä £áíóñõáòå âîå ºáììïë êíð ºâáäíïä屺òò² ìäá íùöáìõå áîä £áíòïõîä âîå ºáììïëºâáäíïäå± ìäá £âáäáääòåóó êíð ºåòòøéôºóôáãë ìäá £áíóôáãë ôóâ íùöáìõå ìäá íùöáìõå áîä £áíòïõîä âåñ ºíïäåøéô óôú íùöáìõ嫱 éîù ìäá Ûìéîåðôòݬù ãí𠣧©§ âîå ºâáäíïäå± ìäá £áíòïõîä ôóâ íùöáìõ嫱 éîù ìäá Ûìéîåðôòݬù ãí𠣧¬§ âîå ºâáäíïäå± éîù ìäá Ûìéîåðôòݬù áîä £¤µæ ãí𠣧٧ âîå ºâáäíïäå± ìäá £áíùéîäåø ôóâ íùöáìõå êíð ºíïäåøéôºáììïë òå𠤳° ìäá íùöáìõå áîä £¤ææ ðìð ãìã òôóºúåòï ðåá £áíáããºøéô òå𠤳° ðìá ðìð ãìã òôóºåòòøéô òå𠤳° áîä £¤ææ ðìð óåã òôóáääíïäåôâì äæâ ¶ª³ äæâ ·ª³ äæâ ¸ª³ äæâ ¤ÆÆ äæâ ±¹ª³ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¹ª³ äæâ ±°ª³ äæâ ±±ª³ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ²°ª³ äæâ ¤ÆÆ äæâ ±²ª³ äæâ ¤ÆÆ äæâ ±³ª³ äó ±°¹¬¤ÆÆ äæâ ±·ª³ äæâ ±¸ª³ äó ±²¶¬¤ÆÆ äæâ ±ª³ äó ²µµ¬¤ÆÆ äæâ °ª³ äó µ±±¬¤ÆÆ äæâ ±´ª³ äæâ ±µª³ äæâ ±¶ª³ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ²±ª³ äæâ ²²ª³ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äæâ ¤ÆÆ äó ±°¹¬¤ÆÆ äæâ ±·ª³ äæâ ±¸ª³ìáóôíïäå äó ²çåîåòáìïð ðèð òå𠤳° ìäá £¤ææ°° óôá ºåöáìæìáç êóò áääíïäå âãã ºäïéô ðìð óåã òôóºäïéô óôá ºíïäå óôá ìáóôíïäå âéô £áíéíåä êîå ºéíåäéáôå âéô £áíáãã êîå ºïîåâùôå âéô £áíæïòã屶®áíæïòãå²´ âîå ºîïäð ìäá ºíïäå ôáø ìäá áääíïäåôâì¬ø áîä £¤ÆÆ ãí𠣤ÆÆ êåñ ºâáä ôáù óå𠤲° âéô øãæìáç âðì ºçåô éîù âöã ºçåô éîùºçåô ìäá ¨ïðäáôᩬù âîå ºðõôäð ìäá ºíïäå áîä £áíæïòã帠âåñ ºîïäð êíð ºâáäºðõôäð óôá ºïðãïäå óôú ºåöáìæìá竱 ìäø £¤°° êóò åöáì óôá ºåöáìæìáç âãã ºäðïë ìäù ðáóóîõí âåñ ºð±²ºåòò ðìð óåã òôóºð±² ãíð £õîäåæìáâìå âîå ºåòò ìäá ºíïäå âéô £áíóñõáòå®áíòïõîä âåñ ºîïäð ìäá £°° øâá ìäá £æïò÷áòäòåæ êíð ºåòòºäðïë òå𠤳° ìäá ìöáìõ嫲 âîå ºîïôäð ìäá ìöáìõå ãí𠣤°±°° âçå ºîïôäð ìäá ºïðãïäå êóò ðõôïðãïäå ìäá ìöáìõå êóò ðõôâùôå ðìð êíð òåìãïòòåãôºîïôäð ìäá ºíïäå áîä £áíòïõîä®áíóñõáòå âîå ºâáäºîïäð òå𠤳° ìäá ºíïäå áîä £áíæïòã帮áíæïòã屶¡¤ÆÆÆÆ ãìã áäã £¤´°° ôáø ìäá áääíïäåôâì¬ø áîä £¤ÆÆ ãí𠣤ÆÆ âåñ ºâáä ôáù óå𠤲° âéô øãæìáç âðì ºçåô± éîù âöã ºçåô± éîùºçåô± ìäá ¨ïðäáôᩬù âåñ ºâáä ìäø ðáóóîõí âåñ ºð± êóò ðõôïðãïäå âéô ºåöáìæìá竱 âðì ºð³ ìäø £¤°° êóò åöáì âãã ºð²ºðìð ðìð óåã òôóºð³ ìäá ºåöáìæìáç âåñ ºð² ðìð óåã òôóºð± òå𠤳° ìäá ºíïäå âéô £áíæïòãå²´ âåñ ºð±± ìäá £¤°´ ðìð êíð éîãïâêðôòºð±± ìäá £¤°³ ðìð êíð éîãïâêðôò íø ¥±°ºð² ìäá ìöáìõå êóò ðõôâùôå ìäá ìöáìõ嫱 êóò ðõôâùôå ìäá ºíïäå âéô £áíæïòãå²´ âåñ ºðìð± ìäá ìöáìõ嫲 êóò ðõôâùôåºðìð± ðìð êíð òåìãïòòåãôºâáä òå𠤳° ìäá £âáäáääòåóó ðìð óåã òôó íø ¥°°ºïîåâùôå óå𠤲° ìäù £±ª³ âéô øãæìáç âðì ºïâ± éîù âöã ºïâ± éîùºïâ± ìäá ¨ïðäáôᩬù âåñ ºâáä êóò ðõôïðãïäå ðìð ãìã òôóºéíåäéáôå òå𠤳° ìäá ºíïäå áîä £áíæïòã帮áíæïòã屶¡¤ÆÆÆÆ ôáø ìäá áääíïäåôâì¬ø áîä £¤ÆÆ ãí𠣤ÆÆ âåñ ºâáä ôáù óå𠤲° âéô øãæìáç âðì ºçåô² éîù âöã ºçåô² éîùºçåô² ìäá ¨ïðäáôᩬù âåñ ºâáä êóò ðõôïðãïäå ìäá ðáóóîõí âåñ ºðõôéíåä ìäø £¤°° êóò åöáì âãã ºðõôéíåä ðìð óåã òôóºðõôéíåä ìäá ìöáìõå êóò ðõôâùôå ìäá ïðæìáçó âéô £íØ®íÙ âîå ºéîäåøòåç âéô íøæìáç âíé ºéíåäïõôºðõôô÷ï ìäá ìöáìõ嫱 êóò ðõôâùôå êíð ºéíåäïõôºéîäåøòåç âéô íøæìáç âöã ºðõôô÷ïºéíåäïõô ðìð êíð òåìãïòòåãôºíïäå ä󠲺ïðãïäå ä󠲺åöáìæìáç äó ²ðõôïðãïäå ðèð òå𠤳° éîã ìéîåòåì óå𠤳° ðèá ìäá £ãùãæìáç âéô íïäåæìá竱 âåñ ºðìá ìäá ±¬ó êóò ãïõîôãùãìåóºðìá ðìá øâá êíð ðõôðõôâùôå ðèð óå𠤳° øâá éîã òåìïõôðõô ìäá ðáóóîõí âî堺𲲠òå𠤳° éîã ïâêðôò âîå ºïææ± éîã ïâêðôò«²ºïææ± éîã ïâêïææóåô âîå ºðìð± éîã ïâêïææóåô«²ºðìð± ðìð ãìã òôó íø ¥±±ºð²² ìäá £äõíæìáç âéô íïäåæìáç âîå ºðáóó±ºðáóó² òå𠤱° ìäù ïâêãô ãðù ïâêóéúå âìô ºøâá ìäá £¤ææ óôá ïâêæõì쫱 óôá ïâêæõìì ìäá £äóëæìáç âéô íïäåæìáç âåñ ºîïóôïòå ôáø òå𠤲° ìäá äóëïðåî êóò ÷òéôåäóë âãã ºòåóåô ðèø êóò äóëåòòïò ðìøºòåóåô ôøá óå𠤲° êíð ºðáóó²ºøâá øâá åïò åîãöáì óôá Ûïâêúððôòݬù øâá éîù óôù ïâêãôºîïóôïòå ìäù âùôåóïõô øâá óôá âùôåóïõô«²¬ù éîù óôù âùôåóïõô âéô ïòçöá쫳 âíé ºóåð ìäù ïâêðôò óôù ïòçöáì ìäù ïâêðôò«² óôù ïòçöá쫲 øâá ìäá £¤¸° ôóâ ïòçöá쫳 øâáºóåð óå𠤳° ôáù åïò ãèåãëóõí óôá ãèåãëóõí ìäá £ãòãæìáç âéô íïäåæìá竱 âåñ ºé² ôùá êóò ãáìããòãºé² ìäá £¥°°°°°°°± ôóâ ìéóôæìá竱 òå𠤳° éîã ôïôâùôåó âîå ºòåì éîã ôïôâùôå󫲺òåì âéô íïäåæìáç­± »òåì áãôéöå¿ âðì ºðáóó± éîã òåìïææóåô âîå ºðáóó± éîã òåìïææóåô«²ºðáóó± òå𠤳° éîã ïâêðôò âîå ºïææ éîã ïâêðôò«²ºïææ éîã ïâêïææóåô âîå ºðìð éîã ïâêïææóåô«²ºðìð ðìð ãìã òôóãáìããòã òôóãïõîôãùãìåó ðèð »íõóô óåô ôï ±¶ âéô íïäå òå𠤳° áîä £¤ææ áóì áóì ôáø ìäá ãùãìåôâì¬ø áîä £¤ææ ãìã áäã ìéîåãùãìåó óôá ìéîåãùãìåó óå𠤲° ìäá íøæìáç áóì òïì òïì áîä ãùãìåôâ쫱¬ø ãíð ãùãìåôâ쫱¬ø âåñ º± óåä ìäá ãùãìåôâ쫲¬ø ãìã áäã ìéîåãùãìåó óôá ìéîåãùãìåó ãì亱 ìäá ãùãìåôâ쫳¬ø ìóò âãã º² ìäá íøæìá竱 áîä £¤´° âåñ ºéîã âéô ãùãæìáçó âöã ºîïáöç éîã ãùãìåáöç  »ðõô éî áöç ãïäå èåòå ìäá ãùãìåáöç áîä £¤°± âåñ ºéîã êí𠺲ºîïáöç éîã ãùãìåíáòëó êí𠺲ºéîã óåä ìäá ìéîåãùãìåó ãìã áäã £¤°± óôá ìéîåãùãìåó ãì亲ºäïîå òå𠤳° óåä ìäá ìéîåãùãìåó ãìã áäã ãùãìåó óôá ãùãìåó ãìä ðìð òôóòåìãïòòåãô ðèð óå𠤳° ìäá ðáóóîõí âåñ ºøéô± ìäá íïäåæìáç âéô £òåìæìáç âåñ ºøéô± âéô £äõíæìáç âîå ºøéô± âéô ìáâìåõóå䫱 âíé ºøéô± âéô îïôæïõîä âíé ºøéô± òå𠤳° ìäù òåìãô ãðù £òåìóéúå­±¶ »êõóô éî ãáóå¡¡ âìô ºóåôæìáçóºåòò± êíð ºåòòºøéô± êíð ºøéôºóåôæìáçó ìäá £¤°æ óôá ºæìáçó óôú ºåøôåòîáì ìäá îïóèéæô »çåô ìï÷ âùôå ïæ õîóèéæôåä öáìõå óôá ºòåæîõí ìäá óèéæôãô âåñ ºì ãí𠣤±° êåñ ºææ ìäù òåìïõô ãðù £¤°² âìô ºó¸ êíð ºææºó¸ ãí𠣤°¸ âîå ºì ìäá £¥°±°°°°°° ôóâ ºæìáçóºì ìäá ìáâìåõóåä ãí𠣤·æææ âåñ ºîïåøô áóì áóì ôáù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò éîù éîù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò«² ìäø £¤°° ìäù £²¶ ìäá Ûìáâìåðôòݬù áîä £¤±° âåñ ºîïåøô ôóâ ºæìáçó ìäù £²² ìäá Ûìáâìåðôòݬù óôá ºòåæîõí ìäá £¤¸°°° ôóâ ºåøôåòîáì ìäá óèéæôãô âåñ ºîïåøô ìäá £¤ææ óôá ºæìáçó ìäá £¤´°°° ôóâ ºåøôåòîáìºîïåøô ìäá òåìïõô ãí𠣤°³ âìô ºô÷ïâùôåó ìäá £¥°°±°°°°° ôóâ ºæìáçó êíð ºéîóåòôºô÷ïâùôåó ãí𠣤°± âåñ ºéîóåòô ìäá £¤¸° ôóâ ºæìáçóºéîóåòô ìäù òåìãô ìäá ºæìáçó óôá Ûòåìðôòݬù éîù ìäá ìéîåòåì óôá Ûòåìðôòݬù éîù éîù ìäá ºòåæîõí óôá Ûòåìðôòݬù éîù âéô ºåøôåòîáì âöã ºóôú ìäá £¤ä° âéô ºåøôåòîáì âðì ºîïåøô± ïòá £¥°°°°°±°°ºîïåøô± ìäø óèéæôãô ãðø £¤±° âåñ ºææóôá ìäø òåìïõô ãðø £¤°² âìô ºïâ± ïòá £¥°°°°°°°± êíð ºææóôáºïâ± ìäø óèéæôãô ãðø £¤°¸ âîå ºææóôá ïòá £¥°°°°°°±±ºææóôá óôá Ûòåìðôòݬù éîù ìäá îïóèéæô óôá Ûòåìðôòݬù éîù éîù ìäá îïóèéæô«² óôá Ûòåìðôòݬù éîùºóôú óôù òåìãô êíð ºøéôºææ ìäá £¤ææ óôá ºæìáçó ìäá £¤´°°° ôóâ ºåøôåòîáì êíð ºìºøéô óå𠤳° ìäá £¤¸° ôóâ ìáâìåõóå䫱 ôóâ îïôæïõîä òå𠤳° óôú òåìïõô ìäá òåìïææóåô óôá ìéîåòåì ðìð ãìã òôóºåòò óå𠤳° ìäá £¤¸° ôóâ ìáâìåõóå䫱 ôóâ îïôæïõîä òå𠤳° óôú òåìïõô ìäá òåìïææóåô óôá ìéîåòåì ìäá £òåìæõìì ðìð óåã òôóºæìáçó ä󠲺òåæîõí ä󠲺åøôåòîáì ä󠲺óèï÷± ðèø ðèá ðèù ðèð òå𠤳° êóò ðòâùôå ìäá £¤²° êóò äòá÷ãèáò ðìð ðìù ðìá ðìø òôóºóèï÷±ãò ðèø ðèá ðèù ðèð òå𠤳° êóò ðòâùôå ìäá £¤°ä êóò äòá÷ãèáò ðìð ðìù ðìá ðìø òôóºóèï÷² ðèø ðèá ðèù ðèð òå𠤳° êóò ðòâùôåì ìäá £¤²° êóò äòá÷ãèáò ðìð ðìù ðìá ðìø òôóéîãïâêðôò ðèð òå𠤳° ðèá ãìã áäã ïâêðôò óôá ïâêðôò âãã ºïææóåô éîã ïâêðôò«²ºïææóåô ðìá ãìã áäã ïâêïææóåô óôá ïâêïææóåô âãã ºøéô éîã ïâêïææóåô«²ºøéô ðìð ãìã òôóøòåæ òôóøìáâîõí åñõ °øäïæìáç åñõ øìáâîõí«²øìîõí åñõ øäïæìá竲øìîõí± åñõ øìîõí«²øæìáç åñõ øìîõí±«²øåîä åñõ øæìá竲øòåæòåã äó ±°¬°äåæéîåáìì ðèð óå𠤳° êíð äåæéîåäåæéîåìáâìå ðèð óå𠤳° ìäá íïäåæìáç áîä £äïæìáç âåñ äåæéîå ðìð óåã »ôåìì ãáììåò äï æìáç éó ïææ òôóäåæéîå ìäù £¤°° ìäá ìáâóôò«± ãí𠣧º§ âåñ ºì ãí𠣧ݧ âîå ºóôáôùðå éîùºì éîùºóôáôùðå òå𠤳° óôù ìáâôùðå ìäá ðáóóîõí êîå ºðáóó± »âîå ºðáóó±ºðáóó° ìäá £¤ææææ óôá æììáóô êóò æéîäìáâìå âãã ºð°éîóåòô ìäù £²¶ ìäá Ûìáâìåðôòݬù âéô £öáòéáâìåâéô âîå ºð°öáò âéô £åîôòùâéô âîå ºð°éîóåòô âéô íáãæìáç­± âöó ºð°éîóåòô êíð ºäõðºð°öáò ìäù £±¶ ìäá Ûìáâìåðôòݬù óôá ìéîåìáâìå ìäù £²¸ ìäá Ûìáâìåðôòݬù óôá öáòöáì ìäá ïâêðôò óôá Ûìáâìåðôòݬù ìäù £³° ìäá Ûìáâìåðôòݬù óôá öáòöá쫲 ìäá ïâêðôò«² óôá Ûìáâìåðôòݬù êíð ºîïåòòºð°éîóåòô ìäá ïâêðôò óôá ìáâöáì ìäá ïâêðôò«² óôá ìáâöá쫲 êóò éîóåòôìáâìå âãó ºåòò »åòòïò òåôõòîåä éî Á ìäù £±¶ ìäá Ûìáâìåðôòݬù óôá ìéîåìáâìå óôú öáòöáì óôú öáòöá쫲 êíð ºîïåòòºåòò ðèá êíð ºøéôºðáóó± ìäá £¤ææææ óôá æììáóô êóò æéîäìáâìå âãã ºõîäåæ »îïô æïõîä ïî óåãïîä ðáóó ìäù £±¶ ìäá Ûìáâìåðôòݬù óôá ìéîåìáâìå ìäù £²¶ ìäá Ûìáâìåðôòݬù âéô £öáòéáâìåâéô âîå ºð±öáò âéô £¤²°®¤±°®¤°¸®¤°´®¤°±®ìéîëåòâéô »åøô¬íáãöáò¬íáãòﬠâåñ ºãèåãëíéó » ìïãáìó¬ ïò ìéîëåòåñõ§ó êíð ºîïåòòºð±öáò ìäù £²¸ ìäá Ûìáâìåðôòݬù óôá öáòöáì ìäá ïâêðôò óôá Ûìáâìåðôòݬù ìäù £³° ìäá Ûìáâìåðôòݬù óôá öáòöá쫲 ìäá ïâêðôò«² óôá Ûìáâìåðôòݬù êíð ºîïåòòºãèåãëíéó ìäù £²¸ ìäá Ûìáâìåðôòݬù ãíð ïâêðôò âîå ºíéóáì ìäù £³° ìäá Ûìáâìåðôòݬù ãíð ïâêðôò«² âåñ ºîïåòòºíéóáì ìäù £²¸ ìäá Ûìáâìåðôòݬù   »òåóåô ïâêåãô ðïéîôåò óï ÷å äïî§ô óôá ïâêðôò     »çåîåòáôå íïòå íéóáìéçî åòòïòó ìäù £³° ìäá Ûìáâìåðôòݬù óôá ïâêðôò«¤² ðåá £íéóáìéçîíåîô êíð ºøéôºõîäåæ ðåá £õîäåæìáâìå êíð ºøéôºäõð ðåá £äõðìáâìå êíð ºøéôºîïåòò ðåá £¤°°ºøéô òå𠤳° âéô ìéîåìáâìå âíé ºçåôåòò ìäù £²¶ ìäá Ûìáâìåðôòݬù áîä £¥±±±±±±®ìéîëåòâéô »îï íáãöáòó¬åøôåòîáìó¬åñõáôåó¬íáãòïó¬öáòéáâìåó¬ âîå ºçåôåòò »ìïãáìó ïò ìéîëåòåñõ§ó®®® ìäá çìïâìáâ óôá ïìäçìïâ ìäù £±¶ ìäá Ûìáâìåðôòݬù óôá çìïâìáâ ìäá £¤°°¸° ôóâ ãìòçìïâºçåôåòò ðìá áîä £¤ææ óôú æììáóô äåã æììáóô ðìð ãíð ºïîå òôóºïîå ä÷ ¤°±öáòöáì äó ´æéîäìáâöáìæéîäìáâìåÝãô åñõ ÷ïòëóðáãåÝïææóåô åñõ Ýãô«¤²Ýðïó åñõ Ýïææóåô«¤²Ýðïó± åñõ Ýðï󫤲Ýìåî± åñõ Ýðï󱫤²Ýìåî² åñõ Ýìå¤²ºåîôòù ðèð óå𠤳° âéô íáãæìáç âöã ºîïòíáì ìäá ìáâóôò êåñ ºîïôæïõîä ìäá ìáâóôò«± áîä £¤·æ ãí𠣧ݧ âåñ ºîïòíáì ãí𠣧À§ âåñ ºîïòíáì êóò íáãæéîä âãã ºíáãåîôòù ðìð óåã òôóºîïòíáì ìäá ìáâóôò«± ãí𠣧À§ êåñ ºâõéìôéîºîïâõéìô ìäá íïäåæìáç âéô £ãáóåæìáç âåñ ºíáãåîôòù êóò ãáóåìáâìåºíáãåîôòù óôú ìáâôùðå óôú ìáâôùð嫱 ìäá ìáâìåãô ïòá ìáâìåãô«± âåñ ºîïôæïõîä ìäá ìáâóôò âåñ ºîïôæïõîä óôá Ýìåî± óôú Ýìå± ìäá ìáâóôò«¤± ãí𠣧º§ »ìïãáì ìáâìå¿ òå𠤳° âîå ºçìïâáì ìäá çìïâìáâ âíé ºîïôæïõîä áóì áóì ôáù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò éîù éîù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò«² ìäù £²´ ìäá Ûìáâìåðôòݬù âíé ºîïôæïõîä »îïîå äåæéîåä óôá Ýðïó êíð ºçìïïðºçìïâáì áîä £¤ææ áóì ôáø ìäá áôáâìå¬ø âíé ºîïôæïõîä óôá ÝðïóºçìïïðÝìõð ìäá Ýðïó áóì áóì ôáù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò éîù éîù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò«² óôú Ýïææóåô ìäá ÛìáâìåðôòÝ áîä £¤°æ óôá Ýìåî² óå𠤲° ìäø £¤°² »óôáòô áô âùôå ² ôøùÝìõð± ãðø £¤±° âçå ºíïöåæïõîä ãðø Ýìåî± âìô º± âåñ º± êíð ºçïìåæô±ºîæ± ìäá Ýðïó óôá æììáóôºîïôæïõîä ðìð ãìã òô󺱠ãðø Ýìåî² âìô º² âåñ º² êíð ºçïòéçèôº² ìäá ìáâóôò¬ø ãíð Ûìáâìåðôòݬù âîå ºîåøô éîù éîø êíð Ýìõð±ºîåøô âìô ºçïìåæô êíð ºçïòéçèôºçïìåæô± ìäá Ýìåî± ãíð Ýìåî² âåñ ºíïöåæïõîäºçïìåæô òå𠤳° ìäù £±¸ ìäá Ûìáâìåðôòݬù âíé ºîæ± óôá Ýðïó êíð Ýìõðºçïòéçèô òå𠤳° ìäù £²° ìäá Ûìáâìåðôòݬù âíé ºîæ± óôá Ýðïó êíð Ýìõðºíïöåæïõîä òå𠤳° ìäá Ýðïó áóì áóì ôáù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò éîù éîù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò«² ðìð óåã òôóºâõéìôéî êíð ºîïâõéìôãáóåìáâìå ðèðºäïéô óå𠤳° ìäø ìáâóôò âåñ ºøéôÝìïïð ìäù ìáâóôò¬ø ìäá ãïîöåòôôáâìå¬ù óôá ìáâóôò¬ø äåø âîå Ýìïïðºøéô ðìð òôóéîóåòôìáâìåÝãô åñõ ÷ïòëóðáãåÝïææóåô åñõ Ýãô«¤²Ýðïó åñõ Ýïææóåô«¤²Ýðïó± åñõ Ýðï󫤲Ýìåî± åñõ Ýðï󱫤²Ýìåî² åñõ Ýìå¤²ºåîôòù ðèð òå𠤳° óôú ìáâôùðå ìäá ìáâìåãô ãíð £íáøóùíâïìó »íáø îõíâåò ïæ ìáâìåó âìô ºîå± ìäá £óùíæõìì »óùíôáâìå æõìì êíð ºåòòïòºîå± ìäá ìáâóôò áîä £¤ÆÆ âîå ºîå² ìäá £âáäìáâìå êíð ºåòòïòºîå² âéô íáãæìáç­± âöã ºîå²² ìäá ìáâóôò«± áîä £¤·æ ãí𠣧ݧ âåñ ºîå±² ðìð êíð íáãéîóåòôºîå±² ìäá ìáâóôò áîä £¤ææºîå²² óôá Ýìåî± âéô æììáóô âíé ºîå²²² êíð ºæáóôéîóåòôºîå²²² ìäá ìáâóôò«¤± »æéòóô âùôå ïæ óôòéîç áîä £¤·Æ ãí𠣧º§ »ìïãáì ìáâìå¿ âåñ ºìïãáì êíð ºçìïâáìºìïãáì ìäá £¤°± óôá ìáâôùð堻ⰽÌïãáì Ìáâìå ìäá çìïâìáâ âíé ºõäæ áóì áóì ôáù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò éîù éîù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò«² ìäù £²´ ìäá Ûìáâìåðôòݬù êðì ºóôáòô ìäá çìïâìáâ âòá ºî峺õäæ ìäá £õîäåæìáâìå êíð ºåòòïòºîå³ óôá Ýðïó óôá ìáâðòåö áóì áóì ôáù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò éîù éîù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò«² ìäù £²´ ìäá ìáâìåãô óôá Ûìáâìåðôòݬù »óåô ìïãáì ðôò æïò ÇÌáâìå êíð ºóáöåºçìïâáì ìäø £¤°° óôø ìáâôùðå ãí𠣧ݧ âîå ºáóì°± ìäø £¤°² óôø ìáâôùðåºáóì°± áóì ôáø ìäá áôáâìå¬ø âðì ºóôáòô ìäá £¤ÆÆÆÆ óôá Ýðïó »îï ðòåöéïõó ìäá ìáâìåãô óôá áôáâìå¬øºóáöå òå𠤳° êóò ºóáöåéô âãã ºîïóáöå ðìð óåã òôóºîïóáöå ìäá £¤°° ðìð ãìã òôóºóôáòô óôá ÝðïóÝìõð ìäá Ýðïó áóì áóì ôáù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò éîù éîù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò«² óôú Ýïææóåô óå𠤲° ìäá ÛìáâìåðôòÝ óôá Ýìåî² óôú Ýìå± ìäø £¤°² »óôáòô áô âùôå ² ôøùÝìõð± ãðø £¤±° êåñ ºåòòïò² ãðø Ýìåî± âìô º± âåñ º± êíð ºçïìåæô±º± ãðø Ýìåî² âìô º² âåñ º² êíð ºçïòéçèôº² ìäá Ûìáâìåðôòݬù ãíð ìáâóôò¬ø âîå ºîåøô éîù éîø êíð Ýìõð±ºîåøô òå𠤳° âìô ºçïòéçèô êíð ºçïìåæôºçïìåæô± òå𠤳° ìäá Ýìåî± ãíð Ýìåî² âîå ºçïìåæôºòåðìáãå ìäù £²¶ »ïææóåô ôï åñõ öáìõå ìäá ìáâôùðå óôá Ûìáâìåðôòݬù éîù éîù ìäá ìáâöáì »òåðìáãå åñõáôå óôá Ûìáâìåðôòݬù éîù éîù ìäá ìáâöá쫤² áîä £¤°°ææ óôá Ûìáâìåðôòݬù êíð ºîïóáöåºçïìåæô òå𠤳° ìäù £±¸ »ìåæôðôò ìäá Ûìáâìåðôòݬù âðì ºð± ìäá ìáâìåãô óôá Ûìáâìåðôòݬù êíð ºóáöåºð± óôá Ýðïó êíð Ýìõðºçïòéçèô òå𠤳° ìäù £²° »ìåæôðôò ìäá Ûìáâìåðôòݬù âðì ºð² ìäá ìáâìåãô óôá Ûìáâìåðôòݬù êíð ºóáöåºð² óôá Ýðïó êíð Ýìõðºåòòïò² òå𠤳° ìäá £âáäìáâìåºåòòïò ðìð óåã òôóºóáöåéô óôá ìáâîõí ðèá ìäá Ýðïó óôá ìáâðòåö ìäá ìáâôùðå ïòá ïòçïò óôá ìáâôùðå ìäá £äõíæìáç âéô íïäåæìáç âåñ ºóé± ìäá ìáâôùðå ïòá äõíïò »£¤¸°°° óôá ìáâôùðåºóé± ìäá £¤ÆÆÆÆ óôá ìáâìåæô óôá ìáâòéçèô óôá ìáâìïãáì ìäá ìáâöá쫲 áîä £¤ææ óôá ìáâöá쫲 ðìá óôá Ýðïó »æïò íïöåæïõîä áóì áóì ôáù ìäá îåøôìáâìåðôò óôá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò ðèá »æïò íöî âåìï÷ éîù éîù ìäá îåøôìáâìåðôò«² óôá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò«² óå𠤲° óôá ºíö òå𠤲° ðìù »ìï÷ ïæ äåóôéîáôéïî ôäã ãìã áäã £ìáâóôò ôáø »óïõòãå ìï÷ ÷ïòä ìäá £³± »ÍÖΠðèâºíöî íöî ¤°°°°°°¬¤°°°°°° ðìâ ìäù £²¶ ìäá Ûìáâìåðôòݬù âðì ºáîä éîã òåììáâãôºáîä âéô £ìïãáìâéô âîå ºøòåæ éîã çìïâáìãôºøòåæ ìäø £¤°° êóò øòåæ êóò éîãìáâìåãô òôóºæáóôéîóåòô ìäá æììáóô óôá Ýðïó ìäø £¤°° ìäá ìáâóôò«± áîä £¤·æ ãí𠣧º§ âåñ ºæéìïãáì ãí𠣧ݧ âîå ºæéçìïâáìºæéöáò éîøºæéìïãáì éîøºæéçìïâáì óôø ìáâôùðå ìäá Ýðïó áóì áóì ôáù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò éîù éîù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò«² ìäù £¤°° óå𠤲° ìäá ÛìáâìåðôòÝ óôá Ýìåî² ìäù £¤°² ôùø »óôáòô áô âùôå ²Ýìõð± ãðø £¤±° êåñ ºåòòïò² ãðø Ýìåî± âìô ºæé± âåñ ºæé± êíð ºæéçïìåæô±ºæé± ãðø Ýìåî² âìô ºæé² âåñ ºæé² êíð ºæéçïòéçèôºæé² ìäá Ûìáâìåðôòݬù ãíð ìáâóôò¬ø âîå ºæéîåøô éîù éîø êíð Ýìõð±ºæéîåøô òå𠤳° âìô ºæéçïòéçèô êíð ºæéçïìåæôºæéçïìåæô± òå𠤳° ìäá Ýìåî± ãíð Ýìåî² âîå ºæéçïìåæôºæéòåðìáãå òå𠤳° ìäù £²¶ »ïææóåô ôï åñõ öáìõå ìäá ìáâôùðå óôá Ûìáâìåðôòݬù éîù éîù ìäá ìáâöáì »òåðìáãå åñõáôå óôá Ûìáâìåðôòݬù éîù éîù ìäá ìáâöá쫤² áîä £¤°°ææ óôá Ûìáâìåðôòݬù êíð ºîïóáöåºæéçïòéçèô òå𠤳° ìäù £²° êíð ºæéçïºæéçïìåæô òå𠤳° ìäù £±¸ºæéçï ìäá ìáâìåãô óôá Ûìáâìåðôòݬù êíð ºóáöåðòéîôìáâ ðèù ðèø ðèá ðèð óå𠤳° ìäá ìáâóôò ôáù ìäø £¤°±Ýìõð ãðù £¤°° âåñ ºøéô ìäá ìáâóôò¬ø êóò äòá÷ãèáò éîø äåù êíð Ýìõðºøéô ðìð ðìá ðìø ðìù òôóäòá÷ìáâìåó ðèð òå𠤳° ìäá £¤°° óôá ºíáéî óôá ºòåãõòóìåöºìïïð ìäá ºíáéî áóì ôáø ìäá £§ § óôá ºôòååãèáò ìäá áôáâìå¬ø êíé ºîåøô ðèá êóò ºóèï÷ôòååºîåøô éîã ºíáéî ìäá ºíáéî ãíð £±²¸ âìô ºìïïð ðìð òôóºíáéî ä󠲺òåãõòóìåö ä󠲺ôòååãèáò äó ² íø ¥°°ºóèï÷ôòåå éîã ºòåãõòóìåö ìäá ìáâìåðôò«² ðèá ìäá ìáâìåðôò ðèá ìäá ·¬ó áóì áóì ôáù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò éîù éîù ìäá Ûìáâìåðôò±Ý¬ù óôá ìáâìåðôò«² ìäù £±¸ ìäá £§Ò§ óôá ºãèáò ìäá Ûìáâìåðôòݬù âíé ºîåøô± ðèá êóò ºóèï÷ôòåå ìäá £§Ì§ óôá ºãèáòºîåøô± êóò ºðòéîô ìäá £§Ò§ óôá ºãèáò ìäù £²° ìäá Ûìáâìåðôòݬù âíé ºäïîå ðèá êóò ºóèï÷ôòååºäïîå ðìá óôá ìáâìåðôò ðìá óôá ìáâìåðôò«² ðìá ðìø ðèá äåã ºòåãõòóìåö òôóºãèáò ä󠲺ðòéîô ìäù £¤°° óôù ºïææóåô ìäá Ûìáâìåðôòݬù áîä £¤°Æ óôá ºìåî óôá ºâùôåó âîå ºð± êíð ºðøéôºð± ìäá젤Ű𶱠âíé ºð± ìäá ºòåãõòóìåö ðèø ðèù êóò ðòâùôå ìäá £§ § êóò äòá÷ãèáò ìäá ºãèáò êóò äòá÷ãèáò ìäá £§ § êóò äòá÷ãèáò ìäá ºôòååãèáò êóò äòá÷ãèáò ìäá £§ § êóò äòá÷ãèáò ðìù ðìø ìäø £¤°± éîù ðèø ðèù ìäá Ûìáâìåðôòݬù áîä £¤·Æ ìäá £§ § êóò äòá÷ãèáò ìäá £§ § êóò äòá÷ãèáò ìäá £§ § êóò äòá÷ãèáò ìäá ºâùôåó ãìã áäã £¤°³ óôá ºâùôåóºðìù ðìù ðìøÝìõð ìäá Ûìáâìåðôòݬù áîä £¤·Æ ðèø ðèù êóò äòá÷ãèáò ðìù ðìø éîù éîø ãðø ºìåî âìô Ýìõð âåñ Ýìõð ìäá £¤±´ óåã óâã ºâùôåó ôáøÝìõð ìäá £§ § ðèø êóò äòá÷ãèáò ðìø äåø âðì Ýìõð ìäá £§¤§ êóò äòá÷ãèáò ìäù £²¸«² ìäø £¤°³Ýìõð ìäá Ûìáâìåðôòݬù áîä £¤ÆÆ ðèø ðèù êóò ðòâùôå ðìù ðìø äåù äåø âîå Ýìõð ìäá £§ § êóò äòá÷ãèáò ìäá £§ § êóò äòá÷ãèáò ìäá ºïææóåô ãìã áäã £²¶ ôáù ìäá Ûìáâìåðôòݬù êóò ðòâùôåì ìäá £§ § êóò äòá÷ãèáò ìäá ºïææóåô ãìã áäã £±¶ ôáù ìäá Ûìáâìåðôòݬù êóò ðòâùôåì ìäá £¤°Ä êóò äòá÷ãèáò ìäù £²´ »ïææóåô ôï ìïãáì ìáâåìó ìäá Ûìáâìåðôòݬù âíé ºòôó ðèá ìäá £§¯§ óôá ºôòååãèáò ðìá ðèá êóò ºóèï÷ôòåå ðèá ìäá £§ § óôá ºôòååãèáò ðìáºòôóºðøéô òôóºìåî ä󠲺ïææóåô ä󠲺âùôåó äó ² \ No newline at end of file diff --git a/src/obj/qatools b/src/obj/qatools new file mode 100644 index 0000000..c320fcf --- /dev/null +++ b/src/obj/qatools @@ -0,0 +1 @@ +Q diff --git a/src/qasystem/login b/src/qasystem/login new file mode 100644 index 0000000..07c816d --- /dev/null +++ b/src/qasystem/login @@ -0,0 +1,7 @@ +* +* This is the login file for Lane's QuickASM system :) +* + +set /a/work/zappa +pfx 8 2 +pfx 0 2 diff --git a/src/qasystem/qacmd b/src/qasystem/qacmd new file mode 100644 index 0000000..b3dead0 --- /dev/null +++ b/src/qasystem/qacmd @@ -0,0 +1,67 @@ + +* QuickASM command table +* +* L = Linker +* C = Compiler/Assembler +* I = Internal Command (leave the ID's alone) +* (you CAN change the command's NAME) +* E = External Command (found in prefix #6) +* A = Shell Application + +* Name Type ID# Comment +*----------------------------------------- + +QLINKGS *L 1 ;QuickASM Linker +QASMGS *C 1 ;QuickASM 65816/GS Merlin Assembler + +QUIT I 1 ;Quit Shell +BYE I 1 ;Same as QUIT +PREFIX I 2 ;Set/Show Prefix +PFX I 2 ;Same as PREFIX +PURGE I 3 ;Purge and compact mem +HELP I 4 ;Show commands + +ASM I 5 ;Assemble +ASSEMBLE I 5 ;Assemble +COMPILE I 5 ;Compile(ASM) +LINK I 6 ;Link +SHOW I 7 ;Show Prefixes and mem +STATS I 7 ;Same as SHOW + +ASML I 8 ;Assemble and link +CMPL I 8 ;Compile and link +ASMLG I 9 ;Assemble, link and execute +CMPLG I 9 ;Compile, link, and exevute +SET I 10 ;Set Prefixes +POP I 11 ;Pop a prefix level +TOOLMACS I 12 ;Load Built in Macros += I 13 ;launch/return +- I 14 ;launch/noreturn +RUN I 13 ;same as = +LAUNCH I 14 ;same as - +SHUTDOWN I 15 ;Reboot System +RESTART I 15 ;same as shutdown +ASCII I 16 ;Show ASCII table +ONLINE I 17 ;Show online volumes and devices +*TEST I 18 ;For testing commands under development +*EJECT I 19 ;Ejects all 3.5 disks online +*PARK I 20 ;Parks all HD's online +*UNPARK I 21 ;Restarts all HD's online +*APW I 22 ;boot into apw (not complete) +*MON I 23 ;Enter Monitor +*MONITOR I 23 ;Same as mon.. + +CATALOG *E 1 ;catalog +CAT *E 1 ;catalog +c *E 1 +DUMP *E 2 ;Dump OMF file +TYPE *E 6 ;type a text file to screen +WHERE *E 7 ;show handles +DELLINK *E 10 ;delete all $F8 (LNK) files from directory(nested) +LC *E 11 ;lower case all fnames in directory +DELETE *E 12 ;delete files (supports wildcards) +REZ *E 13 ;Resource Compiler +time *E 14 + +EDIT *A 8 ;Edit a file + diff --git a/src/qasystem/qagraf b/src/qasystem/qagraf new file mode 100644 index 0000000..7239bb5 --- /dev/null +++ b/src/qasystem/qagraf @@ -0,0 +1 @@ +Z diff --git a/src/qasystem/qaintcmd b/src/qasystem/qaintcmd new file mode 100644 index 0000000..6989b69 --- /dev/null +++ b/src/qasystem/qaintcmd @@ -0,0 +1 @@ +_ diff --git a/src/qasystem/qaprefs b/src/qasystem/qaprefs new file mode 100644 index 0000000..d3f5a12 --- /dev/null +++ b/src/qasystem/qaprefs @@ -0,0 +1 @@ + diff --git a/src/qasystem/qaprefs.s b/src/qasystem/qaprefs.s new file mode 100644 index 0000000..0aa49e9 --- /dev/null +++ b/src/qasystem/qaprefs.s @@ -0,0 +1,32 @@ + lst off + +*** LEAVE THIS WORD ALONE ***** + +setup dw %1000_0000_0000_0000 + ;b15: 1 = graphics + ; 0 = text + + +**** YOU MAY CHANGE THESE PFX'S **** + +prefixtbl +:pfx0 str '' + ds 64-{*-:pfx0} +:pfx1 str '0/' + ds 64-{*-:pfx1} +:pfx2 str '0/Library' + ds 64-{*-:pfx2} +:pfx3 str '/a/work/' + ds 64-{*-:pfx3} +:pfx4 str '/a/Merlin/Macs' + ds 64-{*-:pfx4} +:pfx5 str '9/' + ds 64-{*-:pfx5} +:pfx6 str '9/Utility' + ds 64-{*-:pfx6} +:pfx7 str '9/QASystem/Help.Files' + ds 64-{*-:pfx7} + + typ $06 + sav qaprefs + diff --git a/src/qasystem/qatext b/src/qasystem/qatext new file mode 100644 index 0000000..e6cb417 --- /dev/null +++ b/src/qasystem/qatext @@ -0,0 +1 @@ + diff --git a/src/qasystem/qatools b/src/qasystem/qatools new file mode 100644 index 0000000..8774487 --- /dev/null +++ b/src/qasystem/qatools @@ -0,0 +1 @@ +|P diff --git a/src/qasystem/qe.prefs b/src/qasystem/qe.prefs new file mode 100644 index 0000000..a1b5e21 --- /dev/null +++ b/src/qasystem/qe.prefs @@ -0,0 +1 @@ + diff --git a/src/qasystem/quicklink.s b/src/qasystem/quicklink.s new file mode 100644 index 0000000..f6326bc --- /dev/null +++ b/src/qasystem/quicklink.s @@ -0,0 +1,5 @@ + ovr all + asm ]1 + lnk ]2 + sav ]3 + diff --git a/src/shell/equs.s b/src/shell/equs.s new file mode 100644 index 0000000..29d321b --- /dev/null +++ b/src/shell/equs.s @@ -0,0 +1,90 @@ +*====================================================== +* Some equates we need defined + +TeaseWare = 0 ;1 = no saving allowed! + +AppleMenu = 300 +FileMenu = 255 +EditMenu = 250 +ProjMenu = 400 +SrcMenu = 500 +ToolMenu = 600 +GSOSMenu = 700 +TranMenu = 800 +WindowMenu = 5000 + +TECtrlID = $69696969 +WindowID = $FACE +CmdWdwID = $AAAA +ErrWdwID = $EEEE + +rTEStyle = $8012 +*------------------------------------------------------ +* These are our zero page usage stuff + + dum EndZP +SDFlg ds 2 ;shut down flag + +ClickFlg ds 2 ;is there a file to load from finder? + +FrontWdw ds 2 ;0 = none of ours active +WdwPtr ds 4 ;current source window +CmdPtr ds 4 ;system window +ErrPtr ds 4 ;error window +TEHdl ds 4 ;for Text Edit record +CmdTEHdl ds 4 +ErrTEHdl ds 4 + +WdwCnt ds 2 ;# of open windows (for menu disable) +SysWdw ds 2 ;NEG = system window + +PrtHdl ds 4 ;handle to print record +PPort ds 4 ;printer port handle +PrtOK? ds 2 ;is it ok to print? + +WMenuRef ds 2 ;item # for window menu +LastFile ds 2 ;menu # of last file active + +CaseFlg ds 2 ;case insensitive = true +FromTop ds 2 ;search from top of doc? +WordFlg ds 2 ;search for words? +LabelFlg ds 2 ;go to a label? + +ClearFlg ds 2 ;bne = clear TE text +EnterFlg ds 2 ;bne = parse line via QA tools + +SaveText ds 2 ;save as text only? + +tFLen ds 2 ;find & replace lengths +tRLen ds 4 +textLen ds 4 + +ToolAdr ds 4 ;address of QATools +CmdAdr ds 4 ;address of command handling code +ParmHdl ds 4 ;parms +CmdHdl ds 4 ;our command table +NumCmds ds 2 ;# of commands we know + + err */$101 ;can't go past $FF + dend + +*====================================================== +* The various routines & variables accessable in the IFD library +* (no drawing or sound or random stuff here!) + + EXT SetAPath,SetPath,ReadFile,WriteFile,GetFile,PutFile + EXT StripPath,CopyPath,CopySFPath,CallDOS + EXT SysError,TextError,CenterDialog + EXT WaitEvent,WaitEventz,VErrCheck,AskForDisk + + EXT AppPath,PathParms,OpenParms,InfoParms,EOFParms + EXT ReadParms,WriteParms,DestParms,CreateParms + EXT FilePtr,PathPtr,SFTypes,SFRec,InPath + EXT getpath,VolumeName,CreateSFPath,CheckClick + + EXT DSysErr,theError,ScreenWidth,TaskRc,Event,EType + EXT Time,yPos,xPos,Mod,TData,TMask + + EXT Startup,Shutdown,CreateMBar,SetMenus,SetMItems,NewAlert + + EXT SetDIValue,PutText,GrabText,GetInt diff --git a/src/shell/ifd.equs.s b/src/shell/ifd.equs.s new file mode 100644 index 0000000..afd26d9 --- /dev/null +++ b/src/shell/ifd.equs.s @@ -0,0 +1,458 @@ +*====================================================== +* Equates needed in order to use the IFD Libraries +* Design and programming by Lane Roath +* Copyright (c) 1989 Lane Roath & Ideas From the Deep + +*------------------------------------------------------ +yes = 1 ;readability +no = 0 +*------------------------------------------------------ +* First, define which routines are to be used today... + +AllGrfx = no ;drawing, lines, etc +Allio = yes ;use all the disk IO routines + +DrawVBL = no ;wait for VBL before draws? +EraseVBL = no ;wait for VBL before erasing? +Shadowing = no ;draw to shadow'd screen? +Border = no ;show drawing speed on border? + +* Routines to draw directly to the screen, erased w/BGBuffer + +Place = no ;place frame (use appr. rtns!) + +FDraw = no ;direct draw (no mask) +MDraw = no ;masked draw +XMDraw = no ;EOR'd masked draw +XDraw = no ;eor'd draw (no mask) + +* The following routines require a background buffer + +FErase = no ;direct erase +MErase = no ;masked erase + +* These erase routines erase ONLY w/color 0... limited use! + +BErase = no ;black erase +ZErase = no ;zap frame erase + +* Routines to draw to the screen, use an UNDO buffer to erase! + +FDrawU = no ;draw w/undo saves +MDrawU = no ;masked draw w/undo saves +XMDrawU = no ;EOR'd masked draw w/undo +XDrawU = no ;EOR'd draw w/undo (no mask) + +Undo = no ;undo above draws + +* Define which plotting/line drawing routines to use + +XLines = no ;straight line drawing XOR'd +Lines = no ;straight line drawing +QDLines = no ;QD style lines +Dots = no ;dot plotting +XBoxes = no ;box drawing routines +QDBoxes = no ;QD Boxes + +* Sound playing routines + +PlayHdl = no ;pass Handle to sound +PlayPtr = no ;pass Pointer to sound +PlayTbl = no ;use table & pass offset +CustSnd = no ;custom sound stuff? + +* Define which disk I/O routines we will be using + +ioPath = no ;path setting +ioRead = no ;read from disk +ioWrite = no ;write to disk +ioGet = no ;get file SF dialog (open) +ioPut = no ;put file SF dialog (save) +ioCopyPath = no ;track multiple paths +DocChk = no ;check for doc click + +* Miscellaneous routines we have available + +SysErr = yes ;system error dialog +TxtErr = yes ;error handler (text io) +WtEvt = yes ;wait event routine +CtrDlg = yes ;center a dialog +Rndm = yes ;random # routines +VErrs = yes ;volume error handler +MemStuff = no ;memory handling routines +MenuStuff = yes ;menu create/handling rtns +SS_Stuff = yes ;startup/shutdown rtns +AlertWin = yes ;Alert Window routine +DlgStuff = yes ;Misc. dialog stuff +UnPacking = no ;SHR unpacking code + +*------------------------------------------------------ + do Allio.ioRead.ioWrite.ioGet.ioPut.ioCopyPath +AnyIO = yes + else ;make many tests easier! +AnyIO = no + fin +*------------------------------------------------------ + do AllGrfx.FDraw.MDraw.XMDraw.FDrawU.MDrawU.XMDrawU.XDraw.XDrawU +Draw = yes + else ;using any drawing routines? +Draw = no + fin +*------------------------------------------------------ + do AllGrfx.MErase.FErase.Undo +Erase = yes + else ;using any erase routines? +Erase = no + fin +*------------------------------------------------------ + do AllGrfx.XLines.Lines.QDLines.Dots.XBoxes.QDBoxes +Plot = yes + else ;using any plotting routines +Plot = no + fin +*------------------------------------------------------ + do Draw.Plot ;all we need to check! +AnyGrfx = yes + else ;make alot of tests much easier! +AnyGrfx = no + fin +*------------------------------------------------------ + do PlayHdl.PlayPtr.PlayTbl +AnySound = yes + else ;are we using any sound routines? +AnySound = no + fin + +*====================================================== +* Define IFD Zero page usage. We don't need much... + + dum 0 +Ptr ds 4 ;misc +Hdl ds 4 ;misc + +ID ds 2 ;user ID's for memory allocation +ID2 ds 2 +ID3 ds 2 + +temp ds 4 +temp2 ds 4 ;we use this area for lots of shit! +temp3 ds 4 + + do AnyGrfx ;--- only used by grfx routines --- + +ytemp ds 2 ;drawing temps! +xtemp ds 2 + +xloc ds 2 ;drawing coords +yloc ds 2 + +x_size = temp +y_add = temp2 +x_loc = temp2+2 ;only used in Setup +ScnPtr = temp3+2 +y_loc = ytemp + + do Erase.AllGrfx +ErasePtr = * ;only used by ERASE! + fin + +FramePtr ds 4 ;pointer to frame bits +MaskPtr ds 4 ;pointer to frame's mask + + do Undo.AllGrfx +UndoIdx ds 2 ;length of undo buffer +UndoPtr ds 4 ;pointer to undo buffer + fin + + fin + + do AnySound ;only needed for sound routines +SoundOff ds 2 ;BFL = play sound, BTR = don't + fin + +EndZP = * ;report size of ZP to user + + dend + +*------------------------------------------------------ +* Define the various data definitions we use + + dum 0 ;image header definition +I_Type ds 2 +I_Frames ds 2 +I_YSize ds 2 +I_XSize ds 2 +I_YHSize ds 2 +I_XHSize ds 2 +I_Table = * ;start of DA table + dend + + dum 0 ;Sound Shop sound file def +HFileID ds 4 +HDataOffset ds 4 +HVersID ds 4 +HDataID ds 4 +HLength2 ds 2 +HPbRate2 ds 2 +HVolume2 ds 2 +HEcho2 ds 2 +HLength ds 2 +HAce ds 2 +HPbRate ds 2 +HVolume ds 2 +HStereo ds 2 +HEcho ds 2 +HReserved ds 2 +HRepeat ds 2 +HOffset1 ds 4 +HExtra ds 4 +HFileName ds 16 +SSData = * ;start of digitized 8bit data + dend + +*------------------------------------------------------ +* Some general equates + +ScnWidth = 640 ;width of screen in lines +ScnBytes = 160 ;bytes per scan line +ScnLines = 200 ;scan line count + + do Shadowing +ScnBase = $012000 ;NOT always safe to use these! +SCBBase = $019D00 +PltBase = $019E00 + else +ScnBase = $E12000 ;always safe to use these! +SCBBase = $E19D00 +PltBase = $E19E00 + fin +SHR_size = $8000 ;size of base SHR screen +ScnSize = SHR_size + +VBLReg = $E0C019 ;VBL register +VideoCounters = $E0C02E ;vertical & horizontal (word) +ShadowReg = $E0C035 ;shadowing register + +Keyboard = $E0C000 ;read keypresses (BMI = new) +KeyClear = $E0C010 ;clear keypress (set ^ BPL) +KeyIsUp? = KeyClear ;BMI = key down, BPL = key up + +OA_Key = $E0C061 ;BMI = pressed (buttons 0 & 1) +SA_Key = $E0C062 ;BMI = Pressed ( of joystick ) + +yVect = $0003F8 ;CTRL-Y vector in monitor + +CR = 'M'&$1F +SPC = ' ' + +*===================================================================== +* These equates can be used with the GSOS.MACS in the MACRO.LIBRARY +* directory. You can also copy the data structures at the end of this +* file directly into your own source files. + +*------------------------------------------------------ +* File access - CreateRec, OpenRec access and requestAccess fields + +readEnable = %0000001 ;read enable bit: +writeEnable = %0000010 ;write enable bit: +backupNeeded = %0010000 ;backup needed bit:must be '0' in requestAccess field ) +renameEnable = %0100000 ;rename enable bit: +destroyEnable = %1000000 ;read enable bit: + +* base - > setMark = ... + +startPlus = $0000 ;base - setMark = displacement +eofMinus = $0001 ;base - setMark = eof - displacement +markPlus = $0002 ;base - setMark = mark + displacement +markMinus = $0003 ;base - setMark = mark - displacement + +* cachePriority + +noCache = $0000 ;cachePriority - do not cache blocks invloved in this read +cache = $0001 ;cachePriority - cache blocks invloved in this read if possible + +*------------------------------------------------------ +* GS/OS Error codes + +badSystemCall = $0001 ;bad system call number +invalidPcount = $0004 ;invalid parameter count +gsosActive = $0007 ;GS/OS already active +devNotFound = $0010 ;device not found +invalidDevNum = $0011 ;invalid device number +drvrBadReq = $0020 ;bad request or command +drvrBadCode = $0021 ;bad control or status code +drvrBadParm = $0022 ;bad call parameter +drvrNotOpen = $0023 ;character device not open +drvrPriorOpen = $0024 ;character device already open +irqTableFull = $0025 ;interrupt table full +drvrNoResrc = $0026 ;resources not available +drvrIOError = $0027 ;I/O error +drvrNoDevice = $0028 ;device not connected +drvrBusy = $0029 ;call aborted, driver is busy +drvrWrtProt = $002B ;device is write protected +drvrBadCount = $002C ;invalid byte count +drvrBadBlock = $002D ;invalid block address +drvrDiskSwitch = $002E ;disk has been switched +drvrOffLine = $002F ;device off line/ no media present +badPathSyntax = $0040 ;invalid pathname syntax +invalidRefNum = $0043 ;invalid reference number +pathNotFound = $0044 ;subdirectory does not exist +volNotFound = $0045 ;volume not found +fileNotFound = $0046 ;file not found +dupPathname = $0047 ;create or rename with existing name +volumeFull = $0048 ;volume full error +volDirFull = $0049 ;volume directory full +badFileFormat = $004A ;version error (incompatible file format) +badStoreType = $004B ;unsupported (or incorrect) storage type +eofEncountered = $004C ;end-of-file encountered +outOfRange = $004D ;position out of range +invalidAccess = $004E ;access not allowed +buffTooSmall = $004F ;buffer too small +fileBusy = $0050 ;file is already open +dirError = $0051 ;directory error +unknownVol = $0052 ;unknown volume type +paramRangeErr = $0053 ;parameter out of range +outOfMem = $0054 ;out of memory +dupVolume = $0057 ;duplicate volume name +notBlockDev = $0058 ;not a block device +invalidLevel = $0059 ;specifield level outside legal range +damagedBitMap = $005A ;block number too large +badPathNames = $005B ;invalid pathnames for ChangePath +notSystemFile = $005C ;not an executable file +osUnsupported = $005D ;Operating System not supported +stackOverflow = $005F ;too many applications on stack +dataUnavail = $0060 ;Data unavailable +endOfDir = $0061 ;end of directory has been reached +invalidClass = $0062 ;invalid FST call class +resNotFound = $0063 ;file does not contain required resource + +*------------------------------------------------------ +* FileSysID's + +proDOS = $0001 ;ProDOS/SOS +dos33 = $0002 ;DOS 3.3 +dos32 = $0003 ;DOS 3.2 +dos31 = $0003 ;DOS 3.1 +appleIIPascal = $0004 ;Apple II Pascal +mfs = $0005 ;Macintosh (flat file system) +hfs = $0006 ;Macintosh (hierarchical file system) +lisa = $0007 ;Lisa file system +appleCPM = $0008 ;Apple CP/M +charFST = $0009 ;Character FST +msDOS = $000A ;MS/DOS +highSierra = $000B ;High Sierra + +* fileSysID (NEW FOR GSOS 5.0) + +ProDOSFSID = $01 ;ProDOS/SOS +dos33FSID = $02 ;DOS 3.3 +dos32FSID = $03 ;DOS 3.2 +dos31FSID = $03 ;DOS 3.1 +appleIIPascalFSID = $04 ;Apple II Pascal +mfsFSID = $05 ;Macintosh (flat file system) +hfsFSID = $06 ;Macintosh (hierarchical file system) +lisaFSID = $07 ;Lisa file system +appleCPMFSID = $08 ;Apple CP/M +charFSTFSID = $09 ;Character FST +msDOSFSID = $0A ;MS/DOS +highSierraFSID = $0B ;High Sierra +ISO9660FSID = $0C ;ISO 9660 +AppleShare = $0D ;AppleShare + +* FSTInfo.attributes + +characterFST = $4000 ;character FST +ucFST = $8000 ;SCM should upper case pathnames before +; passing them to the FST +* QuitRec.flags + +onStack = $8000 ;place state information about quitting +; program on the quit return stack +restartable = $4000 ;the quitting program is capable of being +; restarted from its dormant memory +* StorageType + +seedling = $0001 ;standard file with seedling structure +standardFile = $01 ;standard file type (no resource fork) +sapling = $0002 ;standard file with sapling structure +tree = $0003 ;standard file with tree structure +pascalRegion = $0004 ;UCSD Pascal region on a partitioned disk +extendedFile = $0005 ;extended file type (with resource fork) +directoryFile = $000D ;volume directory or subdirectory file + +* version + +minorRelNum = $00FF ;version - minor release number +majorRelNum = $7F00 ;version - major release number +finalRel = $8000 ;version - final release + +isFileExtended = $8000 + +*------------------------------------------------------ +* GSOS Call ID numbers + +* Set 'Class1' to $2000 to use Class 1 calls, $0000 for Class 0 calls + +*Class1 = $2000 + +prodos = $E100A8 + +_Create = $0001.Class1 +_Destroy = $0002.Class1 +_OSShutdown = $2003 ;class '1' only +_ChangePath = $0004.Class1 +_SetFileInfo = $0005.Class1 +_GetFileInfo = $0006.Class1 +_Volume = $0008.Class1 +_SetPrefix = $0009.Class1 +_GetPrefix = $000A.Class1 +_ClearBackup = $000B.Class1 +_SetSysPrefs = $200C ;class '1' only +_Null = $200D ;class '1' only +_ExpandPath = $200E ;class '1' only +_GetSysPrefs = $200F ;class '1' only +_Open = $0010.Class1 +_Newline = $0011.Class1 +_Read = $0012.Class1 +_Write = $0013.Class1 +_Close = $0014.Class1 +_Flush = $0015.Class1 +_SetMark = $0016.Class1 +_GetMark = $0017.Class1 +_SetEOF = $0018.Class1 +_GetEOF = $0019.Class1 +_SetLevel = $001A.Class1 +_GetLevel = $001B.Class1 +_GetDirEntry = $001C.Class1 +_BeginSession = $201D ;class '1' only +_EndSession = $201E ;class '1' only +_SessionStatus = $201F ;class '1' only +_GetDevNumber = $0020.Class1 +_GetLastDev = $0021.Class1 +_ReadBlock = $0022 ;class '0' only +_WriteBlock = $0023 ;class '0' only +_Format = $0024.Class1 +_EraseDisk = $0025.Class1 +_ResetCache = $2026 ;class '1' only +_GetName = $0027.Class1 +_GetBootVol = $0028.Class1 +_Quit = $0029.Class1 +_GetVersion = $002A.Class1 +_GetFSTInfo = $202B ;class '1' only +_DInfo = $002C.Class1 +_DStatus = $202D ;class '1' only +_DControl = $202E ;class '1' only +_DRead = $202F ;class '1' only +_DWrite = $2030 ;class '1' only +_AllocInterrupt = $0031 ;P16 call +_BindInt = $2031 ;GS/OS call +_DeallocInterrupt = $0032 ;P16 call +_UnbindInt = $2032 'GS/OS call +_AddNotifyProc = $2034 ;class '1' only +_DelNotifyProc = $2035 ;class '1' only +_DRename = $2036 ;class '1' only +_GetStdRefNum = $2037 ;class '1' only +_GetRefNum = $2038 ;class '1' only +_GetRefInfo = $2039 ;class '1' only + + fin ;--- disk IO equates --- diff --git a/src/shell/ifd.lib.s b/src/shell/ifd.lib.s new file mode 100644 index 0000000..0a95df8 --- /dev/null +++ b/src/shell/ifd.lib.s @@ -0,0 +1,34 @@ + lst off + tr on + exp off + mx %00 + cas se + + rel ;creating a LNK library + +*====================================================== +* Control file needed in order to assemble the IFD Libraries +* Design and programming by Lane Roath +* Copyright (c) 1989 Lane Roath & Ideas From the Deep +*------------------------------------------------------ +* 25-Oct-89 1.00 :finish first version & text it out +*====================================================== + +Class1 = $2000 + + use ifd.equs + use 3/ifdlib/macs + + EXT QuickASM + + jmp QuickASM + + ENT ON + + put 3/ifdlib/disk + put 3/ifdlib/draw + put 3/ifdlib/misc + + ENT OFF + + sav 2/obj/ifd.lib diff --git a/src/shell/link.s b/src/shell/link.s new file mode 100644 index 0000000..0e01f73 --- /dev/null +++ b/src/shell/link.s @@ -0,0 +1,35 @@ +*====================================================== +* Link file for the IFD TEdit word processor +* Written by Lane Roath +* Copyright (c) 1989 Ideas from the Deep +*====================================================== + + lkv $01 ;xtra linker, OMF 2 + ver $02 + + FAS + + if equs + + asm qasm2 + asm qasm1 + asm qasm + + fin + + do err + else + + CMD p,s,q + + lnk 2/obj/ifd.lib + lnk 2/obj/qasm2.l + lnk 2/obj/qasm1.l + lnk 2/obj/qasm.l + + ds 1024 ;buffer space + + typ S16 + sav 2/QASM + + fin diff --git a/src/shell/macs.s b/src/shell/macs.s new file mode 100644 index 0000000..9172df7 --- /dev/null +++ b/src/shell/macs.s @@ -0,0 +1,953 @@ +utool mac + ldx #]1*256+ToolNum + do userorsys + jsl $E10008 + else + jsl $E10000 + fin + <<< +_QASetShellID mac + utool $56 + <<< +_QARun mac + utool $23 + <<< +_QAStatus mac + utool $06 + <<< +~QAGetQuitFlag mac ;_QAGetQuitFlag():quitflag + pha + utool $1D + <<< +~QASetQuitFlag mac ;_QASetQuitFlag(quitflag) + psw ]1 + utool $1E + <<< +~QASetLaunch MAC + psl ]1 + psw ]2 +_QASetLaunch mac ;_QASetLaunch(@path,flags) + utool $60 + <<< +~QAGetLaunch MAC + pha + pha + pha +_QAGetLaunch mac + utool $5F + <<< +~QASetVector MAC + psw ]1 + psl ]2 + utool $2F + <<< +_QAResetVectors mac ;_QAResetVectors() + utool $30 + <<< +~QASetCancelFlag MAC + psw ]1 + utool $40 + <<< +~QACompile MAC + psw ]1 + psl ]2 + utool $26 + <<< +~QALink MAC + psw ]1 + psl ]2 + utool $27 + <<< +~QAParseCmdLine MAC + pha + pha + psl ]1 + utool $1C + <<< +_QAExecCommand mac + utool $21 + <<< +~GetScrapHandle MAC + P2SW ]1 + Tool $E16 + <<< +~TEScroll MAC + PHW ]1 + PxL ]2;]3;]4 + Tool $2522 + <<< +~TEPointToOffset MAC + PHS 2 + PxL ]1;]2;]3 + Tool $2122 + <<< +~TEKey MAC + PxL ]1;]2 + Tool $1422 + <<< +~TEClear MAC + PHL ]1 + Tool $1922 + <<< +_WaitCursor MAC + Tool $A12 + <<< +_InitCursor MAC + Tool $CA04 + <<< +~MessageCenter MAC + PxW ]1;]2 + PHL ]3 + Tool $1501 + <<< +~NewHandle MAC + P2SL ]1 + PxW ]2;]3 + PHL ]4 + Tool $902 + <<< +~HiliteMenu MAC + PxW ]1;]2 + Tool $2C0F + <<< +~TaskMaster MAC + PHA + PHWL ]1;]2 + Tool $1D0E + <<< +~FrontWindow MAC + PHS 2 + Tool $150E + <<< +~CloseWindow MAC + PHL ]1 + Tool $B0E + <<< +_CloseAllNDAs MAC + Tool $1D05 + <<< +~DrawControls MAC + PHL ]1 + Tool $1010 + <<< +~NewControl2 MAC + P2SL ]1 + PHWL ]2;]3 + Tool $3110 + <<< +~NewWindow MAC + P2SL ]1 + Tool $90E + <<< +~SendBehind MAC + PxL ]1;]2 + Tool $140E + <<< +~Alert MAC + PHA + PxL ]1;]2 + Tool $1715 + <<< +~FMGetCurFID MAC + PHS 2 + Tool $1A1B + <<< +~ChooseFont MAC + P2SL ]1 + PHW ]2 + Tool $161B + <<< +~ItemID2FamNum MAC + P1SW ]1 + Tool $171B + <<< +~TESetSelection MAC + PxL ]1;]2;]3 + Tool $1D22 + <<< +~DisposeHandle MAC + PHL ]1 +_DisposeHandle MAC + Tool $1002 + <<< +~TEInsert MAC + PHWL ]1;]2 + PHLW ]3;]4 + PxL ]5;]6 + Tool $1A22 + <<< +~TEGetSelStyle MAC + PHA + PxL ]1;]2;]3 + Tool $1E22 + <<< +~TEStyleChange MAC + PHW ]1 + PxL ]2;]3 + Tool $1F22 + <<< +~TESetText MAC + PHWL ]1;]2 + PHLW ]3;]4 + PxL ]5;]6 + Tool $B22 + <<< +~TEGetText MAC + PHS 2 + PHWL ]1;]2 + PHLW ]3;]4 + PxL ]5;]6 + Tool $C22 + <<< +~TEGetSelection MAC + PxL ]1;]2;]3 + Tool $1C22 + <<< +~TEReplace MAC + PHWL ]1;]2 + PHLW ]3;]4 + PxL ]5;]6 + Tool $1B22 + <<< +~AlertWindow MAC + P1SW ]1 + PxL ]2;]3 + Tool $590E + <<< +~ZoomWindow MAC + PHL ]1 + Tool $270E + <<< +~TEUpdate MAC + PHL ]1 + Tool $1222 + <<< +~PrSetDocName MAC + PHL ]1 + Tool $3713 + <<< +_PrDefault MAC + Tool $0913 + <<< +~PrValidate MAC + P1SL ]1 + Tool $0A13 + <<< +~PrJobDialog MAC + P1SL ]1 + Tool $0C13 + <<< +~PrOpenDoc MAC + P2SL ]1 + PHL ]2 + Tool $0E13 + <<< +~PrCloseDoc MAC + PHL ]1 + Tool $0F13 + <<< +~PrOpenPage MAC + PxL ]1;]2 + Tool $1013 + <<< +~PrClosePage MAC + PHL ]1 + Tool $1113 + <<< +~PrPicFile MAC + PxL ]1;]2;]3 + Tool $1213 + <<< +~PrSetError MAC + PHW ]1 +_PrSetError MAC + Tool $1513 + <<< +~GetPortRect MAC + PHL ]1 + Tool $2004 + <<< +~TEPaintText MAC + P2SL ]1 + PxL ]2;]3 + PHWL ]4;]5 + Tool $1322 + <<< +~PrStlDialog MAC + P1SL ]1 + Tool $0B13 + <<< +~SetWRefCon MAC + PxL ]1;]2 + Tool $280E + <<< +~GetWRefCon MAC + P2SL ]1 + Tool $290E + <<< +~SetWTitle MAC + PxL ]1;]2 + Tool $D0E + <<< +~GetWTitle MAC + P2SL ]1 + Tool $E0E + <<< +~SetInfoRefCon MAC + PxL ]1;]2 + Tool $360E + <<< +~GetCtlHandleFromID MAC + PHS 2 + PxL ]1;]2 + Tool $3010 + <<< +~GetInfoRefCon MAC + P2SL ]1 + Tool $350E + <<< +~CloseDialog MAC + PHL ]1 + Tool $C15 + <<< +~ModalDialog MAC + P1SL ]1 + Tool $F15 + <<< +~GetIText MAC + PHL ]1 + PHWL ]2;]3 +_GetIText MAC + Tool $1F15 + <<< +~SetIText MAC + PHL ]1 + PHWL ]2;]3 +_SetIText MAC + Tool $2015 + <<< +~GetNewModalDialog MAC + P2SL ]1 + Tool $3215 + <<< +~ShowHide MAC + PHWL ]1;]2 +_ShowHide MAC + Tool $230E + <<< +~ShowWindow MAC + PHL ]1 + Tool $130E + <<< +~SelectIText MAC + PHL ]1 + PxW ]2;]3;]4 + Tool $2115 + <<< +~GetDItemValue MAC + PHA + PHLW ]1;]2 + Tool $2E15 + <<< +~SetDItemValue MAC + PHW ]1 + PHLW ]2;]3 +_SetDItemValue MAC + Tool $2F15 + <<< +~SetFontFlags MAC + PHW ]1 + Tool $9804 + <<< +~SetPort MAC + PHL ]1 + Tool $1B04 + <<< +~InsertMItem MAC + PHL ]1 + PxW ]2;]3 + Tool $F0F + <<< +_DeleteMItem MAC + Tool $100F + <<< +~CalcMenuSize MAC + PxW ]1;]2;]3 + Tool $1C0F + <<< +~CheckMItem MAC + PxW ]1;]2 + Tool $320F + <<< +~SetMItemName MAC + PHLW ]1;]2 + Tool $3A0F + <<< +~SelectWindow MAC + PHL ]1 +_SelectWindow MAC + Tool $110E + <<< +~GetWKind MAC + P1SL ]1 + Tool $2B0E + <<< +~GetNextWindow MAC + P2SL ]1 + Tool $2A0E + <<< +~GetFirstWindow MAC + PHS 2 + Tool $520E + <<< +~MoveWindow MAC + PxW ]1;]2 + PHL ]3 + Tool $190E + <<< +~SizeWindow MAC + PxW ]1;]2 + PHL ]3 + Tool $1C0E + <<< +~NotifyCtls MAC + PxW ]1;]2 + PxL ]3;]4 + Tool $2D10 + <<< +~SetPortLoc MAC + PHL ]1 + Tool $1D04 + <<< +~GetPortLoc MAC + PHL ]1 + Tool $1E04 + <<< +~Dec2Int MAC + P1SL ]1 + PxW ]2;]3 +_Dec2Int MAC + Tool $280B + <<< +~Int2Dec MAC + PHWL ]1;]2 + PxW ]3;]4 + Tool $260B + <<< +~Long2Dec MAC + PxL ]1;]2 + PxW ]3;]4 + Tool $270B + <<< +~TECopy MAC + PHL ]1 + Tool $1722 + <<< +~TEGetRuler MAC + PHWL ]1;]2 + PHL ]3 + Tool $2322 + <<< +~TESetRuler MAC + PHW ]1 + PxL ]2;]3 + Tool $2422 + <<< +~ReadFile MAC + lda ]1 + ldy ]2 + jsr ReadFile + <<< +~WriteFile MAC + do ]0/3 + lda ]3 + sta CreateParms+8 + fin + ldy ]1 + lax ]2 + jsr WriteFile + <<< +~GetFile MAC + lda ]1 + ldx ]2 + ldy ]3 +_GetFile MAC + jsr GetFile + <<< +~PutFile MAC + lda ]1 + ldx ]2 + jsr PutFile + <<< +~PutText MAC + ldx ]1 + lda ]2 +_PutText MAC + jsr PutText + <<< +~GrabText MAC + ldx ]1 + lda ]2 +_GrabText MAC + jsr GrabText + <<< +~GetInt MAC + ldx ]1 +_GetInt MAC + jsr GetInt + <<< +~TEGetLastError MAC + PHA + PHWL ]1;]2 + Tool $2722 + <<< +~InvalCtls MAC + PHL ]1 + Tool $3710 + <<< +_CreateSFPath MAC + jsr CreateSFPath + <<< +_GSOS MAC + do inline + jsl prodos + dw ]1 + adrl ]2 + else + psl #]2 + pea ]1 + jsl prodosIL + fin + <<< +~SysError MAC + ldx ]1 + do ]0/2 + lda ]2 + fin + jsr SysError + <<< +~CenterDialog MAC + lda ]1 + jsr CenterDialog + <<< +~Startup MAC + ldx ]1 + ldy ]2 + lda ]3 + jsr Startup + <<< +_Shutdown MAC + jsr Shutdown + <<< +~CreateMBar MAC + lda ]1 + ldx ]2 + ldy ]3 + jsr CreateMBar + <<< +_SetMenus MAC + jsr SetMenus + <<< +_SetMItems MAC + jsr SetMItems + <<< +~FreeMem MAC + PHS 2 + Tool $1B02 + <<< +~MaxBlock MAC + PHS 2 + Tool $1C02 + <<< +~TotalMem MAC + PHS 2 + Tool $1D02 + <<< +~RealFreeMem MAC + PHS 2 + Tool $2F02 + <<< +~TEGetTextInfo MAC + PHLW ]1;]2 + PHL ]3 + Tool $D22 + <<< +~CheckClick MAC + lda #]1 + jsr CheckClick + <<< +~NewAlert MAC + lda #]1 + jsr NewAlert + <<< +~CreateResourceFile MAC + PHLW ]1;]2 + PHWL ]3;]4 + Tool $91E + <<< +~OpenResourceFile MAC + P1SW ]1 + PxL ]2;]3 + Tool $A1E + <<< +_CloseResourceFile MAC + Tool $B1E + <<< +~AddResource MAC + PHLW ]1;]2 + PHWL ]3;]4 + Tool $C1E + <<< +~LoadResource MAC + P2SW ]1 + PHL ]2 + Tool $E1E + <<< +~DetatchResource MAC + PHWL ]1;]2 + Tool $181E + <<< +~RemoveResource MAC + PHWL ]1;]2 + Tool $F1E + <<< +~HLock MAC + PHL ]1 + Tool $2002 + <<< +~HUnlock MAC + PHL ]1 + Tool $2202 + <<< +~GetHandleSize MAC + P2SL ]1 + Tool $1802 + <<< +~HandToHand MAC + PxL ]1;]2;]3 + Tool $2A02 + <<< +~InitialLoad MAC + PHS 5 + PHWL ]1;]2 + PHW ]3 + Tool $911 + <<< +~SetTSPtr MAC + PxW ]1;]2 + PHL ]3 + Tool $A01 + <<< +_SetHandleSize MAC + Tool $1902 + <<< +_QABootInit mac + utool $01 + <<< +_QAStartup mac + utool $02 + <<< +_QAGetLine mac + utool $10 + <<< +~QASetParmHdl MAC + psl ]1 + utool $11 + <<< +~QASetCmdHdl MAC + psl ]1 + psw ]2 + utool $13 + <<< +~QASetCmdTbl MAC + psl ]1 + utool $1F + <<< +~QAGetCompileID MAC + pha + utool $2A + <<< +~QASetCompileID MAC + psw ]1 + utool $2B + <<< +~QAGetLinkID MAC + pha + utool $2C + <<< +~QASetLinkID MAC + psw ]1 + utool $2D + <<< +_QAGetCmdRecSize mac + utool $32 + <<< +~QAGetWord MAC + pha + pha + psl ]1 + psw ]2 + psw ]3 + utool $61 + <<< +~QANextLine MAC + pha + psl ]1 + psw ]2 + psw ]3 + utool $6C + <<< +~QADrawStr MAC + psl ]1 + utool $0A + <<< +_QAShutdown mac + utool $03 + <<< +_QADispose mac + utool $24 + <<< +_QADrawBlock mac + utool $5B + <<< +~QADrawVersion mac + psl ]1 + utool $65 + <<< +_QAPrByteL mac + utool $0C + <<< +_QADrawCR mac + utool $63 + <<< +_GrafOn MAC + Tool $A04 + <<< +_GrafOff MAC + Tool $B04 + <<< +_QAClearKey MAC + utool $6D + <<< +P2SW MAC + PHA + PHA + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +CmpLong MAC + LDA ]1 + CMP ]2 + IF #=]1 + LDA ^]1 + ELSE + LDA ]1+2 + FIN + IF #=]2 + SBC ^]2 + ELSE + SBC ]2+2 + FIN + <<< +Hdl_Ptr MAC + lda []1] + sta ]2 + ldy #2 + lda []1],y + sta ]2+2 + <<< +bfl mac + beq ]1 + <<< +btr mac + bne ]1 + <<< +lax mac + lda ]1 + if #,]1 + ldx ^]1 + else + ldx ]1+2 + fin + <<< +sax MAC + sta ]1 + stx ]1+2 + <<< +P1SL MAC + PHA + IF #=]1 + PEA ^]1 + ELSE + PHW ]1+2 + FIN + PHW ]1 + <<< +MoveLong MAC + MoveWord ]1;]2 + MoveWord ]1+2;]2+2 + <<< +MoveWord MAC + LDA ]1 + STA ]2 + IF MX/2 + LDA ]1+1 + STA ]2+1 + FIN + <<< +PHLW MAC + PHL ]1 + PHW ]2 + <<< +P1SW MAC + PHA + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +PxL MAC + DO ]0/1 + PHL ]1 + DO ]0/2 + PHL ]2 + DO ]0/3 + PHL ]3 + DO ]0/4 + PHL ]4 + FIN + FIN + FIN + FIN + <<< +PHWL MAC + PHW ]1 + PHL ]2 + <<< +PHS MAC + DO ]0 + LUP ]1 + PHA + --^ + ELSE + PHA + FIN + <<< +psw MAC +PushWord MAC + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +PxW MAC + DO ]0/1 + PHW ]1 + DO ]0/2 + PHW ]2 + DO ]0/3 + PHW ]3 + DO ]0/4 + PHW ]4 + FIN + FIN + FIN + FIN + <<< +P2SL MAC + PHA + PHA + IF #=]1 + PEA ^]1 + ELSE + PHW ]1+2 + FIN + PHW ]1 + <<< +psl mac +PHL MAC + IF #=]1 + PEA ^]1 + ELSE + PHW ]1+2 + FIN + PHW ]1 + <<< +PHW MAC + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +PullLong MAC + DO ]0 + PullWord ]1 + PullWord ]1+2 + ELSE + PullWord + PullWord + FIN + <<< +PullWord MAC + PLx + DO ]0 + STx ]1 + FIN + IF MX/2 + PLx + DO ]0 + STx ]1+1 + FIN + FIN + <<< +LONGAX MAC + IF MX + REP %00110000 + FIN + <<< +SHORTAX MAC + IF MX!%11 + SEP %00110000 + FIN + <<< +LONGM MAC + IF MX&2 + REP %00100000 + FIN + <<< +SHORTM MAC + IF MX&2 + ELSE + SEP %00100000 + FIN + <<< +Tool MAC + LDX #]1 + JSL $E10000 + <<< diff --git a/src/shell/qasm.s b/src/shell/qasm.s new file mode 100644 index 0000000..6ed3cd5 --- /dev/null +++ b/src/shell/qasm.s @@ -0,0 +1,1649 @@ + lst off + ttl "QuickASM Shell v0.70" + exp off + tr on + cas se +* dup +*====================================================== +* Graphic Shell for QuickASM development system + +* Programming by Lane Roath +* Copyright (c) 1990 Ideas From the Deep & Lane Roath +*------------------------------------------------------ +* 26-Jun-90 0.70 :Line/Label in, Find centers text, WORDS works! +* 20-Jun-90 0.60 :now works w/new stuff from Shawn & LOGIN!!!! +* 10-Jun-90 0.50 :asm,link,menus now much easier to use +* 30-Mar-90 0.40 :One shell, graphics & text... works! +* 01-Mar-90 0.35 :QA command parsing working!!! +* 27-Feb-90 0.30 :QA output trapped, link & assemble work +* 22-Feb-90 0.20 :start adding QA stuff (seperate file) +* 09-Feb-90 0.10 :start graphics shell from WW code +*====================================================== + + rel + +Version = $00700000 ;v0.70 +Class1 = $2000 + + lst off + use 2/data/qa.equates + use macs + use ifd.equs + use equs + lst rtn + + EXT HProj,HSrc,HGSOS,HTran,HTool,InstallKey,LoadQAStuff + EXT pchr,pstr,pblk,pechr,pestr,peblk,DoClear,DoEnter + EXT doTextMode,PrintWelcome,pt2c,SetStyle,mySetRuler + EXT GrafVectors,SetTabs + +*====================================================== +* Startup the program & do all that cool stuff + +QuickASM ENT + phk ;use our bank as data bank + plb + tdc ; & save DP for special use + sta myDP + + ~Startup #SSRec;#mySD;#0 ;startup the toolbox + + stz WdwCnt + stz SDFlg + stz ClearFlg + stz EnterFlg + stz PrtOK? + stz LastFile + stz SaveText + lda #5002 ;init window menu + sta WMenuRef + lda #1 ;init search flags + sta CaseFlg + sta FromTop + stz WordFlg + stz LabelFlg + inc + sta TextPath ;can't have NIL initial path! + lda #'1:' + sta TextPath+2 + + ~NewHandle #200;ID2;#0;#0 ;allocate print record + ply + sty PrtHdl ;save handle, good or bad (stack)! + plx + stx PrtHdl+2 + bcs :4 + phx + phy + _PrDefault ;init record w/default values + bcc :1 +:4 + ~SysError #MPInit ;show error w/allocation + bra :0 +:1 + dec PrtOK? + Hdl_Ptr PrtHdl;Ptr + ldy #$18 ;index to wDev in style subrecord + lda [Ptr],y + and #%11111111_11011010 ;force condensed & text quality + ora #%00000000_00000001 + sta [Ptr],y +:0 + ~FMGetCurFID ;get current font ID + PullLong NewStyle + lda #22 + sta NewStyle ;force cmd windows to be in COURIER! + SEP #$20 + lda #12 ;use 10 point + sta NewStyle+3 + REP #$20 + + jsr LoadQAStuff ;need QA stuff + bcc :qagood + ~SysError #QAError +:qagood + jsr PrintWelcome ;show QuickASM welcome text + + jsr GrafVectors ;set print vectors for graphics + + ~CreateMBar #Menus;#AppleMenu;#0 ;create our menu bar + + lda #16*1024 ;16K max + sta TEMaxChrs + + lda #100 + sta WdwRec ;only use half of screen + lda #CmdWdwID + sta WdwIDNum + ldx #CmdTitle ;open command window + jsr OpenWindow + lax WdwPtr + sax CmdPtr ;save wdw pointer + lax TEHdl + sax CmdTEHdl ;save TE handle (for inserts) + + jsr InstallKey ;let ENTER,CLEAR work + + lda #25 + sta WdwRec + lda #100 ;only use half of screen + sta WdwRec+4 + lda #ErrWdwID + sta WdwIDNum + ldx #ErrTitle ;open error window + jsr OpenWindow + lax WdwPtr + sax ErrPtr ;save wdw pointer + lax TEHdl + sax ErrTEHdl ;save TE handle (for inserts) + + jsr InstallKey ;setup as required + + stz TEMaxChrs ;unlimited source size + lda #199 + sta WdwRec+4 ;docs use all of screen + lda #WindowID + sta WdwIDNum + sta FrontWdw ;force update of menus + + ~SelectWindow CmdPtr + + stz PrintBuf + jsr PrintWelcome ;show QuickASM welcome text + + _InitCursor ;no longer waiting to startup + + ~CheckClick #TextName ;do we have a doc to open? + txa + beq :9 ; no- don't open anything + + jsr HProj ;open new/finder doc +:9 + do TeaseWare + jsr DoTease ;show teaser if on + fin + +*====================================================== +* Main event loop + +Main + _QARun ;allow background apps time + + ~QAGetQuitFlag ;time to quit? + pla + bfl :0 + jsr mySD ; yes- repeat if open windows +:0 + jsr SetWindow ;insure menus set correctly + + ~TaskMaster #$FFFF;#TaskRc ;handle the tasks! + pla + bfl :9 ;result from TaskMaster + + cmp #$19 ;special menu item? + beq :4 + cmp #$11 ;menu event? + bne :1 +:4 + jsr HandleMenus ; yes- handle it + bra :9 +:1 + cmp #$16 ;close window + bne :2 + jsr CloseWindow ; yes- do so! +:2 +:9 + ~TEGetLastError #-1;TEHdl ;report any internal errors + pla + bfl :ok + ~SysError #MTEInfo ; (saves crashes!) + bra Main +:ok + lda ClearFlg ;user press CLEAR? + beq :9a + jsr DoClear ; yes- clear text +:9a + lda EnterFlg ;how about ENTER? + beq Main + jsr DoEnter ; yes- parse line + bra Main + +*====================================================== +* Close all windows, save all docs, and shutdown the tools + +mySD + phk + plb + clc ;use our bank, in 65816, 16 bit mode + xce + rep #$30 + lda myDP + tcd + + lda WdwCnt ;do we need to close a window? + cmp #3 + blt :1 + jsr CloseWindow ; yes- try to do so + bcc :2 + ~QASetQuitFlag #0 ;user canceled!!! + stz SDFlg +:2 rts +:1 + ~QAGetLaunch ;get launch flags (leave on stack) + _QADispose + _QAShutdown ;shutdown QA tools + + _Shutdown ;shutdown real tools + + ply + pla + plx ;get launch flags from stack + stz QuitParms + lax #TextPath ;[][ vat do we get back? ][] + sax QuitParms+2 + sty QuitParms+6 ; & save to quit area + tya + beq :quit + and #$FF ;launch or shutdown? + bfl :launch + + lda #1 ; SD- make parms usable + sta SDParms + _GSOS _OSShutdown;SDParms ;shutdown + brk $69 +:launch + lda #2 + sta QuitParms ;use launch parms! +:quit + _GSOS _Quit;QuitParms + brk $69 + +*====================================================== +* Handle Menu events from Task Master + +HandleMenus + lda TData+2 + ldx #-2 ;locate index +]loop inx + inx + cpx MaxMenus ;should never happen! + bge :err + cmp MenuNums,x ; by looking for menu # + bne ]loop + lda TData ; item = item # - menu # + sec + sbc TData+2 ;and exit via da table + jsr (HdlMenus,x) + + ~HiliteMenu #0;TData+2 ;unhilite menu + rts +:err + ora #$8000 + ~SysError #MMenu ;ohhhh no! + rts + +*====================================================== +* Set the window after a new one becomes active + +SetWindow + ~FrontWindow + pla ;get pointer to front window + plx ; (system,ours,none) + cmp WdwPtr + bne :1 + cpx WdwPtr+2 ;is this a new window? + bne :1 + rts ; no- done! +:1 + sax WdwPtr ; yes- save pointer + ora WdwPtr+2 + bfl :disable ;window open? + + ~CheckMItem #0;LastFile ; yes- uncheck last file in menu + + ~GetWKind WdwPtr ;is this one of our windows? + plx + stx SysWdw ;save status + bmi :disable + + ~GetCtlHandleFromID WdwPtr;#TECtrlID + PullLong TEHdl + + ~GetWRefCon WdwPtr ;get application value + plx + stx LastFile ;check in menu + ~CheckMItem #1;LastFile + ply + cpy #WindowID ;source window? + bne :disable+2 + brl EnableMenus ; yes, enable our menus +:disable + stz LastFile + brl DisableMenus ; no, disable our menus + +*====================================================== +* Handle Apple menu events + +HApple + bne :1 about? + ldx #Anorm + ldy #anz-Anorm + lda TaskRc+14 ;option key pressed? + and #%0000100000000000 + bfl :a + ldx #Aspcl ; yes, show bullshit dialog + ldy #asz-Aspcl +:a + stx AMod ;set text to show + sty AMod+4 + ~CenterDialog #DAbout + ~Alert #DAbout;#0 ; & display centered alert + pla +:1 + dec ;help? + bne :2 +:2 + do TeaseWare +DoTease ~NewAlert #DTease ; yes, does user really want to? + fin + + rts + +*====================================================== +* Handle the File menu selections + +HFile ENT + asl ;create index + tax + jmp (:tbl,x) ; & pass control to item handler +:tbl + da :Close + da :New + da :Open + da :Save + da :Save_As + da :Write + da :Write_As + da :Append + da :Revert + da :Page_Setup + da :Print + da :Shutdown + da :Quit + +*------------------------------------------------------ +:Close + brl CloseWindow +*------------------------------------------------------ +:New + SHORTAX + ldx NewName + inc NewName+1,x ;we allow new files A-Z + LONGAX + ldx #NewName + brl OpenWindow2 ; yes- do so! + +*------------------------------------------------------ +:Open + ldy #TxtTypes + lda TaskRc+14 ;option key pressed? + and #%0000100000000000 + bfl :a + ldy #AllTypes ; yes! Allow opening of ANY file! +:a + lda #OpenPrompt + ldx #TextName ;present SFDialog to select file + _GetFile + bcs :2b + btr :2a +:1a rts ;no file selected! +:2a + _WaitCursor + jsr :ReadFile ;read file w/style if present + bcs :2d + ldx #TextPath ;title = pathname + jsr OpenWindow2 ;Now open a window for the text! + bcs :2d + jsr SetText ;place text into TERec + bcc :2c +:2d + jsr RemoveText ;error- clean up memory +:2b + ~SysError #MFOpen ;inform user of errors +:2c + _InitCursor + rts +*------------------------------------------------------ +:Write + dec SaveText ;FALL THRU!!! +*------------------------------------------------------ +:Save + ~GetWTitle WdwPtr ; yes- need a filename? + PullLong Ptr + lda [Ptr] + cmp #$550A ; (untitled = 10,'U') + beq :Save_As + brl SaveData ; no, just save + +*------------------------------------------------------ +:Write_As + dec SaveText ;FALL THRU!!! +*------------------------------------------------------ +:Save_As + ~GetWTitle WdwPtr ; yes- get filename + pla + plx ; & set up for SF dialog + ldy #TextName + _CreateSFPath ; (set path & file info) + bcs :2b + ~PutFile #SavePrompt;#TextName + bcs :2b + bfl :2c + ~GetInfoRefCon WdwPtr ;get handle to title memory + _DisposeHandle ; & free that memory! + bcs :2b + ldx #InPath ;reset window title + jsr SetWdwTitle +:g2b bcs :2b + brl SaveData ;save file under new name! + +*------------------------------------------------------ +:Page_Setup + lda PrtOK? ;ok to do this? + bfl :6a + ~PrStlDialog PrtHdl ; yep, do so + plx +:62b bcs :52b +:6a rts + +*------------------------------------------------------ +:Print + lda PrtOK? ; yes, printing ok? + bfl :6a + brl PrintText ; yes- do so! + +*------------------------------------------------------ +:Append + ~GetFile #AppendPrompt;#TextName;#TxtTypes + bcs :g2b + bfl :6a + ~TESetSelection #-1;#-1;#0 ;move to end of text +:DoApnd + _WaitCursor + jsr :ReadFile ;read text & style from file +:52b bcs :g2b + ~TEReplace #%1101;textH;#0;#1;styleH;#0 ; & replace selection + jsr RemoveText + brl :2c + +*------------------------------------------------------ +:Revert + ~GetWTitle WdwPtr ; yes- anything to revert to? + PullLong Ptr + lda [Ptr] + cmp #$550A ; (can't revert if never saved!) + beq :9a + ~NewAlert #DWarning ; yes, does user really want to? + bne :9a + ~GetWTitle WdwPtr ;get name to revert to + pla + plx + ldy #TextName + _CreateSFPath ;set path & get save name +:g52b bcs :52b + lda #20 ;select entire document + jsr HEdit + brl :DoApnd ; & replace w/file contents + +*------------------------------------------------------ +:Shutdown + ~QASetLaunch #0;#-1 ;shutdown + +*------------------------------------------------------ +:Quit + _CloseAllNDAs ;close any open NDAs first + bcs :g52b + ~QASetQuitFlag #-1 ; & quit if we are OK +:9a rts + +*------------------------------------------------------ +* Save some code space, make changes easier + +:ReadFile + ~ReadFile #TextName;#0 ;read file into memory + bcs :rfxit + sax textH + stz styleH ;assume just a text file + stz styleH+2 + lda OpenParms+14 ;wp file? + eor #$50 + bne :rfxit + jsr LoadStyle ; yes- get style info +:rfxit rts + +*====================================================== +* Handle the edit menu selections + +HEdit ENT + sec + sbc #20 ;create usable #, ignore sys stuff + blt :2z + ~TESetSelection #0;#-1;#0 ;Select All! +:2z + rts + +*====================================================== +* Handle a menu item selection + +HWdwMenu + bne :1 ;stack windows? + jsr :InitStack + lda #:stack ; yes- do so + brl DoWindows +:1 + dec ;edit next document? + beq :3 + dec ;text mode? + bne :2 + jmp doTextMode ; yes- do it! +:3 + stz temp + lda #:nextwdw ; yes- search for it + jsr DoWindows + lda temp2 ;got one? + cmp #-1 + bne :2a + lda temp3 ; no- or we wrapped to first! +:2a + sta TData ;and select it!!! +:2 + lda #:front + jsr DoWindows ;select it- return = error! + lda #$FACE +:9 + ~SysError #MGetWindow ;oh shit! + rts +*------------------------------------------------------ +:front + cpx TData ; yes- correct one? + bne :no + pla ; yes, return to main loop! + pla + ~SelectWindow Ptr ;bring it to the front! + bcs :9 + _InitCursor ; & exit +:no + rts +*------------------------------------------------------ +:stack + cpy #WindowID ;only stack source windows + bne :no + ~ShowHide #0;Ptr ;adjust window pos while hidden + ~MoveWindow :pos+2;:pos;Ptr + ~SizeWindow #586;#124;Ptr + ~NotifyCtls #-1;#16;#0;Ptr + ~ShowWindow Ptr ;redisplay it + + lda :pos+2 + sec + sbc #10 + tax ;adjust for new pos + lda :pos + sbc #10 ; (+10 in both directions) + cmp #25 + bge :is2 ;still on screen? +:InitStack + lda #24 + ldx #1 ;set start of stack + ldy WdwCnt +]loop + dey ;done w/windows? + beq :is2 + adc #10 ; no- move windows up + pha + txa + adc #10 ; & to the left + tax + pla + cmp #70 ;moved to furthest pos? + blt ]loop +:is2 + sta :pos + stx :pos+2 + rts +:pos + dw 0,0 + +*------------------------------------------------------ +* Search thru windows for 'next' one (wish I could search menus!) + +:nextwdw + lda temp ;first time? + bne :srch + stx temp ; yes- init + stz temp2 + dec temp2 + bra :s2 +:s1 + cpx temp3 ;less than first? + bge :xit +:s2 + stx temp3 ; yes- save for wrap + rts +:srch + cpx temp ;greater than first? + blt :s1 + cpx temp2 ; yes- less than last? + bge :xit + stx temp2 ; yes- save it +:xit rts + +*====================================================== +* Go thru each window on the screen. If a window is ours +* call a procedure to deal with it, otherwise cycle to end +* of the windows & return to caller +* ENTRY: A = routine pointer +* EXIT: none (last window reached) + +DoWindows + sta :mod+1 ;save pointer to routine + + _WaitCursor + + ~GetFirstWindow ;get first window in system + bra :getptr +]loop + ~GetWRefCon Ptr ;check to see if it's the right window + plx + ply + bcs :9 + cpy #WindowID ;is it ours? + beq :mod + cpy #ErrWdwID + beq :mod + cpy #CmdWdwID + bne :next +:mod jsr $FFFF ; yes -handle it! +:next + ~GetNextWindow Ptr ;try the next one +:getptr + pla + plx + sax Ptr ;got one? + ora Ptr+2 + bne ]loop ; yes- check it! +:9 + _InitCursor + rts + +*====================================================== +* Open a new text edit window for our use +* ENTRY: X = title to window +* EXIT: standard errors + +OpenWindow2 ;zeros out WdwPtr after open + jsr OpenWindow + stz WdwPtr + stz WdwPtr+2 ;insure menus set correctly + rts +OpenWindow + phx ;save pointer to title + + ~NewWindow #WindowParms ;open actual window + PullLong WdwPtr + bcs :9 ;error? + + inc WdwCnt ;we opened another! + + ~NewControl2 WdwPtr;#0;#TETemplate + PullLong TEHdl + bcc :1 +:9 + plx + ~SysError #MWOpen ;ooops! Show user! + rts +:1 + lda #2 + ldy #$10 ;we use + inc WMenuRef + lda WMenuRef + sta NWID ;id for menu + sta temp + lda WdwIDNum ;id for checks + sta temp+2 + ~SetWRefCon temp;WdwPtr ;set 'our window' thingy. + bcs :9 + ~InsertMItem #NewWdw;#-1;#WindowMenu + bcs :9 + + ~TEGetRuler #3;#rulerH;#0 ;get ruler + bcs :9 + + lax rulerH + sax Hdl ;move to DP & place on stack + pea #0 + pea #$26 + phx + pha + _SetHandleSize ;it's a bit bigger now! + bcs :9 + + Hdl_Ptr Hdl;Ptr + ldy #$10 + lda #2 ;we use specific tabs + sta [Ptr],y + ldy #$14 + lda #75 ;opcode tab + sta [Ptr],y + ldy #$18 + lda #125 ;operand + sta [Ptr],y + ldy #$1C + lda #200 ;comment + sta [Ptr],y + ldy #$20 + lda #300 ;extra + sta [Ptr],y + ldy #$24 + lda #-1 ;terminator + sta [Ptr],y + jsr mySetRuler ;use it! + + Hdl_Ptr TEHdl;Ptr ;point to TE record + ldy #$10 + lda [Ptr],y ;clear dirty flag! + and #%10111111 + sta [Ptr],y + + plx + +*====================================================== +* Set the title for the current window +* ENTRY: X = address of title (GS/OS class 1 string) +* EXIT: none + +SetWdwTitle + stx temp2 ;point to title + lda (temp2) + inc + inc + sta temp ; & get length + stz temp+2 + + ~NewHandle temp;ID3;#$C000;#0 ;get memory for title + PullLong Hdl + bcc :1 +:9 + ~SysError #MWTitle ;show error! + rts +:1 + Hdl_Ptr Hdl;Ptr ;point to this memory + + SHORTM + lda (temp2) ;get length of title + sta [Ptr] + tay +]loop + iny + lda (temp2),y ;copy string to buffer + dey + sta [Ptr],y + dey + bne ]loop + LONGM + + ~PrSetDocName Ptr ;show name over network + bcs :9 + ~SetWTitle Ptr;WdwPtr ;set window title + bcs :9 + ~SetInfoRefCon Hdl;WdwPtr ; & save handle to title memory +:g9 bcs :9 + ~GetWRefCon WdwPtr ;get menu item # + plx + ply + bcs :g9 + stx temp + ~SetMItemName Ptr;temp ;set menu item's name + bcs :g9 + ~CalcMenuSize #0;#0;#WindowMenu + rts + +*====================================================== +* Close the currently open window, checking to see if the +* window's contents need to be saved. + +CloseWindow + lda FrontWdw ;is it ours? + btr :0 + ~SendBehind #-2;WdwPtr ; no- send it behind the others + rts +:0 + jsr CheckSave ;save data if needed + bcs :9 + ~GetInfoRefCon WdwPtr ;get handle to title memory + _DisposeHandle ; & free that memory! + bcs :1 + ~GetWRefCon WdwPtr ;get menu item # + plx + ply + bcs :1 + phx + _DeleteMItem ;remove from window! + bcs :1 + ~CalcMenuSize #0;#0;#WindowMenu + + dec WdwCnt ;one less! + ~CloseWindow WdwPtr ;close window if OK + bcc :9 +:1 + ~SysError #MClose ;oops! +:9 + rts + +*====================================================== +* Check to see if the contents of the current window need +* to be saved, and save them if so. + +CheckSave + ~GetWTitle WdwPtr ;get title for dialog + PullLong FNSub + Hdl_Ptr TEHdl;Ptr ;deref TE record + ldy #$10 + lda [Ptr],y ;get ctrlFlag + and #%01000000 ;...has record been modified? + bfl :0 + ~AlertWindow #1;#FNSub;#DSave ; yes- should we save it? + plx + beq :save ; yes- do so + dex + beq :0 ; no, but continue anyway +:9 + sec +:0 rts ; no- abort whatever we're doing! +:save + lda #3 ;handle as 'save' from menu! + brl HFile + +*====================================================== +* Save the document data, including Styles if asked! + +SaveData + do TeaseWare + brl DoTease ;no saving... only writes! + else + + _WaitCursor ;show saving + + ~ZoomWindow WdwPtr ;insure proper Ruler settings + + jsr GetText ; (well-first check for no text) + + ~GetWTitle WdwPtr ;get name to save under + pla + plx + bcs :g9 ;good window? + ldy #TextName + _CreateSFPath ;set path & get save name + bcs :g9 + lda #$50 ;assume w/p + ldx #'AQ' + ldy SaveText ;correct? + bfl :1 + lda #4 ; no- save as text + ldx #0 +:1 + sta CreateParms+8 ;set file & aux type + stx CreateParms+10 + ~WriteFile #TextName;textH ;save text to data fork +:g9 bcs :9 + lda SaveText ;save as text only? + bfl :7 + _GSOS _GetFileInfo;SFIParms + lda SFIParms+10 + and #$FFFE ; yes- set linker's ASM bit + sta SFIParms+10 + _GSOS _SetFileInfo;SFIParms + bra :8 +:7 + jsr SaveStyle ; no- go write style info + bcs :9 +:8 + Hdl_Ptr TEHdl;Ptr ;point to TE record + ldy #$10 + lda [Ptr],y ;saved...clear dirty flag! + and #%10111111 + sta [Ptr],y +:xit + ~ZoomWindow WdwPtr ;back to normal + + stz SaveText ;clear text only flag + _InitCursor + brl RemoveText ;get rid of that memory! +:9 + ~SysError #MWriting ;ohh... shit! + bra :xit + +*====================================================== +* Save the style information to the resource fork +* of the appr. file. styleH contains handle to styles + +SaveStyle + ~CreateResourceFile #'QA';#$50;#$C3;#TextName + ~OpenResourceFile #0;#0;#TextName + bcc :1 + cmp #eofEncountered ;empty? + sec + bne RClose +:1 + ~RemoveResource #rTEStyle;#1 + bcc :2 + cmp #resNotFound ;$63 -GS/OS + beq :2 + cmp #$1E06 ;not found? + sec + bne RClose ; bad boy error! +:2 + ~AddResource styleH;#0;#rTEStyle;#1 + + fin ;--- TEASEWARE --- +RClose + plx + php + pha + phx + _CloseResourceFile ;File ID on stack + pla + plp + rts + +*====================================================== +* Get the style information from WP file + +LoadStyle + ~OpenResourceFile #0;#0;#TextName + bcs RClose + ~LoadResource #rTEStyle;#1 ;try to load it + PullLong styleH + bcs RClose + ~DetatchResource #rTEStyle;#1 ;take it from the system! + bra RClose + +*====================================================== +* Get the text from the current document, and setup the +* selection information for use by somebody important. +* ENTRY: none (front window = text document to work with) +* EXIT: bcs = error; selStart,selEnd = range, temp3 = # of banks + +GetSelText ENT + jsr GetText ;get text & style info + + jsr GetSelection ;get start & end of selection + + CmpLong selStart;selEnd + bne :sel ;do we have a selection? + stz selStart + stz selStart+2 + MoveLong textLen;selEnd ; no- textualize entire doc! +:sel + lda [Hdl] + sta Ptr + ldy #2 ;deref returned handle + lda [Hdl],y + clc ;insure offset into large buffer + adc selStart+2 + sta Ptr+2 + + lda selEnd+2 + sec + sbc selStart+2 ;get # of banks to look thru + sta temp3 + ldy selStart ;get inner bank offset + clc + rts + +*====================================================== +* Get the text and style records from the current window +* ENTRY: none +* EXIT: textLen = length of text, HDL = copy of textH + +GetText ENT + ~TEGetText #%11101;#textH;#0;#3;#styleH;#0 + PullLong textLen + bcs :9 ;get text OK? + lda textLen + ora textLen+2 ;do we have any text? + bne :8 + brl EmptyDlg ; no- inform user +:8 + ldx textH + stx Hdl ;save a few bytes... + ldx textH+2 + stx Hdl+2 + rts +:9 + ~SysError #MGetTxt ;show user! + pla + bra RemoveText + +*------------------------------------------------------ +* Awwww... save a few bytes, make it easier... next LIB! +* ENTRY: textH, styleH = handles to text and style data +* EXIT: textH and styleH are disposed, TE errors passed thru + +SetText ENT + ~TESetText #%01101;textH;#0;#1;styleH;#0 + +*------------------------------------------------------ +* After we get it we usually need to free the memory again! + +RemoveText ENT + php ;save errors from SetText + pha + ~DisposeHandle textH ;get rid of that memory! + ~DisposeHandle styleH + pla + plp + rts + +*====================================================== +* Get some information about the current TE record + +GetTEInfo ENT + ~TEGetTextInfo #TEInfoRec;#5;#0 + bcc :1 + ~SysError #MTEInfo ;oh... damnation! +:2 + rts +:1 + lda TEInfoRec + ora TEInfoRec+2 ;anything in document? + btr :2 + +*------------------------------------------------------ +* Show user file is empty! + +EmptyDlg + _InitCursor ;probably a watch... + + ~NewAlert #DEmpty ;inform user + pla ; & skip calling routine! + sec + bra RemoveText + +*====================================================== +* Get or set the selection area in the current TE window + +GetSelection ENT + ~TEGetSelection #selStart;#selEnd;#0 + rts + +SetSelection ENT + ~TEScroll #1;selStart;#0;#0 + ~TESetSelection selStart;selEnd;#0 + rts + +*====================================================== +* Enable our menus to allow normal operation + +EnableMenus + lda FrontWdw ;we already do this? + bfl :1 + rts +:1 + stz FrontWdw ; no- we will now + dec FrontWdw + ldx #-1 + lda #$FF7F ;turn them on! + bra SetMens + +*====================================================== +* Disable our menus so we can't screw things up (ie, DAs, no window) + +DisableMenus + lda FrontWdw ;we already do this? + btr :1 + lda SysWdw ;system window? + cmp :wdw + sta :wdw ; (not already done) + bne :1 + rts +:1 + stz FrontWdw ; no- we will now + + ldx #0 + lda #$80 ;turn them off! + bra SetMens + +:wdw ds 2 +*------------------------------------------------------ +* Set menus according to Acc. value + +SetMens + psl #0 ;end of list flag + + do TeaseWare + else ;leave save/print items disabled + pea #258 + phx + pea #259 + phx + pea #260 + phx + pea #261 + phx + fin ;--- TEASEWARE --- + + pea #262 + phx + pea #263 + phx + ldx #0 + bit SysWdw + bmi :1 + ldx #-1 +:1 pea #270 + phx + pea #265 + phx + + pea #0 ;end of list flag + pha + pea #SrcMenu ;dis/enable some menus + _SetMenus ;stack 'em up! + _SetMItems + rts + +*====================================================== +* Update our text window + +UpdateWin + ~DrawControls TaskRc+16 ;update is easy! + rtl + +*====================================================== +* Print the loaded text to the printer, via Print Manager + +PrintText + do TeaseWare + brl DoTease + else + + ~PrValidate PrtHdl ;insure a good record + plx + bcs :zpe1 + + ~PrJobDialog PrtHdl ;get user's printing options + plx + bcs :PE1 ;error? + txa + btr :GoForIt ;cancel? + rts +:GoForIt + _WaitCursor + + ~ZoomWindow WdwPtr ;[][ work around TE bug ][] + +* Open the 'print document' and start printing our information + + ~PrOpenDoc PrtHdl;#0 ;open new grafPort for printing + PullLong PPort +:zpe1 bcs :PE1 + + Hdl_Ptr PrtHdl;Ptr ;Dereference the print record + ldy #6+2+6 + ldx #8-2 +]loop lda [Ptr],y ;copy page rectangle to our area + sta QuitPath,x + dey + dey + dex + dex + bpl ]loop + + stz temp ;starting line # = 0 + stz temp+2 +:NewPage + ~PrOpenPage PPort;#0 ;open a new page to print on +:PE1 bcs :eof + + ~TEPaintText PPort;temp;#QuitPath;#0;TEHdl + PullLong temp + bpl :ok + lda #$2209 ;x = $FFFF at EOF! +:ok + pha + ~PrClosePage PPort ;close the current page + pla + bfl :NewPage ;error or EOF? + cmp #$2209 + clc + beq :eof + sec ; no- real error! +:eof + php + pha + ~PrCloseDoc PPort ; yes- close entire printed document + pla + plp + bcs :err + + ~PrPicFile PrtHdl;#0;#StatusRec ;print file to the printer! + bcc :done +:err + cmp #$80 ;ok if just a Cancel (oA-.) command + beq :done + pha + pha + _PrSetError ;abort printing w/proper error + pla + ora #$8000 + ~SysError #MPrint ;show user our error! +:done + ~ZoomWindow WdwPtr ;[][ undo TE bug fix ][] + _InitCursor + rts + + fin ;--- TeaseWare --- + +*====================================================== +* This is our tool record for the Startup call + +SSRec + dw 0 + dw $C080 ;640 & do it as fast as possible! + dw 0 + adrl 0 ;dpage handle + dw :sse-*/4 ;number of tools + + dw 10,$0100 ;SANE + dw 04,$0300 ;quickdraw + dw 18,$0206 ;qdaux + dw 06,$0300 ;event + dw 27,$0300 ;font + dw 14,$0300 ;window + dw 16,$0300 ;control + dw 15,$0300 ;menu + dw 28,$0300 ;list + dw 20,$0300 ;lined + dw 21,$0101 ;dialog + dw 22,$0104 ;scrap + dw 05,$0101 ;desk + dw 23,$0101 ;file + dw 19,$0200 ;print manager + dw 34,$0100 ;TextEdit +:sse +*------------------------------------------------------ +* Menu definitions + +Menus + adrl MWindow + adrl MTran + adrl MGSOS + adrl MTool + adrl MSrc + adrl MProj + adrl MEdit + adrl MFile + adrl MApple + adrl 0 + +* We use the following to get our menu indexes + +MenuNums + dw AppleMenu + dw FileMenu + dw EditMenu + dw ProjMenu + dw SrcMenu + dw ToolMenu + dw GSOSMenu + dw TranMenu + dw WindowMenu + +MaxMenus dw *-MenuNums ;used to insure we don't bomb! + +HdlMenus + da HApple + da HFile + da HEdit + da HProj + da HSrc + da HTool + da HGSOS + da HTran + da HWdwMenu + +*------------------------------------------------------ +MApple + asc '$$@\XN300',00 + asc '--About QuickASM...\N300',00 + asc '--Help...\N301*HhVD',00 + asc '>' +MFile + asc '$$ File \N255',00 + asc '--New\N256*Nn',00 + asc '--Open...\N257*Oo',00 + asc '--Close\N255*`~V',00 + asc '--Save\N258*SsD',00 + asc '--Save As...\N259D',00 + asc '--Write Text\N260*WwD',00 + asc '--Write As...\N261DV',00 + asc '--Append...\N262',00 + asc '--Revert\N263',00 + asc '--Page Setup...\N264',00 + asc '--Print...\N265*PpDV',00 + asc '--Shutdown\N266',00 + asc '--Quit\N267*Qq',00 + asc '>' +MEdit + asc '$$ Edit \N250',00 + asc '--Undo\N250*ZzVD',00 + asc '--Cut\N251*Xx',00 + asc '--Copy\N252*Cc',00 + asc '--Paste\N253*Vv',00 + asc '--Clear\N254',00 + asc '--Select All\N270',00 + asc '>' +MProj + asc '$$ Project \N400',00 + asc '--New\N400D',00 + asc '--Open...\N401D',00 + asc '--Close\N402VD',00 + asc '--Save\N403D',00 + asc '--Save As...\N404VD',00 + asc '--Build Project\N405*Bb',00 + asc '--Build other...\N410',00 + asc '--Options...\N406VD',00 + asc '--Add Window\N407D',00 + asc '--Add File...\N408D',00 + asc '--Remove Window\N409D',00 + asc '>' +MSrc + asc '$$ Source \N500',00 + asc '--Find...\N500*Ff',00 + asc '--Find Again\N501*Gg',00 + asc '--Find & Replace\N502*Rr',00 + asc '--Replace All\N503',00 + asc '--Go Label/Line\N516*LlV',00 + asc '--Assemble\N515*Aa',00 + asc '--Margins & Tabs\N504*Mm',00 + asc '--Fix Source\N505*Yy',00 + asc '--Information\N506*IiV',00 + asc '--Type Style...\N507V',00 + asc '--Black\N508',00 + asc '--Blue\N509',00 + asc '--Red\N510',00 + asc '--Violet\N511',00 + asc '--Green\N512',00 + asc '--Jade\N513',00 + asc '--L.Grey\N514',00 + asc '>' +MTool + asc '$$ Tools \N600',00 + asc '--Execute Tool...\N600VD',00 + asc '>' +MGSOS + asc '$$ GS/OS \N700',00 + asc '--Delete...\N700*Dd',00 + asc '--Rename...\N701VD',00 + asc '--Format Disk\N702D',00 + asc '>' +MTran + asc '$$ Transfer \N800',00 + asc '--Launch...\N800*=+V',00 + asc '--Merlin 16+\N801D',00 + asc '>' +MWindow + asc '$$ Windows \N5000',00 + asc '--Stack Windows\N5000*Kk',00 + asc '--Edit Next Doc\N5001*Ee',00 + asc '--Text Mode\N5002*TtV',00 + asc '>' +NewWdw + asc '--New Window\H' +NWID hex FACE00 + +*------------------------------------------------------ +WindowParms + da WindowEnd-WindowParms + da %1100001110100100 +WdwTtl adrl MWOpen + adrl 0 + da 25,1,199,639 + adrl 0 + da 0 + da 0 + da 0 + da 0 + da 0 + da 0 + da 9 + da 0 + da 162 + da 0 + adrl 0 + da 0 + adrl 0 + adrl 0 + adrl UpdateWin +WdwRec da 25,1,199,639 + adrl -1 + adrl 0 +WindowEnd + +CmdTitle strl ' Commands ' +ErrTitle strl ' Errors ' +*------------------------------------------------------ +* The TextEdit window control definition + +TETemplate + dw 17 + adrl TECtrlID + dw 0,0,0,0 + adrl $85000000 + dw 0 + dw %0111110000000000 + adrl 0 + adrl %01000010001000000000000000000000 + dw 2,4,2,4 + adrl $FFFFFFFF + dw 0 + adrl 0 + dw 0 + adrl 0 + dw 0 + adrl 0 + adrl 0 +TEMaxChrs adrl 0 ;modified + +*====================================================== +* About dialog to give credit where due + +DAbout + dw 40,25,115,270 + dw 1 + hex 80,80,80,80 + adrl :3 + adrl :1 + adrl :2 + adrl 0 + +:2 dw 1 + dw 0,0,75,245 + dw $A + adrl :2a + dw 0 + dw 0 + adrl 0 +:2a str '' + +:3 dw 2 + dw 0,0,75,245 + dw $F + adrl :2a + dw 0 + dw 0 + adrl 0 +:1 + dw 3 + dw 5,3,72,243 + dw $8016 +AMod adrl Anorm + dw anz-Anorm + dw 0 + adrl 0 +Anorm + hex 01530300,014A0100 + asc 'QuickASM Shell',AA,' v0.70' + hex 01530000,0D0D + asc ,'Portions are Copyright ',A9,' 1988-90' + hex 0D,01430100 + asc 'Ideas From the Deep' + hex 01430000 + asc ' & ' + hex 01430200 + asc 'Lane Roath' + hex 01430000,0d0d + asc 'QuickASM system written by ',0D + asc 'Shawn Quick and Lane Roath' +anz +Aspcl + hex 014A0100 + asc 'QuickASM written in QuickAsm ',0D + asc '& Merlin 16+. Dated ' + date 5 ;dd-mmm-yy + hex 0d0d + hex 0153020001430100 + asc /"Will you still need me, will you / + asc /still feed me, when I'm 64?"/,0D + asc /Sgt. Pepper's Lonely Hearts Club Band / + asc / \ When I'm 64 \ Beatles/ +asz +*====================================================== +* Misc. NewAlert dialog templates + + do TeaseWare +DTease + asc '80\' + asc 'This version has this stupid message everywhere to ' + asc 'remind you that this is a PRELIMINARY version of ' + asc 'QuickASM. Please contact us to purchase the final copy ' + asc 'or to report bugs and/or suggest inprovements! ',0D0D + asc 'Ideas From the Deep - ' + asc '309 Oak Ridge Lane / Haughton / LA / 71037',0D + asc 'Phone: (318) 949-8264',0D,'(if no answer, leave message)\' + asc '^#0',00 + + fin ;--- tease dialog --- + +DWarning ENT + asc '54/' + asc 'This operation could damage the document ' + asc 'contents! Are you sure you wish to do this?/' + asc '^#6/#1',00 +DSave + asc '55$' + asc '"*0" has been changed! Should I save it?$' + asc '^#2$#3$#1',00 +DEOF ENT + asc '13/' + asc 'No more matches!/' + asc '^#0',00 +DEmpty + asc '14/' + asc 'File Empty!/' + asc '^#0',00 +FNSub ENT + adrl 0 ;filled in! + +*------------------------------------------------------ +* Our GS/OS parm tables (NOTE: Class 1 now!) + +SFIParms dw 4 + adrl TextName + ds 8 + +TxtTypes ENT + dw 3 + dw $8000 + dw $04 + adrl 0 + dw $8000 ;we read these types of files + dw $B0 + adrl 0 + dw $8000 + dw $50 + adrl 0 +AllTypes ENT + dw 1 + dw $C000 ;we can delete anything! + dw 0 + adrl 0 + +*------------------------------------------------------ +* Error message text + + ENT MFOpen + +MQuit str 'Quit' +MMenu str 'Menu #' +MWOpen str 'Opening Window' +MFOpen str 'Open File' +MGetTxt str 'GetText' +MClose str 'Close Wdw' +MPInit str 'Init PrRec' +MPrint str 'Printing' +MWTitle str 'Wdw Title' +MWriting str 'Writting!' +MGetWindow str 'Get Wdw' +MTEInfo str 'TEInfo' +QAError str 'QA Startup' + +OpenPrompt str 'Open the file...' +SavePrompt str 'Save file as...' +AppendPrompt str 'Append the file...' + +NewName strl 'Untitled.@' + +*====================================================== +* The following are equates to use DS w/no code space + + ENT tFind,tReplace,TextName,TextPath,QuitPath,PrintBuf + + dum * ;we DS this in the link file + +QuitParms ds 8 +SDParms ds 4 + +WdwIDNum ds 2 ;so Cmd,Err,Source wdws have unique IDs + +tFind ds 30 ;oh-no! +tReplace ds 30 + +TextName ds 32 ;Class 1 file & path buffers +TextPath ds 256 +CmdLine ENT +QuitPath ds 128 ;dup of above, for saves!!! +TEInfoRec ENT ;textedit info record +StatusRec ds 128 ;Used by printing routines +TempBuf ENT +PrintBuf ds 256 +*------------------------------------------------------ +* Text Edit records we use + + ENT NewStyle,textH,styleH,rulerH,selStart,selEnd,myDP + +NewStyle ds 12 + +textH ds 4 ;handles that can't be in DP! +styleH ds 4 +rulerH ds 4 + +selStart ds 4 ;text selection info +selEnd ds 4 + +myDP ds 2 ;page in bank 0 of my DP +DS_Size ENT + dend + + sav 2/obj/qasm.l diff --git a/src/shell/qasm1.s b/src/shell/qasm1.s new file mode 100644 index 0000000..c565724 --- /dev/null +++ b/src/shell/qasm1.s @@ -0,0 +1,1774 @@ + lst off + ttl "QASM Menu Routines" + exp off + tr on + cas se +* dup +*====================================================== +* Graphic Shell for QuickASM development system + +* Programming by Lane Roath +* Copyright (c) 1990 Ideas From the Deep & Lane Roath +*------------------------------------------------------ +* 22-Feb-90 0.20 :remove from main file +*====================================================== + + rel + +Class1 = $2000 + + lst off + use 2/data/qa.equates + use macs + use ifd.equs + use equs + lst rtn + + EXT TextName,TextPath,GetTEInfo,GetSelection,selStart,selEnd + EXT SetSelection,DWarning,GetSelText,SetText,tFind,Shell + EXT NewStyle,AllTypes,FNSub,tReplace,rulerH,DEOF + EXT QuitPath,MFOpen,HFile,TEInfoRec,RemoveText,GetText + EXT textH,TxtTypes + +*====================================================== +* Handle the find menu (find & replace stuff) + +HProj ENT + cmp #-1 ;open finder doc? + bne :0 + + lda TextName ; yes- special case it! + tax + clc ;get length of window title + adc TextPath + sta TextPath + tay +]loop lda TextName+1,x ; & append filename to prefix + sta TextPath+1,y + dey + dex ;done? + bne ]loop + bra :DoOpen ; yes- open doc! +:0 + asl ;create index + tax + jmp (:tbl,x) ; & pass control to item handler +:tbl + da :New + da :Open + da :Close + da :Save + da :Save_As + da :Build + da :Options + da :AddWdw + da :AddFile + da :Remove + da :Other + +*------------------------------------------------------ +:New + rts +*------------------------------------------------------ +:Open +:DoOpen ;finder entry + rts +*------------------------------------------------------ +:Close + rts +*------------------------------------------------------ +:Save + rts +*------------------------------------------------------ +:Save_As + rts +*------------------------------------------------------ +:Build +* ~PutFile #:BuildAs;#TextName +* bcs :err +* bfl :xit + ~QASetCancelFlag #0 ;haven't done so yet! + _QAClearKey + ~SelectWindow CmdPtr + jsr pTextPath + ~QALink #lquick;#TextPath ; yes- link it + jsr pTextPath + bcc :xit +:err + ~SysError #:lerr ;show any errors +:xit + rts + +:BuildAs str 'Save Application as...' +*------------------------------------------------------ +:Other + ~GetFile #:Prompt;#TextName;#TxtTypes + bcs :err + bfl :xit + ~QASetCancelFlag #0 ;haven't done so yet! + _QAClearKey + ~SelectWindow CmdPtr ;must have this in forground! + jsr pTextPath + ~QALink #lfromname;#TextPath-1 + jsr pTextPath + bcs :err + rts + +:Prompt str 'Link the file...' +:lerr str 'Linking' + +*------------------------------------------------------ +:Options + rts +*------------------------------------------------------ +:AddWdw + rts +*------------------------------------------------------ +:AddFile + rts +*------------------------------------------------------ +:Remove + rts + +*====================================================== +* Handle the find menu (find & replace stuff) + +HSrc ENT + asl ;create index + tax + jmp (:tbl,x) ; & pass control to item handler +:tbl + da :Find + da :Find_Again + da :Replace + da :Replace_All + da :Tabs + da :Fix + da :Info + da :Font + da :Color + da :Color + da :Color + da :Color + da :Color + da :Color + da :Color + da :Assem + da :Line + +*------------------------------------------------------ +:Find + jsr GetTEInfo + brl FRDialog ; yes- only if doc not empty! +*------------------------------------------------------ +:Find_Again + ldx tFLen ;anything to search for? + beq :Find + jmp FindNext ; yes- do so +*------------------------------------------------------ +:Replace + ldx tFLen ;anything to search for? + beq :Find +:doReplace + jsr FindNext ;can we find a match? + bcs :2x + ~TEReplace #%101;#tReplace+1;tRLen;#0;#0;#0 ;YES-replace it! + bcs :2y + lda selStart + adc tRLen ;get start/end of replaced + sta selEnd + lda selStart+2 ; text (old start & len of new) + adc #0 + sta selEnd+2 + jsr SetSelection ;hilite the new text for user + bcc :2x +:2y + ~SysError #:FR ;oh shit! +:2x rts + +:FR str 'Search' + +*------------------------------------------------------ +:Replace_All + ldx tFLen ;anything to search for? + beq :Find +]loop jsr :doReplace ;do one replace + bcc ]loop + rts ; & repeat till error + +*------------------------------------------------------ +:Tabs + brl MTDialog ; yes- do it w/dialog + +*------------------------------------------------------ +* Fix text so it will display as true ASCII, not garbage + +:Fix + stz temp ;assume no selection + + ~NewAlert #DWarning ;warn use undo-able! + bne :2z + + _WaitCursor ;show we're working + + jsr GetSelText ;get text (selection) + bcs :2c + + SHORTM +]loop + lda [Ptr],y ;get a character + cmp #" " + bne :f0 + lda #9 ;merlin spaces to tabs! +:f0 and #$7F + sta [Ptr],y ;store TE readable value + iny + bne :f1 ;update bank byte? + inc Ptr+2 +:f1 cpy selEnd ;are we done? + bne ]loop + dec temp3 ; (must also check bank!) + bpl ]loop + + LONGM + + jsr SetText ;replace text & style info + Hdl_Ptr TEHdl;Ptr + ldy #$10 + lda [Ptr],y ;show we changed the text + ora #%01000000 + sta [Ptr],y +:2c + _InitCursor + rts + +*------------------------------------------------------ +:Info + jsr SetInfo ; yes- set info for dialog + lda textLen + ora textLen+2 ;did we get anything? + bfl :2z + ~Alert #InfoAlert;#0 ; yes- show user some cool stuff + pla +:2z + rts + +*------------------------------------------------------ +:Font + jsr GetStyle + ~ChooseFont NewStyle;#0 ; yes- allow user to do so + PullLong NewStyle + bcs :9 + txa + ora NewStyle ;cancel? + bfl :fx + lda #%1100010 ; no, update TE record + brl SetStyle +:9 + ~SysError #:TEStyle ;oops! +:fx rts + +:TEStyle str 'SetStyle' + +*------------------------------------------------------ +:Color + sbc #8 ;create index value + asl + tax + lda :colors,x ;get color word + tax + lda TaskRc+14 ;option key pressed? + and #%0000100000000000 + bfl :fore + stx NewStyle+6 ; yes- change background color + lda #%00001000 + brl SetStyle +:fore + stx NewStyle+4 + lda #%00010000 ; no- change foreground color + brl SetStyle +:colors + dw $0000,$1111,$4444,$5555,$8888,$9999,$CCCC + +*------------------------------------------------------ +* Assemble the current source (window) + +:Assem + ~QASetCancelFlag #0 ;haven't done so yet! + + lda FrontWdw ;do we have a window open? + bfl :sfile + jsr GetText + ~SelectWindow CmdPtr ;bring cmd wdw to front! + _QAClearKey + ~QACompile #afromhandle;textH ; & assemble source + jsr RemoveText + bcc :xit +:err + ~SysError #:aerr ;show any errors +:xit + rts +:sfile + ~GetFile #:Prompt;#TextName;#TxtTypes + bcs :err + bfl :xit + ~SelectWindow CmdPtr ;must have this in forground! + ~QACompile #afromname;#TextPath + bcs :err + rts + +:Prompt str 'Assemble the file...' +:aerr str 'Assembling' + +*------------------------------------------------------ +* Jump to line # in current source window + +:Line + jsr GetTEInfo + brl LLDialog ;only if doc not empty! + +*====================================================== +* Handle the TOOL menu added items! + +HTool ENT + bne :added + ~GetFile #:Prompt;#TextName;#:Types + bcs :err + bfl :xit +:xit + rts +:added + rts +:err + ~SysError #MFOpen ;oops! + rts + +*------------------------------------------------------ +:Prompt + str 'Execute the tool...' +:Types + dw 1 + dw $8000 ;any aux type + dw $B2 + adrl 0 + +*====================================================== +* Handle the GS/OS menu + +HGSOS ENT + asl ;create index + tax + jmp (:tbl,x) ; & pass control to item handler +:tbl + da :Delete + da :Rename + da :Format + +*------------------------------------------------------ +:Delete + ~GetFile #:DPrompt;#TextName;#AllTypes + bcs :de + bfl :nodel + lax #TextPath+1 + sax FNSub + lda TextPath + xba ;create PString + sta TextPath + ~AlertWindow #1;#FNSub;#:DDelete ; yes- should we save it? + plx + bcs :de + btr :Delete + _WaitCursor + _GSOS _Destroy;:DelParms ;...delete the file!... + pha + _InitCursor + lda TextPath + xba ;restore real pathname + sta TextPath + pla + bfl :Delete +:de + ~SysError #:Del ;show errors +:nodel + rts +*------------------------------------------------------ +:Rename + rts +*------------------------------------------------------ +:Format + rts +*------------------------------------------------------ +:DPrompt + str 'Delete the file...' +:DDelete + asc '55$' + asc 'Are you sure you wish to delete the file *0 ?$' + asc '#6$^#1',00 +:DelParms + dw 1 + adrl TextName +:Del str 'Delete' + +*====================================================== +* Handle the LAUNCH menu + +HTran ENT + bne :parmfile ;other than zero special! + ~GetFile #:Prompt;#TextName;#:Types + bcs :SFErr + bfl :xit + bra :SetLaunch ; yes-setup to launch properly +:SFErr + ~SysError #MFOpen ;oops! +:xit rts +:parmfile + rts + +*------------------------------------------------------ +:Prompt + str 'Launch...' +:Types + dw 2 + dw $8000 + dw $FF + adrl 0 ;we can launch these file types + dw $8000 + dw $B3 + adrl 0 + +*------------------------------------------------------ +* Setup the quit parms to launch another program + +:SetLaunch +* ldx TextPath +* stx QuitPath ;copy length +* SHORTM +*]loop lda TextPath+1,x ;copy to safe buffer +* sta QuitPath+1,x +* dex ; done? +* bne ]loop +* LONGM + + ldy #$C000 ;assume sublaunch + lda TaskRc+14 + and #%0000100000000000 + bfl :slx ;option key = simple launch + ldy #$8000 +:slx + sty temp + ~QASetLaunch #QuitPath;temp ;tell QA to do launch + lda #267-FileMenu + jmp HFile ; & fake QUIT menu selection + +*====================================================== +* Set a ruler styling. +* ENTRY: A = ruler value, Y = index into ruler record +* EXIT: none + +SetRuler ENT + pha ;save parms + phy + _WaitCursor + ~TEGetRuler #3;#rulerH;#0 ;get ruler + bcc :ok + ply + plx ;exit w/parms saved + bra rerr +:ok + MoveLong rulerH;Hdl ;get into DP + Hdl_Ptr Hdl;Ptr + ply ;get offset to justify type + pla + sta [Ptr],y ; & set for this file +mySetRuler ENT + ~TESetRuler #1;Hdl;TEHdl ;all done! + bcc ne +rerr + ~SysError #MRuler ;show errors +ne + ~DisposeHandle Hdl ;hey- we don't want it anymore! + _InitCursor + rts + +MRuler str 'SetRuler' +*====================================================== +* Set style of current TE record seletion +* ENTRY: A = style flags, NewStyle = new style record +* EXIT: none + +SetStyle ENT + sta temp + _WaitCursor + ~TEStyleChange temp;#NewStyle;#0 + _InitCursor + rts + +*====================================================== +* Get the current TE record selection's style info. +* ENTRY: none +* Exit: none + +GetStyle + ~NewHandle #1024;ID3;#0;#0 ;who cares! + PullLong Hdl + bcs :9 + ~TEGetSelStyle #NewStyle;Hdl;#0 + plx + stx temp ;get style return flags + bcc :1 +:9 + ~SysError #:GetStyle ;ooops! +:1 + ~DisposeHandle Hdl ;we don't care! + + lsr temp + bcs :2 ;attr. valid? + SHORTM + stz NewStyle+2 ; no- zap it + LONGM +:2 + lsr temp ;user data valid? + bcs :3 + stz NewStyle+8 ; no- zap old data + stz NewStyle+10 +:3 + lsr temp ;backcolor valid? + bcs :4 + stz NewStyle+6 ; no- zap it +:4 + lsr temp ;forecolor valid? + bcs :5 + stz NewStyle+4 ; no- ignore it +:5 + lsr temp ;font family valid? + bcs :7 + stz NewStyle ; no- ignore it +:7 + rts + +:GetStyle str 'GetStyle' + +*====================================================== +* Create a pString or gString of TextPath, depending. + +pTextPath ENT + pha + lda TextPath + xba ;[][ Linker not Class1 yet ][] + sta TextPath + pla + rts + +*====================================================== +* Find the next occurance after the current selection +* of the string in the find buffer. +* ENTRY: none +* EXIT: selStart/End = offset range of find, bcs = no find + +FindNext + lda FromTop ;start at top? + btr :top + jsr GetSelection ; no- start search at end of selection +:top + jsr GetText ;get the text to search through + + CmpLong selEnd;textLen ;do this? + blt :doit + brl :eof ; no- done! +:doit + lda [Hdl] + sta Ptr + ldy #2 ;get TRUE starting location + lda [Hdl],y + clc + adc selEnd+2 ; (ie, adj. for bank) + sta Ptr+2 + + lda textLen+2 + sec + sbc selEnd+2 ;get # of banks to search + sta temp3 + + SHORTM + lda CaseFlg ;case insensitive? + bfl :no + lda #$7F ; yes- set stuff + ldx #'_' + bra :set +:no + lda #$FF ; no- dissuade code from working + tax +:set sta :cm1+1 + txa + sta :cm2+1 ;set ANDs appropriately + + ldy selEnd +:initx + ldx #1 ;init indexes +]loop + iny + bne :ckeof ;update text pointers + inc Ptr+2 + inc selEnd+2 ;update selection as needed +:ckeof + cpy textLen ;are we at the EOF? + bne :getchar + dec temp3 ; well, past first 64K anyway + bmi :eof +:getchar + lda [Ptr],y ;get a char +:cm1 and #$7F + cmp #'`'+1 ;upper? + blt :nocnv +:cm2 and #'_' ; yes- force lower +:nocnv + cmp tFind,x ;does it match? + bne :initx + cpx #1 ; yes, fist match? + bne :no1st + LONGM + lda selEnd+2 ; yes- save selection + sta selStart+2 + sty selStart ; for highlighting + tya + dec ;backup one + clc + adc Ptr + sta temp2 ; & set pointer for word checks! + lda Ptr+2 + adc #0 + sta temp2+2 ; & set zero page for word check + SHORTM +:no1st + cpx tFLen ;have we found the entire string? + inx + blt ]loop ; no- keep going! +:fnd + lda LabelFlg ;looking for label? + bfl :nolbl + lda [temp2] ; yes, is prev. char a CR? + cmp #$0D + bne :initx ; no- not found! +:nolbl + lda WordFlg ;looking for words? + bfl :found + jsr :checkword ; yes- do we have one? + bfl :initx +:found + LONGM + iny ; (must go past last char!) + sty selEnd + jsr SetSelection ;show user where selection found! + bra :bye +:eof + REP #$30 + ~NewAlert #DEOF ;show user EOF reached + sec +:bye + jmp RemoveText ; & exit w/all restored + +*------------------------------------------------------ +* Check to see if where we now point is a word or just +* part of a word intermixed within some text. + + MX %11 ;in emulation!!! +:checkword + iny + lda [Ptr],y ;get char after word + cmp #'-' + beq :w0 ;dash? + cmp #"'"&$7F + beq :w0 + cmp #'`' ;check for stupid quotes + bne :w1 +:w0 + iny + lda [Ptr],y ;is this a lonely quote/dash? + dey + cmp #' '+1 + blt :w2 ; yes- could be a word +:noword + dey + lda #0 ; no- return w/bfl + rts +:w1 + cmp #'0' + blt :w2 ;can't be a number + cmp #'9'+1 + blt :noword + cmp #'A' + blt :w2 ;can't be a letter + cmp #'Z'+1 + blt :noword + cmp #'a' + blt :w2 ; (upper or lower case!) + cmp #'z'+1 + blt :noword +:w2 + lda selStart ;at TOF? + ora selStart+1 + beq :word + lda [temp2] ; no- get char before 'word' + cmp #'0' + blt :word ;can't be a number + cmp #'9'+1 + blt :noword + cmp #'A' + blt :word ;can't be a letter + cmp #'Z'+1 + blt :noword + cmp #'a' + blt :word ; (upper or lower case!) + cmp #'z'+1 + blt :noword +:word + dey ;return normal + lda #1 + rts + + MX %00 ;back to native! +:justs + dw 2,0,-1,1 + +*====================================================== +* Bring up the Find and Replace dialog & get user's input + +FRDialog + ~GetNewModalDialog #FindDialog + PullLong Ptr + bcc :0 +:err + ~SysError #:FRDlg ;error? + rts +:0 +*--------------------------------------------------------------------- +* make the text you got last time the default text + + ~SelectIText Ptr;#5;#0;#-1 ;select the find text + bcs :err + ldx #$8000 + lda CaseFlg + jsr SetDIValue ;set check marks + ldx #$8002 + lda FromTop + jsr SetDIValue + ldx #$8004 + lda WordFlg + jsr SetDIValue + ~ShowWindow Ptr ;now show the dialog + bcs :err +:1 + ~ModalDialog #0 ;let user do his/her thing + pla + bmi :check + cmp #2 ;was it cancel? + beq :Quit + cmp #1 ;wait for one of the find + beq :2 + cmp #4+1 ; or replace buttons + bge :1 +:2 + sta :t + jsr :SaveText ;save find/replace text + bfl :1 + pea #:dofind-1 ; & go find whatever it is +:Quit + ~CloseDialog Ptr + rts + +:t dw 0 ;can't use stack! + +*------------------------------------------------------ +* handle the checking of the boxes, senor. +* enter with the ID of the check box in the accumulator + +:check + sta temp ;save for use + + ~GetDItemValue Ptr;temp ;get value of item + lda temp + and #$FF ;get index into flags + tax + pla + eor #1 ;invert the value bit + sta CaseFlg,x + ldx temp + jsr SetDIValue + brl :1 + +*------------------------------------------------------ +* Save the find/replace text so we always have them! + +:SaveText + ~GrabText #5;#tFind + ~GrabText #6;#tReplace + lda tFind + and #$FF + sta tFLen ;any text to find? + bfl :no + jsr CaseFind ; yes -case it as desired + lda tReplace + and #$FF + sta tRLen ; & set replace length as needed + stz tRLen+2 + lda #1 ;set BTR flag +:no + rts + +*===================================================================== +* find the word that they want to see. + +:dofind + stz selEnd ;assume start search @ top + stz selEnd+2 + stz LabelFlg ;show NOT a label + + lda :t ;get button # + dec + bne :10 ;find = # 1 + inc +:10 jmp HSrc ;handle as menu selection + +:FRDlg str 'FRDialog' + +*------------------------------------------------------ +* Make the FIND text case insensitive + +CaseFind + lda CaseFlg + bfl :nocase + ldx tFLen + SHORTM +]loop lda tFind,x ; yes- transform search string + and #$7F + cmp #'`'+1 ;upper? + blt :nocnv + and #'_' ; yes- force lower +:nocnv sta tFind,x + dex ;done? + bne ]loop + LONGM ; yes- back to normal +:nocase + rts + +*====================================================== +* Bring up the Label/Line # dialog & get user's input + +LLDialog + ~GetNewModalDialog #LineDialog + PullLong Ptr + bcc :0 +:err + ~SysError #:LLDlg ;error? + rts +:0 +*--------------------------------------------------------------------- +* make the text you got last time the default text + + ~SelectIText Ptr;#3;#0;#-1 ;select the find text + bcs :err +:1 + ~ModalDialog #0 ;let user do his/her thing + pla + cmp #2 ;was it cancel? + beq :Quit + dec ; no- was it just an event? + bne :1 + jsr :SaveText ;save find/replace text + bfl :1 + pea #:dofind-1 ; & go find whatever it is +:Quit + ~CloseDialog Ptr + rts + +*------------------------------------------------------ +* Save the find/replace text so we always have them! + +:SaveText + ~GrabText #3;#tFind + lda tFind + and #$FF + sta tFLen + stz tRLen ;no replacing! + stz tRLen+2 + rts + +*------------------------------------------------------ +* find the word that they want to see. + +:dofind + lda tFind+1 + and #$7F + cmp #'9'+1 ;line # or label? + blt :line + + dec LabelFlg ;label -tell 'FIND' about it! + jsr CaseFind + + lda #1 + sta FromTop ;always search from top! + stz selEnd + stz selEnd+2 + jmp HSrc ; & handle as simple 'find' + +:LLDlg str 'LLDialog' + +*------------------------------------------------------ +* Display line # @ center of screen +* Based on DISPLAY, not CRs, but this is faster & memory efficient! + +:line + stz temp3 ;init value + + ldx #0 ;start w/first digit +]loop + lda tFind+1,x ;get a char + and #$7F + cmp #'0' + blt :done ; is it a number? + cmp #'9'+1 + bge :done + and #$F + sta temp3+2 ; yes- get hex digit + lda temp3 + asl + sta temp3 ;multiply current value by 10 + asl + asl + adc temp3 + adc temp3+2 ;add in new digit + sta temp3 + inx + cpx tFLen ;are we done? + blt ]loop +:done + stz temp3+2 ; yes- zap high word + + ~TEScroll #3;temp3;#0;#0 ; & show line! + rts + +* ldy #$10+4 +* lda [WdwPtr],y ;depth of window (top = 0) +* lsr +* sta temp ; / 2 = middle of window +* stz temp+2 +* +* ~TEPointToOffset temp;#0;#0 +* PullLong selStart +* bcs :oops +* ~TEPointToOffset temp;#1000;#0 ;get offsets to start & end of line +* PullLong selEnd +* bcs :oops +* jmp SetSelection ; & highlight the line! +*:oops +* ~SysError #:lerr +* rts +* +*:lerr str 'GOTO line' + +*====================================================== +* Handle the magins & tabs dialog. + +MTDialog + ~TEGetRuler #3;#rulerH;#0 ;get ruler + bcc :ok + brl :err +:ok + MoveLong rulerH;Hdl + ~HLock Hdl ;lock & make usable + + lda #6 + sta DecLeft + sta DecIndent + sta DecRight ;they could be bogus + sta DecLine + sta DecTabs + + Hdl_Ptr Hdl;temp3 + + lda [temp3],y ;create 'user-friendly' value + sec + sbc [temp3] + sta [temp3],y + ~Int2Dec [temp3],y;#DecIndent+1;#6;#1 + + ~Int2Dec [temp3];#DecLeft+1;#6;#1 + ldy #4 + ~Int2Dec [temp3],y;#DecRight+1;#6;#1 + ldy #8 + ~Int2Dec [temp3],y;#DecLine+1;#6;#1 + ldy #$14 + ~Int2Dec [temp3],y;#DecTabs+1;#6;#1 + ldy #$18 + ~Int2Dec [temp3],y;#DecTabs1+1;#6;#1 + ldy #$1C + ~Int2Dec [temp3],y;#DecTabs2+1;#6;#1 + ldy #$20 + ~Int2Dec [temp3],y;#DecTabs3+1;#6;#1 + + ~GetNewModalDialog #TabDialog + PullLong Ptr + bcc :0 +:err + ~SysError #:TabDlg ;error? + rts +:0 +*--------------------------------------------------------------------- +* Handle the actual usage of this dialog + + ~SelectIText Ptr;#3;#0;#-1 ;select first box + bcs :err + ~ShowWindow Ptr ;now show the dialog + bcs :err +:1 + ~ModalDialog #0 ;let user do his/her thing + pla + cmp #2 ;was it cancel? + beq :Quit + dec ; no, ok? + bne :1 +:2 + jsr :SaveText ;save changed values +:Quit + ~CloseDialog Ptr + rts +:verr + ~NewAlert #DIllVal ;show illegal value + pla + bra :1 ; zap RTS & continue + +*------------------------------------------------------ +* Save the value of the dialog into the ruler settings + +:SaveText + ~GetInt #3 ;left margin + bcs :verr + sta [temp3] + + ~GetInt #5 ;indention + bcs :verr + ldy #2 + adc [temp3] ; (which is added to left margin) + sta [temp3],y + sta temp + + ~GetInt #4 ;right margin + bcs :verr + ldy #4 + sta [temp3],y + cmp [temp3] ;must be > left margin + blt :verr + cmp temp ; and paragraph indention! + blt :verr + + ~GetInt #6 ;line spacing + bcs :verr + ldy #8 + sta [temp3],y + + ~GetInt #7 ;tabs + bcs :t1 + ldy #$14 + sta [temp3],y +:t1 + ~GetInt #16 + bcs :t2 + ldy #$18 + sta [temp3],y +:t2 + ~GetInt #17 + bcs :t3 + ldy #$1C + sta [temp3],y +:t3 + ~GetInt #18 + bcs :t4 + ldy #$20 + sta [temp3],y +:t4 + jmp mySetRuler ;make changes + +:TabDlg str 'Margin' + +*====================================================== +* Update the values shown in the info dialog + +SetInfo + _WaitCursor + + jsr GetTEInfo ;get some info, check for empty + + ~Long2Dec TEInfoRec;#DecLen+1;#6;#0 ;...char count + ~Long2Dec TEInfoRec+4;#DecLines+1;#4;#0 ;...lines + ~Long2Dec TEInfoRec+12;#DecMem+1;#8;#0 ;...memory + ~Long2Dec TEInfoRec+16;#DecStCt+1;#4;#0 ;...styles + + jsr GetSelText ;get text (selection) + bcc :doit + rts +:doit + stz temp ;no words + stz temp+2 ;no paras + stz temp2 ;no prev. word + + SHORTM ;work w/char +]loop + lda [Ptr],y ;get a char + cmp #' ' + beq :word ;word? + cmp #13 + beq :cr ;paragraph? + stz temp2 + bra :no ; no- must be text +:cr + ldx temp+2 ; yes- count paragraph + inx + stx temp+2 +:word + ldx temp2 ;space/CR previous? + btr :no + dec temp2 ; no- mark & count this one + ldx temp + inx ; (16 bit incr. ... INC = 8 here!) + stx temp +:no + iny + bne :same ;update bank byte? + inc Ptr+2 +:same cpy selEnd ;done w/this bank? + bne ]loop + dec temp3 ; yes- are we totally done? + bpl ]loop + + LONGM + and #$7F + cmp #13 ;last char a CR? + beq :skip + cmp #' ' ; or a space? + beq :skip + inc temp ; no- one last word & para. + inc temp+2 +:skip + ~Int2Dec temp;#DecWord+1;#4;#0 + ~Int2Dec temp+2;#DecPara+1;#4;#0 ;covert values to dec ASCII + + jsr RemoveText ;free up memory for next part + + ~FreeMem ;get free memory + PullLong temp + ~Long2Dec temp;#DecFree+1;#8;#0 + ~RealFreeMem + PullLong temp ;get purgable free mem + ~Long2Dec temp;#DecPurg+1;#8;#0 + ~MaxBlock + PullLong temp ;largest block + ~Long2Dec temp;#DecBlock+1;#8;#0 + ~TotalMem + PullLong temp ;total system memory + ~Long2Dec temp;#DecTotal+1;#8;#0 + + _InitCursor + rts + +*================================================= +* our Document Information dialog thingy! + +InfoAlert + dw 34,130,129,473 + dw 1 + hex 80808080 + adrl :item1 + adrl :item23 + adrl :item22 + adrl :item21 + adrl :item20 + adrl :item19 + adrl :item18 + adrl :item17 + adrl :item16 + adrl :item15 + adrl :item14 + adrl :item2 + adrl :item3 + adrl :item4 + adrl :item5 + adrl :item6 + adrl :item7 + adrl :item8 + adrl :item9 + adrl :item10 + adrl :item11 + adrl :item12 + adrl :item13 + adrl 0 + +:item23 dw 23 + dw 58,271,68,333 + dw #$800F + adrl DecTotal + dw 0 + dw 0 + adrl 0 + +:item22 dw 22 + dw 48,271,58,333 + dw #$800F + adrl DecBlock + dw 0 + dw 0 + adrl 0 + +:item21 dw 21 + dw 38,271,48,333 + dw #$800F + adrl DecPurg + dw 0 + dw 0 + adrl 0 + +:item20 dw 20 + dw 28,271,38,333 + dw #$800F + adrl DecFree + dw 0 + dw 0 + adrl 0 + +:item19 dw 19 + dw 18,271,28,333 + dw #$800F + adrl DecMem + dw 0 + dw 0 + adrl 0 + +:item18 dw 18 + dw 58,100,68,148 + dw #$800F + adrl DecPara + dw 0 + dw 0 + adrl 0 + +:item17 dw 17 + dw 48,100,58,148 + dw #$800F + adrl DecWord + dw 0 + dw 0 + adrl 0 + +:item16 dw 16 + dw 38,100,48,148 + dw #$800F + adrl DecStCt + dw 0 + dw 0 + adrl 0 + +:item15 dw 15 + dw 28,99,38,147 + dw #$800F + adrl DecLines + dw 0 + dw 0 + adrl 0 + +:item14 dw 14 + dw 18,99,28,147 + dw #$800F + adrl DecLen + dw 0 + dw 0 + adrl 0 + +:item1 dw 1 + dw 77,70,90,270 + dw #$A + adrl :item1txt + dw 0 + dw 1 + adrl 0 +:item1txt str /Well, Isn't that special!/ + +:item2 dw 2 + dw 18,13,28,96 + dw #$800F + adrl :item2txt + dw 0 + dw 0 + adrl 0 +:item2txt str 'Char. Count:' + +:item3 dw 3 + dw 28,18,38,96 + dw #$800F + adrl :item3txt + dw 0 + dw 0 + adrl 0 +:item3txt str 'Line Count:' + +:item4 dw 4 + dw 38,11,48,96 + dw #$800F + adrl :item4txt + dw 0 + dw 0 + adrl 0 +:item4txt str 'Num. Styles:' + +:item5 dw 5 + dw 48,16,58,96 + dw #$800F + adrl :item5txt + dw 0 + dw 0 + adrl 0 +:item5txt str 'Word Count:' + +:item6 dw 6 + dw 58,14,68,96 + dw #$800F + adrl :item6txt + dw 0 + dw 0 + adrl 0 +:item6txt str 'Paragraphs:' + +:item7 dw 7 + dw 18,182,28,267 + dw #$800F + adrl :item7txt + dw 0 + dw 0 + adrl 0 +:item7txt str 'Doc. Memory:' + +:item8 dw 8 + dw 28,180,38,267 + dw #$800F + adrl :item8txt + dw 0 + dw 0 + adrl 0 +:item8txt str 'Free Memory:' + +:item9 dw 9 + dw 38,193,48,267 + dw #$800F + adrl :item9txt + dw 0 + dw 0 + adrl 0 +:item9txt str 'w/Purging:' + +:item10 dw 10 + dw 48,164,58,267 + dw #$800F + adrl :item10txt + dw 0 + dw 0 + adrl 0 +:item10txt str 'Largest Block:' + +:item11 dw 11 + dw 58,170,68,267 + dw #$800F + adrl :item11txt + dw 0 + dw 0 + adrl 0 +:item11txt str 'Total Memory:' + +:item13 dw 13 + dw 5,3,16,344 + dw #$800F + adrl :item13txt + dw 0 + dw 0 + adrl 0 +:item13txt str '__________________________________________' + +:item12 dw 12 + dw 3,62,12,285 + dw #$800F + adrl :item12txt + dw 0 + dw 0 + adrl 0 +:item12txt str 'Document & System Information' + +*================================================= +FindDialog + dw 34,50,105,399 + dw 0 + adrl 0 + adrl :words + adrl :case + adrl :fromtop + adrl :item6 + adrl :item5 + adrl :item8 + adrl :item7 + adrl :item4 + adrl :item3 + adrl :item2 + adrl :item1 + adrl 0 + +:item8 dw 8 + dw 24,4,37,99 + dw #$800F + adrl :item8txt + dw 0 + dw 0 + adrl 0 +:item8txt str 'Replace with:' + +:item7 dw 7 + dw 8,3,21,100 + dw #$800F + adrl :item7txt + dw 0 + dw 0 + adrl 0 +:item7txt str 'Find the text:' + +:item6 dw 6 + dw 22,102,36,342 + dw #$11 + adrl tReplace + dw 30 + dw 0 + adrl 0 + +:item5 dw 5 + dw 6,102,20,342 + dw #$11 + adrl tFind + dw 30 + dw 0 + adrl 0 + +:item4 dw 2 + dw 53,270,66,338 + dw #$A + adrl CancelTxt + dw 0 + dw $00 + adrl 0 + +:item3 dw 4 + dw 53,155,66,259 + dw #$A + adrl :item3txt + dw 0 + dw $00 + adrl 0 +:item3txt str 'Replace All' + +:item2 dw 3 + dw 53,69,66,145 + dw #$A + adrl :item2txt + dw 0 + dw $00 + adrl 0 +:item2txt str 'Replace' + +:item1 dw 1 + dw 53,8,66,57 + dw #$A + adrl :item1txt + dw 0 + dw $01 + adrl 0 +:item1txt str 'Find' + +:case + dw $8000 + dw 40,85,50,200 + dw $B + adrl :casetxt + dw 1 + dw 4 + adrl 0 +:casetxt + str 'Ignore Case' + +:fromtop + dw $8002 + dw 40,210,50,340 + dw $B + adrl :ftxt + dw 1 + dw 4 + adrl 0 +:ftxt + str 'From Beginning' + +:words + dw $8004 + dw 40,6,50,70 + dw $B + adrl :wordtxt + dw 0 + dw 4 + adrl 0 +:wordtxt + str 'Words' + +*================================================= +TabDialog + dw 36,115,162,275 + dw 0 + adrl 0 + adrl :item15 + adrl :item14 + adrl :item13 + adrl :item12 + adrl :item11 + adrl :item10 + adrl :item9 + adrl :item8 + adrl :item18 + adrl :item17 + adrl :item16 + adrl :item7 + adrl :item6 + adrl :item5 + adrl :item4 + adrl :item3 + adrl :item2 + adrl :item1 + adrl 0 + +:item15 dw 15 + dw 95,16,106,96 + dw #$800F + adrl :item15txt + dw 0 + dw 0 + adrl 0 +:item15txt str 'Tab #4:' + +:item14 dw 14 + dw 82,16,93,96 + dw #$800F + adrl :item14txt + dw 0 + dw 0 + adrl 0 +:item14txt str 'Tab #3:' + +:item13 dw 13 + dw 69,16,80,96 + dw #$800F + adrl :item13txt + dw 0 + dw 0 + adrl 0 +:item13txt str 'Tab #2:' + +:item12 dw 12 + dw 56,16,67,96 + dw #$800F + adrl :item12txt + dw 0 + dw 0 + adrl 0 +:item12txt str 'Tab #1:' + +:item11 dw 11 + dw 43,4,54,96 + dw #$800F + adrl :item11txt + dw 0 + dw 0 + adrl 0 +:item11txt str 'Line Spacing:' + +:item10 dw 10 + dw 30,22,41,96 + dw #$800F + adrl :item10txt + dw 0 + dw 0 + adrl 0 +:item10txt str 'Indention:' + +:item9 dw 9 + dw 17,4,28,96 + dw #$800F + adrl :item9txt + dw 0 + dw 0 + adrl 0 +:item9txt str 'Right Margin:' + +:item8 dw 8 + dw 4,11,15,96 + dw #$800F + adrl :item8txt + dw 0 + dw 0 + adrl 0 +:item8txt str 'Left Margin:' + +:item18 dw 18 + dw 93,100,107,154 + dw #$11 + adrl DecTabs3 + dw 6 + dw 0 + adrl 0 + +:item17 dw 17 + dw 80,100,94,154 + dw #$11 + adrl DecTabs2 + dw 6 + dw 0 + adrl 0 + +:item16 dw 16 + dw 67,100,81,154 + dw #$11 + adrl DecTabs1 + dw 6 + dw 0 + adrl 0 + +:item7 dw 7 + dw 54,100,68,154 + dw #$11 + adrl DecTabs + dw 6 + dw 0 + adrl 0 + +:item6 dw 6 + dw 41,100,55,154 + dw #$11 + adrl DecLine + dw 6 + dw 0 + adrl 0 + +:item5 dw 5 + dw 28,100,42,154 + dw #$11 + adrl DecIndent + dw 6 + dw 0 + adrl 0 + +:item4 dw 4 + dw 15,100,29,154 + dw #$11 + adrl DecRight + dw 6 + dw 0 + adrl 0 + +:item3 dw 3 + dw 2,100,16,154 + dw #$11 + adrl DecLeft + dw 6 + dw 0 + adrl 0 + +:item2 dw 2 + dw 110,86,123,154 + dw #$A + adrl CancelTxt + dw 0 + dw 0 + adrl 0 + +:item1 dw 1 + dw 110,12,123,69 + dw #$A + adrl :item1txt + dw 0 + dw 1 + adrl 0 +:item1txt str 'Done' + +DIllVal + asc '12/' + asc 'Illegal Value!/' + asc '^#0',00 +*------------------------------------------------------ +* Used by info alert + +DecWord str ' ' +DecPara str ' ' +DecLines str ' ' ;strings for Info alert +DecStCt str ' ' +DecLen str ' ' +DecMem str ' ' +DecFree str ' ' +DecPurg str ' ' +DecBlock str ' ' +DecTotal str ' ' +DecLeft str ' ' +DecRight str ' ' +DecIndent str ' ' +DecLine str ' ' +DecTabs str ' ' +DecTabs1 str ' ' +DecTabs2 str ' ' +DecTabs3 str ' ' + +CancelTxt str 'Cancel' + +*------------------------------------------------------ +LineDialog + dw 34,50,69,298 + dw -1 + adrl 0 + adrl :item4 + adrl :item3 + adrl :item2 + adrl :item1 + adrl 0 + +:item4 dw 4 + dw 6,5,19,95 + dw #$800F + adrl :item4txt + dw 0 + dw 0 + adrl 0 +:item4txt str 'Label/Line #' + +:item3 dw 3 + dw 19,4,33,244 + dw #$11 + adrl tFind + dw 30 + dw 0 + adrl 0 + +:item2 dw 2 + dw 3,175,16,243 + dw #$A + adrl CancelTxt + dw 0 + dw $00 + adrl 0 + +:item1 dw 1 + dw 4,119,15,167 + dw #$A + adrl :item1txt + dw 0 + dw 1 + adrl 0 +:item1txt str 'GO' + + lst off + sav 2/obj/qasm1.l diff --git a/src/shell/qasm2.s b/src/shell/qasm2.s new file mode 100644 index 0000000..89f3a12 --- /dev/null +++ b/src/shell/qasm2.s @@ -0,0 +1,920 @@ + lst off + ttl "QASM text routines" + exp off + tr on + cas se +* dup +*====================================================== +* Graphic Shell for QuickASM development system + +* Programming by Lane Roath +* Copyright (c) 1990 Ideas From the Deep & Lane Roath +*------------------------------------------------------ +* 26-Feb-90 0.10 :start working on text windows +*====================================================== + + rel + +Class1 = $2000 + + lst off + use 2/data/qa.equates + use macs + use ifd.equs + use equs + lst rtn + + EXT TextName,TextPath,GetTEInfo,FindNext,selStart,selEnd + EXT SetSelection,QuitPath,GetSelText,SetText,tFind,myDP + EXT HEdit,PrintBuf,CmdLine,TempBuf,SetStyle,SetRuler + +*====================================================== +* We redirect all text i/o to these routines + +pt2c ENT + phb + phk ;need our bank + plb + SEP #$30 + sta CmdLine ;save col # + lda #$20 + ldx PrintBuf ;get current length +]loop + inx ;next char + beq :done + sta PrintBuf,x ; is a space + stx PrintBuf + cpx CmdLine + blt ]loop ;until reached column +:done + REP #$30 + plb ;restore bank & exit + rtl + +*------------------------------------------------------ + +pchr ENT ;print a character + clc + hex 24 +pechr ENT ;error entry + sec + + phb + phk ;need our bank + plb + phd + pha + lda myDP ;need our DP + tcd + pla + sta CmdLine + stz CmdLine+1 ;fake CString + lax #CmdLine + bra pblkz + +*------------------------------------------------------ +pblk ENT ;print a CString + clc + hex 24 +peblk ENT ;error entry + sec + + phb + phk ;need our bank + plb + phd + pha + lda myDP ;need our DP + tcd + pla +pblkz + sax Ptr ;point to CString + SEP #$30 + ldy #0 +]loop + lda [Ptr],y + beq :end ; & get it's length + iny + bne ]loop + dey ;backup! +:end + REP #$30 + bra pstr2 + +*------------------------------------------------------ +pstr ENT ;print a PString + clc + hex 24 +pestr ENT ;error entry + sec + + phb + phk ;need our bank + plb + phd + pha + lda myDP ;need our DP + tcd + pla + sax Ptr ;point to string + lda [Ptr] + and #$FF ;get length + tay + inc Ptr ; & skip length byte +pstr2 + sty temp2 ;don't over use DP! + + lda #0 + ror ;place carry in BMI bit + cmp WhichWdw + beq :same ;same as last call? + pha + jsr AddText ; no- add text to prev. window + pla +:same + sta WhichWdw ;save which window we are going to + + SEP #$30 ;8 bit code follows + + ldy #0 ;get indexes +:loop + ldx PrintBuf +]loop + inx ;buffer overflow? + bne :ok + phy + jsr AddText ; yes- add current text + ply + bra :loop ; & restart fill +:ok + stx PrintBuf + lda [Ptr],y ;copy a char + and #$7F + cmp #' ' ;control char? + blt :ctrl ; yes- special +:char + sta PrintBuf,x ; no- just store char +:nochar + iny + cpy temp2 ;are we done? + blt ]loop + cmp #13 ; yes- last char a CR? + bne :xit + jsr AddText ; yes- add text +:xit + REP #$30 + pld + plb ;restore dp,bank & exit + rtl + +*------------------------------------------------------ + mx %11 +:ctrl + cmp #13 ;CR? + beq :char + dex + cmp #'U'&$1F ;multi char? + bne :nochar + inx + iny + lda [Ptr],y ; yes, get count + sta temp2+2 + iny + lda [Ptr],y ; get char to repeat + and #$7F +]loop + stx PrintBuf + sta PrintBuf,x ;place a char + inx + bne :ok1 ;buffer overflow? + phy + pha + jsr AddText ; yes- add current text + pla + ply + ldx #1 ; & reinit index +:ok1 + dec temp2+2 ;done? + bne ]loop + dex + bra :nochar ; yes- back to loop + + mx %00 +*------------------------------------------------------ +* Add the text to the TE record of user's choice + +AddText + php ;must be in 16bit mode! + + SEP #$30 + lda PrintBuf ;anything to print? + beq :xit + REP #$30 + + lda WhichWdw ; yes, to which window? + bmi :1 + lax CmdTEHdl ; Command window + bra :2 +:1 + lax ErrTEHdl ; Error window +:2 + sax QuitPath ;save TE record + ~TEInsert #0;#PrintBuf;PrintBuf;#0;#0;QuitPath ; & insert in wdw + stz PrintBuf +:xit + plp + rts + +WhichWdw dw 0 ;assume command + +*====================================================== +* Install our keypress checker into the TE record + + mx %00 + +InstallKey ENT + lda #%1100010 ; no, update TE record + jsr SetStyle + lda #-2 + ldy #8 ;adjust line spacing + jsr SetRuler + + Hdl_Ptr TEHdl;Ptr ;point to command window TE record + ldy #$C8 + lda #KeyFilter + sta [Ptr],y + iny + iny ;install our key filter + lda #^KeyFilter + sta [Ptr],y + rts + +*====================================================== +* Check for ENTER or CLEAR keypresses on keypad +* Just sets some flags, actual work done by main program! + +KeyFilter + + dum 4 +]rtl ds 3 ;these are passed on stack +]type ds 2 +]handle ds 4 +]newstack = *-3 ;must be at end of passed params + dend + + phd ;save DP, bank + phb + phk + plb + lda myDP ; & use ours + tcd + + lda ]handle+2,s + sta Hdl+2 ;get TE handle + lda ]handle,s + sta Hdl ; & dereference for use + Hdl_Ptr Hdl;Ptr + lda ]type,s ;check for type 1 + dec + bne :xit + ldy #$D8+2 + lda [Ptr],y ;keypad ? + and #$2000 + beq :xit ; no- exit + dey + dey + lda [Ptr],y + and #$7F ;get keypress + cmp #'X'&$1F + bne :enterchk ;CLEAR? + dec ClearFlg + bra :wedo ; yes- tell program +:enterchk + cmp #13 ;ENTER? + bne :xit + dec EnterFlg ; yes- inform program +:wedo + lda #2 ;TE... don't handle this press! + bra :xit2 +:xit + lda #0 ;TE... do normal processing +:xit2 + ldy #$D8+$C + sta [Ptr],y ;tell TE what to do + + lda ]rtl,s + sta ]newstack,s + + SEP #$30 ;remove parms + lda ]rtl+2,s + sta ]newstack+2,s + REP #$30 + + plb ;restore DP, bank + pld + tsc + clc + adc #]newstack-4 ;adjust stack + tcs + rtl + +*====================================================== +* User pressed CLEAR on the keypad, clear TE text + +DoClear ENT + stz ClearFlg + lda #20 ;select entire document + jsr HEdit + ~TEClear #0 ; & clear it + rts + +*====================================================== +* User pressed ENTER on keypad, parse QA commands + +DoEnter ENT + stz EnterFlg ;we're doing it! + ldx #'H'&$1F + lda #$800 ;move to beginning of line + jsr :dokey + ldx #'U'&$1F + lda #$A00 ;select to end of line + jsr :dokey + ~TECopy #0 ;copy to clipboard + bcs :err + ~GetScrapHandle #0 ;get handle to copied text + PullLong Hdl + bcs :err + ~HLock Hdl ;lock it down + Hdl_Ptr Hdl;Ptr + ~GetHandleSize Hdl ;get size + ply + plx + bcs :err + + SEP #$30 + sty CmdLine ;set length +]loop dey + bmi :xit ;don't do NULL string + lda [Ptr],y + iny ;copy text to PString + sta CmdLine,y + dey + bne ]loop + REP #$30 + + ~QAParseCmdLine #CmdLine ;let QA parse the command + plx + ply + bcc :doit ;ok? +:err + ~SysError #sntx +:xit + REP #$30 + rts +:doit + phx ; yes- try to run it! + phy + + ldx #'U'&$1F ;move to end of line + lda #0 + jsr :dokey + ldx #13 ; & insert a CR + jsr :dokey2 + _QAClearKey + _QAExecCommand ;let QA do it's thing + bcs :err + rts + +*------------------------------------------------------ +:dokey + sta TaskRc+14 +:dokey2 + stx TaskRc+2 ;set keypress + lda #3 ;show keydown event + sta TaskRc + ~TEKey #TaskRc;TEHdl ; & have TE do it + rts + +sntx str 'Command not found!' + +*====================================================== +* This is the text mode handler, so we can switch back +* and forth between it and graphics quickly!!! + +doTextMode ENT + _GrafOff ;back to text! + _QAResetVectors + _QAClearKey ; (w/no pending keypress!) + bra :cr +]loop + ~QAGetQuitFlag + pla + bne :end ;time to quit? + _QARun + jsr GetLine ; no- get user input + bcc :cr + + ~QAParseCmdLine #CmdLine ;let QA parse the command + plx + ply + bcs :err ;able to parse? + phx + phy + _QAClearKey + _QAExecCommand ;let QA do it's thing + bcc ]loop +:err + pha + ~QADrawStr #sntx ;show error msg + _QAPrByteL +:cr + _QADrawCR + bra ]loop +:end + _GrafOn ;back to graphics! + +*====================================================== +* Force printing in QuickASM to be placed in TEdit window + +GrafVectors ENT + ~QASetVector #1;#pchr + ~QASetVector #2;#pstr ;set vectors for text output + ~QASetVector #5;#pblk + ~QASetVector #3;#pechr + ~QASetVector #4;#pestr ;set error vectors for text output + ~QASetVector #6;#peblk + ~QASetVector #14;#pt2c + rts + +*====================================================== +* Use the QA tools to get some input in the text mode + +GetLine + stz CmdLine ;force nothing in buffer + + pea 0 ;room for returned stuff + pea 0 + pea 0 + psl #CmdLine ;pointer to my buffer + psl #:prompt ;my prompt string + lda :prompt ;calculate maximum length + and #$ff ;from prompt length + sec + sbc #79 + eor #$FFFF + inc + pha + pea 0 ;start at first position + lda #"_" ;insert cursor + ora #' '*256 ;overstrike is high byte + pha + lda :cursor ;current cursor + and #$FF + ora #" "*256 ;"fill" character + pha + psl #:abortptr ;keys to abort on (besides ESC and CR) + _QAGetLine + pla + and #$FF + sta :cursor ;save user's cursor pref + pla ;pull off last position + pla ;pull last key press + and #$7f + cmp #$1b ;ESC? + bne :noesc + _GrafOn ; yes- + pla + brl GrafVectors ; exit back to graphics! +:noesc + lda CmdLine + and #$ff + beq :clc ;empty line? + tay + lda CmdLine,y + and #$7F + cmp #$0D ;look for end of input + beq :sec + inc CmdLine + lda #$0D + sta CmdLine+1,y ; insure CR at end +:sec + _QADrawCR + sec + rts +:clc + lda #$0D01 + sta CmdLine + clc + rts + +:cursor dw ' ' ;start with overstrike +:prompt str 'CMD:' +:abortptr dw 0 ;no keys abort + + mx %00 +*====================================================== +* Load the QATools and QACommand table files + +LoadQAStuff ENT + ~InitialLoad ID2;#ToolName;#-1 ;load our special tools + plx + PullLong ToolAdr ;ignore ID, save address + plx + plx ;ignore DP/stack information + bcs :ggg + + ~SetTSPtr #ToolType;#ToolNum;ToolAdr ;setup in tool table + bcs :ggg + + _QABootInit ;initialize the toolset + bcs :ggg + + ~InitialLoad ID2;#CmdName;#-1 ;load commands + plx + PullLong CmdAdr ;ignore ID, save pointer to cmd code + plx + plx ;ignore DP/stack info + bcs :ggg + + ~ReadFile #ParmName;#$8000 ;read parameter file + bcs :ggg + sax ParmHdl + + Hdl_Ptr ParmHdl;Ptr ;deref parms + pei ID + pea #0 + lda [Ptr] + and #$8000 ;text or graphics? + pha + _QAStartup ;start up tools +:ggg bcs :gxit + + jsr SetCmdHdl ;read command table + bcs :gxit + ~QASetCmdHdl CmdHdl;NumCmds ;let QA know abut stuff + ~QASetParmHdl ParmHdl + ~QASetCmdTbl CmdAdr + + ~ReadFile #LoginName;#0 ;read parameter file +:gxit bcs :xit + lda ReadParms+12 ; & exit if empty + beq :xit + + stz temp ;init index into file +]loop + ldy temp ;is current line blank? + lda [Ptr],y + and #$7F + cmp #13 + beq :nextline + cmp #';' ; no- do we have a good command? + beq :nextline + cmp #'*' + beq :nextline + dey ; yes- backup one for PString creation + bmi :xit + tya + clc + adc Ptr ;create pointer to text + sta temp2 + lda Ptr+2 + adc #0 ; allowing wrapping around bank! + sta temp2+2 + + SEP #$30 ;only need 8 bit stuff here! + + ldy #1 +]lup + lda [temp2],y + and #$7F ;look for EOL + cmp #'I'&$1F + beq :tab + cmp #' ' ; (anything < space 'cept tabs!) + blt :fnd +:tab + iny ;repeat until found (>255 = error) + bne ]lup +:fnd + tya ;save length! + sta [temp2] ; (only a byte) + + REP #$30 + + ~QAParseCmdLine temp2 ;parse a command line + plx + ply + bcs :xit ;able to parse? + phx + phy + _QAExecCommand ;let QA do it's thing +:nextline + ~QANextLine Ptr;temp;ReadParms+12 + PullWord temp + bcc ]loop ;repeat util done! + clc +:xit + rts + +*====================================================== +* Read the command table & create the 'commands' we know + +RecSize = temp2 +begword = temp3 +endword = temp3+2 ;all unused at this time!!! +Ptr2 = tRLen +size = textLen + +SetCmdHdl + stz CmdHdl ;we don't have one yet! + stz CmdHdl+2 + pha + _QAGetCmdRecSize ;Valid even if QATools not started + pla + sta RecSize + + ~ReadFile #TableName;#0 ;read in command table + bcs :err + sax Hdl + Hdl_Ptr Hdl;Ptr ; & point to it + + stz NumCmds ;we don't have any + + ~GetHandleSize Hdl ;get size of table + PullLong temp + + jsr :getentry ;set all the commands + php + pha + ~DisposeHandle Hdl ;get rid of data, save error status + pla + plp +:err + rts + +*------------------------------------------------------ +* Get the entries in the command table & set our internal +* information appropriately + +:getentry + stz endword ;start at beginning of file +:gloop + ldx #eRecSize-2 +]lup stz CmdLine,x ;clear buffer + dex + dex + bpl ]lup + + SEP #$20 + + jsr :getword ;get command word w/first char in 'A' + bcc :nl0 + brl :done ;reached EOF! +:nl0 + cmp #'*' + beq :nl1 ;have a comment? + cmp #';' + bne :nl2 +:nl1 brl :newline ; yes- skip line! +:nl2 + ldx #$00 + bra :c1 ; no- save first char +]loop + jsr :getchar ;get next char + bcs :nextfield +:c1 + sta CmdLine+1,x ;save the command + inx + cpx #16 ; & continue for up to 15 chars + blt ]loop + dex ; (real length) +:nextfield + SEP #$10 + stx CmdLine ;save length of command (byte) + REP #$10 + + jsr :getword ;get next word + bcs :gbad + cmp #'*' ;is this command restartable? + bne :cmp + lda #$80 + tsb CmdLine+eflags+1 ; yes- show it + jsr :getchar + bcs :gbad +:cmp + ldy #1 + cmp #'L' ;linker? + beq :ty + iny + cmp #'C' ;compiler? + beq :ty + iny + cmp #'I' ;internal? + beq :ty + iny + cmp #'E' ;external? + beq :ty + iny + cmp #'A' ;application? + bne :bad +:ty + sty CmdLine+etype ;save type + + jsr :getword ;get next word (ID #) +:gbad bcs :bad + ldx #$00 ;save first char + bra :c2 +]lup + jsr :getchar ;get next char + bcs :stx +:c2 + cmp #'0' + blt :bad ;insure it's a decimal # + cmp #'9'+1 + bge :bad + sta TempBuf,x ;then save it + inx + cpx #5 ; & do so for up to 4 chars + blt ]lup + dex +:stx + REP #$20 ;16 bit stuff + pha + psl #TempBuf + phx + pea 0 + _Dec2Int ;convert ASCII to hex + pla + sta CmdLine+eid ; & save ID in table + + inc NumCmds ;we got another! + jsr :saveit + bcs :eerr +:newline + REP #$20 ;insure 16 bit A + + ~QANextLine Ptr;endword;temp + PullWord endword + bcs :done + brl :gloop +:done + rep $30 + lda NumCmds ;must have at least one command! + beq :bad + clc + rts +:bbad + ply ;get rid of an RTS +:bad + rep $30 + lda #qabadcmdfile ;we didn't like this file! +:eerr + sec + rts + +*------------------------------------------------------ +:getword + REP #$20 ;force 16 bit +]loop + ~QAGetWord Ptr;endword;temp ;get a word + plx + ply + beq :0 ;don't modify if no word! + stx endword + sty begword + bcc :1 + tax ;real error, or just no word? + bmi :1 +:0 + inc endword ;no word- look for one! + bra ]loop +:1 + SEP #$20 + bra :gc ;get first char, uppercase! + +*------------------------------------------------------ + mx %10 +:getchar + iny ;are we at end of word? + cpy endword + bge :gc1 ; yes- outa here! + cpy temp + bge :bbad +:gc + lda [Ptr],y + and #$7F ;create usable dude + cmp #'a' + blt :gc1 ;convert lower case + cmp #'z'+1 + bge :gc2 + and #$5F +:gc2 + clc ;no error +:gc1 + rts + +*------------------------------------------------------ + mx %00 +:saveit + lda CmdHdl + ora CmdHdl+2 ;already started? + bne :resize + + ~NewHandle #1;ID2;#0;#0 ; no- need a handle! + PullLong CmdHdl + bcs :serr +:resize + ~HUnlock CmdHdl ;we want to use this + + psl #$00 + pei NumCmds + pei RecSize + Tool $090B ;multiply # of commands by record size + lda 1,s + sta size + lda 3,s ;get result, leave on stack + sta size+2 + + psl CmdHdl ; to make handle the correct size + _SetHandleSize + bcc :noerr +:serr + rts ;always reached w/BCS +:noerr + ~HLock CmdHdl + Hdl_Ptr CmdHdl;Ptr2 ;deref record handle + + lda size + sec + sbc RecSize ;get offset to start of new record + bcs :s1 + dec size+2 +:s1 + clc + adc Ptr2 + sta Ptr2 ;adjust pointer for our use + lda Ptr2+2 + adc size+2 + sta Ptr2+2 + + ldy RecSize ;# of bytes+2 to move +]lup + dey + dey ;next word + bmi :set + lda CmdLine,y + sta [Ptr2],y ;move a word into array + bra ]lup +:set + lda CmdLine+etype ;setup system vars as found + cmp #1 + beq :linker + cmp #2 + bne :ul + ~QAGetCompileID ;compiler ID found...already set? + pla + bne :ul + ~QASetCompileID CmdLine+eid ; no- set it + bra :ul +:linker + ~QAGetLinkID ;linker ID found... already set? + pla + bne :ul + ~QASetLinkID CmdLine+eid ; no- set it +:ul + ~HUnlock CmdHdl ;don't clog memory + rts + +ToolName str '@:qasystem:qatools' +CmdName str '@:qasystem:qaintcmd' +ParmName strl '@:qasystem:qaprefs' +TableName strl '@:qasystem:qacmd' +LoginName strl '@:qasystem:login' +*====================================================== +* Display the QuickASM main greeting on the text screen + +PrintWelcome ENT + psl #:welcome + _QADrawBlock + ~QADrawVersion #versionnum + psl #:next + _QADrawBlock + rts + +:welcome + dfb 'U'&$1F,31,' ' + asc 'QuickASM GS v',00 +:next hex 0d + dfb 'U'&$1F,38,' ' + asc 'by',0d + dfb 'U'&$1F,27,' ' + asc 'Shawn Quick & Lane Roath',0d,0d + dfb 'U'&$1F,15,' ' + asc 'Copyright (c) 1990 QuickSoft Software Development',0d + dfb 'U'&$1F,25,' ' + asc 'All Rights Reserved Worldwide',0d + dfb 'U'&$1F,80,'_' + hex 0d0d + hex 00 + + lst off + sav 2/obj/qasm2.l diff --git a/src/t1.s b/src/t1.s new file mode 100644 index 0000000..f923566 --- /dev/null +++ b/src/t1.s @@ -0,0 +1 @@ + »ìóô ïææ øã ïææ øã øã íø ¥°°äð ½ ¤Áµåøðò ½ ¤°´°µìåøðò ½ ¤°±°²°³éííåä ½ ¤±²³´µ¶îåç åñõ ­±¶ ìäø óôø óôáòô°° âòë    »¤°° ïòá ¨äð¬ø© ãï𠣤°° ïòá ¤°°¬Ó ôóâ äð ïòá äð áóì äð ïòá ÛäðÝ ðèð ïòá £éííåä áóì ðèä ôóâ åøðò ïòá åøðò áóì åøðò ïòáì ìåøðò »ìóô ïææ »»åîä óôáòô±° âðì óôáòô±° ïòá ¨äð©¬ù ïòá ¨äð© ïòá ¨äð¬ó©¬ù ôòâ äð ïòá äð¬ø áóì äð¬ø ïòá Ûäðݬù ãìã ïòá åøðò¬ù éîã ôãó ôòâ åøðò ïòá åøðò¬ø áóì åøðò¬ø ïòáì ìåøðò¬øóôáòô²° êóò åøðò áîä ¨äð¬ø© êóì ìåøðò áîä äð¬ó âéô äð áîä äð òïì äð áîä ÛäðÝ ðìð áîä £éííåä òïì ðìä âéô åøðò áîä åøðò òïì åøðò áîäì ìåøðòóôáòô³° âíé óôáòô³° áîä ¨äð©¬ù áîä ¨äð© áîä ¨äð¬ó©¬ù âéô äð¬ø áîä äð¬ø òïì äð¬ø áîä Ûäðݬù óåã áîä åøðò¬ù äåã  ôóã âéô åøðò¬ø áîä åøðò¬ø òïì åøðò¬ø áîäì ìåøðò¬øóôáòô´° òôé åïò ¨äð¬ø© ÷äí  åïò äð¬ó íöð äð¬ä𫱠åïò äð ìóò äð åïò ÛäðÝ ðèá åïò £éííåä ìóò ðèë êíð åøðò åïò åøðò ìóò åøðò åïòì ìåøðòóôáòôµ° âöã óôáòôµ° åïò ¨äð©¬ù åïò ¨äð© åïò ¨äð¬ó©¬ù íöî äð¬ä𫱠åïò äð¬ø ìóò äð¬ø åïò Ûäðݬù ãìé åïò åøðò¬ù ðèù ôãä êíì ìåøðò åïò åøðò¬ø ìóò åøðò¬ø åïòì ìåøðò¬øóôáòô¶° òôó áäã ¨äð¬ø© ðåò åøðò áäã äð¬ó óôú äð áäã äð òïò äð áäã ÛäðÝ ðìá áäã £éííåä òïò òôì êíð ¨åøðò© áäã åøðò òïò åøðò áäãì ìåøðòóôáòô·° âöó óôáòô·° áäã ¨äð©¬ù áäã ¨äð© áäã ¨äð¬ó©¬ù óôú äð¬ø áäã äð¬ø òïò äð¬ø áäã Ûäðݬù óåé áäã åøðò¬ù ðìù ôäã êíð ¨åøðò¬ø© áäã åøðò¬ø òïò åøðò¬ø áäãì åøðò¬øóôáòô¸° âòá óôáòô¸° óôá ¨äð¬ø© âòì óôáòô¸° óôá äð¬ó óôù äð óôá äð óôø äð óôá ÛäðÝ äåù âéô £éííåä ôøá ðèâ óôù åøðò óôá åøðò óôø åøðò óôáì ìåøðòóôáòô¹° âãã óôáòô¹° óôá ¨äð©¬ù óôá ¨äð© óôá ¨äð¬ó©¬ù óôù äð¬ø óôá äð¬ø óôø äð¬ù óôá Ûäðݬù ôùá óôá åøðò¬ù ôøó ôøù óôú åøðò óôá åøðò¬ø óôú åøðò¬ø óôáì ìåøðò¬øóôáòôÁ° ìäù £éííåä ìäá ¨äð¬ø© ìäø £éííåä ìäá äð¬ó ìäù äð ìäá äð ìäø äð ìäá ÛäðÝ ôáù ìäá £éííåä ôáø ðìâ ìäù åøðò ìäá åøðò ìäø åøðò ìäáì ìåøðòóôáòô° âãó óôáòô° ìäá ¨äð©¬ù ìäá ¨äð¬ó© ìäá ¨äð¬ó©¬ù ìäù äð¬ø ìäá äð¬ø ìäø äð¬ù ìäá Ûäðݬù ãìö ìäá åøðò¬ù ôóø ôùø ìäù åøðò¬ø ìäá åøðò¬ø ìäø åøðò¬ù ìäáì ìåøðò¬øóôáòôð ãðù £éííåä ãíð ¨äð¬ø© òå𠣤ÆÆ ãíð äð¬ó ãðù äð ãíð äð äåã äð ãíð ÛäðÝ éîù ãíð £éííåä äåø ÷áé ãðù åøðò ãíð åøðò äåã åøðò ãíðì ìåøðòóôáòôÄ° âîå óôáòôÄ° ãíð ¨äð©¬ù ãíð ¨äð© ãíð ¨äð¬ó©¬ù ðåé äð ãíð äð¬ø äåã äð¬ø ãíð Ûäðݬù ãìä ãíð åøðò¬ù ðèø óôð êíì ÛìåøðòÝ ãíð åøðò¬ø äåã åøðò¬ø ãíðì ìåøðò¬øóôáòôÅ° ãðø £éííåä óâã ¨äð¬ø© óå𠣤ÆÆ óâã äð¬ó ãðø äð óâã äð éîã äð óâã ÛäðÝ éîø  óâã £éííåä îïð øâá ãðø åøðò óâã åøðò éîã åøðò óâãì ìåøðòóôáòôÆ° âåñ óôáòôÆ° óâã ¨äð©¬ù óâã ¨äð© óâã ¨äð¬ó©¬ù ðåá óôáòôÆ° óâã äð¬ø éîã äð¬ø óâã Ûäðݬù óåä óâã åøðò¬ù ðìø øãå êóò ¨åøðò¬ø© óâã åøðò¬ø éîã åøðò¬ø óâãì ìåøðò¬ø ìóô ïææ \ No newline at end of file diff --git a/src/testfile.s b/src/testfile.s new file mode 100644 index 0000000..ed31e5b --- /dev/null +++ b/src/testfile.s @@ -0,0 +1,308 @@ + lst off + xc off + xc + xc + mx %00 +dp = $A5 +expr = $0405 +lexpr = $010203 +immed = $123456 +neg equ -16 + + ldx + stx + tsb #$DE + + jmp [lexpr] +start00 + brk ;$00 + ora (dp,x) + cop #$00 + ora $00,S + tsb dp + ora dp + asl dp + ora [dp] + php + ora #immed + asl + phd + tsb expr + ora expr + asl expr + oral lexpr + + ;lst off + ;;end + +start10 + bpl start10 + ora (dp),y + ora (dp) + ora (dp,s),y + trb dp + ora dp,x + asl dp,x + ora [dp],y + clc + ora expr,y + inc + tcs + trb expr + ora expr,x + asl expr,x + oral lexpr,x + +start20 + jsr expr + and (dp,x) + jsl lexpr + and dp,s + bit dp + and dp + rol dp + and [dp] + plp + and #immed + rol + pld + bit expr + and expr + rol expr + andl lexpr + +start30 + bmi start30 + and (dp),y + and (dp) + and (dp,s),y + bit dp,x + and dp,x + rol dp,x + and [dp],y + sec + and expr,y + dec + tsc + bit expr,x + and expr,x + rol expr,x + andl lexpr,x + +start40 + rti + eor (dp,x) + wdm + eor dp,s + mvp dp,dp+1 + eor dp + lsr dp + eor [dp] + pha + eor #immed + lsr + phk + jmp expr + eor expr + lsr expr + eorl lexpr + +start50 + bvc start50 + eor (dp),y + eor (dp) + eor (dp,s),y + mvn dp,dp+1 + eor dp,x + lsr dp,x + eor [dp],y + cli + eor expr,y + phy + tcd + jml lexpr + eor expr,x + lsr expr,x + eorl lexpr,x + +start60 + rts + adc (dp,x) + per expr + adc dp,s + stz dp + adc dp + ror dp + adc [dp] + pla + adc #immed + ror + rtl + jmp (expr) + adc expr + ror expr + adcl lexpr + +start70 + bvs start70 + adc (dp),y + adc (dp) + adc (dp,s),y + stz dp,x + adc dp,x + ror dp,x + adc [dp],y + sei + adc expr,y + ply + tdc + jmp (expr,x) + adc expr,x + ror expr,x + adcl expr,x + +start80 + bra start80 + sta (dp,x) + brl start80 + sta dp,s + sty dp + sta dp + stx dp + sta [dp] + dey + bit #immed + txa + phb + sty expr + sta expr + stx expr + stal lexpr + +start90 + bcc start90 + sta (dp),y + sta (dp) + sta (dp,s),y + sty dp,x + sta dp,x + stx dp,y + sta [dp],y + tya + sta expr,y + txs + txy + stz expr + sta expr,x + stz expr,x + stal lexpr,x + +startA0 + ldy #immed + lda (dp,x) + ldx #immed + lda dp,s + ldy dp + lda dp + ldx dp + lda [dp] + tay + lda #immed + tax + plb + ldy expr + lda expr + ldx expr + ldal lexpr + +startB0 + bcs startB0 + lda (dp),y + lda (dp,s) + lda (dp,s),y + ldy dp,x + lda dp,x + ldx dp,y + lda [dp],y + clv + lda expr,y + tsx + tyx + ldy expr,x + lda expr,x + ldx expr,y + ldal lexpr,x + +startC0 + cpy #immed + cmp (dp,x) + rep #$FF + cmp dp,s + cpy dp + cmp dp + dec dp + cmp [dp] + iny + cmp #immed + dex + wai + cpy expr + cmp expr + dec expr + cmpl lexpr + +startD0 + bne startD0 + cmp (dp),y + cmp (dp) + cmp (dp,s),y + pei dp + cmp dp,x + dec dp,x + cmp [dp],y + cld + cmp expr,y + phx + stp + jml [lexpr] + cmp expr,x + dec expr,x + cmpl lexpr,x + +startE0 + cpx #immed + sbc (dp,x) + sep #$FF + sbc dp,s + cpx dp + sbc dp + inc dp + sbc [dp] + inx + sbc #immed + nop + xba + cpx expr + sbc expr + inc expr + sbcl lexpr + +startF0 + beq startF0 + sbc (dp),y + sbc (dp) + sbc (dp,s),y + pea startF0 + sbc dp,x + inc dp,x + sbc [dp],y + sed + sbc expr,y + plx + xce + jsr (expr,x) + sbc expr,x + inc expr,x + sbcl lexpr,x + + lst off diff --git a/src/tools/link.s b/src/tools/link.s new file mode 100644 index 0000000..a82b82b --- /dev/null +++ b/src/tools/link.s @@ -0,0 +1,23 @@ +*====================================================== +* Link file for QATools + +* Written by Lane Roath +*====================================================== + + ovr + asm qatools + + do err + else + + lnk 2/obj/qatools.l + + ds $1000 ;DS_Size + + typ tol + sav 2/qasystem/qatools + + fin + + end + diff --git a/src/tools/qatools.1.s b/src/tools/qatools.1.s new file mode 100644 index 0000000..6b07ff4 --- /dev/null +++ b/src/tools/qatools.1.s @@ -0,0 +1,3547 @@ +storchar php + phd ;save everything + rep $30 + phx + phy + pha + pha + tsc + inc + tcd ;make 4 bytes of DP + lda basl + sta 0 ;save our offset + sep $30 + cpy #80 + bge :bad + ldx #^mainbank + tya + lsr + tay + bcs :bank0 + ldx #^auxbank +:bank0 lda 2 ;get the char back + stx 2 ;save the bank byte + sta [0],y ; +:bad rep $30 + lda 2 + plx ;remove the ptr + plx + ply + plx + pld ;restore the DP + plp ;and P + rts + +*====================================================== +* Get a character from screen at location in Y reg from left margin + +pickchar php + phd ;save everything + rep $30 + phx + phy + pha + pha + tsc + inc + tcd ;make 4 bytes of DP + lda basl + sta 0 ;save our offset + sep $30 + cpy #80 + bge :bad + ldx #^mainbank + tya + lsr + tay + bcs :bank0 + ldx #^auxbank +:bank0 stx 2 ;save the bank byte + lda [0],y ; +:bad rep $30 + and #$FF + plx ;remove the ptr + plx + ply ;restore the registers + plx + pld ;restore the DP + plp ;and P + rts + +clearwindow + bit fullwindow + jmi :port + lda #$A0A0 + ldx #40-2 +]lup stal $400+mainbank,x + stal $400+auxbank,x + stal $480+mainbank,x + stal $480+auxbank,x + stal $500+mainbank,x + stal $500+auxbank,x + stal $580+mainbank,x + stal $580+auxbank,x + stal $600+mainbank,x + stal $600+auxbank,x + stal $680+mainbank,x + stal $680+auxbank,x + stal $700+mainbank,x + stal $700+auxbank,x + stal $780+mainbank,x + stal $780+auxbank,x + stal $428+mainbank,x + stal $428+auxbank,x + stal $4a8+mainbank,x + stal $4a8+auxbank,x + stal $528+mainbank,x + stal $528+auxbank,x + stal $5a8+mainbank,x + stal $5a8+auxbank,x + stal $628+mainbank,x + stal $628+auxbank,x + stal $6a8+mainbank,x + stal $6a8+auxbank,x + stal $728+mainbank,x + stal $728+auxbank,x + stal $7a8+mainbank,x + stal $7a8+auxbank,x + stal $450+mainbank,x + stal $450+auxbank,x + stal $4d0+mainbank,x + stal $4d0+auxbank,x + stal $550+mainbank,x + stal $550+auxbank,x + stal $5d0+mainbank,x + stal $5d0+auxbank,x + stal $650+mainbank,x + stal $650+auxbank,x + stal $6d0+mainbank,x + stal $6d0+auxbank,x + stal $750+mainbank,x + stal $750+auxbank,x + stal $7d0+mainbank,x + stal $7d0+auxbank,x + dex + dex + jpl ]lup + rts + +:port phd ;save the DP + pha ;make some room on the stack + pha + tsc ;to use as DP + inc + tcd + lda wintop ;get the topline + sta :ct ;save it as a counter + lda winwidth ;get the right margin + beq :done + cmp #80+1 ;too big? + blt :1 + lda #80 ;force to right side +:1 sta :width +]lup rep $30 + lda :ct ;what line are we on? + cmp winbot + blt :ok ;done yet? + bne :done +:ok asl + tax + lda table,x ;get the base offset + clc + adc winleft ;add with left margin + sta 0 ;and save in our temp DP + sep $30 ;8 bit now for speed + ldy #0 ;start at 0 + lda #' ' ;space char +]lup1 ldx #^mainbank ;default to bank1 + xba + tya + lsr + bcs :bank0 + ldx #^auxbank +:bank0 stx 2 ;save in bank byte of ptr + xba + sta [0],y + iny + cpy :width + blt ]lup + inc :ct + bra ]lup +:done rep $30 + pla + pla ;pull off ptr from stack + pld ;retore dp + rts + +:ct ds 2 +:width ds 2 + + +scrollup ;ent ;fast scroll routine + php + phb + rep $30 + phy + ldy #40-2 ;get ready for each column +:start pea $0101 + plb + plb + lda $480,y + sta $400,y + lda $500,y + sta $480,y + lda $580,Y ;scroll one column + sta $500,Y + lda $600,Y + sta $580,Y + lda $680,Y + sta $600,Y + lda $700,Y + sta $680,Y + lda $780,Y + sta $700,Y + lda $428,Y + sta $780,Y + lda $4A8,Y + sta $428,Y + lda $528,Y + sta $4A8,Y + lda $5A8,Y + sta $528,Y + lda $628,Y + sta $5A8,Y + lda $6A8,Y + sta $628,Y + lda $728,Y + sta $6A8,Y + lda $7A8,Y + sta $728,Y + lda $450,Y + sta $7A8,Y + lda $4D0,Y + sta $450,Y + lda $550,Y + sta $4D0,Y + lda $5D0,Y + sta $550,Y + lda $650,Y + sta $5D0,Y + lda $6D0,Y + sta $650,Y + lda $750,Y + sta $6D0,Y + lda $7D0,y + sta $750,y + lda #$A0A0 + sta $7D0,Y + + pea $0000 + plb + plb +:lda2 + lda $480,y + sta $400,y + lda $500,y + sta $480,y + lda $580,Y ;scroll an odd column + sta $500,Y + lda $600,Y + sta $580,Y + lda $680,Y + sta $600,Y + lda $700,Y + sta $680,Y + lda $780,Y + sta $700,Y + lda $428,Y + sta $780,Y + lda $4A8,Y + sta $428,Y + lda $528,Y + sta $4A8,Y + lda $5A8,Y + sta $528,Y + lda $628,Y + sta $5A8,Y + lda $6A8,Y + sta $628,Y + lda $728,Y + sta $6A8,Y + lda $7A8,Y + sta $728,Y + lda $450,Y + sta $7A8,Y + lda $4D0,Y + sta $450,Y + lda $550,Y + sta $4D0,Y + lda $5D0,Y + sta $550,Y + lda $650,Y + sta $5D0,Y + lda $6D0,Y + sta $650,Y + lda $750,Y + sta $6D0,Y + lda $7D0,y + sta $750,y + lda #$A0A0 + sta $7D0,Y + dey ;decrement index + dey + bmi :exit ;if not done with screen.. + brl :start ;continue +:exit ply + plb + plp ;restore flags + rts ;and return + +table dw $400 + dw $480 + dw $500 + dw $580 + dw $600 + dw $680 + dw $700 + dw $780 + dw $428 + dw $4a8 + dw $528 + dw $5a8 + dw $628 + dw $6a8 + dw $728 + dw $7a8 + dw $450 + dw $4d0 + dw $550 + dw $5d0 + dw $650 + dw $6d0 + dw $750 + dw $7d0 + +*====================================================== +printchar + php + sep $30 + and #$7f + xba + lda charflag+1 + and #%1110_0000 + beq :print + cmp #%1110_0000 + beq :print + brl :multiple +:print + lda charflag+1 ;printing time/version/justify + and #%000_0111 + beq :p1 + brl printTVJ ; yes- handle it! +:p1 + lda charflag + and #%111 + bne :gotoxy + xba + cmp #' ' + jlt :control + bit charflag + bvs :mouse + bmi :ora + cmp #'A' ;inverse starts here + blt :jsr + cmp #'Z'+1 + bge :jsr + sec + sbc #$40 ;convert to inverse uppercase + bra :jsr +:ora ora #$80 + bra :jsr +:mouse and #$1f + ora #$40 ;convert to mouse text +:jsr xba + lda cursx + clc + adc winleft + cmp #80 + bge :cr + tay + xba + jsr storchar + inc cursx + lda cursx + cmp winwidth + blt :xit + +:cr + stz cursx +:lf inc cursy + lda cursy + cmp winbot + blt :update + beq :update + jsr scrollup + lda winbot + sta cursy +:update rep $30 + and #$7f + asl + tay + lda table,y + sta basl + sep $30 +:xit plp + rts + + mx %11 +:gotoxy bit #%100 + bne :tabx + and #$03 + cmp #$01 + beq :x +:y xba +:y1 + sec + sbc #32 ;subtract out space + sta cursy + lda :xtemp + sec + sbc #32 ; because zero is EOB + sta cursx + lda #$07 + trb charflag + jsr setcurs + brl :xit +:x lda #$03 + tsb charflag + xba +:x1 sta :xtemp + brl :xit +:tabx xba + sta cursx + lda #$7 + trb charflag + jsr setcurs + brl :xit + +:xtemp ds 2 + +:control rep $30 + and #$1f + pha + cmp #$0d + beq :cr2 + cmp #$0a + beq :lf2 + stz outflag +:c1 pla + asl + tax + jsr (:tbl,x) + plp + rts + +:cr2 lda #$80 + tsb outflag + bra :c1 +:lf2 lda #$40 + tsb outflag + bra :c1 + + mx %11 +:multiple cmp #%1000_0000 + beq :m2 +:m3 xba + sta :outchar + lda #%1110_0000 + tsb charflag+1 +:ml lda :outcount + beq :moff + lda :outchar + jsr printchar + dec :outcount + bra :ml +:moff lda #%1110_0000 + trb charflag+1 + stz :outcount + stz :outchar + brl :xit +:m2 xba + sta :outcount + lda #%1100_0000 + tsb charflag+1 + brl :xit + +:outcount ds 2 +:outchar ds 2 + +:tbl da nil ;0 + da savex ;^A + da savey ;^B + da restorex ;^C + da restorey ;^D + da nil ;^E + da nil ;^F + da bell ;^G + da backspace ;^H + da tab2 ;^I + da linefeed ;^J + da clreos ;^K + da formfeed ;^L + da textcr ;^M + da normal ;^N + da inverse ;^0 + da savexy ;^P + da nil ;^Q + da nil ;^R + da nil ;^S + da restorexy ;^T + da printmult ;^U + da scrollup ;^V + da nil ;^W + da mouseoff ;^X + da home ;^Y + da clrline ;^Z + da mouseon ;^[ $1B + da nil ;^\ $1C + da clreoln ;^] $1D + da gotoxy ;^^ $1E + da upone ;^_ $1F + +upone php + rep $30 + lda cursy + beq :plp + dec + sta cursy + jsr setcurs +:plp plp + rts + +backspace php + rep $30 + lda cursx + beq :plp + dec + sta cursx + jsr setcurs +:plp plp + rts + +bell php + rep $30 + tll $2c03 + plp + rts + +*====================================================== +* Return the quit/launch information we have obtained + +QAGetLaunch + dum $00 +]rtl ds 6 ;these are passed on stack +]newstack = *-6 ;must be at end of passed params +]flags ds 2 +]pathptr ds 4 + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda #launchpath + sta ]pathptr + lda #^launchpath + sta ]pathptr+2 + lda launchflags + sta ]flags + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +*====================================================== +* Tell the controlling program how we wish to exit... + +QASetLaunch + dum $00 +]rtl ds 6 ;these are passed on stack +]flags ds 2 +]pathptr ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda ]flags + sta launchflags + lda []pathptr] + and #$ff + tay + sep $20 +]lup lda []pathptr],y + sta launchpath,y + dey + bpl ]lup + rep $20 + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +mygetline + dum $00 +]rtl ds 6 ;these are passed on stack +]abortptr ds 4 +]cursor ds 2 +]cursors ds 2 +]startpos ds 2 +]maxlen ds 2 +]prompt ds 4 +]lineptr ds 4 +]newstack = *-6 ;must be at end of passed params +]cursout ds 2 +]endpos ds 2 +]endkey ds 2 + dend + + mx %00 + lda ]cursor + sep $20 + sta cursor + xba + sta fillchar + rep $20 + lda ]cursors + sep $20 + sta insert + xba + sta overstrike + rep $20 + stz curpos + lda ]maxlen + cmp #80 + blt :max + lda #80 +:max sta ]maxlen + lda cursx + sta startx + lda []prompt] + and #$FF + clc + adc cursx + sta startpos ;save starting position +restore rep $30 + lda []lineptr] ;get length + and #$FF + tay ;length in Y + sep $20 + sta tempbuff + lda ]startpos + cmp tempbuff + blt :scp + lda tempbuff +:scp sta curpos ;save current position + lda tempbuff + beq prtnew +:1 lda []lineptr],y ;get a character + sta tempbuff,y ;copy bytes over + dey + bne :1 ;copy the string over +prtnew rep $30 + lda startx + sta cursx + ldx ]prompt+2 + lda ]prompt + jsl pstr + lda startpos + sta cursx ;move cursor over again + ldx #^tempbuff + lda #tempbuff ;get my buffer + jsl pstr + sep $20 + lda ]maxlen + sec + sbc tempbuff ;get remaining length + rep $20 + and #$FF + tax ;amount of spaces + sep $20 ;use short + bcc :spconly + beq :spconly +:9 ldy cursx +:91 lda fillchar ;get fill char + phy + phx + jsr storchar ;add the fill character + plx + ply + iny + dex + bne :91 +:spconly lda #" " ;add space at the end + ldy cursx + jsr storchar +*------------------------------------------------- +newpos rep $30 + lda curpos + clc + adc startpos ;add starting x-pos + sta cursx ;position cursor +newkey rep $30 + jsr getkey + and #%11010000_11111111 + cmp #$FF ;char? + bge :find + cmp #" " ;space? + bge tochar ;its a character! +:find ldx i_Cmds ;get # cmds *2 +:cmdloop cmp cmds,x ;found it yet? + beq gotcmd ;yep-->handle command + dex + dex + bpl :cmdloop ;keep trying + +* Check the 'Abort' list: + + pha ;save character + lda []abortptr] ;get # abort chars + beq :noabrt + asl ;x2 + tay + pla +:lp cmp []abortptr],y + beq iabort ;abort the mission + dey + dey + bne :lp + pha +:noabrt pla ;restore keypress + +* See if 'regular' character: + + and #%00_000000_11111111 + cmp #$8D ;enter? + beq irtn + cmp #" " + blt badchar ;no more cntrl chars + cmp #"@" ;regular keypad? + bge badchar +tochar brl char ;take the character +badchar rep $30 + bra newkey +gotcmd jmp (cmdadrs,x) ;jump to the command + +* Commands: + +*------------------------------------------------- +oar brl restore ;restore old value +*------------------------------------------------- +irtn sta ]endkey + lda curpos + sta ]endpos + lda cursor + and #$ff + sta ]cursout + lda tempbuff + and #$FF + cmp ]maxlen + blt :tay0 + lda ]maxlen +:tay0 tay + sep $20 + sta []lineptr] + beq :x0 +:lp lda tempbuff,y + and #$7f + sta []lineptr],y + dey + bne :lp +:x0 rep $20 + clc ;flag all is well + rtl +*------------------------------------------------- +iabort pha + lda curpos + sta ]endpos + lda cursor + and #$ff + sta ]cursout + lda tempbuff + and #$FF + cmp ]maxlen + blt :tay1 + lda ]maxlen +:tay1 tay + sep $20 + sta []lineptr] + beq :x1 +:lp lda tempbuff,y + and #$7F + sta []lineptr],y + dey + bne :lp +:x1 rep $20 + plx + stx ]endkey + clc ;flag abort exit + rtl +*------------------------------------------------- + mx %00 +iesc sta ]endkey + lda curpos + sta ]endpos + lda cursor + and #$ff + sta ]cursout + sec ;flag abort + rtl ;and leave here +*------------------------------------------------- + mx %00 +ileft lda curpos ;current position + jeq badchar ;cannot move left +:1 dec curpos ;move cursor over + brl newpos ;do new position +*------------------------------------------------- + mx %00 +iright lda curpos ;get current spot + sep $20 + cmp tempbuff ;maxed out? + jge badchar ;yep-->no good + inc curpos + brl newpos ;do new position +*------------------------------------------------- + mx %00 +oay lda curpos ;get current position + sep $20 + sta tempbuff ;set length at this value + brl prtnew ;print new string +*------------------------------------------------- + mx %00 +oax sep $20 + stz tempbuff + rep $30 + stz curpos ;also set position + brl prtnew ;print new value +*------------------------------------------------- + mx %00 +oae sep $20 + lda overstrike + cmp cursor + bne :fin + lda insert +:fin sta cursor ;save new cursor + rep $20 + brl newkey ;get new keypres +*------------------------------------------------- + mx %00 +del lda curpos + bne :ok + brl badchar ;cannot delete left if @ start +:ok tay ;offset + sep $30 +:1 lda tempbuff+1,y + sta tempbuff,y + iny + cpy tempbuff ;at end yet? + blt :1 + dec tempbuff ;1 less char + dec curpos + rep $30 + brl prtnew ;move left 1 spot +*------------------------------------------------- +oadel sep $20 + lda curpos + cmp tempbuff + blt :ok + brl badchar ;cannot delete right +:ok inc curpos ;move right 1 + bra del ;then delete left + mx %00 +*------------------------------------------------- +oaleft stz curpos ;move to begining + brl newpos ;at a new position +*------------------------------------------------- +oaright lda tempbuff + and #$FF + sta curpos ;move to the far right + brl newpos +*------------------------------------------------- +char pha ;save character + lda curpos ;get current position + sep $20 + cmp tempbuff + rep $20 + blt :notend ;not at the end + +* Cursor is at end of line: + + cmp ]maxlen ;is line full? + blt :ok + pla + brl badchar ;line is full/no good +:ok ldy curpos + pla + sep $20 ;use short A + sta tempbuff+1,y ;save value + inc curpos ;move to next position + inc tempbuff ;bump up the counter + rep $20 + brl prtnew ;print a new line + +* Cursor is not at the end: + +:notend sep $20 + lda overstrike + cmp cursor ;in overstrike mode?? + beq :putit ;yep-->just put it in there + lda tempbuff + and #$FF + cmp ]maxlen ;are we maxed? + blt :ok2 + rep %00100000 ;back to long + pla + brl badchar ;bad input + mx %10 ;assembler knows short +:ok2 lda tempbuff ;get current length + and #$ff + tay +:lp lda tempbuff+1,y ;get position + sta tempbuff+2,y ;move it up + cpy curpos + beq :dne + dey + bra :lp +:dne inc tempbuff ;bump up the buffer + rep $20 + pla + sep $20 + sta tempbuff+1,y ;insert the value + inc curpos ;move cursor over + rep $20 + brl prtnew +*------------------------------------------------- + mx %10 ;enters short +:putit ldy curpos + rep $20 + pla + sep $20 + sta tempbuff+1,y ;save new char + inc curpos + rep $20 + brl prtnew ;now move right 1 spot +*------------------------------------------------- +i_Cmds dw #54 ;27 commands + +cmds dw $008D ;return + dw $009B ;esc + dw $0088 ;left arrow + dw $0095 ;right arrow + dw $0092 ;cntrl-R, replace + dw $0098 ;cntrl-X, clear + dw $1098 ;keypad cntrl-X + dw $0099 ;cntrl-Y, clr EOL + dw $0085 ;cntrl-E, toggle + dw $00FF ;delete key + dw $80FF ;oa-delete + dw $10F5 ;keypad del + dw $8088 ;oa-left + dw $10F3 ;keypad home + dw $8095 ;oa-right + dw $10F7 ;keypad end + dw $80D2 + dw $80F2 ;oa-R,r + dw $80C5 + dw $80E5 ;oa-E,e + dw $80D8 + dw $80F8 ;oa-X,x + dw $80D9 + dw $80F9 ;oa-Y,y + dw $80C4 + dw $80E4 ;oa-Dd,cntrl-D + dw $0084 + +cmdadrs dw irtn + dw iesc + dw ileft + dw iright + dw oar + dw oax + dw oax + dw oay + dw oae + dw del + dw oadel + dw oadel + dw oaleft + dw oaleft + dw oaright + dw oaright + dw oar + dw oar + dw oae + dw oae + dw oax + dw oax + dw oay + dw oay + dw oadel + dw oadel + dw oadel + +cursor dw #"_" +insert dw #"_" +overstrike dw ' ' +fillchar dw 'I' + +getkey + php + rep $30 + ldy cursx + jsr pickchar + and #$FF + sta :screenchar + stz :on + jsr :invert +:keyl ldx #380*2 +:keyl1 phx + pha + _QAKeyAvail + pla + bne :read + _QARun ;send a run command to utilities + plx + dex + bne :keyl1 + jsr :invert + bra :keyl +:read + plx + ldy cursx + lda :screenchar + jsr storchar + pha + _QAGetChar + pla + plp + rts +:invert + php + sep $30 + bit :on + bpl :curson + lda :screenchar + ldy cursx + jsr storchar + stz :on + plp + rts +:curson + ldy cursx + lda cursor + cmp overstrike + beq :cover + lda cursor + jsr storchar + sec + ror :on + brl :ixit +:cover + lda :screenchar + cmp #'A' + blt :c0 + cmp #'Z'+1 + bge :c0 + lda overstrike + bra :cover1 +:c0 + and #$7f + cmp #'A' + blt :cover1 + cmp #'Z'+1 + bge :cover1 + sec + sbc #$40 +:cover1 jsr storchar + sec + ror :on +:ixit plp + rts + +:screenchar ds 2 +:on ds 2 + +qagetline + dum $00 +]rtl ds 6 ;these are passed on stack +]abortptr ds 4 +]cursors ds 2 +]cursor ds 2 +]startpos ds 2 +]maxlen ds 2 +]prompt ds 4 +]lineptr ds 4 +]newstack = *-6 ;must be at end of passed params +]cursout ds 2 +]endpos ds 2 +]endkey ds 2 + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + ldx #0 + tdc + jsl {vgetline*4}+vectortbl-4 + bcs :xit + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + + +* FLAGS word defined as: +* b15 - value is signed +* b14.b13 - %0x value is not justified +* - %10 value is left justifed (leading spaces) +* - %01 value is right justified (trailing spaces) +* b12 - print leading 0's +* b11 - print leading $ (QADrawHEX only) + + +qadrawhex + dum $00 +]zp ds 2 +]negflag ds 2 +]rtl ds 6 ;these are passed on stack +]fieldsize ds 2 +]flags ds 2 +]int ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + + stz hdstr + stz hdfinalstr + stz ]negflag + stz ]zp + lda ]fieldsize + cmp #$10 + blt :and + lda #$0f +:and and #$0f + sta ]fieldsize + + lda ]flags + bpl :noneg + lda ]int+2 + bpl :noneg + lda ]int+2 + eor #-1 + tax + lda ]int + eor #-1 + inc + sta ]int + bne :neg + inx +:neg stx ]int+2 + lda #-1 + sta ]negflag +:noneg psl ]int + psl #hdstr+1 + pea hexlen + tll $230b ;_Long2Hex + brl :normal +:print rep $30 + lda ]flags + psl #hdfinalstr + _QADrawstring +:noerr rep $30 + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + + +:normal sep $30 + ldx #0 + bit ]negflag + bpl :nn1 + lda #'-' + sta hdfinalstr+1,x + inx +:nn1 lda ]flags+1 + bit #$08 + beq :nn2 + lda #'$' + sta hdfinalstr+1,x + inx +:nn2 ldy #0 +]lup lda hdstr+1,y + and #$7f + cmp #' ' + beq :s + cmp #'0' + bne :p +:zero xba + lda ]zp + bne :p1 + lda ]flags+1 + bit #$10 + beq :nnext + lda #'0' + inc ]zp+1 + bra :p2 +:s lda #'0' + bra :zero +:p1 xba +:p sta ]zp +:p2 sta hdfinalstr+1,x + inx +:nnext iny + cpy #hexlen + blt ]lup + stx hdfinalstr + cpx #0 + bne :f + lda #'0' + sta hdfinalstr+1 + inc hdfinalstr +:f + lda ]flags+1 + bit #$40 + bne :justify + brl :print +:justify lda ]fieldsize + jeq :noerr + lda hdfinalstr + sec + sbc ]zp+1 ;subtract out any leading zeros + cmp ]fieldsize + blt :just + beq :just + + ldy ]fieldsize ;if it won't fit print #'s + lda #'#' +]lup sta hdfinalstr,y + dey + bne ]lup + lda ]fieldsize + sta hdfinalstr + brl :print + + +:just lda hdfinalstr + sec + sbc ]fieldsize + bcc :just1 + beq :just1 + tay ;y now holds "over" len + ldx #0 + lda hdfinalstr+1 + and #$7f + cmp #'-' + bne :nots1 + iny + inx + lda hdfinalstr+2 + and #$7f +:nots1 cmp #'$' + bne :nots + iny + inx +:nots lda hdfinalstr+1,y + sta hdfinalstr+1,x + iny + inx + cpy hdfinalstr + blt :nots + lda ]fieldsize + sta hdfinalstr + +:just1 lda ]flags+1 + bit #$20 + bne :left + lda ]fieldsize + sec + sbc hdfinalstr + beq :j2 + jsr DrawSpaces +:j2 brl :print + +:left rep $30 + psl #hdfinalstr + _QADrawString + sep $30 + lda ]fieldsize + sec + sbc hdfinalstr + beq :sxit + jsr DrawSpaces +:sxit brl :noerr + +*====================================================== +* Draw a decimal value in ASCII to output device + +QADrawDec + dum $00 +]zp ds 2 +]negflag ds 2 +]rtl ds 6 ;these are passed on stack +]fieldsize ds 2 +]flags ds 2 +]int ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + + stz hdstr + stz hdfinalstr + stz ]negflag + stz ]zp + lda ]fieldsize + cmp #$10 + blt :and + lda #$0f +:and and #$0f + sta ]fieldsize + + lda ]flags + bpl :noneg + lda ]int+2 + bpl :noneg + lda ]int+2 + eor #-1 + tax + lda ]int + eor #-1 + inc + sta ]int + bne :neg + inx +:neg stx ]int+2 + lda #-1 + sta ]negflag +:noneg psl ]int + psl #hdstr+1 + pea declen + pea 0 + tll $270b ;_Long2DEC + brl :normal +:print rep $30 + psl #hdfinalstr + _QADrawstring +:noerr rep $30 + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit +:normal + sep $30 + ldx #0 + bit ]negflag + bpl :nn1 + lda #'-' + sta hdfinalstr+1,x + inx +:nn1 ldy #0 +]lup lda hdstr+1,y + and #$7f + cmp #' ' + beq :s + cmp #'0' + bne :p +:zero xba + lda ]zp + bne :p1 + lda ]flags+1 + bit #$10 + beq :nnext + lda #'0' + inc ]zp+1 + bra :p2 +:s lda #'0' + bra :zero +:p1 xba +:p sta ]zp +:p2 sta hdfinalstr+1,x + inx +:nnext iny + cpy #declen + blt ]lup + stx hdfinalstr + cpx #0 + bne :f + lda #'0' + sta hdfinalstr+1 + inc hdfinalstr +:f + lda ]flags+1 + bit #$40 + bne :justify + brl :print +:justify lda ]fieldsize + jeq :noerr + lda hdfinalstr + sec + sbc ]zp+1 ;subtract out any leading zeros + cmp ]fieldsize + blt :just + beq :just + + ldy ]fieldsize ;if it won't fit print #'s + lda #'#' +]lup sta hdfinalstr,y + dey + bne ]lup + lda ]fieldsize + sta hdfinalstr + brl :print +:just + lda hdfinalstr + sec + sbc ]fieldsize + bcc :just1 + beq :just1 + tay ;y now holds "over" len + ldx #0 + lda hdfinalstr+1 + and #$7f + cmp #'-' + bne :nots + iny + inx +:nots lda hdfinalstr+1,y + sta hdfinalstr+1,x + iny + inx + cpy hdfinalstr + blt :nots + lda ]fieldsize + sta hdfinalstr +:just1 + lda ]flags+1 + bit #$20 + bne :left + lda ]fieldsize + sec + sbc hdfinalstr + beq :j2 + jsr DrawSpaces ;print some spaces +:j2 brl :print + +:left rep $30 + psl #hdfinalstr + _QADrawString + sep $30 + lda ]fieldsize + sec + sbc hdfinalstr + beq :sxit + jsr DrawSpaces +:sxit brl :noerr + +*====================================================== +* Print date and/or time to screen, w/option read of clock + +* Flags: 0= time, 1= date, 2= ASCII string, 3= read clock +* (if not 'ASCII' & 'readclock' use ReadASCIITime) + +QADateTime + dum $00 +]temp ds 2 +]rtl ds 6 ;these are passed on stack +]flags ds 2 +]date ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + + lda ]flags ;anything to print? + beq :gxit + and #%0011 + lda ]flags ;read GS clock? + and #%1000 + beq :no + lda ]flags + and #%0100 ;hex or ascii? + beq :hex + ~ReadASCIITime #tempbuff + sep #$30 + stz tempbuff+8 + rep #$30 + stz tempbuff+17 ;end of date/time fields + lda ]flags + and #%0010 ;show date? + beq :asciitime + ~QADrawCString #tempbuff ; yes + jsl DrawSpace +:asciitime + lda ]flags + and #%0001 ;show time? + beq :gxit + ~QADrawCString #tempbuff+9 ; yes +:gxit bra :xit +:hex + ~ReadTimeHex ;get time in hex + ldx #4 + ldy #0 +]loop pla + sta []date],y ;save data to user's buffer + iny + iny + dex + bne ]loop ; & fall into print routine! +:no + lda ]flags ;show date? + and #%0010 + beq :time + ldy #4 + lda []date],y ;print day + inc + jsr sNumDraw + + ldy #4 + lda []date],y + xba + and #$ff + asl + sta ]temp ;print month w/seperators + asl + adc ]temp + adc #ftmonths + pea #^ftmonths + pha + _QADrawString + + ldy #2 + lda []date],y ;print year + xba + jsr zNumDraw + + jsl DrawSpace +:time + lda ]flags ;show time? + and #%0001 + beq :done + ldy #2 + lda []date],y + jsr sNumDraw + lda #':' + jsl {vprintchar*4}+vectortbl-4 ;print time + lda []date] + xba + jsr zNumDraw +:done + lda #0 +:xit + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +ftmonths + str '-Jan-' + str '-Feb-' + str '-Mar-' + str '-Apr-' + str '-May-' + str '-Jun-' + str '-Jul-' + str '-Aug-' + str '-Sep-' + str '-Oct-' + str '-Nov-' + str '-Dec-' + +zNumDraw + ldx #%0101_0000_0000_0000 + bra NumDraw +sNumDraw + ldx #%0100_0000_0000_0000 +NumDraw + pea #0 + and #$FF ;only a byte! + pha + phx + pea #2 + _QADrawDec + rts + +*------------------------------------------------------ +QADrawCR + jsl DrawCR + brl noerror + +QADrawSpace + jsl DrawSpace + brl noerror + +DrawSpaces + php + rep $30 ;insure 16 bit + pea 32 + and #$FF + pha ;count + _QADrawCharX + plp + rts + +*====================================================== +* Text driver stuff, patched into text tools so that +* we can support Merlin and APW EXE commands + +TTDevice + brl inittt + brl readtt + brl writett + brl statustt + brl controltt +TTErrDevice + brl inittt + brl readtt + brl writett1 + brl statustt + brl controltt + +inittt rtl +statustt rtl +controltt rtl + +readtt + pha + _QAKeyAvail + pla + beq readtt + pha + _QAGetChar + pla + and #$ff + rtl +DrawCR + lda #13 + bra writett +DrawSpace + lda #' ' +writett + phb + phk + plb + jsl {vprintchar*4}+vectortbl-4 + plb + rtl +writett1 + phb + phk + plb + jsl {verrchar*4}+vectortbl-4 + plb + rtl + +*====================================================== +* Print a version number to the screen in Apple format + +* Format of parameter: aaaaaaaa_ccccdddd_eeeeeeee_ffffffff + +* a=major version, c=minor version, d=revision +* e = alpha, beta, etc. ASCII letter (0 = null), f=delta version + +* $01006410 = v1.00d16 + +QAPrintVersion + dum $00 +]rtl ds 6 ;these are passed on stack +]version ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + + lda ]version+2 + xba ;draw major version + and #$FF + pea #0 + pha + pea #0 + pea #2 + _QADrawDec + + lda #'.' + jsl {vprintchar*4}+vectortbl-4 + lda ]version+2 + pha + _QAPrByte ;show minor version/revision numbers + + lda ]version + beq :done ;is there a delta? + xba + and #$7F ; yes- print ASCII part + jsl {vprintchar*4}+vectortbl-4 + lda ]version + and #$FF ;print delta version + pea #0 + pha + pea #0 + pea #3 + _QADrawDec +:done + lda #0 +:xit + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +*====================================================== +* Got a time control code (^R)--set to print time/date + +pTime + rts +pVersion + rts + +*====================================================== +* Print Time/Version/Set Justification +* Code: 1=Time Code, 2=Version byte +* + +PrintTVJ + php + sep #$30 ;back to 8 bit + lsr + lsr ;position bits to get 1-7 + lsr + dec + asl ;get index + tax + jsr (:tbl,x) ; & pass control to routine + plp + rts +:tbl + da sTime + da gTime + da sVersion + da gVersion + da sJustify + da gJustify + da pJString + +*------------------------------------------------------ +* Want to print the time as part of our stuff + +sTime +gTime +sVersion +gVersion +sJustify +gJustify +pJString + rts + +*====================================================== +* Read a directory and return filenames which match the +* current wildcard value. Must have called InitWildCard + +QAReadDir + dum $00 +]temp ds 4 +]curptr ds 4 +]zp ds 4 +]ptr ds 4 +]rtl ds 6 ;these are passed on stack +]flags ds 2 +]hook ds 4 +]path ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + + lda :level + beq :allok + lda #qaalreadyactive + jmp :xit1 +:allok stz :level + lda #tpfx + sta pptr + lda #^tpfx + sta pptr+2 + lda #256 + sta tpfx + lda #2 + sta spfx + jsl $e100a8 + dw $200A + adrl spfx + bcc :e1 + jmp :xit + +:e1 lda []path] + beq :stz ;could do a getpfx here + tay + iny + sep $20 + lda []path],y + and #$7f + cmp #'/' + beq :chop + cmp #':' + bne :stz +:chop rep $30 + lda []path] + dec + sta []path] +:stz rep $30 + lda []path] + tax + ldy #$01 + sep $20 +]syntax iny + lda []path],y + and #$7f + cmp #'/' + bne :s1 + lda #':' +:s1 sta []path],y + dex + bne ]syntax + rep $30 + jsr :newdir + jcs :xit +:main rep $30 + lda :level + jeq :done + dec + asl + asl + asl + tax + lda dhandles+4,x + sta ]curptr + lda dhandles+6,x + sta ]curptr+2 + ldy #:count + lda []curptr],y + jeq :backup + lda #:dirparms + clc + adc ]curptr + sta :entp + lda #$00 + adc ]curptr+2 + sta :entp+2 + jsl $e100a8 + dw $201c +:entp adrl 0 + jcs :xit + ldy #:count + lda []curptr],y + dec + sta []curptr],y + +:go ldy #:filetype + lda []curptr],y + cmp #$0f + bne :file + lda ]flags +* bit #$01 ;nesting enabled? +* beq :next + bit #$02 + beq :nwc0 + jsr :wildcard + bcc :nwc +:nwc0 lda :level + and #$ff + ora #$8000 + bra :cl2 +:nwc lda :level + and #$ff +:cl2 ora #$0100 + jmp :c +:file lda ]flags + bit #$02 + beq :file1 + jsr :wildcard ;does the file match wildcard + bcs :file1 + lda :level + and #$ff + bra :c +:file1 lda :level + and #$ff + ora #$8000 +:c jsr :call + jcs :xit +:next + ldy #:filetype + lda []curptr],y + cmp #$0f + jne :main + + lda ]flags + bit #$0001 ;are subdirectories enabled? + bne :new +* beq :m1 +* bit #$02 ;should we check to see if this DIR should be +* beq :new ;opened? +* jsr :wildcard +* bcs :new +:m1 brl :main +:new jsr :newdir + jcs :xit + brl :main +:backup lda :level + jeq :done + dec + sta :level + asl + asl + asl + tax + lda dhandles+4,x + sta ]curptr + lda dhandles+6,x + sta ]curptr+2 + + lda #:clsparms + clc + adc ]curptr + sta :cp2 + lda #$00 + adc ]curptr+2 + sta :cp2+2 + + jsl $e100a8 + dw $2014 +:cp2 adrl 0 + lda :level + asl + asl + asl + tax + lda dhandles+2,x + pha + lda dhandles,x + pha + _Disposehandle + + lda :level + beq :done + dec + asl + asl + asl + tax + lda dhandles+4,x + sta ]curptr + lda dhandles+6,x + sta ]curptr+2 + + lda ]curptr + clc + adc #:filename + sta pptr + lda ]curptr+2 + adc #^:filename + sta pptr+2 + + jsl prodos + dw $2009 + adrl spfx + bcc :bdone + jmp :xit + +:bdone lda ]flags + bit #$02 ;wildcards? + beq :nwc2 + jsr :wildcard + bcc :nwc1 +:nwc2 lda :level + and #$ff + ora #$8000 + bra :cl1 +:nwc1 lda :level + and #$FF +:cl1 ora #$0200 ;closing a dir + jsr :call + bcs :xit +:chk lda :level + beq :done + jmp :main +:done rep $30 + lda #$00 +:xit rep $30 + pha +:clup lda :level + beq :nocls + dec + asl + asl + asl + tax + lda dhandles+4,x + sta ]curptr + lda dhandles+6,x + sta ]curptr+2 + lda #:clsparms + clc + adc ]curptr + sta :cp + lda #$00 + adc ]curptr+2 + sta :cp+2 + jsl $e100a8 + dw $2014 +:cp adrl 0 + lda :level + dec + sta :level + asl + asl + asl + tax + lda dhandles+2,x + pha + lda dhandles,x + pha + _Disposehandle + brl :clup +:nocls pla +:xit1 rep $30 + pha + + lda #tpfx+2 + sta pptr + lda #^tpfx+2 + sta pptr+2 + + jsl prodos + dw $2009 + adrl spfx + + lda #$ffff + sta wcauxmask + sta wcauxmask+2 + sta wcftypemask + lda #$00 + sta wcaux + sta wcaux+2 + sta wcftype + sta wcstring + + pla + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + jmp errxit + +:newdir php + rep $30 + stz :ndhdl + stz :ndhdl+2 + psl #$00 + lda :level + jeq :first + psl #$00 + dec + asl + asl + asl + tax + lda dhandles+4,x + sta ]curptr + lda dhandles+6,x + sta ]curptr+2 + lda dhandles+2,x + pha + lda dhandles,x + pha + _GetHandleSize + ldy #:namelen + lda []curptr],y + clc + adc 1,s + sta 1,s + bcc :nd0 + lda 3,s + adc #$00 + sta 3,s +:nd0 lda 1,s + inc + sta 1,s + bne :nd00 + lda 3,s + inc + sta 3,s +:nd00 ldal userid + ora #$A00 + pha + pea $C000 + psl #$00 + _NewHandle + plx + ply + jcs :nderr + jmp :deref +:first ldx #$00 + lda #recsize + clc + adc []path] + bcc :nd2 + inx +:nd2 phx + pha + ldal userid + ora #$A00 + pha + pea $C000 + psl #$00 + _NewHandle + plx + ply + jcs :nderr +:deref sty :ndhdl+2 + sty ]zp+2 + stx :ndhdl + stx ]zp + ldy #$02 + lda []zp] + tax + lda []zp],y + sta ]zp+2 + stx ]zp + psl #$00 + psl :ndhdl + _GetHandleSize + pll :size + lda #$00 + tay + sep $20 +]lup sta []zp],y + iny + cpy :size + blt ]lup + rep $30 + + lda :level + beq :first1 + dec + asl + asl + asl + tax + lda dhandles+4,x + sta ]temp + lda dhandles+6,x + sta ]temp+2 + ldy #:filename + lda []temp],y + inc + inc + sta :ct +]lup sep $20 + lda []temp],y + sta []zp],y + iny + rep $30 + dec :ct + bne ]lup + lda #':' + sep $20 + sta []zp],y + iny + tyx + rep $20 + ldy #:namelen + lda []temp],y + beq :d2 + sta :ct + ldy #:buffer +]l sep $20 + lda []temp],y + phy + txy + sta []zp],y + ply + iny + inx + rep $20 + dec :ct + bne ]l + +:d2 rep $30 + txa + sec + sbc #:filename+2 + ldy #:filename + sta []zp],y + + jmp :f1 +:first1 rep $30 + ldy #$02 + lda []path],y + and #$7f + cmp #':' + beq :full + cmp #'/' + beq :full + + +:full lda []path] + inc + inc + sta :ct + ldx #:filename + ldy #$00 +]lup sep $20 + lda []path],y + phy + txy + sta []zp],y + ply + inx + iny + rep $30 + dec :ct + bne ]lup +:f1 rep $30 + + lda ]zp + clc + adc #:filename + sta pptr + lda ]zp+2 + adc #$00 + sta pptr+2 + + jsl prodos + dw $2009 + adrl spfx + bcc :l1 + + jmp :nderr +:l1 ldy #:oparms + lda #$04 + sta []zp],y + ldy #:request + lda #$01 + sta []zp],y + ldy #:dirparms + lda #17 + sta []zp],y + ldy #:fstid + lda #$01 + sta []zp],y + ldy #:clsparms + lda #$01 + sta []zp],y + ldy #:dirbuf + lda #65 + sta []zp],y + lda ]zp + clc + adc #:dirbuf + pha + lda ]zp+2 + adc #$00 + ldy #:bufptr+2 + sta []zp],y + dey + dey + pla + sta []zp],y + + lda ]zp + clc + adc #:filename + pha + lda ]zp+2 + adc #$00 + ldy #:ptr1+2 + sta []zp],y + dey + dey + pla + sta []zp],y + lda ]zp + sta ]curptr + lda ]zp+2 + sta ]curptr+2 + + lda #:oparms + clc + adc ]curptr + sta :p1 + lda #$00 + adc ]curptr+2 + sta :p1+2 + + lda #:dirparms + clc + adc ]curptr + sta :p2 + lda #$00 + adc ]curptr+2 + sta :p2+2 + + jsl $e100a8 + dw $2010 +:p1 adrl 0 + jcs :nderr + + ldy #:oref + lda []curptr],y + ldy #:dirref + sta []curptr],y + ldy #:clsref + sta []curptr],y + + jsl $e100a8 + dw $201c +:p2 adrl 0 + jcs :nderr + ldy #:entnum + lda []curptr],y + ldy #:count + sta []curptr],y + ldy #:base + lda #$01 + sta []curptr],y + ldy #:displace + sta []curptr],y + + lda :level + asl + asl + asl + tax + lda :ndhdl + sta dhandles,x + lda :ndhdl+2 + sta dhandles+2,x + lda ]curptr + sta dhandles+4,x + lda ]curptr+2 + sta dhandles+6,x + inc :level + plp + clc + rts +:nderr rep $30 + pha + lda :ndhdl + ora :ndhdl+2 + beq :nde1 + psl :ndhdl + _disposehandle + stz :ndhdl + stz :ndhdl+2 +:nde1 pla + plp + sec + rts +:ndhdl ds 4 + +:call php + rep $30 + sta :temp + lda ]hook + ora ]hook+2 + jeq :cclc + lda ]hook + sta :jsl1+1 + lda ]hook+2 + sep $20 + sta :jsl1+3 + rep $20 + phd + phb + lda #:dirparms + clc + adc ]curptr + tay + lda #$00 + adc ]curptr+2 + tax + tya + ldy :temp +:jsl1 jsl $FFFFFF + php + clc + xce + rep $30 + plp + plb + pld + bcc :cclc + plp + sec + rts +:cclc plp + clc + rts +:temp ds 2 + +:wildcard ;carry = C no wildcard match +; = S wildcard matches + php + rep $30 + lda #$ffff + sta :wc ;default to valid + lda wcstring + and #$ff + jeq :ftype + sta :wclen + ldy #:namelen + lda []curptr],y + jeq :noname + sta :nlen + iny + iny ;point y to first char of name + ldx #$01 ;point x to first char of WC + sep $20 +]look lda wcstring,x + and #$7f + cmp #'a' + blt :1 + cmp #'z'+1 + bge :1 + and #$5f +:1 cmp #'=' + beq :chars + cmp #'?' + beq :nextxy ;any char is valid + sta :cmp + lda []curptr],y + and #$7f + cmp #'a' + blt :2 + cmp #'z'+1 + bge :2 + and #$5f +:2 cmp :cmp + beq :nextxy + jmp :noname +:chars inx + dec :wclen + beq :ftype ;is wildcard done? + lda wcstring,x + and #$7f + cmp #'a' + blt :3 + cmp #'z'+1 + bge :3 + and #$5f +:3 sta :cmp + bra :n +]equ iny + dec :nlen + beq :noname +:n lda []curptr],y + and #$7f + cmp #'a' + blt :4 + cmp #'z'+1 + bge :4 + and #$5f +:4 cmp :cmp + bne ]equ ;keep looping until char found +:nextxy inx + dec :wclen +:nexty iny + dec :nlen + jmp :chklen +:nextx inx + dec :wclen +:chklen lda :nlen + ora :wclen + beq :ftype + jmp ]look + ;check here for string match +:noname rep $30 + stz :wc +:ftype rep $30 + lda wcftypemask + beq :tryaux + ldy #:filetype + lda []curptr],y + and wcftypemask + cmp wcftype + beq :tryaux + stz :wc +:tryaux lda wcauxmask + ora wcauxmask+2 + beq :wcchk + ldy #:aux + lda []curptr],y + and wcauxmask + cmp wcaux + bne :zero + iny + iny + lda []curptr],y + and wcauxmask+2 + cmp wcaux+2 + beq :wcchk +:zero stz :wc +:wcchk lda :wc + bne :wcsec +:wcclc plp ;wildcard doesn't match + clc + rts +:wcsec plp ;wild card matches + sec + rts + +:wc ds 2 +:wclen ds 2 +:nlen ds 2 +:cmp ds 2 +*=============================== +:ct ds 2 +:size ds 4 +:level ds 2 + + dum 0 + +:count ds 2 + +:oparms dw 4 ;parms for open +:oref dw 0 +:ptr1 adrl :filename +:request dw $0001 ;read only + dw 0 ;data fork + +:dirparms ;parms for getdirentry + dw 17 +:dirref dw 0 ;ref # +:flags dw 0 ;reserved +:base dw 0 +:displace dw 0 +:bufptr adrl :dirbuf +:entnum dw 0 ;entry number in DIR +:filetype dw 0 ;filetype +:eof adrl 0 ;eof +:blocks adrl 0 ;block count +:cdate ds 8 ;create date +:mdate ds 8 ;mod date +:access da 0 ;access +:aux adrl 0 ;auxtype +:fstid dw 1 ;file system id +:oplist adrl 0 +:reof adrl 0 +:rblks adrl 0 + +:clsparms dw 1 +:clsref ds 2 + +:dirbuf dw 65 ;buff size for getdirentry +:namelen dw 0 ;filename length for " +:buffer ds 65 ;filename put here + +:filename ds 2 + +recsize = * + dend + +*====================================================== +QAInitWildCard + + dum $00 +]rtl ds 6 ;these are passed on stack +]auxmask ds 4 +]ftmask ds 2 +]aux ds 4 +]ft ds 2 +]wcstr ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda ]ft + sta wcftype + lda ]aux + sta wcaux + lda ]aux+2 + sta wcaux+2 + lda ]ftmask + sta wcftypemask + lda ]auxmask + sta wcauxmask + lda ]auxmask+2 + sta wcauxmask+2 + sep $30 + lda []wcstr] + cmp #15 + blt :ok + lda #15 +:ok sta wcstring + tay + beq :done +]l lda []wcstr],y + and #$7f + cmp #'a' + blt :sta + cmp #'z'+1 + bge :sta + and #$5f +:sta sta wcstring,y + dey + bne ]l +:done rep $30 + lda #$00 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + jmp errxit + +*====================================================== +* Trap some GS/OS vectors so we can safely work! + +SetVects php + sei + rep $30 + ldal $E100A8 + sta GSOSVect1 + ldal $E100A8+2 + sta GSOSVect1+2 + ldal $E100B0 + sta GSOSVect2 + ldal $E100B0+2 + sta GSOSVect2+2 + lda #P16Quit + stal $E100A8+1 + lda #^P16Quit + sep $20 + stal $E100A8+3 + rep $30 + lda #p16quit1 + stal $E100B0+1 + lda #^P16Quit + sep $20 + stal $E100B0+3 + rep $30 + plp + rts + +RestoreVects + php + sei + rep $30 + lda GSOSVect1 + stal $E100A8 + lda GSOSVect1+2 + stal $E100A8+2 + lda GSOSVect2 + stal $E100B0 + lda GSOSVect2+2 + stal $E100B0+2 + plp + rts + +P16QHandle clc + xce + phk + plb + rep $30 + lda stack + tcs + ldx #$00 + lda #$00 + clc + jmp (return,x) + +P16Quit phb ;save the environment + phk + plb + sty p16y ;save the Y reg + php + sep $20 + lda $05,s ;get bank of call + pha + plb ;set to current bank + ldy #$01 + lda ($03,s),y ;read the command num of p16 call + cmp #$29 ;is it QUIT? + beq p16qhandle ;yes, so shutdown/restore everything + plp ;if not restore what we changed + phk + plb + ldy p16y ;restore the Y + plb ;and the bank +GSOSVect1 + jml $FFFFFF ;jump to P16 entry vector + +p16quit1 phb ;save the current bank + phk + plb ;set to our bank + php ;save the processor + sep $20 + lda $06,s ;get command num from stack + cmp #$29 ;quit? + beq p16qhandle ;yes so restore/shutdown external + plp ;restore what we changed and call + plb ;old P16 vector +GSOSVect2 + jml $FFFFFF + +*====================================================== +* Draw a box on the screen, saving what is underneath it + +QADrawBox + dum $00 +]cx ds 2 +]cy ds 2 +]top ds 2 +]left ds 2 +]bottom ds 2 +]right ds 2 +]size ds 4 +]ptr ds 4 +]tempy ds 2 +]rtl ds 6 ;these are passed on stack +]height ds 2 +]width ds 2 +]y ds 2 +]x ds 2 +]newstack = *-6 ;must be at end of passed params +]bufhdl ds 4 + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + stz ]bufhdl + stz ]bufhdl+2 + lda cursx + sta ]cx + lda cursy + sta ]cy + lda ]x + clc + adc ]width + cmp #80 + blt :1 + sec + sbc #80 + sec + sbc ]width + eor #$FFFF + inc + sta ]width +:1 lda ]y + clc + adc ]height + cmp #24 + blt :2 + sec + sbc #24 + sec + sbc ]height + eor #$FFFF + inc + sta ]height +:2 psl #$00 + pei ]width + pei ]height + tll $090B ;_Multiply + lda 1,s + clc + adc #8 + sta 1,s + lda 3,s + adc #0 + sta 3,s + pll ]size + + psl #$00 + psl ]size + ldal userid + ora #$A00 + pha + pea $8000 + psl #$00 + _NewHandle + plx + ply + jcs :xit + stx ]bufhdl + sty ]bufhdl+2 + ldy #$02 + lda []bufhdl] + sta ]ptr + lda []bufhdl],y + sta ]ptr+2 + lda ]x + sta []ptr] + ldy #$02 + lda ]y + sta []ptr],y + ldy #$04 + lda ]width + sta []ptr],y + ldy #$06 + lda ]height + sta []ptr],y + + lda ]x + sta cursx + lda ]y + sta cursy + + lda ]x + sta ]left + clc + adc ]width + dec + sta ]right + lda ]y + sta ]top + clc + adc ]height + dec + sta ]bottom + ldy #$08 + sty ]tempy +]l1 rep $30 + lda cursx + pha + lda cursy + pha + _QAGotoXY + sep $30 + lda ]height + beq :noerr + ldx ]width + ldy ]left +]l2 cpx #$00 + beq :next + phy + jsr pickchar + rep $10 + ldy ]tempy + sta []ptr],y + rep $20 + inc ]tempy + sep $30 + ply + lda cursy + cmp ]top + beq :t + cmp ]bottom + beq :b + cpy ]left + beq :l + cpy ]right + beq :r + bra :spc +:t cpy ]left + beq :spc + cpy ]right + beq :spc + lda #$5f.$80 + bra :sta +:b cpy ]left + beq :spc + cpy ]right + beq :spc + lda #$4c + bra :sta +:r lda #$5f + bra :sta +:l lda #$5a + bra :sta +:spc lda #$a0 +:sta phy + jsr storchar + ply + iny + dex + bne ]l2 +:next inc cursy + dec ]height + bne ]l1 + +:noerr rep $30 + lda #$00 +:xit rep $30 + pha + lda ]cx + sta cursx + lda ]cy + sta cursy + lda cursx + pha + lda cursy + pha + _QAGotoXY + lda ]bufhdl+2 + ora ]bufhdl + beq :pla + psl ]bufhdl + _HUnlock +:pla pla + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + jmp errxit + +*====================================================== +* Restore a box on the screen, with what was originally there + +QAEraseBox + dum $00 +]cx ds 2 +]cy ds 2 +]top ds 2 +]left ds 2 +]bottom ds 2 +]right ds 2 +]ptr ds 4 +]tempy ds 2 +]x ds 2 +]y ds 2 +]width ds 2 +]height ds 2 +]rtl ds 6 ;these are passed on stack +]bufhdl ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda cursx + sta ]cx + lda cursy + sta ]cy + psl ]bufhdl + _Hlock + jcs :xit + ldy #$02 + lda []bufhdl] + sta ]ptr + lda []bufhdl],y + sta ]ptr+2 + + lda []ptr] + sta ]x + ldy #$02 + lda []ptr],y + sta ]y + ldy #$04 + lda []ptr],y + sta ]width + ldy #$06 + lda []ptr],y + sta ]height + + lda ]x + sta cursx + lda ]y + sta cursy + + lda ]x + sta ]left + clc + adc ]width + dec + sta ]right + lda ]y + sta ]top + clc + adc ]height + dec + sta ]bottom + ldy #$08 + sty ]tempy +]l1 rep $30 + lda cursx + pha + lda cursy + pha + _QAGotoXY + sep $30 + lda ]height + beq :noerr + ldx ]width + ldy ]left +]l2 cpx #$00 + beq :next + phy + rep $10 + ldy ]tempy + lda []ptr],y + sep $30 + ply + jsr storchar + rep $20 + inc ]tempy + sep $30 + iny + dex + bne ]l2 +:next inc cursy + dec ]height + bne ]l1 + +:noerr rep $30 + lda #$00 +:xit rep $30 + pha + lda ]cx + sta cursx + lda ]cy + sta cursy + lda cursx + pha + lda cursy + pha + _QAGotoXY + lda ]bufhdl+2 + ora ]bufhdl + beq :pla + psl ]bufhdl + _HUnlock +:pla pla + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + jmp errxit + +*====================================================== +* Convert a string from/to GS/OS class 1 to PString format + +QAConvertStr + + dum $00 +]maxlen ds 2 +]rtl ds 6 ;these are passed on stack +]cmdcode ds 2 +]buffptr ds 4 +]textptr ds 4 +]newstack = *-6 ;must be at end of passed params +]rtncode ds 2 + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + +:noerr rep $30 + lda #$0000 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + jmp errxit + +*====================================================== +* Return the address of the current keypress handler + +QAGetKeyAdrs + mx %00 + lda #keyaddress + sta 7,s + lda #^keyaddress + sta 9,s + brl noerror + +InstallKey + php + phb + phk + plb + sei + rep $30 + stz keyintsactive + + psl #$00 + pea $000f ;keyboard vector + tll $1103 ;getvector + pla + sta eventkey+1 + pla + sep $20 + sta eventkey+3 + rep $30 + pea $000f + psl #keyhandler + tll $1003 ;set vector + + pea $00 + tll $0606 + pla + bcs :noem + beq :noem + lda #$FFFF + sta emactive + bra :xit +:noem + sep $20 + ldal $e0c027 + pha + and #%00000100 + sta keyintsactive + pla + ora #%00000100 + stal $e0c027 + rep $30 +:xit + plb + plp + rts + +*====================================================== +* Remove our key handler from the event vector + +RemoveKey + php + phb + phk + plb + rep $30 + sei + pea $000f + lda eventkey+3 + and #$ff + pha + lda eventkey + pha + tll $1003 ;set vector + + lda emactive + stz emactive +* cmp #$00 + bne :xit + lda keyintsactive + bne :xit + sep $20 + ldal $e0c027 + and #%00000100!$ffff + stal $e0c027 + rep $20 + stz keyintsactive +:xit plb + plp + rts + +*====================================================== +* This routine is called by the event manager to handle +* any keyboard events it recieves. 8 BIT EMULATION MODE! + + mx %11 +KeyHandler + php + phb + phk + plb + pha + ldal $e0c000 + stal keyaddress + ldal $e0c025 + stal keyaddress+1 + ldal emactive + bmi :ekey + ldal $e0c010 +:clc pla + plb + plp + clc + rtl +:ekey + pla + plb + plp +eventkey + jml $FFFFF + +*====================================================== +* Find the next word in a string of text. < SPC = EOL (TAB = SPC) +* ENTRY: Pointer to text, current index , max length (64K) +* EXIT: Start of word, End of word+1 (BCS = err, A = BMI if at EOF) + +QAGetWord + dum $00 +]rtl ds 6 ;these are passed on stack +]maxlen ds 2 ;max length of text +]index ds 2 ;starting index in text +]TxtPtr ds 4 ;pointer to text +]newstack = *-6 ;must be at end of passed parms +]EndWord ds 2 ;end of word +]BegWord ds 2 ;start of word (index into text) + dend + + mx %00 + tsc + phd + inc + tcd + phb + phk + plb + + stz ]BegWord ;assume error + stz ]EndWord + + ldy ]index ;get index into text + dey +]loop + iny + cpy ]maxlen ;past eof? + bge :eof + lda []TxtPtr],y ;get a char + and #$7F + cmp #8 ;tabs = spaces + beq ]loop + cmp #' ' ;must be a space or greater + blt :xit + beq ]loop ;flush spaces + sty ]BegWord +]loop + iny + cpy ]maxlen ;past eof? + bge :eof + lda []TxtPtr],y ;get a char + and #$7F + cmp #' '+1 ;skip to next space or EOL + bge ]loop + sty ]EndWord + lda #0 + bra :xit ;skip error +:eof + lda #qaeof ;reached EOF! +:xit + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +*====================================================== +* Find the end of the current line of text (EOL) +* ENTRY: Pointer to text, current index , max length (64K) +* EXIT: Index to start of next line (BCS = reached EOF) + +QANextLine + dum $00 +]rtl ds 6 ;these are passed on stack +]maxlen ds 2 ;max length of text +]index ds 2 ;starting index in text +]TxtPtr ds 4 ;pointer to text +]newstack = *-6 ;must be at end of passed parms +]newline ds 2 ;start of word (index into text) + dend + + mx %00 + tsc + phd + inc + tcd + phb + phk + plb + dec ]maxlen + + ldy ]index ;get index into text + dey +]loop + iny + cpy ]maxlen ;past eof? + bge :eof + lda []TxtPtr],y ;get a char + and #$7F + cmp #8 ;tabs = spaces + beq ]loop + cmp #' ' ;must be a space or greater + bge ]loop + iny + sty ]newline ;save index to start of next line + lda #0 + bra :xit +:eof + lda #qaeof ;reached EOF! +:xit + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + diff --git a/src/tools/qatools.macs.s b/src/tools/qatools.macs.s new file mode 100644 index 0000000..2ffeb2c --- /dev/null +++ b/src/tools/qatools.macs.s @@ -0,0 +1,598 @@ +_QABootInit mac ;_QABootInit() + utool $01 + <<< +~QAStartup MAC + psw ]1 + psl ]2 +_QAStartup mac ;_QAStartup(userid,modeflags/4) + utool $02 + <<< +_QAShutdown mac ;_QAShutdown() + utool $03 + <<< +~QAVersion MAC + pha +_QAVersion mac ;_QAVersion():versionnum + utool $04 + <<< +_QAReset mac ;_QAReset() + utool $05 + <<< +~QAStatus MAC + pha +_QAStatus mac ;_QAStatus():statflag + utool $06 + <<< +~QADrawChar MAC + phw ]1 +_QADrawChar mac ;_QADrawChar(char) + utool $09 + <<< +~QADrawString MAC +~QADrawStr MAC + psl ]1 +_QADrawString mac ;_QADrawString(@strptr) +_QADrawStr mac + utool $0A + <<< +~QAPrByte MAC + psw ]1 +_QAPrByte mac ;_QAPrByte(byteval) + utool $0B + <<< +~QAPrByteL MAC + psw ]1 +_QAPrByteL mac ;_QAPrByteL(hexval) + utool $0C + <<< +~QADrawDec MAC + psl ]1 + psw ]2 + ps2 ]3 +_QADrawDec mac ;_QADrawDec(longint/4,flags,fieldsize) + utool $0D + <<< +~QAKeyAvail MAC + pha +_QAKeyAvail mac ;_QAKeyAvail():availflag + utool $0E + <<< +~QAGetChar MAC + pha +_QAGetChar mac ;_QAGetChar():char (char in low/modifiers in high) + utool $0F + <<< +_QAGetLine mac ;_QAGetLine(@linestr) + utool $10 + <<< +~QASetParmHdl MAC + psl ]1 +_QASetParmHdl mac ;_QASetParmHdl(parmhandle) + utool $11 + <<< +~QAGetParmHdl MAC + pha + pha +_QAGetParmHdl mac ;_QAGetParmHdl():parmhandle + utool $12 + <<< +~QASetCmdHdl MAC + psl ]1 + psw ]2 +_QASetCmdHdl mac ;_QASetCmdHdl(commandhandle,numcmds) + utool $13 + <<< +~QAGetCmdHdl MAC + pha + pha + pha +_QAGetCmdHdl mac ;_QAGetCmdHdl():commandhandle,numcmds + utool $14 + <<< +~QAReadTotalErrs MAC + pha +_QAReadTotalErrs mac ;_QAReadTotalErrs():totalerrs + utool $15 + <<< +~QAGetModeFlags MAC + pha + pha +_QAGetModeFlags mac ;_QAGetModeFlags():modeflags/4 + utool $16 + <<< +~QASetModeFlags MAC + psl ]1 +_QASetModeFlags mac ;_QASetModeFlags(modeflags/4) + utool $17 + <<< +_QALoadFile mac ;_QALoadfile(@filename,filepos/4,length/4,@typelist,userid,address/4,memattrib):filehandle/4 + utool $18 + <<< +_QASaveFile mac ;_QASavefile(filehandle/4,@filename,filetype,auxtype/4) + utool $19 + <<< +~QASetCmdLine MAC + psl ]1 +_QASetCmdLine mac ;_QASetCmdLine(@strptr) + utool $1A + <<< +~QAGetCmdLine MAC + psl ]1 + psw ]2 +_QAGetCmdLine mac ;_QAGetCmdLine(@strptr,maxlen) + utool $1B + <<< +~QAParseCmdLine MAC + pha + pha + psl ]1 +_QAParseCmdLine mac ;_QAParseCmdLine(@strptr):cmdid,cmdtype + utool $1C + <<< +~QAGetQuitFlag MAC + pha +_QAGetQuitFlag mac ;_QAGetQuitFlag():quitflag + utool $1D + <<< +~QASetQuitFlag MAC + psw ]1 +_QASetQuitFlag mac ;_QASetQuitFlag(quitflag) + utool $1E + <<< +~QASetCmdTbl MAC + psl ]1 +_QASetCmdTbl mac ;_QASetCmdTbl(@cmdtbl) + utool $1F + <<< +~QAGetCmdTbl MAC + pha + pha +_QAGetCmdTbl mac ;_QAGetCmdTbl():@cmdtbl + utool $20 + <<< +~QAExecCommand MAC + psw ]1 + psw ]2 +_QAExecCommand mac ;_QAExecCommand(cmdtype,cmdid) + utool $21 + <<< +~QAGetMessagebyID MAC + pha + pha + pha + psw ]1 +_QAGetMessagebyID mac ;_QAGetMessagebyID(userid):message,subtype/4 + utool $22 + <<< +_QARun mac ;_QARun() + utool $23 + <<< +_QADispose mac ;_QADispose() + utool $24 + <<< +~QAShutdownID MAC + psw ]1 +_QAShutdownID mac ;_QAShutDownID(userid) + utool $25 + <<< +~QACompile MAC + psw ]1 + psl ]2 +_QACompile mac ;_QACompile(message,subtype/4) + utool $26 + <<< +~QALink MAC + psw ]1 + psl ]2 +_QALink mac ;_QALink(message,subtype/4) + utool $27 + <<< +~QACompilerActive MAC + pha +_QACompilerActive mac ;_QAComplierActive():activeflag + utool $28 + <<< +~QALinkerActive MAC + pha +_QALinkerActive mac ;_QALinkerActvie():activeflag + utool $29 + <<< +~QAGetCompileID MAC + pha +_QAGetCompileID mac ;_QAGetCompileID():compileID + utool $2A + <<< +~QASetCompileID MAC + psw ]1 +_QASetCompileID mac ;_QASetCompileID(compileID) + utool $2B + <<< +~QAGetLinkID MAC + pha +_QAGetLinkID mac ;_QAGetLinkID():linkID + utool $2C + <<< +~QASetLinkID MAC + psw ]1 +_QASetLinkID mac ;_QASetLinkID(linkID) + utool $2D + <<< +~QAGetVector MAC + pha + pha + psw ]1 +_QAGetVector mac ;_QAGetVector(vect#):@address + utool $2E + <<< +~QASetVector MAC + psw ]1 + psl ]2 +_QASetVector mac ;_QASetVector(vect#,@address) + utool $2F + <<< +_QAResetVectors mac ;_QAResetVectors() + utool $30 + <<< +~QAEvent MAC + psl ]1 + psw ]2 +_QAEvent mac ;_QAEvent(@eventptr,taskflag) + utool $31 + <<< +~QAGetCmdRecSize MAC + pha +_QAGetCmdRecSize mac ;_QAGetCmdRecSize():recordsize + utool $32 + <<< +~QATabtoCol MAC + psw ]1 +_QATabtoCol mac ;_QATabtoCol(columnnum) + utool $33 + <<< +~QAErrorMsg MAC + psw ]1 +_QAErrorMsg mac ;_QAErrorMsg(ErrorCode) + utool $34 + <<< +~QABarGraph MAC + psw ]1 + psl ]2 +_QABarGraph mac ;_QABarGraph(percent,@Message) + utool $35 + <<< +~QAConvertPath MAC + psl ]1 + psl ]2 +_QAConvertPath mac ;_QAConvertPath(@oldpath,@newpath) + utool $36 + <<< +~QATyp2Txt MAC + psw ]1 + psl ]2 +_QATyp2Txt mac +_QAConvertTyp2Txt mac ;_QAConvertTyp2Txt(filetype,@typestr) + utool $37 + <<< +~QATxt2Typ MAC + pha + psl ]1 +_QATxt2Typ mac +_QAConvertTxt2Typ mac ;_QAConvertTxt2Typ(@typestr):type + utool $38 + <<< +~QAReadDir MAC + psl ]1 + psl ]2 + psw ]3 +_QAReadDir mac ;_QAReadDir(@pathname,@doroutine,flags) + utool $39 + <<< +~QAInitWildcard MAC + psl ]1 + psw ]2 + psl ]3 + psw ]4 + psl ]5 +_QAInitWildcard mac ;_QAInitWildcard(@wcstr,ft,aux/4,ftmask,auxmask/4) + utool $3A + <<< +_QAUndefined mac ;_QAUndefined() + utool $3B + <<< +_QAInitTotalErrs mac ;_QAInitTotalErrs() + utool $3C + <<< +_QAIncTotalErrs mac ;_QAIncTotalErrs() + utool $3D + <<< +~QAGetTotalErrs MAC + pha +_QAGetTotalErrs mac ;_QAGetTotalErrs():totalerrs + utool $3E + <<< +~QAGetCancelFlag MAC + pha +_QAGetCancelFlag mac ;_QAGetCancelFlag():cancelflag + utool $3F + <<< +~QASetCancelFlag MAC + psw ]1 +_QASetCancelFlag mac ;_QASetCancelFlag(cancelflag) + utool $40 + <<< +_QAStartTiming mac ;_QAStartTiming() + utool $41 + <<< +~QAEndTiming MAC + pha + pha + pha +_QAEndTiming mac ;_QAEndTiming():hours,minutes,seconds + utool $42 + <<< +~QAGetSymTable MAC + pha + pha + pha + pha + pha +_QAGetSymTable mac ;_QAGetSymTable():@table,symhandle/4,numlabels + utool $43 + <<< +~QASetSymTable MAC + psl ]1 + psl ]2 + psw ]3 +_QASetSymTable mac ;_QASetSymTable(@table,symhandle/4,numlabels) + utool $44 + <<< +~QASetPath MAC + psl ]1 +_QASetPath mac ;_QASetPath(@pathname) + utool $45 + <<< +~QAGetPath MAC + psl ]1 +_QAGetPath mac ;_QAGetPath(@pathname) + utool $46 + <<< +~QAGetObjType MAC + pha +_QAGetObjType mac ;_QAGetObjType():type + utool $47 + <<< +~QASetObjType MAC + psw ]1 +_QASetObjType mac ;_QASetObjType(type) + utool $48 + <<< +~QAGetObjPath MAC + psl ]1 +_QAGetObjPath mac ;_QAGetObjPath(@pathname) + utool $49 + <<< +~QASetObjPath MAC + psl ]1 +_QASetObjPath mac ;_QASetObjPath(@pathname) + utool $4A + <<< +~QACallUSR MAC + pha + psw ]1 + psl ]2 +_QACallUSR mac ;_QACallUSR(opcode,@operand):handled + utool $4B + <<< +~QACallUser MAC + psw ]1 + psw ]2 + psl ]3 + psl ]4 +_QACallUser mac ;_QACallUser(rngstart,rngend,texthandle/4,textlen/4) + utool $4C + <<< +~QAGoEval MAC + pha + pha + psl ]1 + psw ]2 +_QAGoEVAL mac ;_QAGoEVAL(@operand,offset):value/4 + utool $4D + <<< +~QAGoPutByte MAC + psw ]1 +_QAGoPutByte mac ;_QAGoPutByte(byte) + utool $4E + <<< +~QAGoPutOpcode MAC + psw ]1 +_QAGoPutOpcode mac ;_QAGoPutOpcode(opcodebyte) + utool $4F + <<< +_QAGoRelcorrect mac ;_QAGoRelcorrect() + utool $50 + <<< +~QADrawErrChar MAC + psw ]1 +_QADrawErrChar mac ;_QADrawErrChar(char) + utool $51 + <<< +~QADrawErrStr MAC + psl ]1 +_QADrawErrStr mac +_QADrawErrString mac ;_QADrawErrString(@strptr) + utool $52 + <<< +~QAGetWindow MAC + pha + pha +_QAGetWindow mac ;_QAGetWindow():windowtype + utool $53 + <<< +~QASetWindow MAC + psl ]1 +_QASetWindow mac ;_QASetWindow(windowtype) + utool $54 + <<< +~QAGetShellID MAC + pha +_QAGetShellID mac ;_QAGetShellID():userid + utool $55 + <<< +~QASetShellID MAC + psw ]1 +_QASetShellID mac ;_QASetShellID(userid) + utool $56 + <<< +~QAGotoXY MAC + psw ]1 + psw ]2 +_QAGotoXY mac ;_QAGotoXY(X,Y) + utool $57 + <<< +~QAGetXY MAC + pha + pha +_QAGetXY mac ;_QAGetXY():X,Y + utool $58 + <<< +~QAPrNibble MAC + psw ]1 +_QAPrNibble mac ;_QAPrNibble(nibval) + utool $59 + <<< +~QADrawHex MAC + psl ]1 + psw ]2 + psw ]3 +_QADrawHex mac ;_QADrawHex(hexval/4,flags,fieldsize) + utool $5A + <<< +~QADrawCStr mac +~QADrawCString mac + psl ]1 +_QADrawCStr mac +_QADrawCString mac +_QADrawBlock mac ;_QADrawBlock(@CBlock) + utool $5B + <<< +~QADrawErrCStr MAC + psl ]1 +_QADrawErrCStr mac +_QADrawErrBlock mac ;_QADrawErrBlock(@CBlock) + utool $5C + <<< +~QADrawCharX MAC + psw ]1 + psw ]2 +_QADrawCharX mac ;_QADrawCharX(char,count) + utool $5D + <<< +~QADrawECharX MAC + psw ]1 + psw ]2 +_QADrawECharX mac ;_QADrawECharX(char,count) + utool $5E + <<< +~QAGetLaunch MAC + pha + pha + pha +_QAGetLaunch mac ;_QAGetLaunch():@path,flags + utool $5F + <<< +~QASetLaunch MAC + psl ]1 + psw ]2 +_QASetLaunch mac ;_QASetLaunch(@path,flags) + utool $60 + <<< +~QAGetWord MAC + pha + pha + psl ]1 + psw ]2 + psw ]3 +_QAGetWord mac ;_QAGetWord(@Text,Offset,MaxLen):BegOffset,EndOffset + utool $61 + <<< +~QADateTime mac + psl ]1 + psw ]2 +_QADateTime mac ;_QADateTime(@Date,flags) + utool $62 + <<< +_QADrawCR mac ;_QADrawCR() + utool $63 + <<< +_QADrawSpace mac ;_QADrawSpace() + utool $64 + <<< +~QADrawVersion mac + psl ]1 +_QADrawVersion mac ;_QADrawVersion(Version/4) + utool $65 + <<< +~QADrawBox MAC + pha + pha + psw ]1 + psw ]2 + psw ]3 + psw ]4 +_QADrawBox MAC ;_QADrawBox(x,y,width,height):buffhdl + utool $66 + <<< +~QAEraseBox MAC + psl ]1 +_QAEraseBox MAC ;_QAEraseBox(buffhdl) + utool $67 + <<< +~QAConvertStr MAC + pha + psl ]1 + psl ]2 + psw ]3 +_QAConvertStr MAC ;_QAConvertStr(@string/class.1,@buffer/class.1,cmdcode):rtncode + utool $68 + <<< +~QADrawStrL MAC + psl ]1 +_QADrawStrL MAC ;_QADrawStrL(@string/class.1) + utool $69 + <<< +~QADrawErrStrL MAC + psl ]1 +_QADrawErrStrL MAC ;_QADrawErrStrL(@strptr/class.1) + utool $6A + <<< +~QAGetKeyAdrs MAC + pha + pha +_QAGetKeyAdrs MAC ;_QAGetKeyAdrs():keyaddress/4 + utool $6B + <<< +~QANextLine MAC + pha + pha + psl ]1 + psw ]2 + psw ]3 +_QANextLine mac ;_QANextLine(@Text,Offset,MaxLen):NewLineOffset + utool $6C + <<< +_QAClearKey MAC ;_QAClearKey() + utool $6D + <<< +_QAParseWord MAC ;_QAParseWord(???):??? + utool $6E + <<< +utool mac + ldx #]1*256+ToolNum + do userorsys + jsl $E10008 + else + jsl $E10000 + fin + <<< + diff --git a/src/tools/qatools.s b/src/tools/qatools.s new file mode 100644 index 0000000..608ac2e --- /dev/null +++ b/src/tools/qatools.s @@ -0,0 +1,5261 @@ + lst off + tr on + exp off + cas in +*====================================================== +* The toolbox used by QuickASM to make things fast +* and cool for itself and user written tools! + +* Written by Shawn Quick and Lane Roath +* Copyright (c) 1990 QuickSoft & Ideas From the Deep +*------------------------------------------------------ +* 15-Mar-90 0.30 :GetWord, InitWildCard, ReadDir +* 05-Feb-90 0.20 :DateTime,CR,Space,Version, optimization +* 01-Feb-90 0.10 :first usable version +*====================================================== + + xc + xc + mx %00 + rel + +Class1 = $0000 ;class 0 + + lst off + use 2/data/qa.equates + use tool.macs + lst rtn + +mainbank = $000000 ;some local equates +auxbank = $010000 + +hexlen = 8 +declen = 10 +maxlevels = 30 ;allow 30 levels of directory nesting + +*====================================================== +* The routine table required of any toolbox + +tooltbl adrl {:tblend-tooltbl}/4 + adrl qabootinit-1 ; $01 _QABootInit() + adrl qastartup-1 ; $02 _QAStartup(userid,modeflags/4) + adrl qashutdown-1 ; $03 _QAShutdown() + adrl qaversion-1 ; $04 _QAVersion():versionnum + adrl qareset-1 ; $05 _QAReset() + adrl qastatus-1 ; $06 _QAStatus():statflag + adrl reserved-1 ; $07 + adrl reserved-1 ; $08 + adrl qadrawchar-1 ; $09 _QADrawChar(char) + adrl qadrawstring-1 ; $0A _QADrawString(@strptr) + adrl qaprbyte-1 ; $0B _QAPrByte(hexbyte) + adrl qaprbytel-1 ; $0C _QAPrBytel(hexval/4) + adrl qadrawdec-1 ; $0D _QADrawDec(longint/4,flags,fieldsize) + adrl qakeyavail-1 ; $0E _QAKeyAvail():availflag + adrl qagetchar-1 ; $0F _QAGetChar():char (char in low/mod in high) + adrl qagetline-1 ; $10 _QAGetLine(@linestr,@promptptr,maxlen) + adrl qasetparmhdl-1 ; $11 _QASetParmHdl(parmhandle) + adrl qagetparmhdl-1 ; $12 _QAGetParmHdl:parmhandle + adrl qasetcmdhdl-1 ; $13 _QASetCmdHdl(commandhandle,numcmds) + adrl qagetcmdhdl-1 ; $14 _QAGetCmdHdl:commandhandle,numcmds + adrl qareadtotalerrs-1 ;$15 _QAReadTotalErrs():totalerrs + adrl qagetmodeflags-1 ; $16 _QAGetModeFlags():modeflags/4 + adrl qasetmodeflags-1 ; $17 _QASetModeFlags(modeflags/4) + adrl qaloadfile-1 ; $18 _QALoadfile(@filename,filepos/4,length/4,@typelist,userid,address/4,memattrib):filehandle/4 + adrl qasavefile-1 ; $19 _QASavefile(filehandle/4,@filename,filetype,auxtype/4) + adrl qasetcmdline-1 ; $1A _QASetCmdLine(@strptr) + adrl qagetcmdline-1 ; $1B _QAGetCmdLine(@strptr,maxlen) + adrl qaparseline-1 ; $1C _QAParseCmdLine(@strptr):cmdid,cmdtype + adrl qagetquitflag-1 ; $1D _QAGetQuitFlag():quitflag + adrl qasetquitflag-1 ; $1E _QASetQuitFlag(quitflag): + adrl qasetcmdtbl-1 ; $1F _QASetCmdTbl(@cmdtbl) + adrl qagetcmdtbl-1 ; $20 _QAGetCmdTbl():@cmdtbl + adrl qaexeccmd-1 ; $21 _QAExecCommand(cmdtype,cmdid) + adrl qagetmessbyid-1 ; $22 _QAGetMessagebyID(userid):message,subtype/4 + adrl qarun-1 ; $23 _QARun() + adrl qadispose-1 ; $24 _QADispose() + adrl qashutdownid-1 ; $25 _QAShutdownID(userid) + adrl qacompile-1 ; $26 _QACompile(message,subtype/4) + adrl qalink-1 ; $27 _QALink(message,subtype/4) + adrl qacompileactive-1 ;$28 _QACompilerActive():activeflag + adrl qalinkactive-1 ; $29 _QALinkerActvie():activeflag + adrl qagetcompileid-1 ; $2A _QAGetCompileID():compileid + adrl qasetcompileid-1 ; $2B _QASetCompileID(compileid) + adrl qagetlinkid-1 ; $2C _QAGetLinkID():linkid + adrl qasetlinkid-1 ; $2D _QASetLinkID(linkid) + adrl qagetvector-1 ; $2E _QAGetVector(vect#):@address + adrl qasetvector-1 ; $2F _QASetVector(vect#,@address) + adrl qaresetvectors-1 ; $30 _QAResetVectors() + adrl qaevent-1 ; $31 _QAEvent(@eventrecord,taskflag) + adrl qagetcmdrecsize-1 ;$32 _QAGetCmdRecSize():recordsize + adrl qatabtocol-1 ; $33 _QATabtoCol(columnnum) + adrl qaerrormsg-1 ; $34 _QAErrorMsg(ErrorCode) + adrl qabargraph-1 ; $35 _QABarGraph(percent,@Message) + adrl qaconvertpath-1 ; $36 _QAConvertPath(@oldpath,@newpath,appendchar) + adrl qatyp2txt-1 ; $37 _QAConvertTyp2Txt(filetype,@typestr) + adrl qatxt2typ-1 ; $38 _QAConvertTxt2Typ(@typestr):type + adrl qareaddir-1 ; $39 _QAReadDir(@pathname,@doroutine,flags) + adrl qainitwildcard-1 ; $3A _QAInitWildcard(@wcstr,ft,aux/4,ftmask,auxmask/4) + adrl notdefined-1 ; $3B _QAUndefined() + adrl qainittotalerrs-1 ;$3C _QAInitTotalErrs() + adrl qainctotalerrs-1 ; $3D _QAIncTotalErrs() + adrl qagettotalerrs-1 ; $3E _QAGetTotalErrs():totalerrs + adrl qagetcancelflag-1 ;$3F _QAGetCancelFlag():cancelflag + adrl qasetcancelflag-1 ;$40 _QASetCancelFlag(cancelflag) + adrl qastarttiming-1 ; $41 _QAStartTiming() + adrl qaendtiming-1 ; $42 _QAEndTiming:hours,minutes,seconds + adrl qagetsymtbl-1 ; $43 _QAGetSymTable():@table,symhandle/4,numlabels,nextptr/4 + adrl qasetsymtbl-1 ; $44 _QASetSymTable(@table,symhandle/4,numlabels,nextptr/4) + adrl qasetname-1 ; $45 _QASetPath(@pathname) + adrl qagetname-1 ; $46 _QAGetPath(@pathname) + adrl qagetobjtype-1 ; $47 _QAGetObjType():type + adrl qasetobjtype-1 ; $48 _QASetObjType(type) + adrl qagetobjname-1 ; $49 _QAGetObjPath(@pathname) + adrl qasetobjname-1 ; $4A _QASetObjPath(@pathname) + adrl notdefined-1 ; $4B _QACallUSR(opcode,@operand):handled + adrl notdefined-1 ; $4C _QACallUser(rngstart,rngend,texthandle/4,textlen/4) + adrl notdefined-1 ; $4D _QAGoEVAL(@operand,offset):value/4 + adrl notdefined-1 ; $4E _QAGoPutByte(byte) + adrl notdefined-1 ; $4F _QAGoPutOpcode(opcodebyte) + adrl notdefined-1 ; $50 _QAGoRelcorrect() + adrl qadrawerrchar-1 ;$51 _QADrawErrChar(char) + adrl qadrawerrstring-1 ;$52 _QADrawErrString(@strptr) + adrl qagetwindow-1 ; $53 _QAGetWindow():windowtype + adrl qasetwindow-1 ; $54 _QASetWindow(windowtype) + adrl qagetshellid-1 ; $55 _QAGetShellID():userid + adrl qasetshellid-1 ; $56 _QASetShellID(userid) + adrl qagotoxy-1 ; $57 _QAGotoXY(x,y) + adrl qagetxy-1 ; $58 _QAGetXY():X,Y + adrl qaprnib-1 ; $59 _QAPrNibble(nibval) + adrl qadrawhex-1 ; $5A _QADrawHex(hexval/4,flags,fieldsize) + adrl qadrawblock-1 ; $5B _QADrawBlock(@CBlock) + adrl qadrawerrblock-1 ; $5C _QADrawErrBlock(@CBlock) + adrl qadrawmultchar-1 ; $5D _QADrawCharX(char,count) + adrl qadrawmultechar-1 ;$5E _QADrawECharX(char,count) + adrl qagetlaunch-1 ; $5F _QAGetLaunch():@path,flags + adrl qasetlaunch-1 ; $60 _QASetLaunch(@path,flags) + adrl QAGetWord-1 ; $61 _QAGetWord(@Text,Offset,MaxLen):BegOffset,EndOffset + adrl QADateTime-1 ; $62 _QAPrintDate(Flags,@DateTime) + adrl QADrawCR-1 ; $63 _QADrawCR() + adrl QADrawSpace-1 ; $64 _QADrawSpace() + adrl QAPrintVersion-1 ; $65 _QAPrintVersion(Version/4) + adrl qadrawbox-1 ; $66 _QADrawBox(x,y,width,height):buffhdl + adrl qaerasebox-1 ; $67 _QAEraseBox(buffhdl) + adrl qaconvertstr-1 ; $68 _QAConvertString(@string/class.1,@buffer/class.1,cmdcode):rtncode + adrl qadrawstrl-1 ; $69 _QADrawStringL(@string/class.1) + adrl qadrawerrstrl-1 ; $6A _QADrawErrStringL(@strptr/class.1) + adrl qagetkeyadrs-1 ; $6B _QAGetKeyAddress():keyaddress/4 + adrl QANextLine-1 ; $6C _QANextLine(@Text,Offset,MaxLen):NewLineOffset + adrl QAClearKey-1 ; $6D _QAClearKey() + adrl QAParseWord-1 ; $6E _QAParseWord(???):??? +:tblend + +*====================================================== +* Vector Tables: patched by graphics shell, etc... + +vectortbl + jml pchar ; #1 _QADrawChar + jml pstr ; #2 _QADrawString + jml pechar ; #3 _QADrawErrChar + jml pestr ; #4 _QADrawErrString + jml pblk ; #5 _QADrawCStr + jml peblk ; #6 _QADrawECStr + jml putop ; #7 _QAPutOpcode + jml putbyte ; #8 _QAPutByte + jml eval ; #9 _QAEval + jml relcorrect ; #10 _QARelCorrect + jml mykeyavail ; #11 _QAKeyAvail + jml mygetchar ; #12 _QAGetChar + jml mygetline ; #13 _QAGetLine + jml mytabtocol + jml rtl + jml rtl + jml rtl + jml rtl + jml rtl + jml pstrl + jml pestrl + adrl 0 ;NOT a Vector but a HANDLE + +vectortbl1 ;--- copy of ORIGINAL for restoration --- + jml pchar + jml pstr + jml pechar + jml pestr + jml pblk + jml peblk + jml putop + jml putbyte + jml eval + jml relcorrect + jml mykeyavail + jml mygetchar + jml mygetline + jml mytabtocol + jml rtl + jml rtl + jml rtl + jml rtl + jml rtl + jml pstrl + jml pestrl + adrl 0 ;NOT a Vector but a HANDLE +vectend + +*====================================================== +* Common exit routines to set carry & processor status + +noerror rep $30 + lda #0 +errxit rep $30 + cmp #1 + rtl + + mx %00 +qabootinit phb + phd + phk + plb + stz started + pea #userorsys + pea #toolnum + pea 0 + pea 0 + tll $0d01 ;_setwap + psl #0 + psl #qabootinit + tll $1A02 ;_Findhandle + tsc + inc + tcd + lda 0 + ora 2 + beq :err + ldy #$06 + lda [0],y + sta userid + pla + pla + jsr initvars + pld + plb + brl noerror +:err plx + plx + pld + plb + lda #$FF + brl errxit + +qastartup + dum 0 +]rtl ds 6 ;these are passed on stack +]modeflag ds 4 +]userid ds 2 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + + jsr initvars ;insure vars inited + jsr InitASK + + lda ]modeflag + sta modeflags + lda ]modeflag+2 + sta modeflags+2 ;set parms passed + lda ]userid + sta initid + jsr ttinitscreen + dec started ;show we are started + +:noerr1 lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + cmpl :one + rtl +:one dw 1 + mx %00 + +qashutdown phb + phk + plb + stz started + ~SetVector #$F;EMKeyVect ;restore event manager vectors + jsr ttshutdown + jsr initvars + plb + brl noerror + +qastatus ldal started + sta 7,s + brl noerror + +qareset brl noerror + +qaversion lda #versionnum + sta 7,s + brl noerror + +reserved +notdefined lda #qanotstarted ;not defined error + brl errxit + +initvars + lda cmdhandle + ora cmdhandle+2 + beq :1 + psl cmdhandle + _disposehandle ;do this before total clear! +:1 + ldx #DS_Size-2 +]loop stz DS_Start,x + dex ;clear all variables + dex + bpl ]loop + + jsl QAResetVectors ;insure originals are good + +*------------------------------------------------------ +* Init the text tool variables + +ttinitvars + php + rep $30 + stz outflag + stz cursx + stz cursy + stz fullwindow + stz wintop + stz winleft + lda #23 + sta winbot + lda #80 + sta winwidth + lda #$80 ;normal, no mousetext + sta charflag + jsr setcurs + plp + rts + +*====================================================== +* Actual Tool Functions Start Here + + mx %00 +qasetparmhdl + lda 7,s + stal parmhandle + lda 9,s + stal parmhandle+2 + lda 5,s + sta 5+4,s + lda 3,s + sta 3+4,s + lda 1,s + sta 1+4,s + pla + pla + brl noerror + +qagetparmhdl + ldal parmhandle + sta 7,s + ldal parmhandle+2 + sta 9,s + brl noerror + + mx %00 +qasetquitflag + lda 7,s + stal quitflag + lda 5,s + sta 5+2,s + lda 3,s + sta 3+2,s + lda 1,s + sta 1+2,s + pla + brl noerror +qagetquitflag + ldal quitflag + sta 7,s + brl noerror + + mx %00 +qasetcancelflag + lda 7,s + stal cancelflag + lda 5,s + sta 5+2,s + lda 3,s + sta 3+2,s + lda 1,s + sta 1+2,s + pla + brl noerror +qagetcancelflag + ldal cancelflag + sta 7,s + brl noerror + + + mx %00 +qasetcompileid + lda 7,s + stal compiler + lda 5,s + sta 5+2,s + lda 3,s + sta 3+2,s + lda 1,s + sta 1+2,s + pla + brl noerror +qagetcompileid + ldal compiler + sta 7,s + brl noerror + + mx %00 +qasetlinkid + lda 7,s + stal linker + lda 5,s + sta 5+2,s + lda 3,s + sta 3+2,s + lda 1,s + sta 1+2,s + pla + brl noerror +qagetlinkid + ldal linker + sta 7,s + brl noerror + +qasetcmdtbl + lda 7,s + stal cmdtbl + lda 9,s + stal cmdtbl+2 + lda 5,s + sta 5+4,s + lda 3,s + sta 3+4,s + lda 1,s + sta 1+4,s + pla + pla + brl noerror + +qagetcmdtbl + ldal cmdtbl + sta 7,s + ldal cmdtbl+2 + sta 9,s + brl noerror + +qagetcmdrecsize + lda #erecsize + sta 7,s + brl noerror + + +qasetcmdhdl + lda 9,s + stal cmdhandle + lda 11,s + stal cmdhandle+2 + lda 7,s + stal numcmds + lda 5,s + sta 5+6,s + lda 3,s + sta 3+6,s + lda 1,s + sta 1+6,s + pla + pla + pla + brl noerror +qagetcmdhdl + ldal numcmds + sta 7,s + ldal cmdhandle + sta 9,s + ldal cmdhandle+2 + sta 11,s + brl noerror + + +qacalllang + dum 0 +]rtl ds 6 ;these are passed on stack +]subtype ds 4 +]message ds 2 +]langid ds 2 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb +*** + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +QAParseWord +dummy + dum 0 +]rtl ds 6 ;these are passed on stack +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb +*** + +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +qadrawchar +]char = 8 + + phb + phk + plb + rep $30 + lda windowflag + bne :1 + lda ]char,s + jsl {vprintchar*4}+vectortbl-4 + bra :xit +:1 lda ]char,s + jsl {verrchar*4}+vectortbl-4 +:xit plb + lda 5,s + sta 7,s + lda 3,s + sta 5,s + lda 1,s + sta 3,s + pla + brl noerror + +qadrawmultchar +]count = 8 +]char = 10 + + phb + phk + plb + rep $30 + lda windowflag + bne :1 + lda ]count,s + beq :xit +:0 lda ]char,s + jsl {vprintchar*4}+vectortbl-4 + lda ]count,s + dec + sta ]count,s + bne :0 + bra :xit +:1 lda ]count + beq :xit +:11 lda ]char,s + jsl {verrchar*4}+vectortbl-4 + lda ]count,s + dec + sta ]count,s + bne :11 +:xit plb + lda 5,s + sta 5+4,s + lda 3,s + sta 3+4,s + lda 1,s + sta 1+4,s + pla + pla + brl noerror + +qadrawmultechar +]count = 8 +]char = 10 + + phb + phk + plb + rep $30 + lda ]count,s + beq :xit +:1 lda ]char,s + jsl {verrchar*4}+vectortbl-4 + lda ]count,s + dec + sta ]count,s + bne :1 +:xit plb + lda 5,s + sta 5+4,s + lda 3,s + sta 3+4,s + lda 1,s + sta 1+4,s + pla + pla + brl noerror + + +qadrawstring +]strptr = 8 + + phb + phk + plb + lda ]strptr+2,s + tax + lda ]strptr,s + tay + lda windowflag + beq :tya + tya + jsl {verrstr*4}+vectortbl-4 + bra :xit +:tya tya + jsl {vprintstr*4}+vectortbl-4 +:xit plb + lda 5,s + sta 9,s + lda 3,s + sta 7,s + lda 1,s + sta 5,s + pla + pla + brl noerror + +qadrawerrchar +]char = 7 + phb + phk + plb + lda ]char,s + jsl {verrchar*4}+vectortbl-4 + plb + lda 5,s + sta 7,s + lda 3,s + sta 5,s + lda 1,s + sta 3,s + pla + brl noerror + +qadrawerrstring +]strptr = 8 + phb + phk + plb + lda ]strptr+2,s + tax + lda ]strptr,s + jsl {verrstr*4}+vectortbl-4 + plb + lda 5,s + sta 9,s + lda 3,s + sta 7,s + lda 1,s + sta 5,s + pla + pla + brl noerror + +qadrawerrstrl +]strptr = 8 + phb + phk + plb + lda ]strptr+2,s + tax + lda ]strptr,s + jsl {verrstrl*4}+vectortbl-4 + plb + lda 5,s + sta 9,s + lda 3,s + sta 7,s + lda 1,s + sta 5,s + pla + pla + jmp noerror + +qadrawstrl +]strptr = 8 + + phb + phk + plb + lda ]strptr+2,s + tax + lda ]strptr,s + tay + ldal windowflag + beq :tya + tya + jsl {verrstrl*4}+vectortbl-4 + bra :xit +:tya tya + jsl {vprintstrl*4}+vectortbl-4 +:xit plb + lda 5,s + sta 9,s + lda 3,s + sta 7,s + lda 1,s + sta 5,s + pla + pla + jmp noerror + +qadrawblock +]strptr = 8 + + phb + phk + plb + lda ]strptr+2,s + tax + lda ]strptr,s + tay + lda windowflag + beq :tya + tya + jsl {verrblk*4}+vectortbl-4 + bra :xit +:tya tya + jsl {vprintblk*4}+vectortbl-4 +:xit plb + lda 5,s + sta 9,s + lda 3,s + sta 7,s + lda 1,s + sta 5,s + pla + pla + brl noerror + +qadrawerrblock +]strptr = 8 + phb + phk + plb + lda ]strptr+2,s + tax + lda ]strptr,s + jsl {verrblk*4}+vectortbl-4 + plb + lda 5,s + sta 9,s + lda 3,s + sta 7,s + lda 1,s + sta 5,s + pla + pla + brl noerror + + +qatabtocol + lda 7,s + jsl {vtabtocol*4}+vectortbl-4 + tax + lda 5,s + sta 5+2,s + lda 3,s + sta 3+2,s + lda 1,s + sta 1+2,s + pla + txa + rtl + +qagotoxy lda 7,s + stal cursy + lda 9,s + stal cursx + phb + phk + plb + jsr setcurs + plb + tax + lda 5,s + sta 5+4,s + lda 3,s + sta 3+4,s + lda 1,s + sta 1+4,s + pla + pla + txa + rtl + +qagetxy ldal cursy + sta 7,s + ldal cursx + sta 9,s + brl noerror + +qaprnib + +]byte = 7 + lda ]byte,s + jsr myPrNib + lda 5,s + sta 7,s + lda 3,s + sta 5,s + lda 1,s + sta 3,s + pla + brl noerror + +qaprbyte + +]byte = 7 + lda ]byte,s + lsr + lsr + lsr + lsr + jsr myPrNib + lda ]byte,s + jsr myPrNib + lda 5,s + sta 7,s + lda 3,s + sta 5,s + lda 1,s + sta 3,s + pla + brl noerror + +qaprbytel + +]byte = 7 + lda ]byte+1,s + lsr + lsr + lsr + lsr + jsr myPrNib + lda ]byte+1,s + jsr myPrNib + lda ]byte,s + lsr + lsr + lsr + lsr + jsr myPrNib + lda ]byte,s + jsr myPrNib + lda 5,s + sta 7,s + lda 3,s + sta 5,s + lda 1,s + sta 3,s + pla + brl noerror + +myPrNib + phb + phk + plb + and #$0F + tax + lda hextbl,x + jsl {vprintchar*4}+vectortbl-4 + plb + rts + +hextbl asc '0123456789ABCDEF' + +*------------------------------------------------------ + mx %00 +qakeyavail + lda #0 + sta 7,s + jsl {vkeymac*4}+vectortbl-4 + bcc :myavail + sta 7,s + brl noerror +:myavail + lda #0 + jsl {vkeyavail*4}+vectortbl-4 + rep $30 + bcs :rtl + sta 7,s +:rtl rtl + +*------------------------------------------------------ +qagetchar + lda #$01 + jsl {vkeymac*4}+vectortbl-4 + bcc :myget + sta 7,s + brl noerror +:myget lda #0 + sta 7,s + jsl {vgetchar*4}+vectortbl-4 + rep $30 + bcs :rtl + sta 7,s +:rtl rtl + + mx %00 + +qagetmodeflags + ldal modeflags + sta 7,s + ldal modeflags+2 + sta 9,s + brl noerror + +qasetmodeflags + lda 7,s + stal modeflags + lda 9,s + stal modeflags+2 + lda 5,s + sta 9,s + lda 3,s + sta 7,s + lda 1,s + sta 5,s + pla + pla + brl noerror + +qalinkactive + ldal linkactive + sta 7,s + brl noerror +qacompileactive + ldal compileactive + sta 7,s + brl noerror + +qaloadfile + dum 0 + +]loadzp ds 4 +]rtl ds 3 ;these are passed on stack +]rtl1 ds 3 +]memattrib ds 2 +]loadadr ds 4 +]loadid ds 2 +]typeptr ds 4 +]length ds 4 +]filepos ds 4 +]nameptr ds 4 +]newstack = *-6 ;must be at end of passed params +]loadhandle ds 4 ;these are returned on stack + + dend + + mx %00 + + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + + stz :errcode ;init all variables + stz :close + stz :open + stz :read + stz :markparm + stz :lockflag + + stz ]loadhandle + stz ]loadhandle+2 + + lda ]nameptr + sta :pathptr + sta :info + lda ]nameptr+2 + sta :pathptr+2 + sta :info+2 + lda ]length + sta :request + lda ]length+2 + sta :request+2 + + _GSOS _getfileinfo;:info + jcs :doserror + sep $30 + lda []typeptr] + beq :all + tay +]lup lda []typeptr],y + cmp :ftype + beq :all + dey + bne ]lup + rep $30 + lda #$5C ;file mismatch error + brl :doserror + +:all rep $30 + lda ]length+2 + and ]length + cmp #$ffff + bne :norm + + jsl prodos + dw $10 + adrl :open + jcs :doserror + + lda :open + sta :eof + jsl prodos + dw $19 + adrl :eof + jcs :doserror + lda :eof+2 + sta :request + lda :eof+4 + sta :request+2 + +:norm psl #0 + psl :request + lda ]loadid + pha + lda ]memattrib + pha + psl ]loadadr ;where do we want it? + tll $0902 + plx + ply + jcs :doserror + stx ]loadhandle + sty ]loadhandle+2 + + ldy #$04 + lda []loadhandle],y + and #$8000 + sta :lockflag + lda []loadhandle],y + ora #$8000 + sta []loadhandle],y + ldy #$02 + lda []loadhandle] + sta :buffer + tax + lda []loadhandle],y + sta :buffer+2 + sta ]loadzp+2 + stx ]loadzp +:load lda :open + bne :o + jsl prodos + dw $10 + adrl :open + jcs :doserror +:o lda :open + sta :read + sta :markparm + + lda ]filepos + sta :markparm+2 + lda ]filepos+2 + sta :markparm+4 + + jsl prodos + dw $16 + adrl :markparm + jcs :doserror + + jsl prodos + dw $12 + adrl :read + jcs :doserror + + _GSOS _close;:open + stz :open + jcs :doserror + + lda :ftype + cmp #$04 + beq :addcr + cmp #$b0 + bne :noerr +:addcr lda :request + clc + adc :buffer + sta ]loadzp + lda :request+2 + adc :buffer+2 + sta ]loadzp+2 + lda ]loadzp + bne :d + dec ]loadzp+2 +:d dec ]loadzp + lda []loadzp] + and #$7f + cmp #$0d + beq :noerr + psl ]loadhandle + _Hunlock + psl #0 + psl ]loadhandle + _gethandlesize + pll ]loadzp + inc ]loadzp + bne :noinc + inc ]loadzp+2 +:noinc psl ]loadzp + psl ]loadhandle + _sethandlesize + bcs :doserror + ldy #$02 + lda []loadhandle] + clc + adc ]loadzp + sta ]loadzp + lda []loadhandle],y + adc ]loadzp+2 + sta ]loadzp+2 + sep $20 + lda #$0d + sta []loadzp] +:noerr rep $30 + lda #0 +:doserror sta :errcode + lda ]loadhandle + ora ]loadhandle+2 + beq :e1 + lda :errcode + bne :dispose + ldy #$04 + lda []loadhandle],y + and #$7fff + ora :lockflag + sta []loadhandle],y + stz :lockflag + bra :e1 +:dispose psl ]loadhandle + _disposehandle + stz ]loadhandle + stz ]loadhandle+2 +:e1 lda :open + beq :noclose + + jsl prodos + dw $14 ;close the file + adrl :open + +:noclose rep $30 + stz :open + lda :errcode +:xit rep $30 + pha ;save the error + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + pla + plb + pld + tax + tsc + clc + adc #]newstack + tcs + txa + cmp #$01 + rtl + +:errcode ds 2 +:lockflag ds 2 + +:open dw 0 +:pathptr adrl $0000 + adrl 0 +:markparm dw 0 +:mark adrl 0 +:read dw 0 +:buffer ds 4 +:request ds 4 + ds 4 +:close dw 0 +:eof ds 6,0 +:info adrl $0000 + dw 0 +:ftype dw 0 + ds 18,0 + + +*** +qasavefile + dum 0 + +]rtl ds 3 ;these are passed on stack +]rtl1 ds 3 +]auxtype ds 4 +]filetype ds 2 +]nameptr ds 4 +]datahandle ds 4 +]newstack = *-6 ;must be at end of passed params + + dend + + mx %00 + + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + + stz :errcode ;init all variables + stz :open + stz :lockflag + + lda ]nameptr + sta :pathptr + sta :create + sta :info + lda ]nameptr+2 + sta :pathptr+2 + sta :create+2 + sta :info+2 + + psl #0 + psl ]datahandle + _gethandlesize + plx + ply + jcs :err + stx :request + sty :request+2 + + _GSOS _getfileinfo;:info + bcc :nocreate + + lda ]filetype + sta :ctype + lda ]auxtype + sta :caux + lda ]auxtype+2 + sta :caux+2 + _GSOS _create;:create + jcs :err + _GSOS _getfileinfo;:info + jcs :err + +:nocreate + lda :ftype + cmp ]filetype + beq :doopen + lda #$5C ;file mismatch error + brl :err +:doopen _GSOS _open;:open + jcs :err + lda :open + sta :write + ldy #$04 + lda []datahandle],y + and #$8000 + sta :lockflag + lda []datahandle],y + ora #$8000 + sta []datahandle],y + ldy #$02 + lda []datahandle] + sta :buffer + lda []datahandle],y + sta :buffer+2 + _GSOS _write;:write + php + pha + ldy #$04 + lda []datahandle],y + and #$7fff + ora :lockflag + sta []datahandle],y + pla + plp + bcs :err + lda :open + sta :mark + _GSOS _getmark;:mark + _GSOS _seteof;:mark + _GSOS _close;:open + bcs :err + stz :open + _GSOS _getfileinfo;:info + bcs :err + lda ]auxtype + sta :aux + lda ]auxtype+2 + sta :aux+2 + _GSOS _setfileinfo;:info + bcs :err + lda #0 +:err sta :errcode + lda :open + beq :noclose + jsl prodos + dw $14 ;close the file + adrl :open +:noclose rep $30 + stz :open + lda :errcode +:xit rep $30 + pha ;save the error + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + pla + plb + pld + tax + tsc + clc + adc #]newstack + tcs + txa + cmp #$01 + rtl + +:errcode ds 2 +:lockflag ds 2 + +:open dw 0 +:pathptr adrl $0000 + adrl 0 +:write dw 0 +:buffer ds 4 +:request ds 4 + ds 4 +:info adrl $0000 + dw 0 +:ftype dw 0 +:aux ds 18,0 +:mark ds 6 +:create adrl 0 + dw $e3 +:ctype dw 0 +:caux adrl 0 + dw $01 + adrl 0 + adrl 0 + + +qagetcmdline + dum 0 +]rtl ds 6 ;these are passed on stack +]maxlen ds 2 +]strptr ds 4 + +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda ]maxlen + and #$ff + beq :xit + sta ]maxlen + sep $30 + lda cmdstr + cmp ]maxlen + blt :ok + beq :ok + lda ]maxlen +:ok tay +]lup lda cmdstr,y + sta []strptr],y + dey + cpy #$ff + bne ]lup +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + + +qasetcmdline + dum 0 +]rtl ds 6 ;these are passed on stack +]strptr ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + sep $30 + lda []strptr] + bne :move + sta cmdstr + brl :xit +:move tax + ldy #$01 +]lup lda []strptr],y + and #$7f + cmp #' ' + blt :done + sta cmdstr,y + iny + dey + dex + bne ]lup +:done lda #$0d + sta cmdstr,y + sty cmdstr + rep $30 + lda #'|' + jsl {vprintchar*4}+vectortbl-4 + psl #cmdstr + _QADrawStr + +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +:len ds 2 +:cmd ds 17 + + +qaparseline + dum 0 +]ct ds 2 +]ptr ds 4 +]rtl ds 6 ;these are passed on stack +]strptr ds 4 +]newstack = *-6 ;must be at end of passed params +]cmdtype ds 2 +]cmdid ds 2 + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + stz ]cmdtype + stz ]cmdid + sep $30 + lda []strptr] + jeq :xit + ldy #$01 + tax +]lup lda []strptr],y + and #$7f + cmp #' ' + blt :done + sta cmdstr,y + iny + dex + bne ]lup +:done lda #$0d + cpy #0 + bne :sta + ldy #$ff +:sta sta cmdstr,y + sty cmdstr + ldx #0 +]lup lda cmdstr+1,x + inx + cmp #' ' + jlt :xit + beq ]lup + ldy #$01 + cmp #'a' + blt :s0 + cmp #'z'+1 + bge :s0 + and #$5f +:s0 sta :cmd+1 +]lup lda cmdstr+1,x + cmp #' '+1 + blt :sty + cpy #15 + bge :s1 + cmp #'a' + blt :s00 + cmp #'z'+1 + bge :s00 + and #$5f +:s00 sta :cmd+1,y + iny +:s1 inx + bra ]lup +:run rep $30 + and #$7f + sta :cmd+1 + ldy #$01 + sep $30 + sty :cmd + bra :r1 +:sty sep $30 + sty :cmd + lda :cmd+1 + cmp #'=' + beq :run + cmp #'-' + beq :run +:r1 rep $30 + lda cmdhandle + ora cmdhandle+2 + jeq :notfound + psl cmdhandle + _Hlock + lda numcmds + sta ]ct + lda cmdhandle + sta ]ptr + lda cmdhandle+2 + sta ]ptr+2 + ldy #$02 + lda []ptr] + tax + lda []ptr],y + sta ]ptr+2 + stx ]ptr +:find rep $30 + ldy ]ct + beq :notfound + sep $30 + lda []ptr] + cmp :cmd + bne :next + tay +:fl1 lda []ptr],y + cmp :cmd,y + bne :next + dey + bne :fl1 + brl :found +:next rep $30 + lda ]ptr + clc + adc #erecsize + sta ]ptr + bcc :dec + inc ]ptr+2 +:dec dec ]ct + bra :find +:found rep $30 + ldy #eid + lda []ptr],y + sta ]cmdid + ldy #etype + lda []ptr],y + sta ]cmdtype + lda #0 + brl :xit +:notfound rep $30 + lda #qacmdnotfound +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +:len ds 2 +:cmd ds 17 + +qacompile ; + dum 0 +]zp ds 4 +]zp1 ds 4 +]cid ds 2 +]ctype ds 2 +]rtl ds 6 ;these are passed on stack +]sub ds 4 +]message ds 2 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda compileactive + jne :already + lda cmdtbl + ora cmdtbl+2 + jeq :notavail + lda compiler + jeq :notavail + sta ]cid + lda #$02 ;compiler type + sta ]ctype +:loadit + psl #0 + lda ]ctype + pha + lda ]cid + pha + jsl getcmdptr + plx + ply + jcs :notavail + sty ]zp+2 + stx ]zp + ldy #euserid + lda []zp],y + beq :aload + ldy #eflags + lda []zp],y + bit #$4000 + beq :aload + lda ]zp + ldx ]zp+2 + jsr shutdownid +:aload sep $30 + lda []zp] + tay +]lup lda []zp],y + sta :name+2,y + dey + bne ]lup + lda []zp] + clc + adc #$02 + sta :name + lda #'6' + sta :name+1 + lda #':' + sta :name+2 + rep $30 + ldy #eflags + lda []zp],y + bit #$8000 + beq :initial + ldy #euserid + lda []zp],y + beq :initial + pha + pha + pha + pha + pha + pha + tll $0a11 ;_Restart + plx + stx :id + plx + stx :add + plx + stx :add+2 + plx + ply + bcc :cpy +:initial rep $30 + pha + pha + pha + pha + pha + pea 0 ;new userid + psl #:name + pea $FFFF ;don't use special mem + tll $0911 ;_InitialLoad + plx ;userid + stx :id + plx + stx :add + plx + stx :add+2 + plx + ply + jcs :xit +:cpy cpy #0 + beq :newdp + stx :dp + stz ]zp1 + stz ]zp1+2 + bra :ago +:newdp psl #0 + psl #$100 + lda :id + pha + pea $c015 + psl #0 + _newhandle + plx + ply + jcs :xit + stx ]zp1 + sty ]zp1+2 + lda []zp1] + sta :dp + ldy #$02 + lda []zp1] + tax + lda []zp1],y + sta ]zp1+2 + stx ]zp1 + phd + lda :dp + tcd + ldx #0 +]l stz 0,x + inx + inx + cpx #$100 + blt ]l + pld +:ago lda :add + sta :ajsl+1 + lda :add+2 + sep $20 + sta :ajsl+3 + rep $20 + ldy #edp + lda :dp + sta []zp],y + ldy #eaddress + lda :add + sta []zp],y + iny + iny + lda :add+2 + sta []zp],y + ldy #eflags + lda []zp],y + ora #$4000 + sta []zp],y + ldy #emesstype + lda ]message + sta []zp],y + ldy #emesssub + lda ]sub + sta []zp],y + iny + iny + lda ]sub+2 + sta []zp],y + ldy #euserid + lda :id + sta []zp],y + ldy #edphandle + lda ]zp1 + sta []zp],y + iny + iny + lda ]zp1+2 + sta []zp],y + + lda #-1 + sta compileactive + phb + phd + lda :dp + tcd + lda :id + ldx #0 + txy +:ajsl jsl $FFFFFF + php + clc + xce + plp + rep $30 + stz compileactive + pld + plb + + php + pha + bcs :sdown + ldy #etype + lda []zp],y + cmp #$05 + beq :nosdown + ldy #eflags + lda []zp],y + bit #$4000 + beq :nosdown +:sdown lda ]zp + ldx ]zp+2 + jsr shutdownid +:nosdown pla + plp + jcs :xit + lda #0 + brl :xit + +:bad rep $30 + lda #qacmdnotfound + bra :xit +:already rep $30 + lda #qaalreadyactive + bra :xit +:notavail rep $30 + lda #qalangnotavail +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +:name ds 20 +:id ds 2 +:add ds 4 +:dp ds 2 + + +qalink + dum 0 +]zp ds 4 +]zp1 ds 4 +]cid ds 2 +]ctype ds 2 +]rtl ds 6 ;these are passed on stack +]sub ds 4 +]message ds 2 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda linkactive + jne :already + lda cmdtbl + ora cmdtbl+2 + jeq :notavail + lda linker + jeq :notavail + sta ]cid + lda #$01 ;linker type + sta ]ctype + +:loadit psl #0 + lda ]ctype + pha + lda ]cid + pha + jsl getcmdptr + plx + ply + jcs :notavail + sty ]zp+2 + stx ]zp + ldy #euserid + lda []zp],y + beq :aload + ldy #eflags + lda []zp],y + bit #$4000 + beq :aload + lda ]zp + ldx ]zp+2 + jsr shutdownid +:aload sep $30 + lda []zp] + tay +]lup lda []zp],y + sta :name+2,y + dey + bne ]lup + lda []zp] + clc + adc #$02 + sta :name + lda #'6' + sta :name+1 + lda #':' + sta :name+2 + rep $30 + ldy #eflags + lda []zp],y + bit #$8000 + beq :initial + ldy #euserid + lda []zp],y + beq :initial + pha + pha + pha + pha + pha + pha + tll $0a11 ;_Restart + plx + stx :id + plx + stx :add + plx + stx :add+2 + plx + ply + bcc :cpy +:initial rep $30 + pha + pha + pha + pha + pha + pea 0 ;new userid + psl #:name + pea $FFFF ;don't use special mem + tll $0911 ;_InitialLoad + plx ;userid + stx :id + plx + stx :add + plx + stx :add+2 + plx + ply + jcs :xit +:cpy cpy #0 + beq :newdp + stx :dp + stz ]zp1 + stz ]zp1+2 + bra :ago +:newdp psl #0 + psl #$100 + lda :id + pha + pea $c015 + psl #0 + _newhandle + plx + ply + jcs :xit + stx ]zp1 + sty ]zp1+2 + lda []zp1] + sta :dp + ldy #$02 + lda []zp1] + tax + lda []zp1],y + sta ]zp1+2 + stx ]zp1 + phd + lda :dp + tcd + ldx #0 +]l stz 0,x + inx + inx + cpx #$100 + blt ]l + pld +:ago lda :add + sta :ajsl+1 + lda :add+2 + sep $20 + sta :ajsl+3 + rep $20 + ldy #edp + lda :dp + sta []zp],y + ldy #eaddress + lda :add + sta []zp],y + iny + iny + lda :add+2 + sta []zp],y + ldy #eflags + lda []zp],y + ora #$4000 + sta []zp],y + ldy #emesstype + lda ]message + sta []zp],y + ldy #emesssub + lda ]sub + sta []zp],y + iny + iny + lda ]sub+2 + sta []zp],y + ldy #euserid + lda :id + sta []zp],y + ldy #edphandle + lda ]zp1 + sta []zp],y + iny + iny + lda ]zp1+2 + sta []zp],y + + lda #-1 + sta linkactive + phb + phd + lda :dp + tcd + lda :id + ldx #0 + txy +:ajsl jsl $FFFFFF + php + clc + xce + plp + rep $30 + stz linkactive + pld + plb + + php + pha + bcs :sdown + ldy #etype + lda []zp],y + cmp #$05 + beq :nosdown + ldy #eflags + lda []zp],y + bit #$4000 + beq :nosdown +:sdown lda ]zp + ldx ]zp+2 + jsr shutdownid +:nosdown pla + plp + jcs :xit + lda #0 + brl :xit + +:bad rep $30 + lda #qacmdnotfound + bra :xit +:already rep $30 + lda #qaalreadyactive + bra :xit +:notavail rep $30 + lda #qalinknotavail +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +:name ds 20 +:id ds 2 +:add ds 4 +:dp ds 2 + + + + +qaexeccmd + dum 0 +]zp ds 4 +]zp1 ds 4 +]zp2 ds 4 +]rtl ds 6 ;these are passed on stack +]cmdid ds 2 +]cmdtype ds 2 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda cmdtbl + ora cmdtbl+2 + jeq :bad + lda ]cmdtype + cmp #$01 ;linker type? + jeq :linker + cmp #$02 + jeq :compiler ;compiler type? + cmp #$03 + jeq :internal ;internal command? + cmp #$04 + jeq :external ;external command? + cmp #$05 + jeq :application +:bad rep $30 + lda #qacmdnotfound +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +:linker psl #0 + lda ]cmdtype + pha + lda ]cmdid + pha + jsl getcmdptr + plx + ply + jcs :bad + sty ]zp+2 + stx ]zp + ldy #eid + lda []zp],y + sta linker + psl #:lstr + bra :lcxit + +:compiler psl #0 + lda ]cmdtype + pha + lda ]cmdid + pha + jsl getcmdptr + plx + ply + jcs :bad + sty ]zp+2 + stx ]zp + ldy #eid + lda []zp],y + sta compiler + psl #:cstr +:lcxit _QADrawString + pei ]zp+2 + pei ]zp + _QADrawString + lda #$0d + jsl {vprintchar*4}+vectortbl-4 + lda #0 + brl :xit + +:lstr str 'Current Linker now: ' +:cstr str 'Current Language now: ' + +:external +:application psl #0 + lda ]cmdtype + pha + lda ]cmdid + pha + jsl getcmdptr + plx + ply + jcs :bad + sty ]zp+2 + stx ]zp + ldy #euserid + lda []zp],y + beq :aload + ldy #eflags + lda []zp],y + bit #$4000 + beq :aload + lda ]zp + ldx ]zp+2 + jsr shutdownid +:aload sep $30 + lda []zp] + tay +]lup lda []zp],y + sta :name+2,y + dey + bne ]lup + lda []zp] + clc + adc #$02 + sta :name + lda #'6' + sta :name+1 + lda #':' + sta :name+2 + rep $30 + ldy #eflags + lda []zp],y + bit #$8000 + beq :initial + ldy #euserid + lda []zp],y + beq :initial + pha + pha + pha + pha + pha + pha + tll $0a11 ;_Restart + plx + stx :id + plx + stx :add + plx + stx :add+2 + plx + ply + bcc :cpy +:initial rep $30 + pha + pha + pha + pha + pha + pea 0 ;new userid + psl #:name + pea $FFFF ;don't use special mem + tll $0911 ;_InitialLoad + plx ;userid + stx :id + plx + stx :add + plx + stx :add+2 + plx + ply + jcs :xit +:cpy cpy #0 + beq :newdp + stx :dp + stz ]zp1 + stz ]zp1+2 + bra :ago +:newdp psl #0 + psl #$100 + lda :id + pha + pea $c015 + psl #0 + _newhandle + plx + ply + jcs :xit + stx ]zp1 + sty ]zp1+2 + lda []zp1] + sta :dp + ldy #$02 + lda []zp1] + tax + lda []zp1],y + sta ]zp1+2 + stx ]zp1 + phd + lda :dp + tcd + ldx #0 +]l stz 0,x + inx + inx + cpx #$100 + blt ]l + pld + + +:ago rep $30 + lda :add + sta :ajsl+1 + sta ]zp2 + lda :add+2 + sta ]zp2+2 + sep $20 + sta :ajsl+3 + rep $20 + ldy #edp + lda :dp + sta []zp],y + ldy #eaddress + lda :add + sta []zp],y + iny + iny + lda :add+2 + sta []zp],y + ldy #eflags + lda []zp],y + ora #$4000 + sta []zp],y + ldy #emesstype + lda #startmess ;startup message + sta []zp],y + ldy #emesssub + sta []zp],y + iny + iny + sta []zp],y + ldy #euserid + lda :id + sta []zp],y + ldy #edphandle + lda ]zp1 + sta []zp],y + iny + iny + lda ]zp1+2 + sta []zp],y + + psl #cmdline-1 + pea 128 + _QAGetCmdLine + sep $30 + ldx cmdline-1 + stz cmdline,x + lda #'S' + sta cmdline-1 + rep $30 + + do 0 + sep $20 + ldy #$03 ;look for QUICKASM in file + ldx #0 +]l lda []zp2],y + and #$5f + cmp qasmstr,x + jne :nr1 + iny + inx + cpx #$08 + blt ]l + rep $20 + fin + + brl :run +:nr1 rep $30 + lda #qabadcmdfile + sec + brl :norun + +:run rep $30 + phb + phd + tsc + sta stack + lda #:return + sta return + jsr setvects + rep $30 +* lda #:ajsl +* brk $aa + lda :dp + tcd + lda :id + ldx #^qasmstr + ldy #qasmstr +:ajsl jsl $FFFFFF +:return php + clc + xce + phk + plb + rep $30 + pha + jsr restorevects + pla + plp + rep $30 + pld + plb + +:norun php + pha + bcs :sdown + ldy #etype + lda []zp],y + cmp #$05 + beq :nosdown + ldy #eflags + lda []zp],y + bit #$4000 + beq :nosdown +:sdown lda ]zp + ldx ]zp+2 + jsr shutdownid +:nosdown pla + plp + jcs :xit + lda #0 + brl :xit + + +:name ds 20 +:id ds 2 +:add ds 4 +:dp ds 2 + + +:internal lda cmdtbl + sta ]zp + lda cmdtbl+2 + sta ]zp+2 + lda ]cmdid + jeq :bad + cmp []zp] + blt :iok + jne :bad +:iok dec + asl + asl ;*4 + clc + adc #$02 ;to account for count word + tay + lda []zp],y + sta :ijsl+1 + iny + iny + lda []zp],y + sep $20 + sta :ijsl+3 + rep $30 + phd + phb +:ijsl jsl $FFFFFF + rep $30 + plb + pld + bcc :i0 + brl :xit +:i0 lda #0 + brl :xit + + +qagetmessbyid + dum 0 +]ptr ds 4 +]ct ds 2 +]rtl ds 6 ;these are passed on stack +]userid ds 2 +]newstack = *-6 ;must be at end of passed params +]subtype ds 4 +]message ds 2 + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + stz ]message + stz ]subtype + stz ]subtype+2 + lda ]userid + beq :notfound + psl cmdhandle + _Hlock + bcs :notfound + lda cmdhandle + sta ]ptr + lda cmdhandle+2 + sta ]ptr+2 + ldy #$02 + lda []ptr] + tax + lda []ptr],y + sta ]ptr+2 + stx ]ptr + lda numcmds + sta ]ct +]lup lda ]ct + beq :notfound + ldy #euserid + lda []ptr],y + cmp ]userid + beq :found +:next dec ]ct + lda #erecsize + clc + adc ]ptr + sta ]ptr + bcc ]lup + inc ]ptr+2 + bra ]lup +:found ldy #emesstype + lda []ptr],y + sta ]message + ldy #emesssub + lda []ptr],y + sta ]subtype + iny + iny + lda []ptr],y + sta ]subtype+2 + lda #0 + brl :xit +:notfound lda #$01 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + + + +qarun + dum 0 +]ptr ds 4 +]ct ds 2 +]rtl ds 6 ;these are passed on stack +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + psl cmdhandle + _Hlock + jcs :done + lda cmdhandle + sta ]ptr + lda cmdhandle+2 + sta ]ptr+2 + ldy #$02 + lda []ptr] + tax + lda []ptr],y + sta ]ptr+2 + stx ]ptr + lda numcmds + sta ]ct +]lup lda ]ct + beq :done + ldy #euserid + lda []ptr],y + beq :next + ldy #etype + lda []ptr],y + cmp #$05 ;application? + bne :next + ldy #eaddress + lda []ptr],y + iny + iny + ora []ptr],y + beq :next + ldy #emesstype + lda #runmess + sta []ptr],y + ldy #emesssub + lda #0 + sta []ptr],y + iny + iny + sta []ptr],y + ldy #eaddress + lda []ptr],y + sta :jsl+1 + iny + iny + lda []ptr],y + sep $20 + sta :jsl+3 + rep $30 + ldy #euserid + lda []ptr],y + tax + ldy #edp + lda []ptr],y + phd + phb + tcd + txa + ldy #0 + tyx +:jsl jsl $FFFFFF + php + clc + xce + plp + rep $30 + plb + pld + ldy #emesstype + lda #0 + sta []ptr],y +:next dec ]ct + lda #erecsize + clc + adc ]ptr + sta ]ptr + bcc ]lup + inc ]ptr+2 + bra ]lup +:done lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + + +qaevent + dum 0 +]ptr ds 4 +]ct ds 2 +]rtl ds 6 ;these are passed on stack +]taskflag ds 2 +]eventptr ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + + psl cmdhandle + _Hlock + jcs :done + lda cmdhandle + sta ]ptr + lda cmdhandle+2 + sta ]ptr+2 + ldy #$02 + lda []ptr] + tax + lda []ptr],y + sta ]ptr+2 + stx ]ptr + lda numcmds + sta ]ct +]lup lda ]ct + jeq :done + ldy #euserid + lda []ptr],y + beq :next + ldy #etype + lda []ptr],y + cmp #$05 ;application? + bne :next + ldy #eaddress + lda []ptr],y + iny + iny + ora []ptr],y + beq :next + ldy #emesstype + lda #eventmess + sta []ptr],y + ldy #emesssub + lda ]eventptr + sta []ptr],y + iny + iny + lda ]eventptr+2 + ldx ]taskflag + beq :sta + ora #$8000 +:sta sta []ptr],y + ldy #eaddress + lda []ptr],y + sta :jsl+1 + iny + iny + lda []ptr],y + sep $20 + sta :jsl+3 + rep $30 + ldy #euserid + lda []ptr],y + tax + ldy #edp + lda []ptr],y + phd + phb + tcd + txa + ldy #0 + tyx +:jsl jsl $FFFFFF + php + clc + xce + plp + rep $30 + plb + pld + php + ldy #emesstype + lda #0 + sta []ptr],y + plp + bcc :done ;was event handled? +:next dec ]ct + lda #erecsize + clc + adc ]ptr + sta ]ptr + jcc ]lup + inc ]ptr+2 + brl ]lup +:done lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + + +getcmdptr + dum 0 +]ct ds 2 +]rtl ds 3 ;these are passed on stack +]id ds 2 +]type ds 2 +]newstack = *-3 ;must be at end of passed params +]ptr ds 4 + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + stz ]ptr + stz ]ptr+2 + psl cmdhandle + _Hlock + bcs :notfound + lda cmdhandle + sta ]ptr + lda cmdhandle+2 + sta ]ptr+2 + ldy #$02 + lda []ptr] + tax + lda []ptr],y + sta ]ptr+2 + stx ]ptr + lda numcmds + sta ]ct +]lup lda ]ct + beq :notfound + ldy #eid + lda []ptr],y + cmp ]id + bne :next + ldy #etype + lda []ptr],y + cmp ]type + beq :found +:next dec ]ct + lda #erecsize + clc + adc ]ptr + sta ]ptr + bcc ]lup + inc ]ptr+2 + bra ]lup +:found lda #0 + brl :xit +:notfound lda #$01 +:xit rep $30 + tax + lda ]rtl+1 + sta ]newstack+1 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +qadispose + dum 0 +]ct ds 2 +]ptr ds 4 +]rtl ds 6 ;these are passed on stack +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb +*** + ldal cmdhandle + oral cmdhandle+2 + jeq :noerr + lda cmdhandle+2 + pha + lda cmdhandle + pha + _Hlock + bcs :xit + lda cmdhandle + sta ]ptr + lda cmdhandle+2 + sta ]ptr+2 + ldy #$02 + lda []ptr] + tax + lda []ptr],y + sta ]ptr+2 + stx ]ptr + ldal numcmds + sta ]ct +]lup lda ]ct + beq :noerr + ldy #eflags ;clear the restart bit + lda []ptr],y + and #$7fff + sta []ptr],y + lda ]ptr + ldx ]ptr+2 + jsr shutdownid + dec ]ct + lda ]ptr + clc + adc #erecsize + sta ]ptr + bcc ]lup + inc ]ptr+2 + bra ]lup +:noerr rep $30 + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + + mx %00 +qaresetvectors + ldx #vectend-vectortbl1-2 +]lup ldal vectortbl1,x + stal vectortbl,x + dex + dex ;restore default vectors + bpl ]lup + brl noerror + +qasetvector + lda 11,s + beq :badid + cmp #maxvectors+1 + bge :badid + dec + asl + asl + tax + lda 9,s + sep $20 + stal vectortbl+3,x + rep $20 + lda 7,s + stal vectortbl+1,x + lda #0 + brl :xit +:badid lda #qabadvectornum +:xit tax + lda 5,s + sta 5+6,s + lda 3,s + sta 3+6,s + lda 1,s + sta 1+6,s + pla + pla + pla + txa + cmp #$01 + rtl + +qagetvector rep $30 + lda 7,s + beq :badid + cmp #maxvectors+1 + bge :badid + dec + asl + asl + tax + ldal vectortbl+1,x + sta 9,s + ldal vectortbl+3,x + and #$ff + sta 11,s + lda #0 + bra :xit +:badid lda #qabadvectornum +:xit tax + lda 5,s + sta 5+2,s + lda 3,s + sta 3+2,s + lda 1,s + sta 1+2,s + pla + txa + cmp #$01 + rtl + +qashutdownid + dum 0 +]ct ds 2 +]ptr ds 4 +]rtl ds 6 ;these are passed on stack +]userid ds 2 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb +*** + ldal cmdhandle + oral cmdhandle+2 + jeq :noerr + lda cmdhandle+2 + pha + lda cmdhandle + pha + _Hlock + bcs :xit + lda cmdhandle + sta ]ptr + lda cmdhandle+2 + sta ]ptr+2 + ldy #$02 + lda []ptr] + tax + lda []ptr],y + sta ]ptr+2 + stx ]ptr + ldal numcmds + sta ]ct +]lup lda ]ct + beq :noerr + + ldy #euserid + lda []ptr],y + cmp ]userid + bne :next + lda ]ptr + ldx ]ptr+2 + jsr shutdownid +:next dec ]ct + lda ]ptr + clc + adc #erecsize + sta ]ptr + bcc ]lup + inc ]ptr+2 + bra ]lup +:noerr rep $30 + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + + +shutdownid php ;enters with recptr(low) in A + phd ; recptr(high) in X + rep $30 + pha + pha + tay + tsc + inc + tcd + sty 0 + stx 2 + + ldy #euserid + lda [0],y + jeq :done + ldy #eaddress + lda [0],y + iny + iny + ora [0],y + jeq :nomess + + ldy #etype + lda [0],y + cmp #$05 + jne :nomess ;pass shutdown only to APPS + ldy #eflags + lda [0],y + bit #$4000 + jeq :nomess ;if already shutdown no message. + + ldy #emesstype + lda #shutdownmess + sta [0],y + ldy #emesssub + lda #0 + sta [0],y + iny + iny + sta [0],y + ldy #eaddress + lda [0],y + sta :jsl+1 + iny + iny + lda [0],y + sep $20 + sta :jsl+3 + rep $30 + ldy #euserid + lda [0],y + tax + ldy #edp + lda [0],y + phb + phd + tcd + txa +:jsl jsl $FFFFFF + clc + xce + rep $30 + pld + plb +:nomess ldy #edphandle + lda [0],y + iny + iny + ora [0],y + beq :nodispose + ldy #edphandle+2 + lda [0],y + pha + lda #0 + sta [0],y + dey + dey + lda [0],y + pha + lda #0 + sta [0],y + _disposehandle +:nodispose ldy #euserid + ldx #0 + lda [0],y + pha + pha + ldy #eflags + lda [0],y + and #$8000 ;get restart flag + beq :tax + lda #$4000 +:tax tax +:phx phx + tll $1211 ;_UserShutdown + pla +:done lda #0 + ldy #eaddress + sta [0],y + iny + iny + sta [0],y + ldy #eflags + lda [0],y + bit #$8000 ;restartable? + bne :dp +:id0 ldy #euserid + lda #0 + sta [0],y +:dp ldy #edp + lda #0 + sta [0],y + ldy #emesstype + sta [0],y + ldy #emesssub + sta [0],y + iny + iny + sta [0],y + ldy #edp + sta [0],y + + ldy #eflags + lda [0],y + and #$4000!$FFFF + sta [0],y + + pla + pla + pld + plp + rts + +qatyp2txt + + dum 0 +]rtl ds 3 ;these are passed on stack +]rtl1 ds 3 +]typestr ds 4 +]filetype ds 2 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda ]filetype + pha + asl + clc + adc 1,s + sta 1,s + plx + lda filetypelist,x + and #$ff + xba + ora #$03 + sta []typestr] + ldy #$02 + lda filetypelist+1,x + sta []typestr],y + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +qatxt2typ + + dum 0 +]rtl ds 3 ;these are passed on stack +]rtl1 ds 3 +]typestr ds 4 +]newstack = *-6 ;must be at end of passed params +]filetype ds 2 + dend + + mx %00 + + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + stz ]filetype + sep $20 + lda []typestr] + cmp #$03 + bne :err1 + ldx #0 +]lup sep $20 + ldy #$01 + lda []typestr],y + and #$7f + cmp #'a' + blt :1 + cmp #'z'+1 + bge :1 + and #$5f +:1 cmp filetypelist,x + bne :next + iny + lda []typestr],y + and #$7f + cmp #'a' + blt :2 + cmp #'z'+1 + bge :2 + and #$5f +:2 cmp filetypelist+1,x + bne :next + iny + lda []typestr],y + and #$7f + cmp #'a' + blt :3 + cmp #'z'+1 + bge :3 + and #$5f +:3 cmp filetypelist+2,x + beq :found +:next rep $20 + inc ]filetype + txa + clc + adc #$03 + tax + cpx #256*3 + blt ]lup + brl :err1 +:found rep $30 + lda #0 + brl :xit +:err1 rep $30 + lda #qaunknowntypestr +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + + + + mx %00 +qastarttiming + ldal timerlevel + cmp #10 + bge :err + pha + pha + pha + pha + tll $0d03 ;_readtimehex + ldal timerlevel + asl + asl + asl + tax + pla + tay + and #$ff + stal timetbl,x + tya + xba + and #$ff + stal timetbl+2,x + pla + and #$ff + stal timetbl+4,x + pla + pla + ldal timerlevel + inc + stal timerlevel + brl noerror +:err lda #qatimeleverr + brl errxit + +qaendtiming ldal timerlevel + jeq :zero + dec + stal timerlevel + pha + pha + pha + pha + tll $0d03 ;_readtimehex + pla + tay + and #$ff + stal :secs + tya + xba + and #$ff + stal :mins + pla + and #$ff + stal :hours + pla + pla + ldal timerlevel + asl + asl + asl + tax + phb + phk + plb + lda :secs + sec + sbc timetbl,x + bcs :min + adc #60 + ldy :mins + bne :dmin + dec :hours + bpl :dmin1 + ldy #23 + sty :hours +:dmin1 ldy #59 + sty :mins + brl :min +:dmin dey + sty :mins +:min sta :secs + lda :mins + sec + sbc timetbl+2,x + bcs :hour + adc #60 + dec :hours + bpl :hour + ldy #23 + sty :hours +:hour sta :mins + lda :hours + sec + sbc timetbl+4,x + bcs :show + adc #24 +:show sta :hours + plb + ldal :secs + sta 11,s + ldal :mins + sta 9,s + ldal :hours + sta 7,s + brl noerror +:zero lda #0 + sta 7,s + sta 9,s + sta 11,s + brl noerror +:hours ds 2 +:mins ds 2 +:secs ds 2 + + +qainctotalerrs + ldal totalerrlev + tay +]lup cpy #0 + beq :done + dey + tya + asl + tax + ldal errtbl,x + inc + stal errtbl,x + brl ]lup +:done brl noerror + +qainittotalerrs + ldal totalerrlev + cmp #10 + bge :err + tay + asl + tax + lda #0 + stal errtbl,x + tya + inc + stal totalerrlev + brl noerror +:err lda #qatotalerrleverr + brl errxit + +qagettotalerrs + ldal totalerrlev + beq :zero + dec + stal totalerrlev + asl + tax + ldal errtbl,x + sta 7,s + brl noerror +:zero lda #0 + sta 7,s + brl noerror + +qareadtotalerrs + ldal totalerrlev + beq :zero + dec + asl + tax + ldal errtbl,x + sta 7,s + brl noerror +:zero lda #0 + sta 7,s + brl noerror + + +qasetname + dum 0 +]rtl ds 6 ;these are passed on stack +]pathptr ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + sep $30 + lda []pathptr] + cmp #127 + blt :1 + lda #127 +:1 tay +]lup lda []pathptr],y + cpy #0 + beq :sta + and #$7f +:sta sta filename,y + dey + cpy #$ff + bne ]lup +:xit rep $30 + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + lda #0 + brl errxit + +qasetobjname + dum 0 +]rtl ds 6 ;these are passed on stack +]pathptr ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + sep $30 + lda []pathptr] + cmp #127 + blt :1 + lda #127 +:1 tay +]lup lda []pathptr],y + cpy #0 + beq :sta + and #$7f +:sta sta objfilename,y + dey + cpy #$ff + bne ]lup +:xit rep $30 + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + lda #0 + brl errxit + +qaconvertpath + + dum 0 +]rtl ds 6 ;these are passed on stack +]appendflag ds 2 +]newpath ds 4 +]oldpath ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda ]appendflag + and #$FF + sta ]appendflag + lda #0 + ldy #$02 + sta []newpath] + sta []newpath],y + sep $30 + ldy #$01 +]flush lda []oldpath],y + and #$7f + cmp #' ' + blt :bad + bne :first + iny + brl ]flush +:first cmp #'.' + jeq :backup + brl :ok +:bad pea #qabadpathname + brl :error +:ok ldx #0 +:return sep $30 +:save lda []oldpath],y + and #$7f + cmp #' '+1 + blt :done + cmp #'/' + bne :store + lda #':' +:store cpx #128 + bge :inx + phy + txy + iny + sta []newpath],y + ply +:inx inx + iny + brl :save +:done cpx #64 + blt :len + ldx #64 +:len txa + sta []newpath] + lda ]appendflag + beq :plp + lda []newpath] + cmp #63 + bge :plp + tay + lda []newpath],y + and #$7f + cmp #':' + beq :plp + lda []newpath] + inc + inc + sta []newpath] + iny + lda #'.' + sta []newpath],y + iny + lda ]appendflag + and #$5f + sta []newpath],y +:plp sep $30 + lda []newpath] + beq :syn + rep $30 + lda #0 + brl :xit +:syn rep $30 + lda #qabadpathname + brl :xit + mx %11 + +:backup stz :level +:loop sty :y + iny + lda []oldpath],y + and #$7f + cmp #' '+1 + blt :pfx + cmp #'.' + bne :pfx + iny + lda []oldpath],y + and #$7f + cmp #' '+1 + blt :pfx + cmp #'/' + beq :g + cmp #':' + bne :pfx +:g inc :level + iny + sty :y + lda []oldpath],y + and #$7f + cmp #'.' + beq :loop +:pfx ldx #0 + lda :level + beq :noexp + rep $30 + lda #0 + sta []newpath] + lda ]newpath+2 + sta :pfxparm+4 + lda ]newpath + sta :pfxparm+2 + _GSOS _getprefix;:pfxparm + sep $30 + lda []newpath] + tay + beq :noexp +]lup lda []newpath],y + and #$7f + cmp #'/' + bne :store1 + lda #':' +:store1 sta []newpath],y + dey + bne ]lup + lda []newpath] + tay + lda []newpath],y + cmp #':' + bne :exp + dey +:exp cpy #0 + beq :noexp + lda []newpath],y + and #$7f + cmp #':' + bne :dex + dec :level + beq :noexp +:dex dey + brl :exp +:noexp tya + sta []newpath] + tax + ldy :y + brl :return +:error rep $30 + pla +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +:temp ds 2 +:level ds 2 +:y ds 2 +:pfxparm dw 0 + adrl 0 + + +qagetname + dum 0 +]rtl ds 6 ;these are passed on stack +]pathptr ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + sep $30 + lda filename + cmp #127 + blt :1 + lda #127 +:1 tay +]lup lda filename,y + cpy #0 + beq :sta + and #$7f +:sta sta []pathptr],y + dey + cpy #$ff + bne ]lup +:xit rep $30 + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + lda #0 + brl errxit + +qagetobjname + dum 0 +]rtl ds 6 ;these are passed on stack +]pathptr ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + sep $30 + lda objfilename + cmp #127 + blt :1 + lda #127 +:1 tay +]lup lda objfilename,y + cpy #0 + beq :sta + and #$7f +:sta sta []pathptr],y + dey + cpy #$ff + bne ]lup +:xit rep $30 + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + lda #0 + brl errxit + + mx %00 +qasetobjtype + lda 7,s + and #$ff + stal objfiletype + lda 5,s + sta 5+2,s + lda 3,s + sta 3+2,s + lda 1,s + sta 1+2,s + pla + brl noerror +qagetobjtype + ldal objfiletype + sta 7,s + brl noerror + + mx %00 +qasetwindow + lda 7,s + stal windowflag + lda 5,s + sta 5+2,s + lda 3,s + sta 3+2,s + lda 1,s + sta 1+2,s + pla + brl noerror +qagetwindow + ldal windowflag + sta 7,s + brl noerror + mx %00 +qasetshellid + lda 7,s + stal shellUid + lda 5,s + sta 5+2,s + lda 3,s + sta 3+2,s + lda 1,s + sta 1+2,s + pla + brl noerror +qagetshellid + ldal shellUid + sta 7,s + brl noerror + +qagetsymtbl + dum 0 +]rtl ds 6 ;these are passed on stack +]newstack = *-6 ;must be at end of passed params +]nextptr ds 4 +]number ds 2 +]symhandle ds 4 +]symptr ds 4 + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda symnext + sta ]nextptr + lda symnext+2 + sta ]nextptr+2 + lda symhandle + sta ]symhandle + lda symhandle+2 + sta ]symhandle+2 + lda symptr + sta ]symptr + lda symptr+2 + sta ]symptr+2 + lda symlabels + sta ]number + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + + +qasetsymtbl + dum 0 +]rtl ds 6 ;these are passed on stack +]nextptr ds 4 +]number ds 2 +]symhandle ds 4 +]symptr ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda ]nextptr + sta symnext + lda ]nextptr+2 + sta symnext+2 + lda ]symhandle + sta symhandle + lda ]symhandle+2 + sta symhandle+2 + lda ]symptr + sta symptr + lda ]symptr+2 + sta symptr+2 + lda ]number + sta symlabels + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + +QABarGraph + dum 0 +]rtl ds 6 ;these are passed on stack +]msgptr ds 4 +]percent ds 4 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + + lda #0 +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit + + +QAErrorMsg + dum 0 +]rtl ds 6 ;these are passed on stack +]errorcode ds 2 +]newstack = *-6 ;must be at end of passed params + dend + + mx %00 + tsc + sec + sbc #]rtl + tcs + phd + inc + tcd + phb + phk + plb + lda windowflag + pha + lda #-1 + sta windowflag + psl #:str + _QADrawErrString + lda ]errorcode + pha + _QAPrbytel + pea #$0d + _QADrawErrChar + pla + sta windowflag +:xit rep $30 + tax + lda ]rtl+4 + sta ]newstack+4 + lda ]rtl+2 + sta ]newstack+2 + lda ]rtl + sta ]newstack + plb + pld + tsc + clc + adc #]newstack + tcs + txa + brl errxit +:str str 'Unknown Error $' + +*------------------------------------------------------ +pchar +pechar php + rep $30 + jsr printchar + plp + clc + rtl + +pstr +pestr php + phd + rep $30 + phx + pha + tsc + inc + tcd + sep $30 + lda [0] + beq :xit + tax + ldy #$01 +]lup lda [0],y + phy + phx + jsr printchar + plx + ply + iny + dex + bne ]lup +:xit rep $30 + pla + pla + pld + plp + clc + rtl + +pestrl +pstrl php + phd + rep $30 + phx + pha + tsc + inc + tcd + + lda [0] + beq :xit + tax + ldy #$02 + sep $20 +]lup lda [0],y + phy + phx + jsr printchar + plx + ply + iny + dex + bne ]lup +:xit rep $30 + pla + pla + pld + plp + clc + rtl + +pblk +peblk php + phd + rep $30 + phx + pha + tsc + inc + tcd + sep $20 + ldy #0 +]lup lda [0],y + beq :xit + phy + jsr printchar + ply + iny + bne ]lup +:xit rep $30 + pla + pla + pld + plp + clc + rtl + +*------------------------------------------------------ +putop +putbyte +eval +relcorrect +rtl clc + rtl + +mytabtocol sep $20 + cmpl winwidth + blt :ok + pha + jsl DrawCR ;past edge, do a CR + pla + sec + sbcl winwidth +:ok cmpl cursx + blt :space + beq :space + stal cursx + rep $30 + lda #0 + clc + rtl + +:space rep $30 + brl DrawSpace ;tab over a single space + +*====================================================== +* Routines to read the keyboard in a quick/fast manner. + +mygetchar + ~GetNextEvent #%101000;#tpfx + pla + beq mygetchar ;wait for a keypress + lda #0 + stal keypress ;show no keypress waiting + sep $20 + ldal #$E0C025 ;place modifiers in hi byte + xba + ldal tpfx+2 ; & ASCII in lo + ora #$80 + rep $20 + clc + rtl + +*------------------------------------------------------ +* Clear keypress flag, coulda been set earlier! + +QAClearKey + lda #0 ;simple! + stal keypress + brl noerror + +*------------------------------------------------------ +* Allows QUICK checking to see if a key event occured + +myKeyAvail + ldal keypress ;all there is to it! + clc + rtl + +*------------------------------------------------------ +* Setup the Event Manager so we get to see keypresses +* as they happen, for quick and easy _KeyAvail checks. + +InitASK + ~GetVector #$F ;get the current keypress vector + pla + sta amod+1 + sta EMKeyVect + pla + sta EMKeyVect+2 + SEP #$20 + sta amod+3 + REP #$20 + ~SetVector #$F;#ASyncKey ;point to our vector + rts + +ASyncKey + ldal $E0C025 ;get modifiers + xba + ldal $E0C000 ; & combine into standard mod/ascii word + REP #$20 + stal keypress ;save for later test + SEP #$20 +amod jml $E10000 ; & continue w/keypress handling + +*====================================================== +* The PRINTCHAR control code handlers + +formfeed php + rep $30 + jsr clearwindow + bra h1 +home php + rep $30 +h1 lda wintop + sta cursy + lda winleft + sta cursx + jsr setcurs + plp + rts + +gotoxy php + sep $30 + lda #$01 + tsb charflag + plp + rts + +tab2 php + sep $30 + lda #%100 + tsb charflag + plp + rts + +clreoln php + sep $30 + lda cursx + tax + clc + adc winleft + tay +]lup cpx winwidth + bge :done + phy + phx + lda #$a0 + jsr storchar + plx + ply + iny + inx + bra ]lup +:done plp + rts + +clrline php + sep $30 + lda #0 + tax + clc + adc winleft + tay +]lup cpx winwidth + bge :done + phy + phx + lda #$a0 + jsr storchar + plx + ply + iny + inx + bra ]lup +:done plp + rts + + +printmult php + sep $30 + lda #$80 + tsb charflag+1 + lda #%0110_0000 + trb charflag+1 + plp + rts + +clreos rts + +savexy php + sep $30 + lda cursx + sta xtemp + lda cursy + sta ytemp + plp + rts + +savex php + sep $30 + lda cursx + sta xtemp + plp + rts + +savey php + sep $30 + lda cursy + sta ytemp + plp + rts + +restorexy php + sep $30 + lda xtemp + sta cursx + lda ytemp + sta cursy + jsr setcurs + plp + rts + +restorex php + sep $30 + lda xtemp + sta cursx + jsr setcurs + plp + rts + +restorey php + sep $30 + lda ytemp + sta cursy + jsr setcurs + plp + rts + + +linefeed php + rep $30 + lda outflag + bit #$80 ;cr out? + beq :lf + stz outflag + plp + rts +:lf inc cursy + lda cursy + cmp winbot + blt :update + beq :update + jsr scrollup + lda winbot + sta cursy +:update rep $30 + and #$7f + asl + tay + lda table,y + sta basl + plp + rts + +textcr php + rep $30 + stz cursx + lda outflag + bit #$40 ;has a LF been sent? + beq :lf + stz outflag + plp + rts + +:lf inc cursy + lda cursy + cmp winbot + blt :update + beq :update + jsr scrollup + lda winbot + sta cursy +:update rep $30 + and #$7f + asl + tay + lda table,y + sta basl + plp + rts + +nil rts + +inverse php + sep $30 + lda #$80 + trb charflag + plp + rts +normal php + sep $30 + lda #$80 + tsb charflag + plp + rts +mouseon php + sep $30 + lda #$40 + tsb charflag + plp + rts +mouseoff php + sep $30 + lda #$40 + trb charflag + plp + rts + + +setcurs php + rep $30 + lda cursy + cmp winbot + blt :ok + lda winbot + sta cursy +:ok asl + tay + lda table,y + sta basl + lda cursx + clc + adc winleft + cmp winwidth + blt :rts + beq :rts + lda cursx + clc + adc winwidth + cmp #80 + blt :s + lda #80-1 +:s sta cursx +:rts plp + rts + +ttinitscreen php + rep $30 + pha + pha + tll $0e0c ;_GetErrGlobals + pla + sta errormask + pla + sta errandmask + pha + pha + tll $0C0C ;_GetInGlobals + pla + sta inormask + pla + sta inandmask + pha + pha + tll $0D0C ;_GetOutGlobals + pla + sta outormask + pla + sta outandmask + + pea 0 + psl #0 + tll $140C ;_GetErrorDevice + pll errdevslot + pla + sta errdevtype + + pea 0 + psl #0 + tll $120C ;_GetInputDevice + pll indevslot + pla + sta indevtype + + pea 0 + psl #0 + tll $130C ;_GetErrorDevice + pll outdevslot + pla + sta outdevtype + + pea 2 ;RAM Based + psl #TTErrDevice + tll $110C + pea #$FF + pea #$80 + tll $0B0C + + pea 2 ;RAM Based + psl #TTDevice + tll $0F0C + pea #$FF + pea #$80 + tll $090C + + pea 2 ;RAM Based + psl #TTDevice + tll $100C + pea #$FF + pea #$80 + tll $0A0C + + jsr ttinitvars + jsr setcurs + jsr clearwindow + plp + rts + +ttshutdown php + rep $30 + lda indevtype + pha + psl indevslot + tll $0F0C + lda inandmask + pha + lda inormask + pha + tll $090C + + lda outdevtype + pha + psl outdevslot + tll $100C + lda outandmask + pha + lda outormask + pha + tll $0A0C + + lda errdevtype + pha + psl errdevslot + tll $110C + lda errandmask + pha + lda errormask + pha + tll $0B0C + plp + rts + +*====================================================== + put qatools.1 +*====================================================== + +filetypelist + ASC 'NON' + ASC 'BAD' + ASC '$02' + ASC '$03' + ASC 'TXT' + ASC '$05' + ASC 'BIN' + ASC '$07' + ASC '$08' + ASC '$09' + ASC '$0A' + ASC '$0B' + ASC '$0C' + ASC '$0D' + ASC '$0E' + ASC 'DIR' + ASC '$10' + ASC '$11' + ASC '$12' + ASC '$13' + ASC '$14' + ASC '$15' + ASC 'PFS' + ASC '$17' + ASC '$18' + ASC 'ADB' + ASC 'AWP' + ASC 'ASP' + ASC '$1C' + ASC '$1D' + ASC '$1E' + ASC '$1F' + ASC '$20' + ASC '$21' + ASC '$22' + ASC '$23' + ASC '$24' + ASC '$25' + ASC '$26' + ASC '$27' + ASC '$28' + ASC '$29' + ASC '$2A' + ASC '$2B' + ASC '$2C' + ASC '$2D' + ASC '$2E' + ASC '$2F' + ASC '$30' + ASC '$31' + ASC '$32' + ASC '$33' + ASC '$34' + ASC '$35' + ASC '$36' + ASC '$37' + ASC '$38' + ASC '$39' + ASC '$3A' + ASC '$3B' + ASC '$3C' + ASC '$3D' + ASC '$3E' + ASC '$3F' + ASC '$40' + ASC '$41' + ASC '$42' + ASC '$43' + ASC '$44' + ASC '$45' + ASC '$46' + ASC '$47' + ASC '$48' + ASC '$49' + ASC '$4A' + ASC '$4B' + ASC '$4C' + ASC '$4D' + ASC '$4E' + ASC '$4F' + ASC '$50' + ASC '$51' + ASC '$52' + ASC '$53' + ASC '$54' + ASC '$55' + ASC '$56' + ASC '$57' + ASC '$58' + ASC '$59' + ASC '$5A' + ASC '$5B' + ASC '$5C' + ASC '$5D' + ASC '$5E' + ASC '$5F' + ASC '$60' + ASC '$61' + ASC '$62' + ASC '$63' + ASC '$64' + ASC '$65' + ASC '$66' + ASC '$67' + ASC '$68' + ASC '$69' + ASC '$6A' + ASC '$6B' + ASC '$6C' + ASC '$6D' + ASC '$6E' + ASC '$6F' + ASC '$70' + ASC '$71' + ASC '$72' + ASC '$73' + ASC '$74' + ASC '$75' + ASC '$76' + ASC '$77' + ASC '$78' + ASC '$79' + ASC '$7A' + ASC '$7B' + ASC '$7C' + ASC '$7D' + ASC '$7E' + ASC '$7F' + ASC '$80' + ASC '$81' + ASC '$82' + ASC '$83' + ASC '$84' + ASC '$85' + ASC '$86' + ASC '$87' + ASC '$88' + ASC '$89' + ASC '$8A' + ASC '$8B' + ASC '$8C' + ASC '$8D' + ASC '$8E' + ASC '$8F' + ASC '$90' + ASC '$91' + ASC '$92' + ASC '$93' + ASC '$94' + ASC '$95' + ASC '$96' + ASC '$97' + ASC '$98' + ASC '$99' + ASC '$9A' + ASC '$9B' + ASC '$9C' + ASC '$9D' + ASC '$9E' + ASC '$9F' + ASC '$A0' + ASC '$A1' + ASC '$A2' + ASC '$A3' + ASC '$A4' + ASC '$A5' + ASC '$A6' + ASC '$A7' + ASC '$A8' + ASC '$A9' + ASC '$AA' + ASC 'BAS' + ASC 'TDF' + ASC 'DAT' + ASC '$AE' + ASC '$AF' + ASC 'SRC' + ASC 'OBJ' + ASC 'LIB' + ASC 'S16' + ASC 'RTL' + ASC 'EXE' + ASC 'PIF' + ASC 'TIF' + ASC 'NDA' + ASC 'CDA' + ASC 'TOL' + ASC 'DRV' + ASC '$BC' + ASC 'FST' + ASC '$BE' + ASC 'DOC' + ASC 'PNT' + ASC 'PIC' + ASC '$C2' + ASC '$C3' + ASC '$C4' + ASC '$C5' + ASC '$C6' + ASC '$C7' + ASC 'FON' + ASC 'FND' + ASC 'ICN' + ASC '$CB' + ASC '$CC' + ASC '$CD' + ASC '$CE' + ASC '$CF' + ASC '$D0' + ASC '$D1' + ASC '$D2' + ASC '$D3' + ASC '$D4' + ASC '$D5' + ASC '$D6' + ASC '$D7' + ASC '$D8' + ASC '$D9' + ASC '$DA' + ASC '$DB' + ASC '$DC' + ASC '$DD' + ASC '$DE' + ASC '$DF' + ASC 'TEL' + ASC '$E1' + ASC 'ATK' + ASC '$E3' + ASC '$E4' + ASC '$E5' + ASC '$E6' + ASC '$E7' + ASC '$E8' + ASC '$E9' + ASC '$EA' + ASC '$EB' + ASC '$EC' + ASC '$ED' + ASC '$EE' + ASC 'PAS' + ASC '$F0' + ASC '$F1' + ASC '$F2' + ASC '$F3' + ASC '$F4' + ASC '$F5' + ASC '$F6' + ASC '$F7' + ASC 'LNK' + ASC 'DOS' + ASC 'INT' + ASC 'IVR' + ASC 'BAS' + ASC 'VAR' + ASC 'REL' + ASC 'SYS' + +*------------------------------------------------------ +* Stuff for the end of the code segment--no disk space! + +qasmstr asc 'MERLINGS' + +DS_Start + dum * ;allocated by loader + +cmdline ds 256 +cmdhandle ds 4 ;handle to command table +cmdtbl ds 4 ;ptr to the internal cmd table +userid ds 2 ;our userid +initid ds 2 ;id that started us +started ds 2 ;<>0 if currently started up +modeflags ds 4 ;b15 = text (0), graphics (1) + ;b14 = Event Manager Active +numcmds ds 2 +compiler ds 2 +linker ds 2 +linkactive ds 2 +compileactive ds 2 +windowflag ds 2 + +** application variables + +shellUid ds 2 +quitflag ds 2 +cancelflag ds 2 +totalerrlev ds 2 +timerlevel ds 2 +parmhandle ds 4 ;handle to system preferences + +xtemp ds 2 +ytemp ds 2 + +filename ds 130 +objfilename ds 130 +objfiletype ds 2 +cmdstr ds 256 +errtbl ds 20 +timetbl ds 10*8 +symhandle ds 4 +symnext ds 4 +symptr ds 4 +symlabels ds 2 + +inandmask ds 2 +inormask ds 2 +indevtype ds 2 +indevslot ds 4 +outandmask ds 2 +outormask ds 2 +outdevtype ds 2 +outdevslot ds 4 +errandmask ds 2 +errormask ds 2 +errdevtype ds 2 +errdevslot ds 4 + +charflag ds 2 ;b7 = normal text enable +cursx ds 2 +cursy ds 2 +basl ds 2 +wintop ds 2 +winbot ds 2 +winleft ds 2 +winwidth ds 2 +fullwindow ds 2 ;neg if window not set to 80x24 + +launchflags ds 2 +launchpath ds 256 + +stack ds 2 +return ds 2 + +p16y ds 2 + +outflag ds 2 +startx ds 2 +startpos ds 2 +curpos ds 2 +tempbuff ds 256 + +hdstr ds declen+1 +hdfinalstr ds declen+2 + +EMKeyVect ds 4 +keypress ds 2 +VCount ds 2 +BlinkRate ds 2 + +wcstring ds 16 +wcftype ds 2 +wcftypemask ds 2 +wcaux ds 4 +wcauxmask ds 4 + +dhandles ds maxlevels*8 + +spfx ds 2 + ds 2 +pptr ds 4 + +tpfx ds 258 + +emactive dw 0 +keyintsactive ds 2 +keyaddress ds 2 + +DS_Size = *-CmdLine + ENT DS_Size + dend + + typ tol + + lst off + sav 2/obj/qatools.l + diff --git a/src/tools/tool.macs.s b/src/tools/tool.macs.s new file mode 100644 index 0000000..896d5ee --- /dev/null +++ b/src/tools/tool.macs.s @@ -0,0 +1,242 @@ +_NEWHANDLE MAC + Tool $902 + <<< +_DISPOSEHANDLE MAC + Tool $1002 + <<< +_GETHANDLESIZE MAC + Tool $1802 + <<< +_SETHANDLESIZE MAC + Tool $1902 + <<< +_HLOCK MAC + Tool $2002 + <<< +_HUNLOCK MAC + Tool $2202 + <<< +^READTIMEHEX MAC + PHS 4 + Tool $D03 + <<< +^READASCIITIME MAC + PHL ]1 + Tool $F03 + <<< +^GETNEXTEVENT MAC + PHA + PHWL ]1;]2 + Tool $A06 + <<< +^SETVECTOR MAC + PHWL ]1;]2 + Tool $1003 + <<< +^GETVECTOR MAC + P2SW ]1 + Tool $1103 + <<< +PHWL MAC + PHW ]1 + PHL ]2 + <<< +P2SW MAC + PHA + PHA + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +PSW MAC + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +PSL mac + if #,]1 + pea ^]1 + pea ]1 + else + if :,]1 + lda ]1+2 + pha + lda ]1 + pha + else + lda ]1+2 + pha + lda ]1 + pha + fin + fin + eom +PLL mac + if :,]1 + pla + sta ]1 + pla + sta ]1+2 + else + pla + sta ]1 + pla + sta ]1+2 + fin + eom +TOOL mac + ldx #]1 + jsl $E10000 + eom +TLL mac + ldx #]1 + jsl $E10000 + eom +JMI mac + bpl *+5 + jmp ]1 + eom +JPL mac + bmi *+5 + jmp ]1 + eom +JNE mac + beq *+5 + jmp ]1 + eom +JEQ mac + bne *+5 + jmp ]1 + eom +JGE mac + blt *+5 + jmp ]1 + eom +JLT mac + bge *+5 + jmp ]1 + eom +JCS mac + bcc *+5 + jmp ]1 + eom +JCC mac + bcs *+5 + jmp ]1 + eom +_QAGotoXY mac + utool $57 + eom +_QADRAWSTRING mac + utool $0A + <<< +_QADRAWSTR mac + utool $0A + <<< +_QAPRBYTE mac + utool $0B + <<< +_QAPRBYTEL mac + utool $0C + <<< +_QADRAWDEC mac + utool $0D + <<< +_QAKEYAVAIL mac + utool $0E + <<< +_QAGETCHAR mac + utool $0F + <<< +_QAGETCMDLINE mac + utool $1B + <<< +_QARUN mac + utool $23 + <<< +_QADRAWERRCHAR mac + utool $51 + <<< +_QADRAWERRSTRING mac + utool $52 + <<< +_QADRAWHEX mac + utool $5A + <<< +^QADRAWCSTRING mac + psl ]1 + utool $5B + <<< +_QADRAWCHARX mac + utool $5D + <<< +~QAGetWord MAC + pha + pha + psl ]1 + psw ]2 + utool $61 + <<< +_GSOS MAC + do inline + jsl prodos + dw ]1 + adrl ]2 + else + psl #]2 + pea ]1 + jsl prodosIL + fin + <<< +UTOOL mac + ldx #]1*256+toolnum + do userorsys + jsl $E10008 + else + jsl $E10000 + fin + <<< +PHL MAC + IF #=]1 + PEA ^]1 + ELSE + PHW ]1+2 + FIN + PHW ]1 + <<< +PHW MAC + IF #=]1 + PEA ]1 + ELSE + IF MX/2 + LDA ]1+1 + PHA + FIN + LDA ]1 + PHA + FIN + <<< +PHS MAC + DO ]0 + LUP ]1 + PHA + --^ + ELSE + PHA + FIN + <<< + diff --git a/src/utility/catalog b/src/utility/catalog new file mode 100644 index 0000000..1449d14 --- /dev/null +++ b/src/utility/catalog @@ -0,0 +1 @@ +K diff --git a/src/utility/delete b/src/utility/delete new file mode 100644 index 0000000..2a4c282 --- /dev/null +++ b/src/utility/delete @@ -0,0 +1,2 @@ + + diff --git a/src/utility/deletelink b/src/utility/deletelink new file mode 100644 index 0000000..ec4e0eb --- /dev/null +++ b/src/utility/deletelink @@ -0,0 +1 @@ +; diff --git a/src/utility/dump b/src/utility/dump new file mode 100644 index 0000000..ba6cf20 --- /dev/null +++ b/src/utility/dump @@ -0,0 +1 @@ +2 diff --git a/src/utility/edit b/src/utility/edit new file mode 100644 index 0000000..479a717 --- /dev/null +++ b/src/utility/edit @@ -0,0 +1 @@ +8( diff --git a/src/utility/lc b/src/utility/lc new file mode 100644 index 0000000..9befa43 --- /dev/null +++ b/src/utility/lc @@ -0,0 +1 @@ +< diff --git a/src/utility/qasmgs b/src/utility/qasmgs new file mode 100644 index 0000000..e69de29 diff --git a/src/utility/qlinkgs b/src/utility/qlinkgs new file mode 100644 index 0000000..12d5820 --- /dev/null +++ b/src/utility/qlinkgs @@ -0,0 +1 @@ +~ diff --git a/src/utility/rez b/src/utility/rez new file mode 100644 index 0000000..d3f5a12 --- /dev/null +++ b/src/utility/rez @@ -0,0 +1 @@ + diff --git a/src/utility/time b/src/utility/time new file mode 100644 index 0000000..ec5cc91 --- /dev/null +++ b/src/utility/time @@ -0,0 +1 @@ +^