diff --git a/.gitignore b/.gitignore index 054190d..6f093d5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /merlin /test_merlin /build/ +/bin/ /CMakeCache.txt /CMakeFiles/ /cmake_install.cmake @@ -13,6 +14,11 @@ *.obj *.exe *.pcode +*.omf +*.lib *.L .DS_Store /tmp/ +__pycache__/ +*.pyc +__MACOSX/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 1648d69..d485d96 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,10 @@ cmake_minimum_required(VERSION 3.16) +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type: Debug or Release" FORCE) +endif() +if(NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|Release)$") + message(FATAL_ERROR "CMAKE_BUILD_TYPE must be Debug or Release") +endif() project(qasm LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) @@ -6,60 +12,214 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") - add_compile_options(-Wall -Wextra -O2 -g) + add_compile_options(-Wall -Wextra) + set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g" CACHE STRING "Debug compile flags" FORCE) + set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG" CACHE STRING "Release compile flags" FORCE) endif() set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) +# major.minor.patch for each program. The build number is not set here. +# Debug and release each add one per build, stored in bin/...build. +set(QASM_VERSION_MAJOR 0) +set(QASM_VERSION_MINOR 1) +set(QASM_VERSION_PATCH 0) +set(QLINK_VERSION_MAJOR 0) +set(QLINK_VERSION_MINOR 1) +set(QLINK_VERSION_PATCH 0) +set(MAKEBIN_VERSION_MAJOR 0) +set(MAKEBIN_VERSION_MINOR 1) +set(MAKEBIN_VERSION_PATCH 0) +set(QOMF_VERSION_MAJOR 0) +set(QOMF_VERSION_MINOR 1) +set(QOMF_VERSION_PATCH 0) +set(QPRO_VERSION_MAJOR 0) +set(QPRO_VERSION_MINOR 1) +set(QPRO_VERSION_PATCH 0) + +set(BIN_DIR ${CMAKE_SOURCE_DIR}/bin) +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(VERSION_CONFIG debug) + set(BIN_OUT ${BIN_DIR}/debug) +else() + set(VERSION_CONFIG release) + set(BIN_OUT ${BIN_DIR}) +endif() + +# Write _version.cpp and a trigger file. The trigger is removed after +# the link, so the next build of this program and configuration increments. +function(add_version_source target name major minor patch) + set(cpp ${CMAKE_BINARY_DIR}/generated/${name}_version.cpp) + set(trigger ${CMAKE_BINARY_DIR}/generated/${name}_version.trigger) + add_custom_command( + OUTPUT ${cpp} ${trigger} + COMMAND ${CMAKE_COMMAND} + -DNAME=${name} + -DMAJOR=${major} + -DMINOR=${minor} + -DPATCH=${patch} + -DCONFIG=${VERSION_CONFIG} + -DCOUNTER=${BIN_DIR}/.${name}.${VERSION_CONFIG}.build + -DOUT=${cpp} + -DTRIGGER=${trigger} + -P ${CMAKE_SOURCE_DIR}/cmake/bump_build.cmake + DEPENDS ${CMAKE_SOURCE_DIR}/cmake/bump_build.cmake + COMMENT "Increment ${name} ${VERSION_CONFIG} build number" + VERBATIM + ) + target_sources(${target} PRIVATE ${cpp}) + set_source_files_properties(${cpp} PROPERTIES GENERATED TRUE) + set(${name}_VERSION_TRIGGER ${trigger} PARENT_SCOPE) +endfunction() + +# Copy the linked executable into the untracked bin/ directory. +# Release lands in bin/. Debug lands in bin/debug/. +function(copy_to_bin target) + cmake_parse_arguments(ARG "" "TRIGGER" "" ${ARGN}) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory ${BIN_OUT} + COMMAND ${CMAKE_COMMAND} -E copy $ ${BIN_OUT}/$ + VERBATIM + ) + if(ARG_TRIGGER) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E rm -f ${ARG_TRIGGER} + VERBATIM + ) + endif() +endfunction() + set(QASM_LIB_SOURCES - src/util.cpp - src/parse.cpp - src/expr.cpp - src/opcode.cpp - src/assemble.cpp - src/compile.cpp - src/front_merlin.cpp - src/front_orca.cpp - src/front_lisa.cpp - src/front_ca65.cpp + src/qasm/util.cpp + src/qasm/parse.cpp + src/qasm/expr.cpp + src/qasm/opcode.cpp + src/qasm/assemble.cpp + src/qasm/compile.cpp + src/qasm/front_merlin.cpp + src/qasm/front_orca.cpp + src/qasm/front_lisa.cpp + src/qasm/front_ca65.cpp + src/omf/omf.cpp ) add_library(qasm_lib STATIC ${QASM_LIB_SOURCES}) -target_include_directories(qasm_lib PUBLIC src) +target_include_directories(qasm_lib PUBLIC src/qasm PRIVATE src/omf) target_link_libraries(qasm_lib PUBLIC Threads::Threads) -add_executable(qasm src/main.cpp) +add_executable(qasm src/qasm/main.cpp) target_link_libraries(qasm PRIVATE qasm_lib) +add_version_source(qasm qasm ${QASM_VERSION_MAJOR} ${QASM_VERSION_MINOR} ${QASM_VERSION_PATCH}) +copy_to_bin(qasm TRIGGER ${qasm_VERSION_TRIGGER}) + +add_executable(qlink src/qlink/qlink.cpp src/qlink/link.cpp src/omf/omf.cpp) +target_include_directories(qlink PRIVATE src/qlink src/omf) +add_version_source(qlink qlink ${QLINK_VERSION_MAJOR} ${QLINK_VERSION_MINOR} ${QLINK_VERSION_PATCH}) +copy_to_bin(qlink TRIGGER ${qlink_VERSION_TRIGGER}) add_executable(test_qasm test/test_qasm.cpp) target_link_libraries(test_qasm PRIVATE qasm_lib) +copy_to_bin(test_qasm) + +add_executable(test_qlink test/test_qlink.cpp src/qlink/link.cpp src/omf/omf.cpp) +target_include_directories(test_qlink PRIVATE src/qlink src/omf) +copy_to_bin(test_qlink) + +add_executable(makeBin src/makebin/main.cpp src/makebin/makebin.cpp src/omf/omf.cpp) +target_include_directories(makeBin PRIVATE src/makebin src/omf) +add_version_source(makeBin makeBin ${MAKEBIN_VERSION_MAJOR} ${MAKEBIN_VERSION_MINOR} ${MAKEBIN_VERSION_PATCH}) +copy_to_bin(makeBin TRIGGER ${makeBin_VERSION_TRIGGER}) + +add_executable(test_makebin test/test_makebin.cpp src/makebin/makebin.cpp src/qlink/link.cpp src/omf/omf.cpp) +target_include_directories(test_makebin PRIVATE src/makebin src/qlink src/omf) +copy_to_bin(test_makebin) + +add_executable(qomf src/qomf/main.cpp src/qomf/qomf.cpp) +target_include_directories(qomf PRIVATE src/qomf) +add_version_source(qomf qomf ${QOMF_VERSION_MAJOR} ${QOMF_VERSION_MINOR} ${QOMF_VERSION_PATCH}) +copy_to_bin(qomf TRIGGER ${qomf_VERSION_TRIGGER}) + +add_executable(test_qomf test/test_qomf.cpp src/qomf/qomf.cpp src/qlink/link.cpp src/omf/omf.cpp) +target_include_directories(test_qomf PRIVATE src/qomf src/qlink src/omf) +copy_to_bin(test_qomf) + +add_executable(qpro src/qpro/main.cpp src/qpro/qpro.cpp) +target_include_directories(qpro PRIVATE src/qpro) +add_version_source(qpro qpro ${QPRO_VERSION_MAJOR} ${QPRO_VERSION_MINOR} ${QPRO_VERSION_PATCH}) +copy_to_bin(qpro TRIGGER ${qpro_VERSION_TRIGGER}) + +add_executable(test_qpro test/test_qpro.cpp src/qpro/qpro.cpp) +target_include_directories(test_qpro PRIVATE src/qpro) +copy_to_bin(test_qpro) # Unit tests and the assembler open PUT/USE paths from the repository root. set(QASM_ROOT ${CMAKE_SOURCE_DIR}) -# One program, five syntaxes. The objects are compared after assembly. +# One program, six syntaxes. The objects are compared after assembly. set(COVERAGE_SOURCES test/fixtures/coverage-merlin.s test/fixtures/coverage-merlin32.s test/fixtures/coverage-orca.s + test/fixtures/coverage-apw.s test/fixtures/coverage-lisa.s test/fixtures/coverage-ca65.s ) +# Two relocatable sections. CODE calls and addresses DATA, and DATA calls +# and addresses CODE. Each syntax assembles to the same bytes. +set(REL_CODE_SOURCES + test/fixtures/rel-code-merlin.s + test/fixtures/rel-code-merlin32.s + test/fixtures/rel-code-orca.s + test/fixtures/rel-code-apw.s + test/fixtures/rel-code-lisa.s + test/fixtures/rel-code-ca65.s +) +set(REL_DATA_SOURCES + test/fixtures/rel-data-merlin.s + test/fixtures/rel-data-merlin32.s + test/fixtures/rel-data-orca.s + test/fixtures/rel-data-apw.s + test/fixtures/rel-data-lisa.s + test/fixtures/rel-data-ca65.s +) + set(COVERAGE_COMPARE COMMAND ${CMAKE_COMMAND} -E compare_files test/fixtures/coverage-merlin.bin test/fixtures/coverage-merlin32.bin COMMAND ${CMAKE_COMMAND} -E compare_files test/fixtures/coverage-merlin.bin test/fixtures/coverage-orca.bin + COMMAND ${CMAKE_COMMAND} -E compare_files + test/fixtures/coverage-merlin.bin test/fixtures/coverage-apw.bin COMMAND ${CMAKE_COMMAND} -E compare_files test/fixtures/coverage-merlin.bin test/fixtures/coverage-lisa.bin COMMAND ${CMAKE_COMMAND} -E compare_files test/fixtures/coverage-merlin.bin test/fixtures/coverage-ca65.bin + COMMAND ${CMAKE_COMMAND} -E compare_files + test/fixtures/rel-code-merlin.bin test/fixtures/rel-code-merlin32.bin + COMMAND ${CMAKE_COMMAND} -E compare_files + test/fixtures/rel-code-merlin.bin test/fixtures/rel-code-orca.bin + COMMAND ${CMAKE_COMMAND} -E compare_files + test/fixtures/rel-code-merlin.bin test/fixtures/rel-code-apw.bin + COMMAND ${CMAKE_COMMAND} -E compare_files + test/fixtures/rel-code-merlin.bin test/fixtures/rel-code-lisa.bin + COMMAND ${CMAKE_COMMAND} -E compare_files + test/fixtures/rel-code-merlin.bin test/fixtures/rel-code-ca65.bin + COMMAND ${CMAKE_COMMAND} -E compare_files + test/fixtures/rel-data-merlin.bin test/fixtures/rel-data-merlin32.bin + COMMAND ${CMAKE_COMMAND} -E compare_files + test/fixtures/rel-data-merlin.bin test/fixtures/rel-data-orca.bin + COMMAND ${CMAKE_COMMAND} -E compare_files + test/fixtures/rel-data-merlin.bin test/fixtures/rel-data-apw.bin + COMMAND ${CMAKE_COMMAND} -E compare_files + test/fixtures/rel-data-merlin.bin test/fixtures/rel-data-lisa.bin + COMMAND ${CMAKE_COMMAND} -E compare_files + test/fixtures/rel-data-merlin.bin test/fixtures/rel-data-ca65.bin ) add_custom_target(fixtures - COMMAND $ ${COVERAGE_SOURCES} + COMMAND $ ${COVERAGE_SOURCES} ${REL_CODE_SOURCES} ${REL_DATA_SOURCES} ${COVERAGE_COMPARE} DEPENDS qasm WORKING_DIRECTORY ${QASM_ROOT} @@ -70,12 +230,16 @@ add_custom_target(fixtures add_custom_target(test COMMAND $ COMMAND $ test/fixtures/hello.s test/test.s - COMMAND $ ${COVERAGE_SOURCES} + COMMAND $ ${COVERAGE_SOURCES} ${REL_CODE_SOURCES} ${REL_DATA_SOURCES} ${COVERAGE_COMPARE} - DEPENDS qasm test_qasm + COMMAND $ + COMMAND ${CMAKE_COMMAND} -E env MAKEBIN=$ $ + COMMAND ${CMAKE_COMMAND} -E env QOMF=$ $ + COMMAND ${CMAKE_COMMAND} -E env QPRO=$ $ + DEPENDS qasm test_qasm test_qlink test_makebin test_qomf test_qpro qlink makeBin qomf qpro WORKING_DIRECTORY ${QASM_ROOT} USES_TERMINAL - COMMENT "Run unit tests, sample assembly, and coverage fixtures" + COMMENT "Run unit tests, sample assembly, coverage fixtures, and the linker" ) set(QASM_CLEAN_FILES @@ -86,12 +250,142 @@ set(QASM_CLEAN_FILES ${QASM_ROOT}/test/test.lst ${QASM_ROOT}/test/test.pcode ) -foreach(src ${COVERAGE_SOURCES}) +foreach(src ${COVERAGE_SOURCES} ${REL_CODE_SOURCES} ${REL_DATA_SOURCES}) string(REGEX REPLACE "\\.s$" "" stem "${src}") list(APPEND QASM_CLEAN_FILES ${QASM_ROOT}/${stem}.bin ${QASM_ROOT}/${stem}.lst ${QASM_ROOT}/${stem}.pcode + ${QASM_ROOT}/${stem}.o ) endforeach() +foreach(out apple.omf apple-orca.omf apple-ca65.omf apple-apw.omf prog.omf + proglib.omf gap.omf merged.omf runtime.lib bad.omf) + list(APPEND QASM_CLEAN_FILES ${QASM_ROOT}/test/fixtures/${out}) +endforeach() +# ProDOS 8 disk that boots BASIC.SYSTEM. Not part of `all` or `test`. +# Intermediates stay in build/boot. The image and the two SYS files land in bin/. +# `make boot` deletes those and builds the boot.2mg target. +set(BOOT_DIR ${QASM_ROOT}/build/boot) +set(BOOT_BIN ${QASM_ROOT}/bin) +set(P8_MLI ${QASM_ROOT}/IIGS.601.SRC/GS.OS/P8/MliSrc.aii) +set(P8_RAM ${QASM_ROOT}/IIGS.601.SRC/GS.OS/P8/P8.Drivers/Ram.n) +set(P8_CLOCK ${QASM_ROOT}/IIGS.601.SRC/GS.OS/P8/P8.Drivers/CClock.n) +set(BS_DIR ${QASM_ROOT}/IIGS.601.SRC/BASIC.SYSTEM) +set(BOOT_PACK ${QASM_ROOT}/boot/pack.py) + +add_custom_command( + OUTPUT ${BOOT_DIR}/mli.lst ${BOOT_DIR}/mli.bin + COMMAND ${CMAKE_COMMAND} -E make_directory ${BOOT_DIR} + COMMAND $ --syntax apw -I ${QASM_ROOT}/boot/inc + -l ${BOOT_DIR}/mli.lst -o ${BOOT_DIR}/mli.bin ${P8_MLI} + DEPENDS qasm ${P8_MLI} + ${QASM_ROOT}/boot/inc/e16.memory ${QASM_ROOT}/boot/inc/M16.UTIL + WORKING_DIRECTORY ${QASM_ROOT} + COMMENT "Assemble the ProDOS 8 kernel" + VERBATIM +) + +add_custom_command( + OUTPUT ${BOOT_DIR}/ram.lst ${BOOT_DIR}/ram.bin + COMMAND ${CMAKE_COMMAND} -E make_directory ${BOOT_DIR} + COMMAND $ --syntax apw + -l ${BOOT_DIR}/ram.lst -o ${BOOT_DIR}/ram.bin ${P8_RAM} + DEPENDS qasm ${P8_RAM} + WORKING_DIRECTORY ${QASM_ROOT} + COMMENT "Assemble the ProDOS 8 RAM driver" + VERBATIM +) + +add_custom_command( + OUTPUT ${BOOT_DIR}/clock.lst ${BOOT_DIR}/clock.bin + COMMAND ${CMAKE_COMMAND} -E make_directory ${BOOT_DIR} + COMMAND $ --syntax apw + -l ${BOOT_DIR}/clock.lst -o ${BOOT_DIR}/clock.bin ${P8_CLOCK} + DEPENDS qasm ${P8_CLOCK} + WORKING_DIRECTORY ${QASM_ROOT} + COMMENT "Assemble the ProDOS 8 GS clock driver" + VERBATIM +) + +add_custom_command( + OUTPUT ${BOOT_BIN}/PRODOS + COMMAND ${CMAKE_COMMAND} -E make_directory ${BOOT_BIN} + COMMAND python3 ${BOOT_PACK} prodos ${BOOT_BIN}/PRODOS + ${BOOT_DIR}/mli.lst ${BOOT_DIR}/ram.lst ${BOOT_DIR}/clock.lst + DEPENDS ${BOOT_PACK} ${BOOT_DIR}/mli.lst ${BOOT_DIR}/ram.lst ${BOOT_DIR}/clock.lst + WORKING_DIRECTORY ${QASM_ROOT} + COMMENT "Pack PRODOS" + VERBATIM +) + +add_custom_command( + OUTPUT ${BOOT_DIR}/basic.s + COMMAND ${CMAKE_COMMAND} -E make_directory ${BOOT_DIR} + COMMAND python3 ${BOOT_PACK} join-basic -o ${BOOT_DIR}/basic.s + ${BS_DIR}/LOADER ${BS_DIR}/MAIN ${BS_DIR}/GLOBALS + DEPENDS ${BOOT_PACK} ${BS_DIR}/LOADER ${BS_DIR}/MAIN ${BS_DIR}/GLOBALS + WORKING_DIRECTORY ${QASM_ROOT} + COMMENT "Join BASIC.SYSTEM" + VERBATIM +) + +add_custom_command( + OUTPUT ${BOOT_DIR}/basic.lst ${BOOT_DIR}/basic.bin + COMMAND $ --syntax apw -I ${BS_DIR} + -l ${BOOT_DIR}/basic.lst -o ${BOOT_DIR}/basic.bin ${BOOT_DIR}/basic.s + DEPENDS qasm ${BOOT_DIR}/basic.s ${BS_DIR}/EQUATES + WORKING_DIRECTORY ${QASM_ROOT} + COMMENT "Assemble BASIC.SYSTEM" + VERBATIM +) + +add_custom_command( + OUTPUT ${BOOT_BIN}/BASIC.SYSTEM + COMMAND ${CMAKE_COMMAND} -E make_directory ${BOOT_BIN} + COMMAND python3 ${BOOT_PACK} basic ${BOOT_BIN}/BASIC.SYSTEM ${BOOT_DIR}/basic.lst + --oracle ${BS_DIR}/BASIC.SYSTEM + DEPENDS ${BOOT_PACK} ${BOOT_DIR}/basic.lst ${BS_DIR}/BASIC.SYSTEM + WORKING_DIRECTORY ${QASM_ROOT} + COMMENT "Pack BASIC.SYSTEM" + VERBATIM +) + +add_custom_command( + OUTPUT ${BOOT_DIR}/p8boot.lst ${BOOT_DIR}/p8boot.bin + COMMAND ${CMAKE_COMMAND} -E make_directory ${BOOT_DIR} + COMMAND $ --syntax merlin + -l ${BOOT_DIR}/p8boot.lst -o ${BOOT_DIR}/p8boot.bin + ${QASM_ROOT}/boot/p8boot.s + DEPENDS qasm ${QASM_ROOT}/boot/p8boot.s + WORKING_DIRECTORY ${QASM_ROOT} + COMMENT "Assemble the ProDOS 8 boot block" + VERBATIM +) + +add_custom_command( + OUTPUT ${BOOT_BIN}/boot.2mg + COMMAND ${CMAKE_COMMAND} -E rm -f ${BOOT_DIR}/image.2mg ${BOOT_BIN}/boot.2mg + COMMAND $ create ${BOOT_DIR}/image.2mg -name BASIC -size 800k + COMMAND $ boot ${BOOT_DIR}/image.2mg ${BOOT_DIR}/p8boot.bin + COMMAND $ add ${BOOT_DIR}/image.2mg PRODOS ${BOOT_BIN}/PRODOS -t FF -a 0000 + COMMAND $ add ${BOOT_DIR}/image.2mg BASIC.SYSTEM ${BOOT_BIN}/BASIC.SYSTEM -t FF -a 2000 + COMMAND python3 ${BOOT_PACK} check ${BOOT_DIR}/image.2mg + ${BOOT_BIN}/PRODOS ${BOOT_BIN}/BASIC.SYSTEM + COMMAND ${CMAKE_COMMAND} -E copy ${BOOT_DIR}/image.2mg ${BOOT_BIN}/boot.2mg + DEPENDS qpro ${BOOT_PACK} ${BOOT_BIN}/PRODOS ${BOOT_BIN}/BASIC.SYSTEM ${BOOT_DIR}/p8boot.bin + WORKING_DIRECTORY ${QASM_ROOT} + COMMENT "Build boot.2mg" + VERBATIM +) + +add_custom_target(prodos DEPENDS ${BOOT_BIN}/PRODOS) +add_custom_target(basic.system DEPENDS ${BOOT_BIN}/BASIC.SYSTEM) +add_custom_target(boot.2mg DEPENDS ${BOOT_BIN}/boot.2mg) + +list(APPEND QASM_CLEAN_FILES + ${BOOT_BIN}/PRODOS + ${BOOT_BIN}/BASIC.SYSTEM + ${BOOT_BIN}/boot.2mg +) set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_CLEAN_FILES ${QASM_CLEAN_FILES}) diff --git a/IIGS.601.SRC/A.U.G/ADU/BuildADU b/IIGS.601.SRC/A.U.G/ADU/BuildADU new file mode 100644 index 0000000..3abad8e --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/BuildADU @@ -0,0 +1 @@ +tmlpascal initintfdata.pii asmiigs initintfdata.pii.aii tmlpascal InitIntfProc.pii asmiigs InitIntfProc.pii.aii tmlpascal InitIntfPDOS.pii asmiigs InitIntfPDOS.pii.aii tmlpascal ListMgr.pii asmiigs ListMgr.pii.aii tmlpascal Globals.pii asmiigs Globals.pii.aii tmlpascal Utils.pii asmiigs Utils.pii.aii tmlpascal Guts.pii asmiigs Guts.pii.aii tmlpascal Dialog.pii asmiigs Dialog.pii.aii tmlpascal Menu.pii asmiigs Menu.pii.aii tmlpascal Event.pii asmiigs Event.pii.aii tmlpascal Init.pii asmiigs Init.pii.aii asmiigs OS.aii asmiigs Data.aii linkiigs -l -s >map ¶ -lseg Darryl:$1000 ¶ Init.pii.aii.obj ¶ Utils.pii.aii.obj ¶ Guts.pii.aii.obj ¶ Dialog.pii.aii.obj ¶ Menu.pii.aii.obj ¶ Event.pii.aii.obj ¶ OS.aii.obj ¶ Globals.pii.aii.obj ¶ Data.aii.obj ¶ "{PIIGSLibrary}PIIGSRuntime.obj" ¶ -lib "{PIIGSLibrary}PIIGSRuntime.obj" ¶ -at $db03 ¶ -o ADV.DISK.UTIL ### Copy file to a IIGS disk DuplicateIIGS -y -mac ADV.DISK.UTIL : \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/Changes & To Do b/IIGS.601.SRC/A.U.G/ADU/Changes & To Do new file mode 100644 index 0000000..da91655 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/Changes & To Do @@ -0,0 +1 @@ +=========================== CHANGES FOR 1.1D2 ========================== ¥ Changed version # to 1.1d5 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/Data.aii b/IIGS.601.SRC/A.U.G/ADU/Data.aii new file mode 100644 index 0000000..22dbc00 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/Data.aii @@ -0,0 +1 @@ +;################################################################ ;# # ;# File: Data.Asm from IIGS Disk Initializer # ;# # ;#--------------------------------------------------------------# ;# # ;# Description: This file has all the global data used by # ;# the IIGS disk initializer # ;# # ;#--------------------------------------------------------------# ;# # ;# Author: Darryl Lovato # ;# # ;#--------------------------------------------------------------# ;# # ;# Copyright: 1987,1988 by Apple Computer Inc. # ;# All rights reserved. # ;# # ;#--------------------------------------------------------------# ;# # ;# Modification History: # ;# # ;# Who When The Change # ;# --- ------ ------------------------------------- # ;# SR 12/7/87 Created v.1 - erase & init only # ;# DGL 1/29/88 Rewrote everything - cut size in half! # ;# DGL 5/9/88 Finished Adding Partition Support # ;# and other features... far too many to # ;# list here... # ;# DGL 6/1/88 Alpha! # ;# DGL 6/13/88 Alpha 2 # ;# DGL 6/24/88 Alpha 3 # ;# DGL 7/1/88 Beta 1 # ;# DGL 7/13/88 Beta 2 # ;# DGL 7/20/88 Beta 3 # ;# DGL 7/27/88 Beta 4 # ;# DGL 8/1/88 Beta 5 # ;# DGL 8/8/88 Beta 6 # ;# DGL 8/15/88 Final! # ;# # ;################################################################ STRING ASIS ;BLANKS OFF BLANKS ON MACHINE M65816 LONGA on LONGI on ;################################################################ ;# Imported addresses # ;################################################################ IMPORT AboutItem2,AboutItem3,AboutItem5,AboutItem6 IMPORT AboutItem7,AboutItem8,AboutItem9,DOS,DiskItem1 IMPORT DiskItem2,DiskItem3,InfoAvail,InfoDevName IMPORT InfoFileSys,InfoItem1,InfoItem10,InfoItem11 IMPORT InfoItem12,InfoItem2,InfoItem3,InfoItem4 IMPORT InfoItem5,InfoItem6,InfoItem7,InfoItem8 IMPORT InfoItem9,InfoParts,InfoUsed,InfoVolume IMPORT InitItem10,InitItem11,InitItem2,Item3Str IMPORT L,PartDel,PartInit,PartItem2,PartItem3,PartItem4 IMPORT PartItem6,PartItem7,PartItem8,PartItem9,PartNew IMPORT ScrollAction,ScrollCTbl,WarningCancel,WarningItem1 IMPORT WarningItem2,WarningOK,emptystr,miscstr,miscstr1 EXPORT Data Data PROC ;################################################################ ;# string macro # ;################################################################ MACRO str &string lclc &sset &sset SETC &SETTING('STRING') STRING PASCAL dc.B &string STRING &sset MEND ;################################################################ ;# version macro # ;################################################################ MACRO &lab Version lclc &sset &sset SETC &SETTING('STRING') STRING ASIS &lab DC.B '1.2' ;maintain version string here and in "adu.rii" STRING &sset MEND ;################################################################ ;# Table for getting the File System ID String # ;################################################################ EXPORT FileSysStrTbl FileSysStrTbl DC.L FS1 DC.L FS2 DC.L FS3 DC.L FS4 DC.L FS5 DC.L FS6 DC.L FS7 DC.L FS8 DC.L FS9 DC.L FSA DC.L FSB DC.L FSC EXPORT unknownptr unknownptr DC.L unknown FS1 str 'ProDOS' FS2 str 'DOS 3.3' FS3 str 'DOS 3.1, 3.2' FS4 str 'Apple II Pascal' FS5 str 'Macintosh MFS' FS6 str 'HFS' FS7 str 'LISA' FS8 str 'Apple CP/M' FS9 str 'Character FST' FSA str 'MS/DOS' FSB str 'High Sierra' FSC str 'Apple File Server' unknown str 'Unknown File System' EXPORT drvrProcessor drvrProcessor ; Table of pointer to processor ID strings for ; drver partition entries in partition map dc.l drvrStr1 dc.l drvrStr2 dc.l drvrStr3 dc.l drvrStr4 STRING PASCAL drvrStr1 dc.b '68000' drvrStr2 dc.b '68XXX' drvrStr3 dc.b '68XXX' drvrStr4 dc.b '65XXX' STRING ASIS EXPORT OpenPBlk OpenPBlk ; Param block to open files dc.w $000C ;pcount through eof ds.w 1 ;ref num ds.l 1 ;path pointer dc.w $0001 ;req access = read-only dc.w $0000 ;res num = data fork ds.w 1 ;return access ds.w 1 ;returned filetype ds.l 1 ;returned auxtype ds.w 1 ;returned storage type ds.b 8 ;create time/date ds.b 8 ;mod time/date dc.l $00000000 ;option list ptr ds.l 1 ;eof EXPORT drvrPath drvrPath ;expected path of generic boot driver file dc.w @end-@start @start dc.b '*:SYSTEM:DRIVERS:GenericMacSCSI' @end EXPORT ReadPBlk ReadPBlk ; Param block to read from file dc.w $0004 ;pcount through transfer count ds.w 1 ;ref num ds.l 1 ;data buffer ds.l 1 ;req count ds.l 1 ;transfer count EXPORT ClosePBlk ClosePBlk ; Param block to close file dc.w $0001 ;pcount ds.w 1 ;ref num ;################################################################ ;# INFO Dialog Template # ;################################################################ EXPORT InfoDITL InfoDITL DC.W 30,110,142,530 ; rect DC.W $FF ; visible DC.L $1002 ; ref con DC.L InfoItem1 ; ptr to the first item DC.L InfoItem2 ; ptr to the 2nd item DC.L InfoItem3 ; ptr to the 3rd item DC.L InfoItem4 ; ptr to the 4th item DC.L InfoItem5 ; ptr to the 5th item DC.L InfoItem6 ; ptr to the 6th item DC.L InfoItem7 ; ptr to the 7th item DC.L InfoItem8 ; ptr to the 8th item DC.L InfoItem9 ; ptr to the 9th item DC.L InfoItem10 ; ptr to the 10th item DC.L InfoItem11 ; ptr to the 11th item DC.L InfoItem12 ; ptr to the 12th item DC.L 0 ; terminator InfoItem1 DC.W 1 ; item 1 DC.W 90,20,104,100 ; rect DC.W 10 ; button item constant DC.L WarningOK ; address of our first global str DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color InfoItem2 DC.W 2 ; item 2 DC.W 5,125,15,220 ; rect DC.W 15 ; stat text item constant DC.L InfoVolume ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color InfoVolume str 'Disk:' InfoItem3 DC.W 3 ; item 3 DC.W 15,125,25,220 ; rect DC.W 15 ; stat text item constant DC.L InfoUsed ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color InfoUsed str 'Used:' InfoItem4 DC.W 4 ; item 4 DC.W 25,125,35,220 ; rect DC.W 15 ; stat text item constant DC.L InfoAvail ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color InfoAvail str 'Available:' InfoItem5 DC.W 5 ; item 5 DC.W 35,125,45,220 ; rect DC.W 15 ; stat text item constant DC.L InfoFileSys ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color InfoFileSys str 'File system:' InfoItem6 DC.W 6 ; item 6 DC.W 45,125,55,220 ; rect DC.W 15 ; stat text item constant DC.L InfoDevName ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color InfoDevName str 'Device name:' InfoItem7 DC.W 7 ; item 7 DC.W 55,125,65,220 ; rect DC.W 15 ; stat text item constant DC.L InfoParts ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color InfoParts str 'Partitions:' ; these items get calculated InfoItem8 DC.W 8 ; item 8 DC.W 5,220,15,620 ; rect DC.W 15 ; stat text item constant DC.L emptystr ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color emptystr str '' InfoItem9 DC.W 9 ; item 9 DC.W 15,220,25,620 ; rect DC.W 15 ; stat text item constant DC.L emptystr ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color InfoItem10 DC.W 10 ; item 10 DC.W 25,220,35,620 ; rect DC.W 15 ; stat text item constant DC.L emptystr ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color InfoItem11 DC.W 11 ; item 11 DC.W 35,220,45,620 ; rect DC.W 15 ; stat text item constant DC.L emptystr ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color InfoItem12 DC.W 12 ; item 12 DC.W 45,220,55,620 ; rect DC.W 15 ; stat text item constant DC.L emptystr ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color ;################################################################ ;# Tool Table for load tools # ;################################################################ EXPORT ToolRec ToolRec dc.w 0 ;flags dc.w $C080 ;QuickDraw SCB & flags dc.w 0 ;return res file ID dc.l 0 ;return handle to tools dp DC.W 12 ;# of tool entries following DC.W 1,0 ;Tool Locator DC.W 4,0 ;QuickDraw DC.W 5,0 ;Desk Manager DC.W 6,0 ;Event Manager DC.W 14,0 ;Window Manager DC.W 15,0 ;Menu Manager DC.W 16,0 ;Control Manager DC.W 18,0 ;QD Aux DC.W 20,0 ;LineEdit DC.W 21,0 ;Dialog Manager DC.W 22,0 ;Scrap Manager DC.W 28,0 ;List Manager ;################################################################ ;# Apple Menu # ;################################################################ EXPORT AppleMenuStr AppleMenuStr DC.B '>>@\N300X' DC.B 0 DC.B '==About Adv. Disk Util...\N301' DC.B 0 DC.B '==-\N408D' DC.B 0 DC.B '.' ;################################################################ ;# File Menu # ;################################################################ EXPORT FileMenuStr FileMenuStr DC.B '>> File \N400' DC.B 0 DC.B '==Close\N255*Ww' DC.B 0 DC.B '==-\N401D' DC.B 0 ; Init/Erase item removed 3/6/91 by Monte Benaresh ;DC.B '==Initialize/Erase\N401*Ii' ;DC.B 0 ;DC.B '==-\N408D' ;DC.B 0 DC.B '==Quit\N409*Qq' DC.B 0 DC.B '.' ;################################################################ ;# Edit Menu # ;################################################################ EXPORT EditMenuStr EditMenuStr DC.B '>> Edit \N900D' DC.B 0 DC.B '==Undo\N950*Zz' DC.B 0 DC.B '==-\N901D' DC.B 0 DC.B '==Cut\N951*Xx' DC.B 0 DC.B '==Copy\N952*Cc' DC.B 0 DC.B '==Paste\N953*Vv' DC.B 0 DC.B '==Clear\N954' DC.B 0 ;################################################################ ;# Partition Dialog Template # ;################################################################ EXPORT PartDITL PartDITL DC.W 28,56,186,584 ; rect DC.W $FF ; visible DC.L $1006 ; ref con DC.L PartItem2 ; Item 2 DC.L PartItem3 ; Item 3 DC.L PartItem4 ; Item 4 DC.L PartItem5 ; Item 5 DC.L PartItem6 ; Item 6 DC.L PartItem7 ; Item 7 DC.L PartItem8 ; Item 8 DC.L PartItem9 ; Item 9 DC.L 0 ; nil terminator PartItem9 DC.W 9 ; item # DC.W 136,20,149,130 ; rect DC.W $000A ; button item constant DC.L PartInit ; address of our str DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color PartInit str 'Partition' ; Init string PartItem2 DC.W 2 ; item 2 DC.W 121,20,134,130 ; rect DC.W $000A ; statictext item constant DC.L WarningCancel ; address of our first global str DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color PartItem3 DC.W 3 ; item 3 DC.W 67,20,80,226 ; rect DC.W $0011 ; LineEdit item constant DC.L Item3Str ; nil str DC.W 15 ; item value DC.W 0 ; item flag DC.L 0 ; item color item3Str str ' ' ; place holder PartItem4 ; partitions size DC.W 4 ; item 4 EXPORT InvRect InvRect ; DC.W 93,143,149,175 ; rect DC.W $000D ; scroll bar item constant DC.L ScrollAction ; address of our scroll bar proc DC.W 0 ; item value DC.W 3 ; item flag DC.L ScrollCTbl ; item color ScrollCTbl DC.W $0000 ; bar outline = black DC.W $00F0 ; unhilited arrow = white back; black front DC.W $00F0 ; hilited arrow = black fore, white back DC.W $00F0 ; arrow background = white EXPORT ScrollColor ScrollColor DC.W $00DD ; unhilited thumb = color of ctl EXPORT ScrollColor1 ScrollColor1 DC.W $00DD ; hilited thumb = color of ctl DC.W $01F0 ; pageRgn = dithered blue DC.W $00F0 ; inactive control = white EXPORT scrollArray scrollArray DC.W $0000,$DDDD,$EEEE,$BBBB,$7777,$1111,$2222 DC.W $3333,$4444,$5555,$6666,$8888,$9999,$AAAA PartItem6 DC.W 6 ; item 6 DC.W 85,20,98,130 ; rect DC.W $000A ; button item constant DC.L PartNew ; address of our str DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color PartNew str 'New' ; Init string PartItem7 DC.W 7 ; item 7 DC.W 100,20,113,130 ; rect DC.W $000A ; button item constant DC.L PartDel ; address of our str DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color PartDel str 'Delete' ; Init string PartItem8 DC.W 8 ; item 4 DC.W 83,143,93,220 ; rect DC.W $000F ; stat text item constant DC.L Name8 ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color Name8 str '- Size -' PartItem5 DC.W 5 ; item 5 DC.W 116,180,126,230 ; rect DC.W $000F ; stat text item constant DC.L Item5Str ; null str DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color item5Str str ' ' ; make room for chars here ;################################################################ ;# Warning Dialog Template # ;################################################################ EXPORT WarningAlert WarningAlert DC.W 30,110,100,530 ; rect DC.W 1500 ; alert id DC.B $80 ; stage 1 DC.B $80 ; stage 2 DC.B $80 ; stage 3 DC.B $80 ; stage 4 DC.L WarningItem1 ; ptr to the first item DC.L WarningItem2 ; ptr to the 2nd item DC.L WarningItem3 ; ptr to the 3rd item DC.L 0 ; nil terminator! WarningItem1 DC.W 1 ; item 1 DC.W 50,190,64,285 ; rect DC.W 10 ; button item constant DC.L WarningCancel ; address of our first global str DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color WarningCancel str 'Cancel' ; Cancel string WarningItem2 DC.W 2 ; item 2 DC.W 50,295,64,380 ; rect DC.W 10 ; button item constant DC.L WarningOK ; address of our first global str DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color WarningOK str 'OK' ; OK string EXPORT WarningItem3 WarningItem3 DC.W 3 ; item 3 DC.W 11,72,50,410 ; rect DC.W 22+$8000 ; longstatictext item constant DC.L 0 ; address of our first global str DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color ;################################################################ ;# Disk Name Dialog Template # ;################################################################ EXPORT DiskNameDlog DiskNameDlog DC.W 30,165,95,475 ; rect DC.W $FF ; visible DC.L $1003 ; ref con DC.L DiskItem1 ; Item 1 DC.L DiskItem2 ; Item 1 DC.L DiskItem3 ; Item 1 DC.L DiskItem4 ; Item 1 DC.L 0 ; nil terminator DiskItem1 DC.W 1 ; item 1 DC.W 45,130,59,225 ; rect DC.W 10 ; button item constant DC.L WarningOK ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color DiskItem2 DC.W 2 ; item 2 DC.W 45,25,59,120 ; rect DC.W 10 ; button item constant DC.L WarningCancel ; re-use Cancel above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color DiskItem3 DC.W 3 ; item 3 DC.W 23,10,37,290 ; rect DC.W 17 ; edit line constant EXPORT DefName DefName DC.L 0 DC.W 15 ; item value - only allow 15 chars DC.W 0 ; item flag DC.L 0 ; item color NilStr DC.B 0 ; nil string! DiskItem4 DC.W 4 ; item 4 DC.W 5,10,20,275 ; rect DC.W 15 ; stat text item constant DC.L GetName ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color GetName str 'Please name this disk.' ;################################################################ ;# About Dialog Template # ;################################################################ EXPORT AboutDITL AboutDITL DC.W 35,126,165,515 ; rect DC.W $FFFF ; visible DC.L $1005 ; ref con DC.L AboutItem1 ; Item 1 DC.L AboutItem2 ; Item 2 DC.L 0 ; nil terminator AboutItem1 DC.W 2 ; item 1 DC.W 10,18,100,370 ; rect DC.W 22+$8000 ; long static text + item disable item constant DC.L AppleIIGS ; IIGS str DC.W EndAppleIIGS-AppleIIGS ; item value DC.W 0 ; item flag DC.L 0 ; item color AboutItem2 DC.W 1 ; item 1 DC.W 106,147,120,241 ; rect DC.W 10 ; button item constant DC.L WarningOK ; re-use OK above DC.W 0 ; item value DC.W 0 ; item flag DC.L 0 ; item color AppleIIGS DC.B 1 DC.B 'J' DC.B 1 DC.B ' Advanced Disk Utility ',13 DC.B 'Version ' Version ;insert version text dc.b 13,13 DC.B 'By Darryl Lovato',13,13 dc.b 'Updated by Monte Benaresh',13,13 DC.B 'Copyright (c) 1988-1992 Apple Computer, Inc.',13 DC.B 'All rights reserved.',13 EndAppleIIGS EXPORT hardFmtAlrt hardFmtAlrt ;AlertWindow string to ask user whether he wants ;to hard-format a device dc.b '8' ;size of window dc.b '3' ;note icon dc.b '/' ;separator dc.b 'Do you wish to hard-format this disk? ' dc.b $0D, $0D dc.b 'Hard formatting assures optimal performance and reliability ' dc.b 'of your hard disk, but may take up to 20 minutes.' dc.b '/' dc.b '#1' ;standard "Cancel" button dc.b '/' dc.b '^' ;default button next dc.b '#3' ;standard "No" button dc.b '/' dc.b '#2' ;standard "Yes" button dc.b 0 EXPORT macConnectAlrt macConnectAlrt ;AlertWindow string to ask user whether he ever ;wants to connect hard disk to a Mac dc.b '8' ;size of window dc.b '3' ;note icon dc.b '/' ;separator dc.b 'Do you plan to connect this disk to a Macintosh computer? ' dc.b $0D, $0D dc.b 'Special formatting is required for Macintosh compatibility ' dc.b 'and takes up about 128K on your hard disk.' dc.b '/' dc.b '#3' ;standard "No" button dc.b '/' dc.b '^' ;default button next dc.b '#2' ;standard "Yes" button dc.b 0 EXPORT zeroAlrt zeroAlrt ;AlertWindow string to comfirm Zero of a disk dc.b '4' ;size of window dc.b '4' ;caution icon dc.b '/' ;separator dc.b 'Zeroing will destroy all of the data on this disk ' dc.b 'and may take a VERY LONG time. Do you want to ' dc.b 'zero this disk?' dc.b '/' dc.b '^' ;default button next dc.b '#3' ;standard "No" button dc.b '/' dc.b 'Zero' dc.b 0 EXPORT partAlrt partAlrt ;AlertWindow string to comfirm Partition of a disk dc.b '4' ;size of window dc.b '4' ;caution icon dc.b '/' ;separator dc.b 'Partitioning will destroy all data on this device. ' dc.b 'Do you really want to partition this device?' dc.b '/' dc.b '^' ;default button next dc.b '#1' ;standard "Cancel" button dc.b '/' dc.b '#0' ;standard "OK" button dc.b 0 EXPORT partLockAlrt partLockAlrt ;AlertWindow string to comfirm Partition of a disk ;when a locked partition resides on the device dc.b '4' ;size of window dc.b '4' ;caution icon dc.b '/' ;separator dc.b 'Partitioning will destroy all data on this device, ' dc.b 'including data on one or more locked partitions. ' dc.b 'Do you really want to partition this device?' dc.b '/' dc.b '^' ;default button next dc.b '#1' ;standard "Cancel" button dc.b '/' dc.b '#0' ;standard "OK" button dc.b 0 EXPORT partOpenAlrt partOpenAlrt ;AlertWindow string to tell user that a ;partition volume has open files dc.b '4' ;size of window dc.b '2' ;stop icon dc.b '/' ;separator dc.b 'This device cannot be partitioned because it ' dc.b 'contains one or more volumes with open files.' dc.b '/' dc.b '^' ;default button next dc.b '#0' ;standard "OK" button dc.b 0 EXPORT formatErrAlrt formatErrAlrt ;AlertWindow string to tell user a format ;error occurred dc.b '3' ;size of window dc.b '2' ;stop icon dc.b '/' ;separator dc.b 'Sorry, disk initialization failed.' dc.b '/' dc.b '^' ;default button next dc.b '#0' ;standard "OK" button dc.b 0 ;################################################################ ;# Misc Strings # ;################################################################ EXPORT okStr okStr str 'OK' EXPORT warningStr warningStr str 'Initializing will erase all of the data on this disk. Do you want to intitialize this disk?' EXPORT warning2Str warning2Str str 'Erasing will remove all of the data on this disk. Do you want to erase this disk?' ;EXPORT warning3Str ;warning3Str ;str 'Zeroing will destroy all of the data on this disk and may take a VERY LONG time. Do you want to zero this disk?' ;EXPORT warning4Str ;warning4Str ;str 'Partitioning will destroy all data on this device. Do you really want to partition this device?' EXPORT volNameStr volNameStr str 'The disk name is ^0 ' ; we need the spaces! EXPORT successStr successStr str 'Disk initialization successfully completed.' EXPORT cancelInitStr cancelInitStr str 'Disk initialization was canceled.' EXPORT ReadPartErrStr ReadPartErrStr str 'Partitioning operation failed. The SCSI Hard Disk could not be read.' EXPORT AtLeastOneCanceled AtLeastOneCanceled str 'Warning! Initialization of one or more disks was canceled.' EXPORT blankStr blankStr str ' ' EXPORT unInitStr unInitStr str 'Uninitialized or no disk in drive' ;EXPORT formatErrStr ;formatErrStr ;str 'The disk could not be initialized.' EXPORT PartErrStr PartErrStr str 'The device could not be partitioned.' EXPORT successpartStr successpartStr str 'Partition operation completed. ' EXPORT eraseErrStr eraseErrStr str 'The disk could not be erased.' EXPORT eraseErrOpenStr eraseErrOpenStr str 'That disk can''t be erased because it contains open files.' EXPORT initErrOpenStr initErrOpenStr str 'That disk can''t be initialized because it contains open files.' EXPORT zeroErrOpenStr zeroErrOpenStr str 'That disk can''t be zeroed because it contains open files.' EXPORT zeroingVolFail zeroingVolFail str 'An error occurred while zeroing.' EXPORT startzerovolStr startzerovolStr str 'Setting up buffers for zero operation.' EXPORT eraseSuccStr eraseSuccStr str 'Erase operation successfully completed.' EXPORT noDevicesStr noDevicesStr str 'No disks on line.' EXPORT cancelPartStr cancelPartStr str 'Partition operation canceled. ' EXPORT cancelEraseStr cancelEraseStr str 'Erase operation canceled.' EXPORT cancelZeroStr cancelZeroStr str 'Zero operation canceled.' EXPORT zeroingvolStr zeroingvolStr str 'Zeroing disk... This could take a while.' EXPORT zeroingvolSuccess zeroingvolSuccess str 'Zero operation successfully completed.' EXPORT uninitialized uninitialized str 'Uninitialized' ;################################################################ ;# Floppy Disk Icon Data # ;################################################################ EXPORT FakeArray FakeArray EXPORT Floppy Floppy ; DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$0F,$FF,$F0,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$0F,$FF,$F0,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$FF,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$0F,$FF,$F0,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$0F,$FF,$F0,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$0F,$FF,$F0,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$0F,$FF,$F0,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$FF,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;################################################################ ;# Ram/Rom Disk Icon Data # ;################################################################ EXPORT RamDisk RamDisk DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $FF,$F0,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$A0 DC.B $FF,$0A,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0 DC.B $F0,$AA,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0 DC.B $F0,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$A0 DC.B $F0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0 DC.B $F0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0 DC.B $F0,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$A0 DC.B $F0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$BB,$BB,$BB,$BB,$0F DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$00,$00,$00,$00,$0F DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ;################################################################ ;# 3.5 Floppy Disk Icon Data # ;################################################################ EXPORT Three Three DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $0F,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$F0 DC.B $0F,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$F0,$F0 DC.B $0F,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$F0 DC.B $0F,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$F0 DC.B $0F,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$F0 DC.B $0F,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$F0 DC.B $0F,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$F0 DC.B $0F,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$F0 DC.B $0F,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$F0 DC.B $0F,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$F0 DC.B $0F,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$F0 DC.B $0F,$F0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$F0 DC.B $0F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0 DC.B $0F,$FF,$FF,$FC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$FF,$FF,$FF,$F0 DC.B $0F,$FF,$FF,$CC,$CC,$FF,$FF,$CC,$CC,$CC,$CC,$FF,$FF,$FF,$F0 DC.B $0F,$FF,$FF,$CC,$CC,$FF,$FF,$CC,$CC,$CC,$CC,$FF,$FF,$FF,$F0 DC.B $0F,$FF,$FF,$CC,$CC,$FF,$FF,$CC,$CC,$CC,$CC,$FF,$FF,$FF,$F0 DC.B $0F,$FF,$FF,$CC,$CC,$FF,$FF,$CC,$CC,$CC,$CC,$FF,$FF,$FF,$F0 DC.B $0F,$FF,$FF,$CC,$CC,$FF,$FF,$CC,$CC,$CC,$CC,$FF,$FF,$FF,$F0 DC.B $F0,$FF,$FF,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$FF,$FF,$FF,$F0 DC.B $FF,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;################################################################ ;# partitioned 'HD' Icon Data # ;################################################################ EXPORT Partition Partition DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FC,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F1,$1F,$FC DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CF,$FC DC.B $FF,$FC,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$FF DC.B $FF,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$11,$FC,$CF,$FC DC.B $FF,$FC,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$FF DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FC,$CC,$FC DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$CF,$CF,$FF DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C1,$1C,$C0,$FC,$CF,$FF DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$CC,$CF,$FF DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$FF,$FF,$FF DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$FF,$FF,$FF DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$FF,$FF,$FF DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ;################################################################ ;# non-partitioned 'HD' Icon Data # ;################################################################ EXPORT HardDisk HardDisk DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0 DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C1,$1C,$C0 DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0 DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0 DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0 DC.B $0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ;################################################################ ;# Appletalk Icon Data # ;################################################################ EXPORT AppleTalk AppleTalk ;DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF ;DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$0F,$0F,$F0,$00,$00,$00,$0F,$FF ;DC.B $FF,$FF,$FF,$FF,$FF,$FF,$F0,$EE,$F0,$F0,$BB,$BB,$B0,$B0,$FF ;DC.B $FF,$00,$00,$0F,$FF,$FF,$0E,$EE,$EE,$00,$BB,$BB,$B0,$00,$FF ;DC.B $F0,$DD,$DD,$D0,$00,$00,$0E,$EE,$EE,$E0,$BB,$BB,$BB,$B0,$FF ;DC.B $F0,$DD,$DD,$DD,$DD,$DD,$D0,$EE,$EE,$EE,$0B,$BB,$BB,$B0,$FF ;DC.B $F0,$DD,$DD,$DD,$DD,$DD,$D0,$EE,$EE,$E0,$BB,$BB,$BB,$B0,$FF ;DC.B $F0,$DD,$DD,$DD,$DD,$DD,$D0,$EE,$EE,$00,$BB,$BB,$BB,$B0,$FF ;DC.B $F0,$DD,$DD,$DD,$DD,$DD,$D0,$EE,$E0,$F0,$BB,$BB,$BB,$B0,$FF ;DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ;DC.B $F0,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$0F ;DC.B $FF,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF ;DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$C0,$FF,$FF,$FF,$FF,$FF ;DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$C0,$FF,$FF,$FF,$FF,$FF ;DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$00,$00,$00,$FF,$FF,$FF,$FF ;DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$BB,$BB,$E0,$FF,$FF,$FF,$FF ;DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$00,$00,$00,$FF,$FF,$FF,$FF ;DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$C0,$FF,$FF,$FF,$FF,$FF ;DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$0C,$CC,$0F,$FF,$FF,$FF,$FF ;DC.B $00,$F0,$00,$00,$00,$00,$00,$00,$CC,$0C,$C0,$00,$00,$0F,$00 ;DC.B $CC,$FC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$F0,$CC,$CC,$CC,$CF,$CC ;DC.B $00,$F0,$00,$00,$00,$00,$00,$00,$0F,$FF,$00,$00,$00,$0F,$00 dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$0E,$0F,$F0,$00,$00,$00,$0F,$FF dc.b $FF,$FF,$FF,$FF,$FF,$FF,$F0,$EE,$E0,$F0,$FF,$FF,$F0,$F0,$FF dc.b $FF,$00,$00,$0F,$FF,$FF,$0E,$EE,$EE,$00,$F7,$77,$F0,$00,$FF dc.b $F0,$BB,$BB,$B0,$00,$00,$0E,$EE,$EE,$E0,$FF,$FF,$FF,$F0,$FF dc.b $F0,$BB,$BB,$BB,$BB,$BB,$B0,$EE,$EE,$EE,$0F,$77,$77,$F0,$FF dc.b $F0,$BB,$BB,$BB,$BB,$BB,$B0,$EE,$EE,$E0,$FF,$FF,$FF,$F0,$FF dc.b $F0,$BB,$BB,$BB,$BB,$BB,$B0,$EE,$EE,$00,$F7,$77,$77,$F0,$FF dc.b $F0,$BB,$BB,$BB,$BB,$BB,$B0,$EE,$E0,$F0,$FF,$FF,$FF,$F0,$FF dc.b $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 dc.b $F0,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$0F dc.b $FF,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$C0,$FF,$FF,$FF,$FF,$FF dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$C0,$FF,$FF,$FF,$FF,$FF dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$00,$00,$00,$FF,$FF,$FF,$FF dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$BB,$BB,$E0,$FF,$FF,$FF,$FF dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$00,$00,$00,$FF,$FF,$FF,$FF dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$C0,$FF,$FF,$FF,$FF,$FF dc.b $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$0C,$CC,$0F,$FF,$FF,$FF,$FF dc.b $00,$F0,$00,$00,$00,$00,$00,$00,$CC,$0C,$C0,$00,$00,$0F,$00 dc.b $CC,$FC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$F0,$CC,$CC,$CC,$CF,$CC dc.b $00,$F0,$00,$00,$00,$00,$00,$00,$0F,$FF,$00,$00,$00,$0F,$00 ;################################################################ ;# Unknown device Icon Data # ;################################################################ EXPORT Other Other DC.B $FF,$FF,$FF,$F0,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$FF,$FF DC.B $FF,$F0,$00,$0D,$DD,$DD,$DD,$DD,$DD,$DD,$DD,$DD,$00,$00,$FF DC.B $FF,$0D,$DD,$DD,$DD,$DD,$DD,$DD,$DD,$DD,$DD,$DD,$DD,$DD,$0F DC.B $FF,$0D,$DD,$DD,$DD,$00,$00,$00,$00,$00,$DD,$DD,$DD,$DD,$0F DC.B $F0,$DD,$DD,$DD,$00,$FF,$FF,$FF,$FF,$FF,$00,$DD,$DD,$DD,$D0 DC.B $F0,$DD,$DD,$D0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$0D,$DD,$DD,$D0 DC.B $F0,$DD,$DD,$D0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$0D,$DD,$DD,$D0 DC.B $FF,$00,$00,$0F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$0D,$DD,$DD,$D0 DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$DD,$DD,$DD,$0F DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$0D,$DD,$DD,$D0,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$00,$0D,$DD,$DD,$DD,$00,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$00,$0D,$DD,$DD,$DD,$DD,$00,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$F0,$DD,$DD,$DD,$DD,$00,$00,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$0D,$DD,$DD,$DD,$00,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$0D,$DD,$DD,$D0,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$F0,$00,$00,$0F,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$F0,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$0D,$DD,$DD,$0F,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$0D,$DD,$DD,$0F,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$0D,$DD,$DD,$0F,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$F0,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF ;################################################################ ;# non-partitioned 'CD' Icon Data # ;################################################################ EXPORT CD CD DC.B $F0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF DC.B $0F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$0F DC.B $0F,$FF,$FF,$FF,$F0,$00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$0F DC.B $0F,$FF,$FF,$F0,$0C,$CC,$CC,$CC,$CC,$CC,$00,$FF,$FF,$FF,$0F DC.B $0F,$FF,$F0,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$FF,$FF,$0F DC.B $0F,$FF,$0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$0F,$FF,$0F DC.B $0F,$F0,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$FF,$0F DC.B $0F,$F0,$CC,$CC,$CC,$CC,$C0,$00,$CC,$CC,$CC,$CC,$C0,$FF,$0F DC.B $0F,$0C,$CC,$CC,$CC,$CC,$0F,$FF,$0C,$CC,$CC,$CC,$CC,$0F,$0F DC.B $0F,$0C,$CC,$CC,$CC,$C0,$FF,$FF,$F0,$CC,$CC,$CC,$CC,$0F,$0F DC.B $0F,$0C,$CC,$CC,$CC,$C0,$FF,$FF,$F0,$CC,$CC,$CC,$CC,$0F,$0F DC.B $0F,$0C,$CC,$CC,$CC,$CC,$0F,$FF,$0C,$CC,$CC,$CC,$CC,$0F,$0F DC.B $0F,$F0,$CC,$CC,$CC,$CC,$C0,$00,$CC,$CC,$CC,$CC,$C0,$FF,$0F DC.B $0F,$F0,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$FF,$0F DC.B $0F,$FF,$0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$0F,$FF,$0F DC.B $0F,$FF,$F0,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$FF,$FF,$0F DC.B $0F,$FF,$FF,$F0,$0C,$CC,$CC,$CC,$CC,$CC,$00,$FF,$FF,$FF,$0F DC.B $0F,$FF,$FF,$FF,$F0,$00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$0F DC.B $0F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$0F DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0F DC.B $0F,$FF,$FF,$FF,$FF,$FF,$00,$00,$0F,$FF,$FF,$FF,$FF,$FF,$0F DC.B $F0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF ;################################################################ ;# partitioned 'CD' Icon Data # ;################################################################ EXPORT CDPartition CDPartition DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$CF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$CF DC.B $FF,$FF,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$FF,$FF DC.B $FF,$FF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF,$CC,$FF,$CF DC.B $FF,$FF,$CC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FC,$FF,$FF DC.B $F0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0F,$CC,$FF,$CF DC.B $F0,$FF,$FF,$00,$0C,$CC,$CC,$C0,$00,$FF,$FF,$0C,$FC,$FF,$FF DC.B $F0,$FF,$00,$CC,$CC,$CC,$CC,$CC,$CC,$00,$FF,$0F,$CC,$FF,$CF DC.B $F0,$F0,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$0F,$0C,$FC,$FF,$FF DC.B $F0,$0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$0F,$CC,$FF,$CF DC.B $F0,$0C,$CC,$CC,$CC,$CC,$0C,$CC,$CC,$CC,$C0,$0C,$FC,$FF,$FF DC.B $F0,$CC,$CC,$CC,$CC,$C0,$C0,$CC,$CC,$CC,$CC,$0F,$CC,$FF,$CF DC.B $F0,$0C,$CC,$CC,$CC,$CC,$0C,$CC,$CC,$CC,$C0,$0C,$FC,$FF,$FF DC.B $F0,$0C,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$C0,$0F,$CC,$CF,$CF DC.B $F0,$F0,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC,$0F,$0C,$FC,$FF,$FF DC.B $F0,$FF,$00,$CC,$CC,$CC,$CC,$CC,$CC,$00,$FF,$0F,$CC,$FF,$FF DC.B $F0,$FF,$FF,$00,$0C,$CC,$CC,$C0,$00,$FF,$FF,$0C,$CC,$FF,$FF DC.B $F0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0F,$FF,$FF,$FF DC.B $F0,$FF,$FF,$FF,$FF,$F0,$0F,$FF,$FF,$FF,$FF,$0F,$FF,$FF,$FF DC.B $F0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0F,$FF,$FF,$FF ;################################################################ ;# lock Icon Data # ;################################################################ EXPORT lockicon lockicon DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$F0,$00,$FF,$FF,$FF,$FF DC.B $FF,$FF,$0F,$FF,$0F,$FF,$FF,$FF DC.B $FF,$F0,$00,$00,$00,$FF,$FF,$FF DC.B $FF,$F0,$00,$00,$00,$FF,$FF,$FF DC.B $FF,$F0,$00,$00,$00,$FF,$FF,$FF DC.B $FF,$F0,$00,$00,$00,$FF,$FF,$FF ;################################################################ ;# un-lock Icon Data # ;################################################################ EXPORT unlockicon unlockicon DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ;################################################################ ;# Alert Dialog template # ;################################################################ EXPORT AlertDITL AlertDITL DC.W 50,105,103,530 DC.W 1 DC.L 0 DC.L AItem1 DC.L AItem2 DC.L AItem3 DC.L 0 AItem1 DC.W 1 ;DC.W 35,165,48,230 DC.W 35,180,48,244 DC.W $A DC.L WarningOk DC.W 0 DC.W 0 DC.L 0 AItem2 DC.W 3 DC.W 6,18,16,400 DC.W 15 DC.L miscstr DC.W 0 DC.W 0 DC.L 0 AItem3 DC.W 4 DC.W 18,18,28,400 DC.W 15 DC.L miscstr1 DC.W 0 DC.W 0 DC.L 0 ; Strings for text dialog we display if we don't find the right ; versions for the System Software STRING ASIS EXPORT badStart1Str badStart1Str dc.b @end - @start @start dc.b 'You must start up from System 6.0' @end EXPORT badStart2Str badStart2Str dc.b @end - @start @start dc.b 'or later to run this application.' @end EXPORT badStart1But badStart1But dc.b 0 ; text QUIT button string for TLTextMountVolume ; spaces push Button2 (left button) to the right (to right-justify it) ; (canÕt be Button1 because escape chars are counted in Button1Õs right justification!) ; $1B: ESC to enable mousetext in the firmware ; $0F: turns on Inverse ; ÔMÕ is mousetext for return char ; $0E: turns off inverse ; $18: Ctrl-X to disable mousetext in the firmware EXPORT badStart2But badStart2But dc.b @end - @start @start dc.b ' Quit ' dc.b $0f, $1b, 'M', $0E, $18 @end EXPORT mainIconRect mainIconRect dc.w 26,275,50,342 EXPORT formatCtlList formatCtlList dc.w $0000 ;SCSI version dc.b $04 ;SCSI command = format dcb.b $B, $00 ;rest of list = NULL EXPORT initMsgWindow initMsgWindow ;Dialog Manager window to tell user that ;hard-format is in progress dc.w 75,150,100,470 ;rectangle dc.w $ffff ;visisble dc.l 0 ;refcon dc.l hfText ;control dc.l 0 hfText dc.w 3 ;item id dc.w 5,80,25,313 ;rectangle dc.w $800F ;type = stat text, diabled dc.l hfString ;ptr dc.w 0 ;value dc.w 0 ;flag dc.l 0 ;color table hfString dc.b @end-@start @start dc.b 'Hard-formatting diskÉ' @end ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/Dialog.pii b/IIGS.601.SRC/A.U.G/ADU/Dialog.pii new file mode 100644 index 0000000..9a8b73b --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/Dialog.pii @@ -0,0 +1 @@ +{################################################################} {# #} {# File: Dialog.Pas from IIGS Disk Initializer #} {# #} {#--------------------------------------------------------------#} {# #} {# Description: This file has all the routines that handle #} {# the creation, functionality and disposal of #} {# the dialogs used in the program. #} {# #} {#--------------------------------------------------------------#} {# #} {# Author: Darryl Lovato #} {# #} {#--------------------------------------------------------------#} {# #} {# Copyright: 1987,1988 by Apple Computer Inc. #} {# All rights reserved. #} {# #} {#--------------------------------------------------------------#} {# #} {# Modification History: #} {# #} {# Who When The Change #} {# --- ------ ------------------------------------- #} {# SR 12/7/87 Created v.1 - erase & init only #} {# DGL 1/29/88 Rewrote everything - cut size in half! #} {# DGL 5/9/88 Finished Adding Partition Support #} {# and other features... far too many to #} {# list here... #} {# DGL 5/12/88 Added Zero and Info operations #} {# DGL 5/20/88 Released pre-alpha version to testers #} {# DGL 6/1/88 Alpha! #} {# DGL 6/13/88 Alpha 2 #} {# DGL 6/24/88 Alpha 3 #} {# DGL 7/1/88 Beta 1 #} {# DGL 7/13/88 Beta 2 #} {# DGL 7/20/88 Beta 3 #} {# DGL 7/27/88 Beta 4 #} {# DGL 8/1/88 Beta 5 #} {# DGL 8/8/88 Beta 6 #} {# DGL 8/15/88 Final! #} {# #} {################################################################} { these options turn long addressing on, and turn error checking off} { in addition, they set the pascal comments in assembler on.} {$LongGLobals-} {$ToolErrorChk-} {$ToolErrorChk+} {$A+} unit Dialog; interface uses InitIntfData, InitIntfProc, InitIntfPDOS, ListMgr, Globals, Utils, Guts; procedure DoAboutItem; {About item in apple menu} procedure ShowInit; {Init Dialog} procedure SetActivePartition(thePart : integer); procedure ProcessInit; { handle control hit in main Dlog } procedure NextDrive; implementation procedure DrawAlloChart(totalRedraw : boolean); FORWARD; PROCEDURE MainWindUpdt; FORWARD; {################################################################} {# filter to be called for dlogs with 1 item lists #} {################################################################} function myDlogFilter(theDlog : grafportptr; var someEvent : wmTaskRec; var itemhit : integer) : integer; const isfalse = 0; istrue = $FFFF; EnterChar = 3; Tab = 9; CRChar = 13; Escape = 27; LArrow = 21; RArrow = 8; Rubout = 127; var temp : integer; theControl : ControlHandle; { temp1,temp2 : Longint; } test1 : boolean; ch : char; { lowerflag : boolean; } tempPt : Point; BEGIN PHB; { added 3/91 by Monte } phk; {make sure data bank is set correctly} plb; myDlogFilter := 0; with someEvent do begin if wmWhat = 1 then { mouse-down } begin temp := findcontrol(theControl,wmwhere.h,wmwhere.v,theDlog); GlobalToLocal(wmwhere); test1 := PtInRect(wmwhere, listRect1); LocalToGlobal(wmwhere); if test1 then begin myDlogFilter := $F; itemhit := 100; end; if theControl <> SizeBar then {its not our scroll bar, not the lists!} if (temp in [5..8, 129]) or test1 then begin RestoreRefCons; temp := TrackControl(wmwhere.h,wmwhere.v, Pointer(-1), theControl); ZeroRefCons; wmwhat := 0; {can you say kludge?} end; {make cr's look like cr's!} end else if (wmWhat = 3) or (wmWhat = 5) then { keydown, autokey} { Key filter stuff eliminated 3/31/91 by Monte Benaresh } { b/c we now have an init/erase dialog in the OS which enforced } { name syntax and this filter is used in situations where the } { ProDOS name restrictions do not apply. } BEGIN if char(loword(bitand(wmMessage,$FF))) = char($D) then { cr!} begin itemhit := 1; {default button} myDlogFilter := 1; {True} if theDlog = partDlog then begin temp := currPart; SetActivePartition(-2); currPart := temp; end else BlinkButton(GetControlItem(theDlog,1)); end else begin ch := char(bitand(loword(wmMessage), $FF)); (* lowerflag := (ord(ch) >= ord('a')) and (ord(ch) <= ord('z')); if (bitand(wmModifiers,OptionKey+ControlKey) = 0) and (lowerflag or (ch = '.') or (ch = char(EnterChar)) or (ch = char(Tab)) or (ch = char(Escape)) or (ch = char(RArrow)) or (ch = char(LArrow)) or (ch = char(Rubout)) or ((ord(ch) >= ord('0')) and (ord(ch) <= ord('9'))) or ((ord(ch) >= ord('A')) and (ord(ch) <= ord('Z')))) then begin *) if (ch = char(Escape)) and (theDlog = partDlog) then begin itemhit := 2; myDlogFilter := isTrue; BlinkButton(GetControlItem(theDlog,2)); end; if (ch = char(EnterChar)) and (theDlog <> partDlog) then begin itemhit := 1; myDlogFilter := isTrue; BlinkButton(GetControlItem(theDlog,1)); end; (* if lowerflag then { change it to upper case} wmMessage := ord(ch) - $20; end *) (* else begin wmMessage := 0; {so the dlog manager doesn't see it} itemhit := 0; myDlogFilter := istrue; end; *) end; END; IF wmWhat = 6 THEN { update } { added 3/7/91 by Monte for Video Kbd } BEGIN oldPort := GetPort; SetPort(GrafPortPtr(wmMessage)); CASE LONGWORD(GetWRefCon(GrafPortPtr(wmMessage))).LoWord OF { do window-specific updating } InfoRef : BEGIN BeginUpdate(GrafPortPtr(wmMessage)); DrawDialog(GrafPortPtr(wmMessage)); tempPt.v := 6; { coordinates for vol icon } tempPt.h := 35; PlotIconola(iconPtr, tempPt, FALSE); { plot current info icon } IF isLockedDev THEN { was it a locked device? } BEGIN tempPt.v := 6; tempPt.h := 2; PlotIconola(@lockIcon, tempPt, true); { draw lock icon } END; EndUpdate(GrafPortPtr(wmMessage)); myDlogFilter := 1; { return TRUE to say we handled the event } END; PartRef : BEGIN BeginUpdate(GrafPortPtr(wmMessage)); DrawDialog(GrafPortPtr(wmMessage)); DrawAlloChart(TRUE); EndUpdate(GrafPortPtr(wmMessage)); myDlogFilter := 1; { return TRUE to say we handled the event } END; END; {case} SetPort(oldPort); END; {begin} end; PLB; { caller's DBR } END; {################################################################} {# draw out custom list member. It has a color coding box #} {################################################################} procedure DrawList(r : Rect; memRec : ListMemP; listH : ControlHandle); var boxR : Rect; i : integer; begin PHB; { added 3/91 by Monte } phk; {make sure data bank is set correctly} plb; with memRec^ do begin eraseRect(r); boxR := r; r.h1 := r.h1 + 30; inc(boxR.v1); dec(boxR.v2); boxR.h2 := boxR.h1 + 28; boxR.h1 := boxR.h1 + 2; i := 0; repeat inc(i); until (memRec = @myList[i]); {SpecialRect(boxR,0,scrollarray[i]); *-DGL-*} SpecialRect(boxR,0,scrollarray[i mod 13]); moveto(r.h1 + 5, r.v1 + 8); drawstring(StringPtr(memPtr)^); if bitand($80,memFlag) <> 0 then { we need to select it} InvertRect(r); end; PLB; { caller's DBR } end; {################################################################} {# rebuild the partition name list #} {################################################################} procedure RebuildList(startSel : integer); var miscWord : integer; myListRecPtr : ListRecP; begin myListRecPtr := @myListRec; if listControl1 <> nil then begin (* DrawMember(ResetMember(myListRecPtr),myListRecPtr); { remove any selections} removed 3/4/91 by Monte *) DisposeControl(listControl1); {remove the list, so we can create a new one} DisposeControl(listScroll1); { also remove its scroll bar} end; with GlobalParts^^ do begin miscword := 0; while (miscword < partCount) do begin inc(miscword); listNameAry[miscWord] := PartsInfo[miscword].partName; with myList[miscWord] do begin memPtr := @listNameAry[miscWord]; memFlag := 0; end; end; end; with myListRec, listRec do {set up the list record} begin v1 := 10; h1 := 20; v2 := 62; h2 := 204; listsize := miscword; {number of items} listview := 5; listtype := 2; liststart := startSel; listctl := nil; listdraw := @DrawList; listmemheight := 10; listmemsize := sizeof(listmemrec); listpointer := @myList; listrefcon := 0; listscrollclr := nil; end; ListRect1 := myListRec.listRec; listControl1 := CreateList(PartDlog,myListRecPtr); listScroll1 := listControl1^^.CtlListBar; { SelectMember(@myList[1], myListRecPtr); removed 3/4/91 by Monte } SaveAndZeroRefCons; { force redraw on next time through event loop } { InvalRect(listRect1); }{ added 3/4/91 by Monte } { InvalRect(listScroll1^^.ctrlRect); } DrawOneCtl(listControl1); DrawOneCtl(listScroll1); end; {################################################################} {# check to make sure there are no duplicate partitions #} {################################################################} function BadPartNames(var duperr : boolean) : boolean; var i,j : integer; label 1; begin BadPartNames := false; {assume the best} with GlobalParts^^ do for i := 1 to PartCount do if partsinfo[i].partName = '' then begin dupErr := false; badPartNames := true; goto 1; end; with globalParts^^ do for i := 1 to PartCount do for j := i to PartCount do if (j <> i) and (partsinfo[i].partName = partsinfo[j].partName) then begin BadPartNames := true; duperr := true; goto 1; end; 1:end; {################################################################} {# draw the lines that group the buttons in the main dlog #} {################################################################} procedure DrawLines; var thePt : Point; temp : ptr; begin SetPort(InitDlogPtr); { moveto(0,20); removed 3/8/91 by Monte Benaresh } { lineto(380,20); } moveto(0,78); { all vertical positions reduced by 21 for new window frame } lineto(380,78); { -- Monte Benaresh 3/8/91 } moveto(235,0); lineto(235,78); moveto(236,0); lineto(236,78); with thePt do begin v := 27; h := 276; end; PlotIconola(curVolIcon,thePt,false); with thePt do begin v := 27; h := 240; end; temp := @unlockicon; if islockeddev then temp := @lockIcon; PlotIconola(temp, thePt, true); end; {################################################################} {# get the sum of all current partition sizes #} {################################################################} function SumPartSizes : integer; var sum : integer; i : integer; begin {find the total amount that this would make on a disk} sum := 0; with GlobalParts^^ do for i := 1 to partCount do with partsinfo[i] do if partsize = 0 then inc(sum) else sum := sum + partsize; SumPartSizes := sum; end; {################################################################} {# draw partition allo chart, totalredraw draws everything #} {################################################################} procedure DrawAlloChart(totalRedraw : boolean); { NOTE: All GrafPort params must be preserved during this PROC } { because it gets called by ScrollAction which gets called by } { the Control Manager. } var dumbRect, newRect : rect; i, newY : integer; tAllocated : integer; oldPenSize : point; begin GetPenSize(@oldPenSize); SetPenSize($0002, $0001); { standard pen for all our frames } tAllocated := 0; with dumbRect do begin h1 := 240; h2 := 320; v2 := 148; v1 := 148; end; with GlobalParts^^ do for i := PartCount downto 1 do { do this for all partitions!} with PartsInfo[i], dumbRect do begin tAllocated := tAllocated + partSize; v2 := v1 + 1; v1 := v1 - Real2Int((partSize * 138) / tMegs); if v1 < 10 then v1 := 10; if (i <= currPart) or totalRedraw then {draw it} begin { this fixes any roundoff that occurs by making the last} { partition pin to the top if the disk is full. This can slightly} { distort the size of the top partition though.. Testing liked it better} { this way, so this is how I'm doing it!} if (i = 1) and (SumPartSizes = tMegs) then v1 := 10; {SpecialRect(dumbRect,0,ScrollArray[i]); *-DGL-*} SpecialRect(dumbRect,0,ScrollArray[i MOD 13]); newRect := dumbRect;{remove any old names} newRect.h1 := newRect.h2 - 2; newRect.h2 := newRect.h2 + 320; EraseRect(newRect); newRect.h2 := newRect.h2 - 310; {draw the new ones!} FrameRect(newRect); newY := newRect.v1 + Real2Int((newRect.v2 - newRect.v1) / 2); moveto(newRect.h2,newY); lineto(newRect.h2 + 8,newY); if (dumbrect.v2 - dumbrect.v1) > 8 then begin move(5,4); {move to the right and down a bit} drawstring(concat(partName,' (', IntToString(Real2Int((partsize * 100) / tMegs)),'%)')); end; end; end; with dumbRect do if (tAllocated <= tMegs) then {draw empty space!} begin v2 := v1; v1 := 10; h2 := h2 + 320; EraseRect(dumbRect); inc(v2); h2 := h2 - 320; FrameRect(dumbRect); h2 := h2 + 10; FrameRect(dumbRect); if (dumbrect.v2 - dumbrect.v1) > 8 then { draw the available space!!!} begin newY := dumbRect.v1 + Real2Int((dumbRect.v2 - dumbRect.v1) / 2); moveto(dumbRect.h2,newY); lineto(dumbRect.h2 + 8,newY); move(5,4); {move to the right and down a bit} drawstring(concat('Available (', IntToString(Real2Int(-((tAllocated - Tmegs) * 100) / tMegs)),'%)')); end; end; SetPenSize(oldPenSize.h, oldPenSize.v); { restore pen size } end; {################################################################} {# set the current partitions size #} {################################################################} procedure SetPartSize(number : integer); var megs : integer; fraction : str255; begin if number < 1 then number := 1; GlobalParts^^.PartsInfo[CurrPart].partsize := number; fraction := '.0'; if odd(number) then begin fraction := '.5'; dec(number); end; megs := number div 2; TempStr1 := concat(IntToString(megs),fraction,' MB'); SetIText(PartDlog,5,@TempStr1); { DrawAlloChart(false); removed 3/4/91 by Monte } FrameRect(invRect); { redraw the scroll bar frame - kludge!!!!} { this fizes a bug where the bottom of the} { scroll bar would be trashed} end; {################################################################} {# set the current partition #} {################################################################} procedure SetActivePartition(thePart : integer); var tempRect : Rect; temp : integer; ctlhand : Handle; ctlVal : longint; tempName : str255; begin if (thePart <> CurrPart) or (thePart = -2) then { -2 = save current but don't set new} begin HLock(Handle(GlobalParts)); if CurrPart <> -1 then {we need to get the old partition name} with GlobalParts^^.PartsInfo[CurrPart] do begin GetIText(partDlog,3,@tempName); if tempName <> partname then begin partName := tempName; { our global structure} listNameAry[currPart] := tempName; { the list structure} DrawMember(@myList[currPart], @myListRec); {draw new name} DrawAlloChart(true); { make sure graphic is totaly redrawn!} WITH tempRect DO BEGIN v1 := 10; { set enclosing rect of allo chart } h1 := 240; v2 := 150; h2 := 524; END; ValidRect(tempRect); { don't re-update allo chart } end; end; HUnLock(Handle(GlobalParts)); if thePart <> -2 then { we can set a new one!} begin ScrollColor := scrollArray[thePart MOD 13]; ScrollColor1 := ScrollColor; with GlobalParts^^.partsinfo[thepart] do begin ctlVal := tMegs - partSize; SetIText(PartDlog,3,@partname); end; SelIText(PartDlog,3,0,255); InvalRect(invRect); { invalidate scroll bar } (* BeginUpdate(PartDlog); EraseRect(PartDlog^.portRect); DrawControls(PartDlog); EndupDate(PartDlog); removed by Monte 3/11/91 *) SetCtlValue(ctlVal, SizeBar); { FrameRect(invRect); }{ redraw the scroll bar frame - kludge!!!!} { this fixes a bug where the bottom of the} { scroll bar would be trashed} CurrPart := thePart; SetPartSize(tMegs - ctlVal); end else CurrPart := -1; end; end; {################################################################} {# scan to find the next good device, skip empty drives #} {################################################################} procedure NextDrive; var firstDevice : integer; i : integer; theCtl : ControlHandle; thePt : Point; myname : str255; dummyResult : LONGINT; LABEL 8352; begin SetPort(InitDlogPtr); { prepare for icon drawing } noDevices := false; firstDevice := 0; REPEAT inc(deviceNum); if D_Info(deviceNum,currDeviceStr) <> noError then {Loop back} (* if not atLeastOneDev then begin { there are no drives, so kill everything } TurnOff(EraseButton); TurnOff(PartButton); TurnOff(InitButton); TurnOff(ZeroButton); TurnOff(InfoButton); deviceNum := 0; noDevices := true; {Prevent infinite loop if no drives available} exit(nextDrive); end {if} *) { else } begin deviceNum := 1; (* atLeastOneDev := false; {Reset since we have looped back} *) toolErr := D_Info(deviceNum,currDeviceStr); { re-issue call } end; {else} IF firstDevice = deviceNum THEN { did we check same device twice? } BEGIN noDevices := TRUE; deviceNum := 0; TurnOff(EraseButton); TurnOff(PartButton); TurnOff(InitButton); TurnOff(ZeroButton); TurnOff(InfoButton); dispVolumeStr := noDevicesStr; { set current string to say no dev found } SetLongText(@dispVolumeStr); EraseRect(mainIconRect); { erase device icon } thePt.v := 27; thePt.h := 240; PlotIconola(@unlockicon, thePt, true); { erase lock icon } {GOTO 8352; } EXIT(NextDrive); END; IF firstDevice = 0 THEN firstDevice := deviceNum; { get info on current device } with infoblk do begin pCount := 11; devNumber := deviceNum; devname := @myname; i := GSOSInfo; tMegs := totalBlocks div 1024; isRemovable := Bitand(characteristics, $4) <> 0; end; { now get status and decide whether we want this device } with statusBlk do begin pCount := 5; devNumber := deviceNum; statCode := 0; StatList := @StatResult; RequestCount := 6; end; i := GSOSStatus; currState := StatResult.general; 8352: UNTIL ((BITAND(infoblk.characteristics, $0080) <> 0) { check block device } AND (BITAND(currState, $0010) <> 0)) { check online } OR noDevices; { get online block device or no device } { tell toolbox we have handled this device ourselves } dummyResult := HandleDiskInsert(hdiUpdate, deviceNum); { there is at least one (volume) device we can get info from} TurnOn(InfoButton); with infoblk do if devID <> 5 then { not HD, so it can't be partitioned!} TurnOff(PartButton) else if bitand(characteristics, $4000) <> 0 then { shit, its a generated device!} begin TurnOff(PartButton); MakeCursor(arrow); DoAlert('You do not have the SCSI driver on your system disk...', 'Therefore, you can not partition this device.'); MakeCursor(watch); setlongtext(@''); {nil string} end else (* if (infoblk.headlink = 1) or (deviceNum = 1) then {it is on the boot drive} TurnOff(partButton) {cant re-partition the boot drive!} else *) { now allow partitioning of boot device -- Monte 8/19/91 } TurnOn(PartButton); {---------- check for write protection ---------} islockeddev := false; { assume the best} with infoblk do if bitand(characteristics, $40) = 0 then { write protected} islockeddev := true else if bitand(characteristics, $80) <> 0 then { block dev - see if write protected} begin (* with statusBlk do begin pCount := 5; devNumber := deviceNum; statCode := 0; StatList := @StatResult; RequestCount := 6; end; *) { i := GSOSStatus; this is redundant -Monte 7/24/91 } { if bitand(StatResult.general,$4) <> 0 then } IF BITAND(currState, $0004) <> 0 THEN islockedDev := true; end; { get volume info for this device } initializedDev := true; { assume a volume is in this device } toolErr := volume(currDeviceStr, currVolumeStr); case toolErr of IOError, OtherOS : begin dispVolumeStr := unInitStr; { set in case user clicks icon } { SetLongText(@unInitStr); } initializedDev := false; end; noError : begin { dispVolumeStr := currVolumeStr; } { delete(dispVolumeStr,1,1); } {Get rid of '/'} { dispVolumeStr := CONCAT('The disk name is ', dispVolumeStr); } { SetLongText(@dispVolumeStr); } SetVolName(currVolumeStr); end; {noError} otherwise { bad device, make it look like no disk in drive!} begin toolErr := noDiskInDrive; initializedDev := false; dispVolumeStr := unInitStr; { set in case user clicks icon } end; end; {case} SetLongText(@dispVolumeStr); { if not (toolErr in [noDevice,noDiskInDrive]) then } begin { atLeastOneDev := true; } curVolIcon := GetVolIcon; {global infoblk holds parameters!} with thePt do begin { v := 48; changed 3/91 by Monte} v := 27; h := 276; end; PlotIconola(curVolIcon,thePt,false); with thePt do begin { v := 48; changed 3/91 by Monte} v := 27; h := 240; end; if islockeddev or {(devicenum = 1) or} (infoblk.devID = $1e) then {locked or AppleShare server } begin if islockeddev then PlotIconola(@lockIcon, thePt, true) {only show this if its locked} else PlotIconola(@unlockicon, thePt, true); TurnOff(EraseButton); { TurnOff(partButton); now allow for locked HD - Monte 8/12/91 } TurnOff(InitButton); TurnOff(ZeroButton); end else begin PlotIconola(@unlockicon, thePt, true); if initializedDev then begin TurnOn(EraseButton); end else begin TurnOff(EraseButton); end; TurnOn(InitButton); TurnOn(ZeroButton); end; end; end; {################################################################} {# is this a valid size for the partition? too big? #} {################################################################} procedure TestValid(var newValue : integer); var i : integer; sum : integer; dumbrect : rect; theCtl : ControlHandle; begin HLock(Handle(GlobalParts)); with GlobalParts^^ do begin {first convert the new value into it's equivalent Mb value and put it in the global record} with PartsInfo[CurrPart] do begin partsize := (TMegs - newValue); if partsize < 0 then begin partsize := 1; newvalue := newvalue - 1; end; end; {next find the total amount that this would make} sum := SumPartSizes; if sum > tMegs then {we went over the total amount avail on disk!} begin TurnOff(NewButton); (* DoAlert('Sorry... there is not enough room on the device. The', 'partition will be set to the maximum possible size.'); removed 2/91 by Monte *) SysBeep; { calculate the new amount that we can make this partition} { we make the new amount fill the entire disk} with PartsInfo[CurrPart] do begin partSize := partSize - (sum - tMegs); newValue := (tMegs - partSize); end; setport(partDlog); with dumbrect do begin h1 := 240; h2 := 640; v1 := 0; v2 := 200; end; invalRect(dumbrect); beginupdate(partDlog); DrawDialog(partDlog); DrawAlloChart(true); {we need to do a total redraw on this one!} endupdate(partDlog); end; end; HUnLock(Handle(GlobalParts)); end; {################################################################} {# called by dlog mgr to do the scrolling size scroll bar #} {################################################################} function ScrollAction(cmd : integer; Dlog : GrafPortPtr; itemID : integer) : integer; var temp : integer; save : integer; TempStr : str255; begin PHB; { added 3/91 by Monte } phk; {make sure data bank is set correctly} plb; case cmd of 1 : { get initial view size} temp := 1; 2 : { get initial total view size} temp := tMegs; 3 : { get initial value} temp := 0; 4 : { scroll line up} begin temp := GetDItemValue(Dlog,itemID) - 1; if temp < 0 then temp := 0; end; 5 : { scroll line down} begin temp := GetDItemValue(Dlog,itemID) + 1; if temp > tMegs then temp := tMegs; end; 6 : { scroll page up} begin temp := GetDItemValue(Dlog,itemID) - 4; if temp < 0 then temp := 0; end; 7 : { scroll page down} begin temp := GetDItemValue(Dlog,itemID) + 4; if temp > tMegs then temp := tMegs; end; 8 : { scroll thumb} temp := GetDItemValue(Dlog,itemID); end; { of case} if cmd > 3 then {item changed !} begin { test to see if the new value is valid, if not, inform user, and change it to a legal value} if cmd in [4,6,8] then {DGL} TestValid(temp); SetPartSize(TMegs - temp); DrawAlloChart(false); { added 3/4/91 by Monte } end; ScrollAction := temp; PLB; { caller's DBR } end; {################################################################} {# test to see if the name passed is already used #} {################################################################} function NotDuplicate(theStr : str255) : boolean; var i : integer; begin NotDuplicate := true; i := 0; with globalparts^^ do repeat inc(i); if Upperstring(PartsInfo[i].PartName) = theStr then NotDuplicate := false; until (i = (partcount - 1)); end; {################################################################} {# make a new partition name, and make sure its unique #} {################################################################} function MakeNewPartname : str255; var curStr : str255; count : integer; begin count := 1; repeat curStr := concat('UNTITLED', IntToString(count)); inc(count); until NotDuplicate(curStr); MakeNewPartname := curStr; end; {################################################################} {# create partition dialog, & partition if neccessary #} {################################################################} procedure Initialize; {this one initializes SCSI HardDisks (and partitions)} VAR itemHit,i,j : integer; MBstring : string[12]; sum : integer; temp : integer; p : stringptr; dumbrect : rect; thePt : Point; dupErr : Boolean; label 1,2; BEGIN MakeCursor(watch); { this pins the maximum number of partitions somewhere between 12 and 32} MaxNumParts := ord(((ord4(tMegs * 1024) * 512) div 32000000) + 1); if MaxNumParts > 32 then MaxNumParts := 32 else if MaxNumParts < 8 then MaxNumParts := 8; itemHit := CallGetNumParts(deviceNum); if itemHit > {12 *-DGL-*} 32 then { we can only handle 32 partitions!} itemHit := {12 *-DGL-*} 32; GlobalParts^^.PartCount := itemHit; { set the number we can handle!} SetHandleSize((itemHit * sizeof(Part)) + 2, Handle(GlobalParts)); HLock(Handle(globalparts)); if GetParts(deviceNum,Pointer(GlobalParts^)) <> 0 then {error } begin SetLongtext(@ReadPartErrStr); HUnlock(Handle(globalparts)); MakeCursor(arrow); goto 1; end; HUnlock(Handle(globalparts)); oldPort := GetPort; partDlog := GetNewModalDialog(@PartDITL); SizeBar := GetControlItem(PartDlog,4); NewButton := GetControlItem(PartDlog,6); DeleteButton := GetControlItem(PartDlog,7); if (GlobalParts^^.partCount >= {13 *-DGL-*} MaxNumParts) or (SumPartSizes >= tMegs) then { disable new} TurnOff(NewButton) else TurnOn(NewButton); if GlobalParts^^.partCount = 1 then { disable delete} TurnOff(DeleteButton) else TurnOn(DeleteButton); SetPort(partDlog); CurrPart := -1; {initialize our partition global} SetActivePartition(1); RebuildList(1); SelectMember(@myList[1], @myListRec); { DrawAlloChart(true); this now happens @ update time -Monte 3/91 } 2: MakeCursor(arrow); REPEAT { here we create the Partition dialog box - use a custom filter on it} { because we have list controls which clash with the dialog manager } itemHit := ModalDialog(procPtr(Ord4(@myDlogFilter) + $C0000000)); if (SumPartSizes >= tMegs) or (GlobalParts^^.partCount >= {13 *-DGL-*} MaxNumParts) then TurnOff(NewButton) else TurnOn(NewButton); if (itemHit = 100) or (itemHit = 6) or (itemHit = 7) then begin for selected := 1 to GlobalParts^^.partCount do if myList[selected].memFlag <> 0 then leave; SetActivePartition(selected); end; if (itemHit = 6) then { it was the new partition button...} begin temp := currPart; SetActivePartition(-2); {save old selection} currPart := temp; if (GlobalParts^^.partCount = {12 *-DGL-*} MaxNumParts-1) then { disable new} TurnOff(NewButton); if (GlobalParts^^.partCount = 1) then { enable delete} TurnOn(DeleteButton); SetHandleSize(GetHandleSize(Handle(GlobalParts)) + SizeOf(part), Handle(GlobalParts)); HLock(Handle(GlobalParts)); with GlobalParts^^ do begin inc(partCount); with partsinfo[partcount] do begin PartName := MakeNewPartName; partSize := 1; end; RebuildList(GlobalParts^^.partCount); currPart := -1;{reset the list correctly} SetActivePartition(GlobalParts^^.partCount); SelectMember(@myList[currPart], @myListRec); {select new name} SetCtlParams(GlobalParts^^.partCount,5,listScroll1); { InvalRect(listRect1); now done in RebuildList } { InvalRect(listScroll1^^.ctrlRect); } DrawAlloChart(true); {re-draw the chart} end; HUnLock(Handle(GlobalParts)); if (SumPartSizes >= tMegs) then { disable new} TurnOff(NewButton); end else if (itemHit = 7) then { it was the delete partition button...} begin TurnOn(NewButton); if GlobalParts^^.partCount = 2 then { disable delete} TurnOff(DeleteButton); with GlobalParts^^ do begin dec(partcount); for i := selected to partCount do {move the list down} with partsinfo[i+1] do begin PartsInfo[i].PartSize := partSize; PartsInfo[i].PartName := partName; end; RebuildList(1); SelectMember(@myList[1], @myListRec); currpart := -1; SetActivePartition(1); SetCtlParams(GlobalParts^^.partCount,5,listScroll1); { InvalRect(listRect1); now done in RebuildList } { InvalRect(listScroll1^^.ctrlRect); } DrawAlloChart(true); { redraw the chart} end; end; UNTIL (itemHit = 2) or (itemHit = 9); temp := currPart; SetActivePartition(-2); {save the selection} currPart := temp; if itemHit <> 9 then {partition and initialize the Hard Disk} p := @cancelPartStr else if BadPartNames(dupErr) then begin if dupErr then DoAlert('Sorry, you cannot have duplicate partition names.', 'Rename your partitions so that they are unique.') else DoAlert('Sorry, your partition names must have at least', 'one character to be valid for your file system.'); with dumbrect do begin h1 := 240; h2 := 640; v1 := 0; v2 := 200; end; setport(partDlog); invalRect(dumbrect); beginupdate(partDlog); DrawDialog(partDlog); DrawAlloChart(true); {we need to do a total redraw on this one!} endupdate(partDlog); goto 2; end else begin HLock(Handle(globalParts)); j := SetParts(deviceNum,Pointer(GlobalParts^)); { do partitioning } IF j = $4321 THEN GOTO 2; { user canceled } if j = $1234 then p := @PartErrStr else begin p := @SuccessPartStr; { parameters to getvolicon are passed in global infoblk} { infoblk was set during setparts call... This makes the} { current volume look correct when the "main" window is updated } CurVolIcon := GetVolIcon; isLockedDev := FALSE; { isn't locked any more } end; HUnLock(Handle(globalParts)); end; SetLongText(p); { remove the list, so dialog manager doesn't choke!} DisposeControl(listControl1); listControl1 := nil; CloseDialog(partDlog); partDlog := nil; { for safety sake} SetPort(oldPort); 1: { DrawLines; removed by Monte b/c this happens @ update time } END; {################################################################} {# initialize a device, prompt user as neccessary #} {################################################################} procedure InitializeVolume; var nameDlogPtr : GrafPortPtr; itemHit : integer; err : integer; p : stringptr; diskName : STRING[34]; rtnVolName : PACKED ARRAY[0..36] OF CHAR; theGPtr : GSResultPtr; begin { do a format on the (floppy) drive} MakeCursor(watch); if toolerr <> noError then { error from volume call? } diskName := ':UNTITLED' else diskName := {CONCAT(':', dispVolumeStr);} currVolumeStr; MakeGSOSStr(currDeviceStr,s1); theGPtr := GSResultPtr(@rtnVolName); { need xtra step b/c compiler sucks } MakeGSOSStr(diskName, theGPtr^.gstring); { set default name for user to edit } theGPtr^.bufSize := 36; { set buf size } with formatBlk do begin pCount := 6; devName := @s1; volName := @theGPtr^.gstring; FSNumOut := 0; FSNumIn := 0; flags := $C000; { editable name, selectable FST } realVolName := @rtnVolName; end; err := GSOSFormat; (* if err <> noError then begin { p := @formatErrStr; } p := @''; MakeCursor(arrow); itemHit := AlertWindow($0020, NIL, @formatErrAlrt); { tell user } end else begin p := @cancelInitStr; if formatBlk.FSNumOut <> 0 then begin { diskName := GSToP(@theGPtr^.gstring); } p := @successStr; TurnOn(EraseButton); { we can erase it now} { if (diskName[1] = '/') OR (diskName[1] = ':') then delete(diskname,1,1); } { dispVolumeStr := diskname; } SetVolName(GSToP(@theGPtr^.gstring)); end; end; *) { *** removed 8/19/91 by Monte *** } CASE err OF noError : BEGIN p := @cancelInitStr; { assume user cancelled } IF formatBlk.FSNumOut <> 0 THEN { if user didn't cancel } BEGIN SetVolName(GSToP(@theGPtr^.gstring)); p := @successStr; TurnOn(EraseButton); { we can erase it now} END; END; $50 { open file on disk } : p := @initErrOpenStr; OTHERWISE BEGIN { some kind of hard error in formatting } p := @''; MakeCursor(arrow); itemHit := AlertWindow($0020, NIL, @formatErrAlrt); { tell user } END; END; {case} SetLongText(p); MakeCursor(arrow); { end; } (* removed 1/91 by Monte Benaresh else begin CloseDialog(nameDlogPtr); SetLongText(@cancelInitStr); end; *) DrawLines; end; {################################################################} {# erase a device, prompt user as neccessary #} {################################################################} procedure DoErase; var p : stringptr; err : integer; rtnVolName : PACKED ARRAY[0..36] OF CHAR; theGPtr : GSResultPtr; begin MakeCursor(watch); MakeGSOSStr(currDeviceStr,s1); theGPtr := GSResultPtr(@rtnVolName); { need xtra step b/c compiler sucks } MakeGSOSStr(currVolumeStr, theGPtr^.gstring); theGPtr^.bufSize := 36; { set buf size } with formatBlk do begin pCount := 6; devName := @s1; volName := @theGPtr^.gstring; FSNumOut := 0; FSNumIn := 0; flags := $C000; { editable name, selectable FST } realVolName := @rtnVolName; end; err := GSOSErase; p := @cancelEraseStr; if formatBlk.FSNumOut <> 0 then p := @eraseSuccStr; (* if err <> noError then begin *) CASE err OF noError : SetVolName(GSToP(@theGPtr^.gstring)); $50 { open file on disk } : p := @eraseErrOpenStr; OTHERWISE p := @eraseErrStr; END; {case} SetLongText(p); MakeCursor(arrow); end; {################################################################} {# snag tab keys & make'm look like a mouse in the vol button #} {################################################################} function CatchTabs(theDlog : grafportptr; var someEvent : wmTaskRec; var itemhit : integer) : integer; var i : integer; tempCh : char; myname : str255; begin PHB; { added 3/91 by Monte } phk; {make sure data bank is set correctly} plb; CatchTabs := 0; {false} { this routine is called periodically and every time there is an event} { we need to deturmine if our disk has changed, if so we fake a volume} { event so that the user cant do any actions on a ejected device. We} { keep the current devices state in currState - note : we only need to} { check devices that have a removable media} with someEvent do if (wmWhat = 0) and ((tickcount - lastCheck) > 15) then { null event... do our scan} begin lastCheck := tickcount; if isRemovable then begin {now do a status, and compare it to the last one we had} with statusBlk do begin pCount := 5; devNumber := deviceNum; statCode := 0; StatList := @StatResult; RequestCount := 6; end; i := GSOSStatus; if bitand(StatResult.general,$10) <> bitand(currState,$10) then {its changed, go to next device} begin itemhit := 5; {volume} CatchTabs := 1; {True} BlinkButton(GetControlItem(theDlog,5)); end; end; end else begin tempCh := char(loword(bitand(wmMessage,$000000FF))); if (wmWhat = 3) or (wmWhat = 5) then { keydown, autokey} if tempCh = char($9) then { tab!} begin itemhit := 5; {volume} CatchTabs := 1; {True} if bitand(wmModifiers,$800) <> 0 then { option key and tab} begin dec(deviceNum); itemhit := 5; {volume} CatchTabs := 1; {True} end; BlinkButton(GetControlItem(theDlog,5)); end else if tempCh = char($1B) then {escape key} begin itemhit := 10; {cancel} CatchTabs := 1; {True} BlinkButton(GetControlItem(theDlog,10)); end; end; PLB; { caller's DBR } end; {################################################################} {# set the info dialogs info to match the passed device num #} {################################################################} procedure SetDialogInfo(theDlog : GrafPortPtr; dNum : Integer); var thePt : Point; tempStrPtr : StringPtr; temp : ptr; i : integer; junkStr : str255; begin { set the appropriate info for the given device} i := D_Info(dNum, aStr); with infoBlk do begin pCount := 11; devNumber := dNum; devname := @junkStr; end; i := GSOSInfo; SetIText(theDlog,12,@astr); {set the device name} if volume(astr, globalstr1) <> noError then { there was an error- uninitialized?} begin SetIText(theDlog,8,@Uninitialized); {set the volume name} SetIText(theDlog,11,ptr(unknownptr)); SetIText(theDlog,9,@'0 K'); {set used} tempstr1 := concat(LongintToString(Real2Long(infoBlk.totalblocks DIV 2)),'K'); SetIText(theDlog,10,@tempstr1); { set avail} end else begin SetIText(theDlog,8,@globalStr1); {set the volume name} if (file_system_id > $B) or (file_system_id < 1) then if infoblk.devid = $1e then file_system_id := $C else file_system_id := $D; SetIText(theDlog,11,Ptr(FileSysStrTbl[file_system_id])); globalStr2 := concat(LongintToString(Real2Long((total_blks - free_blks +1) DIV 2)),'K'); SetIText(theDlog,9,@globalStr2); tempstr1 := concat(LongintToString(Real2Long(free_blks DIV 2)),'K'); SetIText(theDlog,10,@tempstr1); end; isLockedDev := false; { assume the best} if bitand(infoblk.characteristics, $40) = 0 then { write protected} isLockedDev := true else if bitand(infoblk.characteristics, $80) <> 0 then { block device - see if it's write protected} begin with statusBlk do begin pCount := 5; devNumber := dNum; statCode := 0; StatList := @StatResult; RequestCount := 6; end; i := GSOSStatus; if bitand(StatResult.general,$4) <> 0 then isLockedDev := true; end; (* with thePt do removed b/c this happens at update time -Monte 3/91 begin { v := 35; h := 48; } v := 6; h := 2; end; temp := @unlockicon; if islockeddev then temp := @lockIcon; PlotIconola(temp, thePt, true); *) end; {################################################################} {# build a list that contains all partitions on a drive #} {################################################################} function BuildDInfoList(dNum : integer; theDlog : GrafPortPtr) : integer; VAR miscWord : integer; devindex, devType : integer; i : integer; startindex : integer; doneonce, partedFlag : boolean; localStr : str255; myName : str255; pmapTstHdl : Handle; BEGIN devIndex := dNum; with infoblk do begin pCount := 11; devNumber := devIndex; devname := @myname; devType := devID; end; {DINFO call} i := GSOSInfo; with infoBlk do if headLink <> 0 then begin { re - issue the call with the new head!!!} devIndex := headLink; pCount := 11; devNumber := devIndex; devname := @myname; i := GSOSinfo; end; { check for partitions on this device } partedFlag := FALSE; { assume not partitioned } IF devType = $0005 THEN { SCSI hard disk? } BEGIN { special test for SCSI HD with 1 partition } pmapTstHdl := NewHandle($200, MyMemoryID, attrFixed, nil); IF toolerrornum = 0 THEN BEGIN IntPtr(pmapTstHdl^)^ := $0000; { clear out signature bytes } WITH statusblk DO BEGIN pCount := 5; devNumber := devIndex; statCode := 4; {get partition map} statlist := pmapTstHdl^; requestcount := 512; END; IF (GSOSStatus = 0) AND (IntPtr(pmapTstHdl^)^ = $4D50) THEN partedFlag := TRUE; DisposeHandle(pmapTstHdl); END; END; doneonce := false; {dont look at next link until after we've gone through once} { devIndex now points to the first device in the list} { fill the infolist and set devCount to the correct number} miscword := 0; {init counter} repeat if doneonce then begin devIndex := infoblk.forwardlink; with infoblk do begin pCount := 11; devNumber := devIndex; devname := @myname; end; i := GSOSInfo; end; with statusBlk do begin pCount := 5; devNumber := devIndex; statCode := 0; StatList := @StatResult; RequestCount := 6; end; i := GSOSStatus; if (bitand(StatResult.general,$0010) <> 0) then {if its online, or a cd proceed} begin inc(miscword); with infoList[miscWord], myList[miscword] do begin if D_Info(devIndex,myname) <> noError then devName := 'Bad Device' else if volume(myName, localStr) <> noError then devName := myName else devName := localStr; devNum := devIndex; memPtr := @devName; memFlag := 0; end; if devindex = dNum then startindex := miscword; end else { we hit an offline partition, that means we are at the end!!!!} if (infoblk.devID <> 7) then {if not CDROM, a we're at the end so BYE!} infoblk.forwardlink := 0; { so we will exit - we need this!} doneonce := true; {so we know we need to look at the next link} until (infoblk.forwardlink = 0) or (miscword = 32); { if we found linked devices, count this device as } { partitioned whether it's a SCSI HD or not } IF miscword > 1 THEN partedFlag := TRUE; {kludge beause testing wanted it this way} { if miscword <= 1 then changed 3/5/91 by Monte Benaresh } IF NOT partedFlag THEN begin miscword := 1; startindex := 1; InfoList[1].devName := 'No partitions on this disk.'; InfoList[1].devNum := devIndex; myList[1].memPtr := @InfoList[1].devName; myList[1].memFlag := 0; end; BuildDInfoList := miscword; {return count} with myListRec, listRec do {set up the list record} begin v1 := 65; h1 := 125; v2 := 106; h2 := 375; listsize := miscword; {number of items} listview := 4; listtype := 2; liststart := startindex; listctl := nil; listdraw := nil; listmemheight := 10; listmemsize := sizeof(listmemrec); listpointer := @myList; listrefcon := 0; listscrollclr := nil; end; ListRect1 := myListRec.listRec; listControl1 := CreateList(theDlog,@myListRec); listScroll1 := listControl1^^.CtlListBar; SelectMember(@myList[startindex], @myListRec); SaveAndZeroRefCons; END; {################################################################} {# entry point for displaying a device's "info" #} {################################################################} procedure DoDeviceInfo(dNum : Integer); var InfoDlog : GrafPortPtr; itemHit : integer; numberofParts : integer; { iconPtr : Ptr; moved to globals for update routine by Monte 3/91 } i : integer; thept : Point; myName : str255; begin { display a dialog with device (volume) information } MakeCursor(watch); {----- first create the dialog -----} oldPort := GetPort; InfoDlog := GetNewModalDialog(@InfoDITL); SetPort(InfoDlog); {----- set the general device info ----} with infoBlk do begin pCount := 11; devNumber := dNum; devname := @myname; end; i := GSOSInfo; iconptr := GetVolIcon; {parameters are passed in global infoblk} (* with thePt do this will all get done at update time! -Monte begin v := 6; { h := 29; } h := 34; end; PlotIconola(iconPtr,thePt,false); *) {----- add the list of partitions if any -----} numberofParts := BuildDInfoList(dNum, InfoDlog); {----- set the info for the current device -----} SetDialogInfo(infoDlog, dNum); {----- get & handle events, if a new partition is selected, display it ----} MakeCursor(arrow); repeat { here we create the Partition dialog box - use a custom filter on it} { because we have list controls which clash with the dialog manager } itemHit := ModalDialog(procPtr(Ord4(@myDlogFilter) + $80000000)); if (itemHit = 100) and (numberofparts > 1) then begin for selected := 1 to numberofparts do if myList[selected].memFlag <> 0 then leave; SetDialogInfo(infoDlog, infolist[selected].devNum); end; until (itemHit = 1); DisposeControl(listControl1); {remove the list, so dialog manager doesn't choke!} listControl1 := nil; {so we dont die when trying to partition a device} CloseDialog(InfoDlog); SetPort(oldPort); { now re-scan this device to activate appropriate buttons in Main window } deviceNum := dNum - 1; NextDrive; { re-scan } { DrawLines; removed 3/91 by Monte b/c update takes care of this } end; FUNCTION PartitionOK(partDev : INTEGER): BOOLEAN; { check whether it's OK to partition given device } VAR devIndex, itemClicked, headDev : INTEGER; devUnlocked, fileOpen : BOOLEAN; alertPtr : Ptr; BEGIN { first get head device } WITH infoBlk DO BEGIN pCount := 11; devNumber := partDev; devname := NIL; END; toolErr := GSOSInfo; headDev := infoBlk.headlink; IF headDev = 0 THEN headDev := partDev; { if link was 0, we had head device } { check for open files on all volumes } fileOpen := FALSE; { assume no open files } devIndex := headDev; { start at top } REPEAT { scan this device forward } fileOpen := CheckOpenFiles(devIndex); { make VOLUME call } { set up D_INFO call} WITH infoBlk DO BEGIN devNumber := devIndex; END; toolErr := GSOSInfo; devIndex := infoBlk.forwardlink; { link to next device } UNTIL (devIndex = 0) OR fileOpen; IF fileOpen THEN BEGIN { tell user he can't partition } itemClicked := AlertWindow($0020, NIL, @partOpenAlrt); PartitionOK := FALSE; EXIT(PartitionOK); END; { get here only if no open files on any volume } devUnlocked := TRUE; { assume no locked partitions } devIndex := headDev; { start at top } REPEAT { scan this device forward } { set up D_INFO call} WITH infoBlk DO BEGIN devNumber := devIndex; END; toolErr := GSOSInfo; IF BITAND(infoBlk.characteristics, $0040) = 0 { locked partition? } THEN devUnlocked := FALSE; { some locked partitions } devIndex := infoBlk.forwardlink; { link to next device } UNTIL (devIndex = 0) OR NOT devUnlocked; { now we have scanned through all partitions on this device } { choose alert box accordingly } IF devUnlocked { is it OK so far } THEN alertPtr := @partAlrt ELSE alertPtr := @partLockAlrt; { now warn user } itemClicked := AlertWindow($0020, NIL, alertPtr); { warn user } IF itemClicked <> 1 THEN PartitionOK := FALSE { user declined } ELSE PartitionOK := TRUE; END; {################################################################} {# take care of actions in the main dialog #} {################################################################} procedure ProcessInit; var itemHit : Integer; nameDlogPtr : GrafPortPtr; itemClicked : integer; begin { repeat removed 3/91 by Monte b/c main Dlog now real modeless window! } { itemHit := ModalDialog(procPtr(Ord4(@CatchTabs) + $80000000)); removed by Monte } itemHit := event.wmTaskData4; { ID of ctl that took event } case itemHit of 2 : begin { erase} if toolerr <> noError then { error from volume call? } begin currVolumeStr := '/DISK'; Defname := @':UNTITLED'; end; DoErase; end; 5 : begin {volume} MakeCursor(watch); (* repeat *) NextDrive; {Skip over nonexistent Disk II device and empty 3.5 drives} (* until noDevices or (not (toolErr in [noDevice,noDiskInDrive])); *) MakeCursor(arrow); end; 9 : begin {partition button} (* with WarningItem3 do { set the error text} begin ItemDescr := @warning4Str[1]; ItemValue := length(warning4Str); end; itemClicked := CautionAlert(@WarningAlert,nil); if itemClicked = 2 then *) { removed 8/9/91 to allow check and warning for locked partitions } IF PartitionOK(deviceNum) THEN { check with user first } Initialize {really partition} else BEGIN SetLongText(@cancelPartStr); END; end; 10 : Done := TRUE; { quit application } 11 : InitializeVolume; { initialize button} 12 : begin {zero} (* changed 6/17/91 by Monte with WarningItem3 do { set the error text} begin ItemDescr := @warning3Str[1]; ItemValue := length(warning3Str); end; itemClicked := CautionAlert(@WarningAlert,nil); *) IF CheckOpenFiles(deviceNum) THEN SetLongText(@zeroErrOpenStr) ELSE BEGIN itemClicked := AlertWindow($0020, NIL, @zeroAlrt); { warn user } if itemClicked = 1 then begin MakeCursor(watch); { force update of main dlog } BeginUpdate(InitDlogPtr); MainWindUpdt; { redraw window } EndUpdate(InitDlogPtr); DoDeviceZero(deviceNum, false); dispVolumeStr := unInitStr; { set in case user clicks icon } MakeCursor(arrow); end else SetLongText(@cancelZeroStr); END; end; 13 : DoDeviceInfo(deviceNum); {info} end; {case} if (itemHit <> 10) and noDevices then begin { SetIText(InitDlogPtr,7,@blankStr); } SetLongText(@noDevicesStr); end; { until itemHit = 10; removed 3/91 by Monte b/c Dlog now real modeless window! } end; {################################################################} {# create the main dialog, find first drive, & loop #} {################################################################} function GetInitCtlItem(item : integer) : ControlHandle; begin { GetInitCtlItem := GetControlItem(InitDlogPtr,item); changed 3/91 by Monte } GetInitCtlItem := GetCtlHandleFromID(InitDlogPtr,item); end; PROCEDURE MainWindUpdt; { called only for main window } BEGIN DrawControls(InitDlogPtr); DrawLines; { this draws decorative lines and current disk icons } END; procedure ShowInit; begin deviceNum := 0; { atLeastOneDev := false; } noDevices := false; islockeddev := false; { curVolIcon := @NoName; changed 3/91 by Monte to eliminate NoName icon } curVolIcon := NIL; { PlotIconola now checks this } currDeviceStr := ' '; {initialize it!} subStrArray[0] := @currDeviceStr; lastCheck := tickcount; { InitDlogPtr := GetNewModalDialog(@InitDlog); changed 3/91 by Monte } InitDlogPtr := NewWindow2(NIL, 0, @MainWindUpdt, NIL, 2, mainDlog, rWindParam1); { put up main window } EraseButton := GetInitCtlItem(2); PartButton := GetInitCtlItem(9); InitButton := GetInitCtlItem(11); ZeroButton := GetInitCtlItem(12); InfoButton := GetInitCtlItem(13); CancelButton := GetInitCtlItem(10); { SetPort(InitDlogPtr); this is done in DrawLines -Monte 3/91 } DrawLines; makecursor(watch); { get 1st device } (* repeat *) NextDrive; (* until (not (toolErr in [noDevice,noDiskInDrive])) or noDevices; *) {Find first device on line, skipping over nonexistent Disk II device and empty 3.5 drives} if noDevices then SetLongText(@noDevicesStr); MakeCursor(Arrow); { ProcessInit; removed by Monte } end; {################################################################} {# a little razzle-dazzle in an about box #} {################################################################} procedure DoAboutItem; var aboutDlog : GrafPortPtr; itemHit : integer; { thePt : Point; one : integer; two : integer; three : integer; four : integer; } myWmTaskRec : WmTaskRec; begin { display the about box, wait for user to click ok, then close it!} aboutDlog := GetNewModalDialog(@AboutDITL); { DrawDialog(aboutDlog); } oldPort := GetPort; SetPort(aboutDlog); { one := 0; two := 1; three := 2; four := 3; removed 3/91 by Monte } REPEAT (* thePt.h := 9; thePt.v := 5; { pauseit; removed 1/91 by Monte } PlotIconola(@FakeArray[one], thePt, false); thePt.h := 319; PlotIconola(@FakeArray[two], thePt, false); thePt.v := 73; PlotIconola(@FakeArray[three], thePt, false); thePt.h := 9; PlotIconola(@FakeArray[four], thePt, false); inc(one); inc(two); inc(three); inc(four); if one = 4 then one := 0 else if two = 4 then two := 0 else if three = 4 then three := 0 else if four = 4 then four := 0; removed 3/91 by Monte *) itemHit := ModalDialog(procPtr(Ord4(@myDlogFilter) + $C0000000)); (* until eventavail(10,myWmTaskRec) {mouse down or keypressed}; *) UNTIL ItemHit = 1; CloseDialog(aboutDlog); SetPort(oldPort); end; end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/Event.pii b/IIGS.601.SRC/A.U.G/ADU/Event.pii new file mode 100644 index 0000000..a5f9414 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/Event.pii @@ -0,0 +1 @@ +{################################################################} {# #} {# File: Event.Pas from IIGS Disk Initializer #} {# #} {#--------------------------------------------------------------#} {# #} {# Description: This file has all the routines that handle #} {# the events in the IIGS Disk Initializer. #} {# #} {#--------------------------------------------------------------#} {# #} {# Author: Darryl Lovato #} {# #} {#--------------------------------------------------------------#} {# #} {# Copyright: 1987,1988 by Apple Computer Inc. #} {# All rights reserved. #} {# #} {#--------------------------------------------------------------#} {# #} {# Modification History: #} {# #} {# Who When The Change #} {# --- ------ ------------------------------------- #} {# SR 12/7/87 Created v.1 - erase & init only #} {# DGL 1/29/88 Rewrote everything - cut size in half! #} {# DGL 5/9/88 Finished Adding Partition Support #} {# and other features... far too many to #} {# list here... #} {# DGL 5/12/88 Added Zero and Info operations #} {# DGL 5/20/88 Released pre-alpha version to testers #} {# DGL 6/1/88 Alpha! #} {# DGL 6/13/88 Alpha 2 #} {# DGL 6/24/88 Alpha 3 #} {# DGL 7/1/88 Beta 1 #} {# DGL 7/13/88 Beta 2 #} {# DGL 7/20/88 Beta 3 #} {# DGL 7/27/88 Beta 4 #} {# DGL 8/1/88 Beta 5 #} {# DGL 8/8/88 Beta 6 #} {# DGL 8/15/88 Final! #} {# #} {################################################################} {$LongGLobals-} {$ToolErrorChk-} {$A+} unit Event; interface uses InitIntfData, InitIntfProc, InitIntfPdos, ListMgr, Globals, Utils, Guts, Dialog, Menu; procedure MainEvent; {Main event handling loop which repeats until Quit} implementation {################################################################} {# main event loop, heres where the action is! #} {################################################################} PROCEDURE MainEvent; VAR temp : boolean; lastDA : boolean; taskCode : INTEGER; { nowTick : LONGINT; } hdiResult : LONGINT; hdiFlags, hdiDev : INTEGER; tempErr : INTEGER; clickPoint : Point; BEGIN Event.wmTaskMask := $1FFFFF; {Allow TaskMaster to do everything} Done := false; {Done flag will be set by Quit item} repeat taskCode := TaskMaster(-1,Event); if taskCode = winMenuBar then DoMenu; IF taskCode = wInControl THEN ProcessInit; { handle ctl hitÉ } {Éin main Dlog } IF taskCode = wInContent THEN BEGIN { check for click in icon rectangle } clickPoint := Event.wmWhere; SetPort(InitDlogPtr); { just in case } GlobalToLocal(clickPoint); IF PtInRect(clickPoint, mainIconRect) THEN SetLongText(@dispVolumeStr); { show volume name } END; temp := IsDa(FrontWindow); { dim the edit menu if its a DA on top!} if temp <> lastDA then begin lastDA := temp; if temp then SetmenuFlag($FF7F, 900) else SetmenuFlag($0080, 900); DrawmenuBar; end; { scan for disk inserts/ejects } hdiResult := HandleDiskInsert(hdiScan + hdiEjects, 0); hdiFlags := Longword(hdiResult).HiWord; hdiDev := Longword(hdiResult).LoWord; IF (hdiDev = deviceNum) AND (hdiDev <> 0) THEN { is it our current device? } BEGIN { must have been ejected, so move on to next online device } MakeCursor(watch); {repeat } NextDrive; {Skip over nonexistent Disk II device and empty 3.5 drives} {until noDevices or (not (toolErr in [noDevice,noDiskInDrive])); } MakeCursor(arrow); END ELSE BEGIN { activity in some other device } IF (hdiDev <> 0) AND (BitAND(hdiFlags, $0001) = 0) { was it an insert? } THEN BEGIN MakeCursor(watch); deviceNum := hdiResult-1; { this will cause NextDrive toÉ } NextDrive; {Émove to the inserted device } MakeCursor(arrow); END; END; (* nowTick := GetTick; IF nowTick - lastPoll > 40 THEN { has it been this many ticksÉ } {Ésince last device poll? } BEGIN lastPoll := nowTick; { reset time of last poll } IF deviceNum <> 0 THEN { if we have a device online, check for eject } BEGIN with statusBlk do begin pCount := 5; devNumber := deviceNum; statCode := 0; StatList := @StatResult; RequestCount := 6; end; tempErr := GSOSStatus; IF (tempErr = 0) AND (BitAND(StatResult.general, $0011) = $0001) THEN { offline switched? } BEGIN MakeCursor(watch); { repeat } NextDrive; {Skip over nonexistent Disk II device and empty 3.5 drives} { until noDevices or (not (toolErr in [noDevice,noDiskInDrive])); } MakeCursor(arrow); END; END; END; *) until Done; END; END. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/Globals.pii b/IIGS.601.SRC/A.U.G/ADU/Globals.pii new file mode 100644 index 0000000..a240e78 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/Globals.pii @@ -0,0 +1 @@ +{################################################################} {# #} {# File: Globals.Pas from IIGS Disk Initializer #} {# #} {#--------------------------------------------------------------#} {# #} {# Description: This file has all the global vars and const's #} {# that is used by the IIGS Disk Initializer #} {# #} {#--------------------------------------------------------------#} {# #} {# Authors: Darryl Lovato #} {# #} {#--------------------------------------------------------------#} {# #} {# Copyright: 1987,1988 by Apple Computer Inc. #} {# All rights reserved. #} {# #} {#--------------------------------------------------------------#} {# #} {# Modification History: #} {# #} {# Who When The Change #} {# --- ------ ------------------------------------- #} {# SR 12/7/87 Created v.1 - erase & init only #} {# DGL 1/29/88 Rewrote everything - cut size in half! #} {# DGL 5/9/88 Finished Adding Partition Support #} {# and other features... far too many to #} {# list here... #} {# DGL 5/12/88 Added Zero and Info operations #} {# DGL 5/20/88 Released pre-alpha version to testers #} {# DGL 6/1/88 Alpha! #} {# DGL 6/13/88 Alpha 2 #} {# DGL 6/24/88 Alpha 3 #} {# DGL 7/1/88 Beta 1 #} {# DGL 7/13/88 Beta 2 #} {# DGL 7/20/88 Beta 3 #} {# DGL 7/27/88 Beta 4 #} {# DGL 8/1/88 Beta 5 #} {# DGL 8/8/88 Beta 6 #} {# DGL 8/15/88 Final! #} {# #} {################################################################} {$LongGLobals-} {$ToolErrorChk-} {$A+} unit Globals; interface uses InitIntfData, {HodgePodge Apple IIGS Toolbox Interface Units} InitIntfProc, InitIntfPDOS, ListMgr; {################################################################} {# global constants follow #} {################################################################} CONST arrow = 0; { cursor constants} watch = 1; ScreenMode = $80; {640 mode} MaxX = 640; {Max X clamp (should correspond to ScreenMode} MaxScan = 160; {Max size of scan line} AppleMenuID = 300; AboutItem = 301; FileMenuID = 400; InitItem = 401; QuitItem = 409; {Error Codes returned from VOLUME call} IOError = 39; {$27} NoDevice = 40; OtherOS = 82; {$52} NoDiskInDrive = 47; {$2F} NoError = 0; { constants added by Monte Benaresh for driver partition support } pMapSizeBlks = 64; { # of blocks for partition map } drvrSizeBlks = 32; { # of blocks for each driver partition } sysPartCount = 5; { 1 partition map and 4 driver partitions } rSCSIDrvr = $4D61; rSCSIDescDrvr = $5E72; { new constants to support real modeless main window } mainDlog = $1001; MEraseBut = $0002; MTitleTxt = $0003; MDiskBut = $0005; MStatTxt = $0008; MPartBut = $0009; MCancelBut = $000A; MInitBut = $000B; MZeroBut = $000C; MInfoBut = $000D; rWindParam1 = $800E; { Parameters for NewWindow2 call } { dialog ref cons for easy ID in event filter routine for content update } InfoRef = $1002; DiskNameRef = $1003; InitRef = $1004; AboutRef = $1005; PartRef = $1006; {################################################################} {# global types follow #} {################################################################} TYPE Longword = RECORD LoWord : INTEGER; HiWord : INTEGER; END; Part = record partSize : longint; {size in 1024 of blocks (half-megs) } partName : string[31]; end; PartitionRec = record PartCount : integer; PartsInfo : array[1..1] of Part; end; PartitionPtr = ^PartitionRec; PartitionHdl = ^PartitionPtr; myBlock = record pCount : integer; devNumber : integer; devname : StringPtr; characteristics : integer; totalBlocks : longint; slotNum : integer; unitNum : integer; version : integer; devID : integer; end; infoListRec = record devName : string[32]; devNum : integer; end; NameArrayTbl = array[1..1] of stringPtr; BigIcons = packed array[0..329] of char; LongPtr = ^Longint; IntPtr = ^INTEGER; str32 = string[31]; PartHdl = ^PartPtr; PartPtr = ^PartRec; PartRec = packed record pmSig : Integer; { signiature word - always $504D} pmSigPad : Integer; { reserved for future use} pmMapBlkCount : Longint; { number of blocks in map} pmPyPartStart : Longint; { first physical block of partition} pmPartBlkCount : Longint;{ number of blocks in partition} pmPartName : str32; { partition name} pmPartType : str32; { partition type} pmLgDataStart : Longint; { first logical block of boot code} pmDataCnt : Longint; { number of blocks in data area} pmPartStatus : Longint; { partition status information} pmLgBootStart : Longint; { first logical block of boot code} pmBootSize : Longint; { size in bytes of boot code} pmBootLoad : Longint; { boot code load address} pmBootLoad2 : Longint; { additional boot load information} pmBootEntry : Longint; { boot code entry point} pmBootEntry2 : Longint; { additional boot entry information} pmBootCkSum : Longint; { boot code checksum} pmProcessor : packed array[0..15] of char; { processor type} { boot-specific argument fields copied from Mac HD SC Setup v3.0a2 } CASE INTEGER OF 1: (pmBootSpecific : PACKED ARRAY [0..375] OF BYTE); { placeholder label } 2: ( drvrSig : LongInt; { boot specific argument 1} has_tags : LongInt; {boot specific argument 2} pollByte : LongInt; { boot specific argument 3 } {boot_arg4 : LongInt;} { boot specific argument 4} blindtype : INTEGER; { one of several } shutdown : INTEGER; { set if this drive wants head park } { WARNING: Mac+ boot code doesn't load the last 256 bytes! } pmBootUnused : PACKED ARRAY [0..111] OF BYTE; { unused boot-specific args} pmUnused : packed array[0..247] of char; { other!} ); end; PartStructHdl = ^PartStructPtr; PartStructPtr = ^PartStructRec; PartStructRec = array[0..0] of partrec; { Driver Descriptor and Driver Descriptor Map (DDM) record added by Monte Benaresh } drvrDesc = PACKED RECORD ddBlock : LONGINT; { first block of driver } ddSize : INTEGER; { driver size in blocks } ddType : INTEGER; { system type: 1 = MAC, $F = Apple IIGS } END; DDMRec = PACKED RECORD sbSig : INTEGER; { signiature word - always $4552 in MAC order } sbBlockSize : INTEGER; { block size of device } sbBlkCount : LONGINT; { number of blocks on device } sbDevType : INTEGER; { used internally } sbDevID : INTEGER; { used internally } sbData : LONGINT; { used internally } sbDrvrCount : INTEGER; { number of driver descriptors } sbDDs : PACKED ARRAY [1..61] OF drvrDesc; { driver descriptors } sbUnused : PACKED ARRAY [1..6] of char; { leftover } END; DDMPtr = ^DDMRec; myInfoBlock = record { used for GSOS D_info calls} pCount : integer; devNumber : integer; devname : StringPtr; characteristics : integer; totalBlocks : longint; slotNum : integer; unitNum : integer; version : integer; devID : integer; headlink : integer; forwardlink : integer; end; myWriteBlock = record { used for GSOS D_write calls} pCount : integer; devNum : integer; buffer : Ptr; reqCount : Longint; startBlk : Longint; blkSize : Longint; transCount : Longint; end; myFormatBlock = record { used for GSOS format/erase calls} pCount : integer; devName : Ptr; volName : Ptr; FSNumOut : Integer; {0 = canceled} FSNumIn : Integer; flags : INTEGER; { fields added 2/91 by Monte Benaresh } realVolName : Ptr; end; myReadCapBlk = record xero : integer; { must be zero} twofive : integer; { command and flags} unused1 : longint; { 10 unused bytes} unused2 : longint; unused3 : integer; result : ptr; { return capacity here} end; myStatusBlock = record { used for GSOS D_status calls} pCount : integer; devNumber : integer; statCode : integer; StatList : Ptr; RequestCount : longint; TransferCount : longint; end; myControlBlock = record { used for GSOS D_control calls} pCount : integer; devNumber : integer; CtlCode : integer; CtlList : Ptr; RequestCount : longint; TransferCount : longint; end; myVolumeBlock = record pCount : integer; devName : Ptr; volName : Ptr; totalBlks : longint; freeBlks : longint; fileSysId : integer; blkSize : integer; { next fields added by Monte 8/17/91 } characteristics : INTEGER; end; myStatusResult = record { used for GSOS D_status results} general : Integer; blkCount : Longint; end; myVersionBlock = RECORD pcount : INTEGER; version : INTEGER; END; gsosstring = record size : integer; chars : str255; end; GSStrPtr = ^gsosstring; { added 2/91 by Monte } GSOSResultBuf = PACKED RECORD { added 2/91 by Monte } bufSize : INTEGER; CASE INTEGER OF 1: (rtnSize : INTEGER; data : PACKED ARRAY [0..0] OF BYTE); 2: (gstring : gsosstring); END; GSResultPtr = ^GSOSResultBuf; CapBlockRec = record numBlks : longint; blkSize : longint; end; { next records added 2/91 by Monte } ModeSenseRec = PACKED RECORD { SCSI mode sense status list } version : INTEGER; cmd : Byte; pgFormat : Byte; pgCode : Byte; reserved : PACKED ARRAY [1..9] OF Byte; bufPtr : Ptr; END; SCSIString = PACKED RECORD { SCSI ID string returned by mode sense } garbage : PACKED ARRAY [1..13] OF Byte; IDStr : STRING[50]; END; (* SetConfigRec = PACKED RECORD length : INTEGER; bitmap : INTEGER; DDMptr : Ptr; drvrInfoPtr : Ptr; drvrDataPtr : Ptr; END; *) SetConfigRec = PACKED RECORD drvrNum : INTEGER; DDMBufSize : INTEGER; DDMTransCount : INTEGER; DDMPtr : Ptr; drvrInfoBufSize : INTEGER; drvrInfoTransCount : INTEGER; drvrInfoPtr : Ptr; drvrBufSize : INTEGER; drvrTransCount : INTEGER; drvrDataPtr : Ptr; END; GSOpenRec = PACKED RECORD pcount : INTEGER; refNum : INTEGER; path : Ptr; reqAccess : INTEGER; resNum : INTEGER; access : INTEGER; filetype : INTEGER; auxtype : INTEGER; storType : INTEGER; createTD : PACKED ARRAY [0..7] OF Byte; modTD : PACKED ARRAY [0..7] OF Byte; optList : Ptr; eof : LONGINT; END; GSReadRec = PACKED RECORD pcount : INTEGER; refNum : INTEGER; bufPtr : Ptr; reqCount : LONGINT; transCount : LONGINT; END; GSCloseRec = PACKED RECORD pcount : INTEGER; refNum : INTEGER; END; bootDrvrDescRec = PACKED RECORD { this is format of SCSIDescDrvr resource } pmLgBootStart : LONGINT; pmBootSize : LONGINT; pmBootLoad : LONGINT; pmBootLoad2 : LONGINT; pmBootEntry : LONGINT; pmBootEntry2 : LONGINT; bootArg : PACKED ARRAY [0..127] OF BYTE; END; bootDrvrDescPtr = ^bootDrvrDescRec; bootDrvrDescHdl = ^bootDrvrDescPtr; (* GSGDERec = PACKED RECORD { for GET_DIR_ENTRY } pcount : INTEGER; refNum : INTEGER; reserved : INTEGER; base : INTEGER; disp : INTEGER; nameBuf : Ptr; entryNum : INTEGER; filetype : INTEGER; eof : LONGINT; blocksUsed : LONGINT; createTD : PACKED ARRAY [0..7] OF Byte; modTD : PACKED ARRAY [0..7] OF Byte; access : INTEGER; auxtype : LONGINT; END; *) {################################################################} {# global variables follow #} {################################################################} VAR { variables used in the list manager } partDlog : GrafPortPtr; myListRec : ListRec; myList : array[1..32] of ListMemRec; myListCtrl : ControlHandle; listNameAry : array[1..32] of string[31]; infoList : array[1..32] of infoListRec; selected : integer; astr : str255; s1,s2 : GSOSString; listControl1 : ControlHandle; listScroll1 : ControlHandle; listRect1 : Rect; listCtlRef1 : Longint; listScrollRef1 : Longint; realsize : CapBlockRec; toolErr : integer; {Should be _toolErr, but symbols can't start with _} EraseButton : ControlHandle; PartButton : ControlHandle; InitButton : ControlHandle; ZeroButton : ControlHandle; InfoButton : ControlHandle; { CheckButton : ControlHandle; removed 1/91 by Monte Benaresh BackupButton : ControlHandle; RestoreButton : ControlHandle; } CancelButton : ControlHandle; SizeBar : ControlHandle; NewButton : ControlHandle; DeleteButton : ControlHandle; initPtr : Ptr; { used for startup/shutdown tools} blk : myBlock; { prodos D_Info param block} MyMemoryID : integer; {Application ID assigned by Memory Mgr} Done : boolean; {True when quitting} ToolsZeroPage: Handle; {Handle to Zero page memory for Tools} CurrPart : integer; {-1 = no current partition ; 1..4 = partition #} Event : wmTaskRec; {All events are returned here} deviceNum : integer; lastCheck : longint; CurrCursor : integer; currState : integer; isRemovable : boolean; curVolIcon : Ptr; { atLeastOneDev, } noDevices : boolean; isLockedDev : boolean; initializedDev : boolean; IsFloppy : boolean; tMegs : longint; MaxNumParts : integer; r,mesgBoxRect, initBtnRect : rect; globalstr1 : str255; {used to pass strings to dialog templates!} globalstr2 : str255; InitDlogPtr : GrafPortPtr; GlobalParts : PartitionHdl; currDeviceStr : str255; currVolumeStr : str255; dispVolumeStr : str255; tempstr1 : str255; tempstr2 : str255; miscStr : str255; miscStr1 : str255; dummy : str255; diskBlockSize : Longint; infoBlk : myInfoBlock; statusBlk : myStatusBlock; ctlBlk : myControlBlock; writeBlk : myWriteBlock; volBlk : myVolumeBlock; { added 8/17/91 by Monte } statResult : myStatusResult; dummyBlk : PartRec; ReadCapBlk : myReadCapBlk; FormatBlk : myFormatBlock; modeSenseBlk : ModeSenseRec; setConfigBlk : SetConfigRec; { next added by Monte Benaresh } subStrArray : PACKED ARRAY[0..0] OF StringPtr; iconPtr : Ptr; oldPort : GrafPortPtr; { lastPoll : LONGINT; } { for device polling } tempGLong : LONGINT; {################################################################} {# externally defined global variables follow #} {################################################################} {$XRefVar+} { this is all our structures defined in assembler!} AppleMenuStr: Str255; {For creating menus} FileMenuStr : Str255; EditMenuStr : Str255; DiskErrorAlert : AlertTemplate; {alerts and dialogs} WarningAlert : AlertTemplate; WarningItem3 : ItemTemplate; DiskNameDlog : DialogTemplate; InitDlog : DialogTemplate; InitItem8 : ItemTemplate; AboutDITL : DialogTemplate; PartDITL : DialogTemplate; AlertDITL : DialogTemplate; InfoDITL : DialogTemplate; ToolRec : ToolTable; EditItem : ItemTemplate; EditRect : Rect; NilRect : Rect; {icons} FakeArray : array[0..3] of BigIcons; Floppy : integer; Three : integer; harddisk : integer; ramdisk : integer; cd : integer; tape : integer; appletalk : integer; partition : integer; cdPartition : integer; other : integer; {NoName : integer; removed 3/91 by Monte } lockicon : integer; unlockicon : integer; total_blks : longint; free_blks : longint; file_system_id : integer; FileSysStrTbl : NameArrayTbl; okStr : string; { strings} { PromptStr : string; removed 3/91 by Monte } { ShutDownStr : string; removed 3/91 by Monte } warningStr : string; warning2Str : string; { warning3Str : string; replaced with AlertWindow 6/17/91 by Monte } { badNameErr : string; removed 3/91 by Monte } { warning4Str : string; replaced with AlertWindow 8/9/91 by Monte } { otherOSStr : string; removed 3/91 by Monte } Uninitialized : string; volNameStr : string; successStr : string; { initializingStr:string; removed 1/91 by Monte Benaresh } ReadPartErrStr: string; cancelInitStr : string; AtLeastOneCanceled : string; blankStr : string; unInitStr : string; formatErrStr : string; eraseErrStr : string; eraseErrOpenStr : string; { added 8/5/91 by Monte } initErrOpenStr : string; { added 8/19/91 by Monte } zeroErrOpenStr : string; { added 8/19/91 by Monte } cancelPartStr : string; eraseSuccStr : string; noDevicesStr : string; cancelEraseStr: string; zeroingvolStr : string; zeroingvolSuccess : string; zeroingVolFail : string; startzerovolStr : string; cancelzeroStr : string; PartErrStr : string; { formatPartErrStr : string;} successpartStr : string; DefName : stringPtr; unknownptr : stringptr; scrollArray : array[0..14] of integer; ScrollColor : integer; ScrollColor1 : integer; InvRect, mainIconRect : Rect; { next stuff added by Monte Benaresh } drvrProcessor : PACKED ARRAY [1..4] OF StringPtr; OpenPBlk : GSOpenRec; drvrPath : GSOSString; ReadPBlk : GSReadRec; ClosePBlk : GSCloseRec; hardFmtAlrt, zeroAlrt, partAlrt : PACKED ARRAY [0..0] OF CHAR; partLockAlrt, formatErrAlrt : PACKED ARRAY [0..0] OF CHAR; partOpenAlrt, macConnectAlrt : PACKED ARRAY [0..0] OF CHAR; formatCtlList : PACKED ARRAY [0..0] OF CHAR; initMsgWindow : PACKED ARRAY [0..0] OF CHAR; { pointers to stuff for TLTextMountVolume call } badStart1Str : String; badStart2Str : String; badStart1But : String; badStart2But : String; {$XRefVar-} implementation end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/Guts.pii b/IIGS.601.SRC/A.U.G/ADU/Guts.pii new file mode 100644 index 0000000..3dc26bc --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/Guts.pii @@ -0,0 +1 @@ +{################################################################} {# #} {# File: Guts.Pas from IIGS Disk Initializer #} {# #} {#--------------------------------------------------------------#} {# #} {# Description: This file has all the routines make up #} {# the guts of the program, these routines #} {# do the partitioning and zeroing. #} {# #} {#--------------------------------------------------------------#} {# #} {# Author: Darryl Lovato #} {# #} {#--------------------------------------------------------------#} {# #} {# Copyright: 1987,1988 by Apple Computer Inc. #} {# All rights reserved. #} {# #} {#--------------------------------------------------------------#} {# #} {# Modification History: #} {# #} {# Who When The Change #} {# --- ------ ------------------------------------- #} {# SR 12/7/87 Created v.1 - erase & init only #} {# DGL 1/29/88 Rewrote everything - cut size in half! #} {# DGL 5/9/88 Finished Adding Partition Support #} {# and other features... far too many to #} {# list here... #} {# DGL 5/12/88 Added Zero and Info operations #} {# DGL 5/20/88 Released pre-alpha version to testers #} {# DGL 6/1/88 Alpha! #} {# DGL 6/13/88 Alpha 2 #} {# DGL 6/24/88 Alpha 3 #} {# DGL 7/1/88 Beta 1 #} {# DGL 7/13/88 Beta 2 #} {# DGL 7/20/88 Beta 3 #} {# DGL 7/27/88 Beta 4 #} {# DGL 8/1/88 Beta 5 #} {# DGL 8/8/88 Beta 6 #} {# DGL 8/15/88 Final! #} {# #} {################################################################} { these options turn long addressing on, and turn error checking off} { in addition, they set the pascal comments in assembler on.} {$LongGLobals-} {$ToolErrorChk-} {$ToolErrorChk+} {$A+} unit Guts; interface uses InitIntfData, InitIntfProc, InitIntfPDOS, ListMgr, Globals, Utils; function CallGetNumParts(dNum : integer) : integer; function GetParts(dNum : integer; PartAddr : PartitionPtr) : integer; procedure DoDeviceZero(dNum : Integer; only8Blocks : boolean); function SetParts(dNum : integer; partAddr : PartitionPtr) : integer; PROCEDURE ClearBuf(addr : LONGINT; count : LONGINT; value : INTEGER); EXTERNAL; { added by Monte } implementation {################################################################} {# return the number of partitions on a scsi device! #} {################################################################} { we don't count the partition map itself} FUNCTION CallGetNumParts(dNum : integer) : integer; VAR returnMe : integer; myName : str255; BEGIN with infoblk do begin pCount := 11; devNumber := dNum; devname := @myname; end; {DINFO call} returnme := GSOSInfo; if infoblk.headLink <> 0 then dNum := infoblk.headLink; with statusblk do begin pCount := 5; devNumber := dNum; statCode := 4; {get partition map} statlist := @dummyBlk; requestcount := 512; end; with dummyblk do begin pmSig := $1234; pmMapBlkCount := $1234; end; returnme := GSOSStatus; if dummyBlk.pmSig <> $4D50 then { note backward ordering of bytes} returnMe := 1 else begin returnMe := LoWord(SwapLong(dummyBlk.pmMapBlkCount) - 1); if returnMe < 1 then returnMe := 1; end; CallGetNumParts := returnMe; END; {########################################################} {# read the partition map on a SCSI device #} {########################################################} FUNCTION GetParts(dNum : integer; PartAddr : PartitionPtr) : integer; VAR i, partInd : integer; thePMapHdl : partStructhdl; myname : string[32]; label 1; BEGIN GetParts := noError; {dNum MUST BE THE HEAD OF THE LIST!!!!!} with infoBlk do begin pCount := 11; devNumber := dNum; devname := @myname; end; {DINFO call} i := GSOSInfo; with infoblk do if headLink <> 0 then dNum := headLink; with ReadCapBlk do begin xero := 0; twofive := $0025; result := @realsize; end; with statusblk do begin pCount := 5; devNumber := dNum; statCode := $8025; {read capacity} statlist := @ReadCapBlk; requestcount := 8; end; if GSOSStatus <> 0 then { we dont know how big this drive is, so return error} begin GetParts := -1; { error} goto 1; end; {swap the result in realsize because its returned in mac format!} { Matt G. said I should also add one} realsize.numBlks := swaplong(realsize.numBlks) + 1; realSize.blkSize := swaplong(realsize.blkSize); diskblocksize := realsize.numBlks; with statusblk do begin pCount := 5; devNumber := dNum; statCode := 4; {get partition map} statlist := @dummyBlk; requestcount := 512; end; { status call} if GSOSStatus <> 0 then dummyBlk.pmSig := 0; { this will force a "fake" partition to be made} with partaddr^ do if (dummyBlk.pmSig <> $4D50) or { note backward ordering of bytes} (partcount = 1) or (Upperstring(AryToStr(@dummyBlk.pmPartType,32)) = 'APPLE_PRODOS') then begin { reset existing partition structure } partcount := 1; with partsinfo[1] do begin partSize := Real2Long((realsize.numBlks - $40) / 1024); partName := 'UNTITLED1'; end; end else begin thePMapHdl := PartStructHdl(NewHandle(sizeof(partrec) * (partcount + 1), MyMemoryID, attrBank+attrPage, nil)); with statusblk do begin pCount := 5; devNumber := dNum; statCode := 4; {get partition map} statlist := Ptr(thePMapHdl^); requestcount := 512 * (partcount + 1); end; i := GSOSStatus; {this should never happen, it succeeded above!} partInd := 1; { init index into our info record } for i := 1 to PartCount+1 do with partsinfo[partInd], thePMapHdl^^[i-1] do begin (* partSize := Real2Long(SwapLong(pmPartBlkCount) / 1024); partName := AryToStr(@pmPartName,32); if (Upperstring(AryToStr(@pmPartType,32)) = 'APPLE_FREE') or (Upperstring(AryToStr(@pmPartType,32)) = 'APPLE_SCRATCH') { OR (Upperstring(AryToStr(@pmPartType,32)) = 'APPLE_DRIVER') } then PartCount := PartCount - 1; {we dont want to display this} *) IF (Upperstring(AryToStr(@pmPartType,32)) <> 'APPLE_FREE') AND (Upperstring(AryToStr(@pmPartType,32)) <> 'APPLE_PARTITION_MAP') AND (Upperstring(AryToStr(@pmPartType,32)) <> 'APPLE_SCRATCH') AND (Upperstring(AryToStr(@pmPartType,32)) <> 'APPLE_DRIVER') THEN BEGIN partSize := Real2Long(SwapLong(pmPartBlkCount) / 1024); partName := AryToStr(@pmPartName,32); partInd := SUCC(partInd); END; end; PartCount := partInd - 1; { set accurate count } Disposehandle(Handle(thePMapHdl)); { get rid of partition map } end; tMegs := Real2Long(realsize.numBlks / 1024); 1: END; {################################################################} {# zero-out blocks on a device #} {################################################################} procedure DoDeviceZero(dNum : Integer; only8Blocks : boolean); var i : integer; avail : longint; counter : longint; handleSize : longint; { multiple : longint; removed 3/91 by Monte } blocksToZero, writeBlks : longint; H : Handle; l : longPtr; err : integer; j : longint; theCtl : ControlHandle; myname : str255; label 1; begin if not only8blocks then {we only want this message when the user said to zero..} SetLongText(@startzerovolStr); { find the size of the volume to erase} with infoBlk do begin pCount := 11; devNumber := dNum; devname := @myname; end; {DINFO call} i := GSOSInfo; with infoBlk do if not only8Blocks then BlocksToZero := totalblocks else if (totalBlocks < 8) then BlocksToZero := totalBlocks else BlocksToZero := 8; { find the largest block of memory that we can allocate, even number of divisions} compactmem; avail := maxblock div 1024; { get total mem available/2 and convert to blocks} {first assume we will need multiple blocks} handleSize := avail; { multiple := (BlocksToZero div avail); removed 3/91 by Monte Benaresh } if avail > BlocksToZero then { we can do it with one block} begin handleSize := BlocksToZero {- 1} ; { multiple := 1; } end; {create the block} H := NewHandle(handlesize * 512, MyMemoryID,0,nil); {this has to work!} {zero this block out} l := LongPtr(H^); { j := 1; } { removed by Monte 11/90 } { repeat } { l^ := $444C444C; }{DLDL} { l := LongPtr(Ord4(l) + 4); } { j := j + 1; } { until (j = (handleSize * 128)); } ClearBuf(ORD4(l), handleSize * 512, $4842 { 'BH' } ); { call assembly loop } if not only8blocks then {we only want this message when the user said to zero..} SetLongText(@zeroingvolStr); { write it once if its a floppy, to get the motor running!} with infoblk do if (devid = 0) or (devid = $14) then {floppy} begin with writeblk do begin pCount := 6; devNum := dNum; buffer := Ptr(H^); reqCount := handleSize * 512; startBlk := 0; blkSize := 512; transCount := 0; end; err := GSOSWrite; if not ((err = $2E) or (err = 0)) then begin DisposeHandle(h); SetLongText(@zeroingVolFail); {we dont need to dim erase because we didn't kill the formatting?} goto 1; {get out!} end; end; { for loop that writes & increments the start ptr} counter := 0; { for i := 1 to multiple do removed 3/91 by Monte } REPEAT begin writeBlks := BlocksToZero - counter; IF writeBlks > handleSize THEN writeBlks := handleSize; { write it} with writeblk do begin pCount := 6; devNum := dNum; buffer := Ptr(H^); reqCount := writeBlks * 512; startBlk := counter; blkSize := 512; transCount := 0; end; if GSOSWrite <> 0 then begin DisposeHandle(h); if not only8blocks then begin SetLongText(@zeroingVolFail); {dim erase because we killed the formatting} TurnOff(EraseButton); end; goto 1; {get out!} end; counter := counter + writeBlks; end; UNTIL (counter = BlocksToZero); {dispose the block} Disposehandle(h); if not only8blocks then {we only want this message when the user said to zero..} begin SetLongText(@ZeroingVolSuccess); {dim erase because we killed the formatting} Turnoff(EraseButton); end; 1: end; {################################################################} {# write new partition map & initialize the new volumes #} {################################################################} function SetParts(dNum : integer; partAddr : PartitionPtr) : integer; var i, totPartCount, charInd : INTEGER; thePStructHdl : partStructhdl; blocksCounted, tempLong, drvrStartBlk : longint; err, drvrByteSize, drvrResID : integer; blocksLeft : longint; saveme, driverBufLen : integer; partStart : Longint; hdlSize : longint; temp : longint; nameDlogPtr, formatMsgWind, old2Port : GrafPortPtr; itemHit, genResFileID : integer; diskName : str255; myName : str255; drvrHdl : Handle; theDrvrDescHdl : bootDrvrDescHdl; theDrvrDescPtr : bootDrvrDescPtr; theSCSIString : SCSIString; fileDrvr, hardFmtFlag, drvrErrF, macCompatF : BOOLEAN; DDMMyPtr : DDMPtr; LABEL 2999, 3111, 199, 99, 101; begin MakeCursor(watch); err := 0; SetParts := 0; { assume no error} {dNum MUST BE THE HEAD OF THE LIST!!!!!} with infoblk do begin pCount := 11; devNumber := dNum; devname := @myname; end; i := GSOSInfo; with infoblk do if headLink <> 0 then dNum := headLink; { deviceNum := dNum; } { first find the total size of the partitions, along with the remainder } { account for DDM, partition map & driver partitions } blocksCounted := 1 + pMapSizeBlks + (4 * drvrSizeBlks); { scan our internal structure of user parts and do accounting on allocated blks } { for each partition, partSize is the # of half-megabytes } with partAddr^ do for i := 1 to partcount do with Partsinfo[i] do begin if partsize < 1 then { make sure we don't have a half a part!} partsize := 1; blocksCounted := (partSize * 1024) + blocksCounted; end; blocksLeft := diskblocksize - blocksCounted; { total partition count is # of user parts + system parts + possible FREE part } totPartCount := partAddr^.partcount + 1 + sysPartCount; IF blocksLeft < 1 THEN totPartCount := PRED(totPartCount); { no FREE partition } { allocate handle big enough for all our partitions } hdlSize := 512 * totPartCount; thePStructHdl := PartStructHdl(NewHandle(hdlSize, MyMemoryID, attrBank+attrPage,nil)); IF toolerrornum <> 0 THEN BEGIN ShowNoMem; { dialog } SetParts := $1234; { flag error } GOTO 2999; END; HLock(handle(thePStructHdl)); {zero this block out} (* removed 2/7/91 by Monte Benaresh l := LongPtr(@thePStructHdl^^[0]); for i := 1 to (hdlSize div 4) do begin l^ := 0; l := LongPtr(Ord4(l) + 4); end; *) ClearBuf(ORD4(@thePStructHdl^^[0]), hdlSize, $0000); { call assembly loop } { **** fill partition map image **** } { start with generic default data for all partitions } FOR i := 0 TO totPartCount-1 DO WITH thePStructHdl^^[i] DO { MUST use WITH to avoid compiler bugs! } BEGIN pmSig := $4D50; {backwards $504D} pmMapBlkCount := SwapLong(totPartCount); pmPartStatus := SwapLong($37); { not bootable is default} END; { fill each set of partitions } partStart := 1; { starting block of current partition } { partition map partition entry } WITH thePStructHdl^^[0] DO { MUST use WITH to avoid compiler bugs! } BEGIN pmPyPartStart := SwapLong(partStart); pmPartname := StrToAry32('Apple'); pmPartType := StrToAry32('Apple_partition_map'); pmPartBlkCount := SwapLong(pMapSizeBlks); END; partStart := partStart + pMapSizeBlks; { driver partition entries } drvrStartBlk := partStart; { save block # of 1st drvr for DDM } FOR i := 1 TO 4 DO WITH thePStructHdl^^[i] DO { MUST use WITH to avoid compiler bugs! } BEGIN pmPyPartStart := SwapLong(partStart); pmPartname := StrToAry32(CONCAT('Driver', CHAR(i+ORD('0')))); pmPartType := StrToAry32('Apple_Driver'); pmPartBlkCount := SwapLong(tempLong); pmPartBlkCount := SwapLong(drvrSizeBlks); { copy driver processor string from table of ptrs into array } charInd := 0; { init character index } REPEAT charInd := SUCC(charInd); pmProcessor[charInd-1] := drvrProcessor[i]^[charInd]; UNTIL charInd = ORD(drvrProcessor[i]^[0]); { compare to length byte } partStart := partStart+drvrSizeBlks; END; { user partition entries } FOR i := 5 TO (4+partAddr^.partcount) DO BEGIN WITH partAddr^.partsInfo[i-4], thePStructHdl^^[i] DO { MUST use WITH to avoid compiler bugs! } BEGIN pmPyPartStart := SwapLong(partStart); pmPartname := StrToAry32(partName); pmPartType := StrToAry32('Apple_PRODOS'); { if we overran disk size, trim off the end of last user partition } IF (blocksLeft < 0) AND (i = partAddr^.partcount+4) THEN pmPartBlkCount := SwapLong((Longint(partSize) * 1024) + blocksLeft) ELSE pmPartBlkCount := SwapLong(Longint(partSize) * 1024); pmPartStatus := SwapLong($0000003F); { bootable} partStart := partStart+SwapLong(pmPartBlkCount); END; END; { possible FREE partition } IF blocksLeft > 0 THEN WITH thePStructHdl^^[totPartCount-1] DO { MUST USE WITH to avoid compiler bugs! } BEGIN pmPyPartStart := SwapLong(partStart); pmPartname := StrToAry32('Apple'); pmPartType := StrToAry32('Apple_Free'); pmPartBlkCount := SwapLong(blocksLeft) END; { copy redundant information between fields } FOR i := 0 TO totPartCount-1 DO WITH thePStructHdl^^[i] DO { MUST use WITH to avoid compiler bugs! } pmDataCnt := pmPartBlkCount; { if only 1 user partition, find out whether user wants hard format } hardFmtFlag := FALSE; { assume NO hard format } IF partAddr^.partcount = 1 THEN { 1 user partition? } BEGIN MakeCursor(arrow); i := AlertWindow($0020, NIL, @hardFmtAlrt); { prompt user } MakeCursor(watch); IF i = 0 THEN BEGIN { user canceled } SetParts := $4321; { indicate cancel } GOTO 3111; { return to caller } END; IF i = 2 THEN hardFmtFlag := TRUE; END; { now we have to make sure all partitions are unlocked } i := dNum; { start at head } { set up param blocks } WITH ctlBlk DO BEGIN pCount := 5; ctlCode := $F001; { set partition status } ctlList := @tempLong; { keep list in small variable } requestCount := 2; END; tempLong := $00000130; { set bitmap for read-/write-enable } WITH infoBlk DO BEGIN pCount := 11; devname := NIL; END; { set read/write status in a loop } REPEAT ctlBlk.devNumber := i; err := GSOSControl; { make control call } IF NOT (err IN [0, $0022, $002F]) { allow bad param for unpartitionedÉ } THEN GOTO 2999; {Édisk, or offline } { get next linked device } infoBlk.devNumber := i; IF GSOSInfo <> 0 THEN GOTO 2999; { make D_INFO call } i := infoBlk.forwardLink; UNTIL i = 0; { cycle for all linked devices } IF hardFmtFlag THEN BEGIN { do a SCSI-specific hard format } { put up alert window } old2Port := GetPort; formatMsgWind := GetNewModalDialog(@initMsgWindow); SetPort(formatMsgWind); BeginUpdate(formatMsgWind); DrawDialog(formatMsgWind); EndUpdate(formatMsgWind); WITH ctlBlk DO BEGIN pCount := 5; devNumber := dNum; CtlCode := $8004; { format device } ctllist := @formatCtlList; requestcount := 0; END; err := GSOSControl; { do hard format } { close alert window } CloseDialog(formatMsgWind); SetPort(old2Port); IF err <> 0 THEN GOTO 2999; { error in hard format } { now find out whether user wants Mac compatibility, i.e., a partition map } macCompatF := FALSE; { assume Mac compatibility } MakeCursor(arrow); i := AlertWindow($0020, NIL, @macConnectAlrt); { prompt user } MakeCursor(watch); IF i = 1 THEN macCompatF := TRUE; END; {hard format} IF (NOT hardFmtFlag) OR (macCompatF) THEN BEGIN {partition} { do entire partition process } { write out partition map } with ctlBlk do begin pCount := 5; devNumber := dNum; CtlCode := 9; {set partition map} ctllist := Ptr(thePStructHdl^); requestcount := 512 * totPartCount; end; { control call } if GSOSControl <> 0 then begin { error writing partition map } setparts := $1234; {so I can trap this later!} HUnLock(handle(thePStructHdl)); DisposeHandle(handle(thePStructHdl)); goto 2999; end; { prepare SCSI boot driver image } { use 2nd driver image buffer for DDM } DDMMyPtr := DDMPtr(@thePStructHdl^^[2]); fileDrvr := FALSE; { assume that driver will not be loaded from separate file } drvrErrF := FALSE; { assume driver will be installed successfully } { get SCSI ID string to determine whether this is an Apple drive } WITH statusBlk DO BEGIN pCount := 5; devNumber := dNum; statCode := $801A; { SCSI mode sense } StatList := @modeSenseBlk; RequestCount := SizeOf(SCSIString); END; WITH modeSenseBlk DO BEGIN version := 0; cmd := $1A; { command # for Mode Sense } pgFormat := $00; pgCode := $30; { magic number } bufPtr := @theSCSIString; END; { decide which driver to use based on MODE SENSE status call } err := GSOSStatus; IF (err = 0) AND (Copy(theSCSIString.IDStr,1,6) = 'APPLE ') THEN BEGIN { Apple hard disk } drvrResID := 1; { ID of Apple driver } END ELSE BEGIN { non-Apple HD, read generic driver from file } genResFileID := OpenResourceFile($0001, NIL, @drvrPath); IF toolerrornum <> 0 THEN GOTO 99; { skip driver if error } fileDrvr := TRUE; { indicate that we did open a resource file } drvrResID := 2; { ID of generic driver } END; drvrHdl := LoadResource(rSCSIDrvr, drvrResID); IF toolerrornum <> 0 THEN GOTO 99; theDrvrDescHdl := bootDrvrDescHdl(LoadResource(rSCSIDescDrvr, drvrResID)); IF toolerrornum = 0 THEN GOTO 101; { skip error message } 99: { handle error getting driver resources } drvrErrF := TRUE; { set flag for later } MakeCursor(arrow); { DoAlert('Unable to load Mac Generic driver. HFS partitions', 'will not be usable on Macintosh computers.'); } DoAlert('Unable to load the Macintosh driver. HFS partitions', 'will not be usable on Macintosh computers.'); GOTO 199; 101: { resume here if no error getting driver resources } driverBufLen := GetHandleSize(drvrHdl); { update driver partition map entry with info in descriptor resource } theDrvrDescPtr := theDrvrDescHdl^; WITH thePStructHdl^^[1] DO BEGIN pmPartname := StrToAry32('Macintosh'); { this enables checksum verification } pmPartStatus := SwapLong($7F); { bootable } pmLgBootStart := theDrvrDescPtr^.pmLgBootStart; pmBootSize := theDrvrDescPtr^.pmBootSize; pmBootLoad := theDrvrDescPtr^.pmBootLoad; pmBootLoad2 := theDrvrDescPtr^.pmBootLoad2; pmBootEntry := theDrvrDescPtr^.pmBootEntry; pmBootEntry2 := theDrvrDescPtr^.pmBootEntry2; pmBootCkSum := SwapLong(DrvrCksum((drvrHdl^), { take swapped hi wrd b/c mac order! } RealSwapInt(Longword(theDrvrDescPtr^.pmBootSize).HiWord))); { copy boot-specific arguments } FOR i := 0 TO 127 DO pmBootSpecific[i] := theDrvrDescPtr^.bootArg[i]; END; 199: { jump here to skip driver stuff due to error } { set up Driver Descriptor Map image } { start with a clean buffer } ClearBuf(ORD4(@thePStructHdl^^[2]), $200, $0000); { call assembly loop } WITH DDMMyPtr^ DO BEGIN { NOTE MAC BYTE SEX IN ALL FIELDS!! } sbSig := $5245; { backwards $4552 } sbBlockSize := $0002; { backwards $0200 } sbBlkCount := SwapLong(diskblocksize); sbDevType := $0100; { backwards $0001 } sbDevID := $0100; { backwards $0001 } sbDrvrCount := $0100; { we only install 1 driver } WITH sbDDs[1] DO BEGIN ddBlock := SwapLong(drvrStartBlk); ddSize := RealSwapInt(driverBufLen DIV $200); ddType := $0100; { MAC system type = 1 } END; END; { write out DDM and driver image if preceeding went OK } { if any error with driver, we write a DDM with no driver entry } IF drvrErrF THEN BEGIN { nullify driver entry in DDM } WITH DDMMyPtr^ DO BEGIN { NOTE MAC BYTE SEX IN ALL FIELDS!! } sbDrvrCount := $0000; { no driver installed } WITH sbDDs[1] DO BEGIN ddBlock := $00000000; ddSize := $0000; ddType := $0000; END; END; END; WITH ctlBlk DO BEGIN pCount := 5; devNumber := dNum; CtlCode := $F000; { set hard disk params } ctllist := @setConfigBlk; requestcount := 26; { size of control list } END; WITH setConfigBlk DO BEGIN drvrNum := 1; { the Macintosh driver } DDMBufSize := $200; DDMPtr := Ptr(DDMMyPtr); IF NOT drvrErrF THEN BEGIN { driver written OK } drvrInfoBufSize := $200; drvrInfoPtr := @thePStructHdl^^[1]; drvrBufSize := driverBufLen; drvrDataPtr := drvrHdl^; END ELSE { no driver, just write DDM } BEGIN { driver written OK } drvrInfoBufSize := 0; drvrInfoPtr := NIL; drvrBufSize := 0; drvrDataPtr := NIL; END; END; IF GSOSControl <> 0 THEN BEGIN { error writing DDM, map entry, & driver } MakeCursor(arrow); IF drvrErrF THEN { give different message based on whether weÉ } {Éhave successfully acquired the Mac driver } DoAlert('This device appears unreliable.', 'The partition map may be incomplete.') ELSE { show alert telling user this failed } DoAlert('Unable to install the HFS boot driver. This device', 'appears unreliable.'); END; (* 199: { jump here to skip driver stuff due to error } *) HUnLock(drvrHdl); { if we opened separate resource file for generic driver, close it } IF fileDrvr THEN CloseResourceFile(genResFileID); { dump handle if we allocated it } END; {partition} { end of partition stuff if no hard format } {------- now we need to initialize all of the new partitions' device id's ------} i := 1; repeat {start at dNum (the head), initialize each volume until there are no more!} {dNum MUST BE THE HEAD OF THE LIST!!!!!} if i > 1 then dNum := saveme; with infoblk do begin pCount := 11; devNumber := dNum; devname := @myname; end; if GSOSInfo <> 0 then ; saveme := infoblk.forwardLink; with statusBlk do begin pCount := 5; devNumber := dNum; statCode := 0; StatList := @StatResult; RequestCount := 6; end; if GSOSStatus <> 0 then; {this isn't important} if bitand(StatResult.general,$0010) <> 0 then {its online, proceed} begin diskname := partAddr^.Partsinfo[i].partName; if diskname[1] <> '/' then diskname := concat('/', diskName); DoDeviceZero(dNum, true); {wipe out the first 8 blocks!} if D_Info(dNum,myname) <> noError then begin setparts := $1234; goto 2999; end else begin MakeGSOSStr(myName,s1); MakeGSOSStr(diskName,s2); with formatBlk do begin pCount := 5; devName := @s1; volName := @s2; FSNumOut := 0; FSNumIn := 0; flags := $C000; { editable name, selectable FST } end; IF hardFmtFlag AND (NOT macCompatF) THEN err := GSOSErase ELSE err := GSOSFormat; MakeCursor(arrow); if (err = noError) and (formatBlk.FSNumOut = 0 ) then DoAlert(concat('Initialization of the disk "',diskName,'" has been'), 'canceled. It will not be displayed in the Finder.') else if err = $40 then DoAlert(concat('Initialization failed! "',diskName,'" was not'), 'a valid disk name.') else if err <> noError then DoAlert('Initialization failed! There was an error trying to ', concat('initialize the partition named "',diskname,'".')); MakeCursor(watch); end; end else { we hit an offline partition, that means we are at the end!!!!} saveme := 0; { so we will exit} inc(i); until (saveme = 0); GOTO 3111; { no error } 2999: { error exit } setparts := $1234; 3111: { general exit } HUnLock(handle(thePStructHdl)); DisposeHandle(handle(thePStructHdl)); { set some reasonable volume string in case user clicks icon } toolErr := volume(currDeviceStr, currVolumeStr); CASE toolErr OF IOError, OtherOS : dispVolumeStr := unInitStr; noError : SetVolName(currVolumeStr); end; {case} MakeCursor(arrow); end; end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/Init.pii b/IIGS.601.SRC/A.U.G/ADU/Init.pii new file mode 100644 index 0000000..a256c90 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/Init.pii @@ -0,0 +1 @@ +{################################################################} {# #} {# File: Init.Pas from IIGS Disk Initializer #} {# #} {#--------------------------------------------------------------#} {# #} {# Description: This file is the main file for the IIGS disk #} {# initializer. #} {# #} {#--------------------------------------------------------------#} {# #} {# Authors: Darryl Lovato #} {# #} {#--------------------------------------------------------------#} {# #} {# Copyright: 1987,1988 by Apple Computer Inc. #} {# All rights reserved. #} {# #} {#--------------------------------------------------------------#} {# #} {# Modification History: #} {# #} {# Who When The Change #} {# --- ------ ------------------------------------- #} {# SR 12/7/87 Created v.1 - erase & init only #} {# DGL 1/29/88 Rewrote everything - cut size in half! #} {# DGL 5/9/88 Finished Adding Partition Support #} {# and other features... far too many to #} {# list here... #} {# DGL 5/12/88 Added Zero and Info operations #} {# DGL 5/20/88 Released pre-alpha version to testers #} {# DGL 6/1/88 Alpha! #} {# DGL 6/13/88 Alpha 2 #} {# DGL 6/24/88 Alpha 3 #} {# DGL 7/1/88 Beta 1 #} {# DGL 7/13/88 Beta 2 #} {# DGL 7/20/88 Beta 3 #} {# DGL 7/27/88 Beta 4 #} {# DGL 8/1/88 Beta 5 #} {# DGL 8/8/88 Beta 6 #} {# DGL 8/15/88 Final! #} {# #} {################################################################} {$LongGLobals-} {$ToolErrorChk-} {$A+} program Init; uses InitIntfData, InitIntfProc, InitIntfPdos, ListMgr, Globals, Utils, Guts, Dialog, Menu, Event; {################################################################} {# startup tools here, return false if we failed #} {################################################################} function StartUpTools : boolean; VAR theVerPBLK : myVersionBlock; begin { first check OS version } theVerPBLK.pcount := 1; IF (CallGSOS(@theVerPBLK, $202A) <> 0) OR { if error, must be bad version } (BITAND(theVerPBLK.version, $7FFF) < $0400) { want GS/OS 4.0 (SD 6.0) or later } THEN BEGIN StartUpTools := FALSE; { can't run!! } EXIT(StartUpTools); END; listControl1 := nil; partDlog := nil; TLStartUp; {Init Tool Locator } MyMemoryID := MMStartUp;{Init Memory Manager} GlobalParts := PartitionHdl(NewHandle(2 + sizeof(part),MyMemoryID,attrBank+attrPage,nil)); InitPtr := StevesStartupTools(myMemoryID,0,@ToolRec); startuptools := (NOT istoolerror); CurrCursor := -1; {init global} SetCtlParamPtr(@subStrArray); { register runtime strings with Control Mgr } MakeCursor(arrow); {Init watch cursor} end; {of StartUpTools} {################################################################} {# Here's the main event! #} {################################################################} begin {of MAIN program Init} if StartUpTools then begin { Initialize IIGS Tools } SetUpMenus; { Set up menus } MakeCursor(arrow);{ put this up for a while} ShowInit; { display main window } { added 3/6/91 by Monte Benaresh } { suppress detection of initial device inserts } tempGLong := HandleDiskInsert(hdiUpdate, 0); { update all devices } MainEvent; { Use application } end ELSE BEGIN { tell user we can't run } tempGLong := TLTextMountVolume(@badStart1Str, @badStart2Str, @badStart1But, @badStart2But); END; SANEShutDown; { need this due to compiler bug } StevesShutDownTools(0,initPtr); { Shut down IIGS Tools } end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/InitIntfData.pii b/IIGS.601.SRC/A.U.G/ADU/InitIntfData.pii new file mode 100644 index 0000000..3ebc661 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/InitIntfData.pii @@ -0,0 +1 @@ +UNIT InitINTFDATA; CONST { Modifier Flags } Btn1State = 64; Btn0State = 128; AppleKey = 256; ShiftKey = 512; CapsLock = 1024; OptionKey = 2048; ControlKey = 4096; KeyPad = 8192; attrBank = $0001; attrAddr = $0002; attrPage = $0004; attrNoSpec = $0008; attrNoCross = $0010; attrFixed = $4000; attrLocked = $8000; Ok = 1; Cancel = 2; ButtonItem = 10; StatText = 15; EditLine = 17; IconItem = 18; LongStatText = 16; longStatText2 = 22; ItemDisable = $8000; srcCopy = $0000; ActiveFlag = 1; ActivateEvt = 8; wInGoAway = 22; wInMenuBar = 17; wInSpecial = 25; wInControl = $0021; wInContent = $0013; atItemListLength = 7; { constants for new HandleDiskInsert call } hdiScan = $8000; { flag bits } hdiPrompt = $4000; hdiUpdate = $2000; hdiEjects = $1000; hdiNow = $0800; TYPE SignedByte = -128..127; {1 byte} Byte = 0..255; {2 bytes} Ptr = ^SignedByte; {4 bytes} Handle = ^Ptr; {4 bytes} ProcPtr = Ptr; {4 bytes} Fixed = longint; {4 bytes} Str255 = String [255]; {Pascal or C string} StringPtr = ^Str255; {4 bytes} StringHandle = ^StringPtr; {4 bytes} CStringPtr = Ptr; {4 bytes} CStringHandle = Handle; {4 bytes} SCB = Integer; { Bits Meaning 0-3 ColorTable 4 Reserved 5 Fill, 0=off, 1=on 6 Interrupt, 0=off, 1=on 7 ColorMode, 0=320, 1=640 } ToolTable = packed record NumTools : integer; Tools : array [1..30] of record TSNum : integer; MinVersion : integer; end; end; VHSelect = (v,h); PointPtr = ^Point; Point = packed record case integer of 0: (v : integer; h : integer); 1: (vh : array [VHSelect] of integer); end; RectPtr = ^Rect; Rect = packed record case integer of 0: (v1 : integer; h1 : integer; v2 : integer; h2 : integer); 1: (vh1 : Point; vh2 : Point); end; ColorValue = integer; {Bits: 0000RRRRGGGGBBBB} ColorTablePtr = ^ColorTable; ColorTable = array [0..15] of ColorValue; AnSCBByte = Byte; {Scanline control byte} LocInfo = packed record portSCB : AnSCBByte; liReserved : Byte; ptrToPixImage : Ptr; lwidth : integer; boundsRect : Rect; end; RgnHndl = ^RgnPtr; RgnPtr = ^Region; Region = packed record rgnSize : integer; rngBBox : Rect; {Reserve storage for more data here if not rectangular} end; Pattern = array [0..15] of integer; Mask = array [0..3] of integer; QDProcsPtr = ^QDProcs; QDProcs = packed record stdText : ProcPtr; stdLine : ProcPtr; stdRect : ProcPtr; stdRRect : ProcPtr; stdOval : ProcPtr; stdArc : ProcPtr; stdPoly : ProcPtr; stdRgn : ProcPtr; stdPixels : ProcPtr; stdComment : ProcPtr; stdTxMeas : ProcPtr; stdTxBnds : ProcPtr; stdGetPic : ProcPtr; stdPutPic : ProcPtr; end; LocInfoRec = packed record PortSCB: SCB; PixelImage: Ptr; Width: Integer; BoundsRect: Rect; end; GrafPortPtr = ^GrafPort; GrafPort = packed record portInfo : LocInfo; portRect : Rect; clipRgn : RgnHndl; visRgn : RgnHndl; bkPat : Pattern; pnLoc : Point; pnSize : Point; pnMode : integer; pnPat : Pattern; pnMask : Mask; pnVis : integer; fontName : Handle; fontID : longint; fontFlags : integer; txSize : integer; txFace : integer; txMode : integer; spExtra : Fixed; chExtra : Fixed; fgColor : integer; bgColor : integer; picSave : Handle; rgnSave : Handle; polySave : Handle; grafProcs : QDProcsPtr; arcRot : integer; userField : longint; sysField : longint; end; PicHndl = ^PicPtr; PicPtr = ^Picture; Picture = packed record picSize : integer; picFrame : Rect; {Picture bytes go here -- reserve storage} end; FontID = packed record famNum : integer; fontStyle : Byte; fontSize : Byte; end; FontInfoRecord = packed record ascent : integer; descent : integer; widMax : integer; leading : integer; end; MenuRecPtr = ^MenuRec; MenuRecHndl = ^MenuPtr; MenuRec = packed record menuID : integer; menuWidth : integer; menuHeight : integer; menuProc : ProcPtr; menuFlag : Byte; menuRes : Byte; firstItem : Byte; numOfItems : Byte; titleWidth : integer; titleName : StringPtr; end; WindColorPtr = ^WindColor; WindColor = packed record frameColor : integer; titleColor : integer; tBarColor : integer; growColor : integer; infoColor : integer; end; ParamList = packed record paramLength : integer; wFrameBits : integer; wTitle : StringPtr; wRefCon : longint; wZoom : Rect; wColor : WindColorPtr; wYOrigin : integer; wXOrigin : integer; wDataH : integer; wDataW : integer; wMaxH : integer; wMaxW : integer; wScrollVer : integer; wScrollHor : integer; wPageVer : integer; wPageHor : integer; wInfoRefCon : longint; wInfoHeight : integer; wFrameDefProc : ProcPtr; wInfoDefProc : ProcPtr; wContDefProc : ProcPtr; wPosition : Rect; wPlane : longint; wStorage : Ptr; end; WmTaskRec = packed record wmWhat : integer; wmMessage : longint; wmWhen : longint; wmWhere : Point; wmModifiers : integer; wmTaskData : longint; wmTaskMask : longint; wmLastClickTick : Longint; wmClickCount : Integer; wmTaskData2 : Longint; wmTaskData3 : Longint; wmTaskData4 : Longint; wmLastClickPt : Point; end; ItemTempPtr = ^ItemTemplate; ItemTemplate = packed record itemID : integer; itemRect : Rect; itemType : integer; itemDescr : Ptr; itemValue : integer; itemFlag : integer; itemColor : Ptr; end; DialogTemplate = record dtBoundsRect : Rect; dtVisible : boolean; dtRefCon : longint; dtItemList : array [0..atItemListLength] of ItemTempPtr; end; AlertTempPtr = ^AlertTemplate; AlertTemplate = record atBoundsRect : Rect; atAlertID : integer; atStage1 : SignedByte; atStage2 : SignedByte; atStage3 : SignedByte; atStage4 : SignedByte; atItem1 : ItemTempPtr; atItem2 : ItemTempPtr; atItem3 : ItemTempPtr; atItem4 : ItemTempPtr; end; PrInfoRecHndl = ^PrInfoRecPtr; PrInfoRecPtr = ^PrInfoRec; PrInfoRec = packed record iDev : integer; iVRes : integer; iHRes : integer; rPage : Rect; end; PrStyleRecHndl = ^PrStyleRecPtr; PrStyleRecPtr = ^PrStyleRec; PrStyleRec = packed record wDev : integer; internA : array [0..2] of integer; feed : integer; paperType : integer; crWidth : integer; reduction : integer; internB : integer; end; PrJobRecHndl = ^PrJobRecPtr; PrJobRecPtr = ^PrJobRec; PrJobRec = packed record iFstPage : integer; iLstPage : integer; iCopies : integer; bJDocLoop : SignedByte; fFromUser : boolean; pIdleProc : ProcPtr; pFileName : StringPtr; iFileVol : integer; bFileVers : SignedByte; bJobX : SignedByte; end; PrRecHndl = ^PrRecPtr; PrRecPtr = ^PrRec; PrRec = packed record prVersion : integer; prInfo : PrInfoRec; rPaper : Rect; prStl : PrStyleRec; prInfoPT : array [0..13] of SignedByte; prXInfo : array [0..23] of SignedByte; prJob : PrJobRec; printX : array [0..37] of SignedByte; iReserved : integer; end; PrStatusRecHndl= ^PrStatusRecPtr; PrStatusRecPtr = ^PrStatusRec; PrStatusRec = packed record iTotPages : integer; iCurPage : integer; iTotCopes : integer; {>!< iTotCopies} iCurCopy : integer; iTotBands : integer; iCurBand : integer; fPgDirty : boolean; fImaging : boolean; hPrint : PrRecHndl; pPrPort : GrafPortPtr; hPic : PicHndl; end; TypeListPtr = ^TypeListRec; TypeList = packed record NumEntries : Byte; FileType1 : Byte; FileType2 : Byte; FileType3 : Byte; FileType4 : Byte; FileType5 : Byte; FileType6 : Byte; FileType7 : Byte; FileType8 : Byte; end; SFReplyRec = record good : boolean; filler : boolean; fileType : integer; auxFileType : integer; filename : String [15]; fullPathname : String [127]; end; ControlHandle = ^ControlPtr; ControlPtr = ^ControlRec; ControlRec = packed record CtrlNext: ControlHandle; CtrlOwner: GrafPortPtr; CtrlRect: Rect; CtrlFlag: Byte; CtrlHilite: Byte; CtrlValue: Integer; CtrlProc: ProcPtr; CtrlAction: ProcPtr; CtrlData: LongInt; CtrlRefCon: LongInt; CtrlColor: ColorTablePtr; case integer of 0: { special fields for scroll bar variation of control record } (CtlThumbRect: Rect; CtlPageRect: Rect); 1: { special fields for list record variation of control record } (CtlMemDraw: ProcPtr; CtlMemHeight: Integer; CtlMemSize: Integer; CtlList: Ptr; { ListMemP } CtlListBar: ControlHandle) end; END. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/InitIntfPDOS.pii b/IIGS.601.SRC/A.U.G/ADU/InitIntfPDOS.pii new file mode 100644 index 0000000..da08514 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/InitIntfPDOS.pii @@ -0,0 +1 @@ +{$A+} UNIT InitINTFPDOS; INTERFACE {Def's below are public and represent the C-like ProDOS/16 interface} USES InitINTFDATA; TYPE P16ParamBlk = packed record case integer of {Used by Create, SetFileInfo and GetFileInfo:} 0: (pathname1 : StringPtr; access : integer; fileType : integer; auxType : longint; storageType : integer; createDate : integer; createTime : integer; modDate : integer; modTime : integer; blocksUsed : longint); {Used by Destroy:} 1: (deletepathname : StringPtr); {For the following file access calls:} 2: (refNum : integer; case integer of {Used by Open:} 0: (pathname2 : StringPtr; ioBuffer : Handle); {Used by Read, Write:} 1: (dataBuffer : Ptr; requestCount : longint; transferCount : longint); {Used by Close, Flush:} 2: (); ); {Used by GetPathName, GetBootVol:} 3: (pathName : StringPtr); end; FileRec = packed record pathname : Ptr; fAccess : integer; fileType : integer; auxType : longint; storageType : integer; createDate : integer; createTime : integer; modDate : integer; modTime : integer; blocksUsed : longint; end; PathNameRec = packed record pathname : Ptr; newPathname : Ptr; end; FUNCTION D_INFO (deviceNum : integer; var resultName : str255):integer; EXTERNAL; FUNCTION VOLUME (var deviceName, VolumeName : Str255):integer; EXTERNAL; function GSOSStatus : integer; external; function GSOSControl : integer; external; function GSOSInfo : integer; external; function GSOSWrite : integer; external; function GSOSErase : integer; external; function GSOSFormat : integer; external; { added 2/91 by Monte Benaresh: } FUNCTION CallGSOS(pblkPtr : Ptr; callNum : INTEGER) : INTEGER; EXTERNAL; FUNCTION DrvrCksum(drvrPtr : Ptr; drvrSize : INTEGER) : LONGINT; EXTERNAL; {Do this so we can access these routines in the TML Pascal library file:} PROCEDURE P16GetFileInfo (var p: P16ParamBlk); ProDOS 6; PROCEDURE P16GetBootVol (var p: P16ParamBlk); ProDOS 40; IMPLEMENTATION {Everything below is private to this unit} END. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/InitIntfProc.pii b/IIGS.601.SRC/A.U.G/ADU/InitIntfProc.pii new file mode 100644 index 0000000..534235f --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/InitIntfProc.pii @@ -0,0 +1 @@ +UNIT InitINTFPROC; USES InitINTFDATA; PROCEDURE SpecialRect(theRect : Rect; frame, fill : integer); Tool 18,12; FUNCTION GetWKind (TheWindow: GrafPortPtr): Integer; Tool 14,43; PROCEDURE DrawCString (Str: CStringPtr); Tool 4,166; PROCEDURE ReadAsciiTime (Buffer: Ptr); Tool 3,15; FUNCTION LongintToString(l : longint) : string; External; PROCEDURE CompactMem; Tool 2,31; FUNCTION MaxBlock: LongInt; Tool 2,28; FUNCTION KeyPressed: Boolean; External; FUNCTION EventAvail (EventMask: Integer; VAR Event: WmTaskRec): Boolean; Tool 6,11; FUNCTION TickCount: LongInt; Tool 6,16; FUNCTION Button (ButtonNum: Integer): Boolean; Tool 6,13; FUNCTION OpenNDA (IDNum: Integer): Integer; Tool 5,21; PROCEDURE FixAppleMenu (MenuNum: Integer); Tool 5,30; PROCEDURE CloseAllNDAs; Tool 5,29; FUNCTION SystemEdit (EditType: Integer): Boolean; Tool 5,24; PROCEDURE InvertRect (R: Rect); Tool 4,86; PROCEDURE SetCtlParams (Param2: Integer; Param1: Integer; TheControl: ControlHandle); Tool 16,27; FUNCTION GetCtlParams (TheControl: ControlHandle): LongInt; Tool 16,28; FUNCTION TrackControl (StartX: Integer; StartY: Integer; ActionProc: ProcPtr; TheControl: ControlHandle): Integer; Tool 16,21; PROCEDURE LocalToGlobal (VAR Pt: Point); Tool 4,132; PROCEDURE GlobalToLocal (VAR Pt: Point); Tool 4,133; FUNCTION PtInRect (VAR Pt: Point; { To force passing address } R: Rect): Boolean; Tool 4,79; FUNCTION FindControl (VAR FoundCtrl: ControlHandle; XPoint: Integer; YPoint: Integer; TheWindow: GrafPortPtr): Integer; Tool 16,19; PROCEDURE DisposeControl (TheControl: ControlHandle); Tool 16,10; PROCEDURE SetCtlRefCon (NewRefCon: LongInt; TheControl: ControlHandle); Tool 16,34; FUNCTION GetCtlRefCon (TheControl: ControlHandle): LongInt; Tool 16,35; PROCEDURE SetHandleSize (NewSize: LongInt; H: Handle); Tool 2,25; PROCEDURE InsetRect (VAR R: Rect; DH: Integer; DV: Integer); Tool 4,76; PROCEDURE ClipRect (R: Rect); Tool 4,38; PROCEDURE DrawControls (TheWindow: GrafPortPtr); Tool 16,16; PROCEDURE DrawOneCtl (TheControl: ControlHandle); Tool 16,37; PROCEDURE SetCtlValue (CurValue: Integer; TheControl: ControlHandle); Tool 16,25; PROCEDURE FillRect (R: Rect; Pat: Pattern); Tool 4,87; PROCEDURE EraseRect (R: Rect); Tool 4,85; PROCEDURE SetCtlTitle (Title: Str255; TheControl: ControlHandle); Tool 16,12; PROCEDURE SelIText (TheDialog: GrafPortPtr; ItemID: Integer; StartSel: Integer; EndSel: Integer); Tool 21,33; PROCEDURE GetDItemBox (TheDialog: GrafPortPtr; ItemID: Integer VAR ItemBox: Rect); Tool 21,40; PROCEDURE SetDItemBox (TheDialog: GrafPortPtr; ItemID: Integer ItemBox: Rect); Tool 21,41; PROCEDURE GetNewDItem (TheDialog: GrafPortPtr; ItemTemplate: Ptr); Tool 21,51; PROCEDURE Move (DH,DV: Integer); Tool 4,59; PROCEDURE SetDItemValue (ItemValue: Integer; TheDialog: GrafPortPtr; ItemID: Integer); Tool 21,47; FUNCTION GetControlItem (TheDialog: GrafPortPtr; ItemID: Integer): ControlHandle; Tool 21,30; PROCEDURE SetPenSize (Width: Integer; Height: Integer); Tool 4,44; PROCEDURE GetPenSize (thePoint : PointPtr); Tool 4,45; FUNCTION GetDItemValue (TheDialog: GrafPortPtr; ItemID: Integer): Integer; Tool 21,46; PROCEDURE HiliteControl (HiliteState: Integer; TheControl: ControlHandle); Tool 16,17; FUNCTION AlertWindow (flags : INTEGER; subArray : Ptr; alertStrRef : Ptr): INTEGER; TOOL 14,89; PROCEDURE BeginUpdate (theWindow:GrafPortPtr); Tool 14,30; PROCEDURE CalcMenuSize (newWidth,newHeight,menuNum:integer); Tool 15,28; FUNCTION CautionAlert (Template:Ptr;Filter:ProcPtr):integer; Tool 21,26; FUNCTION ChooseFont (CurrentID:FontID;FamSpecs:integer):FontID; Tool 27,22; PROCEDURE CloseDialog (TheDialog:GrafPortPtr); Tool 21,12; PROCEDURE CloseNDAbyWinPtr (theWindow:GrafPortPtr); Tool 5,28; PROCEDURE ClosePort (Port:GrafPortPtr); Tool 4,26; PROCEDURE CloseWindow (theWindow:GrafPortPtr); Tool 14,11; PROCEDURE CtlShutDown; Tool 16,3; PROCEDURE CtlStartUp (userID,dpageAddr:integer); Tool 16,2; PROCEDURE DeleteMItem (itemNum:integer); Tool 15,16; PROCEDURE DeskShutDown; Tool 5,3; PROCEDURE DeskStartUp; Tool 5,2; PROCEDURE DialogShutDown; Tool 21,3; PROCEDURE DialogStartUp (userID:integer); Tool 21,2; PROCEDURE DisableDItem (theDialogPtr:GrafPortPtr; itemID:integer); Tool 21,57; PROCEDURE DisableMItem (itemmNum:integer); Tool 15,49; PROCEDURE DisposeHandle (theHandle:Handle); Tool 2,16; PROCEDURE DisposeRgn (theHandle:RgnHndl); Tool 4,104; PROCEDURE DrawDialog (theDialog:GrafPortPtr); Tool 21,22; PROCEDURE DrawMenuBar; Tool 15,42; PROCEDURE DrawString (theStr:Str255); Tool 4,165; PROCEDURE EMShutDown; Tool 6,3; PROCEDURE EMStartUp (Dp,Qs,Xmin,Xmax,Ymin,Ymax,userID:integer); Tool 6,2; PROCEDURE EnableMItem (itemNum:integer); Tool 15,48; PROCEDURE EndUpdate (theWindow:GrafPortPtr); Tool 14,31; PROCEDURE FMShutDown; Tool 27,3; PROCEDURE FMStartUp (userID,Dp:integer); Tool 27,2; FUNCTION FixMenuBar: Integer; Tool 15,19; FUNCTION FrontWindow:GrafPortPtr; Tool 14,21; PROCEDURE FrameRect(r : Rect); Tool 4,83; FUNCTION GetCtlHandleFromID(theWind : GrafPortPtr; ctlID : LONGINT): ControlHandle; TOOL 16,48; FUNCTION GetFamInfo (famNum:integer; famName:Str255):integer; Tool 27,11; FUNCTION GetFontFlags: Integer; Tool 4,153; PROCEDURE GetFontInfo (var fontInfo:FontInfoRecord); Tool 4,150; FUNCTION GetTick : LONGINT; TOOL 3, 37; PROCEDURE GetIText (theDialogPtr: GrafPortPtr; itemID: integer; resultPtr: Ptr); Tool 21,31; FUNCTION GetNewModalDialog (theTemplate:Ptr):GrafPortPtr; Tool 21,50; PROCEDURE GetPen (var thePt:Point); Tool 4,41; FUNCTION GetPort: GrafPortPtr; Tool 4,28; FUNCTION GetSysWFlag (theWindow:GrafPortPtr):boolean; Tool 14,76; PROCEDURE GetVisRgn (theHandle:RgnHndl); Tool 4,181; FUNCTION GetWRefCon (theWindow:GrafPortPtr):longint; Tool 14,41; PROCEDURE GrafOff; Tool 4,11; PROCEDURE HandToPtr (srcHdl:Handle; destPtr:Ptr; count:LONGINT); TOOL 2,41; PROCEDURE HLock (h:Handle); Tool 2,32; PROCEDURE HUnlock (h:Handle); Tool 2,34; PROCEDURE InvalRect (badRectPtr:Rect); Tool 14,58; PROCEDURE CheckHandle (h:Handle); Tool 2,30; FUNCTION GetSysFont: Handle; Tool 4,179; FUNCTION GetFont: Handle; Tool 4,149; FUNCTION GetPicSave: Handle; Tool 4,63; FUNCTION GetRgnSave: Handle; Tool 4,65; FUNCTION GetPolySave: Handle; Tool 4,67; FUNCTION GetHandleSize (H: Handle): longint; Tool 2,24; FUNCTION FindHandle (Location: Ptr): Handle; Tool 2,26; FUNCTION GetScrapPath: Handle; Tool 22,16; FUNCTION HandleDiskInsert( flags: INTEGER; devNum : INTEGER): LONGINT; { result is 2 word params! } TOOL 14, 107; FUNCTION Hex2Int (StrPtr : StringPtr;StrLength:integer):integer; Tool 11,36; PROCEDURE HiliteMenu (Hilite:boolean; menuNum:integer); Tool 15,44; PROCEDURE InitCursor; Tool 4,202; PROCEDURE InsertMItem (addItem:CStringPtr;after,menuNum:integer); Tool 15,15; PROCEDURE InsertMenu (addMenu:MenuRecHndl;after:integer); Tool 15,13; PROCEDURE InstallFont (theID:FontID;scale:integer); Tool 27,14; PROCEDURE Int2Hex (val:integer;StrPtr:StringPtr; StrLen:integer); Tool 11,34; FUNCTION IntToString (I: Integer): String; External; PROCEDURE LEShutDown; Tool 20,3; PROCEDURE LEStartUp (Dp,userID:integer); Tool 20,2; PROCEDURE LineTo (x,y:integer); Tool 4,60; PROCEDURE LoadTools (theTools:ToolTable); Tool 1,14; PROCEDURE MMShutDown (userID:integer); Tool 2,3; FUNCTION MMStartUp: integer; Tool 2,2; FUNCTION MMStatus: integer; Tool 2,6; PROCEDURE MTShutDown; Tool 3,3; PROCEDURE MTStartUp; Tool 3,2; PROCEDURE MenuShutDown; Tool 15,3; PROCEDURE MenuStartUp (userID,Dp:integer); Tool 15,2; FUNCTION ModalDialog (filterProc:ProcPtr):integer; Tool 21,15; PROCEDURE MoveTo (x,y:integer); Tool 4,58; PROCEDURE HideDItem (TheDialog: GrafPortPtr; ItemID: Integer); Tool 21,34; PROCEDURE ShowDItem (TheDialog: GrafPortPtr; ItemID: Integer); Tool 21,35; PROCEDURE NewDItem (theDialog:GrafPortPtr; itemID:integer; itemRect:Rect; itemType:integer; itemDescr:UNIV Ptr; itemValue, itemFlag:integer; itemColor:ColorTablePtr); Tool 21,13; FUNCTION NewHandle (s:longint;ID,att:integer;loc:Ptr):Handle; Tool 2,9; FUNCTION NewMenu (menuStr:Ptr):MenuRecHndl; Tool 15,45; FUNCTION NewModalDialog(b:Rect;vis:boolean;r:longint):GrafPortPtr;Tool 21,10; FUNCTION NewRgn: RgnHndl; Tool 4,103; FUNCTION NewWindow (p:ParamList):GrafPortPtr; Tool 14,9; FUNCTION NewWindow2(titlePtr : Ptr; refCon : LONGINT; updtProcPtr : Ptr; wDefProcPtr : Ptr; paramTableDesc : INTEGER; windRef : LONGINT; resType : INTEGER): GrafPortPtr; TOOL 14,97; PROCEDURE OpenPort (thePort:GrafPortPtr); Tool 4,24; PROCEDURE ParamText (param0Ptr,param1Ptr, param2Ptr,param3Ptr:StringPtr); Tool 21,27; PROCEDURE PMShutDown; Tool 19,3; PROCEDURE PMStartUp (userID,Dp:integer); Tool 19,2; PROCEDURE PPToPort (loc:LocInfoRec;r:Rect;x,y,mode:integer); Tool 4,214; PROCEDURE PtrToHand (srcPtr:Ptr; destHdl:Handle; count:LONGINT); TOOL 2,40; FUNCTION PrChooser: boolean; Tool 19,22; PROCEDURE PrCloseDoc (pPrPort:GrafPortPtr); Tool 19,15; PROCEDURE PrClosePage (pPrPort:GrafPortPtr); Tool 19,17; PROCEDURE PrDefault (hPrint:PrRecHndl); Tool 19,9; FUNCTION PrJobDialog (hPrint:PrRecHndl):boolean; Tool 19,12; FUNCTION PrOpenDoc (h:PrRecHndl;p:GrafPortPtr):GrafPortPtr; Tool 19,14; PROCEDURE PrOpenPage (p:GrafPortPtr;pPageFrame:RectPtr); Tool 19,16; PROCEDURE PrPicFile (h:PrRecHndl;p:GrafPortPtr;s:PrStatusRecPtr); Tool 19,18; FUNCTION PrStlDialog (hprint:PrRecHndl):boolean; Tool 19,11; PROCEDURE WriteBRam(Buffer: Ptr); Tool 3,9; FUNCTION GetGrafProcs: Ptr; Tool 4,69; PROCEDURE QDAuxShutDown; Tool 18,3; PROCEDURE QDAuxStartUp; Tool 18,2; PROCEDURE QDShutDown; Tool 4,3; PROCEDURE QDStartUp (Dp:integer;s:AnSCBByte;width,userID:integer); Tool 4,2; FUNCTION QDStatus: integer; Tool 4,6; PROCEDURE RemoveDItem (theDialogPtr:GrafPortPtr;itemID:integer); Tool 21,14; PROCEDURE RefreshDesktop (r:RectPtr); Tool 14,57; PROCEDURE SANEShutDown; Tool 10,3; PROCEDURE SFAllCaps (allCaps:boolean); Tool 23,13; PROCEDURE SFGetFile (x,y:integer; prompt:Str255; filter:ProcPtr; typelist:TypeListPtr;reply:SFReplyRec); Tool 23,9; PROCEDURE SFPutFile (x,y:integer;p,n:Str255;maxLength:integer; reply:SFReplyRec); Tool 23,10; PROCEDURE SFShutDown; Tool 23,3; PROCEDURE SFStartUp (userID,Dp:integer); Tool 23,2; PROCEDURE ScrapShutDown; Tool 22,3; PROCEDURE ScrapStartUp; Tool 22,2; PROCEDURE SelectWindow (theWindow:GrafPortPtr); Tool 14,17; PROCEDURE SetBackColor (backColor:integer); Tool 4,162; PROCEDURE SetCtlParamPtr(arrayPtr : Ptr); TOOL 16,52; PROCEDURE SetFontFlags (flags:integer); Tool 4,152; PROCEDURE SetForeColor (foreColor:integer); Tool 4,160; PROCEDURE SetIText (theDialogPtr: GrafPortPtr; itemID: integer; theStringPtr: Ptr); Tool 21,32; PROCEDURE SetMItem (newStr:Str255;itemNum:integer); Tool 15,36; PROCEDURE SetMItemID (newID,oldID:integer); Tool 15,56; PROCEDURE SetMTitleStart (xStart:integer); Tool 15,25; PROCEDURE SetMenuFlag (newValue,menuNum:integer); Tool 15,31; PROCEDURE SetOriginMask (originMask:integer;theWindow:GrafPortPtr);Tool 14,52; PROCEDURE SetPort (thePort:GrafPortPtr); Tool 4,27; PROCEDURE SetRect (var r:Rect; x1,y1,x2,y2:integer); Tool 4,74; PROCEDURE SetTextFace (textFace:integer); Tool 4,154; PROCEDURE SetWTitle (title:Str255;theWindow:GrafPortPtr); Tool 14,13; PROCEDURE ShowCursor; Tool 4,145; PROCEDURE ShowWindow (theWindow:GrafPortPtr); Tool 14,19; FUNCTION StopAlert (template:Ptr; filter:ProcPtr):integer; Tool 21,24; PROCEDURE SysBeep; Tool 3,44; PROCEDURE SysFailMgr (errCode:integer;theStr:Str255); Tool 3,21; FUNCTION TLMountVolume (x,y:integer;l1,l2,b1,b2:Str255):integer; Tool 1,17; FUNCTION TLTextMountVolume(line1Ptr : Ptr; line2Ptr : Ptr; but1Ptr : Ptr; but2Ptr : Ptr): INTEGER; TOOL 1,18; PROCEDURE TLShutDown; Tool 1,3; PROCEDURE TLStartUp; Tool 1,2; FUNCTION TaskMaster (mask:integer;event:WmTaskRec):integer; Tool 14,29; PROCEDURE UpdateDialog (theDialogPtr:GrafPortPtr; updateRgnHandle:RgnHndl); Tool 21,37; PROCEDURE ValidRect(goodRect : Rect); TOOL 14,60; PROCEDURE WaitCursor; Tool 18,10; PROCEDURE WindShutDown; Tool 14,3; PROCEDURE WindStartUp (userID:integer); Tool 14,2; FUNCTION WindStatus:integer; Tool 14,6; FUNCTION GetWMgrPort:GrafPortPtr; Tool 14,32; FUNCTION GetMenuMgrPort:GrafPortPtr; Tool 15,27; function StevesStartupTools(userid, inputRef : integer; p : Ptr) : Ptr; tool 1,$18; procedure StevesShutDownTools(inputref : integer; p : Ptr); tool 1, $19; END. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/ListMgr.pii b/IIGS.601.SRC/A.U.G/ADU/ListMgr.pii new file mode 100644 index 0000000..dc667da --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/ListMgr.pii @@ -0,0 +1 @@ +UNIT ListMgr; { Interfaces for Resource Manager added } { by Monte Benaresh -- February 16, 1991 } USES InitIntfData, {Apple IIGS Toolbox Interface Units} InitIntfProc, InitIntfPDOS; (* ** Types for List Manager ** *) TYPE ListMemP = ^ListMemRec; ListRecP = ^ListRec; ListRec = record ListRec: Rect; ListSize: Integer; ListView: Integer; ListType: Integer; ListStart: Integer; ListCtl: ControlHandle; ListDraw: ProcPtr; ListMemHeight: Integer; ListMemSize: Integer; ListPointer: ListMemP; ListRefCon: LongInt; ListScrollClr: ColorTablePtr; end; ListMemRec = record memPtr: Ptr; memFlag: Integer; end; (* ** Routines for List Manager ** *) PROCEDURE ListStartUp; Tool 28,2; PROCEDURE ListShutDown; Tool 28,3; FUNCTION ListVersion: Integer; Tool 28,4; PROCEDURE ListReset; Tool 28,5; FUNCTION ListStatus: Integer; Tool 28,6; FUNCTION CreateList (TheWindow: GrafPortPtr; TheList: ListRecP): ControlHandle; Tool 28,9; FUNCTION NextMember (TheMem: ListMemP; TheList: ListRecP): ListMemP; Tool 28,11; FUNCTION ResetMember (TheList: ListRecP): ListMemP; Tool 28,15; PROCEDURE DrawMember (TheMem: ListMemP; TheList: ListRecP); Tool 28,12; PROCEDURE SelectMember (TheMem: ListMemP; TheList: ListRecP); Tool 28,13; PROCEDURE SortList (SortProc: ProcPtr; TheList: ListRecP); Tool 28,10; FUNCTION GetListDefProc: ProcPtr; Tool 28,14; PROCEDURE NewList (TheMem: ListMemP; TheList: ListRecP); Tool 28,16; (* ** Routines for List Manager ** added 2/16/91 by Monte *) PROCEDURE DetatchResource (ResType : INTEGER; ResID : LONGINT); TOOL 30,24; FUNCTION GetResourceSize (ResType : INTEGER; ResID : LONGINT): LONGINT; TOOL 30,29; FUNCTION LoadResource (ResType : INTEGER; ResID : LONGINT): Handle; TOOL 30,14; FUNCTION OpenResourceFile (reqAccess : INTEGER; mapPtr : Ptr; pathPtr : Ptr): INTEGER; TOOL 30,10; PROCEDURE CloseResourceFile (fileID : INTEGER); TOOL 30,11; end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/Menu.pii b/IIGS.601.SRC/A.U.G/ADU/Menu.pii new file mode 100644 index 0000000..9993e14 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/Menu.pii @@ -0,0 +1 @@ +{################################################################} {# #} {# File: Menu.Pas from IIGS Disk Initializer #} {# #} {#--------------------------------------------------------------#} {# #} {# Description: This file has all the routines that handle #} {# the creation, functionality and disposal of #} {# the menus used in the program. #} {# #} {#--------------------------------------------------------------#} {# #} {# Author: Darryl Lovato #} {# #} {#--------------------------------------------------------------#} {# #} {# Copyright: 1987,1988 by Apple Computer Inc. #} {# All rights reserved. #} {# #} {#--------------------------------------------------------------#} {# #} {# Modification History: #} {# #} {# Who When The Change #} {# --- ------ ------------------------------------- #} {# SR 12/7/87 Created v.1 - erase & init only #} {# DGL 1/29/88 Rewrote everything - cut size in half! #} {# DGL 5/9/88 Finished Adding Partition Support #} {# and other features... far too many to #} {# list here... #} {# DGL 5/12/88 Added Zero and Info operations #} {# DGL 5/20/88 Released pre-alpha version to testers #} {# DGL 6/1/88 Alpha! #} {# DGL 6/13/88 Alpha 2 #} {# DGL 6/24/88 Alpha 3 #} {# DGL 7/1/88 Beta 1 #} {# DGL 7/13/88 Beta 2 #} {# DGL 7/20/88 Beta 3 #} {# DGL 7/27/88 Beta 4 #} {# DGL 8/1/88 Beta 5 #} {# DGL 8/8/88 Beta 6 #} {# DGL 8/15/88 Final! #} {# #} {################################################################} {$LongGLobals-} {$ToolErrorChk-} {$A+} unit Menu; interface uses InitIntfData, InitIntfProc, InitIntfPdos, ListMgr, Globals, Utils, Guts, Dialog; procedure DoMenu; {Execute a menu item} procedure SetUpMenus; {Install menus and redraw menu bar} implementation {################################################################} {# handle menu selections here #} {################################################################} procedure DoMenu; var item : integer; bool : boolean; begin {of DoMenu} item := LoWord(Event.wmTaskData); case item of AboutItem : DoAboutItem; InitItem : ShowInit; QuitItem : Done := true; 950,951,952,953,954 : bool := SystemEdit(item - 949); end; HiliteMenu(false,HiWord(Event.wmTaskData)); end; {of DoMenu} {################################################################} {# create menu's here #} {################################################################} procedure SetUpMenus; var Height : integer; begin {of SetUpMenus} SetMTitleStart(10); {Set Starting position of menu} AddMenu(@EditMenuStr);{Edit Menu} AddMenu(@FileMenuStr);{File Menu} AddMenu(@AppleMenuStr);{Apple Menu} FixAppleMenu(0); Height := FixMenuBar; {Set sizes of menus} DrawMenuBar; {...and draw the menu bar!} HiliteMenu(false, FileMenuID);{Initially disabled} end; {of SetUpMenus} end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/OS.aii b/IIGS.601.SRC/A.U.G/ADU/OS.aii new file mode 100644 index 0000000..2402ce3 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/OS.aii @@ -0,0 +1 @@ +;################################################################ ;# # ;# File: OS.Asm from IIGS Disk Initializer # ;# # ;#--------------------------------------------------------------# ;# # ;# Description: This file has all the glue which calls the # ;# prodos routines that do the initializing # ;# # ;#--------------------------------------------------------------# ;# # ;# Author: Darryl Lovato # ;# # ;#--------------------------------------------------------------# ;# # ;# Copyright: 1987,1988 by Apple Computer Inc. # ;# All rights reserved. # ;# # ;#--------------------------------------------------------------# ;# # ;# Modification History: # ;# # ;# Who When The Change # ;# --- ------ ------------------------------------- # ;# SR 12/7/87 Created v.1 - erase & init only # ;# DGL 1/29/88 Rewrote everything - cut size in half! # ;# DGL 5/9/88 Finished Adding Partition Support # ;# and other features... far too many to # ;# list here... # ;# DGL 6/1/88 Alpha! # ;# DGL 6/13/88 Alpha 2 # ;# DGL 6/24/88 Alpha 3 # ;# DGL 7/1/88 Beta 1 # ;# DGL 7/13/88 Beta 2 # ;# DGL 7/20/88 Beta 3 # ;# DGL 7/27/88 Beta 4 # ;# DGL 8/1/88 Beta 5 # ;# DGL 8/8/88 Beta 6 # ;# DGL 8/15/88 Final! # ;# # ;################################################################ STRING ASIS BLANKS OFF MACHINE M65816 LONGA on LONGI on ;------------------------------------------ ; ; Equates from procedure ; ;------------------------------------------ ProDOS equ $E100A8 D_Info_Call equ $202C ;Call number for "D_Info" Volume_Call equ $2008 ;Call number for "Volume" ;----------------------------------------------- ; ; Imported addresses ; ;----------------------------------------------- IMPORT ctlblk IMPORT formatblk IMPORT infoblk IMPORT returnControl IMPORT returnErase IMPORT returnFormat IMPORT returnInfo IMPORT returnStatus IMPORT returnWrite IMPORT statusblk IMPORT writeblk ;----------------------------------------------- ; ; Forward addresses and entries ; ;----------------------------------------------- ENTRY d_info_list ENTRY device_name ENTRY volume_list ENTRY volume_name ;################################################################ ;# misc data for the below calls # ;################################################################ volume_list PROC EXPORT dc.w 5 ;pcount through fileSysID DC.L device_name ;pointer to the device name DC.L volume_name ;pointer to the result volume name EXPORT total_blks total_blks DC.L 0000 ;total blocks on the volume EXPORT free_blks free_blks DC.L 0000 ;free blocks on the volume EXPORT file_system_id file_system_id DC.W 0000 ;file system. $0001 = ProDOS EXPORT d_info_list d_info_list dc.w 2 ;pcount through devName EXPORT dev_num dev_num DC.W 00 ;device number. $0001 to -n- DC.L dev_name_inbuf ;pointer to device name buffer dev_name_inbuf dc.w 32+2+2 ;size for result buffer EXPORT device_name device_name ds.w 1 ;length word DS.B 32 ;room for a large name EXPORT volume_name volume_name dc.w 36+2 ;size for result buffer DS.B 36 ;save room for a volume name EXPORT error_code error_code DC.W 00 ;save error code from the call ENDP ;################################################################ ;# function GSOSFormat : integer; # ;################################################################ GSOSFormat PROC EXPORT LONGA ON LONGI ON ; entry code phd tsc sec sbc #$00F8 tcd clc adc #$00E4 tcs jsl $E100A8 DC.W $2024 DC.L formatblk bcs returnFormat lda #$0 returnFormat sta $FE ; return error tdc ; exit code clc adc #$00F8 tcs pld rtl ENDP ;################################################################ ;# function GSOSErase : integer; # ;################################################################ GSOSErase PROC EXPORT LONGA ON LONGI ON ; entry code phd tsc sec sbc #$00F8 tcd clc adc #$00E4 tcs jsl $E100A8 DC.W $2025 DC.L formatblk bcs returnErase lda #$0 returnErase sta $FE ; return error tdc ; exit code clc adc #$00F8 tcs pld rtl ENDP ;################################################################ ;# function GSOSStatus : integer; # ;################################################################ GSOSStatus PROC EXPORT LONGA ON LONGI ON ; entry code phd tsc sec sbc #$00F8 tcd clc adc #$00E4 tcs jsl $E100A8 DC.W $202D DC.L statusblk bcs returnStatus lda #$0 returnStatus sta $FE ; return error tdc ; exit code clc adc #$00F8 tcs pld rtl ENDP ;################################################################ ;# function GSOSInfo : integer; # ;################################################################ GSOSInfo PROC EXPORT LONGA ON LONGI ON ; entry code phd tsc sec sbc #$00F8 tcd clc adc #$00E4 tcs jsl $E100A8 DC.W $202C DC.L infoblk bcs returnInfo lda #$0 returnInfo sta $FE ; return error tdc ; exit code clc adc #$00F8 tcs pld rtl ENDP ;################################################################ ;# function GSOSWrite : integer; # ;################################################################ GSOSWrite PROC EXPORT LONGA ON LONGI ON ; entry code phd tsc sec sbc #$00F8 tcd clc adc #$00E4 tcs jsl $E100A8 DC.W $2030 DC.L writeblk bcs returnWrite lda #$0 returnWrite sta $FE ; return error tdc ; exit code clc adc #$00F8 tcs pld rtl ENDP ;################################################################ ;# function GSOSControl : integer; # ;################################################################ GSOSControl PROC EXPORT LONGA ON LONGI ON ; entry code phd tsc sec sbc #$00F8 tcd clc adc #$00E4 tcs jsl $E100A8 DC.W $202E DC.L ctlblk bcs returnControl lda #$0 returnControl sta $FE ; return error tdc ; exit code clc adc #$00F8 tcs pld rtl ENDP ;################################################################ ;# function D_Info(device_number,result_name):integer; # ;################################################################ D_Info PROC EXPORT ; Changed 5/14/91 by Monte Benaresh to use Class 1 D_INFO LONGA ON LONGI ON ; entry code phd ;save Direct Reg on stack tsc ;transfer Stack Ptr to Accumulator tcd ;transfer Accumulator to Direct Reg lda $0A,s ;get device_number sta dev_num ;store in local parameter list jsl ProDOS ;call the operating system DC.W D_Info_Call DC.L D_Info_List ;pointer to the parameter block sta $0C,s ;store error as function result bne exit sep #$30 ;to to 8 bit in m & x longa off longi off ldy device_name ;get number of bytes in device_name tya sta [$06] ;set length of P-string loop lda device_name+1,y ;now transfer name to variable sta [$06],y ;store in caller's variable dey bne loop rep #$30 ;back to 16 bit mode longa on longi on exit pld ;restore Direct Reg lda $01,s ;move up our RTL sta $07,s ;get rid of parameter inputs lda $02,s sta $08,s tsc ;put stack pointer into Accumulator clc adc #6 ;adjust stack to point to RTL tcs rtl ;return to Pascal ENDP ;################################################################ ;# function Volume(device_number,result_vol_name):integer; # ;################################################################ Volume PROC EXPORT ; Changed 5/14/91 by Monte Benaresh to use Class 1 VOLUME ; call to support long volume names. LONGA ON LONGI ON phd ;save Direct Reg on stack tsc ;transfer Stack Ptr to Accumulator tcd ;transfer Accumulator to Direct Reg sep #$30 ;to 8 bit m & x longa off longi off lda [$0A] ;get # of bytes in caller's device name sta device_name ;set low byte of length word stz device_name+1 ;clear high byte tay inloop lda [$0A],y sta device_name+1,y ;store in device_name dey bne inloop rep #$30 ;back to 16 bit mode longa on longi on jsl ProDOS ;call the operating system DC.W volume_call DC.L volume_list ;pointer to the parameter block sta $0E,s ;store error as function result bne done sep #$30 ;to to 8 bit in m & x longa off longi off ldy volume_name+2 ;get number of bytes in volume_name tya sta [$06] ;set length of P-string outloop lda volume_name+3,y ;now transfer name to variable sta [$06],y ;store in caller's variable dey bne outloop rep #$30 ;back to 16 bit mode longa on longi on done pld ;restore Direct Reg lda $01,s ;move up our RTL sta $09,s ;get rid of parameter inputs lda $02,s sta $0A,s tsc ;put stack pointer into Accumulator clc adc #8 ;adjust stack to point to RTL tcs rtl ;return to Pascal ENDP stack_cb RECORD 1 ;stack frame for ClearBuf old_dp ds.w 1 old_dbr ds.b 1 rtn_addr ds.b 3 value ds.w 1 ;value to store buf_size ds.l 1 buf_addr ds.l 1 ;address of buffer to clear stack_end ENDR * Next stuff added by Monte Benaresh -- 1-2/91 export ClearBuf ClearBuf PROC ;clear specified # of bytes of memory at specified address phb phk plb phd tsc tcd ;use stack as direct-page ;brk $13 WITH stack_cb lda $000000,x ;*** SELF_MODIFIED *** ;txy ;test index bne clear_loop bank_done lda operand_mod+2 clc adc #$100 ;bump addr by a bank sta operand_mod+2 dec 0) OR (BITAND(volBlk.characteristics, $0010) = 0) THEN CheckOpenFiles := FALSE { if error or clear flag, no file open } ELSE CheckOpenFiles := TRUE; END; PROCEDURE SetVolName(VolStr : STR255); { added 8/4/91 by Monte } BEGIN currVolumeStr := VolStr; { set global p-string } dispVolumeStr := currVolumeStr; IF (dispVolumeStr[1] = '/') OR (dispVolumeStr[1] = ':') THEN delete(dispVolumeStr,1,1); {Get rid of '/'} dispVolumeStr := CONCAT('The disk name is ', dispVolumeStr); END; {################################################################} {# add a menu to the menu bar #} {################################################################} procedure AddMenu(s : Ptr); begin InsertMenu(NewMenu(s),0); end; {################################################################} {# Convert a real to a long #} {################################################################} function Real2Long(value : real) : longint; begin Real2Long := trunc(round(value)); end; {################################################################} {# Convert a real to a integer #} {################################################################} function Real2Int(value : real) : integer; begin Real2Int := Real2Long(value); {let pascal trunc it!} end; {################################################################} {# blink a button one then off - used in filter routines #} {################################################################} procedure BlinkButton(ctl : ControlHandle); begin HiliteControl(2,ctl); HiliteControl(0,ctl); end; {################################################################} {# turn on a control (hilite) #} {################################################################} procedure TurnOn(ctl : ControlHandle); begin HiliteControl(0,ctl); end; {################################################################} {# turn off a control (dim) #} {################################################################} procedure TurnOff(ctl : ControlHandle); begin HiliteControl(255,ctl); end; {################################################################} {# Is this window a desk accessory? #} {################################################################} function IsDA(theWind : GrafPortPtr) : boolean; begin IsDA := false; if theWind <> nil then IsDA := BitAnd(GetWKind(theWind),$8000) <> 0; end; {################################################################} {# generic 1 button "ok" alert with 2 lines of text #} {################################################################} procedure DoAlert(static prompt, prompt2 : str255); var AlertDLog : GrafPortPtr; itemHit : integer; begin oldPort := GetPort; miscStr := prompt; miscStr1 := prompt2; AlertDLog := GetNewModalDialog(@AlertDITL); SetPort(AlertDLog); itemHit := ModalDialog(nil); CloseDialog(AlertDLog); SetPort(oldPort); end; {################################################################} {# Utility routine to make a given string GSOS compatable #} {################################################################} procedure MakeGSOSStr(s : str255; var gs : GSOSString); var i : integer; begin with gs do begin size := length(s); for i := 1 to size do chars[i-1] := s[i]; end; end; {################################################################} {# Utility routine to convert GSOS string to P-string #} {################################################################} FUNCTION GSToP(GSString: GSStrPtr) : STR255; { given ptr to GS/OS string,É} {Éreturn Pascal string } VAR tempString : gsosstring; tempPtr : StringPtr; BEGIN tempString := GSString^; { make a copy } tempPtr := StringPtr(@tempString); tempPtr^[1] := tempPtr^[0]; { copy low byte to high } GSToP := StringPtr(ORD(tempPtr)+1)^; END; {################################################################} {# Utility routine to make a given string uppercase #} {################################################################} function UpperString(s : str255) : str255; var i : integer; val : integer; begin for i := 1 to ord(s[0]) do { this is faster than length(s) } begin val := ord(s[i]); if (val >= ord('a')) and (val <= ord('z')) then { its a lower case character} s[i] := Char(val - $20); end; UpperString := s; end; {################################################################} {# Set the cursor to the specified type, but only if needed #} {################################################################} procedure MakeCursor(newCurs : integer); begin case newCurs of arrow : if CurrCursor <> arrow then InitCursor; watch : if CurrCursor <> watch then WaitCursor; end; CurrCursor := newCurs; end; {################################################################} {# performs the equivalent of SetIText on a LongStatText2 #} {################################################################} PROCEDURE SetLongText(theStringPtr : StringPtr); VAR tempRect : Rect; theCtlHdl : ControlHandle; BEGIN oldPort := GetPort; SetPort(InitDlogPtr); { set substitution string ptr to new string } subStrArray[0] := theStringPtr; theCtlHdl := GetCtlHandleFromID(InitDlogPtr, MStatTxt); DrawOneCtl(theCtlHdl); { validate this control's rect so the text won't get redrawn } tempRect := theCtlHdl^^.CtrlRect; ValidRect(tempRect); SetPort(oldPort); END; {################################################################} {# swap the two bytes of an integer #} {################################################################} type accesseverything = record case integer of 1: (l : longint); 2: (w1 : integer; w2 : integer); 3: (b1 : signedbyte; b2 : signedbyte; b3 : signedbyte; b4 : signedbyte); end; { next function added 2/19/91 by Monte Benaresh } FUNCTION RealSwapInt(aInt : accesseverything) : INTEGER; VAR temp : accesseverything; BEGIN temp.l := 0; temp.b2 := aint.b1; temp.b1 := aint.b2; RealSwapInt := temp.w1; END; {################################################################} {# swap the two bytes of a longint #} {################################################################} function SwapLong(aLong : accesseverything) : longint; var temp : accesseverything; begin temp.l := 0; temp.b4 := aLong.b1; temp.b3 := aLong.b2; temp.b2 := aLong.b3; temp.b1 := aLong.b4; SwapLong := temp.l; end; {################################################################} {# convert a C str to a P string #} {################################################################} function AryToStr(data : Ptr; max : integer) : str255; type charPtr = ^char; var count : integer; begin count := 1; while (charptr(data)^ <> char(0)) and (count <= max) do begin AryToStr[count] := charptr(data)^; data := pointer(ord4(data) + 1); inc(count) end; AryToStr[0] := char(count - 1); end; {################################################################} {# convert a P str to a C string #} {################################################################} function StrToAry32(theStr : str255) : str32; var i : integer; begin if length(thestr) > 31 then theStr[0] := char(31); for i := 0 to 31 do if i >= length(thestr) then StrToAry32[i] := char(0) else StrtoAry32[i] := theStr[i+1]; end; {################################################################} {# zero refcons, dlog mgr expects them to be 0 #} {################################################################} procedure ZeroRefCons; begin SetCtlRefCon(0,listControl1); SetCtlRefCon(0,listScroll1); end; {################################################################} {# restore refcons we saved earlier #} {################################################################} procedure RestoreRefCons; begin SetCtlRefCon(listCtlRef1,listControl1); SetCtlRefCon(listScrollRef1,listScroll1); end; {################################################################} {# save refcons, then wipe-em out #} {################################################################} procedure SaveAndZeroRefCons; begin listCtlRef1 := GetCtlRefCon(listControl1); listScrollRef1 := GetCtlRefCon(listControl1^^.CtlListBar); ZeroRefCons; end; {################################################################} {# announce out-of memory #} {################################################################} procedure ShowNoMem; begin MakeCursor(arrow); DoAlert('Sorry, not enough memory to perform the selected', 'operation.'); end; {################################################################} {# plot the icon at the point specified. #} {################################################################} procedure PlotIconola(icon : Ptr; where : Point; smallicon : boolean); var AuxPLoc : LocInfoRec; begin with AuxPloc, boundsrect do begin PortSCB := ScreenMode; PixelImage := icon; v1 := 0; h1 := 0; if smallicon then begin Width := 8; v2 := 8; h2 := 32; end else begin Width := 15; v2 := 22; h2 := 60; end; IF icon <> NIL THEN PPToPort(AuxPLoc, BoundsRect,where.h,where.v,SrcCopy); end; end; {################################################################} {# return vol icon for device passed in global "infoblk" #} {################################################################} {this routine relies on infoblk to be correct, nothing is passed to us, we just look at the infoblk - we also wipe out the info blk!} function GetVolIcon : ptr; var i : integer; myName : str255; begin GetVolIcon := @other; {default icon} with infoblk do case devID of $0,$14 : {floppy disk} GetVolIcon := @floppy; $3, $17 : { 3.5 inch disks, incl FDHD} GetVolIcon := @three; $1, $2, $5, $7, $13 : { hard disks, cd rom} if (headLink + forwardlink) <> 0 then {same as testing both for <> 0 and or'ing them} begin { do a dInfo on the head so we can get device # 2} pCount := 11; if headlink <> 0 then devNumber := headLink; devname := @myname; i := GSOSInfo; {now do a status on the head's forward link device, if its there, then we are partitioned} with statusBlk do begin pCount := 5; devNumber := forwardlink; statCode := 0; StatList := @StatResult; RequestCount := 6; end; i := GSOSStatus; { this may seem to be an obscure way to do this but it saves tons of code no- else's} GetVolIcon := @harddisk; if devID = 7 then GetVolIcon := @CD; if bitand(StatResult.general,$0010) <> 0 then {its a partition} begin GetVolIcon := @Partition; if devID = 7 then GetVolIcon := @CDPartition end; end else begin GetVolIcon := @harddisk; if devID = 7 then GetVolIcon := @cd end; $E, $F : { ram and rom disks} GetVolIcon := @ramdisk; $1E : { appletalk network} GetVolIcon := @appletalk; end; end; end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/adu.rii b/IIGS.601.SRC/A.U.G/ADU/adu.rii new file mode 100644 index 0000000..4fa185e --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/adu.rii @@ -0,0 +1 @@ +/*--------------------------------------------------------------*/ /* resources for Advanced Disk Utility by Monte Benaresh */ /* */ /* created February 16, 1991 */ /*--------------------------------------------------------------*/ #include "Typesiigs.r" #define rSCSIDrvr $4D61 /* unusual value for uniqueness */ #define rSCSIDescDrvr $5E72 /* unusual value for uniqueness */ #define versionString "1.2" /* maintain version here and in "Data.aii" */ resource rVersion(1, $0000) { { $1, /* major version in BCD */ $2, /* minor version in BCD */ $0, /* bug version */ release, $00, /* # */ }, verUS, "Advanced Disk Utility", "Copyright 1988-92, Apple Computer, Inc." }; resource rComment(1, $0000) { "Advanced Disk Utility by Darryl Lovato." "\$0d" "\$0d" "Updated by Monte Benaresh." "\$0d" "\$0d" "Quality assured by Brenda Knudson, Margarita Sang, " "Llew Roberts, Steve Wesolowski, and Anil Gursahani." }; /* */ /* Equates for window flags */ /* */ #define wtitleAsRes $0200 #define wcolorAsRes $0800 #define wctlAsRes $0009 /* */ /* Defines for windows/controls */ /* */ #define mainDlog $1001 #define MEraseBut $0002 #define MTitleTxt $0003 #define MDiskBut $0005 #define MStatTxt $0008 #define MPartBut $0009 #define MCancelBut $000A #define MInitBut $000B #define MZeroBut $000C #define MInfoBut $000D /* */ /* Custom resource types */ /* */ type rSCSIDescDrvr { /* Descriptors associated with rSCSIDrvr resource with same ID. These are needed for the driver's partition map entry. */ /* ### numbers get compiled into Mac byte order ### ### because that's how they appear in the ### ### partition map entry ### */ reversebytes{longint;}; /* pmLgBootStart */ reversebytes{longint;}; /* pmBootSize */ reversebytes{longint;}; /* pmBootLoad */ reversebytes{longint;}; /* pmBootLoad2 */ reversebytes{longint;}; /* pmBootEntry */ reversebytes{longint;}; /* pmBootEntry2 */ /* reversebytes{longint;}; */ /* pmBootCksum */ wide array[128] { byte; }; /* 128 bytes of boot-specific arguments */ }; type rSCSIDrvr { /* binary image of SCSI boot driver */ wide array { byte; }; }; /* */ /* Resource declarations */ /* */ /* The SCSI driver resource must be an even # of blocks in length! */ read rSCSIDrvr (0x00000001,preload, nonpurgeable) "mac.driver"; resource rSCSIDescDrvr (0x00000001,preload, nonpurgeable) { /* these values get compiled into Mac byte order */ { 0x00000000}, /* pmLgBootStart */ { 0x000017E2}, /* pmBootSize */ { 0x00000000}, /* pmBootLoad */ { 0x00000000}, /* pmBootLoad2 */ { 0x00000000}, /* pmBootEntry */ { 0x00000000}, /* pmBootEntry2 */ /*{ 0x000063EE} */ /* pmBootCksum */ { /* boot-specific arguments */ /* These are set according to the values for any Apple- */ /* provided drive, from the file "hardDrives.h" for */ /* HDSC Partition. */ 0x00, 0x01, 0x06, 0x00, /* drvr signature */ 0x00, 0x00, 0x00, 0x01, /* pollbyte */ 0x00, 0x00, 0x00, 0x02, /* TIB type */ 0x00, 0x07, /* blind bits */ 0x00, 0x00, /* shutdown stop */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; }; /* New resources for main dialog */ resource rWindParam1 (mainDlog) { fTitle + fVis, /* frame bits */ MTitleTxt, /* title ID */ 0, /* ref con */ {0,0,0,0}, /* zoom rect */ 0, /* color table ID */ {0,0}, /* origin */ {0,0}, /* data size */ {0,0}, /* max height/width */ {0,0}, /* scroll amount, hor/ver */ {0,0}, /* page amount */ 0, /* info ref con */ 0, /* info height */ {50,133,154,508}, /* window position */ infront, /* wPlane */ mainDlog, /* controls ref */ wColorAsRes + wTitleAsRes + wCtlAsRes /* descriptor */ }; /* controls for main dialog */ resource rControlList (mainDlog) { { MEraseBut, /* MTitleTxt, */ MDiskBut, MStatTxt, MPartBut, MCancelBut, MInitBut, MZeroBut, MInfoBut }; }; resource rControlTemplate (MEraseBut) { MEraseBut, /* control ID */ {31,125,44,220}, /* control rect */ SimpleButtonControl{{ /* control type */ 0, /* flags */ fctlProcNotPtr + RefIsResource, /* more flags */ 0, /* ref con */ MEraseBut /* title ref */ }}; }; resource rpString (MEraseBut) { "EraseÉ" }; resource rControlTemplate (MTitleTxt) { MTitleTxt, /* control ID */ {5,18,15,380}, /* control rect */ StatTextControl{{ /* control type */ 0xFF00, /* flag */ RefIsResource + FctlProcNotPtr, /* moreFlags */ 0, /* ref con */ MTitleTxt /* title ref */ }}; }; resource rTextForLETextBox2 (MTitleTxt) { "Apple IIGS Advanced Disk Utility v" versionString }; resource rpString (MTitleTxt) { "Apple IIGS Advanced Disk Utility v" versionString }; resource rControlTemplate (MDiskBut) { MDiskBut, /* control ID */ {6,262,20,353}, /* control rect */ SimpleButtonControl{{ /* control type */ 0, /* flags */ fctlProcNotPtr + RefIsResource + FctlWantsEvents, /* more flags */ 0, /* ref con */ MDiskBut, /* title ref */ 0, /* color table ref */ {"\0x09","\0x09",0,0} /* key equiv */ }}; }; resource rpString (MDiskBut) { "Disk" }; resource rControlTemplate (MStatTxt) { MStatTxt, /* control ID */ {85,0,108,375}, /* control rect */ StatTextControl{{ /* control type */ 0xFF03, /* flag */ RefIsResource + FctlProcNotPtr, /* moreFlags */ 0, /* ref con */ MStatTxt /* title ref */ }}; }; resource rTextForLETextBox2 (MStatTxt) { TBCenterJust "*0" /* substitution string */ }; resource rControlTemplate (MPartBut) { MPartBut, /* control ID */ {57,75,71,170}, /* control rect */ SimpleButtonControl{{ /* control type */ 0, /* flags */ fctlProcNotPtr + RefIsResource, /* more flags */ 0, /* ref con */ MPartBut /* title ref */ }}; }; resource rpString (MPartBut) { "PartitionÉ" }; resource rControlTemplate (MCancelBut) { MCancelBut, /* control ID */ {57,262,71,353}, /* control rect */ SimpleButtonControl{{ /* control type */ 0, /* flags */ fctlProcNotPtr + RefIsResource, /* more flags */ 0, /* ref con */ MCancelBut /* title ref */ }}; }; resource rpString (MCancelBut) { "Quit" }; resource rControlTemplate (MInitBut) { MInitBut, /* control ID */ {6,125,20,220}, /* control rect */ SimpleButtonControl{{ /* control type */ 0, /* flags */ fctlProcNotPtr + RefIsResource, /* more flags */ 0, /* ref con */ MInitBut /* title ref */ }}; }; resource rpString (MInitBut) { "InitializeÉ" }; resource rControlTemplate (MZeroBut) { MZeroBut, /* control ID */ {6,20,20,115}, /* control rect */ SimpleButtonControl{{ /* control type */ 0, /* flags */ fctlProcNotPtr + RefIsResource, /* more flags */ 0, /* ref con */ MZeroBut /* title ref */ }}; }; resource rpString (MZeroBut) { "ZeroÉ" }; resource rControlTemplate (MInfoBut) { MInfoBut, /* control ID */ {31,20,44,115}, /* control rect */ SimpleButtonControl{{ /* control type */ 0, /* flags */ fctlProcNotPtr + RefIsResource, /* more flags */ 0, /* ref con */ MInfoBut /* title ref */ }}; }; resource rpString (MInfoBut) { "Info" }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/ADU/mac.driver b/IIGS.601.SRC/A.U.G/ADU/mac.driver new file mode 100644 index 0000000..37e4de2 Binary files /dev/null and b/IIGS.601.SRC/A.U.G/ADU/mac.driver differ diff --git a/IIGS.601.SRC/A.U.G/ADU/makefile b/IIGS.601.SRC/A.U.G/ADU/makefile new file mode 100644 index 0000000..788a281 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/ADU/makefile @@ -0,0 +1 @@ +Objects = ¶ Globals.pii.aii.obj ¶ Utils.pii.aii.obj ¶ Guts.pii.aii.obj ¶ Dialog.pii.aii.obj ¶ Menu.pii.aii.obj ¶ Event.pii.aii.obj ¶ Init.pii.aii.obj ¶ Data.aii.obj ¶ OS.aii.obj Interfaces = InitIntfData.usym ¶ InitIntfProc.usym ¶ InitIntfPDOS.usym ¶ ListMgr.USym ADV.DISK.UTIL Ä {Interfaces} {Objects} ¶ adu.o adu.res duplicate -y adu.o ADV.DISK.UTIL # don't use -d to preserve filetype duplicate adu.res -r -y ADV.DISK.UTIL if {dup} # test whether we should duplicateiigs duplicateiigs -m -y ADV.DISK.UTIL Adv.Disk.Util end # # Resource fork added 2/17/91 by Monte # adu.res Ä adu.rii ¶ mac.driver ¶ {riigsincludes}TypesIIGS.r reziigs adu.rii -o adu.res adu.o Ä {Interfaces} {Objects} linkiigs -l -s > map ¶ -lseg Mickey:$1000 ¶ Init.pii.aii.obj ¶ Utils.pii.aii.obj ¶ Guts.pii.aii.obj ¶ Dialog.pii.aii.obj ¶ Menu.pii.aii.obj ¶ Event.pii.aii.obj ¶ OS.aii.obj ¶ Globals.pii.aii.obj ¶ Data.aii.obj ¶ "{PIIGSLibrary}PIIGSRuntime.obj" ¶ -lib "{PIIGSLibrary}PIIGSRuntime.obj" ¶ -at $0000DB03 ¶ -o adu.o # # Rules modified 2/8/91 by Monte Benaresh # .usym Ä .pii tmlpas {default}.pii .aii.obj Ä .aii asmiigs {default}.aii .pii.aii Ä .pii TMLPascal {default}.pii # dependencies among interfaces InitIntfProc.usym Ä InitIntfProc.pii ¶ InitIntfData.usym tmlpas InitIntfProc.pii InitIntfPDOS.usym Ä InitIntfPDOS.pii ¶ InitIntfData.usym tmlpas InitIntfPDOS.pii ListMgr.usym Ä ListMgr.pii ¶ InitIntfData.usym ¶ InitIntfProc.usym ¶ InitIntfPDOS.usym tmlpas ListMgr.pii Globals.pii.obj Ä Globals.pii {Interfaces} utils.pii.obj Ä utils.pii {Interfaces} guts.pii.obj Ä guts.pii {Interfaces} dialog.pii.obj Ä dialog.pii {Interfaces} menu.pii.obj Ä menu.pii {Interfaces} event.pii.obj Ä event.pii {Interfaces} init.pii.obj Ä init.pii {Interfaces} # # Rules added 2/8/91 by Monte Benaresh # # These were always necessary for correctness. # Globals.pii.aii Ä Globals.pii {Interfaces} Utils.pii.aii Ä Utils.pii {Interfaces} ¶ Globals.pii.aii.obj Guts.pii.aii Ä Guts.pii {Interfaces} ¶ Globals.pii.aii.obj ¶ Utils.pii.aii.obj Dialog.pii.aii Ä Dialog.pii {Interfaces} ¶ Globals.pii.aii.obj ¶ Utils.pii.aii.obj ¶ Guts.pii.aii.obj Menu.pii.aii Ä Menu.pii {Interfaces} ¶ Globals.pii.aii.obj ¶ Utils.pii.aii.obj ¶ Guts.pii.aii.obj ¶ Dialog.pii.aii.obj Event.pii.aii Ä Event.pii {Interfaces} ¶ Globals.pii.aii.obj ¶ Utils.pii.aii.obj ¶ Guts.pii.aii.obj ¶ Dialog.pii.aii.obj ¶ Menu.pii.aii.obj Init.pii.aii Ä Init.pii {Interfaces} ¶ Globals.pii.aii.obj ¶ Utils.pii.aii.obj ¶ Guts.pii.aii.obj ¶ Dialog.pii.aii.obj ¶ Menu.pii.aii.obj ¶ Event.pii.aii.obj \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Apple.Bowl b/IIGS.601.SRC/A.U.G/Apple.Bowl/Apple.Bowl new file mode 100644 index 0000000..e69de29 diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/AppleBowl.Icon b/IIGS.601.SRC/A.U.G/Apple.Bowl/AppleBowl.Icon new file mode 100644 index 0000000..b91f733 Binary files /dev/null and b/IIGS.601.SRC/A.U.G/Apple.Bowl/AppleBowl.Icon differ diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Bowl.bas b/IIGS.601.SRC/A.U.G/Apple.Bowl/Bowl.bas new file mode 100644 index 0000000..4c7ea19 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Bowl.bas @@ -0,0 +1 @@ +REM DISK VERSION 1/21/79 CRK REM Converted to IIGS July, 1991 by Greg Branche REM ************************* REM * * REM * A P P L E B O W L * REM * * REM ************************* REM ****** WRITTEN BY ****** REM * * REM * CHARLIE KELLNER * REM * * REM * AND ERIC LARSON * REM * * REM ******* NOV. 1978 ******* REM REM THIS PROGRAM IS A HIGH REM RESOLUTION 3-D GRAPHIC REM SIMULATION OF BOWLING. REM ************************* REM * * REM * NOTES * REM * * REM ************************* REM <<< VARIABLE USAGE >>> REM A$ : ALPHA STRING INPUT REM COLR : HIRES COLOR VALUE REM DX : RELEASE POINT STEP REM E : SCORE TAB VALUE REM F : FRAME COUNTER REM G : GUTTER FLAG REM H : NUMBER OF PINS HIT REM H1 : FIRST BALL SCORE REM I : FOR/NEXT COUNTER REM J : FOR/NEXT COUNTER REM K : PIN MATRIX INDEX REM L : LANE NUMBER REM N : GAME NUMBER REM N$ : PLAYER'S NAME REM OP0 : OLD PDL(0) VALUE REM OP1 : OLD PDL(1) VALUE REM PIN : PIN MATRIX REM ROT : HIRES ROTATION REM S : BALL SPEED REM SCALE : HIRES SCALE FACTOR REM SET : LANE CYCLE FLAG REM SHAPE : HIRES SHAPE NUMBER REM SP : SPARE FLAG REM ST : STRIKE FLAG REM SV : STRIKE SAVE FLAG REM T : TOTAL SCORE REM X : PIN COLUMN COUNTER REM X0 : HIRES X-COORDINATE REM X1 : BALL X-INCREMENT REM X2 : PIN X-POSITION REM X3 : BALL X-POSITION REM XP : BALL RELEASE POINT REM Y : PIN ROW COUNTER REM Y0 : HIRES Y-COORDINATE REM Z : PIN TABLE ENTRY REM THESE ARE THE NORMAL USAGES REM OF THE INDICATED VARIABLES; REM HOWEVER, SOME VARIABLES ARE REM USED IN SEVERAL ROUTINES TO REM CONSERVE MEMORY ALLOCATION. REM *************************** REM * * REM * NOTE: FOR COMPLETE USER * REM * INSTRUCTIONS IN PRINTED * REM * FORMAT, SIMPLY RUN THIS * REM * PROGRAM. (TEXT FOLLOWS) * REM * * REM *************************** REM Shape table MUST be named ShapeTbl in assembly source. REM Programmer's Aid library accesses it by name. REM Programmer's Aid Library variables X0 = 0 Y0 = 0 COLR = 0 SHAPE = 0 ROT = 0 SCALE = 1 COLLSN = 0 REM Program variables I = 0 J = 0 X = 0 Y = 0 Z = 0 DIM PIN(38),SET(2),A$(255),N$(20) TEXT CALL Home GOSUB "Title" GOSUB "InitTextScreen" CALL CursorOff VTAB 2: TAB 31: PRINT "A P P L E B O W L" TAB 31: PRINT "- - - - - - - - -" PRINT TAB 21: PRINT "< By Charlie Kellner and Eric Larson >" TAB 21: PRINT "< Apple IIGS Version by Greg Branche >" PRINT TAB 17: PRINT "Copyright (C) 1978, 1992 Apple Computer Inc." TAB 15: PRINT "Portions Copyright (C) 1991 The Byte Works, Inc." PRINT:PRINT TAB 18: PRINT "Apple Bowl is a copyrighted software product" TAB 15: PRINT "and as such may not be duplicated or transmitted." PRINT:PRINT TAB 19: PRINT "Copyright infringement may result in civil" TAB 14: PRINT "damages whether or not a profit motive is involved." VTAB 23: TAB 23 PRINT "Press the space bar to continue...";: CALL ClearStrobe "WaitKey_2" GOSUB "WaitForKey" CALL Keyboard IF Key # 32 THEN "WaitKey_2" GOSUB "InitTextScreen" REM " 1 2 3 4 5 6 7 REM "01234567890123456789012345678901234567890123456789012345678901234567890123456789 VTAB 2: TAB 31: PRINT "A P P L E B O W L" VTAB 9 PRINT " The Apple Bowl is a 3-D, Hi-Resolution graphic simulation of a bowling alley." PRINT " The computed motion of the ball & pins is derived from the laws of physics." PRINT " All conditions normally encountered in bowling, such as the direction, speed," PRINT " spin, and weight of the ball and pins are included with the ball's position" PRINT " to realistically determine the correct fall of the pins, and resulting score." PRINT " The ball can be thrown from any point across the width of the bowling alley." PRINT " Its direction, speed and spin are set at the moment of release by the mouse" PRINT " and two keys on the keyboard - the Apple and Option keys." VTAB 23: TAB 21: PRINT "Need instructions? (Hit 'Y' or 'N')..."; "WaitKey_3" GOSUB "WaitForKey" CALL Keyboard IF Key = ASC("N") OR Key = ASC("n") THEN "Begin_Game" IF Key # ASC("Y") AND Key # ASC("y") THEN "WaitKey_3" GOSUB "InitTextScreen" VTAB 1: TAB 29: PRINT "I N S T R U C T I O N S": PRINT REM " 1 2 3 4 5 6 7 REM "01234567890123456789012345678901234567890123456789012345678901234567890123456789 PRINT " Three lanes are shown on your screen. Notice that you are (appropriately) on" PRINT " lane ][. Occasionally you may notice activity on lanes I and ]I[: Don't let" PRINT " this concern you; they're on different teams, and won't affect your score." PRINT " When it's your turn to bowl, the Apple will display a small moving pointer at" PRINT " the front of your lane. This will be the point from which the ball will be " PRINT " released when you press either the Apple or Option keys on the keyboard." PRINT " Moving the mouse left and right controls the angle of release of the ball" PRINT " (direction left to right), and moving the mouse backwards and forwards" PRINT " controls its speed." PRINT PRINT " Your mouse positions will be shown by an indicator at each side of the lane." PRINT " If you use the Option key to throw the ball, it will hook slightly to the" PRINT " left. If you press the Apple key, the ball will hook to the right (the " PRINT " hook is more noticeable at slower speeds). " PRINT PRINT " The Apple keeps score automatically. Strikes and spares (marks) are scored " PRINT " by standard rules. Extra ball(s) are awarded for marks in the tenth frame." PRINT " To interrupt a game before the tenth frame, just hit the Escape (ESC) key." PRINT " If you decide to quit, you will be shown the last four score sheets." PRINT VTAB 24: TAB 22: PRINT "Ready to begin? (hit 'Y' or 'N')..."; "WaitKey_5" GOSUB "WaitForKey" CALL Keyboard IF Key = ASC("Y") OR Key = ASC("y") THEN "Begin_Game" IF Key # ASC("N") AND Key # ASC("n") THEN "WaitKey_5" TEXT80 CALL Normal CALL Home END REM ****************** REM * INITIALIZATION * REM ****************** "Begin_Game" CALL Normal : REM Clear 80 column screen CALL Home TEXT CALL Home CALL Normal CALL GetSysSpeed : REM read current system speed OldSysSpeed = SysSpeed : REM save for restoration later SysSpeed = 0 : REM set 1 MHz speed CALL SetSysSpeed CALL SetMousePosition REM DRAW LANES CALL Init COLR = 127: X0 = 0: Y0 = 0: CALL HPlot X0 = 278: CALL Line Y0 = 70: CALL Line X0 = 0: CALL HPlot Y0 = 0: CALL Line COLR = 85: Y0 = 44: CALL HPlot X0 = 279: CALL Line COLR = 127 FOR I = 1 TO 187 STEP 93 X0 = I: Y0 = 0: CALL HPlot Y0 = 70: CALL Line X0 = I + 92: CALL HPlot Y0 = 0: CALL Line NEXT I X0 = 93: Y0 = 70: CALL HPlot X0 = 0: Y0 = 159: CALL Line X0 = 186: Y0 = 70: CALL HPlot X0 = 279: Y0 = 159: CALL Line REM DRAW GUTTERS COLR = 170: X0 = 80: Y0 = 70: CALL HPlot X0 = 0: Y0 = 133: CALL Line X0 = 198: Y0 = 70: CALL HPlot X0 = 279: Y0 = 133: CALL Line X0 = 11: Y0 = 70: CALL HPlot X0 = 1: Y0 = 75: CALL Line X0 = 279: Y0 = 75: CALL HPlot X0 = 268: Y0 = 70: CALL Line X0 = 105: Y0 = 70: CALL HPlot X0 = 36: Y0 = 159: CALL Line X0 = X0 - 2: CALL HPlot X0 = 105: Y0 = 70: CALL Line X0 = 174: Y0 = 70: CALL HPlot X0 = 243: Y0 = 159: CALL Line X0 = X0 + 2: CALL HPlot X0 = 174: Y0 = 70: CALL Line REM DRAW FEATURES COLR = 42 FOR I = 1 TO 187 STEP 93 X0 = I + 84: Y0 = 2: CALL HPlot X0 = I + 6: CALL Line X0 = I + 45: Y0 = 42: CALL Line X0 = I + 84: Y0 = 2: CALL Line NEXT I COLR = 85 FOR I = 86 TO 192 STEP 26 X0 = I: Y0 = 149: CALL HPlot NEXT I FOR L = 0 TO 2 SET(L) = 1 GOSUB "Lane_Cycle" SHAPE = 2 X0 = L * 93 + 74: Y0 = 3: CALL XDraw SHAPE = 5 X0 = X0 - 67: Y0 = 41: CALL XDraw X1 = X0 + 70 FOR X0 = X1 - L * 3 TO X1 STEP 3 SHAPE = 6 CALL XDraw NEXT X0 NEXT L "Get_Name" CALL Home CALL ClearText VTAB 22: INPUT "Hi! What's your name? ",A$ IF A$="" THEN "Get_Name" I = LEN(A$) IF I > 20 THEN I = 20 N$ = A$(1,I) : REM Save player's name "Got_Name" CALL Home GOSUB "Lane_Reset" REM **************** REM * MAIN CONTROL * REM **************** "Main_Loop" CALL SetSysSpeed : REM Make sure we're running slow CALL Keyboard IF Key = 155 OR F > 9 THEN "Game_End_2" CALL ClearStrobe : REM clear any pending keystrokes G = 0 IF L # 1 OR RND(SP + ST + SV + 2) THEN "Player_Input" L = RND(2) * 2 IF OP0 <> PDL(0) / 10 OR OP1 <> PDL(1) / 10 THEN GOSUB "Draw_Settings" X0 = 133 * L: Y0 = 100: S = -2: X1 = (RND(200) + 150) * (1 - L) FOR I = 1 TO 1000 REM nothing! NEXT I X3 = 0 REM BALL MOTION "Ball_Motion" SHAPE = 7: ROT = 0: X2 = X0 * 100: CALL XDraw FOR I = 158 - (58 * (L # 1)) TO 70 STEP S CALL XDraw IF ABS(X0 - 133) + 33 < I OR L # 1 THEN "L2130" G = 1 X1 = SGN(133 - X0) * 100 X2 = 13300 - (I - 33) * X1 X0 = X2 / 100 "L2130" X1 = X1 + X3 X2 = X2 + X1 X0 = X2 / 100 Y0 = I CALL XDraw FOR J = 1 TO 30 REM delay NEXT J NEXT I CALL XDraw GOSUB "Pinfall" FOR I = 1 TO 600 REM delay NEXT I IF L = 1 THEN GOSUB "Scoring" GOSUB "Lane_Cycle" GOTO "Main_Loop" REM PLAYER INPUT "Player_Input" Call ReadButtons REM Ensure player releases buttons before continuing IF Button0 > 127 OR Button1 > 127 THEN "Player_Input" SHAPE = 2 ROT = 32 L = 1 Z = RND(200) + 200 X0 = XP: Y0 = 156: CALL XDraw IF OP0 = PDL(0) / 10 AND OP1 = PDL(1) / 10 THEN GOSUB "Draw_Settings" "No_Pdl_Change" CALL Keyboard IF Key = 155 THEN "Game_End" CALL ClearStrobe : REM clear any pending keystrokes X1 = 63 - PDL(0) / 2 X3 = 0 IF OP0 <> PDL(0) / 10 OR OP1 <> PDL(1) / 10 THEN GOSUB "Draw_Settings" S = (255 - PDL(1)) / 86 - 4 X1 = X1 * S Call ReadButtons IF Button0 > 127 THEN X3 = -2 * S IF Button1 > 127 THEN X3 = 2 * S IF X3 THEN "L2250" XP = XP + DX IF XP > 210 THEN DX = -2 IF XP < 75 THEN DX = 2 Z = Z - 1 CALL XDraw IF NOT Z THEN "Main_Loop" X0 = XP: CALL XDraw GOTO "No_Pdl_Change" "L2250" CALL XDraw X0 = X0 - RND(5) - 7 Y0 = 170 GOTO "Ball_Motion" "Draw_Settings" S1 = Y0 S2 = X0 S3 = COLR COLR = 255 Y0 = 159: X0 = 73: CALL HPlot Y0 = 157: CALL Line X0 = 231: CALL HPlot Y0 = 159: CALL Line X0 = 206: CALL HPlot Y0 = 157: CALL Line X0 = 48: CALL HPlot Y0 = 159: CALL Line Y0 = 158: COLR = 0: X0 = 49: CALL HPlot X0 = 72: CALL Line X0 = 230: CALL HPlot X0 = 207: CALL Line X0 = 206: CALL HPlot COLR = 255 X0 = 206 + (PDL(1) / 10): CALL Line X0 = 60: CALL HPlot X0 = 60 + (PDL(0) - 127) / 10: CALL Line OP0 = PDL(0) / 10 OP1 = PDL(1) / 10 COLR = S3 Y0 = S1 X0 = S2 RETURN REM ******************* REM * LANE RESET * REM ******************* "Lane_Reset" Call ClearMixed CALL Inverse VTAB 21 FOR I = 1 TO 159 PRINT " "; NEXT I CALL WriteLastSpace N = N + 1 VTAB 21: TAB 1: PRINT "Game "; IF N < 10 THEN PRINT "#"; PRINT N;" Bowler: ";N$ FOR I = 1 TO 10 PRINT "_";I;"_ "; NEXT I CALL SetMixed FOR I = 1 TO 1000 REM delay NEXT I FOR L = 0 TO 2 IF SET(L) THEN GOSUB "Lane_Cycle" NEXT L XP = 100 DX = 2 RETURN REM ******************* REM * END OF GAME * REM ******************* "Game_End" SHAPE = 2 ROT = 32 X0 = XP: Y0 = 156: CALL XDraw "Game_End_2" CALL ClearStrobe CALL Normal VTAB 24 PRINT PRINT "~Try_Again" INPUT "Another game? ",A$ IF A$ # "" THEN IF A$(1,1)="N" OR A$(1,1)="n" THEN "All_Done" IF A$(1,1) = "Y" OR A$(1,1) = "y" THEN "Nuther_Game" Call Bell : VTAB 22 : Call ClearEOS : VTAB 23 : GOTO "~Try_Again" "Nuther_Game" PRINT "~Try_Again_2" VTAB 21 CALL ClearEOS PRINT INPUT "Same bowler? ",A$ IF A$ = "" THEN "~Try_Again_2" IF A$(1,1) = "Y" OR A$(1,1) = "y" THEN "Same_Bowler" IF A$(1,1) = "N" OR A$(1,1) = "n" THEN "New_Bowler" Call Bell : Goto "~Try_Again_2" "New_Bowler" VTAB 22 CALL ClearEOS INPUT "Hi! What's your name? ",A$ IF A$ = "" THEN "New_Bowler" I = LEN(A$) IF I > 20 THEN I = 20 N$ = A$(1,I) : REM Save player's name "Same_Bowler" E = 0 F = 0 SP = 0 ST = 0 SV = 0 T = 0 ROT = 0 GOSUB "Lane_Reset" GOTO "Main_Loop" "All_Done" SysSpeed = OldSysSpeed : REM Reset the system speed CALL SetSysSpeed CALL SetText : REM turn graphics off CALL ClearHiRes : REM and ensure hi-res switch is turned off PRINT VTAB 21 CALL Normal CALL ClearEOS VTAB 24: TAB 8: PRINT "Press any key to exit..."; GOSUB "WaitForKey" CALL CursorOn END REM ************** REM * TITLE PAGE * REM ************** "Title" TEXT CALL Home CALL Inverse TAB 19: PRINT " " TAB 18: PRINT " " TAB 18: PRINT " " TAB 17: PRINT " " TAB 17: PRINT " " TAB 18: PRINT " " TAB 18: PRINT " " TAB 19: PRINT " " TAB 19: PRINT " " TAB 18: PRINT " " TAB 17: PRINT " " TAB 16: PRINT " " TAB 15: PRINT " -Welcome- " TAB 14: PRINT " " TAB 14: PRINT " Apple Bowl " TAB 14: PRINT " " TAB 14: PRINT "$16,384 HiRes" TAB 14: PRINT " " TAB 14: PRINT " Competition " TAB 14: PRINT " " TAB 15: PRINT " -No Pets- " TAB 16: PRINT " " TAB 17: PRINT " " CALL Normal For I = 1 to 35 For J = 1 to 5000 Next J Next I RETURN "InitTextScreen" TEXT80 CALL Normal CALL Home RETURN REM ***************** REM * PINFALL LOGIC * REM ***************** "Pinfall" K = L * 13 H = 0 IF G THEN "In_Gutter_2" X1 = X1 / 100 X3 = X0 Z = 0 FOR Y = 1 TO 4 X = L * 93 + 4: X3 = X3 + X1 IF X3 < X THEN X3 = X IF X3 > X + 72 THEN X3 = X + 72 SHAPE = 7 X0 = X3: Y0 = 70 -Y * 2: CALL XDraw G = 0 FOR X = 1 TO Y X2 = (X3 - L * 93 + Y * (7 + L) - X * 16 - 32) / 3 IF ABS(X2) > 3 THEN "Skip" S = 15 - Y * 4 + X IF PIN(K + S) # 1 THEN "Skip" Z = ((S - (S > 6) - 2 * (S > 9)) * 7 + X2) * 2 : REM calc array offset CALL TranslateZ : REM read pinfall table I = 0 IF G THEN "In_Gutter_1" G = 1 CALL XDraw "In_Gutter_1" IF PIN(K + I) = 1 AND Z MOD 2 THEN PIN(K + I) = 0 Z = Z / 2 I = I + 1 IF Z THEN "In_Gutter_1" GOSUB "Pin_Action" X1 = X1 + X2 IF Y = 4 THEN Z = 1 "Skip" NEXT X IF NOT G THEN CALL XDraw NEXT Y SHAPE = 1 ROT = 16 + 32 * RND(2) X0 = L * 93 + ROT + RND(40) Y0 = 60 + RND(6) COLR = 127 IF RND(Z+1) THEN CALL Draw ROT = 0 RETURN "In_Gutter_2" FOR I = 1 TO 50 CALL Click NEXT I RETURN REM ************** REM * PIN ACTION * REM ************** "Pin_Action" SHAPE = 1 FOR I = 4 TO 1 STEP -1 FOR J = 4 TO I STEP -1 X0 = L * 13 + I * 3 + J - 4 IF PIN(X0) THEN "Missed_Pin" PIN(X0) = -1 H = H + 1 X0 = L * 93 - (L - 1) * (4 - I) * 3 - I * 8 + J * 16 + 14 Y0 = 70 + I * 2 - 13 COLR = 0 CALL Draw COLR = 127 Y0 = 60 X0 = L * 83 + 25 CALL HPlot X0 = X0 + 65 CALL Line CALL Click: CALL Click: CALL Click: CALL Click "Missed_Pin" NEXT J NEXT I FOR I = 1 TO 4 FOR J = I TO 4 IF PIN(L * 13 + I * 3 + J - 4) < 1 THEN "Missed_Pin_2" X0 = L * 93 - (L - 1) * (4 - I) * 3 - I * 8 + J * 16 + 14 Y0 = 70 + I * 2 - 15 COLR = 0 IF I > 1 THEN CALL Draw Y0 = Y0 + 2 COLR = 127 CALL Draw "Missed_Pin_2" NEXT J NEXT I RETURN REM ************** REM * LANE CYCLE * REM ************** "Lane_Cycle" SET(L) = NOT SET(L) FOR I = 45 TO 69 Z = L * 93 + 2 X0 = Z Y0 = I CALL HPlot X0 = Z + 90 - (L = 2) COLR = 127 CALL Line Y0 = Y0 - 4 IF Y0 > 44 THEN CALL HPlot X0 = Z COLR = 213 IF Y0 > 44 THEN CALL Line NEXT I SHAPE = 4 X0 = L * 93 + 46 Y0 = 12 IF SET(L) THEN CALL XDraw REM PIN SWEEPER GOSUB "Pin_Spotter" X = L * 93 + 2 Y = X + 90 - (L = 2) J = 0 FOR I = 69 TO 45 STEP -1 X0 = X: Y0 = I: CALL HPlot X0 = Y: COLR = 0: CALL Line Y0 = Y0 - 4 IF Y0 > 44 THEN CALL HPlot X0 = X COLR = 127 IF Y0 > 44 THEN CALL Line IF I > 59 THEN J = J+1 X0 = X + (2 - L) * J - 2 Y0 = I: CALL HPlot X0 = Y - L * J + 1 IF I = 60 THEN CALL Line CALL HPlot NEXT I REM PIN SETTER SHAPE = 1 FOR I = 1 TO 4 FOR J = I TO 4 K = L * 13 + I * 3 + J - 4 IF NOT SET(L) THEN PIN(K) = 1 IF PIN(K) < 1 THEN "Skip_Setup" X0 = L * 93 - (L - 1) * (4 - I) * 3 - I * 8 + J * 16 + 14 Y0 = 55 + I * 2 IF I < 2 THEN "Skip_Draw" COLR = 0: CALL Draw "Skip_Draw" Y0 = Y0 + 2 COLR = 127 CALL Draw "Skip_Setup" NEXT J NEXT I SHAPE = 2 Y0 = 3 X0 = L * 93 + 10 CALL XDraw X0 = X0 + 64: CALL XDraw FOR I = 1 TO 500 REM delay NEXT I IF H = 10 AND SET(L) THEN "Lane_Cycle" RETURN REM *************** REM * PIN SPOTTER * REM *************** "Pin_Spotter" SHAPE = 3 H = 10 FOR I = 1 TO 4 FOR J = I TO 4 K = L * 13 + I * 3 + J - 4 COLR = 127 * (SET(L) AND PIN(K) = 1) IF PIN(K) = 1 THEN H = H - 1 X0 = L * 93 - I * 8 + J * 16 + 14 Y0 = I * 8 CALL Draw NEXT J NEXT I IF H < 10 AND SET(L) THEN "Short_Pause" COLR = SET(L) * 127 X0 = X0 - 4: Y0 = 15: CALL HPlot X0 = X0 + 8: Y0 = Y0 - 8: CALL Line X0 = X0 - 8: Y0 = Y0 + 8: CALL Line X0 = X0 + 8: CALL HPlot X0 = X0 - 8: Y0 = Y0 - 8: CALL Line X0 = X0 + 8: Y0 = Y0 + 8: CALL Line "Short_Pause" FOR I = 1 TO 200 REM delay NEXT I SHAPE = 4 X0 = L * 93 + 46: Y0 = 12 IF NOT SET(L) THEN CALL XDraw RETURN REM *********** REM * SCORING * REM *********** "Scoring" T = T + H IF NOT ST AND NOT SP THEN "No_Extras" GOSUB "L1780" T = T + H IF NOT SP THEN T = T + H1 "No_Extras" SP = 0 ST = SV SV = 0 IF NOT SET(L) THEN "L1750" VTAB 23 TAB E-2 PRINT ":"; IF H + H1 < 10 THEN "No_Spare" PRINT "/"; SP = 1 IF E = 40 THEN E = 42 GOTO "Score_Done" "No_Spare" IF H THEN PRINT H; IF NOT H THEN PRINT "-"; GOSUB "L1780" GOTO "Score_Done" "L1750" E = E + 1 + 3 * (E < 40) VTAB 23 TAB E - 3 IF H < 10 THEN "L1760" IF E < 40 THEN PRINT "" IF E > 39 THEN PRINT "X"; SV = 1 GOTO "Score_Done" "L1760" IF H THEN PRINT H; IF NOT H THEN PRINT "-"; "Score_Done" H1 = H RETURN "L1780" F = F + 1 IF F > 10 THEN RETURN VTAB 24 TAB F * 4 - 3 + (T < 10) PRINT T; RETURN "WaitForKey" Call ClearStrobe "~loop" Call Keyboard IF Key < 128 then "~loop" Call ClearStrobe Return \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Bowl.r b/IIGS.601.SRC/A.U.G/Apple.Bowl/Bowl.r new file mode 100644 index 0000000..043a53a --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Bowl.r @@ -0,0 +1 @@ +#include "TypesIIGS.r" resource rVersion (1) { { 2,0,0,development,1 }, verUS, "Apple Bowl IIGS", "Copyright (c) 1991, Apple Computer, Inc." }; resource rIcon (1) { 0, // icon type = monochrome 16, // height of icon 16, // width of icon $"FFFFFFFFFFFFFFFF" $"FFC00FFFFFFC00FF" $"FF0FC0FFFFF0FC0F" $"FC0FF0FFFFC0FF0F" $"FF0FC0FFFFF0FC0F" $"FFC00FFFFFFC00FF" $"FFC00FFFFFFC00FF" $"FC0FC0C000C0FC0F" $"F0FFC000000FFFC0" $"C0FF00000000FFF0" $"C0FF00000000FFF0" $"C0FF00000000FFF0" $"F0FFC000000FFFC0" $"FC0FC0000000FC0F" $"FFC00FC000FC00FF" $"FFFFFFFFFFFFFFFF", $"00FFF000000FFF00" $"0FFFFF0000FFFFF0" $"0FFFFF0000FFFFFF" $"0FFFFF0000FFFFFF" $"00FFFF00000FFFF0" $"00FFF000000FFFF0" $"0FFFFFFFFFFFFF00" $"FFFFFFFFFFFFFFF0" $"FFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFF" $"0FFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFF0" $"000FF0FFFF0FFF00" }; resource rBundle(1) { 1, // rIcon id # 1, // rBundle id # { } // document array (no documents supported) }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/BowlBin.aii b/IIGS.601.SRC/A.U.G/Apple.Bowl/BowlBin.aii new file mode 100644 index 0000000..203adfc --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/BowlBin.aii @@ -0,0 +1 @@ +; ; ReadButtons - Read game control buttons and place the values into variables ; ReadButtons PROC EXPORT IMPORT Button0, Button1 lda >$E0C061 ;read game control buttons ($C061 & $C062) sep #$20 sta >Button0 ;store so the values can be read by BASIC xba sta >Button1 rep #$20 rtl ENDP ; ; ClearHiRes - sets lores display mode ; ClearHiRes PROC EXPORT sep #$20 sta >$E0C056 rep #$20 rtl ENDP ; ; SetHiRes - sets hires display mode (POKE -16297,0) ; SetHiRes PROC EXPORT sep #$20 sta >$E0C057 rep #$20 rtl ENDP ; ; ClearText - turns off text mode (graphics on) ; ClearText PROC EXPORT sep #$20 sta >$E0C050 rep #$20 rtl ENDP ; ; SetText - accesses soft switch to turn text display on ; SetText PROC EXPORT sep #$20 lda >$E0C051 rep #$20 rtl ENDP ; ; ClearMixed - turns off mixed mode ; ClearMixed PROC EXPORT sep #$20 sta >$E0C052 rep #$20 rtl ENDP ; ; SetMixed - turns on mixed mode ; SetMixed PROC EXPORT sep #$20 sta >$E0C053 rep #$20 rtl ENDP ; ; CursorOff - sends Ctrl-F to output device to turn cursor off ; CursorOff PROC EXPORT IMPORT ~ChOut lda #$0006 bra do_write ; ; CursorOn - Sends Ctrl-E to output device to turn cursor on ; EXPORT CursorOn CursorOn lda #$0005 do_write jsr ~ChOut ; use library routine rtl ENDP ; ; WriteLastSpace - stores a space character in the lower right corner of the screen ; WriteLastSpace PROC EXPORT sep #$20 longa off lda #' ' sta >$0007F7 rep #$20 longa on rtl ENDP ; ; GetSysSpeed - retrieves current system speed and stores into BASIC variable ; GetSysSpeed PROC EXPORT IMPORT SysSpeed sep #$20 longa off lda >$E0C036 ;read CYA register asl a ;shift speed bit into carry rep #$20 ;back to 16-bit mode longa on lda #0 ;clear accumulator rol a ;shift carry into bit 0 of accumulator sta >SysSpeed ;store into BASIC variable rtl ENDP ; ; SetSysSpeed - resets current system speed ; SetSysSpeed PROC EXPORT Import SysSpeed sep #$20 ;8-bit mode longa off lda >$E0C036 ;read the CYA register asl a ;shift speed bit off xba ;hide in high byte lda >SysSpeed ;read the BASIC variable lsr a ;shift bit into carry xba ;retrieve CYA settings ror a ;rotate speed bit in sta >$E0C036 ;store back into CYA register rep #$20 longa on rtl ENDP ; ; SetMousePosition - initializes mouse values ; Note: assumes mouse max clamp = 255 ; SetMousePosition PROC EXPORT pea 128 ;set to midpoint of range pea 128 ldx #$1E03 ;PosMouse jsl $E10000 rtl ENDP TranslateZ PROC EXPORT IMPORT Z, PinTable lda Z ;get value of Basic's Z variable clc adc #4 ;calculate correct offset tax lda PinTable,x ;get the value there sta Z ;store back into Basic's variable rtl ENDP ShapeTbl RECORD Export DC.W $0007 ;# of shapes in table DC.W PinImage-ShapeTbl ;Offset to Shape_1 DC.W Arrow-ShapeTbl ;Offset to Shape_2 DC.W Dot-ShapeTbl ;Offset to Shape_3 DC.W Logo-ShapeTbl ;Offset to Shape_4 DC.W Apple-ShapeTbl ;Offset to Shape_5 DC.W I_Image-ShapeTbl ;Offset to Shape_6 DC.W Ball-ShapeTbl ;Offset to Shape_7 PinImage DC.B $92,$3A,$27,$27,$3C,$24,$24,$25 ;shape 1 DC.B $2C,$24,$25,$24,$3C,$24,$25,$2D DC.B $2E,$36,$37,$36,$2E,$36,$35,$2E DC.B $36,$36,$37,$3E,$3E,$3C,$27,$27 DC.B $3C,$24,$25,$2C,$24,$25,$24,$24 DC.B $24,$17,$0D,$16,$92,$32,$2E,$36 DC.B $35,$3E,$36,$3F,$3C,$24,$67,$64 DC.B $B4,$35,$2E,$17,$E6,$24,$04,$00 Arrow DC.B $35,$35,$35,$35,$0C,$2C,$2C,$2C ;shape 2 DC.B $1F,$3F,$3F,$15,$35,$0C,$04,$00 Dot DC.B $27,$2D,$36,$3F,$27,$64,$2D,$15 ;shape 3 DC.B $36,$1E,$3F,$04,$00 Logo DC.B $0C,$0D,$0D,$15,$F6,$17,$36,$0E ;shape 4 DC.B $15,$F6,$1E,$1F,$DC,$9F,$1F,$1C DC.B $1C,$E4,$24,$24,$64,$0C,$0D,$0D DC.B $0C,$64,$0C,$4C,$36,$1E,$17,$07 DC.B $00 Apple DC.B $E7,$1C,$64,$0C,$2D,$35,$36,$36 ;shape 5 DC.B $4D,$12,$24,$24,$24,$2C,$2D,$15 DC.B $15,$F6,$1E,$6F,$49,$91,$24,$24 DC.B $24,$2C,$2D,$15,$15,$F6,$1E,$6F DC.B $49,$21,$24,$24,$24,$96,$52,$49 DC.B $09,$0C,$0C,$3C,$3F,$17,$17,$76 DC.B $0E,$2D,$2D,$00 I_Image DC.B $6D,$FD,$24,$24,$24,$3C,$6F,$29 ;shape 6 DC.B $05,$00 Ball DC.B $35,$35,$2D,$2E,$2D,$2D,$2C,$25 ;shape 7 DC.B $25,$25,$3F,$3E,$3E,$37,$27,$37 DC.B $27,$3F,$3C,$3C,$27,$2D,$35,$35 DC.B $25,$35,$25,$35,$25,$25,$3F,$3F DC.B $3F,$3C,$3F,$67,$2D,$2D,$2E,$24 DC.B $35,$2E,$24,$35,$2E,$35,$2D,$3C DC.B $3C,$27,$E5,$3B,$3F,$37,$3F,$67 DC.B $31,$00 ENDR PinTable Record DC.B $0F,$00 DC.B $03,$00 DC.B $01,$00 z_base DC.B $01,$00 DC.B $01,$00 DC.B $01,$00 DC.B $01,$00 DC.B $0E,$00 DC.B $06,$00 DC.B $02,$00 DC.B $02,$00 DC.B $02,$00 DC.B $02,$00 DC.B $03,$00 DC.B $0C,$00 DC.B $04,$00 DC.B $04,$00 DC.B $04,$00 DC.B $04,$00 DC.B $06,$00 DC.B $07,$00 DC.B $08,$00 DC.B $08,$00 DC.B $08,$00 DC.B $08,$00 DC.B $08,$00 DC.B $0C,$00 DC.B $0F,$00 DC.B $38,$00 DC.B $16,$00 DC.B $12,$00 DC.B $10,$00 DC.B $11,$00 DC.B $11,$00 DC.B $10,$00 DC.B $60,$00 DC.B $2C,$00 DC.B $24,$00 DC.B $20,$00 DC.B $22,$00 DC.B $23,$00 DC.B $30,$00 DC.B $40,$00 DC.B $48,$00 DC.B $48,$00 DC.B $40,$00 DC.B $44,$00 DC.B $46,$00 DC.B $61,$00 DC.B $00,$03 DC.B $68,$01 DC.B $24,$01 DC.B $02,$01 DC.B $11,$01 DC.B $10,$01 DC.B $00,$01 DC.B $00,$02 DC.B $40,$02 DC.B $48,$02 DC.B $04,$02 DC.B $22,$02 DC.B $31,$02 DC.B $00,$03 DC.B $00,$10 DC.B $00,$12 DC.B $48,$12 DC.B $26,$10 DC.B $11,$11 DC.B $00,$11 DC.B $00,$10 ENDR END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Basic.p b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Basic.p new file mode 100644 index 0000000..fa91c74 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Basic.p @@ -0,0 +1 @@ +{---------------------------------------------------------------} { } { BASIC 1.0 } { } { A native code integer BASIC compiler for the Apple IIGS. } { } { By Mike Westerfield } { } { Copyright 1991 } { By the Byte Works, Inc. } { } {---------------------------------------------------------------} PROGRAM BASIC_Compiler(output); USES Types, BASICCom, Scanner, Parser; BEGIN {BASIC_Compiler} InitCommon; {initialize the globals area} InitScanner; {initialize the scanner} InitParser; {initialize the parser} Compile; {compile the program} ShutDownScanner; {shut down the scanner} END. {BASIC_Compiler} \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/BasicCom.p b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/BasicCom.p new file mode 100644 index 0000000..298a6d8 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/BasicCom.p @@ -0,0 +1 @@ +{---------------------------------------------------------------} { } { BASIC Common } { } { This module contains global variables, constants, types, } { and subroutines used throughout the compiler. } { } { Copyright 1991 } { By the Byte Works, Inc. } { } {---------------------------------------------------------------} { } { Global subroutines: } { } { InitCommon - Initialize the globals area } { } {---------------------------------------------------------------} UNIT BASICCom; INTERFACE USES CursorCtl, Types; CONST nameLength = 100; {max length of a variable name} stringLength = 255; {max length of a string constant} m_adc_abs = $6D; {machine code instructions} m_adc_imm = $69; m_adc_s = $63; m_and_imm = $29; m_and_s = $23; m_asl = $0A; m_beq = $F0; m_bge = $B0; m_bmi = $30; m_bne = $D0; m_bpl = $10; m_clc = $18; m_cop = $02; m_dec_a = $3A; m_dec_abs = $CE; m_eor_imm = $49; m_inc_a = $1A; m_inc_abs = $EE; m_lda_imm = $A9; m_ora_s = $03; m_jml = $5C; m_jmp = $4C; m_jsl = $22; m_jsr = $20; m_lda_abs = $AD; m_lda_absx = $BD; m_lda_indl = $A7; m_lda_dir = $A5; m_ldx_abs = $AE; m_ldx_dir = $A6; m_sbc_dir = $E5; m_sta_abs = $8D; m_sta_absx = $9D; m_sta_dir = $85; m_sta_longx = $9F; m_sta_s = $83; m_pea = $F4; m_pha = $48; m_pla = $68; m_plx = $FA; m_ply = $7A; m_rep = $C2; m_rts = $60; m_sec = $38; m_sep = $E2; m_tax = $AA; d_bgn = $0101; d_end = $0102; d_lab = $0103; d_str = $0104; d_lnm = $0105; d_brk = $0106; d_ago = $0107; d_sub = $0108; d_exi = $0109; d_fil = $010A; TYPE bytePtr = ^byte; {pointer to a single byte} long = RECORD {used to convert longint to integer} CASE boolean OF true: (l: longint); false: (lsw, msw: integer); END; {tokens} {------} nameType = string[nameLength]; {symbol name} namePtr = ^nameType; {symbol name pointer} stringType = string[stringLength]; {string constant} tokens = (eofsy, eolnsy, {special symbols} {constants and identifiers} ident, intconst, stringconst, {operators} colon, comma, semicolon, lparen, rparen, eq, lt, gt, le, ge, ne, plus, minus, mult, divd, exp, {reserved words} abssy, andsy, ascsy, atsy, callsy, colorsy, dimsy, endsy, forsy, gosubsy, gotosy, grsy, hgrsy, hlinsy, ifsy, inputsy, lensy, letsy, modsy, nextsy, notsy, orsy, pdlsy, plotsy, popsy, printsy, remsy, returnsy, rndsy, scrnsy, sgnsy, stepsy, tabsy, textsy, text80sy, thensy, tosy, vlinsy, vtabsy); tokenset = SET OF tokens; {set of tokens} tokenType = RECORD {information about a token} CASE kind: tokens OF ident: (name: nameType); intconst: (ival: integer); stringconst: (str: stringType); eofsy, eolnsy, colon, comma, semicolon, lparen, rparen, eq, lt, gt, le, ge, ne, plus, minus, mult, divd, exp, abssy, andsy, ascsy, atsy, callsy, colorsy, dimsy, endsy, forsy, gosubsy, gotosy, grsy, hgrsy, hlinsy, ifsy, inputsy, lensy, letsy, modsy, nextsy, notsy, orsy, pdlsy, plotsy, popsy, printsy, remsy, returnsy, rndsy, scrnsy, sgnsy, stepsy, tabsy, textsy, text80sy, thensy, tosy, vlinsy, vtabsy: () END; {symbols} {-------} expressionTypes = (int, str); {types of expressions} symbolPtr = ^symbolType; {pointer to a symbol table entry} symbolType = RECORD {symbol table entry} left, right: symbolPtr; {tree links} name: nameType; {symbol name} kind: expressionTypes; {type of the symbol} size: integer; {array size (1 if not an array)} newSymbol: boolean; {was this symbol just created?} END; VAR {command line flags} {------------------} keep: boolean; {keep the output file?} listSource: boolean; {create a source listing?} listSymbols: boolean; {list symbols and code?} quiet: boolean; {show progress info?} showOffsets: boolean; {show object code offsets} {error tracking and reporting} {----------------------------} msg: string; {terminal error message} maxErrorLevel: integer; {max error level} numErrors: integer; {number of errors found} {scanner} {-------} keepFile: stringType; {output file name} lineNumber: integer; {current line number} token: tokenType; {current token} sourceFile: stringType; {input file name} lineType: (step, breakpoint, autogo); {debugger step type for the line} {symbols} {-------} symbolTable: symbolPtr; {symbols in the program} {return codes} {------------} retCode: (RC_Normal, RC_ParmErrs, RC_DontMatch, RC_Abort); {Return codes} interrupted: Boolean; { True ==> interrupted (Cmd "." pressed)} progName: String; { Program's file name} {miscellaneous} {-------------} objBuf: Handle; {object code buffer} segNum: integer; {segment #} {---------------------------------------------------------------} PROCEDURE InitCommon; { Initialize the globals area } FUNCTION cnvis(num : integer) : StringPtr; { Convert integer to string } {---------------------------------------------------------------} IMPLEMENTATION var strbuf : String[6]; PROCEDURE InitCommon; { Initialize the globals area } BEGIN {InitCommon} symbolTable := NIL; {no entries in the symbol table} segNum := 0; {gets incremented prior to use} InitCursorCtl(NIL); END; {InitCommon} FUNCTION cnvis {(num : integer) : StringPtr} ; VAR i : integer; temp : integer; neg : boolean; BEGIN FOR i := 1 TO 6 DO strbuf[i] := ' '; strbuf[0] := chr(6); if num < 0 then begin neg := true; num := -num; end else neg := false; i := 6; { character position } WHILE (num <> 0) AND (i <> 0) DO BEGIN temp := num MOD 10; num := num DIV 10; strbuf[i] := chr(ord('0') + temp); i := i - 1; END; {while} if neg then strbuf[i] := '-'; cnvis := @strbuf; END; {cnvis} END. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/BasicLib.aii b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/BasicLib.aii new file mode 100644 index 0000000..e84586a --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/BasicLib.aii @@ -0,0 +1 @@ +**************************************************************** * * BASICLib - Run-time library for the integer BASIC compiler. * * by Mike Westerfield * May 1990 * * Copyright 1990 * Byte Works, Inc. * **************************************************************** * * Libraries 1.0.1, November 1991, Mike Westerfield * * 1. ~InputStr now pushes the length of the string on the * stack, rather than 0. * **************************************************************** * INCLUDE 'basiclib.macros' **************************************************************** * * BasicCommon - common data area * **************************************************************** * BasicCommon RECORD ; ; Common variables for line input ; cnt DS.B 2 ;chars left in line (see ~Input, ~EndInput) disp DS.B 2 ;disp in line inputLine dc.b 255 ;input line dc.b 0 ds.b 255 DC.W 0 ;buffer for null terminating the line ; ; Common variables for text output ; ch DS.B 2 ;output column number chMask DS.B 2 ;40 column screen mask (for inverse) col80 DC.W 1 ;1 -> 80 column output; 0 -> 40 column ouput color DS.B 2 ;lowres graphics color column DS.B 2 ;column number; tracked by output routines cv DS.B 2 ;output line number screenSize DC.W 81 ;screen width + 1 top DS.B 2 ;top line of text display lineDisp DC.W $400,$480,$500,$580,$600,$680,$700,$780 DC.W $428,$4A8,$528,$5A8,$628,$6A8,$728,$7A8 DC.W $450,$4D0,$550,$5D0,$650,$6D0,$750,$7D0 ; ; Misc global variables ; QDHandle DS.B 4 ;handle for QD memory userID DS.B 2 ;memory manager user ID ENDR **************************************************************** * * Clear - Clear the 40 column text screen * * Inputs: * top - top line to clear * A - value to store in screen space * **************************************************************** * ~Clear PROC with BasicCommon phb ;use local addressing phk plb sta screen ;save the screen value lda top ;get the initial index into lineDisp asl A sta index lb1 ldx index ;branch if at end of screen cpx #48 bge lb3 lda lineDisp,X ;get line address inx ;update index inx stx index tax ;set initial line index ldy #20 ;we will store 20 words lda screen ;get the value to store lb2 sta >0,X ;fill the line inx inx dey bne lb2 bra lb1 ;next line lb3 plb rts index DS.B 2 ;index into lineDisp screen DS.B 2 ;screen value ENDP **************************************************************** * * Write40 - write a character to the 40 column screen * * Inputs: * A - character to write * **************************************************************** * ~Write40 PROC with BasicCommon ; ; Check for special characters ; and #$007F cmp #30 jge wr1 cmp #7 ;Bell bne sp1 _SysBeep rts sp1 cmp #10 ;linefeed bne sp2 Newline inc cv lda cv cmp #24 blt sp1a lda #23 sta cv jsr Scroll sp1a rts sp2 cmp #11 ;clear to end of screen bne sp3 jsr ClearEOL ph2 top lda cv inc cv cmp #24 bge sp2a sta top lda #$A0A0 jsr ~Clear sp2a pla sta top rts sp3 cmp #12 ;home bne sp4 stz ch lda top sta cv lda #$A0A0 jsr ~Clear rts sp4 cmp #13 ;move to column 0 bne sp5 Return stz ch rts sp5 cmp #14 ;normal bne sp6 lda #$00FF sta chMask rts sp6 cmp #15 ;inverse bne sp7 lda #$7F sta chMask rts sp7 cmp #8 ;move left bne sp8 dec ch bpl sp7a inc ch sp7a rts sp8 cmp #29 ;clear to end of line bne sp9 ClearEOL ldy ch lda cv asl A tax lda lineDisp,X adc ch tax shortm lda #$A0 sp8a cpy #40 bge sp8b sta >0,X inx iny bra sp8a sp8b longm rts sp9 cmp #28 ;move forward bne wr1 Forward inc ch ;update ch lda ch ;if ch = 40 then cmp #40 blt sp9a jsr Return ;new line jsr Newline sp9a rts ; ; Do a normal character write ; wr1 pha ;save the character lda cv ;write to the 40 column screen asl A ;get the character address tax lda lineDisp,X adc ch tax pla ;convert to screen character shortm ora #$80 and chMask cmp #'@' blt wr2 cmp #'_'+1 bge wr2 and #$3F wr2 sta >0,X ;write the character longm jsr Forward ;update ch rts ; ; Scroll subroutine ; Scroll lda top ;line = top sta line sc1 lda line ;while line < 23 do cmp #23 bge sc3 asl A ;get line disps tax lda lineDisp+2,X tay lda lineDisp,X tax lda #20 ;move one line of characters sta loop phb pea 0 plb plb sc2 lda |0,Y sta |0,X inx inx iny iny lda >loop dec A sta >loop bne sc2 plb inc line ;++line bra sc1 ;endwhile sc3 ldx lineDisp+23*2 ;clear the bottom line lda #$A0A0 ldy #20 sc4 sta >0,X inx inx dey bne sc4 rts line DS.B 2 ;line number loop DS.B 2 ;column loop counter ENDP **************************************************************** * * BASICStartup - set up the run-time environment * **************************************************************** * ~BASICStartup PROC Export with BasicCommon phk ;establish local bank addressing plb sta userID ;save the user ID stz cnt ;start with no input line pha ;if event manager not started then _EMStatus ;{indicates prizm is not active} pla bne lb1 pea 0 ;initialize the mouse for ~Pdl _InitMouse pea 0 ;min X mouse clamp pea 255 ;max X mouse clamp pea 0 ;min Y mouse clamp pea 255 ;max Y mouse clamp _ClampMouse ;set the mouse clamping to emulate paddles lb1 rtl ENDP **************************************************************** * * BASICShutdown - shut down the run-time environment * **************************************************************** * ~BASICShutdown PROC Export EXPORT ~End ~End with BasicCommon Import ~Text80 jsl ~Text80 ;make sure quickdraw, 40 col text is off lda #0 ;return to the launcher Quit qtRec qtRec DC.L qtFlags ;addr of next prog to launch qtFlags DC.W 0 ;flags; doubles as null string ENDP **************************************************************** * * AssignString - assign a string * * Parameters: * from - address of the string to assign * num - number of characters to assign; 0 for all * to - address of the string to assign to * **************************************************************** * ~AssignString PROC Export with BasicCommon subroutine (4:from,2:len,4:to),0 sep #$20 longa off ldy #0 lb1 lda [from],y ;while [addr]^ <> 0 do begin sta [to],y ;[to]^ := [from]^ beq lb2 iny ;advance to the next character dec len ;loop bne lb1 lb2 rep #$20 longa on return ENDP **************************************************************** * * ~ChOut - write a character * * Inputs: * A - character to write * **************************************************************** * ~ChOut PROC Export with BasicCommon phb ;use local addressing phk plb ldx col80 ;split based on screen type beq lb1 pha ;write using the text tools _WriteChar plb rts lb1 jsr ~Write40 ;write to the 40 column screen plb rts ENDP **************************************************************** * * Bell - beep the bell * **************************************************************** * Bell PROC Export lda #7 jsr ~ChOut rtl ENDP **************************************************************** * * ClearEOL - Clear to the end of the line * **************************************************************** * ClearEOL PROC Export lda #29 jsr ~ChOut rtl ENDP **************************************************************** * * ClearEOS - Clear to the end of the screen * **************************************************************** * ClearEOS PROC Export lda #11 jsr ~ChOut rtl ENDP **************************************************************** * * ClearStrobe - clear the keyboard strobe * **************************************************************** * ClearStrobe PROC Export shortm sta >$C010 longm rtl ENDP **************************************************************** * * Click - click the speaker * **************************************************************** * Click PROC Export shortm ;click the speaker lda >$C030 longm ldx #175 ;simulate an integer BASIC delay lb1 dex bne lb1 rtl ENDP **************************************************************** * * CMP_EQ - compare two values for equality * * Inputs: * stack - first operand * A - second operand * * Outputs: * A - result * **************************************************************** * ~CMP_EQ PROC Export cmp 4,S beq true lda #0 bra lb1 true lda #1 lb1 phb plx ply plb plb phy phx plb rtl ENDP **************************************************************** * * CMP_GE - see if the first value is greater than or equal to the second * * Inputs: * stack - first operand * A - second operand * * Outputs: * A - result * **************************************************************** * ~CMP_GE PROC Export ldx #1 sec sbc 4,S beq true bvs lb1 eor #$8000 lb1 bpl true dex true phb pla ply plb plb phy pha plb txa rtl ENDP **************************************************************** * * CMP_GT - see if the first value is greater than the second * * Inputs: * stack - first operand * A - second operand * * Outputs: * A - result * **************************************************************** * ~CMP_GT PROC Export ldx #1 sec sbc 4,S beq false bvs lb1 eor #$8000 lb1 bpl true false dex true phb pla ply plb plb phy pha plb txa rtl ENDP **************************************************************** * * CMP_LE - see if the first value is less than or equal to the second * * Inputs: * stack - first operand * A - second operand * * Outputs: * A - result * **************************************************************** * ~CMP_LE PROC Export ldx #1 sec sbc 4,S beq true bvs lb1 eor #$8000 lb1 bmi true dex true phb pla ply plb plb phy pha plb txa rtl ENDP **************************************************************** * * CMP_LT - see if the first value is less than the second * * Inputs: * stack - first operand * A - second operand * * Outputs: * A - result * **************************************************************** * ~CMP_LT PROC Export ldx #1 sec sbc 4,S beq false bvs lb1 eor #$8000 lb1 bmi true false dex true phb pla ply plb plb phy pha plb txa rtl ENDP **************************************************************** * * CMP_NE - compare two values for inequality * * Inputs: * stack - first operand * A - second operand * * Outputs: * A - result * **************************************************************** * ~CMP_NE PROC Export cmp 4,S bne true lda #0 bra lb1 true lda #1 lb1 phb plx ply plb plb phy phx plb rtl ENDP **************************************************************** * * CMP_STR_EQ - compare two strings for equality * * Inputs: * str1 - first string * len1 - length of first string * str2 - second string * len2 - length of second string * * Outputs: * A - 1 if the strings are equal, else 0 * **************************************************************** * ~CMP_STR_EQ PROC Export result equ 0 ;result ch equ 2 ;temp character subroutine (4:str1,2:len1,4:str2,2:len2),4 stz result ;assume we will fail lb1 lda [str1] ;check for a mismatch and #$00FF sta ch lda [str2] and #$00FF cmp ch bne lb4 tax ;done if at end of the strings beq lb3 inc str1 ;next characters inc str2 dec len1 ;check for a forced end of string beq lb2 dec len2 bne lb1 lda [str1] ;handle a zero length check for str2 and #$00FF beq lb3 bra lb4 lb2 dec len2 ;handle a zero length check for str1 beq lb3 lda [str2] and #$00FF bne lb4 lb3 inc result ;the strings are equal lb4 ; branch here if the strings are not equal return 2:result ENDP **************************************************************** * * CMP_STR_NE - compare two strings for inequality * * Inputs: * str1 - first string * len1 - length of first string * str2 - second string * len2 - length of second string * * Outputs: * A - 1 if the strings are not equal, else 0 * **************************************************************** * ~CMP_STR_NE PROC Export phb phk plb pla sta Str pla sta Str+2 jsl ~CMP_STR_EQ ldx Str+2 phx ldx Str phx plb eor #1 rtl Str DS.B 4 ENDP **************************************************************** * * Color - set the pen color * * Inputs: * A - color * **************************************************************** * ~Color PROC Export with BasicCommon phb phk plb and #$000F sta color ldx col80 beq lb1 pha _SetSolidPenPat lb1 plb rtl ENDP **************************************************************** * * CursorLeft - move the cursor left * **************************************************************** * CursorLeft PROC Export lda #8 jsr ~ChOut rtl ENDP **************************************************************** * * Divd - division * * Inputs: * X - 1st operand * A - 2nd operand * * Outputs: * A - result * **************************************************************** * ~Divd PROC Export pha pha phx pha _SDivide pla plx rtl ENDP **************************************************************** * * ~EndInput - dump anything remaining in the input line * * Outputs: * cnt - set to 0 * **************************************************************** * ~EndInput PROC Export with BasicCommon lda #0 sta >cnt rtl ENDP **************************************************************** * * Exp - exponentiation * * Inputs: * X - 1st operand * A - 2nd operand * * Outputs: * A - result * **************************************************************** * ~Exp PROC Export phb ;use local addressing phk plb stx op ;save the argument sta cnt ;save the exponent lda #1 ;initialize the result sta val lda cnt ;check for negative exponents bpl lb1 lda op cmp #1 beq lb3 stz val bra lb3 lb1 beq lb3 ;allow for 0 exponent lb2 pha ;do the operation pha lda val pha lda op pha _Multiply pla sta val pla dec cnt bne lb2 lb3 lda val ;return the result plb ;restore the caller's bank rtl val DS.B 2 ;result op DS.B 2 ;argument cnt DS.B 2 ;exponent (also a loop counter) ENDP **************************************************************** * * GR - start the low-res graphics screen * **************************************************************** * ~GR PROC Export with BasicCommon phb ;use local addressing phk plb shortmx ;set screen to 40 column, mixed text stz col80 ;and graphics sta >$C050 sta >$C053 sta >$C054 sta >$C056 sta >$C00C longmx stz top ;clear the screen lda #0 jsr ~Clear lda #20 ;set the top text line to 20 sta top sta cv ;home the cursor stz ch lda #$A0A0 ;clear the text part of the screen jsr ~Clear lda #15 ;pen color starts as white sta color lda #$00FF ;set the screen mask sta chMask plb rtl ENDP **************************************************************** * * GROff - turn off 40 column text/graphics * **************************************************************** * ~GROff PROC with BasicCommon phb ;use local addressing phk plb lda col80 ;skip if not in use bne lb1 shortmx ;set screen to 80 column text lda #1 sta col80 sta >$C051 sta >$C052 sta >$C00D longmx ph2 #12 ;clear the 80 col screen _WriteChar lb1 plb rts ENDP **************************************************************** * * HGR - start the super high-res graphics screen * **************************************************************** * ~HGR PROC Export with BasicCommon jsr ~GROff ;turn off 40 col text/graphics lda QDHandle ;skip if already started ora QDHandle+2 bne lb1 pha ;get memory for QD pha ph4 #256*3 ph2 userID ph2 #$C015 ph4 #0 _NewHandle pla plx sta QDHandle stx QDHandle+2 sta 0 stx 2 lda [0] ;start quickdraw pha ph2 #0 ph2 #0 ph2 userID _QDStartUp lb1 rtl ENDP **************************************************************** * * Plot - plot a point * * Inputs: * X - x coordinate * A - y coordinate * **************************************************************** * ~Plot PROC Export with BasicCommon phb ;use local addressing phk plb ldy col80 ;branch if using 40 column mode beq lb1 phx ;draw a point using QuickDraw pha phx pha _MoveTo _LineTo plb rtl lb1 cpx #40 ;skip if off screen bge lb3 cmp #40 bge lb3 lsr A ;convert to row + top/bottom flag php ;save top/bottom flag asl A ;add column to row address tay txa clc adc lineDisp,Y tax lda color ;get the color nibble and mask ldy #$F0 plp shortm bcc lb2 ldy #$0F asl A asl A asl A asl A lb2 pha ;paint the point tya and >0,X ora 1,S sta >0,X pla longm lb3 plb rtl ENDP **************************************************************** * * HLin - draw a horizontal line * * Inputs: * X - h1 * Y - h2 * A - v * **************************************************************** * ~HLin PROC Export with BasicCommon phb ;use local addressing phk plb stx h1 ;save the coordinates sty h2 sta v lda col80 ;split based on screen type beq lb0 lda v ;call QuickDraw phx pha phy pha _MoveTo _LineTo plb rtl lb0 cpy h1 ;make sure h1 <= h2 bge lb1 sty h1 stx h2 lb1 ldx h1 ;plot the line lb2 lda v jsl ~Plot inc h1 ldx h1 cpx h2 ble lb2 plb ;return rtl h1 DS.B 2 ;first horizontal point h2 DS.B 2 ;second horizontal point v DS.B 2 ;vertical location ENDP **************************************************************** * * Home - clear the screen and home the cursor * **************************************************************** * Home PROC Export lda #12 jsr ~ChOut rtl ENDP **************************************************************** * * IntAbs - absolute value * * Inputs: * A - number * * Outputs: * A - result * **************************************************************** * ~IntAbs PROC Export tax bpl lb1 eor #$FFFF inc A lb1 rtl ENDP **************************************************************** * * IntSgn - sgn function * * Inputs: * A - number * * Outputs: * A - result * **************************************************************** * ~IntSgn PROC Export tax beq lb1 bpl lb2 lda #-1 bra lb1 lb2 lda #1 lb1 rtl ENDP **************************************************************** * * Mult - multiply * * Inputs: * X - 1st operand * A - 2nd operand * * Outputs: * A - result * **************************************************************** * ~Mult PROC Export pha pha phx pha _Multiply pla plx rtl ENDP **************************************************************** * * PrintString - print a string * * Parameters: * addr - address of the string * len - # chars to write; 0 for write to end of string * **************************************************************** * ~PrintString PROC Export with BasicCommon subroutine (4:addr,2:len),0 phb phk plb lb1 lda [addr] ;while [addr]^ <> 0 do begin and #$00FF beq lb2 jsr ~ChOut ;write the char inc column ;++column inc4 addr ;advance to the next character dec len ;loop bne lb1 lb2 plb return ENDP **************************************************************** * * Prompt - print the input prompt * **************************************************************** * ~Prompt PROC Export lda #'?' jsr ~ChOut rtl ENDP **************************************************************** * * ReadKey - read a key using the cursor * * Outputs: * A - key read * * Uses: * X - contains screen address of cursor position * Y - timer loop variable for flashing cursor * **************************************************************** * ~ReadKey PROC with BasicCommon time equ $5000 ;changes flash rate lda cv ;find the character address asl A tax lda lineDisp,X adc ch tax ;get the initial character shortm lda >0,X pha ;save on stack for restoration lb1 ldy #time ;set the timer lda >0,X ;invert the character on screen cmp #$20 bge lb3 ora #$40 lb3 eor #$80 cmp #'@' blt lb4 cmp #'_'+1 bge lb4 and #$3F lb4 sta >0,X lb2 lda >$C000 ;check for a keystroke bmi lb5 ;got one! dey ;decrement timer bne lb2 ;loop until time bra lb1 ; to re-invert character lb5 pla ;reset the screen character sta >0,X lda >$C000 ;get the character sta >$C010 longm and #$00FF rts ENDP **************************************************************** * * ReadLine - read a line * * Outputs: * inputLine - line read * * Notes: Assumes local bank * **************************************************************** * ~ReadLine PROC with BasicCommon lda col80 ;if 40 column display then beq lb1 ; use private routine pha ;else use texttools ph4 #inputLine+2 ph2 inputLine ;maximum line length pea 13 ;EOL character (carriage return) pea 1 ;echo characters ldx #$240C ;ReadLine call jsl $E10000 pla ;retrieve actual count shortm sta inputLine+1 ;null terminate the line longm rts ;return ; ; 40 Column input routine ; lb1 shortmx ;fill in the line with spaces ldx inputLine lda #' ' lb2 sta inputLine+1,X dex bne lb2 stz inputLine+1 longmx lb3 jsr ~ReadKey ;get a keypress and #$007F cmp #$007F ;delete? beq @do_backspace ;yes cmp #8 ;if key is <-- then bne lb4 @do_backspace lda inputLine+1 ;if no characters typed then and #$00FF beq lb3 ;loop dec inputLine+1 ;erase the character jsl CursorLeft ;back up on the screen bra lb3 ;loop lb4 shortx ;if max characters typed then ldx inputLine+1 cpx inputLine longx beq lb3 ;loop cmp #$15 ;Ctrl-U (right arrow) bne lb5 lda inputLine+1 ;write the buffer character and #$00FF tax lda inputLine+2,X and #$00FF jsr ~ChOut inc inputLine+1 ;next spot bra lb3 ;loop lb5 cmp #13 ;if key is RETURN then bne lb6 jsr ~ChOut ;write to screen lda #10 jsr ~ChOut rts ;we're done lb6 shortmx ;place character in buffer ldx inputLine+1 sta inputLine+2,X inc inputLine+1 longmx jsr ~ChOut ;write char to screen bra lb3 ;loop ENDP **************************************************************** * * Input - read a number * * Outputs: * A - number read * **************************************************************** * ~Input PROC Export with BasicCommon TAB equ $09 ;tab key code phb ;use local bank addressing phk plb lb1 lda cnt ;while cnt = 0 do bne lb2 jsr ~ReadLine ;read a line lda inputLine+1 ;cnt = length(line) and #$00FF sta cnt lda #2 ;disp = 2 sta disp bra lb1 lb2 ldx disp ;skip whitespace and commas lda inputLine,X and #$00FF cmp #' ' beq lb3 cmp #',' beq lb3 cmp #TAB bne lb4 lb3 inc disp dec cnt bne lb2 jsl ~Prompt bra lb1 lb4 stz neg ;neg = false cmp #'-' ;if char is '-' then bne lb4a inc neg ;neg = true inc disp ;next char dec cnt bra lb5 lb4a jsr IsDigit ;else if char is not a digit then bcs lb5 pea error>>16 ;flag the error pea error pea 0 jsl ~PrintString jsl ~Prompt stz cnt ;get a new line bra lb1 lb5 stz value ;convert digits to a value lb6 ldx disp lda inputLine,X and #$00FF jsr IsDigit bcc lb7 and #$000F pha lda value ldx #10 jsl ~Mult clc adc 1,S plx sta value inc disp dec cnt bne lb6 lb7 lda neg ;if neg then beq lb8 lda #0 ;value = -value sec sbc value sta value lb8 lda value ;return the result plb rtl ; ; IsDigit - see if a character is a digit ; IsDigit cmp #'0' blt no cmp #'9'+1 bge no sec rts no clc rts ; ; Local data ; error DC.B 'Retype line.' ;error message DC.B 0 neg DS.B 2 ;was the value negative? value DS.B 2 ;value read from line ENDP **************************************************************** * * InputStr - read a string * * Outputs: * address of string, len pushed on stack (for AssignString) * **************************************************************** * ~InputStr PROC Export with BasicCommon phb ;use local bank addressing phk plb lb1 lda cnt ;if cnt = 0 then bne lb2 jsr ~ReadLine ;read a line lda inputLine+1 ;cnt = length(line) and #$00FF sta cnt lda #2 ;disp = 2 sta disp lb2 lda inputLine+1 ;null terminate the line and #$00FF tax stz inputLine+2,X plx ;place string address on stack ply pea inputLine>>16 clc lda #inputLine adc disp pha lda cnt ;place string len on stack pha stz cnt ;set cnt to 0 (indicating no string left) phy phx plb rtl ENDP **************************************************************** * * Inverse - write inverse characters * **************************************************************** * Inverse PROC Export lda #15 jsr ~ChOut rtl ENDP **************************************************************** * * KeyBoard - read the keyboard * * Outputs: * Stores the rsult in KEY, which should be defined in * the Integer BASIC program. * **************************************************************** * KeyBoard PROC Export IMPORT Key shortm lda >$C000 longm and #$00FF sta >Key rtl ENDP **************************************************************** * * Logical - convert an integer to a 0 or 1 * * Inputs: * A - integer to convert * * Outputs: * A - 0 if the input was 0, 1 otherwise * **************************************************************** * ~Logical PROC Export tax beq lb1 lda #1 lb1 rtl ENDP **************************************************************** * * Mod - modulus * * Inputs: * X - 1st operand * A - 2nd operand * * Outputs: * A - result * **************************************************************** * ~Mod PROC Export pha pha phx pha _SDivide plx pla rtl ENDP **************************************************************** * * Normal - write normal characters * **************************************************************** * Normal PROC Export lda #14 jsr ~ChOut rtl ENDP **************************************************************** * * PartialString - convert partial string indecies * * Converts a string address and two indecies into the address * of the first indexed character and the number of chacters * refered to. * * Inputs: * addr - string address * ind1 - 1st index * ind2 - 2nd index * * Outputs: * addr - string address * ind1 - length of string elements * **************************************************************** * ~PartialString PROC Export addr equ 8 ;string address ind1 equ 6 ;1st index ind2 equ 4 ;2nd index clc ;update the address lda ind1,S adc addr,S dec A sta addr,S sec ;set the length lda ind2,S sbc ind1,S inc A sta ind1,S lda 2,S ;return to caller sta 4,S pla sta 1,S rtl ENDP **************************************************************** * * Pdl - read the mouse (replaces the old paddle) * * Inputs: * A - read what: * 0 - horizontal position * 1 - vertical position * 2 - button up? * otherwise - status/mode word (see ReadMouse) * * Outputs: * Mouse position, button, or status * **************************************************************** * ~Pdl PROC Export pha ;save the input pha ;read the mouse pha pha _ReadMouse lda 7,S ;if input = 0 then bne lb1 pla ;return X pla pla plx rtl lb1 dec A ;if input = 1 then bne lb2 pla ;return Y pla plx plx rtl lb2 dec A ;if input = 2 then bne lb3 pla ;return mouse button state rol A lda #0 rol A plx plx plx rtl lb3 pla ;return mouse status plx plx plx rtl ENDP **************************************************************** * * PrintEOL - print an end of line * **************************************************************** * ~PrintEOL PROC Export with BasicCommon lda #10 jsr ~ChOut lda #13 jsr ~ChOut lda #0 sta >column rtl ENDP **************************************************************** * * PrintInt - print an integer * **************************************************************** * ~PrintInt PROC Export with BasicCommon str_len equ 6 phb ;use local addressing phk plb pha ;convert the int to a string pea str>>16 pea str ph2 #str_len pea 1 _Int2Dec ldx #-1 ;skip leading spaces lb1 inx lda str,X and #$00FF cmp #' ' beq lb1 lb2 cpx #str_len ;print the characters beq lb3 lda str,X and #$00FF phx jsr ~ChOut plx inx inc column bra lb2 lb3 plb rtl str DS.B str_len ;string work area ENDP **************************************************************** * * PrintTAB - print a tab * **************************************************************** * ~PrintTAB PROC Export with BasicCommon tabSize equ 15 ;size of a tab field phb ;use local addressing phk plb lda column ;while column > 0 do lb1 sec ;column -= tabSize sbc #tabSize bpl lb1 clc sta loop ;save the loop counter lb2 lda #' ' ;repeat jsr ~ChOut ;print(' ') inc column ;++column inc loop ;++loop bne lb2 ;until loop=0 plb ;restore the caller's bank rtl loop DS.B 2 ;loop counter ENDP **************************************************************** * * QDOff - turn off quickdraw (if it is on) * **************************************************************** * ~QDOff PROC with BasicCommon lda QDHandle ;skip if not started ora QDHandle+2 beq lb1 _QDShutDown ;shut down QD stz QDHandle stz QDHandle+2 lb1 rts ENDP **************************************************************** * * Rnd - return a random number * * Inputs: * A - return a value below this one * * Outputs: * A - random number * **************************************************************** * ~Rnd PROC Export phb ;use local addressing phk plb pha ;save the limit lda seed ;if no seed has been obtained, get one ora seed+2 bne lb1 pha pha pha pha _ReadTimeHex pla sta seed pla sta seed+2 pla pla lb1 sec ;do the randomness thing, using the tsc ;formula sbc #16 ;seed = (seed*31415821+1) mod 100000000 tcs lda seed+2 pha lda seed pha pea 31415821>>16 pea 31415821**$FFFF _LongMul clc pla adc #1 sta 3,S pla adc #0 sta 3,S pea 100000000>>16 pea 100000000**$FFFF _LongDivide pla pla pla sta seed pla sta seed+2 ;get a random value lda seed+2 and #$7FFF ;make it positive tax ;restrict the range pla plb jml ~Mod seed DC.L 0 ENDP **************************************************************** * * Scrn - read a point * * Inputs: * X - x coordinate * A - Y coordinate * **************************************************************** * ~Scrn PROC Export with BasicCommon phb ;use local addressing phk plb ldy col80 ;branch if using 40 column mode beq lb1 pha ;read a point using QuickDraw phx pha _GetPixel pla plb rtl lb1 cpx #40 ;skip if off screen bge lb4 cmp #40 bge lb4 lsr A ;convert to row + top/bottom flag php ;save top/bottom flag asl A ;add column to row address tay txa clc adc lineDisp,Y tax lda #$000F ;get the color mask plp php bcc lb2 lda #$00F0 lb2 and >0,X ;read the point plp ;if needed, shift the point bcc lb3 lsr A lsr A lsr A lsr A lb3 and #$000F lb4 plb rtl ENDP **************************************************************** * * StringLength - find the length of a string * * Parameters: * addr - address of the string * len - max # of characters; 0 for the entire string * **************************************************************** * ~StringLength PROC Export with BasicCommon val equ 0 ;return value subroutine (4:addr,2:len),2 stz val ;val = 0 lb1 lda [addr] ;while [addr]^ <> 0 do begin and #$00FF beq lb2 inc val ;++val inc addr ;advance to the next character bne @1 inc addr+2 @1 dec len ;loop bne lb1 lb2 return 2:val ;return the string length ENDP **************************************************************** * * Tab - Move to an absolute column number * * Inputs: * A - column to move to * **************************************************************** * ~Tab PROC Export with BasicCommon phb ;use local addressing phk plb tax ;quit if range exceeded beq lb3 cmp screenSize bge lb3 sta tabval ;save the tab value sta column lda #13 ;start in column 1 jsr ~ChOut lb2 dec tabval ;move right tabval-1 columns beq lb3 lda #28 jsr ~ChOut bra lb2 lb3 plb ;return rtl tabval DS.B 2 ;tab value ENDP **************************************************************** * * Text - switch to 40 column text mode * **************************************************************** * ~Text PROC Export with BasicCommon phb ;use local addressing phk plb shortmx ;set screen to 40 column text stz col80 sta >$C051 sta >$C054 sta >$C00C longmx stz top ;clear the screen lda #$A0A0 jsr ~Clear stz cv ;home the cursor stz ch stz column lda #$00FF ;set the screen mask sta chMask lda #41 ;set the screen size sta screenSize plb rtl ENDP **************************************************************** * * Text80 - switch to 80 column text mode * **************************************************************** * ~Text80 PROC Export with BasicCommon jsr ~QDOff ;turn off quickdraw jsr ~GROff ;turn off 40 col text/graphics lda #81 ;set the screen size sta screenSize rtl ENDP **************************************************************** * * VLin - draw a vertical line * * Inputs: * X - v1 * Y - v2 * A - h * **************************************************************** * ~VLin PROC Export with BasicCommon phb ;use local addressing phk plb stx v1 ;save the coordinates sty v2 sta h lda col80 ;split based on screen type beq lb0 lda h ;call QuickDraw pha phx pha phy _MoveTo _LineTo plb rtl lb0 cpy v1 ;make sure h1 <= h2 bge lb1 sty v1 stx v2 lb1 lda v1 ;plot the line lb2 ldx h jsl ~Plot inc v1 lda v1 cmp v2 ble lb2 plb ;return rtl v1 DS.B 2 ;first vertical point v2 DS.B 2 ;second vertical point h DS.B 2 ;horizontal location ENDP **************************************************************** * * VTab - Move to an absolute line number * * Inputs: * A - line to move to * **************************************************************** * ~VTab PROC Export with BasicCommon phb ;use local addressing phk plb tax ;quit if range exceeded beq lb3 cmp #25 bge lb3 ldx col80 ;if 40 column screen then bne lb0 dec a ;convert 1-24 to 0-23 sta cv ;move to the line plb rtl lb0 sta tabval ;save the tab value lda #24 ;start on line 1 sta loop lb1 pea 31 _WriteChar dec loop bne lb1 lb2 dec tabval ;move down tabval-1 lines beq lb3 pea 10 _WriteChar bra lb2 lb3 plb ;return rtl tabval DS.B 2 ;tab value loop DS.B 2 ;loop counter ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/BasicLib.macros b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/BasicLib.macros new file mode 100644 index 0000000..337f005 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/BasicLib.macros @@ -0,0 +1 @@ +**************************************************************************************************** MACRO inc4 &a1 inc &a1 bne @a inc &a1+2 @a MEND **************************************************************************************************** MACRO PH2 &addr,® IF &addr[1:1]='#' AND &SETTING('LONGA')='ON' THEN pea |&addr[2:255] ELSE IF &addr­'' THEN IF ®­'' THEN lda &addr,® ELSE lda &addr ENDIF ENDIF pha ENDIF MEND **************************************************************************************************** MACRO PH4 &addr,&offset IF &addr[1:1]='#' THEN pea &addr[2:255]>>16 pea |&addr[2:255] ELSEIF &addr[1:1]='[' THEN ldy #&offset+2 ph2 &addr,y ldy #&offset ph2 &addr,y ELSEIF &offset='s' THEN ph2 &addr+2,s ph2 &addr+2,s ELSEIF &offset='' THEN ph2 &addr+2 ph2 &addr ELSE ph2 &addr+2,&offset ph2 &addr,&offset ENDIF MEND **************************************************************************************************** MACRO SUB2 &a1,&a2,&a3 IF &a1­'' THEN lda &a1 ENDIF sec sbc &a2 IF &a3­'' THEN sta &a3 ENDIF MEND **************************************************************************************************** MACRO PL4 &addr1,&addr2 IF &addr1='' THEN IF &addr2­'' THEN AERROR 'Illegal 2nd parameter' ENDIF PL2 PL2 ELSEIF &addr2='' THEN PL2 &addr1 PL2 &addr1+2 ELSEIF &addr1[1:1]='[' THEN ldy #&addr2 PL2 &addr1,y ldy #&addr2+2 PL2 &addr1,y ELSE PL2 &addr1 sta &addr2 PL2 &addr1+2 sta &addr2+2 ENDIF MEND **************************************************************************************************** MACRO BLE &BP BLT &BP BEQ &BP MEND **************************************************************************************************** MACRO longm rep #%00100000 longa on MEND MACRO longx rep #%00010000 longi on MEND MACRO longmx rep #%00110000 longa on longi on MEND **************************************************************************************************** MACRO shortmx sep #%00110000 longa off longi off MEND MACRO shortm sep #%00100000 longa off MEND MACRO shortx sep #%00010000 longi off MEND **************************************************************************************************** MACRO JGE &BP BLT @1 BRL &BP @1 MEND **************************************************************************************************** MACRO PL2 &addr,® pla IF &addr­'' THEN IF ®­'' THEN sta &addr,® ELSE sta &addr ENDIF ELSEIF ®­'' THEN AERROR 'Illegal 2nd parameter' ENDIF MEND **************************************************************************************************** MACRO _SYSBEEP LDX #$2C03 JSL $E10000 MEND MACRO _ClampMouse ldx #$1C03 jsl $E10000 MEND MACRO _WRITECHAR LDX #$180C JSL $E10000 MEND MACRO QUIT &DCB JSL $E100A8 DC.w $29 DC.l &DCB MEND MACRO _INT2DEC LDX #$260B JSL $E10000 MEND MACRO _Multiply ldx #$090B jsl $E10000 MEND MACRO _SDivide ldx #$0A0B jsl $E10000 MEND MACRO _NewHandle ldx #$0902 jsl $E10000 MEND MACRO _QDStartUp ldx #$0204 jsl $E10000 MEND MACRO _QDShutDown ldx #$0304 jsl $E10000 MEND MACRO _LineTo ldx #$3C04 jsl $E10000 MEND MACRO _MoveTo ldx #$3A04 jsl $E10000 MEND MACRO _SetSolidPenPat ldx #$3704 jsl $E10000 MEND MACRO _ReadMouse ldx #$1703 jsl $E10000 MEND MACRO _GetPixel ldx #$8804 jsl $E10000 MEND MACRO _EMStatus ldx #$0606 jsl $E10000 MEND MACRO _InitMouse ldx #$1803 jsl $E10000 MEND MACRO _LONGDIVIDE LDX #$0D0B JSL $E10000 MEND MACRO _LONGMUL LDX #$0C0B JSL $E10000 MEND MACRO _READTIMEHEX LDX #$0D03 JSL $E10000 MEND **************************************************************************************************** macro subroutine &parms,&work lclc &macWork &macWork setc &work IF &work­'' GOTO .a &macWork setc '0' .a gbla &totallen gbla &worklen &worklen seta &s2i(&macWork) &totallen seta 0 IF &parms='' GOTO .e lclc &length lclc &p lcla &i &i seta &NBR(&parms) .b &p setc &parms[&i] &length setc &SubStr(&p,2,1) IF &length=':' GOTO .c &length setc &SubStr(&p,1,2) &p setc &SubStr(&p,4,&len(&p)-3) GOTO .d .c &length setc &SubStr(&p,1,1) &p setc &SubStr(&p,3,&len(&p)-2) .d &p equ &totallen+3+&macWork &totallen seta &totallen+&s2i(&length) &i seta &i-1 IF &i GOTO .b .e tsc sec sbc #&macWork tcs inc a phd tcd mend **************************************************************************************************** macro return &r gbla &totallen gbla &worklen lclc &length lclc &rr &rr setc &r IF &r­'' GOTO .a &rr setc '0' &length setc '0' GOTO .h .a &length setc &SubStr(&rr,2,1) IF &length=':' GOTO .b &length setc &SubStr(&rr,1,2) &rr setc &SubStr(&rr,4,&len(&rr)-3) GOTO .c .b &length setc &SubStr(&rr,1,1) &rr setc &SubStr(&rr,3,&len(&rr)-2) .c IF &s2i(&length)<>2 GOTO .d ldy &rr GOTO .h .d IF &s2i(&length)<>4 GOTO .e ldx &rr+2 ldy &rr GOTO .h .e IF &s2i(&length)<>10 GOTO .g ldy #&rr ldx #^&rr GOTO .h .g aerror 'Not a valid return length' mexit .h IF &totallen=0 GOTO .i lda &worklen+1 sta &worklen+&totallen+1 lda &worklen sta &worklen+&totallen .i pld tsc clc adc #&worklen+&totallen tcs IF &s2i(&length)=0 GOTO .j tya .j rtl mend **************************************************************************************************** \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/CodeGen.p b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/CodeGen.p new file mode 100644 index 0000000..3c36dfc --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/CodeGen.p @@ -0,0 +1 @@ +{---------------------------------------------------------------} { } { Code Generator } { } { The code generator creates the obj file, writing the } { approproate machine code instructions based on the } { intermediate code calls from the parser. } { } { Copyright 1991 } { By the Byte Works, Inc. } { } {---------------------------------------------------------------} { } { Global subroutines: } { } { Gen0 - Generate an implied operand instruction } { Gen0Name - Generate an instruction with a named label } { Gen0NameShift - Generate an instruction with a named label, } { shifted by 16 bits } { Gen0Label - Generate an instruction with a numbered label } { Gen0Relative - Generate an instruction with an offset to a } { numbered label } { Gen0String - Generate an instruction with a string constant } { operand } { Gen1 - Generate a two byte constant operand instruction } { Gen1Byte - Generate a one byte constant operand instruction } { Gen1Name - Generate an instruction with a named label and } { offset } { GetLabel - Allocale a new numbered label } { GenDebugSymbols - Generate the debugger symbol table } { GenStrings - Generate string constants } { GenSymbols - Generate space for variables in the symbol } { table } { } {---------------------------------------------------------------} UNIT CodeGen; INTERFACE USES Memory, { for NewHandle } Types, BASICCom, Scanner; {---------------------------------------------------------------} PROCEDURE Gen0(op: integer); { Generate an implied operand instruction } { } { Parameters: } { op - instruction to generate } PROCEDURE Gen0Name(op: integer; name: namePtr); { Generate an instruction with a named label } { } { Parameters: } { op - instruction to generate } { name - pointer to the named operand } PROCEDURE Gen0NameShift(op: integer; name: namePtr); { Generate an instruction with a named label shifted by 16 bits } { } { Parameters: } { op - instruction to generate } { name - pointer to the named operand } PROCEDURE Gen0Label(op, lab: integer); { Generate an instruction with a numbered label } { } { Parameters: } { op - instruction to generate } { label - label number } PROCEDURE Gen0Relative(op, lab: integer); { Generate an instruction with an offset to a numbered label } { } { Parameters: } { op - instruction to generate } { label - label number } PROCEDURE Gen0String(op: integer; str: stringPtr); { Generate an instruction with a string constant operand } { } { Parameters: } { op - instruction to generate } { str - pointer to the string constant } PROCEDURE Gen1(op, opnd: integer); { Generate a two byte constant operand instruction } { } { Parameters: } { op - instruction to generate } { opnd - operand } { } { Note: This procedure is declared as extern in Scanner.Pas. } { If the name or parameter list changes, be sure and } { make a corresponding change there. } PROCEDURE Gen1Byte(op, opnd: integer); { Generate a one byte constant operand instruction } { } { Parameters: } { op - instruction to generate } { opnd - operand } PROCEDURE Gen1Name(op: integer; name: namePtr; opnd: integer); { Generate an instruction with a named label and offset } { } { Parameters: } { op - instruction to generate } { name - pointer to the named operand } { opnd - numeric offset } FUNCTION GetLabel: integer; { Allocale a new numbered label } PROCEDURE GenDebugSymbols; { Generate the debugger symbol table } PROCEDURE GenStrings; { Generate string constants } PROCEDURE GenSymbols; { Generate space for variables in the symbol table } {- Private declarations ----------------------------------------} IMPLEMENTATION CONST {object segment info} {-------------------} csize = $BF; {size of the constant buffer} segmentSize = maxint; {max size of a segment} CODEkind = $0000; {segment kind = CODE} DATAkind = $0001; {segment kind = DATA} {labels} {------} labelSize = 1000; {max # of local labels} {strings} {-------} ssize = 4000; {length of the constant string buffer} TYPE {object segment info} {-------------------} segmentType = ARRAY [0..segmentSize] OF byte; {segment buffer type} segmentPtr = ^segmentType; {pointer to a segment buffer} {labels} {------} labelRefPtr = ^labelRefRecord; {ptr to a label reference} labelRefRecord = RECORD {label reference} next: labelRefPtr; { next entry} disp: longint; { disp to label reference in segment} END; labelRecord = RECORD {label entry} defined: boolean; { is the label defined?} disp: longint; { disp to label location} refs: labelRefPtr; { unresolved label list} END; hexString = string[4]; VAR {object segment info} {-------------------} clen: 0..csize; {index into the constant buffer} cbuff: ARRAY [1..csize] OF byte; {constant buffer} codeLength: longint; {bytes of code in the loaded segment} { disp: longint; {disp into the segment} segment: segmentPtr; {pointer to the current segment} segmentHandle: handle; {segment handle} segNextByte: StringPtr; {pointer to next location} segSize: longint; {amount of memory allocated for segment} {labels} {------} labels: ARRAY [1..labelSize] OF labelRecord; {label table} nextLabel: 0..labelSize; {next label to allocate} {strings} {-------} sbuff: PACKED ARRAY [1..ssize] OF char; {string buffer} slabel: 0..labelSize; {string pool label} slen: 0..ssize; {disp to next spot in sbuff} {- OMF Creation ------------------------------------------------} PROCEDURE Purge; FORWARD; PROCEDURE WriteHex(number: longint); VAR newString: hexString; temp: integer; i: integer; BEGIN FOR i := 1 TO 4 DO newString[i] := '0'; newString[0] := chr(4); i := 4; { character position } WHILE (number <> 0) AND (i <> 0) DO BEGIN temp := integer(number MOD 16); number := number DIV 16; IF temp > 9 THEN newString[i] := chr(ord('A') + (temp - 10)) ELSE newString[i] := chr(ord('0') + temp); i := i - 1; END; {while} write(newString, chr(9)); END; {WriteHex} PROCEDURE GrowSegment; { grow the memory block allocated for the current segment } VAR segLength: longint; BEGIN segLength := ord4(segNextByte) - ord4(segment); { calculate current length } segSize := segSize + $4000; { grow by 8K } HUnlock(segmentHandle); { unlock the handle } SetHandleSize(segmentHandle, segSize); { grow the handle } IF MemError <> 0 THEN TermError(5); { out of memory } HLock(segmentHandle); segment := segmentPtr(segmentHandle^); segNextByte := StringPtr(ord4(segment) + segLength); { update pointer } END; {GrowSegment} PROCEDURE Put1(val: integer); { Write one byte to the object segment } { } { Parameters: } { val - value to write } { } { Variables: } { disp - disp in the object segment } { segment - object segment pointer } BEGIN {Put1} IF clen <> 0 THEN {write any bytes in the constant buffer} Purge; segNextByte^[0] := chr(val); {put the byte in the segment buffer} IF ord4(segNextByte) = (ord4(segment) + segSize) THEN {update the segment size} GrowSegment; segNextByte := StringPtr(ord4(segNextByte) + 1); END; {Put1} PROCEDURE Purge; { write any bytes in the constant buffer } { } { Variables: } { clen - # of bytes in the constant buffer } { cbuff - constant buffer } VAR len: integer; {local copy of clen} i: integer; {loop variable} BEGIN {Purge} IF clen <> 0 THEN BEGIN len := clen; {save the length} clen := 0; {zero the length (prevents re-call by Put1)} Put1(len); {write the number of bytes} FOR i := 1 TO len DO {write the bytes} Put1(cbuff[i]); END; {if} END; {Purge} PROCEDURE Put2(val: integer); { Write two bytes to the object segment } { } { Parameters: } { val - value to write } BEGIN {Put2} Put1(BAnd(val,$00FF)); Put1(BSR(val, 8)); END; {Put2} PROCEDURE Put4(val: longint); { Write four bytes to the object segment } { } { Parameters: } { val - value to write } BEGIN {Put4} Put1(integer(BAnd(val, $00FF))); Put1(integer(BAnd(BSR(val,8),$00FF))); Put1(integer(BAnd(BSR(val,16),$00FF))); Put1(integer(BAnd(BSR(val,24),$00FF))); END; {Put4} PROCEDURE PutName(name: namePtr; disp, len, shift: integer); { write an expression with a name to the object file } { } { Parameters: } { name - pointer to the name } { disp - disp past the name } { len - length of the code created by the expression } { shift - # of bits to shift value } VAR i: integer; {loop variable} BEGIN {PutName} Put1($EB); {write the expression op-code} Put1(len); {write the # of bytes to generate} Put1($83); {write the name} Put1(length(name^)); FOR i := 1 TO length(name^) DO Put1(ord(name^[i])); IF disp <> 0 THEN BEGIN {write the displacement} Put1($81); Put4(disp); Put1(1); END; {if} IF shift <> 0 THEN BEGIN {shift the value} Put1($81); Put4(shift); Put1(7); END; {if} Put1(0); {mark the end of the expression} END; {PutName} PROCEDURE CPut1(val: integer); { place one byte in the constant buffer } { } { Parameters: } { val - value to write } { } { Variables: } { cbuff - constant buffer } { clen - # of bytes in the constant buffer } BEGIN {CPut1} IF clen = csize THEN {if the buffer is full, purge it} Purge; clen := clen + 1; {put the byte in the buffer} cbuff[clen] := val; END; {CPut1} PROCEDURE CPut2(val: integer); { place two bytes to the constant buffer } { } { Parameters: } { val - value to write } BEGIN {CPut2} CPut1(BAnd(val,$00FF)); CPut1(BSR(val, 8)); END; {CPut2} PROCEDURE StartSegment(name: namePtr; kind : integer); { Start an object segment } { } { Parameters: } { name - pointer to the nane of the segment } VAR i: integer; {loop variable} disp: integer; {displacement within segment} BEGIN {StartSegment} {allocate the memory for the segment} ResrvMem(size(segmentSize)); segmentHandle := NewHandle(segmentSize); if segmentHandle = NIL then TermError(5); HLock(segmentHandle); segment := segmentPtr(segmentHandle^); segNextByte := StringPtr(segment); {nothing in segment} segSize := segmentSize; disp := 0; {nothing in the segment} codeLength := 0; clen := 0; slen := 0; segNum := segNum+1; {use the next segment #} nextLabel := 0; {no labels allocated} slabel := GetLabel; {get a label for the string pool} Put4(0); {byte count (not yet known)} Put4(0); {reserved space (0 bytes)} Put4(0); {segment code length (not yet known)} Put1(0); {reserved field} Put1(0); {label length (variable)} Put1(4); {length of numbers} Put1(2); {OMF version} Put4($010000); {bank size} Put2(kind); {segment kind} Put2(0); {unused} Put4(0); {org} Put4(0); {alignment} Put1(0); {number "sex" (least sig. byte first)} Put1(0); {undefined} Put2(segNum); {segment number} Put4(0); {entry (enter at first byte)} disp := integer(ord4(segNextByte) - ord4(segment)); {calc displacement} Put2(disp + 4); {disp to names} Put2(disp + 15 + length(name^)); {disp to opcodes} Put1(integer('m')); {load segment name (' ')} Put1(integer('a')); Put1(integer('i')); Put1(integer('n')); Put4($20202020); Put2($2020); Put1(length(name^)); {code segment name} FOR i := 1 TO length(name^) DO Put1(ord(name^[i])); END; {StartSegment} PROCEDURE EndSegment; VAR tdisp: StringPtr; {temp storage for segNextByte} disp: longint; {calculated length of segment} PROCEDURE WriteFile; { Write a file to disk } { } { Variables: } { segment - pointer to the first char in the file } { disp - length of the file } VAR oldSize: longint; BEGIN {WriteFile} oldSize := GetHandleSize(objBuf); SetHandleSize(objBuf, oldSize + disp); {grow the buffer} IF objBuf = NIL THEN TermError(5); HLock(objBuf); {lock the object code buffer down} BlockMove(Ptr(segmentHandle^), ptr(ord4(objBuf^)+oldSize), disp); {copy the new object code in} HUnlock(objBuf); {unlock the object code block} HUnlock(segmentHandle); {and the segment buffer} DisposHandle(segmentHandle); {free the memory} END; {WriteFile} BEGIN {EndSegment} Put1(0); {write the end opcode} disp := ord4(segNextByte) - ord4(segment); tdisp := segNextByte; {save the segment length} segNextByte := StringPtr(segment); Put4(disp); {store the byte count in the header} segNextByte := StringPtr(ord4(segment) + 8); Put4(codeLength); {store the code length in the header} segNextByte := tdisp; {restore the segment length} IF keep THEN {write the file to disk} WriteFile; END; {EndSegment} {- Labels ------------------------------------------------------} FUNCTION GetLabel{: integer}; { Allocale a new numbered label } BEGIN {GetLabel} IF nextLabel = labelSize THEN {find and fill in a label record} FlagError(29) ELSE BEGIN nextLabel := nextLabel + 1; WITH labels[nextLabel] DO BEGIN defined := false; refs := NIL; END; {with} END; {else} GetLabel := nextLabel; {return the label number} END; {GetLabel} PROCEDURE MakeReference(pdisp, value: longint); { place a label reference in the code file } { } { Parameters: } { pdisp - location of the reference in the OBJ file } { value - label value } VAR savePtr: StringPtr; {local copy of segNextByte} BEGIN {MakeReference} Purge; {write any constants} savePtr := segNextByte; {save current position} {go back to the reference location} segNextByte := StringPtr(ord4(segment) + pdisp); Put4(value); {place the value in the OMF file} segNextByte := savePtr; {restore the OMF pointer} END; {MakeReference} PROCEDURE DefineLabel(lab: integer); { Define a label } { } { Parameters: } { lab - label number to define } { } { Variables: } { codeLength - disp into the code segment } VAR lptr: labelRefPtr; {work pointer} BEGIN {DefineLabel} WITH labels[lab] DO BEGIN disp := codeLength; {define the label} defined := true; WHILE refs <> NIL DO BEGIN {resolve existing references} lptr := refs; refs := lptr^.next; WITH lptr^ DO MakeReference(disp, codeLength); dispose(lptr); END; {while} END; {with} END; {DefineLabel} PROCEDURE ReferenceLabel(lab, poffset: integer; prelative: boolean; psize: integer); { Create a reference to a label } { } { Parameters: } { lab - label number } { poffset - offset from the start of the label } { prelative - is the reference to a relative label? } { psize - size of the label field, in bytes } { } { Variables: } { disp - location of the label reference in the OBJ file } VAR i: integer; {loop variable} ldisp: longint; {local copy of disp} lptr: labelRefPtr; {work pointer} BEGIN {ReferenceLabel} IF prelative THEN BEGIN Put1($EE); {write the expression opcode} Put1(psize); {write the expression size} Put4(psize); {write the disp to the end of the exp} END {if} ELSE BEGIN Put1($EB); {write the expression opcode} Put1(psize); {write the expression size} END; {else} Put1($87); {save space & loc of label value} ldisp := ord4(segNextByte) - ord4(segment); Put4(0); IF poffset <> 0 THEN BEGIN {add in the offset} Put1($81); Put4(poffset); Put1(1); END; {if} Put1(0); {end of expression} WITH labels[lab] DO {create the label reference} IF defined THEN MakeReference(ldisp, disp) ELSE BEGIN new(lptr); WITH lptr^ DO BEGIN next := refs; disp := ldisp; END; {with} refs := lptr; END; {else} END; {ReferenceLabel} {- Code Generation Interface -----------------------------------} PROCEDURE ListOp(op: integer); { List a label field and op code } BEGIN {ListOp} IF NOT (op IN [d_lab, d_bgn]) THEN write(chr(9), chr(9)); CASE op OF m_adc_abs, m_adc_imm, m_adc_s : write('adc'); m_and_imm, m_and_s : write('and'); m_asl : write('asl', chr(9), 'A'); m_beq : write('beq'); m_bge : write('bge'); m_bmi : write('bmi'); m_bne : write('bne'); m_bpl : write('bpl'); m_clc : write('clc'); m_cop : write('cop'); m_dec_a : write('dec', chr(9), 'A'); m_dec_abs : write('dec'); m_eor_imm : write('eor'); m_inc_a : write('inc', chr(9), 'A'); m_inc_abs : write('inc'); m_jml : write('jml'); m_jmp : write('jmp'); m_jsl : write('jsl'); m_jsr : write('jsr'); m_ldx_abs, m_ldx_dir : write('ldx'); m_lda_abs, m_lda_absx, m_lda_dir, m_lda_imm, m_lda_indl : write('lda'); m_ora_s : write('ora'); m_sta_abs, m_sta_absx, m_sta_dir, m_sta_longx, m_sta_s : write('sta'); m_pea : write('pea'); m_pha : write('pha'); m_pla : write('pla'); m_plx : write('plx'); m_ply : write('ply'); m_rep : write('rep'); m_rts : write('rts'); m_sbc_dir : write('sbc'); m_sec : write('sec'); m_sep : write('sep'); m_tax : write('tax'); d_bgn : write(chr(9),'Proc'); d_end : write('EndP'); d_lab : write(chr(9),'ANOP'); d_str : write('STR'); d_lnm : write('LNM'); d_ago : write('AGO'); d_brk : write('BRK'); d_sub : write('SUB'); d_exi : write('EXI'); d_fil : write('FIL'); END; {case} IF op IN [m_adc_abs, m_adc_imm, m_adc_s, m_and_imm, m_and_s, m_beq, m_bge, m_bmi, m_bne, m_bpl, m_cop, m_dec_abs, m_eor_imm, m_inc_abs, m_jml, m_jmp, m_jsl, m_jsr, m_lda_abs, m_lda_absx, m_lda_imm, m_lda_indl, m_ldx_abs, m_ldx_dir, m_ora_s, m_pea, m_sep, m_sbc_dir, m_sta_abs, m_sta_absx, m_sta_dir, m_sta_longx, m_sta_s, m_rep, d_str, d_lnm, d_ago, d_brk, d_sub, d_exi, d_fil] THEN BEGIN write(chr(9)); IF op IN [m_adc_imm, m_and_imm, m_eor_imm, m_lda_imm] THEN write('#') ELSE IF op = m_sta_longx THEN write('>') ELSE IF op = m_lda_indl THEN write('['); END; {if} END; {ListOp} PROCEDURE Gen0{op: integer}; { Generate an implied operand instruction } { } { Parameters: } { op - instruction to generate } VAR name: nameType; {segment name} BEGIN {Gen0} IF listSymbols THEN BEGIN {list the instruction} IF showOffsets THEN WriteHex(codeLength); ListOp(op); writeln; END; {if} IF op = d_end THEN EndSegment ELSE IF op = d_exi THEN BEGIN {generate the end cop instruction} CPut1(m_cop); CPut1(4); codeLength := codeLength + 2; END {else if} ELSE BEGIN CPut1(op); {write the opcode} codeLength := codeLength + 1; {update the length of the code} END; {else} END; {Gen0} PROCEDURE Gen0Label{op,lab: integer}; { Generate an instruction with a numbered label } { } { Parameters: } { op - instruction to generate } { label - label number } BEGIN {Gen0Label} IF listSymbols THEN BEGIN {list the instruction} IF op = d_lab THEN BEGIN IF showOffsets THEN WriteHex(codeLength); write('L', lab: 1, chr(9)); ListOp(op); writeln; END {if} ELSE BEGIN IF showOffsets THEN WriteHex(codeLength); write(chr(9), chr(9)); ListOp(op); writeln(chr(9),'L', lab: 1); END; {else} END; {if} IF op = d_lab THEN DefineLabel(lab) {define a new label} ELSE BEGIN CPut1(op); {write the opcode} ReferenceLabel(lab, 0, false, 2); {reference a label} codeLength := codeLength + 3; {update the length of the code} END; {else} END; {Gen0Label} PROCEDURE Gen0Name{op: integer; name: namePtr}; { Generate an instruction with a named label } { } { Parameters: } { op - instruction to generate } { name - pointer to the named operand } VAR i: integer; {loop variable} size: integer; {size of the operand} BEGIN {Gen0Name} IF listSymbols THEN BEGIN {list the instruction} IF showOffsets THEN WriteHex(codeLength); IF op IN [d_bgn, d_lab] THEN write(name^, chr(9)); ListOp(op); IF NOT (op IN [d_bgn, d_lab]) THEN write(name^); IF op IN [m_lda_absx, m_sta_absx] THEN write(',X'); writeln; END; {if} IF op = d_bgn THEN StartSegment(name, CODEkind) {start a segment} ELSE IF op = d_lab THEN BEGIN Put1($E6); {create a global label} Put1(length(name^)); { leading length byte } FOR i := 1 TO length(name^) DO { label characters } Put1(ord(name^[i])); Put2(0); { # of bytes generated by line } Put1(ord('N')); { attribute } Put1(0); { private flag } END {else if} ELSE BEGIN CPut1(op); {write the opcode} size := 2; {write the name} IF op IN [m_jml, m_jsl, m_sta_longx] THEN size := 3; PutName(name, 0, size, 0); codeLength := codeLength + size + 1; {update the length of the code} END; {else} END; {Gen0Name} PROCEDURE Gen0NameShift{op: integer; name: namePtr}; { Generate an instruction with a named label shifted by 16 bits } { } { Parameters: } { op - instruction to generate } { name - pointer to the named operand } VAR i: integer; {loop variable} size: integer; {size of the operand} BEGIN {Gen0NameShift} IF listSymbols THEN BEGIN {list the instruction} IF showOffsets THEN WriteHex(codeLength); ListOp(op); writeln(name^, '>>16'); END; {if} CPut1(op); {write the opcode} PutName(name, 0, 2, - 16); codeLength := codeLength + 3; {update the length of the code} END; {Gen0NameShift} PROCEDURE Gen0Relative{op,lab: integer}; { Generate an instruction with an offset to a numbered label } { } { Parameters: } { op - instruction to generate } { label - label number } BEGIN {Gen0Relative} IF listSymbols THEN BEGIN {list the instruction} IF showOffsets THEN WriteHex(codeLength); ListOp(op); writeln('L', lab: 1); END; {if} CPut1(op); {write the opcode} ReferenceLabel(lab, 0, true, 1); {reference a label} codeLength := codeLength + 2; {update the length of the code} END; {Gen0Relative} PROCEDURE Gen0String{op: integer; str: stringPtr}; { Generate an instruction with a string constant operand } { } { Parameters: } { op - instruction to generate } { str - pointer to the string constant } VAR i: integer; {loop variable} len: integer; {length of str^} BEGIN {Gen0String} IF listSymbols THEN BEGIN {list the instruction} IF showOffsets THEN WriteHex(codeLength); ListOp(op); writeln('"', str^, '"'); END; {if} IF op IN [d_sub, d_fil] THEN BEGIN CPut1(m_cop); {generate the cop instruction} IF op = d_sub THEN {generate the cop type byte} CPut1(3) ELSE CPut1(6); ReferenceLabel(slabel, slen, false, 4); {generate the string addr} codeLength := codeLength + 6; {update the code size} len := length(str^); {get the length of the string} IF slen + len + 1 > ssize THEN BEGIN {save the string} FlagError(30); slen := 0; END; {if} sbuff[slen + 1] := chr(len); FOR i := 1 TO len DO sbuff[slen + i + 1] := str^[i]; slen := slen + len + 1; END {if} ELSE BEGIN CPut1(m_pea); {push the bank byte} Put1($EB); Put1(2); Put1($87); Put4(0); Put1($81); Put4( - 16); Put1(7); Put1(0); CPut1(m_pea); {push the string buffer address} ReferenceLabel(slabel, slen, false, 2); CPut1(m_pea); {push the string length} CPut2(0); codeLength := codeLength + 9; {update the code size} len := length(str^); {get the length of the string} IF slen + len + 1 > ssize THEN BEGIN {save the string} FlagError(30); slen := 0; END; {if} FOR i := 1 TO len DO sbuff[slen + i] := str^[i]; sbuff[slen + len + 1] := chr(0); slen := slen + len + 1; END; {else} END; {Gen0String} PROCEDURE Gen1{op, opnd: integer}; { Generate a two byte constant operand instruction } { } { Parameters: } { op - instruction to generate } { opnd - operand } { } { Note: This procedure is declared as extern in Scanner.Pas. } { If the name or parameter list changes, be sure and } { make a corresponding change there. } BEGIN {Gen1} IF listSymbols THEN BEGIN {list the instruction} IF showOffsets THEN WriteHex(codeLength); ListOp(op); write(opnd: 1); IF op = m_sta_longx THEN write(',X'); writeln; END; {if} IF op IN [d_lnm, d_ago, d_brk] THEN BEGIN CPut1(m_cop); {write the opcode} CPut1(ord(op) - ord(d_lnm)); {write the cop code} CPut2(opnd); {write the operand} codeLength := codeLength + 4; {update the length of the code} END {if} ELSE BEGIN CPut1(op); {write the opcode} CPut2(opnd); {write the operand} codeLength := codeLength + 3; {update the length of the code} END; {else} END; {Gen1} PROCEDURE Gen1Byte{op, opnd: integer}; { Generate a one byte constant operand instruction } { } { Parameters: } { op - instruction to generate } { opnd - operand } BEGIN {Gen1Byte} IF listSymbols THEN BEGIN {list the instruction} IF showOffsets THEN WriteHex(codeLength); ListOp(op); write(opnd: 1); IF op IN [m_adc_s, m_and_s, m_ora_s, m_sta_s] THEN write(',S') ELSE IF op = m_lda_indl THEN write(']'); writeln; END; {if} CPut1(op); {write the opcode} CPut1(opnd); {write the operand} codeLength := codeLength + 2; {update the length of the code} END; {Gen1Byte} PROCEDURE Gen1Name{op: integer; name: namePtr; opnd: integer}; { Generate an instruction with a named label and offset } { } { Parameters: } { op - instruction to generate } { name - pointer to the named operand } { opn1 - numeric offset } BEGIN {Gen1Name} IF listSymbols THEN BEGIN {list the instruction} IF showOffsets THEN WriteHex(codeLength); ListOp(op); writeln(name^, '+', opnd: 1); END; {if} CPut1(op); {write the opcode} PutName(name, opnd, 2, 0); {write the name} codeLength := codeLength + 3; {update the length of the code} END; {Gen1Name} PROCEDURE GenDebugSymbols; { Generate the debugger symbol table } VAR size: integer; {size of the symbol table} FUNCTION TableSize(sym: symbolPtr): integer; { Find the size of the symbol table } { } { Parameters: } { sym - pointer to the top symbol } { } { Returns the size of the debugger symbol table in bytes } VAR i: integer; {loop variable} size: integer; {# of bytes to generate} BEGIN {TableSize} IF sym <> NIL THEN BEGIN size := TableSize(sym^.left); {do the left part of the tree} IF sym^.kind = int THEN BEGIN {add in the size of this entry} IF sym^.size = 0 THEN size := size + 12 ELSE size := size + 24; END {if} ELSE size := size + 12; size := size + TableSize(sym^.right); {do the right part of the tree} END {if} ELSE size := 0; TableSize := size; {return the size} END; {TableSize} PROCEDURE GenSymbol(sym: symbolPtr); { Generate the code for one symbol } { } { Parameters: } { sym - pointer to the symbol to generate } VAR i: integer; {loop variable} len: integer; {length of the variable} BEGIN {GenSymbol} IF sym <> NIL THEN BEGIN GenSymbol(sym^.left); {do the left part of the tree} IF listSymbols THEN BEGIN {handle text output} IF showOffsets THEN WriteHex(codeLength); writeln(chr(9), chr(9), 'dc.l',chr(9), 'L', slabel: 1, '+', slen: 1); IF showOffsets THEN WriteHex(codeLength + 4); writeln(chr(9), chr(9), 'dc.l', chr(9), sym^.name); IF showOffsets THEN WriteHex(codeLength + 8); writeln(chr(9), chr(9), 'dc.b', chr(9), '1'); END; {if} ReferenceLabel(slabel, slen, false, 4); {generate the string addr} len := length(sym^.name); {get the length of the string} IF slen + len + 1 > ssize THEN BEGIN {save the string} FlagError(30); slen := 0; END; {if} sbuff[slen + 1] := chr(len); FOR i := 1 TO len DO sbuff[slen + i + 1] := sym^.name[i]; slen := slen + len + 1; PutName(@sym^.name, 0, 4, 0); {generate the name} CPut1(1); {absolute address flag} IF sym^.kind = int THEN BEGIN CPut1(1); {int variable} IF listSymbols THEN IF showOffsets THEN WriteHex(codeLength + 9); writeln(chr(9),chr(9), 'dc.b',chr(9),'1'); IF sym^.size = 0 THEN BEGIN CPut2(0); {not an array} IF listSymbols THEN IF showOffsets THEN WriteHex(codeLength + 10); writeln(chr(9),chr(9), 'dc.w', chr(9), '0'); END {if} ELSE BEGIN CPut2(1); {singly subscripted array} CPut2(0); {min subscript value} CPut2(0); CPut2(sym^.size + 1); {max subscript value} CPut2(0); CPut2(2); {elements are 2 bytes long} CPut2(0); IF listSymbols THEN BEGIN IF showOffsets THEN WriteHex(codeLength + 10); writeln(chr(9), chr(9), 'dc.w',chr(9),'1'); IF showOffsets THEN WriteHex(codeLength + 12); writeln(chr(9), chr(9), 'dc.l',chr(9),'0'); IF showOffsets THEN WriteHex(codeLength + 16); writeln(chr(9), chr(9), 'dc.l', chr(9), sym^.size + 1:1); IF showOffsets THEN WriteHex(codeLength + 20); writeln(chr(9), chr(9), 'dc.l', chr(9), '2'); END; {if} codeLength := codeLength + 12; END; {else} END {if} ELSE BEGIN CPut1(6); {string variable} CPut2(0); {not an array} IF listSymbols THEN BEGIN IF showOffsets THEN WriteHex(codeLength + 9); writeln(chr(9), chr(9), 'dc.b', chr(9), '6'); IF showOffsets THEN WriteHex(codeLength + 10); writeln(chr(9), chr(9), 'dc.w', chr(9), '0'); END; {if} END; {else} codeLength := codeLength + 12; {update the code size} GenSymbol(sym^.right); {do the right part of the tree} END; {if} END; {GenSymbol} BEGIN {GenDebugSymbols} IF symbolTable <> NIL THEN BEGIN Gen1Byte(m_cop, 5); {write the opcode} size := TableSize(symbolTable); {find the size of the table} CPut2(size); IF listSymbols THEN IF showOffsets THEN WriteHex(codeLength); writeln(chr(9), chr(9), 'dc.w', chr(9), size: 1); codeLength := codeLength + 2; GenSymbol(symbolTable); {generate the symbols} END; {if} Gen0(m_rts); {return to caller} END; {GenDebugSymbols} PROCEDURE GenStrings; { Generate string constants } VAR i: 1..ssize; {loop variable} lastType: (none, ch, int); {type of last variable} BEGIN {GenStrings} Gen0Label(d_lab, slabel); {create the string label} IF listSymbols AND (slen <> 0) THEN {list the instruction} BEGIN lastType := none; FOR i := 1 TO slen DO BEGIN IF sbuff[i] >= ' ' THEN BEGIN IF lastType <> ch THEN BEGIN IF lastType <> none THEN writeln; IF showOffsets THEN WriteHex(codeLength + i - 1); write(chr(9), chr(9), 'dc.b', chr(9), ''''); lastType := ch; END; {if} write(sbuff[i]); END {if} ELSE BEGIN IF lastType = int THEN write(',') ELSE BEGIN IF lastType = ch THEN write(''','); lastType := int; END; {if} write(ord(sbuff[i]): 1); END; {else} END; {for} writeln; END; {if} FOR i := 1 TO slen DO {write the string bytes} CPut1(ord(sbuff[i])); codeLength := codeLength + slen; {update the code size} END; {GenStrings} PROCEDURE GenSymbols; { Generate space for variables in the symbol table } VAR name: nameType; {segment name} PROCEDURE GenSymbol(sym: symbolPtr); { Generate the code for one symbol } { } { Parameters: } { sym - pointer to the symbol to generate } VAR i: integer; {loop variable} size: integer; {# of bytes to generate} BEGIN {GenSymbol} IF sym <> NIL THEN BEGIN GenSymbol(sym^.left); {do the left part of the tree} IF sym^.kind = int THEN {find the size of the symbol} size := 2 * sym^.size + 2 ELSE BEGIN size := sym^.size+1; if size = 1 then {(strings default to 10 characters)} size := 11; END; {else} Put1($E6); {create the label} Put1(length(sym^.name)); FOR i := 1 TO length(sym^.name) DO Put1(ord(sym^.name[i])); Put2(0); Put1(ord('N')); Put1(0); Put1($F1); {reserve the space} Put4(size); codeLength := codeLength + size; {update the code size} IF listSymbols THEN {write the text version} writeln(sym^.name, chr(9), 'ds.b', chr(9), size: 1); GenSymbol(sym^.right); {do the right part of the tree} END; {if} END; {GenSymbol} BEGIN {GenSymbols} IF symbolTable <> NIL THEN BEGIN name := 'VARIABLES'; StartSegment(@name, DATAkind); {start a segment} IF listSymbols THEN BEGIN writeln; writeln('VARIABLES', chr(9), 'Record'); END; {if} GenSymbol(symbolTable); {generate the symbols} EndSegment; IF listSymbols THEN writeln(chr(9), chr(9), 'endr'); END; {if} END; {GenSymbols} END. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Makefile b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Makefile new file mode 100644 index 0000000..e24ba6a --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Makefile @@ -0,0 +1 @@ +# File: IntBasic.make # Target: IntBasic IntBasicLib # Sources: Basic.p BasicCom.p CodeGen.p Parser.p Scanner.p BasicLib.aii OBJECTS = :obj:Basic.p.o ¶ :obj:Parser.p.o ¶ :obj:Scanner.p.o ¶ :obj:CodeGen.p.o ¶ :obj:BasicCom.p.o All ÄÄ IntBasicIIGS IntBasicLib IntBasic ÄÄ IntBasicIIGS IntBasicLib IntBasicIIGS ÄÄ {OBJECTS} Link -d -c 'MPS ' -t MPST -sym on -mf ¶ {OBJECTS} ¶ "{Libraries}"Stubs.o ¶ "{Libraries}"Runtime.o ¶ "{Libraries}"Interface.o ¶ "{PLibraries}"PasLib.o ¶ "{Libraries}"ToolLibs.o ¶ -o IntBasicIIGS :Obj: Ä : .p.o Ä .p Pascal -sym on {default}.p -o :obj: :Obj:Basic.p.o Ä :Obj:Parser.p.o :Obj:Scanner.p.o :Obj:BasicCom.p.o :Obj:CodeGen.p.o Ä :Obj:Scanner.p.o :Obj:BasicCom.p.o :Obj:Parser.p.o Ä :Obj:CodeGen.p.o :Obj:Scanner.p.o :Obj:BasicCom.p.o :Obj:Scanner.p.o Ä :Obj:BasicCom.p.o IntBasicLib ÄÄ BasicLib.aii BasicLib.macros AsmIIGS BasicLib.aii -o :obj:BasicLib.obj Delete -i IntBasicLib MakeLibIIGS -l IntBasicLib -r :obj:BasicLib.obj \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Parser.p b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Parser.p new file mode 100644 index 0000000..d30ab43 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Parser.p @@ -0,0 +1 @@ +{---------------------------------------------------------------} { } { Parser } { } { The scanner is responsible for checking the syntax of the } { program. In the process, it calls the symbol table } { subroutines. The symmantics are built into the parser; the } { symmantic subroutines call the code generator. } { } { Copyright 1991 } { By the Byte Works, Inc. } { } {---------------------------------------------------------------} { } { Global subroutines: } { } { Compile - Compile the program } { InitParser - Initialize the parser } { } {---------------------------------------------------------------} UNIT Parser; INTERFACE USES Types, BASICCom, Scanner, CodeGen; PROCEDURE Compile; { Compile the program } PROCEDURE InitParser; { Initialize the parser } {- Private declarations ----------------------------------------} IMPLEMENTATION CONST maxFor = 16; {max # of nested for statements} {direct page map} {---------------} tempDP = 0; {temp work area} index = 2; {index for lvalue} wptr = 4; {work pointer} TYPE {labels} {------} labPtr = ^labRecord; {ptr to a label record} labRecord = RECORD {label record} next: labPtr; {next record} slineNumber: integer; {line number for this label} labelNumber: integer; {label number for this line} defined: boolean; {is the label defined?} END; {call statement permanent name list} {----------------------------------} callListPtr = ^callListRecord; {ptr to a call list record} callListRecord = RECORD {call list record} next: callListPtr; {next record} name: nameType; {subroutine name} END; {private library label definitions} {---------------------------------} pvtSubID = ( id_AssignString, id_Basic, id_BasicShutdown, id_BasicStartup, id_Cmp_EQ, id_Cmp_GE, id_Cmp_GT, id_Cmp_LE, id_Cmp_LT, id_Cmp_NE, id_Cmp_Str_EQ, id_Cmp_Str_NE, id_Color, id_DivD, id_End, id_EndInput, id_Exp, id_GR, id_HGR, id_HLin, id_Input, id_InputStr, id_IntAbs, id_IntSgn, id_Logical, id_Mod, id_Mult, id_PartialString, id_Pdl, id_Plot, id_PrintEOL, id_PrintInt, id_PrintString, id_PrintTab, id_Prompt, id_Rnd, id_Scrn, id_StringLength, id_Tab, id_Text80, id_Text, id_VLin, id_VTab ); VAR callList: callListPtr; {call statement permanent name list} expressionKind: expressionTypes; {type of the last expression} endFound: boolean; {has an END statement been seen?} forStuff: ARRAY [1..maxFor] OF RECORD {for loop information} symbol: symbolPtr; {loop variable} termSymbol: symbolPtr; {terminating value variable} stepSymbol: symbolPtr; {step value variable} step: integer; {step size} stepexpr: boolean; {TRUE = step defined as expression} top: integer; {top of loop variable} exit: integer; {exit loop variable} END; termSymCount: integer; {used to generate unique FOR loop} stepSymCount: integer; {terminating and step variables } slineNumber: - 1..maxint; {current BASIC source line number} numFor: 0..maxFor; {number of active for statements} {lvalues} {-------} id: tokenType; {identifier} indexed: boolean; {is the value indexed?} lkind: expressionTypes; {lvalue expression kind} {labels} {------} labList: labPtr; {list of labels/line numbers} symlabel: integer; {symbol table subroutine label} pvtSubs: array[id_AssignString..id_VTab] of String[15]; {- General Use Subroutines -------------------------------------} PROCEDURE InitParser; { Initialize the parser } BEGIN {InitParser} slineNumber := - 1; {no line numbers found, yet} numFor := 0; {no active for loops} endFound := false; {no END statement seen yet} termSymCount := 1; {start variable names at 1} stepSymCount := 1; labList := NIL; {no labels in the label list} callList := NIL; {no subroutine names called, yet} { fill the array with the library names } pvtSubs[id_BasicShutdown] := '~BASICSHUTDOWN'; pvtSubs[id_BasicStartup] := '~BASICSTARTUP'; pvtSubs[id_Basic] := 'BASIC'; pvtSubs[id_Text80] := '~TEXT80'; pvtSubs[id_Text] := '~TEXT'; pvtSubs[id_HGR] := '~HGR'; pvtSubs[id_GR] := '~GR'; pvtSubs[id_End] := '~END'; pvtSubs[id_VTab] := '~VTAB'; pvtSubs[id_VLin] := '~VLIN'; pvtSubs[id_Tab] := '~TAB'; pvtSubs[id_PrintEOL] := '~PRINTEOL'; pvtSubs[id_PrintString] := '~PRINTSTRING'; pvtSubs[id_PrintInt] := '~PRINTINT'; pvtSubs[id_PrintTab] := '~PRINTTAB'; pvtSubs[id_Plot] := '~PLOT'; pvtSubs[id_Cmp_GE] := '~CMP_GE'; pvtSubs[id_EndInput] := '~ENDINPUT'; pvtSubs[id_InputStr] := '~INPUTSTR'; pvtSubs[id_Input] := '~INPUT'; pvtSubs[id_Prompt] := '~PROMPT'; pvtSubs[id_HLin] := '~HLIN'; pvtSubs[id_Color] := '~COLOR'; pvtSubs[id_AssignString] := '~ASSIGNSTRING'; pvtSubs[id_Logical] := '~LOGICAL'; pvtSubs[id_Cmp_NE] := '~CMP_NE'; pvtSubs[id_Cmp_LE] := '~CMP_LE'; pvtSubs[id_Cmp_GT] := '~CMP_GT'; pvtSubs[id_Cmp_LT] := '~CMP_LT'; pvtSubs[id_Cmp_EQ] := '~CMP_EQ'; pvtSubs[id_Cmp_Str_NE] := '~CMP_STR_NE'; pvtSubs[id_Cmp_Str_EQ] := '~CMP_STR_EQ'; pvtSubs[id_Mod] := '~MOD'; pvtSubs[id_DivD] := '~DIVD'; pvtSubs[id_Mult] := '~MULT'; pvtSubs[id_Exp] := '~EXP'; pvtSubs[id_Scrn] := '~SCRN'; pvtSubs[id_Rnd] := '~RND'; pvtSubs[id_Pdl] := '~PDL'; pvtSubs[id_IntSgn] := '~INTSGN'; pvtSubs[id_IntAbs] := '~INTABS'; pvtSubs[id_StringLength] := '~STRINGLENGTH'; pvtSubs[id_PartialString] := '~PARTIALSTRING'; END; {InitParser} PROCEDURE GenLibraryCall(callnum : pvtSubID); BEGIN Gen0Name(m_jsl, @pvtSubs[callnum]); END; {MakeLibraryCall} PROCEDURE Match(sym: tokens; err: integer); { Make sure the next token is sym } { } { Parameters: } { sym - expected symbol } { err - error to flag if sym is not found } BEGIN {Match} IF token.kind = sym THEN NextToken ELSE FlagError(err); END; {Match} {- Symbol Tables -----------------------------------------------} FUNCTION FindSymbol(VAR name: nameType): symbolPtr; { Find a symbol in the symbol table, creating one if needed } { } { Parameters: } { name - name of the symbol to find } { } { Returns: Pointer to the symbol table entry } FUNCTION CreateSymbol: symbolPtr; { Create a new symbol table entry } { } { Returns: Pointer to the symbol table entry } VAR sym: symbolPtr; {pointer to the new entry} BEGIN {CreateSymbol} new(sym); {get space for the entry} sym^.left := NIL; {initialize the tree links} sym^.right := NIL; sym^.name := name; {record the name} IF name[length(name)] = '$' THEN {find and record the type} sym^.kind := str ELSE sym^.kind := int; sym^.size := 0; {default size is 0} sym^.newSymbol := true; {this is a new symbol} CreateSymbol := sym; END; {CreateSymbol} FUNCTION Find(sym: symbolPtr): symbolPtr; { Traverse the tree, looking for the symbol } { } { Parameters: } { sym - pointer to the symbol to check } { } { Returns: Pointer to the symbol table entry } BEGIN {Find} IF sym^.name = name THEN BEGIN sym^.newSymbol := false; Find := sym; END {if} ELSE IF sym^.name < name THEN BEGIN IF sym^.left = NIL THEN BEGIN sym^.left := CreateSymbol; Find := sym^.left; END {if} ELSE Find := Find(sym^.left); END {else if} ELSE {if sym^.name > name then} BEGIN IF sym^.right = NIL THEN BEGIN sym^.right := CreateSymbol; Find := sym^.right; END {if} ELSE Find := Find(sym^.right); END; {else} END; {Find} BEGIN {FindSymbol} IF symbolTable = NIL THEN BEGIN symbolTable := CreateSymbol; FindSymbol := symbolTable; END {if} ELSE FindSymbol := Find(symbolTable); END; {FindSymbol} {- Line Number Labels ------------------------------------------} FUNCTION StatementLabel(lnum: integer; definition: boolean): integer; { Find/create a label for a statement } { } { Parameters: } { lnum - line number } { definition - is this a definition? } { } { Variables: } { labList - head of the label list } { } { Returns: label number for the line number } LABEL 1; VAR p: labPtr; {work pointer} BEGIN {StatementLabel} p := labList; {find an existing label} WHILE p <> NIL DO IF p^.slineNumber = lnum THEN GOTO 1 ELSE p := p^.next; new(p); {no label - create one} p^.next := labList; labList := p; p^.slineNumber := lnum; p^.labelNumber := GetLabel; p^.defined := false; 1: IF definition THEN {set the defined flag} p^.defined := true; StatementLabel := p^.labelNumber; {return the label number} END; {StatementLabel} PROCEDURE CheckLabels; { Check for line number labels used but not found } { } { Variables: } { labList - head of the label list } VAR p: labPtr; {work pointer} strptr : StringPtr; BEGIN {CheckLabels} p := labList; WHILE p <> NIL DO BEGIN IF NOT p^.defined THEN BEGIN strptr := cnvis(p^.slineNumber); msg := concat('Line number ', strptr^, ' was used but not defined.'); writeln('*** ', msg); numErrors := numErrors + 1; END; {if} p := p^.next; END; {while} END; {CheckLabels} {- Expressions -------------------------------------------------} PROCEDURE Expression(stop: tokenSet); { Compile an expression } { } { Parameters: } { stop - symbols other than eolnsy, eofsy and colon that } { can end the expression } { } { Variables: } { expressionKind - type of the expression } PROCEDURE CnvStrInt; { Generate the code to convert a string to an integer } BEGIN {CnvStrInt} Gen0(m_pla); Gen0(m_pla); Gen1Byte(m_sta_dir, wptr); Gen0(m_pla); Gen1Byte(m_sta_dir, wptr + 2); Gen1Byte(m_lda_indl, wptr); Gen1(m_and_imm, $00FF); END; {CnvStrInt} PROCEDURE AndOp; { Compile an and operation } PROCEDURE CmpOp; { Compile a compare } VAR ekind: expressionTypes; {temp expression kind} operation: tokens; {operation being performed} PROCEDURE PlusMinus; { Compile a plus or minus } VAR operation: tokens; {operation being performed} PROCEDURE MulOp; { Compile a *, / or mod } VAR operation: tokens; {operation being performed} PROCEDURE Exponent; { Compile an exponent operation } PROCEDURE Term; { Compile a term } VAR id: tokenType; {identifier} symbol: symbolPtr; {symbol table entry} BEGIN {Term} CASE token.kind OF notsy: BEGIN {not} NextToken; Term; IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} GenLibraryCall(id_Logical); Gen1(m_eor_imm, 1); END; minus: BEGIN {-} NextToken; Term; IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} Gen1(m_eor_imm, $FFFF); Gen0(m_inc_A); END; plus: BEGIN {+} NextToken; Term; IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} END; lparen: BEGIN {(} NextToken; Expression(stop + [rparen]); Match(rparen, 24); END; {lparen} intconst: BEGIN {integer constant} Gen1(m_lda_imm, token.ival); NextToken; expressionKind := int; END; stringconst: BEGIN {string constant} Gen0String(d_str, @token.str); NextToken; expressionKind := str; END; ident: BEGIN {identifier} id := token; {find the identifier} symbol := FindSymbol(token.name); expressionKind := symbol^.kind; NextToken; IF token.kind = lparen THEN BEGIN {handle an array} IF symbol^.newSymbol THEN BEGIN symbol^.newSymbol := false; symbol^.size := 10; END; {if} NextToken; IF symbol^.kind = str THEN BEGIN {for strings, generate partial string} Gen0NameShift(m_pea, @id.name); Gen0Name(m_pea, @id.name); Expression(stop + [comma]); Gen0(m_pha); Match(comma, 13); Expression(stop + [rparen]); Gen0(m_pha); GenLibraryCall(id_PartialString); END {if} ELSE BEGIN IF symbol^.size = 0 THEN FlagError(31); Expression(stop + [rparen]); Gen0(m_asl); Gen0(m_tax); Gen0Name(m_lda_absx, @id.name); END; {else} Match(rparen, 24); END {if} ELSE IF expressionKind = str THEN BEGIN Gen0NameShift(m_pea, @id.name); Gen0Name(m_pea, @id.name); Gen1(m_pea, 0); END {else if} ELSE Gen0Name(m_lda_abs, @id.name); expressionKind := symbol^.kind; END; ascsy: BEGIN {asc function} NextToken; Match(lparen, 23); Expression(stop + [rparen]); IF expressionKind <> str THEN FlagError(33); CnvStrInt; Match(rparen, 24); expressionKind := int; END; lensy: BEGIN {len function} NextToken; Match(lparen, 23); Expression(stop + [rparen]); IF expressionKind <> str THEN FlagError(33); GenLibraryCall(id_StringLength); Match(rparen, 24); expressionKind := int; END; abssy: BEGIN {abs function} NextToken; Match(lparen, 23); Expression(stop + [rparen]); IF expressionKind <> int THEN FlagError(12); GenLibraryCall(id_IntAbs); Match(rparen, 24); END; sgnsy: BEGIN {sgn function} NextToken; Match(lparen, 23); Expression(stop + [rparen]); IF expressionKind <> int THEN FlagError(12); GenLibraryCall(id_IntSgn); Match(rparen, 24); END; pdlsy: BEGIN {pdl function} NextToken; Match(lparen, 23); Expression(stop + [rparen]); IF expressionKind <> int THEN FlagError(12); GenLibraryCall(id_Pdl); Match(rparen, 24); END; rndsy: BEGIN {rnd function} NextToken; Match(lparen, 23); Expression(stop + [rparen]); IF expressionKind <> int THEN FlagError(12); GenLibraryCall(id_Rnd); Match(rparen, 24); END; scrnsy: BEGIN {scrn function} NextToken; Match(lparen, 23); Expression(stop + [comma, rparen]); IF expressionKind <> int THEN FlagError(12); Match(comma, 13); Gen0(m_pha); Expression(stop + [rparen]); IF expressionKind <> int THEN FlagError(12); Gen0(m_plx); GenLibraryCall(id_Scrn); Match(rparen, 24); END; OTHERWISE FlagError(27); END; {case} END; {Term} BEGIN {Exponent} Term; WHILE token.kind = exp DO BEGIN IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} NextToken; Gen0(m_pha); Term; IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} Gen0(m_plx); GenLibraryCall(id_Exp); END; {while} END; {MulOp} BEGIN {MulOp} Exponent; WHILE token.kind IN [mult, divd, modsy] DO BEGIN operation := token.kind; IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} NextToken; Gen0(m_pha); Exponent; IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} Gen0(m_plx); IF operation = mult THEN GenLibraryCall(id_Mult) ELSE IF operation = divd THEN GenLibraryCall(id_DivD) ELSE GenLibraryCall(id_Mod); END; {while} END; {MulOp} BEGIN {PlusMinus} MulOp; WHILE token.kind IN [plus, minus] DO BEGIN operation := token.kind; IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} NextToken; Gen0(m_pha); MulOp; IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} IF operation = plus THEN BEGIN Gen0(m_clc); Gen1Byte(m_adc_s, 1); Gen0(m_plx); END {if} ELSE BEGIN Gen1Byte(m_sta_dir, tempDP); Gen0(m_pla); Gen0(m_sec); Gen1Byte(m_sbc_dir, tempDP); END; {else} END; {while} END; {PlusMinus} BEGIN {CmpOp} PlusMinus; {evaluate the term} WHILE token.kind IN [eq, lt, gt, le, ge, ne] DO BEGIN ekind := expressionKind; {save the expression kind} operation := token.kind; {record the operation} NextToken; {skip the operation} IF ekind = int THEN {save the value} Gen0(m_pha); PlusMinus; {get the other term} IF expressionKind <> ekind THEN {check for type conflict} FlagError(32); IF ekind = str THEN {do the compare} CASE operation OF eq: GenLibraryCall(id_Cmp_Str_EQ); ne: GenLibraryCall(id_Cmp_Str_NE); OTHERWISE FlagError(34); END {case} ELSE {if ekind = int then} CASE operation OF eq: GenLibraryCall(id_Cmp_EQ); lt: GenLibraryCall(id_Cmp_LT); gt: GenLibraryCall(id_Cmp_GT); le: GenLibraryCall(id_Cmp_LE); ge: GenLibraryCall(id_Cmp_GE); ne: GenLibraryCall(id_Cmp_NE); END; {case} expressionKind := int; END; {while} END; {CmpOp} BEGIN {AndOp} CmpOp; WHILE token.kind = andsy DO BEGIN IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} NextToken; GenLibraryCall(id_Logical); Gen0(m_pha); CmpOp; IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} GenLibraryCall(id_Logical); Gen1Byte(m_and_s, 1); Gen0(m_plx); END; {while} END; {AndOp} BEGIN {Expression} AndOp; {evaluate the term} WHILE token.kind = orsy DO BEGIN {handle or operations} IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} NextToken; GenLibraryCall(id_Logical); Gen0(m_pha); AndOp; IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} GenLibraryCall(id_Logical); Gen1Byte(m_ora_s, 1); Gen0(m_plx); END; {while} {skip any extraneous tokens} IF NOT (token.kind IN stop + [eolnsy, eofsy, colon]) THEN BEGIN FlagError(11); WHILE NOT (token.kind IN stop + [eolnsy, eofsy, colon]) DO NextToken; END; {if} END; {Expression} PROCEDURE LValue; { Compile an l-value } VAR symbol: symbolPtr; {symbol table entry} BEGIN {LValue} IF token.kind = ident THEN BEGIN id := token; {save the identifier} symbol := FindSymbol(token.name); lkind := symbol^.kind; {record the type} NextToken; {skip the identifier} IF token.kind = lparen THEN BEGIN IF symbol^.newSymbol THEN BEGIN {make sure the variable is declared} symbol^.newSymbol := false; symbol^.size := 10; END; {if} IF (symbol^.kind = int) AND (symbol^.size = 0) THEN FlagError(31); indexed := true; {find the index} NextToken; Expression([rparen]); Match(rparen, 24); IF symbol^.kind = int THEN Gen0(m_asl) ELSE Gen0(m_dec_a); Gen1Byte(m_sta_dir, index); END {if} ELSE indexed := false; {not indexed} END {if} ELSE FlagError(27); END; {LValue} PROCEDURE Store; { Store a result } BEGIN {Store} IF expressionKind <> lkind THEN {check for type conflict} FlagError(32); IF indexed THEN BEGIN IF lkind = str THEN BEGIN Gen0NameShift(m_pea, @id.name); {handle indexed string} Gen0Name(m_pea, @id.name); Gen1Byte(m_lda_dir, index); Gen0(m_clc); Gen1Byte(m_adc_s, 1); Gen1Byte(m_sta_s, 1); GenLibraryCall(id_AssignString); END {if} ELSE BEGIN Gen1Byte(m_ldx_dir, index); {handle int array assignment} Gen0Name(m_sta_absx, @id.name); END; {else} END {if} ELSE BEGIN IF lkind = str THEN BEGIN Gen0NameShift(m_pea, @id.name); {handle unindexed string} Gen0Name(m_pea, @id.name); GenLibraryCall(id_AssignString); END {if} ELSE Gen0Name(m_sta_abs, @id.name); {handle int assignment} END; {else} END; {Store} {- Statements --------------------------------------------------} PROCEDURE Statement; { Compile a statement } PROCEDURE CheckEol; { Check for garbage at the end of the line } BEGIN {CheckEol} IF NOT (token.kind IN [colon, eolnsy]) THEN BEGIN FlagError(10); WHILE NOT (token.kind IN [colon, eolnsy, eofsy]) DO NextToken; END; {if} END; {CheckEol} PROCEDURE CallStatement; { compile a call statement } VAR nPtr: callListPtr; {work pointer} i: integer; {loop variable} BEGIN {CallStatement} NextToken; {skip the call} IF token.kind = ident THEN BEGIN new(nPtr); {allocate a new name record} nPtr^.next := callList; callList := nPtr; FOR i := 1 TO length(token.name) DO {uppercase the name} IF token.name[i] IN ['a'..'z'] THEN token.name[i] := chr(ord(token.name[i]) - ord('a') + ord('A')); nPtr^.name := token.name; {make a permanent copy of the name} Gen0Name(m_jsl, @nPtr^.name); NextToken; {skip the subroutine name} CheckEol; {check for garbage on the line} END {if} ELSE FlagError(27); END; {CallStatement} PROCEDURE ColorStatement; { compile a color statement } BEGIN {ColorStatement} NextToken; Match(eq, 3); Expression([]); IF expressionKind <> int THEN FlagError(12); GenLibraryCall(id_Color); END; {ColorStatement} PROCEDURE DimStatement; { compile a dim statement } VAR done: boolean; {loop termination variable} symbol: symbolPtr; {symbol table pointer} BEGIN {DimStatement} NextToken; {skip the dim} done := false; {loop until done} REPEAT IF token.kind = ident THEN BEGIN {declare the identifier} symbol := FindSymbol(token.name); IF NOT symbol^.newSymbol THEN {make sure it is unique} FlagError(22); symbol^.newSymbol := false; NextToken; Match(lparen, 23); {make suer the ( exists} IF token.kind = intconst THEN {find the array dimension} BEGIN IF token.ival > 0 THEN symbol^.size := token.ival ELSE FlagError(26); NextToken; END {if} ELSE FlagError(19); Match(rparen, 24); {make sure the ) exists} IF token.kind = comma THEN {check for another array} NextToken ELSE done := true; END {if} ELSE BEGIN FlagError(27); {handle a missing identifier} WHILE NOT (token.kind IN [colon, eolnsy, eofsy]) DO NextToken; END; {else} UNTIL done; CheckEol; {check for garbage on the line} END; {DimStatement} PROCEDURE ForStatement; { compile a for statement } VAR forTemp: nameType; {fortemp label name space} stepTemp: nameType; {steptemp label name space} negative: boolean; {is the step negative?} symbol: symbolPtr; {pointer to the for loop symbol} PROCEDURE GenUniqueName(VAR name: nameType; num: integer); VAR digits: string[5]; i, temp: integer; BEGIN digits := '00000'; { initialize digits string } i := 5; { character position } WHILE (num <> 0) AND (i <> 0) DO BEGIN temp := num MOD 10; num := num DIV 10; digits[i] := chr(ord('0') + temp); i := i - 1; END; {while} name := concat('~', name, '_', digits); {build string} END; {GenUniqueName} BEGIN {ForStatement} { if firstFor then begin {if this is the first, create ~FORTEMPS} { firstFor := false; forTemp := '~FORTEMPS'; symbol := FindSymbol(forTemp); symbol^.size := maxFor-1; stepTemp := '~STEPTEMPS'; symbol := FindSymbol(stepTemp); symbol^.size := maxFor-1; end; {if} IF numFor = maxFor THEN BEGIN {handle too many nested for statements} FlagError(16); WHILE NOT (token.kind IN [colon, eolnsy, eofsy]) DO NextToken; END {if} ELSE BEGIN numFor := numFor + 1; {get a for array area} NextToken; {skip the for} forStuff[numFor].stepexpr := false; {init flag} IF token.kind = ident THEN BEGIN {do the initial assignment} symbol := FindSymbol(token.name); forStuff[numFor].symbol := symbol; IF (symbol^.kind <> int) OR (symbol^.size <> 0) THEN FlagError(17); NextToken; END {if} ELSE FlagError(17); Match(eq, 3); Expression([tosy]); Gen0Name(m_sta_abs, @symbol^.name); Match(tosy, 18); {check for the to} Expression([stepsy]); {evaluate and save the stop value} IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} forTemp := 'FORTEMP'; GenUniqueName(forTemp, termSymCount); symbol := FindSymbol(forTemp); forStuff[numFor].termSymbol := symbol; termSymCount := termSymCount + 1; Gen0Name(m_sta_abs, @forTemp); IF token.kind = stepsy THEN BEGIN {evaluate the step size} NextToken; negative := false; IF token.kind = minus THEN BEGIN negative := true; NextToken; END; {if} IF token.kind = intconst THEN BEGIN IF negative THEN forStuff[numFor].step := - token.ival ELSE forStuff[numFor].step := token.ival; NextToken; END {if} ELSE BEGIN { get step expression } Expression([]); {evaluate and save the step value} IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} IF negative THEN BEGIN { negate result of expression } Gen1(m_eor_imm, $FFFF); Gen0(m_inc_A); END; {if} stepTemp := 'STEPTEMP'; GenUniqueName(stepTemp, stepSymCount); symbol := FindSymbol(stepTemp); forStuff[numFor].stepSymbol := symbol; stepSymCount := stepSymCount + 1; Gen0Name(m_sta_abs, @stepTemp); forStuff[numFor].stepexpr := true; END {else} END {if} ELSE forStuff[numFor].step := 1; WITH forStuff[numFor] DO BEGIN {allocate loop variables} top := GetLabel; Gen0Label(d_lab, top); END; {with} END; {else} CheckEol; {check for junk at the end of the line} END; {ForStatement} PROCEDURE GosubStatement; { compile a gosub statement } BEGIN {GosubStatement} NextToken; IF token.kind = intconst THEN BEGIN Gen0Label(m_jsr, StatementLabel(token.ival, false)); NextToken; END {if} ELSE IF token.kind = stringconst THEN BEGIN { line label } Gen0Name(m_jsr, @token.str); NextToken; END {else if} ELSE FlagError(9); CheckEol; END; {GosubStatement} PROCEDURE GotoStatement; { compile a goto statement } BEGIN {GotoStatement} NextToken; IF token.kind = intconst THEN BEGIN Gen0Label(m_jmp, StatementLabel(token.ival, false)); NextToken; END {if} ELSE IF token.kind = stringconst THEN BEGIN { line label } Gen0Name(m_jmp, @token.str); NextToken; END {else if} ELSE FlagError(9); CheckEol; END; {GotoStatement} PROCEDURE HlinStatement; { compile an hlin statement } BEGIN {HlinStatement} NextToken; Expression([comma]); Gen0(m_pha); Match(comma, 13); Expression([atsy]); Gen0(m_pha); Match(atsy, 14); Expression([]); Gen0(m_plx); Gen0(m_ply); GenLibraryCall(id_HLin); END; {HlinStatement} PROCEDURE IfStatement; { compile an if statement } VAR lab, lab2: integer; {branch points} BEGIN {IfStatement} NextToken; {skip the if} Expression([thensy]); {evaluate the condition} IF expressionKind = str THEN BEGIN FlagError(25); expressionKind := int; END; {if} Gen0(m_tax); Match(thensy, 15); {make sure the then is there} lab := GetLabel; {get a true branch label} IF token.kind = intconst THEN BEGIN Gen0Relative(m_beq, lab); {branch if false} Gen0Label(m_jmp, {handle an "if exp then number"} StatementLabel(token.ival, false)); Gen0Label(d_lab, lab); NextToken; CheckEol; END {if} ELSE IF token.kind = stringconst THEN BEGIN {line label} Gen0Relative(m_beq, lab); {branch if false} Gen0Name(m_jmp, @token.str); {handle an 'if exp then "label"'} Gen0Label(d_lab, lab); NextToken; CheckEol; END {else if} ELSE BEGIN Gen0Relative(m_bne, lab); {branch if true} lab2 := GetLabel; {handle a statement after the then} Gen0Label(m_jmp, lab2); Gen0Label(d_lab, lab); Statement; Gen0Label(d_lab, lab2); END; {else} END; {IfStatement} PROCEDURE InputStatement; { compile a input statement } VAR done: boolean; {loop termination} BEGIN {InputStatement} NextToken; {skip INPUT} IF token.kind = stringconst THEN {print the prompt, if any} BEGIN Expression([comma]); GenLibraryCall(id_PrintString); Match(comma, 13); END {if} ELSE GenLibraryCall(id_Prompt); {print the input prompt} done := false; {read the values} REPEAT LValue; IF lkind = int THEN GenLibraryCall(id_Input) ELSE GenLibraryCall(id_InputStr); expressionKind := lkind; Store; IF token.kind = comma THEN NextToken ELSE done := true; UNTIL done; GenLibraryCall(id_EndInput); {dump the rest of the input line} CheckEol; {make sure we are at the end of line} END; {InputStatement} PROCEDURE LetStatement; { compile an assingment statement } BEGIN {LetStatement} LValue; Match(eq, 3); Expression([]); Store; CheckEol; END; {LetStatement} PROCEDURE NextStatement; { compile a next statement } LABEL 1; VAR exit: integer; {temp label; for long branch} do_cmp: integer; {temp label} symbol: symbolPtr; {for loop variable} BEGIN {NextStatement} 1: IF numFor = 0 THEN BEGIN FlagError(20); WHILE NOT (token.kind IN [colon, eolnsy, eofsy]) DO NextToken; END {if} ELSE BEGIN NextToken; {skip the next or comma} IF token.kind = ident THEN BEGIN {check the loop variable} symbol := FindSymbol(token.name); IF symbol <> forStuff[numFor].symbol THEN FlagError(21); NextToken; END {if} ELSE FlagError(17); WITH forStuff[numFor] DO BEGIN {increment/decrement the loop variable} IF stepexpr = true THEN BEGIN Gen0(m_clc); Gen0Name(m_lda_abs, @symbol^.name); Gen0Name(m_adc_abs, @stepSymbol^.name); Gen0Name(m_sta_abs, @symbol^.name); { test loop condition } Gen0Name(m_lda_abs, @termSymbol^.name); Gen0(m_pha); Gen0Name(m_lda_abs, @symbol^.name); Gen0Name(m_ldx_abs, @stepSymbol^.name); { get step value } do_cmp := GetLabel; Gen0Relative(m_bpl, do_cmp); { if positive, branch } Gen1Byte(m_sta_s, 1); { else store variable value in stack } Gen0Name(m_lda_abs, @termSymbol^.name); Gen0Label(d_lab, do_cmp); END {if} ELSE BEGIN IF step = 1 THEN Gen0Name(m_inc_abs, @symbol^.name) ELSE IF step = - 1 THEN Gen0Name(m_dec_abs, @symbol^.name) ELSE BEGIN Gen0(m_clc); Gen0Name(m_lda_abs, @symbol^.name); Gen1(m_adc_imm, step); Gen0Name(m_sta_abs, @symbol^.name); END; {else} IF step < 0 THEN BEGIN {test loop condition} Gen0Name(m_lda_abs, @symbol^.name); Gen0(m_pha); Gen0Name(m_lda_abs, @termSymbol^.name); END {if} ELSE BEGIN Gen0Name(m_lda_abs, @termSymbol^.name); Gen0(m_pha); Gen0Name(m_lda_abs, @symbol^.name); END; {else} END; {else} GenLibraryCall(id_Cmp_GE); Gen0(m_tax); exit := GetLabel; Gen0Relative(m_beq, exit); Gen0Label(m_jmp, top); {loop} Gen0Label(d_lab, exit); {exit loop label} END; {with} numFor := numFor - 1; END; {else} IF token.kind = comma THEN {allow for multiple next vars} GOTO 1; CheckEol; {check for junk at the end of the line} END; {NextStatement} PROCEDURE PlotStatement; { compile a plot statement } BEGIN {PlotStatement} NextToken; Expression([comma]); Gen0(m_pha); Match(comma, 13); Expression([]); Gen0(m_plx); GenLibraryCall(id_Plot); END; {PlotStatement} PROCEDURE PrintStatement; { compile a print statement } VAR lastWasSemicolon: boolean; {was the last token a semicolon?} BEGIN {PrintStatement} NextToken; lastWasSemicolon := false; REPEAT IF token.kind = comma THEN BEGIN lastWasSemicolon := true; GenLibraryCall(id_PrintTab); NextToken; END {if} ELSE IF token.kind = semicolon THEN BEGIN lastWasSemicolon := true; NextToken; END {else if} ELSE IF NOT (token.kind IN [colon, eolnsy, eofsy]) THEN BEGIN lastWasSemicolon := false; Expression([comma, semicolon]); IF expressionKind = int THEN GenLibraryCall(id_PrintInt) ELSE GenLibraryCall(id_PrintString); END; {else} UNTIL token.kind IN [colon, eolnsy, eofsy]; IF NOT lastWasSemicolon THEN GenLibraryCall(id_PrintEOL); END; {PrintStatement} PROCEDURE RemStatement; { compile a rem statement } BEGIN {RemStatement} WHILE NOT (ch IN [chr(ch_eoln), chr(ch_eof)]) DO NextCh; NextToken; END; {RemStatement} PROCEDURE TabStatement; { compile a tab statement } BEGIN {TabStatement} NextToken; Expression([]); GenLibraryCall(id_Tab); END; {TabStatement} PROCEDURE VlinStatement; { compile an vlin statement } BEGIN {VlinStatement} NextToken; Expression([comma]); Gen0(m_pha); Match(comma, 13); Expression([atsy]); Gen0(m_pha); Match(atsy, 14); Expression([]); Gen0(m_plx); Gen0(m_ply); GenLibraryCall(id_VLin); END; {VlinStatement} PROCEDURE VtabStatement; { compile a vtab statement } BEGIN {VtabStatement} NextToken; Expression([]); GenLibraryCall(id_VTab); END; {VtabStatement} BEGIN {Statement} CASE token.kind OF dimsy: DimStatement; callsy: CallStatement; colorsy: ColorStatement; endsy: BEGIN NextToken; Gen0Name(m_jml, @pvtSubs[id_End]); endFound := true; {yes, we've seen the END statement} END; forsy: ForStatement; gosubsy: GosubStatement; gotosy: GotoStatement; grsy: BEGIN NextToken; GenLibraryCall(id_GR); END; hgrsy: BEGIN NextToken; GenLibraryCall(id_HGR); END; hlinsy: HlinStatement; ifsy: IfStatement; inputsy: InputStatement; nextsy: NextStatement; plotsy: PlotStatement; popsy: BEGIN NextToken; Gen0(m_ply); END; printsy: PrintStatement; remsy: RemStatement; returnsy: BEGIN NextToken; Gen0(m_rts); END; tabsy: TabStatement; textsy: BEGIN NextToken; GenLibraryCall(id_Text); END; text80sy: BEGIN NextToken; GenLibraryCall(id_Text80); END; vlinsy: VlinStatement; vtabsy: VtabStatement; letsy: BEGIN NextToken; LetStatement; END; OTHERWISE LetStatement; END; {case} END; {Statement} {- Main Compiler -----------------------------------------------} PROCEDURE Compile; { Compile the program } BEGIN {Compile} Gen0Name(d_bgn, @pvtSubs[id_Basic]); {generate the start of the program} GenLibraryCall(id_BasicStartup); {set up the BASIC environment} WHILE token.kind <> eofsy DO BEGIN IF token.kind = intconst THEN BEGIN {handle a line number} IF token.ival <= slineNumber THEN FlagError(8); slineNumber := token.ival; Gen0Label(d_lab, StatementLabel(token.ival, true)); NextToken; END {if} ELSE IF token.kind = stringconst THEN BEGIN { line label!} Gen0Name(d_lab, @token.str); NextToken; { skip the label } END; {else} IF (token.kind <> eolnsy) AND (token.kind <> eofsy) THEN BEGIN Statement; {compile a statement} WHILE token.kind = colon DO BEGIN {compile any other statements} NextToken; Statement; END; {while} IF (token.kind <> eolnsy) AND (token.kind <> eofsy) THEN BEGIN {check for garbage on the line} FlagError(10); WHILE NOT (token.kind IN [eolnsy, eofsy]) DO NextToken; END; {if} END; {if} IF token.kind <> eofsy THEN NextToken; {skip the eoln} while token.kind = eolnsy do NextToken; { allow blank lines } END; {while} IF NOT endFound THEN { if no END statement seen, include implied END } GenLibraryCall(id_BasicShutdown); {return to the launcher} GenStrings; {generate any string constants} Gen0(d_end); {flag the end of the program} GenSymbols; {create the symbol segment} CheckLabels; {check for undefined labels} END; {Compile} END. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Scanner.p b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Scanner.p new file mode 100644 index 0000000..5758bba --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/Scanner.p @@ -0,0 +1 @@ +{---------------------------------------------------------------} { } { Scanner } { } { The scanner is responsible for reading and converting the } { source file into a series of tokens the compiler } { understands. This scanner is also the interface between } { the compiler and the ORCA shell. } { } { Copyright 1991 } { By the Byte Works, Inc. } { } {---------------------------------------------------------------} { } { Global subroutines: } { } { FlagError - Flag an error } { InitScanner - Initialize the scanner } { NextCh - Read the next character from the source file } { NextToken - Read the next token from the source file } { ShutDownScanner - Shut down the scanner } { TermError - Handle a terminal error } { } {---------------------------------------------------------------} UNIT Scanner; INTERFACE USES OSUtils, { for FInfo record } Files, { for HSetFileInfo } Memory, { for NewPtr, DisposPtr } CursorCtl, { for the spinning cursor } Signal, { to handle command-period } PasLibIntf, { for standard I/O, etc. } IntEnv, { for argV and argC } Types, BASICCom; {---------------------------------------------------------------} CONST {special character codes} {-----------------------} ch_eoln = 13; {end of line} ch_eof = 0; {end of file} VAR ch: char; {current character} {---------------------------------------------------------------} PROCEDURE InitScanner; { Initialize the file input module } PROCEDURE FlagError(errNum: integer); { Flag an error } { } { Parameters: } { errNum - error number } PROCEDURE NextCh; { Read the next character from the source file } { } { Variables: } { ch - character read from the file } { cp - pointer to the next character } { fileLength - number of characters left in the file } PROCEDURE NextToken; { Read the next token from the source file } { } { Variables: } { ch - current character } { token - token read } PROCEDURE ShutDownScanner; { Shut down the file input module } PROCEDURE TermError(err: integer); { Handle a terminal error } { } { Parameters: } { err - terminal error number } {- Private declarations ----------------------------------------} IMPLEMENTATION CONST minCh = 0; {range of characters} maxCh = 127; maxErrors = 6; {max errors on one source line} version = '1.1'; {tokens} {------} tokenLength = 8; {length of a token string} TYPE {character types} chType = (chLetter, chNumber, chQuote, chIllegal, chcolon, chComma, chSemicolon, chLParen, chRParen, chEq, chLt, chGt, chPound, chPlus, chMinus, chMult, chDivd, chExp, chSpace, chDollar, chEof, chEoln); tokenString = string[8]; {token string} VAR {error tracking and reporting} {----------------------------} numErr: integer; {number of errors found on this line} errors: ARRAY [1..maxErrors] OF {array of errors on the current line} RECORD err: integer; {error number} pos: integer; {position in source line} lineNumber: integer; {source line number} END; {lexical variables} {-----------------} chTypes: ARRAY [char] OF chType; {character types array} {source file variables} {---------------------} cp: StringPtr; {pointer to the next char in the file} srcBuf: bytePtr; {pointer to beginning of source file} cpos: integer; {column number for ch} tpos: integer; {cpos at start of last token} tlineNumber: integer; {lineNumber at start of last token} fileLength: longint; {number of characters left in the file} lineStart: bytePtr; {cp at start of current line} {tokens} {------} tokenNames: ARRAY [abssy..vtabsy] OF tokenString; {names of the tokens} tokenIndex: ARRAY ['A'..'['] OF tokens; {start index for each letter} {- Subroutines -------------------------------------------------} {*----------------------------------* | Stop - terminate execution | *----------------------------------*} PROCEDURE Stop(msg: Str255); BEGIN {Stop} IF Length(msg) > 0 THEN BEGIN PLFlush (Output); WriteLn(Diagnostic); WriteLn(Diagnostic, msg); END; IF interrupted THEN IEexit(-9); { don't worry about closing the files we opened. The Shell will do so if appropriate.} IEexit(Ord(retCode)); {exit, returning the appropriate status code} END; {Stop} {*--------------------------------------* | Intr - Process external interrupt | | this routine is passed to IEsigset | *--------------------------------------*} PROCEDURE Intr; BEGIN {Intr} interrupted := True; {we test this switch periodically} END; {Intr} {$S Init} {*-------------------------------------------------------------* | SyntaxError - Report an error in parameters or options | *-------------------------------------------------------------*} PROCEDURE SyntaxError(suffix: Str255); BEGIN {SyntaxError} PLFlush (Output); WriteLn(Diagnostic, '### ', progName, ' - ', suffix); Stop(Concat('# Usage: ', progName, ' sourcefile [-o objfile] [-l] [-s] [-p]')); END; {SyntaxError} {*-----------------------------------* | LetterOpt - Set a letter option | *-----------------------------------*} PROCEDURE LetterOpt(opt: Char; VAR argVIndex: integer); { note only one option is supported. argVIndex is passed to this routine so options that have arguments can 'eat' them} BEGIN {LetterOpt} CASE opt OF 'p', 'P': quiet := False; 's', 'S': listSymbols := True; 'l', 'L': listSource := True; 'h', 'H': showOffsets := True; 'o', 'O': BEGIN keep := True; argVIndex := argVIndex + 1; IF Length(ArgV^[argVIndex]^) = 0 THEN SyntaxError('-o option requires a filename') ELSE keepFile := ArgV^[argVIndex]^; END; OTHERWISE SyntaxError(Concat(ArgV^[argVIndex]^, ' ')); END; {case} END; {LetterOpt} PROCEDURE FlagError{errNum: integer}; { Flag an error } { } { Parameters: } { errNum - error number } BEGIN {FlagError} IF numErr < maxErrors THEN BEGIN {prevent an array overflow} numErr := numErr + 1; {record the error} numErrors := numErrors + 1; IF numErr = maxErrors THEN errNum := 2; WITH errors[numErr] DO BEGIN err := errNum; pos := tpos; lineNumber := tlineNumber; END; {with} END; {if} END; {FlagError} PROCEDURE NextCh; { Read the next character from the source file } { } { Variables: } { ch - character read from the file } { cp - pointer to the next character } { fileLength - number of characters left in the file } PROCEDURE PrintLine; { Print the current line (if necessary) } { } { Variables: } { lineStart - cp at the start of the last line } { listSource - list the source file? } { numErr - number of errors on this line } { lineNumber - current line number } VAR i: 1..maxErrors; {loop variable} ptr: StringPtr; {used to print the line} tmpstr : StringPtr; PROCEDURE ShowLine(VAR f : TEXT); BEGIN write(f, lineNumber: 4, ' '); {print the line number} ptr := StringPtr(lineStart); {print the line} WHILE (ptr^[0] <> chr(ch_eoln)) DO BEGIN write(f, ptr^[0]); ptr := StringPtr(ord4(ptr) + 1); END; {while} WriteLn(f); END; BEGIN {PrintLine} IF listSource THEN ShowLine(output); IF numErr <> 0 THEN BEGIN PLFlush(output); write(Diagnostic, '# '); ShowLine(Diagnostic); FOR i := 1 TO numErr DO BEGIN {print any errors} CASE errors[i].err OF 1: msg := 'illegal character'; 2: msg := 'further errors supressed'; 3: msg := '''='' expected'; 4: BEGIN tmpstr := cnvis(nameLength); msg := concat('identifiers must be ', tmpstr^,' or fewer characters long'); END; 5: BEGIN tmpstr := cnvis(maxint); msg := concat('integers cannot exceed ', tmpstr^); END; 6: BEGIN tmpstr := cnvis(stringLength); msg := concat('string constants must be ', tmpstr^, ' or fewer characters long'); END; 7: msg := '''"'' expected'; 8: msg := 'illegal line number'; 9: msg := 'line number expected'; 10: msg := 'extra symbols ignored'; 11: msg := 'error in expression'; 12: msg := 'expression type must be integer'; 13: msg := ''','' expected'; 14: msg := '''at'' expected'; 15: msg := '''then'' expected'; 16: msg := 'too many nested for loops'; 17: msg := 'loop variable must be an integer'; 18: msg := '''to'' expected'; 19: msg := 'integer constant expected'; 20: msg := 'next without for'; 21: msg := 'next does not match for'; 22: msg := 'duplicate variable'; 23: msg := '''('' expected'; 24: msg := ''')'' expected'; 25: msg := 'operation cannot be performed on a string'; 26: msg := 'array size must be greater than 0'; 27: msg := 'identifier expected'; 28: msg := 'implementation restriction: program is too large'; 29: msg := 'implementation restriction: too many local labels'; 30: msg := 'implementation restriction: too many string constants'; 31: msg := 'variable is not an array'; 32: msg := 'type conflict'; 33: msg := 'expression type must be string'; 34: msg := 'string compares for =, # only'; END; {case} IF lineNumber = errors[i].lineNumber THEN writeln(Diagnostic, '# ', '^ ': 6 + errors[i].pos, msg) ELSE writeln('# Error at character ', errors[i].pos: 1, ' of line ', errors[i].lineNumber: 1, ': ', msg); END; {for} Writeln(Diagnostic,chr(9), 'File ', sourceFile, '; Line ', lineNumber); END; {if} lineNumber := lineNumber + 1; {start a new line} lineStart := Byteptr(cp); cpos := 0; numErr := 0; END; {PrintLine} BEGIN {NextCh} IF ch = chr(ch_eoln) THEN BEGIN {if we finished a line then...} PrintLine; {print the line} lineType := step; {assume this is a normal line} END; {if} IF fileLength <> 0 THEN BEGIN {get the next character} ch := cp^[0]; cp := StringPtr(ord4(cp) + 1); fileLength := fileLength - 1; cpos := cpos + 1; IF ch = chr($84) THEN BEGIN {check for auto-go, break point} lineType := breakpoint; lineStart := BytePtr(cp); NextCh; END {if} ELSE IF ch = chr($81) THEN BEGIN lineType := autogo; lineStart := BytePtr(cp); NextCh; END; {else if} END {if} ELSE ch := chr(ch_eof); END; {NextCh} PROCEDURE InitScanner; { Initialize the file input module } PROCEDURE InitArrays; { Initialize the scanner arrays } CONST TAB = 9; {tab key code} VAR ch: char; {loop variable} BEGIN {InitArrays} FOR ch := chr(minCh) TO chr(maxCh) DO {set up the char types array} chTypes[ch] := chIllegal; FOR ch := 'a' TO 'z' DO chTypes[ch] := chLetter; FOR ch := 'A' TO 'Z' DO chTypes[ch] := chLetter; FOR ch := '0' TO '9' DO chTypes[ch] := chNumber; chTypes['"'] := chQuote; chTypes[':'] := chcolon; chTypes[','] := chComma; chTypes[';'] := chSemicolon; chTypes['('] := chLParen; chTypes[')'] := chRParen; chTypes['='] := chEq; chTypes['<'] := chLt; chTypes['>'] := chGt; chTypes['#'] := chPound; chTypes['+'] := chPlus; chTypes['-'] := chMinus; chTypes['*'] := chMult; chTypes['/'] := chDivd; chTypes['^'] := chExp; chTypes[' '] := chSpace; chTypes['$'] := chDollar; chTypes[chr(TAB)] := chSpace; chTypes[chr(ch_eof)] := chEof; chTypes[chr(ch_eoln)] := chEoln; tokenNames[abssy] := 'ABS'; {initialize the token names array} tokenNames[andsy] := 'AND'; tokenNames[ascsy] := 'ASC'; tokenNames[atsy] := 'AT'; tokenNames[callsy] := 'CALL'; tokenNames[colorsy] := 'COLOR'; tokenNames[dimsy] := 'DIM'; tokenNames[endsy] := 'END'; tokenNames[forsy] := 'FOR'; tokenNames[gosubsy] := 'GOSUB'; tokenNames[gotosy] := 'GOTO'; tokenNames[grsy] := 'GR'; tokenNames[hgrsy] := 'HGR'; tokenNames[hlinsy] := 'HLIN'; tokenNames[ifsy] := 'IF'; tokenNames[inputsy] := 'INPUT'; tokenNames[lensy] := 'LEN'; tokenNames[letsy] := 'LET'; tokenNames[modsy] := 'MOD'; tokenNames[nextsy] := 'NEXT'; tokenNames[notsy] := 'NOT'; tokenNames[orsy] := 'OR'; tokenNames[pdlsy] := 'PDL'; tokenNames[plotsy] := 'PLOT'; tokenNames[popsy] := 'POP'; tokenNames[printsy] := 'PRINT'; tokenNames[remsy] := 'REM'; tokenNames[returnsy] := 'RETURN'; tokenNames[rndsy] := 'RND'; tokenNames[scrnsy] := 'SCRN'; tokenNames[sgnsy] := 'SGN'; tokenNames[stepsy] := 'STEP'; tokenNames[tabsy] := 'TAB'; tokenNames[textsy] := 'TEXT'; tokenNames[text80sy] := 'TEXT80'; tokenNames[thensy] := 'THEN'; tokenNames[tosy] := 'TO'; tokenNames[vlinsy] := 'VLIN'; tokenNames[vtabsy] := 'VTAB'; tokenIndex['A'] := abssy; {initialize the token index array} tokenIndex['B'] := callsy; tokenIndex['C'] := callsy; tokenIndex['D'] := dimsy; tokenIndex['E'] := endsy; tokenIndex['F'] := forsy; tokenIndex['G'] := gosubsy; tokenIndex['H'] := hgrsy; tokenIndex['I'] := ifsy; tokenIndex['J'] := lensy; tokenIndex['K'] := lensy; tokenIndex['L'] := lensy; tokenIndex['M'] := modsy; tokenIndex['N'] := nextsy; tokenIndex['O'] := orsy; tokenIndex['P'] := pdlsy; tokenIndex['Q'] := remsy; tokenIndex['R'] := remsy; tokenIndex['S'] := scrnsy; tokenIndex['T'] := tabsy; tokenIndex['U'] := vlinsy; tokenIndex['V'] := vlinsy; tokenIndex['W'] := succ(vtabsy); tokenIndex['X'] := succ(vtabsy); tokenIndex['Y'] := succ(vtabsy); tokenIndex['Z'] := succ(vtabsy); tokenIndex['['] := succ(vtabsy); END; {InitArrays} PROCEDURE InitScalars; { Initialize the scanner's scalars } BEGIN {InitScalars} numErrors := 0; {no errors so far} numErr := 0; maxErrorLevel := 0; {max error level is 0} lineNumber := 1; {first line in the file} lineStart := BytePtr(cp); {record the start of the 1st line} cpos := 0; {initialize the column number} lineType := step; {normal debugger line type} objBuf := NewHandle(0); {initialize the object code buffer} IF MemError <> 0 THEN TermError(5); END; {InitScalars} PROCEDURE InitShell; { Handle the initial communication with the shell } VAR ioRslt, argVIndex, fileCount: integer; prevSig: SignalHandler; arg: Str255; BEGIN {InitShell} retCode := RC_Normal; interrupted := False; {becomes True when interrupted} prevSig := IEsignal(SIGINT, @Intr); progName := ArgV^[0]^; retCode := RC_ParmErrs; quiet := true; listSymbols := false; listSource := false; showOffsets := false; keep := false; argVIndex := 1; fileCount := 0; WHILE argVIndex < ArgC DO BEGIN {ArgC is the number of args plus one} arg := ArgV^[argVIndex]^; IF (Length(arg) <> 0) THEN BEGIN IF arg[1] = '-' THEN { we have an option } LetterOpt(arg[2], argVIndex) ELSE BEGIN { it must be a file to open} fileCount := fileCount + 1; IF fileCount = 1 THEN sourceFile := ArgV^[argVIndex]^ ELSE SyntaxError('Too many source files specified'); END; {else} END; {if} argVIndex := argVIndex + 1; END; {while} IF fileCount <> 1 THEN SyntaxError('No source file specified'); IF NOT quiet THEN BEGIN WriteLn(Diagnostic); WriteLn(Diagnostic, progName, ', Version ', version); WriteLn(Diagnostic, 'Copyright 1991, Byte Works, Inc.'); WriteLn(Diagnostic); WriteLn(Diagnostic); END; retCode := RC_Normal; IF interrupted THEN Stop(''); END; {InitShell} PROCEDURE ReadFile; { Read the source file } { } { Variables: } { sourceFile - source file name } { cp - pointer to the first character in the file } { fileLength - number of characters in the file } VAR inFile : FILE; filePos: LongInt; BEGIN {ReadFile} IEOpen(inFile, sourceFile, O_RDONLY); {open file} fileLength := IElseek(inFile, 0, 2); {seek to end of file and get EOF} IF fileLength < 0 THEN TermError(2); { had an error on the lseek } filePos := IElseek(infile, 0, 0); {reset to beginning of file} srcBuf := bytePtr(NewPtr(fileLength)); {allocate buffer for contents} if srcBuf = NIL then TermError(5); cp := StringPtr(srcBuf); filePos := ByteRead(inFile, srcBuf^, fileLength); {read file into buffer} Close(inFile); {close file} END; {ReadFile} BEGIN {InitScanner} InitShell; {read and process the command line info} ReadFile; {read the source file} InitScalars; {initialize the scalars} InitArrays; {initialize the constant arrays} NextCh; {get the first character} NextToken; {get the first token} END; {InitScanner} PROCEDURE NextToken; { Read the next token from the source file } { } { Variables: } { ch - current character } { token - token read } LABEL 1; VAR digit: integer; {value of a numeric character} len: integer; {length of a stringConst or ident} s: tokens; {loop variable} BEGIN {NextToken} WHILE chTypes[ch] IN [chSpace, chDollar, chIllegal] DO BEGIN IF chTypes[ch] IN [chIllegal, chDollar] THEN BEGIN tpos := cpos; tlineNumber := lineNumber; FlagError(1); END; {if} NextCh; END; {while} tpos := cpos; {remember where this token starts} tlineNumber := lineNumber; CASE chTypes[ch] OF chLetter: BEGIN token.kind := ident; {assume it is an identifier} len := 0; {read the identifier} WHILE chTypes[ch] IN [chLetter, chDollar, chNumber] DO BEGIN IF len = nameLength THEN BEGIN FlagError(4); len := 0; END; {if} len := len + 1; IF ch IN ['a'..'z'] THEN ch := chr(ord(ch) - ord('a') + ord('A')); token.name[len] := ch; NextCh; END; {while} token.name[0] := chr(len); FOR s := tokenIndex[token.name[1]] TO {check for reserved words} pred(tokenIndex[succ(token.name[1])]) DO IF token.name = tokenNames[s] THEN BEGIN token.kind := s; GOTO 1; END; {if} 1: END; chNumber: BEGIN token.kind := intconst; token.ival := 0; WHILE chTypes[ch] = chNumber DO BEGIN digit := ord(ch) - ord('0'); IF ((token.ival = (maxint DIV 10)) AND (digit > (maxint MOD 10))) OR (token.ival > (maxint DIV 10)) THEN BEGIN FlagError(5); token.ival := 0; END; token.ival := token.ival * 10 + digit; NextCh; END; {while} END; chQuote: BEGIN token.kind := stringconst; len := 0; NextCh; WHILE NOT (chTypes[ch] IN [chQuote, chEoln, chEof]) DO BEGIN IF len = stringLength THEN BEGIN FlagError(6); len := 0; END; {if} len := len + 1; token.str[len] := ch; NextCh; END; {while} IF chTypes[ch] = chQuote THEN NextCh ELSE FlagError(7); token.str[0] := chr(len); END; chcolon: BEGIN token.kind := colon; NextCh; END; chComma: BEGIN token.kind := comma; NextCh; END; chSemicolon: BEGIN token.kind := semicolon; NextCh; END; chLParen: BEGIN token.kind := lParen; NextCh; END; chRParen: BEGIN token.kind := rParen; NextCh; END; chEq: BEGIN token.kind := eq; NextCh; END; chLt: BEGIN NextCh; IF ch = '=' THEN BEGIN token.kind := le; NextCh; END {if} ELSE IF ch = '>' THEN BEGIN token.kind := ne; NextCh; END {else if} ELSE token.kind := lt; END; chGt: BEGIN NextCh; IF ch = '=' THEN BEGIN token.kind := ge; NextCh; END {if} ELSE token.kind := gt; END; chPound: BEGIN NextCh; token.kind := ne; END; chPlus: BEGIN token.kind := plus; NextCh; END; chMinus: BEGIN token.kind := minus; NextCh; END; chMult: BEGIN token.kind := mult; NextCh; END; chDivd: BEGIN token.kind := divd; NextCh; END; chExp: BEGIN token.kind := exp; NextCh; END; chEoln: BEGIN token.kind := eolnsy; NextCh; END; chEof: token.kind := eofsy; END; {case} SpinCursor(1); IF interrupted THEN Stop(''); END; {NextToken} PROCEDURE ShutDownScanner; { Shut down the file input module } VAR objFile : FILE; objSize: longint; temp: longint; fInfo: hParamBlockRec; result: OSErr; BEGIN {ShutDownScanner} Show_Cursor(Watch_Cursor); if listSymbols then WriteLn(chr(9), chr(9), 'End'); if keep THEN BEGIN IEOpen(objFile, keepFile, O_WRONLY + O_CREAT); {open file} temp := IEIOCtl(objFile, FIOSETEOF, 0); {set EOF to 0} HLock(objBuf); objSize := GetHandleSize(objBuf); temp := ByteWrite(objFile, objBuf^^, objSize); IF temp <> objSize THEN TermError(3); Close(objFile); HUnlock(objBuf); DisposeHandle(objBuf); {set file info} with fInfo do begin ioCompletion := NIL; ioNamePtr := @keepFile; ioVRefNum := 0; ioFDirIndex := 0; ioDirID := 0; End; {with} result := PBHGetFInfo(@fInfo, False); { get existing info } if result <> noErr then TermError(3); fInfo.ioFlFndrInfo.fdType := 'B1 '; fInfo.ioFlFndrInfo.fdCreator := 'pdos'; fInfo.ioDirID := 0; { reset this so the file can be found } result := PBHSetFInfo(@fInfo, False); { set the creator & type } if result <> noErr then TermError(3); END; {if} IF Not quiet THEN BEGIN PLFlush(output); WriteLn(Diagnostic); {write the trailer} WriteLn(Diagnostic, '### ', numErrors: 1, ' errors found.'); IF maxErrorLevel <> 0 THEN WriteLn(Diagnostic, '### ', maxErrorLevel: 1, ' was the highest error level.'); END; {IF} DisposPtr(Ptr(srcBuf)); {deallocate the source file buffer} IF numErrors <> 0 THEN {set the correct error codes} retCode := RC_Abort ELSE retCode := RC_Normal; END; {ShutDownScanner} PROCEDURE TermError{err: integer}; { Handle a terminal error } { } { Parameters: } { err - terminal error number } BEGIN {TermError} CASE err OF {print the error} 0: ; {used for +t errors} 1: msg := concat('Error calling the shell.'); 2: msg := concat('Error reading ', sourceFile); 3: msg := concat('Error writing ', keepFile); 4: msg := concat('Compile aborted.'); 5: msg := concat('Out of memory.'); END; {case} retCode := RC_Abort; stop(concat('### ', progname, ' - Terminal error: ', msg)); {write the error to stdout} END; {TermError} END. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/makeout b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/makeout new file mode 100644 index 0000000..51ab6e5 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Compiler/makeout @@ -0,0 +1 @@ +Pascal -sym on BasicCom.p -o :obj: Pascal -sym on Scanner.p -o :obj: Pascal -sym on CodeGen.p -o :obj: Pascal -sym on Parser.p -o :obj: Pascal -sym on Basic.p -o :obj: Link -d -c 'MPS ' -t MPST -sym on -mf ¶ :obj:Basic.p.o :obj:Parser.p.o :obj:Scanner.p.o :obj:CodeGen.p.o :obj:BasicCom.p.o ¶ "{Libraries}"Stubs.o ¶ "{Libraries}"Runtime.o ¶ "{Libraries}"Interface.o ¶ "{PLibraries}"PasLib.o ¶ "{Libraries}"ToolLibs.o ¶ -o IntBasicIIGS \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Makefile b/IIGS.601.SRC/A.U.G/Apple.Bowl/Makefile new file mode 100644 index 0000000..77fd25e --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Makefile @@ -0,0 +1 @@ +# define object files necessary to build the compiler Sources = :compiler:Basic.p ¶ :compiler:Parser.p ¶ :compiler:Scanner.p ¶ :compiler:CodeGen.p ¶ :compiler:BasicCom.p all ÄÄ Apple.Bowl Read.Me Apple.Bowl ÄÄ Bowl.r RezIIGS Bowl.r -o Apple.Bowl Apple.Bowl ÄÄ Bowl.obj BowlBin.obj ProgAid.lib :Compiler:IntBasicLib LinkIIGS -w2 -t S16 -l >Bowl.map ¶ Bowl.obj ¶ BowlBin.obj ¶ -lib :compiler:IntBasicLib ¶ -lib ProgAid.lib ¶ -o Apple.Bowl Read.Me ÄÄ Read.Me.txt Read.Me.r Duplicate -d -y Read.Me.txt Read.Me RezIIGS Read.Me.r -o Read.Me -t $70505445 -c pdos BowlBin.obj Ä BowlBin.aii AsmIIGS BowlBin.aii -o BowlBin.obj Bowl.obj Ä Bowl.bas :Compiler:IntBasicIIGS :Compiler:IntBasicIIGS Bowl.bas -o Bowl.obj ProgAid.lib Ä ProgAid.obj Delete -i ProgAid.lib MakeLibIIGS -l ProgAid.lib -r ProgAid.obj ProgAid.obj Ä ProgAid.aii AsmIIGS ProgAid.aii -o ProgAid.obj :Compiler:IntBasicIIGS Ä {Sources} directory :Compiler: make IntBasicIIGS >makeout makeout delete makeout directory :: :Compiler:IntBasicLib Ä :Compiler:BasicLib.aii :Compiler:BasicLib.macros directory :Compiler: AsmIIGS BasicLib.aii -o :obj:BasicLib.obj Delete -i IntBasicLib MakeLibIIGS -l IntBasicLib -r :obj:BasicLib.obj directory :: \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/ProgAid.aii b/IIGS.601.SRC/A.U.G/Apple.Bowl/ProgAid.aii new file mode 100644 index 0000000..f1ab37f --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/ProgAid.aii @@ -0,0 +1 @@ +************************** * * * Apple-][ Hi-Resolution * * Graphics Subroutines * * * * By Woz 9/13/77 * * * * All Rights Reserved * * * * Converted to IIGS by * * Greg Branche 7/25/91 * * * ************************** ;----------------------------------------------- ; ; Imported addresses ; ;----------------------------------------------- IMPORT COLR IMPORT ROT IMPORT SCALE IMPORT SHAPE IMPORT ShapeTbl IMPORT X0 IMPORT Y0 IMPORT collsn ;----------------------------------------------- ; ; Forward addresses and entries ; ;----------------------------------------------- ENTRY bdrawx ENTRY cshft2 ENTRY getx0 ENTRY gety0 ENTRY hdraw ENTRY hlin ENTRY hplot1 ENTRY hposn ENTRY hposn3 ENTRY hxdraw ENTRY pcolr * Hi-Res Equates ; Direct page usage sTblPtr equ $00 ;pointer to shape table hColor1 equ $02 ;running color mask CountH equ $04 HBasL equ $06 ;base address for current hi-res line HBasH equ HBasl+1 HMask equ $0A DXL equ $0C ;Delta-X for HLin, Shape DXH equ $0D ShapeX equ $0E ;shape temp DY equ $10 ;Delty-Y for HLin, Shape QDRnt equ $12 ;ROT Quandrant (Shape) EL equ $14 ;error for HLin EH equ $15 ; soft switch locations HiRes equ $E0C057 ;switch to hi-res video MixSet equ $E0C053 ;select text/graphics mix TxtClr equ $E0C050 ;select graphics mode * * Data area * HPag RECORD Export DS.B 2 ENDR Vars RECORD X0L DS.B 1 X0H DS.B 1 My_Y0 DS.B 2 HColor DS.B 2 Hndx DS.B 2 my_scale DS.B 2 my_dp DS.B 2 UserID DS.B 2 msktbl DC.B $81 ;leftmost bit of byte DC.B $82,$84,$88 DC.B $90,$a0 DC.B $c0 ;rightmost bit of byte eq1c DC.B $1c cos DC.B $ff,$fe,$fa,$f4,$ec,$e1,$d4,$c5,$b4 DC.B $a1,$8d,$78,$61,$49,$31,$18,$ff ENDR * basic_entry - used to set up environment when called from Basic basic_entry PROC with Vars plx ;retrieve return address phb ;save DBR phk ;set to our bank plb phd ;save caller's direct page lda my_dp ;set to our direct page tcd phx ;put return address back on stack sep #$30 ;shift into 8-bit mode rts ENDP * basic_exit - used to restore environment and return to Basic basic_exit PROC rep #$30 ;back to 16-bit mode pld ;restore caller's direct page plb ;and DBR rtl ;then back to caller ENDP * * High Resolution Graphics Inits * * entry points from Apple ][ basic INIT PROC EXPORT with Vars longa on longi on phb ;save caller's DBR phk ;set to my variables plb pha ;space for returned UserID ldx #$0202 ;MMStartUp jsl $E10000 pla ;retrieve UserID sta UserID pha ;space for handle pha pea 0 pea 32 ;need 32 bytes for direct page pha ;UserID still in accumulator pea %1100000000010001 ;attributes pea 0 ;bank 0 pea 0 ldx #$0902 ;NewHandle jsl $E10000 plx ;retrieve handle pla bcc have_handle ;no errors die brk 0 ;else just die have_handle phb ;save DBR pha ;put high word of handle on stack plb ;reset DBR lda |0,x ;deref handle plb ;restore DBR plb sta my_dp ;save for use later phd ;save caller's direct page tcd ;and use mine pha ;space for handle pha pea 0 pea $4000 ;size of hi-res pages lda UserID pha ;UserID pea %1100000000010111 ;attributes pea $E0 ;bank $E0 pea $2000 ;hires buffers at $2000-$5FFF ldx #$0902 ;NewHandle jsl $E10000 plx ;retrieve handle pla bcs die ;die if we can't get the memory lda #$20 ;Init for $2000-3fff sta HPag ;hi-res screen memory sep #$20 longa off lda >hires ;set hires display mode lda >mixset ;with text at bottom lda >txtclr ;set graphics display mode lda #$E0 ;set bank byte of base pointer sta hbasl+2 rep #$20 longa on pld ;restore caller's direct page temporarily plb ;restore caller's DBR EXPORT CLEAR CLEAR jsr basic_entry ;set up environment longa off longi off lda #$0 Bkgnd0 sta hcolor1 ;set for black background lda hpag ;init hi-res screen mem sta sTblPtr+1 ;for current page, normally ldy #$0 sty sTblPtr ;$2000-3fff or $4000-5fff pea $E0E0 ;set DBR to graphics memory plb plb ;set to video memory bank bkgnd1 lda hcolor1 sta (sTblPtr),y jsr cshft2 ;(sTblPtr) will specify iny ;32 separate pages bne bkgnd1 ;throughout the init inc sTblPtr+1 lda sTblPtr+1 and #$1f ;test for done bne bkgnd1 jmp basic_exit ;return to caller EXPORT BKGND BKGND jsr basic_entry ;set up environment jsr pcolr ;background call bra bkgnd0 ENDP POSN PROC EXPORT with Vars jsr basic_entry ;set up environment jsr local_posn ;call the real routine jmp basic_exit ;then return Entry local_posn local_posn jsr pcolr ;posn call, colr from basic sta hcolor jsr gety0 ;y0 from basic pha jsr getx0 ;x0 from basic pla jsr hposn rts ENDP HPLOT PROC EXPORT jsr basic_entry ;set up environment jsr local_POSN ;plot call (basic) jsr hplot1 jmp basic_exit ENDP LINE PROC EXPORT with Vars jsr basic_entry ;set up environment lda hndx lsr a ;set hcolor1 from jsr pcolr ;basic var colr jsr hposn3 jsr getx0 ;line call. get x0 from basic txa pha tya tax jsr gety0 ;y0 from basic tay pla jsr hlin jmp basic_exit ;return to caller ENDP * draw routines DRAW PROC EXPORT jsl POSN EXPORT DRAW1 DRAW1 jsr basic_entry ;set up environment jsr bdrawx ;draw call from basic jsr hdraw jmp basic_exit ;return to caller ENDP XDRAW PROC EXPORT jsl POSN EXPORT XDRAW1 XDRAW1 jsr basic_entry ;set up environment jsr bdrawx ;ex-or draw jsr hxdraw ;from basic jmp basic_exit ENDP * hi-res graphics coordinate restore subroutine FIND PROC EXPORT with Vars jsr basic_entry ;set up environment lda hbasl asl a ;converts base adr lda hbash ;to y-coord and #$3 rol a ;for hbasl = EABABOOO ora hbasl ; hbash = PPPFGHCD asl a asl a ;generate asl a ;y-coord = ABCDEFGH sta My_Y0 lda hbash ;(PPP=screen page, lsr a ;normally 001 for lsr a ;$2000-3fff and #$7 ;hi-res screen ora My_Y0 sta My_Y0 ;converts hndx (index lda hndx ;from base adr) asl a ;and hmask (bit adc hndx ;mask) to x-coord asl a ;in (x0l, x0h) tax ;(range $0-$133) dex lda hmask and #$7f hfind1 inx lsr a bne hfind1 sta x0h txa clc ;calc hndx*7 + adc hndx ;log(base2) hmask bcc hfind2 inc x0h hfind2 sta x0l jmp basic_exit ;return to caller ENDP * hi-res graphics position and plot subroutines hposn PROC with vars sta My_Y0 ;enter with Y in A-reg. stx x0l ;xl in x-reg sty x0h ;and xh in y-reg pha and #$c0 sta hbasl ;for y-coord = 00abcdef lsr a ;calculates base address lsr a ;in hbasl, hbash for ora hbasl ;accessing screen mem sta hbasl ;via [hbasl],y addressing mode pla sta hbash asl a ;calculates asl a ;hbash = pppfghcd, asl a ;hbasl = eabab000 rol hbash asl a ;where ppp=001 for $2000-3fff rol hbash ;screen mem range and asl a ; ppp=010 for $4000-5fff ror hbasl ;(given y-coord=abcdefgh) lda hbash and #$1f ora hpag sta hbash txa ;divide x0 by 7 for cpy #$0 ;index from base addr beq hposn2 ;(quotient) and bit ldy #$23 ;within screen mem byte adc #$4 ;(mask spec'd by remainder) hposn1 iny hposn2 sbc #$7 ;subtract out sevens bcs hposn1 sty hndx ;works for x0 from tax ;0 to 279, low-order lda msktbl-249,x ;byte in x-reg sta hmask ;high in y-reg on entry tya lsr a ; if on odd byte (carry set) lda hcolor ;then rotate hcolor one ENTRY hposn3 hposn3 sta hcolor1 ;bit for 180 degree shift bcs to_cshft2 ;prior to copying to hcolor1 rts to_cshft2 jmp cshft2 ENDP hplot1 PROC lda hcolor1 ;calc bit posn in hbasl,h eor [hbasl],y ;hndx, and hmask from and hmask ;y-coord in a-reg. eor [hbasl],y ;x-coord in x,y-regs sta [hbasl],y ;for any 'l' bits of hmask rts ;substitute corrpesponding bit of hcolor1 ENDP * hi-res graphics l,r,u,d subroutines lftrt PROC with Vars bpl right ;use sign for lft/rt select left lda hmask lsr a ;shift low-order bcs left1 ;7 bits of hmask eor #$c0 ;one bit to lsb lr1 sta hmask rts left1 dey ;decr horiz index bpl left2 ldy #$27 ;wrap around screen left2 lda #$c0 ;new hmask, rightmost newndx sta hmask ;dot of byte sty hndx ;update horiz index cshift lda hcolor1 ENTRY cshft2 cshft2 asl a ;rotate low-order cmp #$c0 ;7 bits of hcolor1 bpl rts1 ;one bit posn lda hcolor1 eor #$7f ;zxyxyxyx -> zyxyxyxy sta hcolor1 rts1 rts right lda hmask asl a ;shift low-order eor #$80 ;7 bits of mask bmi lr1 ;one bit to msb lda #$81 iny ;next byte cpy #$28 bcc newndx ldy #$0 ;wrap around screen if >279 bcs newndx ;always taken * l,r,u,d, subroutines ENTRY lrudx1 lrudx1 clc ;no 90 deg rot (x-or) ENTRY lrudx2 lrudx2 lda shapex and #$4 ;if b2=0 then no plot beq lrud4 lda #$7f ;for ex-or into screen mem and hmask and [hbasl],y ;screen bit set? bne lrud3 inc collsn lda #$7f and hmask bpl lrud3 ;always taken ENTRY lrud1 lrud1 clc ;no 90-deg rot ENTRY lrud2 lrud2 lda shapex and #$4 ;if b2=0 then no plot beq lrud4 lda [hbasl],y eor hcolor1 ;set hi-res screen bit and hmask ;to corresponding hcolor1 bne lrud3 ;if bit of screen changes inc collsn ;then incr collsn detect lrud3 eor [hbasl],y sta [hbasl],y lrud4 lda shapex ;add qdrnt to adc qdrnt ;specified vector and #$3 ;and move lft, rt eq3 equ *-1 ;up, down based cmp #$2 ;on sign and carry ror a lrud bcs lftrt updwn bmi down4 ;sign for up/dwn select up clc lda hbash ;calc base address bit eq1c ;(adr of leftmost byte) bne up4 ;for next line up asl hbasl ;in (hbasl, hbash) bcs up2 ;with 192-line wraparound bit eq3 beq up1 adc #$1F ;***** bit map ***** sec bcs up3 ;for row = ABCDEFGH up1 adc #$23 pha lda hbasl ;hbasl = EABAB000 adc #$b0 ;hbash = PPPFGHCD bcs up5 adc #$f0 ;where PPP=001 for primary up5 sta hbasl ;hi-res page ($2000-3fff) pla bcs up3 up2 adc #$1f up3 ror hbasl up4 adc #$fc updwn1 sta hbash rts down clc down4 lda hbash adc #$4 ;calc base adr for next line eq4 equ *-1 ;down to (hbasl, hbash) bit eq1c bne updwn1 asl hbasl ;with 192-line wraparound bcc down1 adc #$e0 clc bit eq4 beq down2 lda hbasl adc #$50 eor #$f0 beq down3 eor #$f0 down3 sta hbasl lda hpag bcc down2 down1 adc #$e0 down2 ror hbasl bcc updwn1 * hi-res graphics line draw subroutines hlinrl stz x0l ;set (x0l,x0h) and y0 to zero for stz x0h ;rel line draw stz My_Y0 ;(dx, dy) ENTRY hlin hlin pha ;on entry sec ;xl: a-reg sbc x0l ;xh: x-reg pha ; y: y-reg txa sbc x0h sta qdrnt ;calc abs(x-x0) bcs hlin2 ;in (dxl, dxh) pla eor #$ff ;x dir to sign bit adc #$1 ;of qdrnt pha ;0=right (dx pos) lda #$0 ;1=left (dx neg) sbc qdrnt hlin2 sta dxh sta eh ;init (el,eh) to pla ;abs(x-x0) sta dxl sta el pla sta x0l stx x0h tya clc sbc My_Y0 ;calc -abs(y-0)-1 bcc hlin3 ;in dy eor #$ff adc #$fe hlin3 sta dy ;rotate y dir into sty My_Y0 ;qdrnt sign bit ror qdrnt ;(0=up, 1=down) sec sbc dxl ;init (countl, counth) tax ;to -(deltx+delty+1) lda #$ff sbc dxh sta counth ldy hndx ;horiz index bcs movex2 ;always taken movex asl a ;move in x-dir use jsr lftrt ;qdrnt b6 for lft/rt select sec movex2 lda el ;assume carry set adc dy ;(el,eh)-delty to (el,eh) sta el ;note: dy is (-delty)-1 lda eh ;carry clr if (el,eh) sbc #$0 ;goes neg hcount sta eh lda [hbasl],y ;screen byte eor hcolor1 ;plot dot of hcolor1 and hmask ;current bit mask eor [hbasl],y sta [hbasl],y inx ;done (deltx+delty) bne hlin4 ;dots? inc counth bne hlin4 ;no, continue rts hlin4 lda qdrnt ;for direction test bcs movex ;if car set, (el,eh) pos jsr updwn ;if clr, neg, move ydir clc lda el ;(el,eh)+deltx adc dxl ;to (el,eh) sta el lda eh ;car set if (el,eh) goes pos adc dxh bvc hcount ;always taken ENDP * hi-res graphics shap draw subr * * shape draw * r = 0 to 63 * scale factor used (1=normal) * hdraw PROC with Vars stx sTblPtr ;draw definition pointer sty sTblPtr+1 hdraw1 tax lsr a ;rot ($0-$3f) lsr a lsr a ;qdrnt 0=up, 1=rt lsr a ;2=dwn, 3=lft sta qdrnt txa and #$f tax ldy cos,x ;save cos and sin sty dxl ;vals in dxl and dy eor #$f tax ldy cos+1,x iny sty dy hdraw2 ldy hndx ;byte index from hi-res base address stz collsn ;clear collision count phb ;save DBR pea ShapeTbl>>8 ;set DBR to shape table bank plb plb lda (sTblPtr) ;1st shape def byte hdraw3 plb hdraw3_1 sta shapex ldx #$80 stx el ;el,eh for fractional stx eh ;l,r,u,d vectors ldx my_scale ;scale factor. hdraw4 lda el sec ;if frac cos ovfl adc dxl ;then move in sta el ;specified vector bcc hdraw5 ;direction jsr lrud1 clc hdraw5 lda eh ;if frac sin ovfl adc dy ;then move in sta eh ;specified vector bcc hdraw6 ;direction +90 deg jsr lrud2 hdraw6 dex ;loop on scale bne hdraw4 ;factor lda shapex lsr a ;next 3-bit vector lsr a ;of shape def. lsr a bne hdraw3_1 ;not done this byte inc sTblPtr ;next byte of shape definition bne hdraw7 inc sTblPtr+1 hdraw7 phb ;save DBR pea ShapeTbl>>8 plb plb lda (sTblPtr,x) bne hdraw3 ;done if zero plb rts ENDP * hi-res graphics shape ex-or subroutine * * ex-or shape into screen * * rot = 0 to 3 (quandrant only) * scale is used * hxdraw PROC with Vars stx sTblPtr ;shape definition pointer sty sTblPtr+1 hxdraw1 tax lsr a ;rot ($0-$3f) lsr a lsr a ;qdrnt 0=up, 1=rt lsr a ; 2=dwn, 3=lft sta qdrnt txa and #$f tax ldy cos,x ;save cos and sin sty dxl ;vals in dxl and dy eor #$f tax ldy cos+1,x iny sty dy hxdraw2 ldy hndx ;index from hi-res base adr stz collsn ;clear collision detect phb pea ShapeTbl>>8 plb plb lda (sTblPtr) ;1st shape def byte hxdraw3 plb hxdraw3_1 sta shapex ldx #$80 stx el ;el,eh for fractional stx eh ;l,r,u,d vectors ldx my_scale ;scale factor. hxdraw4 lda el sec ;if frac cos ovfl adc dxl ;then move in sta el ;specified vector bcc hxdraw5 ;direction jsr lrudx1 clc hxdraw5 lda eh ;if frac sin ovfl adc dy ;then move in sta eh ;specified vector bcc hxdraw6 ;direction +90 deg jsr lrudx2 hxdraw6 dex ;loop on scale bne hxdraw4 ;factor lda shapex lsr a ;next 3-bit vector lsr a ;of shape def. lsr a bne hxdraw3_1 ;not done this byte inc sTblPtr ;move to next byte bne hxdraw7 inc sTblPtr+1 hxdraw7 phb pea ShapeTbl>>8 plb plb lda (sTblPtr,x) bne hxdraw3 ;done if zero plb rts ENDP bdrawx PROC with Vars lda >SCALE ;SCALE from BASIC sta my_scale lda >ROT ;ROTation from BASIC pha ;save on stack lda #ShapeTbl sta sTblPtr+1 phb ;save our DBR pea ShapeTbl>>8 ;put table's bank on stack plb plb ;and set DBR to it lda >SHAPE ;Shape from BASIC beq skip_it cmp (sTblPtr) ;>num of shapes? beq bdrwx1 bcs skip_it ;yes, range error bdrwx1 asl a bcc bdrwx2 inc sTblPtr+1 clc bdrwx2 tay ;shape no * 2 lda (sTblPtr),y ;add 2-byte index to shape table adc sTblPtr ;start address tax iny lda (sTblPtr),y adc sTblPtr+1 tay skip_it plb pla ;rot from stack rts ENDP * basic param fetch subroutines pcolr PROC lda >COLR+1 ;BASIC COLR variable bne rerr1 lda >COLR rtsb rts ENTRY getx0 getx0 lda >X0 ;BASIC variable low order byte tax lda >X0+1 ;hi order byte tay cpx #$18 sbc #$1 ;range err if >279 bcc rtsb rerr1 brk 0 ENTRY gety0 gety0 lda >Y0 ;BASIC variable cmp #$c0 ;(err if > 191) bcs rerr1 rts ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Read.Me.r b/IIGS.601.SRC/A.U.G/Apple.Bowl/Read.Me.r new file mode 100644 index 0000000..9ecfc91 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Read.Me.r @@ -0,0 +1 @@ +/* Resource fork definition for Apple Bowl's Read.Me file This file is produced by DeRezzing the real Read.Me's resource fork. This is done because Projector doesn't know how to deal with a IIGS resource fork on a file. Therefore, the Read.Me file (produced on a IIGS) must be broken apart into separate data and resource forks so that the files can be checked into Projector. If this file ever needs to be rebuilt, you should delete the 'data' blocks below, and then execute the following line: DeRezIIGS Read.Me >>Read.Me.r */ #define rStyleBlock $8012 // copied from TypesIIGS.r data 0x7001 (0x1) { $"AD00 7C02 1A00 0200 0000 0000 0FFF 0FFF" /* ­.|............. */ }; data rStyleBlock (0x1, purgeable3) { $"0000 1400 0000 0000 0000 5902 0000 0000" /* ..........Y..... */ $"0000 0000 0000 0100 4000 4800 0000 FEFF" /* ........@.H..... */ $"0008 0000 FFFF 0000 0000 FEFF 0408 0000" /* ................ */ $"FFFF 0000 0000 0300 0008 0000 FFFF 0000" /* ................ */ $"0000 0300 0408 0000 FFFF 0000 0000 1400" /* ................ */ $"0008 0000 FFFF 0000 0000 1400 0408 0000" /* ................ */ $"FFFF 0000 0000 0100 0000 010D 0000 0000" /* ...........Â.... */ $"0000" /* .. */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/Read.Me.txt b/IIGS.601.SRC/A.U.G/Apple.Bowl/Read.Me.txt new file mode 100644 index 0000000..530bbaf --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/Read.Me.txt @@ -0,0 +1 @@ +"APPLE BOWL Enjoy this realistic simulation of a bowling alley. You have complete control of the ball; APPLE keeps the score. (Order Nos. A2T0015 - tape, A2D0018 - disk)" - from "Apple" magazine, volume 1, number 3, circa 1979. Apple Bowl was originally written and released in 1979. It was written using a language called Integer BASIC, which was written by Woz (Steve Wozniak, creator of the Apple ][) when he built the original Apple 1. When the Apple ][ was created, Integer BASIC was included in every machine. Integer BASIC is a version of the BASIC programming language that deals only with fixed-point numbers (hence the name "Integer"). It was built into every Apple ][ sold until the Apple ][+ came along (the ][+ had AppleSoft built-in, just like your IIGS). Having a programming language built into your computer allows you to program the computer yourself, which means that you can tell the computer what YOU want it to do, instead of using off-the-shelf software which tells the computer what somebody ELSE thought that it should be doing. Of course, when the Apple ][ was introduced, there wasn't very much off-the-shelf software. This meant that many owners explored programming on their own, using the built-in language Integer BASIC. One of the results of this "homebrew" programming was Apple Bowl. It was a game that simulated a bowling alley, using the Apple's hi resolution graphics, and giving the user complete control over speed and "english" of the ball and the release point within the lane. The program was written to compute the actual movement of the ball based on the physics of ball and pin movement. The program also automatically kept score for the player. Fast-forward to 1991. The Byte Works (a company that produces software development tools) released a product called the Integer BASIC Compiler for the Apple IIGS. This product allowed a programmer to write programs using Integer BASIC, and then translate those programs into applications that could be executed on an Apple IIGS. One of the several Apple ][ fanatics within the Apple ][ software group at Apple Computer saw the possibilities of the compiler, and decided to update Apple Bowl. The Apple Bowl that accompanies this Read.Me file is the result of about a month's worth of after-hours work. It started with the original Apple Bowl program, which was modified slightly to get it working with the compiler. The result is an Apple IIGS game that combines the best of the old with the best of the new. Instructions are included within the game itself. To install Apple Bowl to another disk, you can either use the Installer program, or you can simply drag the Apple.Bowl icon from this disk to your disk using the Finder. You may also want to drag the AppleBowl.Icon file from the Icons folder to the Icons folder on your disk. (Please note that the Installer does not do this.) To run the program, simply Open the icon from within the Finder (just as you would for any other IIGS application). This version of Apple Bowl was produced as a labor of love for the Apple ][. It certainly doesn't meet the standards of today's games, but it can be a lot of fun and maintains a link with the Apple ]['s long history. My only hope is that you receive some enjoyment from it. Greg Branche January, 1992 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Apple.Bowl/all.makeout b/IIGS.601.SRC/A.U.G/Apple.Bowl/all.makeout new file mode 100644 index 0000000..55f8452 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Apple.Bowl/all.makeout @@ -0,0 +1 @@ +Set Echo 1 RezIIGS Bowl.r -o Apple.Bowl directory :Compiler: make IntBasicIIGS >makeout makeout delete makeout directory :: :Compiler:IntBasicIIGS Bowl.bas -o Bowl.obj AsmIIGS BowlBin.aii -o BowlBin.obj AsmIIGS ProgAid.aii -o ProgAid.obj Delete -i ProgAid.lib MakeLibIIGS -l ProgAid.lib -r ProgAid.obj directory :Compiler: AsmIIGS BasicLib.aii -o :obj:BasicLib.obj Delete -i IntBasicLib MakeLibIIGS -l IntBasicLib -r :obj:BasicLib.obj directory :: LinkIIGS -w2 -t S16 -l >Bowl.map ¶ Bowl.obj ¶ BowlBin.obj ¶ -lib :compiler:IntBasicLib ¶ -lib ProgAid.lib ¶ -o Apple.Bowl Duplicate -d -y Read.Me.txt Read.Me RezIIGS Read.Me.r -o Read.Me -t $70505445 -c pdos \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Build.All b/IIGS.601.SRC/A.U.G/Build.All new file mode 100644 index 0000000..a5504ed --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Build.All @@ -0,0 +1 @@ +# # Build.All # 15 May 89 # # This Script builds all the AUG files for the 6.0 disk: # # ADU # Installer # Finder # Control Panel and CDevs # VideoMix stuff # CDRemote # GSCalcNDA # EasyAccess stuff # # 2/1/90 Mensch # Add Closeview stuff... # # 11/05/90 Branche # Add GSCalcNDA stuff... # ################################################################## directory ADU BuildProgram {Parameters} ADV.DISK.UTIL directory ::Finder BuildProgram {Parameters} Finder directory :EasyMount: BuildProgram {Parameters} EasyMount directory :::Installer BuildProgram {Parameters} Installer BuildProgram {Parameters} Installer.Dev directory ::ctlpanel BuildEverything {Parameters} directory ::CDRemote BuildProgram {Parameters} CDRemote directory ::GSCalcNDA BuildProgram {Parameters} GSCalc.NDA directory ::VideoMix:VideoMix.NDA BuildProgram {Parameters} VideoMix.NDA directory ::VideoMix.INIT BuildProgram {Parameters} AppleIIVOC.INIT directory :::CloseView BuildProgram {Parameters} CloseView directory ::VideoKeyboard BuildProgram {Parameters} VideoKeyboard directory ::MediaCtl BuildEverthing {parameters} directory ::EasyAccess BuildProgram {parameters} EasyAccess directory ::Apple.Bowl Echo "# `Date -t` --- This is actually building AppleBowl" BuildProgram {parameters} all directory :: \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CDRemote/CDRemote.aii b/IIGS.601.SRC/A.U.G/CDRemote/CDRemote.aii new file mode 100644 index 0000000..57c1e3c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CDRemote/CDRemote.aii @@ -0,0 +1 @@ + PRINT NOHDR * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * File: CDRemote.aii * * * * Module for CD-Remote (A New Desk Accessory) * * * * Author: Don Brady * * * * Build File: CDRemote.make * * * * Copyright © APPLE Computer, Inc. 1987,1988 * * All Rights Reserved. * * * * Modification History: * * Version 1.0 * * 01/18/88 Released A1 today * * 02/11/88 Released A2 today * * 02/17/88 Converted to MAX (from APW) today * * 03/21/88 Release A4 today * * 04/01/88 Release B1 today * * 04/13/88 Release B2 (informal) today * * 04/15/88 Release B3 today * * 04/17/88 Release B4 (informal) today * * 04/18/88 Final Release of 1.0 today * * * * Version 1.1 * * 07/26/88 DJB - Added CDBusy flag * * 09/01/88 DJB - Added call to _FlashMenuBar for key presses * * * * Version 1.2 * * 12/02/88 DJB - Changes made for Matt's new CD Driver * * 04/13/89 DJB - Changed from HeartBeatTask to RunQueueTask * * * * Version 1.3 - Maintenance by Cary Farrier * * 11/01/90 CAF - Fixed Bug 60966 in DoAudioR,L. * * * * Version 1.3d2 - Maintenance by Dave Lyons * * 23-Jan-91 - Made window create invisible so I can set the * * background pattern to black before it draws the * * first time. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PRINT OFF INCLUDE 'Draw.equ' INCLUDE 'CDRemote.equ' INCLUDE 'all.macros' PRINT ON *===============================================* * The standard NDA Header * *===============================================* NDAHeader PROC IMPORT (NDAOpen,NDAClose,NDAAction,NDAInit):CODE STRING ASIS DC.L NDAOpen DC.L NDAClose DC.L NDAAction DC.L NDAInit DC.W 60 ;period (60 ticks = 1 sec) DC.W $014E ;event mask DC.B '--CD Remote\H**' ;menu text DC.B 13 DC.B 'ver 1.3/' ;...for load file dumps DC.B '© Copyright Apple Computer, Inc.1987-92' STRING PASCAL ENDP *===============================================* * Data for NDA * *===============================================* CDData RECORD ENTRY ABMode:DATA EXPORT CDAFrame:DATA EXPORT CDAMin:DATA EXPORT CDASec:DATA EXPORT CDATime:DATA ENTRY CDAudio:DATA ENTRY CDButton:DATA EXPORT CDCurTrk:DATA EXPORT CDIndex:DATA ENTRY DidAlert:DATA ENTRY CDError:DATA EXPORT CDFrame:DATA ENTRY CDFrameA:DATA EXPORT CDFrameB:DATA ENTRY CDMaxTrk:DATA EXPORT CDMin:DATA ENTRY CDMinA:DATA EXPORT CDMinB:DATA EXPORT CDMinTrk:DATA ENTRY CDMode:DATA ENTRY CDPMode:DATA ENTRY CDRepeat:DATA ENTRY CDScan:DATA EXPORT CDSec:DATA ENTRY CDSecA:DATA EXPORT CDSecB:DATA EXPORT CDTrack:DATA EXPORT CDTrkCnt:DATA ENTRY CDWait:DATA ENTRY CDWinPtr:DATA ENTRY CDWinRec:DATA ENTRY Modifier:DATA ENTRY Point:DATA ENTRY TimeMode:DATA ENTRY WinPtr2:DATA ENTRY EndRec:DATA ENTRY EndRec2:DATA ENTRY WinRec2:DATA ENTRY WaitCur:DATA ENTRY ItemString:DATA ENTRY ErrString1:DATA ENTRY ErrString2:DATA ENTRY ErrString3:DATA ENTRY ErrString4:DATA ENTRY EndString1:DATA ENTRY EndString2:DATA ENTRY EndString3:DATA ENTRY EndString4:DATA ENTRY ErrStrPtr:DATA ENTRY ErrStrRect:DATA ENTRY OldWinPtr:DATA ENTRY AlertTemplate:DATA ENTRY WindowRect:DATA ENTRY WindowRect2:DATA * ENTRY ErrorCode:DATA * ENTRY SenseKey:DATA * ENTRY SenseCode:DATA * ENTRY CDAlert:DATA ENTRY MaxIndex:DATA ENTRY CurIndex:DATA ENTRY TrackMap:DATA ENTRY CDTask:DATA ENTRY CDDataDisc:DATA ENTRY CDBusy:DATA ENTRY TaskInQueue:DATA ; ENTRY NullTask:DATA ENTRY AudioWait:DATA ;--------------- FLAGS ---------------- CDError DC.W $8000 ;0 = ok, else error CDPMode DC.W 0 ;$01=shuffle, $02=AB-repeat CDMode DC.W 0 ;0=stop,1=play,2=pause,3=no disc CDRepeat DC.W 0 ;0 = off, 1 = on DidAlert DC.W 0 ;­ 0: did error alert, 0 = not yet CDAudio DC.W $C000 ;bit 15=left, bit 14=right CDWait DC.W 0 ;timer CDScan DC.W 0 ;0 = off, 1 = on ABMode DC.W 0 TimeMode DC.W 0 ;0 = elapsed, 1 = remaining Modifier DC.W 0 ;Event record modifier flags WaitCur DC.W 0 ;1 = wait cursor on, 0 = off CDTask DC.W 0 ;0 = no task, ­ 0 is a task CDDataDisc DC.W 0 ;0 = not data, ­ 0 is only data CDBusy DC.W 0 ;­ 0: CD-Remote is busy TaskInQueue DC.W 0 ;­ 0: my task is in the queue ;NullTask DC.W 0 ;­ 0: means don't do task anymore AudioWait DC.W 0 ;­ 0: if we are waiting for play completion ;---------- Current settings ---------- Point DC.L 0 ;mouse coordinates (y,x) CDTrack DC.W 0 CDIndex DC.W 0 CDTrkCnt DC.W 0 ;integer number of tracks CDMinTrk DC.W 0 CDMaxTrk DC.W 0 CDCurTrk DC.W 0 ;track from Q-sub channel CDMin DC.W 0 ;time (track relative) CDSec DC.W 0 CDFrame DC.W 0 CDAMin DC.W 0 ;time (absolute) CDASec DC.W 0 CDAFrame DC.W 0 CDButton DC.W 0 ;button pushed CDMinA DC.W 0 ;AB starting point CDSecA DC.W 0 CDFrameA DC.W 0 CDMinB DC.W 0 ;AB ending point CDSecB DC.W 0 CDFrameB DC.W 0 CDATime DS.B 200 ;(2*100) absolute time table CurIndex DC.W 0 MaxIndex DC.W 0 TrackMap DS.B 100 ;--------- Window Data ---------------- OldWinPtr DC.L 0 ;space for _GetPort CDWinPtr DC.L 0 CDTitle DC.B 'CD Remote' ;window title CDWinRec DC.W EndRec-CDWinRec ;data length DC.W $C089 ;frame bits (was $C0A9 23-Jan-91 DAL; made it initially invisible) DC.L CDTitle ;title ptr DC.L 0 ;RefCon DC.W 0,0,0,0 ;full size DC.L 0 ;color table ptr DC.W 0 ;vertical org DC.W 0 ;horizontal org DC.W 0 ;data area height DC.W 0 ;data area width DC.W 0 ;max cont height DC.W 0 ;max cont width DC.W 0 ;vert scroll pixels DC.W 0 ;hort scroll pixels DC.W 0 ;vert page pixels DC.W 0 ;hort page pixels DC.L 0 ;info bar text ptr DC.W 0 ;info bar height DC.L 0 ;DefProc DC.L 0 ;draw info bar routine DC.L 0 ;draw content routine WindowRect DC.W w1Y,w1X,w1Y+dvW1,w1X+dhW1 ;rect DC.L $FFFFFFFF ;window plane DC.L 0 ;0 = allocate win record EndRec WinPtr2 DC.L 0 WinRec2 DC.W EndRec2-WinRec2 ;data length DC.W %0010000000100001 ;frame bits DC.L 0 ;title ptr DC.L 0 ;RefCon DC.W 0,0,0,0 ;full size DC.L 0 ;color table ptr DC.W 0 ;vertical org DC.W 0 ;horizontal org DC.W 0 ;data area height DC.W 0 ;data area width DC.W 0 ;max cont height DC.W 0 ;max cont width DC.W 0 ;vert scroll pixels DC.W 0 ;hort scroll pixels DC.W 0 ;vert page pixels DC.W 0 ;hort page pixels DC.L 0 ;info bar text ptr DC.W 0 ;info bar height DC.L 0 ;DefProc DC.L 0 ;draw info bar routine DC.L 0 ;draw content routine WindowRect2 DC.W w2Y,w2X,w2Y+dvW2,w2X+dhW2 ;rect DC.L $FFFFFFFF ;window plane DC.L 0 ;0 = allocate win record EndRec2 ;--------- Alert Data ---------------- STRING PASCAL ItemString DC.B 'OK' STRING ASIS ErrString1 DC.B EndString1-ErrString1-1 DC.B 'The AppleCD SCª drive can-' DC.B $0D DC.B 'not be found. Please check' DC.B $0D DC.B 'your SCSI cables and SCSI' DC.B $0D DC.B 'priority assignments.' EndString1 ErrString2 * DC.B EndString2-ErrString2-1 ;this string no longer used * DC.B 'The AppleII SCSI Card ROM' * DC.B $0D * DC.B 'needs to be upgraded to be' * DC.B $0D * DC.B 'compatible with the drive' * DC.B $0D * DC.B 'AppleCD SCª.' EndString2 ErrString3 * DC.B EndString3-ErrString3-1 * DC.B 'The AppleII SCSI Card can-' ;this string no longer used * DC.B $0D * DC.B 'not be found. Please check' * DC.B $0D * DC.B 'your I/O expansion slots' * DC.B $0D * DC.B 'and Control Panel settings.' EndString3 ErrString4 DC.B EndString4-ErrString4-1 DC.B 'I am sorry, but GS/OS is' DC.B $0D DC.B 'needed to run this desk' DC.B $0D DC.B 'accessory.' EndString4 STRING PASCAL Item1Template DC.W 1 ;item ID DC.W aDY-17,(aDX-80)/2,aDy-6,(aDX+80)/2 DC.W $000A ;item type DC.L ItemString ;item descriptor DC.W 0 ;item value DC.W 0 ;item flag DC.L 0 ;item color table Item2Template DC.W 3 ;item ID ErrStrRect DC.W 4,76,aDY,aDX ;item rect DC.W $800F ;item type ErrStrPtr DC.L ErrString3 ;item descriptor DC.W 0 ;item value DC.W 0 ;item flag DC.L 0 ;item color table AlertTemplate DC.W aY,aX,aY+aDY,aX+aDX DC.W 1 ;alert ID DC.B $80,$80,$80,$80 ;stage bytes DC.L Item1Template ;button item DC.L Item2Template ;string item DC.L 0 ENDR *===============================================* * Open up the NDA window (required NDA routine) * * * * INPUT: none * * * * OUTPUT: window pointer (stack) * * * *===============================================* NDAOpen PROC IMPORT ReadTOC IMPORT DoAlert IMPORT DoStop IMPORT SPRezero IMPORT SPOnLine IMPORT InitRnd IMPORT InitAB IMPORT AReadQ IMPORT AStatus IMPORT AStopTrack IMPORT SPInit2 IMPORT NormalOrder IMPORT BCD2Int IMPORT SystemTask phb phk plb ;for absolute addressing lda CDBusy beq cont0 brl exit ;we are already running lda #true sta CDBusy cont0 lda CDTask ;was there a task? beq cont1 PushLong #SystemTask _RemoveFromRunQ ;remove background task cont1 lda CDWinPtr ora CDWinPtr+2 beq cont2 brl exit ;ignore if already open cont2 PushWord _GetMasterSCB ;check for 320 mode pla and #$0080 beq mode320 lda #w1X+dhW1 bra open mode320 lda #w1X+dhW1/2 open sta WindowRect+6 ;set window's width PushLong #0 ;open the DA's window PushLong #CDWinRec _NewWindow pla sta OldWinPtr pla sta OldWinPtr+2 ora OldWinPtr bne mark brl exit ;some error occured! mark PushLong OldWinPtr ;mark as system window _SetSysWindow *** added 23-Jan-91 DAL pha pha _GetPort ;preserve port pushlong OldWinPtr _SetPort ;set port to our (still invisible) window pha pha ;space for Get640Colors result ldx #$da04 jsl $e10000 ; _Get640Colors ;get pointer to Black pattern (first pattern in table) _SetBackPat _SetPort ;restore port PushLong OldWinPtr _ShowWindow *** end of 23-Jan-91 DAL lda CDTask ;was there a task? beq setUp stz CDTask ;turn off flag ; lda NullTask ; bne setUP ;must be a new disc jsr AReadQ ;get the time brl exit ;but do not init setUP lda CDError ;everything okay? beq okay ;yes cmp #errNotP16 ;was it a GS/OS issue? bne bad ;no shortm ;backdoor into DA ! lda >keyModReg ;check open-apple-key longm and #openAppleKey beq bad ;key not down jsr SPInit2 ;initialze SmartPort data sta CDError bcs bad ;init error occured bra okay bad lda #mdNoDrive sta CDMode bra exit okay jsr SPOnLine ;disc on line? bcc disc ;yes lda #mdNoDisc sta CDMode bra exit disc jsr ReadTOC ;set min & max track jsr NormalOrder lda CDDataDisc bne exit ;not an audio disc jsr AStatus ;check if CD playing cmp #audioPlay ;in play ? beq play ;yes cmp #audioPause ;in pause ? beq pause ;yes jsr DoStop bra exit pause lda #mdPause bra play2 play lda #mdPlay play2 sta CDMode jsr AReadQ ;get current track lda CDCurTrk sta CDTrack ;set to current track jsr BCD2Int dec a ;zero relative index sta CurIndex ;set to current index lda CDTrack jsr AStopTrack ;set stop address exit lda OldWinPtr+2 ;pass back window ptr sta CDWinPtr+2 sta 7,s lda OldWinPtr sta CDWinPtr sta 5,s stz CDBusy plb rtl ENDP *===============================================* * Close the NDA window (required NDA routine) * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* NDAClose PROC IMPORT AStopTrack IMPORT SPOnLine IMPORT SystemTask IMPORT AStatus phb phk plb lda CDBusy bne exit ;we are already running lda #true sta CDBusy lda CDWinPtr ora CDWinPtr+2 beq exit ;ignore if inactive PushLong CDWinPtr _CloseWindow stz CDWinPtr+2 stz CDWinPtr lda CDError bne exit ;no CD device found! lda CDDataDisc bne exit ;not an Audio Disc! jsr SPOnLine bcs exit ;no disc in drive! jsr AStatus cmp #audioPlay ;currently playing? beq task cmp #audioComplete ;completed play ? beq task cmp #audioVoid ;completed play ? bne exit lda AudioWait bne exit task PushLong #SystemTask ;start task to keep DA alive _AddToRunQ ;while it is closed. lda #true sta CDTask exit stz CDBusy plb rtl ENDP *===============================================* * Init the NDA (required NDA routine) * * * * INPUT: A-Reg (0=shutdown, 1=startup) * * * * OUTPUT: none * * * *===============================================* NDAInit PROC SystemType equ $E100BC ;system type byte (0 = P8, 1 = P16) IMPORT SPInit IMPORT SPOnLine IMPORT AStopTrack IMPORT SetRndL IMPORT SetABL IMPORT SystemTask IMPORT AStatus IMPORT NormalOrder phb phk plb tax lda >SystemType ;check which operating system and #$00FF cmp #1 ;is it GS/OS ? bne exit ;no cpx #0 beq gameOver ;shutdown call jsr SPInit ;initialze SmartPort data sta CDError bcs exit ;init error occured PushLong #0 _GetTick _SetRandSeed ;set up start seed bra exit gameOver lda CDTask ;was there a task? beq cont PushLong #SystemTask _RemoveFromRunQ ;remove background task stz CDTask cont stz DidAlert lda CDError bne exit ;no CD device found lda #0 sta CDPMode ;turn off Shuffle/AB jsr SetRndL ;tell DrawButton lda #abOff sta ABMode ;turn off AB jsr SetABL ;tell DrawButton jsr SPOnLine bcs exit ;no disc jsr AStatus cmp #audioPlay bne exit ;not playing jsr NormalOrder ldy MaxIndex lda TrackMap,y ;get the last audio track and #$00FF beq exit jsr AStopTrack ;set stop address to last track exit plb rtl ENDP *===============================================* * Process NDA action (required NDA routine) * * * * INPUT: A-Reg = type of action * * X & Y-Reg = event pointer * * * * OUTPUT: A-Reg (return flag) * * * *===============================================* NDAAction PROC evtptr equ 5 IMPORT (DoActivate,DoUpdate,DoMouse,DoAbout,DoStop):CODE IMPORT (DoAction,ButtonDown,ButtonUp,NewTime,NewDisc):CODE IMPORT (NextTrack,AStatus,AReadQ,SPOnLine):CODE IMPORT DrawTrack IMPORT DrawMode IMPORT DoKey IMPORT TestAudioTrack phb phk plb phy phx ;save event ptr asl A pha ;action offset PushLong #0 _GetPort PullLong OldWinPtr PushLong CDWinPtr ;set port to NDA window _SetPort plx lda CDBusy bne didAction ;CD-Remote is busy lda #$FFFF sta CDBusy ;we are busy jsr (Actions,x) ;process the action stz CDBusy ;we are not busy didAction PushLong OldWinPtr _SetPort ;restore port pla pla plb lda #0 ;return flag rtl Actions DC.W DoIgnore DC.W DoEvent DC.W DoRun DC.W DoCursor DC.W DoMenu DC.W DoUndo DC.W DoCut DC.W DoCopy DC.W DoPaste DC.W DoClear DoIgnore ;do nothing for these actions DoCursor DoMenu DoUndo DoCut DoCopy DoPaste DoClear rts *----------------------------------------------- DoRun lda CDError bne endRun jsr SPOnLine ;disc in drive ? bcs endRun ;no lda CDDataDisc bne endRun ;not an audio disc jsr AStatus cmp #audioPlay ;in play state ? beq draw ;yes cmp #audioComplete ;completed play ? beq next ;yes cmp #audioVoid ;if void and we were waiting then it bne cont ;counts as "audioComplete" lda AudioWait bne next cont cmp #audioPause ;in pause state ? beq endRun ;yes lda #mdStop sta CDMode jsr DrawMode ;force a STOP mode bra endRun next jsr NextTrack ;get next selection to play bra endRun draw jsr AReadQ ;read Q Subcode jsr NewTime ;update time display * lda CDCurTrk ;did we cross a track ? * cmp CDTrack * beq endRun ;same so exit * jsr DrawTrack ;update track display endRun rts *----------------------------------------------- DoEvent phd tsc tcd ldy #10 lda [evtptr],y ;Event.where.y sta Point iny iny lda [evtptr],y ;Event.where.x sta Point+2 iny iny lda [evtptr],y ;Event.modifier sta Modifier lda [evtptr] ;Event.what pld cmp #10 bcs endEvent ;undefined event! asl A tax jsr (Events,x) ;process event endEvent rts Events DC.W DoIgnore ;null DC.W DoMouse ;mouse down DC.W DoIgnore ;mouse up DC.W DoKey ;key down DC.W DoIgnore ;undefined DC.W DoIgnore ;auto key down DC.W DoUpdate ;update event DC.W DoIgnore ;undefined DC.W DoActivate ;activate DC.W DoIgnore ;switch ENDP *===============================================* * Process An Activate Event * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* DoActivate PROC IMPORT DoAlert lda Modifier ;check flag and #$0001 beq exit lda DidAlert bne exit ;already told user lda CDError beq exit jsr DoAlert ;tell user about error lda #true sta DidAlert exit rts ENDP *===============================================* * Update The NDA Window * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* DoUpdate PROC IMPORT NewTime IMPORT DrawTrack IMPORT DrawText IMPORT DrawWin IMPORT DrawMode PushLong CDWinPtr _BeginUpdate jsr DrawWin ;draw window's contents lda CDTrack jsr DrawTrack ;draw track display jsr NewTime ;draw time display lda CDMode jsr DrawMode ;draw mode display lda TimeMode clc adc #11 ;text offset jsr DrawText ;draw time mode PushLong CDWinPtr _EndUpdate rts ENDP *===============================================* * Process a Key event in NDA Window * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* DoKey PROC ; _FlashMenuBar ;tell user I eat keys rts ENDP *===============================================* * Process a mouse event in NDA Window * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* DoMouse PROC bRectPtr equ 1 IMPORT DoAction IMPORT ButtonDown IMPORT ButtonUp IMPORT DoAbout IMPORT DoAlert IMPORT DrawButton IMPORT IconRectPtr IMPORT RectTblPtr PushLong RectTblPtr ;direct page pointer tsc phd tcd PushLong #Point _GlobalToLocal lda #0 @loop pha ;find which button asl a asl a inc a inc a tay PushWord PushLong #Point ;mouse position lda [bRectPtr],y ;button coordinates pha dey dey lda [bRectPtr],y pha _PtInRect ;was mouse in button ? pla bne found ;yes pla inc A cmp #14 ;valid data ? bcs next bra @loop found pla ;button number sta CDButton bra down next PushWord PushLong #Point ;mouse position PushLong IconRectPtr ;icon's coordinates _PtInRect ;was mouse in icon ? pla bne about ;yes brl exit about jsr DoAbout ;open about window brl exit down lda CDError beq okay jsr DoAlert ;tell user about error brl exit okay jsr ButtonDown ;process button track1 PushWord #0 ;wait until button up PushWord #0 _StillDown ;is button still down ? pla bne action ;yes brl up action jsr DoAction PushLong #Point ;track button _GetMouse PushWord #0 PushLong #Point lda CDButton asl a asl a inc a inc a tay lda [bRectPtr],y ;button coordinates pha dey dey lda [bRectPtr],y pha _PtInRect ;is mouse still in button ? pla bne track1 ;yes lda CDButton jsr DrawButton ;draw button up track2 PushWord #0 PushWord #0 _StillDown ;is button still down ? pla beq up ;no ; jsr DoAction PushLong #Point _GetMouse PushWord #0 PushLong #Point lda CDButton asl a asl a inc a inc a tay lda [bRectPtr],y ;button coordinates pha dey dey lda [bRectPtr],y pha _PtInRect ;is mouse back in button ? pla beq track2 ;no lda CDButton ora #$8000 jsr DrawButton ;draw button down brl track1 up jsr ButtonUp exit pld ;clean-up pla pla rts ENDP *===============================================* * Process a Button Down Event * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* ButtonDown PROC IMPORT NewTime IMPORT InitRnd IMPORT RndOff IMPORT InitAB IMPORT SPOnLine IMPORT SPRezero IMPORT DrawMode IMPORT DrawText IMPORT DrawButton IMPORT DrawTrack IMPORT AStatus IMPORT AReadQ IMPORT AScanF IMPORT AScanR IMPORT AEject IMPORT APause IMPORT ASeekTrack IMPORT AStopTime IMPORT AStopTrack IMPORT APlayTrack IMPORT APlayTime IMPORT APlayModeTime IMPORT APlayMode IMPORT SetLAudL IMPORT SetRAudL IMPORT SetRepL IMPORT SetRndL IMPORT SetABL IMPORT NextTrack IMPORT NormalOrder IMPORT RandomOrder IMPORT DrawTime lda CDButton cmp #14 ;valid data ? bcs exit ora #$8000 jsr DrawButton lda CDButton cmp #bTime ;always allow time beq okay cmp #bRepeat ;always allow repeat beq okay jsr SPOnLine ;is a disc online ? bcs exit ;no, so do nothing lda CDButton cmp #bEject ;allow eject for Data Disc beq okay lda CDDataDisc bne exit ;not an audio disc (ie data) okay lda #actWait sta CDWait lda CDButton asl A tax jmp (Funct,x) ;process button exit rts Funct DC.W DoStop ;Stop DC.W DoPlay ;Play DC.W DoPause ;Pause DC.W DoEject ;Eject DC.W DoSkipR ;Skip Reverse DC.W DoSkipF ;Skip Forward DC.W DoScanR ;Scan Reverse DC.W DoScanF ;Scan Forward DC.W DoAudioL ;Audio Left DC.W DoAudioR ;Audio Right DC.W DoRepeat ;Loop Repeat DC.W DoAB ;AB Repeat DC.W DoRandom ;Shuffle Play DC.W DoTime ;Change Time *------------------------------------------------ EXPORT DoStop ENTRY DoStop DoStop stz AudioWait ;no longer waiting for completion lda #mdStop sta CDMode jsr InitAB ;reset AB stuff ldy #0 sty CurIndex lda TrackMap,y and #$00FF sta CDTrack stz CDMin stz CDSec stz CDFrame stz CDIndex ;these are zero for future displays lda #0 jsr AStopTrack ;force an audio stop lda CDWinPtr ora CDWinPtr+2 beq stEnd ;don't draw ldx #0 lda #0 jsr DrawTime ;draw 00:00 lda CDTrack jsr DrawTrack ;update track display lda #mdStop jsr DrawMode ;update display stEnd rts *------------------------------------------------ DoPlay lda CDPMode cmp #mABRept beq dpEnd ;ignore play during AB repeat jsr AStatus cmp #audioPlay ;in play state ? beq dpEnd ;yes cmp #audioPause ;in pause state ? bne dpPlay lda CDMode cmp #mdPause beq dpRelease dpPlay lda CDTrack jsr AStopTrack ;set stop address bcs dpEnd ;error lda CDTrack jsr APlayTrack ;start playing bcs dpEnd ;error lda #true sta AudioWait lda #mdPlay sta CDMode jsr DrawMode ;update display bra dpEnd DoPause jsr AStatus cmp #audioComplete ;completed play ? bne dpCont jsr NextTrack ;get next selection to play bra dpEnd dpCont cmp #audioPlay ;in play state ? beq dpPause ;yes cmp #audioPause ;in pause state ? bne dpEnd ;no lda CDMode cmp #mdPause beq dpRelease bra dpEnd dpPause lda #mdPause sta CDMode jsr DrawMode ;update display lda #1 ; fliped polarity DJB 12/2/88 bra dpDoIt dpRelease lda #mdPlay sta CDMode jsr DrawMode ;update display lda #0 dpDoIt jsr APause ;set/release pause dpEnd rts *------------------------------------------------ DoEject stz AudioWait ;no longer waiting for completion jsr AEject rts *------------------------------------------------ ENTRY DoSkipR DoSkipR jsr InitAB ;abort any AB stuff ldy CurIndex bne dsDec ldy MaxIndex bra dsCont dsDec dey bra dsCont ENTRY DoSkipF DoSkipF jsr InitAB ;abort any AB stuff ldy CurIndex cpy MaxIndex bcc dsInc ldy #0 bra dsCont dsInc iny dsCont sty CurIndex lda TrackMap,y and #$00FF sta CDTrack jsr DrawTrack ;update track display dsEnd rts *------------------------------------------------ DoScanF lda ABMode cmp #abOn ;don't scan during AB-repeat beq dsEnd jsr AStatus cmp #audioPlay ;in play state ? bne dsEnd lda #1 sta CDScan lda CDAFrame ldx CDASec ldy CDAMin jsr AScanF ;start forward scan rts DoScanR lda ABMode cmp #abOn ;don't scan during AB-repeat beq dsEnd jsr AStatus cmp #audioPlay ;in play state ? bne dsEnd lda #1 sta CDScan lda CDAFrame ldx CDASec ldy CDAMin jsr AScanR ;start reverse scan rts *------------------------------------------------ DoRepeat lda CDRepeat eor #$01 ;flip flag sta CDRepeat jsr SetRepL ;tell DrawButton rts *----------------------------------------------- DoAudioL lda CDAudio eor #$8000 ;flip it sta CDAudio jsr SetLAudL ;tell DrawButton lda CDAudio bne daFind lda #$4000 ;force right back on sta CDAudio jsr SetRAudL ;tell DrawButton lda #bAudioR jsr DrawButton ;redraw Button bra daFind DoAudioR lda CDAudio eor #$4000 ;flip it sta CDAudio jsr SetRAudL ;tell DrawButton lda CDAudio bne daFind lda #$8000 ;force left back on sta CDAudio jsr SetLAudL ;tell DrawButton lda #bAudioL jsr DrawButton ;redraw Button dafind lda CDAudio cmp #$c000 ;stereo ? bne daCont1 ldx #$09 bra daSet daCont1 cmp #$8000 ;left only ? bne daCont2 ldx #$0A bra daSet daCont2 cmp #$4000 ;right only ? bne daEnd ldx #$05 daSet lda CDPMode cmp #mABRept beq daAB lda CDMode ; CAF 11/01/90 cmp #mdPlay ; are we playing something ? bne daEnd ; no -> txa jsr APlayMode lda #true sta AudioWait bra daEnd daAB txa jsr APlayModeTime daEnd rts *------------------------------------------------ DoRandom lda CDPMode cmp #mShuffle bne drSet jsr NormalOrder ;set TrackMap ldy #0 @invMap lda TrackMap,y ;find index from track and #$00FF cmp CDTrack beq drTrk iny bra @invMap drTrk sty CurIndex lda #0 bra drEnd drSet jsr InitAB ;turn off AB jsr RandomOrder ;set TrackMap ldy #0 sty CurIndex lda TrackMap,y ;get "first" track and #$00FF sta CDTrack jsr DrawTrack lda CDTrack jsr AStopTrack lda CDMode cmp #mdStop beq drStop lda CDTrack jsr APlayTrack ;and play it lda #true sta AudioWait lda #mdPlay sta CDMode jsr DrawMode ;update display lda #mShuffle bra drEnd drStop lda CDTrack jsr ASeekTrack ;and seek there lda #mShuffle drEnd sta CDPMode jsr SetRndL ;tell DrawButton rts *------------------------------------------------ DoTime lda TimeMode eor #$0001 ;flip it sta TimeMode clc adc #11 ;text offset jsr DrawText ;update mode display jsr NewTime ;update time display rts *------------------------------------------------ DoAB lda ABMode cmp #abOn bne abCont2 lda CDTrack jsr AStopTrack ;reset stop address lda #0 ;turn off AB mode sta CDPMode jsr AStatus ;check for play cmp #audioComplete ;end of play? beq abPlay cmp #audioVoid ;end of play? bne abCont1 abPlay lda CDFrameB ldx CDSecB ldy CDMinB jsr APlayTime ;start playing at B lda #true sta AudioWait abCont1 lda #abOff brl abDraw abCont2 lda CDMode cmp #mdStop ;in stop mode ? bne abCont3 ;no brl abEnd abCont3 lda ABMode cmp #abSetA beq setA cmp #abSetB beq setB jsr RndOff ;turn off shuffle ! lda #abSetA brl abDraw setA jsr AReadQ ;read current time lda CDAMin ;A <-- current sta CDMinA lda CDASec sta CDSecA lda CDAFrame sta CDFrameA lda #abSetB brl abDraw setB jsr AReadQ ;read current time lda CDMinA cmp CDAMin ;A < B ? bcc abOK ;yes bne abSwitch ;no lda CDSecA cmp CDASec bcc abOK ;yes bne abSwitch ;no lda CDFrameA cmp CDAFrame bcc abOK ;yes bne abSwitch ;no lda #0 ;A = B, so reset! sta CDPMode lda #abOff bra abDraw abSwitch lda CDMinA ;B <-- A sta CDMinB lda CDSecA sta CDSecB lda CDFrameA sta CDFrameB lda CDAMin ;A <-- current sta CDMinA lda CDASec sta CDSecA lda CDAFrame sta CDFrameA bra abGo abOK lda CDAMin ;B <-- current sta CDMinB lda CDASec sta CDSecB lda CDAFrame sta CDFrameB abGo ldy CDMinB ;phrase ending time ldx CDSecB lda CDFrameB jsr AStopTime ;set phrase stop address lda CDFrameA ldx CDSecA ldy CDMinA jsr APlayTime ;start playing phrase lda #true sta AudioWait lda #mdPlay sta CDMode jsr DrawMode ;update display (in case of pause) lda #mABRept sta CDPMode lda #abOn abDraw sta ABMode jsr SetABL ;tell DrawButton abEnd rts ENDP *===============================================* * Process a Button Up Event * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* ButtonUp PROC IMPORT BCD2Int IMPORT NewTime IMPORT NextTrack IMPORT DrawButton IMPORT DrawMode IMPORT APause IMPORT AStopTrack IMPORT APlayTrack IMPORT SPOnLine IMPORT DrawTime lda CDButton jsr DrawButton ;redraw button up jsr SPOnLine ;disc online? bcs exit ;no lda CDDataDisc bne exit ;not an audio disc lda CDScan beq cont lda ABMode cmp #abOn ;don't scan during AB-repeat beq exit lda #0 ;release pause (changed from 1 DJB 12/2/88) jsr APause lda #0 ;clear scan flag sta CDScan bra exit cont lda CDButton cmp #bSkipR beq skip cmp #bSkipF bne exit skip lda CDMode cmp #mdStop ;in stop mode ? beq pretend ;yes play lda CDTrack jsr AStopTrack lda CDTrack jsr APlayTrack ;play new track lda #true sta AudioWait lda #mdPlay sta CDMode jsr DrawMode ;update display exit rts pretend stz CDMin stz CDSec stz CDFrame stz CDIndex ;these are zero for future displays ldx #0 lda #0 jsr DrawTime ;draw 00:00 bra exit ENDP *===============================================* * Do Action While Button Is Down * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* DoAction PROC IMPORT NewTime IMPORT DoSkipR IMPORT DoSkipF IMPORT AReadQ IMPORT DrawTrack IMPORT DrawTime IMPORT AStopTrack IMPORT SPOnLine IMPORT AScanF IMPORT AScanTrack phb phk plb jsr SPOnLine ;disc online ? bcc cont1 brl exit ;no cont1 lda CDDataDisc beq cont2 brl exit ;not an audio disc cont2 lda CDButton cmp #bScanR ;scan buttons ? beq scan cmp #bScanF beq scan cmp #bSkipR ;skip buttons ? bne cont4 dec CDWait ;don't do every time bne exit jsr DoSkipR lda #actWait sta CDWait bra exit cont4 cmp #bSkipF bne exit dec CDWait ;don't do every time bne exit jsr DoSkipF lda #actWait sta CDWait bra exit scan lda ABMode cmp #abOn ;don't scan during AB-repeat beq exit lda CDMode cmp #mdPlay ;only scanning from play bne exit jsr AReadQ lda CDMin ;start of disc? ora CDSec ora CDAMin beq restart ;yes lda CDCurTrk ;end of disc? beq restart ;yes cmp CDTrack ;did we cross a track ? beq cont6 ;no (same), so exit restart ldx #0 lda #0 jsr DrawTime ;draw 00:00 lda CDButton cmp #bScanF beq forward reverse jsr DoSkipR lda CDTrack jsr AStopTrack ldx #1 ;X <-- reverse bra cont5 forward jsr DoSkipF lda CDTrack jsr AStopTrack ldx #0 ;X <-- forward cont5 lda CDTrack jsr AScanTrack ;X-Reg has direction bra exit cont6 jsr NewTime ;update time display exit plb rts ENDP *===============================================* * Calculate New Time for Display * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* EXPORT NewTime NewTime PROC IMPORT BCD2Int IMPORT DrawTime lda CDIndex ;in between tracks? beq limbo ;yes lda TimeMode beq elapsed lda CDTrack beq elapsed ;just draw 00:00 jsr BCD2Int ;get integer value dec A asl A tay ;zero relative offset sed ;for BCD math lda CDATime,y and #$007F sec sbc CDASec and #$00FF php ;save carry flag pha ;save seconds lda CDATime,y xba and #$007F sbc CDAMin and #$00FF tax ;x has minutes pla plp ;was there a borrow? bcs okay ;no sec sbc #$40 ;adjust seconds okay cld ;back to normal jsr DrawTime bra exit elapsed ldx CDMin lda CDSec jsr DrawTime bra exit limbo ldx #0 lda #0 jsr DrawTime ;draw 00:00 exit rts ENDP *===============================================* * Test Audio Track * * - make sure track is an audio track * * - set mode if it is not * * * * INPUT: track (A-Reg) in BCD * * * * OUTPUT: track (A-Reg) in BCD * * carryFlag (1 = data, 0 = audio) * * * *===============================================* EXPORT TestAudioTrack TestAudioTrack PROC IMPORT BCD2Int IMPORT DrawMode pha jsr BCD2Int dec a asl a tay lda CDATime,y ;high bit set if data track bpl audio sec bra exit audio clc exit pla rts ENDP *===============================================* * Read a CD Disc's Table of Contents * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* ReadTOC PROC IMPORT BCD2Int IMPORT ATOCTime IMPORT ATOCTrack jsr ATOCTrack ;get min & max tracks stx CDMinTrk sty CDMaxTrk tya jsr BCD2Int ;get integer value sta CDTrkCnt jsr ATOCTime ;get absolute time table rts ENDP *===============================================* * Process a New-Disc Event * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* EXPORT NewDisc NewDisc PROC IMPORT NormalOrder IMPORT ReadTOC IMPORT DoStop IMPORT DrawMode jsr ReadTOC jsr NormalOrder lda CDDataDisc bne notAudio jsr DoStop bra exit notAudio lda #mdNoAudio sta CDMode lda CDWinPtr ora CDWinPtr+2 beq exit ;don't draw lda #mdNoAudio jsr DrawMode exit rts ENDP *===============================================* * Process a No-Disc Event * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* EXPORT NoDisc NoDisc PROC IMPORT DrawTime IMPORT DrawMode IMPORT DrawTrack IMPORT InitAB IMPORT RndOff stz CDTrack stz CDCurTrk stz CDMin stz CDSec stz CDFrame stz CDMinTrk stz CDMaxTrk stz CDTrkCnt stz CurIndex stz CDDataDisc lda #mdNoDisc sta CDMode jsr InitAB ;turn off AB jsr RndOff ;turn off shuffle lda CDWinPtr ora CDWinPtr+2 beq exit ;don't draw lda #mdNoDisc jsr DrawMode ;display No Disc lda #0 ldx #0 jsr DrawTime ;display 00:00 lda #0 jsr DrawTrack ;display 00 exit rts ENDP *===============================================* * Handle Next Play Selection * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* NextTrack PROC IMPORT DrawTrack IMPORT AStopTrack IMPORT APlayTrack IMPORT APlayTime IMPORT DoStop IMPORT RandomOrder IMPORT InitAB lda CDPMode cmp #mABRept beq repeatAB default ldy CurIndex ;increment by default cpy MaxIndex bcc bump lda CDRepeat beq reset ;all done lda CDPMode cmp #mShuffle bne cont jsr RandomOrder ;reshuffle the order cont ldy #0 bra play bump iny play sty CurIndex lda TrackMap,y and #$00FF sta CDTrack jsr AStopTrack lda CDTrack jsr APlayTrack ;play new track lda #true sta AudioWait lda CDWinPtr ora CDWinPtr+2 beq exit ;don't draw lda CDTrack jsr DrawTrack ;update track display jsr InitAB ;force A?,B? off across tracks bra exit repeatAB lda CDFrameA ldx CDSecA ldy CDMinA jsr APlayTime lda #true sta AudioWait bra exit reset jsr DoStop ;reset to first track exit rts ENDP *===============================================* * Random Track * * - generates a random sequence of n unique * * numbers. * * - after n numbers, it starts over again * * - n is the total number of tracks on the * * current CD Disc. * * * * INPUT: A-Reg (0: restart, ­0: continue)* * * * OUTPUT: RandomTrack (A-Reg) {1,2,3,É,n} * * (a 0 means end of sequence) * * * *===============================================* RandomTrack PROC cmp #0 bne continue jsr doInit ;restart sequence continue lda Count dec a beq okay ;last one! bmi doInit ;reset for next phase PushWord #0 _Random ;get a random integer pla and #$007F ;normalize to 0..127 @modLoop cmp Count ;small enough ? bcc okay ;yes sec sbc Count ;else, do MOD count bra @modLoop okay tax shortm lda RndMap,x ;get track number pha ldy Count dey ;zero relative lda RndMap,y ;get "left-over" track sta RndMap,x ;fill in "hole" pla longm and #$00ff dec Count ;reduce range exit rts ENTRY doInit doInit shortm lda #$99 ;max track (BCD) ldx #98 sta RndMap,x dex sed bcdLoop lda RndMap+1,x ;init table with BCD tracks sec sbc #1 sta RndMap,x dex bpl bcdLoop cld longm lda CDTrkCnt sta Count lda #0 ;signals end-of-list bra exit Count DC.W 0 RndMap DS.B 100 ENDP *===============================================* * Normal Order * * - fill TrackMap with sequential tracks (BCD) * * - data tracks are not put in table * * - set MaxIndex * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* NormalOrder PROC IMPORT TestAudioTrack IMPORT DrawMode stz CDDataDisc ldx #0 phx lda CDMinTrk ;starting track (BCD) test cmp CDMaxTrk ;out of tracks? bcc cont beq cont bra done ;yes cont jsr TestAudioTrack ;an Audio track? bcc okay ;yes sed clc adc #1 ;increment in BCD cld bra test okay plx shortm sta TrackMap,x longm sed clc adc #1 ;increment in BCD cld inx phx cpx CDTrkCnt ;last track? bcc test ;no done plx beq bad dex stx MaxIndex bra exit bad lda #true sta CDDataDisc lda #mdNoAudio sta CDMode exit rts ENDP *===============================================* * Random Order * * - fill TrackMap with random tracks (BCD) * * - data tracks are not put in table * * - set MaxIndex * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* RandomOrder PROC IMPORT RandomTrack IMPORT TestAudioTrack ldx #0 phx test lda 1,s ;A <-- X jsr RandomTrack ;A <-- random track (BCD) cmp #$0000 beq done ;out of tracks! jsr TestAudioTrack ;an Audio track? bcc okay ;yes bra test okay plx shortm sta TrackMap,x longm inx phx cpx CDTrkCnt ;last track? bcc test ;no done plx dex stx MaxIndex rts ENDP *===============================================* * Convert BCD to Integer Value * * * * INPUT: BCDValue (A-Reg) * * * * OUTPUT: IntValue (A-Reg) * * * *===============================================* BCD2Int PROC pha ;save low nibble lsr A lsr A lsr A lsr A ;tens digit asl A ;2x pha asl A asl A ;8x clc adc 1,s ;multiply by 10 (2x + 8x) sta 1,s lda 3,s ;ones digit and #$000F clc adc 1,s ;integer result plx ;cleanup stack plx rts ENDP *===============================================* * Turn Off Shuffle mode * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* RndOff PROC IMPORT DrawButton IMPORT SetRndL IMPORT NormalOrder lda CDPMode cmp #mShuffle bne exit ;was not on lda #0 sta CDPMode ;turn off Shuffle jsr SetRndL ;tell DrawButton jsr NormalOrder ldy #0 @invMap lda TrackMap,y ;find index from track and #$00FF cmp CDTrack beq found iny bra @invMap found sty CurIndex lda CDWinPtr ora CDWinPtr+2 beq exit lda #bShuffle jsr DrawButton ;redraw button exit rts ENDP *===============================================* * Initialize AB-Repeat Variables * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* InitAB PROC IMPORT DrawButton IMPORT SetABL IMPORT AStopTrack lda ABMode cmp #abOff beq exit ;already set up lda #abOff sta ABMode ;reset AB status lda #0 sta CDPMode ;turn off AB mode jsr SetABL ;tell DrawButton lda CDWinPtr ora CDWinPtr+2 beq exit lda #bAB jsr DrawButton ;redraw button exit rts ENDP *===============================================* * Open NDA About Box * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* DoAbout PROC IMPORT DrawAbout IMPORT DrawDisc IMPORT DrawIcon lda #$8000 jsr DrawIcon ;invert icon PushLong #0 ;save current port _GetPort PushWord _GetMasterSCB ;check for 320 mode pla and #$0080 beq mode320 lda #w2X ldx #w2X+dhW2 bra open mode320 lda #w2X_320 ldx #w2X_320+dhW2_320 open sta WindowRect2+2 ;window's hort. position stx WindowRect2+6 *** 23-Jan-91 DAL -- call WindowGlobal(1) so the NDA window doesn't have *** to unhilite when our About window comes up. pha pea $0001 _WindowGlobal pla *** PushLong #0 ;open About window PushLong #WinRec2 _NewWindow *** 23-Jan-91 DAL -- call WindowGlobal again to restore normal hiliting pha pea $fffe _WindowGlobal pla *** lda 1,s sta WinPtr2 ;should do error check!... lda 3,s sta WinPtr2+2 _SetPort jsr DrawAbout wait pha ;wait for key/mouse event PushWord #$000E ;event mask: mouse or key PushLong #temp _GetOSEvent pla beq wait lda temp cmp #$0001 ;mouse down ? beq close cmp #$0003 ;key down ? bne wait close PushLong WinPtr2 _CloseWindow _SetPort ;back to DA window's port lda #0 jsr DrawIcon ;un-invert icon rts temp DS.B 16 ;place to dump event record ENDP *===============================================* * Alert User of DA Error * * * * INPUT: errorCode (A-Reg) * * strPtrLow (X-Reg) SP error only * * strPtrHi (Y-Reg) sp error only * * * * OUTPUT: none * * * *===============================================* EXPORT DoAlert DoAlert PROC cmp #errNoRuby beq noRUBY cmp #errNoRevC beq noRevC cmp #errNoSCSI beq noSCSI cmp #errNotP16 beq notP16 cmp #1 ;smartport error box bne exit ;unknown error code txa tyx bra alert noRUBY lda #ErrString1 ldx #^ErrString1 bra alert noRevC lda #ErrString2 ldx #^ErrString2 bra alert noSCSI lda #ErrString3 ldx #^ErrString3 bra alert notP16 lda #ErrString4 ldx #^ErrString4 alert sta ErrStrPtr stx ErrStrPtr+2 PushWord _GetMasterSCB ;check for 320 mode pla and #$0080 beq mode320 lda #aX ldx #aX+aDX ldy #aStrX bra alert2 mode320 lda #aX_320 ldx #aX_320+aDX_320 ldy #aStrX_320 alert2 sta AlertTemplate+2 ;hort. offsets stx AlertTemplate+6 sty ErrStrRect+2 PushWord #0 ;space for ID PushLong #AlertTemplate PushLong #0 _StopAlert pla exit rts ENDP *===============================================* * Add System Task * * - Keeps the DA running in the background. * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* SystemTask PROC IMPORT SPOnLine IMPORT AStatus IMPORT NextTrack taskTicks equ 90 ; 60 ticks = 1 second *----------------------------------------------- TaskHeader DC.L 0 ; task pointer TaskCount DC.W taskTicks ; tick count DC.W $A55A ; signature DC.L 0 ; reserved *----------------------------------------------- phb phk plb jsr AStatus cmp #audioError bne okay jsr SPOnLine ; disc in drive ? bcc done bra exit ; no disc, so stop future tasks okay cmp #audioComplete ; completed play ? beq next ; yes cmp #audioVoid ; if void and we were waiting then it bne done ; counts as "audioComplete" lda AudioWait beq done next jsr NextTrack ; get next selection to play done lda #taskTicks sta TaskCount ; reset counter exit plb ; restore environment rtl ENDP *===============================================* END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CDRemote/CDRemote.equ b/IIGS.601.SRC/A.U.G/CDRemote/CDRemote.equ new file mode 100644 index 0000000..e30f2c9 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CDRemote/CDRemote.equ @@ -0,0 +1 @@ +* * * * * * * * * * * * * * * * * * * * * * * * * * File: CDRemote.equ * * * * Equates for CD-Remote (A New Desk Accessory) * * * * Author: Don Brady * * * * Build File: CDRemote.make * * * * Copyright © APPLE Computer, Inc. 1987,1988 * * All Rights Reserved. * * * * * * * * * * * * * * * * * * * * * * * * * * * * bStop equ 0 ;button IDs (CDButton) bPLay equ 1 bPause equ 2 bEject equ 3 bSkipR equ 4 bSkipF equ 5 bScanR equ 6 bScanF equ 7 bAudioL equ 8 bAudioR equ 9 bRepeat equ 10 bAB equ 11 bShuffle equ 12 bTime equ 13 mdStop equ 0 ;current modes (CDMode) mdPLay equ 1 mdPause equ 2 mdNoDisc equ 3 mdNoDrive equ 4 mdNoAudio equ 5 actWait equ 9 ;for control action timer mShuffle equ $01 ;CD mode constants (CDPMode) mABRept equ $02 abOff equ 0 ;AB repeat modes (ABMode) abSetA equ 1 abSetB equ 2 abOn equ 4 w1Y equ 187-dvW1 ;window offsets w1X equ 50 w2Y equ 50 w2X equ (640-dhW2)/2 w2X_320 equ (320-dhW2_320)/2 aDY equ 64 aDX equ 300 aDX_320 equ 270 aY equ 50 aX equ (640-aDX)/2 aX_320 equ (320-aDX_320)/2 aStrX equ 80 aStrX_320 equ 65 errNoRUBY equ $8000 ;init error codes errNoRevC equ $4000 errNoSCSI equ $2000 errNotP16 equ $1000 keyModReg equ $E0C025 openAppleKey equ $80 audioPLay equ $00 ;Audio status results audioPause equ $01 audioMute equ $02 audioComplete equ $03 audioError equ $04 audioVoid equ $05 true equ $FFFF false equ $0000 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CDRemote/GSOSDriver.aii b/IIGS.601.SRC/A.U.G/CDRemote/GSOSDriver.aii new file mode 100644 index 0000000..5b6e226 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CDRemote/GSOSDriver.aii @@ -0,0 +1 @@ +* * * * * * * * * * * * * * * * * * * * * * * * * * File: GSOSDRIVER.aii * * * * GSOS Driver to AppleCD SCª (RUBY) drive * * Module for CD-Remote (A New Desk Accessory) * * * * Author: Don Brady * * * * Build File: CDRemote.make * * * * Copyright © APPLE Computer, Inc. 1987-89 * * All rights reserved. * * * * Modification History: * * Version 1.1 * * 07/26/88 DJB - Created today * * * * * * * * * * * * * * * * * * * * * * * * * * ;............................................................... ; ; Set Memory & registers to 16 bits ;............................................................... MACRO SetLong rep #%00110000 longa on longi on MEND ;............................................................... ; ; Set Memory & registers to 8 bits ;............................................................... MACRO SetShort sep #%00110000 longa off longi off MEND ;----------------------------------------------- ; ; Imported data address (from CDRemote.aii) ; ;----------------------------------------------- IMPORT CDAFrame IMPORT CDAMin IMPORT CDASec IMPORT CDATime IMPORT CDCurTrk IMPORT CDData IMPORT CDFrame IMPORT CDMaxTrk IMPORT CDMin IMPORT CDMinTrk IMPORT CDSec IMPORT CDTrkCnt include 'all.macros' *===============================================* * GS/OS Constants * *===============================================* GSOSEntry equ $E100A8 D_INFO equ $202C D_STATUS equ $202D D_CONTROL equ $202E dcRemove equ $0004 dsOnline equ $0010 devCDROM equ $0007 pauseBit equ $10 ; changed to $10 DJB 12/02/88 stopBit equ $10 scanForward equ $00 ;scanReverse equ $40 scanReverse equ $10 ; changed to $10 CAF 12/07/90 tocType0 equ $00 tocType1 equ $40 tocType2 equ $80 addrBlock equ $00 addrTime equ $40 addrTrack equ $80 dataTrack equ $8000 *===============================================* * Device Driver Control Codes * *===============================================* ccEject equ $0002 ccRezeroUnit equ $8001 ccAudioSearch equ $80C8 ccAudioPlay equ $80C9 ccAudioPause equ $80CA ccAudioStop equ $80CB ccAudioStatus equ $80CC ccAudioScan equ $80CD ccReadTOC equ $80C1 ccReadQSub equ $80C2 ccReadHeader equ $80C3 *===============================================* * Data for SmartPort Driver * *===============================================* SPData PROC ENTRY DeviceNumber DeviceNumber DC.W 0 ENTRY IsOnLine IsOnLine DC.W 0 ;boolean flag ENTRY Params Params DC.W 0 ;parameter block for Version ENTRY AudioBuffer AudioBuffer DS.B 4*99 ;Audio I/O buffer ENTRY PlayMode PlayMode DC.W 9 ;default = stereo ENTRY AControl AControl DC.W 0 ENTRY ATrack ATrack DC.W 0 ENTRY AIndex AIndex DC.W 0 ENTRY AMin AMin DC.W 0 ;not used ???? ENTRY ASec ASec DC.W 0 ENTRY AFrame AFrame DC.W 0 ENTRY dstat_params dstat_params DC.W 5 ;pcount ENTRY dstat_devnum dstat_devnum DC.W 0 ;device number ENTRY dstat_code dstat_code DC.W 0 ;control code ENTRY dstat_list dstat_list DC.L dstat_data ;status list ENTRY dstat_rcount dstat_rcount DC.L 6 ;request count ENTRY dstat_tcount dstat_tcount DC.L 0 ;transfer count ENTRY dstat_data dstat_data DS.B 8 ENTRY dctrl_params dctrl_params DC.W 5 ;pcount ENTRY dctrl_devnum dctrl_devnum DC.W 0 ;device number ENTRY dctrl_code dctrl_code DC.W 0 ;control code ENTRY dctrl_list dctrl_list DC.L ControlList ;control list ptr. ENTRY dctrl_rcount dctrl_rcount DC.L 0 ;request count ENTRY dctrl_tcount dctrl_tcount DC.L 0 ;transfer count ENTRY ControlList ControlList DC.W 0 ;this is always zero! ENTRY CommandData CommandData DS.B 12 ;command data ENTRY AudioBufPtr AudioBufPtr DC.L AudioBuffer ;data buffer ptr. ENTRY part2_rcount part2_rcount DC.L 0 ;transfer count for part 2 ENTRY dinfo_params dinfo_params DC.W 8 ;pcount ENTRY dinfo_devnum dinfo_devnum DC.W 0 ;device number ENTRY dinfo_devname dinfo_devname DC.L DevNameBuf ;device name ptr ENTRY dinfo_devchar dinfo_devchar DC.W 0 ;device characteristics DC.L 0 ;total blocks DC.W 0 ;slot number DC.W 0 ;unit number DC.W 0 ;version ENTRY dinfo_devid dinfo_devid DC.W 0 ;device id DevNameBuf DC.W 36 ;class 1 output string DevName DS.B 34 ENDP *===============================================* * Initialize Driver * * - make sure GS/OS is active * * - look for SCSI Card Rev C * * - look for a AppleCD SC (RUBY) drive * * - check if device is online * * * * INPUT: none * * * * OUTPUT: ErrorCode (A-Reg) * * $0000 = okay * * $8000 = no RUBY drive * * $4000 = no SCSI Rev C * * $2000 = no SCSI card * * $1000 = not GS/OS * *===============================================* EXPORT SPInit EXPORT SPInit2 SPInit PROC _GET_VERSION Params lda Params and #$7F00 cmp #$0200 ;is it GS/OS (2.0 or greater)? bcs SPInit2 lda #$1000 bra exit ENTRY SPInit2 ;for the "backdoor" SPInit2 ldx #1 ;start with first device loop stx dinfo_devnum stx dstat_devnum phx ;save device number jsl GSOSEntry DC.W D_INFO DC.L dinfo_params plx bcs none ;no more devices lda dinfo_devchar and #dcRemove ;a removable device? beq next ;no lda dinfo_devid cmp #devCDROM ;a CD-ROM device? bne next ;no phx ;save device number jsl GSOSEntry DC.W D_STATUS DC.L dstat_params plx bcs done stz IsOnLine lda dstat_data and #dsOnline ;device online? beq done lda #1 sta IsOnLine bra done next inx bra loop done stx DeviceNumber stx dctrl_devnum lda #$0000 ;no error exit cmp #1 rts none lda #$8000 ;no RUBY drive bra exit ENDP *===============================================* * Test RUBY for disc on line * * * * INPUT: none * * * * OUTPUT: A-Reg 1 = OnLine; 0 = OffLine * * C-Flag 1 = not on line * * * *===============================================* SPOnLine PROC EXPORT IMPORT NoDisc IMPORT NewDisc lda DeviceNumber sta dstat_devnum lda #6 ;request 6 bytes sta dstat_rcount jsl GSOSEntry DC.W D_STATUS DC.L dstat_params bcc cont jsl GSOSEntry ;try again DC.W D_STATUS DC.L dstat_params bcs offline cont lda dstat_data and #dsOnline ;device online? bne online lda IsOnline beq offline ;already knew it jsr NoDisc ;reset variables stz IsOnLine offline lda #0 sec bra exit online lda IsOnLine bne okay ;no disc switch inc IsOnLine jsr NewDisc ;read TOC stuff for DA okay lda #1 clc exit rts ENDP *===============================================* * SCSI Busy * * - check to see if SCSI Card is "busy". * * * * INPUT: none * * * * OUTPUT: busyflag (carry bit) 1=yes, 0=no* * * *===============================================* SCSIBusy PROC EXPORT clc ;C <-- "not busy" rts ENDP *===============================================* * SmartPort Rezero Unit * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* SPRezero PROC EXPORT lda #ccRezeroUnit ;control Code sta dctrl_code and #$00FF sta CommandData ;set SCSI command stz CommandData+2 stz CommandData+4 stz CommandData+6 stz CommandData+8 stz CommandData+10 jsl GSOSEntry DC.W D_CONTROL DC.L dctrl_params rts ENDP *===============================================* * Initialize Control data * * * * INPUT: none * * * * OUTPUT: none * * A, X, & Y reg preserved * *===============================================* InitCmndData Proc stz dctrl_rcount phx ldx #10 loop stz CommandData,x dex dex bpl loop plx rts ENDP *===============================================* * CD-ROM Audio Call * * * * INPUT: ctrlCode (A-Reg) * * * * OUTPUT: errorCode (A-Reg) * * carryFlag (1=error, 0=okay) * * * *===============================================* AudioCall Proc EXPORT sta dctrl_code ;control code and #$00FF sta CommandData ;set SCSI command jsl GSOSEntry DC.W D_CONTROL DC.L dctrl_params rts ENDP *===============================================* * CD-ROM Status Call * * * * INPUT: ctrlCode (A-Reg) * * * * OUTPUT: errorCode (A-Reg) * * carryFlag (1=error, 0=okay) * * * *===============================================* StatusCall Proc EXPORT sta dctrl_code ;status code and #$00FF sta CommandData ;set SCSI command jsl GSOSEntry DC.W D_STATUS DC.L dctrl_params ;use contol parameter list rts ENDP *===============================================* * Audio Seek Track * * - seek to track and hold * * * * INPUT: track (A-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* ASeekTrack PROC EXPORT IMPORT AStopTrack pha jsr AStopTrack ;reset to this track pla jsr InitCmndData ;zero out command data sta CommandData+7 ;set search track * lda PlayMode * and #$000F ;only bits 0-15 are valid * xba * sta CommandData+2 ;set play bit/play mode lda #addrTrack ;use track sta CommandData+8 ;set address type lda #ccAudioSearch ;control code jsr AudioCall bcc exit lda #ccAudioSearch jsr AudioCall ;try again exit rts ENDP *===============================================* * Audio Play Time * * * * INPUT: frame (A-Reg) * * sec (X-Reg) * * min (Y-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* APlayTime PROC EXPORT jsr InitCmndData ;zero out command data SetShort sty CommandData+5 ;set playback MIN stx CommandData+6 ;set playback SEC sta CommandData+7 ;set playback FRAME stz CommandData+2 ;set stop bit lda PlayMode sta CommandData+3 ;set play mode lda #addrTime ;use time sta CommandData+8 ;set address type SetLong lda #ccAudioPlay ;control code jsr AudioCall bcc exit lda #ccAudioPlay jsr AudioCall ;try again exit rts ENDP *===============================================* * Audio Play Track * * * * INPUT: track (A-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* APlayTrack PROC EXPORT ;A-reg has TRACK jsr InitCmndData ;zero out command data stz CommandData+2 ;set stop bit ldx PlayMode stx CommandData+3 ;set play mode sta CommandData+7 ;set playback track sta ATrack lda #addrTrack ;use track sta CommandData+8 ;set address type lda #ccAudioPlay ;control code jsr AudioCall bcc exit lda #ccAudioPlay jsr AudioCall ;try again exit rts ENDP *===============================================* * Audio Pause * * * * INPUT: flag (A-Reg) 0=set,1=release * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* APause PROC EXPORT jsr InitCmndData ;zero out command data tax beq cont lda #pauseBit cont sta CommandData+2 ;set pause bit lda #ccAudioPause ;control code jsr AudioCall rts ENDP *===============================================* * Audio Stop Time * * - set time stoping address * * * * INPUT: frame (A-Reg) * * sec (X-Reg) * * min (Y-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* AStopTime PROC EXPORT jsr InitCmndData ;zero out command data SetShort sty CommandData+3 ;playback MIN stx CommandData+4 ;playback SEC sta CommandData+5 ;playback FRAME lda #addrTime ;use TIME sta CommandData+6 ;address type SetLong lda #ccAudioStop ;control code jsr AudioCall bcc exit lda #ccAudioStop jsr AudioCall ;try again exit rts ENDP *===============================================* * Audio Stop Track * * - set track stoping address * * * * INPUT: track (A-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* AStopTrack PROC EXPORT jsr InitCmndData ;zero out command data sta CommandData+5 ;stoping track ;--- Added DJB 7 Jun 89 ------------------------ tax bne @normal lda #addrBlock ; if track = 0 we want to do a bra setType ; rezero unit so type must be block ;--- End Addition ------------------------------ @normal lda #addrTrack setType sta CommandData+6 ;addr type = track lda #ccAudioStop ;control code jsr AudioCall bcc exit lda #ccAudioStop jsr AudioCall ;try again exit rts ENDP *===============================================* * Audio Status * * * * INPUT: none * * * * OUTPUT: AudioStatus (A-Reg) * * ($04 = error/undefined) * * * *===============================================* AStatus PROC EXPORT jsr InitCmndData ;zero out command data lda #6 ;request 6 bytes sta dctrl_rcount lda #ccAudioStatus ;status code jsr StatusCall bcs again lda dctrl_tcount ;was our data transfered? cmp #6 beq okay again lda #ccAudioStatus jsr StatusCall ;try again bcs err lda dctrl_tcount ;was our data transfered? cmp #6 beq okay err lda #$0004 ;simulate an error bra exit okay lda AudioBuffer and #$00ff ;return audio status exit rts ENDP *===============================================* * Audio Scan Forward/Reverse * * * * INPUT: frame (A-Reg) * * sec (X-Reg) * * min (Y-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* AScanF PROC EXPORT ;A = FRAME, X = SEC, Y = MIN jsr InitCmndData ;zero out command data SetShort sty CommandData+5 ;scan MIN stx CommandData+6 ;scan SEC sta CommandData+7 ;scan FRAME lda #addrTime ;use time sta CommandData+8 ;address type lda #scanForward sta CommandData+2 ;direction bit SetLong bra continue EXPORT AScanR AScanR jsr InitCmndData ;zero out command data SetShort sty CommandData+5 ;scan MIN stx CommandData+6 ;scan SEC sta CommandData+7 ;scan FRAME lda #addrTime ;use time sta CommandData+8 ;address type lda #scanReverse sta CommandData+2 ;direction bit SetLong continue lda #ccAudioScan ;control code jsr AudioCall bcc exit lda #ccAudioScan jsr AudioCall ;try again exit rts ENDP *===============================================* * Audio Scan Track * * * * INPUT: track (A-Reg) * * direction (X-Reg) 0=FWD, 1=REV * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* AScanTrack PROC EXPORT jsr InitCmndData ;zero out command data cpx #scanForward beq cont ldx #scanReverse cont stx CommandData+2 ;direction bit sta CommandData+7 ;scan track lda #addrTrack ;use track sta CommandData+8 ;address type lda #ccAudioScan ;control code jsr AudioCall bcc exit lda #ccAudioScan jsr AudioCall ;try again exit rts ENDP *===============================================* * Audio Eject * * * * INPUT: none * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* AEject PROC EXPORT jsr InitCmndData ;zero out command data lda #ccEject ;control code sta dctrl_code stz CommandData jsl GSOSEntry DC.W D_CONTROL DC.L dctrl_params rts ENDP *===============================================* * Audio Play Mode * * * * INPUT: mode (A-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* APlayMode PROC EXPORT IMPORT CDCurTrk:DATA IMPORT CDMinB:DATA IMPORT CDSecB:DATA IMPORT CDFrameB:DATA jsr InitCmndData ;zero out command data sta PlayMode ;save mode for other calls ldx #stopBit stx CommandData+2 ;stop bit sta CommandData+3 ;play mode lda CDCurTrk xba sta CommandData+6 ;playback track lda #addrTrack ;use track sta CommandData+8 ;address type bra doIT EXPORT APlayModeTime APlayModeTime jsr InitCmndData ;zero out command data sta PlayMode ;save mode for other calls ldx #stopBit stx CommandData+2 ;stop bit sta CommandData+3 ;play mode lda CDMinB ;playback time sta CommandData+5 lda CDSecB sta CommandData+6 lda CDFrameB sta CommandData+7 lda #addrTime ;use time sta CommandData+8 ;address type doIt lda #ccAudioPlay ;control code jsr AudioCall bcc exit lda #ccAudioPlay jsr AudioCall ;try again exit rts ENDP *===============================================* * Audio TOC Track * * - get first and last track numbers * * * * INPUT: none * * * * OUTPUT: firstTrk (X-Reg) * * lastTrk (Y-Reg) * * * *===============================================* ATOCTrack PROC EXPORT jsr InitCmndData ;zero out command data stz CommandData+2 ;track number stz CommandData+3 ;reserved lda #tocType0 sta CommandData+5 ;TOC type 0 lda #$04 sta dctrl_rcount ;allocation length lda #ccReadTOC ;status code jsr StatusCall bcc okay lda #ccReadTOC jsr StatusCall ;try again bcc okay ldx #0 ldy #0 bra exit okay lda AudioBuffer ;first track and #$00FF tax lda AudioBuffer+1 ;last track and #$00FF tay exit rts ENDP *===============================================* * Audio TOC Time * * - get absolute track time values * * - get control field (data/audio track) * * * * NOTE: This routined was patched to work * * around a SCSI Driver bug. The driver can only * * return 255 bytes of data for a status call. * * Since each track has 4 bytes of data, a track * * count greater than 63 will exceed this limit. * * To get around this limitation I split the call* * into 2 parts so that I can read all of the * * TOC data without getting an error back from * * the driver. * * * * INPUT: none * * * * OUTPUT: carryFlag (1 = error) * * * *===============================================* ATOCTime PROC EXPORT ;get absolute track times IMPORT (CDMinTrk,CDTrkCnt,CDATime):DATA stz part2_rcount ;no part 2 yet jsr InitCmndData ;zero out command data lda #tocType2 sta CommandData+5 ;TOC type 2 call lda CDTrkCnt ;track count asl A ;tracks * 4 asl A sta dctrl_rcount ;allocation length cmp #$0100 ;is it too big for driver? bcc normal sec sbc #252 sta part2_rcount ;part 2 allocation length lda #252 sta dctrl_rcount ;part 1 allocation length normal lda CDMinTrk ;starting track number sta CommandData+2 lda #ccReadTOC ;status code jsr StatusCall bcc okay lda #ccReadTOC jsr StatusCall ;try again bcc okay brl exit ;error occured okay lda part2_rcount ;is there a part 2 ? beq makeTable ;no sta dctrl_rcount lda #$0064 ;starting track number sta CommandData+2 clc lda AudioBufPtr ;point to part2 adc #252 sta AudioBufPtr bcc part2 inc AudioBufPtr part2 lda #ccReadTOC ;status code jsr StatusCall bcc makeTable lda #ccReadTOC jsr StatusCall ;try again bcs exit ;error occured makeTable lda #AudioBuffer ;restore buffer pointer sta AudioBufPtr lda #^AudioBuffer sta AudioBufPtr+2 lda CDTrkCnt dec A asl A asl A tay lda CDTrkCnt dec A dec A asl A tax phy loop lda AudioBuffer+1,y ;AMin, ASec xba ;lsb <-- sec, msb <-- min sta CDATime,x ;CDATime(x) <-- ATime(x+1) lda AudioBuffer-4,y ;control field and #$000D cmp #$0004 ;is it a data track? bne cont1 ;no lda CDATime,x ora #dataTrack ;mark entry as data sta CDATime,x cont1 dey dey dey dey dex dex bpl loop ply ;check last track stz AControl lda AudioBuffer,y and #$000D cmp #$0004 ;is it a data track? bne cont2 ;no lda #dataTrack sta AControl cont2 stz CommandData+2 ;track number lda #$0004 sta dctrl_rcount ;allocation length lda #tocType1 sta CommandData+5 ;TOC type 1 lda #ccReadTOC ;status code jsr StatusCall bcs exit ;error occured lda CDTrkCnt dec A asl A tax lda AudioBuffer ;lead-out time xba ;lsb <-- sec, msb <-- min ora AControl sta CDATime,x ;CDATime(n) <-- Time clc exit rts ENDP *===============================================* * Audio Read Q-Data * * * * INPUT: none * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* AReadQ PROC EXPORT IMPORT (CDAMin,CDASec,CDMin,CDSec,CDIndex):DATA IMPORT (CDAFrame,CDFrame,CDCurTrk):DATA jsr InitCmndData ;zero out command data lda #9 ;request 9 bytes sta dctrl_rcount lda #ccReadQSub ;status code jsr StatusCall bcc cont lda #ccReadQSub jsr StatusCall ;try again bcs exit ;error cont shortm lda AudioBuffer ;control field sta AControl lda AudioBuffer+1 cmp #$AA ;into lead-out area ? bne okay ;no lda #0 okay sta CDCurTrk lda AudioBuffer+2 sta CDIndex lda AudioBuffer+3 ;save track TIME sta CDMin lda AudioBuffer+4 sta CDSec lda AudioBuffer+5 sta CDFrame lda AudioBuffer+6 ;save absolute TIME sta CDAMin lda AudioBuffer+7 sta CDASec lda AudioBuffer+8 sta CDAFrame longm exit rts ENDP *===============================================* END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CDRemote/cdremote.make b/IIGS.601.SRC/A.U.G/CDRemote/cdremote.make new file mode 100644 index 0000000..8758610 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CDRemote/cdremote.make @@ -0,0 +1 @@ +# File: CDRemote.make # Target: CD.Remote # Sources: cdplay.aii draw.aii gsosdriver.aii # Created: Thursday, February 18, 1988 8:08:42 AM # # This will build the CDRemote project # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # cdremote.obj Ä cdremote.equ draw.equ cdremote.aii AsmIIGS cdremote.aii -o cdremote.obj draw.obj Ä draw.equ draw.aii AsmIIGS draw.aii -o draw.obj gsosdriver.obj Ä gsosdriver.aii AsmIIGS gsosdriver.aii -o gsosdriver.obj CDRemote Ä cdremote.obj draw.obj gsosdriver.obj LinkIIGS cdremote.obj draw.obj gsosdriver.obj -o CDRemote SetFile -t 'B8 ' CDRemote \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CDRemote/draw.aii b/IIGS.601.SRC/A.U.G/CDRemote/draw.aii new file mode 100644 index 0000000..0ab9524 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CDRemote/draw.aii @@ -0,0 +1 @@ +* * * * * * * * * * * * * * * * * * * * * * * * * * File: Draw.aii * * * * A Module for CD-Remote (A New Desk Accessory) * * * * Date: 8/27/87 (created) * * Author: Don Brady * * * * Build File: CDRemote.make * * * * Copyright APPLE Computer, Inc. 1987,1988 * * * * Modification History: * * Version 1.0 * * 01/18/88 Released A1 today * * 02/11/88 Released A2 today * * 02/17/88 Converted to MAX (from APW) today * * 03/21/88 Release A4 today * * 04/01/88 Release B1 today * * 04/13/88 Release B2 (informal) today * * 04/15/88 Release B3 today * * 04/17/88 Release B4 (informal) today * * 04/18/88 Final Release today * * 23-Jan-91 Dave Lyons * * Changed version to 1.3d2, copyright * * to include 91. * * * * * * * * * * * * * * * * * * * * * * * * * * * * include 'Draw.equ' include 'all.macros' *===============================================* * Data for Draw Routines * *===============================================* DrawData PROC ENTRY DisplayMode ENTRY RectTbl1 ENTRY RectTbl2 ENTRY RectTbl3 ENTRY Rect320Tbl1 ENTRY Rect320Tbl2 ENTRY Rect320Tbl3 ENTRY WinRect ENTRY DispRect ENTRY DSRect ENTRY WinRect320 ENTRY DispRect320 ENTRY DSRect320 ENTRY IconRect ENTRY IconRect320 ENTRY AStrPtr ENTRY StrPoint ENTRY GrayPattern ENTRY GrayPattern320 ENTRY Pattern2 ENTRY PictC ENTRY PictB0 ENTRY PictB1 ENTRY PictB2 ENTRY PictB3 ENTRY PictB4 ENTRY PictB5 ENTRY PictB6 ENTRY PictB7 ENTRY PictB8a ENTRY PictB8b ENTRY PictB9a ENTRY PictB9b ENTRY PictB10a ENTRY PictB10b ENTRY PictB11a ENTRY PictB11b ENTRY PictB11c ENTRY PictB11d ENTRY PictB12a ENTRY PictB12b ENTRY PictB13 ENTRY PictApple ENTRY PictApple_320 ENTRY PictAbout ENTRY PictIcon ENTRY PictMapL ENTRY PictMapS ENTRY PictMapT ENTRY PictMapT_320 ENTRY PictMapB ENTRY AudLPtr ENTRY AudRPtr ENTRY RepPtr ENTRY ABPtr ENTRY RndPtr ENTRY LocInfoL ENTRY PictPtrL ENTRY PictRectL ENTRY LocInfoS ENTRY PictPtrS ENTRY PictRectS ENTRY LocInfoB ENTRY PictPtrB ENTRY PictRectB ENTRY LocInfoT ENTRY PictByteT ENTRY PictPtrT ENTRY PictRectT ENTRY LocInfoC ENTRY PictRectC ENTRY LocInfoI ENTRY PictRectI ENTRY LocInfoA ENTRY PictPtrA ENTRY PictRectA ENTRY PictPoint ENTRY PictMode EXPORT RectTblPtr EXPORT IconRectPtr DisplayMode DC.W $0080 ;$80 = 640, $00 = 320 BRect0 DC.W v1,h1,v1+dvB,h1+dhB ;Stop BRect1 DC.W v1,h2,v1+dvB,h2+dhB ;Play BRect2 DC.W v1,h3,v1+dvB,h3+dhB ;Pause BRect3 DC.W v1,h4,v1+dvB,h4+dhB ;Eject BRect4 DC.W v3,h1,v3+dvB,h1+dhB ;Skip Rev BRect5 DC.W v3,h2,v3+dvB,h2+dhB ;Skip Fwd BRect6 DC.W v3,h3,v3+dvB,h3+dhB ;Scan Rev BRect7 DC.W v3,h4,v3+dvB,h4+dhB ;Scan Fwd BRect8 DC.W v4,h1,v4+dvB,h1+dhB ;Audio Right BRect9 DC.W v4,h2,v4+dvB,h2+dhB ;Audio Left BRect10 DC.W v4,h3,v4+dvB,h3+dhB ;Repeat BRect11 DC.W v4,h4,v4+dvB,h4+dhB ;AB Repeat BRect12 DC.W v5,h1,v5+dvB,h1+dhB ;Shuffle BRect13 DC.W v5,h2,v5+dvB,h2+dhB ;Time IRect0 DC.W v1+1,h1+2,v1+1+dvB,h1+2+dhB ;Stop IRect1 DC.W v1+1,h2+2,v1+1+dvB,h2+2+dhB ;Play IRect2 DC.W v1+1,h3+2,v1+1+dvB,h3+2+dhB ;Pause IRect3 DC.W v1+1,h4+2,v1+1+dvB,h4+2+dhB ;Eject IRect4 DC.W v3+1,h1+2,v3+1+dvB,h1+2+dhB ;Skip Rev IRect5 DC.W v3+1,h2+2,v3+1+dvB,h2+2+dhB ;Skip Fwd IRect6 DC.W v3+1,h3+2,v3+1+dvB,h3+2+dhB ;Scan Rev IRect7 DC.W v3+1,h4+2,v3+1+dvB,h4+2+dhB ;Scan Fwd IRect8 DC.W v4+1,h1+2,v4+1+dvB,h1+2+dhB ;Audio Right IRect9 DC.W v4+1,h2+2,v4+1+dvB,h2+2+dhB ;Audio Left IRect10 DC.W v4+1,h3+2,v4+1+dvB,h3+2+dhB ;Repeat IRect11 DC.W v4+1,h4+2,v4+1+dvB,h4+2+dhB ;AB Repeat IRect12 DC.W v5+1,h1+2,v5+1+dvB,h1+2+dhB ;Shuffle IRect13 DC.W v5+1,h2+2,v5+1+dvB,h2+2+dhB ;Time SRect0 DC.W v1A,h1A,v1A+dvB,h1A+dhB ;Stop SRect1 DC.W v1A,h2A,v1A+dvB,h2A+dhB ;Play SRect2 DC.W v1A,h3A,v1A+dvB,h3A+dhB ;Pause SRect3 DC.W v1A,h4A,v1A+dvB,h4A+dhB ;Eject SRect4 DC.W v3A,h1A,v3A+dvB,h1A+dhB ;Skip Rev SRect5 DC.W v3A,h2A,v3A+dvB,h2A+dhB ;Skip Fwd SRect6 DC.W v3A,h3A,v3A+dvB,h3A+dhB ;Scan Rev SRect7 DC.W v3A,h4A,v3A+dvB,h4A+dhB ;Scan Fwd SRect8 DC.W v4A,h1A,v4A+dvB,h1A+dhB ;Audio Right SRect9 DC.W v4A,h2A,v4A+dvB,h2A+dhB ;Audio Left SRect10 DC.W v4A,h3A,v4A+dvB,h3A+dhB ;Repeat SRect11 DC.W v4A,h4A,v4A+dvB,h4A+dhB ;AB Repeat SRect12 DC.W v5A,h1A,v5A+dvB,h1A+dhB ;Shuffle SRect13 DC.W v5A,h2A,v5A+dvB,h2A+dhB ;Time RectTbl1 DC.L BRect0 ;stop DC.L BRect1 ;play DC.L BRect2 ;pause DC.L BRect3 ;eject DC.L BRect4 ;skip L DC.L BRect5 ;skip R DC.L BRect6 ;scan L DC.L BRect7 ;scan R DC.L BRect8 ;audio L DC.L BRect9 ;audio R DC.L BRect10 ;repeat DC.L BRect11 ;AB DC.L BRect12 ;shuffle DC.L BRect13 ;time RectTbl2 DC.L SRect0 ;stop DC.L SRect1 ;play DC.L SRect2 ;pause DC.L SRect3 ;eject DC.L SRect4 ;skip L DC.L SRect5 ;skip R DC.L SRect6 ;scan L DC.L SRect7 ;scan R DC.L SRect8 ;audio L DC.L SRect9 ;audio R DC.L SRect10 ;repeat DC.L SRect11 ;AB DC.L SRect12 ;shuffle DC.L SRect13 ;time RectTbl3 DC.L IRect0 ;stop DC.L IRect1 ;play DC.L IRect2 ;pause DC.L IRect3 ;eject DC.L IRect4 ;skip L DC.L IRect5 ;skip R DC.L IRect6 ;scan L DC.L IRect7 ;scan R DC.L IRect8 ;audio L DC.L IRect9 ;audio R DC.L IRect10 ;repeat DC.L IRect11 ;AB DC.L IRect12 ;shuffle DC.L IRect13 ;time *-------- 320 mode button rectangles ------------ B320Rect0 DC.W v1,h1/2,v1+dvB,(h1+dhB)/2 ;Stop B320Rect1 DC.W v1,h2/2,v1+dvB,(h2+dhB)/2 ;Play B320Rect2 DC.W v1,h3/2,v1+dvB,(h3+dhB)/2 ;Pause B320Rect3 DC.W v1,h4/2,v1+dvB,(h4+dhB)/2 ;Eject B320Rect4 DC.W v3,h1/2,v3+dvB,(h1+dhB)/2 ;Skip Rev B320Rect5 DC.W v3,h2/2,v3+dvB,(h2+dhB)/2 ;Skip Fwd B320Rect6 DC.W v3,h3/2,v3+dvB,(h3+dhB)/2 ;Scan Rev B320Rect7 DC.W v3,h4/2,v3+dvB,(h4+dhB)/2 ;Scan Fwd B320Rect8 DC.W v4,h1/2,v4+dvB,(h1+dhB)/2 ;Audio Right B320Rect9 DC.W v4,h2/2,v4+dvB,(h2+dhB)/2 ;Audio Left B320Rect10 DC.W v4,h3/2,v4+dvB,(h3+dhB)/2 ;Repeat B320Rect11 DC.W v4,h4/2,v4+dvB,(h4+dhB)/2 ;AB Repeat B320Rect12 DC.W v5,h1/2,v5+dvB,(h1+dhB)/2 ;Shuffle B320Rect13 DC.W v5,h2/2,v5+dvB,(h2+dhB)/2 ;Time I320Rect0 DC.W v1+1,(h1+2)/2,v1+1+dvB,(h1+2+dhB)/2 ;Stop I320Rect1 DC.W v1+1,(h2+2)/2,v1+1+dvB,(h2+2+dhB)/2 ;Play I320Rect2 DC.W v1+1,(h3+2)/2,v1+1+dvB,(h3+2+dhB)/2 ;Pause I320Rect3 DC.W v1+1,(h4+2)/2,v1+1+dvB,(h4+2+dhB)/2 ;Eject I320Rect4 DC.W v3+1,(h1+2)/2,v3+1+dvB,(h1+2+dhB)/2 ;Skip Rev I320Rect5 DC.W v3+1,(h2+2)/2,v3+1+dvB,(h2+2+dhB)/2 ;Skip Fwd I320Rect6 DC.W v3+1,(h3+2)/2,v3+1+dvB,(h3+2+dhB)/2 ;Scan Rev I320Rect7 DC.W v3+1,(h4+2)/2,v3+1+dvB,(h4+2+dhB)/2 ;Scan Fwd I320Rect8 DC.W v4+1,(h1+2)/2,v4+1+dvB,(h1+2+dhB)/2 ;Audio Right I320Rect9 DC.W v4+1,(h2+2)/2,v4+1+dvB,(h2+2+dhB)/2 ;Audio Left I320Rect10 DC.W v4+1,(h3+2)/2,v4+1+dvB,(h3+2+dhB)/2 ;Repeat I320Rect11 DC.W v4+1,(h4+2)/2,v4+1+dvB,(h4+2+dhB)/2 ;AB Repeat I320Rect12 DC.W v5+1,(h1+2)/2,v5+1+dvB,(h1+2+dhB)/2 ;Shuffle I320Rect13 DC.W v5+1,(h2+2)/2,v5+1+dvB,(h2+2+dhB)/2 ;Time S320Rect0 DC.W v1A,h1A/2,v1A+dvB,(h1A+dhB)/2 ;Stop S320Rect1 DC.W v1A,h2A/2,v1A+dvB,(h2A+dhB)/2 ;Play S320Rect2 DC.W v1A,h3A/2,v1A+dvB,(h3A+dhB)/2 ;Pause S320Rect3 DC.W v1A,h4A/2,v1A+dvB,(h4A+dhB)/2 ;Eject S320Rect4 DC.W v3A,h1A/2,v3A+dvB,(h1A+dhB)/2 ;Skip Rev S320Rect5 DC.W v3A,h2A/2,v3A+dvB,(h2A+dhB)/2 ;Skip Fwd S320Rect6 DC.W v3A,h3A/2,v3A+dvB,(h3A+dhB)/2 ;Scan Rev S320Rect7 DC.W v3A,h4A/2,v3A+dvB,(h4A+dhB)/2 ;Scan Fwd S320Rect8 DC.W v4A,h1A/2,v4A+dvB,(h1A+dhB)/2 ;Audio Right S320Rect9 DC.W v4A,h2A/2,v4A+dvB,(h2A+dhB)/2 ;Audio Left S320Rect10 DC.W v4A,h3A/2,v4A+dvB,(h3A+dhB)/2 ;Repeat S320Rect11 DC.W v4A,h4A/2,v4A+dvB,(h4A+dhB)/2 ;AB Repeat S320Rect12 DC.W v5A,h1A/2,v5A+dvB,(h1A+dhB)/2 ;Shuffle S320Rect13 DC.W v5A,h2A/2,v5A+dvB,(h2A+dhB)/2 ;Time Rect320Tbl1 DC.L B320Rect0 ;stop DC.L B320Rect1 ;play DC.L B320Rect2 ;pause DC.L B320Rect3 ;eject DC.L B320Rect4 ;skip L DC.L B320Rect5 ;skip R DC.L B320Rect6 ;scan L DC.L B320Rect7 ;scan R DC.L B320Rect8 ;audio L DC.L B320Rect9 ;audio R DC.L B320Rect10 ;repeat DC.L B320Rect11 ;AB DC.L B320Rect12 ;shuffle DC.L B320Rect13 ;time Rect320Tbl2 DC.L S320Rect0 ;stop DC.L S320Rect1 ;play DC.L S320Rect2 ;pause DC.L S320Rect3 ;eject DC.L S320Rect4 ;skip L DC.L S320Rect5 ;skip R DC.L S320Rect6 ;scan L DC.L S320Rect7 ;scan R DC.L S320Rect8 ;audio L DC.L S320Rect9 ;audio R DC.L S320Rect10 ;repeat DC.L S320Rect11 ;AB DC.L S320Rect12 ;shuffle DC.L S320Rect13 ;time Rect320Tbl3 DC.L I320Rect0 ;stop DC.L I320Rect1 ;play DC.L I320Rect2 ;pause DC.L I320Rect3 ;eject DC.L I320Rect4 ;skip L DC.L I320Rect5 ;skip R DC.L I320Rect6 ;scan L DC.L I320Rect7 ;scan R DC.L I320Rect8 ;audio L DC.L I320Rect9 ;audio R DC.L I320Rect10 ;repeat DC.L I320Rect11 ;AB DC.L I320Rect12 ;shuffle DC.L I320Rect13 ;time WinRect DC.W 0,0,dvW1,dhW1 ;window's rect DispRect DC.W v2,h1,v2+dvD,h1+dhD-2 ;display's rect DSRect DC.W v2+1,h1+2,v2+dvD+1,h1+dhD ;display's shadow rect IconRect DC.W v6,h6,v6+dvI,h6+dhI ;icon's rect WinRect320 DC.W 0,0,dvW1,dhW1/2 ;window's rect DispRect320 DC.W v2,h1/2,v2+dvD,(h1+dhD-2)/2 ;display's rect DSRect320 DC.W v2+1,(h1+2)/2,v2+dvD+1,(h1+dhD)/2 ;display's shadow rect IconRect320 DC.W v6,h6/2,v6+dvI,(h6+dhI)/2 ;icon's rect RectTblPtr DC.L RectTbl1 IconRectPtr DC.L IconRect PictPoint DC.L 0 ;generic point PictMode DC.W 0 ;$8000=inverse, $0000=normal LocInfoL DC.W $80 ;port SCB PictPtrL DC.L $0000 ;Picture ptr DC.W 5 ;Picture width (bytes) PictRectL DC.W 0,0,dvPL,dhPL ;bounds rect LocInfoS DC.W $80 ;port SCB PictPtrS DC.L $0000 ;Picture ptr DC.W 3 ;Picture width (bytes) PictRectS DC.W 0,0,dvPS,dhPS ;bounds rect LocInfoC DC.W $80 ;port SCB DC.L PictC ;Picture ptr DC.W 1 ;Picture width (bytes) PictRectC DC.W 0,0,dvC,dhC ;bounds rect LocInfoB DC.W $0080 ;port SCB PictPtrB DC.L $00000000 ;picture ptr DC.W 5 ;picture width (bytes) PictRectB DC.W 0,0,dvL,dhL ;bounds rect LocInfoT DC.W $0080 ;port SCB PictPtrT DC.L 0 ;picture ptr PictByteT DC.W 0 ;picture width (bytes) PictRectT DC.W 0,0,dvT,dhT ;bounds rect LocInfoI DC.W $0080 ;port SCB DC.L PictIcon ;picture ptr DC.W 21 ;picture width (bytes) PictRectI DC.W 0,0,dvI,dhI ;bounds rect LocInfoA DC.W $0080 ;port SCB PictPtrA DC.L PictApple ;picture ptr DC.W 4 ;picture width (bytes) PictRectA DC.W 0,0,dvA,dhA ;bounds rect STRING PASCAL AString0 DC.B 'CD-REMOTE' AString1 DC.B 'by Don Brady' AString2 DC.B 'Version 1.3' AString3 DC.B 'Copyright Apple Computer, Inc. 1988-92' AString4 DC.B 'All rights reserved.' STRING ASIS AStrPtr DC.L Astring0 DC.L Astring1 DC.L Astring2 DC.L Astring3 DC.L Astring4 StrPoint DC.W 18,0 ;Title DC.W 28,0 ;Author DC.W 46,0 ;Version DC.W 65,0 ;SQA DC.W 77,0 ;Copyright GrayPattern DC.B $33,$33,$33,$33 ;pattern for gray DC.B $33,$33,$33,$33 DC.B $33,$33,$33,$33 DC.B $33,$33,$33,$33 DC.B $33,$33,$33,$33 DC.B $33,$33,$33,$33 DC.B $33,$33,$33,$33 DC.B $33,$33,$33,$33 GrayPattern320 DC.B $11,$11,$11,$11 ;pattern for gray (320) DC.B $11,$11,$11,$11 DC.B $11,$11,$11,$11 DC.B $11,$11,$11,$11 DC.B $11,$11,$11,$11 DC.B $11,$11,$11,$11 DC.B $11,$11,$11,$11 DC.B $11,$11,$11,$11 Pattern2 DC.B $00,$00,$00,$00 ;pattern for black DC.B $00,$00,$00,$00 DC.B $00,$00,$00,$00 DC.B $00,$00,$00,$00 DC.B $00,$00,$00,$00 DC.B $00,$00,$00,$00 DC.B $00,$00,$00,$00 DC.B $00,$00,$00,$00 ;------------------------------------------------------- ; foreground color = 0 (00 binary --> 0000 --> 0 hex) ; background color = 3 (11 binary --> 1111 --> f hex) ;------------------------------------------------------- Pict0L DC.B $0f,$ff,$ff,$ff,$00 ;large 0 DC.B $f0,$ff,$ff,$f0,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $f0,$00,$00,$00,$f0 DC.B $00,$00,$00,$00,$00 DC.B $f0,$00,$00,$00,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $f0,$ff,$ff,$f0,$f0 DC.B $0f,$ff,$ff,$ff,$00 Pict1L DC.B $00,$00,$00,$00,$00 ;large 1 DC.B $00,$00,$00,$00,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$00,$f0 DC.B $00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$00,$f0 DC.B $00,$00,$00,$00,$00 Pict2L DC.B $0f,$ff,$ff,$ff,$00 ;large 2 DC.B $00,$ff,$ff,$f0,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$00,$f0 DC.B $0f,$ff,$ff,$ff,$00 DC.B $f0,$ff,$ff,$f0,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $f0,$ff,$ff,$f0,$00 DC.B $0f,$ff,$ff,$ff,$00 Pict3L DC.B $0f,$ff,$ff,$ff,$00 ;large 3 DC.B $00,$ff,$ff,$f0,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$00,$f0 DC.B $0f,$ff,$ff,$ff,$00 DC.B $00,$ff,$ff,$f0,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$ff,$ff,$f0,$f0 DC.B $0f,$ff,$ff,$ff,$00 Pict4L DC.B $00,$00,$00,$00,$00 ;large 4 DC.B $f0,$00,$00,$00,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $f0,$00,$00,$00,$f0 DC.B $0f,$ff,$ff,$ff,$00 DC.B $00,$ff,$ff,$f0,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$00,$f0 DC.B $00,$00,$00,$00,$00 Pict5L DC.B $0f,$ff,$ff,$ff,$00 ;large 5 DC.B $f0,$ff,$ff,$f0,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $f0,$00,$00,$00,$00 DC.B $0f,$ff,$ff,$ff,$00 DC.B $00,$ff,$ff,$f0,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$ff,$ff,$f0,$f0 DC.B $0f,$ff,$ff,$ff,$00 Pict6L DC.B $0f,$ff,$ff,$ff,$00 ;large 6 DC.B $f0,$ff,$ff,$f0,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $ff,$00,$00,$00,$00 DC.B $f0,$00,$00,$00,$00 DC.B $0f,$ff,$ff,$ff,$00 DC.B $f0,$ff,$ff,$f0,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $f0,$ff,$ff,$f0,$f0 DC.B $0f,$ff,$ff,$ff,$00 Pict7L DC.B $0f,$ff,$ff,$ff,$00 ;large 7 DC.B $00,$ff,$ff,$f0,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$00,$f0 DC.B $00,$00,$00,$00,$00 DC.B $00,$00,$00,$00,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$00,$f0 DC.B $00,$00,$00,$00,$00 Pict8L DC.B $0f,$ff,$ff,$ff,$00 ;large 8 DC.B $f0,$ff,$ff,$f0,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $f0,$00,$00,$00,$f0 DC.B $0f,$ff,$ff,$ff,$00 DC.B $f0,$ff,$ff,$f0,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $f0,$ff,$ff,$f0,$f0 DC.B $0f,$ff,$ff,$ff,$00 Pict9L DC.B $0f,$ff,$ff,$ff,$00 ;large 9 DC.B $f0,$ff,$ff,$f0,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $ff,$00,$00,$0f,$f0 DC.B $f0,$00,$00,$00,$f0 DC.B $0f,$ff,$ff,$ff,$00 DC.B $00,$ff,$ff,$f0,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$00,$00,$0f,$f0 DC.B $00,$ff,$ff,$f0,$f0 DC.B $0f,$ff,$ff,$ff,$00 Pict0S DC.B $0f,$ff,$f0 ;small 0 DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $00,$00,$00 DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $0f,$ff,$f0 Pict1S DC.B $00,$00,$00 ;small 1 DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$00 DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$00 Pict2S DC.B $0f,$ff,$f0 ;small 2 DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $0f,$ff,$f0 DC.B $f0,$00,$00 DC.B $f0,$00,$00 DC.B $f0,$00,$00 DC.B $f0,$00,$00 DC.B $0f,$ff,$f0 Pict3S DC.B $0f,$ff,$f0 ;small 3 DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $0f,$ff,$f0 DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $0f,$ff,$f0 Pict4S DC.B $00,$00,$00 ;small 4 DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $0f,$ff,$f0 DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$00 Pict5S DC.B $0f,$ff,$f0 ;small 5 DC.B $f0,$00,$00 DC.B $f0,$00,$00 DC.B $f0,$00,$00 DC.B $f0,$00,$00 DC.B $0f,$ff,$f0 DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $0f,$ff,$f0 Pict6S DC.B $0f,$ff,$f0 ;small 6 DC.B $f0,$00,$00 DC.B $f0,$00,$00 DC.B $f0,$00,$00 DC.B $f0,$00,$00 DC.B $0f,$ff,$f0 DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $0f,$ff,$f0 Pict7S DC.B $0f,$ff,$f0 ;small 7 DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$00 DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$00 Pict8S DC.B $0f,$ff,$f0 ;small 8 DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $0f,$ff,$f0 DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $0f,$ff,$f0 Pict9S DC.B $0f,$ff,$f0 ;small 9 DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $f0,$00,$0f DC.B $0f,$ff,$f0 DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $00,$00,$0f DC.B $0f,$ff,$f0 PictC DC.B $00 ;small ":" DC.B $00 DC.B $00 DC.B $f0 DC.B $00 DC.B $00 DC.B $00 DC.B $f0 DC.B $00 DC.B $00 DC.B $00 PictB0 DC.B $0f,$ff,$ff,$ff,$00 ;stop DC.B $0f,$ff,$ff,$ff,$00 DC.B $0f,$ff,$ff,$ff,$00 DC.B $0f,$ff,$ff,$ff,$00 DC.B $0f,$ff,$ff,$ff,$00 DC.B $0f,$ff,$ff,$ff,$00 DC.B $0f,$ff,$ff,$ff,$00 PictB1 DC.B $00,$0f,$00,$00,$00 ;play DC.B $00,$0f,$f0,$00,$00 DC.B $00,$0f,$ff,$00,$00 DC.B $00,$0f,$ff,$f0,$00 DC.B $00,$0f,$ff,$00,$00 DC.B $00,$0f,$f0,$00,$00 DC.B $00,$0f,$00,$00,$00 PictB2 DC.B $ff,$f0,$00,$ff,$f0 ;pause DC.B $ff,$f0,$00,$ff,$f0 DC.B $ff,$f0,$00,$ff,$f0 DC.B $ff,$f0,$00,$ff,$f0 DC.B $ff,$f0,$00,$ff,$f0 DC.B $ff,$f0,$00,$ff,$f0 DC.B $ff,$f0,$00,$ff,$f0 PictB3 DC.B $00,$00,$00,$00,$00 ;eject DC.B $00,$00,$f0,$00,$00 DC.B $00,$0f,$ff,$00,$00 DC.B $00,$ff,$ff,$f0,$00 DC.B $0f,$ff,$ff,$ff,$00 DC.B $00,$00,$00,$00,$00 DC.B $0f,$ff,$ff,$ff,$00 PictB4 DC.B $f0,$00,$f0,$00,$f0 ;skip reverse DC.B $f0,$0f,$f0,$0f,$f0 DC.B $f0,$ff,$f0,$ff,$f0 DC.B $ff,$ff,$ff,$ff,$f0 DC.B $f0,$ff,$f0,$ff,$f0 DC.B $f0,$0f,$f0,$0f,$f0 DC.B $f0,$00,$f0,$00,$f0 PictB5 DC.B $f0,$00,$f0,$00,$f0 ;skip forward DC.B $ff,$00,$ff,$00,$f0 DC.B $ff,$f0,$ff,$f0,$f0 DC.B $ff,$ff,$ff,$ff,$f0 DC.B $ff,$f0,$ff,$f0,$f0 DC.B $ff,$00,$ff,$00,$f0 DC.B $f0,$00,$f0,$00,$f0 PictB6 DC.B $00,$0f,$f0,$00,$f0 ;scan reverse DC.B $00,$ff,$f0,$0f,$f0 DC.B $0f,$ff,$f0,$ff,$f0 DC.B $ff,$ff,$ff,$ff,$f0 DC.B $0f,$ff,$f0,$ff,$f0 DC.B $00,$ff,$f0,$0f,$f0 DC.B $00,$0f,$f0,$00,$f0 PictB7 DC.B $f0,$00,$ff,$00,$00 ;scan forward DC.B $ff,$00,$ff,$f0,$00 DC.B $ff,$f0,$ff,$ff,$00 DC.B $ff,$ff,$ff,$ff,$f0 DC.B $ff,$f0,$ff,$ff,$00 DC.B $ff,$00,$ff,$f0,$00 DC.B $f0,$00,$ff,$00,$00 PictB8a DC.B $0f,$00,$0f,$00,$00 ;audio left DC.B $f0,$0f,$0f,$f0,$00 DC.B $f0,$f0,$0f,$ff,$f0 DC.B $f0,$f0,$0f,$ff,$f0 DC.B $f0,$f0,$0f,$ff,$f0 DC.B $f0,$0f,$0f,$f0,$00 DC.B $0f,$00,$0f,$00,$00 PictB8b DC.B $00,$00,$0f,$00,$00 ;audio left #2 DC.B $00,$00,$0f,$f0,$00 DC.B $00,$00,$0f,$ff,$f0 DC.B $00,$00,$0f,$ff,$f0 DC.B $00,$00,$0f,$ff,$f0 DC.B $00,$00,$0f,$f0,$00 DC.B $00,$00,$0f,$00,$00 PictB9a DC.B $00,$0f,$00,$0f,$00 ;audio right DC.B $00,$ff,$0f,$00,$f0 DC.B $ff,$ff,$00,$f0,$f0 DC.B $ff,$ff,$00,$f0,$f0 DC.B $ff,$ff,$00,$f0,$f0 DC.B $00,$ff,$0f,$00,$f0 DC.B $00,$0f,$00,$0f,$00 PictB9b DC.B $00,$0f,$00,$00,$00 ;audio right #2 DC.B $00,$ff,$00,$00,$00 DC.B $ff,$ff,$00,$00,$00 DC.B $ff,$ff,$00,$00,$00 DC.B $ff,$ff,$00,$00,$00 DC.B $00,$ff,$00,$00,$00 DC.B $00,$0f,$00,$00,$00 PictB10a DC.B $00,$00,$00,$00,$00 ;repeat DC.B $00,$00,$00,$f0,$00 DC.B $00,$00,$00,$ff,$00 DC.B $ff,$ff,$ff,$ff,$f0 DC.B $00,$00,$00,$ff,$00 DC.B $00,$00,$00,$f0,$00 DC.B $00,$00,$00,$00,$00 PictB10b DC.B $ff,$ff,$ff,$ff,$00 ;repeat #2 DC.B $00,$00,$00,$00,$f0 DC.B $00,$00,$0f,$00,$f0 DC.B $00,$00,$ff,$00,$f0 DC.B $00,$0f,$ff,$ff,$00 DC.B $00,$00,$ff,$00,$00 DC.B $00,$00,$0f,$00,$00 PictB11a DC.B $0f,$f0,$00,$ff,$f0 ;AB DC.B $f0,$0f,$00,$f0,$0f DC.B $f0,$0f,$00,$f0,$0f DC.B $ff,$ff,$00,$ff,$f0 DC.B $f0,$0f,$00,$f0,$0f DC.B $f0,$0f,$00,$f0,$0f DC.B $f0,$0f,$00,$ff,$f0 PictB11b DC.B $0f,$f0,$00,$0f,$f0 ;A ? DC.B $f0,$0f,$00,$f0,$0f DC.B $f0,$0f,$00,$f0,$0f DC.B $ff,$ff,$00,$00,$f0 DC.B $f0,$0f,$00,$0f,$00 DC.B $f0,$0f,$00,$00,$00 DC.B $f0,$0f,$00,$0f,$00 PictB11c DC.B $ff,$f0,$00,$0f,$f0 ;B ? DC.B $f0,$0f,$00,$f0,$0f DC.B $f0,$0f,$00,$f0,$0f DC.B $ff,$f0,$00,$00,$f0 DC.B $f0,$0f,$00,$0f,$00 DC.B $f0,$0f,$00,$00,$00 DC.B $ff,$f0,$00,$0f,$00 PictB11d DC.B $ff,$ff,$ff,$ff,$ff ;A->B DC.B $f0,$00,$00,$00,$0f DC.B $f0,$00,$00,$f0,$0f DC.B $f0,$00,$0f,$f0,$0f DC.B $ff,$f0,$ff,$ff,$ff DC.B $00,$00,$0f,$f0,$00 DC.B $00,$00,$00,$f0,$00 PictB12a DC.B $0f,$00,$ff,$f0,$ff ;shuffle OFF DC.B $f0,$f0,$f0,$00,$f0 DC.B $f0,$f0,$f0,$00,$f0 DC.B $f0,$f0,$ff,$00,$ff DC.B $f0,$f0,$f0,$00,$f0 DC.B $f0,$f0,$f0,$00,$f0 DC.B $0f,$00,$f0,$00,$f0 PictB12b DC.B $0f,$f0,$0f,$00,$f0 ;shuffle ON DC.B $f0,$0f,$0f,$00,$f0 DC.B $f0,$0f,$0f,$f0,$f0 DC.B $f0,$0f,$0f,$ff,$f0 DC.B $f0,$0f,$0f,$0f,$f0 DC.B $f0,$0f,$0f,$00,$f0 DC.B $0f,$f0,$0f,$00,$f0 PictB13 DC.B $00,$ff,$ff,$00,$00 ;time DC.B $0f,$00,$f0,$f0,$00 DC.B $f0,$00,$f0,$0f,$00 DC.B $f0,$ff,$f0,$0f,$f0 DC.B $f0,$00,$00,$0f,$00 DC.B $0f,$00,$00,$f0,$00 DC.B $00,$ff,$ff,$00,$00 ;------------------------------------------------------- ; Text Pictures ;------------------------------------------------------- PictT0 ;STOP text DC.B $3F,$F0,$FF,$F0,$3F,$C0,$FF,$C0,$00,$00,$00,$00,$00 DC.B $F0,$00,$0F,$00,$F0,$F0,$F0,$F0,$00,$00,$00,$00,$00 DC.B $3F,$C0,$0F,$00,$F0,$F0,$FF,$C0,$00,$00,$00,$00,$00 DC.B $00,$F0,$0F,$00,$F0,$F0,$F0,$00,$00,$00,$00,$00,$00 DC.B $FF,$C0,$0F,$00,$3F,$C0,$F0,$00,$00,$00,$00,$00,$00 PictT1 ;PLAY text DC.B $FF,$C0,$F0,$00,$3F,$C0,$F0,$F0,$00,$00,$00,$00,$00 DC.B $F0,$F0,$F0,$00,$F0,$F0,$F0,$F0,$00,$00,$00,$00,$00 DC.B $FF,$C0,$F0,$00,$FF,$F0,$3F,$C0,$00,$00,$00,$00,$00 DC.B $F0,$00,$F0,$00,$F0,$F0,$0F,$00,$00,$00,$00,$00,$00 DC.B $F0,$00,$FF,$F0,$F0,$F0,$0F,$00,$00,$00,$00,$00,$00 PictT2 ;PAUSE text DC.B $FF,$C0,$3F,$C0,$F0,$F0,$3F,$F0,$FF,$C0,$00,$00,$00 DC.B $F0,$F0,$F0,$F0,$F0,$F0,$F0,$00,$F0,$00,$00,$00,$00 DC.B $FF,$C0,$FF,$F0,$F0,$F0,$3F,$C0,$FF,$00,$00,$00,$00 DC.B $F0,$00,$F0,$F0,$F0,$F0,$00,$F0,$F0,$00,$00,$00,$00 DC.B $F0,$00,$F0,$F0,$3F,$C0,$FF,$C0,$FF,$C0,$00,$00,$00 PictT3 ;EJECT text DC.B $FF,$C0,$03,$C3,$FF,$03,$FC,$0F,$FF,$00 DC.B $F0,$00,$03,$C3,$C0,$0F,$0F,$00,$F0,$00 DC.B $FF,$00,$03,$C3,$FC,$0F,$00,$00,$F0,$00 DC.B $F0,$03,$C3,$C3,$C0,$0F,$0F,$00,$F0,$00 DC.B $FF,$C0,$FF,$03,$FF,$03,$FC,$00,$F0,$00 PictT4 ;TRACK text DC.B $FF,$F0,$FF,$C0,$3F,$C0,$3F,$C0,$F0,$F0 DC.B $0F,$00,$F0,$F0,$F0,$F0,$F0,$F0,$F3,$C0 DC.B $0F,$00,$FF,$C0,$FF,$F0,$F0,$00,$FF,$00 DC.B $0F,$00,$F3,$C0,$F0,$F0,$F0,$F0,$F3,$C0 DC.B $0F,$00,$F0,$F0,$F0,$F0,$3F,$C0,$F0,$F0 PictT5 ;SCAN text DC.B $3F,$F0,$3F,$C0,$3F,$C0,$F0,$F0 DC.B $F0,$00,$F0,$F0,$F0,$F0,$FC,$F0 DC.B $3F,$C0,$F0,$00,$FF,$F0,$FF,$F0 DC.B $00,$F0,$F0,$F0,$F0,$F0,$F3,$F0 DC.B $FF,$C0,$3F,$C0,$F0,$F0,$F0,$F0 PictT6 ;AUDIO text DC.B $3F,$C0,$F0,$F0,$FF,$C0,$F0,$3F,$C0 DC.B $F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0 DC.B $FF,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0 DC.B $F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0 DC.B $F0,$F0,$3F,$C0,$FF,$C0,$F0,$3F,$C0 PictT7 ;REPEAT text DC.B $FF,$C0,$FF,$C3,$FF,$03,$FF,$03,$FC,$0F,$FF,$00 DC.B $F0,$F0,$F0,$03,$C3,$C3,$C0,$0F,$0F,$00,$F0,$00 DC.B $FF,$C0,$FF,$03,$FF,$03,$FC,$0F,$FF,$00,$F0,$00 DC.B $F3,$C0,$F0,$03,$C0,$03,$C0,$0F,$0F,$00,$F0,$00 DC.B $F0,$F0,$FF,$C3,$C0,$03,$FF,$0F,$0F,$00,$F0,$00 PictT8 ;SHUFFLE text DC.B $3F,$F0,$F0,$F0,$F0,$F0,$FF,$C3,$FF,$0F,$00,$0F,$FC DC.B $F0,$00,$F0,$F0,$F0,$F0,$F0,$03,$C0,$0F,$00,$0F,$00 DC.B $3F,$C0,$FF,$F0,$F0,$F0,$FF,$03,$FC,$0F,$00,$0F,$F0 DC.B $00,$F0,$F0,$F0,$F0,$F0,$F0,$03,$C0,$0F,$00,$0F,$00 DC.B $FF,$C0,$F0,$F0,$3F,$C0,$F0,$03,$C0,$0F,$FF,$0F,$FC PictT9 ;TIME text DC.B $FF,$F0,$F0,$F0,$00,$F0,$FF,$F0 DC.B $0F,$00,$F0,$FF,$0F,$F0,$F0,$00 DC.B $0F,$00,$F0,$F3,$FC,$F0,$FF,$00 DC.B $0F,$00,$F0,$F0,$F0,$F0,$F0,$00 DC.B $0F,$00,$F0,$F0,$00,$F0,$FF,$F0 PictT10 ;ELAPSED text (display) DC.B $00,$00,$00,$FF,$F0,$F0,$00,$3F,$C0,$FF,$C0,$3F,$F0,$FF,$F0,$FF,$C0 DC.B $00,$00,$00,$F0,$00,$F0,$00,$F0,$F0,$F0,$F0,$F0,$00,$F0,$00,$F0,$F0 DC.B $00,$00,$00,$FF,$C0,$F0,$00,$FF,$F0,$FF,$C0,$3F,$C0,$FF,$C0,$F0,$F0 DC.B $00,$00,$00,$F0,$00,$F0,$00,$F0,$F0,$F0,$00,$00,$F0,$F0,$00,$F0,$F0 DC.B $00,$00,$00,$FF,$F0,$FF,$F0,$F0,$F0,$F0,$00,$FF,$C0,$FF,$F0,$FF,$C0 PictT11 ;REMAIN text (display) DC.B $FF,$C0,$FF,$F0,$F0,$00,$F0,$3F,$C0,$F0,$F0,$F0,$F0,$F0,$F0,$3F,$C0 DC.B $F0,$F0,$F0,$00,$FF,$0F,$F0,$F0,$F0,$F0,$FC,$F0,$F0,$FC,$F0,$F0,$F0 DC.B $FF,$C0,$FF,$00,$F3,$FC,$F0,$FF,$F0,$F0,$FF,$F0,$F0,$FF,$F0,$F0,$00 DC.B $F3,$C0,$F0,$00,$F0,$F0,$F0,$F0,$F0,$F0,$F3,$F0,$F0,$F3,$F0,$F0,$FC DC.B $F0,$F0,$FF,$F0,$F0,$00,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$3F,$C0 PictT12 ;NO DISC text (display) DC.B $F0,$F0,$3F,$C0,$0F,$FC,$0F,$03,$FF,$03,$FC,$00,$00 DC.B $FC,$F0,$F0,$F0,$0F,$0F,$0F,$0F,$00,$0F,$0F,$00,$00 DC.B $FF,$F0,$F0,$F0,$0F,$0F,$0F,$03,$FC,$0F,$00,$00,$00 DC.B $F3,$F0,$F0,$F0,$0F,$0F,$0F,$00,$0F,$0F,$0F,$00,$00 DC.B $F0,$F0,$3F,$C0,$0F,$FC,$0F,$0F,$FC,$03,$FC,$00,$00 PictT13 ;NO DRIVE text (display) DC.B $F0,$F0,$3F,$C0,$0F,$FC,$0F,$FC,$0F,$0F,$0F,$0F,$FF DC.B $FC,$F0,$F0,$F0,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$00 DC.B $FF,$F0,$F0,$F0,$0F,$0F,$0F,$FC,$0F,$0F,$0F,$0F,$F0 DC.B $F3,$F0,$F0,$F0,$0F,$0F,$0F,$3C,$0F,$0F,$0F,$0F,$00 DC.B $F0,$F0,$3F,$C0,$0F,$FC,$0F,$0F,$0F,$00,$F0,$0F,$FF PictT14 ;NO Audio text (display) DC.B $F0,$F0,$3F,$C0,$03,$FC,$0F,$0F,$0F,$FC,$0F,$03,$FC DC.B $FC,$F0,$F0,$F0,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F DC.B $FF,$F0,$F0,$F0,$0F,$FF,$0F,$0F,$0F,$0F,$0F,$0F,$0F DC.B $F3,$F0,$F0,$F0,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F DC.B $F0,$F0,$3F,$C0,$0F,$0F,$03,$FC,$0F,$FC,$0F,$03,$FC ;------------------------------------------------------- ; Text Pictures for 320 mode ;------------------------------------------------------- PictT0_320 ;STOP text DC.B $FF,$F0,$FF,$F0,$0F,$00,$FF,$F0,$00,$00,$00,$00,$00 DC.B $F0,$00,$0F,$00,$F0,$F0,$F0,$F0,$00,$00,$00,$00,$00 DC.B $FF,$F0,$0F,$00,$F0,$F0,$FF,$F0,$00,$00,$00,$00,$00 DC.B $00,$F0,$0F,$00,$F0,$F0,$F0,$00,$00,$00,$00,$00,$00 DC.B $FF,$F0,$0F,$00,$0F,$00,$F0,$00,$00,$00,$00,$00,$00 PictT1_320 ;PLAY text DC.B $FF,$F0,$F0,$00,$0F,$00,$F0,$F0,$00,$00,$00,$00,$00 DC.B $F0,$F0,$F0,$00,$F0,$F0,$F0,$F0,$00,$00,$00,$00,$00 DC.B $FF,$F0,$F0,$00,$FF,$F0,$FF,$F0,$00,$00,$00,$00,$00 DC.B $F0,$00,$F0,$00,$F0,$F0,$0F,$00,$00,$00,$00,$00,$00 DC.B $F0,$00,$FF,$F0,$F0,$F0,$0F,$00,$00,$00,$00,$00,$00 PictT2_320 ;PAUSE text DC.B $FF,$F0,$0F,$00,$F0,$F0,$FF,$F0,$FF,$F0,$00,$00,$00 DC.B $F0,$F0,$F0,$F0,$F0,$F0,$F0,$00,$F0,$00,$00,$00,$00 DC.B $FF,$F0,$FF,$F0,$F0,$F0,$FF,$F0,$FF,$00,$00,$00,$00 DC.B $F0,$00,$F0,$F0,$F0,$F0,$00,$F0,$F0,$00,$00,$00,$00 DC.B $F0,$00,$F0,$F0,$FF,$F0,$FF,$F0,$FF,$C0,$00,$00,$00 PictT3_320 ;EJECT text DC.B $FF,$F0,$00,$F0,$FF,$F0,$FF,$F0,$FF,$F0 DC.B $F0,$00,$00,$F0,$F0,$00,$F0,$00,$0F,$00 DC.B $FF,$00,$00,$F0,$FF,$00,$F0,$00,$0F,$00 DC.B $F0,$00,$F0,$F0,$F0,$00,$F0,$00,$0F,$00 DC.B $FF,$F0,$FF,$F0,$FF,$F0,$FF,$F0,$0F,$00 PictT4_320 ;TRACK text DC.B $FF,$F0,$FF,$F0,$0F,$00,$FF,$F0,$F0,$F0 DC.B $0F,$00,$F0,$F0,$F0,$F0,$F0,$00,$F0,$F0 DC.B $0F,$00,$FF,$00,$FF,$F0,$F0,$00,$FF,$00 DC.B $0F,$00,$F0,$F0,$F0,$F0,$F0,$00,$F0,$F0 DC.B $0F,$00,$F0,$F0,$F0,$F0,$FF,$F0,$F0,$F0 PictT5_320 ;SCAN text DC.B $FF,$F0,$FF,$F0,$0F,$00,$F0,$0F DC.B $F0,$00,$F0,$00,$F0,$F0,$FF,$0F DC.B $FF,$F0,$F0,$00,$FF,$F0,$FF,$FF DC.B $00,$F0,$F0,$00,$F0,$F0,$F0,$FF DC.B $FF,$F0,$FF,$F0,$F0,$F0,$F0,$0F PictT6_320 ;AUDIO text DC.B $0F,$00,$F0,$F0,$FF,$00,$F0,$0F,$00 DC.B $F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0 DC.B $FF,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0 DC.B $F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0 DC.B $F0,$F0,$FF,$F0,$FF,$00,$F0,$0F,$00 PictT7_320 ;REPEAT text DC.B $FF,$F0,$FF,$F0,$FF,$F0,$FF,$F0,$0F,$00,$FF,$F0 DC.B $F0,$F0,$F0,$00,$F0,$F0,$F0,$00,$F0,$F0,$0F,$00 DC.B $FF,$00,$FF,$00,$FF,$F0,$FF,$00,$FF,$F0,$0F,$00 DC.B $F0,$F0,$F0,$00,$F0,$00,$F0,$00,$F0,$F0,$0F,$00 DC.B $F0,$F0,$FF,$F0,$F0,$00,$FF,$F0,$F0,$F0,$0F,$00 PictT8_320 ;SHUFFLE text DC.B $FF,$F0,$F0,$F0,$F0,$F0,$FF,$0F,$F0,$F0,$00,$FF,$F0 DC.B $F0,$00,$F0,$F0,$F0,$F0,$F0,$0F,$00,$F0,$00,$F0,$00 DC.B $FF,$F0,$FF,$F0,$F0,$F0,$FF,$0F,$F0,$F0,$00,$FF,$00 DC.B $00,$F0,$F0,$F0,$F0,$F0,$F0,$0F,$00,$F0,$00,$F0,$00 DC.B $FF,$C0,$F0,$F0,$FF,$F0,$F0,$0F,$00,$FF,$F0,$FF,$F0 PictT9_320 ;TIME text DC.B $FF,$F0,$F0,$F0,$00,$F0,$FF,$F0 DC.B $0F,$00,$F0,$FF,$0F,$F0,$F0,$00 DC.B $0F,$00,$F0,$F0,$F0,$F0,$FF,$00 DC.B $0F,$00,$F0,$F0,$F0,$F0,$F0,$00 DC.B $0F,$00,$F0,$F0,$00,$F0,$FF,$F0 PictT10_320 ;ELAPSED text (display) DC.B $00,$00,$00,$FF,$F0,$F0,$00,$0F,$00,$FF,$F0,$FF,$F0,$FF,$F0,$FF,$00 DC.B $00,$00,$00,$F0,$00,$F0,$00,$F0,$F0,$F0,$F0,$F0,$00,$F0,$00,$F0,$F0 DC.B $00,$00,$00,$FF,$C0,$F0,$00,$FF,$F0,$FF,$F0,$FF,$F0,$FF,$C0,$F0,$F0 DC.B $00,$00,$00,$F0,$00,$F0,$00,$F0,$F0,$F0,$00,$00,$F0,$F0,$00,$F0,$F0 DC.B $00,$00,$00,$FF,$F0,$FF,$F0,$F0,$F0,$F0,$00,$FF,$F0,$FF,$F0,$FF,$00 PictT11_320 ;REMAIN text (display) DC.B $FF,$F0,$FF,$F0,$F0,$00,$F0,$0F,$00,$F0,$F0,$F0,$F0,$F0,$F0,$FF,$F0 DC.B $F0,$F0,$F0,$00,$FF,$0F,$F0,$F0,$F0,$F0,$FF,$F0,$F0,$FF,$F0,$F0,$00 DC.B $FF,$00,$FF,$00,$F0,$F0,$F0,$FF,$F0,$F0,$FF,$F0,$F0,$FF,$F0,$F0,$F0 DC.B $F0,$F0,$F0,$00,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0 DC.B $F0,$F0,$FF,$F0,$F0,$00,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$FF,$F0 PictT12_320 ;NO DISC text (display) DC.B $F0,$F0,$0F,$00,$0F,$F0,$0F,$0F,$FF,$0F,$FF,$00,$00 DC.B $FF,$F0,$F0,$F0,$0F,$0F,$0F,$0F,$00,$0F,$00,$00,$00 DC.B $FF,$F0,$F0,$F0,$0F,$0F,$0F,$0F,$FF,$0F,$00,$00,$00 DC.B $F0,$F0,$F0,$F0,$0F,$0F,$0F,$00,$0F,$0F,$00,$00,$00 DC.B $F0,$F0,$0F,$00,$0F,$F0,$0F,$0F,$FF,$0F,$FF,$00,$00 PictT13_320 ;NO DRIVE text (display) DC.B $F0,$F0,$0F,$00,$0F,$F0,$0F,$FF,$0F,$0F,$0F,$0F,$FF DC.B $FF,$F0,$F0,$F0,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$00 DC.B $FF,$F0,$F0,$F0,$0F,$0F,$0F,$F0,$0F,$0F,$0F,$0F,$F0 DC.B $F0,$F0,$F0,$F0,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$00 DC.B $F0,$F0,$0F,$00,$0F,$F0,$0F,$0F,$0F,$00,$F0,$0F,$FF PictT14_320 ;NO Audio text (display) DC.B $F0,$F0,$0F,$00,$00,$F0,$0F,$0F,$0F,$F0,$0F,$00,$F0 DC.B $FF,$F0,$F0,$F0,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F DC.B $FF,$F0,$F0,$F0,$0F,$FF,$0F,$0F,$0F,$0F,$0F,$0F,$0F DC.B $F0,$F0,$F0,$F0,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F DC.B $F0,$F0,$0F,$00,$0F,$0F,$0F,$FF,$0F,$F0,$0F,$00,$F0 PictIcon DC.B $00,$00,$00,$0f,$ff,$f0,$0f,$ff,$0f,$ff,$0f,$00,$f0,$ff,$f0,$ff,$f0,$ff,$f0,$ff,$f0 DC.B $00,$00,$00,$0f,$00,$f0,$0f,$00,$0f,$0f,$0f,$ff,$f0,$f0,$f0,$f0,$f0,$f0,$00,$0f,$00 DC.B $00,$00,$00,$0f,$00,$f0,$0f,$00,$0f,$0f,$0f,$ff,$f0,$ff,$f0,$ff,$f0,$f0,$00,$0f,$00 DC.B $00,$00,$00,$0f,$00,$f0,$0f,$ff,$0f,$ff,$0f,$00,$f0,$f0,$00,$f0,$f0,$ff,$f0,$0f,$00 DC.B $00,$00,$00,$0f,$00,$f0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $00,$ff,$ff,$ff,$00,$f0,$0f,$ff,$f0,$00,$ff,$ff,$ff,$ff,$f0,$00,$ff,$ff,$ff,$ff,$00 DC.B $0f,$00,$00,$00,$00,$f0,$0f,$00,$f0,$0f,$00,$00,$00,$00,$f0,$0f,$00,$00,$00,$00,$f0 DC.B $0f,$00,$00,$00,$00,$f0,$0f,$00,$f0,$0f,$00,$00,$00,$00,$f0,$0f,$00,$00,$00,$00,$f0 DC.B $0f,$00,$ff,$ff,$00,$f0,$0f,$00,$f0,$0f,$00,$ff,$ff,$ff,$f0,$0f,$00,$ff,$ff,$00,$f0 DC.B $0f,$00,$f0,$0f,$00,$f0,$0f,$00,$f0,$0f,$00,$f0,$00,$00,$00,$0f,$00,$f0,$0f,$00,$f0 DC.B $0f,$00,$f0,$0f,$00,$f0,$0f,$00,$f0,$0f,$00,$ff,$ff,$ff,$00,$0f,$00,$f0,$0f,$ff,$f0 DC.B $0f,$00,$f0,$0f,$00,$f0,$0f,$00,$f0,$0f,$00,$00,$00,$00,$f0,$0f,$00,$f0,$00,$00,$00 DC.B $0f,$00,$f0,$0f,$00,$f0,$0f,$00,$f0,$0f,$00,$00,$00,$00,$f0,$0f,$00,$f0,$00,$00,$00 DC.B $0f,$00,$f0,$0f,$00,$f0,$0f,$00,$f0,$00,$ff,$ff,$ff,$00,$f0,$0f,$00,$f0,$0f,$ff,$f0 DC.B $0f,$00,$f0,$0f,$00,$f0,$0f,$00,$f0,$00,$00,$00,$0f,$00,$f0,$0f,$00,$f0,$0f,$00,$f0 DC.B $0f,$00,$ff,$ff,$00,$f0,$0f,$00,$f0,$0f,$ff,$ff,$ff,$00,$f0,$0f,$00,$ff,$ff,$00,$f0 DC.B $0f,$00,$00,$00,$00,$f0,$0f,$00,$f0,$0f,$00,$00,$00,$00,$f0,$0f,$00,$00,$00,$00,$f0 DC.B $0f,$00,$00,$00,$00,$f0,$0f,$00,$f0,$0f,$00,$00,$00,$00,$f0,$0f,$00,$00,$00,$00,$f0 DC.B $00,$ff,$ff,$ff,$ff,$f0,$0f,$ff,$f0,$0f,$ff,$ff,$ff,$ff,$00,$00,$ff,$ff,$ff,$ff,$00 DC.B $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DC.B $ff,$00,$f0,$ff,$f0,$f0,$ff,$f0,$ff,$f0,$f0,$00,$0f,$ff,$0f,$0f,$0f,$f0,$0f,$0f,$ff DC.B $f0,$f0,$f0,$f0,$00,$f0,$0f,$00,$f0,$f0,$f0,$00,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f DC.B $f0,$f0,$f0,$f0,$f0,$f0,$0f,$00,$ff,$f0,$f0,$00,$0f,$ff,$0f,$0f,$0f,$0f,$0f,$0f,$0f DC.B $ff,$00,$f0,$ff,$f0,$f0,$0f,$00,$f0,$f0,$ff,$f0,$0f,$0f,$0f,$ff,$0f,$f0,$0f,$0f,$ff PictApple DC.B $00,$00,$fc,$00 DC.B $00,$03,$f0,$00 DC.B $0f,$fc,$3f,$fc DC.B $ff,$ff,$ff,$c0 DC.B $ff,$ff,$ff,$c0 DC.B $ff,$ff,$ff,$ff DC.B $3f,$ff,$ff,$fc DC.B $03,$fc,$3f,$c0 PictApple_320 DC.B $00,$00,$f0,$00 DC.B $00,$00,$f0,$00 DC.B $0f,$f0,$0f,$f0 DC.B $ff,$ff,$ff,$00 DC.B $ff,$ff,$ff,$00 DC.B $ff,$ff,$ff,$ff DC.B $0f,$ff,$ff,$f0 DC.B $00,$f0,$0f,$00 PictAbout DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $0f,$f0,$ff,$0f,$f0,$ff,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $0f,$ff,$ff,$ff,$ff,$ff,$0f DC.B $0f,$ff,$ff,$ff,$ff,$ff,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $0f,$f0,$ff,$0f,$f0,$ff,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $0f,$f0,$ff,$0f,$f0,$ff,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $0f,$f0,$ff,$00,$00,$00,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $00,$00,$00,$00,$00,$00,$0f DC.B $00,$00,$00,$00,$00,$00,$0f PictMapL DC.L Pict0L DC.L Pict1L DC.L Pict2L DC.L Pict3L DC.L Pict4L DC.L Pict5L DC.L Pict6L DC.L Pict7L DC.L Pict8L DC.L Pict9L PictMapS DC.L Pict0S DC.L Pict1S DC.L Pict2S DC.L Pict3S DC.L Pict4S DC.L Pict5S DC.L Pict6S DC.L Pict7S DC.L Pict8S DC.L Pict9S PictMapB DC.L PictB0 DC.L PictB1 DC.L PictB2 DC.L PictB3 DC.L PictB4 DC.L PictB5 DC.L PictB6 DC.L PictB7 AudLPtr DC.L PictB8a AudRPtr DC.L PictB9a RepPtr DC.L PictB10a ABPtr DC.L PictB11a RndPtr DC.L PictB12a DC.L PictB13 PictMapT DC.L PictT0 ;stop DC.L PictT1 ;play DC.L PictT2 ;pause DC.L PictT3 ;eject DC.L PictT4 ;track DC.L PictT5 ;scan DC.L PictT6 ;audio DC.L PictT7 ;repeat DC.L PictT8 ;shuffle DC.L PictT9 ;time DC.L PictT9 ;time DC.L PictT10 ;elapsed DC.L PictT11 ;remaining DC.L PictT0 ;stop (display) DC.L PictT1 ;play (display) DC.L PictT2 ;pause (display) DC.L PictT12 ;no disc (display) DC.L PictT13 ;no drive (display) DC.L PictT14 ;no audio (display) PictMapT_320 DC.L PictT0_320 ;stop DC.L PictT1_320 ;play DC.L PictT2_320 ;pause DC.L PictT3_320 ;eject DC.L PictT4_320 ;track DC.L PictT5_320 ;scan DC.L PictT6_320 ;audio DC.L PictT7_320 ;repeat DC.L PictT8_320 ;shuffle DC.L PictT9_320 ;time DC.L PictT9_320 ;time DC.L PictT10_320 ;elapsed DC.L PictT11_320 ;remaining DC.L PictT0_320 ;stop (display) DC.L PictT1_320 ;play (display) DC.L PictT2_320 ;pause (display) DC.L PictT12_320 ;no disc (display) DC.L PictT13_320 ;no drive (display) DC.L PictT14_320 ;no audio (display) ENDP *===============================================* * Draw the NDA Window * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* EXPORT DrawWin DrawWin PROC IMPORT DrawText IMPORT DrawButtons IMPORT DrawIcon IMPORT DrawApple IMPORT DrawColon IMPORT DrawText PushWord _GetMasterSCB ;check for 320 mode pla and #$0080 sta DisplayMode beq mode320 mode640 ;set 640 mode values lda #RectTbl1 sta RectTblPtr lda #^RectTbl1 sta RectTblPtr+2 lda #IconRect sta IconRectPtr lda #^IconRect sta IconRectPtr+2 PushLong #DispRect ;display's frame rect PushWord #28 ;oval width PushWord #11 ;oval height PushLong #DispRect ;erase part of it PushWord #28 PushWord #11 PushLong #DSRect ;drop-shadow rect PushWord #28 ;oval width PushWord #11 ;oval height PushLong #WinRect PushWord #2 ;pen width PushWord #1 ;pen height PushLong #Pattern2 PushWord #colorWin PushWord #colorOut PushWord #colorTxt bra set mode320 ;set 320 mode values lda #Rect320Tbl1 sta RectTblPtr lda #^Rect320Tbl1 sta RectTblPtr+2 lda #IconRect320 sta IconRectPtr lda #^IconRect320 sta IconRectPtr+2 PushLong #DispRect320 ;display's frame rect PushWord #28/2 ;oval width PushWord #11 ;oval height PushLong #DispRect320 ;erase part of it PushWord #28/2 PushWord #11 PushLong #DSRect320 ;drop-shadow rect PushWord #28/2 ;oval width PushWord #11 ;oval height PushLong #WinRect320 PushWord #1 ;pen width PushWord #1 ;pen height PushLong #Pattern2 PushWord #colorWin PushWord #colorOut320 PushWord #colorTxt320 set _SetForeColor _SetSolidPenPat _SetBackColor _SetBackPat _SetPenSize _EraseRect ;make content region black _PaintRRect ;display's drop-shadow _EraseRRect _FrameRRect ;display's frame lda #0 ;draw button strings @loop pha jsr DrawText pla inc A cmp #10 bcc @loop jsr DrawButtons ;draw the buttons lda #0 jsr DrawIcon ;draw disc icon jsr DrawApple ;Apple picture jsr DrawColon ;draw time colon lda #10 jsr DrawText ;draw time display text rts ENDP *===============================================* * Draw the About Window * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* EXPORT DrawAbout DrawAbout PROC lda #4 ;draw 5 strings loop pha bne cont ;(title is bold) PushWord #1 ;bold _SetTextFace lda 1,s cont asl A asl A ;(4 byte pointers) tax phx PushWord #0 ;space for width value PushLong AStrPtr,x _StringWidth PullWord Width lda DisplayMode beq do320 lda #dhW2 bra cont2 do320 lda #dhW2_320 cont2 sec sbc Width lsr A plx sta StrPoint+2,x ;center string in window PushLong AStrPtr,x PushLong StrPoint,x _MoveTo _DrawString pla dec A bpl loop PushLong #PictInfo ;draw About picture PushLong #PictRect PushLong PictYX PushWord #$0000 _PPToPort PushWord #2 ;pen width PushWord #1 ;pen height _SetPenSize rts PictInfo DC.W $0080 ;port SCB DC.L PictAbout ;picture ptr DC.W 7 ;picture width (bytes) PictRect DC.W 0,0,dvR,dhR ;bounds rect PictYX DC.W 10,40 ;coordinates Width DS.B 2 DiscRect DC.W 10,228,10+20,228+50 ;bounds rect ENDP *===============================================* * Draw Time Display (00:00) * * * * INPUT: min (X-Reg), sec (A-Reg) * * * * OUTPUT: none * * * *===============================================* EXPORT DrawTime DrawTime PROC PushLong #0 ;working space PushLong #0 phx ;X-reg has MIN pha ;A-reg has SEC and #$000F ;get 1st SEC digit cmp #$000A bcc ok1 lda #$0000 ok1 asl A asl A ;A*4 sta 5,s ;save offset pla and #$00F0 ;get 2nd SEC digit cmp #$00A0 bcc ok2 lda #$0000 ok2 lsr A lsr A ;(A/16)*4 sta 5,s ;save offset lda 1,s and #$000F ;get 1st MIN digit cmp #$000A bcc ok3 lda #$0000 ok3 asl A asl A ;A*4 sta 7,s ;save offset pla and #$00F0 ;get 2nd MIN digit cmp #$00A0 bcc ok4 lda #$0000 ok4 lsr A lsr A ;(A/16)*4 sta 7,s ;save offset lda DisplayMode beq do320a lda #$0080 sta LocInfoS ;port SCB lda #dhPS sta PictRectS+6 ;horizontal width bra drawIt do320a lda #$0000 sta LocInfoS ;port SCB lda #dhPS/2 sta PictRectS+6 ;horizontal width drawIt ldy #6 loop plx ;get offset phy ;save for next pass lda PictMapS+2,x ;get ptr to image sta PictPtrS+2 lda PictMapS,x sta PictPtrS PushLong #LocInfoS PushLong #PictRectS lda DisplayMode beq do320b lda PictX,y bra cont do320b lda PictX320,y cont pha PushWord PictY,y PushWord #penMode _PPToPort ;draw digit ply dey dey bpl loop rts PictX DC.W h5 ;picture coordinates DC.W h5+dhN DC.W h5+5+2*dhN DC.W h5+5+3*dhN PictX320 DC.W h5/2 DC.W (h5+dhN)/2 DC.W (h5+5+2*dhN)/2 DC.W (h5+5+3*dhN)/2 PictY DC.W v2+9 DC.W v2+9 DC.W v2+9 DC.W v2+9 ENDP *===============================================* * Draw Time Display Colon (:) * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* EXPORT DrawColon DrawColon PROC lda DisplayMode beq do320 lda #$0080 sta LocInfoC ;port SCB lda #dhC sta PictRectC+6 ;horizontal width lda #pictCX sta PictPoint+2 bra drawIt do320 lda #$0000 sta LocInfoC ;port SCB lda #dhC/2 sta PictRectC+6 ;horizontal width lda #pictCX/2+1 sta PictPoint+2 drawIt lda #pictCY sta PictPoint PushLong #LocInfoC PushLong #PictRectC PushLong PictPoint PushWord #penMode _PPToPort rts ENDP *===============================================* * Draw Track Display * * * * INPUT: track (A-Reg) * * * * OUTPUT: none * * * *===============================================* EXPORT DrawTrack DrawTrack PROC pha and #$000F ;get 1st digit cmp #$000A bcs digit2 ;bad digit! asl A asl A ;A*4 tax lda DisplayMode beq do320a lda #$0080 sta LocInfoL ;port SCB lda #dhPL sta PictRectL+6 ;horizontal width lda #pictX2L sta PictPoint+2 bra pp1 do320a lda #$0000 sta LocInfoL ;port SCB lda #dhPL/2 sta PictRectL+6 ;horizontal width lda #pictX2L/2 sta PictPoint+2 pp1 lda #pictY2L sta PictPoint lda PictMapL+2,x sta PictPtrL+2 lda PictMapL,x sta PictPtrL PushLong #LocInfoL PushLong #PictRectL PushLong PictPoint PushWord #penMode _PPToPort ;draw digit 1 digit2 pla and #$00F0 ;get 2nd digit cmp #$00A0 bcs exit ;bad digit! lsr A lsr A ;(A/16)*4 tax lda DisplayMode beq do320b lda #pictX1L sta PictPoint+2 bra pp2 do320b lda #pictX1L/2 sta PictPoint+2 pp2 lda #pictY1L sta PictPoint lda PictMapL+2,x sta PictPtrL+2 lda PictMapL,x sta PictPtrL PushLong #LocInfoL PushLong #PictRectL PushLong PictPoint PushWord #penMode _PPToPort ;draw digit 2 exit rts ENDP *===============================================* * Draw Buttons/Draw Button * * * * INPUT: buttonNum (A-Reg) * * * * OUTPUT: none * * * *===============================================* EXPORT DrawButtons DrawButtons PROC ;draw buttons ldy #nButton-1 ;number of labels @loop phy tya jsr DrawButton ply dey bpl @loop rts EXPORT DrawButton ENTRY DrawButton DrawButton pha and #$8000 sta PictMode ;$8000=inverse, $0000=normal pla and #$00FF cmp #nButton bcc okay brl exit ;out of range okay asl A asl A tax phx ;save for paint lda PictMode bmi invert lda DisplayMode beq draw320 draw640 PushLong RectTbl1,x ;button frame parameters PushWord #dhO PushWord #dvO PushLong RectTbl1,x ;erase parameters PushWord #dhO PushWord #dvO PushLong RectTbl2,x ;drop shadow parameters PushWord #dhO PushWord #dvO PushLong #GrayPattern bra drawIt draw320 PushLong Rect320Tbl1,x ;button frame parameters PushWord #dhO/2 PushWord #dvO PushLong Rect320Tbl1,x ;erase parameters PushWord #dhO/2 PushWord #dvO PushLong Rect320Tbl2,x ;drop shadow parameters PushWord #dhO/2 PushWord #dvO PushLong #GrayPattern320 drawIt _FillRRect ;draw drop-shadow _EraseRRect ;erase part of it _FrameRRect ;draw frame bra paint invert lda DisplayMode beq invert320 PushLong RectTbl3,x ;draw parameters PushWord #dhO PushWord #dvO PushLong RectTbl1,x ;erase parameters PushWord #dhO PushWord #dvO bra invertIt invert320 PushLong Rect320Tbl3,x ;draw parameters PushWord #dhO/2 PushWord #dvO PushLong Rect320Tbl1,x ;erase parameters PushWord #dhO/2 PushWord #dvO invertIt _EraseRRect ;erase button & shadow _PaintRRect ;draw inverted button paint plx lda PictMapB+2,x ;get ptr to image sta PictPtrB+2 lda PictMapB,x sta PictPtrB txa lsr a ;word table tax lda PictY,x ;get position tay lda PictX,x tax lda PictMode bpl paint2 inx ;shift it down inx iny paint2 lda DisplayMode beq paint320 lda #$0080 sta LocInfoB ;port SCB lda #dhL sta PictRectB+6 ;horizontal width bra paint3 paint320 lda #$0000 sta LocInfoB ;port SCB lda #dhL/2 sta PictRectB+6 ;horizontal width txa lsr a ;half tax paint3 PushLong #LocInfoB PushLong #PictRectB phx phy PushWord PictMode _PPToPort ;draw image on button exit rts EXPORT SetRepL ENTRY SetRepL SetRepL cmp #1 beq repeat lda #PictB10a ;repeat off ldx #^PictB10a bra endFlip repeat lda #PictB10b ;repeat on ldx #^PictB10b endFlip sta RepPtr stx RepPtr+2 rts EXPORT SetRndL ENTRY SetRndL SetRndL cmp #1 beq random lda #PictB12a ;random off ldx #^PictB12a bra endRnd random lda #PictB12b ;random on ldx #^PictB12b endRnd sta RndPtr stx RndPtr+2 rts EXPORT SetLAudL ENTRY SetLAudL SetLAudL and #$8000 beq leftOff lda #PictB8a ;left on ldx #^PictB8a bra endLeft leftOff lda #PictB8b ;left off ldx #^PictB8b endLeft sta AudLPtr stx AudLPtr+2 rts EXPORT SetRAudL ENTRY SetRAudL SetRAudL and #$4000 beq rightOff lda #PictB9a ;right on ldx #^PictB9a bra endRight rightOff lda #PictB9b ;right off ldx #^PictB9b endRight sta AudRPtr stx AudRPtr+2 rts EXPORT SetABL ENTRY SetABL SetABL cmp #1 beq setA cmp #2 beq setB cmp #4 beq setOn lda #PictB11a ;AB ldx #^PictB11a bra endAB setA lda #PictB11b ;A ? ldx #^PictB11b bra endAB setB lda #PictB11c ;B ? ldx #^PictB11c bra endAB setOn lda #PictB11d ;A->B ldx #^PictB11d endAB sta ABPtr stx ABPtr+2 rts PictX DC.W h1+11 ;stop DC.W h2+11 ;play DC.W h3+11 ;pause DC.W h4+11 ;eject DC.W h1+11 ;track DC.W h2+11 DC.W h3+11 ;scan DC.W h4+11 DC.W h1+11 ;audio DC.W h2+11 DC.W h3+11 ;repeat DC.W h4+10 ;AB DC.W h1+10 ;shuffle DC.W h2+11 ;time PictY DC.W v1+2 ;stop DC.W v1+2 ;play DC.W v1+2 ;pause DC.W v1+2 ;eject DC.W v3+2 ;track DC.W v3+2 DC.W v3+2 ;scan DC.W v3+2 DC.W v4+2 ;audio DC.W v4+2 DC.W v4+2 ;repeat DC.W v4+2 ;AB DC.W v5+2 ;shuffle DC.W v5+2 ;time PictMode DS.B 2 ENDP *===============================================* * Draw Text (bit image) * * * * INPUT: textNum (A-Reg) * * * * OUTPUT: none * * * *===============================================* EXPORT DrawText DrawText PROC cmp #nText+1 bcs exit ;out of range asl a tax ;(word table) lda PictWdth,x sta PictByteT ;width in bytes asl A asl A sta PictRectT+6 ;width in pixels lda PictY,x ;window position sta PictPoint lda PictX,x sta PictPoint+2 txa asl a tax ;(long table) lda DisplayMode beq do320 lda #$0080 sta LocInfoT ;port SCB lda PictMapT,x sta PictPtrT ;pointer to image lda PictMapT+2,x sta PictPtrT+2 bra cont do320 lda #$0000 sta LocInfoT ;port SCB lsr PictRectT+6 ;half hort. width lsr PictPoint+2 ;half hort. position lda PictMapT_320,x sta PictPtrT ;pointer to image lda PictMapT_320+2,x sta PictPtrT+2 cont PushLong #LocInfoT PushLong #PictRectT PushLong PictPoint PushWord #$0000 ;copy to dest _PPToPort ;draw text image exit rts EXPORT DrawMode ENTRY DrawMode DrawMode clc adc #13 ;mapping jmp DrawText PictWdth DC.W 13,13,13,10 ;bytes per line DC.W 10,8,9,12 DC.W 13,8,8,17 DC.W 17,13,13,13 DC.W 13,13,13 PictX DC.W h1+dhB/2-tw0 ;stop DC.W h2+dhB/2-tw1 ;play DC.W h3+dhB/2-tw2 ;pause DC.W h4+dhB/2-tw3 ;eject DC.W h1+dhB+dhS/2-tw4 ;track DC.W h3+dhB+dhS/2-tw5 ;scan DC.W h1+dhB+dhS/2-tw6 ;audio DC.W h3+dhB+dhS/2-tw7 ;repeat DC.W h1+dhB/2-tw8 ;shuffle DC.W h2+dhB/2-tw9 ;time DC.W h5-4-32 ;time (display) DC.W h5-4-68 ;elapsed (display) DC.W h5-4-68 ;remaining (display) DC.W h5 ;stop (display) DC.W h5 ;play (display) DC.W h5 ;pause (display) DC.W h5 ;no disc (display) DC.W h5 ;no drive (display) DC.W h5 ;no audio (display) PictY DC.W v1-7 ;stop DC.W v1-7 ;play DC.W v1-7 ;pause DC.W v1-7 ;eject DC.W v3-7 ;track DC.W v3-7 ;scan DC.W v4-7 ;audio DC.W v4-7 ;repeat DC.W v5-7 ;shuffle DC.W v5-7 ;time DC.W v2+9 ;time (display) DC.W v2+15 ;elapsed (display) DC.W v2+15 ;remaining (display) DC.W v2+2 ;stop (display) DC.W v2+2 ;play (display) DC.W v2+2 ;pause (display) DC.W v2+2 ;no disc (display) DC.W v2+2 ;no drive (display) DC.W v2+2 ;no audio (display) ENDP *===============================================* * Draw disc Icon * * * * INPUT: mode (A-Reg) $8000 = inverse * * $0000 = normal * * * * OUTPUT: none * * * *===============================================* EXPORT DrawIcon DrawIcon PROC sta PictMode ;$8000=inverse, $0000=normal lda DisplayMode beq do320 lda #$0080 sta LocInfoI ;port SCB lda #dhI sta PictRectI+6 ;horizontal width lda #h6 sta PictPoint+2 bra cont do320 lda #$0000 sta LocInfoI ;port SCB lda #dhI/2 sta PictRectI+6 ;horizontal width lda #h6/2 sta PictPoint+2 cont lda #v6 sta PictPoint PushLong #LocInfoI PushLong #PictRectI PushLong PictPoint PushWord PictMode _PPToPort ;draw image rts ENDP *===============================================* * Draw Apple Picture * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* DrawApple PROC lda DisplayMode beq do320 lda #$0080 sta LocInfoA ;port SCB lda #dhA sta PictRectA+6 ;horizontal width lda #h1 sta PictPoint+2 lda #^PictApple ;get ptr to image sta PictPtrA+2 lda #PictApple sta PictPtrA bra cont do320 lda #$0000 sta LocInfoA ;port SCB lda #dhA/2 sta PictRectA+6 ;horizontal width lda #h1/2 sta PictPoint+2 lda #^PictApple_320 ;get ptr to image sta PictPtrA+2 lda #PictApple_320 sta PictPtrA cont lda #dvW1-4-dvA sta PictPoint PushLong #LocInfoA PushLong #PictRectA PushLong PictPoint PushWord #$0000 _PPToPort rts ENDP ;--------------------------------------- END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CDRemote/draw.equ b/IIGS.601.SRC/A.U.G/CDRemote/draw.equ new file mode 100644 index 0000000..c4457aa --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CDRemote/draw.equ @@ -0,0 +1 @@ +* * * * * * * * * * * * * * * * * * * * * * * * * * File: Draw.equ (equates for Draw.aii) * * * * For CD-Remote (A New Desk Accessory) * * * * Author: Don Brady * * * * Build File: CDRemote.make * * * * Copyright © APPLE Computer, Inc. 1987,1988 * * All Rights Reserved. * * * * * * * * * * * * * * * * * * * * * * * * * * * * nButton equ 14 ;number of buttons nText equ 19 ;number of text images nStrings equ 4 ;number of strings colorWin equ 0 ;window color (black) colorTxt equ 3 ;text color (white) colorOut equ 3 ;outline color (white) colorTxt320 equ 15 ;text color (white 320) colorOut320 equ 15 ;outline color (white 320) dhB equ 40 ;width of buttons dvB equ 11 ;height of butons dhS equ 14 ;hort space dvS equ 12 ;vert space dhD equ 4*dhB+3*dhS+4 ;width of display dvD equ 23 ;height of display h1 equ 10 ;horizontal offsets h2 equ h1+dhB+dhS h3 equ h2+dhB+dhS h4 equ h3+dhB+dhS h1A equ h1+4 h2A equ h2+4 h3A equ h3+4 h4A equ h4+4 v1 equ 10 ;vertical offsets v2 equ v1+dvB+5 v3 equ v2+dvD+dvS-2 v4 equ v3+dvB+dvS v5 equ v4+dvB+dvS v6 equ v5+dvB+2 v1A equ v1+2 v2A equ v2+2 v3A equ v3+2 v4A equ v4+2 v5A equ v5+2 dhO equ 13 ;width of button oval dvO equ 5 ;height of button oval dhPL equ 18 ;width of large picture dvPL equ 17 ;height of large picture dhPS equ 12 ;width of small picture dvPS equ 11 ;height of small picture dhL equ 20 ;width of label dvL equ 7 ;height of label dhI equ 84 ;width of disc icon dvI equ 24 ;height of disc icon dhR equ 26 ;width of Remote picture dvR equ 20 ;height of Remote picture dhA equ 16 ;width of Apple picture dvA equ 8 ;height of Apple picture dhN equ 15 ;width of number dvN equ 11 ;height of number dhC equ 2 ;width of colon dvC equ 11 ;height of colon dhT equ 56 ;width of text picture dvT equ 5 ;height of text picture dhW1 equ h1*2+dhD ;width of NDA window dvW1 equ v6+dvI+4 ;height of NDA window dhW2 equ 300 ;width of About window dhW2_320 equ 265 ;width of About window dvW2 equ 80 ;height of About window h5 equ dhW1-2*h1-4*dhN-3 h6 equ dhW1-h1-dhI+2 pictX1L equ 2*h1 ;picture coordinates pictX2L equ pictX1L+6+dhPL pictY1L equ v2+3 pictY2L equ v2+3 pictCX equ h5+2*dhN ;picture coordinates pictCY equ v2+9 tw0 equ 30/2 ;text string widths tw1 equ 30/2 tw2 equ 37/2 tw3 equ 36/2 tw4 equ 38/2 tw5 equ 30/2 tw6 equ 34/2 tw7 equ 42/2 tw8 equ 49/2 tw9 equ 27/2 penMode equ 0 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CDRemote/spdriver.aii b/IIGS.601.SRC/A.U.G/CDRemote/spdriver.aii new file mode 100644 index 0000000..ce66c98 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CDRemote/spdriver.aii @@ -0,0 +1 @@ + ************************************************************** * NOTE--This file is no longer used. See the makefile. --DAL ************************************************************** * * * * * * * * * * * * * * * * * * * * * * * * * * File: SPDRIVER.aii * * * * SmartPort Driver to AppleCD SCª (RUBY) drive * * Module for CD-Remote (A New Desk Accessory) * * * * Date: 8/27/87 (created) * * Author: Don Brady * * * * Build File: CDRemote.make * * * * Copyright © APPLE Computer, Inc. 1987,1988 * * * * Modification History: * * Version 1.0 * * 01/18/88 Released A1 today * * 02/11/88 Released A2 today * * 02/17/88 Converted to MAX (from APW) today * * 03/21/88 Release A4 today * * 04/01/88 Release B1 today * * 04/13/88 Release B2 (informal) today * * 04/15/88 Release B3 today * * 04/17/88 Release B4 (informal) today * * 04/18/88 Final Release today * * * * * * * * * * * * * * * * * * * * * * * * * * ;............................................................... ; ; Set Memory & A register to 8 bits ;............................................................... MACRO shortm sep #%00100000 longa off MEND ;............................................................... ; ; Set Memory & A register to 16 bits ;............................................................... MACRO longm rep #%00100000 longa on MEND ;............................................................... ; ; Set Memory & registers to 16 bits ;............................................................... MACRO SetLong rep #%00110000 longa on longi on MEND ;............................................................... ; ; Set Memory & registers to 8 bits ;............................................................... MACRO SetShort sep #%00110000 longa off longi off MEND ;----------------------------------------------- ; ; Imported data address (from CDRemote.aii) ; ;----------------------------------------------- IMPORT CDAFrame IMPORT CDAMin IMPORT CDASec IMPORT CDATime IMPORT CDCurTrk IMPORT CDData IMPORT CDFrame IMPORT CDMaxTrk IMPORT CDMin IMPORT CDMinTrk IMPORT CDSec IMPORT CDTrkCnt include 'all.macros' *===============================================* * Data for SmartPort Driver * *===============================================* SPData PROC ENTRY SPBuffer ENTRY SPCode ENTRY SPCount ENTRY AudioBuffer ENTRY InitError ENTRY SPList ENTRY Units ENTRY Slot ENTRY IsOnLine ENTRY SPUnit ENTRY Params ENTRY SPBuffPtr ENTRY PlayMode ENTRY AControl ENTRY ATrack ENTRY AIndex ENTRY AMin ENTRY ASec ENTRY AFrame ENTRY SPErrStr ENTRY EndStr ENTRY SenseKey ENTRY SenseCode ENTRY ErrorCode ENTRY ControlCode ENTRY EntryAddr IsOnLine DC.W 0 ;boolean flag InitError DC.W 0 ;0 = okay, else error Slot DC.W 0 ;SCSI card slot Units DC.W 0 ;how many units Params DC.W 0 ;parameter block for Version SPBuffer DS.B 32 ;SP I/O buffer AudioBuffer DS.B 4*99 ;Audio I/O buffer SPList ;SP parameter list SPCount DS.B 1 ;parameter count SPUnit DS.B 1 ;unit number SPBuffPtr DC.L SPBuffer ;buffer ptr SPCode DS.B 10 ;other stuff PlayMode dc.w 9 ;default = stereo AControl dc.w 0 ATrack dc.w 0 AIndex dc.w 0 AMin dc.w 0 ;not used ???? ASec dc.w 0 AFrame dc.w 0 STRING ASIS SPErrStr DC.B EndStr-SPErrStr-1 DC.B 'SmartPort error - $' ErrorCode DC.B 'XX' DC.B $0D DC.B 'Control Code - $' ControlCode DC.B 'XX' DC.B $0D DC.B 'Sense key/code - $' SenseKey DC.B 'XX, $' SenseCode DC.B 'XX' DC.B $0D DC.B 'SP Dispatch - $' EntryAddr DC.B 'XXXXXX' EndStr ENDP *===============================================* * Initialize SmartPort * * - make sure Prodos is ver. 1.0 (ie not 2.0) * * - look for SCSI Card Rev C * * - look for a AppleCD SC (RUBY) drive * * - set dispatch address * * - check if device is online * * * * INPUT: none * * * * OUTPUT: ErrorCode (A-Reg) * * $0000 = okay * * $8000 = no RUBY drive * * $4000 = no SCSI Rev C * * $2000 = no SCSI card * * $1000 = not ProDos16 1.0 * *===============================================* EXPORT SPInit EXPORT SPInit2 SPInit PROC IMPORT GetSCSI IMPORT GetCDROM IMPORT SPCall ; _GET_VERSION Params ; lda Params ; and #$7F00 ; cmp #$0100 ;is it ProDos 16 1.0 ? ; beq SPInit2 ; lda #$1000 ; sta InitError ; bra exit ENTRY SPInit2 ;for the "backdoor" SPInit2 lda #$2000 ;no SCSI card yet sta InitError ldx #7 ;start in slot 7 loop jsr GetSCSI bcc next jsr GetCDROM bcs found next dex bne loop lda InitError bne exit lda #$8000 ;no RUBY drive bra exit found stx Slot ;SCSI slot lda #$00 ;Status Code sta SPCode lda #^SPBuffer sta SPBuffPtr+2 lda #SPBuffer sta SPBuffPtr lda #$40 ;command ldx #$03 ;param count jsr SPCall ;do status call cmp #0 bne offline lda SPBuffer and #$0010 ;look at online bit bne online offline stz IsOnLine bra done online lda #1 sta IsOnLine done lda #$0000 ;no error exit cmp #1 rts ENDP *===============================================* * Get SCSI Card * * - look for a SCSI card in current slot * * * * INPUT: none * * * * OUTPUT: found (carry bit) 1=yes, 0=no * * * *===============================================* GetSCSI PROC IMPORT SPEntry phx txa and #$000F ora #$C0 xba tax lda $E00001,x ;check SP signatures and #$00FF cmp #$20 bne noSCSI lda $E00003,x and #$00FF cmp #$00 bne noSCSI lda $E00005,x and #$00FF cmp #$03 bne noSCSI lda $E00007,x and #$00FF cmp #$00 bne noSCSI lda $E000FB,x ;check for SCSI card ID and #$00FF cmp #$82 bne noSCSI phx ;slot lda $E000FF,x ;get SP offset value and #$00FF clc adc 1,s ;slot ($Cn00) clc adc #$0003 ;sp offset sta >SPEntry+1 ;set SP dispatch addr pla stz InitError ;found a scsi card sec exit plx rts noSCSI clc bra exit ENDP *===============================================* * Get CD-ROM Device * * - look for a Ruby drive in current slot * * * * INPUT: none * * * * OUTPUT: found (carry bit) 1=yes, 0=no * * * *===============================================* GetCDROM PROC IMPORT SPUnits IMPORT ChkType phx jsr SPUnits ;how many devices ? sta Units beq noRUBY ;none lda #1 @loop ;look for RUBY shortm sta SPUnit ;set SP unit number longm jsr ChkType ;is it a RUBY ? bcs found cmp Units bcs noRuby inc a bra @loop found sec exit plx rts noRUBY clc bra exit ENDP *===============================================* * Check Device Type * * - check for a Ruby drive * * * * INPUT: none * * * * OUTPUT: isRUBY (carry bit) 1=yes, 0=no * * * *===============================================* ChkType PROC IMPORT SPCall pha ;preserve A-reg ldx bFlag bne doIt inc bFlag bra exit doIt lda #$03 ;get DIB sta SPCode ;status code lda #^SPBuffer sta SPBuffPtr+2 lda #SPBuffer sta SPBuffPtr lda #$40 ;command code ldx #$03 ;number of parameters jsr SPCall cmp #0 ;check for SP error bne notCD lda SPBuffer+24 ;check SCSI version cmp #$0200 ;is it Rev C ? bne notRevC lda SPBuffer ;check status byte and #$EF cmp #$A4 bne notCD lda SPBuffer+22 ;device type & subtype and #$E0FF cmp #$C005 ;CD-ROM type/subtype ? bne notCD lda SPBuffer+6 ;check vendor name cmp #'OS' ;'SONY' bne notCD lda SPBuffer+8 cmp #'YN' bne notCD lda #$0000 ;ok now sta InitError sec exit pla rts notCD clc bra exit notRevC lda #$4000 sta InitError clc bra exit bFlag DC.W 0 ENDP *===============================================* * SmartPort Units * * - tells how many units (volumes) there are * * * * INPUT: none * * * * OUTPUT: unitCount (A-Reg) * * * *===============================================* SPUnits PROC IMPORT SPCall shortm lda #$00 sta SPUnit ;SP unit number sta SPCode ;status code longm lda #^SPBuffer sta SPBuffPtr+2 lda #SPBuffer sta SPBuffPtr lda #$40 ;command code ldx #$03 ;number of parameters jsr SPCall cmp #0 ;check for SP error bne spErr lda SPBuffer ;# of devices bra exit spErr lda #0 exit rts ENDP *===============================================* * Do SmartPort Call * * * * INPUT: CallNum (A-Reg) * * NumParams (X-Reg) * * * * OUTPUT: SP Error (A-Reg) * * * *===============================================* EXPORT SPCall SPCall PROC IMPORT SPEntry shortm ora #$40 ;use extended calls sta SPEntry+3 ;SP command number txa sta SPCount ;number of parameters longm ldx #8 ;copy SP code to bank 0 @loop lda SPEntry,x pha dex dex bpl @loop tsx inx ;points to SP code start pushlong #00 ;result pushlong #00 ;result pushlong #00 ;a, x reg pushword #00 ;y reg phx ;address of call _FWEntry ;call to our code in bank zero ply ;get Y-reg after the call ($00yy) plx ;get X-reg after the call ($00xx) pla ;get A-reg after the call ($00aa) sta atmp ;save it temporarily pla ;pull 8-bit garbage & status reg pla ;clean up stack (SP code) pla pla pla pla lda atmp ;reload the A-reg cmp #1 rts atmp DS.B 2 ENDP *===============================================* * Entry Point for SmartPort calls * *===============================================* SPEntry PROC jsr $0000 ;SP dispatch DS.B 1 ;SP command DC.L SPList ;param list ptr rts ENDP *===============================================* * SmartPort Error * * - handle a SmartPort Error * * * * INPUT: errorCode (A-Reg) * * * * OUTPUT: errorCode (A-Reg) * * * *===============================================* ;SPError PROC ; ; IMPORT DoAlert ; IMPORT SPEntry ; ; and #$00FF ; cmp #$0027 ;I/O error ; beq ioError ; brl exit ;ioError ; pha ;save it ; stz SPBuffer+2 ; stz SPBuffer+12 ; ; PushLong #SPEntry ;SP entry address ; PushLong #EntryAddr ; PushWord #6 ; _Long2Hex ; lda SPCode ;control code ; PushLong #0 ; pha ; _HexIt ; pla ; PullWord ControlCode ; ; lda #$05 ;Status Code = Get Sense ; sta SPCode ; lda #^SPBuffer ; sta SPBuffPtr+2 ; lda #SPBuffer ; sta SPBuffPtr ; lda #$40 ;command ; ldx #$03 ;param count ; jsr SPCall ;do status call ; ; lda 1,s ;smartport error ; PushLong #0 ; pha ; _HexIt ; pla ; PullWord ErrorCode ; lda SPBuffer+2 ;sense key ; and #$000F ; PushLong #0 ; pha ; _HexIt ; pla ; PullWord SenseKey ; lda SPBuffer+12 ;sense code ; and #$00FF ; PushLong #0 ; pha ; _HexIt ; pla ; PullWord SenseCode ; ; lda SPBuffer+12 ;sense code ; and #$00FF ; cmp #$0084 ; beq skip ; lda #$0001 ; ldx #SPErrStr ; ldy #^SPErrStr ; jsr DoAlert ;skip ; pla ;restore error code ;exit cmp #1 ; rts ; ; ENDP ; *===============================================* * Test RUBY for disc on line * * * * INPUT: none * * * * OUTPUT: A-Reg 1 = OnLine; 0 = OffLine * * C-Flag 1 = not on line * * * * This could hang if Status keeps returning $27 * *===============================================* EXPORT SPOnLine SPOnLine PROC IMPORT (NoDisc,NewDisc):CODE lda #$00 ;Status Code sta SPCode lda #^SPBuffer sta SPBuffPtr+2 lda #SPBuffer sta SPBuffPtr lda #$40 ;command ldx #$03 ;param count jsr SPCall ;do status call bcc cont lda #$40 ;command ldx #$03 ;param count jsr SPCall ;try again bcs offline cont lda SPBuffer and #$0010 ;look at online bit bne online lda IsOnline beq offline ;already knew it jsr NoDisc ;reset variables stz IsOnLine offline lda #0 sec bra exit online lda IsOnLine bne okay ;no disc switch inc IsOnLine jsr NewDisc ;read TOC stuff for DA okay lda #1 clc exit rts ENDP *===============================================* * SCSI Busy * * - check to see if SCSI Card is "busy". * * * * INPUT: none * * * * OUTPUT: busyflag (carry bit) 1=yes, 0=no* * * *===============================================* EXPORT SCSIBusy SCSIBusy PROC lda Slot ;get NCR register locations and #$0007 clc adc #$0008 asl a asl a asl a asl a ora #$C000 tax ;X <-- $C0n0 (n = slot + 8) lda $E00000,x ;check NCR registers cmp #$0000 bne busy lda $E00002,x cmp #$0000 bne busy lda $E00004,x cmp #$0800 bne busy sep #$20 lda >$E0C015 ;RDCXROM rep #$20 and #$00FF beq okay ;internal ROM active lda Slot ;check MSLOT ($07F8) and #$0007 ora #$00C0 ;$00Cn (n = slot) cmp >$0007F8 ;was the card "active" beq busy ;yes! okay clc ;C <-- "not busy" bra exit busy sec ;C <-- "busy" exit rts ENDP *===============================================* * SmartPort Rezero Unit * * * * INPUT: none * * * * OUTPUT: none * * * *===============================================* EXPORT SPRezero SPRezero PROC lda #$1d ;Control Code sta SPCode lda #^SPBuffer sta SPBuffPtr+2 lda #SPBuffer sta SPBuffPtr lda #$44 ;control command ldx #$03 ;param count jsr SPCall rts ENDP *===============================================* * Audio SmartPort Call * * * * INPUT: ctrlCode (A-Reg) * * * * OUTPUT: errorCode (A-Reg) * * carryFlag (1=error, 0=okay) * * * *===============================================* EXPORT ASPCall ASPCall Proc IMPORT (SPError,SPCall):CODE sta SPCode ;control code lda #^AudioBuffer sta SPBuffPtr+2 lda #AudioBuffer sta SPBuffPtr lda #$44 ;command code ldx #$03 ;number of parameters jsr SPCall cmp #1 ; bcc exit ; jsr SPError ;handle error (debug) exit rts ENDP *===============================================* * Audio Seek Track * * - seek to track and hold * * * * INPUT: track (A-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* EXPORT ASeekTrack ASeekTrack PROC IMPORT AStopTrack pha jsr AStopTrack ;reset to this track pla sta AudioBuffer+2 ;set search track lda PlayMode and #$000F xba sta AudioBuffer ;set play bit/play mode stz AudioBuffer+4 lda #2 ;use track sta AudioBuffer+6 ;set address type lda #$20 ;AUDIOSRCH Command jsr ASPCall bcc exit lda #$20 jsr ASPCall ;try again exit rts ENDP *===============================================* * Audio Play Time * * * * INPUT: frame (A-Reg) * * sec (X-Reg) * * min (Y-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* EXPORT APlayTime APlayTime PROC SetShort sta AudioBuffer+2 ;set playback FRAME stx AudioBuffer+3 ;set playback SEC sty AudioBuffer+4 ;set playback MIN stz AudioBuffer+5 ;reserved stz AudioBuffer+0 ;set stop bit lda PlayMode sta AudioBuffer+1 ;set play mode lda #$01 ;use time sta AudioBuffer+6 ;set address type SetLong lda #$21 ;AUDIOPLAY Command jsr ASPCall bcc exit lda #$21 jsr ASPCall ;try again exit rts ENDP *===============================================* * Audio Play Track * * * * INPUT: track (A-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* EXPORT APlayTrack APlayTrack PROC ;A-reg has TRACK IMPORT TestAudioTrack ; pha ; jsr TestAudioTrack ; pla ; bcs exit ;data track encountered! stz AudioBuffer+0 ;set stop bit ldx PlayMode stx AudioBuffer+1 ;set play mode sta AudioBuffer+2 ;set playback track sta ATrack stz AudioBuffer+4 ;reserved lda #$02 ;use track sta AudioBuffer+6 ;set address type lda #$21 ;AUDIOPLAY Command jsr ASPCall bcc exit lda #$21 jsr ASPCall ;try again exit rts ENDP *===============================================* * Audio Pause * * * * INPUT: flag (A-Reg) 0=set,1=release * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* EXPORT APause APause PROC sta AudioBuffer ;set pause bit lda #$22 ;PAUSE Command jsr ASPCall rts ENDP *===============================================* * Audio Stop Time * * - set time stoping address * * * * INPUT: frame (A-Reg) * * sec (X-Reg) * * min (Y-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* EXPORT AStopTime AStopTime PROC SetShort sta AudioBuffer+0 ;playback FRAME stx AudioBuffer+1 ;playback SEC sty AudioBuffer+2 ;playback MIN stz AudioBuffer+3 ;reserved lda #$01 ;use TIME sta AudioBuffer+4 ;address type SetLong lda #$23 ;AUDIOSTOP Command jsr ASPCall bcc exit lda #$23 jsr ASPCall ;try again exit rts ENDP *===============================================* * Audio Stop Track * * - set track stoping address * * * * INPUT: track (A-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* EXPORT AStopTrack AStopTrack PROC IMPORT TestAudioTrack ; pha ; jsr TestAudioTrack ; pla ; bcs exit ;data track encountered! sta AudioBuffer ;stoping track stz AudioBuffer+2 lda #$02 sta AudioBuffer+4 ;addr type = track lda #$23 ;AUDIOSTOP Command jsr ASPCall bcc exit lda #$23 jsr ASPCall ;try again exit rts ENDP *===============================================* * Audio Status * * * * INPUT: none * * * * OUTPUT: AudioStatus (A-Reg) * * ($ff = error/undefined * * * *===============================================* EXPORT AStatus AStatus PROC lda #$24 ;AUDIOSTAT Command jsr ASPCall bcc okay lda #$24 jsr ASPCall ;try again bcc okay lda #$0004 bra exit okay lda AudioBuffer and #$00ff ;return audio Status exit rts ENDP *===============================================* * Audio Scan Forward/Reverse * * * * INPUT: frame (A-Reg) * * sec (X-Reg) * * min (Y-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* EXPORT AScanF AScanF PROC ;A = FRAME,X = SEC,Y = MIN lda #0 bra cont EXPORT AScanR ENTRY AScanR AScanR lda #1 cont sta AudioBuffer+0 ;direction bit shortm sta AudioBuffer+2 ;scan FRAME stx AudioBuffer+3 ;scan SEC sty AudioBuffer+4 ;scan MIN lda #0 sta AudioBuffer+5 lda #$01 ;use time sta AudioBuffer+6 ;address type longm lda #$25 ;AUDIOSCAN Command jsr ASPCall bcc exit lda #$25 jsr ASPCall ;try again exit rts ENDP *===============================================* * Audio Scan Track * * * * INPUT: track (A-Reg) * * direction (X-Reg) 0=FWD, 1=REV * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* EXPORT AScanTrack AScanTrack PROC stx AudioBuffer+0 ;direction bit sta AudioBuffer+2 ;scan track stz AudioBuffer+4 lda #$0002 ;use track sta AudioBuffer+6 ;address type lda #$25 ;AUDIOSCAN Command jsr ASPCall bcc exit lda #$25 jsr ASPCall ;try again exit rts ENDP *===============================================* * Audio Eject * * * * INPUT: none * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* EXPORT AEject AEject PROC lda #$26 ;EJECT Command jmp ASPCall ENDP *===============================================* * Audio Play Mode * * * * INPUT: mode (A-Reg) * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* EXPORT APlayMode APlayMode PROC IMPORT CDCurTrk:DATA IMPORT CDMinB:DATA IMPORT CDSecB:DATA IMPORT CDFrameB:DATA sta PlayMode ;save mode for other calls ldx #1 stx AudioBuffer+0 ;stop bit sta AudioBuffer+1 ;play mode lda CDCurTrk sta AudioBuffer+2 ;playback track stz AudioBuffer+4 lda #$02 ;use track sta AudioBuffer+6 ;address type bra doIT EXPORT APlayModeTime ENTRY APlayModeTime APlayModeTime sta PlayMode ;save mode for other calls ldx #1 stx AudioBuffer+0 ;stop bit sta AudioBuffer+1 ;play mode lda CDFrameB sta AudioBuffer+2 ;playback time lda CDSecB sta AudioBuffer+3 lda CDMinB sta AudioBuffer+4 lda #$01 ;use time sta AudioBuffer+6 ;address type doIt lda #$21 ;AUDIOPLAY Command jsr ASPCall bcc exit lda #$21 jsr ASPCall ;try again exit rts ENDP *===============================================* * Audio TOC Track * * - get first and last track numbers * * * * INPUT: none * * * * OUTPUT: firstTrk (X-Reg) * * lastTrk (Y-Reg) * * * *===============================================* EXPORT ATOCTrack ATOCTrack PROC stz AudioBuffer ;track number lda #$04 sta AudioBuffer+1 ;allocation length lda #$00 sta AudioBuffer+3 ;TOC type lda #$27 ;READTOC Command jsr ASPCall bcc okay lda #$27 jsr ASPCall ;try again bcc okay ldx #0 ldy #0 bra exit okay lda AudioBuffer ;first track and #$00FF tax lda AudioBuffer+1 ;last track and #$00FF tay exit rts ENDP *===============================================* * Audio TOC Time * * - get absolute track time values * * - get control field (data/audio track) * * * * INPUT: none * * * * OUTPUT: carryFlag (1 = error) * * * *===============================================* EXPORT ATOCTime ATOCTime PROC ;get absolute track times IMPORT (CDMinTrk,CDTrkCnt,CDATime):DATA lda CDMinTrk ;PROCing track number sta AudioBuffer lda CDTrkCnt ;track count asl A ;tracks * 4 asl A sta AudioBuffer+1 ;allocation length lda #$02 sta AudioBuffer+3 ;TOC type lda #$27 ;READTOC Command jsr ASPCall bcc okay lda #$27 jsr ASPCall ;try again bcs exit ;error occured okay lda CDTrkCnt dec A asl A asl A tay lda CDTrkCnt dec A dec A asl A tax phy loop lda AudioBuffer+1,y ;AMin, ASec xba ;lsb <-- sec, msb <-- min sta CDATime,x ;CDATime(x) <-- ATime(x+1) lda AudioBuffer-4,y ;control field and #$000D cmp #$0004 ;is it a data track? bne cont1 ;no lda CDATime,x ora #$8000 ;mark entry as data sta CDATime,x cont1 dey dey dey dey dex dex bpl loop ply ;check last track stz AControl lda AudioBuffer,y and #$000D cmp #$0004 ;is it a data track? bne cont2 ;no lda #$8000 sta AControl cont2 stz AudioBuffer ;track number lda #$04 sta AudioBuffer+1 ;allocation length lda #$01 sta AudioBuffer+3 ;TOC type lda #$27 ;READTOC Command jsr ASPCall cmp #1 bcs exit ;error occured lda CDTrkCnt dec A asl A tax lda AudioBuffer ;lead-out time xba ;lsb <-- sec, msb <-- min ora AControl sta CDATime,x ;CDATime(n) <-- Time clc exit rts ENDP *===============================================* * Audio Read Q-Data * * * * INPUT: none * * * * OUTPUT: carryFlag (0 = okay, 1 = error) * * * *===============================================* EXPORT AReadQ AReadQ PROC IMPORT (CDAMin,CDASec,CDMin,CDSec,CDIndex):DATA IMPORT (CDAFrame,CDFrame,CDCurTrk):DATA lda #$28 ;READQ Command jsr ASPCall bcc cont lda #$28 ;READQ Command jsr ASPCall bcs exit ;SP error cont shortm lda AudioBuffer ;control field sta AControl lda AudioBuffer+1 cmp #$AA ;into lead-out area ? bne okay ;no lda #0 okay sta CDCurTrk lda AudioBuffer+2 sta CDIndex lda AudioBuffer+3 ;save track TIME sta CDMin lda AudioBuffer+4 sta CDSec lda AudioBuffer+5 sta CDFrame lda AudioBuffer+6 ;save absolute TIME sta CDAMin lda AudioBuffer+7 sta CDASec lda AudioBuffer+8 sta CDAFrame longm exit rts ENDP *===============================================* END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CloseView/CloseView.equ b/IIGS.601.SRC/A.U.G/CloseView/CloseView.equ new file mode 100644 index 0000000..8242db3 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CloseView/CloseView.equ @@ -0,0 +1 @@ +*===============================================* * * * File: CloseViewII.equ * * Project: Close View GS * * Author: Don J. Brady * * * * Copyright © Apple Computer, Inc. 1989,1990 * * All rights reserved. * *-----------------------------------------------* * Modification History: * * * * 12/05/89 DJB File created today * * * *===============================================* ;--- change flag bits: cfOnOff equ $80 ; change on/off state cfMagnify equ $40 ; change magnification state cfPowerUp equ $20 ; change power - up cfPowerDown equ $10 ; change power - down cfInvert equ $08 ; change invert state ;--- Hardware equates: VirtualScreen equ $012000 RealScreen equ $E12000 SCBData equ $E19D00 ColorTableData equ $E19E00 EMXPos equ $E100E9 ; global X position EMYPos equ $E100EB ; global Y position TickCnt equ $E100DC ; global tick count SHADOW equ $E1C035 ; hardware shadow register (byte) NEWVIDEO equ $E1C029 ; hardware video register (byte) VGCINT equ $E1C023 ; hardware VGC interrupt register (byte) KBD equ $E1C000 KBDSTRB equ $E1C010 KEYMODREG equ $E1C025 SPEAKER equ $E1C030 ; hardware speaker ;--- BRAM Equates: cvBRAM equ $5B cvPowerMask equ %00001111 ; bits 0-3 (power) cvUseKeys equ %00010000 ; bit 4 cvMagnify equ %00100000 ; bit 6 cvInvert equ %01000000 ; bit 6 cvEnabled equ %10000000 ; bit 7 cvBRAMDefaults equ cvUseKeys+2 ; 2x, disabled, magnify off, use keys, invert off ;--- Records: Rect RECORD 0 ; QuickDrawII rectangle record ;----------------------------------------------- top ds.W 1 left ds.W 1 bottom ds.W 1 right ds.W 1 ;----------------------------------------------- ENDR Point RECORD 0 ; QuickDrawII point record ;----------------------------------------------- v ds.W 1 h ds.W 1 ;----------------------------------------------- ENDR LocInfo RECORD 0 ; QuickDrawII LocInfo record ;----------------------------------------------- portSCB ds.W 1 ptrToPiximage ds.L 1 width ds.W 1 boundsRect ds Rect ;----------------------------------------------- ENDR Event RECORD 0 ; Event Manager Event ;----------------------------------------------- what ds.W 1 message ds.L 1 when ds.L 1 where ds Point modifiers ds.W 1 ;----------------------------------------------- ENDR WMTask RECORD 0 ; Task Master Record ;----------------------------------------------- wmEvent ds Event wmTaskData ds.L 1 wmTaskMask ds.L 1 wmLastClickTick ds.L 1 wmClickCount ds.W 1 wmTaskData2 ds.L 1 wmTaskData3 ds.L 1 wmTaskData4 ds.L 1 wmLastClickPt ds Point ;----------------------------------------------- ENDR WindParamList RECORD 0 ; Window Manager ParamList ;----------------------------------------------- paramLength ds.W 1 wFrameBits ds.W 1 wTitle ds.L 1 wRefCon ds.L 1 wZoom ds Rect wColor ds.L 1 wYOrigin ds.W 1 wXOrigin ds.W 1 wDataH ds.W 1 wDataW ds.W 1 wMaxH ds.W 1 wMaxW ds.W 1 wScrollVer ds.W 1 wScrollHor ds.W 1 wPageVer ds.W 1 wPageHor ds.W 1 wInfoRefCon ds.L 1 wInfoHeight ds.W 1 wFrameDefProc ds.L 1 wInfoDefProc ds.L 1 wContDefProc ds.L 1 wPosition ds Rect wPlane ds.L 1 wStorage ds.L 1 ;----------------------------------------------- ENDR CVStatusRec RECORD 0 ; CloseView status record ;----------------------------------------------- enabled ds.W 1 ; boolean invert ds.W 1 ; boolean magnify ds.W 1 ; boolean usekeys ds.W 1 ; boolean power ds.W 1 ; word {2,3,4,6,8,12} noScreen ds.W 1 ; boolean wasOn ds.W 1 ; boolean ;----------------------------------------------- ENDR CursorInfo RECORD 0 ; Cursor information record ;----------------------------------------------- location ds Point ; cursor's current location height ds.W 1 ; cursor's height (in lines) width ds.W 1 ; cursor's width (in bytes) hotSpot ds Point ; cursor's hotspot ;----------------------------------------------- ENDR ;--- GS/OS system equates: neReserved equ $0001 ; notification queue events neGSOStoP8 equ $0002 neP8toGSOS equ $0004 neDiskInsert equ $0008 neDiskEject equ $0010 neShutDown equ $0020 neVolChange equ $0040 MACRO &lab _AddNotifyProc &lab pea $2034 jsl $E100B0 MEND true equ $FFFF false equ 0 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CloseView/CloseView.make b/IIGS.601.SRC/A.U.G/CloseView/CloseView.make new file mode 100644 index 0000000..ba54991 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CloseView/CloseView.make @@ -0,0 +1 @@ +#===============================================# # File: CloseView.make # # Project: CloseView GS # # Author: Don J. Brady # # # # Copyright © Apple Computer, Inc. 1989-1991 # # All rights reserved. # # # #===============================================# PROJECT = CloseView INIT_CODE = Core.obj ¶ Patches.obj ¶ Data.obj NDA_CODE = NDA.obj AOPTIONS = LOPTIONS = -t $B6 {PROJECT} ÄÄ {PROJECT}.make {INIT_CODE} {NDA_CODE} LinkIIGS {LOPTIONS} ¶ -lseg INIT {INIT_CODE} ¶ -lseg NDA {NDA_CODE} ¶ -o {PROJECT} # generic rule to build object files from source files. .obj Ä .aii AsmIIGS {AOPTIONS} -o {Default}.obj {Default}.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CloseView/CloseViewII.equ b/IIGS.601.SRC/A.U.G/CloseView/CloseViewII.equ new file mode 100644 index 0000000..9c089ae --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CloseView/CloseViewII.equ @@ -0,0 +1 @@ +*===============================================* * * * File: CloseViewII.equ * * Project: Close View GS * * Author: Don J. Brady * * * * Copyright © Apple Computer, Inc. 1989,1990 * * All rights reserved. * *-----------------------------------------------* * Modification History: * * * * 12/05/89 DJB File created today * * * *===============================================* ;--- change flag bits: cfOnOff equ $80 ; change on/off state cfMagnify equ $40 ; change magnification state cfPowerUp equ $20 ; change power - up cfPowerDown equ $10 ; change power - down cfInvert equ $08 ; change invert state VirtualScreen equ $012000 RealScreen equ $E12000 SCBData equ $E19D00 EMXPos equ $E100E9 ; global X position EMYPos equ $E100EB ; global Y position TickCnt equ $E100DC ; global tick count SHADOW equ $E1C035 ; hardware shadow register (byte) NEWVIDEO equ $E1C029 ; hardware video register (byte) VGCINT equ $E1C023 ; hardware VGC interrupt register (byte) ;--- Records: Rect RECORD 0 ; QuickDrawII rectangle record ;----------------------------------------------- top ds.W 1 left ds.W 1 bottom ds.W 1 right ds.W 1 ;----------------------------------------------- ENDR Point RECORD 0 ; QuickDrawII point record ;----------------------------------------------- v ds.W 1 h ds.W 1 ;----------------------------------------------- ENDR \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CloseView/Core.aii b/IIGS.601.SRC/A.U.G/CloseView/Core.aii new file mode 100644 index 0000000..9742eb3 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CloseView/Core.aii @@ -0,0 +1 @@ +*===============================================* * * * File: Core.aii * * Project: Close view for the IIGS * * Author: Don J. Brady * * Build file: CloseViewII.Make * * * * Copyright © Apple Computer, Inc. 1989-1991 * * All rights reserved. * *-----------------------------------------------* * Modification History: * * 11/29/89 DJB - File created today * * * *===============================================* * Major Routines: * * * * StartInit * * CoreStartUp * * CoreShutDown * * Refresh * * CoreRefresh * *===============================================* IF (&TYPE('DEBUG') = 'UNDEFINED') THEN DEBUG EQU 0 ENDIF PRINT NOPAGE PRINT NOGEN PRINT OFF INCLUDE 'M16.Memory' ; toolbox macros INCLUDE 'M16.Quickdraw' INCLUDE 'M16.Desk' INCLUDE 'M16.MiscTool' INCLUDE 'M16.IntMath' INCLUDE 'CloseView.equ' PRINT ON STRING ASIS sizeOfTable equ 256*16 maxPower equ 12 minPower equ 2 maxScreenY equ 199 maxScreenX equ 639 maxScreenX_320 equ 319 framePixels equ 5 maxWidth equ 32 *===============================================* * * * Install our patches * * * *===============================================* StartInit PROC LONGA ON LONGI ON IMPORT InstallPatches IMPORT GetROMVersion IMPORT AddShutdownTask IMPORT MyUserID IMPORT ROMVersion IMPORT NDAHeader ; in NDA segment phb ; use local addressing phk plb sep #$20 ; go into 8-bit mode lda >KEYMODREG rep #$20 ; go into 16-bit mode and #$0040 ; if option key down bne @exit ; don't install this init ;--- get a userID for memory allocations: pha ; space for userID (word) _MMStartUp pla sta MyUserID ; used for memory allocations ;--- find out what system we're on: jsr GetROMVersion sta ROMVersion ;--- install permanent system patches: jsr InstallPatches ;--- install NDA header: pha ; space for handle pha pea NDAHeader>>16 pea NDAHeader _FindHandle _InstallNDA ;--- install a GS/OS shutdown task: jsr AddShutdownTask @exit plb rtl ENDP *===============================================* * Initialize our Core data * * This routine is called at QD Startup time. * * * * IN: none * * * * OUT: none * *===============================================* CoreStartUp PROC EXPORT LONGA ON LONGI ON IMPORT CVStat:CVStatusRec ; global data IMPORT NextMouse:Point IMPORT NewCursor:CursorInfo IMPORT OldCursor:CursorInfo IMPORT NewPower ; external routines IMPORT EnableCV IMPORT DisableCV IMPORT SetShadowing IMPORT GetCVDefaults IMPORT GetScreenWidth IMPORT BoxVBLTask pea BoxVBLTask>>16 pea BoxVBLTask _SetHeartBeat ; install our vbl task jsr GetCVDefaults ; get defaults from BRAM stz NextMouse.v ; cursor starts at 0,0 stz NextMouse.h stz NewCursor.location.v stz NewCursor.location.h stz OldCursor.location.v stz OldCursor.location.h lda #0 sta >EMYPos sta >EMXPos jsr GetScreenWidth jsr NewPower ; create default tables, etc lda CVStat.wasOn ; was it on before? bne turnOn ; yes, so start with it on lda #1 jsr SetShadowing ; turn screen shadowing on bra done turnOn jsl EnableCV done rts ENDP *===============================================* * This routine is called at QD Shutdown time. * * * * IN: none * * * * OUT: none * *===============================================* CoreShutDown PROC EXPORT LONGA ON LONGI ON IMPORT CVStat:CVStatusRec ; global data IMPORT RestoreSCBs ; external routines IMPORT SetShadowing IMPORT SetCVDefaults IMPORT BoxVBLTask IMPORT EraseFrameBox2 IMPORT UpdateScreen _HideCursor pea BoxVBLTask>>16 pea BoxVBLTask _DelHeartBeat ; remove our vbl task lda CVStat.enabled ; if enabled AND magnify then... beq else lda CVStat.magnify beq eraseBox jsr UpdateScreen ; redraw one last time (without cursor) jsr RestoreSCBs bra done eraseBox jsr EraseFrameBox2 ; get rid of box else lda #0 jsr SetShadowing ; else turn screen shadowing off done jsr SetCVDefaults ; save user settings to BRAM stz CVStat.enabled rts ENDP *===============================================* * Refresh CloseView (screen & data) * * * * This is the heart of CloseView. This routine * * is constantly called at event time (through * * our event manager patches). * * * * IN: none * * * * OUT: none * * * *===============================================* Refresh PROC EXPORT LONGA ON LONGI ON IMPORT CoreRefresh IMPORT LastTicks IMPORT DirtyMouse IMPORT DirtyScreen IMPORT CVStat:CVStatusRec IMPORT Refreshing phb phk plb tsc ; check if we have enough stack space cmp #$0200 bcc exit php ; check if interrupts are off php pla and #%00000100 bne exit ; exit if interrupts are off! sep #$20 lda >NEWVIDEO ; check video register rep #$30 and #$0080 beq exit ; exit if screen not active! lda >CVStat.noScreen bne exit ; exit if we don't have a virtual screen! ;--- Check if enough time elasped since last refresh: sei sec lda >TickCnt sbc LastTicks tax lda >TickCnt+2 sbc LastTicks+2 cli bne doIt bcc doIt cpx #2 ; ³ 2 ticks since last refresh? bcs doIt ; yes ; if (NOT magnify) then... lda CVStat.magnify ; ignore tick count if magnification off beq doIt ; if (NOT DirtyScreen) AND DirtyMouse then... lda DirtyScreen bne exit lda DirtyMouse beq exit doIt lda Refreshing bne exit ; sorry, we are busy! inc Refreshing jsr CoreRefresh sei lda >TickCnt sta LastTicks lda >TickCnt+2 sta LastTicks+2 cli stz Refreshing exit plb rts ENDP *===============================================* * Refresh the Core * * * * IN: none * * * * OUT: none * * * *===============================================* CoreRefresh PROC LONGA ON LONGI ON IMPORT UpdateScreen ; external routines IMPORT SetFrameRect IMPORT CheckForChanges IMPORT CheckForSwitch IMPORT CheckQD IMPORT PtInBigRect IMPORT UpdateCursor IMPORT RememberLast IMPORT Change ; global data IMPORT DirtyMouse IMPORT DirtyScreen IMPORT CVStat:CVStatusRec IMPORT NewCursor:CursorInfo IMPORT OldCursor:CursorInfo jsr CheckForChanges ; monitor user params lda CVStat.enabled beq exit jsr CheckForSwitch ; monitor screen resolution jsr SetFrameRect lda DirtyMouse ora DirtyScreen beq exit ; no need to draw if clean jsr CheckQD ; monitor QD changes lda CVStat.magnify beq exit lda DirtyScreen bne screen ldy OldCursor.location.v ldx OldCursor.location.h jsr PtInBigRect bcc @skip ldy #OldCursor-NewCursor jsr UpdateCursor ; "erase" old cursor @skip ldy OldCursor.location.v ldx OldCursor.location.h jsr PtInBigRect bcc @skip2 ldy #0 jsr UpdateCursor ; "draw" new cursor @skip2 bra bump screen jsr UpdateScreen ; update the real screen stz DirtyScreen bump stz DirtyMouse jsr RememberLast exit rts ENDP *===============================================* * Update the Real Screen using data from our * * Virtual Screen. Pixels are expanded a byte at * * a time using a table. * * * *===============================================* UpdateScreen2x PROC LONGA ON LONGI ON IMPORT GetScreenOffset IMPORT Table IMPORT TableSwitch IMPORT BigRect:Rect lda #0 sta TableSwitch ldx BigRect.left ldy BigRect.top jsr GetScreenOffset ; a = virtual screen offset tay phd ; save d & b phb pea $E1E1 ; data bank = bank of real screen plb plb tya ; a = virtual screen offset ldy #0 ; y = real screen offset ldx #0 ; x = line counter @loop jsr UpdateLine2x ; uses a & y clc adc #160 ; a <-- a + 160 pha tya clc adc #160*2 ; y <-- y + 160*2 tay pla inx cpx #100 bcc @loop plb ; restore d & b pld rts ;----------------------------------------------- ; Macro to give us "unwound" loops for speed ; ; It takes 32 cycles per real screen word ; which is 2560 cycles/line since there are ; 80 words in a line. ; ; In: b set to $E1 (data Bank) ; a set to virtual screen offset ; y set to real screen offset ; ; Out: b, y, & d unchanged ; x trashed ; ;----------------------------------------------- MACRO _UpdateLine2X LCLA &counter &counter SETA 0 WHILE &counter < 80 DO tdc tax lda >VirtualScreen+&counter,x and #$00FF asl a adc >TableSwitch tax lda >Table,x ; expand it sta |RealScreen+(&counter*2),y sta |RealScreen+(&counter*2)+160,y ; update 2 lines at a time &counter SETA &counter+1 ENDWHILE MEND ;----------------------------------------------- ;----------------------------------------------- ; Update a line by copying a byte from the ; virtual screen expanding it to a word and ; then coping it to the real screen. ; ; In: a = virtual screen offset ; y = real screen offset ; ; Out: a, x, & y unchanged ; (d gets trashed) ;----------------------------------------------- UpdateLine2x phx ; save line counter tcd cmp #12*160 bcs @ok lda SCBData+100 bpl @ok lda #sizeOfTable sta >TableSwitch @ok _UpdateLine2X ; macro uses d & y, trashes a & x lda #0 sta >TableSwitch tdc plx ; restore line counter rts ENDP *===============================================* * Update the Real Screen using data from our * * Virtual Screen. Pixels are expanded a byte at * * a time using a table. * * * * * *===============================================* UpdateScreen PROC LONGA ON LONGI ON IMPORT Table IMPORT TableSwitch IMPORT Temp IMPORT CVStat:CVStatusRec IMPORT GetScreenOffset IMPORT UpdateScreen2x IMPORT DirtyScreen IMPORT BigRect:Rect IMPORT ScreenWidth power set 1 ; direct page offsets lines set power+2 realBytes set lines+2 extra set realBytes+2 switch set extra+2 is640 set switch+2 powerIndex set is640+2 edgeFlag set powerIndex+2 lineBuff set edgeFlag+2 lda CVStat.power ; check magnification level cmp #2 bne cont brl UpdateScreen2x ; 2x is special case cont phd ; save d & b phb tsc ; allocate 1 page of direct page sec sbc #256 tcs tcd lda >SCBData+100 and #$8080 sta Table,x sta &buff+(&cnt*3) lda >Table+1,x sta &buff+(&cnt*3)+1 &cnt SETA &cnt+1 ENDWHILE lda |VirtualScreen+&cnt,y ; remainder (1 byte) and #$00FF asl a asl a asl a asl a adc Table,x sta &buff+(&cnt*3) rep #$20 MEND MACRO _ExpandLine4x &buff LCLA &cnt &cnt SETA 0 WHILE &cnt < 160/4 DO lda |VirtualScreen+&cnt,y and #$00FF asl a asl a asl a asl a adc Table,x sta &buff+(&cnt*4) lda >Table+2,x sta &buff+(&cnt*4)+2 &cnt SETA &cnt+1 ENDWHILE MEND MACRO _ExpandLine5x &buff LCLA &cnt &cnt SETA 0 WHILE &cnt < 160/5 DO lda |VirtualScreen+&cnt,y and #$00FF asl a asl a asl a asl a adc Table,x sta &buff+(&cnt*5) lda >Table+2,x sta &buff+(&cnt*5)+2 lda >Table+3,x sta &buff+(&cnt*5)+3 &cnt SETA &cnt+1 ENDWHILE MEND MACRO _ExpandLine6x &buff LCLA &cnt &cnt SETA 0 WHILE &cnt < 160/6 DO lda |VirtualScreen+&cnt,y and #$00FF asl a asl a asl a asl a adc Table,x sta &buff+(&cnt*6) lda >Table+2,x sta &buff+(&cnt*6)+2 lda >Table+4,x sta &buff+(&cnt*6)+4 &cnt SETA &cnt+1 ENDWHILE lda |VirtualScreen+&cnt,y ; remainder (4 bytes) and #$00FF asl a asl a asl a asl a adc Table,x sta &buff+(&cnt*6) lda >Table+2,x sta &buff+(&cnt*6)+2 MEND MACRO _ExpandLine7x &buff LCLA &cnt &cnt SETA 0 WHILE &cnt < 160/7 DO lda |VirtualScreen+&cnt,y and #$00FF asl a asl a asl a asl a adc Table,x sta &buff+(&cnt*7) lda >Table+2,x sta &buff+(&cnt*7)+2 lda >Table+4,x sta &buff+(&cnt*7)+4 lda >Table+5,x sta &buff+(&cnt*7)+5 &cnt SETA &cnt+1 ENDWHILE lda |VirtualScreen+&cnt,y ; remainder (6 bytes) and #$00FF asl a asl a asl a asl a adc Table,x sta &buff+(&cnt*7) lda >Table+2,x sta &buff+(&cnt*7)+2 lda >Table+4,x sta &buff+(&cnt*7)+4 MEND MACRO _ExpandLine8x &buff LCLA &cnt &cnt SETA 0 WHILE &cnt < 160/8 DO lda |VirtualScreen+&cnt,y and #$00FF asl a asl a asl a asl a adc Table,x sta &buff+(&cnt*8) lda >Table+2,x sta &buff+(&cnt*8)+2 lda >Table+4,x sta &buff+(&cnt*8)+4 lda >Table+6,x sta &buff+(&cnt*8)+6 &cnt SETA &cnt+1 ENDWHILE MEND MACRO _ExpandLine10x &buff LCLA &cnt &cnt SETA 0 WHILE &cnt < 160/10 DO lda |VirtualScreen+&cnt,y and #$00FF asl a asl a asl a asl a adc Table,x sta &buff+(&cnt*10) lda >Table+2,x sta &buff+(&cnt*10)+2 lda >Table+4,x sta &buff+(&cnt*10)+4 lda >Table+6,x sta &buff+(&cnt*10)+6 lda >Table+8,x sta &buff+(&cnt*10)+8 &cnt SETA &cnt+1 ENDWHILE MEND MACRO _ExpandLine12x &buff LCLA &cnt &cnt SETA 0 WHILE &cnt < 160/12 DO lda |VirtualScreen+&cnt,y and #$00FF asl a asl a asl a asl a adc Table,x sta &buff+(&cnt*12) lda >Table+2,x sta &buff+(&cnt*12)+2 lda >Table+4,x sta &buff+(&cnt*12)+4 lda >Table+6,x sta &buff+(&cnt*12)+6 lda >Table+8,x sta &buff+(&cnt*12)+8 lda >Table+10,x sta &buff+(&cnt*12)+10 &cnt SETA &cnt+1 ENDWHILE lda |VirtualScreen+&cnt,y ; remainder (4 bytes) and #$00FF asl a asl a asl a asl a adc Table,x sta &buff+(&cnt*12) lda >Table+2,x sta &buff+(&cnt*12)+2 MEND ;----------------------------------------------- ; In: y set to real screen offset ; b set to $E1 (data bank) ;----------------------------------------------- MACRO _CopyLine &buff,&mag LCLA &cnt LCLA &byt &cnt SETA 0 &byt SETA 160 ldx &mag WHILE &cnt < &byt DO lda &buff+&cnt sta |RealScreen+&cnt+&byt*0,y sta |RealScreen+&cnt+&byt*1,y cpx #2 beq &CONCAT('@',&I2S(&cnt)) sta |RealScreen+&cnt+&byt*2,y cpx #3 beq &CONCAT('@',&I2S(&cnt)) sta |RealScreen+&cnt+&byt*3,y cpx #4 beq &CONCAT('@',&I2S(&cnt)) sta |RealScreen+&cnt+&byt*4,y sta |RealScreen+&cnt+&byt*5,y cpx #6 beq &CONCAT('@',&I2S(&cnt)) sta |RealScreen+&cnt+&byt*6,y sta |RealScreen+&cnt+&byt*7,y cpx #8 beq &CONCAT('@',&I2S(&cnt)) sta |RealScreen+&cnt+&byt*8,y sta |RealScreen+&cnt+&byt*9,y sta |RealScreen+&cnt+&byt*10,y sta |RealScreen+&cnt+&byt*11,y &CONCAT('@',&I2S(&cnt)) &cnt SETA &cnt+2 ENDWHILE MEND ;----------------------------------------------- ; Update a line by copying a byte from the ; virtual screen expanding it to words and ; then coping them to the real screen. ; ; In: a = virtual screen offset ; y = real screen offset ; x = line number ; ; Out: a, x, & y unchanged ; ;----------------------------------------------- UpdateLine phx pha cmp #12*160 bcs @ok lda SCBData+100 and #$8080 sta VirtualScreen,x and #$00FF inx stx Table,x sta |RealScreen+LB0,y sta |RealScreen+LB1,y iny iny rts _expand3x asl a ; nx table has 16 byte entries asl a asl a asl a adc Table,x sta |RealScreen+LB0,y sta |RealScreen+LB1,y sta |RealScreen+LB2,y lda >Table+1,x ; just one byte sta |RealScreen+LB0+1,y sta |RealScreen+LB1+1,y sta |RealScreen+LB2+1,y _common tya clc adc Table,x sta |RealScreen+LB0,y sta |RealScreen+LB1,y sta |RealScreen+LB2,y sta |RealScreen+LB3,y lda >Table+2,x sta |RealScreen+LB0+2,y sta |RealScreen+LB1+2,y sta |RealScreen+LB2+2,y sta |RealScreen+LB3+2,y bra _common _expand6x ;--- debug code --- IF DEBUG THEN cpy #$79E0 bcc @ok brk $db bra _common @ok ENDIF ;--- end debug --- asl a ; nx table has 16 byte entries asl a asl a asl a adc Table,x sta |RealScreen+LB0,y sta |RealScreen+LB1,y sta |RealScreen+LB2,y sta |RealScreen+LB3,y sta |RealScreen+LB4,y sta |RealScreen+LB5,y lda >Table+2,x sta |RealScreen+LB0+2,y sta |RealScreen+LB1+2,y sta |RealScreen+LB2+2,y sta |RealScreen+LB3+2,y sta |RealScreen+LB4+2,y sta |RealScreen+LB5+2,y lda >Table+4,x sta |RealScreen+LB0+4,y sta |RealScreen+LB1+4,y sta |RealScreen+LB2+4,y sta |RealScreen+LB3+4,y sta |RealScreen+LB4+4,y sta |RealScreen+LB5+4,y brl _common _expand8x asl a ; nx table has 16 byte entries asl a asl a asl a adc Table,x sta |RealScreen+LB0,y sta |RealScreen+LB1,y sta |RealScreen+LB2,y sta |RealScreen+LB3,y sta |RealScreen+LB4,y sta |RealScreen+LB5,y sta |RealScreen+LB6,y sta |RealScreen+LB7,y lda >Table+2,x sta |RealScreen+LB0+2,y sta |RealScreen+LB1+2,y sta |RealScreen+LB2+2,y sta |RealScreen+LB3+2,y sta |RealScreen+LB4+2,y sta |RealScreen+LB5+2,y sta |RealScreen+LB6+2,y sta |RealScreen+LB7+2,y lda >Table+4,x sta |RealScreen+LB0+4,y sta |RealScreen+LB1+4,y sta |RealScreen+LB2+4,y sta |RealScreen+LB3+4,y sta |RealScreen+LB4+4,y sta |RealScreen+LB5+4,y sta |RealScreen+LB6+4,y sta |RealScreen+LB7+4,y lda >Table+6,x sta |RealScreen+LB0+6,y sta |RealScreen+LB1+6,y sta |RealScreen+LB2+6,y sta |RealScreen+LB3+6,y sta |RealScreen+LB4+6,y sta |RealScreen+LB5+6,y sta |RealScreen+LB6+6,y sta |RealScreen+LB7+6,y brl _common _expand12x asl a ; nx table has 16 byte entries asl a asl a asl a adc Table,x sta |RealScreen+LB0,y sta |RealScreen+LB1,y sta |RealScreen+LB2,y sta |RealScreen+LB3,y sta |RealScreen+LB4,y sta |RealScreen+LB5,y sta |RealScreen+LB6,y sta |RealScreen+LB7,y sta |RealScreen+LB8,y sta |RealScreen+LB9,y sta |RealScreen+LB10,y sta |RealScreen+LB11,y lda >Table+2,x sta |RealScreen+LB0+2,y sta |RealScreen+LB1+2,y sta |RealScreen+LB2+2,y sta |RealScreen+LB3+2,y sta |RealScreen+LB4+2,y sta |RealScreen+LB5+2,y sta |RealScreen+LB6+2,y sta |RealScreen+LB7+2,y sta |RealScreen+LB8+2,y sta |RealScreen+LB9+2,y sta |RealScreen+LB10+2,y sta |RealScreen+LB11+2,y lda >Table+4,x sta |RealScreen+LB0+4,y sta |RealScreen+LB1+4,y sta |RealScreen+LB2+4,y sta |RealScreen+LB3+4,y sta |RealScreen+LB4+4,y sta |RealScreen+LB5+4,y sta |RealScreen+LB6+4,y sta |RealScreen+LB7+4,y sta |RealScreen+LB8+4,y sta |RealScreen+LB9+4,y sta |RealScreen+LB10+4,y sta |RealScreen+LB11+4,y lda >Table+6,x sta |RealScreen+LB0+6,y sta |RealScreen+LB1+6,y sta |RealScreen+LB2+6,y sta |RealScreen+LB3+6,y sta |RealScreen+LB4+6,y sta |RealScreen+LB5+6,y sta |RealScreen+LB6+6,y sta |RealScreen+LB7+6,y sta |RealScreen+LB8+6,y sta |RealScreen+LB9+6,y sta |RealScreen+LB10+6,y sta |RealScreen+LB11+6,y lda >Table+8,x sta |RealScreen+LB0+8,y sta |RealScreen+LB1+8,y sta |RealScreen+LB2+8,y sta |RealScreen+LB3+8,y sta |RealScreen+LB4+8,y sta |RealScreen+LB5+8,y sta |RealScreen+LB6+8,y sta |RealScreen+LB7+8,y sta |RealScreen+LB8+8,y sta |RealScreen+LB9+8,y sta |RealScreen+LB10+8,y sta |RealScreen+LB11+8,y lda >Table+10,x sta |RealScreen+LB0+10,y sta |RealScreen+LB1+10,y sta |RealScreen+LB2+10,y sta |RealScreen+LB3+10,y sta |RealScreen+LB4+10,y sta |RealScreen+LB5+10,y sta |RealScreen+LB6+10,y sta |RealScreen+LB7+10,y sta |RealScreen+LB8+10,y sta |RealScreen+LB9+10,y sta |RealScreen+LB10+10,y sta |RealScreen+LB11+10,y brl _common ;----------------------------------------------- ; Update extra lines for 3x and 6x since they ; don't divide the screen's 200 lines evenly. ; ; In: a = virtual screen offset ; y = real screen offset ; x = line ; ; Out: a, x, & y unchanged ; ;----------------------------------------------- Extra2Lines ldx VirtualScreen,x and #$00FF inx stx Table,x sta |RealScreen+LB0,y sta |RealScreen+LB1,y lda >Table+1,x ; just one byte sta |RealScreen+LB0+1,y sta |RealScreen+LB1+1,y tya clc adc VirtualScreen,x and #$00FF inx stx Table,x sta |RealScreen+LB0,y sta |RealScreen+LB1,y lda >Table+2,x sta |RealScreen+LB0+2,y sta |RealScreen+LB1+2,y lda >Table+4,x sta |RealScreen+LB0+4,y sta |RealScreen+LB1+4,y tya clc adc VirtualScreen,x and #$00FF inx stx Table,x sta |RealScreen+LB0,y sta |RealScreen+LB1,y sta |RealScreen+LB2,y sta |RealScreen+LB3,y sta |RealScreen+LB4,y sta |RealScreen+LB5,y sta |RealScreen+LB6,y sta |RealScreen+LB7,y lda >Table+2,x sta |RealScreen+LB0+2,y sta |RealScreen+LB1+2,y sta |RealScreen+LB2+2,y sta |RealScreen+LB3+2,y sta |RealScreen+LB4+2,y sta |RealScreen+LB5+2,y sta |RealScreen+LB6+2,y sta |RealScreen+LB7+2,y lda >Table+4,x sta |RealScreen+LB0+4,y sta |RealScreen+LB1+4,y sta |RealScreen+LB2+4,y sta |RealScreen+LB3+4,y sta |RealScreen+LB4+4,y sta |RealScreen+LB5+4,y sta |RealScreen+LB6+4,y sta |RealScreen+LB7+4,y lda >Table+6,x sta |RealScreen+LB0+6,y sta |RealScreen+LB1+6,y sta |RealScreen+LB2+6,y sta |RealScreen+LB3+6,y sta |RealScreen+LB4+6,y sta |RealScreen+LB5+6,y sta |RealScreen+LB6+6,y sta |RealScreen+LB7+6,y lda >Table+8,x sta |RealScreen+LB0+8,y sta |RealScreen+LB1+8,y sta |RealScreen+LB2+8,y sta |RealScreen+LB3+8,y sta |RealScreen+LB4+8,y sta |RealScreen+LB5+8,y sta |RealScreen+LB6+8,y sta |RealScreen+LB7+8,y lda >Table+10,x sta |RealScreen+LB0+10,y sta |RealScreen+LB1+10,y sta |RealScreen+LB2+10,y sta |RealScreen+LB3+10,y sta |RealScreen+LB4+10,y sta |RealScreen+LB5+10,y sta |RealScreen+LB6+10,y sta |RealScreen+LB7+10,y tya clc adc SCBData+100 ; check SCB sta MasterSCB bpl @320 ldy #$440F ; $33 - gray is special case in 640 ldx #$DDF0 ; $CC - gray is special case in 640 bra @setMap @320 ldy #$4433 ldx #$DDCC bra @setMap @setMap sty ColorMap+3 stx ColorMap+12 ;--- first zero out the table: ldx #sizeOfTable-2 lda #0 @zero sta Table,x dex dex bpl @zero ldx #0 ; 0 ² x < sizeOfTable lda #0 ; 0 ² a < 256 @loop stz Flag ; odd/even flag pha phx and #$00F0 ; pixels 0 & 1 lsr a lsr a lsr a lsr a jsr Expand lda 3,s and #$000F ; pixels 2 & 3 jsr Expand ply lda CVStat.power cmp #2 beq @next tya clc adc #16 tax lda #0 ; clr hi byte @next pla inc a cmp #256 bcc @loop rts ;----------------------------------------------- ; Expand a nibble into bytes ; ; In: a has color nibble (4 bits) ; x has current table offset ; ; Out: x is updated ; a & y are trashed ;----------------------------------------------- Expand ldy CVStat.power cpy #2 beq expand2x ; treat 2x special dey sty Counter ; nibble count ldy MasterSCB ; check SCB, is it 320? bpl @skip ; skip special mapping if 320 mode cmp #$0003 beq gray3 ; treat gray special cmp #$000C beq grayC @skip stz Temp sta Temp+1 ; Temp+1 <-- odd nibble asl a asl a asl a asl a tsb Temp ; Temp <-- even nibble @loop ldy Flag ; odd/even flag sep #$20 lda Temp,y ora Table,x sta Table,x rep #$20 tya ; crossing byte boundry? beq @flip ; no inx ; yes @flip eor #1 ; flip odd/even flag sta Flag dec Counter ; check nibble counter bpl @loop done rts ;--- 2x is special case: expand2x tay lda ColorMap,y sta Table,x inx bra done ;--- gray is special case: gray3 stz Temp+2 bra grayStart grayC lda #$8000 sta Temp+2 grayStart lda CVStat.power lsr a sta Temp ; first half will be $00 @loop1 lda #$0000 jsr StoreNibble dec Temp ; are we half way through? bne @loop1 ; no lda CVStat.power and #%00000001 ; odd powers must split middle nibble beq @loop2 @odd lda #$0033 bra @skip @loop2 lda #$00FF @skip jsr StoreNibble bit Counter bpl @loop2 bra done ;----------------------------------------------- StoreNibble bit Temp+2 bpl @store eor #$FFFF @store ldy Flag ; odd/even flag sep #$20 and Mask,y ora Table,x sta Table,x rep #$20 tya beq @flip inx ; crossing byte boundry @flip eor #1 ; flip odd/even flag sta Flag dec Counter rts ;----------------------------------------------- Mask dc.B %11110000,%00001111 ColorMap dc.B $00 ; black dc.B $11 ; blue dc.B $22 ; gold dc.B %00001111 ; gray (special case) dc.B $44 ; red dc.B $55 ; purple dc.B $66 ; orange dc.B $77 ; pink dc.B $88 ; green dc.B $99 ; teal dc.B $AA ; lilic green dc.B $BB ; lime green dc.B %11110000 ; gray (special case) dc.B $DD ; light blue dc.B $EE ; yellow dc.B $FF ; white ENDP *===============================================* * * *===============================================* SetFrameRect PROC LONGA ON LONGI ON IMPORT OldCursor:CursorInfo ; global data IMPORT NewCursor:CursorInfo IMPORT CursorRect:Rect IMPORT CenterPt:Point IMPORT NextMouse:Point IMPORT IBarPt:Point IMPORT DirtyMouse IMPORT DirtyScreen IMPORT IBarOn IMPORT IBarFound IMPORT TrackingIBar IMPORT ScreenWidth IMPORT ScreenHeight IMPORT ChangeSCBs IMPORT MinPt:Point IMPORT Temp IMPORT CVStat:CVStatusRec IMPORT InitBigRect ; global routines IMPORT SetBigRect IMPORT ByteToPixel ldx #0 ; x is dirty flag lda NextMouse.v cmp OldCursor.location.v ; check for movement beq @getX sta NewCursor.location.v inx @getX lda NextMouse.h cmp OldCursor.location.h ; check for movement beq @next sta NewCursor.location.h inx @next txa ; did cursor move? beq @ibar ; no stz IBarOn ; stx DirtyMouse bra useCursor @ibar lda IBarOn ; if IBarOn then beq useCursor lda IBarFound ; if IBarFound thenÉ bne useIBar brl exit ; else, skip useIBar ; lda IBarPt.h ; sta CenterPt.h ; lda IBarPt.v ; sta CenterPt.v stz IBarFound lda MinPt.v ; calculate vertical slop lsr a sta Temp lda IBarPt.v sec sbc Temp sta CursorRect.top clc adc Temp adc Temp sta CursorRect.bottom lda MinPt.h ; calculate horizontal slop lsr a sta Temp lda IBarPt.h sec sbc Temp sta CursorRect.left clc adc Temp adc Temp sta CursorRect.right inc DirtyScreen bra clip useCursor ; lda NextMouse.v ; sta CenterPt.v ; lda NextMouse.h ; sta CenterPt.h lda NewCursor.location.v sec sbc NewCursor.hotspot.v sta CursorRect.top clc adc NewCursor.height sta CursorRect.bottom lda NewCursor.location.h sec sbc NewCursor.hotspot.h sta CursorRect.left lda NewCursor.width ; (in bytes) dec a dec a dec a jsr ByteToPixel ; a = a/pixelsPerByte adc CursorRect.left sta CursorRect.right ;--- clip CursorRect to screen: clip lda CursorRect.top bpl @okTop stz CursorRect.top @okTop lda CursorRect.left bpl @okLeft stz CursorRect.left @okLeft lda CursorRect.right cmp ScreenWidth bcc @okRight lda ScreenWidth dec a dec a sta CursorRect.right @okRight lda CursorRect.bottom cmp ScreenHeight bcc @center lda ScreenHeight dec a dec a sta CursorRect.bottom @center ; lda CursorRect.Bottom clc adc CursorRect.Top lsr a sta CenterPt.v lda CursorRect.right clc adc CursorRect.left lsr a sta CenterPt.h ; special case 12x to fix a centering bug lda CVStat.power ; are we at 12x power? cmp #12 bne @skip lda CursorRect.right ; calculate width of cursor rect sec sbc CursorRect.left cmp #maxWidth ; is it bigger than max possible? bcc @skip lda CursorRect.left ; yes, so set it to the maximum width clc adc #maxWidth/2 sta CenterPt.h ; and reset the center adc #maxWidth/2 sta CursorRect.right @skip ;--- Check for switch in user input: lda IBarOn cmp TrackingIBar beq @set sta TrackingIBar inc DirtyScreen ; force box erase jsr InitBigRect ; switching states, so re-center inc ChangeSCBs ; force SCBs to update bra exit @set jsr SetBigRect exit rts ENDP *===============================================* * Initialize our Big Rect * * * * IN: CenterPt, CursorRect * * * * OUT: BigRect * * * *===============================================* InitBigRect PROC LONGA ON LONGI ON IMPORT BigRect:Rect IMPORT CursorRect:Rect IMPORT CenterPt:Point IMPORT MaxPt:Point IMPORT MinPt:Point IMPORT ScreenHeight IMPORT ScreenWidth IMPORT AlignPixel lda CursorRect.bottom cmp MinPt.v ; if Y < minY then clip to top bcc useTop lda ScreenHeight sec sbc MinPt.v cmp CursorRect.top bcc useBottom lda CenterPt.v ; else center it sec sbc MinPt.v bpl @ok lda #0 @ok sta BigRect.top clc adc MaxPt.v dec a cmp ScreenHeight ; did it overflow? bcs useBottom ; yes, so clip to bottom sta BigRect.bottom bra findX useTop stz BigRect.top lda MaxPt.v dec a sta BigRect.bottom bra findX useBottom lda ScreenHeight sec sbc MaxPt.v sta BigRect.top lda ScreenHeight dec a sta BigRect.bottom findX lda CursorRect.left cmp MinPt.h ; if X < minX then clip to left bcc useLeft lda ScreenWidth ; if maxX < X then clip to right sec sbc MinPt.h cmp CursorRect.right bcc useRight lda CenterPt.h ; else center it sec sbc MinPt.h jsr AlignPixel ; align to nearest byte sta BigRect.left clc adc MaxPt.h dec a cmp ScreenWidth ; did it overflow ? bcs useRight ; yes, so clip to right sta BigRect.right bra done useLeft stz BigRect.left lda MaxPt.h dec a sta BigRect.right bra done useRight lda ScreenWidth sec sbc MaxPt.h jsr AlignPixel ; align to nearest byte sta BigRect.left lda ScreenWidth dec a sta BigRect.right done rts ENDP *===============================================* * Set our Big Rect based on current position * * * * IN: CenterPt, CursorRect * * * * OUT: BigRect * *===============================================* SetBigRect PROC LONGA ON LONGI ON IMPORT BigRect:Rect IMPORT CursorRect:Rect IMPORT Overlap:Rect IMPORT MaxPt:Point IMPORT CenterPt:Point IMPORT ChangeSCBs IMPORT DirtyScreen IMPORT ScreenHeight IMPORT ScreenWidth IMPORT AlignPixel ; lda CenterPt.v lda CursorRect.top cmp BigRect.top bcc minusY lda CursorRect.bottom cmp BigRect.bottom beq checkX bcs plusY bra checkX minusY cmp Overlap.top ; if Y < minY then clip to top bcc useTop sec sbc Overlap.top sta BigRect.top clc adc MaxPt.v dec a sta BigRect.bottom bra checkX_Ywasdirty useTop stz BigRect.top lda MaxPt.v dec a sta BigRect.bottom bra checkX_Ywasdirty plusY cmp Overlap.bottom ; if Y > maxY then clip to bottom bcs useBottom clc adc Overlap.top sta BigRect.bottom sec sbc MaxPt.v sta BigRect.top dec BigRect.bottom bra checkX_Ywasdirty useBottom lda ScreenHeight sec sbc MaxPt.v sta BigRect.top lda ScreenHeight dec a sta BigRect.bottom checkX_Ywasdirty inc DirtyScreen ; force update of screen inc ChangeSCBs ; top changed, so update SCBs checkX ; lda CenterPt.h lda CursorRect.left cmp BigRect.left bcc minusX lda CursorRect.right cmp BigRect.right beq done bcs plusX bra done minusX cmp Overlap.left ; if X < minX then clip to left bcc useLeft sec sbc Overlap.left jsr AlignPixel ; align to nearest byte sta BigRect.left clc adc MaxPt.h dec a sta BigRect.right bra done_Xwasdirty useLeft stz BigRect.left lda MaxPt.h dec a sta BigRect.right bra done_Xwasdirty plusX cmp Overlap.right ; if X > maxX then clip to right bcs useRight clc adc Overlap.left sta BigRect.right sec sbc MaxPt.h jsr AlignPixel ; align to nearest byte sta BigRect.left dec BigRect.right bra done_Xwasdirty useRight lda ScreenWidth sec sbc MaxPt.h jsr AlignPixel ; align to nearest byte sta BigRect.left lda ScreenWidth dec a sta BigRect.right done_Xwasdirty inc DirtyScreen ; force update of screen done rts ENDP *===============================================* * * * IN: a-reg has byte count * * * * OUT: a-reg has number of pixels * * * *===============================================* ByteToPixel PROC LONGA ON LONGI ON asl a ; *2 pixels per byte pha lda >SCBData+100 ; check SCB bpl @320 pla asl a ; *4 pixels per byte rts @320 pla rts ENDP *===============================================* * * * IN: a-reg has number of pixels * * * * OUT: a-reg has byte count * * * *===============================================* PixelToByte2 PROC ; round up LONGA ON LONGI ON inc a ; +1 for 320 mode pha lda >SCBData+100 ; check SCB bpl @skip pla inc a ; + 3 for 640 mode inc a bra PixelToByte @skip pla Entry PixelToByte PixelToByte lsr a ; /2 pixels per byte pha lda >SCBData+100 ; check SCB bpl @320 pla lsr a ; /4 pixels rts @320 pla rts ENDP *===============================================* * * * IN: a-reg has pixel * * * * OUT: a-reg has pixel aligned to nearest byte * * trashes x-reg * * * *===============================================* AlignPixel PROC LONGA ON LONGI ON tax lda >SCBData+100 ; check SCB bmi @640 @320 txa and #$FFFE ; 2 pixels per byte bra done @640 txa and #$FFFC ; 4 pixels per byte done rts ENDP *===============================================* * * * IN: x-reg = {0,1,2,3,4,5,6,7,8,9,10,11,12} * * a-reg = mult * * * * OUT: a-reg has the result * * * * This will blow up if x not valid! * *===============================================* FastMultiply PROC LONGA ON LONGI ON tay ; save a in y txa asl a tax tya asl a ; 2x jmp (routine,x) routine dc.W _0x dc.W _1x dc.W _2x dc.W _3x dc.W _4x dc.W _5x dc.W _6x dc.W _7x dc.W _8x dc.W _9x dc.W _10x dc.W _2x dc.W _12x _0x lda #0 rts _1x tya rts _16x asl a _8x asl a _4x asl a _2x rts _3x pha ; 3x = 1x + 2x tya clc adc 1,s plx rts _5x asl a ; 5x = 1x + 4x pha tya clc adc 1,s plx rts _6x pha ; 6x = 2x + 4x asl a adc 1,s plx rts _7x pha ; 7x = 1x + 2x + 4x asl a adc 1,s sta 1,s tya adc 1,s plx rts _9x asl a ; 9x = 1x + 8x asl a pha tya clc adc 1,s plx rts _10x pha ; 10x = 2x + 8x asl a asl a adc 1,s plx rts _12x asl a pha ; 12x = 4x + 8x asl a adc 1,s plx rts ENDP *===============================================* * * *===============================================* CheckQD PROC IMPORT ChangeSCBs IMPORT ChangeCursor IMPORT CVStat:CVStatusRec IMPORT UpdateSCBs IMPORT GetCursorData lda CVStat.magnify beq @cursorCheck lda ChangeSCBs ; has the SCB data changed? beq @cursorCheck jsr UpdateSCBs ; yes, so update the real SCBs @cursorCheck lda ChangeCursor ; has the cursor data changed? beq @exit jsr GetCursorData ; yes, so update our data @exit rts ENDP *===============================================* * * *===============================================* CheckForSwitch PROC IMPORT ModeSwitch IMPORT TrackingIBar IMPORT OldCursor:CursorInfo IMPORT NewCursor:CursorInfo IMPORT NextMouse:Point IMPORT CVStat:CVStatusRec IMPORT GetScreenWidth IMPORT NewPower IMPORT SetFrameRect IMPORT UpdateSCBs lda ModeSwitch beq exit stz ModeSwitch ; reset flag lda CVStat.magnify beq @skip jsr UpdateSCBs ; copy over new SCBs @skip jsr GetScreenWidth ; update variables jsr NewPower ; update tables, etc stz OldCursor.location.v stz OldCursor.location.h lda #1 sta TrackingIBar lda >EMYPos sta NextMouse.v sta NewCursor.location.v lda >EMXPos sta NextMouse.h sta NewCursor.location.h jsr SetFrameRect exit rts ENDP *===============================================* * * *===============================================* CheckForChanges PROC LONGA ON LONGI ON IMPORT Change ; global variables IMPORT CVStat:CVStatusRec IMPORT DirtyScreen IMPORT SetShadowing ; external routines IMPORT InvertTable IMPORT CopyScreen IMPORT NewPower IMPORT SaveSCBs IMPORT RestoreSCBs IMPORT ChangeSCBs IMPORT EnableCV IMPORT DisableCV IMPORT SetBigScreen IMPORT SetNormalScreen IMPORT FlipColorTables lda Change ; did anything change? bne ok ; yes brl exit ; no so exit ok and #cfOnOff beq magnify lda CVStat.enabled bne turnOff jsl EnableCV bra magnify turnOff jsl DisableCV brl done magnify lda Change and #cfMagnify beq invert lda CVStat.magnify ; flip it eor #1 sta CVStat.magnify lda CVStat.enabled beq invert lda CVStat.invert beq @skip jsr FlipColorTables @skip lda CVStat.magnify beq @off @on jsr SetBigScreen bra done @off _HideCursor jsr SetNormalScreen _ShowCursor bra done invert lda Change and #cfInvert beq up lda CVStat.invert ; flip it eor #1 sta CVStat.invert jsr InvertTable lda CVStat.enabled beq up lda CVStat.magnify bne up jsr FlipColorTables up lda Change and #cfPowerUp beq down lda CVStat.power cmp #maxPower bcs exit ; at max, so exit dec a dec a asl a tax lda UpMap,x ; get next power up sta CVStat.power jsr NewPower down lda Change and #cfPowerDown beq done lda CVStat.power cmp #minPower beq exit ; at min, so exit dec a dec a asl a tax lda DownMap,x ; get next power down sta CVStat.power jsr NewPower done inc DirtyScreen exit stz Change rts ;----------------------------------------------- UpMap dc.W 3 ; 2x -> 3x dc.W 4 ; 3x -> 4x dc.W 6 ; 4x -> 6x dc.W 0 ; not used dc.W 8 ; 6x -> 8x dc.W 0 ; not used dc.W 12 ; 8x -> 12x DownMap dc.W 2 ; 2x -> 2x dc.W 2 ; 3x -> 2x dc.W 3 ; 4x -> 3x dc.W 0 ; not used dc.W 4 ; 6x -> 4x dc.W 0 ; not used dc.W 6 ; 8x -> 6x dc.W 0 ; not used dc.W 0 ; not used dc.W 0 ; not used dc.W 8 ; 12x -> 8x ENDP *===============================================* * In: none * * Out: none * *===============================================* EnableCV PROC EXPORT LONGA ON LONGI ON IMPORT SetBigScreen IMPORT SetShadowing IMPORT SetFrameRect IMPORT FlipColorTables IMPORT GetScreenWidth IMPORT NewPower IMPORT CVStat:CVStatusRec ; global data IMPORT DirtyScreen IMPORT IBarOn IMPORT IBarFound IMPORT TrackingIBar IMPORT OldCursor:CursorInfo IMPORT NewCursor:CursorInfo IMPORT NextMouse:Point phb phk plb lda CVStat.noScreen bne done ; no screen, so skip lda CVStat.enabled bne done ; already on lda CVStat.magnify ; was magnification on? bne magnify lda #1 jsr SetShadowing ; turn screen shadowing on lda CVStat.invert ; was invert on? beq common ; no jsr FlipColorTables ; yes, so invert colors bra common magnify jsr SetBigScreen common jsr GetScreenWidth jsr NewPower ; update tables, etc stz IBarOn stz IBarFound stz OldCursor.location.v stz OldCursor.location.h lda #1 sta TrackingIBar lda >EMYPos sta NextMouse.v sta NewCursor.location.v lda >EMXPos sta NextMouse.h sta NewCursor.location.h jsr SetFrameRect lda #1 sta CVStat.enabled sta DirtyScreen done plb rtl ENDP *===============================================* * In: none * * Out: none * *===============================================* DisableCV PROC EXPORT LONGA ON LONGI ON IMPORT SetNormalScreen IMPORT CopyScreen IMPORT FlipColorTables IMPORT CVStat:CVSTatusRec phb phk plb lda CVStat.noScreen bne done ; no screen, so skip lda CVStat.enabled beq done ; already off stz CVStat.enabled _HideCursor lda CVStat.magnify ; was magnification on? bne magnify jsr CopyScreen lda CVStat.invert ; was invert on? beq common ; no jsr FlipColorTables ; yes, so invert colors bra common magnify jsr SetNormalScreen common _ShowCursor done plb rtl ENDP *===============================================* * * *===============================================* SetBigScreen PROC LONGA ON LONGI ON IMPORT SetShadowing IMPORT SaveSCBs IMPORT ChangeSCBs lda #0 jsr SetShadowing ; turn screen shadowing off jsr SaveSCBs inc ChangeSCBs ; force update of SCBs rts ENDP *===============================================* * * *===============================================* SetNormalScreen PROC LONGA ON LONGI ON IMPORT RestoreSCBs IMPORT CopyScreen IMPORT SetShadowing jsr RestoreSCBs jsr CopyScreen lda #1 jsr SetShadowing ; turn screen shadowing on rts ENDP *===============================================* * In: a-reg, 1 = invert, 0 = plain * * Out: none * *===============================================* SetInvert PROC EXPORT LONGA ON LONGI ON IMPORT InvertTable IMPORT FlipColorTables IMPORT DirtyScreen IMPORT CVStat:CVSTatusRec phb phk plb cmp CVStat.invert ; no change beq done sta CVStat.invert inc DirtyScreen ; force a redraw ; lda CVStat.enabled ; don't bother if we're off ; beq done jsr InvertTable ; changed, so flip table lda CVStat.enabled beq done lda CVStat.magnify bne done jsr FlipColorTables done plb rtl ENDP *===============================================* * In: a-reg, 1 = on, 0 = off * * Out: none * *===============================================* SetMagnify PROC EXPORT LONGA ON LONGI ON IMPORT DirtyScreen IMPORT CVStat:CVSTatusRec IMPORT SetBigScreen IMPORT SetNormalScreen IMPORT FlipColorTables phb phk plb cmp CVStat.magnify ; no change beq skip sta CVStat.magnify lda CVStat.enabled ; is Close View enabled? beq skip ; no, so skip inc DirtyScreen ; force a redraw lda CVStat.invert beq @skip jsr FlipColorTables @skip lda CVStat.magnify beq @off @on jsr SetBigScreen bra skip @off _HideCursor jsr SetNormalScreen _ShowCursor skip plb rtl ENDP *===============================================* * In: a-reg, 1 = on, 0 = off * * Out: none * *===============================================* SetKeyEquiv PROC EXPORT LONGA ON LONGI ON IMPORT CVStat:CVSTatusRec sta >CVStat.useKeys rtl ENDP *===============================================* * In: a-reg = power * * Out: none * *===============================================* SetPower PROC EXPORT LONGA ON LONGI ON IMPORT NewPower IMPORT DirtyScreen IMPORT CVStat:CVStatusRec phb phk plb cmp CVStat.power ; did it change? beq done ; no sta CVStat.power inc DirtyScreen ; force a redraw ; lda CVStat.enabled ; don't bother if we're off ; beq done jsr NewPower done plb rtl ENDP *===============================================* * In: x,y have point * * * * Out: carry set if point is inside BigRect * * * *===============================================* PtInBigRect PROC LONGA ON LONGI ON IMPORT BigRect:Rect cpy BigRect.top bcc out cpy BigRect.bottom beq next bcs out next cpx BigRect.left bcc out cpx BigRect.right beq in bcs out in sec rts out clc rts ENDP *===============================================* * Turn screen shadowing on/off * * * * In: a-reg (0 = off, 1 = on) * * Out: none * *===============================================* SetShadowing PROC LONGA ON LONGI ON sep #$20 ; use 8-bit register when accesing I/O LONGA OFF tax beq turnOff lda >SHADOW ; load the shadow register and #$F7 ; clr bit 3 (turn screen shadow on) sta >SHADOW bra ssExit turnOff lda >SHADOW ; load the shadow register ora #$08 ; set bit 3 (turn screen shadow off) sta >SHADOW ssExit rep #$20 LONGA On rts ENDP *===============================================* * * *===============================================* InvertTable PROC LONGA ON LONGI ON IMPORT Table IMPORT MasterSCB lda >SCBData sta MasterSCB sep #$20 LONGA OFF ldy #0 @loop ldx MasterSCB bpl @320 jsr Invert640 bra @next @320 jsr Invert320 @next iny cpy #256*16*2 bcc @loop rep #$20 LONGA ON rts ;----------------------------------------------- LONGA OFF LONGI ON Invert640 lda Table,y and #$03 beq @flip1 cmp #$03 bne @next1 @flip1 ; if pixel is %00 or %11 flip it eor #$03 pha lda Table,y and #$FC ora 1,s sta Table,y pla @next1 lda Table,y and #$0C beq @flip2 cmp #$0C bne @next2 @flip2 ; if pixel is %00 or %11 flip it eor #$0C pha lda Table,y and #$F3 ora 1,s sta Table,y pla @next2 lda Table,y and #$30 beq @flip3 cmp #$30 bne @next3 @flip3 ; if pixel is %00 or %11 flip it eor #$30 pha lda Table,y and #$CF ora 1,s sta Table,y pla @next3 lda Table,y and #$C0 beq @flip4 cmp #$C0 bne @next4 @flip4 ; if pixel is %00 or %11 flip it eor #$C0 pha lda Table,y and #$3F ora 1,s sta Table,y pla @next4 rts ;----------------------------------------------- Invert320 lda Table,y and #$0F beq @flip1 cmp #$0F bne @next1 @flip1 ; if nibble is 0 or F flip it eor #$0F pha lda Table,y and #$F0 ora 1,s sta Table,y pla @next1 lda Table,y and #$F0 beq @flip2 cmp #$F0 bne @next2 @flip2 eor #$F0 pha lda Table,y and #$0F ora 1,s sta Table,y pla @next2 rts ENDP *===============================================* * Copy data from virtual screen to real screen * * without magnification. * * * *===============================================* CopyScreen PROC LONGA ON LONGI ON line set 160 ldx #0 @loop jsr CopySlice ; copy from right edge phx lda #line-2 sec sbc 1,s tax jsr CopySlice ; copy from left edge plx inx inx cpx #line/2 bcc @loop rts ;----------------------------------------------- ; Copy a vertical slice at a time ; ; In: x has starting offset of slice ; ; Out: x is preserved ; ;----------------------------------------------- CopySlice phx ldy #0 @loop lda >VirtualScreen,x sta >RealScreen,x lda >VirtualScreen+line*1,x sta >RealScreen+line*1,x lda >VirtualScreen+line*2,x sta >RealScreen+line*2,x lda >VirtualScreen+line*3,x sta >RealScreen+line*3,x lda >VirtualScreen+line*4,x sta >RealScreen+line*4,x lda >VirtualScreen+line*5,x sta >RealScreen+line*5,x lda >VirtualScreen+line*6,x sta >RealScreen+line*6,x lda >VirtualScreen+line*7,x sta >RealScreen+line*7,x lda >VirtualScreen+line*8,x sta >RealScreen+line*8,x lda >VirtualScreen+line*9,x sta >RealScreen+line*9,x txa clc adc #line*10 tax iny cpy #20 bcc @loop plx rts ENDP *===============================================* * * *===============================================* NewPower PROC LONGA ON LONGI ON IMPORT Make2BitTable ; external routines IMPORT Make4BitTable IMPORT InvertTable IMPORT InitBigRect IMPORT ChangeSCBs IMPORT CVStat:CVStatusRec ; global data IMPORT ScreenHeight IMPORT ScreenWidth IMPORT MaxPt:Point IMPORT MinPt:Point IMPORT Overlap:Rect lda CVStat.power dec a dec a asl a tax ; x <-- index into tables lda YDeltas,x sta MaxPt.v lsr a sta MinPt.v lda YOverlaps,x sta Overlap.top lda ScreenHeight sec sbc Overlap.top sta Overlap.bottom lda ScreenWidth cmp #320 beq @320 lda XDeltas,x bra @set @320 lda XDeltas_320,x @set sta MaxPt.h lsr a sta MinPt.h pha ; space for remainder pha ; space for quotient lda MaxPt.h pha pea 5 _UDivide ; MaxPt.h / 5 pla plx ; discard remainder sta Overlap.left lda ScreenWidth sec sbc Overlap.left sta Overlap.right inc ChangeSCBs jsr InitBigRect jsr Make2BitTable jsr Make4BitTable lda CVStat.invert beq done jsr InvertTable done rts YDeltas dc.W 200/2 ; 2x dc.W 200/3+1 ; 3x dc.W 200/4 ; 4x dc.W 200/5 ; 5x dc.W 200/6+1 ; 6x dc.W 200/7 ; 7x dc.W 200/8 ; 8x dc.W 200/9 ; 9x dc.W 200/10 ; 10x dc.W 200/11 ; 11x dc.W 200/12+1 ; 12x XDeltas dc.W 640/2 ; 2x dc.W 640/3-1 ; 3x dc.W 640/4 ; 4x dc.W 640/5 ; 5x dc.W 640/6-2 ; 6x dc.W 640/7 ; 7x dc.W 640/8 ; 8x dc.W 640/9 ; 9x dc.W 640/10 ; 10x dc.W 640/11 ; 11x dc.W 640/12-2 ; 12x XDeltas_320 dc.W 320/2 ; 2x dc.W 320/3-1 ; 3x dc.W 320/4 ; 4x dc.W 320/5 ; 5x dc.W 320/6-1 ; 6x dc.W 320/7 ; 7x dc.W 320/8 ; 8x dc.W 320/9 ; 9x dc.W 320/10 ; 10x dc.W 320/11 ; 11x dc.W 320/12 ; 12x YOverlaps dc.W 200/2/5 ; 2x dc.W 200/3/5 ; 3x dc.W 200/4/5 ; 4x dc.W 200/4/5 ; 5x dc.W 200/6/5 ; 6x dc.W 200/7/5 ; 7x dc.W 200/8/5 ; 8x dc.W 200/9/5 ; 9x dc.W 200/10/5 ; 10x dc.W 200/11/5 ; 11x dc.W 200/12/5 ; 12x ENDP *===============================================* * * *===============================================* DrawFrameBox PROC LONGA ON LONGI ON IMPORT BigRect:Rect IMPORT LastBigRect:Rect IMPORT Temp:Rect IMPORT DirtyScreen IMPORT DirtyMouse IMPORT GetScreenOffset IMPORT HClip IMPORT BoxLineWidth IMPORT ScreenWidth lda BigRect.top sta LastBigRect.top sec sbc #5 bpl @set1 lda #0 @set1 sta Temp.top lda BigRect.bottom sta LastBigRect.bottom clc adc #5 cmp #maxScreenY bcc @set2 lda #maxScreenY @set2 inc a sta Temp.bottom lda BigRect.left sta LastBigRect.left sec sbc BoxLineWidth bpl @set3 lda #0 @set3 sta Temp.left lda BigRect.right sta LastBigRect.right clc adc BoxLineWidth cmp ScreenWidth bcc @set4 lda ScreenWidth @set4 inc a sta Temp.right topLine ldy Temp.top ldx Temp.left jsr GetScreenOffset pha ; save it lda BigRect.top sec sbc Temp.top tay ; y = height lda Temp.right clc ; -1 sbc Temp.left ; a = width ldx BigRect.right ; is right line visible? cpx HClip bcc @ok ; yes inc a @ok plx ; x = virtual screen offset jsr BlackOutLineH bottomLine ldy BigRect.bottom iny ldx Temp.left jsr GetScreenOffset pha ; save it lda Temp.bottom clc ; -1 sbc BigRect.bottom tay ; y = height lda Temp.right clc ; -1 sbc Temp.left ; a = width ldx BigRect.right ; is right line visible? cpx HClip bcc @ok ; yes inc a @ok plx ; x = virtual screen offset jsr BlackOutLineH leftLine ldx Temp.left ldy Temp.top jsr GetScreenOffset tax ; x = screen offset lda Temp.bottom clc ; -1 sbc Temp.top tay ; y = height lda BigRect.left sec sbc Temp.left ; a = width jsr BlackOutLineV rightLine ldx BigRect.right inx ldy Temp.top jsr GetScreenOffset tax ; x = screen offset lda Temp.bottom clc ; -1 sbc Temp.top tay ; y = height lda Temp.right clc ; -1 sbc BigRect.right ; a = width jsr BlackOutLineV done rts ;---------------------------------------------- ; Black out horizontal slice ; ; In: a-reg = number of horizontal pixels ; y-reg = number of vertical pixels (0-5) ; x-reg = real screen offset ; ;---------------------------------------------- BlackOutLineH IMPORT PixelToByte IMPORT Flag IMPORT Counter cpy #0 beq @exit sty Temp+8 ; save line count stz Flag ; odd byte flag jsr PixelToByte lsr a ; a/2 sta Counter ; horizontal words lda #$0000 bcc @loop inc Flag ; remember odd byte @loop ldy Temp+8 ; get line count sta >RealScreen+160*0,x dey beq @next sta >RealScreen+160*1,x dey beq @next sta >RealScreen+160*2,x dey beq @next sta >RealScreen+160*3,x dey beq @next sta >RealScreen+160*4,x @next inx inx dec Counter bne @loop lda Flag beq @exit ldy Temp+8 ; get line count dex ; back up one byte sta >RealScreen+160*0,x dey beq @exit sta >RealScreen+160*1,x dey beq @exit sta >RealScreen+160*2,x dey beq @exit sta >RealScreen+160*3,x dey beq @exit sta >RealScreen+160*4,x @exit rts ;---------------------------------------------- ; Black out vertical slice ; ; In: y = height of line ; a = width of line (0-12) ; x = real screen offset ; ;---------------------------------------------- BlackOutLineV jsr PixelToByte cmp #3 beq @loop3 cmp #2 beq @loop2 cmp #1 beq @loop1 bra @exit @loop3 lda #0 sta >RealScreen,x ; 3 bytes (6 nibbles) sta >RealScreen+1,x txa clc adc #160 tax dey bpl @loop3 bra @exit @loop2 lda #0 sta >RealScreen,x ; 2 bytes (4 nibbles) txa clc adc #160 tax dey bpl @loop2 bra @exit @loop1 lda #0 sep #$20 sta >RealScreen,x ; 1 byte (2 nibbles) rep #$20 txa clc adc #160 tax dey bpl @loop1 @exit rts ENDP *===============================================* * * *===============================================* EraseFrameBox PROC LONGA ON LONGI ON IMPORT LastBigRect:Rect IMPORT BigRect:Rect IMPORT Temp:Rect IMPORT GetScreenOffset IMPORT DirtyScreen IMPORT HClip IMPORT BoxLineWidth IMPORT ScreenWidth lda LastBigRect.bottom ; has BigRect moved? beq @skip ; not initialized, so skip cmp BigRect.bottom bne EraseFrameBox2 lda LastBigRect.top cmp BigRect.top bne EraseFrameBox2 lda LastBigRect.left cmp BigRect.left bne EraseFrameBox2 lda LastBigRect.right cmp BigRect.right bne EraseFrameBox2 @skip brl done ; same, so skip erase ENTRY EraseFrameBox2 EraseFrameBox2 lda LastBigRect.top sec sbc #framePixels bpl @set1 lda #0 @set1 sta Temp.top lda LastBigRect.bottom clc adc #framePixels cmp #maxScreenY bcc @set2 lda #maxScreenY @set2 inc a sta Temp.bottom lda LastBigRect.left sec sbc BoxLineWidth bpl @set3 lda #0 @set3 sta Temp.left lda LastBigRect.right clc adc BoxLineWidth cmp ScreenWidth bcc @set4 lda ScreenWidth @set4 inc a sta Temp.right topLine ldy Temp.top ldx Temp.left jsr GetScreenOffset pha ; save it lda LastBigRect.top sec sbc Temp.top tay ; y = height lda Temp.right clc ; -1 sbc Temp.left ; a = width ldx LastBigRect.right ; is right line visible? cpx HClip bcc @ok ; yes inc a @ok plx ; x = virtual screen offset jsr RestoreLineH bottomLine ldy LastBigRect.Bottom iny ldx Temp.left jsr GetScreenOffset pha ; save it lda Temp.bottom clc ; -1 sbc LastBigRect.Bottom tay ; y = height lda Temp.right clc ; -1 sbc Temp.left ; a = width ldx LastBigRect.right ; is right line visible? cpx HClip bcc @ok ; yes inc a @ok plx ; x = virtual screen offset jsr RestoreLineH leftLine ldx Temp.left ldy Temp.top jsr GetScreenOffset tax ; x = screen offset lda Temp.bottom clc ; -1 sbc Temp.top tay ; y = height lda LastBigRect.left sec sbc Temp.left ; a = width jsr RestoreLineV rightLine ldx LastBigRect.right inx ldy Temp.top jsr GetScreenOffset tax ; x = screen offset lda Temp.bottom clc ; -1 sbc Temp.top tay ; y = height lda Temp.right clc ; -1 sbc LastBigRect.right ; a = width jsr RestoreLineV done rts ;---------------------------------------------- ; Restore horizontal slice ; ; In: a-reg = number of horizontal pixels ; y-reg = number of vertical pixels (0-5) ; x-reg = real screen offset ; ;---------------------------------------------- RestoreLineH IMPORT PixelToByte IMPORT Counter IMPORT Flag cpy #0 beq @exitA sty Temp+8 stz Flag ; odd byte flag jsr PixelToByte lsr a sta Counter ; horizontal words bcc @loop inc Flag ; remember odd byte @loop ldy Temp+8 ; get line count lda >VirtualScreen+160*0,x ; 1st line sta >RealScreen+160*0,x dey beq @next lda >VirtualScreen+160*1,x ; 2nd line sta >RealScreen+160*1,x dey beq @next lda >VirtualScreen+160*2,x ; 3rd line sta >RealScreen+160*2,x dey beq @next lda >VirtualScreen+160*3,x ; 4th line sta >RealScreen+160*3,x dey beq @next lda >VirtualScreen+160*4,x ; 5th line sta >RealScreen+160*4,x @next inx inx dec Counter ; any more words? bne @loop ; yes lda Flag ; is there an odd byte? @exitA beq @exit ; nope, all done ldy Temp+8 ; get line count dex ; back up one byte lda >VirtualScreen+160*0,x sta >RealScreen+160*0,x dey beq @exit lda >VirtualScreen+160*1,x sta >RealScreen+160*1,x dey beq @exit lda >VirtualScreen+160*2,x sta >RealScreen+160*2,x dey beq @exit lda >VirtualScreen+160*3,x sta >RealScreen+160*3,x dey beq @exit lda >VirtualScreen+160*4,x sta >RealScreen+160*4,x @exit rts ;---------------------------------------------- ; Restore vertical slice ; ; In: y-reg = height of line ; a-reg = width of line (0-12) ; x-reg = real screen offset ; ;---------------------------------------------- RestoreLineV jsr PixelToByte cmp #3 beq @loop3 cmp #2 beq @loop2 cmp #1 beq @loop1 bra @exit @loop3 lda >VirtualScreen,x ; 3 bytes (6 nibbles) sta >RealScreen,x lda >VirtualScreen+1,x sta >RealScreen+1,x txa clc adc #160 tax dey bpl @loop3 bra @exit @loop2 lda >VirtualScreen,x ; 2 bytes (4 nibbles) sta >RealScreen,x txa clc adc #160 tax dey bpl @loop2 bra @exit @loop1 sep #$20 lda >VirtualScreen,x ; 1 byte (2 nibbles) sta >RealScreen,x rep #$20 txa clc adc #160 tax dey bpl @loop1 @exit rts ENDP *===============================================* * * *===============================================* GetCursorData PROC MouseY equ $56 MouseX equ $58 CurHeight equ $5E CurWidth equ $60 HotSpot equ $C2 LONGA ON LONGI ON IMPORT NewCursor:CursorInfo IMPORT ChangeCursor IMPORT QDGlobals phd lda QDGlobals clc adc #$0100 ; use 2nd page tcd lda SCBData,x sta VirtualSCBs,x dex dex bpl @loop rts ENDP *===============================================* * Restore the Real SCB data to its default. * * * *===============================================* RestoreSCBs PROC EXPORT LONGA ON LONGI ON IMPORT VirtualSCBs ldx #200-2 @loop lda VirtualSCBs,x sta >SCBData,x dex dex bpl @loop rts ENDP *===============================================* * Update SCB data for Real Screen based on the * * the current power and the Virtual SCB data. * * * *===============================================* UpdateSCBs PROC LONGA ON LONGI ON IMPORT CVStat:CVStatusRec IMPORT BigRect:Rect IMPORT VirtualSCBs IMPORT ChangeSCBs sep #$20 LONGA OFF ldy BigRect.top ; offset of virtual SCBs ldx #0 ; offset of real SCBs @mainLoop phy lda VirtualSCBs,y ; get a virtual SCB ldy CVStat.power dey @expandLoop sta >SCBData,x ; expand as real SCBs inx cpx #200 bcs @done dey bpl @expandLoop ply iny bra @mainLoop @done ply rep #$20 LONGA ON stz ChangeSCBs rts ENDP *===============================================* * Flip QD Color tables for 1x invert * * * *===============================================* FlipColorTables PROC LONGA ON LONGI ON ldx #(16*32)-2 @loop lda >ColorTableData,x ; if color is black or white then flip it and #$0FFF beq @flip ; $000 is black cmp #$0FFF ; $FFF is white bne @ok ; ignore everything else @flip eor #$0FFF @ok sta >ColorTableData,x dex dex bpl @loop rts ENDP *===============================================* * Get screen width, etc * *===============================================* GetScreenWidth PROC LONGA ON LONGI ON lineBytes set 3 IMPORT ScreenWidth IMPORT HClip IMPORT BoxLineWidth IMPORT LastBigRect:Rect lda >SCBData+100 and #$8080 beq @320 @640 lda #640 ldx #lineBytes*4 bra set @320 lda #320 ldx #lineBytes*2 set stx BoxLineWidth sta ScreenWidth clc sbc BoxLineWidth sta HClip stz LastBigRect.top stz LastBigRect.bottom stz LastBigRect.left stz LastBigRect.right rts ENDP *===============================================* * Get default settings from BRAM * *===============================================* GetCVDefaults PROC EXPORT LONGA ON LONGI ON IMPORT CVStat:CVStatusRec ; global data stz CVStat.enabled ; start with boolean flags off stz CVStat.wasOn stz CVStat.magnify stz CVStat.invert stz CVStat.usekeys pha ; get cv parameters from BRAM pea cvBRAM _ReadBParam pla bcs default and #$00FF cmp #$00FF ; BRAM is initialized to $FF bne ok default lda #cvBRAMDefaults ok tax and #cvPowerMask ; get Power setting cmp #minPower bcc default cmp #maxPower+1 ; is 2 ² power ² 12 ? bcs default cmp #3 beq @set cmp #10 beq default tay and #%00000001 bne default ; must be even (except 3x) tya @set sta CVStat.power txa and #cvEnabled ; get On/Off setting beq @magnify lda #1 sta CVStat.wasOn @magnify txa and #cvMagnify ; get magnification On/Off setting beq @useKeys lda #1 sta CVStat.magnify @useKeys txa and #cvUseKeys ; get "Key Equivalents" setting beq @invert lda #1 sta CVStat.usekeys @invert txa and #cvInvert ; get Invert setting beq done lda #1 sta CVStat.invert done rts ENDP *===============================================* * Set default settings into BRAM * *===============================================* SetCVDefaults PROC EXPORT LONGA ON LONGI ON IMPORT CVStat:CVStatusRec ; global data IMPORT Temp lda CVStat.power and #$000F sta Temp @enabled lda CVStat.enabled beq @magnify lda #cvEnabled tsb Temp @magnify lda CVStat.magnify beq @useKeys lda #cvMagnify tsb Temp @useKeys lda CVStat.usekeys beq @invert lda #cvUseKeys tsb Temp @invert lda CVStat.invert beq @send lda #cvInvert tsb Temp @send lda Temp pha pea cvBRAM _WriteBParam rts ENDP *===============================================* * * *===============================================* BoxVBLTask PROC LONGA OFF LONGI OFF IMPORT CheckMouse taskTicks set 1 ; 60 ticks = 1 second *----------------------------------------------- TaskHeader dc.L 0 ; task pointer TaskCount dc.W taskTicks ; tick count dc.W $A55A ; signature *----------------------------------------------- IMPORT CVStat:CVStatusRec ; global data IMPORT Refreshing IMPORT Change IMPORT ModeSwitch IMPORT DirtyMouse IMPORT DirtyScreen IMPORT NewCursor:CursorInfo IMPORT OldCursor:CursorInfo phk plb lda >NEWVIDEO ; check video register and #$80 beq exit ; exit if SHR screen not active! lda Refreshing bne exit ; exit if we are refreshing (busy) lda CVStat.enabled beq exit ; exit if CloseView is off lda CVStat.magnify bne exit ; exit if magnification is on lda Change bne exit ; exit if user changes are pending lda ModeSwitch bne exit ; exit if switching modes (320/640) rep #$30 LONGA ON LONGI ON jsr JustDoIt sep #$30 LONGA OFF LONGI OFF exit lda #taskTicks sta TaskCount ; reset our task counter rtl LONGA ON LONGI ON JustDoIt jsr SetFrameRect lda DirtyMouse ora DirtyScreen beq done ; no need to draw if clean jsr EraseFrameBox jsr DrawFrameBox stz DirtyScreen stz DirtyMouse lda NewCursor.location.v ; remember last cursor drawn sta OldCursor.location.v lda NewCursor.location.h sta OldCursor.location.h lda NewCursor.height sta OldCursor.height lda NewCursor.width sta OldCursor.width lda NewCursor.hotspot.v sta OldCursor.hotspot.v lda NewCursor.hotspot.h sta OldCursor.hotspot.h done rts ENDP *===============================================* END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CloseView/Data.aii b/IIGS.601.SRC/A.U.G/CloseView/Data.aii new file mode 100644 index 0000000..5d258e4 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CloseView/Data.aii @@ -0,0 +1 @@ +*===============================================* * * * File: Data.aii * * Project: Close view for the IIGS * * Author: Don J. Brady * * Build file: CloseViewII.Make * * * * Copyright © Apple Computer, Inc. 1989-1991 * * All rights reserved. * *-----------------------------------------------* * Modification History: * * 12/06/89 DJB - File created today * * * *===============================================* PRINT NOPAGE PRINT NOGEN PRINT OFF STRING ASIS INCLUDE 'CloseView.equ' PRINT ON *===============================================* * Global data used by CloseViewII * *===============================================* GlobalData PROC EXPORT Overlap Overlap dc.W 200/2/5,640/2/5,200-(200/2/5),640-(640/2/5) EXPORT DirtyScreen DirtyScreen dc.W 0 EXPORT DirtyMouse DirtyMouse dc.W 0 EXPORT CursorOff CursorOff dc.W 0 EXPORT NextMouse NextMouse dc.W 0,0 EXPORT BigRect BigRect dc.W 0,0,99,319 EXPORT LastBigRect LastBigRect dc.W 0,0,99,319 EXPORT MaxPt MaxPt dc.W 200/2,640/2 EXPORT MinPt MinPt dc.W 200/2/2,640/2/2 EXPORT MyUserID MyUserID dc.W 0 EXPORT ScreenHandle ScreenHandle dc.L 0 EXPORT Temp Temp ds.B 10 EXPORT Counter ; generic counter Counter ds.W 1 EXPORT Flag ; generic flag Flag ds.W 1 EXPORT Change Change dc.W 0 EXPORT ScreenHeight ScreenHeight dc.W 200 EXPORT ScreenWidth ScreenWidth dc.W 640 EXPORT HClip HClip dc.W 0 EXPORT LastTicks LastTicks dc.L 0 EXPORT IBarHeight IBarHeight dc.W 0,0 EXPORT IBarPt IBarPt dc.W 0,0 EXPORT myWinList myWinList dc.W endWinList-myWinList ; record size dc.W 0 ; frame bits dc.L @fake ; ptr to title @fake dc.L 0 ; refCon dc.W 0,0,0,0 ; zoomed rect dc.L 0 ; color table ptr dc.W 0,0 ; origin vert, horz dc.W 0,0 ; data area hight,width dc.W 0,0 ; max content height, width dc.W 0,0 ; pixels to scroll vert, horz dc.W 0,0 ; pixels to page vert, horz dc.L 0 ; info bar string dc.W 0 ; info bar height dc.L 0 ; def proc ptr dc.L 0 ; draw info bar routine dc.L 0 ; draw content routine dc.W 0,0,0,0 ; window position dc.L -1 ; window plane dc.L 0 ; memory pointer endWinList ;--- boolean flags: EXPORT NeedToPost NeedToPost dc.W 0 EXPORT Refreshing Refreshing dc.W 0 EXPORT TaskInQueue TaskInQueue dc.W 0 EXPORT KeyBoardPatched KeyBoardPatched dc.W 0 EXPORT CloseViewWasOn CloseViewWasOn dc.W 0 ; false is the default EXPORT TableSwitch TableSwitch dc.W 0 EXPORT ChangeSCBs ChangeSCBs dc.W 0 EXPORT ChangeCursor ChangeCursor dc.W 0 EXPORT IBarOn IBarOn dc.W 0 EXPORT IBarFound IBarFound dc.W 0 EXPORT TrackingIBar TrackingIBar dc.W 0 EXPORT HadToLoadFM HadToLoadFM dc.W 0 EXPORT ModeSwitch ModeSwitch dc.W 0 ;--- vectors to real routines: EXPORT RealUnDrawCursor RealUnDrawCursor dc.L 0 EXPORT RealDrawCursor RealDrawCursor dc.L 0 EXPORT RealShieldCursor RealShieldCursor dc.L 0 EXPORT QDStartUpVec EXPORT QDStartUpAddr QDStartUpVec dc.B $5C ; jml $bbAAAA QDStartUpAddr dc.L 0 EXPORT QDShutDownVec EXPORT QDShutDownAddr QDShutDownVec dc.B $5C ; jml $bbAAAA QDShutDownAddr dc.L 0 EXPORT ClearScreenVec EXPORT ClearScreenAddr ClearScreenVec dc.B $5C ; jml $bbAAAA ClearScreenAddr dc.L 0 EXPORT SetSCBVec EXPORT SetSCBAddr SetSCBVec dc.B $5C ; jml $bbAAAA SetSCBAddr dc.L 0 EXPORT GetSCBVec EXPORT GetSCBAddr GetSCBVec dc.B $5C ; jml $bbAAAA GetSCBAddr dc.L 0 EXPORT SetAllSCBsVec EXPORT SetAllSCBsAddr SetAllSCBsVec dc.B $5C ; jml $bbAAAA SetAllSCBsAddr dc.L 0 EXPORT SetColorEntryVec EXPORT SetColorEntryAddr SetColorEntryVec dc.B $5C ; jml $bbAAAA SetColorEntryAddr dc.L 0 EXPORT GetColorEntryVec EXPORT GetColorEntryAddr GetColorEntryVec dc.B $5C ; jml $bbAAAA GetColorEntryAddr dc.L 0 EXPORT SetColorTableVec EXPORT SetColorTableAddr SetColorTableVec dc.B $5C ; jml $bbAAAA SetColorTableAddr dc.L 0 EXPORT GetColorTableVec EXPORT GetColorTableAddr GetColorTableVec dc.B $5C ; jml $bbAAAA GetColorTableAddr dc.L 0 EXPORT InitPortVec EXPORT InitPortAddr InitPortVec dc.B $5C ; jml $bbAAAA InitPortAddr dc.L 0 EXPORT OpenPortVec EXPORT OpenPortAddr OpenPortVec dc.B $5C ; jml $bbAAAA OpenPortAddr dc.L 0 EXPORT InvertRectVec EXPORT InvertRectAddr InvertRectVec dc.B $5C ; jml $bbAAAA InvertRectAddr dc.L 0 EXPORT SetCursorVec EXPORT SetCursorAddr SetCursorVec dc.B $5C ; jml $bbAAAA SetCursorAddr dc.L 0 EXPORT EMStartUpVec EXPORT EMStartUpAddr EMStartUpVec dc.B $5C ; jml $bbAAAA EMStartUpAddr dc.L 0 EXPORT GetNextEventVec EXPORT GetNextEventAddr GetNextEventVec dc.B $5C ; jml $bbAAAA GetNextEventAddr dc.L 0 EXPORT EventAvailVec EXPORT EventAvailAddr EventAvailVec dc.B $5C ; jml $bbAAAA EventAvailAddr dc.L 0 EXPORT GetOSEventVec EXPORT GetOSEventAddr GetOSEventVec dc.B $5C ; jml $bbAAAA GetOSEventAddr dc.L 0 EXPORT OSEventAvailVec EXPORT OSEventAvailAddr OSEventAvailVec dc.B $5C ; jml $bbAAAA OSEventAvailAddr dc.L 0 EXPORT GetMouseVec EXPORT GetMouseAddr GetMouseVec dc.B $5C ; jml $bbAAAA GetMouseAddr dc.L 0 EXPORT ButtonVec EXPORT ButtonAddr ButtonVec dc.B $5C ; jml $bbAAAA ButtonAddr dc.L 0 EXPORT StillDownVec EXPORT StillDownAddr StillDownVec dc.B $5C ; jml $bbAAAA StillDownAddr dc.L 0 EXPORT WaitMouseUpVec EXPORT WaitMouseUpAddr WaitMouseUpVec dc.B $5C ; jml $bbAAAA WaitMouseUpAddr dc.L 0 EXPORT HideCursorVec EXPORT HideCursorAddr HideCursorVec dc.B $5C ; jml $bbAAAA HideCursorAddr dc.L 0 EXPORT CursorUpdateVec EXPORT CursorUpdateAddr CursorUpdateVec dc.B $5C ; jml $bbAAAA CursorUpdateAddr dc.L 0 EXPORT KeyboardVec EXPORT KeyboardAddr KeyboardVec dc.B $5C ; jml $bbAAAA KeyboardAddr dc.L 0 ; data that doesn't need to be initialized: EXPORT MyEvent MyEvent ds.B 16 EXPORT BoxLineWidth BoxLineWidth ds.W 1 EXPORT ROMVersion ROMVersion ds.W 1 EXPORT QDGlobals QDGlobals ds.W 1 EXPORT MasterSCB MasterSCB ds.W 1 EXPORT CursorRect CursorRect ds Rect EXPORT CenterPt CenterPt ds Point EXPORT CVStat CVStat ds CVStatusRec EXPORT NewCursor EXPORT OldCursor NewCursor ds CursorInfo OldCursor ds CursorInfo ; must directly follow NewCursor EXPORT Table Table ds.B 256*16 EXPORT Table2b Table2b ds.B 256*16 EXPORT VirtualSCBs VirtualSCBs ds.B 200 EXPORT StdLineVec StdLineVec ds.L 1 EXPORT LastMinRect LastMinRect ds.W 4 EXPORT TempColorTable TempColorTable ds.W 16 ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CloseView/NDA.aii b/IIGS.601.SRC/A.U.G/CloseView/NDA.aii new file mode 100644 index 0000000..109de40 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CloseView/NDA.aii @@ -0,0 +1 @@ +*===============================================* * * * File: NDA.aii * * Project: Close view for the IIGS * * Author: Don J. Brady * * Build file: CloseViewII.Make * * * * Copyright © Apple Computer, Inc. 1990-1991 * * All rights reserved. * *-----------------------------------------------* * Modification History: * * 01/02/90 DJB - File created today * * 9-Feb-92 DAL - fixed copyright date * * * *===============================================* PRINT NOPAGE PRINT NOGEN PRINT OFF INCLUDE 'M16.QuickDraw' ; toolbox macros INCLUDE 'M16.Window' INCLUDE 'M16.Control' INCLUDE 'M16.Event' INCLUDE 'M16.LineEdit' INCLUDE 'M16.MiscTool' INCLUDE 'E16.Window' ; toolbox equates INCLUDE 'E16.Control' INCLUDE 'E16.Event' INCLUDE 'CloseView.equ' PRINT ON ;--- window offsets: wHeight equ 71 wWidth equ 316 wTop equ 31 wRight equ 16 wRight320 equ 2 wBottom equ wTop+wHeight wLeft equ wRight+wWidth hHeight equ 114 hWidth equ 310 hTop equ (200-hHeight)/3 hLeft equ (640-hWidth)/2 hBottom equ hTop+hHeight hRight equ hLeft+hWidth hWidth320 equ hWidth-8 hLeft320 equ (320-hWidth320)/2 hRight320 equ hLeft320+hWidth320 mx equ 10 ; horizontal margin cx equ wWidth/2-2 ; center line iHeight equ 25 iWidth equ 56 iconWidth equ 14 ; byte width of icon PicWidth equ 4 ; byte width of pictures magY1 equ 10 magX1 equ cx+32 iconY1 equ 1 iconX1 equ 60 onY1 equ 4 onX1 equ mx offY1 equ onY1+11 offX1 equ mx blackY1 equ offY1+15 blackX1 equ mx whiteY1 equ blackY1+11 whiteX1 equ mx pOnY1 equ magY1+4 pOnX1 equ cx+mx pOffY1 equ pOnY1+11 pOffX1 equ cx+mx powerY1 equ offY1+2 powerX1 equ wWidth-80 keyY1 equ pOffY1+15 keyX1 equ cx+mx helpY1 equ wHeight-16 helpX1 equ wWidth-72 ;--- control id numbers: idOnRadio equ 1 idOffRadio equ 2 idBlackRadio equ 3 idWhiteRadio equ 4 idKeyCheckBox equ 5 idPowerPopUp equ 6 idMagOnRadio equ 7 idMagOffRadio equ 8 idHelpButton equ 9 *===============================================* * * * Standard NDA Header * * * *===============================================* NDAHeader PROC EXPORT LONGA ON LONGI ON STRING ASIS IMPORT NDAOpen IMPORT NDAClose IMPORT NDAAction IMPORT NDAInit EXPORT menuID EXPORT menuStr dc.L NDAOpen dc.L NDAClose dc.L NDAAction dc.L NDAInit dc.W 1 ; period (60 ticks = 1 sec) dc.W $016E ; event mask menuStr dc.B '--CLOSE VIEW\BH' ; menu text menuID dc.B '**' ; menu id dc.B 13,13 ENDP *===============================================* * * *===============================================* NDAData PROC STRING PASCAL ;--- string data --- ENTRY strCopyright strCopyright dc.B 'Apple Computer, Inc. 1990-92' ; note: © symbol is a pict ENTRY strVersion strVersion dc.B 'v1.0 ' ENTRY strMagnify strMagnify dc.B 'Magnification:' strNDATitle dc.B ' CloseViewª ' strNull dc.B 0 strOn dc.B 'On' strOff dc.B 'Off' strBlackOnWhite dc.B 'Black On White' strWhiteOnBlack dc.B 'White On Black' strUseKey dc.B 'Key Equivalents' strHelp dc.B 'Help' STRING ASIS ENTRY strHelpText1 ENTRY EndHelpText1 strHelpText1 dc.B 'CloseView allows you to magnify the',13 dc.B 'contents of the desktop screen. It can',13 dc.B 'be controlled using this Desk Accessory',13 dc.B 'or just by using the following keyboard',13 dc.B 'equivalents.' EndHelpText1 ENTRY strHelpText2 ENTRY EndHelpText2 strHelpText2 dc.B 17,'-option-O',13 dc.B 17,'-option-X',13 dc.B 17,'-option-',13 dc.B 17,'-option-',13 dc.B 17,'-option-I',13 EndHelpText2 ENTRY strHelpText3 ENTRY EndHelpText3 strHelpText3 dc.B 'Turn CloseView On/Off',13 dc.B 'Turn Magnification On/Off',13 dc.B 'Increase Magnification',13 dc.B 'Decrease Magnification',13 dc.B 'Invert the Display',13 EndHelpText3 ;--- window data --- ENTRY NDAWinPtr NDAWinPtr dc.L 0 ENTRY HelpWinPtr HelpWinPtr dc.L 0 stripes dc.W $0000,$0F00,$020F,$F0F0,$00F0 ENTRY WinParams WinParams dc.W @endParams-WinParams ; data length dc.W 0 ; frame bits dc.L strNDATitle ; title ptr dc.L 0 ; RefCon dc.W 0,0,0,0 ; full size dc.L stripes ; color table ptr dc.W 0 ; vertical org dc.W 0 ; horizontal org dc.W 0 ; data area height dc.W 0 ; data area width dc.W 0 ; max cont height dc.W 0 ; max cont width dc.W 0 ; vert scroll pixels dc.W 0 ; hort scroll pixels dc.W 0 ; vert page pixels dc.W 0 ; hort page pixels dc.L 0 ; info bar text ptr dc.W 0 ; info bar height dc.L 0 ; DefProc dc.L 0 ; draw info bar routine dc.L 0 ; draw content routine dc.W 0,0,0,0 ; window position dc.L $FFFFFFFF ; window plane dc.L 0 ; 0 = allocate win record @endParams ;--- data for controls --- ret equ 13 ENTRY cOn ; current control settings cOn dc.W 0 ENTRY cOff cOff dc.W 1 ENTRY cBlack cBlack dc.W 1 ENTRY cWhite cWhite dc.W 0 ENTRY cPower cPower dc.W 2 ENTRY cMagOn cMagOn dc.W 0 ENTRY cMagOff cMagOff dc.W 1 ENTRY cKey cKey dc.W 1 OnRadioButton dc.W 8 ; PCount dc.L idOnRadio ; Control ID dc.W onY1,onX1,0,0 ; rect dc.L radioControl ; defproc dc.W 1 ; flag dc.W fCtlProcRefNotPtr ; more flags dc.L 0 ; RefCon dc.L strOn ; title ptr dc.W 0 ; initial value OffRadioButton dc.W 8 ; PCount dc.L idOffRadio ; Control ID dc.W offY1,offX1,0,0 ; rect dc.L radioControl ; defproc dc.W 1 ; flag dc.W fCtlProcRefNotPtr ; more flags dc.L 0 ; RefCon dc.L strOff ; title ptr dc.W 1 ; initial value BlackOnWhiteRB dc.W 8 ; PCount dc.L idBlackRadio ; Control ID dc.W blackY1,blackX1,0,0 ; rect dc.L radioControl ; defproc dc.W 2 ; flag dc.W fCtlProcRefNotPtr ; more flags dc.L 0 ; RefCon dc.L strBlackOnWhite ; title ptr dc.W 1 ; initial value WhiteOnBlackRB dc.W 8 ; PCount dc.L idWhiteRadio ; Control ID dc.W whiteY1,whiteX1,0,0 ; rect dc.L radioControl ; defproc dc.W 2 ; flag dc.W fCtlProcRefNotPtr ; more flags dc.L 0 ; RefCon dc.L strWhiteOnBlack ; title ptr dc.W 0 ; initial value KeyCheckBox dc.W 8 ; PCount dc.L idKeyCheckBox ; Control ID dc.W keyY1,keyX1,0,0 ; rect dc.L checkControl ; defproc dc.W 0 ; flag dc.W fCtlProcRefNotPtr ; more flags dc.L 0 ; RefCon dc.L strUseKey ; title ptr dc.W 1 ; initial value STRING ASIS PowerMenu dc.B '>>Magnification: \H' dc.W 500 dc.B ret dc.B '== 2x \H' dc.W 2 ; id = power dc.B ret dc.B '== 3x \H' dc.W 3 ; id = power dc.B ret dc.B '== 4x \H' dc.W 4 ; id = power dc.B ret dc.B '== 6x \H' dc.W 6 ; id = power dc.B ret dc.B '== 8x \H' dc.W 8 ; id = power dc.B ret dc.B '==12x \H' dc.W 12 ; id = power dc.B ret dc.B '.' ; '.' = end of menu PowerPopUp dc.W 9 ; parameter count dc.L idPowerPopUp ; control ID dc.W powerY1,powerX1,0,0 ; control boundry rect dc.L popUpControl ; def proc ref dc.W $10 ; flag = don't draw title & right justify dc.W fCtlProcRefNotPtr+4 ; more flags dc.L 0 ; reference constant dc.W 0 ; title width dc.L PowerMenu ; menu reference dc.W 2 ; initial value (2x) POnRadioButton dc.W 8 ; PCount dc.L idMagOnRadio ; Control ID dc.W pOnY1,pOnX1,0,0 ; rect dc.L radioControl ; defproc dc.W 3 ; flag dc.W fCtlProcRefNotPtr ; more flags dc.L 0 ; RefCon dc.L strOn ; title ptr dc.W 0 ; initial value POffRadioButton dc.W 8 ; PCount dc.L idMagOffRadio ; Control ID dc.W pOffY1,pOffX1,0,0 ; rect dc.L radioControl ; defproc dc.W 3 ; flag dc.W fCtlProcRefNotPtr ; more flags dc.L 0 ; RefCon dc.L strOff ; title ptr dc.W 1 ; initial value HelpButton dc.W 7 ; PCount dc.L idHelpButton ; Control ID dc.W helpY1,helpX1,0,0 ; rect dc.L simpleButtonControl ; defproc dc.W 0 ; flag dc.W fCtlProcRefNotPtr ; more flags dc.L 0 ; RefCon dc.L strHelp ; title ptr ENTRY ControlTable ; controls used in window ControlTable dc.L OnRadioButton dc.L OffRadioButton dc.L BlackOnWhiteRB dc.L WhiteOnBlackRB dc.L KeyCheckBox dc.L PowerPopUp dc.L POnRadioButton dc.L POffRadioButton dc.L HelpButton dc.L 0 ;--- picture data ---- EXPORT IconLocInfo IconLocInfo dc.W $0080 ; port SCB dc.L CVIconPic ; picture ptr dc.W iconWidth ; picture width (bytes) dc.W 0,0,25,iconWidth*4 ; bounds rect CVIconPic dc.B $FF,$FF,$F0,$00,$00,$0F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF dc.B $FF,$FF,$00,$00,$00,$00,$0F,$FF,$FF,$FF,$FF,$FF,$FF,$FF dc.B $FF,$00,$00,$FF,$FF,$F0,$00,$0F,$FF,$FF,$FF,$FF,$FF,$FF dc.B $FF,$00,$FF,$FF,$FF,$FF,$F0,$0F,$FF,$FF,$FF,$FF,$FF,$FF dc.B $F0,$0F,$FF,$FF,$F0,$FF,$FF,$00,$FF,$FF,$FF,$FF,$FF,$FF dc.B $F0,$0F,$FF,$FF,$0F,$FF,$FF,$00,$FF,$FF,$FF,$FF,$FF,$FF dc.B $00,$FF,$FF,$F0,$FF,$0F,$FF,$F0,$0F,$FF,$FF,$FF,$FF,$FF dc.B $00,$FF,$FF,$FF,$F0,$FF,$FF,$F0,$0F,$FF,$FF,$FF,$FF,$FF dc.B $00,$FF,$FF,$FF,$0F,$FF,$FF,$F0,$0F,$FF,$FF,$FF,$FF,$FF dc.B $00,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$0F,$FF,$FF,$FF,$FF,$FF dc.B $00,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$0F,$FF,$FF,$FF,$FF,$FF dc.B $F0,$0F,$FF,$FF,$FF,$FF,$FF,$00,$0F,$FF,$FF,$FF,$FF,$FF dc.B $F0,$0F,$FF,$FF,$FF,$FF,$FF,$00,$FF,$FF,$FF,$FF,$FF,$FF dc.B $FF,$00,$FF,$FF,$FF,$FF,$F0,$00,$FF,$FF,$FF,$FF,$FF,$FF dc.B $FF,$00,$00,$FF,$FF,$F0,$00,$00,$00,$00,$0F,$FF,$FF,$FF dc.B $FF,$FF,$00,$00,$00,$00,$00,$00,$00,$FF,$F0,$FF,$FF,$FF dc.B $FF,$FF,$FF,$00,$00,$00,$FF,$00,$00,$0F,$FF,$0F,$FF,$FF dc.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$0F,$00,$00,$FF,$F0,$FF,$FF dc.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$0F,$F0,$00,$0F,$FF,$00,$0F dc.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$FF,$FF,$FF,$F0,$0F dc.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$00,$FF,$FF,$FF,$F0,$0F dc.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$FF,$0F,$FF,$FF,$F0,$0F dc.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$00,$F0,$0F,$FF,$F0,$0F dc.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$00,$00,$0F,$F0,$0F dc.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$F0,$00,$0F ENTRY PicLocInfo PicLocInfo dc.W $0080 ; port SCB dc.L 0 ; ptr to image dc.W PicWidth ; width (in bytes) dc.W 0,0,7,PicWidth*4 ; bounds rect ENTRY UpArrowPic UpArrowPic dc.B $FF,$F0,$FF,$FF dc.B $FF,$00,$0F,$FF dc.B $F0,$F0,$F0,$FF dc.B $FF,$F0,$FF,$FF dc.B $FF,$F0,$FF,$FF dc.B $FF,$F0,$FF,$FF dc.B $FF,$F0,$FF,$FF ENTRY DownArrowPic DownArrowPic dc.B $FF,$F0,$FF,$FF dc.B $FF,$F0,$FF,$FF dc.B $FF,$F0,$FF,$FF dc.B $FF,$F0,$FF,$FF dc.B $F0,$F0,$F0,$FF dc.B $FF,$00,$0F,$FF dc.B $FF,$F0,$FF,$FF ENTRY CopyrightPic CopyrightPic dc.B $FF,$00,$00,$FF dc.B $F0,$FF,$FF,$0F dc.B $0F,$F0,$0F,$F0 dc.B $0F,$0F,$FF,$F0 dc.B $0F,$F0,$0F,$F0 dc.B $F0,$FF,$FF,$0F dc.B $FF,$00,$00,$FF ;--- other data: ENTRY TaskRecord TaskRecord ds WMTask ENTRY NDABusy NDABusy dc.W 0 ; ­ 0 if NDA is currently busy ENDP *===============================================* * Open the NDA's Window * * * * In: * * * * Out: window pointer on stack * * * *===============================================* NDAOpen PROC LONGA ON LONGI ON IMPORT NDAWinPtr IMPORT WinParams:WindParamList IMPORT ControlTable IMPORT CVStat:CVStatusRec IMPORT GetSettings IMPORT DrawWindow ndaFrameBits equ fTitle+fClose+fMove+fVis+fCtlTie+fHilited phb phk plb lda >CVStat.noScreen beq ok _SysBeep skip brl exit ok lda NDAWinPtr ora NDAWinPtr+2 bne skip ; ignore if already open lda #ndaFrameBits sta WinParams.wFrameBits lda #DrawWindow sta WinParams.wContDefProc lda #DrawWindow>>16 sta WinParams.wContDefProc+2 lda #wTop sta WinParams.wPosition.top lda #wBottom sta WinParams.wPosition.bottom pha _GetMasterSCB pla and #$0080 tax lda #wRight cpx #$0080 ; is it 640 ? beq set ; yes lda #wRight320 set sta WinParams.wPosition.left clc adc #wWidth sta WinParams.wPosition.right pha ; space for result (long) pha pea WinParams>>16 ; pointer to window params pea WinParams _NewWindow pla plx bcs exit ; couldn't get window! sta NDAWinPtr stx NDAWinPtr+2 phx pha _SetSysWindow ; mark as system window lda NDAWinPtr+2 ; pointer to window pha lda NDAWinPtr pha _SetPort ; set to known port (bug in NewControl2) pha ; space for handle pha lda NDAWinPtr+2 ; pointer to window pha lda NDAWinPtr pha pea ptrToPtr ; verb pea ControlTable>>16 pea ControlTable _NewControl2 ; add controls pla ; ignore handle pla stz cOn ; set defaults stz cWhite stz cMagOn lda #1 sta cOff sta cBlack sta cKey sta cMagOff lda #2 sta cPower jsr GetSettings ; get real settings exit lda NDAWinPtr+2 ; pass back window ptr sta 7,s lda NDAWinPtr sta 5,s plb rtl ENDP *===============================================* * Close the NDA's Window * * * * In: none * * * * Out: none * * * *===============================================* NDAClose PROC LONGA ON LONGI ON IMPORT NDAWinPtr phb phk plb lda NDAWinPtr ora NDAWinPtr+2 beq exit ; ignore if closed lda NDAWinPtr+2 pha lda NDAWinPtr pha _CloseWindow stz NDAWinPtr+2 stz NDAWinPtr exit plb rtl ENDP *===============================================* * Startup/Shutdown the NDA * * * * In: a-reg (a = 0: Shutdown, a ­ 0: Startup) * * * * Out: * * * *===============================================* NDAInit PROC LONGA ON LONGI ON rtl ENDP *===============================================* * Handle an NDA Action * * * * In: a-reg has type of action * * x & y reg have event pointer * * * * Out: a-reg has return flag * * * *===============================================* NDAAction PROC LONGA ON LONGI ON IMPORT NDABusy IMPORT GetSettings evtptr set 5 ; stack offset phb phk plb phy ; save event ptr for _Event phx ldx NDABusy bne exit ; NDA is busy inc NDABusy ; we are busy asl a tax ; action offset jsr (Actions,x) ; process the action stz NDABusy ; we are not busy anymore exit pla ; remove event ptr pla plb lda #0 ; return flag rtl Actions dc.W _Ignore dc.W _Event dc.W _Run dc.W _Cursor dc.W _Menu dc.W _Undo dc.W _Cut dc.W _Copy dc.W _Paste dc.W _Clear ;--- do nothing for these actions: _Ignore _Cursor _Menu _Undo _Cut _Copy _Paste _Clear rts *----------------------------------------------- _Run jsr GetSettings rts *----------------------------------------------- _Event IMPORT TaskRecord:WMTask IMPORT EnableCV IMPORT DisableCV IMPORT SetInvert IMPORT SetPower IMPORT SetMagnify IMPORT SetKeyEquiv IMPORT CVStat:CVStatusRec IMPORT HelpWindow phd tsc tcd ldy #18 @loop lda [evtPtr],y sta TaskRecord,y dey dey bpl @loop pld lda #$FFFF sta TaskRecord.wmTaskMask lda #$001F sta TaskRecord.wmTaskMask+2 pha ; space for result (word) pea $FFFF ; mask pea TaskRecord>>16 ; event record pointer pea TaskRecord _TaskMasterDA pla and #$00FF cmp #wInControl beq controlHit cmp #keyDownEvt bne endDoEvent lda TaskRecord.wmEvent.message ; look at character and #$00FF cmp #'?' ; is it a '?' char ? beq helpHit cmp #'/' ; is it a '/' char ? bne endDoEvent helpHit brl _HelpButton controlHit lda TaskRecord.wmTaskData4 ; check control's id beq endDoEvent pha ; space for control's value lda TaskRecord.wmTaskData2+2 ; pass contol's handle pha lda TaskRecord.wmTaskData2 pha _GetCtlValue ply lda TaskRecord.wmTaskData4 ; switch on control's id dec a asl a tax jsr (CaseTable,x) endDoEvent rts CaseTable dc.W _OnRadio ; id = 1 dc.W _OffRadio ; id = 2 dc.W _BlackRadio ; id = 3 dc.W _WhiteRadio ; id = 4 dc.W _KeyCheckBox ; id = 5 dc.W _PowerPopup ; id = 6 dc.W _MagOnRadio ; id = 7 dc.W _MagOffRadio ; id = 8 dc.W _HelpButton ; id = 9 ;----------------------------------------------- _OnRadio tya beq @done lda #1 sta cOn stz cOff jsl EnableCV @done rts ;----------------------------------------------- _OffRadio tya beq @done lda #1 sta cOff stz cOn jsl DisableCV @done rts ;----------------------------------------------- _BlackRadio tya beq @done lda #1 sta cBlack stz cWhite lda #0 jsl SetInvert @done rts ;----------------------------------------------- _WhiteRadio tya beq @done lda #1 sta cWhite stz cBlack lda #1 jsl SetInvert @done rts ;----------------------------------------------- _KeyCheckBox tya ; y = 0 or 1 jsl SetKeyEquiv rts ;----------------------------------------------- _PowerPopup tya beq @done sta cPower jsl SetPower @done rts ;----------------------------------------------- _MagOnRadio tya beq @done lda #1 sta cMagOn stz cMagOff lda #1 jsl SetMagnify @done rts ;----------------------------------------------- _MagOffRadio tya beq @done lda #1 sta cMagOff stz cMagOn lda #0 jsl SetMagnify @done rts ;----------------------------------------------- _HelpButton jsr HelpWindow rts ENDP *===============================================* * Get real Close View Settings * * * * In: none * * * * Out: none * * * *===============================================* GetSettings PROC LONGA ON LONGI ON IMPORT CVStat:CVStatusRec lda >CVStat.enabled beq @cmp lda #1 @cmp cmp cOn ; do they match? beq invert ldx #idOnRadio lda cOn eor #$0001 sta cOn jsr UpdateControl ldx #idOffRadio lda cOff eor #$0001 sta cOff jsr UpdateControl invert lda >CVStat.invert beq @cmp lda #1 @cmp cmp cWhite ; do they match? beq power ldx #idWhiteRadio lda cWhite eor #$0001 sta cWhite jsr UpdateControl ldx #idBlackRadio lda cBlack eor #$0001 sta cBlack jsr UpdateControl power lda >CVStat.power beq useKeys cmp cPower ; do they match? beq useKeys sta cPower ldx #idPowerPopup jsr UpdateControl useKeys lda >CVStat.useKeys cmp cKey ; do they match? beq magnify sta cKey ldx #idKeyCheckBox jsr UpdateControl magnify lda >CVStat.magnify beq @cmp lda #1 @cmp cmp cMagOn ; do they match? beq done ldx #idMagOffRadio lda cMagOff eor #$0001 sta cMagOff jsr UpdateControl ldx #idMagOnRadio lda cMagOn eor #$0001 sta cMagOn jsr UpdateControl done rts ;----------------------------------------------- ; In: x = id of control ; a = new value ;----------------------------------------------- UpdateControl pha ; new value pha ; space for handle pha lda NDAWinPtr+2 pha lda NDAWinPtr pha pea 0 ; contol's ID phx _GetCtlHandleFromID ; handle is on stack _SetCtlValue ; update the control rts ENDP *===============================================* * Draw the Contents of the NDA's Window * * * * In: none * * * * Out: none * * * *===============================================* DrawWindow PROC LONGA ON LONGI ON IMPORT PicLocInfo:LocInfo IMPORT IconLocInfo:LocInfo phb phk plb ; draw magnifying glass picture: pha _GetMasterSCB pla sta PicLocInfo.portSCB sta IconLocInfo.portSCB ldx #iconWidth*4 and #$0080 ; is it 640? bne @set ; yes ldx #iconWidth*2 ; no, so adjust @set stx IconLocInfo.boundsRect.right pea IconLocInfo>>16 pea IconLocInfo pea IconLocInfo.boundsRect>>16 pea IconLocInfo.boundsRect pea iconX1 pea iconY1 pea 0 _PPToPort ; draw version string: ldx #iconX1+iWidth lda IconLocInfo.portSCB and #$0080 ; is it 640? bne @ok ; yes ldx #iconX1+iWidth/2 ; no, so adjust @ok phx pea iconY1+iHeight-1 _MoveTo pea strVersion>>16 pea strVersion _DrawString ; draw magnification string: pea magX1 pea magY1 _MoveTo pea strMagnify>>16 pea strMagnify _DrawString ; draw copyright picture: ldx #picWidth*4 lda PicLocInfo.portSCB and #$0080 ; is it 640? bne @set2 ; yes ldx #picWidth*2 ; no, so adjust @set2 stx PicLocInfo.boundsRect.right lda #CopyrightPic sta PicLocInfo.ptrToPixImage lda #CopyrightPic>>16 sta PicLocInfo.ptrToPixImage+2 pea PicLocInfo>>16 pea PicLocInfo pea PicLocInfo.boundsRect>>16 pea PicLocInfo.boundsRect pea mx ; point.h pea wHeight-13 ; point.v pea 0 _PPToPort ; draw copyright string: ldx #mx+20 lda IconLocInfo.portSCB and #$0080 ; is it 640? bne @ok2 ; yes ldx #mx+10 ; no, so adjust @ok2 phx pea wHeight-6 _MoveTo pea strCopyright>>16 pea strCopyright _DrawString ; draw separator lines: ldx #3 lda IconLocInfo.portSCB and #$0080 ; is it 640? bne @ok3 ; yes ldx #1 ; no, so adjust @ok3 phx pea 1 _SetPenSize pea 0 ; left line #1 pea offY1+12 _MoveTo pea cx pea offY1+12 _LineTo pea 0 ; left line #2 pea whiteY1+11 _MoveTo pea wWidth pea whiteY1+11 _LineTo pea cx ; center line pea 0 _MoveTo pea cx pea whiteY1+11 _LineTo pea cx ; right line pea pOffY1+11 _MoveTo pea wWidth pea pOffY1+11 _LineTo ; draw the controls last: pha pha _GetPort ; leave pointer on stack _DrawControls plb rtl ENDP *===============================================* * Draw the Contents of the Help Window * * * * In: none * * * * Out: none * * * *===============================================* DrawHelpWindow PROC LONGA ON LONGI ON IMPORT PicLocInfo:LocInfo keyTextY equ hHeight-50 keyTextX equ 108 arrowX equ 71+10 tabX equ 12 phb phk plb pea strHelpText1>>16 pea strHelpText1 pea EndHelpText1-strHelpText1 pea HelpRect1>>16 pea HelpRect1 pea 0 ; left justified _LETextBox pea strHelpText2>>16 pea strHelpText2 pea EndHelpText2-strHelpText2 pea HelpRect2>>16 pea HelpRect2 pea 0 ; left justified _LETextBox pea strHelpText3>>16 pea strHelpText3 pea EndHelpText3-strHelpText3 pea HelpRect3>>16 pea HelpRect3 pea 0 ; left justified _LETextBox pha _GetMasterSCB pla sta PicLocInfo.portSCB ldx #picWidth*4 and #$0080 ; is it 640? bne @set ; yes ldx #picWidth*2 ; no, so adjust @set stx PicLocInfo.boundsRect.right ; draw up arrow picture: lda #UpArrowPic sta PicLocInfo.ptrToPixImage lda #UpArrowPic>>16 sta PicLocInfo.ptrToPixImage+2 pea PicLocInfo>>16 pea PicLocInfo pea PicLocInfo.boundsRect>>16 pea PicLocInfo.boundsRect pea arrowX ; point.h pea keyTextY+19 ; point.v pea 0 _PPToPort ; draw down arrow picture: lda #DownArrowPic sta PicLocInfo.ptrToPixImage lda #DownArrowPic>>16 sta PicLocInfo.ptrToPixImage+2 pea PicLocInfo>>16 pea PicLocInfo pea PicLocInfo.boundsRect>>16 pea PicLocInfo.boundsRect pea arrowX ; point.h pea keyTextY+28 ; point.v pea 0 _PPToPort plb rtl HelpRect1 dc.W 4,tabX,hHeight/2,hWidth HelpRect2 dc.W keyTextY,tabX,hHeight-2,keyTextX-10 HelpRect3 dc.W keyTextY,keyTextX,hHeight-2,hWidth ENDP *===============================================* * Open the Help Window * * * * In: none * * * * Out: none * * * *===============================================* HelpWindow PROC LONGA ON LONGI ON IMPORT DrawHelpWindow IMPORT WinParams:WindParamList IMPORT TaskRecord:WMTask helpFrameBits EQU fAlert+fVis+fCtlTie+fHilited eventMask EQU mDownMask+mUpMask+keyDownMask pha ; space for result pea eventMask ; event mask pea 0 ; stop mask _FlushEvents ; remove any key/mouse events pla pha pha _GetPort ; save current port lda #helpFrameBits sta WinParams.wFrameBits lda #hTop sta WinParams.wPosition.top lda #hBottom sta WinParams.wPosition.bottom pha _GetMasterSCB ldy #hLeft ldx #hRight pla and #$0080 ; is it 640 ? bne @set ; yes ldy #hLeft320 ldx #hRight320 @set sty WinParams.wPosition.left stx WinParams.wPosition.right pha ; space for result (long) pha pea WinParams>>16 ; pointer to window params pea WinParams _NewWindow pla plx bcs @exit ; couldn't get window! sta HelpWinPtr stx HelpWinPtr+2 ; phx ; pha ; _SetPort ; ; jsl DrawHelpWindow ;--- wait for mouse click or key press: @wait pha ; space for result pea eventMask+updateMask ; mask pea TaskRecord>>16 ; event record pointer pea TaskRecord _GetNextEvent pla beq @wait lda TaskRecord.wmEvent.what cmp #updateEvt bne @close lda TaskRecord.wmEvent.message cmp HelpWinPtr bne @wait ldx TaskRecord.wmEvent.message+2 cpx HelpWinPtr+2 bne @wait phx pha phx pha _BeginUpdate jsl DrawHelpWindow _EndUpdate bra @wait @close lda HelpWinPtr ldx HelpWinPtr+2 phx pha _CloseWindow @exit _SetPort rts ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CloseView/Patches.aii b/IIGS.601.SRC/A.U.G/CloseView/Patches.aii new file mode 100644 index 0000000..7dc8fb0 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CloseView/Patches.aii @@ -0,0 +1 @@ +************************************************************************************ * * File: Patches.aii * Project: Close View GS * Author: Don J. Brady * * Copyright © Apple Computer, Inc. 1989-1992 * All rights reserved. * ************************************************************************************ * * Modification History: * * 12/05/89 DJB File created today * 26-Aug-91 DAL Support smooth-launch (fiddled with patches for QDStartUp * and ClearScreen) * 3-Feb-92 DAL ClearScreen patch checks whether QD is active, and becomes * transparent if not. * 4-Feb-92 DAL QDStartUp patch checks if we are being called from AWGS * 1.1v2; if so, we disable ourselves. Not compatible. * 9-Feb-92 DAL QDShutDown removes Run Queue; search for date for others. * ************************************************************************************ IF (&TYPE('DEBUG') = 'UNDEFINED') THEN DEBUG EQU 0 ENDIF PRINT NOPAGE PRINT NOGEN PRINT OFF INCLUDE 'M16.Memory' ; toolbox macros INCLUDE 'M16.Locator' INCLUDE 'M16.MiscTool' INCLUDE 'M16.Quickdraw' INCLUDE 'M16.Event' INCLUDE 'M16.Control' INCLUDE 'M16.Window' INCLUDE 'M16.Menu' INCLUDE 'M16.LineEdit' INCLUDE 'M16.Scheduler' INCLUDE 'M16.TextEdit' INCLUDE 'M16.Font' INCLUDE 'M16.Desk' INCLUDE 'E16.QuickDraw' ; toolbox equates INCLUDE 'E16.Event' INCLUDE 'E16.Window' INCLUDE 'CloseView.equ' PRINT ON ;--- toolbox references: QDToolSet equ $04 QDStartUp equ $0204 ; QD routines that we patch QDShutDown equ $0304 ClearScreen equ $1504 SetSCB equ $1204 GetSCB equ $1304 SetAllSCBs equ $1404 InitPort equ $1904 OpenPort equ $1804 HideCursor equ $9004 InvertRect equ $5604 SetCursor equ $8E04 SetColorEntry equ $1004 GetColorEntry equ $1104 SetColorTable equ $0E04 GetColorTable equ $0F04 ShieldCursor equ $E01E98 ; QD vectors that we patch DrawCursor equ $E01FCC UnDrawCursor equ $E01FD0 ROM1DrawCursor equ $FE40C3 ; ROM offsets (ick) ROM3DrawCursor equ $FE53A7 ROM1UnDrawCursor equ $FE41D8 ROM3UnDrawCursor equ $FE54CA EMToolSet equ $06 EMStartUp equ $0206 ; EM routines that we patch GetNextEvent equ $0A06 EventAvail equ $0B06 GetOSEvent equ $1606 OSEventAvail equ $1706 GetMouse equ $0C06 Button equ $0D06 StillDown equ $0E06 WaitMouseUp equ $0F06 ;--- standard bottleneck procedures: StdText equ $E01E04 StdLine equ $E01E08 StdRect equ $E01E0C StdRRect equ $E01E10 StdOval equ $E01E14 StdArc equ $E01E18 StdPoly equ $E01E1C StdRgn equ $E01E20 StdPixels equ $E01E24 StdComment equ $E01E28 StdTxMeas equ $E01E2C StdTxBnds equ $E01E30 StdGetPic equ $E01E34 StdPutPic equ $E01E38 scLnIntHnd equ $0A kybdIntHnd equ $0F crsrUpdtHnd equ $18 IDROUTINE equ $FE1F ; firmware id routine *===============================================* * * * _QDStartUp Patch Routine * * * *===============================================* MyQDStartUp PROC LONGA ON LONGI ON IMPORT CoreStartUp ; external routines IMPORT ClearRealScreen IMPORT PatchCursor IMPORT Beep IMPORT PatchFinder IMPORT MySystemTask IMPORT GetCVDefaults IMPORT CVStat:CVStatusRec ; global data IMPORT ScreenHandle IMPORT QDStartUpVec IMPORT MyUserID IMPORT NeedToPost IMPORT QDGlobals aSave SET 1 ; my stack offsets dSave SET aSave+2 bSave SET dSave+2 rtlAddr2 SET bSave+1 ; input parameter stack offsets rtlAddr1 SET rtlAddr2+3 userID SET rtlAddr1+3 maxWidth SET userID+2 masterSCB SET maxWidth+2 dPageAddr SET masterSCB+2 paramSize SET 4*2 phb ; save registers phd pha phk ; allow access to globals plb tsc ; make a stack frame tcd stz CVStat.noScreen ; assume we'll get screen *** added 4-Feb-92 DAL -- check for incompatible applications! lda 4+5,s tax lda 6+5,s and #$00ff jsr CheckAppCompatibility ;in: AX=caller's address, out=clc/sec bcs @notCompatible *** end 4-Feb-92 pha ; space for handle (long) pha pea 0 ; size of screen: $8000 (long) pea $8000 lda MyUserID pha ; user id (word) pea %0100000000000011 ; attributes: fixed, fixed address and bank pea VirtualScreen>>16 ; screen address (long) pea |VirtualScreen _NewHandle pla ; save the handle plx sta ScreenHandle stx ScreenHandle+2 bcc ok ;--- add task to alert user and disable menu: @notCompatible inc CVStat.noScreen ; no CloseView under current application! jsr GetCVDefaults ; get defaults from BRAM lda CVStat.wasOn sta NeedToPost pea MySystemTask>>16 pea MySystemTask _AddToRunQ ok lda >16 pea MySystemTask _RemoveFromRunQ ; remove ourself from the queue *** end 9-Feb-92 lda CVStat.noScreen ; did we have a virtual screen? bne skip ; no, so skip jsr UnPatchCursor jsr CoreShutDown lda ScreenHandle+2 pha lda ScreenHandle pha _DisposeHandle ; get rid of virtual screen stz ScreenHandle stz ScreenHandle+2 lda #1 sta CVStat.noScreen ; we gave it awayÉ skip ply ; restore registers plx pla plb jmp QDShutDownVec ; go to REAL QDShutDown ENDP *===============================================* * _EMStartUp Patch Routine * * * *===============================================* MyEMStartUp PROC LONGA ON LONGI ON IMPORT PatchKeys ; external routines IMPORT Refresh IMPORT EMStartUpVec ; global data IMPORT CVStat:CVStatusRec aSave SET 1 ; my stack offsets dSave SET aSave+2 bSave SET dSave+2 rtlAddr2 SET bSave+1 ; input parameter stack offsets rtlAddr1 SET rtlAddr2+3 userID SET rtlAddr1+3 yMaxClamp SET userID+2 yMinClamp SET yMaxClamp+2 xMaxClamp SET yMinClamp+2 xMinClamp SET xMaxClamp+2 queueSize SET xMinClamp+2 dPageAddr SET queueSize+2 paramSize SET 7*2 phb ; save registers phd pha phk ; allow short addressing (globals) plb tsc ; make a stack frame tcd ;--- call EMStartUp: pei CVStat.noScreen ; do we have a virtual screen? bne real ; no *** added 26-Aug-91 DAL -- if MasterSCB bit $0100 is on, a smooth launch is *** in progress, so we should not do much of anything pha _GetMasterSCB pla and #$0100 bne real *** end 26-Aug-91 DAL _HideCursor pea $0101 ; push on the bank of virtual screen plb ; set bank twice to plb ; clear stack lda colorWord,s ldx #160*200-2 @loop sta |VirtualScreen,x dex dex bpl @loop _ShowCursor lda rtlAddr1+1,s ; move up rtl addresses sta rtlAddr1+1+2,s lda rtlAddr1,s sta rtlAddr1+2,s lda rtlAddr2+1,s sta rtlAddr2+1+2,s lda rtlAddr2,s sta rtlAddr2+2,s pla ; restore registers plb pla ; remove input param lda #0 ; no errors clc rtl ;--- call real routine instead: real pla ; restore registers plb jmp ClearScreenVec ; go to REAL ClearScreen ENDP *===============================================* * _SetSCB Patch Routine * * * *===============================================* MySetSCB PROC LONGA ON LONGI ON IMPORT CVStat:CVStatusRec ; global data IMPORT ChangeSCBs IMPORT VirtualSCBs IMPORT SetSCBVec rtlAddr2 set 1 ; stack offsets rtlAddr1 set rtlAddr2+3 newSCB set rtlAddr1+3 scanLine set newSCB+2 pha ; save a-reg lda >CVStat.magnify beq skip ; skip patch when NOT (magnify AND enabled) lda >CVStat.enabled beq skip pla ; discard saved a-reg lda scanLine,s cmp #200 bcc ok ldx #$0452 bra done ; bad scan line error ok tax lda newSCB,s sep #$20 ; only store one byte sta >VirtualSCBs,x rep #$20 lda #1 sta >ChangeSCBs ; force update later ldx #0 ; no errors done lda rtlAddr1+1,s ; move up rtl addresses sta rtlAddr1+1+4,s lda rtlAddr1,s sta rtlAddr1+4,s lda rtlAddr2+1,s sta rtlAddr2+1+4,s lda rtlAddr2,s sta rtlAddr2+4,s pla ; remove input params pla txa ; pass back error code cmp #1 rtl ;--- call real routine instead: skip pla ; restore a-reg jmp SetSCBVec ; go to REAL SetSCB ENDP *===============================================* * _SetAllSCBs Patch Routine * * * *===============================================* MySetAllSCBs PROC LONGA ON LONGI ON IMPORT CVStat:CVStatusRec ; global data IMPORT ChangeSCBs IMPORT VirtualSCBs IMPORT SetAllSCBsVec IMPORT ModeSwitch rtlAddr2 set 1 ; stack offsets rtlAddr1 set rtlAddr2+3 newSCB set rtlAddr1+3 pha ; save a-reg lda >CVStat.enabled ; skip patch when NOT enabled beq skip lda newSCB+2,s and #$0080 ; mask out 640 bit pha ; save result on stack lda >CVStat.magnify bne @mag lda >SCBData ; check it against a real SCB bra @mask @mag lda >VirtualSCBs ; check it against a virtual SCB @mask and #$0080 ; mask out 640 bit cmp 1,s ; are they the same? beq same ; yes, so skip lda #1 sta >ModeSwitch ; tell core that we're switching modes same pla ; remove scratch space lda >CVStat.magnify beq skip ; skip rest of patch when NOT magnify pla ; discard saved a-reg lda newSCB,s sep #$20 LONGA OFF ldx #200-2 @loop sta >VirtualSCBs,x ; save as virtual SCBs dex bpl @loop rep #$20 LONGA ON lda #1 sta >ChangeSCBs ; force update later ldx #0 ; no errors done lda rtlAddr1+1,s ; move up rtl addresses sta rtlAddr1+1+2,s lda rtlAddr1,s sta rtlAddr1+2,s lda rtlAddr2+1,s sta rtlAddr2+1+2,s lda rtlAddr2,s sta rtlAddr2+2,s pla ; remove input param txa ; pass back error code cmp #1 rtl ;--- call real routine instead: skip pla ; restore a-reg jmp SetAllSCBsVec ; go to REAL SetAllSCBs ENDP *===============================================* * _GetSCB Patch Routine * * * *===============================================* MyGetSCB PROC LONGA ON LONGI ON IMPORT CVStat:CVStatusRec ; global data IMPORT VirtualSCBs IMPORT GetSCBVec rtlAddr2 set 1 ; stack offsets rtlAddr1 set rtlAddr2+3 scanLine set rtlAddr1+3 scbData set scanLine+2 paramSize set 2 pha ; save a-reg lda >CVStat.magnify beq skip ; skip patch when NOT (magnify AND enabled) lda >CVStat.enabled beq skip pla ; discard saved a-reg lda scanLine,s cmp #200 bcc ok ldx #$0452 bra done ; bad scan line error ok tax lda >VirtualSCBs,x and #$00FF sta scbData,s ldx #0 ; no errors done lda rtlAddr1+1,s ; move up rtl addresses sta rtlAddr1+1+paramSize,s lda rtlAddr1,s sta rtlAddr1+paramSize,s lda rtlAddr2+1,s sta rtlAddr2+1+paramSize,s lda rtlAddr2,s sta rtlAddr2+paramSize,s pla ; remove input param txa ; pass back error code cmp #1 rtl ;--- call real routine instead: skip pla ; restore a-reg jmp GetSCBVec ; go to REAL GetSCB ENDP *===============================================* * _OpenPort & _InitPort Patch Routines * * * *===============================================* MyOpenPort PROC LONGA ON LONGI ON IMPORT Temp ; global data IMPORT OpenPortVec IMPORT InitPortVec IMPORT CVStat:CVStatusRec rtlAddrB SET 1 rtlAddrA SET rtlAddrB+3 portPtrCopy SET rtlAddrA+3 aSave SET portPtrCopy+4 frameSize SET aSave+2-rtlAddrB rtlAddr2 SET aSave+2 ; input parameter stack offsets rtlAddr1 SET rtlAddr2+3 portPtr SET rtlAddr1+3 pha ; save a-reg register lda #$0000 sta >Temp bra start ;----------------------------------------------- ENTRY MyInitPort MyInitPort pha ; save a-reg register lda #$FFFF sta >Temp ;----------------------------------------------- start tsc ; space for new stack frame sec sbc #frameSize-2 tcs lda portPtr,s ; copy the port pointer sta portPtrCopy,s lda portPtr+2,s sta portPtrCopy+2,s lda rtlAddr1+1,s ; copy the caller's addr sta rtlAddrA+1,s lda rtlAddr1,s sta rtlAddrA,s lda #(Continue-1)>>8 ; set rtl address to us sta rtlAddrB+1,s lda #(Continue-1) sta rtlAddrB,s lda aSave,s ; restore a register lda >Temp bne @init lda aSave,s ; restore a register jmp OpenPortVec ; go to REAL OpenPort @init lda aSave,s ; restore a register jmp InitPortVec ; go to REAL InitPort ;----------------------------------------------- Continue dpSave SET 1 ; my new stack offsets aSave SET dpSave+2 rtlAddrB SET aSave+2 aSaveOld SET rtlAddrB+3 rtlAddr2 SET aSaveOld+2 ; original input parameter stack offsets rtlAddr1 SET rtlAddr2+3 portPtr SET rtlAddr1+3 pha ; save error code phd ; save dp-reg tsc tcd ; make a frame ;--- change the port's LocInfo ----------------- lda >CVStat.noScreen ; is there a virtual screen bne skip ; no, so skip ldy #3 lda #$0120 ; move port image to bank $01 (was at $E1) sta [CVStat.enabled beq skip lda >CVStat.magnify bne skip lda >CVStat.invert beq skip lda newColor,s ; if color is black or white then flip it and #$0FFF beq flip ; $000 is black cmp #$0FFF ; $FFF is white bne skip ; ignore everything else flip eor #$0FFF sta newColor,s skip pla ; restore a jmp SetColorEntryVec ; go to REAL SetColorEntry ENDP *===============================================* * _GetColorEntry Patch Routine * * * *===============================================* MyGetColorEntry PROC LONGA ON LONGI ON dSave SET 1 ; my stack offsets bSave SET dSave+2 aSave SET bSave+1 rtlAddr2 SET aSave+2 ; input parameter stack offsets rtlAddr1 SET rtlAddr2+3 entryNumber set rtlAddr1+3 tableNumber set entryNumber+2 result set tableNumber+2 paramSize SET 2*2 IMPORT CVStat:CVStatusRec ; global data IMPORT GetColorEntryVec pha ;--- IF enabled AND (NOT magnify) AND invert THEN flip color lda >CVStat.enabled beq skip lda >CVStat.magnify bne skip lda >CVStat.invert beq skip phb ; save registers phd phk ; allow access to globals plb tsc ; make a stack frame tcd pha ; space for result pei >16 sta CVStat.enabled beq skip lda >CVStat.magnify bne skip lda >CVStat.invert beq skip pla phd tsc ; make a stack frame tcd lda ColorTableData,x ; if color is black or white then flip it and #$0FFF beq @flip ; $000 is black cmp #$0FFF ; $FFF is white bne @ok ; ignore everything else @flip eor #$0FFF @ok sta [ChangeCursor ; remember to update later sta >DirtyScreen pla ; restore a-reg jmp SetCursorVec ; go to REAL SetCursor ENDP *===============================================* * * * In: Temp has IBar rect * * Out: IBarFound, IBarHeight, IBarPt * * * *===============================================* RecordIBar PROC LONGA ON LONGI ON minHeight SET 3 maxHeight SET 40 IMPORT IBarFound ; global data IMPORT IBarHeight IMPORT IBarPt:Point IMPORT Temp:Rect lda Temp.top cmp Temp.bottom bcc ok ldx Temp.bottom ; switch them stx Temp.top sta Temp.bottom ok lda Temp.bottom sec sbc Temp.top ; a <-- height of insertion bar cmp #minHeight bcc exit ; too short cmp #maxHeight+1 bcs exit ; too tall sta IBarHeight lsr a clc adc Temp.top sta IBarPt.v ; mid point lda Temp.left sta IBarPt.h pea IBarPt>>16 pea IBarPt _LocalToGlobal lda #1 sta IBarFound exit rts ENDP *===============================================* * _GetNextEvent Patch Routine * * * *===============================================* MyGetNextEvent PROC LONGA ON LONGI ON IMPORT Refresh IMPORT GetNextEventVec pha ; save registers phx phy jsr Refresh ply ; restore registers plx pla jmp GetNextEventVec ; go to REAL GetNextEvent ENDP *===============================================* * _GetOSEvent Patch Routine * * * *===============================================* MyGetOSEvent PROC LONGA ON LONGI ON IMPORT Refresh IMPORT GetOSEventVec pha ; save registers phx phy jsr Refresh ply ; restore registers plx pla jmp GetOSEventVec ; go to REAL GetOSEvent ENDP *===============================================* * _EventAvail Patch Routine * * * *===============================================* MyEventAvail PROC LONGA ON LONGI ON IMPORT Refresh IMPORT EventAvailVec pha ; save registers phx phy jsr Refresh ply ; restore registers plx pla jmp EventAvailVec ; go to REAL EventAvail ENDP *===============================================* * _OSEventAvail Patch Routine * * * *===============================================* MyOSEventAvail PROC LONGA ON LONGI ON IMPORT Refresh IMPORT OSEventAvailVec pha ; save registers phx phy jsr Refresh ply ; restore registers plx pla jmp OSEventAvailVec ; go to REAL OSEventAvail ENDP *===============================================* * _GetMouse Patch Routine * *===============================================* MyGetMouse PROC LONGA ON LONGI ON IMPORT Refresh IMPORT GetMouseVec pha ; save registers phx phy jsr Refresh ply ; restore registers plx pla jmp GetMouseVec ; go to REAL GetMouse ENDP *===============================================* * _Button Patch Routine * *===============================================* MyButton PROC LONGA ON LONGI ON IMPORT Refresh IMPORT ButtonVec pha ; save registers phx phy jsr Refresh ply ; restore registers plx pla jmp ButtonVec ; go to REAL Button ENDP *===============================================* * _StillDown Patch Routine * *===============================================* MyStillDown PROC LONGA ON LONGI ON IMPORT Refresh IMPORT StillDownVec pha ; save registers phx phy jsr Refresh ply ; restore registers plx pla jmp StillDownVec ; go to REAL StillDown ENDP *===============================================* * _WaitMouseUp Patch Routine * *===============================================* MyWaitMouseUp PROC LONGA ON LONGI ON IMPORT Refresh IMPORT WaitMouseUpVec pha ; save registers phx phy jsr Refresh ply ; restore registers plx pla jmp WaitMouseUpVec ; go to REAL WaitMouseUp ENDP *===============================================* * _*BootInit Patch Routine * * * *===============================================* MyBootInit PROC LONGA ON LONGI ON rtl ; just return ENDP *===============================================* * Patch for QD's ShieldCursor routine * *===============================================* MyShieldCursor PROC LONGA ON LONGI ON minRect SET 0 top SET 0 left SET top+2 bottom SET left+2 right SET bottom+2 IMPORT RealShieldCursor ; global data IMPORT DirtyScreen IMPORT CVStat:CVStatusRec IMPORT IBarOn IMPORT IBarFound IMPORT LastMinRect:Rect IMPORT Temp:Rect IMPORT Refresh ; external routines IMPORT RecordIBar IMPORT AddRefreshTask phb ; save registers pha phx phy phk plb ; IF enabled THEN... lda CVStat.enabled bne ok brl done ok lda #1 sta DirtyScreen ; virtual screen has new data lda IBarOn ; are we looking for an insertion bar? beq task lda IBarFound bne task lda TaskInQueue bne done ; already in queue pha pea RefreshTask>>16 pea RefreshTask _SchAddTask ; add a task to refresh later pla bcs done sta >TaskInQueue done rts ;----------------------------------------------- RefreshTask php cli ; bug in scheduler turns interrrupts off lda #0 sta >TaskInQueue jsr Refresh plp rtl ENDP *===============================================* * Patch for QD's DrawCursor routine * *===============================================* MyDrawCursor PROC LONGA ON LONGI ON IMPORT DirtyMouse IMPORT CursorOff IMPORT NextMouse:Point IMPORT CVStat:CVStatusRec IMPORT ROMVersion lda >CVStat.enabled ; IF enabled THEN ... beq skip lda >CursorOff bne abort lda #1 sta >DirtyMouse ; remember this cursor position: lda >EMYPos ; current mouse Y sta >NextMouse.v lda >EMXPos ; current mouse X sta >NextMouse.h skip phb pea $0101 ; virtual screen is in bank $01 plb plb lda >ROMVersion cmp #3 beq @rom3 cmp #1 beq @rom1 plb bra abort @rom1 jml ROM1DrawCursor @rom3 jml ROM3DrawCursor abort ; don't draw a cursor yet clc rtl ENDP *===============================================* * Patch for QD's UnDrawCursor routine * *===============================================* MyUnDrawCursor PROC LONGA ON LONGI ON IMPORT DirtyMouse IMPORT CursorOff IMPORT CVStat:CVStatusRec IMPORT ROMVersion lda >CVStat.enabled ; IF enabled THEN ... beq skip lda >CursorOff ; if CursorOff then don't undraw bne abort lda #1 sta >DirtyMouse skip phb pea $0101 ; virtual screen is in bank $01 plb plb lda >ROMVersion cmp #3 beq @rom3 cmp #1 beq @rom1 plb bra abort @rom1 jml ROM1UnDrawCursor @rom3 jml ROM3UnDrawCursor abort ; don't undraw cursor yet clc rtl ENDP *===============================================* * _HideCursor Patch Routine * *===============================================* MyHideCursor PROC LONGA ON LONGI ON IMPORT DirtyScreen IMPORT HideCursorVec pha ; save a-reg lda #1 sta >DirtyScreen pla ; restore a-reg jmp HideCursorVec ; go to REAL HideCursor ENDP *===============================================* * Patch for cursor update handler * * * * IN: none * * OUT: carry clr if we handled key * *===============================================* MyCursorUpdate PROC LONGA OFF ; called in 8-bit mode! LONGI OFF IMPORT CursorUpdateVec IMPORT CVStat:CVStatusRec IMPORT CursorOff IMPORT DirtyMouse IMPORT NextMouse:Point lda >CVStat.enabled ; IF enabled AND magnify THEN ... beq skip lda >CVStat.magnify beq skip lda >DirtyMouse beq skip lda #1 sta >CursorOff jsl CursorUpdateVec ; visit real routine lda #0 sta >CursorOff rtl skip jmp CursorUpdateVec ; jump to real routine ENDP *===============================================* * Patch for keyboard interupt handler * * * * IN: none * * OUT: carry clr if we handled key * *===============================================* KeyFilter PROC LONGA OFF ; called in 8-bit mode! LONGI OFF IMPORT Change ; global variables used IMPORT CVStat:CVStatusRec IMPORT KeyboardVec IMPORT IBarOn IMPORT IBarFound mApple equ $80 mOption equ $40 mControl equ $20 mShift equ $10 upArrow equ $0B downArrow equ $0A ; first check modifiers lda >KEYMODREG and #mApple+mOption+mShift+mControl cmp #mApple+mOption beq @check ; should we track insertion bar? and #mApple+mControl bne @skip ; if Apple or Control then skip lda >KBD bpl @skip ; no key if hi bit not set lda #1 sta >IBarOn lda #0 sta >IBarFound bra @skip ; now check for a key @check lda >CVStat.usekeys ; do we use key equivalents? beq @skip ; no, so skip lda >KBD bpl @skip ; key is only valid if hi bit set and #$7F cmp #'o' beq @o cmp #'O' beq @o cmp #'x' beq @x cmp #'X' beq @x cmp #'i' beq @i cmp #'I' beq @i cmp #upArrow beq @up cmp #downArrow beq @down @skip jmp KeyboardVec ; jump to real routine @o lda #cfOnOff bra @change @x lda #cfMagnify bra @change @up lda #cfPowerUp bra @change @down lda #cfPowerDown bra @change @i lda #cfInvert @change ora >Change sta >Change ; just set the bits here, handle it later @exit sta >KBDSTRB ; clear key strobe clc ; carry clear = we handled this interrupt rtl ENDP *===============================================* * Patch for StdLine bottleneck procedure * *===============================================* MyStdLine PROC LONGA ON LONGI ON portRef SET $24 pnSizeX SET opnSize+2 lineY1 SET $A6 lineX1 SET lineY1+2 lineY2 SET lineX1+2 lineX2 SET lineY2+2 IMPORT StdLineVec IMPORT RecordIBar IMPORT CVStat:CVStatusRec IMPORT TEMP:Rect phb ; save registers pha phx phy phk ; allow local addressing plb lda CVStat.enabled beq skip ; IF (pnSizeX = 1) AND (pnMode = modeXOR) AND (lineX1 = lineX2) THEN ldy #pnSizeX ; pen size lda [>16 beq @skip ; we're already patched @set sta >CursorUpdateAddr txa sta >CursorUpdateAddr+2 pea scLnIntHnd pea MyCursorUpdate>>16 pea MyCursorUpdate _SetVector @skip ;--- patch DrawCursor: php sei lda >DrawCursor ; patch DrawCursor sta >RealDrawCursor lda >DrawCursor+2 sta >RealDrawCursor+2 lda #MyDrawCursor sta >DrawCursor+1 lda #MyDrawCursor>>8 sta >DrawCursor+2 ;--- patch UnDrawCursor: lda >UnDrawCursor sta >RealUnDrawCursor lda >UnDrawCursor+2 sta >RealUnDrawCursor+2 lda #MyUnDrawCursor sta >UnDrawCursor+1 lda #MyUnDrawCursor>>8 sta >UnDrawCursor+2 plp rts *===============================================* * * *===============================================* UnPatchCursor PROC LONGA ON LONGI ON IMPORT RealDrawCursor IMPORT RealUnDrawCursor IMPORT CursorUpdateAddr ;--- unpatch CursorUpdate vector: pea scLnIntHnd lda >CursorUpdateAddr+2 pha lda >CursorUpdateAddr pha _SetVector @skip ;--- unpatch Draw/UnDraw Cursor: php sei lda >RealDrawCursor sta >DrawCursor ; unpatch DrawCursor lda >RealDrawCursor+2 sta >DrawCursor+2 lda >RealUnDrawCursor sta >UnDrawCursor ; unpatch UnDrawCursor lda >RealUnDrawCursor+2 sta >UnDrawCursor+2 plp rts ENDP *===============================================* * * * IN: none * * OUT: none * *===============================================* PatchKeys PROC EXPORT LONGA ON LONGI ON Import KeyBoardPatched Import KeyboardAddr pha pha pea kybdIntHnd _GetVector pla plx cmp #KeyFilter bne @set cpx #KeyFilter>>16 beq @exit ; we're already patched @set sta >KeyboardAddr txa sta >KeyboardAddr+2 pea kybdIntHnd pea KeyFilter>>16 pea KeyFilter _SetVector lda #1 sta >KeyBoardPatched @exit rts ENDP *===============================================* * * * IN: none * * OUT: none * *===============================================* UnPatchKeys PROC EXPORT LONGA ON LONGI ON IMPORT KeyBoardPatched IMPORT KeyboardAddr pea kybdIntHnd lda >KeyboardAddr+2 pha lda >KeyboardAddr pha _SetVector lda #0 sta >KeyBoardPatched rts ENDP *** Removed 9-Feb-92 DAL if 0 then *===============================================* * Patch the Finder! * * This will fix a bug in Finder 1.3 that makes * * CloseView look bad. The Finder's custom drag * * rect routine has a hardcoded "pea $E1E1". * * This patch changes it to a "pea $0101". This * * patch routine should only be called if we get * * a virtual screen (in bank 1). * * * * This patch knows that Finder 1.3 uses the * * _StartUpTools call, and that it has a main * * segment size of $F346 bytes. * * * In future Finders (> 1.3), the bug will be * * fixed. So this patch can be omited if/when * * the new Finder comes out. * * * * IN: DP register is set to the Caller's * * (of _QDStartUp) DP. * * * * OUT: none * * * *===============================================* PatchFinder PROC LONGA ON LONGI ON mainSegSize set $F346 ; size of Finder's main segment mainSegOffset set $256F ; offset to offending code retAddr2 set 36 ; StartUpTools DP offsets retAddr1 set retAddr2+3 startRec set retAddr1+3 startRecFlag set startRec+4 userID set startRecFlag+2 result set userID+2 ; check if user ID is valid: lda * * * * Output: *** Stack *** * * result - LONG * * rtlAddr - 3 BYTES * * sp ---> * *===============================================* InstallPatches PROC EXPORT LONGA ON LONGI ON IMPORT MyBootInit IMPORT MyQDStartUp IMPORT MyQDShutDown IMPORT MyClearScreen IMPORT MySetSCB IMPORT MyGetSCB IMPORT MySetAllSCBs IMPORT MySetColorEntry IMPORT MyGetColorEntry IMPORT MySetColorTable IMPORT MyGetColorTable IMPORT MyOpenPort IMPORT MyInitPort IMPORT MyInvertRect IMPORT MySetCursor IMPORT MyHideCursor IMPORT MyEMStartUp IMPORT MyGetNextEvent IMPORT MyEventAvail IMPORT MyGetOSEvent IMPORT MyOSEventAvail IMPORT MyGetMouse IMPORT MyButton IMPORT MyStillDown IMPORT MyWaitMouseUp IMPORT QDStartUpAddr IMPORT QDShutDownAddr IMPORT ClearScreenAddr IMPORT SetSCBAddr IMPORT GetSCBAddr IMPORT SetAllSCBsAddr IMPORT SetColorEntryAddr IMPORT GetColorEntryAddr IMPORT SetColorTableAddr IMPORT GetColorTableAddr IMPORT InitPortAddr IMPORT OpenPortAddr IMPORT InvertRectAddr IMPORT SetCursorAddr IMPORT HideCursorAddr IMPORT EMStartUpAddr IMPORT GetNextEventAddr IMPORT EventAvailAddr IMPORT GetOSEventAddr IMPORT OSEventAvailAddr IMPORT GetMouseAddr IMPORT ButtonAddr IMPORT StillDownAddr IMPORT WaitMouseUpAddr IMPORT MyUserID IMPORT StdLineVec IMPORT RealShieldCursor firstLocal set 1 ; local variables tsPtr set firstLocal fptPtr set tsPtr+4 tblSize set fptPtr+4 handle set tblSize+4 lastLocal set handle+4 localSize set lastLocal-firstLocal tsc ; make a stack frame sec sbc #localSize tcs phd ; save current dp tcd begin ldx #QDStartUp lda #QDStartUpAddr jsr GetFunctionAddr ldx #QDShutDown lda #QDShutDownAddr jsr GetFunctionAddr ldx #ClearScreen lda #ClearScreenAddr jsr GetFunctionAddr ldx #SetSCB lda #SetSCBAddr jsr GetFunctionAddr ldx #GetSCB lda #GetSCBAddr jsr GetFunctionAddr ldx #SetAllSCBs lda #SetAllSCBsAddr jsr GetFunctionAddr ldx #SetColorEntry lda #SetColorEntryAddr jsr GetFunctionAddr ldx #GetColorEntry lda #GetColorEntryAddr jsr GetFunctionAddr ldx #SetColorTable lda #SetColorTableAddr jsr GetFunctionAddr ldx #GetColorTable lda #GetColorTableAddr jsr GetFunctionAddr ldx #InitPort lda #InitPortAddr jsr GetFunctionAddr ldx #OpenPort lda #OpenPortAddr jsr GetFunctionAddr ldx #InvertRect lda #InvertRectAddr jsr GetFunctionAddr ldx #SetCursor lda #SetCursorAddr jsr GetFunctionAddr ldx #HideCursor lda #HideCursorAddr jsr GetFunctionAddr ldx #EMStartUp lda #EMStartUpAddr jsr GetFunctionAddr ldx #GetNextEvent lda #GetNextEventAddr jsr GetFunctionAddr ldx #EventAvail lda #EventAvailAddr jsr GetFunctionAddr ldx #GetOSEvent lda #GetOSEventAddr jsr GetFunctionAddr ldx #OSEventAvail lda #OSEventAvailAddr jsr GetFunctionAddr ldx #GetMouse lda #GetMouseAddr jsr GetFunctionAddr ldx #Button lda #ButtonAddr jsr GetFunctionAddr ldx #StillDown lda #StillDownAddr jsr GetFunctionAddr ldx #WaitMouseUp lda #WaitMouseUpAddr jsr GetFunctionAddr ; patch out QD functions: ldx #QDToolSet jsr GetToolSetAddr ldy #(QDStartUp>>8)<<2 lda #MyQDStartUp-1 jsr SetFunctionAddr ldy #(QDShutDown>>8)<<2 lda #MyQDShutDown-1 jsr SetFunctionAddr ldy #(ClearScreen>>8)<<2 lda #MyClearScreen-1 jsr SetFunctionAddr ldy #(SetSCB>>8)<<2 lda #MySetSCB-1 jsr SetFunctionAddr ldy #(GetSCB>>8)<<2 lda #MyGetSCB-1 jsr SetFunctionAddr ldy #(SetAllSCBs>>8)<<2 lda #MySetAllSCBs-1 jsr SetFunctionAddr ldy #(SetColorEntry>>8)<<2 lda #MySetColorEntry-1 jsr SetFunctionAddr ldy #(GetColorEntry>>8)<<2 lda #MyGetColorEntry-1 jsr SetFunctionAddr ldy #(SetColorTable>>8)<<2 lda #MySetColorTable-1 jsr SetFunctionAddr ldy #(GetColorTable>>8)<<2 lda #MyGetColorTable-1 jsr SetFunctionAddr ldy #(InitPort>>8)<<2 lda #MyInitPort-1 jsr SetFunctionAddr ldy #(OpenPort>>8)<<2 lda #MyOpenPort-1 jsr SetFunctionAddr ldy #(InvertRect>>8)<<2 lda #MyInvertRect-1 jsr SetFunctionAddr ldy #(SetCursor>>8)<<2 lda #MySetCursor-1 jsr SetFunctionAddr ldy #(HideCursor>>8)<<2 lda #MyHideCursor-1 jsr SetFunctionAddr ldx #QDToolSet jsr SetToolSetAddr ; patch out stdLine bottleneck procedure: php sei lda >StdLine+2 ; first save original vector sta StdLineVec+2 lda >StdLine sta StdLineVec lda #MyStdLine>>8 ; now add our vector sta >StdLine+2 lda #MyStdLine<<8 ora #$005C ; 'jml' instruction sta >StdLine ;--- patch shield cursor: lda >ShieldCursor sta >RealShieldCursor lda >ShieldCursor+2 sta >RealShieldCursor+2 lda #MyShieldCursor sta >ShieldCursor+1 lda #MyShieldCursor>>8 sta >ShieldCursor+2 plp ; patch out EM functions: ldx #EMToolSet jsr GetToolSetAddr ldy #(EMStartUp>>8)<<2 lda #MyEMStartUp-1 jsr SetFunctionAddr ldy #(GetNextEvent>>8)<<2 lda #MyGetNextEvent-1 jsr SetFunctionAddr ldy #(EventAvail>>8)<<2 lda #MyEventAvail-1 jsr SetFunctionAddr ldy #(GetOSEvent>>8)<<2 lda #MyGetOSEvent-1 jsr SetFunctionAddr ldy #(OSEventAvail>>8)<<2 lda #MyOSEventAvail-1 jsr SetFunctionAddr ldy #(GetMouse>>8)<<2 lda #MyGetMouse-1 jsr SetFunctionAddr ldy #(Button>>8)<<2 lda #MyButton-1 jsr SetFunctionAddr ldy #(StillDown>>8)<<2 lda #MyStillDown-1 jsr SetFunctionAddr ldy #(WaitMouseUp>>8)<<2 lda #MyWaitMouseUp-1 jsr SetFunctionAddr ldx #EMToolSet jsr SetToolSetAddr _SetDefaultTPT ; permanently install these patches! end pld ; restore dp tsc clc adc #localsize tcs rts ;----------------------------------------------- ; In: x-reg set to toolset number ; ; Out: fptPtr ; ;----------------------------------------------- GetToolSetAddr pha ; space for pointer (long) pha pea 0 ; 0 = system tool set phx ; tool set number _GetTSPtr pla plx sta >16 sta [>16 ; bank of our new functions sta [>16 pea NotifyParams _AddNotifyProc rts NotifyParams dc.W 1 ; pcount dc.L ShutdownTask ; task pointer ;------------------------------------------------ ; This task is called when the system ; is being shutdown (or restarted). ; ; In: none ; Out: none ;------------------------------------------------ ShutdownTask ;--- Standard Notify Queue Header --------------- Header dc.L 0 ; next task link dc.W 0 ; reserved dc.W $A55A ; signature dc.L neShutDown ; event mask EventCode dc.L 0 ; event code ;------------------------------------------------ phk plb lda EventCode cmp #neShutDown bne exit jsr SetCVDefaults ; write default values to BRAM exit rtl ENDP *===============================================* * Get the version number of the ROM * * * * In: none * * Out: a-reg has ROM version {0,1,2,É} * *===============================================* GetROMVersion PROC EXPORT LONGA ON LONGI ON pha ; space for result (4 words) pha pha pha pea 0 ; a-reg on entry pea 0 ; x-reg on entry pea 0 ; y-reg on entry pea IDROUTINE ; firmware routine _FWEntry pla ; version number plx ; ignore the rest plx plx rts ENDP *===============================================* * In: a, x point to text * * y has lenght of text * * * * Out: none * * * *===============================================* PostAlert PROC LONGA ON LONGI ON aboutDY equ 83+22 aboutDX equ 302 aboutY1 equ ((200-aboutDY)/2)-10 aboutY2 equ aboutY1+aboutDY aboutX1 equ (640-aboutDX)/2 aboutX1_320 equ (320-aboutDX)/2 iconY1 equ 3 iconX1 equ 6 iconWidth equ 14 ; byte width of icon IMPORT Temp IMPORT MyWinList:WindParamList IMPORT MyEvent:Event IMPORT IconLocInfo:LocInfo ; found in NDA segment sta StringPtr ; save text pointer stx StringPtr+2 sty StringLength ; save lenght of text pha pha _GetPort ; save the current port lda #fAlert+fVis sta myWinList.wFrameBits lda #aboutY1 sta myWinList.wPosition.top lda #aboutY2 sta myWinList.wPosition.bottom pha _GetMasterSCB pla sta >IconLocInfo.portSCB and #mode640 beq @320 @640 lda #aboutX1 bra @set @320 lda #aboutX1_320; @set sta myWinList.wPosition.left clc adc #aboutDX sta myWinList.wPosition.right pha pha pea myWinList>>16 pea myWinList _NewWindow ; create the window pla plx sta aboutWinPtr stx aboutWinPtr+2 bcc @good brl exit ; couldn't get window @good phx pha _SetPort pha ; space for handle pha lda aboutWinPtr+2 pha ; window ptr (long) lda aboutWinPtr pha pea controlRect>>16 ; bounds Rect ptr pea controlRect pea StrOK>>16 pea StrOK pea $01 ; flag = bold button pea 0 ; initial value pea 0 ; param1 pea 0 ; param2 pea 0 ; defProcPtr = simple button (long) pea 0 pea 0 ; refcon (long) pea 0 pea 0 ; color table ptr pea 0 _NewControl pla plx sta myHandle stx myHandle+2 ; draw Alert contents: ldx #iconWidth*4 lda >IconLocInfo.portSCB and #$0080 ; is it 640? bne @setRight ; yes ldx #iconWidth*2 ; no, so adjust @setRight txa sta >IconLocInfo.boundsRect.right pea IconLocInfo>>16 pea IconLocInfo pea IconLocInfo.boundsRect>>16 pea IconLocInfo.boundsRect pea iconX1 pea iconY1 pea 0 _PPToPort lda StringPtr+2 ; ptr to text pha lda StringPtr pha lda StringLength ; text length pha pea textRect>>16 ; bounds rect pea textRect pea 0 ; left justified _LETextBox2 lda aboutWinPtr+2 pha ; window ptr (long) lda aboutWinPtr pha _DrawControls ; wait for user: @while pha pea mDownMask+keyDownMask pea myEvent>>16 pea myEvent _GetNextEvent pla beq @while lda myEvent.what cmp #keyDownEvt bne @mouse @key lda myEvent.message and #$00FF cmp #$000D bne @while pea 2 lda myHandle+2 pha lda myHandle pha _HiLiteControl ; hilite the button bra close @mouse cmp #mouseDownEvt bne @while pha ; space for result pea Temp>>16 pea Temp lda myEvent.where.h pha lda myEvent.where.v pha lda aboutWinPtr+2 pha lda aboutWinPtr pha _FindControl pla beq @while pha ; space for result lda myEvent.where.h pha lda myEvent.where.v pha pea 0 ; actionProc = nil pea 0 lda myHandle+2 pha lda myHandle pha _TrackControl pla bne close brl @while close ldx aboutWinPtr+2 lda aboutWinPtr phx pha _CloseWindow exit _SetPort ; restore the current port rts StringPtr ds.L 1 StringLength ds.W 1 aboutWinPtr ds.L 1 myHandle ds.L 1 STRING PASCAL StrOK dc.B 'OK' textRect dc.W 4,80,aboutDY-8,aboutDX-10 controlRect dc.W aboutDY-20,aboutDX/2-40,aboutDY-5,aboutDX/2+40 ENDP *===============================================* * System task * * * * IN: none * * OUT: none * *===============================================* MySystemTask PROC LONGA ON LONGI ON IMPORT menuID IMPORT MyUserID IMPORT NeedToPost IMPORT HadToLoadFM IMPORT PostAlert IMPORT Beep taskTicks set 1 ; 60 ticks = 1 second fontManager equ $001B *----------------------------------------------- TaskHeader dc.L 0 ; link (used by desk mgr) TaskCount dc.W taskTicks ; tick count dc.W $A55A ; signature dc.L 0 ; reserved *----------------------------------------------- phb phk plb pea MySystemTask>>16 pea MySystemTask _RemoveFromRunQ ; remove ourself from the queue *** added 9-Feb-92 DAL -- make sure Menu Mgr is here before we call it pea 0 _MenuStatus pla bne @ok stz NeedToPost bra exit @ok *** end 9-Feb-92 lda >menuID pha _DisableMItem ; disable "CloseView" from Apple menu lda NeedToPost ; was CloseView on before? beq exit ; no, so don't alert user stz NeedToPost ;--- see if FontManager is active: stz HadToLoadFM pea 0 _FMStatus pla bne post ; yes, so ok to post alert pea fontManager pea 0 _LoadOneTool bcs exit inc HadToLoadFM tsc sec sbc #256 ; allocate dp space tcs inc a tax lda MyUserID pha phx ; dp space _FMStartUp bcs skip post jsr Beep ; get user's attention ldy #endStr-StrNoMemory lda #StrNoMemory ldx #StrNoMemory>>16 jsr PostAlert ; tell the user we didn't get screen lda HadToLoadFM beq exit _FMShutDown skip tsc clc adc #256 ; deallocate dp space tcs pea fontManager _UnloadOneTool exit lda #taskTicks sta TaskCount ; reset the period for next time plb rtl STRING ASIS StrNoMemory dc.B 1,'F' ; change the font dc.W $FFFE ; family = shaston dc.B 0 ; style = plain dc.B 16 ; size = 16pt dc.B 'CloseView is not available under this application.' endStr ENDP *===============================================* * Beep at the user * *===============================================* Beep PROC EXPORT LONGA ON LONGI ON php sei lda #$8000 @loop ldx #200 @wait dec a beq @done dex bne @wait sep #$20 sta >$E1C030 ; click rep #$20 bra @loop @done plp rts ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CloseView/ReleaseNotes b/IIGS.601.SRC/A.U.G/CloseView/ReleaseNotes new file mode 100644 index 0000000..03119ef --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CloseView/ReleaseNotes @@ -0,0 +1 @@ +CloseView GS 1.0 Please ship this program so people can use it! Release 1.0f2 Ñ April 29, 1991 ------------------------------------------------------------- Bug Fixes: ¥ BRC# 68609: Fixed a bug in the auto centering code so that CloseView won't overflow the screen. ¥ BRC# 65723: Special cased the cursor width for 12x so bigger cursors don't cause the view to move back and forth. Other Changes: ¥ When CloseView shutsdown it will erase the cursor and framebox in case the QuickDraw screen is left up by the Finder. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/AppleShare b/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/AppleShare new file mode 100644 index 0000000..e69de29 diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/AppleShare.aii b/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/AppleShare.aii new file mode 100644 index 0000000..b724c74 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/AppleShare.aii @@ -0,0 +1 @@ +;====================================================================== ; ; AppleShare CDEV 2.0 -- The Real Thing ; by Mark Day ; ; ; This Control Panel allows the user to log on to a file server and ; mount volumes from the server. ; ; This version REQUIRES system 6.0 and AppleTalk Phase 2 drivers ; because it uses new calls (such as 6.0's case-insensitive compare ; and the GetZoneList2 call). ; ; Modification History: ; ; == Version 0.01 == ; 23-Jul-91 MSD Written from scratch in assembly language! ; ; == Version 2.0d2 == ; 26-Aug-91 MSD Fixed to use FILogin2 so that the server and ; zone names will be set correctly. Fixed the ; main window and volume list so that a double- ; click in a list will make the OK button blink. ; ; == Version 2.0d3 == ; 27-Aug-91 MSD Started removing all BRK instructions and make ; the code do something intelligent (like try ; to put up an error message). Testing for ; AppleTalk and allocating memory now happen ; at RectCDEV time so I can use a smaller ; rectangle if there was an error. CreateCDEV ; message added; it creates a different list ; of controls if there was an error. ; 28-Aug-91 MSD Removed RectCDEV and CreateCDEV messages. Re- ; activated MachineCDEV and moved checking there. ; Added code to SelectVol to handle errors from ; mounting a volume. ; == Version 2.0d4 == ; 06-Sep-91 MSD Starting to add auto-logon functionality. ; 14-Sep-91 MSD It now successfully reads the AppleShare.Prep ; file, logs on to the servers, and mounts the ; volumes. It puts up dialogs for passwords as ; needed (if it wasn't saved, or if the saved one ; was incorrect). ; 15-Sep-91 MSD Clicking on the "Quit" button from the volume ; list dialog no longer saves your password and ; will not update the AppleShare.Prep file. BTW, ; the button title has been changed to "Cancel". ; ; == Version 2.0d5 == ; 20-Sep-91 MSD Turned off debugging symbols by default. Made ; AddVolPass and GetVolPass functional. ; 26-Sep-91 MSD ¥ StartLookup now displays an error if it gets ; an NBP busy error. ; ¥ Passwords in the message center are now ; stored scrambled (not plain text). ; ¥ RunCDEV now checks to see if there are no ; zones. If so, it checks again (in case they ; become available). ; ; == Version 2.0d7 == ; 16-Oct-91 MSD ¥ In CloseCDEV, the user name is written before ; disposing my memory (so if a dialog comes up, the ; list controls will continue to draw properly). ; ¥ If you hit the zone control (including TAB), ; it only updates the server list if the zone ; actually changed. ; ¥ The user name is written to the ATINIT file ; only if it has actually changed. ; ; == Version 2.0d10 == ; 8-Nov-91 MSD ¥ After volumes are mounted, call GetUserPath ; to force FIUserPrefix to be set. ; 11-Nov-91 MSD ¥ Fix bug with no volumes returned. It was ; returning an error when it should just display ; an empty list. ; ;====================================================================== ; ; Begin 6.0.1 ; ; 4-Mar-93 DAL ¥ For 6.0.1d14, adding AFP 2.1 support (we use ; AFP 2.1 instead of 2.0 if it's available). ; ; 25-Mar-93 DAL ¥ For 6.0.1d15, added range check on tracking ; checkboxes next to items in the volume list. ; If there were fewer than 4 volumes listed, we ; we tracking phantom checkboxes before. ; ¥ Removed the "inc hasAFP21" with "if 0 then". ; Support is needed elsewhere in the system before ; we enable this, so it's turned off for 6.0.1. ; ;====================================================================== print push,off include 'E16.Types' include 'E16.Resources' include 'M16.Util' include 'M16.MiscTool' include 'E16.Memory' include 'M16.Memory' include 'M16.QuickDraw' include 'E16.Window' include 'M16.Window' include 'E16.Control' include 'M16.Control' include 'E16.List' include 'M16.List' include 'M16.LineEdit' include 'E16.Event' include 'M16.Event' include 'M16.IntMath' include 'M16.Debug' include 'E16.Locator' include 'M16.Locator' include 'M16.GSOS' print pop include 'AppleShareEqu.aii' ;====================================================================== ; ; EnterCDEV ; ; This is the main entry point for the CDEV. It receives the various ; messages passed by the Control Panel itself. ; ; I will allocate a small stack frame for local variables and set up ; the direct page register to get to them. Each routine is called with ; a JSR and the result will be pre-set to 0. On return, the stack will ; be cleaned up and control will return to the caller. ; ; On entry, the stack contains: ; Long Result space ; Word Message (call number) ; Long Data1 (generally the cdev's grafport) ; Long Data2 (unused) ; 3 byte Return address ; ;====================================================================== ; ; This is what our direct page will look like to called routines ; dp record 1 locals ds.b localSize ; just for now savedD ds.w 1 ; old D is pushed here savedB ds.b 1 ; old B is pushed here retCP ds.b 3 ; return address to Control Panel data2 ds.l 1 ; passed by CP data1 ds.l 1 ; passed by CP message ds.w 1 ; passed by CP result ds.l 1 ; will pre-set to 0 endr EnterCDEV procname import EventsCDEV,HitCDEV,InitCDEV,CloseCDEV,RunCDEV import MachineCDEV,BootCDEV,EditCDEV,RectCDEV,CreateCDEV ; ; Save bank and direct registers ; phb ; save old bank just in case phk plb ; lets us use absolute addressing phd ; save old direct page ; ; Make a stack frame with some room for local vars ; tsc sec sbc #localSize ; size of locals tcs ; push down stack tcd ; point D to it, too ; ; Pre-set the result to 0 ; stz dp.result stz dp.result+2 ; ; Call the appropriate message handler ; lda dp.message cmp #MaxMessage+1 ; beyond defined messages? bge bye ; yes, so just exit now asl a ; times 2 as index to jump table tax jsr (calls,x) ; go to appropriate message handler ; ; Now I squeeze the locals and the input parameters out of the stack ; by copying the saved direct and bank registers and the return address ; up just under the result and then adjusting the stack pointer. I'm ; depending on the fact that I only need to copy 6 bytes (D, B, RTL) ; and that all I have to squeeze is the locals plus 10 bytes of input. ; bye lda dp.savedD sta dp.result-6 lda dp.savedD+2 sta dp.result-4 lda dp.savedD+4 sta dp.result-2 tsc clc adc #localSize+10 ; squeeze input and locals out tcs pld plb rtl ; ; addresses of message handlers ; calls dc.w @rts ; 0 = undefined dc.w MachineCDEV ; 1 = MachineCDEV dc.w BootCDEV ; 2 = BootCDEV dc.w @rts ; 3 = reserved for ShutDownCDEV dc.w InitCDEV ; 4 = InitCDEV dc.w CloseCDEV ; 5 = CloseCDEV dc.w EventsCDEV ; 6 = EventsCDEV dc.w @rts ; 7 = CreateCDEV dc.w @rts ; 8 = AboutCDEV dc.w @rts ; 9 = RectCDEV dc.w HitCDEV ; 10 = HitCDEV dc.w RunCDEV ; 11 = RunCDEV dc.w EditCDEV ; 12 = EditCDEV @rts rts endp ;====================================================================== ; ; BootCDEV ; ; This routine is called by the control panel during boot. This gives ; me a chance to mount volumes from the AppleShare.Prep file. ; ; If I want an X drawn through my icon, I have to set bit 0 of the ; word pointed to by data1. ; ;====================================================================== BootCDEV procname import TestATalk,AutoLogon jsr TestATalk ; see if AppleTalk is active lda #0 rol a ; A=1 if there was an error sta [dp.data1] ; tell CP to "X" me out or not bne exit ; if error, don't auto logon jsr AutoLogon exit rts endp ;====================================================================== ; ; MachineCDEV ; ; This routine is called by the control panel to see whether the CDEV ; should run under the current machine state. I use it to check for ; the presence of the AppleShare FST. ; ; Return non-zero to display, zero not to display. Since result was ; already set to zero before we got called, we have to set it to 1 ; if everything is OK. ; ;====================================================================== MachineCDEV procname import TestATalk,AllocMem,AlertByID jsr TestATalk bcc getmem _InitCursor lda #rNoAppleTalk jmp AlertByID ; put up alert and exit getmem jsr AllocMem bcc exit _InitCursor lda #rOutOfMemory jmp AlertByID exit inc dp.result ; everything is OK for running rts endp ;====================================================================== ; ; TestATalk ; ; This routine returns with carry clear if AppleTalk is active (i.e., ; the AppleShare FST is present) or carry set otherwise. ; ;====================================================================== TestAtalk procname import FSTInfo:GetFSTInfoRec lda #1 sta FSTInfo.fstNum ; start scanning with 1 loop jsl $E100A8 ; GS/OS inline entry dc.w $202B ; GetFSTInfo dc.l FSTInfo bcs exit ; return carry set if error inc FSTInfo.fstNum ; prepare for next FST lda FSTInfo.fileSysID cmp #$D ; is it AppleShare? bne loop ; no, try others clc ; AppleShare is active exit rts endp ;====================================================================== ; ; EventsCDEV ; ; This routine is called by the Control Panel before calling TaskMaster ; so that the CDEV can change the event record. ; ; The AppleShare CDEV uses this to detect double-clicks in the server ; list, which it translates into a Return key press (which will cause ; a hit on the OK button). ; ;====================================================================== EventsCDEV procname import TestDoubleClick ; ; TestDoubleClick expects a pointer to the event record at offset ; 1 and 4 bytes of workspace at offset 5 on direct page. Luckily, ; this is the start of our local variables. So, just copy the ; event pointer and call it. ; event equ 1 lda dp.data1 ; data1 was pointer to event sta event lda dp.data1+2 sta event+2 jsr TestDoubleClick rts endp ;====================================================================== ; ; HitCDEV ; ; This routine is called to tell the CDEV that there has been a hit ; on a control. ; ; If there is a hit on the zone list, we cancel the old NBPLookup, ; clear the server list, get the new zone name, start a Lookup in the ; new zone. ; ; On Entry: ; Data1 = handle to control ; Data2 = control's ID ; ;====================================================================== HitCDEV procname with dp import myWindow,userName,wereHosed import dblClick,subText,Deref import NBPKill,StartLookup,lastZone import DoConnectAs,SelectVols import srvrListH,srvrMembers import HiliteByID,serverAddress import volsMounted,BlinkByID import FILogin:FILogin2Rec import FILogout:FILogoutRec import BootButton import prepHandle,ReadPrepFile,WritePrepFile import SetDefName local record locals h ds.l 1 ; space for deref of handles activeOK ds.w 1 ; has OK button's active state endr lda wereHosed ; any fatal errors? bne DoNothing ; if so, ignore all events lda data2 cmp #12 ; was it the server list? beq ServerHit cmp #13 ; was it the OK button? beq OKHit cmp #15 ; zone list? beq ZoneHit DoNothing rts ServerHit pha ; result space pea 0 ; start at item zero PushLong data1 ; push the control handle _NextMember2 ; get first selected member if any ldx #$FF ; assume inactive for control pla ; anything selected? beq @hilite ldx #0 ; activate the control @hilite stx local.activeOK lda #ServerOKButton ; button's ID jsr HiliteByID lda dblClick ; was it a double-click? beq @exit ; no, so just leave stz dblClick ; don't let us see it for other lists lda local.activeOK ; is OK button highlighted? beq BlinkOK ; yes, so blink and hit OK button @exit rts ; ; The user has selected something in the zone list. Stop the lookup in ; the old zone and start one in the new zone. Make the OK button inactive ; since there are no zones selected. ; ZoneHit pha ; result space pea 0 ; start at item zero PushLong data1 ; control handle _NextMember2 pla ; get currently selected zone cmp lastZone ; was it the same as last selected zone? sta lastZone ; update lastZone just in case it changed beq @nochange ATCall NBPKill jsr StartLookup @nochange rts BlinkOK lda #ServerOKButton jsr BlinkByID ; blink the OK button as feedback OKHit ATCall NBPKill ; stop new lookups ; ; Read in the AppleShare.Prep file so I can update it if the user makes ; any changes. ; jsr ReadPrepFile ; ; Save old port and substitution array ; pha ; room for result pha _GetPort pha ; room for result pha _GetCtlParamPtr ; get old substitution pointer PushLong #subText _SetCtlParamPtr ; set new substitutions ; ; For each server selected in the list... ; @loop pha ; room for result PushLong srvrListH _ResetMember2 ; find next selected member pla beq @done ; 0 means no more selected dea ; adjust to 0 offset pha ; push space pha pha ; push 0-based index PushWord #5 ; size of member record _Multiply ; ; Deref member array handle and add (n-1)*5 to point to ; nth item's member record. ; lda srvrMembers ; deref member list handle sta local.h lda srvrMembers+2 sta local.h+2 ldy #2 pla ; get offset low word clc adc [local.h] ; add low word of base tax ; save low word pla ; get offset high word adc [local.h],y ; add high word of base sta local.h+2 stx local.h ; h points to nth member record ; ; Copy pointer to PString from member record to substitution array ; lda [local.h] sta subText lda [local.h],y sta subText+2 ; ; Get server's internet address from NBP Lookup buffer (it is 5 ; bytes before the server's name). ; sec lda subText ; get pointer to server name sbc #5 ; back up to server's address pha ; save low word lda subText+2 sbc #0 tax ; put high word in X pla ; get low word in A jsr Deref ; grab the 4 bytes sta serverAddress ; save net (first two bytes) stx serverAddress+2 ; save node and socket ; ; Set up a default user name and password ; jsr SetDefName ; ; Do the "Connect As..." dialog and pick volumes ; jsr DoConnectAs ; ask how they want to log on bcs @loop ; cancelled, so try next server jsr SelectVols ; select and mount volumes lda volsMounted ; were volumes already mounted? bne @loop ; yes, so don't log out @logout lda FILogin.sessRefNum sta FILogout.sessRefNum ATCall FILogout brl @loop ; try next one @done _SetCtlParamPtr ; restore old sub array _SetPort ; restore old port ; ; Write out the new AppleShare.Prep file if it has changed. ; jsr WritePrepFile jsr StartLookup ; go back to looking again rts endwith endp ;====================================================================== ; ; Deref ; ; This routine takes a pointer in A,X (A low word, X high word) ; and returns the first four bytes at that address in A,X (A low). ; Useful for dereferencing handles. ; ;====================================================================== Deref procname phd ; save D phy ; save Y phx ; put pointer on stack pha tsc tcd ; make stack frame ldy #2 lda [1],y ; get high word tax lda [1] ; get low word ply ; remove pointer from stack ply ply ; restore Y pld ; restore D rts endp ;====================================================================== ; ; NewPointer ; ; This is a simplified form of the NewHandle tool call. It allocates ; a locked, fixed handle with my ID and returns a pointer to it. ; ; On entry: ; A = size of memory block ; ; On exit: ; X = high word of pointer ; Y = low word of pointer ; A = error code (if any) ; carry set on error ; ;====================================================================== NewPointer procname import myID pha ; room for result pha pea 0 ; high word of length pha ; low word of length PushWord myID PushWord #attrLocked+attrFixed pha ; location pointer is ignored pha _NewHandle ply ; get handle plx bcs err ; don't deref if error tya ; put low word of handle in A jsr Deref ; deref the handle tay ; put low word back in Y clc ; no error lda #0 err rts endp ;====================================================================== ; ; NewHandle ; ; This is a simplified for of the _NewHandle tool call that allocates ; a movable handle with my ID and returns the handle to it. ; ; On entry: ; A = size of memory block ; ; On exit: ; X = high word of handle ; Y = low word of handle ; A = error code (if any) ; carry set on error ; ;====================================================================== NewHandle procname export import myID pha ; room for result pha pea 0 ; high word of size pha ; low word of size PushWord myID PushWord #attrNoPurge pha ; locationPtr is ignored pha _NewHandle ply ; get low word of handle plx ; get high word of handle rts ; return with error if any endp ;====================================================================== ; ; AllocMem ; ; This routine allocates all the handles I need for buffers and ; arrays of member records. It sets up and uses myID which is my ; memory manager ID with the aux field set to 1. If there is any ; error, I dispose of evrything I allocated and return with the carry ; set. ; ;====================================================================== AllocMem procname import myID,messageHandle import LookupName:LookupNameRec import GZL2:GetZoneList2Rec import GetSrvrParms:SPCommandRec import srvrMembers,zoneMembers,volMembers ; ; Get my Memory Manager user ID ; pha ; space for result _MMStartup pla ora #$0100 ; use auxID of 1 for my memory sta myID ; ; Allocate room for the member records and lookup buffer for the ; server list. ; ; First, the lookup buffer lda #SrvrBufSize jsr NewPointer bcs NoMem sty LookupName.bufPtr stx LookupName.bufPtr+2 ; Now, the member record array lda #SrvrMemSize jsr NewHandle bcs NoMem sty srvrMembers stx srvrMembers+2 ; ; Allocate a buffer for GetZoneList to store the zone list ; lda #ZoneBufSize jsr NewPointer bcs NoMem sty GZL2.bufferPtr stx GZL2.bufferPtr+2 ; ; Allocate a buffer for zone list's member records ; lda #ZoneMemSize jsr NewHandle bcs NoMem sty zoneMembers stx zoneMembers+2 ; ; Volume list buffer ; lda #VolBufSize jsr NewPointer bcs NoMem sty GetSrvrParms.replyBufPtr stx GetSrvrParms.replyBufPtr+2 ; ; Volume list member records ; lda #VolMemSize jsr NewHandle bcs NoMem sty volMembers stx volMembers+2 ; ; Message center data ; lda #8 ; just enough for count word jsr NewHandle bcs NoMem sty messageHandle stx messageHandle+2 clc ; no errors rts ; ; If I get here, I couldn't get the memory I need. Free up anything ; I did get and try to put up an alert. ; NoMem PushWord myID _DisposeAll sec ; got an error rts endp ;====================================================================== ; ; InitCDEV ; ; This routine is responsible for setting up the value of controls. ; ; At this point, it only intializes the zone list. I will keep the ; zone buffer as a locked handle for now so that I can use pointers ; in the member records (rather than allocate a whole bunch of extra ; handles and copying the zone list). ; ; On entry, data1 = window pointer ; ;====================================================================== InitCDEV procname with dp import myID,myWindow,wereHosed import srvrMembers,srvrListH import BuildZoneList,StartLookup,zoneListH import GetUserName,userName local record dp.locals h ds.l 1 ; to deref handles endr lda wereHosed bne Exit ; don't do init if error ; ; Save off my window pointer (for HitCDEV which doesn't get it) ; lda dp.data1 sta myWindow lda dp.data1+2 sta myWindow+2 ; ; Find the server list control ; pha ; space for result pha pushldp dp.data1 ; my window PushLong #ServerList ; server list control's ID _GetCtlHandleFromID PullLong srvrListH ; ; Get and save handle to zone list control ; pha ; space for control handle pha pushldp dp.data1 ; search in our window PushLong #ZoneList ; ID of zone list _GetCtlHandleFromID ; find control handle PullLong zoneListH ; pull handle to zone list ; ; Build the zone list ; jsr BuildZoneList ; ; Start the lookups in my zone ; jsr StartLookup ; ; Get and set the default value for the user name. ; jsr GetUserName PushLong myWindow PushLong #UserLE PushLong #userName _SetLETextByID Exit rts endwith endp ;====================================================================== ; ; CloseCDEV ; ; Stop any pending async lookups and release allocated memory. ; ;====================================================================== CloseCDEV procname import myID,wereHosed import NBPKill,WriteUserName lda wereHosed bne Exit ; fatal error, nothing to clean up ATCall NBPKill ; stop any async lookups jsr WriteUserName PushWord myID _DisposeAll Exit rts endp ;====================================================================== ; ; RunCDEV ; ; I use this to see if any new servers have shown up in the LookupName ; buffer and add them to the displayed list. ; ;====================================================================== RunCDEV procname import LookupName:LookupNameRec import srvrListSize,wereHosed import srvrMembers,srvrListH import GZL2:GetZoneList2Rec,BuildZoneList local record dp.locals h ds.l 1 ; used to deref handles memPtr ds.l 1 ; points into member array entPtr ds.l 1 ; points into entity name endr with local lda wereHosed bne @exit ; ; If there were no zones, see if there are some now. ; lda GZL2.zonesReturned ; any zones found? bne @zones ; yes, so leave 'em jsr BuildZoneList @zones ; ; See if any new servers have shown up in the buffer. ; lda srvrListSize cmp LookupName.actMatch bne New @exit brl NoNew New ;---------- ; We have new servers. Append them to the member array. First, ; skip over the first (srvrListSize) entity names in the buffer ; and the same number of member records. ;---------- pha ; save current size for loop count ; ; First, set up pointers to start of buffer and member array ; lda LookupName.bufPtr sta entPtr lda LookupName.bufPtr+2 sta entPtr+2 lda srvrMembers ; deref member handle ldx srvrMembers+2 jsr Deref sta memPtr stx memPtr+2 ; ; Now skip over the first (srvrListSize) items which are already in the list. ; I have to use a loop like this for the lookup buffer because the entities ; have variable lengths. ; plx ; get current list size cpx #0 ; originally no items? beq append ; correct, don't update pointers @loop lda #4 ; add 5 for net/node/socket/enumerator jsr bumpent ; note: bumpent adds an extra 1! lda [entPtr] jsr bumpent ; skip past object string lda [entPtr] jsr bumpent ; skip past type string lda [entPtr] jsr bumpent ; skip past zone string dex bne @loop ; ; Skip over first (srvrListSize) items in the member array by simply ; adding srvrListSize * (size of member record). ; pha ; room for product pha PushWord srvrListSize PushWord #5 _Multiply clc pla ; low word of offset adc memPtr sta memPtr pla ; high word of offset adc memPtr+2 sta memPtr+2 ; ; Now add the new items to the list ; append ldx srvrListSize ; X will be loop index lda LookupName.actMatch sta srvrListSize ; update new list size ldy #0 ; offset into member array @loop lda #4 ; past net/node/socket/enum jsr bumpent lda entPtr ; copy pointer to object string sta [memPtr],y ; into member record iny iny lda entPtr+2 ; high word of pointer sta [memPtr],y iny ; point to memSelect - 1 lda #0 ; will clear high byte of pointer sta [memPtr],y ; and de-select the new member iny iny ; point to next member record lda [entPtr] jsr bumpent ; point past object string lda [entPtr] jsr bumpent ; point past type string lda [entPtr] jsr bumpent ; point past zone string inx ; X = number of items now in list cpx srvrListSize ; is that all of 'em? bne @loop ; ; Rebuild and sort the list ; PushLong #0 ; use default draw routine lda #$FFFF ; value for defaults pha ; don't change list start pha ; don't change list reference pha pha ; don't change listRefDesc phx ; push new listSize PushLong srvrListH ; do it to the server list control _NewList2 PushLong #1 ; use case-insensitive sort PushLong srvrListH _SortList2 ; ; We're all done updating the list, so just return ; NoNew rts ; ; A local subroutine to add (low byte of A) + 1 to entPtr. It is used ; to bump the pointer past a pascal string or internet address. ; bumpent and #$00FF ; make sure to add only a byte sec adc entPtr sta entPtr bcc @nohi inc entPtr+2 @nohi rts endwith ; local endp ;====================================================================== ; ; EditCDEV ; ; This message passes edit codes the same as SystemEdit passes to ; NDA's. I use them to allow editing of the user name line edit. ; ; On entry: ; data1 = edit code (low word) ; 5 = Undo ; 6 = Cut ; 7 = Copy ; 8 = Paste ; 9 = Clear ; data2 = window pointer ; ;====================================================================== EditCDEV procname import wereHosed lda wereHosed beq doit rts ; was error, ignore edit calls doit ; ; Leave handle to the edit record on stack for the calls ; pha ; room for edit record handle pha pha ; room for control's handle pha pei dp.data2+2 ; push window pei dp.data2 PushLong #UserLE ; control ID _GetCtlHandleFromID _GetCtlTitle ; edit record handle is on the stack ; ; Dispatch to the appropriate handler ; lda dp.data1 ; get edit code sec sbc #5 ; get 0-based offset asl a ; get index into table tax jmp (editcalls,x) editcalls dc.w undo dc.w cut dc.w copy dc.w paste dc.w clear undo pla ; remove edit record handle pla rts ; do nothing for Undo cut _LECut _LEToScrap rts copy _LECopy _LEToScrap rts paste _LEFromScrap _LEPaste rts clear _LEDelete rts endp ;====================================================================== ; ; BuildZoneList ; ; This routine builds the zone list by doing a GetZoneList2, selecting ; my zone (as returned by GetMyZone), and sorting the list. The list ; control is updated with a NewList2 call. ; ;====================================================================== BuildZoneList procname import myID,lastZone import zoneMembers,zoneListH import GZL2:GetZoneList2Rec import GMZBuffer import GetMyZone:GetMyZoneRec import ATGetInfo:ATGetInfoRec local record dp.locals h ds.l 1 ; for deref of handle memPtr ds.l 1 ; points into member array zonePtr ds.l 1 ; points into zone buffer endr stz GZL2.zonesReturned ; assume no zones ; ; Test ARouter before trying to get zones ; ATCall ATGetInfo lda ATGetInfo.aBridge and #$00FF ; it's just a byte bne Router rts ; no router, so leave list empty Router ; ; Do a GetMyZone so I know which item in the list to select. ; ATCall GetMyZone bcc @noerr @errexit rts ; error, assume no zones @noerr ; ; Now do the GetZoneList2 call ; stz GZL2.zipWork ; init work for whole list stz GZL2.zipWork+2 ATCall GZL2 ; make the call bcs @errexit ; didn't work, assume no zones ; ; Construct the array of member records to point to the zone ; names in the zone buffer. The member handle can remain unlocked ; because I don't make any tool calls inside the loop. ; with local lda GZL2.bufferPtr sta zonePtr ; point to start of zone list lda GZL2.bufferPtr+2 sta zonePtr+2 lda zoneMembers ; deref member array handle ldx zoneMembers+2 jsr Deref sta memPtr stx memPtr+2 ldx GZL2.zonesReturned ldy #0 @loop lda zonePtr sta [memPtr],y ; copy low word of string pointer iny iny ; point to high word of pointer lda zonePtr+2 sta [memPtr],y ; copy high word of string pointer iny ; point to memFlag-1 ; ; Here, we see if the zone matches GetMyZone. If so, select this item. ; lda #0 sta [memPtr],y ; clear high byte of pointer and memFlag ; this defaults the item to not selected phx ; toolbox will munge X,Y! phy pha ; space for result PushWord #0 ; flags (reserved) PushLong #GMZBuffer ; my zone pushldp zonePtr ; the current zone _CompareStrings pla ; will be 0 if they equal ply ; restore X,Y plx cmp #0 ; did strings match? bne @notmyzone ; no, so don't select lda #$8000 ; set selected in memFlag sta [memPtr],y @notmyzone iny iny ; point past memFlag lda [zonePtr] ; get string length and #$00FF ; want just length byte sec ; plus 1 for length byte adc zonePtr ; get addr of next string sta zonePtr bcc @nohigh ; branch if no bank cross inc zonePtr+2 ; add carry to bank @nohigh dex ; more zones? bne @loop endwith ; local ; ; Create the new list with all of the new members ; PushLong #0 ; no special member draw routine PushWord #1 ; start with first member (will change) PushLong zoneMembers ; reference to member array PushWord #refIsHandle ; it's a handle PushWord GZL2.zonesReturned ; list size PushLong zoneListH ; handle to list control _NewList2 ; ; Sort the list ; PushLong #1 ; do case-insensitive sort PushLong zoneListH _SortList2 ; ; Now, select my zone by finding the first (and only) selected ; item and re-selecting it. ; ; find the first selected member pha ; room for result PushWord #0 ; start at beginning of list PushLong zoneListH ; push handle to control _NextMember2 ; find first selected ; save currently selected zone lda 1,s sta lastZone ; using that item number, select it PushLong zoneListH _SelectMember2 rts endp ;====================================================================== ; ; StartLookup ; ; Resets the server list to empty, then gets the zone from the zone ; list (or "*") and begins the async LookupName. Servers are actually ; added to the list during RunCDEV messages. ; ;====================================================================== StartLookup procname import LookupName:LookupNameRec import myWindow,srvrListSize import zoneMembers,zoneListH,LookupZone import srvrListH,srvrMembers import HiliteByID,AlertByID local record dp.locals h ds.l 1 ; used to deref handles endr stz SrvrListSize ; server list will be empty ; ; Rebuild a new, empty, server list ; PushLong #0 ; use default draw routine PushWord #1 ; first displayed item PushLong srvrMembers ; reference to member array PushWord #refIsHandle PushWord #0 ; zero items in list PushLong srvrListH ; handle to list control _NewList2 ; ; Disable the OK button since no servers are selected ; ldx #255 ; disable control lda #ServerOKButton ; OK button's ID jsr HiliteByID ; ; Copy the zone name from the zone list to the entity name used ; by the lookup call (this makes us look in the selected zone). ; lda #$2A01 ; "*" as a two-byte string sta LookupZone ; use "*" as default zone name pha ; room for member number PushWord #0 ; start at beginning of list PushLong zoneListH ; look in zone list _NextMember2 pla ; get item number beq NoZones ; no zones, just use "*" dea ; make it 0-based pha ; push room for product pha pha ; push item number - 1 PushWord #5 ; push size of zone member _Multiply ; now have offset to item lda zoneMembers ; deref handle to zone members sta local.h lda zoneMembers+2 sta local.h+2 ldy #2 clc pla ; add offset to start of member array adc [local.h] ; to pointer to member array tax pla adc [local.h],y stx local.h ; put back in h to use as pointer sta local.h+2 ; local.h points to nth member record lda [local.h] ; get pointer to member's string tax lda [local.h],y stx local.h sta local.h+2 ; now local.h points to zone's string ldy #32 ; always copy 34 bytes of zone string @loop lda [local.h],y ; copy from zone list sta LookupZone,y ; and into lookup's entity dey dey bpl @loop NoZones ; ; Now, start the async LookupName ; ATCall LookupName lda LookupName.result cmp #NBPBusy bne @done _InitCursor lda #rNBPBusy jsr AlertByID @done rts endp ;====================================================================== ; ; CtlHandleByID ; ; This is basically a simplified version of the GetCtlHandleFromID ; toolbox call. Put the low word of the control ID in A (the high word ; is assumed to be zero) and the handle will be returned in A,X (with ; the high word in A, low word in X). The current port must be set ; to the window containing the control. ; ;====================================================================== CtlHandleByID procname pha ; room for handle (and save A) pha pha ; room for port pha _GetPort lda 7,s ; recover control ID PushWord #0 ; high word of control ID pha ; low word of control ID _GetCtlHandleFromID plx ; low word of control handle pla ; high word of control handle rts endp ;====================================================================== ; ; HiliteByID ; ; Given a part code (in X) and a control ID (in A), this routine finds ; the control and then calls HiliteControl. It assumes the window ; is the current GrafPort. It also assumes that the upper word of ; the control ID is zero. ; ;====================================================================== HiliteByID procname phx ; push part code jsr CtlHandleByID pha ; push control handle phx _HiliteControl rts endp ;====================================================================== ; ; HideByID ; ; Given a control ID in A, this routine will hide that control by ; finding its handle and using HideControl. It assumes that the high ; word of the control ID is zero. ; ;====================================================================== HideByID procname jsr CtlHandleByID pha ; push control handle phx _HideControl rts endp ;====================================================================== ; ; ShowByID ; ; Given a control ID in A, this routine will show that control by ; finding its handle and using ShowControl. It assumes that the upper ; word of the control ID is zero. ; ;====================================================================== ShowByID procname jsr CtlHandleByID pha ; push control handle phx _ShowControl rts endp ;====================================================================== ; ; SelectLEByID ; ; This routine takes the low word of a control ID of a line edit ; control in A, makes it the target, and selects all of its text. ; The high word of the control is assumed to be zero. ; ;====================================================================== SelectLEById procname PushWord #0 ; select from start of text PushWord #256 ; select to end of text pha ; room for LineEdit record handle pha jsr CtlHandleByID ; find the control pha ; one copy for MakeThisCtlTarget phx pha ; one copy for GetCtlTitle phx _MakeThisCtlTarget ; make it the target control _GetCtlTitle ; get LineEdit record handle _LESetSelect ; select the text rts ;====================================================================== ; ; SetCtlValByID ; ; A simplified _SetCtlValue. The new value is passed in X and the ; control ID is in A (low word, the high word is zero). ; ;====================================================================== SetCtlValByID procname phx ; push new value jsr CtlHandleByID ; get control handle pha ; push control handle phx _SetCtlValue rts endp ;====================================================================== ; ; BlinkByID ; ; This routine takes the low word of a control ID in A (the high word ; must be zero) and hilites then unhilites the control. It is used ; to make the OK button "blink" in the main window and the volume list ; dialog when the user double-clicks in a list. ; ;====================================================================== BlinkById procname pha ; save control ID ldx #1 ; hilite it jsr HiliteByID pla ; get control ID back ldx #0 jmp HiliteByID endp ;====================================================================== ; ; RetryCommand ; ; Given a pointer to an AppleTalk parameter block in X and Y, this ; routine will keep making the command until it gets an error other ; than too many ASP commands. ; ;====================================================================== RetryCommand procname phy ; save X,Y in case we have to phx ; try the call again again jsl $E11014 ; try to dispatch the call bcc Exit ; no error, so return now lda 1,s ; get X (low word) tax lda 3,s ; get Y (high word) tay phd ; create a stack frame so I can tsc ; look at the parameter block tcd ldy #2 ; offset to result field lda [3],y ; get result from pb pld ; clean up stack frame cmp #SPTooManyCalls beq again Exit ply ; clean up stack plx rts endp ;====================================================================== ; ; SetupHadConn ; ; This routine is called to change the "Connect As..." dialog if the ; user was already logged in. It will show how they are logged in, ; what their user name is, etc. It also sets up selectedUAM to ; either rScrambled (randnum exchange) or 0 (guest). The userName ; variable is set to their user name. ; ;====================================================================== SetupHadConn procname import SPCommand:SPCommandRec import FILogin:FILogin2Rec import cmdBuf,replyBuf,selectedUAM import connWindow,userName import HideNameAndPass,ShowNameAndPass ; ; Put up "Already connected" instead of "Connect as" ; lda #rAlreadyConn jsr ShowByID ; ; Figure out what their user name is (empty string if they logged ; on as a guest). ; lda FILogin.sessRefNum sta SPCommand.sessRefNum lda #FPGetUserInfo sta cmdBuf lda #$100 ; bitmap = user ID sta cmdBuf+6 lda #8 ; command length sta SPCommand.bufLen ldx # not logged in inc alreadyConn ; yep, already connected NewLogin lda hasAFP20 bne @okVers ; They don't support AFP 2.0 so put up an error message lda #rBadAFPVers jsr AlertByID sec ; pretend cancel hit rts ; return with A=0 @okVers lda hasGuest ora hasClearText ora hasScrambled ; aything I support? bne @okUAM ; They don't support any UAM I know about, so put up an alert lda #rBadUAM jsr AlertByID ; A = 0 because only one button sec ; pretend cancel hit rts ; A = 0 means cancelled @okUAM export BootConnectAs BootConnectAs name ; ; Save the current port ; pha ; room for cancel flag pha pha _GetPort ; ; Create the "Connect as..." window ; lda #rConnDlg jsr NewWindByID stx connWindow sta connWindow+2 ; ; If the server doesn't support changing passwords, dim the button ; lda hasChgPwd bne @SetPassOK ldx #$FF ; inactive control lda #rCSetPass ; dim the Set Password button jsr HiliteByID @SetPassOK ; ; Set up the dialog appropriately depending on whether they were already ; logged on or not. ; lda alreadyConn bne @HadConn jsr SetupNewConn ; set up for new connection bra @IsSetup @HadConn jsr SetupHadConn ; set up for existing connection @IsSetup ; ; Now, wait for the user to hit one of the buttons ; @loop pha ; room for result pha PushLong #taskRecord ; pointer to my extended task record lda #0 ; value for defaults pha ; use standard update routine pha pea $8000 ; Event hook = $80000000 pha ; to do Cmd-. => Esc translation pha ; use default beep routine pha PushWord #mwIBeam ; DoModalWindow flags _DoModalWindow pla ; get control ID plx ; ignore high word of ID cmp #0 ; null event? beq @loop ; yes, keep going cmp #rDlg1Last+1 ; beyond what I care about? bge @loop ; yes, so keep doing dialog sec sbc #rDlg1First ; get 0 offset for IDs asl a tax jsr (hitTable,x) ; do the right thing bcc @loop ; ; Whatever it was, we're done. ; sta 5,s ; save cancel flag PushLong connWindow _CloseWindow _SetPort ; restore old port _InitCursor ; force arrow cursor (2-Apr-92 DAL) pla ; get cancel flag back lsr a ; set carry if cancel rts hitTable dc.w DoGuest dc.w DoRegistered dc.w DoCancel dc.w DoOK dc.w DoSetPass ; ; DoGuest -- Called when Guest button clicked. ; DoGuest jsr HideNameAndPass clc ; continue dialog rts ; ; DoRegistered -- Called when Registered User button clicked. ; DoRegistered jsr ShowNameAndPass clc ; continue dialog rts ; ; DoSetPass -- The Set Password button was clicked. We end up ; logging on, then doing an FPChangePassword call. We will remain ; logged on just as if they hit the OK button (as long as they ; don't cancel from the set password dialog). ; DoSetPass jsr SetPassword ; carry set if OK rts ; ; The cancel button was hit. ; DoCancel lda #1 sec rts ; ; The OK button was hit. Extract the selected UAM, user name, ; and password. ; DoOK lda alreadyConn ; already connected? bnel @exit ; yes, so just exit now pha ; room for value lda #rGuest jsr CtlHandleByID pha ; push control handle phx _GetCtlValue pla beq @registered stz selectedUAM stz userName ; set userName to empty bra @guest @registered ; ; They picked Registered User so copy out the user name and password. ; PushLong connWindow PushLong #rNameLE PushLong #userName _GetLETextByID ; ; Fill password buffer with nulls, then get password. This will ; have the effect of leaving an 8 byte, null padded password at ; serverPassword+1. ; ldx #8 @padloop stz serverPassword,x dex dex bpl @padloop PushLong connWindow PushLong #rPassLE PushLong #serverPassword _GetLETextByID @guest ; ; Now, try to log in ; jsr TryLogin bcc @exit pha ; save error code jsr ShowPFIErr ; put up a dialog explaining error plx ; get error code back ; ; If error was unknown user or bad password, select the corresponding ; line edit field and give user another chance to log on. ; lda #1 ; pretend cancel pressed cpx #FIUserNotAuth ; bad password? beq @password cpx #FIParamErr ; bad user name? bne @exit2 ; no, other errors just exit ; ; Here, the user name was bad (or password expired in HHG). Let them ; re-enter the name and try again. ; lda #rNameLE jsr SelectLEByID clc ; not done yet rts @password ; ; Here, the password was bad. Let them re-enter it. ; lda #rPassLE jsr SelectLEByID clc ; not done yet rts @exit lda #0 ; no cancel @exit2 sec ; done with dialog rts endp ;====================================================================== ; ; HideNameAndPass ; ; This routine hides the name, password, and UAM fields in the "Connect ; as..." dialog. It also makes the Set Password button inactive. ; This routine is appropriate when the Guest radio button has been ; selected (by the user or by the connect code). ; ;====================================================================== HideNameAndPass procname import selectedUAM lda #rNameStr jsr HideByID lda #rNameLE jsr HideByID lda #rPassStr jsr HideByID lda #rPassLE jsr HideByID lda selectedUAM ; this is control ID of jsr HideByID ; the UAM string ldx #$FF ; inactive control lda #rCSetPass ; dim the Set Password button jsr HiliteByID rts endp ;====================================================================== ; ; HideNameAndPass ; ; This routine hides the name, password, and UAM fields in the "Connect ; as..." dialog. It also makes the Set Password button inactive. ; This routine is appropriate when the Guest radio button has been ; selected (by the user or by the connect code). ; ;====================================================================== ShowNameAndPass procname import selectedUAM,hasChgPwd lda #rNameStr jsr ShowByID lda #rNameLE jsr ShowByID lda #rPassStr jsr ShowByID lda #rPassLE jsr ShowByID lda selectedUAM ; this is control ID of jsr ShowByID ; the UAM string ; Now check to see if I should enable the Set Password button based ; on the the hasChgPwd flag. lda hasChgPwd ; did server support set password? beq noSetPass ; no, so leave dimmed ldx #0 ; active control lda #rCSetPass ; activate the Set Password button jsr HiliteByID noSetPass rts endp ;====================================================================== ; ; TryLogin ; ; This routine is called at boot time and from the Connect As dialog ; to attempt to connect to a given file server. This does not put ; up any dialogs (so boot mount can put up Connect As and Connect As ; can put up a dialog). ; ; On entry: ; serverAddress 4-byte internet address of file server ; selectedUAM 0 = Guest, or rClearText, rScrambled ; userName set if UAM <> Guest ; serverPassword set if UAM <> Guest ; ; On exit: ; A = error code (zero if no error) ; carry set on error, clear otherwise ; session refnum in FILogin.sessRefNum (if no error) ; ;====================================================================== TryLogin procname export import FILogin:FILogin2Rec import FILoginCont:FILoginContRec import serverAddress,selectedUAM import userName,serverPassword import cmdBuf,replyBuf,AFPVersion20,AFPVersion21,hasAFP21 import GuestUAM,ClearTextUAM,ScrambledUAM import PutString,DES,subText ; ; Set up server's address ; lda serverAddress sta FILogin.srvrAddr lda serverAddress+2 sta FILogin.srvrAddr+2 ; ; Set up pointer to server's name (zone name is at a constant ; location, so it is set up in globals.aii). ; lda subText ; server name is "*0" sta FILogin.serverName lda subText+2 sta FILogin.serverName+2 ; ; Set up FPLogin command packet in cmdBuf ; lda #FPLogin sta cmdBuf ldx #1 ; offset for AFPVersion *** changed 4-Mar-93 DAL lda #$0200 ;anticipate AFP2.0 sta FILogin.afpVersion PushLong #AFPVersion20 ; string to add lda hasAFP21 beq @no21 lda #AFPVersion21 sta 1,s lda #$0201 sta FILogin.afpVersion @no21 *** end 4-Mar-93 jsr PutString ; put PString in cmdBuf ldy selectedUAM beq Guest cpy #rClearText beq ClearText bra Randnum ; ; UAM is guest ; Guest PushLong #GuestUAM jsr PutString bra SendIt ; ; UAM is Clear text ; ClearText PushLong #ClearTextUAM jsr PutString PushLong #userName jsr PutString txa ; if X is odd, put a pad byte lsr a bcc @nopad stz cmdBuf,x ; put pad byte in inx @nopad ldy #0 @loop lda serverPassword+1,y ; don't copy length byte! sta cmdBuf,x inx inx iny iny cpy #8 ; copy 4 words of password bne @loop bra SendIt ; ; UAM is Randnum exchange ; Randnum PushLong #ScrambledUAM jsr PutString PushLong #userName jsr PutString ; ; The packet is built and the length is in X. Now send it out. ; SendIt stx FILogin.bufLen ATCall FILogin lda FILogin.result cmp #FILogContErr ; login continue? bne Exit ; ; Got a LoginContinue error so extract the random number, encrypt ; it, and do an FILoginCont call. ; Continue ldx #0 pha pla ; set N,Z according to A rts DESParamBlock dc.l serverPassword+1 dc.l replyBuf+2 ; get straight from reply dc.l cmdBuf+4 ; put in place for login continue endp ;====================================================================== ; ; PutString ; ; Copies a Pascal string (address passed on the stack) into cmdBuf ; at the offset given in the X register. On exit, X is the offset ; in cmdBuf of the byte after the last byte of the string. ; ;====================================================================== PutString procname import cmdBuf dp record 1 savedD ds.w 1 rts ds.w 1 str ds.b 3 count ds.b 1 ; really high byte of str endr phd tsc tcd ; create a stack frame sep #$20 longa off ldy #0 lda [dp.str] ; get string length ina ; plus 1 for length byte sta dp.count loop lda [dp.str],y sta cmdBuf,x iny inx dec dp.count bne loop rep #$20 longa on pld pla ; get return address sta 3,s ; overwrite pointer high word pla ; pop string pointer low word rts endp ;====================================================================== ; ; HideVolButtons ; ; This routine hides the Save My Name and Save My Name and Password ; buttons in the volume list dialog. ; ;====================================================================== HideVolButtons procname lda #idNameOnly jsr HideByID lda #idNameAndPass jsr HideByID rts endp ;====================================================================== ; ; ShowVolButtons ; ; This routine shows the Save My Name and Save My Name and Password ; buttons in the volume list dialog. It only shows the buttons ; if you logged on as a registered user. ; ;====================================================================== ShowVolButtons procname import selectedUAM lda selectedUAM beq done lda #idNameOnly jsr ShowByID lda #idNameAndPass jsr ShowByID done rts endp ;====================================================================== ; ; SetupVolPath ; ; This routine sets up the volPath buffer to be a volume name turned ; into a path by prepending a "/" to the front of the volume name. ; ; On entry: ; A = high word of volume name pointer ; X = low word of volume name pointer ; ; On exit: ; volPath is set up ; ;====================================================================== SetupVolPath procname import volPath dp record 1 volPtr ds.l 1 savedD ds.w 1 endr ; ; Set up a local stack frame ; phd pha ; high word of volume pointer phx ; low word of volume pointer tsc tcd sep #$30 longa off longi off ; ; Do the string copy ; lda [dp.volPtr] ; copy length byte tay ina ; add 1 for "/" sta volPath loop lda [dp.volPtr],y sta volPath+1,y ; +1 is room for "/" dey bne loop lda #'/' sta volPath+1 rep #$30 longa on longi on ; ; Clean up stack and exit ; pla ; remove volPtr pla pld rts endp ;====================================================================== ; ; MountAVol ; ; This routine is called at boot time or from the volume list dialog ; to attempt to mount a volume. It doesn't put up any dialogs (the ; boot mount code or SelectVols should do that). ; ; On entry: ; FILogin.sessRefNum sessRefnum to use (set up by TryLogin) ; A (low byte) mount flags set up for FIMountVol ; X (low), Y (high) pointer to volume name (no leading slash) ; volPassword (used if password bit set in flags) ; (Note: the high byte of A is ignored) ; ; On exit: ; A = error code (zero if no error) ; carry set on error, clear otherwise ; ;====================================================================== MountAVol procname export import FILogin:FILogin2Rec import FIMountVol:FIMountVolRec stx FIMountVol.volName sty FIMountVol.volName+2 sep #$20 longa off sta FIMountVol.flags lda FILogin.sessRefNum sta FIMountVol.sessRefNum rep #$20 longa on ATCall FIMountVol lda FIMountVol.result cmp #1 ; set carry if error pha pla ; set N,Z according to A rts endp ;====================================================================== ; ; BuildVolList ; ; This routine gets the list of volumes from a server and builds ; up the member array. It sets the memFlag field to tell me if ; the volume should be dimmed (either because it is already mounted ; or because I don't have enough access privileges) and whether ; to check the box. Volumes with passwords are assumed to have enough ; access privileges to mount. ; ; The memFlag field is a word so it can contain these extra flags: ; bit 15 set if volume is checked (mount at boot time) ; bit 14 set if volume has a password ; bit 13 set if volume is a user's volume ; ;====================================================================== BuildVolList procname import GetSrvrParms:SPCommandRec import FIMountVol:FIMountVolRec import FIAccess:FIAccessRec import FILogin:FILogin2Rec import volMembers,volPath,numVols import myID,checkCount,volsMounted import AlertByID local record dp.locals h ds.l 1 bufPtr ds.l 1 ; point to GetSrvrParms buffer memPtr ds.l 1 ; points to member records numVols ds.w 1 ; loop counter bufIndex ds.w 1 ; index into GetSrvrParms buffer endr stz volsMounted ; assume no volumes already mounted stz numVols ; assume error from server sep #$20 longa off lda FILogin.sessRefNum sta FIMountVol.sessRefNum sta GetSrvrParms.sessRefNum rep #$20 longa on ; ; Deref handle to member records ; lda volMembers ldx volMembers+2 jsr Deref sta local.memPtr stx local.memPtr+2 ; ; Do an FPGetSrvrParms to get a list of all the volumes. ; lda GetSrvrParms.replyBufPtr sta local.bufPtr ; make local copy lda GetSrvrParms.replyBufPtr+2 sta local.bufPtr+2 ldx # unchecked, 2 = checked phx _DrawChar _SetFont ; restore old font ; ; Fix up the stack and return ; lda retaddr sta retaddr+inputSize lda retaddr+1 sta retaddr+1+inputSize pld tsc clc adc #inputSize tcs rtl endwith ; dp endp ;====================================================================== ; ; VolListHook ; ; This routine intercepts events to the volume list window. Its ; biggest goal in life is to detect when the user is clicking in one of ; the checkboxes in the list, track it, change its value in the member ; record, and return a null event. ; ; I will swallow the mousedown event if it was within checkRect (a ; rectangle covering the right side of the list where the check boxes ; are all placed). If it was actually within one of the check boxes, ; I create a check box control over the member, track it, and update ; the member's record. ; ; Checking the horizontal position of the point is pretty easy (just ; a certain range from the right edge). Testing the vertical position ; is a little harder. I find the vertical offset of the point from ; the top of the list; the offset MOD the member height tells me how ; far down in the member's rectangle it was (now it becomes a simple ; range test); the offset DIV the member height tells me which member ; was hit, relative to the top one displayed. ; ; 26-Aug-91 MSD Added translation from Command-period to Esc. ; ;====================================================================== VolListHook procname import whichWindow,whichControl,whichPt import volWindow,volListH,volMembers import vOffset,itemNum,checkBoxTempl import checkBoxH,checkRect,checkCount import TestDoubleClick,prepChange dp record 1 vOffset ds.w 1 ; offset from top of list itemNum ds.w 1 ; 0-based item number hit memPtr ds.l 1 ; points to list control record savedD ds.w 1 savedB ds.b 1 rtl ds.b 3 event ds.l 1 ; pointer to task record parmSize equ *-rtl endr ; ; Set up stack frame ; phb phk plb ; set bank to my data phd pha ; make room for locals pha pha pha tsc tcd ; point to stack frame ; ; See if the event type is something I want ; lda [dp.event] ; get event.what cmp #keyDownEvt bne TryMouse ; ; If key was command-period, change to ESC. ; ldy #omodifiers lda [dp.event],y and #appleKey+shiftKey+optionKey+controlKey cmp #appleKey ; command key down? bne @exit ; no, don't translate ldy #omessage lda [dp.event],y and #$00FF ; get key byte only cmp #'.' ; period down? bne @exit ; no, don't do it ; Was command-period. Change to Esc. ldy #omodifiers lda [dp.event],y and #ÅappleKey ; turn off Apple key bit sta [dp.event],y ldy #omessage lda #$1B ; ESC sta [dp.event],y @exit brl exit TryMouse cmp #mouseDownEvt bne neExit ; pass through other events ; ; Check for double click. ; ; TestDoubleClick wants a pointer to the event record at offset 1 on ; direct page and 4 bytes of workspace at offset 5. This just happens ; to fit in our locals, so copy the event pointer and call it. ; lda dp.event sta 1 lda dp.event+2 sta 3 jsr TestDoubleClick ; ; Where did the event happen? ; pha ; room for result PushLong #whichWindow ; where to store window pointer ldy #owhere+2 ; offset to where.x lda [dp.event],y sta whichPt+2 ; save point, just in case pha dey dey ; offset to where.y lda [dp.event],y sta whichPt pha _FindWindow pla cmp #wInContent ; inside some window? bne neExit ; If not in volume list window, just exit lda whichWindow cmp volWindow bne neExit lda whichWindow+2 cmp volWindow+2 neExit bnel exit ; bne exit ; ; Get the local coordinates of the point ; pha ; room for current port pha _GetPort ; leave port on stack PushLong volWindow _SetPort PushLong #whichPt _GlobalToLocal ; ; I will claim the event if the point was within checkRect ; pha ; room for result PushLong #whichPt PushLong #checkRect _PtInRect pla beq toPortExit ; ; It was near the check boxes, so claim the event ; lda #0 sta [dp.event] ; change the event to a null event ; ; Find out which check box it was in (if any) ; ; check horizontal position lda whichPt+2 ; get X of point sec sbc checkRect+oh1 ; rect.left cmp #5 blt toPortExit ; to right of check boxes cmp #30 bge toPortExit ; to left, so try in item ; Check vertical (and find which item it was in) pha ; room for remainder pha ; room for quotient lda whichPt ; get point's Y sec sbc checkRect+ov1 ; get offset inside rect pha PushWord #11 ; member height _UDivide pha ; room for result PushLong volListH _GetCtlValue ; get first displayed item pla ; get first displayed clc adc 1,s ; plus offset from top of list dea ; minus 1 to make 0-based sta itemNum pla ; pop quotient pla ; get remainder sta vOffset ; offset from top of member cmp #2 blt toPortExit ; above box cmp #11 blt InCheckBox toPortExit brl PortExit InCheckBox *** added 25-Mar-93 DAL -- range-check the itemNum against the total number *** of items, so we don't track a "phantom" checkbox below the last item, *** if fewer than 4 items are being displayed pha pha ;space for GetCtlTitle pushlong volListH ;list control _GetCtlTitle pla ;ignore low word (# items visible at once) pla ;high word = total items in list * itemNum is zero-based, and total items is an absolute number * To proceed, itemNum must be strictly less than total items, * which is toay total items must be strictly greater than itemNum. * So we should bail if total items is less than or equal to itemNum. cmp itemNum ;itemNum (0-based) must be < total items bcc toPortExit ;less than --> outta here beq toPortExit ;equal --> outta here @continue *** end 25-Mar-93 ; ; Here, click was in a checkbox. vOffset holds the offset in pixels from ; top of the item. itemNum holds the 0-based member number. Create a ; checkbox and track it, changing the member's record when done. ; ; Set up a pointer to the member's record and lock it lda volMembers+2 sta dp.memPtr+2 pha ; push for HLock lda volMembers sta dp.memPtr pha ; push for HLock _HLock ldy #2 lda [dp.memPtr],y tax lda [dp.memPtr] sta dp.memPtr stx dp.memPtr+2 pha ; room for result pha PushWord itemNum PushWord #6 ; member record size _Multiply clc pla adc dp.memPtr sta dp.memPtr pla adc dp.memPtr+2 sta dp.memPtr+2 ; Fix up bounding rectangle and initial value in template lda whichPt ; get mousedown vertical sec sbc vOffset ; find top of item ina ; leave one pixel white space sta checkBoxTempl+6 ; fix up top clc adc #11 sta checkBoxTempl+10 ; fix up bottom ldy #omemFlag lda [dp.memPtr],y ; get checked flag in high bit and #$8000 ; only checked bit asl a rol a ; now have 0/1 in A sta checkBoxTempl+$1E ; fix up initial value ; Create the check box pha ; room for control handle pha PushLong volWindow ; window pointer PushWord #singlePtr PushLong #checkBoxTempl _NewControl2 PullLong checkBoxH ; get control handle back ; Track the control pha ; room for result ldy #owhere+2 lda [dp.event],y pha ; push event.where.x dey dey lda [dp.event],y pha ; push event.where.y lda #0 pha ; push NIL actionProc pha PushLong checkBoxH _TrackControl pla beq NoChange ; no part, no change ; They changed checkbox, so change value in control and in member record pha ; room for control's value PushLong checkBoxH _GetCtlValue pla eor #1 ; flip between on and off pha ; push new value ; Keep track of how many boxes are checked so I can hide/show the ; Save My Name/Save My Name and Password buttons. beq @off ; branch if now off ; Box just turned on. Make sure buttons are visible lda checkCount ; were any checked before? bne @noshow ; yes, so buttons already visible jsr ShowVolButtons @noshow inc checkCount ; one more box checked bra SetCheckVal ; Box just turned off. If all off, hide buttons. @off dec checkCount ; one less box checked bne @nohide ; more still on, don't hide buttons jsr HideVolButtons @nohide ; Update the checkbox's state on screen (new value is still on stack) SetCheckVal PushLong checkBoxH _SetCtlValue lda #1 sta prepChange ; need to update AppleShare.Prep ldy #omemFlag lda [dp.memPtr],y eor #$8000 ; invert checked flag sta [dp.memPtr],y NoChange ; Terminate the check box PushLong checkBoxH _DisposeControl ; ; Unlock the member records ; PushLong volMembers _HUnlock ; ; Restore the port and exit ; PortExit _SetPort ; ; Clean up stack and return ; exit lda dp.rtl sta dp.rtl+4 lda dp.rtl+1 sta dp.rtl+5 pla ; pull locals off pla pla pla pld plb pla ; remove space for task record pointer pla rtl endp ;====================================================================== ; ; ReadPrepFile ; ; This routine creates a handle to hold a copy of the AppleShare.Prep ; data. It then reads the contents of the file into the handle. If ; there is an error (out of memory, file read error), prepHandle will ; be set to zero and the handle deallocated. If the file does not ; exist, I will create a handle with a zero word in it. ; ;====================================================================== ReadPrepFile procname import OpenGS:OpenGSRec import GetEOFGS:GetEOFGSRec import ReadGS:ReadGSRec import CloseGS:CloseGSRec import BuildPrepPath,prepHandle stz prepHandle ; assume none created stz prepHandle+2 jsr BuildPrepPath ; build pathname lda #1 ; want read-only access sta OpenGS.reqAccess _OpenGS OpenGS bcc opened cmp #$46 ; file not found? bne toexit ; other error, just exit lda #2 ; handle with just a word in it jsr NewHandle bcs toexit sty prepHandle stx prepHandle+2 tya ; ready for Deref jsr Deref phd ; create stack frame phx ; push high word of pointer pha ; low word tsc tcd lda #0 ; zero servers sta [1] pla plx pld toexit brl exit opened lda OpenGS.refnum sta GetEOFGS.refnum sta ReadGS.refnum sta CloseGS.refnum _GetEOFGS GetEOFGS bcs closeexit lda GetEOFGS.eof+2 ; bigger than 64K? bne closeexit ; can't deal with that! lda GetEOFGS.eof ; get file/handle size sta ReadGS.reqCount stz ReadGS.reqCount+2 jsr NewHandle ; allocate a moveable handle bcs closeexit sty prepHandle ; save handle stx prepHandle+2 phx phy _HLock ; lock the handle lda prepHandle ldx prepHandle+2 jsr Deref ; deref handle to get pointer sta ReadGS.buffer ; where data should be read stx ReadGS.buffer+2 _ReadGS ReadGS ; read the data php ; save error status lda prepHandle+2 pha lda prepHandle pha _HUnlock ; always unlock handle plp ; get error from read bcc closeexit ; no error, keep handle lda prepHandle+2 pha lda prepHandle pha _DisposeHandle ; read bad, throw away handle stz prepHandle stz prepHandle+2 closeexit _CloseGS CloseGS exit rts endp ;====================================================================== ; ; WritePrepFile ; ; This routine writes out the contents of prepHandle to the ; AppleShare.Prep file, creating it if needed. The handle is ; always disposed before leaving. ; ;====================================================================== WritePrepFile procname import CreateGS:CreateGSRec import OpenGS:OpenGSRec import SetMarkGS:SetMarkGSRec ; used for SetEOFGS import ReadGS:ReadGSRec ; used for WriteGS import CloseGS:CloseGSRec import BuildPrepPath,prepHandle,prepDirty lda prepHandle ora prepHandle+2 beql exit lda prepDirty beql dispose ; data didn't change, don't write jsr BuildPrepPath _CreateGS CreateGS lda #3 ; want read/write sta OpenGS.reqAccess _OpenGS OpenGS bcs dispose lda OpenGS.refnum sta SetMarkGS.refnum sta ReadGS.refnum sta CloseGS.refnum stz SetMarkGS.base ; EOF := displacement pha ; room for handle size pha lda prepHandle+2 pha lda prepHandle pha _GetHandleSize pla sta SetMarkGS.displacement sta ReadGS.reqCount pla sta SetMarkGS.displacement+2 sta ReadGS.reqCount+2 _SetEOFGS SetMarkGS bcs closeexit lda prepHandle+2 pha lda prepHandle pha _HLock ; lock the data before I write lda prepHandle ldx prepHandle+2 jsr Deref ; get pointer to data sta ReadGS.buffer stx ReadGS.buffer+2 _WriteGS ReadGS ; write data out lda prepHandle+2 pha lda prepHandle pha _HUnlock ; always unlock closeexit _CloseGS CloseGS ; always close file dispose lda prepHandle+2 pha lda prepHandle pha _DisposeHandle exit rts endp ;====================================================================== ; ; DelSrvrPrep ; ; This routine scans the contents of prepHandle and squeezes out any ; ServerInfoRec's that have the same server and zone name as the ; current server; the corresponding VolumeInfoRec's are also squeezed. ; ; A pointer to the server's name (a PString) is at subText. The zone ; name PString is at LookupZone. ; ;====================================================================== DelSrvrPrep procname import subText,LookupZone,prepHandle,prepDirty local record dp.locals count ds.w 1 ; count of servers recsize ds.w 1 ; size of server's records p ds.l 1 ; points to ServerInfoRec prepEnd ds.l 1 ; original end of prepHandle data prepStart ds.l 1 ; start of prepHandle data endr lda prepHandle ora prepHandle+2 beql done ; no data to check! lda prepHandle+2 pha lda prepHandle pha _HLock ; lock handle while during scan lda prepHandle ldx prepHandle+2 jsr Deref ; get pointer to data sta local.p sta local.prepStart stx local.p+2 stx local.prepStart+2 pha ; room for size pha lda prepHandle+2 pha lda prepHandle pha _GetHandleSize clc pla adc local.p sta local.prepEnd ; compute end of prep data pla adc local.p+2 sta local.prepEnd+2 lda [local.p] ; get count of servers sta local.count beql unlock ; no servers, we're done clc lda local.p ; point to first ServerInfoRec adc #2 ; two bytes into data sta local.p lda local.p+2 adc #0 sta local.p+2 ; ; For each server in the list, check it against the current server. ; If it matches, squeeze it out of the data. ; loop ; Find size of this ServerInfoRec and its associated VolumeInfoRec's pha ; room for product pha ldy #ServerInfoRec.volCount lda [local.p],y ; get volume count pha pea VolumeInfoRec.sizeof _Multiply ; get size of VolumeInfoRec's clc pla ; volume(s) size adc #ServerInfoRec.sizeof sta local.recsize pla ; ignore high word of product ; Compare server names pha ; room for result pea 0 ; flags, reserved PushLong subText clc lda local.p ; get pointer to serverName adc # strings match bne next ; different, try next record ; Compare zone names pha pea 0 PushLong #LookupZone clc lda local.p adc # Esc translation pha ; use default beep routine pha PushWord #mwIBeam ; DoModalWindow flags _DoModalWindow pla ; get control ID plx ; ignore high word cmp #3 ; beyond one of the buttons? bge loop asl a tax jsr (hitTable,x) ; do appropriate handler bcc loop sta 5,s ; save cancel flag PushLong vpWindow _CloseWindow _SetPort ; restore old port pla ; get cancel flag lsr a ; put it in carry rts hitTable dc.w nullEvent dc.w ok dc.w cancel nullEvent clc ; keep going rts ok ; ; Fill password buffer with nulls, then get password. This will ; have the effect of leaving an 8 byte, null padded password at ; volPassword+1. ; ldx #8 @padloop stz volPassword,x dex dex bpl @padloop PushLong vpWindow PushLong #idVPLE PushLong #volPassword _GetLETextByID ; ; Now, try to mount the volume (if there is an error, put up a ; dialog and let them change the password). ; lda mountFlag ldx subText+8 ; point to volume name ldy subText+10 jsr MountAVol bcc @done ; it worked, exit dialog ; ; Put up an error message and let them try again ; pha ; save error code jsr ShowPFIErr ; tell user what went wrong pla ; get error code back cmp #FIAccessErr ; access denied (bad password)? bne cancel ; no, so quit trying ; ; Error was bad volume password. Select it and let them try again. ; lda #idVPLE jsr SelectLEByID clc ; don't exit dialog rts @done lda #0 ; they pressed OK sec ; exit dialog rts cancel lda #1 ; they pressed cancel sec ; exit dialog rts endp ;====================================================================== ; ; TestDoubleClick ; ; This is a common routine used by the event hooks to test for double ; clicks. It keeps track of the last mousedown and compares the ; current mousedown with the previous one. If the time between clicks ; is greater than GetDblTime() or the distance between clicks is more ; than 5 pixels, then it is not considered a double click. The ; distance formula I use is the sum of the absolute values of the ; differences in X and Y position (i.e. |x1-x2| + |y1-y2|). ; ; The caller must set up a direct page and place a pointer to the event ; record at location 1 and provide 4 bytes of temporary space at ; location 5. ; ; On exit, the global dblClick will be modified. It will be non-zero ; if the last click was a double click, or zero otherwise. ; ;====================================================================== TestDoubleClick procname import dblClick,lastWhere,lastWhen event equ 1 ; pointer on caller's direct page work equ 5 ; 4 bytes space on caller's dp lda [event] ; get event code cmp #mouseDownEvt bne ignore ; not mousedown, so ignore it ; ; Now see if the last mousedown time and place are close enough ; to the current one to be considered a double-click. The test is: ; event.when-lastWhen < GetDblTime ; AND ; abs(event.where.v-lastWhere.v)+abs(event.where.h-lastWhere.h) < 5 ; stz dblClick ; assume it isn't a double-click ; ; First, compute the difference in times as deltaT ; ldy #owhen lda [event],y ; get event's when sec sbc lastWhen ; compute delta time sta work ; save low word of time difference iny iny lda [event],y sbc lastWhen+2 ; get high word of difference sta work+2 ; ; If GetDblTime() < deltaT then it's not a double-click ; pha pha ; space for result _GetDblTime pla cmp work ; compare low word pla sbc work+2 ; continue compare to high word blt update ; not a double-click ; ; Now compute the difference in mouse position in pixels ; ldy #owhere lda [event],y ; get V from event sec sbc lastWhere ; get difference in V bcs @absV ; branch in difference is positive eor #$FFFF ; get one's complement ina ; now have abs(delta V) @absV sta work iny iny ; offset to H in event lda [event],y sec sbc lastWhere+2 bcs @absH eor #$FFFF ina @absH clc adc work ; get sum of deltas bcs update ; carry? sum is way too large cmp #6 ; 6 or more pixels off? bge update ; yes, so not a double-click ; ; Finally, we have a double-click. Set the flag and fall into updating ; the last mousedown info. ; inc dblClick ; yes, it was a double-click ; ; Here, copy the when and where from the event record to our globals ; update ldy #owhen lda [event],y sta lastWhen iny iny lda [event],y sta lastWhen+2 iny iny ; offset to where.v lda [event],y sta lastWhere iny iny ; offset to where.h lda [event],y sta lastWhere+2 ignore rts endp ;====================================================================== ; ; NewWindByID ; ; This routine creates and shows a new window by simply supplying a ; resource ID of an rWindParam1 resource. The window is created, ; the port is set to it, the window is moved right 160 pixels if we're ; in 640 mode (so the resource's rectangle should be set up for 320 ; mode), and finally the window is shown. It assumes that the high ; word of the rWindParam1 resource ID is zero. ; ; On entry: ; A = low word of rWindParam1 resource ID ; ; On exit: ; A = high word of window pointer ; X = low word of window pointer ; ; Uses: ; windOrigin a Point in the globals ; ;====================================================================== NewWindByID procname import windOrigin ; ; Create the window ; pha ; space for result pha ldx #0 ; value for using defaults phx ; don't replace title phx phx ; don't replace refcon phx phx ; don't replace content draw phx phx ; don't replace defproc phx PushWord #refIsResource pea 0 ; high word of resource ID is zero pha ; push low word of resource ID PushWord #rWindParam1 _NewWindow2 ; ; Set the current port to the window I just created ; lda 3,s pha ; make a copy of window pointer lda 3,s pha _SetPort ; set port to new window ; ; Here, I check to see if we're in 640 mode. If so, I ; want to move the window right by 160 pixels. ; pha ; room for result _GetMasterSCB pla and #$0080 ; are we in 640 mode? beq was320 ; no, so leave window alone stz windOrigin stz windOrigin+2 PushLong #windOrigin _LocalToGlobal ; find out where window is now lda 3,s ; get high word of window pointer tax lda 1,s ; get low word of window pointer tay lda windOrigin+2 clc adc #160 ; move right by 160 pixels pha lda windOrigin pha ; use old Y phx ; push window pointer phy _MoveWindow was320 ; ; Make the window visible ; lda 3,s pha ; make a copy of window pointer lda 3,s pha _ShowWindow ; ; Clean up stack and exit ; plx ; get window pointer in A,X pla rts endp ;====================================================================== ; ; FindString ; ; This is a special-purpose routine for comparing a given string with ; a list of strings in ReplyBuf. It is used to find AFP versions and ; UAM's that are returned in an SPGetStatus call. ; ; On entry, ; Long pointer to target string on stack below RTS ; A = offset in ReplyBuf of count of strings (in 68000 order) ; ; On exit, ; target string pointer removed from stack ; Z = 1 iff target string was found in list ; ;====================================================================== FindString procname import ReplyBuf dp record 1 savedD ds.w 1 str ds.l 1 ; pointer into ReplyBuf rts ds.w 1 target ds.l 1 ; pointer to target string endr ; ; Create stack frame and build pointer to first string ; xba ; put offset in 65xxx order pha ; room for high word of dp.str tax ; save ReplyBuf offset in X sec ; add 1 to skip over string count adc # Esc translation pha ; use default beep routine pha PushWord #mwIBeam ; DoModalWindow flags _DoModalWindow pla ; get control ID plx ; ignore high word of ID cmp #idSetPassOK+1 ; beyond what I care about? bge loop ; yes, so keep doing dialog asl a tax jsr (hitTable,x) ; do the right thing bcc loop ; ; Whatever it was, we're done. ; sta 5,s ; save cancel flag PushLong setPassWind _CloseWindow _SetPort ; restore caller's port pla ; get cancel flag back lsr a ; set carry if cancel rts hitTable dc.w nullEvent dc.w Cancel dc.w OK nullEvent clc rts Cancel lda #0 ; indicate Cancel pressed sec ; end the dialog rts OK ; ; If we're not yet confirming the new password, then hide the old password ; line edit, show the old password static text, get the text out of the new ; password into serverPassword, set the new password to empty, and continue ; the dialog. ; lda local.confirm bne PassCompare ; go confirm/compare password lda #idSetPassOld jsr HideByID lda #idSPOldStat jsr ShowByID PushLong setPassWind PushLong #idSetPassNew PushLong #serverPassword _GetLETextByID PushLong setPassWind PushLong #idSetPassNew PushLong #emptyStr _SetLETextByID inc local.confirm ; now need to confirm new password lda #rConfirmPass ; tell user we need to confirm jsr AlertByID clc ; not done with dialog yet rts ; ; If we're currently confirming the new password, get it's text into ; volumePassword (as a temporary place) and compare it to serverPassword ; (where the first copy was placed). If they don't match, put up an alert ; and let them try again. If they do match, try to do the change password. ; PassCompare ldx #8 padloop stz volPassword,x ; pad password with nulls dex dex bpl padloop PushLong setPassWind PushLong #idSetPassNew PushLong #volPassword _GetLETextByID ; ; See if both copies of new password match ; sep #$30 ; compare is easier in 8 bits longa off longi off ldx volPassword cmploop lda volPassword,x cmp serverPassword,x bne NoMatch dex bpl cmploop rep #$30 ; back to 16 bits longa on longi on brl TryChange ; ; Passwords didn't match. Tell the user and let them try again. ; NoMatch rep #$30 longa on longi on lda #rPassNoMatch jsr AlertByID TryAgain PushLong setPassWind PushLong #idSetPassOld PushLong #emptyStr _SetLETextByID ; empty the old password field PushLong setPassWind PushLong #idSetPassNew PushLong #emptyStr _SetLETextByID ; empty the new password field lda #idSPOldStat jsr HideByID lda #idSetPassOld jsr ShowByID lda #idSetPassOld jsr SelectLEByID ; just to make it the target stz local.confirm ; not confirming any more clc ; not done yet rts ;---------- ; ; Try to log on and change the password ; ;---------- TryChange ; ; Get old password ; ldx #8 @pad stz serverPassword,x ; pad password with nulls dex dex bpl @pad PushLong setPassWind PushLong #idSetPassOld PushLong #serverPassword _GetLETextByID ; ; If we're already connected, then userName is already set and ; we don't need to log on. ; lda alreadyConn ; already connected? bne ChangeIt ; yes, so just change it ; ; Get user name from the Connect As window ; PushLong connWindow PushLong #rNameLE PushLong #userName _GetLETextByID jsr TryLogin ; have to log on first bcc ChangeIt ; login worked, change password ; ; Login didn't work. Show them an error and let them try again ; cmp #$0A15 ; bad password bne @PFI lda #rOldPassBad ; old password bad jsr AlertByID brl TryAgain @PFI jsr ShowPFIErr brl TryAgain ; ; Now build up a change password packet and try it out. If it fails, we ; log off (if we weren't logged on before) and let them try again. ; ChangeIt lda FILogin.sessRefNum sta SPCommand.sessRefNum sta FILogout.sessRefNum lda #FPChangePass sta cmdBuf ldx #2 ; offset for UAM string lda selectedUAM cmp #rClearText beq @clear PushLong #ScrambledUAM jsr PutString bra AddName @clear PushLong #ClearTextUAM jsr PutString AddName txa lsr a bcc @nopad stz cmdBuf,x inx @nopad PushLong #userName jsr PutString txa lsr a bcc @nopad2 stz cmdBuf,x inx @nopad2 lda selectedUAM cmp #rClearText beq Clear ; ; Point to where passwords go ; txa clc adc # leave null password sep #$30 longa off longi off ldx #1 ; start with first character loop lda serverInfo.srvrPassword-1,x eor cryptKey-1,x sta serverPassword,x beq null stx serverPassword ; save last non-null character offset null inx cpx #9 blt loop rep #$30 longa on longi on exit rts endp ;====================================================================== ; ; CopyVolPassword ; ; Copy the volume password from the VolumeInfoRec to our global. Note ; that we also set the length by finding the last non-null character. ; If the Save My Name Only flag is set, set the password to empty. ; ;====================================================================== CopyVolPassword procname import serverInfo:ServerInfoRec import volInfo:VolumeInfoRec import volPassword,cryptKey stz volPassword ; assume password length is zero bit serverInfo.serverFlags bmi exit ; name only => leave null password sep #$30 longa off longi off ldx #1 ; start with first character loop lda volInfo.volPassword-1,x eor cryptKey-1,x sta volPassword,x beq null stx volPassword ; save last non-null character offset null inx cpx #9 blt loop rep #$30 longa on longi on exit rts endp ;====================================================================== ; ; FindTheServer ; ; Given a ServerInfoRec, build up an NBP entity for use by LookupName ; and then do a lookup to find the server. ; ;====================================================================== FindTheServer procname import serverInfo:ServerInfoRec import lookup:LookupNameRec import LookupType,LookupZone,entity import lbuf,serverAddress sep #$30 longa off longi off ; ; Copy server name ; ldx #0 ; offset to destination loop1 lda serverInfo.serverName,x sta entity,x inx cpx serverInfo.serverName blt loop1 beq loop1 ; ; Copy type ; ldy #0 ; offset to source loop2 lda LookupType,y sta entity,x inx iny cpy LookupType blt loop2 beq loop2 ; ; Copy zone ; ldy #0 loop3 lda serverInfo.serverZone,y sta LookupZone,y ; copy for use by TryLogin (7-Jan-92 MSD) sta entity,x inx iny cpy serverInfo.serverZone blt loop3 beq loop3 rep #$30 longa on longi on lookloop ATCall lookup ; try to find server's address bcc found ; found a match! lda lookup.result cmp #NBPBusy beq lookloop ; NBP was busy, keep trying bra exit ; return the error found lda lbuf sta serverAddress lda lbuf+2 sta serverAddress+2 lda #0 ; no error exit cmp #1 ; set carry if non-zero result rts endp tStarted dc.w 0 ; I haven't started them yet oldCtlParamPtr dc.l 0 ; saved text substitution pointer ; ; Note: Tool versions listed here are those present in 6.0 ; startStopRec record dc.w 0 ; flags, always zero dc.w $0080 ; use 640 mode dc.w 0 ; resource file ID saved here dc.l 0 ; zero page handle saved here dc.w (end-start)/4 ; number of tool sets in table start dc.w $0003,$0302 ; misc. tools dc.w $0004,$0307 ; QuickDraw II dc.w $0006,$0301 ; Event manager dc.w $000B,$0300 ; int math dc.w $000E,$0303 ; window manager dc.w $000F,$0303 ; menu manager dc.w $0010,$0303 ; control manager dc.w $0012,$0304 ; QuickDraw II Aux dc.w $0014,$0303 ; Line Edit dc.w $0016,$0301 ; scrap manager dc.w $001C,$0303 ; List Manager (for _CompareStrings) end endr ;====================================================================== ; ; StartTools ; ; This routine starts up the tools used by the "Connect as..." and ; volume password dialogs. It can be called as many times as you want ; since it checks a flag to see if it has started the tools yet. ; ;====================================================================== StartTools procname import tStarted,startStopRec,oldCtlParamPtr import subText clc ; assume no error lda tStarted bne done pha ; room for result pha pha ; room for Memory Manager ID _MMStartup ; get memory manager ID PushWord #refIsPointer+noResourceMgr PushLong #startStopRec _StartUpTools ; Ignore result of StartUpTools. Leave the four bytes on the stack ; for GetCtlParamPtr to return its result. _GetCtlParamPtr ; get old substitution array pla sta oldCtlParamPtr pla sta oldCtlParamPtr+2 PushLong #subText _SetCtlParamPtr ; ; Hide the menu bar so we don't have to stare at an empty one ; _HideMenuBar ; ; Make the cursor an arrow instead of a watch. ; _InitCursor inc tStarted ; set started flag done rts endp ;====================================================================== ; ; StopTools ; ; This routine is called to shutdown any tools I started up with ; StartTools above. It also checks tStarted so it can always be ; called. ; ;====================================================================== StopTools procname import tStarted,startStopRec,oldCtlParamPtr,myID PushWord myID _DisposeAll ; make sure all memory is disposed of lda tStarted beq done PushLong oldCtlParamPtr _SetCtlParamPtr ; restore sub. array PushWord #refIsPointer+leaveScreenClean+noResourceMgr PushLong #startStopRec _ShutDownTools dec tStarted done rts endp ;---------------------------------------------------------------------- ; ; Private data areas ; ;---------------------------------------------------------------------- lbufsize equ 110 ; more than enough for 1 entity lbuf ds.b lbufsize entity ds.b 99 ; room for entity name to find lookup record dc.b $00,$10 ; sync LookupName dc.w 0 ; result dc.l 0 ; completion routine dc.l entity ; entity name dc.b 1,12 ; retry 12 times, every 1/4 second dc.w 0 ; reserved dc.w lbufsize ; buffer length dc.l lbuf ; buffer pointer dc.b 1 ; max of 1 match dc.b 0 ; actual matches endr end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/DES.aii b/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/DES.aii new file mode 100644 index 0000000..2f11b30 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/DES.aii @@ -0,0 +1 @@ +************************************************** * * * des - data encryption standard. * * * written by 07-03-86 * david su * * modified : 01-27-87 06:00 (tde) * 5-29-87: Converted source to MacToGS (rbh) * * (c) 1987 paramis corporation * (c) 1987 Apple Computer Inc * all rights reserved * * Rick Hoiberg 5/29/87 * * modified : 08-23-88 (srk) * converted to MPW IIGS (MAX) assembler * * 10-Aug-91 MSD: Changed to make it easier to call from full native * mode on a 65816. Improved documentation of calling convention. * The calling convention is described below: * * On entry, * Called by JSL * Full native mode (16 bit A,X,Y) * X = low word of parameter block pointer * Y = high word of parameter block pointer * * Parameter list: * $00 Pointer to 8 byte password (key) * $04 Pointer to 8 byte data to encrypt * $08 Pointer to 8 byte result * * The routine creates room on the stack for its own zero * page use. * ********************************************************** MACHINE M65816 EXPORT DES DES PROC DirectPage record 1 savedD ds.w 1 Zp0 ds.l 1 Zp1 ds.l 1 savedB ds.b 1 endr * * create a stack frame * phb ;save current data bank phk plb ;data bank = program bank pha ; make room for locals pha pha pha phd tsc tcd with DirectPage * * save parameter list location * stx Zp0 ;save parameter list pointer sty Zp0+2 * * save key in our work area * lda (Zp0) ;save key sta Zp1 ldy #$02 lda (Zp0),y sta Zp1+2 ; ldy #$06 ;move all eight bytes of key des1 lda (Zp1),y sta key,y dey dey bpl des1 * * save password in our work area * ldy #$04 lda (Zp0),y sta Zp1 iny iny lda (Zp0),y sta Zp1+2 ; ldy #$06 ;move all eight bytes of key des2 lda (Zp1),y sta random,y dey dey bpl des2 ; ; ; * * initialize the count * ldx #0 des4 ; stz des_count,x inx inx cpx #32 bne des4 ; ; save our zero page values here - for some reason they are getting trashed ; when we do the encoding routines..... ; lda Zp0 sta saveZp0 lda Zp0+2 sta saveZp0+2 ; sep #$30 LONGA OFF LONGI OFF ; jsr keysched jsr encode * * save result * Rep #$30 LONGA ON LONGI ON ; ; restore Zp0 here - why is it getting trashed in our encoding routines above? ; lda saveZp0 sta Zp0 lda saveZp0+2 sta Zp0+2 ; ldy #$08 lda (Zp0),y sta Zp1 iny iny lda (Zp0),y sta Zp1+2 ; ldy #$06 ;move all eight bytes of key des3 lda des_work1,y sta (Zp1),y dey dey bpl des3 * * Restore stack and exit * pld pla ; remove locals pla pla pla plb ;restore data bank rtl ; ; ************************************************** * * keysched : key schedule * * this module takes 64 bits key and generates * the sixteen 48-bit keys k(1),k(2),...,k(16) * * entry : none * * exit : none * * ************************************************** keysched ; sep #$30 LONGA OFF LONGI OFF ldx #0 key1 ; stx des_x ; lda pc1tbl,x sta remainder lda #8 sta des_count key2 ; dec des_count sec lda remainder sbc #08 sta remainder beq key22 ;= 0 ? bcs key2 ;> 0 ? ; key22 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne key24 ;x = 0 ? ldx #8 ;set to 8, if yes key24 ; dex lda des_msk,x ldy des_count clc and key,y beq key3 sec key3 ; ldx #$07 key4 ; rol des_work1,x php dex bmi key5 plp bra key4 ; key5 ; plp ldx des_x inx cpx #56 bne key1 ; * * divide pc1 result into c0/d0 * ldx #0 key6 ; lda des_work2,x sta des_cd,x inx cpx #7 bne key6 ; * * rotate c and d left by rotate(n) times * key9 ; ldx #0 keya ; stx des_x ;save # of times ; ldy #0 keyb ; clc lda des_cd ;save left most bit(cn) rol a php ; lda des_msk+3 ;save left most bit(dn) clc and des_cd+3 beq keyb0 sec keyb0 ; ldx #6 keyc ; rol des_cd,x dex bpl keyc ; lda des_cd+3 and #%11101111 ;clear right most bit(cn) sta des_cd+3 ; lda #0 plp ;restore left most bit(cn) ror a ;move left most bit(cn) ror a ;to right most bit(cn) ror a ror a ora des_cd+3 sta des_cd+3 ; ldx des_x iny lda rotat_left,x sta des_temp cpy des_temp bne keyb ; * * permutation 2 * ldy #0 keye ; sty des_y ; lda pc2tbl,y sta remainder lda #7 ;7 bytes toal for cn+dn sta des_count keyf ; dec des_count sec lda remainder sbc #08 sta remainder beq keyf0 ;= 0 ? bcs keyf ;> 0 ? ; keyf0 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne keyf2 ;x = 0 ? ldx #8 ;set to 8, if yes keyf2 ; dex lda des_msk,x ldy des_count clc and des_cd,y beq key0 sec key0 ; ldx #7 key01 ; rol des_work1,x php dex bmi key02 plp bra key01 ; key02 ; plp ldy des_y iny cpy #48 bne keye ; * * move result of perm 2 to k(n) * ldx #0 key03 ; lda des_work3,x ldy des_k sta k1,y inc des_k inx cpx #6 bne key03 ; ldx des_x inx cpx #16 beq key04 jmp keya ; key04 rts ; ; ************************************************** * * encode - encryption module * * entry : random1,...,random8 * * exit : des_work1,...,des_work8 * * ************************************************** encode ; sep #$30 LONGA OFF LONGI OFF stZ des_y ;init des_y ; ldx #0 ecd1 ; stx des_x ; lda iniptbl,x sta remainder lda #8 sta des_count ecd2 ; dec des_count sec lda remainder sbc #08 sta remainder beq ecd22 ;= 0 ? bcs ecd2 ;> 0 ? ; ecd22 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne ecd24 ;x = 0 ? ldx #8 ;set x to 8, if yes ecd24 ; dex lda des_msk,x ldy des_count clc and random,y beq ecd3 sec ecd3 ; ldx #7 ecd4 ; rol des_work1,x php dex bmi ecd5 plp bra ecd4 ; ecd5 ; plp ldx des_x inx cpx #64 bne ecd1 ; * * move result of init perm to left/right block * move 8 times - first 4 bytes = des_l1 * - second 4 bytes = des_r1 * ldx #0 ecd6 ; lda des_work1,x sta des_l1,x inx cpx #08 bne ecd6 ; * * perform rn = ln eor f(rn,kn) * transform right 32 bits into 48 bits * stz key_x ;initiaiZe k(n) pointer ldx #0 ecd60 ; stx des_x1 ;save counter ; ldx #0 ecd65 ; lda des_r1,x ;save rn origin to temp sta des_temp1,x inx cpx #4 bne ecd65 ; ldx #0 ecd7 ; stx des_x ; ; lda etbl,x ;perform e function sta remainder lda #4 ;4 bytes only sta des_count ecd8 ; dec des_count sec lda remainder sbc #08 sta remainder beq ecd82 ;= 0 ? bcs ecd8 ;> 0 ? ; ecd82 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne ecd84 ;x = 0 ? ldx #8 ;set x to 8, if yes ecd84 ; dex lda des_msk,x ldy des_count clc and des_r1,y beq ecd9 sec ecd9 ; ldx #5 ecda ; rol des_work3,x php dex bmi ecdb0 plp bra ecda ; ecdb0 ; plp ldx des_x inx cpx #48 beq ecdb1 jmp ecd7 ; * * eor with k(48 bits) * ecdb1 ; ldy #0 ecdb ; ldx key_x ;get current k(n) pointer lda k1,x eor des_work3,y sta des_work3,y inx stx key_x ;save pointer for k(n) blocks iny cpy #6 bne ecdb ; * * transform 48 bits into 32 bits s(b1),...,s(bn) * ldx #0 ecdc ; jsr saddr stx des_temp lda des_work3 ;des_work will shift 6 times and #%10000100 ;bit 7/2 are row #'s bpl ecdd and #%01111111 ;strip out high bit ora #%00001000 ;save high bit to bit 3 ecdd ; lsr a lsr a tax ;save row # ; lda des_work3 and #%01111000 ;bit 6-3 are column #'s lsr a lsr a lsr a ;column # in acc now ; ecde ; cpx #0 beq ecdf clc adc #16 ;find s tbl pointer dex ;decrement row # bra ecde ; ecdf ; tay lda s1,y asl a ;shift result to high byte asl a asl a asl a ; * * move result to des_r1 * ldy #4 ecd10 ; rol a ldx #3 ecd11 ; rol des_temp2,x php dex bmi ecd110 plp bra ecd11 ; ecd110 ; plp dey bne ecd10 ; * * shift des_work left 6 more times * ldy #6 ecd12 ; ldx #5 ecd13 ; rol des_work3,x dex bpl ecd13 dey bne ecd12 ; * * 8 times already? * ldx des_temp inx cpx #8 beq ptbl0 jmp ecdc ;do next s tbl ; * * perform 32 bits permutation * use ptbl * ptbl0 ; ldx #0 ptbl1 ; stx des_x2 lda ptbl,x sta remainder lda #4 sta des_count ptbl2 ; dec des_count sec lda remainder sbc #08 sta remainder beq ptbl22 ;= 0 ? bcs ptbl2 ;> 0 ? ; ptbl22 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne ptbl24 ;x = 0 ? ldx #8 ;set to 8, if yes ptbl24 ; dex lda des_msk,x ldy des_count clc and des_temp2,y beq ptbl3 sec ptbl3 ; ldx #3 ptbl4 ; rol des_r1,x php dex bmi ptbl5 plp bra ptbl4 ; ptbl5 ; plp ldx des_x2 inx cpx #32 bne ptbl1 ; ; * * exclusive or with left block * perform function = ln eor f(rn,kn) * ldx #0 ecd112 ; lda des_r1,x ;load rn eor des_l1,x ;eor with ln sta des_r1,x ;save result to rn inx cpx #4 bne ecd112 ; ldx #0 ecd115 ; lda des_temp1,x ;move rn origin to ln sta des_l1,x inx cpx #4 bne ecd115 ; * * 16 times already? * ldx des_x1 inx cpx #16 beq ecd140 jmp ecd60 ;yes, go back ; * * perform inverse permutation * ecd140 ; jsr swap ;swap left and right halves ldx #0 ecd14 ; stx des_x ; lda invptbl,x sta remainder lda #8 sta des_count ecd15 ; dec des_count sec lda remainder sbc #08 sta remainder beq ecd152 ;= 0 ? bcs ecd15 ;> 0 ? ; ecd152 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne ecd154 ;x = 0 ? ldx #8 ;set x to 8, if yes ecd154 ; dex lda des_msk,x ldy des_count clc and des_l1,y beq ecd16 sec ecd16 ; ldx #7 ecd17 ; rol des_work1,x php dex bmi ecd18 plp bra ecd17 ; ecd18 ; plp ldx des_x inx cpx #64 bne ecd14 ; rts ;end of des modules ; swap ; ;switch des_l1 and des_r1 ldx #3 swap1 lda des_l1,x pha lda des_r1,x sta des_l1,x pla sta des_r1,x dex bpl swap1 rts ; * * increment s table pointer * * x = s# (0-7) * saddr clc lda #s1 adc tab64l,x sta ecdf+2 lda #>s1 adc tab64h,x sta ecdf+3 rts saveZp0 dc.b 0,0,0,0,0,0,0,0 ; tab64l dc.b 0,64,128,192,0,64,128,192 tab64h dc.b 0,0,0,0,1,1,1,1 ; ; ************************************************** * * des data area * ************************************************** ; ; iniptbl dc.b 7,15,23,31,39,47,55,63 dc.b 5,13,21,29,37,45,53,61 dc.b 3,11,19,27,35,43,51,59 dc.b 1,9,17,25,33,41,49,57 dc.b 8,16,24,32,40,48,56,64 dc.b 6,14,22,30,38,46,54,62 dc.b 4,12,20,28,36,44,52,60 dc.b 2,10,18,26,34,42,50,58 ; invptbl dc.b 25,57,17,49,9,41,1,33 dc.b 26,58,18,50,10,42,2,34 dc.b 27,59,19,51,11,43,3,35 dc.b 28,60,20,52,12,44,4,36 dc.b 29,61,21,53,13,45,5,37 dc.b 30,62,22,54,14,46,6,38 dc.b 31,63,23,55,15,47,7,39 dc.b 32,64,24,56,16,48,8,40 ; etbl dc.b 1,32,31,30,29,28 dc.b 29,28,27,26,25,24 dc.b 25,24,23,22,21,20 dc.b 21,20,19,18,17,16 dc.b 17,16,15,14,13,12 dc.b 13,12,11,10,9,8 dc.b 9,8,7,6,5,4 dc.b 5,4,3,2,1,32 ; pc1tbl dc.b 8,16,24,32,40,48,56 dc.b 64,7,15,23,31,39,47 dc.b 55,63,6,14,22,30,38 dc.b 46,54,62,5,13,21,29 dc.b 2,10,18,26,34,42,50 dc.b 58,3,11,19,27,35,43 dc.b 51,59,4,12,20,28,36 dc.b 44,52,60,37,45,53,61 ; ;convert from des algorithm ;base 56 pc2tbl dc.b 43,40,46,33,56,52,54,29 dc.b 42,51,36,47,34,38,45,53 dc.b 31,49,41,50,30,37,44,55 dc.b 16,5,26,20,10,2,27,17 dc.b 6,12,24,9,13,8,18,1 dc.b 23,4,11,15,7,21,28,25 ; ptbl dc.b 17,26,13,12,4,21,5,16 dc.b 32,18,10,7,28,15,2,23 dc.b 31,25,9,19,1,6,30,24 dc.b 14,20,3,27,11,22,29,8 ; s1 dc.b 14,4,13,1,2,15,11,8 dc.b 3,10,6,12,5,9,0,7 dc.b 0,15,7,4,14,2,13,1 dc.b 10,6,12,11,9,5,3,8 dc.b 4,1,14,8,13,6,2,11 dc.b 15,12,9,7,3,10,5,0 dc.b 15,12,8,2,4,9,1,7 dc.b 5,11,3,14,10,0,6,13 ; s2 dc.b 15,1,8,14,6,11,3,4 dc.b 9,7,2,13,12,0,5,10 dc.b 3,13,4,7,15,2,8,14 dc.b 12,0,1,10,6,9,11,5 dc.b 0,14,7,11,10,4,13,1 dc.b 5,8,12,6,9,3,2,15 dc.b 13,8,10,1,3,15,4,2 dc.b 11,6,7,12,0,5,14,9 ; s3 dc.b 10,0,9,14,6,3,15,5 dc.b 1,13,12,7,11,4,2,8 dc.b 13,7,0,9,3,4,6,10 dc.b 2,8,5,14,12,11,15,1 dc.b 13,6,4,9,8,15,3,0 dc.b 11,1,2,12,5,10,14,7 dc.b 1,10,13,0,6,9,8,7 dc.b 4,15,14,3,11,5,2,12 ; s4 dc.b 7,13,14,3,0,6,9,10 dc.b 1,2,8,5,11,12,4,15 dc.b 13,8,11,5,6,15,0,3 dc.b 4,7,2,12,1,10,14,9 dc.b 10,6,9,0,12,11,7,13 dc.b 15,1,3,14,5,2,8,4 dc.b 3,15,0,6,10,1,13,8 dc.b 9,4,5,11,12,7,2,14 ; s5 dc.b 2,12,4,1,7,10,11,6 dc.b 8,5,3,15,13,0,14,9 dc.b 14,11,2,12,4,7,13,1 dc.b 5,0,15,10,3,9,8,6 dc.b 4,2,1,11,10,13,7,8 dc.b 15,9,12,5,6,3,0,14 dc.b 11,8,12,7,1,14,2,13 dc.b 6,15,0,9,10,4,5,3 ; s6 dc.b 12,1,10,15,9,2,6,8 dc.b 0,13,3,4,14,7,5,11 dc.b 10,15,4,2,7,12,9,5 dc.b 6,1,13,14,0,11,3,8 dc.b 9,14,15,5,2,8,12,3 dc.b 7,0,4,10,1,13,11,6 dc.b 4,3,2,12,9,5,15,10 dc.b 11,14,1,7,6,0,8,13 ; s7 dc.b 4,11,2,14,15,0,8,13 dc.b 3,12,9,7,5,10,6,1 dc.b 13,0,11,7,4,9,1,10 dc.b 14,3,5,12,2,15,8,6 dc.b 1,4,11,13,12,3,7,14 dc.b 10,15,6,8,0,5,9,2 dc.b 6,11,13,8,1,4,10,7 dc.b 9,5,0,15,14,2,3,12 ; s8 dc.b 13,2,8,4,6,15,11,1 dc.b 10,9,3,14,5,0,12,7 dc.b 1,15,13,8,10,3,7,4 dc.b 12,5,6,11,0,14,9,2 dc.b 7,11,4,1,9,12,14,2 dc.b 0,6,10,13,15,3,5,8 dc.b 2,1,14,7,4,10,8,13 dc.b 15,12,9,0,3,5,6,11 ; des_msk dc.b 1 dc.b 2 dc.b 4 dc.b 8 dc.b 16 dc.b 32 dc.b 64 dc.b 128 ; key ds.b 8 ; random ds.b 8 ; des_work1 dc.b 0 des_work2 dc.b 0 des_work3 dc.b 0 des_work4 dc.b 0 des_work5 dc.b 0 des_work6 dc.b 0 des_work7 dc.b 0 des_work8 dc.b 0 ; des_count dc.b 0 remainder dc.b 0 key_x dc.b 0 des_x dc.b 0 des_x1 dc.b 0 des_x2 dc.b 0 des_y dc.b 0 des_k dc.b 0 des_temp dc.b 0 des_temp1 ds.b 4 des_temp2 ds.b 4 ; des_l1 ds.b 4 des_r1 ds.b 4 ; des_cd ds.b 7 ; k1 ds.b 6 k2 ds.b 6 k3 ds.b 6 k4 ds.b 6 k5 ds.b 6 k6 ds.b 6 k7 ds.b 6 k8 ds.b 6 k9 ds.b 6 k10 ds.b 6 k11 ds.b 6 k12 ds.b 6 k13 ds.b 6 k14 ds.b 6 k15 ds.b 6 k16 ds.b 6 ; rotat_left dc.b 1,1,2,2,2,2,2,2 dc.b 1,2,2,2,2,2,2,1 ; ; ; ; endwith ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/MakeFile b/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/MakeFile new file mode 100644 index 0000000..eb3f262 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/MakeFile @@ -0,0 +1 @@ +###################################################################### # # This MakeFile contains the build rules for the new and improved # Assembly AppleShare CDEV. # # # by Mark Day # # Modification History: # 23-Jul-91 MSD First try # 10-Sep-91 MSD Added a new source file: AutoLogon.aii # 20-Sep-91 MSD Added new shell variables to control listings # and debugging code/symbols. # ###################################################################### ###################################################################### # # You can set the values of the following variables to # control the generation of listings and whether symbols # will be imbedded in the code. You can either set a shell # variable and export it, or define them on the command line. # # ASCDEVListFlag "-l" to generate listings, empty otherwise # ASCDEVSymFlag 1 to generate debugging symbols and code # ###################################################################### ###################################################################### # # The AppleShare file itself # ###################################################################### AppleShare Ä AppleShare.code AppleShare.r RezIIGS AppleShare.r -o AppleShare -t "C7 " -c "pdos" ###################################################################### # # The AppleShare code resource # ###################################################################### AppleShare.code Ä AppleShare.aii.obj AutoLogon.aii.obj globals.aii.obj DES.aii.obj linkiigs -x -lseg:$1000 AppleShare ¶ AppleShare.aii.obj ¶ AutoLogon.aii.obj ¶ globals.aii.obj ¶ DES.aii.obj ¶ -o AppleShare.code ¶ {ASCDEVListFlag} > AppleShare.map ###################################################################### # # The individual source/object files # ###################################################################### AppleShare.aii.obj Ä AppleShare.aii AppleShareEqu.aii AsmIIGS -d DebugSymbols=0{ASCDEVSymFlag} {ASCDEVListFlag} AppleShare.aii AutoLogon.aii.obj Ä AutoLogon.aii AppleShareEqu.aii AsmIIGS -d DebugSymbols=0{ASCDEVSymFlag} {ASCDEVListFlag} AutoLogon.aii globals.aii.obj Ä globals.aii AppleShareEqu.aii AsmIIGS -d DebugSymbols=0{ASCDEVSymFlag} {ASCDEVListFlag} globals.aii DES.aii.obj Ä DES.aii AsmIIGS -d DebugSymbols=0{ASCDEVSymFlag} {ASCDEVListFlag} DES.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/globals.aii b/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/globals.aii new file mode 100644 index 0000000..2cfb0b6 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/AppleShareCDEV/globals.aii @@ -0,0 +1 @@ +;====================================================================== ; ; Globals.aii ; ; This file contains the global data used by the CDEV that must be ; imbedded in the CDEV itself. ; ; 26-Aug-91 MSD Changed the FILogin record to be an FILogin2 call. ; 23-Sep-91 MSD Added new variable, saveNameOnly. If the high bit is ; set, then SelectVols should default to Save My Name Only. ; 4-Mar-93 DAL Added AFPVersion21 and hasAFP21. ;====================================================================== print push,off include 'E16.Control' include 'AppleShareEqu.aii' print pop export (myID,myWindow,connWindow,setPassWind):data export (lastWhen,lastWhere,dblClick,lastZone):data export (zoneMembers,zoneListH):data export (GMZBuffer):data export (srvrListSize,srvrMembers,srvrListH):data export (taskRecord,userName,oldUserName):data export (windOrigin,volWindow,cryptKey):data export (volListH,volMembers):data export (norMask,dimMask,serverAddress):data export (whichWindow,whichControl):data export (whichPt,vOffset,itemNum):data export (checkBoxH,checkRect):data export (vpWindow,checkCount):data export (selectedUAM,serverPassword):data export (wereHosed,messageHandle):data myID dc.w 0 ; my Memory Manager user ID myWindow dc.l 0 ; will put my GrafPort here wereHosed dc.w 0 ; non-zero if fatal error messageHandle dc.l 0 ; handle to message center data lastWhen dc.l 0 ; time of last mousedown lastWhere dc.l 0 ; last mousedown point (v,h) dblClick dc.w 0 ; non-zero if we detected a double-click lastZone dc.w 0 ; item number of last zone selected zoneMembers dc.l 0 ; handle to member array of zone list zoneListH dc.l 0 ; handle to zone list control srvrMembers dc.l 0 ; handle to server list member array srvrListH dc.l 0 ; handle to server list control srvrListSize dc.w 0 ; number of items in server list volListH dc.l 0 ; handle to volume list control volMembers dc.l 0 ; handle to volume list member array ATGetInfo record export dc.b 0,2 dc.w 0 dc.l 0 ; completion routine return address dc.w 0 ; thisNet dc.b 0 ; aBridge dc.b 0 ; hardwareID dc.w 0 ; romVers dc.b 0 ; node number endr GZL2 record export dc.b 0,$3C ; sync GetZoneList2 dc.w 0 ; result dc.l 0 ; completion routine dc.w ZoneBufSize ; buffer size dc.l 0 ; buffer pointer dc.w 1 ; start index dc.b 4,2 ; retry count,interval dc.w 0 ; number of zones returned dc.l 0 ; zipWork (set to 0 on first call) dc.l 0 ; reserved endr GMZBuffer dcb.b 33,0 ; my zone will be returned here GetMyZone record export dc.b 0,$1A ; sync GetMyZone dc.w 0 ; result dc.l 0 ; completion routine dc.l GMZBuffer ; buffer pointer dc.b 2,4 ; retry interval,count dc.l 0 ; reserved endr LookupEntity record export export (LookupType,LookupZone):data pstr '=' ; any object LookupType pstr 'AFPServer' ; type server LookupZone dcb.b 34,0 ; room for zone name plus 1 extra ; byte to make it even length endr LookupName record export dc.b $80,$10 ; async LookupName dc.w 0 ; result dc.l 0 ; completion routine dc.l LookupEntity ; entity dc.b 4,$FF ; retry 255 seconds, every second dc.w 0 ; reserved dc.w SrvrBufSize ; buffer length dc.l 0 ; buffer pointer dc.b $FF ; max of 255 matches dc.b 0 ; actual matches endr NBPKill record export dc.b 0,$46 ; sync NBPKill dc.w 0 ; result dc.l LookupName ; param block pointer endr windOrigin dc.l 0 connWindow dc.l 0 ; Connect as... window pointer volWindow dc.l 0 ; volume list window pointer vpWindow dc.l 0 ; volume password dialog setPassWind dc.l 0 ; set password dialog taskRecord ds ExtTaskRec whichWindow dc.l 0 ; result from FindWindow whichControl dc.l 0 ; result from FindControl whichPt dc.l 0 ; point during event hook vOffset dc.w 0 ; offset from top of list in pixels itemNum dc.w 0 ; item number in list checkBoxH dc.l 0 ; handle to check box control checkRect dc.w 0,0,0,0 ; rectangle where check boxes live checkCount dc.w 0 ; number of checkboxes checked serverAddress dc.l 0 ; address of server we're connecting to selectedUAM dc.w 0 ; 0 = cancelled, 1 = Guest, ; 2 = ClearText, 3 = RandNumExchange userName ds.b 34 ; Str32 and terminating zero byte oldUserName ds.b 34 serverPassword ds.b 10 ; 8 bytes plus length and zero byte subText record export dc.l 0 ; point to "*0" (server name) dc.l userName ; for *1 dc.l 0 ; fill in with pointer to volume name endr cryptKey dc.b $5A,$2F,$42,$2B,$E2,$34,$BA,$5D dimMask DC.B $55,$AA,$55,$AA,$55,$AA,$55,$AA norMask DC.B $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF checkBoxTempl record export dc.w 8 ; pCount dc.l 100 ; control ID dc.w 0,0,0,0 ; bounding rectangle dc.l $82000000 ; procRef dc.w 0 ; flags, control visible dc.w fCtlProcRefNotPtr ; more flags, fCtlProcRefNotPtr dc.l 0 ; refcon dc.l emptyPStr ; title reference dc.w 0 ; initial value emptyPStr dc.b 0 ; empty Pascal string endr FSTInfo record export dc.w 2 ; only fstNum and fileSysID dc.w 0 ; fstNum dc.w 0 ; fileSysID endr GetUserPath record export dc.w 3 dc.w $D ; AppleShare FST ID dc.w 8 ; get user path command dc.l 0 ; prefix pointer returned here endr CreateGS record export import Path dc.w 4 dc.l Path dc.w $00C3 ; access: everything dc.w $00E2 ; file type = AppleTalk data file dc.l 0 ; auxtype endr OpenGS record export import Path dc.w 3 ; through requestAccess dc.w 0 ; refnum returned here dc.l Path dc.w 1 ; only want to read endr GetEOFGS record export dc.w 2 dc.w 0 ; refnum dc.l 0 ; EOF returned here endr SetMarkGS record export dc.w 3 dc.w 0 ; refnum dc.w 1 ; base = EOF - displacement dc.l 133 ; offset for ATInit name endr ReadGS record export dc.w 4 dc.w 0 ; refnum dc.l userName ; buffer dc.l 33 ; request count dc.l 0 ; actual transfer count returned here endr CloseGS record export dc.w 1 dc.w 0 ; refnum endr ;====================================================================== ; ; Data structures used to actually log on and mount volumes. ; ;====================================================================== cmdBufSize equ 512 replyBufSize equ 512 export (cmdBuf,replyBuf):data cmdBuf ds.b cmdBufSize replyBuf ds.b replyBufSize ; This is actually an FILogin2 parameter block... (26-Aug-91 MSD) FILogin record export dc.b 0,$38 ; sync FILogin2 dc.w 0 dc.l 0 ; put internet address here dc.w cmdBufSize dc.l cmdBuf dc.w replyBufSize dc.l replyBuf dc.b 0 ; sessRefNum returned here dc.l 0 ; use default attention routine dc.l 0 ; pointer to server name dc.l LookupZone ; pointer to zone name dc.w $0200 ; AFP version 2.0 or 2.1 (modified) endr FILoginCont record export dc.b 0,$2C dc.w 0 dc.b 0 ; put sessRefNum here dc.w 12 ; FPLoginCont command size dc.l cmdBuf dc.w replyBufSize dc.l replyBuf endr FIMountVol record export import (volPath,volPassword):data dc.b 0,$2E dc.w 0 dc.b 0 ; put sessRefNum here dc.b 0 ; put mount flag here dc.l volPath ; put pointer to volume pathname here dc.w 0 ; volID returned here dc.b 0 ; unitNum returned here dc.l volPassword+1 ; put pointer to volume password here endr FIAccess record export import volPath:data dc.b 0,$32 dc.w 0 dc.b 0 ; put flags here (0=get rights only) dc.l 0 ; access rights set or returned here dc.l volPath ; path pointer dc.l 0 ; creator pointer dc.l 0 ; group pointer endr FILogout record export dc.b 0,$2D dc.w 0 dc.b 0 ; put sessRefNum here dc.b 0 ; extra byte so I can store a word endr SPGetStatus record export dc.b 0,$1D dc.w 0 dc.l 0 dc.l 0 ; put server internet address here dc.w replyBufSize dc.l replyBuf dc.w 0 ; actual length returned here endr SPCommand record export dc.b 0,$20 dc.w 0 dc.l 0 dc.b 0 ; put sessRefNum here dc.w 0 ; put command length here dc.l cmdBuf dc.w replyBufSize dc.l replyBuf dc.l 0 ; AFP result returned here dc.w 0 ; actual reply length returned here endr GetSrvrParms record export dc.b 0,$20 ; really an SPCommand dc.w 0 dc.l 0 dc.b 0 ; put sessRefNum here dc.w 1 ; FPGetSrvrParms is only 1 byte dc.l getSrvrParmsCmd ; point to this command only dc.w VolBufSize dc.l 0 ; put volume buffer pointer here dc.l 0 ; AFP result returned here dc.w 0 ; actual reply length returned here getSrvrParmsCmd dc.b FPGetSrvrParms ; command packet endr export (GuestUAM,ClearTextUAM,ScrambledUAM,AFPVersion20,AFPVersion21):data GuestUAM pstr 'No User Authent' ClearTextUAM pstr 'Cleartxt passwrd' ScrambledUAM pstr 'Randnum exchange' AFPVersion20 pstr 'AFPVersion 2.0' AFPVersion21 pstr 'AFPVersion 2.1' ;added 4-Mar-93 DAL export (hasGuest,hasClearText,hasScrambled,hasChgPwd):data hasGuest dc.w 0 ; non-zero if Guest supported hasClearText dc.w 0 ; non-zero if ClearText supported hasScrambled dc.w 0 ; non-zero if Randnum Exchange supported hasChgPwd dc.w 0 ; non-zero if Set Password supported export (hasAFP20,hasAFP21,alreadyConn,mountFlag):data hasAFP20 dc.w 0 ; non-zero if AFP 2.0 supported hasAFP21 dc.w 0 ; non-zero if AFP 2.1 supported (added 4-Mar-93 DAL) alreadyConn dc.w 0 ; non-zero if already connected mountFlag dc.w 0 ; mount flag for FIMountVol export (numVols,volPassword,volPath,volsMounted):data numVols dc.w 0 ; number of volumes in list volPassword ds.b 10 ; zero-terminated PString volPath ds.b 34 ; 31 chars+slash+length byte volsMounted dc.w 0 ; non-zero if volumes already mounted export (SystemSetup,SetupFolder,ATInit,ASharePrep,Path):data SystemSetup gstr '*:System:System.Setup:' SetupFolder gstr ':Setup:' ATInit gstr 'ATInit' ASharePrep gstr 'AppleShare.Prep' Path ds.b 80 ; maximum length should be 74 bytes export emptyStr:data emptyStr dc.b 0 ; empty Pascal string export (prepHandle,serverInfo,volInfo,prepChange,prepDirty,serverCount):data prepHandle dc.l 0 ; handle to AppleShare.Prep data serverInfo ds ServerInfoRec volInfo ds VolumeInfoRec prepChange dc.w 0 ; non-zero if AppleShare.Prep info changed for this server prepDirty dc.w 0 ; non-zero if AppleShare.Prep needs to be written serverCount dc.w 0 ; number of servers in AppleShare.Prep export saveNameOnly:data saveNameOnly dc.w 0 end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/BuildEverything b/IIGS.601.SRC/A.U.G/CtlPanel/BuildEverything new file mode 100644 index 0000000..ed7d4fa --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/BuildEverything @@ -0,0 +1 @@ +# # BuildAll {Parmeters} # # This builds the 10 cDevs that Darryl builds, the control panel # NDA and and CDEVINIT. # # All options are passed on the BuildProgram script. # ################################################################## # The following code permits this script to be executed from # anywhere, and for subsidiary scripts to do anything they # want to the directory prefixes without messing up the # overall build. # CRUCIAL ASSUMPTION: All subdirectories containing control panel # source are in the directory containing this script file. # Jim Merritt thanks Jim Mensch for digging up the regular expression # in the evaluate command below, and John Dance for supplying # a foolproof way for a shellscript to come up with its own full # pathname. Wotta great bunch of guys! set myparent `files -f {Command}` (evaluate "{myparent}" =~ /(([Â:]*:)+)¨1[Â:]*/ ) > Dev:Null set myparent "{¨1}" IF "{myparent}" == "" echo "*** ERROR: Cannot determine script home directory." exit END # # Copy our special files into PiigsInclude # directory {myparent}CtlPanelIntfs: duplicate -y CDEVMgr.pii ¶ CDEVMgrData.aii ¶ NewInterface.pii ¶ ResMgr.pii ¶ {PIIGSInclude} directory {myparent}CtlPanelNDA: BuildProgram {Parameters} CtlPanel.NDA #directory {myparent}CDEV.INIT: #BuildProgram {Parameters} CDEV.Init directory {myparent}MonitorCDEV: BuildProgram {Parameters} Monitor directory {myparent}RamDiskCDEV: BuildProgram {Parameters} RAMDisk directory {myparent}KeyboardCDEV: BuildProgram {Parameters} Keyboard directory {myparent}GeneralCDEV: BuildProgram {Parameters} General directory {myparent}SoundCDEV: BuildProgram {Parameters} Sound directory {myparent}PrinterCDEV: BuildProgram {Parameters} Printer directory {myparent}TimeCDEV: BuildProgram {Parameters} Time directory {myparent}ModemCDEV: BuildProgram {Parameters} Modem directory {myparent}SlotsCDEV: BuildProgram {Parameters} Slots directory {myparent}DirectConnectCDEV BuildProgram {Parameters} DirectConnect directory {myparent}AppleShareCDEV BuildProgram {Parameters} AppleShare directory {myparent}NetPrinterCDEV BuildProgram {Parameters} NetPrinter directory {myparent}NamerCDEV BuildProgram {Parameters} Namer directory {myparent}MIDICDEV BuildProgram {Parameters} Midi directory {myparent}SetStartCDev Echo "# `Date -t` --- This is actually building SetStart!" BuildProgram All directory {myparent}FolderPrivCDEV BuildProgram {Parameters} FolderPriv Directory {MyParent}NetWorkCDev BuildProgram {Parameters} NetWork Directory {MyParent}SoundCDev:Sounds BuildProgram {Parameters} Sounds directory {myparent} \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/CDEVMgr.pii b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/CDEVMgr.pii new file mode 100644 index 0000000..858cdb5 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/CDEVMgr.pii @@ -0,0 +1 @@ +{$toolErrorchk-} {$a+} {$longGlobals+} unit CDEVMGR; interface uses QDIntf, GSIntf, MiscTools, Prodos16, RESMgr; const machineCDEV = 1; { called when rebuilding cdev.data to see if cdev should be included } BootCDEV = 2; { boot time init call or install call - no params} ShutDownCDEV = 3; { reserved for future use} InitCDEV = 4; { called when being shown - data1 = windowPtr} CloseCDEV = 5; { called when being removed - data1 = windowPtr} EventsCDEV = 6; { called when an event - data1 = ptr to event record} CreateCDEV = 7; { called so that CDEV can create its controls inline - data1 = window} AboutCDEV = 8; { called so that CDEV can create its about text inline - no params} RectCDEV = 9; { called so that CDEV can dynamically compute its rectangle} HitCDEV = 10;{ called when ctl is "hit" - data1 = Hdl to Ctl hit, data2 = Ctl Id} RunCDEV = 11;{ caled when da run is called} reserved1 = 12;{ reserved for future use} reserved2 = 13;{ reserved for future use} reserved3 = 14;{ reserved for future use} NeverUsed1 = 15;{ this will never be used} NeverUsed2 = 16;{ this will never be used} { wantReserved0 = 1; } wantMachine = 1; wantBoot = 2; wantShutDown = 4; wantInit = 8; wantClose = 16; wantEvents = 32; wantCreate = 64; wantAbout = 128; wantRect = 256; wantHit = 512; wantRun = 1024; wantReserved1 = 2048; wantReserved2 = 4096; wantReserved3 = 8192; updateSSfromBRAM= 16384; CanBeUnActive = 32768; CDEV_ResType = $8018; FLAG_ResType = $8019; TwoRect_ResType = $801A; rCodeResource = $8017; CDEV_FileType = $C7; CDEV_AuxType = 0; CDEVDATA_FileType = $00; CDEVDATA_AuxType = $00; fCtlActive = $8000; fCtlCanBeActive = $4000; fCtlWantEvents = $2000; fCtlProcRefNotPtr = $1000; type str32 = string[32]; str15 = string[15]; str8 = string[8]; FlagsHdl = ^FlagsPtr; FlagsPtr = ^FlagsRec; FlagsRec = packed record CDEVFlags : Integer; { messages we respond to & Flags} Enabled : boolean; { are we enabled?} Version : byte; { version # of the control panel it works with 1 = 1.0} Machine : byte; { what machine do we need to be run 0,1 = old GS; 2 = tenspeed} Reserved : byte; { reserved byte} DataRect : Rect; { really the width & height; top, left = 0} name : str15; { name of the CDEV, upper/lower case} author : str32; { name of the author} versStr : str8; { version of the CDEV} end; IconHdl = ^IconPtr; IconPtr = ^IconRec; IconRec = packed record kind : Integer; { always -1 = color} size : Integer; { always 280} height : Integer;{ always 20} width : Integer; { always 28} image : packed array[0..19,0..13] of byte; mask : packed array[0..19,0..13] of byte; end; CDEVFake = ^CDEV; CDEV = record path : str255; { full path, including file name of the CDEV} flags : FlagsRec; { flags from above} icon : IconRec; { icon from above} reserved : array[1..4] of integer; end; CDEVHeader = record identifier : Integer; { identifier, 'DL'} version : Integer; { should be 1} lastMachine : Integer;{ last machine this was run on} Count : integer; { # of CDEV's below} reserved : array[1..4] of longint; { reserved for future use} end; CDEVArray = array[1..1] of CDEV; CDEVHdl = ^CDEVPtr; CDEVPtr = ^CDEVRec; CDEVRec = record header : CDEVHeader; { header from above} CDEVS : CDEVArray; { the CDEV's} end; DITLHdl = ^DITLPtr; DITLPtr = ^DITLRec; DITLRec = record theRefs : array[1..1] of longint; end; SavePosHdl = ^SavePosPtr; SavePosPtr = ^SavePosRec; SavePosRec = record rect320 : Rect; rect640 : Rect; end; function GetAndUpdateCDEVS : CDEVHdl; function UpperString(s : str255) : str255; procedure QuickSort(i,j : Integer; var A : CDEVArray); implementation function GetCodeResConverter : Ptr; tool $3, $34; function Disp(message : Integer; data1, data2 : Longint; thecode : ptr) : Longint; external; procedure die; inline $00; function GetAndUpdateCDEVS : CDEVHdl; type weirdness = record buffsize : integer; resultsize : integer; result : packed array[1..128] of char; end; var p: P16ParamBlk; dirDate, dirTime : Integer; index, i : integer; fileID : Integer; DataHandle : CDEVHdl; newSize : Longint; flagH : FlagsHdl; IconH : IconHdl; CDEVDataPtr : StringPtr; CDEVDirPtr : StringPtr; pascalName : string[128]; savePrefix : string[128]; CDEVDataPath : string[32]; CDEVDirPath : string[32]; currentName : weirdness; dummy : Ptr; Atemp,XTemp,YTemp,PTemp : integer; scr : longint; currCDEVCode : Ptr; tempHdl : Handle; label 1,2; begin FWEntry(Atemp,XTemp,YTemp,PTemp,$FE1F); {ytemp holds the machine rom #} CDEVDataPath := '*/SYSTEM/CDEVS/CDEV.DATA'; CDEVDirPath := '*/SYSTEM/CDEVS'; CDEVDataPtr := @CDEVDataPath; CDEVDirPtr := @CDEVDirPath; GetAndUpdateCDEVS := nil; currentName.buffSize := 128; { first, try to find the CDEV's folder, it if is not there, exit} p.pathname1 := CDEVDirPtr; P16GetFileInfo(p); if isToolError then begin DataHandle := nil; { the directory didn't exist - return nil handle!} goto 2; end else begin dirDate := p.modDate; dirTime := p.modTime; { second, try to find the CDEV.DATA file, if it is not there or it has a older mod date than the directory, rebuild it. If the directory is write protected ???? SHIT, WHAT DO I DO ????} p.pathname1 := CDEVDataPtr; P16GetFileInfo(p); if (not isToolError) and ((dirDate + dirTime) = (p.ModDate + p.ModTime)) then begin {we dont need to re-build the file - just read it!} p.pathname2 := CDEVDataPtr; P16Open(p); P16GetEOF(p); p.requestCount := p.eof; Datahandle := CDEVHdl(NewHandle(p.requestCount, MMStartup, NoBankCross + locked, ptr(0))); p.dataBuffer := Ptr(Datahandle^); P16Read(p); if istoolerror or (Datahandle^^.header.identifier <> $444C) or {<-- trashed file} (Datahandle^^.header.version <> 1) then { bad version #} begin { trashed file, try to build it below} DisposeHandle(Handle(DataHandle)); DataHandle := nil; P16Close(p); end else begin P16Close(p); goto 2; end; end; P16Destroy(p); { remove it if it's there} {save the old prefix} p.prefixNum := 7; p.prefix := @savePrefix; p16GetPrefix(p); {set the new prefix} p.prefixNum := 7; p.prefix := CDEVDirPtr; p16SetPrefix(p); p.pathname2 := CDEVDirPtr; P16Open(p); p.reserved := 0; p.base := 0; p.displacement := 0; p.nameBuffer := @currentname; P16GetDirEntry(p); DataHandle := CDEVHdl(NewHandle(sizeof(cdevheader) + (p.entrynum * sizeof(CDEV)), MMStartup, NoBankCross + Locked, ptr(0))); if istoolerror then { not enough memory!} begin DataHandle := nil; P16Close(p); {this closes the directory} {restore the old prefix} p.prefixNum := 7; p.prefix := @savePrefix; p16SetPrefix(p); goto 2; end; { fill the header!} with DataHandle^^, header do begin identifier := $444C; {'DL'} lastMachine := YTemp; version := 1; count := 0; reserved[1] := 0; reserved[2] := 0; reserved[3] := 0; reserved[4] := 0; end; for index := 1 to p.entrynum do with DataHandle^^ do begin p.displacement := index; P16GetDirEntry(p); {build the pascal file name} pascalName[0] := char(currentName.resultSize); for i := 1 to currentName.resultsize do pascalName[i] := currentName.result[i]; {build the path name to the file for opening its resources} for i := currentName.resultsize+2 downto 2 do currentName.result[i] := currentName.result[i-2]; currentName.result[1] := '7'; { we use prefix 7 as our directory!} currentName.result[2] := '/'; currentName.resultSize := currentName.resultsize + 2; if ((p.fileFiltyp = CDEV_FileType) and (BitAnd(p.fileAuxType,$8000) = 0)) then begin fileID := OpenResFile(1,nil,@currentName.resultsize); inc(header.count); with CDEVS[header.count] do begin reserved[1] := 0; reserved[2] := 0; reserved[3] := 0; reserved[4] := 0; path := concat(CDEVDirPath,'/',pascalName); IconH := IconHdl(LoadRes(rIcon,1)); { add its icon to our struct } if istoolerror then begin dec(header.count); goto 1; end; icon := IconH^^; ReleaseRes(3,rIcon,1); { then trash it! } FlagH := FlagsHdl(LoadRes(FLAG_ResType,1)); { add its flags to our stuct} if istoolerror then begin dec(header.count); goto 1; end; if YTemp < FlagH^^.machine then begin ReleaseRes(3,FLAG_ResType,1); { wrong machine, get lost.} dec(header.count); goto 1; end; if (BitAnd(flagH^^.CDEVFlags, wantmachine) <> 0 ) then begin scr := 1; ResConverter(GetCodeResConverter, CDEV_ResType, login); tempHdl := LoadRes(CDEV_ResType,1); { load the code!} if not isToolerror then {in case the resource is not there, dont crash} begin HLock(tempHdl); CurrCDEVCode := tempHdl^; scr := Disp(machineCDEV, 0, 0, currCDEVCode); ReleaseRes(3,CDEV_ResType,1); {zombie the code} {log out of the resource converter} ResConverter(GetCodeResConverter, CDEV_ResType, logout); end; if scr = 0 then dec(header.count); end; flags := FlagH^^; ReleaseRes(3,FLAG_ResType,1); { then trash it!} end; 1: CloseResFile(fileid); end; end; newSize := sizeof(cdevheader) + (DataHandle^^.header.count * sizeof(CDEV)); SetHandleSize(newSize, Handle(DataHandle)); P16Close(p); {this closes the directory} {restore the old prefix} p.prefixNum := 7; p.prefix := @savePrefix; p16SetPrefix(p); {Do a sort by name !!!!} HLock(Handle(dataHandle)); with datahandle^^ do Quicksort(1,header.count, CDEVS); HLock(Handle(dataHandle)); {create a new cdev.data file & write the new info to it!} p.pathname1 := CDEVDataPtr; p.access := $83; p.fileType := CDEVDATA_FileType; p.auxType := CDEVDATA_AuxType; p.storageType := 5; p.createDate := 0; p.createTime := 0; p16create(p); if istoolerror then goto 2; { we couldn't create it, so leave!} p.pathname2 := CDEVDataPtr; p16open(p); p.requestcount := newSize; p.databuffer := Ptr(DataHandle^); p16Write(p); if istoolerror then begin { must not be enough room, kill it & leave} p16Close(p); p.deletepathname := CDEVDataPtr; p16destroy(p); goto 2; end; p16Close(p); p.pathname1 := CDEVDataPtr; p16GetFileInfo(p); p.access := $C1; {destroy enable, rename enable, backup needed, READ ONLY} p16SetFileInfo(p); 2: GetAndUpdateCDEVS := DataHandle; end; end; function UpperString(s : str255) : str255; var i : integer; val : integer; begin for i := 1 to ord(s[0]) do { this is faster than length(s) } begin val := ord(s[i]); if (val >= ord('a')) and (val <= ord('z')) then { its a lower case character} s[i] := Char(val - $20); end; UpperString := s; end; procedure QuickSort(i,j : Integer; var A : CDEVArray); var pivot : str15; pivotIndex : Integer; k : Integer; function FindPivot(i, j : Integer) : Integer; var firstKey : str15; k : Integer; begin firstKey := upperstring(A[i].flags.name); FindPivot := 0; for k := (i+1) to j do if upperstring(A[k].flags.name) > firstKey then FindPivot := k else if upperstring(A[k].flags.name) < firstKey then FindPivot := i; end; procedure SwapCDEV(var cdev1, cdev2 : CDEV); var temp : CDEV; begin temp := cdev1; cdev1 := cdev2; cdev2 := temp; end; function Partition(i, j : integer; var pivot : str15) : Integer; var l, r : integer; begin l := i; r := j; repeat SwapCDEV(A[l], A[r]); while upperstring(A[l].flags.name) < upperstring(pivot) do inc(l); while upperstring(A[r].flags.name) >= upperstring(pivot) do dec(r); until l > r; Partition := l; end; begin pivotindex := findpivot(i,j); if pivotindex <> 0 then begin pivot := A[pivotindex].flags.name; k := partition(i,j,pivot); quicksort(i,k-1,A); quicksort(k,j,A); end; end; end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/CDEVMgrData.aii b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/CDEVMgrData.aii new file mode 100644 index 0000000..060e7b9 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/CDEVMgrData.aii @@ -0,0 +1 @@ +;;; CDEVMgrData - data for the code resource that builds the cdev.data files. ; ; Michael V. Stein 05/10/90. ; ; © Copyright Apple Computer, 1990. blanks off ;; equates. ;; include files. * no longer needed {gab} * include 'm16.util' ;; macros. ;; main program. file proc ;; exported addresses. export disp disp ; rewritten by Greg Branche lda 6,s ;get high 16-bits of 32-bit destination pointer tay ;save in Y for a second lda 4,s ;get low 16-bits dec a ;prepare for eventual RTL tax ;save in X pla ;retrieve low 16-bits of return address sta 3,s ;put back on stack, overwriting destination pointer sep #$20 ;8-bit accumulator pla ;retrieve high 8-bits of return address sta 4,s ;put back on stack tya ;get high 8-bits of destination pointer sta 1,s ;put on stack rep #$20 ;back to 16-bit accumulator phx ;put low 16-bits of destination pointer on stack rtl ;and 'return' to destination endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/NewControls.h b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/NewControls.h new file mode 100644 index 0000000..666d994 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/NewControls.h @@ -0,0 +1 @@ +/* */ #ifndef __types__ #include #endif #ifndef __quickdraw__ #include #endif #ifndef __misctool__ #include #endif #ifndef __resmgr__ #include #endif #ifndef __newcontrols__ #define __newcontrols__ #define MachineCDEV 1 #define BootCDEV 2 #define ShutDownCDEV 3 #define InitCDEV 4 #define CloseCDEV 5 #define EventsCDEV 6 #define HitCDEV 7 #define CreateCDEV 8 #define AboutCDEV 9 #define RectCDEV 10 #define reserved4 11 #define reserved5 12 #define reserved6 13 #define reserved7 14 #define reserved8 15 #define reserved9 16 #define wantMachine 1 #define wantBoot 2 #define wantShutDown 4 #define wantInit 8 #define wantClose 16 #define wantEvents 32 #define wantHit 64 #define wantCreate 128 #define wantAbout 256 #define wantRect 512 #define wantReserved2 1024 #define wantReserved3 2048 #define wantReserved4 4096 #define wantReserved5 8192 #define wantReserved6 16384 #define CanBeUnActive 32768 #define CDEV_ResType 0x8018 #define FLAG_ResType 0x8019 #define TwoRect_ResType 0x801a #define CDEV_FileType 0xc7 #define CDEV_AuxType 0 #define CDEVDATA_FileType 0x00 #define CDEVDATA_AuxType 0x00 #define fCtlActive 0x8000 #define fCtlCanBeActive 0x4000 #define fCtlWantEvents 0x2000 #define fCtlProcRefNotPtr 0x1000 #define simpleButtonControl 0x80000000 #define checkControl 0x82000000 #define radioControl 0x84000000 #define scrollBarControl 0x88000000 #define growControl 0x8a000000 #define statTextControl 0x81000000 #define editLineControl 0x83000000 #define editTextControl 0x85000000 #define popUpControl 0x87000000 #define listControl 0x89000000 #define iconButtonControl 0x8b000000 #define pictureControl 0x8d000000 typedef String(8) Str8; typedef String(15) Str15; typedef String(32) Str32; typedef struct NewCtlRec { struct NewCtlRec **ctlNext; /* CtlRec - Handle of next control. */ GrafPortPtr ctlOwner; /* CtlRec - Pointer to control's window. */ Rect ctlRect; /* CtlRec - Enclosing rectangle. */ Byte ctlFlag; /* CtlRec - Bit flags. */ Byte ctlHilite; /* CtlRec - Highlighted part. */ Integer ctlValue; /* CtlRec - Control's value. */ LongProcPtr ctlProc; /* CtlRec - Control's definition procedure. */ LongProcPtr ctlAction; /* CtlRec - Control's action procedure. */ Longint ctlData; /* CtlRec - Reserved for CtrlProc's use. */ Longint ctlRefCon; /* CtlRec - Reserved for application's use. */ Pointer ctlColor; /* CtlRec - Pointer to appropriate color table. */ char ctlReserved[0x10]; Longint ctlID; integer ctlMoreFlags; integer ctlVersion; } NewCtlRec, *NewCtlRecPtr, **NewCtlRecHndl ; typedef struct FlagsRec { Integer CDEVFlags; /* messages we need to respond to*/ byte Enabled; /* are we enabled?*/ byte Version; /* version # of the control panel it works with*/ byte Machine; /* what machine do we need to be run*/ byte System; /* what system do we need to be run*/ Rect DataRect; /* really the width & height; top, left = 0*/ Str15 name; /* name of the CDEV, upper/lower case*/ Str32 author; /* name of the author */ Str8 versStr; /* version of the CDEV */ } FlagsRec,*FlagsPtr,**FlagsHdl; typedef struct IconRec { Integer kind; /* always -1 = color*/ Integer size; /* always 280*/ Integer height;/* always 20*/ Integer width; /* always 28*/ char image[20][14]; char mask[20][14]; } IconRec, *IconPtr, **IconHdl; typedef struct CDEV { Str255 path; /* full path, including file name of the CDEV*/ FlagsRec flags; /* flags from above*/ IconRec icon; /* icon from above*/ integer reserved[5]; } CDEV, *CDEVFake; typedef struct CDEVHeader { Integer identifier; /* identifier, 'DL'*/ Integer version; /* should be 1*/ integer Count; /* # of CDEV's below*/ longint reserved[5]; /* reserved for future use*/ } CDEVHeader; typedef struct CDEVRec { CDEVHeader header; /* header from above*/ CDEV CDEVS[1]; /* the CDEV's*/ } CDEVRec,*CDEVPtr,**CDEVHdl; typedef struct DITLRec { longint theRefs[2]; } DITLRec, *DITLPtr, **DITLHdl; typedef struct editLineCtl { integer pCount; /* in this case - 7*/ longint ctlID; /* 1,2,3...*/ Rect ctlRect; /* the rect*/ longint ctlProcRef; /* $80000000*/ integer ctlFlag;/* 2*/ integer ctlMoreFlags;/* 2*/ longint ctlRefCon; /* 0 */ integer ctlMaxSize; longint ctlDefaultRef; integer ctlTextSize; } editLineCtl, *editLinePtr, **editLineHndl; typedef struct listCtlRec { integer pCount; longint ID; Rect ctlRect; longint ctlProcRef; integer ctlFlag; integer ctlMoreFlags; longint ctlRefCon; integer ctlListSize; integer ctlListView; integer ctlListType; integer ctlListStart; longint ctlListDraw; integer ctlListMemHeight; integer ctlListMemSize; longint ctlListRef; longint ctlColorRef; } listCtlRec, *listCtlPtr, **listCtlHndl; typedef struct statTextCtl { integer pCount; longint ID; Rect ctlRect; longint ctlProcRef; integer ctlFlag; integer ctlMoreFlags; longint ctlRefCon; longint ctlTextRef; integer ctlTextSize; } statTextCtl, *statTextCtlPtr, **statTextCtlHndl; #endif \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/NewInterface.h b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/NewInterface.h new file mode 100644 index 0000000..db879cb --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/NewInterface.h @@ -0,0 +1 @@ +/* */ #ifndef __quickdraw__ #include #endif #ifndef __event__ #include #endif #ifndef __newinterface__ #define __newinterface__ #define wInControl 0x21 typedef struct NEWEventRecord { EventRecord oldRec; longint wmLastClick; integer wmclickcount; longint wmtaskData2; longint wmtaskData3; longint wmtaskData4; } NEWEventRecord; typedef struct simpleButtonRec { integer pCount; /* in this case - 7*/ longint ctlID; /* 1,2,3...*/ Rect ctlRect; /* the rect*/ longint ctlProcRef; /* $80000000*/ integer ctlFlag;/* 2*/ integer ctlMoreFlags;/* 2*/ longint ctlRefCon; /* 0 */ longint TitleRef; /* resource id of string*/ longint colorRef; } simpleButtonRec, *simpleButtonPtr, **simpleButtonHdl; typedef struct RadioButtonRec { integer pCount; /* in this case - 7*/ longint ctlID; /* 1,2,3...*/ Rect ctlRect; /* the rect*/ longint ctlProcRef; /* $80000000*/ integer ctlFlag;/* 2*/ integer ctlMoreFlags;/* 2*/ longint ctlRefCon; /* 0 */ longint TitleRef; /* resource id of string*/ Integer InitialValue; /* inital value*/ longint colorRef; } RadioButtonRec, *RadioButtonPtr, **RadioButtonHdl; typedef struct CheckButtonRec { integer pCount; /* in this case - 7*/ longint ctlID; /* 1,2,3...*/ Rect ctlRect; /* the rect*/ longint ctlProcRef; /* $80000000*/ integer ctlFlag;/* 2*/ integer ctlMoreFlags;/* 2*/ longint ctlRefCon; /* 0 */ longint TitleRef; /* resource id of string*/ Integer InitialValue; /* inital value*/ longint colorRef; } CheckButtonRec, *CheckButtonPtr, **CheckButtonHdl; extern pascal void ResBootInit() inline(0x011e,dispatcher); extern pascal Ptr LGetPathName2() inline(0x2211,dispatcher); extern pascal integer TaskMasterDA() inline(0x5f0e,dispatcher); extern pascal NewCtlRecHndl NewControl2() inline(0x3110,dispatcher); extern pascal NewCtlRecHndl GetCtlHandleFromID() inline(0x3010,dispatcher); extern pascal longint GetCtlID() inline(0x2a10,dispatcher); extern pascal Ptr GetCodeResConverter() inline(0x3610,dispatcher); #endif \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/NewInterface.pii b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/NewInterface.pii new file mode 100644 index 0000000..84647ef --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/NewInterface.pii @@ -0,0 +1 @@ +unit newinterface; uses qdintf, gsintf; const simpleButton = $80000000; checkBox = $82000000; radio = $84000000; srollBar = $88000000; grow = $8A000000; statText = $81000000; editline = $83000000; editText = $85000000; popUp = $87000000; list = $89000000; iconButton = $8B000000; pictCtl = $8D000000; wInControl = $21; type NEWEventRecord = record oldRec : eventrecord; wmLastClick : longint; wmclickcount : integer; wmtaskData2 : longint; wmtaskData3 : longint; wmtaskData4 : longint; wmLastClickPt : Point; end; simpleButtonHdl = ^simpleButtonPtr; simpleButtonPtr = ^simpleButtonRec; simpleButtonRec = record pCount : integer; { in this case - 7} ctlID : longint; { 1,2,3...} ctlRect : rect; { the rect} ctlProcRef : longint; { $80000000} ctlFlag : integer;{ 2} ctlMoreFlags : integer;{ 2} ctlRefCon : longint; { 0 } TitleRef : longint; { resource id of string} colorRef : longint; end; RadioButtonHdl = ^RadioButtonPtr; RadioButtonPtr = ^RadioButtonRec; RadioButtonRec = record pCount : integer; { in this case - 7} ctlID : longint; { 1,2,3...} ctlRect : rect; { the rect} ctlProcRef : longint; { $80000000} ctlFlag : integer;{ 2} ctlMoreFlags : integer;{ 2} ctlRefCon : longint; { 0 } TitleRef : longint; { resource id of string} InitialValue : Integer; { inital value} colorRef : longint; end; CheckButtonHdl = ^CheckButtonPtr; CheckButtonPtr = ^CheckButtonRec; CheckButtonRec = record pCount : integer; { in this case - 7} ctlID : longint; { 1,2,3...} ctlRect : rect; { the rect} ctlProcRef : longint; { $80000000} ctlFlag : integer;{ 2} ctlMoreFlags : integer;{ 2} ctlRefCon : longint; { 0 } TitleRef : longint; { resource id of string} InitialValue : Integer; { inital value} colorRef : longint; end; MenuItemHdl = ^MenuItemPtr; MenuItemPtr = ^MenuItemRec; MenuItemRec = packed record version : Integer; ItemID : Integer; ItemChar : Char; ItemAltChar : Char; ItemCheck : Integer; ItemFlag : Integer; ItemTitleRef : Longint; {top 2 bits set for title is resource id} end; MenuH = ^MenuP; MenuP = ^MenuR; MenuR = record version : integer; menuID : integer; menuFlag : integer; {top 4 bits are set = menu title & item are resources} menuTitleRef : longint; Items : array[1..1] of Longint; end; PopUpHdl = ^PopUpPtr; PopUpPtr = ^PopUpRec; PopUpRec = record pCount : integer; { in this case - 9} ctlID : longint; { 1,2,3...} ctlRect : rect; { the rect} ctlProcRef : longint; { $87000000} ctlFlag : integer;{ 0} ctlMoreFlags : integer;{ fCtlProcRefNotPtr + 2} ctlRefCon : longint; { 0 } TitleWidth : Integer; { stringwidth(title) } MenuRefRef : longint; { resource id of menu} InitialValue : Integer; { inital value (item id)} end; function LGetPathName2(memID, fileNum : integer) : Ptr; tool $11, $22; function TaskMasterDA(mask : integer; event : NEWeventrecord) : integer; tool 14, $5F; function NewControl2(wind : windowPtr; inputType : Integer; reference : longint) : ControlHandle; tool 16,$31; function GetCtlHandleFromID(theWind : WindowPtr; id : longint) : ControlHandle; tool 16, $30; function GetCtlID(ctlHdl : Controlhandle) : longint; tool 16, $2A; procedure AddToRunQ(addr : procPtr); tool $05, $1f; procedure RemoveFromRunQ(addr : procPtr); tool $05, $20; function GetCodeResConverter : Ptr; tool $3, $34; function GetCtlParamPtr : Ptr; tool $10, 35; procedure SetCtlParamPtr(p : Ptr); tool $10,34; FUNCTION TaskMaster2(EventMask : Integer; Event: NewEventRecord):Integer;Tool 14,29; procedure SetKeyTranslation(trans : integer); tool 6, $1C; function GetKeyTranslation : integer; tool 6, $1B; procedure PHB; inline $8B; procedure PHK; inline $4B; procedure PLB; inline $AB; end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/RESMGR.H b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/RESMGR.H new file mode 100644 index 0000000..a35ced0 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/RESMGR.H @@ -0,0 +1 @@ +/* My implementation of Darryl Lovato's pascal implementation of the resource manager interface */ #ifndef __quickdraw__ #include #endif #ifndef __resmgr__ #define __resmgr__ #define rIcon 0x8001 #define rPicture 0x8002 #define rControlList 0x8003 #define rControlTemplate 0x8004 #define rWindow 0x8005 #define rString 0x8006 #define rStringList 0x8007 #define rMenuBar 0x8008 #define rMenu 0x8009 #define rMenuItem 0x800A #define rTextForLETextbox2 0x800B #define rCtlDefProc 0x800C #define rCtlColorTbl 0x800D #define rCDEVCode 0x8018 #define rCDEVFlags 0x8019 #define rTwoRects 0x801a #define login 1 #define logout 2 typedef struct ResourceRec { int resType; Longint resID; } ResourceRec; extern pascal void ResBootInit() inline(0x011e,dispatcher); extern pascal void ResStartup() inline(0x021e,dispatcher); extern pascal void ResShutdown() inline(0x031e,dispatcher); extern pascal Integer ResVersion() inline(0x041e,dispatcher); extern pascal void ResReset() inline(0x051e,dispatcher); extern pascal boolean ResStatus() inline(0x061e,dispatcher); extern pascal void CreateResFile() inline(0x091e,dispatcher); extern pascal Integer OpenResFile() inline(0x0a1e,dispatcher); extern pascal void CloseResFile() inline(0x0b1e,dispatcher); extern pascal void AddRes() inline(0x0c1e,dispatcher); extern pascal void UpdateResFile() inline(0x0d1e,dispatcher); extern pascal Handle LoadRes() inline(0x0e1e,dispatcher); extern pascal void RemoveRes() inline(0x0f1e,dispatcher); extern pascal void MarkResChange() inline(0x101e,dispatcher); extern pascal void SetCurResFile() inline(0x111e,dispatcher); extern pascal Integer GetCurResFile() inline(0x121e,dispatcher); extern pascal void SetCurResApp() inline(0x131e,dispatcher); extern pascal Integer GetCurResApp() inline(0x141e,dispatcher); extern pascal Integer HomeResFile() inline(0x151e,dispatcher); extern pascal void WriteRes() inline(0x161e,dispatcher); extern pascal void ReleaseRes() inline(0x171e,dispatcher); extern pascal void DetatchRes() inline(0x181e,dispatcher); extern pascal Longint UniqueResID() inline(0x191e,dispatcher); extern pascal void SetResID() inline(0x1a1e,dispatcher); extern pascal Integer GetResAttr() inline(0x1b1e,dispatcher); extern pascal void SetResAttr() inline(0x1c1e,dispatcher); extern pascal Longint GetResSize() inline(0x1d1e,dispatcher); extern pascal void MatchResHandle() inline(0x1e1e,dispatcher); extern pascal Integer GetOpenFileRefNum() inline(0x1f1e,dispatcher); extern pascal Integer CountTypes() inline(0x201e,dispatcher); extern pascal integer GetIndType() inline(0x211e,dispatcher); extern pascal Longint CountRes() inline(0x221e,dispatcher); extern pascal Handle GetIndRes() inline(0x231e,dispatcher); extern pascal void SetResLoad() inline(0x241e,dispatcher); extern pascal void SetResFileDepth() inline(0x251e,dispatcher); extern pascal Handle GetMapHandle() inline(0x261e,dispatcher); extern pascal void ResConverter() inline(0x281e,dispatcher); #endif \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/ResMgr.pii b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/ResMgr.pii new file mode 100644 index 0000000..976ad52 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelIntfs/ResMgr.pii @@ -0,0 +1 @@ +{ resource manager pascal interface} unit ResMgr; interface uses QDIntf, GSIntf; const rIcon = $8001; rPicture = $8002; rControlList = $8003; rControlTemplate = $8004; rWindow = $8005; rString = $8006; rStringList = $8007; rMenuBar = $8008; rMenu = $8009; rMenuItem = $800A; rTextForLETextbox2 = $800B; rCtlDefProc = $800C; rCtlColorTbl = $800D; login = 1; {for resource converter} logout = 2; type ResourceRec = record resType : Integer; resID : Longint; end; procedure ResBootInit; tool 30, 1; procedure ResStartup(memoryID : integer); tool 30, 2; procedure ResShutdown; tool 30, 3; function ResVersion : Integer; tool 30, 4; procedure ResReset; tool 30, 5; function ResStatus : integer; tool 30, 6; procedure CreateResFile(auxType : Longint; fileType, access : Integer; fileName : Ptr);tool 30, 9; function OpenResFile(access : integer; mapAddr : Ptr; fileName : Ptr) : Integer; tool 30, 10; procedure CloseResFile(id : Integer); tool 30, 11; procedure AddRes(theHandle : handle; attr, resType : Integer; resId : Longint); tool 30, 12; procedure UpdateResFile(memoryID : Integer); tool 30, 13; function LoadRes(resType : Integer; resID : Longint) : Handle; tool 30, 14; procedure RemoveRes(resType : Integer; resID : Longint); tool 30, 15; procedure MarkResChange(changed : boolean; resType : Integer; resID : Longint); tool 30, 16; procedure SetCurResFile(memoryID : Integer); tool 30, 17; function GetCurResFile : Integer; tool 30, 18; procedure SetCurResApp(memoryID : Integer); tool 30, 19; function GetCurResApp : Integer; tool 30, 20; function HomeResFile(theType:Integer; resID : Longint) : Integer; tool 30, 21; procedure WriteRes(resType : Integer; resID : Longint); tool 30, 22; procedure ReleaseRes(purgeLevel : integer; resType : Integer; resID : Longint); tool 30, 23; procedure DetatchRes(resType : integer; resID : Longint); tool 30, 24; function UniqueResID(IDRange, resType : Integer) : Longint; tool 30, 25; procedure SetResID(newID : Longint; resType : Integer; resID : Integer); tool 30, 26; function GetResAttr(resType : Integer; resID : Longint) : Integer; tool 30, 27; procedure SetResAttr(theAttr, resType : integer; resID : Longint); tool 30, 28; function GetResSize(resType : Integer; resID : Longint) : Longint; tool 30, 29; procedure MatchResHandle(var foundRec : ResourceRec; theHand : Handle); tool 30, 30; function GetOpenFileRefNum(fileId : Integer) : Integer; tool 30, 31; function CountTypes : Integer; tool 30, 32; function GetIndType(index : integer) : integer; tool 30, 33; function CountRes(resType : Integer) : Longint; tool 30, 34; function GetIndRes(resType: integer; index: longint) : Handle; tool 30, 35; procedure SetResLoad(load : boolean); tool 30, 36; procedure SetResFileDepth(numToSearch : Integer); tool 30, 37; function GetMapHandle(fileId : Integer) : Handle; tool 30, 38; procedure ResConverter(converter : Ptr; theType : Integer; flags : integer); tool 30,40; procedure ResDebug(on : integer); tool 30, $29; implementation end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/ControlPanel.NDA.res b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/ControlPanel.NDA.res new file mode 100644 index 0000000..e69de29 diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.NDA b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.NDA new file mode 100644 index 0000000..10d952f Binary files /dev/null and b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.NDA differ diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.aii b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.aii new file mode 100644 index 0000000..157e48e --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.aii @@ -0,0 +1 @@ +******************************************************************************* * * Control Panel NDA 2.1 * * Copyright Apple Computer, Inc. 1991-1993 * All Rights Reserved * * by David A. Lyons, started 20-Jan-91 * ******************************************************************************* * * REVISION HISTORY * * Version 2.0 for System 6.0 * * 20-Jan-91 Dave Lyons * Initial coding. Took about 2.5 hours to get the shell working. * The list of CDevs is hard-coded, and it cycles through to the * next one each time you open the DA. The battery-RAM updating * is working, even! * * 13..14-Feb-91 DAL * Making this into a for-real alpha-quality thing so I can check it * in soon. * * 18-Feb-91 DAL * Can I code on adrenaline? Yes, I Think SO! Not really alpha yet, * but let's see what I can do in the next five hours... * * 19-Feb-91 DAL * Still Going (thud, thud, thud, thud). Kinda works, in a minimal * sort of way. * * 20-Feb-91 DAL * Successfully builds all its data structures in memory and displays * the scrolling list of icons! * * 21-Feb-91am DAL * Really starting to cook now. Might even work right with multiple * CDevs open, even! (Later...working good.) * * 25-Feb-91am DAL * Looks like this is going on the 6.0d26 build. So let's fix it up * some more, put in the About box and Help & stuff. * * Finished WhatAccessRequest routine, so we'll open things up read-only * if we booted off of AppleShare. * * Kludged Run events for one window only, and got the data file stuff * working. * * === released on 6.0d26 === * * 26-Feb-91 DAL * Dim out the About and Help buttons when there are no CDevs selected. * Make the first CDev be selected by default. * * Uses VersionString to build version text from the rVersion resource. * * 27-Feb-91 DAL * Fixed Run events so they won't dispatch to a NIL or invalid window. * Fixed GlobalToLocal and LocalToGlobal calls on rectangles! * Now I use ResetMember2 instead of NextMember2 to scan for CDevs to * open. This way they are no longer selected when the open is done. * Now puts up a watch cursor around opening CDevs. * * 28-Feb-91 DAL (2.0d3) * When calling HitCDEV for a nonextended control, I now pass $FFFFFFFF * for the control ID. Some existing CDevs were counting on getting a * large value here, and I was passing zero before. * * Adding some better error handling. Instead of crashing if there isn't * enough memory, it just does nothing. * * 2-Mar-91 DAL (2.0d4) * Stripping leading blanks from CDev names in the list. * * 3-Mar-91 DAL (2.0d4) * We accept SendRequest($0F01) from MenuKey to implement Apple-ESC * as our hotkey to open up the Control Panels window (will make * this configurable later). Hilites the first menu title around * opening self. * Centers CDev rectangles better vertically than before. * Now sets the port to the CDev window during Create and Init messages. * * 13-Mar-91 DAL (2.0d5) * Was neglecting to invalidate an icon that was deselected, in the case * that I got an error trying to open it. * * 14-Mar-91 DAL * Take a whack at the palette manager! * * === released on 6.0d29 === * * 22-Mar-91 DAL (2.0d6) * Control Panel's own resource fork is now opened read-only on * AppleShare, so multiple users can use it. * Tweaked the little palette manager so that UseStandardPalette * doesn't do anything if we're already using our standard palette. * In 320 mode now we use a color table with the same colors as the * standard 640-mode colors. * * 30-Mar-91 DAL (2.0d7) * Now we draw the boot icons by calling ShowBootInfo (Misc Tools). * * 1-Apr-91 DAL (2.0d8) * Took out X coordinate fudging for drawing an icon in the list; * they were drawing too far to the right. Just force it even * instead. * We now validate the CDev.Data.2.0 header fields. * New routine ClosingCDevWindow cleans up while we're closing. * Added new field owbCDevItemPtr to the window block structure. * Ack! Twilight was not preserving the current resource file * when I gave it an EventsCDEV message. Fixed so that it doesn't * matter. * Now sets current resource file when handling an Action or Close. * Double-clicking a CDev that is already open just brings it to the * front. * Help button is enabled only if exactly one icon is selected. * Changed data file name to "CDev.Data" (not "CDev.Data.2.0"). * CDev.Data file is now created as invisible. * * === released on 6.0d30 === * * 7-Apr-91 DAL (2.0d9) * Change hotkey from Apple-ESC to Apple-Shift-ESC to avoid conflicting * with the Installer and Platinum Paint. * Added WaitCursor and InitCursor in doAboutBox, InitCursor on open. * Finished code to zoom CDevs closed and mark their icons closed. * * === released on 6.0d31 === * * 16-Apr-91 DAL (2.0d10) * Fix opening/closing of CDevs so that if the CDev puts up a modal * dialog of some sort, which calls GetNextEvent, that it doesn't * get really confused if another CDev was already open and gets * to process its activate or deactivate event during that time. * * === released on 6.0d32 === * * 17-Apr-91 DAL (2.0d11) * Invalid signature word on data file was being propogated to new file. * Disk full on writing data file was not forcing file to be destroyed. * * === released on 6.0d33 and 34 === * * 30-Apr-91 DAL (2.0d12) * Show watch cursor on CDev help but not CP help. Was backwards. * Fix double-clicking in the air so it doesn't blink the OK button. * * === missed 6.0d35 by 30 seconds === * * 13-May-91 DAL (2.0d13) * Made the data file get created Visible again, since sometimes it's * convenient to throw it out manually. * Removed some dead cursor-preservation stuff from NDAOpen. * Added Option key check at NDAOpen for opening Finder window. * * 14-May-91 DAL * Fixed NDAInit so it doesn't crash if you boot under pre-6.0. * * 3-Jun-91 DAL (2.0d14) * Fixed modifiers on Help button key equivalents. * Added error check on boot-time init of a CDev. Doesn't crash * if the resource can't be loaded. Instead, it X-es out the * icon and calls SysBeep2($000C). * * 11-Jun-91 DAL (still 2.0d14) * Now passes CDev window pointer to the EventsCDEV message (data2). * This didn't used to be documented to the world, but now it is, * and AppleShare was depending on it. * * 13-Jun-91 DAL (2.0d15) * You can double-click on an -inactive- CDev now. (Why not?) * * 24-Jun-91 DAL (2.0d16) * Now we grab a copy of the rWindColor(07ff0001) for a CDev window, * instead of hard-coding a lined color table. * Made the About... button invisible. * Clicking on the version is the same as clicking on About. * * 25-Jun-91 DAL (2.0d17) * BootCDEV now passes buffer pointer in data1. Setting bit 0 of * the first word of the buffer makes the CP X out the CDev icon. * * 8-Jul-91 DAL (to be 2.0d19 on 6.0d43) * No longer trashes memory when closing an "orphaned" Control Panel. * * 10-Jul-91 DAL (still 2.0d19) * Fixed tellFinderOpenWindow buffer (was too short). * Accepts request $9001 to open the main Control Panels window. * * 11-Jul-91 DAL (still 2.0d19) * No longer accesses SCBs directly! (For CloseView compatibility.) * Now forces a valid port around CtlNewRes call (for Prizm compatibilty). * Edit actions are now passed along to CDevs if wantEdit bit is set. * * 23-Jul-91 DAL (2.0d20) * Better handling of long Control Panel names when drawing icons. If * name won't fit, we draw with SetCharExtra(-1). If it still won't fit, * we let it stick off the ends. * * 20-Aug-91 DAL (2.0d21 on 6.0d46+) * Always use the correct CDev Flags word when deciding to call * MachineCDEV! (Problem made evident by AppleShare CDev 2.0, which * has WantMachine set.) Added missing "jsr UpdateFlagsBuffer". * * 3-Sep-91 DAL (2.0d22 on 6.0d47) * Now handles MachineCDEV returning 0--previously did not bother * to close the unwanted CDev's resource fork or check if we should * shut down the Resource Manager. * Does not display an error (like $0120) after MachineCDEV returns 0. * MainContentDraw and CDevContentDraw now set the CurResourceFile * around DrawControls. * Translates Command-Z/X/C/V into SystemEdit, if wantEdit is set. * Main window position is saved in a rTwoRects(1) resource (first * rect is 320, second is 640). * Accepts finderSaysOpenFailed if MachineCDEV failed. * * 9-Sep-91 DAL (2.0d23) * Made option-open or option-double-click close the main window after * opening a control panel. (The Close is scheduled to happen later * at a safe time.) * * 15-Sep-91 DAL (2.0d24) * Opening the main CP window now grabs resources from the correct * resource file, never from CDevs' resource files by accident. * * 16-Sep-91 DAL (2.0d24 for 6.0d49) * Saves window positions of individual Control Panels, using named * rTwoRect resources in the $0077xxxx range in the main control * panels file. First rect is 320, second is 640. Only the top- * left point of each rectangle is used. * * 17-Sep-91 DAL * Make CDev.Data invisible again. * * 29-Sep-91 DAL * The RunQueue task was not calling Push/PopGlobalStuff--was causing * problems when a CDev displayed an alert during MachineCDEV or * OpenCDEV, etc. * Was not preserving the old SCBs correctly when activating one of * my windows (added plx phx in loop). * * 2-Oct-91 DAL (2.0d26) * Load and start QD Aux if necessary. * * 13-Oct-91 DAL (2.0d27) * Force an Update event right after opening a control panel. * Ackeret wants Command-O to work like Return for the Open button...okay. * * 14-Oct-91 DAL * Changed handleMenuKey mask from $1B00 to $1300 so that Option-Command- * Shift-Esc will work (opens the CDevs folder). * * 25-Oct-91 DAL (2.0d28 for 6.0d55) * Added an InvalZoomRect call on open so it redraws as grayed-out even if * the CDev puts up an AlertWindow during open. * * 28-Oct-91 DAL (still 2.0d28) * Command-? now works for credits as advertised (like clicking on the * version number). * * 29-Oct-91 DAL * Moved the rIcon "X" resource to Sys.Resources. * * 30-Oct-91 DAL (2.0d29 for 6.0d56) * Run-event handler now preserves and sets the CurResourceApp and * CurResourceFile. * * 11-Oct-91 DAL (2.0d30 for 6.0d57). * When opening the main window, we make it update right away to avoid * ugly partly-drawn window if you start typing before it draws. * * 19-Nov-91 DAL (2.0d31 for 6.0d59) * Fixed Run events to work for all windows. * * 3-Dec-91 DAL (2.0d32 for 6.0d60) * When opening a resource file, we now always set the system preferences * to prompt for the disk, and to *not* allow a Cancel button. * * 4-Dec-91 DAL (still for d60) * Force main window updates on CDev open/close, since they could scroll the * list before a natural update gets processed. * Added a missing +2 in the Run event handling from 19-Nov. * * 9-Dec-91 DAL (2.0d33 for 6.0d61) * Added check to avoid doing a Close(0) if we try to read CDev.Data but * it does not exist. * * 10-Dec-91 DAL (still for d61) * Command-? is now Help, just like Command-H. (Human Interface guidelines * say Command-? is not for About.) * * 27-Jan-92 DAL (for 6.0d66) * Around the call to ToBramSetup, we no longer force the bank register to * $00. The firmware now does this (Tool.Setup/Misc.Tools). * * 5..6-Feb-92 DAL (for 6.0d70) * Turned off debug symbols (there was only one). * Since SetPfx was not disposing of the handle passed to it, each time you * opened and closed the main window, you orphaned a pair of handles * (which stored the old values of prefixes 0 and 8). * Optimizations (pCount is always 2 in getPfx and SetPfx; changed a few * and #$7fff to ASL A, LSR A). * Cleaned up some old comments. * Fixed copyright date in the Credits window (click on version number). * No longer responds to Printing a CDev from the Finder (only Open * works now); we weren't checking the printFlag in finderSaysBeforeOpen. * Now keeps the CDev pathname in the window refcon structure. * Keeps the CDevItemsHandle, CDevPathsHandle, and CDevIconsHandle data * around when *any* of our windows are open, not just the main window. * Fixed several bugs where things were confused if you opened CDevs using * a combination of the main window and the Finder. * * 7-Feb-92 DAL (for 6.0d70) * When showing a CDev's Help window, we need to provide Text Edit and * Font Manager, so that the Help routine does not try to start them * up (some do, and they get left started because the CDev never has * a chance to close them, if the CDev itself is not open). * Fixed a QDAuxStartUp which was supposed to be a QDAuxStatus. No actual * effect, since QD Aux is already available (Window Mgr starts it up), * redundant QDAuxStartUp calls have no effect, and QDAuxStartUp was * not changing the $0000 result space from the intended status call. * Added missing STA/Y ZoomRectPtr, so that zooming down to a closing * CDev icon always remembers to invalidate the icon in the main window. * Fixed bone-head design error from yesterday--it makes no sense to try * calling RebuildTheMemRec (I can't preserve fields, because the thing * gets built out of order and then sorted). Now I use FindListIndex to * find things when I need to mark them open. * ******************************************************************************* * * Version 2.1 for System 6.0.1 * * 16-Mar-92 DAL, v2.1d1 (for 6.1d2) * When overwriting an existing CDev.Data file, make sure to unlock * it first! The old Control Panel created the file with no Write * access, so we were failing to overwrite it (added one SetFileInfoGS). * When trying to open CDev.Data for writing, if we got an error we were * doing a Close with a stale reference number. Fixed. * * 2-Jul-92 DAL (2.1d6 on 6.0.1d6) * Action routine accepts reOpenAction ($000C) by calling the Open routine * to let it decide whether to do a SelectWindow or a tellFinderOpenWindow. * * 15-Jul-92 DAL (2.1d7 for 6.0.1d7) * Use new calls OpenResourceFileByID and InvalOneCtlByID. * Added SpecialEventHandling so Command-Ctrl-Esc works when my windows * are in front (with and without Option). * * 29-Jul-92 DAL (2.1d9 for 6.0.1d9) * Changed cpOpenCDev handler so the finderSaysBeforeOpen handler handles * it (only difference is a smaller pcount is allowed). * * 3-Sep-92 DAL (2.0d10 for 6.0.1d10) * Created new internalOpenCDev request handler to work how cpOpenCDev * used to work. Fixed bug introduced in d9 where opening a control * panel did not correctly mark it open & gray the icon, so you had * problems getting Help on it or opening it again (which should just * bring it to the front). * * 28-Oct-92 DAL (2.0d12 for 6.0.1d12) * On closing a control panel, call cbp to update daylight savings time * stuff. * * 2-Nov-92 DAL (still d12) * When calling FixMenuBar, sets System menu bar. * * 23-Nov-92 DAL (d12) * When calling HiliteMenu to hilite or unhilite the Apple menu, passes * flag values of $8001 and $8000 instead of 1 and 0. This makes the * hiliting work right even for a text-based Apple character with a * weird color table. * * 3-Mar-93 SS (for 6.0.1d14) * Added WhooshRect to the main window opening and closing. * * 16-Mar-93 SS (for 6.0.1d15) * Fixed a random memory trashing bug when there are no active CDEVs. * Removed QDAux load/startup code as not needed. * * 16-Mar-93 DAL (6.0.1d15) * Yanked out the muck-with-color-tables code and put it into QD Aux, * as UseColorTable and RestoreColorTable. * * Get rid of the extra color table swapping that happens when switching * between two windows that both need my color table. See nasty-looking * routines DeactivateIfNotMyWindowNext and IgnoreOneDeactivate. * * 22-Apr-93 DAL (6.0.1d17) * Change coypright to include 1993. * * 6-May-93 DAL (still 6.0.1d17) * Removed a couple of JSL UseStandardColorTable calls. * ******************************************************************************* ; ; VARIOUS NOTES for the future ; ; Criteria for accepting a finderSaysOpenFailed is not ideal. Should ; always accept based on filetype, display some kind of failure message? ; ; avoid palette flicker when switching between different CP windows ; ; ; Limitations to remove ; ; Data file path is local and hard-coded (*:System:CDevs:CDev.Data) ; ; NOTE: Some CDevs (like AppleShare 1.x) expect the CP to dispose of some memory ; for them. This could be tricky, since I have a lot of CDevs sharing the ; same memory IDs right now, or at least sharing the same Res Mgr ID. ; But I can allocate a separate ID and use SetHandleID when I load their ; rCDEVCode resource. Then they will call MMStartUp and allocate memory ; with that ID. I can either allocate new handles, or limit it to 15 open ; Control Panels & use the aux IDs. ; ; -------------- ; Options dialog ; -------------- ; "Geek options" dialog, set key equivalent? ; Set the initially-selected CDev (record by name) ; Set the key equivalent & modifiers to open up Control Panels (at MenuKey time) ; ; ------ ; issues ; ------ ; reduce memory fragmentation ; Make sure resources are always released appropriately ; Make the error handling bulletproof ; The "owbCDevNum" field seems to have turned out to be useless. Oops, take it out. ; ; -------------------- ; UNRESOLVED QUESTIONS ; -------------------- ; Need a wantCursor flag bit? How should this work? ; How can CDevs cleanly use extra tools? ; Can a CDev close itself cleanly? ; How can a CDev specify that it requires Control Panel 2.0? (can't; 1.0 doesn't check) ; Should CDevs be allowed to specify features of their window frame? ; Grow/zoom/scroll bars/grow box. ; ; Control Panel memory use--need some dynamic segments/etc. ******************************************************************************* * * In Control Panel 2.0, CDevs are opened in their own separate windows. You * can have more than one CDev open at a time, and they have more space available * because they don't have to share with the CDev list. * * What goes away? * * CDev.Init goes away, because CP 2.0 does that work at DeskShutDown time (the * system calls DeskShutDown at boot time, before launching the application). * * The old and BIG CDev.Data file goes away, and it's replaced by a smaller * version. * * How it works: * * ... * * The CP keeps the Resource Manager started up with the CP's memory ID whenever * the main window *or* any CDev windows are open. * * Whenever the Main window is open, the CP has data structures about all the * CDevs in the *:System:CDevs folder. * * NumCDevsOpen is the number of CDev windows open. MainWindPtr is non-NIL when * the main window is open. * ******************************************************************************* ******************************************************************************* DebugSymbols equ 0 include 'all.macros' include 'e16.event' include 'e16.window' include 'e16.resources' ExpandPathLength equ 300 ;6-Feb-92 DAL ******************************************************************************* * * Constants for main window * ******************************************************************************* TheListWidth equ 95 ;max width for icon name ******************************************************************************* * * Vectors * ******************************************************************************* ToBRAMSetup equ $e10094 ******************************************************************************* * * Filetype equates * ******************************************************************************* CDevFileType equ $00C7 CDevDataFileType equ $00F9 ******************************************************************************* * * System Version numbers * ******************************************************************************* MinQDVersion equ $0307 ;minimum QD version required (6.0) ******************************************************************************* * * rCDevFlags equates * ******************************************************************************* CanMakeInactive equ $8000 ;CP 2.0 does not use this updateSSFromBRAM equ $4000 ;call ToBRAMSetup after every HitCDEV wantAvailable1 equ $2000 ;future expansion wantAvailable2 equ $1000 ;future expansion wantEdit equ $0800 ;CDev wants Edit codes (Undo..Clear) wantRun equ $0400 wantHit equ $0200 wantRect equ $0100 wantAbout equ $0080 wantCreate equ $0040 wantEvents equ $0020 wantClose equ $0010 wantInit equ $0008 wantShutDown equ $0004 wantBoot equ $0002 wantMachine equ $0001 ******************************************************************************* * * CDev message codes * ******************************************************************************* MachineCDEV equ 1 BootCDEV equ 2 ;called at boot, no parameters ShutDownCDEV equ 3 ;not used InitCDEV equ 4 ;call after CreateCDEV (init controls) CloseCDEV equ 5 ;dispose of extra stuff EventsCDEV equ 6 ;give data1=event record before TaskMasterDA CreateCDEV equ 7 ;create controls, window=data1 AboutCDEV equ 8 ;data1=help window pointer RectCDEV equ 9 ;data1=pointer to rectangle to modify HitCDEV equ 10 ;data1=control handle, data2=control ID RunCDEV equ 11 ;no parameters EditCDEV equ 12 ;New for 2.0: CDev wants Edit events ******************************************************************************* * * Member Record structure for the List in the main window * ******************************************************************************* oMemName equ 0 oMemFlags equ 4 oMemIcon equ 6 oMemState equ 10 oMemCDevNumber equ 12 oMemItemPtr equ 14 LISTMEMSIZE equ 18 ******************************************************************************* * * The CDev data file on disk is a concatenation of: * CDevItemList (header + array of CDev items) * CDevPathsHandle (concatenation of wString pathnames) * CDevIconsHandle (contcatenation of icons) * * These are three separate handles in memory. * * CDevList offsets: * ******************************************************************************* oCDevListSignature equ 0 ;must be 'DV' ($5644) oCDevListVersion equ 2 ;must be $0001 oCDevListCount equ 4 ;number of CDev items following CDEVLISTHEADERSIZE equ 6 oCDevListItems equ 6 ;array of CDev items starts here ******************************************************************************* * * CDev Item structure * * WARNING: Be sure to update CDevItemTemplate if you change fields here! * ******************************************************************************* oCDevItemSize equ 0 ;number of bytes in this structure oCDevItemCreateDate equ oCDevItemSize+2 ;CDev file creation date oCDevItemPathOffset equ oCDevItemCreateDate+8 ;offset into CDevPathsHandle oCDevItemIconOffset equ oCDevItemPathOffset+4 ;offset into CDevIconsHandle oCDevItemState equ oCDevItemIconOffset+4 ;WORD: $0002 = open (like Icon mode) *** NOT USED *** oCDevItemWindow equ oCDevItemState+2 ;LONG: window pointer to CDev window oCDevItemFlags equ oCDevItemWindow+4 ;copy of rCDevFlags resource oCDevItemEnabled equ oCDevItemFlags+2 oCDevItemVersion equ oCDevItemEnabled+1 oCDevItemMachine equ oCDevItemVersion+1 oCDevItemReserved equ oCDevItemMachine+1 oCDevItemRect equ oCDevItemReserved+1 oCDevItemName equ oCDevItemRect+8 oCDevItemAuthor equ oCDevItemName+16 oCDevItemVerStr equ oCDevItemAuthor+33 CDEVITEMSIZE equ oCDevItemVerStr+9 FLAGSSIZE equ CDEVITEMSIZE-oCDevItemFlags ******************************************************************************* * * WindBlock structure offsets * (each CDev window's refcon points to one of these) * ******************************************************************************* owbTheCDevItem equ 0 ;first we have a whole CDev Item structure owbResFileNum equ CDEVITEMSIZE owbRawCDevNumber equ owbResFileNum+2 owbCDevCodePtr equ owbRawCDevNumber+2 owbCDevItemPtr equ owbCDevCodePtr+4 owbWindTitle equ owbCDevItemPtr+4 owbCDevPath equ owbWindTitle+20 ;class-1 string * CDEV PATH MUST BE LAST! It has a variable size. ******************************************************************************* ******************************************************************************* * * Main Window control IDs * ******************************************************************************* ListControlID equ 1 ;the list OpenControlID equ 2 ;"Open" button CDevHelpControlID equ 3 ;"Help" button CPHelpControlID equ 4 ;"About" button VersionControlID equ 5 ;the CP version (stat text) ******************************************************************************* * * SendRequest codes that we accept * ******************************************************************************* internalOpenCDev equ $9900 ;3-Sep-92 DAL for 6.0.1d10 cpOpenCDev equ $9000 cpOpenControlPanels equ $9001 finderSaysHello equ $0100 finderSaysGoodbye equ $0101 finderSaysBeforeOpen equ $0104 finderSaysOpenFailed equ $0105 systemSaysMenuKey equ $0f01 tellFinderOpenWindow equ $8002 ******************************************************************************* * * Structure of the cpOpenCDev / finderSaysBeforeOpen parm block * ******************************************************************************* opCount equ 0 oPathname equ opCount+2 oSmallRect equ oPathname+4 oFiletype equ oSmallRect+4 oAuxtype equ oFiletype+2 oFinderModifiers equ oAuxtype+4 oFinderIconHandle equ oFinderModifiers+2 oPrintFlag equ oFinderIconHandle+4 ******************************************************************************* ******************************************************************************* * * NDA header * ******************************************************************************* CtlPanelNDA proc export dc.l NDAOpen ; Pointer to the open routine dc.l NDAClose ; Pointer to the close routine dc.l NDAAction ; Pointer to the action routine glue dc.l NDAInit ; Pointer to the init routine glue NDAPeriod dc.w $FFFF ; How often the NDA gets NDAEventMask dc.w $A16E ; Describes what events the NDA wants dc.b '**' ; two place-holding characters NDAMenuLine dc.b 'Control Panels' dc.b '\H' myMenuID dc.b '**' ; \H and two place-holding characters dc.b 0 ; The menu item string terminator ******************************************************************************* MyMemID dc.w 0 export MainWindPtr MainWindPtr dc.l 0 export MainResFile MainResFile dc.w 0 ;this is 0 if our resource fork isn't open NumCDevsOpen dc.w 0 ;number of CDev windows open ******************************************************************************* import HandleActivate import WhatAccessRequest ******************************************************************************* * * GetMyMainMenuID * * Output: A = my NDA menu item's ID, to pass to OpenNDA to open me * ******************************************************************************* export GetMyMainMenuID GetMyMainMenuID lda >myMenuID rtl ******************************************************************************* * * AdjustNumCDevsOpen * * Input: -1, 0, or 1 in A to decrement, retrieve, or increment the number * of CDev windows open * * Output: A = new number of CDev windows open * ******************************************************************************* export AdjustNumCDevsOpen AdjustNumCDevsOpen clc adc >NumCDevsOpen sta >NumCDevsOpen rtl ******************************************************************************* * * NDAInit * * A=0 for shutdown * A<>0 for startup * ******************************************************************************* import cbp NDAInit phb phk plb pha ;save code on stack jsr CheckMinQDVersion pla ;added 14-May-91 DAL bcc @exit pha ;added 14-May-91 DAL pha _MMStartUp pla ora #$0100 sta MyMemID * Adjust for daylight savings time! jsl cbp ;check BRAM parameters (Stein's code) pla bne @startup jsr ndaInitShutdown bra @exit @startup jsr ndaInitStartup @exit plb rtl ******************************************************************************* * * ndaInitStartup -- our Init routine got called with A<>0 * ******************************************************************************* ndaInitStartup jsr InstallRequestProc rts ******************************************************************************* * * ndaInitShutDown--our Init routine got called with A=0 * * Do CDev.Init tasks here--we need to call the BootCDEV routine * of every CDev that wants it. * ******************************************************************************* ndaInitShutdown jsr RemoveRequestProc lda bootedFlag bne @booted jsr DoWantBoot sec ror bootedFlag @booted rts bootedFlag dc.w 0 ;nonzero if we already did boot messages ******************************************************************************* * * DoWantBoot * * Send the BootCDEV message to every CDev that has its wantBoot flag bit set. * ******************************************************************************* DoWantBoot jsl StartResourceManager jsl GetCDevList phd pea 0 ;index = 0..CDevListCount-1 pushlong CDevItemsHandle pha pha ;space for path pointer tsc tcd @pathptr equ 1 @itemPtr equ @pathptr+4 @counter equ @itemPtr+4 ldy #2 lda [@itemPtr],y tax lda [@itemPtr] sta @itemPtr stx @itemPtr+2 ;dereffed CDevItemsHandle into pointer @walk lda @counter cmp CDevListCount bcs @done ldy #oCDevItemFlags lda [@itemPtr],y and #wantBoot beq @skipThis jsr @BootThisCDev @skipThis clc lda @itemPtr adc #CDEVITEMSIZE sta @itemPtr bcc @1 inc @itemPtr+2 @1 inc @counter bra @walk @done pla pla ;pulled pathname pointer pla pla ;pulled CDev item pointer pla ;pulled counter pld jsl DisposeCDevList jsl StopResourceManager rts ******************************************************************************* * * @BootThisCDev * * @itemPtr points to the CDev's item record * @pathPtr is available for us to use * * We need to draw the CDev's icon on the boot screen, * open its resource fork, load its code, and then * call the boot message. * * Output: none * ******************************************************************************* @BootThisCDev *** draw the boot-time icon ldy #oCDevItemIconOffset+2 lda [@itemPtr],y pha dey dey lda [@itemPtr],y pha phd pushlong CDevIconsHandle tsc tcd ldy #2 lda [1],y tax lda [1] clc adc 7,s sta 1 txa adc 7+2,s sta 3 pla plx pld ;icon pointer in XA ply ply ;throw away icon offset pea 0 pea 0 ;no string for ShowBootInfo phx pha _ShowBootInfo *** done drawing icon lda CDevPathsHandle+2 ldy CDevPathsHandle sta @pathPtr+2 sty @pathPtr ldy #2 lda [@pathPtr],y tax lda [@pathPtr] sta @pathPtr stx @pathPtr+2 ldy #oCDevItemPathOffset clc lda @pathPtr adc [@itemPtr],y sta @pathPtr lda @pathPtr+2 iny iny adc [@itemPtr],y sta @pathPtr+2 pha ;space for OpenResourceFile result pea 1 ;access = read-only pea 0 pea 0 ;map address pei <@pathPtr+2 pei <@pathPtr jsr GetAndFixPrefs ;3-Dec-91 DAL _OpenResourceFile jsr RestorePrefs ;3-Dec-91 DAL plx bcs @outtahere phx ;keep for CloseResourceFile pha pha ;space for LoadResource pea rCDevCode pushlong #1 ;ID=1 _LoadResource plx pla bcs @couldNotLoadCode pha phx phd tsc tcd ldy #1 ;deref code handle into JSL operand lda [3],y sta @toTheCDev+2 lda [3] sta @toTheCDev+1 pld ;;; ;pla ;;; ;pla ;pull pointer ;;; ;pha ;;; ;pha ;push CDev result space pea BootCDEV pushlong #bootResultBuffer ;data1 = buffer pointer stz bootResultBuffer lda #0 pha pha ;data2 = reserved @toTheCDev jsl >$777777 ;self-modified pla pla ;(ignore CDev result) lsr bootResultBuffer bcc @noXout jsr drawXicon @noXout @closeAndExit _CloseResourceFile @outtahere rts *** If we couldn't init the CDev, "X" out its icon @couldNotLoadCode _CloseResourceFile jsr drawXicon pea $000c ;operation failed _SysBeep2 rts * * bootResultBuffer * * +000: bit 0 = draw an X through me * * Other bytes are reserved for future definition * bootResultBuffer dc.w 0,0,0,0,0,0,0,0 ******************************************************************************* * * drawXicon -- draw our rIcon("X") resource over the previous icon * ******************************************************************************* drawXicon pha pha ;space for LoadResource pea rIcon pushlong #$07FF0058 ;Sys.Resources "X" icon _LoadResource pla plx bcs @ohDang phd ;XA = icon handle phx pha tsc tcd ldy #4 ;offset to attributes lda [1],y ora #$8000 sta [1],y ;locked handle dey dey ;Y=2 for dereference lda [1],y ora #$8000 ;set bit 31 of icon pointer (overwrite icon) tax lda [1] ;XA now = icon pointer, with bit 31 set pea 0 pea 0 ;no string for ShowBootInfo phx pha ;icon pointer (bit 31 set = overwrite) _ShowBootInfo ldy #4 ;offset to attributes lda [1],y asl a lsr a sta [1],y ;unlocked handle ply ply pld pea 2 ;purge level pea rIcon pushlong #$07FF0058 _ReleaseResource @ohDang rts ******************************************************************************* * * NDAOpen--returns window pointer on stack * ******************************************************************************* result equ 5 ;RTL address and B on the stack already NDAOpen phb phk plb lda #0 sta result,s sta result+2,s ;anticipate no window jsr CheckMinQDVersion bcs @systemOK *** Use an old call to beep if the System version is too old! @badSystem _SysBeep ;don't use SysBeep2, it isn't available! _SysBeep brl @outtaHere @systemOK *** Start up the List Manager, we'll need it! pea 0 _ListStatus pla bne @gotListMgr pea $001C ;List Manager pea $0303 ;version 3.3 _LoadOneTool bcs @badSystem _ListStartUp @gotListMgr *** removed, QDAux is loaded/started by WindStartup. 16-Mar-93 SS ;*** Start up QD Aux, we'll need it! ; pea 0 ;;;; _QDAuxStartUp ;*** fixed 7-Feb-92 DAL -- typo! ; _QDAuxStatus ;*** end 7-Feb-92 ; pla ; bne @gotQDAux ; ; pea $0012 ;QDAux ; pea $0304 ;version 3.4 ; _LoadOneTool ; bcs @badSystem ; _QDAuxStartUp ;@gotQDAux * * If the Option key is down, try to open the *:System:CDevs folder * instead of opening the NDA window * lda >$e0c025 and #$0040 ;check option key beq @dontTryFinder jsr TryFinderWindow bcs @dontTryFinder brl @outtaHere @dontTryFinder pha pha _GetPort pla sta oldPort pla sta oldPort+2 _WaitCursor pha _GetCurResourceApp pla sta oldResApp bcs @error ;possible if Resource Mgr not here! jsl StartResourceManager bcs @error jsr MakeMainWindow bcs @error stx MainWindPtr+2 sta MainWindPtr jsr MakeVersionNumber jsr PushMainWindPtr _SetSysWindow jsr PushMainWindPtr _SetPort jsl GetCDevList jsr FixUpListControl lda MainWindPtr+2 sta result+2,s lda MainWindPtr sta result,s jsr WhooshOpen ;*** 3-Mar-93 SS jsr PushMainWindPtr _ShowWindow *** force main window to update right away jsr PushMainWindPtr _BeginUpdate jsl MainContentDraw jsr PushMainWindPtr _EndUpdate @error lda oldResApp pha _SetCurResourceApp ;restore ResourceApp pushlong oldPort _SetPort _InitCursor @outtaHere plb rtl oldResApp dc.w 0 oldPort dc.l 0 ******************************************************************************* * * TryFinderWindow -- if the Finder is around, let it open up * *:System:CDevs for us * ******************************************************************************* TryFinderWindow pea tellFinderOpenWindow pea 1 ;by String pushlong #FinderString pushlong #thePathname pushlong #FndrBuff ;output _SendRequest rts FinderString str 'Apple~Finder~' thePathname dc.b 14,0,'*:System:CDevs' FndrBuff dc.w 0 ;recvCount (result) dc.w 0 ;finderResult (result) dc.l 0 ;window pointer (result) ******************************************************************************* * * CheckMinQDVersion * * Returns SEC if the QuickDraw version is high enough * ******************************************************************************* CheckMinQDVersion pea 0 _QDVersion pla and #$0fff cmp #MinQDVersion rts ******************************************************************************* * * MakeVersionNumber * * Set the text for the VersionControl (static text), by loading our * rVersion(1) resource and calling VersionString. * ******************************************************************************* MakeVersionNumber lda MainResFile jsr UseOnlyThisFile pha phx jsr @MakeVerNum plx pla jsr RestoreOldFile rts @MakeVerNum pha pha pea $8029 ;rVersion pushlong #1 _LoadResource bcs @ouch phd tsc tcd ldy #4 lda [3],y ora #$8000 sta [3],y ;lock the handle dey dey lda [3],y ;dereference it tax lda [3] sta 3 stx 5 pea 0 ;flags for VersionString lda [3],y ;Y is still 2 from above pha lda [3] pha ;version number to convert pushlong #versionBuffer _VersionString pld pla pla ;throw out pointer pea $ffff ;dispose flag pea $8029 ;rVersion pushlong #1 _ReleaseResource pushlong #versionBuffer+1 jsr PushVersionHandle _SetCtlTitle lda versionBuffer and #$00ff pha jsr PushVersionHandle _SetCtlValue ;value is the length of the text rts @ouch pla pla rts versionBuffer ds.b 10 PushVersionHandle lda #VersionControlID brl PushCtlHandle ******************************************************************************* * * StartResourceManager * * If we don't already have the Resource Manager started, then: * Start up the resource manager * Log in the CodeResConverter for rCDEVCode * Open the NDA's resource fork with as-allowed permissions * * Returns CLC if successful. * ******************************************************************************* export StartResourceManager StartResourceManager clc lda MainResfile bne @done ; pha ; _MMStartUp ; _ResourceStartUp ; ;*** Log in the CodeResConverter for rCDEVCode ; pha ; pha ; _GetCodeResConverter ; pea rCDEVCode ; pea 1 ;log in as Application converter ; _ResourceConverter ; ;* for OpenResourceFile, push requested access, map handle (0), and pathname ; pha ;space for OpenResourceFile result ; ; jsl WhatAccessRequest ;read-only for AppleShare! ; pha ; ; lda #0 ; pha ; pha ;pushed 0 for resource map ; jsr GetMyPathname ; phy ; pha ; jsr GetAndFixPrefs ; _OpenResourceFile ; jsr RestorePrefs ;preserves Carry from OpenResourceFile ; plx ; bcs @error ; stx MainResFile ;@error ;@done rtl *** 15-Jul-92 DAL -- use OpenResourceFileByID, mainly to exercise it pha ;space for OpenResourceFileByID jsl WhatAccessRequest ;read-only for AppleShare pha ;reqAccess for OpenResourceFileByID pha ;space for MMStartUp _MMStartUp ;pass ID to OpenResourceFileByID jsr GetAndFixPrefs ldx #$2E1E jsl $e10000 ; _OpenResourceFileByID jsr RestorePrefs ;preserves Carry from OpenResourceFile pla ;discard result bcs @done *** Log in the CodeResConverter for rCDEVCode pha pha _GetCodeResConverter pea rCDEVCode pea 1 ;log in as Application converter _ResourceConverter pha _GetCurResourceFile pla sta MainResFile *** end 15-Jul-92 @done rtl ******************************************************************************* * * StopResourceManager * * If there are no CDev windows open and the main window isn't open either, * shut down the resource manager. * ******************************************************************************* export StopResourceManager StopResourceManager phb phk plb ldx MainResFile beq @dontStop ;we don't seem to have started it! lda NumCDevsOpen bne @dontStop lda MainWindPtr+1 bne @dontStop lda MainResFile ora #$8000 ;force it closed! pha _CloseResourceFile stz MainResFile _ResourceShutDown @dontStop plb rtl ******************************************************************************* * * UseOnlyThisFile * * Input: Resource file number in A * * Output: Current resource file is set, depth is 1 * Previous file in A, previous depth in X * ******************************************************************************* UseOnlyThisFile pha pha ;space for cur resource file _GetCurResourceFile pha ;space for old depth pea 1 _SetResourceFileDepth lda 5,s ;retrieve input pha _SetCurResourceFile plx ;get old depth pla ;get old file ply ;throw away copy of input rts ******************************************************************************* * * RestoreOldFile * * Input: Resource file in A, depth in X * ******************************************************************************* RestoreOldFile pha ;resource file number phx ;space for old depth phx ;new depth _SetResourceFileDepth plx ;throw away _SetCurResourceFile rts ;;; Not needed with OpenResourceFileByID ;******************************************************************************* ;* ;* GetMyPathname ;* ;* Input: none ;* ;* Output: pointer to class-one pathname in YA ;* ;******************************************************************************* ;GetMyPathname pha ; pha ;space for LGetPathname2 ; pha ;space for MMStartUp ; _MMStartUp ; pea 1 ;file number 1 ; _LGetPathname2 ; pla ; ply ; rts ******************************************************************************* * * MakeMainWindow--return pointer in XA * ******************************************************************************* MakeMainWindow import UseStandardPalette *** Removed 6-May-93 DAL ;;; jsl UseStandardPalette ;22-Mar-91 DAL pha ;15-Sep-91 DAL _GetCurResourceFile ; lda MainResFile ; pha ; _SetCurResourceFile ; jsr SetUpMainWindowLocation ;4-Sep-91 DAL pha pha pushlong #0 ;title pushlong #0 ;refcon pushlong #MainContentDraw pushlong #0 ;custom defproc pea 2 ;by Resource pushlong #1 ;resource ID pea rWindParam1 _NewWindow2 lda 5,s pha _SetCurResourceFile pla plx ;XA = window pointer ply ;discard old Resource File setting rts ******************************************************************************* * * SetUpMainWindowLocation * * From rTwoRects(1), get the 320 or 640 rectangle and cram it into the * rWindParam(1) resource. * ******************************************************************************* SetUpMainWindowLocation pha pha pea rTwoRects pushlong #1 _LoadResource plx ply bcc @noDang brl @dang @noDang phy phx ;re-push rTwoRects(1) handle phd tsc tcd ldy #4 lda [<3],y ora #$8000 sta [<3],y ;locked rTwoRects dey dey lda [<3],y tax lda [<3] sta <3 stx <5 ;derefed rTwoRects jsr Bump3by8for640 pei <5 pei <3 ;push source pointer for BlockMove pha pha pea rWindParam1 pushlong #1 _LoadResource phd tsc tcd ldy #2 clc lda [3] adc #$3e ;offset to wPosition tax lda [3],y adc #0 sta <5 stx <3 pld ;left dest pointer for BlockMove pushlong #8 ;size of a rect _BlockMove ;move into rWindParam1 template pld plx plx ;discard long pha pha pea rTwoRects pushlong #1 _LoadResource _HUnlock @dang rts Bump3by8for640 pha _GetMasterSCB pla and #$0080 beq @ok lda #8 ;offset to 640 rectangle clc adc <3 sta <3 bcc @ok inc <5 @ok rts ******************************************************************************* * * RecordMainWindPosition -- if window moved, write its new position to the * rTwoRects(1) resource * ******************************************************************************* RecordMainWindPosition ; check if resource fork is writeable?? pha pha pea rTwoRects pushlong #1 _LoadResource plx ply bcc @noDang brl @dang @noDang phy phx phd tsc tcd ldy #4 lda [<3],y ora #$8000 sta [<3],y ;locked rTwoRects dey dey lda [<3],y tax lda [<3] sta <3 stx <5 ;derefed rTwoRects jsr Bump3by8for640 pha pha _GetPort jsr PushMainWindPtr _SetPort stz theWindPos stz theWindPos+2 pushlong #theWindPos _LocalToGlobal _SetPort lda theWindPos cmp [3] bne @dirty lda theWindPos+2 ldy #2 cmp [3],y beq @notDirty @dirty pei 5 pei 3 ldy #2 lda [3],y eor #$ffff inc a ;-left pha lda [3] ;-top eor #$ffff inc a pha _OffsetRect pei 5 pei 3 lda theWindPos+2 pha lda theWindPos pha _OffsetRect pea $ffff ;true pea rTwoRects pushlong #1 _MarkResourceChange @notDirty pld plx plx ;discard long @dang rts theWindPos dc.w 0,0 ******************************************************************************* * * FixUpListControl * * Inputs: * CDevListCount -- number of CDevs * CDevItemsHandle * CDevPathsHandle * CDevIconsHandle * * Outputs: * The main window's list control is up to date * ******************************************************************************* FixUpListControl lda CDevListCount ;make sure there are some! *** 16-Mar-93 SS bne @some stz ListMemHandle ;otherwise, obliterate the handle, stz ListMemHandle+2 ; skip the devastating SelectMember2, brl @none ; and just dim the buttons. @some pha pha ;space for NewHandle result pha pha ;space for Multiply result pea LISTMEMSIZE pha ;(CDevListCount) _Multiply ;leave result on stack for NewHandle jsr PushDataID pea $C000 ;locked and fixed pha pha ;location (ignored) _NewHandle pla sta ListMemHandle pla sta ListMemHandle+2 ;;; lda #0 ;a=0 to build list for the first time (7-Feb-92 DAL) ;;; jsr CallBuildMemRec pushlong ListMemHandle pushlong CDevItemsHandle pushlong CDevIconsHandle pushlong CDevPathsHandle jsr BuildTheMemRec pushlong #MainListDraw pea 1 ;start pushlong ListMemHandle pea 1 ;ListMemHandle is a handle lda CDevListCount pha jsr PushListControl _NewList2 pushlong #1 ;case-insensitive jsr PushListControl _SortList2 pea 1 jsr PushListControl _SelectMember2 @none jsr SetButtonStates rts ; export RebuildMemRec ;RebuildMemRec lda #$ffff ;A=$FFFF to rebuilt list (preserve selection) (7-Feb-92 DAL) ; jsr CallBuildMemRec ; pushlong #1 ;case-insensitive ; jsr PushListControl ; _SortList2 ; jsr SetButtonStates ; rts ;CallBuildMemRec ;;;; tax ;save build/rebuild flag ; pushlong ListMemHandle ; pushlong CDevItemsHandle ; pushlong CDevIconsHandle ; pushlong CDevPathsHandle ;;;; txa ;build/rebuild flag ; jsr BuildTheMemRec ; rts ******************************************************************************* * * PushListControl -- push the handle to the main window's list control * ******************************************************************************* PushListControl lda #ListControlID brl PushCtlHandle ******************************************************************************* * * BuildTheMemRec * * Stack Inputs: * HANDLE ListMemHandle * HANDLE CDevItemsHandle * HANDLE CDevIconsHandle * HANDLE CDevPathsHandle * * Other inputs: * CDevListCount * * Outputs: * The member record handle is done! It contains pointers into the other * handles, which had better be locked at this point. * ******************************************************************************* BuildTheMemRec phd tsc tcd @oldD equ 1 @rts equ @oldD+2 @paths equ @rts+2 @icons equ @paths+4 @items equ @icons+4 @memrec equ @items+4 ldy #2 lda [@paths],y tax lda [@paths] sta @paths stx @paths+2 lda [@icons],y tax lda [@icons] sta @icons stx @icons+2 lda [@items],y tax lda [@items] sta @items stx @items+2 lda [@memrec],y tax lda [@memrec] sta @memrec stx @memrec+2 stz CDevIndex ;count from 0 up, numbering the CDevs lda CDevListCount beq @done @next pha ldy #oMemName clc lda @items adc #oCDevItemName sta [@memrec],y iny iny lda @items+2 adc #0 sta [@memrec],y ldy #oCDevItemIconOffset+2 lda [@items],y tax dey dey lda [@items],y clc adc @icons ldy #oMemIcon sta [@memrec],y txa adc @icons+2 iny iny sta [@memrec],y ldy #oMemCDevNumber lda CDevIndex sta [@memrec],y lda #0 ldy #oMemFlags sta [@memrec],y *** added 6-Feb-92 DAL -- If the CDev is known to be open, set the Open flag ldy #oCDevItemWindow+1 lda [@items],y beq @storeState lda #2 ;open @storeState *** end 6-Feb-92 ldy #oMemState sta [@memrec],y *** added 6-Feb-92 DAL -- store the item pointer in the member record ldy #oMemItemPtr lda <@items sta [<@memrec],y iny iny lda <@items+2 sta [<@memrec],y *** end 6-Feb-92 clc lda @memrec adc #LISTMEMSIZE sta @memrec bcc @1 inc @memrec+2 @1 clc lda @items adc #CDEVITEMSIZE sta @items bcc @2 inc @items+2 @2 inc CDevIndex pla dec a bne @next @done pld plx tsc clc adc #16 tcs phx rts cdevIndex dc.w 0 ******************************************************************************* * * MainListDraw * * Stack on entry: * * | previous contents | * |-------------------| * | rectPtr | LONG * |-------------------| * | memberRecordPtr | LONG * |-------------------| * | ListCtlHandle | LONG * |-------------------| * | RTL Address | 3 BYTES * |-------------------| * <-- stack pointer * ******************************************************************************* * * Member Record format: * * +000: oMemName Name pointer (Pascal string) * +004: oMemFlags member flags * +006: oMemIcon Icon Pointer * +010: oMemState State to draw icon in (the Open bit is valid) * +012 LISTMEMSIZE * ******************************************************************************* MainListDraw phd tsc tcd @oldD equ 1 @RTL equ @oldD+2 @ListCtlHndl equ @RTL+3 @memRecPtr equ @ListCtlHndl+4 @rectPtr equ @memRecPtr+4 @InputSize equ 12 ;number of bytes to strip * Make a copy of the rect so we can fiddle with it ldy #6 tyx @copyR lda [<@rectPtr],y sta >@LocalRect,x dey dey dex dex bpl @copyR lda #^@LocalRect ldx #@LocalRect sta <@rectPtr+2 stx <@rectPtr * Erase the rectangle pei <@rectPtr+2 pei <@rectPtr _EraseRect * Draw the CDev's icon ldy #oMemIcon+2 lda [<@memRecPtr],y pha dey dey lda [<@memRecPtr],y pha ;pushed icon jsr @ComputeIconModeWord phx ;pushed mode jsr @ComputeIconXCoord pha ;pushed X coordinate lda [<@rectPtr] ;top inc a inc a pha ;pushed Y coordinate (rect.top+2) _DrawIcon ;icon, mode, x, y * Now draw the CDev's name *** Preserve CharExtra pha pha _GetCharExtra pha ;space for StringWidth result ldy #oMemName+2 lda [<@memRecPtr],y pha lda [<@memRecPtr] pha _StringWidth ;width at 1,s *** Of the string is too wide, use SetCharExtra(-1) lda 1,s cmp #TheListWidth bcc @widthOK pea $ffff pea 0 _SetCharExtra ldy #oMemName+2 lda [<@memRecPtr],y pha lda [<@memRecPtr] pha _StringWidth ;width at 1,s @widthOK ldy #6 ;right lda [<@rectPtr],y sec ldy #2 ;left sbc [<@rectPtr],y sec sbc 1,s *** Do a sign-friendly divide-by-2 cmp #$8000 ror a clc ldy #2 ;left adc [<@rectPtr],y sta [<@rectPtr],y ;stored new Left value pha ;MoveTo(left,bottom-2) ldy #4 ;bottom lda [<@rectPtr],y dec a dec a pha ;pushed bottom-2 _MoveTo ldy #oMemName+2 lda [<@memRecPtr],y pha lda [<@memRecPtr] pha _DrawString ldy #oMemFlags lda [<@memRecPtr],y and #$0080 beq @noInvertName * bottom -= 1; top = bottom-9; left--; right=left+width+1 ldy #4 lda [<@rectPtr],y dec a sta [<@rectPtr],y sec sbc #9 sta [<@rectPtr] ;store new top (offset 0) ldy #2 ;left lda [<@rectPtr],y dec a sta [<@rectPtr],y clc adc 1,s inc a ldy #6 ;right sta [<@rectPtr],y pei <@rectPtr+2 pei <@rectPtr _InvertRect @noInvertName pla ;discard StringWidth result _SetCharExtra ;23-Jul-91 DAL -- restore CharExtra * Remove the 12 bytes of input parameters and return pld lda 2,s sta 2+@InputSize,s lda 1,s sta 1+@InputSize,s tsc clc adc #@InputSize tcs rtl @LocalRect ds.b 8 ******************************************************************************* * * ComputeIconXCoord * * Inputs: @rectPtr and Master SCB * * Output: Return value in A * ******************************************************************************* @ComputeIconXCoord ldy #6 ;right lda [<@rectPtr],y sec ldy #2 ;left sbc [<@rectPtr],y lsr a sec sbc #28 clc ldy #2 ;left adc [<@rectPtr],y pha * * If 320 mode then IconX += 14 * pha _GetMasterSCB pla and #$0080 bne @not320 pla clc adc #14 pha @not320 lda 1,s ;just force it even! and #1 clc adc 1,s plx ;discard rts ******************************************************************************* * * ComputeIconModeWord * * Start with the mode word in the member record. If list member * is selected, turn on the Selected bit. * * (Return value in X.) * ******************************************************************************* @ComputeIconModeWord ldy #oMemState lda [<@memRecPtr],y and #$fffe ;ignore the Selected bit tax ldy #oMemFlags lda [<@memRecPtr],y and #$0080 beq @notSelected inx ;turn on the Selected bit @notSelected rts ******************************************************************************* * * MainContentDraw -- Bank register not set! * ******************************************************************************* MainContentDraw pha _GetCurResourceFile lda >MainResFile pha _SetCurResourceFile pha pha _GetPort _DrawControls _SetCurResourceFile rtl ******************************************************************************* * * PushMainWindPtr -- put window pointer on stack above RTS address * ******************************************************************************* export PushMainWindPtr PushMainWindPtr plx lda MainWindPtr+2 pha lda MainWindPtr pha phx rts ******************************************************************************* * * NDAClose -- close the main window * ******************************************************************************* import DeactivateIfNotMyWindowNext NDAClose phb phk plb lda MainWindPtr+1 beq @notOpen pha _GetCurResourceFile lda MainResFile pha _SetCurResourceFile ; pha ; pha ; _GetPort ; jsr PushMainWindPtr ; _SetPort ;; Don't need to do anything here.... ; _SetPort ;restore old port jsr RecordMainWindPosition jsr PushMainWindPtr ;*** 3-Mar-93 SS _HideWindow ;*** 3-Mar-93 SS jsr WhooshClosed ;*** 3-Mar-93 SS jsr PushMainWindPtr _CloseWindow stz MainWindPtr stz MainWindPtr+2 ;;; lda #0 ;;; jsl HandleActivate jsl DeactivateIfNotMyWindowNext ;17-Mar-93 DAL _SetCurResourceFile jsl StopResourceManager jsl DisposeListMemHndl ;6-Feb-92 DAL jsl CondDisposeCDevList ;get rid of it if we're done! @notOpen plb rtl ******************************************************************* 3-Mar-93 SS * * Whoosh Open & Closed * * input: none * * output: none * ******************************************************************************* WhooshOpen lda #$8000 bra dirSet WhooshClosed lda #0 dirSet pha pea 0 pushlong #smallRect pha ; setup the bigRect pha jsr PushMainWindPtr _GetStructRgn phd tsc tcd lda [3] ;deref the handle to the region tax ldy #2 lda [3],y sta 3+2 stx 3 ldy #6+2 @loop lda [3],y sta bigRect-2,y dey dey bne @loop pld pla pla pushlong #bigRect _WhooshRect rts smallRect dc.w 14,14,15,15 bigRect dc.w 00,00,00,00 ******************************************************************************* ******************************************************************************* * * NDAAction for the main window * * A=action * YX=pointer * ******************************************************************************* NDAAction phd phb phk plb pha ;action = <5 phy ;ptr high = <3 phx ;ptr low = <1 tsc tcd pha _GetCurResourceFile lda MainResFile pha _SetCurResourceFile pha pha _GetPort ;leave old port on stack jsr PushMainWindPtr _SetPort lda <5 asl a tax cmp #actionEnd-actionTable bcs @tooBig jsr (actionTable,x) @tooBig _SetPort ;restore old port _SetCurResourceFile ;added 1-Apr-91 DAL plx ;pull ptr low plx ;pull ptr high plx ;pull action plb pld lda #0 ;return value rtl actionTable dc.w null ;0 = unused dc.w doEvent ;1 = eventAction dc.w doRun ;2 = runAction dc.w doCursor ;3 = cursorAction dc.w null ;4 = unused dc.w doUndo ;5 = undoAction dc.w doCut ;6 = cutAction dc.w doCopy ;7 = copyAction dc.w doPaste ;8 = pasteAction dc.w doClear ;9 = clearAction *** added 2-Jul-92 DAL dc.w doSysClick ;10 = sysClickAction dc.w doOptionalClose ;11 = optionalCloseAction dc.w doReOpen ;12 = reOpenAction *** end 2-Jul-92 actionEnd ******************************************************************************* * * Boring actions received by the Main window * ******************************************************************************* doSysClick doOptionalClose doCursor doUndo doCut doCopy doPaste doClear null rts ******************************************************************************* * * doReOpen (new routine 2-Jul-92 DAL) * * We are already open, and they chose use again from the Apple menu (or * NDAOpen happened some other way, like thru our key equivalent). * * If the Option key is down, do the Finder window thang. Otherwise * let the system bring us to the front as usual. * * If we already took care of everything, stuff a $0001 at [<1] to tell * the system so. * ******************************************************************************* doReOpen lda >$e0c025 and #$0040 ;check option key beq @normal jsr TryFinderWindow bcs @normal lda #1 sta [<1] @normal rts ******************************************************************************* * * doRun -- run event received by the main window * ******************************************************************************* doRun rts ******************************************************************************* * * doEvent -- Event Manager event received by the Main window * ******************************************************************************* import DeactivateIfNotMyWindowNext doEvent jsl SpecialEventHandling ;added 15-Jul-92 DAL pei 3 pei 1 pushlong #myTaskRec pushlong #16 _BlockMove *** make Command-O like Return lda myTaskWhat cmp #3 ;keyDown event bne @notCommandKey lda myTaskMods and #$0100 beq @notCommandKey lda myTaskMsg *** do Command-? or Command-/ cmp #'?' beq @isQuestion cmp #'/' bne @notQuestion @isQuestion *** blink the Help button & do Help lda #'H' sta myTaskMsg bra @cmdKeyDone @notQuestion and #$00df cmp #'O' ;allow "o" or "O" bne @notCommandO lda #13 ;Return sta myTaskMsg bra @cmdKeyDone @notCommandO @notCommandKey @cmdKeyDone pha ;result space pha ;input mask (ignored) pushlong #myTaskRec _TaskMasterDA pla cmp #activateEvt bne @notActivate lda myTaskMods *** added 17-Mar-93 DAL and #1 bne @normal jsl DeactivateIfNotMyWindowNext rts @normal *** end 17-Mar-93 jsl HandleActivate rts @notActivate cmp #wInControl bne @notControlHit * * Now myTaskData2 = control handle, myTaskData4 = control ID * lda myTaskData4 @hitControlA asl a tax cmp #@ctlTableEnd-@ctlTable bcs @bogus jsr (@ctlTable,x) @bogus @notControlHit rts @ctlTable dc.w @null ;0 dc.w hitList ;1 dc.w hitOpen ;2 dc.w hitHelp ;3 dc.w hitAbout ;4 dc.w hitVersion ;5 @ctlTableEnd @null rts ******************************************************************************* * * hitOpen -- they want to open all the selected CDevs * ******************************************************************************* hitOpen pha pha _GetCursorAdr _WaitCursor @loop pha ;space for ResetMember2 result jsr PushListControl _ResetMember2 pla beq @done jsr OpenCDevNumberA bra @loop @done jsr SetButtonStates _SetCursor rts ******************************************************************************* * * OpenCDevNumberA * * Input: A = item number from the main list (1=first) * * WARNING: Stack frame shared between OpenCDevNumberA, LocateCDevNumberA, * DerefAYToPtr, and AboutCDevNumberA * ******************************************************************************* import globalErrorCode:data OpenCDevNumberA phd pha pha ;space for pointer dec a ;make cdev number 0-based sta TheRawCDevNumber pha ;raw cdev number pha ;translated cdev number tsc tcd @cdevnum equ 1 ;position in the CDevItem list @rawcdevnum equ @cdevnum+2 ;position in MemRec (sorted list) @ptr equ @rawcdevnum+2 jsr LocateCDevNumberA ;returns path ptr in @ptr lda <@ptr+2 ldy <@ptr sta srqPath+2 sty srqPath lda @rawcdevnum jsr CalcZoomRect sta zoomRectPtr+2 sty zoomRectPtr jsr InvalZoomRect *** If already open, just bring it to the front lda TheItemPtr+2 ldy TheItemPtr sta <@ptr+2 sty <@ptr ldy #oCDevItemWindow+1 lda [<@ptr],y beq @notAlreadyOpen iny lda [<@ptr],y pha dey dey lda [<@ptr],y pha _SelectWindow brl @exit @notAlreadyOpen ;;; pea cpOpenCDev pea internalOpenCDev ;3-Sep-92 DAL pea $8002 ;how = by user ID, stop after acceptance pea 0 pha _MMStartUp ;target = my own memory ID pla ora #$0100 pha pushlong #srqParmBlock pushlong #0 ;output buffer _SendRequest bcc @1 tax lda >globalErrorCode cmp #$ffff ;flag = MachineCDEV returned 0 beq @quietExit txa jsr ErrorWindowA @quietExit brl @exit @1 *** Redraw the source icon as Open jsr InvalZoomAndRedraw *** If Option is down, schedule closing the main window lda MyTaskMods and #$0800 ;option key beq @noOption pha ;space for result pushlong #CloseMainWindTask _SchAddTask pla @noOption @exit pla ;throw away CDev number pla ;throw away the raw cdev number pla pla ;throw away pointer pld rts entry globalErrorCode globalErrorCode dc.w 0 ******************************************************************************* * * CloseMainWindTask -- if the main window is open, close it! * ******************************************************************************* CloseMainWindTask php rep #$30 phb phk plb lda MainWindPtr+1 beq @exit lda MainWindPtr+2 pha lda MainWindPtr pha _CloseNDAByWinPtr @exit plb plp rtl ******************************************************************************* * * ClosingCDevWindow * * Inputs: * LONG window pointer being closed * * Action taken: * Hide the window and zoom it closed to the right place, if its icon is * visible. * Mark the icon closed and invalidate the icon rectangle. * Zero out the window pointer field of the CDev Item. * ******************************************************************************* export ClosingCDevWindow entry FindListIndex ClosingCDevWindow phd pha pha ;space for @refcon pha pha ;space for @ItemPtr tsc tcd @itemPtr equ 1 @refcon equ @itemPtr+4 @oldD equ @refcon+4 @rtl equ @oldD+2 @window equ @rtl+3 pei <@window+2 pei <@window _HideWindow pha pha pei <@window+2 pei <@window _GetWRefCon pla sta <@refcon pla sta <@refcon+2 ldy #owbCDevItemPtr+1 lda [<@refcon],y bne @1 brl @noItemStruct @1 ldy #owbCDevItemPtr lda [<@refcon],y sta <@itemPtr iny iny lda [<@refcon],y sta <@itemPtr+2 ;;; ldy #owbRawCDevNumber ;;; lda [<@refcon],y *** added 6-Feb-92 DAL -- find the real position of this CDev in the list lda <@itemPtr+2 ldy <@itemPtr jsr FindListIndex ldy #owbRawCDevNumber sta [<@refcon],y *** end 6-Feb-92 sta TheRawCDevNumber ; ; zoom closed if possible ; ; Rect1 = LocalToGlobal on the portrect of @window ; Rect2 = the icon's rectangle (calczoomrect) ; lda MainWindPtr+1 bne @isOpen brl @mainWindowClosed @isOpen pha pha _GetPort pei <@window+2 pei <@window _SetPort pushlong #theWindRect _GetPortRect pushlong #theWindRect _LocalToGlobal pushlong #theWindRect+4 _LocalToGlobal jsr PushMainWindPtr _SetPort pea 0 ;flags (zoom closed) pea 0 ;flags (low word) ldy #owbRawCDevNumber lda [<@refcon],y jsr CalcZoomRect ;port must be main window *** added 7-Feb-92 DAL sta zoomRectPtr+2 sty zoomRectPtr *** end 7-Feb-92 pha phy pushlong #theWindRect _WhooshRect _SetPort @mainWindowClosed ; mark the icon closed @ptr equ 1 lda ListMemHandle+1 ;8-Jul-91 DAL beq @noListExists ;8-Jul-91 DAL phd pushlong ListMemHandle tsc tcd ldy #2 lda [@ptr],y tax lda [@ptr] sta @ptr stx @ptr+2 pha pha ;space for _Multiply lda TheRawCDevNumber pha pea LISTMEMSIZE _Multiply clc pla adc <@ptr sta <@ptr pla adc <@ptr+2 sta <@ptr+2 ldy #oMemState lda [<@ptr],y and #$ffff-$0002 ;draw the icon as Closed sta [<@ptr],y pla pla pld @noListExists ; invalidate the icon lda MainWindPtr+1 beq @cantInval jsr InvalZoomAndRedraw @cantInval lda #0 ldy #oCDevItemWindow sta [<@itemPtr],y iny iny sta [<@itemPtr],y @noItemStruct pla pla pla pla pld lda 1,s sta 1+4,s lda 2,s sta 2+4,s pla pla rtl theWindRect dc.w 0,0,0,0 InvalZoomAndRedraw pha pha _GetPort jsr PushMainWindPtr _SetPort jsr InvalZoomRect jsr ForceMainUpdate ;4-Dec-91 DAL _SetPort rts * * FindListIndex * * Input: AY = CDev item pointer to find * ListMemHandle * CDevListCount * * Output: A = position of this CDev in the sorted MemRec list (zero based) * FindListIndex sta @targetItem+2 sty @targetItem lda #0 @loop pha jsr @FetchItemPtr ;into AY cmp @targetItem+2 bne @next cpy @targetItem beq @found @next pla inc a cmp CDevListCount bcc @loop lda #0 ;should never get here!! rts @found pla rts @targetItem dc.l 0 * * FetchItemPtr * * In: A = index into ListMemHandle * * Out: AY = oMemItemPtr for this item * @FetchItemPtr phd pha ;index into list pushlong ListMemHandle tsc tcd @list equ 1 @index equ @list+4 ldy #2 lda [<@list],y tax lda [<@list] sta <@list stx <@list+2 pha pha pea LISTMEMSIZE pei <@index _Multiply clc pla adc <@list sta <@list pla adc <@list+2 sta <@list+2 ldy #oMemItemPtr lda [<@list],y tax iny iny lda [<@list],y txy plx plx ;pulled list pointer plx ;pulled index pld rts ******************************************************************************* * * InvalZoomRect * ******************************************************************************* InvalZoomRect lda zoomRectPtr+1 beq @noInval pushlong zoomRectPtr pushlong #localZoomRect pushlong #8 _BlockMove stz zeropoint stz zeropoint+2 pushlong #zeropoint _GlobalToLocal ;convert (0,0) to local coordinates pushlong #localZoomRect lda zeropoint+2 pha lda zeropoint pha _OffsetRect ;offset entire rect by same amount pushlong #localZoomRect _InvalRect ;invalidate the local rectangle @noInval rts zeropoint dc.w 0,0 localZoomRect dc.w 0,0,0,0 ******************************************************************************* * * ForceMainUpdate * * Update the main window right now, before the user has a chance to scroll * one of their icons out from underneath the invalidated area! * ******************************************************************************* ForceMainUpdate jsr PushMainWindPtr _BeginUpdate jsl MainContentDraw jsr PushMainWindPtr _EndUpdate rts ******************************************************************************* * * LocateCDevNumberA * * Inputs: A = CDev number (1=first) * * Output: @ptr points to CDev's pathname * AY points to the CDev's item record * * WARNING: Stack frame shared between OpenCDevNumberA, LocateCDevNumberA, * DerefAYToPtr, and AboutCDevNumberA * ******************************************************************************* LocateCDevNumberA @cdevnum equ 1 ;position in the CDevItem list @rawcdevnum equ @cdevnum+2 ;position in MemRec (sorted list) @ptr equ @rawcdevnum+2 *** get the real CDev number (the one we have now is based on the SORTED list) lda ListMemHandle+2 ldy ListMemHandle jsr DerefAYtoPtr pha pha ;space for _Multiply pei @rawcdevnum ;0-based pea LISTMEMSIZE _Multiply clc pla adc <@ptr sta <@ptr pla adc <@ptr+2 sta <@ptr+2 ldy #oMemCDevNumber lda [<@ptr],y ;zero-based sta <@cdevnum lda CDevItemsHandle+2 ldy CDevItemsHandle jsr DerefAYtoPtr pha pha ;space for _Multiply result pei @cdevnum ;CDev number (0-based) pea CDEVITEMSIZE _Multiply clc pla adc <@ptr sta <@ptr sta TheItemPtr pla adc <@ptr+2 sta <@ptr+2 sta TheItemPtr+2 ldy #oCDevItemPathOffset+2 lda [<@ptr],y pha dey dey lda [<@ptr],y pha lda CDevPathsHandle+2 ldy CDevPathsHandle jsr DerefAYtoPtr clc pla adc <@ptr sta <@ptr pla adc <@ptr+2 sta <@ptr+2 lda TheItemPtr+2 ldy TheItemPtr rts export TheItemPtr TheItemPtr dc.l 0 export TheRawCDevNumber TheRawCDevNumber dc.w 0 ******************************************************************************* * * DerefAYtoPtr -- private to OpenCDevNumberA * * @ptr must be 5! * * WARNING: Stack frame shared between OpenCDevNumberA, LocateCDevNumberA, * DerefAYToPtr, and AboutCDevNumberA * ******************************************************************************* DerefAYtoPtr @ptr equ 5 sta <@ptr+2 sty <@ptr ldy #2 lda [<@ptr],y tay lda [<@ptr] sta <@ptr sty <@ptr+2 rts ******************************************************************************* * * Parameter block for the cpOpenCDev request * ******************************************************************************* srqParmBlock dc.w 4 ;parameter count srqPath dc.l 0 ;pointer to pathname zoomRectPtr dc.l 0 ;rectangle to zoom from dc.w CDevFileType ;filetype dc.l 0 ;auxiliary type smallZoomRect ds.b 8 ******************************************************************************* * * CalcZoomRect * * Input: * CDev number in A (zero based) * * Output: * AY = NIL or pointer to icon rectangle * ******************************************************************************* CalcZoomRect inc a sta @num ;1-based number pha jsr PushListControl _GetCtlValue pla eor #$ffff sec adc @num bmi @nil cmp #3 ;listView--3 items visible at once bcs @nil pha lda #3 ;top sta smallZoomRect lda #33+3 ;bottom sta smallZoomRect+4 lda #12 ;left sta smallZoomRect+2 lda #104 ;right sta smallZoomRect+6 pushlong #smallZoomRect ;offset the top left _LocalToGlobal pushlong #smallZoomRect+4 ;offset the bottom right _LocalToGlobal pla pha pha ;space for Multiply result pha ;number of positions down we are pea 33 ;height of CDev item _Multiply ply ;amount to offset plx pushlong #smallZoomRect pea 0 ;horizontal offset phy ;vertical offset _OffsetRect lda #^smallZoomRect ldy #smallZoomRect rts @nil lda #0 tay rts @num dc.w 0 ******************************************************************************* * * ErrorWindowA * ******************************************************************************* ErrorWindowA pha ;space for button pea 0 ;sub type pea 0 pea 0 ;substitution array pha ;error number jsr @saveCursor _ErrorWindow jsr @restoreCursor pla rts @saveCursor pha pha _GetCursorAdr pla sta @localCursor pla sta @localCursor+2 _InitCursor rts @restoreCursor pushlong @localCursor _SetCursor rts @localCursor dc.l 0 ******************************************************************************* * * hitHelp -- they want the Help for the selected CDevs * ******************************************************************************* hitHelp lda #0 @loop pha ;space for NextMember2 result pha ;item num input jsr PushListControl _NextMember2 pla beq @done pha jsr AboutCDevNumberA pla bra @loop @done rts ******************************************************************************* * * AboutCDevNumberA * * The CDev they want help with may or may not already be open. * * WARNING: Stack frame shared between OpenCDevNumberA, LocateCDevNumberA, * DerefAYToPtr, and AboutCDevNumberA * ******************************************************************************* AboutCDevNumberA phd pha pha ;space for pointer dec a ;make cdev number 0-based pha ;raw cdev number pha ;translated cdev number tsc tcd @cdevnum equ 1 ;position in the CDevItem list @rawcdevnum equ @cdevnum+2 ;position in MemRec (sorted list) @ptr equ @rawcdevnum+2 lda <@rawcdevnum jsr LocateCDevNumberA ;returns path ptr in @ptr, item rec in AY pei @ptr+2 pei @ptr ;keep path in case we need it sta @ptr+2 sty @ptr ldy #oCDevItemWindow+1 lda [@ptr],y beq @notOpen * it's already open--get reference number from window block plx plx ;threw out the pathname pointer pha pha ;space for GetWRefCon result ldy #oCdevItemWindow+2 lda [@ptr],y pha dey dey lda [@ptr],y pha _GetWRefCon phd tsc tcd ldy #owbResfileNum lda [3],y tax pld pla pla lda #0 ;flag = CDev's about box, not ours jsr DoAboutBox @exit pla ;throw away CDev number pla ;throw away the raw cdev number pla pla ;throw away pointer pld rts * * notopen -- pathname pointer already on the stack * @notopen plx ply pha ;space for OpenResourceFile result pea 1 ;read-only access pushlong #0 ;map address phy phx ;pathname pointer jsr GetAndFixPrefs ;3-Dec-91 DAL _OpenResourceFile jsr RestorePrefs ;3-Dec-91 DAL plx bcs @err phx ;copy of refnum for CloseResourceFile later lda #0 ;flag = a CDev's about box, not ours jsr DoAboutBox ;X reg = resource file number _CloseResourceFile bra @exit @err jsr ErrorWindowA bra @exit ******************************************************************************* * * hitVersion -- fall into hitAbout * ******************************************************************************* hitVersion ******************************************************************************* * * hitAbout -- they need help with the Control Panel itself * ******************************************************************************* hitAbout lda #1 ;flag = our own About window, not a CDev's jsr DoAboutBox rts ******************************************************************************* * * DoAboutBox * * Inputs: A = 0 if we should do a CDev's about box * 1 for the main Control Panel about box * * X = resource file reference number if we're doing a CDev about * (undefined for the CP's about box) * ******************************************************************************* import IgnoreOneDeactivate DoAboutBox sta ourAboutFlag stx aboutCDevResNum tay bne @noWaitCur _WaitCursor @noWaitCur jsl IgnoreOneDeactivate ;use the cool color table (17-Mar-93 DAL) jsr GetExtraTools stz TheAboutIcon+1 *** fix up the window rectangle lda #25 sta aboutRect+0 ;y1 lda #190 sta aboutRect+4 ;y2 lda #172 sta aboutRect+2 ;x1 lda #464 sta aboutRect+6 ;x2 pha _GetMasterSCB pla and #$0080 bne @is640 lda #12 sta aboutRect+2 ;x1 lda #306 sta aboutRect+6 ;x2 @is640 pha pha _GetPort ;leave port on stack for @exit *** create our about window pha pha ;space for NewWindow result pushlong #aboutRec _NewWindow pla sta aboutWindow pla sta aboutWindow+2 bcc @1 brl @exit @1 *** create the OK button pha pha ;space for NewControl2 result jsr pushAboutWindow pea 3 ;pointer to template pointers pushlong #aboutItems _NewControl2 pla pla ;(ignore result) pha ;preserve resource file & use the CDev _GetCurResourceFile *** Is it the Control Panel help window? lda ourAboutFlag beq @notOurs *** create our help text control pha pha ;space for NewControl2 result jsr pushAboutWindow pea 0 pushlong #myabout _NewControl2 pla pla ;(ignore result) brl @doneAddingCtls *** let the CDev create its controls @notOurs lda aboutCDevResNum pha _SetCurResourceFile lda #$ffff ;so we don't do a NewControl2 on it! sta TheAboutFlags ;(anticipate trouble) pha pha pea rCDevFlags pushlong #1 _LoadResource pla ply bcs @flagsErr phy pha pushlong #TheAboutFlags pushlong #aboutFlagsEnd-TheAboutFlags _HandToPtr pha pha ;space for LoadResource result pea rIcon pushlong #1 _LoadResource lda 3,s pha lda 3,s pha _HLock phd tsc tcd ldy #2 lda [3],y sta TheAboutIcon+2 lda [3] sta TheAboutIcon pld pla pla @flagsErr lda TheAboutFlags and #wantAbout beq @noWantAbout lda #0 pha pha pea AboutCDev jsr pushAboutWindow pha pha jsl CallTheTopCDev pla ply bra @doneAddingCtls *** the CDev doesn't want to, so we'll use the CDev's rControlList ID=2 resource @noWantAbout pha pha ;space for NewControl2 result jsr pushAboutWindow pea 9 ;resourceToResource pushlong #2 ;rControlList ID=2 _NewControl2 pla pla ;(ignore result) @doneAddingCtls pha pea 1 _WindowGlobal ;make the main window not unhilite when we open the new one pla jsr pushAboutWindow _ShowWindow _InitCursor pha pea $fffe ;re-enable normal window hiliting _WindowGlobal pla @modal pha pha ;space for DoModalWindow result pushlong #myTaskRec pushlong #DrawAbout ;update pushlong #0 ;event hook pushlong #0 ;beep proc pea 0 ;flags _DoModalWindow pla plx cmp #1000 ;OK button hit? bne @modal jsr pushAboutWindow _CloseWindow _SetCurResourceFile @exit _SetPort *** added 7-Feb-92 DAL jsr ReleaseExtraTools *** end 7-Feb-92 _InitCursor rts pushAboutWindow plx pushlong aboutWindow phx rts aboutWindow dc.l 0 ourAboutFlag dc.w 0 aboutCDevResNum dc.w 0 ******************************************************************************* * * GetExtraTools * * If Text Edit and Font Manager aren't started, let's start them up so * CDev Help windows can use them cleanly. * ******************************************************************************* GetExtraTools stz WeLoadedFM stz WeStartedFM pea 0 _FMStatus pla bcc @present pea $001b ;Font Mgr pea $0303 ;3.3 _LoadOneTool bcs @fmDone inc WeLoadedFM pea 0 _FMStatus pla @present bne @fmDone pha _MMStartUp ;id for FMStartUp jsr GetDirPage pha ;dp for FMStartUp stx fmHandle+2 sty fmHandle _FMStartUp inc WeStartedFM @fmDone *** Now do the same for Text Edit stz WeLoadedTE stz WeStartedTE pea 0 _TEStatus pla bcc @tePresent pea $0022 ;Text Edit pea $0103 ;1.3 _LoadOneTool bcs @teDone inc WeLoadedTE pea 0 _TEStatus pla @tePresent bne @teDone pha _MMStartUp ;id for TEStartUp jsr GetDirPage pha ;dp for TEStartUp stx teHandle+2 sty teHandle _TEStartUp inc WeStartedTE @teDone rts * * GetDirPage -- return handle in XY, pointer in A * GetDirPage pha pha pea 0 pea $0100 ;one page pha _MMStartUp ;mem id pea $c015 ;attr pea 0 pea 0 ;bank zero _NewHandle phd tsc tcd lda [3] ;deref pld ply plx rts ******************************************************************************* * * ReleaseExtraTools * * If we started up Text Edit or Font Manager in GetExtraTools, free them. * ******************************************************************************* ReleaseExtraTools lda WeStartedTE beq @noStopTE _TEShutDown pushlong teHandle _DisposeHandle stz teHandle+1 @noStopTE lda WeLoadedTE beq @noUnloadTE pea $0022 ;text edit _UnloadOneTool @noUnloadTE lda WeStartedFM beq @noStopFM _FMShutDown pushlong fmHandle _DisposeHandle stz fmHandle+1 @noStopFM lda WeLoadedFM beq @noUnloadFM pea $001b ;font manager _UnloadOneTool @noUnloadFM rts WeLoadedFM dc.w 0 WeStartedFM dc.w 0 WeLoadedTE dc.w 0 WeStartedTE dc.w 0 fmHandle dc.l 0 teHandle dc.l 0 ******************************************************************************* * * CallTheTopCDev -- transfer control to the CDev whose code is in the * current resource file * * If there's a problem, then strip the 10 bytes of inputs to the CDev * routine and just return. * ******************************************************************************* CallTheTopCDev pha pha pea rCDevCode pushlong #1 _LoadResource bcs @strip phd tsc tcd lda [3] sta @toTheCDev+1 ldy #1 lda [3],y sta @toTheCDev+2 pld pla pla @toTheCDev jml >$777777 @strip pla pla ;pulled LoadResource result lda 2,s sta 2+10,s lda 1,s sta 1+10,s pla pla pla pla pla rtl ******************************************************************************* aboutRec dc.w aboutEnd-aboutRec ; param length dc.w $2000 ; wFrame dc.l 0 ; wTitle dc.l 0 ; wRefCon dc.w 0,0,0,0 ; wZoom top,left,bottom,right dc.l 0 ; wColor dc.w 0 ; wYOrigin dc.w 0 ; wXOrigin dc.w 0 ; wDataH dc.w 0 ; wDataW dc.w 0 ; wMaxH dc.w 0 ; wMaxW dc.w 0 ; wScrollVer dc.w 0 ; wScrollHor dc.w 0 ; wPageVer dc.w 0 ; wPageHor dc.l 0 ; wInfoRefCon dc.w 0 ; wInfoHeight dc.l 0 ; wFrameDefProc dc.l 0 ; wInfoDefProc dc.l 0 ; wContDefProc (DrawAbout will be used) aboutRect dc.w 25,0,190,320 ; wPosition top,left,right,bottom dc.l -1 ; wPlane dc.l 0 ; wStorage aboutEnd * * Control list for the About window * aboutItems dc.l Okay dc.l 0 * * Simple button: OK * Okay dc.w 9 dc.L 1000 dc.w 146,20+84,160,100+84 dc.L $80000000 dc.w 1 dc.w $3000 dc.L 0 dc.L TheTitle dc.L 0 dc.b 13,13 ;key equivalents dc.w 0 dc.w 0 TheTitle dc.b 2,'OK' * * stat text control for the main CP about text * myabout dc.w 9 ;pcount dc.l 5 dc.w 10,0,135,290 dc.l $81000000 ;stat text dc.w 0 dc.w $1000 dc.l 0 dc.l abt dc.w abtL dc.w 1 abt dc.b 1,'S',16,0 dc.b 'Control Panel 2.1',13 dc.b 1,'S',0,0 dc.b 'by',13 dc.b 'Dave ÒMr TangentÓ Lyons',13 dc.b 13 dc.b 'Some portions by',13 dc.b 'Michael Stein',13 dc.b 'and',13 dc.b 'Darryl Lovato',13 dc.b 13 dc.b 'Copyright (C) 1990-1993',13 dc.b 'Apple Computer, Inc.',13 dc.b 'All Rights Reserved',13 abtL equ *-abt ******************************************************************************* * * DrawAbout * ******************************************************************************* DrawAbout phb phk plb lda #2 pha pha _SetPenSize pea 0 pea 139 _MoveTo pea 500 pea 139 _LineTo lda #1 pha pha _SetPenSize lda TheAboutIcon+1 beq @noIcon pushlong TheAboutIcon pea 0 ;mode pea 6 ;X position (was 4 in CP 1.x) pea 3 ;Y position _DrawIcon @noIcon lda aboutRect+6 ;right edge sec sbc aboutRect+2 ;left edge lsr a sta aboutCenter lda ourAboutFlag beq @1 brl @skipStrings @1 pha pushlong #aflagName _StringWidth pla jsr Center pha pea 11 _MoveTo pushlong #aflagName _DrawString pha pushlong #byStr _StringWidth pla jsr Center pha pea 21 _MoveTo pushlong #byStr _DrawString pha pushlong #aflagAuthor _StringWidth pla jsr Center pha pea 31 _MoveTo pushlong #aflagAuthor _DrawString pha pushlong #aflagVersionStr _StringWidth pla eor #$ffff sec adc aboutRect+6 sec sbc aboutRect+2 sec sbc #5 pha pea 10 _MoveTo pushlong #aflagVersionStr _DrawString @skipStrings pha pha _GetPort _DrawControls plb rtl Center lsr a eor #$ffff sec adc aboutCenter rts aboutCenter dc.w 0 TheAboutIcon dc.l 0 TheAboutFlags aTheFlags dc.w 0 aflagEnabled dc.b 0 aflagVersion dc.b 0 aflagMachine dc.b 0 aflagReserved dc.b 0 aflagDataRect dc.w 0,0,0,0 aflagName ds.b 16 aflagAuthor ds.b 33 aflagVersionStr ds.b 9 AboutFlagsEnd byStr dc.b 2,'by' ******************************************************************************* * * hitList * ******************************************************************************* hitList jsr SetButtonStates lda myTaskWhat cmp #1 ;mouse down? bne @ignoreHit lda myClickCount cmp #2 bcc @ignoreHit lda theOpenButtonState cmp #$00ff beq @ignoreHit lda #2 jsr HiliteOpen ;blink Open button on lda #0 jsr HiliteOpen ;blink Open button off jsr hitOpen @ignoreHit rts ******************************************************************************* * * SetButtonStates * * See if there are any CDevs selected in the list. If so, enable the Open * and CDev-help buttons. If not, disable them. * ******************************************************************************* SetButtonStates lda #0 pha ;space for NextMember2 result pha ;item num input jsr PushListControl _NextMember2 pla beq @disable *** Enable Help only if exactly 1 icon selected pha pha ;item num input jsr PushListControl _NextMember2 pla beq @enable ;enable them both (no more selected icons) pea $00ff ;hilite state for Help button pea $0000 ;hilite state for Open button bra @EnableJustOne @disable lda #$00ff bra @enableOrDisable @enable lda #0 @enableOrDisable pha ;0 to enable, $FF to disable pha @EnableJustOne lda 1,s sta theOpenButtonState lda #OpenControlID jsr PushCtlHandle _HiliteControl lda #CDevHelpControlID jsr PushCtlHandle _HiliteControl rts ******************************************************************************* * * PushCtlHandle * * Input: control ID in A (for some control in the main window) * ******************************************************************************* PushCtlHandle pha pha ;space for result (and temporary storage!) jsr PushMainWindPtr lda 5,s pea 0 pha _GetCtlHandleFromID pla ;move result under return address ply plx phy pha phx rts ******************************************************************************* * * HiliteOpen * * Input: part code in A (2 to hilite the Open button, 0 to unhilite it) * ******************************************************************************* HiliteOpen pha ;hilite value sta theOpenButtonState lda #OpenControlID jsr PushCtlHandle _HiliteControl rts theOpenButtonState dc.w 0 ******************************************************************************* * * Task record * ******************************************************************************* myTaskRec myTaskWhat dc.w 0 myTaskMsg dc.l 0 dc.l 0 ;when myTaskWhere dc.w 0,0 myTaskMods dc.w 0 myTaskData dc.l 0 myTaskMask dc.l $001fffff ;everything (5.0.3) dc.l 0 ;lastClickTick myClickCount dc.w 0 ;click count myTaskData2 dc.l 0 ;task data 2 myTaskData3 dc.l 0 ;task data 3 myTaskData4 dc.l 0 ;task data 4 dc.w 0,0 ;last click point ******************************************************************************* * * SpecialEventHandling * * Input: event record pointer at <1 * * If this is a Command-Control-Esc event, handle it and make the event * into a null event. * ******************************************************************************* export SpecialEventHandling SpecialEventHandling @event equ 1 lda [<@event] cmp #3 ;is it a keyDown? bne @failed ldy #2 ;offset to event Message lda [<@event],y and #$00ff cmp #$001b ;Escape? bne @failed *** Require the Shift key & not the Control or Option keys ldy #14 ;offset to event modifiers lda [<@event],y and #$1300 ;ctrl+option+shift+apple cmp #$0300 ;apple+shift bne @failed jsr OpenMyself lda #0 sta [<@event] @failed rtl ******************************************************************************* ******************************************************************************* * * InstallRequestProc * ******************************************************************************* InstallRequestProc * * First, let's stuff our memory ID into our AcceptRequests string to * make it unique (in case there is more than one copy of the Control * panel in the machine). * pha pha pha ;space for MMStartUp result _MMStartUp _HexIt pla sta ReqProcHexID pla sta ReqProcHexID+2 ldx #^CtlPanelRequestProc ldy #CtlPanelRequestProc bra instOrRemoveRQ ******************************************************************************* * * RemoveRequestProc * ******************************************************************************* RemoveRequestProc ldx #0 txy instOrRemoveRQ pushlong #ReqProcName lda MyMemID pha phx phy ;nil or ReqProc ptr _AcceptRequests rts ReqProcName dc.b 25,'Apple~Control Panel~' ReqProcHexID dc.b 'xxxx~' ******************************************************************************* * * CtlPanelRequestProc * * This is called by the Tool Locator SendRequest call. * For example, the Finder calls SendRequest when the user * tries to open documents and the Finder doesn't know how. * ******************************************************************************* CtlPanelRequestProc name @oldDPage equ 1 @RTL1 equ 3 @DataOut equ 6 @DataIn equ 10 @Request equ 14 @Result equ 16 @InputSize equ 10 ;request procs must clean 10 bytes from the stack phd tsc tcd phb phk plb lda <@Request sta @requestTable ldx #@requestTableEnd-@requestTable @loop dex dex dex dex cmp @requestTable,x bne @loop jsr (@requestTable+2,x) ror <@Result ;rotate accept flag into bit 15 plb pld lda 2,s ;clean InputSize bytes off the stack sta 2+@InputSize,s lda 1,s sta 1+@InputSize,s ply ply ply ply ply rtl ******************************************************************************* * * Request Table has one entry per request code that we handle. * The first entry catches anything we don't match, so it has * the "null" handler that never claims the request. * * Each request handler returns CLC if it didn't handle the * request, SEC if it did. * ******************************************************************************* @requestTable dc.w $7777 dc.w @handleOther dc.w finderSaysBeforeOpen dc.w @handleBeforeOpen *** added 3-Sep-92 DAL to fix bug introduced in 6.0.1d9 dc.w internalOpenCDev dc.w @handleOpenCDev *** end 3-Sep-92 dc.w cpOpenCDev dc.w @handleBeforeOpen ;29-Jul-92 DAL (was @handleOpenCDev in 6.0) dc.w systemSaysMenuKey dc.w @handleMenuKey dc.w cpOpenControlPanels dc.w @handleOpenControlPanels @requestTableEnd @handleOther clc rts ******************************************************************************* * * handleBeforeOpen * * The Finder wants us to open some documents. * * If these are CDev documents, let's try to open them. * * DataIn points to the following structure: * +000 WORD parameter count (in 6.0, 6 means 7) * +002 LONG pointer to class-one pathname * +006 LONG pointer to rectangle to zoom from (NIL if none appropriate) * +010 WORD filetype * +012 LONG auxtype * +016 WORD modifiers * +018 LONG Finder icon handle * +022 WORD printFlag (0=open) * ******************************************************************************* @handleBeforeOpen ldy #oFiletype lda [<@dataIn],y ;check filetype = CDEV cmp #CDevFileType bne @notCDev *** 29-Jul-92 DAL -- see if there's a printFlag to check lda [<@dataIn] cmp #7 bcc @noPrintFlag *** end 29-Jul-92 *** make sure this is an Open, not a Print ldy #oPrintFlag lda [<@dataIn],y bne @notCDev @noPrintFlag lda #0 sta >TheItemPtr sta >TheItemPtr+2 sta >TheRawCDevNumber ;6-Feb-92 DAL jsr @handleOpenCDev bcs @success lda >globalErrorCode cmp #$ffff ;sets carry if MachineCDev failed @success *** invalidate the list in the main window if we opened anything php pha lda MainWindPtr+1 beq @noMainWindow *** 15-Jul-92 DAL -- use new InvalOneCtlByID call jsr PushMainWindPtr pushlong #ListControlID ldx #$3E10 jsl $e10000 ; _InvalOneCtlByID *** end 15-Jul-92 @noMainWindow pla plp rts @notCDev clc rts ******************************************************************************* * * handleOpenCDev * * DataIn points to the following structure: * +000 WORD parameter count (at least 4) * +002 LONG pointer to class-one pathname * +006 LONG pointer to rectangle to zoom from (NIL if none appropriate) * +010 WORD filetype * +012 LONG auxtype * * >TheItemPtr points to the CDevItem structure for this CDev, if any. * ******************************************************************************* import OpenNewCDevAY @handleOpenCDev lda #0 sta >globalErrorCode pha pha _GetCursorAdr pla sta @openOldCursor pla sta @openOldCursor+2 ldy #oSmallRect+2 lda [<@dataIn],y pha dey dey lda [<@dataIn],y pha ldy #oPathname+2 lda [<@dataIn],y pha dey dey lda [<@dataIn],y tay pla jsl OpenNewCDevAY ;takes rectangle pointer on stack, returns TheCDevWindow in AY pha phy pushlong @openOldCursor _SetCursor pla ;see if result (LONG on stack) is NIL ora 1,s plx tax beq @failed sec rts @failed clc rts @openOldCursor dc.l 0 ******************************************************************************* * * handleMenuKey * * DataIn points to the Task Record for the keyDown event * ******************************************************************************* @handleMenuKey ldy #2 ;offset to event Message lda [<@dataIn],y and #$00ff cmp #$001b ;Escape? bne @failed *** Require the Shift key & not the Control or Option keys ldy #14 ;offset to event modifiers lda [<@dataIn],y and #$1300 ;ctrl+option+shift+apple cmp #$0300 ;apple+shift bne @failed jsr OpenMyself sec ;claim the request rts ******************************************************************************* * * handleOpenControlPanels * * Open the main Control Panels window * ******************************************************************************* @handleOpenControlPanels jsr OpenMyself sec ;claim the request rts ******************************************************************************* * * OpenMyself -- call OpenNDA on myself, hiliting the first menu in * the current menu bar (I hope that's the Apple menu!) * ******************************************************************************* OpenMyself pea $8000 ;for HiliteMenu($8000,x) later (23-Nov-92 DAL) jsr GetFirstMenuID pha ;menu id for HiliteMenu(0,x) later pea $8001 ;for HiliteMenu($8001,x) (23-Nov-92 DAL) pha ;menu ID _HiliteMenu pha ;space for OpenNDA result jsl GetMyMainMenuID pha _OpenNDA pla _HiliteMenu ;HiliteMenu($8000,x) rts * * GetFirstMenuID--return ID of first menu in A * GetFirstMenuID pha pha ;space for GetMHandle result pea 0 ;get first menu handle _GetMHandle phd tsc tcd ldy #2 lda [3],y tax lda [3] sta 3 stx 5 lda [3] pld plx plx rts ******************************************************************************* ******************************************************************************* * * Miscellaneous subroutines * ******************************************************************************* GetAndFixPrefs _GetSysPrefsGS oldPrefs lda oldPrefs+2 and #$1fff ;keep the reserved bits ora #$C000 ;turn on Use Volume Mount Dialog ;no Cancel button! 3-Dec-91 DAL sta myPrefs+2 _SetSysPrefsGS myPrefs rts RestorePrefs php pha _SetSysPrefsGS oldPrefs pla plp rts oldPrefs dc.w 1 ;1 parameter dc.w 0 ;the old SysPrefs myPrefs dc.w 1 dc.w 0 ;my modified preferences ******************************************************************************* ******************************************************************************* * * GetCDevList * * Inputs: * none * * Outputs: * Sets up CDevItemsHandle, CDevPathsHandle, CDevIconsHandle if they * are not already set up. * ******************************************************************************* export GetCDevList GetCDevList *** added 6-Feb-92 DAL lda CDevItemsHandle+1 bne @gotIt *** end 6-Feb-92 jsr ReadExistingDataFile bcs @rebuildList * validate the list against the actual CDevs directory jsl DoValidationScan bcc @gotIt @rebuildList jsl ScanForCDevs jsr WriteDataFile @gotIt rtl ******************************************************************************* * * ReadExistingDatafile * * Returns CLC if we read a valid (up-to-date) file into the handles * ******************************************************************************* ReadExistingDataFile stz dataFileRef3 lda #1 ;read only sta dataFileReqAcc _OpenGS dataFileOpen bcs @nope lda dataFileRef sta dataFileRef2 sta dataFileRef3 lda #^CDevListSigBuffer ldy #CDevListSigBuffer sta dataReadWhere+2 sty dataReadWhere lda #0 ldy #6 sta dataReadAmount+2 sty dataReadAmount _ReadGS dataFileRead bcs @nope * need to validate the signature stuff! lda CDevListSigBuffer cmp #$5644 ;'DV' bne @nope lda CDevListSigBuffer+2 cmp #1 bne @nope jsr ReadNewHandle sta CDevItemsHandle+2 sty CDevItemsHandle bcs @nope jsr ReadNewHandle sta CDevPathsHandle+2 sty CDevPathsHandle bcs @nope jsr ReadNewHandle sta CDevIconsHandle+2 sty CDevIconsHandle bcc @otay @nope sec @otay php pha *** Don't Close(0) if we failed to open lda dataFileRef3 beq @noClose _CloseGS dataFileClose @noClose pla plp bcc @keepIt pha jsl DisposeCDevList ;dispose of any handles we allocated pla sec rts @keepIt lda CDevListSigBuffer sta CDevListSignature lda CDevListSigBuffer+2 sta CDevListSignature+2 lda CDevListSigBuffer+4 sta CDevListSignature+4 clc rts CDevListSigBuffer ds.b CDEVLISTHEADERSIZE ReadNewHandle lda #^howMuch ldy #howMuch sta dataReadWhere+2 sty dataReadWhere lda #0 ldy #4 sta dataReadAmount+2 sty dataReadAmount _ReadGS dataFileRead lda howMuch+2 ldy howMuch sta dataReadAmount+2 sty dataReadAmount ;leave size needed in AY pha pha ;space for NewHandle result pha phy ;size needed jsr PushDataID pea $C000 ;locked and fixed pha pha ;location (ignored) _NewHandle bcs @error phd tsc tcd ldy #2 ;dereference into Read parmblock lda [3],y sta dataReadWhere+2 lda [3] sta dataReadWhere pld _ReadGS dataFileRead @error ply pla ;return handle in AY rts howMuch dc.l 0 ******************************************************************************* * * WriteDataFile * * Try to Create, Open, and Write the data file * ******************************************************************************* WriteDataFile _CreateGS dataFileCreate bcc @okay cmp #$47 ;duplicate filename beq @exists sec rts *** 16-Mar-92 DAL -- the old file may be locked--must unlock it @exists _SetFileInfoGS dataFileCreate *** end 16-Mar-92 @okay stz dataFileRef3 ;anticipate failure to open (16-Mar-92 DAL) lda #3 ;read/write sta dataFileReqAcc _OpenGS dataFileOpen bcs @nope lda dataFileRef sta dataFileRef2 sta dataFileRef3 lda #^CDevListSignature ldy #CDevListSignature sta dataReadWhere+2 sty dataReadWhere lda #0 ldy #6 sta dataReadAmount+2 sty dataReadAmount _WriteGS dataFileRead lda CDevItemsHandle+2 ldy CDevItemsHandle jsr WriteAHandle bcs @closeAndKill lda CDevPathsHandle+2 ldy CDevPathsHandle jsr WriteAHandle bcs @closeAndKill lda CDevIconsHandle+2 ldy CDevIconsHandle jsr WriteAHandle bcs @closeAndKill @nope php lda dataFileRef3 beq @noClose _CloseGS dataFileClose @noClose plp rts @closeAndKill pha _CloseGS dataFileClose _DestroyGS dataFileDestroy pla sec rts WriteAHandle pha phy ;push copy of handle pha pha ;space for GetHandleSize pha phy ;handle _GetHandleSize pla sta howMuch pla sta HowMuch+2 lda #^howMuch ldy #howMuch sta dataReadWhere+2 sty dataReadWhere lda #0 ldy #4 sta dataReadAmount+2 sty dataReadAmount _WriteGS dataFileRead bcs @fail lda howMuch+2 ldy howMuch sta dataReadAmount+2 sty dataReadAmount ;leave size needed in AY phd tsc tcd ldy #2 ;dereference into Read parmblock lda [3],y sta dataReadWhere+2 lda [3] sta dataReadWhere pld _WriteGS dataFileRead ;;; bcc @cleanExit @fail @cleanExit ply pla ;pull copy of handle rts ******************************************************************************* dataFileOpen dc.w 3 dataFileRef dc.w 0 dc.l dataFilePath dataFileReqAcc dc.w $7777 ;requested access dataFilePath dc.w 24 dc.b '*:System:CDevs:CDev.Data' dataFileRead dc.w 4 ;4 parameters dataFileRef2 dc.w 0 dataReadWhere dc.l 0 dataReadAmount dc.l 0 dc.l 0 ;amount actually read dataFileClose dc.w 1 ;1 parameter datafileRef3 dc.w 0 dataFileDestroy dc.w 1 dc.l dataFilePath *** Note: dataFileCreate is used for CreateGS *and* SetFileInfoGS dataFileCreate dc.w 3 dc.l dataFilePath dc.w $00E7 ;access (invisible = $0004 bit) dc.w CDevDataFileType ******************************************************************************* ******************************************************************************* CDevListSignature dc.w $5644 ;'DV' CDevListVersion dc.w $0001 export CDevListCount CDevListCount dc.w 0 ;number of CDevs in list export CDevItemsHandle CDevItemsHandle dc.l 0 export CDevPathsHandle CDevPathsHandle dc.l 0 export CDevIconsHandle CDevIconsHandle dc.l 0 export ListMemHandle ListMemHandle dc.l 0 ******************************************************************************* ******************************************************************************* * * DisposeListMemHndl * ******************************************************************************* DisposeListMemHndl lda ListMemHandle+1 beq @4 pushlong ListMemHandle _DisposeHandle stz ListMemHandle+1 @4 rtl ******************************************************************************* * * DisposeCDevList * ******************************************************************************* *** added 6-Feb-92 DAL -- Don't get rid of stuff we still need! export CondDisposeCDevList CondDisposeCDevList lda NumCDevsOpen bne dontKill lda MainWindPtr+1 bne dontKill *** end 6-Feb-92 DisposeCDevList stz CDevListCount lda CDevIconsHandle+1 beq @1 pushlong CDevIconsHandle _DisposeHandle stz CDevIconsHandle+1 @1 lda CDevPathsHandle+1 beq @2 pushlong CDevPathsHandle _DisposeHandle stz CDevPathsHandle+1 @2 lda CDevItemsHandle+1 beq @3 pushlong CDevItemsHandle _DisposeHandle stz CDevItemsHandle+1 @3 dontKill rtl ******************************************************************************* * * DoValidationScan * * Return CLC if the data file we already read in matches the current set * of CDevs in the *:System:CDevs folder * * Comparision data is in CDevItemsHandle; there should be the same number * as in CDevListSigBuffer+oCDevListCount * * ******************************************************************************* DoValidationScan lda #8 jsr getPfx phy phx lda #0 jsr getPfx phy phx _SetPrefixGS setZeroNull _SetPrefixGS setEightCdevDir stz ValidCount ;how many have we found so far? stz ItemArrayOffset ;which one are we looking at? jsr OpenDirectory php bcs @fail ;@fail requires carry status on stack plp @next jsr GetNextCDev bcs @done inc ValidCount jsr ValidateCDevEntry bcc @next sec bra @closeAndExit * * Ran out of CDevs--see if the counts match! * @done lda validCount cmp CDevListSigBuffer+oCDevListCount sec bne @closeAndExit clc @closeAndExit php jsr CloseDirectory @fail plp plx ;restore prefix 0 ply php lda #0 jsr setPfx plp plx ;restore prefix 8 ply php lda #8 jsr setPfx plp ;clc if successful rtl validCount dc.w 0 ItemArrayOffset dc.w 0 ;offset into CDevItemsHandle * * ValidateCDevEntry * * Inputs: * entCreateDate (8 bytes) * CDev Item record at [CDevItemsHandle],ItemArrayOffset+oCDevItemCreateDate * * Returns SEC if the dates do not match. * Otherwise increments ItemArrayOffset and returns CLC. * ValidateCDevEntry phd pushlong CDevItemsHandle tsc tcd ldy #2 lda [1],y tax lda [1] clc adc ItemArrayOffset bcc @1 inx @1 clc adc #oCDevItemCreateDate bcc @2 inx @2 sta 1 stx 3 ldy #8 ;compare 8 bytes @compare dey dey bmi @equal lda entCreateDate,y cmp [1],y beq @compare sec bra @compared @equal clc @compared pla pla pld bcs @fail ; clc lda ItemArrayOffset adc #CDEVITEMSIZE sta ItemArrayOffset clc @fail rts ******************************************************************************* * * ScanForCDevs * ******************************************************************************* ScanForCDevs jsl DisposeCDevList ;added 1-Apr-91 DAL lda #8 jsr getPfx phy phx lda #0 jsr getPfx phy phx jsr NewEmptyHandle sta CDevItemsHandle+2 sty CDevItemsHandle jsr NewEmptyHandle sta CDevPathsHandle+2 sty CDevPathsHandle jsr NewEmptyHandle sta CDevIconsHandle+2 sty CDevIconsHandle _SetPrefixGS setZeroNull _SetPrefixGS setEightCdevDir stz CDevListCount jsr OpenDirectory bcs @fail @next jsr GetNextCDev bcs @done jsr AppendCDev bra @next @done jsr CloseDirectory @fail *** lock down the handles ; _CompactMem pushlong CDevIconsHandle _HLock pushlong CDevItemsHandle _HLock pushlong CDevPathsHandle _HLock *** restore prefix 0 plx ply lda #0 jsr setPfx *** restore prefix 8 plx ply lda #8 jsr setPfx rtl ******************************************************************************* * * NewEmptyHandle: output handle in AY * ******************************************************************************* NewEmptyHandle pha pha ;space for NewHandle result lda #0 pha pha jsr PushDataID pea 0 ;attributes pha pha ;location (ignored) _NewHandle ply pla rts PushDataID pha ;space for MMStartUp result _MMStartUp pla ora #$0700 plx pha phx rts ******************************************************************************* * * OpenDirectory * ******************************************************************************* OpenDirectory _OpenGS OpenCDevDir bcs @done lda dirRef sta dirRef2 sta dirRef3 @done rts ******************************************************************************* * * GetNextCDev * ******************************************************************************* GetNextCDev _GetDirEntryGS GetDirEnt bcs @err lda entType cmp #CDevFileType bne GetNextCDev lda entAuxType bmi GetNextCDev ;CDev is inactive clc @err rts ******************************************************************************* * * CloseDirectory * ******************************************************************************* CloseDirectory _CloseGS CloseCDevDir rts ******************************************************************************* * * AppendCDev * ******************************************************************************* AppendCDev pha ;space for OpenResourceFile result pea 1 ;read-only pushlong #0 ;map address = NIL pushlong #theFileName jsr GetAndFixPrefs _OpenResourceFile jsr RestorePrefs pla bcs @exit pha pha pea 1 _SetResourceFileDepth ;leave old depth on stack jsr AppendGuts pla ;previous depth pha ;space for SetResourceFileDepth result pha ;new depth _SetResourceFileDepth pla ;throw away old depth (1) _CloseResourceFile ;refnum still on stack @exit rts AppendGuts pha pha pea rCDevFlags pushlong #1 _LoadResource plx ply phy phx pushlong #itemFlags pushlong #FLAGSSIZE _HandToPtr *** Put the CDev's create date in the data file ldy #6 @copyCreateDate lda entCreateDate,y sta CDevItemTemplate+oCDevItemCreateDate,y dey dey bpl @copyCreateDate *** If there are blanks on the beginning of the CDev name, kill them @stripBlanks lda CDevItemTemplate+oCDevItemName and #$00ff beq @noBlank lda CDevItemTemplate+oCDevItemName+1 and #$00ff cmp #$0020 bne @noBlank pushlong #CDevItemTemplate+oCDevItemName+2 ;source pushlong #CDevItemTemplate+oCDevItemName+1 ;dest pushlong #14 _BlockMove dec CDevItemTemplate+oCDevItemName ;decrement length bra @stripBlanks @noBlank pha pha pea rIcon pushlong #1 _LoadResource pla sta @iconHandle pla sta @iconHandle+2 pha pha pushlong CDevIconsHandle _GetHandleSize pla sta iconOffset pla sta iconOffset+2 pha pha pushlong CDevPathsHandle _GetHandleSize pla sta pathOffset pla sta pathOffset+2 pushlong @iconHandle pushlong CDevIconsHandle jsr AppendHandle clc lda CDevDirectory adc theFilename sta theLengthWord pea 2 pushlong #theLengthWord pushlong CDevPathsHandle jsr AppendSomeData pushword CDevDirectory pushlong #CDevDirectory+2 pushlong CDevPathsHandle jsr AppendSomeData pushword theFilename pushlong #theFilename+2 pushlong CDevPathsHandle jsr AppendSomeData pushword itemSize pushlong #CDevItemTemplate pushlong CDevItemsHandle jsr AppendSomeData inc CDevListCount rts @iconHandle dc.l 0 CDevItemTemplate itemSize dc.w endOfItem-CDevItemTemplate itemDate ds.b 8 pathOffset dc.l 0 iconOffset dc.l 0 itemState dc.w 0 itemWindow dc.l 0 itemFlags ds.b FLAGSSIZE endOfItem theLengthWord dc.w 0 ;total length of CDev path CDevDirectory dc.w 15 dc.b '*:System:CDevs:' * * AppendHandle * * Input: * HANDLE data to append * HANDLE theHandle * AppendHandle phd tsc tcd @oldD equ 1 @rts equ @oldD+2 @theHandle equ @rts+2 @data equ @theHandle+4 pha pha pei @theHandle+2 pei @theHandle _GetHandleSize lda 3,s pha lda 3,s pha pha pha pei @data+2 pei @data _GetHandleSize clc pla adc 3,s tax pla adc 3,s ply ply pha phx pei @theHandle+2 pei @theHandle _SetHandleSize ldy #2 clc pla adc [@theHandle] tax pla adc [@theHandle],y pei @data+2 pei @data ;source handle pha phx ;dest pointer pha pha pei @data+2 pei @data _GetHandleSize ;length _HandToPtr pld plx ply ply ply ply phx rts * * AppendSomeData * * Input: * WORD size of data to append * POINTER data to append * HANDLE theHandle * AppendSomeData phd tsc tcd @oldD equ 1 @rts equ @oldD+2 @theHandle equ @rts+2 @data equ @theHandle+4 @size equ @data+4 pha pha pei @theHandle+2 pei @theHandle _GetHandleSize lda 3,s pha lda 3,s pha clc lda @size adc 1,s sta 1,s lda 3,s adc #0 sta 3,s pei @theHandle+2 pei @theHandle _SetHandleSize ldy #2 lda [@theHandle],y tax lda [@theHandle] clc adc 1,s tay txa adc 3,s plx plx ;discard pei @data+2 pei @data ;source pha phy ;destination pea 0 pei @size ;size _BlockMove pld plx ply ply ply ply ply phx rts ******************************************************************************* * * muck with prefixes 0 and 8 * ******************************************************************************* setZeroNull dc.w 2 dc.w 0 dc.l nullPath nullPath dc.w 0 setEightCDevDir dc.w 2 dc.w 8 dc.l CDevDirPath CDevDirPath dc.w 14 dc.b '*:System:CDevs' OpenCDevDir dc.w 3 dirRef dc.w 0 dc.l CDevDirPath dc.w $0001 ;read only CloseCDevDir dc.w 1 dirRef3 dc.w 0 GetDirEnt dc.w 13 dirRef2 dc.w 0 dc.w 0,1,1 ;flags, base, displacement dc.l fileNameBuff dc.w 0 ;entry num entType dc.w 0 ;filetype dc.l 0 ;eof dc.l 0 ;blocks entCreateDate dc.l 0,0 ;create date/time entModDate dc.l 0,0 ;mod date/time dc.w 0 ;access entAuxType dc.l 0 ;auxtype fileNameBuff dc.w 34 theFileName ds.b 32 ;############################################################ ;# ;# getPfx - retrieves current prefix for the supplied ;# prefix number. The handle to the stored prefix is ;# returned to the caller. ;# ;# on entry: ;# Acc = prefix number ;# ;# on exit: ;# X, Y = handle of stored prefix (low,high) ;# ;############################################################ getPfx @tmpPtr equ $01 @pfxHndl equ $05 ;handle to stored prefix sta prefixNum ;put prefix number in parmblock (for later) pha ;make space for temp pointer pha pha ;and prefix handle pha tsc ;make stack frame phd tcd pha ;make space for NewHandle call pha pea 0 ;size of block to create pea 256 ;we'll try 256 bytes at first pha _MMStartUp pea $8010 ;attributes pha ;location pointer pha ;(not used) _NewHandle ;go get some memory pla ;retreive handle plx bcc @got_mem @memerr lda #0 pha ;oops! put up an ErrorWindow pha ;subString type (not used) pha ;subStringPtr (not used) pha pea $8D ;"Memory is full" bra @showErr @got_mem sta @pfxHndl ;save for return to caller stx @pfxHndl+2 ldy #2 ;dereference handle lda [@pfxHndl] sta @tmpPtr sta bufPtr lda [@pfxHndl],y sta @tmpPtr+2 sta bufPtr+2 lda #256 ;initialize length of buffer sta [@tmpPtr] ;;; lda #2 ;set up parm block ;;; sta pCount ;prefixNum set up above @try_again _GetPrefixGS parmBlock ;get the current prefix bcc @got_prefix ;no error, continue cmp #$4f ;buffer too small? beq @grow_buf ;yes, grow the buffer and try again pha ;else just puke! pea 0 ;subString type (not used) pea 0 ;subStringPtr (not used) pea 0 pha ;put error code on stack @showErr _ErrorWindow pla ;;retrieve button number sec ;we had a problem bra @exit ;just exit @grow_buf ldy #2 lda [@tmpPtr],y ;get returned length word clc adc #4 ;allow for length words pha ;save new length on stack pea 0 ;high word of new size allocation pha ;low word of length pei @pfxHndl+2 ;put handle on stack pei @pfxHndl ldy #4 ;unlock the handle first lda [@pfxHndl],y asl a lsr a ;cleared bit 15 sta [@pfxHndl],y _SetHandleSize ;make the block bigger bcs @memerr ;abort on error ldy #4 ;lock it down again lda [@pfxHndl],y ora #$8000 sta [@pfxHndl],y ldy #2 ;dereference handle again lda [@pfxHndl] sta @tmpPtr sta bufPtr lda [@pfxHndl],y sta @tmpPtr+2 sta bufPtr+2 pla ;retrieve new length of buffer sta [@tmpPtr] ;store in buffer bra @try_again ;go try again @got_prefix ldy #4 ;unlock the handle lda [@pfxHndl],y asl a lsr a sta [@pfxHndl],y pea 0 ;high word of new size allocation ldy #2 lda [@tmpPtr],y ;get the length of the returned string clc adc #4 ;include length words pha ;put on stack for call pei @pfxHndl+2 pei @pfxHndl _SetHandleSize ;resize the handle so it's just the right size ldy @pfxHndl+2 ;return handle to caller ldx @pfxHndl clc ;no error @exit pld ;clean up stack frame pla pla pla pla rts ;############################################################ ;# ;# setPfx - restore prefix to it's original value ;# ;# on entry: ;# Acc = prefix number ;# X,Y = handle to stored prefix ;# ;############################################################ setPfx @tmpPtr equ $01 sta prefixNum ;save prefix number in parm block pha ;make space on stack for temp pointer pha tsc ;make stack frame phd tcd ;;; lda #2 ;2 parms for SetPrefix call ;;; sta pCount stx @tmpPtr sty @tmpPtr+2 ldy #2 ;dereference handle to prefix string lda [@tmpPtr] ;but set pointer to length clc ;word within buffer adc #2 sta bufPtr lda [@tmpPtr],y adc #0 sta bufPtr+2 _SetPrefixGS parmBlock *** added 5-Feb-92 DAL -- Dispose of the input handle; we're done with it pei <@tmpPtr+2 pei <@tmpPtr _DisposeHandle *** end 5-Feb-92 pld ;clean up stack pla pla rts parmBlock pCount dc.w 2 ;always 2 (GetPrefix and SetPrefix) prefixNum dc.w 0 bufPtr dc.l 0 EndP ******************************************************************************* ******************************************************************************* ******************************************************************************* ******************************************************************************* ******************************************************************************* ******************************************************************************* CDevStuff proc import HandleActivate import TheItemPtr ******************************************************************************* * * OpenNewCDevAY * * Input: Pathname in AY * Pointer to small rectangle on stack * * TheItemPtr points to the CDevItem structure, if any (and TheRawCDevNumber * indicates the icon's position in the main list). * * Output: TheCDevWindow in AY (NIL if failed to open) * ******************************************************************************* export OpenNewCDevAY import StartResourceManager import StopResourceManager import AdjustNumCDevsOpen import GetMyMainMenuID import GetCDevList OpenNewCDevAY phb phk plb sta CDevPathname+2 sty CDevPathname stz TheCDevWindow+2 stz TheCDevWindow lda 5,s sta smallRectPtr lda 7,s sta smallRectPtr+2 pha pha _GetPort pha _GetCurResourceApp pha _MMStartUp _SetCurResourceApp jsl StartResourceManager *** added 6-Feb-92 DAL -- Build the CDev list if we don't already have it jsl GetCDevList jsr FindTheItemPtr lda >TheItemPtr+1 beq @notAlreadyOpen phd lda >TheItemPtr+2 pha lda >TheItemPtr pha tsc tcd ldy #oCDevItemWindow+2 lda [1],y tax dey dey lda [1],y ply ply pld tay bne @isOpen txy beq @notAlreadyOpen @isOpen sta >TheCDevWindow tay txa sta >TheCDevWindow+2 pha phy _SelectWindow brl @exit @notAlreadyOpen *** end 6-Feb-92 lda CDevPathname+2 ldy CDevPathname jsr OpenCDevResourceFork bcc @fine brl @exit @fine sta CDEVResNum ; A is already lda CDEVResNum jsr LoadTheCDev ;resource file number in A bcs @exit jsr UpdateFlagsBuffer ;added 20-Aug-91 DAL jsr CheckMachine bcc @machineOk *** Close the CDev file lda CDevResNum pha _CloseResourceFile jsl StopResourceManager lda #$ffff sta >globalErrorCode bra @exit @machineOK jsr MakeCDevWindow ;invisible window, sets up refcon bcs @exit jsr PushCDevWindPtr _SetPort ;added 3-Mar-91 DAL jsr MakeCDevControls bcs @exit lda nwContentRect pha sec sbc #13 sta nwContentRect lda smallRectPtr+1 beq @noWhoosh pea $8000 pea $0000 ;flag: zoom out pushlong smallRectPtr pushlong #nwContentRect _WhooshRect @noWhoosh pla sta nwContentRect jsr PushCDevWindPtr _ShowWindow lda #1 jsl AdjustNumCDevsOpen jsr InstallRunTask jsr ForceUpdateEvent ;added 13-Oct-91 DAL @exit _SetCurResourceApp _SetPort pla plx ply ply ;throw away rect ptr phx pha plb lda >TheCDevWindow tay lda >TheCDevWindow+2 rtl CDevPathname dc.l 0 TheCDevWindow dc.l 0 TheRefcon dc.l 0 CDevResNum dc.w 0 smallRectPtr dc.l 0 ******************************************************************************* * * FindTheItemPtr * * Inputs: CDevPathname (pointer to class-one string) * * CDevListCount * CDevItemsHandle * CDevPathsHandle * * Outputs: sets >TheItemPtr if we find a CDev item matching this path * ******************************************************************************* import CDevItemsHandle,CDevPathsHandle,CDevListCount FindTheItemPtr lda TheItemPtr+1 beq @dontHave rts @dontHave phd pushlong CDevItemsHandle pushlong CDevPathsHandle lda CDevListCount pha pea 0 tsc tcd @rawNumber equ 1 @count equ @rawNumber+2 @paths equ @count+2 @items equ @paths+4 ldy #4 lda [<@paths],y pha ora #$8000 sta [<@paths],y ;locked handle lda [<@items],y pha ora #$8000 sta [<@items],y ;locked handle ldy #2 lda [<@paths],y tax lda [<@paths] sta <@paths stx <@paths+2 lda [<@items],y tax lda [<@items] sta <@items stx <@items+2 lda <@count beq @done @loop pushlong CDevPathname ldy #oCDevItemPathOffset clc lda [<@items],y adc <@paths tax iny iny lda [<@items],y adc <@paths+2 pha phx ;pushed this item's pathname jsr ExpandThisPath jsr ComparePathnames bcs @tryNext lda <@items+2 sta >TheItemPtr+2 lda <@items sta >TheItemPtr ;;; lda <@rawNumber ;;; jsr FindInSortedList ;;; sta >TheRawCDevNumber bra @done @tryNext clc lda [<@items] adc <@items sta <@items bcc @1 inc <@items+2 @1 inc <@rawNumber dec <@count bne @loop @done ldy #4 lda CDevItemsHandle+2 sta <@items+2 lda CDevItemsHandle sta <@items pla sta [<@items],y ;restored lock state lda CDevPathsHandle+2 sta <@paths+2 lda CDevPathsHandle sta <@paths pla sta [<@paths],y ;restored lock state pla ;discard raw-number count pla ;discard count pla pla ;discard path ptr pla pla ;discard item ptr pld rts * * ComparePathnames * * Input: two pointers to class-one pathnames, on the stack * * Output: BCC if the pathnames match * ComparePathnames phd tsc tcd @one equ 5 @two equ @one+4 lda [<@one] cmp [<@two] sec bne @done inc a tay @compare lda [<@one],y jsr @upcase sta >@cheat+1 lda [<@two],y jsr @upcase @cheat cmp #$7777 sec bne @done dey cpy #2 bcs @compare ;;; clc @done pld plx pla pla pla pla ;discard input pointers phx rts @upcase and #$00ff cmp #$0061 bcc @up cmp #$007b bcs @up and #$00df @up rts * * ExpandThisPath -- input pointer on stack * import ExpandPathBuffer ExpandThisPath lda 3,s sta epath1 lda 5,s sta epath1+2 pushlong #ExpandPathParms pea $200e ;ExpandPathGS jsl $e100b0 lda #ExpandPathBuffer+2 sta 3,s lda #^ExpandPathBuffer sta 5,s rts ExpandPathParms dc.w 2 ;pcount epath1 dc.l 0 dc.l ExpandPathBuffer export ExpandPathBuffer ExpandPathBuffer dc.w ExpandPathLength+4 ds.b ExpandPathLength+2 ******************************************************************************* * * OpenCDevResourceFork * * Inputs: AY = pointer to class-one pathname * * Output: CLC, A=resource file number * SEC, A=error code * ******************************************************************************* OpenCDevResourceFork pha ;space for OpenResourceFile result pea $7777 ;requested access (place-holder) pushlong #0 ;map address pha phy jsl WhatAccessRequest sta 1+4+4,s ;store over jsr GetAndFixPrefs ;3-Dec-91 DAL _OpenResourceFile jsr RestorePrefs ;3-Dec-91 DAL plx bcs @out ;if there's an error, don't kill A txa @out rts ******************************************************************************* * * Miscellaneous subroutines * ******************************************************************************* GetAndFixPrefs _GetSysPrefsGS oldPrefs lda oldPrefs+2 and #$1fff ;keep the reserved bits ora #$C000 ;turn on Use Volume Mount Dialog ;no Cancel button! 3-Dec-91 DAL sta myPrefs+2 _SetSysPrefsGS myPrefs rts RestorePrefs php ;3-Dec-91 DAL pha ;3-Dec-91 DAL _SetSysPrefsGS oldPrefs pla ;3-Dec-91 DAL plp ;3-Dec-91 DAL rts oldPrefs dc.w 1 ;1 parameter dc.w 0 ;the old SysPrefs myPrefs dc.w 1 dc.w 0 ;my modified preferences ******************************************************************************* * * WhatAccessRequest * * If the boot file system is AppleShare, return $0001 (read-only). * Otherwise, return $0000 (as-allowed). * * This result is used for opening the resource forks. * ******************************************************************************* export WhatAccessRequest WhatAccessRequest _DInfoGS infoParms ;get the device name for the boot device bcs oops _VolumeGS volParms ;now do a Volume call to get the ID of the boot FST bcs oops lda fst_id ;get the ID number of the boot FST cmp #$000D ;is it AppleShare? bne local_boot ;no, must have been a local boot lda #1 ;return read-only access rtl local_boot oops lda #0 ;as-allowed rtl infoParms dc.w 2 ;pCount dc.w 1 ;device number (boot device is ALWAYS device 1) dc.l devName ;pointer to result buffer for device name devName dc.w 36 ;buffer length devName2 dc.w 0 ;string length ds.b 32 ;buffer for device name volParms dc.w 5 ;pCount dc.l devName2 ;pointer to device name dc.l volname ;pointer to volume name buffer dc.l 0 ;total blocks dc.l 0 ;free blocks fst_id dc.w 0 ;FST ID number volname dc.w 36 ;buffer length volname2 dc.w 0 ;string length ds.b 32 ;string buffer ******************************************************************************* * * LoadTheCDev: * * Input: Resource file number in A * * LoadResource(rCDevCode,1) * * Output: SEC if failure * CLC if JumpToCDev vector set up * ******************************************************************************* LoadTheCDev jsr UseOnlyThisFile pha ;save old file phx ;and depth pha pha pea rCDevCode pushlong #1 _LoadResource sta @error phd tsc tcd lda [3] sta JumpToCDev+1 ldy #1 lda [3],y sta JumpToCDev+2 pld pla pla plx pla jsr RestoreOldFile lda @error cmp #1 rts @error dc.w 0 ******************************************************************************* * * CallTheCDev * * Stack must be set up for transferring control to the CDev: * * LONG Space for result * WORD Message * LONG Data1 * LONG Data2 * ******************************************************************************* CallTheCDev JumpToCDev jml >$777777 ******************************************************************************* ******************************************************************************* * * UseOnlyThisFile * * Input: Resource file number in A * * Output: Current resource file is set, depth is 1 * Previous file in A, previous depth in X * ******************************************************************************* UseOnlyThisFile pha pha ;space for cur resource file _GetCurResourceFile pha ;space for old depth pea 1 _SetResourceFileDepth lda 5,s ;retrieve input pha _SetCurResourceFile plx ;get old depth pla ;get old file ply ;throw away copy of input rts ******************************************************************************* * * RestoreOldFile * * Input: Resource file in A, depth in X * ******************************************************************************* RestoreOldFile pha ;resource file number phx ;space for old depth phx ;new depth _SetResourceFileDepth plx ;throw away _SetCurResourceFile rts ******************************************************************************* * * LoadTheFlags * * LoadResource(rCDevFlags,1), return handle * * Input: A = resource file number * * Output: handle in AX * ******************************************************************************* LoadTheFlags jsr UseOnlyThisFile phx pha pha pha pea rCDevFlags pushlong #1 _LoadResource pla sta @temp pla sta @temp+2 pla plx jsr RestoreOldFile lda @temp+2 ldx @temp rts @temp dc.l 0 ******************************************************************************* * * CheckMachine--return SEC if the ROM version is bad * ******************************************************************************* IDRoutine equ $FE1F ;returns ROM version in Y CheckMachine pha pha pha pha ;space for FWEntry results pha ;a pha ;x pha ;y pea IDRoutine _FWEntry ply plx pla pla sty @ROMVersion sep #$20 lda flagMachine cmp @ROMVersion rep #$20 bcc @ok beq @ok rts @ok *** The ROM version is okay--now try calling MachineCDEV to see if *** we should really display this sucker lda theFlags and #wantMachine beq @didMachine lda #0 pha pha pea MachineCDev pha pha pha pha jsl CallTheCDev pla ply bne @didMachine tay bne @didMachine sec rts ;returned zero--don't display @didMachine clc rts @ROMVersion dc.w 0 ******************************************************************************* * * MakeCDevWindow--return pointer in TheCDevWindow, SEC if failure * * Input: TheItemPtr points to the CDEVItem structure (or NIL if none!) * ******************************************************************************* import UseStandardPalette,PushMainWindPtr import ListMemHandle,MainWindPtr,RebuildMemRec MakeCDevWindow phd pha pha ;space for refcon pointer pushlong CDevPathname tsc tcd thePathname equ 1 myRefcon equ thePathname+4 *** Allocate the Refcon storage space lda [TheItemPtr sta [TheItemPtr+2 sta [TheRawCDevNumber sta [TheItemPtr+1 bne @haveItem brl @noItem @haveItem phd lda >TheItemPtr+2 pha lda >TheItemPtr pha tsc tcd ldy #oCDevItemWindow+2 lda TheCDevWindow+2 sta [1],y dey dey lda TheCDevWindow sta [1],y *** If the main window exists, update the icon state in the list & inval window lda MainWindPtr+1 beq @noMainWind *** 7-Feb-92 DAL -- If we just opened something that we have a list entry for, mark it open lda ListMemHandle+2 ldy ListMemHandle sta 3 sty 1 ldy #2 lda [1],y tax lda [1] sta 1 stx 3 lda >TheItemPtr tay lda >TheItemPtr+2 jsr FindListIndex pha pha ;space for _Multiply pha ;item index pea LISTMEMSIZE _Multiply clc pla adc <1 sta <1 pla adc <3 sta <3 ldy #oMemState lda [1],y ora #$0002 ;open sta [1],y *** end 7-Feb-92 @noMainWind pla pla pld @noItem *** end 6-Feb-92 clc @exit pla pla pla pla pld rts nwParms dc.w nwEnd-nwParms ;length dc.w $C0C8 ;frame (title, close, invisible, qContent) nwTitle dc.l 0 ;title (none yet) dc.l 0 ;refcon dc.w 0,0,0,0 ;zoom rect dc.l windColorTbl ;color table dc.w 0,0 ;origin dc.w 0,0 ;data height & width dc.w 1000,1000 ;max height & width dc.w 0,0 ;scroll ver & scroll hor dc.w 0,0 ;page ver, page hor dc.l 0 ;info refcon dc.w 0 ;info height dc.l 0 ;defproc dc.l 0 ;no info defproc dc.l CDevContentDraw ;content defproc nwContentRect dc.w 40,30,120,590 ;position rectangle dc.l $ffffffff ;plane (front) dc.l 0 ;storage nwEnd windColorTbl dc.w $0000,$0f00,$020f,$f0f0,$00f0 GrabSystemColorTable pha pha ;space for LoadResource pea $8010 ;rWindColor pea $07ff pea $0001 _LoadResource plx ply bcs @oops phy phx pushlong #windColorTbl pushlong #10 _HandToPtr @oops rts ******************************************************************************* * * BuildWindowTitle * ******************************************************************************* BuildWindowTitle lda #oCDevItemName jsr PushRefconOffset lda #owbWindTitle+1 jsr PushRefconOffset pushlong #16 _BlockMove ldy #owbWindTitle+1 lda [saveMenuGlobals pei 3 pei 1 pushlong #myTaskRec pushlong #16 _BlockMove pha ;result space pha ;input mask (ignored) pushlong #myTaskRec _TaskMasterDA pha lda >saveMenuGlobals ;;; and #$7fff ;restore old menu help setting asl a lsr a ;cleared bit 15 pha _MenuGlobal pla ;throw away MenuGlobal result pla ;pull TaskMasterDA result cmp #activateEvt bne @notActivate lda myTaskMods *** added 17-Mar-93 DAL and #1 bne @normal jsl DeactivateIfNotMyWindowNext rts @normal *** end 17-Mar-93 jsl HandleActivate rts @notActivate cmp #wInControl bne @notHit lda theFlags and #wantHit beq @didHit pha pha ;space for HitCDEV result pea HitCDev pushlong myTaskData2 ;data1=control handle *** push data2 = the control ID, or $FFFFFFFF if this is not an extended control lda #$ffff pha pha pushlong myTaskData2 _GetCtlID ;data2 = control ID jsl CallTheCDev pla pla jsr SetupFromBRAM @didHit @notHit @allThrough rts ******************************************************************************* * * SimulateEditEvents -- use event record at <1, theFlags * * If the event is a keypress for an Edit item, call SystemEdit and * return CLC to say we handled it. * ******************************************************************************* SimulateEditEvents lda theFlags and #wantEdit beq @notMe lda [<1] ;event.what cmp #3 ;keyDownEvt beq @key cmp #5 ;autoKeyEvt beq @key @notMe sec rts @key ldy #14 ;offset to modifiers lda [<1],y and #$0100 ;command key? beq @notMe ldy #2 ;offset to message lda [<1],y and #$00ff cmp #'a' bcc @notLC and #$df ;uppercase @notLC ldx #1 ;1 = code for Undo cmp #'Z' beq @gotIt inx ;2 = code for Cut cmp #'X' beq @gotIt inx ;3 = code for Copy cmp #'C' beq @gotIt inx ;4 = code for Paste cmp #'V' bne @notMe @gotIt pha ;space for result phx ;edit code _SystemEdit pla ;discard result clc rts ******************************************************************************* myTaskRec myTaskWhat dc.w 0 myTaskMsg dc.l 0 dc.l 0 ;when myTaskWhere dc.w 0,0 myTaskMods dc.w 0 myTaskData dc.l 0 myTaskMask dc.l $001fffff ;everything (5.0.3) dc.l 0 ;lastClickTick dc.w 0 ;click count myTaskData2 dc.l 0 ;task data 2 myTaskData3 dc.l 0 ;task data 3 myTaskData4 dc.l 0 ;task data 4 dc.w 0,0 ;last click point saveMenuGlobals dc.w 0 ******************************************************************************* * * GetCDevRectangle * ******************************************************************************* ;;; import MainResFile GetCDevRectangle lda flagDataRect+6 sta nwContentRect+6 lda flagDataRect+4 sta nwContentRect+4 lda flagDataRect+2 sta nwContentRect+2 lda flagDataRect sta nwContentRect lda theFlags and #wantRect beq @didRect pha pha pea RectCDEV pushlong #nwContentRect lda #0 pha pha jsl CallTheCDev pla pla @didRect jsr CenterTheRect *** if there's a rectangle saved, use it! pha _GetCurResourceFile lda >MainResFile pha _SetCurResourceFile pha pha ;space for result pea rTwoRects lda #oCDevItemName jsr PushRefconOffset _RMLoadNamedResource plx ply bcs @exit phy phx ;re-push rTwoRects(1) handle phd tsc tcd ldy #2 lda [<3],y tax lda [<3] sta <3 stx <5 ;derefed rTwoRects jsr Bump3by8for640 ldy #2 lda [3] ora [3],y beq @rectIsZero pushlong #nwContentRect lda nwContentRect+2 eor #$ffff inc a pha lda nwContentRect eor #$ffff inc a pha _OffsetRect pushlong #nwContentRect ldy #2 lda [3],y pha lda [3] pha _OffsetRect @rectIsZero pld plx plx ;discard long @exit _SetCurResourceFile rts Bump3by8for640 pha _GetMasterSCB pla and #$0080 beq @ok lda #8 ;offset to 640 rectangle clc adc <3 sta <3 bcc @ok inc <5 @ok rts ****************************************************************************** * * CenterTheRect -- if the rectangle is at (0,0) still, * move it somewhere near center-screen * ******************************************************************************* CenterTheRect lda nwContentRect ora nwContentRect+2 bne @TopLeftNotZero pushlong #nwContentRect jsr PushXOffset jsr PushYOffset _OffsetRect @TopLeftNotZero rts PushXOffset pha _GetMasterSCB pla ldx #640 and #$0080 bne @gotRes ldx #320 @gotRes sec lda nwContentRect+6 sbc nwContentRect+2 sta @temp txa sec sbc @temp lsr a plx pha phx rts @temp dc.w 0 PushYOffset sec lda nwContentRect+4 sbc nwContentRect cmp #200-23 bcc @ok lda #200-23 @ok eor #$ffff inc a clc adc #200-23 lsr a clc adc #23 plx pha phx rts ******************************************************************************* * * CDevContentDraw -- bank register not set! * ******************************************************************************* CDevContentDraw pha _GetCurResourceFile *** Get resource file number from owbResFileNum in refcon structure pha pha ;space for GetWRefCon pha pha ;space for GetPort _GetPort _GetWRefCon phd tsc tcd ldy #owbResFileNum lda [3],y pld plx plx ;discard refcon pointer pha _SetCurResourceFile pha pha _GetPort _DrawControls _SetCurResourceFile rtl ******************************************************************************* * * MakeCDevControls * * Let the CDev create all its controls * ******************************************************************************* MakeCDevControls lda theFlags and #wantCreate beq @createByResource pha pha pea CreateCDEV jsr PushCDevWindPtr ;data1=window pointer lda #0 pha pha ;data2=undefined jsl CallTheCDev pla pla bra @didCreate * * wantCreate is off, so we will create controls from the CDev's * rControlList ID = 1 resource. * @createByResource pha pha ;space for result jsr PushCDevWindPtr pea 9 ;resourceToResource pushlong #1 ;ID=1 _NewControl2 pla pla ;(ignore result) @didCreate jsr HideAllControls lda theFlags and #wantInit beq @didInit pha pha pea InitCDev jsr PushCDevWindPtr ;data1=window pointer lda #0 pha pha ;data2=undefined jsl CallTheCDev pla pla @didInit jsr ShowAllControls clc rts ******************************************************************************* * * HideAllControls * ******************************************************************************* HideAllControls sec bra ShowHideAll ******************************************************************************* * * ShowAllControls * ******************************************************************************* ShowAllControls clc ShowHideAll ror HideFlag pha pha ;space for oneCtlHandle jsr PushCDevWindPtr _GetWControls phd tsc tcd oneCtl equ 3 @while lda MyPaletteActive bne @alreadyActive lda #1 sta >MyPaletteActive pha pha ;space for result pea $000f ;table number to use lda #0 pha pha ;table pointer = NIL pea $8000 ;use 640 colors even in 320 mode ; _UseColorTable ldx #$1612 jsl $e10000 pla sta >ColorInfoHandle pla sta >ColorInfoHandle+2 @alreadyActive rtl RestorePalette phb phk plb lda MyPaletteActive beq @notActive lda IgnoreTheDeactivate stz IgnoreTheDeactivate bne @ignore stz MyPaletteActive pushlong ColorInfoHandle pea $0000 ;flags ; _RestoreColorTable ldx #$1712 jsl $e10000 @ignore @notActive plb rtl ******************************************************************************* * * DeactivateIfNotMyWindowNext * * Calls HandleActivate(A=deactivate) *if* the front window is NOT mine, * because if the front window *is* mine then we can just keep the cool * color table instead of reverting to the application colors, and then * re-instating my cool colors again, which is really icky to watch. * ******************************************************************************* export DeactivateIfNotMyWindowNext DeactivateIfNotMyWindowNext import TheNDAStructure pha pha _FrontWindow plx ply bne @notNIL txa beq @isNIL @notNIL tya cmp >MainWindPtr+2 bne @notMain txa cmp >MainWindPtr beq @isMine @notMain pha pha ;space for GetAuxWindInfo phy phx ;window pointer for GetAuxWindInfo _GetAuxWindInfo phd tsc tcd ldy #24 lda [3],y tax iny iny lda [3],y pld ply ply cmp #^TheNDAStructure bne @notMine cpx #TheNDAStructure beq @isMine @isNIL @notMine lda #0 jsl HandleActivate @isMine rtl export IgnoreOneDeactivate IgnoreOneDeactivate lda >IgnoreTheDeactivate inc a sta >IgnoreTheDeactivate rtl MyPaletteActive dc.w 0 ColorInfoHandle dc.l 0 IgnoreTheDeactivate dc.w 0 EndP end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.makeout b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.makeout new file mode 100644 index 0000000..e005ddc --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.makeout @@ -0,0 +1 @@ +Set Echo 1 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.rez b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.rez new file mode 100644 index 0000000..6959b40 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/CtlPanel.rez @@ -0,0 +1 @@ +/************************************************************* * * Control Panel 2.0 resources * * Copyright 1991-1993 Apple Computer, Inc. * All Rights Reserved * ************************************************************* * * REVISION HISTORY * * 13-Feb-91 Dave Lyons * Here it is. * * 19-Feb-91 DAL * Commented the control templates a little. * Took out extra stuff in version-string LETextBox2 resource. * * 25-Feb-91 DAL * Added rVersion(1) and rComment(2) resources. * * 22-Mar-91 DAL * Version 2.0d6. * * 30-Mar-91 DAL * Version 2.0d7. * * 1-Apr-91 DAL * Version 2.0d8. * * 7-Apr-91 DAL * Version 2.0d9. * * 16-Apr-91 DAL * Version 2.0d10. * * 17-Apr-91 DAL * Version 2.0d11. * * 19-Apr-91 DAL * Version 2.0d11. Added Apple-H key equiv for Help button. * * 30-Apr-91 DAL * Version 2.0d12. * * 13-May-91 DAL * Version 2.0d13. * * 3-Jun-91 DAL * Version 2.0d14. Uses new rVersion template; fixed the * Apple-H key equivalent (modifiers were wrong). * Added rIcon($58) for X-ing out a CDev we couldn't load. * * 4-Jun-91 DAL * Changed keyCareBits from $3B00 to $3900 so that Apple-shift-H * and Apple-shift-? will work. * * 13-Jun-91 DAL * Added ellipsis to About button. Version 2.0d15. * * 24-Jun-91 DAL * Version 2.0d16. * Made the About... button invisible. * * 25-Jun-91 DAL * Version 2.0d17. * * 27-Jun-91 DAL * Version 2.0d18. * Removed dead stuff (About... button). * * 8-Jul-91 DAL * Version 2.0d19. * * 23-Jul-91 DAL * Version 2.0d20. * * 20-Aug-91 DAL * Version 2.0d21 for 6.0d46+. * * 3..4-Sep-91 DAL * Version 2.0d22 for 6.0d47. * Added rTwoRects(1) to record main window position. * * 9-Sep-91 DAL * Version 2.0d23 for 6.0d48. * * 12-Sep-91 DAL * Version 2.0d24 for 6.0d49. * * 24-Sep-91 DAL * Version 2.0d25 for 6.0d51. * * 2-Oct-91 DAL * Version 2.0d26 for 6.0d52. * * 12-Oct-91 DAL * Version 2.0d27 for 6.0d53. * * 25-Oct-91 DAL * Version 2.0d28 for 6.0d55. * * 29-Oct-91 DAL * Removed the "X" resource (moved it to Sys.Resources). * * 30-Oct-91 DAL * Version 2.0d29 for 6.0d56. * * 11-Nov-91 DAL * Version 2.0d30 for 6.0d57. * * 19-Nov-91 DAL * Version 2.0d31 for 6.0d59. * * 3-Dec-91 DAL * Version 2.0d32 for 6.0d60. * * 9-Dec-91 DAL * Version 2.0d33 for 6.0d61. * * 27-Jan-92 DAL * Version 2.0d34 for 6.0d66. * * 5-Feb-92 DAL * Version 2.0d35 for 6.0d70 (GM1?). * * 7-Feb-92 DAL (for d70) * Version 2.0 final. * Adjusted horizontal position of the version string control. * ************************************************************* * * 16-Mar-92 DAL (for 6.0.1d2) * Version 2.1d1. * * 2-Jul-92 DAL * Version 2.1d6. * * 15-Jul-92 DAL (for 6.0.1d7) * Version 2.1d7. * * 12-Aug-92 DAL (for 6.0.1d9) * Version 2.1d9. * * 3-Sep-92 DAL (for 6.0.1d10) * Version 2.1d10. * * 28-Oct-92 DAL (for 6.0.1d12) * Version 2.1d12. * * 3-Mar-93 SS (for 6.0.1d14) * Version 2.1d14. * * 16-Mar-93 SS (for 6.0.1d15) * Version 2.1d15. * * 1-Apr-93 SS (for 6.0.1d16) * Version 2.1 (release) * * 22-Apr-93 DAL (for 6.0.1d17) * Moved version number to make it pretty. * *************************************************************/ #include "typesiigs.r" #define CTLLST_00001003 $1003 #define CTLTMP_00000001 1 #define CTLTMP_00000002 2 #define CTLTMP_00000003 3 // #define CTLTMP_00000004 4 #define CTLTMP_00000005 5 /* #define PSTR_00010002 $10002 */ #define PSTR_00010003 $10003 #define PSTR_00010004 $10004 #define PSTR_00010005 $10005 #define WPARAM1_00000FFA 1 #define WCOLOR_00000001 $07ff0001 resource rVersion(1) { { 2, 1, 0, release, $00 }, verUS, "Control Panel", "Copyright 1990-93 Apple Computer, Inc." }; resource rComment(2) { "To use this Desk Accessory, put it in the Desk.Accs folder " "inside your System folder. The next time you start your system, " "ÒControl PanelsÓ will appear under the Apple menu." }; // --- Control List Definitions resource rControlList (CTLLST_00001003, $0000) { { CTLTMP_00000001, // control 1 CTLTMP_00000002, // control 2 CTLTMP_00000003, // control 3 // CTLTMP_00000004, // control 4 CTLTMP_00000005, // control 5 }; }; /* List control, ID=1 */ resource rControlTemplate (CTLTMP_00000001, $0000) { $00000001, // ID { 2, 10,105,106}, // rect listControl {{ $0000, // flag $3400, // moreFlags $00000000, // refCon $0000, // listSize $0003, // listView $0000, // listType $0001, // listStart // $00000000, // listDraw (pointer to draw routine) $0021, // listMemHeight $0012, // listMemSize $00000000, // listRef $00000000 // color ref }}; }; /* Open button, ID=2 */ resource rControlTemplate (CTLTMP_00000002, $0000) { $00000002, // ID { 18,142, 31,232}, // rect simpleButtonControl {{ $0001, // flag $3002, // moreFlags $00000000, // refCon PSTR_00010004, // titleRef 0, // colorTableRef {"\$0D", "\$0D",$0000,$0000} // key equivalents }}; }; /* Help button (help on a CDev), ID=3 */ resource rControlTemplate (CTLTMP_00000003, $0000) { $00000003, // ID { 41,142, 54,232}, // rect simpleButtonControl {{ $0000, // flag $3002, // moreFlags $00000000, // refCon PSTR_00010003, // titleRef 0, // colorTableRef {"H", "h",$0100,$3900} // key equivalents }}; }; /* About the Control Panel button, ID=4 */ // resource rControlTemplate (CTLTMP_00000004, $0000) { // $00000004, // ID // { 75,144, 88,234}, // rect // simpleButtonControl {{ // $0080, // flag (invisible) // $3002, // moreFlags // $00000000, // refCon // PSTR_00010002, // titleRef // 0, // colorTableRef // {"?","/",$0100,$3900} // key equivalents // }}; // }; /* version string, ID=5 */ resource rControlTemplate (CTLTMP_00000005, $0000) { $00000005, // ID { 96,194+22,106,241}, // rect statTextControl {{ $0000, // flag $1000, // moreFlags (text by pointer) $00000000, // refCon 0, // textRef $00000000, // textSize $0000 // just }}; }; /* resource rPString (PSTR_00010002, $0000) { "About..." }; */ resource rPString (PSTR_00010003, $0000) { "Help" }; resource rPString (PSTR_00010004, $0000) { "Open" }; resource rPString (PSTR_00010005, $0000) { " Control Panels " }; // --- rTwoRects resource rTwoRects(1) { { 29, 40, 136, 286 }, // 320 { 29, 40, 136, 286 } // 640 }; // --- Window Templates resource rWindParam1 (WPARAM1_00000FFA, $0000) { $C0C8, // plFrame (frame bits--invisible) PSTR_00010005, // plTitle (title ID) $00000000, // plRefCon { 0, 0, 0, 0}, // plZoomRect WCOLOR_00000001, // plColorTable {$0000, $0000}, // plYOrigin, plXOrigin {$0000, $0000}, // plDataHeight, plDataWidth {$0000, $0000}, // plMaxHeight, plMaxWidth {$0000, $0000}, // plVerScroll, plHorScroll {$0000, $0000}, // plVerPage, plHorPage $00000000, // plInfoText (info RefCon) $0000, // plInfoHeight { 29, 40,136,286}, // plPosition infront, // plPlane CTLLST_00001003, // plControlList $0A09 // plInDesc }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/cbp.aii b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/cbp.aii new file mode 100644 index 0000000..8ee0dfb --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/cbp.aii @@ -0,0 +1 @@ +;;; cbp - check battery parameters. ; ; Michael V. Stein 05/01/90. ; ; © Copyright Apple Computer, 1990. blanks off ;; equates. aug_param equ $5e bit 0 set means no closed captioning ;bit 1 set means standard time ; clear if daylight savings time ;bit 2 set means not to have auto daylight savings ; clear means to have auto daylight savings ;bit 3 and 4 are the amount of menublink to have ;; include files. include '::commonmacros.h' include 'm16.menu' include 'm16.misctool' ;; main program. file proc ;; exported addresses. export cbp cbp phb phk plb jsr cad check auto daylight savings *** jsr cmb check menublink plb rtl ;; ats - adjust the time by seconds. ; ; entry [a, x] = amount of seconds to adjust clock. ; ; exit clock is adjusted. ats sta atsa save change for now stx atsa+2 pha space for result pha space for result pushw #6 get current time based on seconds pushl #0 pushl #buff buffer to use ldx #$3703 jsl $e10000 convert seconds ; adjust the seconds. lda 1,s clc adc atsa sta 1,s lda 1+2,s adc atsa+2 sta 1+2,s plx lo word of seconds ply hi word of seconds pha space for result pha space for result pushw #7 set current time based on seconds phy hi word of seconds phx lo word of seconds pushl #buff buffer to use pushw #$e1e1 kludge to get around bug in misc tools plb kludge to get around bug in misc tools plb kludge to get around bug in misc tools ldx #$3703 jsl $e10000 convert seconds pla plx phk kludge to get around bug in misc tools plb kludge to get around bug in misc tools rts atsa ds.b 2 buff ds.b 10 ;; cad - check auto daylight savings. ; ; entry battery RAM is as defined above. ; ; exit If the machine thinks it is not synched with the ; real status of daylight savings, the clock is either ; advanced or decreased by an hour. cad ldx #aug_param jsr rbp read battey parameter sta cada tax and #$4 bne cad3 if no auto daylight savings check phx jsr gds get daylight savings flag pla and #2 bne cad1 if machine thinks this is standard time ; machine thinks this is daylight savings time. bcc cad3 if it actually is daylight savings ; fall back one hour. lda cada ora #$2 set bit 1 - it is standard time pha save new value for now lda #-3600 ldx #^-3600 bra cad2 ; machine thinks that this is standard time. cad1 bcs cad3 if actually is standard time ; spring ahead one hour. lda cada and #$fd pha lda #3600 ldx #^3600 cad2 jsr ats adjust time in seconds pla ldx #aug_param jmp wbp write battery parameter and return cad3 rts cada dc.w 0 ;; cmb - check menu blink. ; ; entry none. ; ; exit menu blink is set as battery params dictate. ; ; ;cmb ldx #aug_param ; jsr rbp read battery parameter ; lsr a ; lsr a ; lsr a ; and #$3 amt of menublink to use ; pha ; _SetMItemBlink ; rts ; ;; gds - get daylight status. ; ; entry none. ; ; exit (c) set if standard time, clear if daylight savings. gds pha space for result pha space for result pha space for result pha space for result _ReadTimeHex lda 6,s get month and filler and #$ff remove filler cmp #3 bcc gds1a if not at least april, standard time cmp #3 bne gds3 if not april ; see if past the first sunday in april. lda 5,s and #$ff get day of month cmp #6+1 bcs gds9 if definetly past the first sunday of the month tax stx gdsa save for now lda 8,s get day of week and #$ff remove extra garbage gds1 cmp #1 beq gds2 if found the first sunday of the month dea dex bpl gds1 if more to check in the month gds1a bra gds8 if definetly standard time gds2 cpx gdsa bne gds9 if past the first sunday of april ; today is the first sunday of april. lda 3,s get hour and year and #$ff remove year cmp #2 bcs gds9 if in daylight savings bra gds8 if standard time gds3 cmp #9 bcc gds9 if defintely daylight savings bne gds8 if defintely standard time lda 5,s and #$ff get day of month in low bye cmp #30-6 bcc gds9 if definetly in daylight savings tax stx gdsa lda 8,s get day of week and #$ff remove extra garbage gds4 cmp #1 beq gds7 if found the last sunday of the month ina cmp #8 bcc gds5 if haven't wrapped lda #1 reset to sunday gds5 inx cpx #30+1 bcc gds4 if more to check in the month bra gds8 if defintely standard time gds7 cpx gdsa bne gds9 if before the last sunday of the month ; today is the last sunday of october. lda 3,s get hour and year and #$ff remove year cmp #2 bra gds10 (c) set if standard time gds8 sec flag standard time bra gds10 gds9 clc flag daylight savings time gds10 plx clear off stack plx plx plx rts gdsa dc.w 0 scratch value ;; rbp - read battery parameter. ; ; entry (x) = parameter to read. ; ; exit (a) = value of parameter. rbp pha space for result phx parameter to read _ReadBparam pla get value rts ;; wbp - write battery parameter. ; ; entry (a) = value of parameter to set. ; (x) = battery parameter to set. ; ; exit battery parameter is set. wbp pha new value phx parameter to set _WriteBparam rts endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/makefile new file mode 100644 index 0000000..beed5c4 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/CtlPanelNDA/makefile @@ -0,0 +1 @@ +# File: makefile # Target: CtlPanel.NDA # Created: Wednesday, February 13, 1991 DAL CtlPanel.NDA ÄÄ ControlPanel.NDA.Load ControlPanel.NDA.Res delete -i CtlPanel.NDA duplicate -y -d ControlPanel.NDA.load CtlPanel.NDA duplicate -y -r ControlPanel.NDA.res CtlPanel.NDA if {AutoDuplicate} == 1 DuplicateIIGS -y -mac CtlPanel.NDA ControlPanel End ControlPanel.NDA.res ÄÄ CtlPanel.rez reziigs CtlPanel.rez -o ControlPanel.NDA.res ControlPanel.NDA.Load Ä CtlPanel.aii.obj cbp.aii.obj makefile linkiigs ¶ ## -l -s >ControlPanel.map ¶ -lseg:$1000 main ¶ CtlPanel.aii.obj cbp.aii.obj ¶ -o ControlPanel.NDA.Load -t NDA cbp.aii.obj Ä cbp.aii Makefile ::commonmacros.h asmiigs cbp.aii .aii.obj Ä .aii asmiigs {default}.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/ASPCalls.c b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/ASPCalls.c new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/ASPCalls.c @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/ASPDefs.h b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/ASPDefs.h new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/ASPDefs.h @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/DIRECTCONNECT.R b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/DIRECTCONNECT.R new file mode 100644 index 0000000..caea518 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/DIRECTCONNECT.R @@ -0,0 +1 @@ +/*******************************************************************/ /* /* DIRECTCONNECT.r /* /* Copyright (C) 1988-1992 /* Apple Computer, Inc. /* All Rights Reserved /* /* This file contains the source of the resources needed to build the /* Direct Connect CDEV. /* /*******************************************************************/ #include "typesiigs.r" resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"00000000000FFFFFFFFFFFFFFFFF" $"FFFFFFFFFFF0FFFFFFF000000000" $"0000000000F0FFFFFFF0FFFFFFFF" $"FFFFFFFFF0F0FFFFFFF0FCCCCCCC" $"DDDDDDDDD0F0FFFFFFF0FFFFFFFF" $"DDDDDDDDD0F0FFFFFFF0FCCCCCCF" $"DDDDDDDDD0F0FFFFFFF0FFFFFFFF" $"DDDDDDDDD0F0FFFFFFF0FCCCCCCC" $"DDDDDDDDD0F0FFFFFFF0FFFFFFFF" $"DDDDDDDDD0F0FFFFFFF0FFFCCCCC" $"DDDDDDDDD0F0FFFFFFF0FFFFFFFF" $"0000000000F0FFFFFFF0FCCCCCFC" $"FFFFFFFFFFF0FFFF0000FFFFFFFF" $"00000000000FFFFF0FF0FCCCCCCF" $"FFFFFFFFFF0FFFFF0FF000000000" $"FFFFFFFFFF0000000FFFFFFFFFFF" $"FFFFFFFFFF0FFFFF0FF8FFFFFFFF" $"33333333330000000FF4FCCCFFFF" $"FFFFFFFFFF0FFFFF0FFFFFFFFFFF" $"00000000000FFFFF000000000000", $"fffffffffff00000000000000000" $"ffffffffffff0000000fffffffff" $"ffffffffffff0000000fffffffff" $"ffffffffffff0000000fffffffff" $"ffffffffffff0000000fffffffff" $"ffffffffffff0000000fffffffff" $"ffffffffffff0000000fffffffff" $"ffffffffffff0000000fffffffff" $"ffffffffffff0000000fffffffff" $"ffffffffffff0000000fffffffff" $"ffffffffffff0000000fffffffff" $"ffffffffffff0000000fffffffff" $"ffffffffffff0000ffffffffffff" $"fffffffffff00000ffffffffffff" $"fffffffffff00000ffffffffffff" $"ffffffffffffffffffffffffffff" $"ffffffffffffffffffffffffffff" $"ffffffffffffffffffffffffffff" $"fffffffffff00000ffffffffffff" $"fffffffffff00000ffffffffffff"; }; read rCDEVCode (1,Convert) "DIRECTCONNECT.Load"; resource rCDEVFlags (1) { wantInit+wantClose+wantCreate+wantAbout, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ {0,0,131,200}, /* DataRect {0,0,160,200} */ "DC Printer", /* Name */ "Scott Kuechle & Tim Harrington", /* Author */ "v1.1"; /* VersStr */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/DirectConnect.c b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/DirectConnect.c new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/DirectConnect.c @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/DirectConnectDefs.h b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/DirectConnectDefs.h new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/DirectConnectDefs.h @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/ErrorHandling.c b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/ErrorHandling.c new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/ErrorHandling.c @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/GSOS.c b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/GSOS.c new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/GSOS.c @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/GSOS.h b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/GSOS.h new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/GSOS.h @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/LIST.H b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/LIST.H new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/LIST.H @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/MakeFile b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/MakeFile new file mode 100644 index 0000000..0d4afd9 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/MakeFile @@ -0,0 +1 @@ + CDEV = DirectConnect {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" if {dup} # test whether we should duplicateiigs duplicateiigs -m -y {CDEV} {CDEV} end {CDEV}.Load Ä ¶ dc.aii.obj ¶ sul.aii.obj LinkIIGS -x -lseg scott ¶ dc.aii.obj ¶ sul.aii.obj ¶ -o {CDEV}.Load dc.aii.obj Ä dc.aii asmiigs dc.aii sul.aii.obj Ä sul.aii asmiigs sul.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/NewControls.h b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/NewControls.h new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/NewControls.h @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/NewInterface.h b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/NewInterface.h new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/NewInterface.h @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/RESMGR.H b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/RESMGR.H new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/RESMGR.H @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/TYPES.H b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/TYPES.H new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/TYPES.H @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/dc.aii b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/dc.aii new file mode 100644 index 0000000..60bde40 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/dc.aii @@ -0,0 +1 @@ +******************************************************************************* * * DirectConnect CDEV * * * Copyright 1988,1989 Apple Computer, Inc. * All rights reserved * * * Written by : Tim Harrington * and * Scott Kuechle * * ******************************************************************************* * * Revision History * * 1.0e14 3/21/89 TGH -First try at this thing. * 1.0d16 3/29/89 TGH -First public release. * 1.1d1 3/20/90 MVS Version 1.1 * User can now select LaserWriter so postscript files * can be generated. Lists are now sorted. Makes sure * that starting selection is always visible. * A whole bunch of changes by Monte. * 8/15/91 BAK Added dialog if error on read or write PRINTER.SETUP. * 8/16/91 BAK If AppleShare FST is the boot FST (ie, we booted from * the network), then the path to PRINTER.SETUP is as * follows: "{GetUserPath FST specific call}:Printer.Setup". * ******************************************************************************* msb off string asis INCLUDE 'M16.UTIL' INCLUDE 'M16.GSOS' INCLUDE 'M16.CONTROL' INCLUDE 'M16.MISCTOOL' INCLUDE 'M16.LIST' INCLUDE 'M16.MEMORY' INCLUDE 'M16.INTMATH' INCLUDE 'M16.PRINT' include 'M16.QUICKDRAW' include 'M16.WINDOW' include 'M16.DIALOG' include 'e16.dialog' INCLUDE 'E16.CONTROL' ENTRY bogusCDEV,\ InitCDEV,\ CloseCDEV,\ CreateCDEV,\ AboutCDEV ENTRY C2Printer,CPort ENTRY WriteData ENTRY screenF :data import sul zp0 equ 0 ;Zero page use zp1 equ zp0+4 zpsize equ zp1+4 ;Length of zero page. MemRecSize equ 5 ;Size of each member record. *############################################################################## * * Below is the main entry point for this CDEV. All messages (commands) * passed to the CDEV by the Control Panel go through this point. This CDEV * handles only 4 of the standard CDEV calls. These are listed below: * * Call Name Call Number * --------- ----------- * INIT 4 * CLOSE 5 * CREATE 7 * ABOUT 8 * * ON ENTRY: C,X,Y = Unknown * Stack = Result Space (Long) * Message (Word) * Data1 (Long) * Data2 (Long) * Return Address (3 Bytes) * * Message = Call Number * Data1 = Window Grafport * Data2 = Unused * * ON EXIT C,X,Y = Changed * Stack = Result (Long) * * Result = 0 (always) * *############################################################################## main PROC ENTRY Data1,Data2 ENTRY ControlList ENTRY AboutList ENTRY MErrorList ENTRY Mem1RecH,Mem2RecH ENTRY MyID ENTRY List1Count,List2Count ENTRY List1ID,List2ID ENTRY CreateError phb ;Save old data reg phk ;Set data reg = prog reg plb lda 5,s ;Load DATA2 off the stack sta Data2 ;and store it locally. lda 7,s sta Data2+2 lda 9,s ;Load DATA1 off the stack sta Data1 ;and store it locally. lda 11,s sta Data1+2 lda 13,s ;Load MESSAGE off the sta Message ;stack and store it locally. lda 1,s ;Bump the stack up to prepare sta 11,s ;to take off the 3 parameters lda 3,s ;that we stored about. sta 13,s PullWord ;Get rid of MESSAGE space PullLong ;Get rid of DATA1 space PullLong ;Get rid of DATA2 space lda Message ;Load the call number cmp #12 ;Compare againts max+1 bcs ret_addr ;If >= max+1, just leave. pea ret_addr-1 ;Push our return address asl a ;Times 2 into word table tax ;Move into index reg lda cdev_calls,x ;Load the address of call handler pha ;Push the address of routine on the stack rts ;Jump to the call handler ret_addr lda #0 ;Make sure we return zeros. sta 5,s sta 7,s plb ;Restore NDAs data bank register rtl ;Return to Control Panel NDA. Message dc.w 0 ;Local storage for MESSAGE Data1 dc.l 0 ;Local storage for DATA1 Data2 dc.l 0 ;Local storage for DATA2 MyID dc.w 0 CreateError dc.w 0 ;0 = no error, 1 = error cdev_calls dc.w bogusCDEV-1 ;0 ;Null dc.w bogusCDEV-1 ;1 ;MachineCDEV dc.w bogusCDEV-1 ;2 ;BootCDEV dc.w bogusCDEV-1 ;3 ;ShutdownCDEV dc.w InitCDEV-1 ;4 dc.w CloseCDEV-1 ;5 dc.w bogusCDEV-1 ;6 ;EventsCDEV dc.w CreateCDEV-1 ;7 dc.w AboutCDEV-1 ;8 dc.w bogusCDEV-1 ;9 ;RectCDEV dc.w bogusCDEV-1 ;10 ;HitCDEV dc.w bogusCDEV-1 ;11 ;RunCDEV ControlList dc.l List2Control dc.l List1Control dc.l SText1Control ;Port: dc.l SText2Control ;Printer: dc.l 0 LeftEdge equ 10 RightEdge equ 190 TL1Vert equ 18 BR1Vert equ 60 TL2Vert equ 79 BR2Vert equ 121 TL3Vert equ 8 BR3Vert equ 18 TL4Vert equ 69 BR4Vert equ 79 List1Control dc.w 14 ;PCount List1ID dc.l 1 ;ID number dc.w TL1Vert dc.w LeftEdge dc.w BR1Vert dc.w RightEdge dc.l $89000000 ;listcontrol ID dc.w 0 ;Flag dc.w $1401+fCtlCanBeTarget+fCtlWantEvents ;More Flags dc.l 0 ;Ref con List1Count dc.w 0 dc.w 0 ;Number seen dc.w 6 ;Single selection Pascal strings List1Start dc.w 1 ;1st member seen dc.l 0 ;Draw routine dc.w 10 ;Height dc.w 5 ;List record size Mem1RecH dc.l 0 List2Control dc.w 14 ;PCount List2ID dc.l 2 ;ID number dc.w TL2Vert dc.w LeftEdge dc.w BR2Vert dc.w RightEdge dc.l $89000000 ;listcontrol ID dc.w 0 ;Flag dc.w $1401+fCtlCanBeTarget+fCtlWantEvents ;More Flags dc.l 0 ;Ref con List2Count dc.w 0 dc.w 0 ;Number seen dc.w 6 ;Single selection Pascal strings List2Start dc.w 1 ;1st member seen dc.l 0 ;Draw routine dc.w 10 ;Height dc.w 5 ;List record size Mem2RecH dc.l 0 SText1Control dc.w 8 ;PCount dc.l 3 ;ID number dc.w TL3Vert dc.w LeftEdge dc.w BR3Vert dc.w RightEdge dc.l $81000000 ;Static text dc.w 1 ;Flag dc.w $1000 ;More flag dc.l 0 dc.l SText1 dc.w SText1Len SText2Control dc.w 8 ;PCount dc.l 4 ;ID number dc.w TL4Vert dc.w LeftEdge dc.w BR4Vert dc.w RightEdge dc.l $81000000 ;Static text dc.w 1 ;Flag dc.w $1000 ;More flag dc.l 0 dc.l SText2 dc.w SText2Len SText1 dc.b 'Select a Port:' SText1Len equ *-SText1 SText2 dc.b 'Select a Printer Type:' SText2Len equ *-SText2 AboutList dc.w 8 ;Pcount dc.l 1 ;ID dc.w 38,5,138,280 dc.l $81000000 dc.w 1 dc.w $1000 dc.l 0 dc.l AboutText dc.w AboutTextLen AboutText dc.b 'The Direct Connect Printer Control Panel allows you to ' dc.b 'select a printer port and type for ' dc.b 'directing your printer output. ' dc.b 'Only the printer and port drivers ' dc.b 'present in your system are listed.' AboutTextLen equ *-AboutText MErrorList dc.w 8 ;Pcount dc.l 1 ;ID dc.w TL1Vert dc.w LeftEdge dc.w BR2Vert dc.w RightEdge dc.l $81000000 dc.w 1 dc.w $1000 dc.l 0 dc.l MErrorText dc.w MErrorTextLen MErrorText dc.b 'An error occured while trying to allocate ' dc.b 'memory. This CDEV requires some free ' dc.b 'memory in order to operate.' MErrorTextLen equ *-MErrorText ENDP *############################################################################## * Below are the CDEV handler routines * *############################################################################## bogusCDEV PROC rts ENDP InitCDEV PROC init ldx #1 ;ctl ID jsr initE ;start the port list from the selected member ldx #2 ;ctl ID ; fall through to start the driver list from the selected member InitE stx inita PushLong #0 ;Result space PushLong Data1 ;Window pointer PushWord #0 ;Push high word of list # Phx ;Push low word of list # _GetCtlHandleFromID pla plx pha ;space for result pushword #0 ;start from top phx ;hi word of list control pha ;lo word of list control _NextMember2 ;find the selected item lda #$34 sta >$ff0001 ;********************** lda 1,s sta >$ff0001 PushLong #0 ;Result space PushLong Data1 ;Window pointer PushWord #0 ;Push high word of list # pushword inita ;Push low word of list # _GetCtlHandleFromID _SelectMember2 ;make sure it is visible rts inita dc.w 0 ENDP *############################################################################## ******************************************************************************* * Times5 * * This routine will multiply the number in X with 5 and return the result * in the variable AddIndex. * * Inputs: X = Number to mulitiply * * Outputs: AddIndex = Result (long) ******************************************************************************* Times5 PROC ENTRY AddIndex PushLong #0 ;Result space phx ;Item number PushWord #5 ;Item length _Multiply PullLong AddIndex ;Offset into member list rts AddIndex dc.l 0 ENDP ;; dam - display alert message. ; ; entry [a,y] = ptr to message. ; ; exit centered caution alert displayed. dam PROC ; ported from NetPrinter CDEV by Monte Benaresh 4/3/91 sec EXPORT damE damE clc ror damF ;save type wanted for now sta dammsg ;save message ptr sty dammsg+2 _InitCursor ;make sure cursor is reset ldx #(320-damw)/2 lda screenF bpl dam1 ;if 320 mode ldx #(640-damw)/2 dam1 stx damtemp+2 ;left edge txa clc adc #damw sta damtemp+6 ;right edge pha pea damtemp >>16 pea damtemp ;template lda #$0000 pha pha ;no filter ;jsr dwh ;disable window highlighting dwh pha pea $0001 ;flag for disabling window highlighting _WindowGlobal pla lda damF bpl dam2 ;if user wants a stop alert _CautionAlert bra dam3 dam2 _StopAlert dam3 ;jsr ewh ;enable window highlighting ewh pha pea $FFFE ;flag for enabling window highlighting _WindowGlobal pla pla ;ignore item hit but get it off the stack rts damt equ 60 damb equ 140 damh equ damb-damt daml equ 170 damr equ 470 damw equ damr-daml damtemp dc.w damt,daml,damb,damr dc.w 2376 ;id dc.b $80 dc.b $80 dc.b $80 dc.b $80 dc.l okitem dc.l damstr dc.l 0 okitem dc.w ok ;okay button dc.w damh-17,190,damh-4,260 dc.w buttonItem dc.l oktext,0,0 damstr dc.w 1348 ;text item dc.w 5,75,5+6*9,280 dc.w StatText+ItemDisable dammsg dc.l 0,0,0 damF dc.w 0 oktext dc.b 2 ;length byte dc.b 'OK' ENDP CloseCDEV PROC phd ;Save the old D reg. tsc ;*Stack -> C reg. sec ;Add 4 bytes sbc #4 ; (actually minus) tcs ;C reg. -> *Stack ina tcd ;C reg. -> *DPage lda CreateError beq @CloseIt jmp Exit @CloseIt ldx List1ID ;Look at list #1 jsr FindSelected ;Find selected member bne @FoundOne ;Branch if we found one! jmp Exit ;No member selected! (just leave) @FoundOne dex ;Minus 1 for multiply jsr Times5 ;Times 5 for each record. ;------------------------------------------------------------------------------ ; Below we add the offset for this record number (# times 5) to the ; base location to the member pointer list. ;------------------------------------------------------------------------------ PushLong Mem2RecH _HLock lda Mem1RecH sta zp0 lda Mem1RecH+2 sta zp0+2 ldy #2 lda [zp0] tax lda [zp0],y sta zp0+2 stx zp0 clc lda AddIndex ;Load low word of offset adc zp0 ;Add it to low word of base sta zp0 ;Store on zero page. lda AddIndex+2 ;Now do the same for the adc zp0+2 ;high word. sta zp0+2 ldy #2 ;Zero page location 00-03 now lda [zp0] ;points to a value that is a tax ;pointer to the string to move. lda [zp0],y ;Get this pointer and hold it pha ;in the X and Y registers. ;Pushlong pointer to string. phx ;Must go onto the stack high-low! ;------------------------------------------------------------------------------ ; Below we move the name of the file from our member list into the ; PRINTER.SETUP file buffer for writting out. We're falling through here ; with the source address pointer on the stack. ;------------------------------------------------------------------------------ PushLong #CPort PushLong #33 _BlockMove PushLong Mem1RecH _HUnlock ;------------------------------------------------------------------------------ ; Now we do the same thing to list #2 that we did for list #1 ;------------------------------------------------------------------------------ ldx List2ID jsr FindSelected bne notExit brl Exit notExit dex jsr Times5 ;------------------------------------------------------------------------------ ; Below we add the offset for this record number (# times 5) to the ; base location to the member pointer list. ;------------------------------------------------------------------------------ PushLong Mem2RecH _HLock lda Mem2RecH sta zp0 lda Mem2RecH+2 sta zp0+2 ldy #2 lda [zp0] tax lda [zp0],y sta zp0+2 stx zp0 clc lda AddIndex ;Load low word of offset adc zp0 ;Add it to low word of base sta zp0 ;Store on zero page. lda AddIndex+2 ;Now do the same for the adc zp0+2 ;high word. sta zp0+2 ldy #2 ;Zero page location 00-03 now lda [zp0] ;points to a value that is a tax ;pointer to the string to move. lda [zp0],y ;Get this pointer and hold it pha ;in the X and Y registers. ;Pushlong pointer to string. phx ;Must go onto the stack high-low! ;------------------------------------------------------------------------------ ; Below we move the name of the file from our member list into the ; PRINTER.SETUP file buffer for writting out. We're falling through here ; with the source address pointer on the stack. ;------------------------------------------------------------------------------ PushLong #C2Printer PushLong #33 _BlockMove PushLong Mem2RecH _HUnlock jsr WriteData bcc NoWriteError ;BAK 8/15/91 import no_iosuccess_msg lda #no_iosuccess_msg ldy #^no_iosuccess_msg jsr damE NoWriteError PushWord #0 ;Result space _PMStatus ;Is the PM running? pla ;0 = no beq Exit ;Branch if not running PushWord #0 ;Unload both drivers _PMUnloadDriver ;Unload printer and port drivers Exit tsc ;*Stack -> C reg. clc ;Subtract 4 bytes. adc #4 ; (actually plus) tcs ;C reg. -> *Stack pld ;Restore old D reg. lda MyID beq @NoID PushWord MyID ;Dispose of all our membory _DisposeAll PushWord MyID ;Dispose of our _DeleteID ;memory ID. @NoID rts export no_iosuccess_msg ;BAK 8/15/91 no_iosuccess_msg dc.b @end-@start @start dc.b 'Unable to read or write' dc.b $0D dc.b 'the printer selection' dc.b $0D dc.b 'from or to boot disk.' @end ******************************************************************************* * FindSelected * * This routine will call the list manager tool to find the selected member * of the specified list and return it in X. * * Inputs: X = List number * * Outputs: X = Item number ( 0 = no item selected) ******************************************************************************* FindSelected PushWord #0 ;Result space (for _ResetMember2) ;------------------------------------------------------------------------------ ; Below we get the control handle for list #n and put it on the stack ; for the _ResetMember2 call. ;------------------------------------------------------------------------------ PushLong #0 ;Result space PushLong Data1 ;Window pointer PushWord #0 ;Push high word of list # phx ;Push low word of list # _GetCtlHandleFromID bcs @BadExit ;------------------------------------------------------------------------------ ; After the above code, the control handle is on the stack for use in the ; next call. ;------------------------------------------------------------------------------ ldx #$131C jsl >$E10000 ;_ResetMember2 plx ;Pull item number bcs @BadExit rts @BadExit lda #0 rts ENDP *############################################################################## AboutCDEV PROC PushLong #0 ;Space for result PushLong Data1 ;Grafport PushWord #0 ;Ptr to single PushLong #AboutList _NewControl2 PullLong rts ENDP *############################################################################## CreateCDEV PROC import damE ;SCB stuff added 4/3/91 by Monte pha ;space for result _GetMasterSCB pla xba and #$8000 sta screenF ; != 0 if 640 mode PushWord #0 ;Result space PushWord #$5000 ;DA type _GetNewID PullWord MyID bcc @GotID jmp @MemoryError1 @GotID PushLong #0 ;Result space PushLong #1 ;Size of block PushWord MyID ;User ID PushWord #$8018 ;Attributes PushLong #0 ;Pointer to mem _NewHandle PullLong Mem1RecH bcc @mem1_ok brl @MemoryError2 @mem1_ok PushLong #0 ;Result space PushLong #1 ;Size of block PushWord MyID ;User ID PushWord #$8018 ;Attributes PushLong #0 ;Pointer to mem _NewHandle PullLong Mem2RecH bcs @MemoryError2 stz List1Count stz List2Count stz PrePickFlag ;0 = don't pre-pick jsr ReadPSetup bcc @NoReadError ;BAK 8/15/91 import no_iosuccess_msg lda #no_iosuccess_msg ldy #^no_iosuccess_msg jsr damE sec @NoReadError bcs @L1 lda CFlag ;If AppleTalk printer is old bne @L1 ;pick, don't search. inc PrePickFlag ;Try to pre-pick selections. ;------------------------------------------------------------------------------ ; Below we add zpsize bytes to the stack and point the direct page register ; there. We need zpsize bytes of zero page in SCAN4DRIVERS. ;------------------------------------------------------------------------------ @L1 phd ;Save the old D reg. tsc ;*Stack -> C reg. sec ;Add 12 bytes sbc #zpsize ; (actually minus) tcs ;C reg. -> *Stack ina tcd ;C reg. -> *DPage jsr Scan4Drivers tsc ;*Stack -> C reg. clc ;Subtract 12 bytes. adc #zpsize ; (actually plus) tcs ;C reg. -> *Stack pld ;Restore old D reg. ; check for missing printer/port drivers added 4/3/91 ; by Monte Benaresh lda List1Count ;check for 0 port drivers bne @maybe_none @none ;display alert lda #no_print_msg ;tell user to install print SW ldy #^no_print_msg jsr damE ;display stop alert bra @continue @maybe_none lda List2Count ;how about printer drivers? beq @none @continue PushLong #0 ;Space for result PushLong Data1 ;WindPort PushWord #3 ;Ptr to Ptrs PushLong #ControlList ;Ptr to control list _NewControl2 PullLong ;Discard zeros stz CreateError ;Flag no error! jsr stl ;sort the lists rts @MemoryError1 stz MyID ;Flag no ID @MemoryError2 lda #0001 ;Flag error! sta CreateError PushLong #0 ;Space for result PushLong Data1 ;WindPort PushWord #0 ;Ptr to single PushLong #MErrorList ;Ptr to control _NewControl2 PullLong ;Discard rts no_print_msg dc.b @end-@start @start dc.b 'Can''t find printer drivers.' dc.b $0D dc.b $0D dc.b 'Please install printer' dc.b $0D dc.b 'software to your startup' dc.b $0D dc.b 'disk.' @end ; maybe put this in a better spot.... ;; stl - sort the lists. ; ; entry scrolling lists have been initialized with id of 1 and 2. ; ; exit lists will be sorted as if they were uppercase only. ; ;; alternate entry point: stlE ; ; stlE can be used to sort a given list. ; ; entry (x) = of list to sort. stl ldx #1 jsr stlE ;sort the list (ports) ldx #2 ;fall into stlE for printer drivers stlE PushLong #0 ;Result space PushLong Data1 ;Window pointer PushWord #0 ;Push high word of list # phx ;Push low word of list # _GetCtlHandleFromID pla ;lo word of control handle ply ;hi word of control handle jmp sul ;sort uppercase list and return ;------------------------------------------------------------------------------ ; READPSETUP / WRITEDATA ; ; This routine reads in the PRINTER.SETUP file in the system folder. If it ; doesn't exist, it will create one. ; ; Inputs: NONE ; Outputs: NONE - Global data only ; ; Entry point WRITEDATA: Writes the PRINTER.SETUP file out. ; ; Errors: Both routines return with carry set if error. ;------------------------------------------------------------------------------ ENTRY WriteData ReadPSetup jsr dco ;Build and set path to printer.setup file _OpenGS OpenPBlock ;Open the file. bcs @L2 ;Branch if error. lda OPRef ;Transfer reference number sta RPRef ;to the read and close call sta CRef ;blocks. _ReadGS ReadPBlock ;Read the file. @L00 php ;Save the read/write error if any _CloseGS CloseBlock ;Close the file plp ;Restore read error flag @L1 rts @L2 cmp #$0046 ;File not found error? sec ;Assume branch condition bne @L1 ;Branch if not _CreateGS CreatePBlock ;Try to create the file bcs @L1 ;Branch on error sep #$30 longa off longi off ldy DefC2Printer ;Move the default printer driver @L10 lda DefC2Printer,y ;name into write buffer. sta C2Printer,y dey bpl @L10 ldy DefCPort ;Move the default port driver @L20 lda DefCPort,y ;name into write buffer. sta CPort,y dey bpl @L20 ldy DefCUser ;Move the default user name @L30 lda DefCUser,y ;into write buffer. sta CUser,y dey bpl @L30 rep #$30 longa on longi on jsr WriteData rts WriteData jsr dco ;Build and set path to printer.setup file _OpenGS OpenPBlock ;Open the file. bcs @L1 ;Branch on error lda OPRef ;Transfer reference number sta RPRef ;to the write and close call sta CRef ;blocks. stz CFlag ;Zero DC/ATALK flag in write buffer _WriteGS ReadPBlock ;Write the file. php ;Save the read/write error if any _CloseGS CloseBlock ;Close the file plp ;Restore write error flag @L1 rts ; ;dco: build and store-ptr networked or local pathname for printer.setup file: ; dco phd ;getting direct page... tsc sec sbc #4 tcs ina tcd dco_dpA equ 0 _DInfoGS dco_DInfoB ;get boot device name bcs dco_islocal _VolumeGS dco_VolumeB ;get boot FST id bcs dco_islocal lda dco_FSTid ;is it appleshare FST? cmp #$000D ;find out by comparing FST id from the beq dco_isnetwork ;Volume call; branch to local or bra dco_islocal ;network case handling code dco_isnetwork _FSTSpecific dco_GupB ;here if network: get path string address bcs dco_islocal lda dco_GupBPPtr+0 ;build our path string and set string ptrs sta dco_dpA+0 ;access pathname pointer and put in dp variable lda dco_GupBPPtr+2 sta dco_dpA+2 ora dco_GupBPPtr+0 beq dco_islocal lda [dco_dpA] ;copying pathname... sta dco_PPathNet+0 ;copy initial len word first shortm ldy #2 ;y starts beyond len words and will be running dest str idx ldx #0 ;x is count of len dco_copyloop1 lda [dco_dpA],y sta dco_PPathNet,y iny ;bump address inx ;bump string count cpx dco_PPathNet+0 ;go until length bne dco_copyloop1 longm ;y now points to next index ldx #0 ;adding ":Setup:Printer.Setup"... shortm dco_copyloop2 lda dco_PSStr+2,x sta dco_PPathNet,y iny ;bump destination string running index inx ;bump "Printer.Setup" string length count cpx #dco_PSStrE-dco_PSStrB bne dco_copyloop2 longm lda dco_PPathNet+0 ;now adjust string length of destination string clc adc #dco_PSStrE-dco_PSStrB sta dco_PPathNet+0 ldx #dco_PPathNet ;network pathname to printer.setup file ldy #^dco_PPathNet bra dco_setpathptrs dco_islocal ldx #PPathLocal ;here if local: set string ptrs ldy #^PPathLocal ;local pathname to printer.setup file and drop thru dco_setpathptrs stx CPPathPtr+0 ;set the pathname pointers now stx OPPathPtr+0 sty CPPathPtr+2 sty OPPathPtr+2 tsc ;deallocating direct page... clc adc #4 tcs pld rts dco_DInfoB dc.w 2 ;pcount ;_DInfo parameter block dc.w 1 ;dev_num: input: 1=boot dc.l dco_DevName ;dev_nmae outbuff: input dco_DevName dc.w 36 ;buffer length ;Device name string buffer dco_DevName2 dc.w 0 ;string length ds.b 36 ;buffer for device name dco_VolumeB dc.w 5 ;pcount ;_Volume parameter block dc.l dco_DevName2 ;dev_name: input dc.l dco_VolName ;vol_name outbuff: input dc.l 0 ;total_blocks: result dc.l 0 ;free_blocks: result dco_FSTid dc.w 0 ;fst_id: result dco_VolName dc.w 36 ;buffer length ;Volume name string buffer dco_VolName2 dc.w 0 ;string length ds.b 36 ;buffer for volume name dco_GupB dc.w 3 ;pcount ;FST-spec GetUserPath block dc.w $000D ;fst_id: input: appleshare dc.w 8 ;command:input: GetUserPath dco_GupBPPtr dc.l 0 ;prefix_ptr: result dco_PPathNet dc.w 0 ;string length ;Built-up network path ds.b 36+16 ;ie, .../Printer.Setup dco_PSStr dc.w dco_PSStrE-dco_PSStrB dco_PSStrB dc.b ':Setup:Printer.Setup' dco_PSStrE ;------------------------------------------------------------------------------ ; SCAN4DRIVERS ; ; This routine will scan the DRIVERS directory on the system disk in order ; to find all the Printer and Port drivers. It will include the file names ; into the appropriate list. The AppleTalk driver will be ; excluded. ; ; Inputs: NONE - Global data only ; Outputs: NONT - Global data only ;------------------------------------------------------------------------------ Scan4Drivers _OpenGS OpenDBlock bcc @L1 rts @L1 lda ODRef sta GDERef sta CRef ScanLoop _GetDirEntryGS GetDirEntryBlock bcc @L00 cmp #$004F ;Is the name just too big? beq ScanLoop ;Branch if yes. jmp ScanExit ;Else, error out. @L00 lda FPath+2 ;Load length of string cmp #0033 ;Is the file name too large? bcs ScanLoop ;Branch if file name too large xba ;Turn string into Pascal type sta FPath+2 ;string. lda GDEFileType ;Is the file a driver? cmp #$00BB ;$BB = driver bne ScanLoop ;Branch if not. ldx GDEAUXType ;Is it a Printer driver? cpx #$0001 ;1 = Printer driver bne TryPortType ;Branch if not. jsr MovePrinter inc List2Count ;Bump our valid Printer driver counter. Back2Scan jmp ScanLoop ;Go back for more! TryPortType ldx GDEAUXType ;Is it a Port driver? cpx #$0002 ;2 = Port driver bne Back2Scan ;Branch if not. ;------------------------------------------------------------------------------ ; We fall through to the CHECKSTR routine with X containing 2. This will ; cause the CHECKSTR routine to only check for the string APPLETALK ;------------------------------------------------------------------------------ jsr MovePort ;Check for "APPLETALK" bcs Back2Scan ;Branch if found. inc List1Count ;Bump our Port driver counter. bra Back2Scan ;Go back for more! ScanExit _CloseGS CloseBlock rts ******************************************************************************* * MovePrinter * * This routine will add the name to the list record and copy * into a new memory segment. * * Inputs: None * * Outputs: None ******************************************************************************* PrinterBExit plp sec rts MovePrinter php rep #$30 longa on longi on lda List2Count ldx Mem2RecH ldy Mem2RecH+2 jsr BumpMemRec bcs PrinterBExit longa off longi off lda PrePickFlag beq PrinterGExit ldy FPath+3 @L1 lda FPath+3,y cmp C2Printer,y bne PrinterGExit dey bpl @L1 ldy #4 lda #$80 sta [zp1],y PrinterGExit plp clc rts longa on longi on ******************************************************************************* * MovePort * * This routine will first check the name at FPATH+3 againts the string * 'APPLETALK' and if it's equal, returns with the carry set. If not * it adds the name to the list record and copies into a new memory segment * and returns with the carry clear. * * Inputs: None * * Outputs: Carry: Clear = String copied and valid * Set = String copied but not valid (matched) * ******************************************************************************* MovePort php sep #$30 longa off longi off ldy FPath+3 @L1 jsr GetUCase cmp ATalkName,y bne CheckPort dey bpl @L1 PortBExit plp sec rts CheckPort rep #$30 longa on longi on lda List1Count ldx Mem1RecH ldy Mem1RecH+2 jsr BumpMemRec bcs PortBExit ;Branch on error longa off longi off lda PrePickFlag beq PortGExit ldy FPath+3 @L1 lda FPath+3,y cmp CPort,y bne PortGExit dey bpl @L1 ldy #4 lda #$80 sta [zp1],y PortGExit plp clc rts ;----------------------------------------------------------------------------- ; The routine below will fetch a character from FPATH+3,Y and force it to ; upper case. ;----------------------------------------------------------------------------- GetUCase lda FPath+3,y ;Load the character cmp #$61 ;If < "a" don't bother bcc @L1 cmp #$7B ;If > "z"+1 don't bother bcs @L1 and #$DF ;Else force it to upper case. @L1 rts longa on longi on ******************************************************************************* * BumbMemRec * * This routine will bump the member record list, move the file name pointed * to by FPATH+3 into a new memory handle, update the new member record to * point to the new memory handle containing the file name and zero the * selection byte for the new member record.. * * Inputs: A: ListCount for this record * X: Low word of MemberList handle * Y: High word of MemberList handle * * Outputs: Carry: Clear = String copied * Set = Memory allocation error * Long C,X,Y if error * Short C,X,Y if no error * ******************************************************************************* BumpMemRec sta zp0 ;Store the ListCount stx zp1 ;Store the handle (low word) sty zp1+2 ;Store the handle (high word) ;----------------------------------------------------------------------------- ; Below we first try to unlock the handle of the member record list. Then ; get the old size, add the length of a new record, and the re-size the ; handle. After that, we just lock it down. If we get any errors, we leave ; the BUMPMEMREC routine with the carry set. ;----------------------------------------------------------------------------- PushLong zp1 ;Push handle _HUnlock ;Unlock the handle bcc @OKUnlock ;Branch if no error @ShortExit jmp @Exit ;Else we exit with carry set. @OKUnlock PushLong #0 ;Result space PushLong zp1 ;Push handle _GetHandleSize ;Get the current handle size tay ;Save the error state for now ;We fall through with the current ;size of the handle on the stack. clc ;Add in the length of the new pla ;member record item so we can adc #MemRecSize ;re-size the member record list. tax pla adc #0 phy ;Save the error state on the stack. pha ;Push the new length of the phx ;handle onto the stack. PushLong zp1 ;Push the handle _SetHandleSize ;Set the new size pha ;Save the error state on the stack. PushLong zp1 ;Push the handle _HLock ;Lock the sucker. plx ;Pull error on SetHandleSize ply ;Pull error on GetHandleSize bcs @ShortExit ;Branch if error on _HLock sec ;Assume error bne @ShortExit ;Branch if error on GetHandleSize cpx #0 ;Error on SetHandleSize? bne @ShortExit ;Branch if yes. ;----------------------------------------------------------------------------- ; Below we ask for a segment of memory that will hold the file name in ; FPATH+3. ;----------------------------------------------------------------------------- PushLong #0 ;Result space PushWord #0 ;High word of size of block lda FPath+3 and #$00FF ina pha ;Low word of size of block PushWord MyID ;User ID PushWord #$C018 ;Attributes PushLong #0 ;Pointer to mem _NewHandle plx ;Pull the result off the stack ply ;and hold it in X and Y regs. bcs @Exit ;Branch if we didn't get the memory. pei zp0 ;Push the ListCount for later use. stx zp0 ;Store handle to file name sty zp0+2 ;buffer on zero page. ldy #2 ;De-reference the handle lda [zp0] ;and store it back on to tax ;the zero page at ZP0. lda [zp0],y sta zp0+2 stx zp0 ldy #2 ;Dereference handle that lda [zp1] ;points to the beginning of tax ;the member record list and lda [zp1],y ;put the result back into the sta zp1+2 ;zero page location ZP1. stx zp1 plx ;Pull the ListCount back off jsr Times5 ;and multiply it by 5. clc ;Add the offset to the address lda AddIndex ;of the beginning of the buffer adc zp1 ;to get new pointer to member sta zp1 ;record and put it back into lda AddIndex+2 ;the zero page location ZP1. adc zp1+2 sta zp1+2 ldy #2 ;Dereference handle that points lda zp0 ;to the location to put the sta [zp1] ;file name into and put it back lda zp0+2 ;into the zero page location ZP0. sta [zp1],y sep #$30 ;Short everything longa off longi off ldy #4 ;Force the selection byte to lda #00 ;zero (not selected). sta [zp1],y ldy FPath+3 ;Load the length byte @CopyLoop lda FPath+3,y ;Move the entire string including sta [zp0],y ;the length byte into buffer pointed dey ;to by ZPO bpl @CopyLoop clc ;No error! @Exit rts ;RETURN longa on longi on ENTRY C2Printer ENTRY CPort PrePickFlag dc.w 0 ATalkName str 'APPLETALK' OpenDBlock dc.w 3 ;PCount ODRef dc.w 0 dc.l DPath ;Pathname pointer dc.w 0001 ;Request access DPath dc.w DPathLen dc.b '*/SYSTEM/DRIVERS/' DPathLen equ *-DPath-2 GetDirEntryBlock dc.w 13 ;PCount GDERef dc.w 0 dc.w 0 ;Flags dc.w 1 ;Base dc.w 1 ;Displacement dc.l FPath dc.w 0 ;Entry number GDEFileType dc.w 0 ;FileType dc.l 0 ;EOF dc.l 0 ;Block count dc.l 0,0 ;Create date/time dc.l 0,0 ;Mod date/time dc.w 0 ;Access GDEAUXType dc.l 0 ;AUX type FPath dc.w FPathLen dc.w 0 ds.b 32 FPathLen equ *-FPath CreatePBlock dc.w 4 ;PCount CPPathPtr dc.l 0 ;Pathname pointer dc.w $C3 ;Access byte dc.w 6 ;File type dc.l 0 ;AUX type OpenPBlock dc.w 3 ;PCount OPRef dc.w 0 OPPathPtr dc.l 0 ;Pathname pointer dc.w 0003 ;Request access (R/W) PPathLocal dc.w PPathLocalLen dc.b '*/SYSTEM/DRIVERS/Printer.Setup' PPathLocalLen equ *-PPathLocal-2 ReadPBlock dc.w 4 ;PCount RPRef dc.w 0 dc.l ReadPBuffer dc.l RBufferLength ;Request count dc.l 0 ;Transfer count CloseBlock dc.w 1 ;PCount CRef dc.w 0 ReadPBuffer C1Printer ds.b 33 C2Printer ds.b 33 CPort ds.b 33 CUser ds.b 16 CNet ds.b 33 CZone ds.b 33 CFlag ds.b 2 RBufferLength equ *-ReadPBuffer DefC2Printer str 'IMAGEWRITER' DefCPort str 'PRINTER' DefCUser str 'John Q. Public' ENDP screenF ds.b 2 ; = $8000 if this is a 640 mode screen END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/myConstants.h b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/myConstants.h new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/myConstants.h @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/myglobals.c b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/myglobals.c new file mode 100644 index 0000000..7d60785 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/myglobals.c @@ -0,0 +1 @@ +This source file is no longer in use. Replaced by the DC.AII and DIRECTCONNECT.R files Tim Harrington 3/29/89 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/sul.aii b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/sul.aii new file mode 100644 index 0000000..4178bbe --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/DirectConnectCDEV/sul.aii @@ -0,0 +1 @@ +;;; sul - sort uppercase list. ; ; Michael V. Stein 02/21/90. ; ; © Apple, 1990. blanks off ;; equates. ;; imported addresses. ;; include files. include 'm16.list' include 'm16.util2' ;; main program. main proc export sul sul pushlong #cue ;compare uppercase elements phy ;hi word to list handle pha ;lo word to list handle _SortList2 rts ;; cue - compare uppercase elements. ; ; entry none. ; ; exit none. memberA equ 4+2 memberB equ memberA+4 cue phd tsc tcd use stack as a direct page phb save data bank phk plb ldy #$02 lda [memberA] dereference first handle tax lda [memberA],y sta memberA+2 stx memberA lda [memberB] dereference second handle tax lda [memberB],y sta memberB+2 stx memberB shortmx lda [memberA] cmp [memberB] compare it to memberB bcc cue1 if length(memberB) >= length(memberA) lda [memberB] cue1 sta min shortest length of either string ldy #$00 cue2 iny lda [memberB],y jsr cal capitalize a letter sta temp lda [memberA],y jsr cal capitalize a letter cmp temp bne cue5 we have a difference cpy min chars are the same so check if more bytes to check bcc cue2 no more bytes to check cue4 lda [memberA] the shortest string is less than the longer cmp [memberB] set carry if a >= b cue5 longmx carry set if a >= b lda 0+2 sta 8+2 lda 2+2 sta 10+2 plb restore data bank pld restore direct page pla pla pla pla rtl min ds.b 1 temp ds.b 1 ;; cal - capitalize a letter. ; ; entry none. ; ; exit none. longa off longi off cal cmp #'a' bcc cal1 if not lowercase cmp #'z'+1 bcs cal1 if not lowercase sbc #$20-1 (c) clear cal1 rts endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/CDev.h b/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/CDev.h new file mode 100644 index 0000000..b4b4f14 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/CDev.h @@ -0,0 +1 @@ +/* Max C interface to the CDEV Manager by Greg Branche * (based on the MAX Pascal interface file by Darryl Lovato) * Copyright (c) 1989 by Apple Computer, Inc. */ #ifndef __CDev__ #define __CDev__ #define MachineCDEV 1 /* machine test, return 0 if NOT ok to run on this machine */ #define BootCDEV 2 /* boot time init call or Install call - no parms */ #define ShutDownCDEV 3 /* shut down or de-install the CDEV - no parms */ #define InitCDEV 4 /* called when being shown - data1 = windowPtr */ #define CloseCDEV 5 /* called when being removed - data1 = windowPtr */ #define EventsCDEV 6 /* called when an event - data1 = ptr to event record */ #define CreateCDEV 7 /* called so that a CDEV can create its controls inline - data1 = window */ #define AboutCDEV 8 /* called so that a CDEV can create its about text inline - no parms */ #define RectCDEV 9 /* called so that a CDEV can dynamically compute its rectangle data1 = rectprr */ #define HitCDEV 10 /* called when ctl is "hit" - data1 = Hdl to ctl hit, data2 = Ctl Id */ #define RunCDEV 11 /* called when daRun is called */ #define reserved1 12 /* reserved for Apple Computer's future use */ #define reserved2 13 /* reserved for Apple Computer's future use */ #define reserved3 14 /* reserved for Apple Computer's future use */ #define NeverUsed1 15 #define NeverUsed2 16 #define wantMachine 1 /* these flags are set in the CDEV flags resource to tell the Control */ #define wantBoot 2 /* panel which of the above messages the CDEV actually needs */ #define wantShutDown 4 #define wantInit 8 #define wantClose 16 #define wantEvents 32 #define wantCreate 64 #define wantAbout 128 #define wantRect 256 #define wantHit 512 #define wantRun 1024 #define wantReserved1 2048 #define wantReserved2 4096 #define wantReserved3 8192 #define updateSSfromBRAM 16384 /* this is for use by Apple Computer, Inc ONLY! <- I mean it! */ #define canBeInactive 32768 /* set this bit if the cdev can be made inactive by the user */ #endif \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/FolderPriv.c b/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/FolderPriv.c new file mode 100644 index 0000000..15ce63e --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/FolderPriv.c @@ -0,0 +1 @@ +/*###########################################################*/ /*# #*/ /*# File: FolderPriv.c #*/ /*# Version: 1.0 #*/ /*# Author: #*/ /*# Copyright: (c) 1992 by Apple Computer, Inc. #*/ /*# #*/ /*# Description: This file contains the cdev C #*/ /*# routine used by the FolderPriv CDEV. #*/ /*# #*/ /*###########################################################*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "CDEV.h" #include "rDefs.h" /* resource ID definitions */ extern unsigned SaveDB(); extern void RestoreDB(); GSString255 *getPath(); #define free(ptr) DisposeHandle(FindHandle(ptr)) /*###########################################################*/ /*# Actual CDEV, this is called by the control panel #*/ /*###########################################################*/ #define getUserPath 0x0008 #define getDefPrivileges 0x000e #define setDefPrivileges 0x000f #define setAccessRights 0x0001 #define setOwnerName 0x0002 #define setGroupName 0x0004 typedef struct { char reserved; char world; char group; char owner; } AccessRec; struct { unsigned pCount; unsigned fileSysID; unsigned commandNum; unsigned flags; unsigned unused; /* actually, the high word of flags */ AccessRec access; union { ResultBuf255 *out; GSString255 *in; } ownerName; union { ResultBuf255 *out; GSString255 *in; } groupName; } privParms; struct { unsigned buflen; unsigned namelen; } namebuf; /* used as a GS/OS result buffer */ IORecGS ioParms = { 4, /* pCount */ 0, /* refNum */ (Pointer) &privParms, /* dataBuffer */ sizeof(privParms) /* transferCount */ }; struct { unsigned pCount; GSString255 *pathname; unsigned access; unsigned fileType; } createParms = { 3, NULL, 0xE7, 0x5A}; NameRecGS destroyParms = { 1, NULL}; unsigned long masterValues[] = { 0, /* custom */ 0x07000000, /* private */ 0x07070700, /* public */ 0x07040400, /* drop box */ 0x07030300 /* bulletin board */ }; boolean fstActive = FALSE; /* This routine is eventually linked and then placed into a cdev code resource. The only requirements are that this routine is at the beginning of the resource so if the CDEV has any other routines they must follow this one. The cdev's resource fork is always opened when a call to the cdev is made. The cdev can also assume that the current port is set to the ctl panel window except in the boot message, where quickdraw isn't even started, and in the about message, where it is the port of the help window. All normal managers will be stared up for all calls except the boot call, which will only have miscTools & Resource Manager started. */ pascal long CDEV(message,data1, data2) int message; long data1; long data2; { CtlRecHndl tempCtl; WindowPtr window; GSString255 *pathname; int retCode; int refNum; unsigned i; unsigned oldDBR; unsigned ctlValue; oldDBR = SaveDB(); /* set up DBR correctly */ retCode = 0; /* initialize the function result to zero, so that we will work in future versions of the Control Panel! */ switch(message) { case BootCDEV: /* If the wantBoot flag is set, this routine will be called during the startup sequence. The control panel takes care of drawing the "boot" icon. When this call is made, the machine state is bad at best. QuickDraw is not even started up. The parameters to this call are undefined. */ privParms.pCount = 3; /* set up parameter block */ privParms.fileSysID = appleShareFSID; privParms.commandNum = getUserPath; /* GetUserPath call */ FSTSpecific(&privParms); /* make the call to see if AppleShare is available */ if(_toolErr == invalidFSTID) /* if AppleShare isn't around... */ * (int *) data1 = 1; /* ... draw X through icon */ else if((refNum = /* assignment */ OpenFile()) >= 0) { ioParms.refNum = refNum; ioParms.pCount = 4; ReadGS(&ioParms); i = _toolErr; /* save any error from the Read call */ ioParms.pCount = 1; CloseGS(&ioParms); if(i) /* did we have a problem reading? */ break; /* yes, just forget it */ privParms.pCount = !(privParms.flags & setAccessRights) ? 3 : (privParms.flags & setOwnerName ? 5 : 4); privParms.fileSysID = appleShareFSID; privParms.commandNum = setDefPrivileges; privParms.ownerName.in = NULL; FSTSpecific(&privParms); if(_toolErr) /* was there an error? */ * (int *) data1 = 1; /* yes, draw X through icon */ } break; case MachineCDEV: /* This is called if the wantMachine bit is set in the CDEV flags. It enables the CDEV to do further checking to see if it makes sense for the CDEV to be visible to the user or not. For instance, if the CDEV controls a setting for some hardware, we could check to see if the hardware is really connected. The parameters are undefined for this call and the result is passed back as the function result. 0 = don't show this CDEV, <>0 = show this CDEV. The control panel will do some machine checking even before calling this routine by checking the ROM version number against the machine field of the cdev flags resource */ /* here we make an FSTSpecific call to the AppleShare FST to see if it even exists. If it's not currently loaded, there's no sense in displaying the CDev. */ privParms.pCount = 4; privParms.fileSysID = appleShareFSID; privParms.commandNum = getDefPrivileges; FSTSpecific(&privParms); fstActive = _toolErr == 0; if(!fstActive) { InitCursor(); retCode = AlertWindow((refIsResource<<1)+1+0x20, NULL, (long) noFSTtext); } else retCode = 1; /* so we'll be displayed */ break; case CreateCDEV: /* If the wantCreate bit is set, this message is called with the control panel's window ptr passed in data1. The cdev must create any controls it has during this call. The CDEV's resource fork is open during this call so resource manager calls can be made. All controls rectangles MUST be relative to 0,0. The control panel handles offsetting controls to the proper place in the window. Initialization of the controls needs to be done in the InitCDEV call. Just create the controls in this call. */ tempCtl = NewControl2(data1,9,(long) myCtrlList); break; case InitCDEV: /* If the wantInit flag is set, then this message is passed with data1 = the control panel's window ptr. By this time the CreateCDEV call will have been made and thus the controls used by the CDEV created. This call enables the CDEV to initialize the controls before they are displayed. */ if(fstActive) { privParms.pCount = 5; privParms.fileSysID = appleShareFSID; privParms.commandNum = getDefPrivileges; privParms.ownerName.out = (ResultBuf255 *) &namebuf; namebuf.buflen = 4; FSTSpecific(&privParms); } else { /* read the existing data file */ if((refNum = /* assignment */ OpenFile()) >= 0) { ioParms.refNum = refNum; ioParms.pCount = 4; ReadGS(&ioParms); i = _toolErr; /* save any error from the Read call */ ioParms.pCount = 1; CloseGS(&ioParms); if(i) /* did we have a problem reading? */ goto _fake_it; /* yes, just fake it */ } else { /* no data file exists, init parameters to defaults */ _fake_it: privParms.flags = 0; * (long *) (&privParms.access) = 0; _toolErr = 0; /* clear this so controls are initialized */ } privParms.pCount = !(privParms.flags & setAccessRights) ? 3 : (privParms.flags & setOwnerName ? 5 : 4); privParms.fileSysID = appleShareFSID; privParms.commandNum = setDefPrivileges; privParms.ownerName.in = NULL; } if(!_toolErr || _toolErr == buffTooSmall) { if(!(privParms.flags & setAccessRights)) { /* set up initial defaults */ privParms.access.world = privParms.access.group = 0; privParms.access.owner = 7; } setup_controls(data1); } break; case AboutCDEV: /* If the wantAbout bit is set in the CDEV flags, this call is made when the user selects help. Data1 = window ptr to the help window. The control panel automatically handles the icon, author, and version # display.*/ tempCtl = NewControl2(data1,2, (long) AboutID); break; case HitCDEV: /* If the CDEV wants to know when a control has been "hit", it can set the wantHit bit in the CDEV flags. When called, data1 = Hdl to Ctl Hit & data2 = Ctl ID of hit control. This message allows the CDEV to perform actions based on the control that was selected by the user.*/ /* get the current value of whichever control was hit */ ctlValue = GetCtlValue(data1); /* get the current window pointer */ window = (*(CtlRecHndl) data1)->ctlOwner; switch((int) data2) { case masterPopup: switch(ctlValue) { case masterItem2: /* user selected "Private" */ privParms.access.world = /* set up access bits */ privParms.access.group = 0; privParms.access.owner = 7; break; case masterItem3: /* user selected "Public" */ privParms.access.world = privParms.access.group = privParms.access.owner = 7; break; case masterItem4: /* user selected "Drop Folder" */ privParms.access.world = privParms.access.group = 4; privParms.access.owner = 7; break; case masterItem5: /* user selected "Bulletin Board" */ privParms.access.world = privParms.access.group = 3; privParms.access.owner = 7; break; } privParms.flags |= setAccessRights; setup_controls(window); /* refresh the other controls */ break; case foldersPopup: privParms.access.world &= 0xfe; /* clear the seeFolders bits */ privParms.access.group &= 0xfe; privParms.access.owner &= 0xfe; privParms.access.world |= (--ctlValue >> 2) & 0x01; /* then set the appropriate bits */ privParms.access.group |= (ctlValue >> 1) & 0x01; privParms.access.owner |= ctlValue & 0x01; synchronize(window); /* resync the master menu with the others */ break; case filesPopup: privParms.access.world &= 0xfd; /* clear the seeFiles bits */ privParms.access.group &= 0xfd; privParms.access.owner &= 0xfd; privParms.access.world |= (--ctlValue >> 1) & 0x02; /* then set the appropriate bits */ privParms.access.group |= ctlValue & 0x02; privParms.access.owner |= (ctlValue << 1) & 0x02; synchronize(window); break; case changesPopup: privParms.access.world &= 0xfb; /* clear the makeChanges bits */ privParms.access.group &= 0xfb; privParms.access.owner &= 0xfb; privParms.access.world |= (--ctlValue) & 0x04; /* then set the appropriate bits */ privParms.access.group |= (ctlValue << 1) & 0x04; privParms.access.owner |= (ctlValue << 2) & 0x04; synchronize(window); break; case serverDefsBox: privParms.flags ^= setAccessRights; setup_controls(window); break; case ownerCheckBox: privParms.flags ^= setOwnerName; break; } break; case CloseCDEV: /* The CloseCDEV message is passed if the wantClose bit is set in the CDEV flags and the control panel is closing or when the user selects another CDEV. During this call data1 = windowPtr. In general, CDEVs can do any memory disposal and saving of settings during this call. The disposal of the CDEV's controls is handled automatically by the Control Panel. */ privParms.pCount = !(privParms.flags & setAccessRights) ? 3 : (privParms.flags & setOwnerName ? 5 : 4); privParms.fileSysID = appleShareFSID; privParms.commandNum = setDefPrivileges; privParms.ownerName.in = NULL; if(fstActive) FSTSpecific(&privParms); if(!(pathname = /* assignment */ getPath())) break; if(privParms.flags & (setAccessRights | setOwnerName)) { /* do we need to save anything? */ createParms.pathname = pathname; CreateGS(&createParms); if((refNum = OpenFile()) >= 0) { ioParms.pCount = 4; ioParms.refNum = refNum; WriteGS(&ioParms); ioParms.pCount = 1; CloseGS(&ioParms); } } else { /* no, just delete the file */ destroyParms.pathname = pathname; DestroyGS(&destroyParms); } free(pathname); break; } /* end of switch */ RestoreDB(oldDBR); return(retCode); } /* end of CDEV function */ /**************************************************************************************** my own malloc() and free() functions, so the library versions aren't used ****************************************************************************************/ char *malloc(size) unsigned size; { char *ptr = NULL; Handle hndl; hndl = NewHandle((long) size, MMStartUp() | 0x0F00, 0x8000, NULL); if(!_toolErr) ptr = *hndl; return(ptr); } // #define free(ptr) DisposeHandle(FindHandle(ptr)) // actually defined at beginning of file /**************************************************************************************** this function sets up the various control values and highlighting depending on the current setting of the FST access parameters. ****************************************************************************************/ setup_controls(window) WindowPtr window; { unsigned seeFolders, seeFiles, makeChanges; if(privParms.flags & setAccessRights) { /* using server defaults? */ /* no, using user defaults */ /* uncheck the Server Defaults check box */ SetCtlValue(0, GetCtlHandleFromID(window, (long) serverDefsBox)); /* condition the Owner Name check box */ if(privParms.flags & setOwnerName && privParms.ownerName.out->bufString.length == 0) { /* is the owner name being set to ? */ SetCtlValue(1, GetCtlHandleFromID(window, (long) ownerCheckBox)); } else { SetCtlValue(0, GetCtlHandleFromID(window, (long) ownerCheckBox)); } /* make the controls active */ HiliteControl(0, GetCtlHandleFromID(window, (long) masterPopup)); HiliteControl(0, GetCtlHandleFromID(window, (long) foldersPopup)); HiliteControl(0, GetCtlHandleFromID(window, (long) filesPopup)); HiliteControl(0, GetCtlHandleFromID(window, (long) changesPopup)); HiliteControl(0, GetCtlHandleFromID(window, (long) ownerCheckBox)); synchronize(window); seeFolders = ((privParms.access.world & 0x01) << 2) | ((privParms.access.group & 0x01) << 1) | (privParms.access.owner & 0x01); if(seeFolders > 3) { seeFolders = 7; privParms.access.group |= 0x01; privParms.access.owner |= 0x01; } seeFiles = ((privParms.access.world & 0x02) << 1) | (privParms.access.group & 0x02) | ((privParms.access.owner & 0x02) >> 1); if(seeFiles > 3) { seeFiles = 7; privParms.access.group |= 0x02; privParms.access.owner |= 0x02; } makeChanges = (privParms.access.world & 0x04) | ((privParms.access.group & 0x04) >> 1) | ((privParms.access.owner & 0x04) >> 2); if(makeChanges > 3) { makeChanges = 7; privParms.access.group |= 0x04; privParms.access.owner |= 0x04; } SetCtlValue(foldersItem1 + seeFolders, GetCtlHandleFromID(window, (long) foldersPopup)); SetCtlValue(filesItem1 + seeFiles, GetCtlHandleFromID(window, (long) filesPopup)); SetCtlValue(changesItem1 + makeChanges, GetCtlHandleFromID(window, (long) changesPopup)); } else { /* yes, mark the check box */ SetCtlValue(1, GetCtlHandleFromID(window, (long) serverDefsBox)); /* and dim the other controls */ HiliteControl(255, GetCtlHandleFromID(window, (long) masterPopup)); HiliteControl(255, GetCtlHandleFromID(window, (long) foldersPopup)); HiliteControl(255, GetCtlHandleFromID(window, (long) filesPopup)); HiliteControl(255, GetCtlHandleFromID(window, (long) changesPopup)); HiliteControl(255, GetCtlHandleFromID(window, (long) ownerCheckBox)); } } /**************************************************************************************** this function is used to synchronize the Master popup with the other three popups. ****************************************************************************************/ synchronize(window) WindowPtr window; { MenuBarRecHndl oldMenu; unsigned i; long tempAccess; oldMenu = GetMenuBar(); /* save the handle to the current menu */ SetMenuBar(GetCtlHandleFromID(window, (long) masterPopup)); /* set to popup */ /* set the master control menu item */ tempAccess = (*(long *) &privParms.access) & 0xffffff00; for(i = 4; i != 0; --i) { /* search for a matching value */ if(masterValues[i] == tempAccess) break; } if(!i) /* is the current setting "Custom" ? */ EnableMItem(masterItem1); /* yes, enable it so it's selectable */ else DisableMItem(masterItem1); /* else disable it (gray it out) */ SetCtlValue(masterItem1+i, GetCtlHandleFromID(window, (long) masterPopup)); SetMenuBar(oldMenu); /* restore the original menu bar */ } /**************************************************************************************** getPath - builds GSString pathname to data file ****************************************************************************************/ GSString255 *getPath() { static ResultBuf32 devName = { 36, /* bufLen */ 0 /* string length */ }; static DInfoRecGS infoParms = { 2, /* pCount */ 1, /* devNum (always 1 for boot device) */ &devName /* pointer to result buffer */ }; static ResultBuf32 volName = { 36, /* bufLen */ 0 /* string length */ }; static VolumeRecGS volParms = { 5, /* pCount */ &devName.bufString, /* device name pointer */ &volName, /* volume name result buffer pointer */ 0, /* total blocks */ 0, /* free blocks */ 0 /* FST ID number */ }; static struct { unsigned pCount; unsigned fileSysID; unsigned commandNum; GSString255 *userPfx; } fstParms = { 3, appleShareFSID, 8 /* GetUserPath */, NULL}; static GSString32 localPfx = {8, "*:System"}; GSString255 *dataPfx = (GSString255 *) &localPfx; GSString255 *pathname; extern int _ownerid; DInfoGS(&infoParms); /* make the DInfo call to get the device name */ if(_toolErr) return(NULL); VolumeGS(&volParms); /* make a Volume call to get the boot FST ID */ if(_toolErr) return(NULL); if(volParms.fileSysID == appleShareFSID) { /* booted from AppleShare? */ FSTSpecific(&fstParms); /* yes, do a GetUserPath call */ if(_toolErr) return(NULL); dataPfx = fstParms.userPfx; /* set the variable to the network path */ } /* allocate memory for the pathname */ if(!(pathname = (GSString255 *) malloc(dataPfx->length + 16 + 2))) { _toolErr = outOfMem; return(NULL); } memcpy(pathname, dataPfx, dataPfx->length + 2); /* copy in the prefix */ memcpy(&(pathname->text[dataPfx->length]), ":FolderPriv.data", 16); pathname->length += 16; return(pathname); } /**************************************************************************************** OpenFile - opens the CDev's data file ****************************************************************************************/ OpenFile() { static SysPrefsRecGS oldPrefs = {1, 0}, myPrefs = {1, 0xc000}; static struct { unsigned pCount; unsigned refNum; GSString255 *pathname; unsigned requestAccess; } openParms = { 3, 0, NULL, 3}; int saveErr; if(!(openParms.pathname = /* assignment */ getPath())) return(-_toolErr); GetSysPrefsGS(&oldPrefs); SetSysPrefsGS(&myPrefs); OpenGS(&openParms); saveErr = _toolErr; SetSysPrefsGS(&oldPrefs); free(openParms.pathname); return(saveErr ? -saveErr : openParms.refNum); } \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/FolderPriv.r b/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/FolderPriv.r new file mode 100644 index 0000000..a6a8486 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/FolderPriv.r @@ -0,0 +1 @@ +//########################################################### //# # //# File: FolderPriv.r # //# Version: 1.0 # //# Author: # //# Copyright: (c) 1992 by Apple Computer, Inc. # //# # //# Description: This file contains the resource # //# definitions used by the FolderPriv # //# CDEV # //# # //#---------------------------------------------------------# //# # //# Development History: # //# # //# Who Date The Modification # //# --- -------- ---------------- # //# GAB 01/21/91 Initial release # //# # //########################################################### //########################################################### //# Read any standard includes & define our own # //########################################################### #include "typesiigs.r" // include the type definitions #include "rDefs.h" // include defines //########################################################### //# Read the resources built elsewhere # //########################################################### read rCDEVCode (1, Convert) "FP.Code"; // this is the code resource //########################################################### //# Define our resources # //########################################################### resource rVersion (1) { { 1,0,0, // major, minor, bug fix version numbers release, 0 // non-final release # }, verUS, // country code "FolderPriv", "Copyright © 1992, Apple Computer, Inc., All Rights Reserved" }; resource rCDEVFlags (1) { wantBoot + wantHit + wantInit + wantMachine + wantCreate + wantAbout + wantClose, // CDEV flags 1, // enabled = True 1, // Version = 1 1, // Machine = v1 ROMs or higher 6, // System = v6.0 or higher {0,0,125,261}, // DataRect - top left MUST be 0,0 "FolderPriv", // Name "Greg Branche", // Author "v1.0"; // Version String }; //########################################################### //# Define About Box resources # //########################################################### resource rControlTemplate (AboutID) { AboutID, // control ID {38,5,128,280}, // rect statTextControl {{ 0, // flags 0b0001000000000010, // more flags 0, // refCon AboutID }}, }; resource rTextForLETextBox2 (AboutID) { "This Control Panel allows you to set the default privilege level that " "will be assigned to new folders created on AppleShare¨ file servers." }; //########################################################### //# Define Warning Message resources # //########################################################### resource rAlertString (noFSTtext) { "73/AppleShare is currently not active. If you continue, any changes " "that you make will not take effect until the next time the machine " "is restarted with AppleShare enabled./#1/^#6" $"00" }; //########################################################### //# Define menu resources # //########################################################### /* Source code created by DesignMaster */ resource rControlList (myCtrlList) {{ serverDefsBox, /* control resource id for Use Server Defaults check box */ separator1, /* control resource id for separator statText */ masterPopup, /* control resource id for Master PopUp */ separator2, /* control resource id for separator statText */ foldersPopup, /* control resource id for See Folders PopUp*/ filesPopup, /* control resource id for See Files PopUp */ changesPopup, /* control resource id for Make Changes PopUp */ ownerCheckBox, /* control resource id for Owner is... check box */ };}; //---------------------------------------------------------------------------------- // Common strings used by multiple menus #define nobodyString 0x00000010 #define ownerString 0x00000011 #define groupString 0x00000012 #define oAndGString 0x00000013 #define everyoneString 0x00000014 resource rPString (nobodyString) { "Nobody" }; resource rPString (ownerString) { "Owner" }; resource rPString (groupString) { "Group" }; resource rPString (oAndGString) { "Owner & Group" }; resource rPString (everyoneString) { "Everyone" }; //---------------------------------------------------------------------------------- // Use Server Defaults check box control resource rControlTemplate (serverDefsBox) { serverDefsBox, /* control id */ {3,14,15,247}, /* control rectangle */ CheckControl{{ /* control type */ 0x0001, /* flags */ 0x1002, /* more flags */ 0, /* ref con */ serverDefsBox, /* title reference */ 0x0001 /* inital value */ }}; }; resource rPString (serverDefsBox) { "Use Server Defaults" }; //---------------------------------------------------------------------------------- // separator bar frame control resource rControlTemplate (separator1) { separator1, /* control id */ {21,14,22,247}, /* control rectangle */ rectangleControl{{ /* control type */ 0x0002, /* flags */ 0x1000, /* more flags */ 0 /* ref con */ }}; }; //---------------------------------------------------------------------------------- // Master PopUp control resource rControlTemplate (masterPopup) { masterPopup, /* control id */ {28,10,40,247}, /* control rectangle */ PopUpControl{{ /* control type */ 0x0000, /* flags */ 0x1002, /* more flags */ 0, /* ref con */ 100, /* title width */ masterPopup, /* menu reference */ masterItem2 /* inital value */ }}; }; resource rMenu (masterPopup) { masterPopup, /* id of menu */ RefIsResource*MenuTitleRefShift+RefIsResource*ItemRefShift+fAllowCache, masterPopup, /* id of title string */ { masterItem1, /* item reference */ masterItem2, /* item reference */ masterItem3, /* item reference */ masterItem4, /* item reference */ masterItem5, /* item reference */ }; }; resource rPString (masterPopup) { " Master:" }; resource rMenuItem (masterItem1) { masterItem1, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, masterItem1, /* title reference */ }; resource rPString (masterItem1) { "Custom" }; resource rMenuItem (masterItem2) { masterItem2, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, masterItem2, /* title reference */ }; resource rPString (masterItem2) { "Private" }; resource rMenuItem (masterItem3) { masterItem3, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, masterItem3, /* title reference */ }; resource rPString (masterItem3) { "Public" }; resource rMenuItem (masterItem4) { masterItem4, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, masterItem4, /* title reference */ }; resource rPString (masterItem4) { "Drop Folder" }; resource rMenuItem (masterItem5) { masterItem5, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, masterItem5, /* title reference */ }; resource rPString (masterItem5) { "Bulletin Board" }; //---------------------------------------------------------------------------------- // separator bar frame control resource rControlTemplate (separator2) { separator2, /* control id */ {46,14,47,247}, /* control rectangle */ rectangleControl{{ /* control type */ 0x0002, /* flags */ 0x1000, /* more flags */ 0 /* ref con */ }}; }; //---------------------------------------------------------------------------------- // See Folders PopUp control resource rControlTemplate (foldersPopup) { foldersPopup, /* control id */ {53,10,65,247}, /* control rectangle */ PopUpControl{{ /* control type */ 0x0000, /* flags */ 0x1002, /* more flags */ 0, /* ref con */ 100, /* title width */ foldersPopup, /* menu reference */ foldersItem2 /* inital value */ }}; }; resource rMenu (foldersPopup) { foldersPopup, /* id of menu */ RefIsResource*MenuTitleRefShift+RefIsResource*ItemRefShift+fAllowCache, foldersPopup, /* id of title string */ { foldersItem1, /* item reference */ foldersItem2, /* item reference */ foldersItem3, /* item reference */ foldersItem4, /* item reference */ foldersItem5, /* item reference */ }; }; resource rPString (foldersPopup) { " See Folders:" }; resource rMenuItem (foldersItem1) { foldersItem1, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, nobodyString, /* title reference */ }; resource rMenuItem (foldersItem2) { foldersItem2, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, ownerString, /* title reference */ }; resource rMenuItem (foldersItem3) { foldersItem3, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, groupString, /* title reference */ }; resource rMenuItem (foldersItem4) { foldersItem4, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, oAndGString, /* title reference */ }; resource rMenuItem (foldersItem5) { foldersItem5, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, everyoneString, /* title reference */ }; //---------------------------------------------------------------------------------- // See Files PopUp control resource rControlTemplate (filesPopup) { filesPopup, /* control id */ {71,10,83,247}, /* control rectangle */ PopUpControl{{ /* control type */ 0x0000, /* flags */ 0x1002, /* more flags */ 0, /* ref con */ 100, /* title width */ filesPopup, /* menu reference */ filesItem2 /* inital value */ }}; }; resource rMenu (filesPopup) { filesPopup, /* id of menu */ RefIsResource*MenuTitleRefShift+RefIsResource*ItemRefShift+fAllowCache, filesPopup, /* id of title string */ { filesItem1, /* item reference */ filesItem2, /* item reference */ filesItem3, /* item reference */ filesItem4, /* item reference */ filesItem5, /* item reference */ }; }; resource rPString (filesPopup) { " See Files:" }; resource rMenuItem (filesItem1) { filesItem1, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, nobodyString, /* title reference */ }; resource rMenuItem (filesItem2) { filesItem2, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, ownerString, /* title reference */ }; resource rMenuItem (filesItem3) { filesItem3, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, groupString, /* title reference */ }; resource rMenuItem (filesItem4) { filesItem4, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, oAndGString, /* title reference */ }; resource rMenuItem (filesItem5) { filesItem5, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, everyoneString, /* title reference */ }; //---------------------------------------------------------------------------------- // Make Changes PopUp control resource rControlTemplate (changesPopup) { changesPopup, /* control id */ {89,10,101,247}, /* control rectangle */ PopUpControl{{ /* control type */ 0x0040, /* flags */ 0x1002, /* more flags */ 0, /* ref con */ 100, /* title width */ changesPopup, /* menu reference */ changesItem2 /* inital value */ }}; }; resource rMenu (changesPopup) { changesPopup, /* id of menu */ RefIsResource*MenuTitleRefShift+RefIsResource*ItemRefShift+fAllowCache, changesPopup, /* id of title string */ { changesItem1, /* item reference */ changesItem2, /* item reference */ changesItem3, /* item reference */ changesItem4, /* item reference */ changesItem5, /* item reference */ }; }; resource rPString (changesPopup) { " Make Changes:" }; resource rMenuItem (changesItem1) { changesItem1, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, nobodyString, /* title reference */ }; resource rMenuItem (changesItem2) { changesItem2, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, ownerString, /* title reference */ }; resource rMenuItem (changesItem3) { changesItem3, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, groupString, /* title reference */ }; resource rMenuItem (changesItem4) { changesItem4, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, oAndGString, /* title reference */ }; resource rMenuItem (changesItem5) { changesItem5, /* item id number */ "","", /* hot key*/ 0, /* check character */ RefIsResource*ItemTitleRefShift+fXOR, everyoneString, /* title reference */ }; //---------------------------------------------------------------------------------- // Owner is check box control resource rControlTemplate (ownerCheckBox) { ownerCheckBox, /* control id */ {107,14,119,247}, /* control rectangle */ CheckControl{{ /* control type */ 0x0001, /* flags */ 0x1002, /* more flags */ 0, /* ref con */ ownerCheckBox, /* title reference */ 0x0000 /* inital value */ }}; }; resource rPString (ownerCheckBox) { "Owner is " }; //########################################################### //# Define icon resources # //########################################################### resource rIcon (1) { // the "CDEV" icon 0x8000, // kind 20, // height 28, // width $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFF000000FFFFFFFFFFFFFFFF" $"FFFFF00000000FFFFFFFFFFFFFFF" $"FFFFF000000000000000000FFFFF" $"FFFFF0eeeeeee00eeeeeee0FFFFF" $"FFFFF0eeeeee0ee0eeeeee0FFFFF" $"FFFFF0eeeee000000eeeee0FFFFF" $"FFFFF0eeeee030030eeeee0FFFFF" $"FFFFF0eeeee030030eeeee0FFFFF" $"FFFFF0eeeee000000eeeee0FFFFF" $"cccccccccccccccccccccccccccc" $"FccccccccccccccccccccccccccF" $"FFFFFFF0f0f0f0ff0f0FFFFFFFFF" $"FFFFFFFF0f0f0f0f0f0FFFFFFFFF" $"FFFFFFFFF0f0fff00f0FFFFFFFFF" $"FFFFFFFFFF00ffffff0FFFFFFFFF" $"FFFFFFFFFFFF0fffff0FFFFFFFFF" $"FFFFFFFFFFF000000000FFFFFFFF" $"FFFFFFFFFFF0fffffff0FFFFFFFF" $"FFFFFFFFFFF0f0fffff0FFFFFFFF", $"000000FFFFFF0000000000000000" $"00000FFFFFFFF000000000000000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"0FFFFFFFFFFFFFFFFFFFFFFFFFF0" $"0000000FFFFFFF00FFF000000000" $"00000000FFFFFFF0FFF000000000" $"000000000FFFFFFFFFF000000000" $"0000000000FFFFFFFFF000000000" $"000000000000FFFFFFF000000000" $"00000000000FFFFFFFFF00000000" $"00000000000FFFFFFFFF00000000" $"00000000000FFFFFFFFF00000000" }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/makefile new file mode 100644 index 0000000..d563fcb --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/makefile @@ -0,0 +1 @@ +############################################################# # # # File: MakeFile # # Version: 1.0 # # Author: # # Copyright: (c) 1991 by Apple Computer, Inc. # # # # Description: This file contains the commands needed # # to build the FolderPriv CDEV for the # # IIgs # # # #-----------------------------------------------------------# # # # Development History: # # # # Who Date The Modification # # --- -------- ---------------- # # GAB 01/21/91 Initial release # # # ############################################################# FolderPriv ÄÄ FP.Code FolderPriv.r rDefs.h RezIIgs FolderPriv.r -o FolderPriv -t "C7 " -c "pdos" FolderPriv.obj Ä FolderPriv.c rDefs.h CDev.h CIIgs FolderPriv.c -o FolderPriv.obj FP.Code Ä FolderPriv.obj LinkIIgs -w -x ¶ -l >FP.map ¶ -lib "{CIIGSLibrary}CLib" ¶ -lseg $1000:CDev ¶ FolderPriv.obj ¶ "{CIIGSLibrary}Clib"(@main,@~globals,@~arrays) ¶ -o FP.Code \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/rDefs.h b/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/rDefs.h new file mode 100644 index 0000000..5c27ddc --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/FolderPrivCDEV/rDefs.h @@ -0,0 +1 @@ +#define AboutID 0x0100 #define noFSTtext 0x0200 #define myCtrlList 'GB' #define masterPopup 0x1000 #define foldersPopup 0x2000 #define filesPopup 0x3000 #define changesPopup 0x4000 #define serverDefsBox 0x5000 #define ownerCheckBox 0x6000 #define separator1 0x7000 #define separator2 0x8000 #define masterItem1 masterPopup+1 #define masterItem2 masterPopup+2 #define masterItem3 masterPopup+3 #define masterItem4 masterPopup+4 #define masterItem5 masterPopup+5 #define foldersItem1 foldersPopup+1 #define foldersItem2 foldersPopup+2 #define foldersItem3 foldersPopup+3 #define foldersItem4 foldersPopup+4 #define foldersItem5 foldersPopup+8 #define filesItem1 filesPopup+1 #define filesItem2 filesPopup+2 #define filesItem3 filesPopup+3 #define filesItem4 filesPopup+4 #define filesItem5 filesPopup+8 #define changesItem1 changesPopup+1 #define changesItem2 changesPopup+2 #define changesItem3 changesPopup+3 #define changesItem4 changesPopup+4 #define changesItem5 changesPopup+8 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/General.pii b/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/General.pii new file mode 100644 index 0000000..29d7326 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/General.pii @@ -0,0 +1 @@ +This sourcefile is no longer used. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/General.r b/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/General.r new file mode 100644 index 0000000..988461f --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/General.r @@ -0,0 +1 @@ +/*******************************************************************/ /* /* General.r /* /* Copyright (C) 1988-1992 /* Apple Computer, Inc. /* All Rights Reserved /* /* This file contains the source of the resources needed to build the /* General CDEV. /* /*******************************************************************/ /* work:busybox:busybox.r */ /* "hd:mpw:riigsincludes:typesiigs.r" */ #include "typesiigs.r" resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"FFFF00000000000000000000FFFF" $"FFF0FFFFFFFFFFFFFFFFFFFF0FFF" $"FFF0F000000000000000000F0FFF" $"FFF0F0F4FFFFFFFFFFFFFF0F0FFF" $"FFF0F0DDDDDDDDDDDDDDDD0F0FFF" $"FFF0F0DDDDDDDDDDDDDDDD0F0FFF" $"FFF0F0DDDDDDDDDDDDDDDD0F0FFF" $"FFF0F0DDDDDDDDDDDDDDDD0F0FFF" $"FFF0F0DDDDDDDDDDDDDDDD0F0FFF" $"FFF0F0DDDDDDDDDDDDDDDD0F0FFF" $"FFF0F0DDDDDDDDDDDDDDDD0F0FFF" $"FFF0F000000000000000000F0FFF" $"FFF0FFFFFFFFFFFFFFFFFFFF0FFF" $"FFFF00000000000000000000FFFF" $"FFFF0FFFFFFFFFFFFFFFFFF0FFFF" $"FFFF0FF8F3333FFFFFFFFFF0FFFF" $"FFFF0FF4FFFFFFFFFFFFFFF0FFFF" $"FFFF03333333333333333330FFFF" $"FFFF0FFFFFFFFFFFFFFFFFF0FFFF" $"FFFF00000000000000000000FFFF", $"0000FFFFFFFFFFFFFFFFFFFF0000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"0000FFFFFFFFFFFFFFFFFFFF0000"; }; read rCDEVCode (1,Convert) "General.Load"; resource rCDEVFlags (1) { wantHit+wantInit+wantCreate+wantAbout+wantClose+wantEvents+updateSSfromBRAM, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ {0,0,160,200}, /* DataRect was 47 */ "General", /* Name */ "Michael Stein", /* Author */ "v2.0"; /* VersStr */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/GeneralData.aii b/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/GeneralData.aii new file mode 100644 index 0000000..819f91b --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/GeneralData.aii @@ -0,0 +1 @@ +;;; generaldata - initialized data for general CDEV. ; ; Michael V. Stein 03/01/90. ; ; © Apple, 1990. include 'E16.Control' BLANKS ON string ASIS ;; equates. left equ 5 right equ 195 top equ 2 hgt equ 12 tothgt equ hgt+3 space equ 8 ; control for menublink popup. general1 PROC EXPORT dc.w 9 dc.l 1 dc.w top,left,top+hgt,right dc.l popUpControl dc.w $0040 dc.w $1004 dc.l 0 dc.w 105 dc.l general1Menu dc.w 1 general1menu dc.b '>> Menu Blinking:\H' dc.w 1 dc.b $0D dc.b '== Off\H' dc.w 1 dc.b $0D dc.b '== 1 Time\H' dc.w 2 dc.b $0D dc.b '== 2 Times\H' dc.w 3 dc.b $0D dc.b '== 3 Times\IH' dc.w 4 dc.b $0D dc.b '.' ENDP ; control for cursor flash popup. general2 PROC EXPORT top2 equ top+tothgt dc.w 9 dc.l 2 dc.w top2,left,top2+hgt,right dc.l popUpControl dc.w $0040 dc.w $1004 dc.l 0 dc.w 105 dc.l general2Menu dc.w 1 general2menu dc.b '>> Cursor Flash:\H' dc.w 2 dc.b $0D dc.b '== Slowest\H' dc.w 1 dc.b $0D dc.b '== Slow\H' dc.w 2 dc.b $0D dc.b '== Medium\IH' dc.W 3 dc.b $0D dc.b '== Fast\H' dc.w 4 dc.b $0D dc.b '== Fastest\H' dc.w 5 dc.b $0D dc.b '.' ENDP ; control for system speed popup. general3 PROC EXPORT top3 equ top+tothgt*2 dc.w 9 dc.l 3 dc.w top3,left,top3+hgt,right dc.l popUpControl dc.w $0040 dc.w $1004 dc.l 0 dc.w 105 dc.l general3Menu dc.w 1 general3menu dc.b '>> System Speed:\H' dc.w 3 dc.b $0D dc.b '== Normal\H' dc.w 1 dc.b $0D dc.b '== Fast\IH' dc.w 2 dc.b $0D dc.b '.' ENDP string ASIS ; control for mousespeed popup. mouse1 PROC EXPORT top4 equ top+tothgt*3+space dc.w 9 dc.l 4 dc.w top4,left,top4+hgt,right dc.l popUpControl dc.w $0040 dc.w $1004 dc.l 0 dc.w 110 export mouseptr mouseptr import mouse1menu dc.l mouse1Menu dc.w 1 ENDP ; menu for ROM 1. GSmouse1menu proc export dc.b '>> Mouse Speed:\H' dc.w 1 dc.b $0D dc.b '== Slow\IH' dc.w 1 dc.b $0D dc.b '== Fast\H' dc.w 2 dc.b $0D dc.b '.' ENDP ; menu for ROM 3. mouse1menu proc export dc.b '>> Mouse Speed:\H' dc.w 1 dc.b $0D dc.b '== Slowest\IH' dc.w 1 dc.b $0D dc.b '== Slow\H' dc.w 2 dc.b $0D dc.b '== Medium\H' dc.w 3 dc.b $0D dc.b '== Fast\H' dc.w 4 dc.b $0D dc.b '== Fastest\H' dc.w 5 dc.b $0D dc.b '.' ENDP ; control for double click speed. mouse2 PROC EXPORT top5 equ top+tothgt*4+space dc.w 9 dc.l 5 dc.w top5,left,top5+hgt,right dc.l popUpControl dc.w $0040 dc.w $1004 dc.l 0 dc.w 110 dc.l mouse2Menu dc.w 1 mouse2menu dc.b '>> Double Click:\H' dc.w 2 dc.b $0D dc.b '== Slowest\H' dc.w 1 dc.b $0D dc.b '== Slow\H' dc.w 2 dc.b $0D dc.b '== Medium\IH' dc.w 3 dc.b $0D dc.b '== Fast\H' dc.w 4 dc.b $0D dc.b '== Fastest\H' dc.w 5 dc.b $0D dc.b '.' ENDP ; alphabet stuff. inter1 PROC EXPORT top6 equ top+tothgt*5+space*2 dc.w 9 dc.l 6 dc.w top6,left,top6+hgt,right dc.l popUpControl dc.w $0040 dc.w $1004 dc.l 0 dc.w 80 dc.l inter1Menu dc.w 1 export trick1 Trick1 dc.w zero dc.w one dc.w two dc.w three dc.w four dc.w five dc.w six dc.w seven dc.w eight dc.w nine dc.w ten dc.w eleven dc.w twelve dc.w thirteen dc.w fourteen dc.w fifteen dc.w sixteen dc.w seventeen dc.w eighteen dc.w nineteen dc.w twenty inter1menu dc.b '>> Monitor:\H' dc.w 6 dc.b $0D zero dc.b '== U.S.A.\IH' dc.w 1 dc.b $0D one dc.b '== U.K.\H' dc.w 2 dc.b $0D two dc.b '== French\H' dc.w 3 dc.b $0D three dc.b '== Danish\H' dc.w 4 dc.b $0D four dc.b '== Spanish\H' dc.w 5 dc.b $0D five dc.b '== Italian\H' dc.w 6 dc.b $0D six dc.b '== German\H' dc.w 7 dc.b $0D seven dc.b '== Swedish\H' dc.w 8 dc.b $0D eight dc.b '== Dvorak\H' dc.w 9 dc.b $0D nine dc.b '== Canadian\H' dc.w 10 dc.b $0D ten dc.b '== Flemish\H' dc.w 11 dc.b $0D eleven dc.b '== Hebrew\H' dc.w 12 dc.b $0D twelve dc.b '== Japanese\H' dc.w 13 dc.b $0D thirteen dc.b '== Arabic\H' dc.w 14 dc.b $0D fourteen dc.b '== Greek\H' dc.w 15 dc.b $0D fifteen dc.b '== Turkish\H' dc.w 16 dc.b $0D sixteen dc.b '== Finnish\H' dc.w 17 dc.b $0D seventeen dc.b '== Portuguese\H' dc.w 18 dc.b $0D eighteen dc.b '== Tamil\H' dc.w 19 dc.b $0D nineteen dc.b '== Hindi\H' dc.w 20 dc.b $0D twenty dc.b '.' ENDP keyboard1 PROC EXPORT ; control for keyboard language. top7 equ top+tothgt*6+space*2 dc.w 9 dc.l 7 dc.w top7,left,top7+hgt,right dc.l popUpControl dc.w $0040 dc.w $1004 dc.l 0 dc.w 80 dc.l keyboard4Menu dc.w 1 export trick Trick dc.w zero dc.w one dc.w two dc.w three dc.w four dc.w five dc.w six dc.w seven dc.w eight dc.w nine dc.w ten dc.w eleven dc.w twelve dc.w thirteen dc.w fourteen dc.w fifteen dc.w sixteen dc.w seventeen dc.w eighteen dc.w nineteen dc.w twenty keyboard4menu dc.b '>> Keyboard:\H' dc.w 4 dc.b $0D zero dc.b '== U.S.A.\IH' dc.w 1 dc.b $0D one dc.b '== U.K.\H' dc.w 2 dc.b $0D two dc.b '== French\H' dc.w 3 dc.b $0D three dc.b '== Danish\H' dc.w 4 dc.b $0D four dc.b '== Spanish\H' dc.w 5 dc.b $0D five dc.b '== Italian\H' dc.w 6 dc.b $0D six dc.b '== German\H' dc.w 7 dc.b $0D seven dc.b '== Swedish\H' dc.w 8 dc.b $0D eight dc.b '== Dvorak\H' dc.w 9 dc.b $0D nine dc.b '== Canadian\H' dc.w 10 dc.b $0D ten dc.b '== Flemish\H' dc.w 11 dc.b $0D eleven dc.b '== Hebrew\H' dc.w 12 dc.b $0D twelve dc.b '== Japanese\H' dc.w 13 dc.b $0D thirteen dc.b '== Arabic\H' dc.w 14 dc.b $0D fourteen dc.b '== Greek\H' dc.w 15 dc.b $0D fifteen dc.b '== Turkish\H' dc.w 16 dc.b $0D sixteen dc.b '== Finnish\H' dc.w 17 dc.b $0D seventeen dc.b '== Portuguese\H' dc.w 18 dc.b $0D eighteen dc.b '== Tamil\H' dc.w 19 dc.b $0D nineteen dc.b '== Hindi\H' dc.w 20 dc.b $0D twenty dc.b '.' ENDP other1 PROC EXPORT top8 equ top+tothgt*7+space*2 dc.w 9 ;pcount dc.l 8 ;ctl ID dc.w top8,left,top8+hgt,right ;rect dc.l popUpControl ;procRef dc.w $0040 ;ctlFlag dc.w $1002 ;moreFlags dc.l 0 ;refCon dc.w 105 ;title width dc.l $07ff1000 ;menuRef, from the System resourceÉ ;Éfile, so that it will followÉ ;Élocalization dc.w 1 ;initial item top9 equ top+tothgt*8+20 export sortCheck sortCheck dc.w 8 ;pcount dc.l 9 ;ctl ID dc.w top9,left+22,top9+hgt,right ;rect dc.l checkControl ;procRef dc.w $0000 ;ctlFlag dc.w $1000 ;moreFlags dc.l 0 ;refCon dc.l checkTitle dc.w 0 ;initial value checkTitle dc.b @end - @start @start dc.b ' Alphabetize DAs ' @end ; list of controls. generalList PROC EXPORT dc.l general1 dc.l general2 dc.l general3 dc.l mouse1 dc.l mouse2 dc.l inter1 dc.l keyboard1 dc.l other1 dc.l sortCheck dc.l 0 ENDP generalabout2 PROC EXPORT dc.w 8 dc.l 1 dc.w 38,5,138,280 dc.l $81000000 dc.w $0000 dc.w $1000 dc.l 0 dc.l ab2 dc.w ab2L ab2 dc.b 'Not enough memory.' ab2L equ *-ab2 endp ; text edit control for about box. generalabout proc export dc.w 16 ; pCount - Just until the text length. dc.l $00000021 ; ID. dc.w 38,5,138,280 ; rect dc.l $85000000 ; procRef - TextEdit control is $85000000. dc.w $0 dc.w $7400 ; moreFlags - references are for pointers. dc.l $00000000 ; refCon - not needed. dc.l $45900000 ; textFlags - no selecting, draws border, etc. dc.w $ffff,$ffff ; indentRect - use the default amounts. dc.w $ffff,$ffff dc.l $ffffffff ; vertBar - let TextEdit create the scroll bar. dc.w $0000 ; vertAmount - use the default amount for scrolling. dc.l $00000000 ; horzBar - not used. dc.w $0000 ; horzAmount - not used. dc.l $00000000 ; styleRef - there are no initial styles. dc.w $0004 ; textDescriptor - text is pointer to LETextBox2. dc.l thetext ; textRef - to be supplied by the program. _aboutFullProgramTitleLength_ dc.l endtext-thetext ; textSize - to be supplied by the program. string asis TheText dc.b 'The General Control Panel allows you to change miscellaneous ' dc.b 'system settings. Menu Blinking is the number of times ' dc.b 'that menu items will blink when they are chosen. ' dc.b 'Cursor Flash is how fast the insertion point ' dc.b 'will blink when you are editing text. System Speed allows ' dc.b 'you to slow down the processor for compatibility with older ' dc.b 'Apple II programs. ' dc.b 'Mouse ' dc.b 'Speed controls the speed of the mouse across the screen. Double ' dc.b 'Click is the interval of time between two mouse clicks for them to ' dc.b 'be considered a double click. ' dc.b 'The Monitor item lets you select a foreign character set for ' dc.b 'the text screen. ' dc.b 'The Keyboard item allows you to set the keyboard type. Setting ' dc.b 'the Translation item to ÒStandardÓ will allow you to type foreign ' dc.b 'characters. ' dc.b 'Alphabetize DAs causes NDAs and CDAs to be listed in ' dc.b 'alphabetical order after the system is restarted.' EndText ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/general.aii b/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/general.aii new file mode 100644 index 0000000..3bb1186 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/general.aii @@ -0,0 +1 @@ +;;; general - General CDEV. ; ; Michael V. Stein 03/01/90. ; ; © Apple, 1990. blanks off ;; equates. aug_param equ $5e bit 0 set means no closed captioning ;bit 1 set means standard time ; clear if daylight savings time ;bit 2 set means not to have auto daylight savings ; clear means to have auto daylight savings ;bit 3 and 4 are the amount of menublink to have ;; include files. include '::cdev.h' include '::commonmacros.h' include '::dp.h' include 'e16.control' include 'e16.event' include 'm16.control' include 'm16.event' include 'm16.font' include 'm16.locator' include 'm16.memory' include 'm16.menu' include 'm16.misctool' include 'm16.quickdraw' include 'm16.textedit' include 'm16.util2' include 'm16.window' ;; main program. main proc ;; imported addresses. import generalabout import generalabout2 import generallist import gsmouse1menu import mouse1menu import mouseptr import trick import trick1 general phb save calling data bank phk plb set our data bank ; make room on stack for direct page. tsc sec sbc #dpsize make room on stack for new direct page tcs phd save the current direct page tcd new direct page lda message cmp #11 bcs general1 if message defintely not handled asl a times 2 into word table tax move into index reg jsr (t_cdev-2,x) call the handler of this message general1 pld restore direct page tsc clc adc #dpsize tcs reset the stack lda 1,s Bump the stack up to prepare sta 11,s to take off the 3 parameters lda 3,s sta 13,s pla get rid of message space pla get rid of data1 space pla pla get rid of data2 space pla lda #0 return 0 to caller sta 5,s sta 7,s plb rtl t_cdev dc.w cccE handle machine message - ignored dc.w cccE handle boot message - ignored dc.w cccE unused dc.w icc init cdev controls dc.w ctc close the cdev dc.w hem handle event message dc.w ccc create cdev controls dc.w ham handle about message dc.w cccE handle rectangle message dc.w hhm handle hit message ;; ccc - create cdev controls. ; ; entry [data1] = window pointer. ; (generallist..) = table of pointers to control templates to create. ; (mouse1menu..) = mouse menu to use when not on a ten speed. ; (trick..) = table of bank offsets for keyboard language menu. ; (trick1..) = table of bank offsets for display language menu. ; ; exit controls are created. ccc lda #0 pha space pha space pha space pha space pha (a) pha (x) pha (y) pushw #$fe1f entrypoint to call _FWEntry call the firmware ply (y) plx (a) - unused plx (x) - unused plx (p) - unused cpy #2 bcs ccc1 if a new machine ; if not a ten speed, then reset the mouse menu to have fewer options. lda #GSmouse1menu sta mouseptr lda #^GSmouse1menu sta mouseptr+2 ; reset the keyboard and display language menus to what is available. ccc1 ldx #$41 battery parameter to get # of keyboard languages jsr rbp read battery parameter asl a tax lda trick,x sta l1 low word of loc to mark as end ldx #$38 battery parameter to get # of display languages jsr rbp read battery parameter asl a tax lda trick1,x sta l2 low word of loc to mark as end lda #^trick sta l1+2 set hi words sta l2+2 shortm lda #'.' sta [l1] shorten the menu as appropriate sta [l2] shorten the menu as appropriate longm pha space for result pha pushl data1 window pointer pushw #3 next item is a ptr to a list of template pointers pushl #GeneralList _NewControl2 pla pla don't care about result cccE rts ;; ctc - close the cdev. ; ; entry none. ; ; exit tools are shutdown, and any memory we allocated is released. ctc jsr stt shutdown the tools jmp dom dispose of memory and return ;; ham - handle about message. ; ; entry [data1] = window pointer. ; (GeneralAbout..) = template for about screen. ; ; exit The About control is created. ham pushw #0 _FMStatus pla beq ham1 if not active jmp ham8 ham1 bcc ham3 if font manager is loaded inc font2F flag that this has to be unloaded ham2 pushw #$1b pushw #0 _LoadOneTool bcc ham3 if no error loading the tool jsr daw display alert window tax beq ham7 if user gave up bra ham2 if user wants to try again ham3 inc fontF flag that this has to be shutdown pha space for handle pha pushl #$100 1 page pha _MMStartup get mem id pushw #$C005 locked, fixed, fixed bank, pg algned pushl #0 _NewHandle bcs ham6 if unable to get memory pla sta l1 sta fmhdl pla sta l1+2 sta fmhdl+2 ham5 pha space for result _MMStartup id to use lda [l1] pha address of direct page _FMStartup bcc ham8 if ok cmp #$200 bcs ham6 if memory manager error jsr daw display alert window tax beq ham7 if user wants to quit bra ham5 try to load it again ham6 jmp ham14 show the out of memory box ham7 rts ham8 pushw #0 _TEStatus pla bne ham13 if text edit is already active bcc ham11 if tool is already loaded ham9 pushw #$22 pushw #0 _LoadOneTool bcc ham10 jsr daw bra ham9 ham10 inc text2F flag that tool should be unloaded ham11 pha space for handle pha pushl #$100 1 page pha _MMStartup get mem id pushw #$C005 locked, fixed, fixed bank, pg algned pushl #0 _NewHandle bcs ham6 if unable to get memory pla sta l1 sta tehdl pla sta l1+2 sta tehdl+2 pha space for result _MMStartup id to use lda [l1] pha address of direct page _TEStartup inc textF flag that this has to be shut down ham13 pha space for result pha pushl data1 window pointer pushw #0 next item is a ptr to a template pushl #GeneralAbout _NewControl2 pla pla don't care about result rts ; if unable to show big about - tell user the bad news. ham14 pha space for result pha pushl data1 window pointer pushw #0 next item is a ptr to a template pushl #GeneralAbout2 _NewControl2 pla pla don't care about result rts ;; hem - handle event message. ; ; entry [data1] = event. ; ; exit If it detects an activate event, it will shutdown any tools ; we started up and dispose of any memory we allocated. hem ldy #owhat lda [data1],y get what type of event occurred cmp #ActivateEvt bne hem1 if not activate event ldy #omodifiers lda [data1],y lsr a bcc hem1 if window is being deactivated jsr stt shutdown the tools jmp dom dispose of memory and return hem1 rts ;; hhm - handle hit message. ; ; entry [data1] = handle to control that was hit. ; [data2] = id of control that was hit. ; ; exit battery parameter locations are updated. hhm pha space for result pushl data1 _GetCtlValue pla dea this is what most things want ldx data2 get id of control dex bne hhm1 if not setting menu blink pha save for later recall pha _SetMItemBlink set the menu blink pla asl a -----XX- asl a ----XX-- asl a ---XX--- sta w1 save for now ldx #aug_param jsr rbp read battery parameter and #%11100111 remove the menuitem blink ora w1 set as appropriate ldx #aug_param bra hhm10 write battery parameter and return hhm1 dex bne hhm2 if not setting cursor flash ldx #$2f bra hhm10 write battery parameter and return hhm2 dex bne hhm3 if not setting the system speed pha save for now ldx #$20 battery parameter loc for speed jsr wbp write battery parameter pla shortm lsr a ror a ora >$e1c036 sta >$e1c036 set or reset the speed longm rts hhm3 dex bne hhm4 if not setting the mouse speed ldx #$33 bra hhm10 write battery parameter and return hhm4 dex bne hhm5 if not setting the double click speed ldx #$2e bra hhm10 write battery parameter and return hhm5 dex bne hhm6 if not setting monitor display ldx #$29 bra hhm10 write battery parameter and return hhm6 dex bne hhm7 if not setting the keyboard language ldx #$2a bra hhm10 write battery parameter and return hhm7 dex bne hhm7a if not setting translation tax (a) = value of control -1 beq hhm9 if setting translation none cmp #2-1 bne hhm8 if not 'standard' macintosh translation lda #$ff-1 hhm8 ina adjust for initial decrement hhm9 pha _SetKeyTranslation rts hhm7a ; handle "sort DA's" checkbox pha save value-1 ldx #$005F Dave Lyons' BRAM byte jsr rbp get current value ldx #$005F preset X with param # for store ply restore control value beq @on was 1, turn on bit @off and #$FFFE turn off bit 0 bra hhm10 set new value @on ora #$0001 turn on bit 0 ; fall through to write new BRAM value hhm10 jmp wbp write battery parameter and return ;; icc - init cdev controls. ; ; entry [data1] = window pointer. ; (iccbat..) = table of battery parameters to check. ; ; exit controls are intialized to the battery settings. icc ldx #aug_param jsr rbp read battery parameter lsr a ----XX-- lsr a -----XX- lsr a ------XX and #3 ldx #1 jsr scv set control value ; init cursor flash, sys speed, mouse speed, double click, monitor display and keybaord display. ldx #2 control id of cursor flash icc1 stx w1 init counter lda iccbat-2,x and #$ff tax jsr rbp read battery parameter ldx w1 jsr scv set control value ldx w1 inx cpx #7+1 compare against highest control to set this way bcc icc1 if more to set ; set keybaord translation. pha _GetKeyTranslation pla cmp #$ff bne icc2 if not 'normal' iigs translation lda #2 bra icc3 icc2 tax bne icc3 if not 'standard' macintosh like translation ina icc3 dea scv will increment it ldx #8 id of translation jsr scv set control value ; check "sort DAs" bit ;brk $04 ldx #$5F Dave Lyons' BRAM byte jsr rbp read BRAM and #$0001 keep bit 0, so now we have a checkbox ctl value! ldx #9 ID of "sort DA's" check box jmp scv2 set ctl value & return ; battery parameter locations. iccbat dc.b $2f cursor flash dc.b $20 system speed dc.b $33 mouse speed dc.b $2e double click time dc.b $29 monitor language translation dc.b $2a keyboard language translation ; teriary routines used in this program. ;; daw - display alert window. ; ; entry (dawa..) = alert string. ; daww = width of window. ; ; exit none. daw ldx #(320-daww)/2 pha space for result _GetMasterSCB pla xba rol a bcc daw1 if 320 mode ldx #(640-daww)/2 daw1 stx dawa+1+2 left x txa clc adc #daww sta daw+1+6 right x pha space for result pushw #0 flags pha pha subsitution array - not used pushl #dawa reference to string _AlertWindow pla rts daww equ 300 width of window dawa dc.b '0' dc.w 60,0,100,0 dc.b '6' dc.b '/Please insert your startup disk./#1/^#4',0 ;; dom - dispose of memory. ; ; entry [fmhdl] = 0 or the handle to the space needed for the font manager. ; [tehdl] = 0 or the handle to the space for textedit. ; ; exit Handles are disposed. ; [fmhdl] = 0. ; [tehdl] = 0. dom lda tehdl ora tehdl+2 beq dom1 if no handle for textedit pushl tehdl _DisposeHandle stz tehdl stz tehdl+2 dom1 lda fmhdl ora fmhdl+2 beq dom2 if no handle for font manager pushl fmhdl _DisposeHandle stz fmhdl stz fmhdl+2 dom2 rts ;; rbp - read battery parameter. ; ; entry (x) = parameter to read. ; ; exit (a) = value of parameter. rbp pha space for result phx parameter to read _ReadBparam pla get value rts ;; scv - set control value. ; ; entry (a) = value of control to set -1. ; (x) = id of control. ; [data1] = window pointer. ; ; exit control is set to the value desired. scv ina scv2 pha value to set pha space for result pha pushl data1 window pointer pushw #0 phx id of control _GetCtlHandleFromID _SetCtlValue value to set was already on stack rts ;; stt - shutdown tools. ; ; entry (fontF) !=0 if we started up the font manager. ; (font2F) != 0 if we loaded the font manager. ; (textF) != 0 if we started up textedit. ; (text2F) != 0 if we loaded textedit. ; ; exit everything is set back to the way it was. ; (fontF) = (font2F) = (textF) = (text2F) = 0. stt lda fontF beq stt1 if we didn't start up the font manager _FMShutDown stt1 lda font2F beq stt2 if we didn't load the font manager pushw #$1b _UnloadOneTool unload the font manager since we loaded it stt2 lda textF beq stt3 if we didn't start up textedit _TEShutdown stt3 lda text2F beq stt4 if we didn't load textedit pushw #$22 _UnloadOneTool unload textedit since we loaded it stt4 stz fontF stz font2F stz textF stz text2F rts ;; wbp - write battery parameter. ; ; entry (a) = value of parameter to set. ; (x) = battery parameter to set. ; ; exit battery parameter is set. wbp pha new value phx parameter to set _WriteBparam rts ; global data. fmhdl ds.b 4 handle to direct page needed by font manager fontF ds.b 2 != 0 if font manager needs to be shut down font2F ds.b 2 != 0 if font manager needs to be unloaded tehdl ds.b 4 handle to direct page needed by text edit textF ds.b 2 != 0 if text edit needs to be shut down text2F ds.b 2 != 0 if textedit needs to be unloaded endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/makefile new file mode 100644 index 0000000..dfa815c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/GeneralCDEV/makefile @@ -0,0 +1 @@ + CDEV = GENERAL {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" if {dup} # test whether we should duplicateiigs duplicateiigs -m -y {CDEV} {CDEV} end {CDEV}.Load Ä ¶ {CDEV}.aii.obj ¶ {CDEV}Data.aii.obj linkiigs ¶ -x -l -s > {CDEV}.map ¶ -lseg gen ¶ {CDEV}.aii.obj ¶ {CDEV}Data.aii.obj ¶ -o {CDEV}.Load {CDEV}.aii.obj Ä {CDEV}.aii asmiigs {CDEV}.aii {CDEV}Data.aii.obj Ä {CDEV}Data.aii asmiigs {CDEV}Data.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/Keyboard.pii b/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/Keyboard.pii new file mode 100644 index 0000000..29d7326 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/Keyboard.pii @@ -0,0 +1 @@ +This sourcefile is no longer used. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/Keyboard.r b/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/Keyboard.r new file mode 100644 index 0000000..c7a0394 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/Keyboard.r @@ -0,0 +1 @@ +/*******************************************************************/ /* /* Keyboard.r /* /* Copyright (C) 1988-1992 /* Apple Computer, Inc. /* All Rights Reserved /* /* This file contains the source of the resources needed to build the /* Keyboard CDEV. /* /*******************************************************************/ /* work:busybox:busybox.r */ /* "hd:mpw:riigsincludes:typesiigs.r" */ #include "typesiigs.r" resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFF00000000000000000000FFFF" $"FFF00FF4FF0FF0FFFFFFFFF00FFF" $"F00000000000000000000000000F" $"0FFFFFFFFFFFFFFFFFFFFFFFFFF0" $"0F0F0F0F0F0F0F0F0F0FF0F0F0F0" $"0FF0F0F0F0F0F0F0F0F0FF0F0FF0" $"0F0F0F0F0F0F0F0F0F0FF0F0F0F0" $"0FF0F0F000000000F0F0FF0F0FF0" $"0FFFFFFFFFFFFFFFFFFFFFFFFFF0" $"F00000000000000000000000000F" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF", $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000FFFFFFFFFFFFFFFFFFFF0000" $"000FFFFFFFFFFFFFFFFFFFFFF000" $"0FFFFFFFFFFFFFFFFFFFFFFFFFF0" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"0FFFFFFFFFFFFFFFFFFFFFFFFFF0" $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000"; }; read rCDEVCode (1,Convert) "Keyboard.Load"; resource rCDEVFlags (1) { wantHit+wantInit+wantCreate+wantAbout+updateSSfromBRAM, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ {0,0,150,200}, /* DataRect */ "Keyboard", /* Name */ "Darryl Lovato", /* Author */ "v1.1"; /* VersStr */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/KeyboardData.aii b/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/KeyboardData.aii new file mode 100644 index 0000000..60ba226 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/KeyboardData.aii @@ -0,0 +1 @@ +;;; keyboarddata - initialized data for keyboard CDEV. ; ; Michael V. Stein 03/01/90. ; ; © Apple, 1990. blanks off include 'e16.control' string ASIS dataseg proc ; exported addresses. export keyabout export keyboardlist export keyboardr3menu export keyptr keyboard1 dc.w 9 dc.l 1 dc.w 2,5,14,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 keyptr dc.l keyboardr1Menu dc.w 1 ; menu to use for revision 1 roms. keyboardr1menu dc.B '>> Speed:\H' dc.W 1 dc.B $0D dc.B '== 1 Char/Sec\H' dc.W 1 dc.B $0D dc.B '== 2 Chars/Sec\H' dc.W 2 dc.B $0D dc.B '== 4 Chars/Sec\H' dc.W 3 dc.B $0D dc.B '== 8 Chars/Sec\IH' dc.W 4 dc.B $0D dc.B '== 11 Chars/Sec\H' dc.W 5 dc.B $0D dc.B '== 15 Chars/Sec\H' dc.W 6 dc.B $0D dc.B '== 20 Chars/Sec\H' dc.W 7 dc.B $0D dc.B '== 24 Chars/Sec\H' dc.W 8 dc.B $0D dc.B '.' ; menu to use if rom is at least rev 3. keyboardr3menu dc.B '>> Speed:\H' dc.W 1 dc.B $0D dc.B '== 1 Char/Sec\H' dc.W 1 dc.B $0D dc.B '== 2 Chars/Sec\H' dc.W 2 dc.B $0D dc.B '== 4 Chars/Sec\H' dc.W 3 dc.B $0D dc.B '== 8 Chars/Sec\H' dc.W 4 dc.B $0D dc.B '== 11 Chars/Sec\H' dc.W 5 dc.B $0D dc.B '== 15 Chars/Sec\IH' dc.W 6 dc.B $0D dc.B '== 20 Chars/Sec\H' dc.W 7 dc.B $0D dc.B '== 24 Chars/Sec\H' dc.W 8 dc.B $0D dc.B '== 30 Chars/Sec\H' dc.W 9 dc.B $0D dc.B '== 40 Chars/Sec\H' dc.W 10 dc.B $0D dc.B '.' keyboard2 dc.w 9 dc.l 2 dc.w 17,5,29,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l keyboard2Menu dc.w 1 keyboard2menu dc.B '>> Delay:\H' dc.W 2 dc.B $0D dc.B '== .25 Sec\H' dc.W 1 dc.B $0D dc.B '== .50 Sec\H' dc.W 2 dc.B $0D dc.B '== .75 Sec\IH' dc.W 3 dc.B $0D dc.B '== 1.0 Sec\H' dc.W 4 dc.B $0D dc.B '== No repeat\H' dc.W 5 dc.B $0D dc.B '.' keyboard3 dc.w 9 dc.l 3 dc.w 32,5,44,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 85 dc.l keyboard3Menu dc.w 1 keyboard3menu dc.B '>> Dual Speed:\H' dc.W 3 dc.B $0D dc.B '== Normal\IH' dc.W 1 dc.B $0D dc.B '== Fast\H' dc.W 2 dc.B $0D dc.B '.' string pascal keyboard5 dc.w 8 dc.L 5-1 dc.w 49+5,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L keyboard5Title dc.w 0 keyboard5Title dc.b 'Keyboard Buffering' keyboard6 dc.w 8 dc.L 6-1 dc.w 59+5,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L keyboard6Title dc.w 0 keyboard6Title dc.b 'Shift Caps/Lowercase' keyboard7 dc.w 8 dc.L 7-1 dc.w 69+5,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L keyboard7Title dc.w 0 keyboard7Title dc.b 'Fast Space/Delete' keyboardList dc.l keyboard1 dc.l keyboard2 dc.l keyboard3 dc.l keyboard5 dc.l keyboard6 dc.l keyboard7 dc.L SpeedPopup dc.L DelayPopup dc.L AccelPopup dc.L MouseKeyText dc.l 0 rWidth equ 200 rX1 equ 5 rX2 equ rWidth-8 textY1 equ 90 textY2 equ textY1+10 delayY1 equ textY2+2 delayY2 equ delayY1+12 accelY1 equ delayY2+3 accelY2 equ accelY1+12 speedY1 equ accelY2+3 speedY2 equ speedY1+12 idDelay equ 10 idAccel equ 11 idSpeed equ 12 STRING ASIS MouseKeyText dc.W 8 pcount dc.L $8001 dc.W textY1,rX1,textY2,rX2 boundry rect dc.L statTextControl procRef dc.W inactiveHilite<<8 flag dc.W $1000 moreFlags dc.L 0 refCon dc.L MouseKeyStr textRef dc.W endStr-MouseKeyStr text length MouseKeyStr dc.B 'Keyboard Mouse:' endStr SpeedPopup dc.W 9 pcount dc.L idSpeed id dc.W speedY1,rX1,speedY2,rX2 boundary rect dc.L $87000000 procRef dc.W $0042 flag dc.W $1004 moreFlags dc.L 0 refCon dc.W 0 title width dc.L SpeedPopupMenu menuRef dc.W 1 initial value SpeedPopupMenu dc.B '>> Speed: \H' dc.W 1 dc.B $0D dc.B '== 8 Pixels/Sec\H' dc.W 1 dc.B $0D dc.B '== 11 Pixels/Sec\H' dc.W 2 dc.B $0D dc.B '== 15 Pixels/Sec\H' dc.W 3 dc.B $0D dc.B '== 20 Pixels/Sec\H' dc.W 4 dc.B $0D dc.B '== 24 Pixels/Sec\H' dc.W 5 dc.B $0D dc.B '== 30 Pixels/Sec\H' dc.W 6 dc.B $0D dc.B '== 40 Pixels/Sec\IH' dc.W 7 dc.B $0D dc.B '== 60 Pixels/Sec\H' dc.W 8 dc.B $0D dc.B '== 120 Pixels/Sec\H' dc.W 9 dc.B $0D dc.B '== 180 Pixels/Sec\H' dc.W 10 dc.B $0D dc.B '.' DelayPopup dc.W 9 pcount dc.L idDelay id dc.W delayY1,rX1,delayY2,rX2 boundry rect dc.L $87000000 procRef dc.W $0042 flag dc.W $1004 moreFlags dc.L 0 refCon dc.W 0 title width dc.L DelayPopupMenu menuRef dc.W 1 initial value DelayPopupMenu dc.B '>> Initial Delay: \H' dc.W 2 dc.B $0D dc.B '== 0.25 Sec\H' dc.W 1 dc.B $0D dc.B '== 0.50 Sec\H' dc.W 2 dc.B $0D dc.B '== 0.75 Sec\IH' dc.W 3 dc.B $0D dc.B '== 1.0 Sec\H' dc.W 4 dc.B $0D dc.B '== 1.25 Sec\H' dc.W 5 dc.B $0D dc.B '.' AccelPopup dc.W 9 pcount dc.L idAccel id dc.W accelY1,rX1,accelY2,rX2 boundry rect dc.L $87000000 procRef dc.W $0042 flag dc.W $1004 moreFlags dc.L 0 refCon dc.W 0 title width dc.L AccelPopupMenu menuRef dc.W 1 initial value AccelPopupMenu dc.B '>> Acceleration: \H' dc.W 3 dc.B $0D dc.B '== 6.0 Sec\H' dc.W 1 dc.B $0D dc.B '== 4.5 Sec\H' dc.W 2 dc.B $0D dc.B '== 3.0 Sec\IH' dc.W 3 dc.B $0D dc.B '== 1.5 Sec\H' dc.W 4 dc.B $0D dc.B '== 0.0 Sec\H' dc.W 5 dc.B $0D dc.B '.' string pascal keyAbout dc.w 8 dc.L 1 dc.w 38,5,138,280 dc.L $81000000 dc.w $0000 dc.w $1000 dc.L 0 dc.L TheText dc.w EndText-TheText string asis TheText dc.b 'The Keyboard Control Panel allows you to change system settings that ' dc.b 'affect the keyboard. The Keyboard Mouse allows you to ' dc.b 'simulate the mouse by using the keypad.' EndText endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/keyboard.aii b/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/keyboard.aii new file mode 100644 index 0000000..0076f50 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/keyboard.aii @@ -0,0 +1 @@ +;;; keyboard - cdev to control keyboard. ; ; Michael V. Stein 01/08/90. ; ; Copyright Apple Computer, 1990. blanks off ;; equates. bpMKeysDelay equ $55 battery parameter for mouse key delay bpMKeysAccel equ $56 battery parameter for mouse key acceleration bpMKeysSpeed equ $57 battery parameter for mouse key speed idDelay equ 10 idAccel equ 11 idSpeed equ 12 ;; imported addresses. import keyabout import keyboardlist import keyboardr3menu import keyptr ;; include files. include '::cdev.h' include '::commonmacros.h' include '::dp.h' include 'm16.control' include 'm16.misctool' include 'm16.util' ;; main program. main proc export key key phb save calling data bank phk plb set our data bank ; make room on stack for direct page. tsc sec sbc #dpsize make room on stack for new direct page tcs phd save the current direct page tcd new direct page lda message cmp #11 bcs key1 if message defintely not handled asl a times 2 into word table tax move into index reg jsr (t_cdev-2,x) call the handler of this message key1 pld restore direct page tsc clc adc #dpsize tcs reset the stack lda 1,s Bump the stack up to prepare sta 11,s to take off the 3 parameters lda 3,s sta 13,s pla get rid of message space pla get rid of data1 space pla pla get rid of data2 space pla lda #0 return 0 to caller sta 5,s sta 7,s plb rtl t_cdev dc.w cccE Null dc.w cccE handle machine message dc.w cccE handle boot message dc.w icc init cdev controls dc.w cccE close the cdev dc.w cccE handle event message dc.w ccc create cdev controls dc.w ham handle about message dc.w cccE handle rectangle message dc.w hhm handle hit message ;; ccc - create cdev controls. ; ; entry [data1] = window pointer. ; (keybaordlist..) = table of pointers to control templates to create. ; (keyboard3menu..) = different popup menu to use when not on a rom 1 machine. ; [keyptr] = ptr to popup for repeat speed. ; ; exit controls are created. ccc lda #0 is this necessary? pha space pha space pha space pha space pha (a) pha (x) pha (y) pushw #$fe1f entrypoint to call _FWEntry call the firmware ply (y) plx (a) - unused plx (x) - unused plx (p) - unused cpy #2 bcc ccc1 if not a new machine ; use other menu. lda #keyboardr3menu sta keyptr lda #^keyboardr3menu sta keyptr+2 ccc1 pha space for result pha pushl data1 window pointer pushw #3 next item is a ptr to a list of template pointers pushl #KeyboardList _NewControl2 pla pla don't care about result cccE rts ;; ham - handle about message. ; ; entry [data1] = window pointer. ; (KeyAbout..) = template for about screen. ; ; exit The About control is created. ham pha space for result pha pushl data1 window pointer pushw #0 next item is a ptr to a template pushl #KeyAbout _NewControl2 pla pla don't care about result rts ;; hhm - handle hit message. ; ; entry [data1] = handle to control that was hit. ; [data2] = id of control that was hit. ; ; exit battery parameter locations are updated. hhm pha space for result pushl data1 _GetCtlValue lda data2 control that was hit cmp #10 bcs hhm5 if keybaord mouse controls cmp #4 bcs hhm1 if in checkboxes pla dea bra hhm2 hhm1 pla beq hhm2 lda #1 if non-zero, make it one hhm2 pha replace back on stack for now hhm3 ldx data2 id of control that was hit lda params-1,x tax battery parameter to set pla get back value bra hhm8 set battery parameter and return hhm5 cmp #10 bne hhm6 if not delay pla get value of control dea value to set ldx #bpMKeysDelay bra hhm8 set battery parameter and return hhm6 cmp #11 bne hhm7 if not acceleration time pla dea ldx #bpMKeysAccel bra hhm8 set battery parameter and return hhm7 cmp #12 bne hhm9 pla dea ldx #bpMKeysSpeed hhm8 jmp wbp write battery parameter and return hhm9 rts ;; icc - init cdev controls. ; ; entry [data1] = window pointer. ; (params..) = table of battery parameters to check. ; bpMKeysDelay = battery parameter for keyboard mouse delay ; bpMKeysAccel = battery parameter for keyboard mouse accelleration. ; bpMKeysSpeed = battery paramter for keyboard mouse max speed. ; idAccel = id of control for keyboard mouse acceleration. ; idDelay = id of control for keyboard mouse delay. ; idSpeed = id of control for keyboard mouse max speeed. ; ; exit controls are intialized to the battery settings. icc ldx #6 highest control icc1 stx icca save for now lda params-1,x and #$ff tax parameter to check jsr rbp read battery parameter ldx icca cpx #4 bcc icc3 if not in checkboxes tay beq icc3a if checkbox shouldn't be set lda #1-1 icc3 ina icc3a pha put control value on stack icc4 pha space for result pha pushl data1 window pointer pushw #0 pushw icca id of control _GetCtlHandleFromID _SetCtlValue value to set was already on stack ldx icca dex bne icc1 if more controls to set ; init the keyboard mouse stuff. ldx #bpMKeysDelay BRAM offset jsr rbp read battery parameter cmp #255 bne icc5 if already intialized lda #2 default icc5 ina pha new value pha space for handle pha Pushl data1 window ptr pea 0 pea idDelay control's ID _GetCtlHandleFromID _SetCtlValue set contol's value ldx #bpMKeysAccel jsr rbp read battery parameter cmp #255 bne icc6 if already initialed lda #2 default icc6 ina pha new value pha space for handle pha Pushl data1 window ptr pea 0 pea idAccel control's ID _GetCtlHandleFromID _SetCtlValue set contol's value ldx #bpMKeysSpeed jsr rbp read battery parameter cmp #255 bne icc7 if already initialized lda #6 default icc7 ina pha new value pha space for handle pha Pushl data1 window ptr pea 0 pea idSpeed control's ID _GetCtlHandleFromID _SetCtlValue set contol's value rts icca dc.w 0 hold loop index ;; rbp - read battery parameter. ; ; entry (x) = parameter to read. ; ; exit (a) = value of parameter. rbp pha space for result phx parameter to read _ReadBparam pla get value rts ;; wbp - write battery parameter. ; ; entry (a) = value of parameter to set. ; (x) = battery parameter to set. ; ; exit battery parameter is set. wbp pha new value phx parameter to set _WriteBparam rts ; global data. ; battery parameters to check/set. params dc.b $2c dc.b $2d dc.b $32 dc.b $2b dc.b $30 dc.b $31 endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/makefile new file mode 100644 index 0000000..072e0d2 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/KeyboardCDEV/makefile @@ -0,0 +1 @@ + CDEV = KEYBOARD {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" {CDEV}.Load Ä ¶ {CDEV}.aii.obj ¶ {CDEV}Data.aii.obj linkiigs ¶ -x -l -s >{CDEV}.map ¶ -lseg keyb ¶ {CDEV}.aii.obj ¶ {CDEV}Data.aii.obj ¶ -o {CDEV}.Load {CDEV}.aii.obj Ä ¶ {CDEV}.aii asmiigs {CDEV}.aii {CDEV}Data.aii.obj Ä ¶ {CDEV}Data.aii asmiigs {CDEV}Data.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/ASPCalls.c b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/ASPCalls.c new file mode 100644 index 0000000..ab0f771 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/ASPCalls.c @@ -0,0 +1 @@ +/* File: ASPCalls.c By : Scott Kuechle Copyright: ©1988-1989 by Apple Computer Inc. All rights reserved. #} */ #include #include #include #include #include #include "ASPDefs.h" extern LoginInput LogCmd; extern LoginOutput LogReply; extern FPGetSrvrInfoOutput SrvrInfoOutput; extern LoginCont LogContCmd; extern LoginContReply LogContReply; extern FPGetUserInfoOutput UserInfoOutput; extern FPMapIDOutput MapIDOutput; extern char NewPasswordBuf[9],OldPasswordBuf[9]; extern Word NetNum; extern char NodeID,ScktNum; extern MySRefNum SrvrSRefNum; extern VolList LSBuf[MaxVols]; extern char volbuf[MaxVolLength+1]; extern myMemRecPtr SelectedMember,SelectedZone; extern char RandEx[]; int cSPCommand(CBufLen,CBufAddr,RBufLen,RBufAddr,flag) int CBufLen,*CBufAddr,RBufLen,*RBufAddr; int flag; /* flag for debugging */ { struct SPCommand *P; int PDosError; Word *errbuf; static struct SPCommand SPCmd= { synchronous, SP_Cmd, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; SPCmd.SRefNum=SrvrSRefNum.SRefNum; SPCmd.CmdBlkLen=CBufLen; SPCmd.CmdBlkAddr=(long)CBufAddr; SPCmd.ReplyBufLen=RBufLen; SPCmd.ReplyBufAddr=(long)RBufAddr; SPCmd.CmdResult = 0; /* make the call and if we get the 'Too many ASP calls' error try again until either the call is successfull or we get a different error */ do { asm { ldy #^SPCmd ;get high word pointer to parameter list ldx #SPCmd ;get low word pointer to parameter list jsl 0xe11014 } } while (SPCmd.CmdResult == TooManyASPCalls); #if 0 if (flag || SPCmd.CmdResult || SPCmd.ResultCode) /* set break point for debugging purposes */ { P=&SPCmd; asm { ldx #SPCmd ldy #^SPCmd dcb 0x00 dcb 0x54 } } #endif /* return the high word of the error (low is always 0xffff) */ errbuf = (Word *)&(SPCmd.CmdResult); errbuf = errbuf+1; return (*errbuf); } int cSPGetStatus() { struct SPStatus *P; static struct SPStatus parms= { asynchronous, SP_Stat, 0x07ff, 0L, 0, 0, 0, 0, (Long)&SrvrInfoOutput, 0 }; parms.NetNum = NetNum; parms.Node = NodeID; parms.Socket = ScktNum; parms.ReplyBufLen=SwapInt(sizeof(struct FPGetSrvrInfoOutput)); asm { ldy #^parms ;get high word pointer to parameter list ldx #parms ;get low word pointer to parameter list jsl 0xe11014 } while ( (parms.ResultCode)==0x07ff) /* wait here for response */; return (parms.ResultCode); } int cFILogin2(CBufLen,RBufLen,flag) int CBufLen,RBufLen; int flag; { static struct FILogin2 zparms = { synchronous, FILogin2Cmd, 0, 0, 0, 0, 0, (Long)&LogCmd, 0, (Long)&LogReply, 0, 0L, 0L, 0L, 0x0200 /* AFP version 2.0 */ }; zparms.NetworkNumber = NetNum; zparms.NodeNumber = NodeID; zparms.SocketNumber = ScktNum; zparms.CmdLen = (CBufLen); zparms.ReplyLen = (RBufLen); zparms.ZoneName = (Long)SelectedZone->memPtr; zparms.ServerName = (Long)SelectedMember->memPtr; asm { ldy #^zparms ;get high word pointer to parameter list ldx #zparms ;get low word pointer to parameter list jsl 0xe11014 } SrvrSRefNum.SRefNum = zparms.SessRefNum; #if 0 if (zparms.ResultCode != 0x0a04 && zparms.ResultCode && zparms.ResultCode != 0x0a13) { asm { ldx #zparms ldy #^zparms dcb 0x00 dcb 0x88 } } #endif return zparms.ResultCode; } char cFIListSessions() { static struct FIListSessions parms = { synchronous, FIListSessionsCmd, 0, (sizeof(struct VolList) * MaxVols), (long)LSBuf, 0 }; asm { ldy #^parms ;get high word pointer to parameter list ldx #parms ;get low word pointer to parameter list jsl 0xe11014 } /* return number of entries found, 0 if an error occurred */ if (parms.ResultCode) return 0; else return parms.NEntries; } int cFILoginCont(CBufLen) int CBufLen; { static struct FILoginCont parms= { synchronous, FILoginContCmd, 0, 0, 0, (Long)&LogContCmd, 2, (Long)&LogContReply }; parms.CmdLen = CBufLen; parms.SessRefNum = SrvrSRefNum.SRefNum; asm { ldy #^parms ;get high word pointer to parameter list ldx #parms ;get low word pointer to parameter list jsl 0xe11014 } return parms.ResultCode; } int cFIMountVol(MountFlag,VolName,Password,VolID,SlotDrive,flag) char MountFlag; char *VolName,*Password; int *VolID; char *SlotDrive; int flag; { static struct FIMountVol parms = { synchronous, FIMountVolCmd, 0, 0, 0, 0, 0, 0, 0 }; parms.SessRefNum = SrvrSRefNum.SRefNum; parms.MountFlag = MountFlag; parms.VolNamePtr = (long)VolName; parms.PassPtr = (long)Password; asm { ldy #^parms ;get high word pointer to parameter list ldx #parms ;get low word pointer to parameter list jsl 0xe11014 } *VolID = parms.VolID; *SlotDrive = parms.SlotDrive; return parms.ResultCode; } int cFPGetUserInfo() { int err; static struct FPGetUserInfoInput Input = { FPGetUserInfoCmd, ThisUserBit, 0L, 0 }; Input.Bitmap = SwapInt(UserIDBit); err = cSPCommand(sizeof(struct FPGetUserInfoInput),(int *)&Input, sizeof(struct FPGetUserInfoOutput),(int *)&UserInfoOutput,0); return err; } int cFPMapID() { int err; static struct FPMapIDInput Input = { FPMapIDCmd, UserIDBit, 0 }; Input.id = UserInfoOutput.id1; err = cSPCommand(sizeof(struct FPMapIDInput),(int *)&Input, sizeof(struct FPMapIDOutput),(int *)&MapIDOutput,0); return (err); } int cFILogout() { static struct FILogout parms = { synchronous, FILogoutCmd, 0, 0 }; parms.SRefNum = SrvrSRefNum.SRefNum; asm { ldy #^parms ;get high word pointer to parameter list ldx #parms ;get low word pointer to parameter list jsl 0xe11014 } return parms.ResultCode; } int cFPChangePassword(UAMStr,UserName,OldEncrypt,NewEncrypt) char *UAMStr,*UserName; char *OldEncrypt,*NewEncrypt; /* used in Random number exchange method */ { int err; long result; int cmdlen; int ptr; static struct FPChangePassword ChngPass = { FPChangePasswordCmd, 0, 0 }; cmdlen = 1 + 1 + (*UAMStr + 1) + (*UserName + 1) + 8 + 8; /* stuff UAM string into packet */ Pstrcpy(&ChngPass.data[0],UAMStr); ptr = ChngPass.data[0] + 1; /* point to space for user name */ /* check if user name is being put into an odd address in the packet, if so we must pad with a zero */ if (ptr & 1) /* is it odd ? */ { /* pad with a zero */ ChngPass.data[ptr] = 0; ptr = ptr + 1; cmdlen = cmdlen + 1; } Pstrcpy(&ChngPass.data[ptr],UserName); ptr = ptr + ChngPass.data[ptr] + 1; /* point to space for old password */ /* check for odd address here also, and pad with zero if it is odd */ if (ptr & 1) { ChngPass.data[ptr] = 0; ptr = ptr + 1; cmdlen = cmdlen + 1; } if (upstrcmp(RandEx,UAMStr) == 0) /* are we using Randnum exchange method ? */ { /* place encrypted passwords into packet */ CopyPassword(&ChngPass.data[ptr],OldEncrypt,8); ptr = ptr + 8; /* point to space for new password */ CopyPassword(&ChngPass.data[ptr],NewEncrypt,8); } else /* Cleartxt password method */ { /* no encryption, copy passwords directly into packet */ strcpy(&ChngPass.data[ptr],OldPasswordBuf); /* put old password into packet */ Pad_With_Nulls(&ChngPass.data[ptr],8); ptr = ptr + 8; /* point to space for new password */ strcpy(&ChngPass.data[ptr],NewPasswordBuf); /* put new password into packet */ Pad_With_Nulls(&ChngPass.data[ptr],8); } err = cSPCommand(cmdlen,&ChngPass,0,&result,0); return err; } int cFIAccess(AccRights) long *AccRights; { static struct FIAccessType parms= { synchronous, FIAccess, 0, 0, 0, (long)volbuf, nil, nil }; parms.DirFlag=0; asm { ldy #^parms ;get high word pointer to parameter list ldx #parms ;get low word pointer to parameter list jsl 0xe11014 } *AccRights=parms.AccessRights; /* return access rights */ return parms.ResultCode; } int cFIInstallTimer() { static struct FIInstallTimer parms= { synchronous, FIInstallTimerCmd, 0, nil, 0, 8, nil }; parms.TicksToComp = 8; /* MSD: reset timeout to 2 seconds */ asm { ldy #^parms ;get high word pointer to parameter list ldx #parms ;get low word pointer to parameter list jsl 0xe11014 } return parms.ResultCode; } int cFIUserPrefix(pathptr) char *pathptr; { static struct FIUserPrefix parms = { synchronous, FIUserPrefixCmd, 0, 0xaa, /* we are setting the prefix */ 0L }; parms.path = pathptr; asm { ldy #^parms ;get high word pointer to parameter list ldx #parms ;get low word pointer to parameter list jsl 0xe11014 } return parms.ResultCode; } \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/ASPDefs.h b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/ASPDefs.h new file mode 100644 index 0000000..ca69fa1 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/ASPDefs.h @@ -0,0 +1 @@ +/* File: ASPDefs.h By : Scott Kuechle Copyright: ©1988-1989 by Apple Computer Inc. All rights reserved. #} */ #include "myConstants.h" #define NBPLookup 0x10 #define KillNBP 0x46 #define FIUserPrefixCmd 0x2a #define FILogin2Cmd 0x38 #define FILoginContCmd 0x2c #define FILogoutCmd 0x2d #define FIMountVolCmd 0x2e #define FIAccess 0x32 #define FPGetSrvrInfoCmd 0x0f #define FPGetUserInfoCmd 0x25 #define FPGetSrvrParmsCmd 0x10 #define FIListSessionsCmd 0x2f #define FPChangePasswordCmd 0x24 #define FPMapIDCmd 0x15 #define FIInstallTimerCmd 0x04 #define SP_Cmd 0x20 #define SP_Stat 0x1d #define GetMyZone 0x1A #define GetZoneList 0x1B #define GetInfoCmd 0x02 #define GetSrvrInfoCmd 0x0f #define GetSrvrParmsCmd 0x10 #define LoginCmd 18 #define LoginContCmd 19 #define asynchronous 0x80 #define synchronous 0x00 #define busy 0xff #define AlreadyLoggedIn 0x0a13 #define VolAlreadyMounted 0x0a11 #define TooManyProcesses 0x0408 #define TooManyASPCalls 0x0702 #define CreatorBit 0x40 #define GroupBit 0x20 typedef struct myMemRec { Pointer memPtr; /* MemRec - Pointer to string, or custom */ Byte memFlag; /* MemRec - Bit Flag */ int NetNum; /* network number */ char NodeID; /* node id */ char ScktNum; /* socket number */ char Enumerator; /* enumerator */ char privflag; Word ckboxId; } myMemRec, *myMemRecPtr, **myMemRecHndl ; typedef String(31) str31; typedef String(33) str33; typedef String(27) str27; typedef struct ServerInfo { Word Server_Flags; str31 Server_Name; str33 Server_Zone; str31 User_Name; char Server_Password[8]; Word Volume_Count; } ServerInfo, *ServerInfoPtr, **ServerInfoHndl; #define ServerRecSize sizeof(struct ServerInfo) typedef struct VolumeInfo { Word Volume_Flags; str27 Volume_Name; char Volume_Password[8]; } VolumeInfo, *VolumeInfoPtr, **VolumeInfoHndl; #define VolRecSize sizeof(struct VolumeInfo) #define MaxFileSize MaxVols*VolRecSize + MaxVols*ServerRecSize typedef struct MyVolData { Word NetNum; char NodeID; char Socket; char VolName[MaxVolLength]; char Password[8]; } MyVolData, *MyVolDataPtr; typedef struct MySrvrData { Word NetNum; char NodeID; char Socket; char Password[8]; } MySrvrData, *MySrvrDataPtr; #if 0 #define MessDataSize (sizeof(struct MySrvrData)) typedef struct MessageData { Long MessNext; Word MessType; char MessData[MessDataSize]; } MessageData, *MessageDataPtr; #endif typedef struct MessageData { Long MessNext; Word MessType; Word MessCount; /* how many 'records' are currently saved? */ } MessageData, *MessageDataPtr; typedef struct SPCommand { char Async; char Command; int ResultCode; long CompRoutinePtr; char SRefNum; int CmdBlkLen; long CmdBlkAddr; int ReplyBufLen; long ReplyBufAddr; long CmdResult; int ReplyLen; } SPCommand; typedef struct SPStatus { char async; char command; int ResultCode; long CompRoutinePtr; int NetNum; char Node; char Socket; int ReplyBufLen; long ReplyBufAddr; int DataLen; } SPStatus; typedef struct EntityType { int NetNum; char Node; char Socket; char Enumerator; char ObjName[NameLength] } EntityType, *EntityPtr; typedef struct NBPLType { Byte mode; Byte command; Word result; Long iocomp; /* since this doesn't know about 4 byte pointers */ char *entity; /* name of what we want to find */ Byte retryper; /* retry period in 1/4 secs */ Byte retrycnt; /* number of times to retry */ Word internal; Word rsbsiz; /* size of following buffer */ Long rsbadr; /* responses will be stored here */ Byte maxrsp; /* maximum number of responses allowed */ Byte rgotten; /* actual number of responses returned */ } NBPLType ; typedef struct KillNBPLType { Byte Async; Byte command; Word ResultCode; Long ParamPointer; } KillNBPLType ; typedef struct GetSrvrParmsInput { char command; } GetSrvrParmsInput; typedef struct VolRec { char PassFlag; char Name[27]; } VolRec; typedef struct GetSrvrParmsOutput { Long ServerTime; char VolNameStrings; char VolInfo[(sizeof(struct VolRec)) * MaxVols]; } GetSrvrParmsOutput; typedef struct FPGetSrvrInfoOutput { int MachTypeOffset; int VerOffset; int UAMOffset; int IconOffset; int Flags; char data[350]; } FPGetSrvrInfoOutput, *FPGetSrvrInfoOutputPtr; typedef struct DES_Pckt { char *password; char *randnum; char *result; } DES_Pckt; typedef struct Login { char command; char data[15+20+32+9]; /* Version Str. + UAM string + User Name + Password(for ClearTxt only) */ } LoginInput; typedef struct LoginOutput { int ID; char RandNum[8]; /* RandExch only */ } LoginOutput; typedef struct LoginCont { char command; char null; int ID; char EncryptedValue[8]; } LoginCont; typedef struct LoginContReply { int ID; } LoginContReply; typedef struct FPLoginPckt { char command; char data[100]; } FPLoginPckt; typedef struct FILogin2 { char async; char command; int ResultCode; int NetworkNumber; char NodeNumber; char SocketNumber; int CmdLen; Long CmdBufPtr; int ReplyLen; Long ReplyBufPtr; char SessRefNum; Long AttnRoutine; Long ServerName; Long ZoneName; Word AFPVersion; } FILogin; typedef struct FILoginCont { char async; char command; int ResultCode; char SessRefNum; int CmdLen; Long CmdBufPtr; int ReplyLen; Long ReplyBufPtr; } FILoginCont; typedef struct FIMountVol { char async; char command; int ResultCode; char SessRefNum; char MountFlag; Long VolNamePtr; int VolID; char SlotDrive; Long PassPtr; } FIMountVol; typedef struct FIListSessions { char async; char command; int ResultCode; int ReplyLen; long ReplyBufPtr; char NEntries; } FIListSessions; typedef struct VolList { char SRefNum; char SlotDrive; char VolName[28]; int VolID; } VolList; typedef struct GMyZonetype { byte async; byte command; word result; long iocomp; Pointer bufptr; byte retryinterval; byte retrycount; word resrvd; } GMyZonetype; typedef struct GZoneListtype { byte async; byte command; word result; long iocomp; word buflen; Pointer bufptr; byte brnode; word strtindex; byte retryinterval; byte retrycount; word numberzones; word resrvd; } GZoneListtype; typedef struct GetInfo { char async; char command; int ResultCode; Long CompRtnRet; int ThisNet; char ABridge; char HardwareID; int RomVersion; char NodeNumber; } GetInfo; typedef struct FPGetUserInfoInput { char command; char ThisUser; long UserID; int Bitmap; } FPGetUserInfoInput; typedef struct FPGetUserInfoOutput { int Bitmap; long id1; long id2; } FPGetUserInfoOutput; typedef struct FPMapIDInput { char command; char function; long id; } FPMapIDInput; typedef struct FPMapIDOutput { char name[34]; } FPMapIDOutput; typedef struct FILogout { char async; char command; int ResultCode; char SRefNum; } FILogout; typedef struct FPChangePassword { char command; char zero; char data[80]; } FPChangePswrdInput; typedef struct FIAccessType { char async; char command; int ResultCode; char DirFlag; long AccessRights; long PathPtr; long CNamePtr; long GNamePtr; } FIAccessType; typedef struct FIInstallTimer { char async; char command; int ResultCode; long CompRoutine; int RunTickCount; int TicksToComp; long reserved; } FIInstallTimer; typedef struct FIUserPrefix { char async; char command; int ResultCode; char reserved; char *path; } FIUserPrefix; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/AlphaSort.aii b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/AlphaSort.aii new file mode 100644 index 0000000..770fbfc --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/AlphaSort.aii @@ -0,0 +1 @@ + INCLUDE 'all.macros' CASE ON EXPORT SortLst IMPORT ZoneList ;___________________________ ;SortLst ;___________________________ SortLst PROC EXPORT PushLong #myCompare PushLong ZoneList _SortList2 rtl memberA equ 6 memberB equ memberA+4 min ds.b 1 temptest ds.b 1 myCompare phd tsc tcd ldy #$02 lda [memberA] tax lda [memberA],y sta memberA+2 stx memberA lda [memberB] tax lda [memberB],y sta memberB+2 stx memberB sep #$30 LONGA OFF LONGI OFF lda [memberA] ; cmp [memberB] ;compare it to memberB blt cont1 ;if memberB >= memberA then branch around lda [memberB] ;else cont1 sta min ;store memberB as the shortest string ldy #$00 loop iny lda [memberB],y jsr makecap sta temptest lda [memberA],y jsr makecap cmp temptest bne stopcmp ;we have a difference cpy min ;chars are the same so check if more bytes to check beq short ;no more bytes to check, shortest string completed scan bra loop ;more chars to go... stopcmp bge AgeB ;A>=B bra AlB ;if A !> B then must be A=B then sec bra bye ; AlB clc ;A= 0x0307)" before two SortList2 calls using the new 1L sort proc. Should be 5.0.4-compatible now. 8-Jun-91 DAL Changed about 10 occurances "\r\" into "\r" in messages. 10-Jun-91 MSD Changed the retry interval passed to DoLookup (in two places). It was 15 seconds (15*4 quarter seconds); it is now two seconds. This should make the control panel more responsive to servers coming up, and make it build a complete list faster. Also changed the listStart parameter of NewList2 to 0xFFFF (i.e. don't change the number of the first item displayed). This prevents the list from bouncing back to the first item every time a server is added to the list. 07/01/91 GAB Added logic to BootCDev message handler so that if AppleTalk is not active, the CDev asks the Control Panel NDA to draw an X through the displayed icon. */ #include #include #include #include #include #include #include #include #include #include #include int ple(); #include "newcontrols.h" #include "newinterface.h" #include "ASPDefs.h" #include "AppleshareDefs.h" #include extern pascal void mySysBeep2() inline(0x3803,0xE10000); extern struct FileInfoRecGS myInfoRec; MySRefNum SrvrSRefNum; myMemRecPtr LastSelectedZone,SelectedZone; myMemRecPtr SelectedMember; Word NetNum; char NodeID,ScktNum; Handle DataHndl; char User_Name[NameLength],ATINIT_UserName[NameLength]; char entity[100]; /* build entity here */ char ATINIT_Path[]= "*/SYSTEM/SYSTEM.SETUP/ATINIT\000"; char AUTOLOGON_Path[] = "*/SYSTEM/SYSTEM.SETUP/APPLESHARE.PREP\000"; char pathbuf[255]; char colon[] = "\p:"; char slash[] = "\p/"; char *separator; GSString32 bootvol; ResultBuf32 buf,buf2; ResultBuf32 theBootVol; GSString255 syspath; Word BootVoldevNum; Word NetworkBoot; NewCtlRecHndl EditBoxCtl,TextCtl1,TextCtl2,TextCtl3,TextCtl4,myButtonHndl; NewCtlRecHndl ServerList,ZoneList; int DoingAutoLogon,AppleTalkActive; int setTargetListFlag; /* 19-Apr-91 DAL */ Handle MySrvrMessData; Handle MyVolMessData; Handle myHandle; Word DoubleClick; LongWord PrevTickCount; Word OnePending; Word StopTheLookup=false,CallCompleted=false; Word MyUserID; /* key for pseudo-encryption of passwords in the APPLESHARE.PREP file */ char key[] = {0x5a,0x2f,0x42,0x2b,0xe2,0x34,0xba,0x5d}; Handle ZoneNames; Word PwrdWasChanged; Word ServerListSize,LocalZoneIndex; Word what; Word WritProtAlreadyShowed; extern pascal Word NextMember2() inline(0x121C,dispatcher); extern pascal void SelectMember2() inline(0x141C,dispatcher); extern pascal void NewList2() inline(0x161C,dispatcher); extern pascal void SortList2() inline(0x151C,dispatcher); /* DAL */ static ResultBuf32 devName, volName; static DInfoRecGS devInfo; static VolumeRecGS volInfo; void walkDevList(); pascal Longint AppleShare_DEFPROC(message,data1,data2) Integer message; Longint data1,data2; { Longint returnThis; integer i,j,dbr; ListCtlRecHndl hndl; int err; WmTaskRecPtr myTaskRecPtr; CtlRecHndl myfoundCtlPtr; LongWord DblClickTime; Word partCode; int anySelected; Word itemNum; Pointer ptr; char keyHit; Pointer p; dbr=SaveDB(); /* if we execute our boot code (BootCDEV below) this flag will get set */ DoingAutoLogon = false; returnThis = 0; switch (message) { case InitCDEV: if (AppleTalkActive) { DoubleClick = false; PrevTickCount = 0; OnePending = false; /* set path to current user's folder here so that any time this CDEV is selected it gets updated */ SetUserPath(); /* the 'OK' button starts out as inactive since no selections have been made. */ HiliteControl(inactiveHilite,myButtonHndl); /* scroll the list so that the current zone is shown */ SelectMember2(LocalZoneIndex,ZoneList); /* now get handles that we can use with the message center to store passwords for servers we have sessions with */ MySrvrMessData = NewHandle((Long)(sizeof(struct MessageData)), MyUserID, attrNoCross, nil); MyVolMessData = NewHandle((Long)(sizeof(struct MessageData)), MyUserID, attrNoCross, nil); } break; case CreateCDEV: MyUserID = MMStartUp(); StopTheLookup = true; /* allocate ZoneBuffer on the fly. 18-Jan-91 DAL */ ZoneBuffer = (myMemRec *) *NewHandle( (long) (sizeof(myMemRec)*MaxZoneNames),MyUserID|0x0F00,0xC000,0L); /* Note: I feel safe assuming this memory allocation will succeed, because we have just loaded the CDev, and the LoadResource through CodeResConverter succeeded only if there was enough room for our OMF *and* loaded code at the same time. The OMF then got freed up. */ /* end of 18-Jan-91 addition */ AppleTalkActive = IsAppleTalkActive(); if (AppleTalkActive) { CursorPtr oldCursor = GetCursorAdr(); /* DAL */ WaitCursor(); /* DAL */ StopTheLookup = false; /* this flag keeps track of how many times write protected disk error message comes up */ WritProtAlreadyShowed = false; FindBootVolume(); /* was it a local or network boot? */ /* get user name from ATINIT file */ DoUserName(ATINIT_UserName,Get); DoZoneInit(); DoServerInit(); CreateNewStyleControls(data1); setTargetListFlag = 1; /* 19-Apr-91 DAL */ SelectedZone = LastSelectedZone = nil; LocalZoneIndex = 0; if (!_toolErr) { SortLst(); /* sort the zone names first */ /* since SortList() does not sort the entire memRec (name only) we must now go through the list to find our zone and show it as selected */ for (i=0; imessage; /* do this to find ASCII code of key hit */ keyHit = p[0]; /* check for double clicks only if we have a mouse down event here..*/ if (myTaskRecPtr->what == inButtDwn) { /* was it a mouse down in our server list? */ partCode = FindControl(&myfoundCtlPtr,myTaskRecPtr->where.h,myTaskRecPtr->where.v,(GrafPortPtr)data2); if ( myfoundCtlPtr == (CtlRecHndl)ServerList) { /* was there previously a mouse down saved? */ if (OnePending) { /* get current double-click time */ DblClickTime = GetDblTime(); /* was it a double-click? */ if ( (myTaskRecPtr->when - PrevTickCount) <= DblClickTime ) { DoubleClick = true; OnePending = false; } else { DoubleClick = false; PrevTickCount = myTaskRecPtr->when; } } else /* no previous mouse down saved */ { PrevTickCount = myTaskRecPtr->when; OnePending = true; } } } else if ( (myTaskRecPtr->what == inKey) || (myTaskRecPtr->what == autoKeyEvt) ) { /* we must check here if the ':' or '/' keys were pressed - if so, we want to mask out the event so the user is unable to use these chars. in the user name edit box. */ unsigned long targetCtlID = GetCtlID(FindTargetCtl()); /* 21-Dec-90 DAL */ if ( (targetCtlID==4L) && ((keyHit == 0x3a) || (keyHit == 0x2f) || (keyHit==0x0A) || (keyHit==0x0B)) ) { if ((QDVersion()&0x0FFF) >= 0x0307) mySysBeep2(8); /* bad keypress */ myTaskRecPtr->what = nullEvt; /* make this a null event */ } else { /* get current length of user name text */ itemNum = LEGetTextLen((LERecHndl)(**EditBoxCtl).ctlData); /* put up error message only if user is not pressing the following keys...*/ if (itemNum == (UserNameLen - 1)) { /* put up error message.... */ switch(keyHit) { case 0x7f: /* delete key */ case 0x18: /* clear key */ case 0x09: /* tab key */ case 0x08: /* backspace key */ case 0x15: /* arrow ahead */ /* do not put up message if the above keys are pressed */ break; default: /* yes, so mask out this event */ Show_Alert_Message(Caution_Alert,"\pThe User Name can only be 31\rcharacters long."); myTaskRecPtr->what = nullEvt; /* make this a null event */ break; } } } } } break; case AboutCDEV: AboutText.ctlTextSize = strlen(myAboutText); TextCtl4=NewControl2(data1,0,&AboutText); break; case HitCDEV : hndl = (CtlRecHndl)data1; if (hndl == ServerList) /* file server names list */ { /* check here if there are any members left selected - if not we must make the 'OK' button inactive */ anySelected = false; for (i=0; i 0) ? &ZoneBuffer[itemNum - 1] : nil; /* has a new zone been selected? */ if (SelectedZone != LastSelectedZone) { /* kill current lookup for previous zone */ err = DoNBPKill(); /* build a new list of server names */ ReSetServerList(); LastSelectedZone = SelectedZone; /* save current selection */ } } else if ( hndl == myButtonHndl ) { DoOpen(); } break; } RestoreDB(dbr); return returnThis; } ReSetServerList() { /* blank out server names list here until our lookup gets all the server names for this zone */ ServerListSize = 0; NewList2(ple,1,0xffffffff,0xffff,0,ServerList); /* must make 'OK' button inactive since a new zone list is being drawn */ HiliteControl(inactiveHilite,myButtonHndl); CheckForNewServers(); /* draw the new server list */ NewList2(ple,1,0xffffffff,0xffff,ServerListSize,ServerList); if( (QDVersion() & 0x0fff) >= 0x0307) SortList2(1L,ServerList); /* added 18-Feb-91 DAL */ } void walkDevList() { devInfo.pCount = 8; /* we need the device ID */ devInfo.devNum = 1; /* start at the first device */ devInfo.devName = &devName; devName.bufSize = 36; volInfo.pCount = 2; /* set up for eventual Volume call */ volInfo.devName = &(devName.bufString); volInfo.volName = &volName; volName.bufSize = 36; DInfoGS(&devInfo); /* make the call */ while(_toolErr != 0x11) { /* continue until we run out of devices */ if(devInfo.deviceID == 0x001e) { /* is this an AppleShare driver? */ VolumeGS(&volInfo); /* yes, build a VCR */ } ++devInfo.devNum; /* check the next device */ DInfoGS(&devInfo); } } DoOpen() { int i; int CancelButtonHit; StopTheLookup = true; /* kill current lookup for previous zone */ err = DoNBPKill(); /* if there are no zones, set selected zone to local zone */ if (SelectedZone == nil) { SelectedZone->memPtr = ZoneName; LastSelectedZone->memPtr = ZoneName; } /* go through entire list of names */ for (i=0; iMessNext = nil; myptr->MessType = MySrvrMessID; myptr->MessCount = 0; /* no passwords saved initially */ /* now add our new server password message */ MessageCenter(addMessage,MySrvrMessID,MySrvrMessData); /* delete whatever volume password message currently exists */ MessageCenter(deleteMessage,MyVolMessID,nil); /* initialize header and data */ myptr = (MessageDataPtr)(*MyVolMessData); myptr->MessNext = nil; myptr->MessType = MyVolMessID; myptr->MessCount = 0; /* no passwords saved initially */ /* now add our new volume password message */ MessageCenter(addMessage,MyVolMessID,MyVolMessData); } DoCleanUpStuff() { int err; char mode; Word len; Pointer p; myHandle = LEGetTextHand((LERecHndl)(**EditBoxCtl).ctlData); len = LEGetTextLen((LERecHndl)(**EditBoxCtl).ctlData); /* store user name in Atinit file here */ HLock(myHandle); p = strncpy(User_Name,(*myHandle),len); *(p+len)=0; /* null terminate so we can convert to a Pascal String */ c2pstr(p); /* convert to pascal string for ATINIT file */ /* user name can be at most 31 characters */ if (p[0] == UserNameLen) p[0] = (UserNameLen-1); /* re-set length to 31 */ DoUserName(p,Set); /* save it */ HUnlock(myHandle); /* dispose of handles to memory we allocated */ HUnlock(ZoneNames); DisposeHandle((Handle)ZoneNames); } myGSOS_StringAppend(gsString,pstring) GSString32Ptr gsString; char *pstring; { int i; int len; /* append a GSOS string to a Pascal string */ len = *pstring; for (i=0; i < gsString->length; ++i) { *(pstring + 1 + len + i) = gsString->text[i]; /* copy the character */ *pstring = *pstring + 1; /* increment length byte */ } } myGSOS_StringCopy(gsString,pstring) GSString32Ptr gsString; char *pstring; { int i; /* copy a GSOS string to a Pascal string */ *pstring = 0; /* set length to zero initially */ for (i=0; i < gsString->length; ++i) { *(pstring + 1 + i) = gsString->text[i]; /* copy the character */ *pstring = *pstring + 1; /* increment length byte */ } } DoUserName(thebuf,operation) char *thebuf; Word operation; { int i; Word saveErr; if (NetworkBoot) { /* we must build the path: /Boot Vol/USERS/User Name/Setup/ATINIT to get at the ATINIT file on the server for this user */ buf.bufSize = 32+2; AShareFST_UserInfo(&buf,BootVoldevNum); pathbuf[0]=0; myGSOS_StringCopy(&theBootVol.bufString,pathbuf); Pappend(pathbuf,separator); Pappend(pathbuf,"\pUSERS"); Pappend(pathbuf,separator); myGSOS_StringAppend(&buf.bufString,pathbuf); Pappend(pathbuf,separator); Pappend(pathbuf,"\pSETUP"); Pappend(pathbuf,separator); Pappend(pathbuf,"\pATINIT"); p2cstr(pathbuf); CreateGSOSString(pathbuf); } else CreateGSOSString(ATINIT_Path); GSOS_GetFileInfo(); if (_toolErr) { switch(_toolErr) { case volNotFound: do { Show_Alert_Message(Caution_Alert,"\p Please re-insert your startup\r disk."); GSOS_GetFileInfo(); } while (_toolErr == volNotFound); break; case invalidAccess: Show_Alert_Message(Caution_Alert,"\p Access Denied error. Any\r changes you make will not\r be saved. Check with your\r network administrator."); break; case fileNotFound: Show_Alert_Message(Caution_Alert,"\p There are AppleTalk data\r files missing from your\r startup disk. Please re-\r install AppleShare."); break; } /* force an update of entire window so all controls are redrawn correctly */ InvalRect(&ControlPanelRect); } else if (myInfoRec.fileType == AppleTalkFile) { if (operation == Get) GSOS_Open((Word)(readEnable)); else GSOS_Open((Word)(writeEnable + readEnable)); if (_toolErr) { saveErr = _toolErr; ReportError(Get); /* if we got an access privileges error, try to open the file for read only */ if (saveErr == invalidAccess) { GSOS_Open((Word)readEnable); } } GSOS_SetMark(eofMinus,(LongWord)133); if (operation == Get) GSOS_Read(thebuf,(LongWord)33); else /* Set it */ { GSOS_Write(thebuf,(LongWord)33); /* report any errors saving data */ if (_toolErr) ReportError(Set); } GSOS_Close(); } else { Show_Alert_Message(Caution_Alert,"\p There are AppleTalk data\r files missing from your\r startup disk. Please re-\r install AppleShare."); } } char DoLookup(Object,Tynm,Zonenm,buffer,count,retryper,retrycnt,iocomp,syncflag) /* gets all names of the given type */ char *Object,*Tynm,*Zonenm; char *buffer; char count; char retryper,retrycnt; long iocomp; int syncflag; { int i; int ptr; int retrycount; retrycount=0; Pstrcpy(entity,Object); /* copy Entity name into place */ ptr = entity[0]+1; /* point to space for Entity Type */ Pstrcpy(&entity[ptr],Tynm); /* copy Entity Type into place */ ptr = ptr + entity[ptr] + 1; /* point to space for Entity Zone */ Pstrcpy(&entity[ptr],Zonenm); /* copy zone into place */ NBPLParms.command=NBPLookup; NBPLParms.mode=syncflag; NBPLParms.iocomp=iocomp; NBPLParms.entity=entity; NBPLParms.retryper=retryper; /* every 1/4 second */ NBPLParms.retrycnt=retrycnt; NBPLParms.rsbadr=(long)buffer; NBPLParms.rsbsiz=BlockSize/*sizeof(buffer)*/; NBPLParms.maxrsp=count; NBPLParms.result=busy; asm { ldx #NBPLParms ;get low word pointer to parameter list ldy #^NBPLParms ;get high word pointer to parameter list jsl 0xe11014 } return NBPLParms.rgotten; /* tell caller how many responses */ } integer cGetZoneList() { GZoneListParms.bufptr = *ZoneNames; GZoneListParms.brnode = GInfoParms.ABridge; asm { ldx #GZoneListParms ;get low word pointer to parameter list ldy #^GZoneListParms ;get high word pointer to parameter list jsl 0xe11014 } return GZoneListParms.numberzones; } cGetMyZone() { GMyZoneParms.result = busy; asm { ldx #GMyZoneParms ;get low word pointer to parameter list ldy #^GMyZoneParms ;get high word pointer to parameter list jsl 0xe11014 } while ( ((char)GMyZoneParms.result) == busy) /* wait here for response */; /* if there is an error (no zones?) set zone name to null */ if (GMyZoneParms.result) ZoneName[0] = 0; } char cGetInfo() { asm { ldx #GInfoParms ;get low word pointer to parameter list ldy #^GInfoParms ;get high word pointer to parameter list jsl 0xe11014 } return GInfoParms.ABridge; } CreateNewStyleControls(data1) GrafPortPtr data1; { char *p; FSText.ctlTextSize = strlen(myFSText); TextCtl1=NewControl2(data1,0,&FSText); ZoneText.ctlTextSize = strlen(myZoneText); TextCtl2=NewControl2(data1,0,&ZoneText); /* set up key as the key equivalent for this button */ p = (char *)&myOKBtn.keyEquivalent; p[0] = 0x0d; /* ASCII code for key */ p[1] = 0x0d; p[2] = 0; /* no modifiers */ p[3] = 0; myButtonHndl=NewControl2(data1,0,&myOKBtn); /* added 18-Jan-91 DAL--ZoneBuffer is now allocated dynamically */ ZoneListRec.ctlListRef = (longint)ZoneBuffer; /* end of 18-Jan-91 DAL addition */ ZoneList = NewControl2(data1,0,&ZoneListRec); ServerList = NewControl2(data1,0,&ServerListRec); /* was above the ZoneList NewControl2 call, 4-Dec-90 DAL */ EDIT1.ctlDefaultRef = (longint)ATINIT_UserName; /* these 3 lines were at the beginning of the func, 4-Dec-90 DAL */ EDIT1.ctlTextSize = ATINIT_UserName[0]; EditBoxCtl=NewControl2(data1,0,&EDIT1); UserText.ctlTextSize = strlen(myUserNameText); /* moved from above 4-Dec-90 DAL; needs to be after &EDIT1 */ TextCtl3=NewControl2(data1,0,&UserText); } DoZoneInit() { int i,TotalZones; integer index; char bridge; Word *p; char *namePtr; bridge = cGetInfo(); /* get list of all zones on the internet */ TotalZones = 0; ZoneName[0] = 0; ZoneNames = NewHandle((Long)(MaxZoneNames*(NameLength+4)), MyUserID, attrNoCross, nil); HLock(ZoneNames); if (!_toolErr) { /* dont try to get zone list if no bridge exists */ if (bridge != 0) { cGetMyZone(); /* get local zone */ for (i=0; i<3 && TotalZones == 0; ++i) TotalZones = cGetZoneList(); } TotalZones = (TotalZones <= MaxZoneNames) ? TotalZones: MaxZoneNames; index = 0; /* index starts out at first string */ for (i=0; iNetNum; NamesBuffer[i].NodeID = nameaddr->Node; NamesBuffer[i].ScktNum = nameaddr->Socket; NamesBuffer[i].Enumerator = nameaddr->Enumerator; NamesBuffer[i].memPtr = nameaddr->ObjName; /* move name string into Namelist */ NamesBuffer[i].memFlag = 0; /* name should show as non-selected */ base = base + 5; /* point to object field */ base = base+base[0]+1; /* skip ahead to type field */ base = base+base[0]+1; /* skip ahead to zone field */ base = base+base[0]+1; /* skip ahead to next entity address */ nameaddr = (EntityPtr)base; } /* update size of our list */ /* 10-Jun-91 MSD: I think this is the same but simpler... */ /* ServerListSize = ServerListSize + (NBPLParms.rgotten - ServerListSize); */ ServerListSize = NBPLParms.rgotten; /* draw new updated list */ /* 10-Jun-91 MSD: Changed listStart to 0xFFFF so list doesn't keep going back to the top */ NewList2(ple,0xFFFF,0xffffffff,0xffff,ServerListSize,ServerList); if( (QDVersion() & 0x0fff) >= 0x0307) SortList2(1L,ServerList); /* added 18-Feb-91 DAL */ } CheckForNewServers() { myMemRecPtr SelectedZone; char *pzone; int itemNum; if (StopTheLookup) /* was the 'OK' button selected or is the CDEV being closed? */ { /* yes, so kill the current lookup */ err = DoNBPKill(); } else { /* did our asynchronous lookup complete yet? */ if (CallCompleted) { /* get currently selected zone */ itemNum = NextMember2(0,ZoneList); SelectedZone = (itemNum > 0) ? &ZoneBuffer[itemNum - 1] : nil; /* does zone name = our own zone? */ if (upstrcmp(SelectedZone->memPtr,ZoneName) == 0 || SelectedZone == nil) pzone = currentzone; /* yes, so substitute an '*' for name */ else pzone = SelectedZone->memPtr; /* otherwise use zone that is selected */ /* yes, so fire off another one */ /* 10-Jun-91 MSD: Changed retry interval to 2 seconds (was 15 seconds) */ count = DoLookup(wildcard,TypeName,pzone,OpenBlock,(char)MaxSrvrNames,(char)(2*4),(char)0xff,(Long)MyCompRoutine,asynchronous); /* reset server list size */ ServerListSize = 0; CallCompleted = false; } else if (NBPLParms.rgotten > ServerListSize) { AddNamesToList(); } } } GetServerNames(zone) char *zone; { char count; char *pzone; count = 0; if (upstrcmp(zone,ZoneName) == 0) /* does zone name = our own zone? */ pzone = currentzone; /* yes, so substitute an '*' for name */ else pzone = zone; /* otherwise use zone that was passed */ /* 10-Jun-91 MSD: Changed retry interval to 2 seconds (was 15 seconds) */ count = DoLookup(wildcard,TypeName,pzone,OpenBlock,(char)MaxSrvrNames,(char)(2*4),(char)0xff,(Long)MyCompRoutine,asynchronous); ServerListSize = 0; } int IsAppleTalkActive() { int found; Word fstId,i; ResultBuf255Ptr bufptr; /* check for the presence of the AppleShare FST - if it is active then we can assume that all the AppleTalk protocols are present also */ found = false; _toolErr = 0; for (i=1; (_toolErr == 0 && !found) ; ++i) { /* set up size of result buffer */ bufptr = (ResultBuf255Ptr)&syspath; bufptr->bufSize = 255; fstId = GSOS_GetFSTInfo(i,bufptr); if (fstId == AShareFST) found = true; } return found; } FindBootVolume() { Word fileSysID; NetworkBoot=false; buf2.bufSize = 32+2; GSOS_GetBootVol(); BootVoldevNum = GSOS_GetDevNumber(&buf2.bufString); buf.bufSize=32+2; /* output buffer length = actual space + length word */ GSOS_DInfo(BootVoldevNum); theBootVol.bufSize = 32+2; fileSysID = GSOS_Volume(); if (theBootVol.bufString.text[0] == ':') separator = colon; else separator = slash; /* check volume file system to see if we booted over the network */ if (fileSysID == AShareFST) { NetworkBoot = true; /* yes, we booted over the network */ } else { NetworkBoot = false; /* no, local boot */ } } main() { } Pstrcpy(dest, srsc) char *dest, *srsc; { int i,len; len=srsc[0]; for (i=0; i<=len; i++) dest[i]=srsc[i]; } int upstrcmp(s,t) char *s; char *t; { /* pascal string compare, ignore case */ char cs; char ct; char lens,lent; lens=*s++; lent=*t++; while (lens && lent) { cs=toupper(*s++); ct=toupper(*t++); if (cs!=ct) /* they don't match */ return cs-ct; lens--; lent--; } return lens-lent; } Pappend(pstr1, pstr2) char *pstr1, *pstr2; { int i,len1, len2; len1=pstr1[0]; len2=pstr2[0]; pstr1[0]=len1+len2; /* new length */ for (i=1; i<=len2; i++) pstr1[len1+i]=pstr2[i]; } int SwapInt(num) unsigned int num; { unsigned int temp; temp=num; temp=temp << 8; num=num >> 8; return(num | temp); } Pad_With_Nulls(str,maxlen) /* pads a C-string with zeros up to 'maxlen' */ char *str; int maxlen; { int i; i=0; while ((*str!=0) && (i #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ASPDefs.h" #include "AutoLogonDefs.h" #include "resmgr.h" extern char Password[NameLength]; extern char User_Name[NameLength]; extern char DoLookup(); extern Word MyUserID; extern char volbuf[MaxVolLength+1]; extern myMemRecPtr SelectedMember,SelectedZone; extern myMemRec NamesBuffer[MaxSrvrNames]; extern Word NetNum; extern char NodeID,ScktNum; extern Word LogInAsGuest; extern int _toolErr; str31 Server; str33 Zone; integer Num_of_Servers; int StartUpWasDone; boolean ToolsFound = FALSE, /* Do we have tools ? */ AllOk = FALSE; PManagerFound = TRUE; /* assume the PM is there */ int ThisMode = 0x80; /* init mode = 640 */ int myToolTable[] = {11, 4, 0x100, /* QuickDraw II */ 5, 0x100, /* Desk Manager */ 6, 0x100, /* Event Manager */ 14, 0x100, /* Window Manager */ 15, 0x100, /* Menu Manager */ 16, 0x100, /* Control Mnager */ 20, 0x100, /* Line Edit */ 21, 0x100, /* Dialog Manager */ 23, 0x100, /* Standard File */ 27, 0x100, /* Font Manager */ 28, 0}; /* List Manager */ char DeathMsg[] = "\034Could not handle error 0000 "; char **y,*z; char FindTheServer() { int retrycount,err; char count; retrycount=0; /* do a lookup to see if the server is still there and if it is get the node, network number and socket number */ count = DoLookup(&SrvrPtr->Server_Name.textLength,TypeName,&SrvrPtr->Server_Zone.textLength, OpenBlock,(char)1,(char)2,(char)8,0L,synchronous); if (NBPLParms.result == TooManyProcesses) { while ( (retrycount < 6) ) { /* add a 2-second delay */ err = cFIInstallTimer(); /* do a lookup to see if the server is still there and if it is get the node, network number and socket number */ count = DoLookup(&SrvrPtr->Server_Name.textLength,TypeName,&SrvrPtr->Server_Zone.textLength, OpenBlock,(char)1,(char)2,(char)8,0L,synchronous); /* if server was found force exit from this loop */ if (NBPLParms.result == 0) retrycount = 6; else /* otherwise keep trying */ retrycount = retrycount + 1; } } return count; } Logon_And_MountVols() { integer i,j,k,err; Pointer ptr; char count; EntityPtr nameaddr; int CancelButtonHit; int AnyChangesMade; int MyEvent; Word SCB; long AccessRights; char *volrights; ptr = (char *)(*DataHndl); /* de-reference the handle */ Num_of_Servers = (*ptr); /* get count of number of servers in the file */ SrvrPtr = (ServerInfoPtr)(ptr + 2); /* point to first server record */ AnyChangesMade = false; /* set flag for user name/password changes */ for (i=0; iaddress mapping */ /* set up globals used throughout the program to identify the server */ NamesBuffer[0].NetNum = NetNum = nameaddr->NetNum; NamesBuffer[0].NodeID = NodeID = nameaddr->Node; NamesBuffer[0].ScktNum = ScktNum = nameaddr->Socket; SelectedMember = &NamesBuffer[0]; Pstrcpy(&Server.textLength,&SrvrPtr->Server_Name.textLength); Pstrcpy(&Zone.textLength,&SrvrPtr->Server_Zone.textLength); SelectedMember->memPtr = &Server.textLength; SelectedZone->memPtr = &Zone.textLength; /* get session reference number for this server (set CmdLen=0) */ err = cFILogin2(0,0,0); /* do we need to ask for the password? */ if ( (*SrvrPtr).Server_Flags & AutoLogonPwrdFlag ) { if (err != AlreadyLoggedIn) { /* if we need to put up a dialog then we must first start up all the tools - but do the start up only once! */ if (!StartUpWasDone) { StartUpAllTools(); StartUpWasDone=true; /* set flag so we do it only once */ /* set coordinates of the window for 320 or 640 mode */ SCB = GetMasterSCB(); if (SCB & 0x0080) { /* 640 mode */ myParamList.wPosition.v1 = 18; myParamList.wPosition.h1 = 165; myParamList.wPosition.v2 = 195; myParamList.wPosition.h2 = 475; } else { /* 320 mode */ myParamList.wPosition.v1 = 18; myParamList.wPosition.h1 = 10; myParamList.wPosition.v2 = 195; myParamList.wPosition.h2 = 320; } } err = 0; myWind = NewWindow(&myParamList); SetSysWindow(myWind); SetPort(myWind); ShowWindow(myWind); /* set up list member record, since the code uses it to get info for the desired server. */ NamesBuffer[0].memPtr = &SrvrPtr->Server_Name.textLength; TheEvent.wmTaskMask = 0x00000fff; /* initialize mask */ MyEvent = TaskMaster(0xFFFF, &TheEvent); /* set file server name to display */ ParamText(&SrvrPtr->Server_Name.textLength,nil,nil,nil); /* display the arrow cursor */ InitCursor(); /* put up dialog to get password */ CancelButtonHit = CreateFirstDialog(); /* hide the cursor */ HideCursor(); CloseWindow(myWind); /* now check if password that is stored is different than what the user has entered */ if (!CancelButtonHit) { /* is user name still the same? */ if (upstrcmp(User_Name,&SrvrPtr->User_Name.textLength) == 0) { Scramble(Password); /* scramble for comparison below */ /* is the password they entered different than what is currently stored in the APPLESHARE.PREP file? */ if (strcmp(Password,&SrvrPtr->Server_Password[0]) != 0) { CopyPassword(&SrvrPtr->Server_Password[0],Password,8); AnyChangesMade = true; } } } } } else /* get name and password from APPLESHARE.PREP file */ { err = Get_Server_Info(); LogInAsGuest = false; /* if user name is null, log in as a guest */ if (SrvrPtr->User_Name.textLength == 0) LogInAsGuest = true; CopyPassword(Password,&SrvrPtr->Server_Password[0],8); /* first we must un-scramble the password */ Scramble(Password); Pstrcpy(User_Name,&SrvrPtr->User_Name.textLength); /* logon to this server so we can mount the specified volumes */ err = Do_Login(User_Name,Password); CancelButtonHit = false; } VolPtr = (VolumeInfoPtr)(SrvrPtr + 1); /* point to first volume record */ /* now go through the volume list and mount each one */ for (j=0; j<(*SrvrPtr).Volume_Count ; ++j) { /* dont attempt to login if the cancel button was selected from the dialog (provided the dialog was displayed at all) */ if (!CancelButtonHit && (err == 0) ) { /* mount volumes here....... */ MountFlag = MountBit; /* is this a user volume ? */ if ((*VolPtr).Volume_Flags & myUserVolBitFlag) { MountFlag = MountFlag | UserVolBit; /* yes, so specify this in the mount call */ } /* now check if there is a password for this volume */ if ( (*VolPtr).Volume_Flags & AutoLogonPwrdFlag ) { /* if we put up dialog to get server password we do the same to get the volume password */ if ( (*SrvrPtr).Server_Flags & AutoLogonPwrdFlag ) { /* go ask the user to enter the volume password */ err = Do_Vol_Pwrd_Dialog(MountFlag, &VolPtr->Volume_Name.textLength,&VolID, &SlotDrive); } else { /* get the volume password from the APPLESHARE.PREP file */ /* set bit indicating volume password pointer is valid */ MountFlag = MountFlag | VolPwrdBit; /* first un-scramble password from the APPLESHARE.PREP file */ Scramble(&VolPtr->Volume_Password[0]); err = cFIMountVol(MountFlag,&VolPtr->Volume_Name.textLength, &VolPtr->Volume_Password[0], &VolID,&SlotDrive,0); } } else err = cFIMountVol(MountFlag,&VolPtr->Volume_Name.textLength,0L, &VolID,&SlotDrive,0); /* now we must check the user's access rights for this server - if they have no rights, we must un-mount the volume */ Pstrcpy(volbuf,"\001/"); Pappend(volbuf,&VolPtr->Volume_Name.textLength); /* build volume pathname */ err = cFIAccess(&AccessRights); volrights = (char *)&AccessRights; /* get user access rights */ /* does the user have access rights to this volume? */ if (volrights[0] == 0) { /* now un-mount it */ MountFlag = 0; err = cFIMountVol(MountFlag,&VolPtr->Volume_Name.textLength, 0L,&VolID,&SlotDrive,0); } } VolPtr = VolPtr + 1; /* move to next volume record */ } } /* advance to the next server record */ if (count) /* no error finding this server */ SrvrPtr = (ServerInfoPtr)VolPtr; /* move to the next server record */ else { /* there was an error finding this server, so we must advance our pointers manually to the next server record */ VolPtr = (VolumeInfoPtr)(SrvrPtr + 1); /* point to first volume record */ /* now skip over all volume records for this server */ for (k=0; kVolume_Count; ++k) VolPtr = VolPtr + 1; SrvrPtr = (ServerInfoPtr)VolPtr; /* move to the next server record */ } } /* were there any password/user name changes that need to be saved? */ if (AnyChangesMade) Do_AUTOLOGON_data(true); /* update APPLESHARE.PREP file */ else DisposeHandle(DataHndl); /* no longer need our handle so free it up */ } Do_Auto_Logon() { int err; Word i; StartUpWasDone = false; /* set flag for starting up tools */ Do_AUTOLOGON_data(Get); /* read the APPLESHARE.PREP file into internal memory */ /* now go and check if any volumes were selected for auto-mount - but only if we have a valid APPLESHARE.PREP file */ if (DataHndl != nil) /* is APPLESHARE.PREP file valid? */ { Logon_And_MountVols(); /* yes! so go mount... */ /* set the path to the user's folder on the first user vol. mounted */ SetUserPath(); } /* shut down all the tools only if they were started up */ if (StartUpWasDone) { ShutDownAllTools(); } } void ToolLoadError() { TLTextMountVolume("\pError loading tools","\p ","\p ","\pok"); } void ErrorCheck(where) int where; { if (_toolErr) { Int2Hex(_toolErr,DeathMsg + 24 ,4); SysFailMgr(where|0xff00,DeathMsg); } } StartUpAllTools() { int MaxX; IMStartUp(); ErrorCheck(16); y = NewHandle(0xa00L, /* Ten pages */ MyUserID, /* put it to my name */ 0xc005, /* locked, fixed, fixed bank, page algn'd */ 0L); /* don't care */ ErrorCheck(3); z = *y; /* deref handle */ QDStartUp((int) z,ThisMode,MAXSCAN,MyUserID); ErrorCheck(4); MaxX = 640; /* prepare for 640 mode */ if (ThisMode != 0x80) MaxX = 320; /* in case I am wrong */ EMStartUp((int) z + 0x300,20,0,MaxX,0,200,MyUserID); /* Event Manager */ ErrorCheck(5); do /* Now we try to load */ { /* the tools */ LoadTools(myToolTable); if (_toolErr) { TLTextMountVolume("\perror loading tool","\p ","\p ","\pok"); #if 0 if (_toolErr=VolNotFound) if (MountBootDisk() != 1) { ShutDownStuff(); exit(0); } #endif } /* must be careful with elses*/ else ToolsFound = TRUE; } while (!ToolsFound); WindStartUp(MyUserID); /* keep initializing */ ErrorCheck(7); RefreshDesktop(0L); CtlStartUp(MyUserID,(int) z + 0x400); ErrorCheck(8); LEStartUp(MyUserID, (int) z + 0x500); ErrorCheck(9); DialogStartUp(MyUserID); ErrorCheck(10); MenuStartUp(MyUserID, (int) z + 0x600); ErrorCheck(11); /* DeskStartUp(); */ /* All we need is init'ed now */ /* ErrorCheck(12); REMOVED 13-Mar-91 DAL! */ SFStartUp(MyUserID, (int) z + 0x700); ErrorCheck(13); /* At this point we try to init AuxQuickDraw and the Printer Manager if something goes wrong printing is disabled */ LoadOneTool(QDAuxTool,MinVer); if (_toolErr) ToolLoadError(); else { LoadOneTool(PManager,MinVer); if (_toolErr) ToolLoadError(); else { QDAuxStartUp(); WaitCursor(); PMStartUp(MyUserID, (int) z + 0x900 ); ErrorCheck(15); } } FMStartUp(MyUserID, (int) z + 0x800); /* the watch cursor is up */ ErrorCheck(14); /* while we count the fonts */ AllOk = TRUE; } ShutDownAllTools() { /* DeskShutDown(); Removed 13-Mar-91 DAL! */ FMShutDown(); PMShutDown(); SFShutDown(); CtlShutDown(); DialogShutDown(); EMShutDown(); LEShutDown(); MenuShutDown(); WindShutDown(); QDAuxShutDown(); QDShutDown(); IMShutDown(); DisposeHandle( y ); } \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/AutoLogonDefs.h b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/AutoLogonDefs.h new file mode 100644 index 0000000..4424bac --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/AutoLogonDefs.h @@ -0,0 +1 @@ +/* File: AutoLogonDefs.h By : Scott Kuechle Copyright: ©1988-1989 by Apple Computer Inc. All rights reserved. #} */ #define Num_Tools 17 #define MAXSCAN 160 #define VolNotFound 0x45 #define QDAuxTool 18 /* Auxiliary Quickdraw */ #define PManager 19 /* Print Manager Tool Number */ #define MinVer 0 /* Minimun Version for them */ GrafPortPtr myWind; extern Handle DataHndl; extern char OpenBlock[BlockSize]; extern NBPLType NBPLParms; extern MySRefNum SrvrSRefNum; extern char TypeName[NameLength]; ServerInfoPtr SrvrPtr; VolumeInfoPtr VolPtr; char SlotDrive,MountFlag; int VolID; char mode; WmTaskRec TheEvent; WindColor myWindColor = { 0, /* WindColor - Color of window frame. */ 0, /* WindColor - Color of title and bar. */ 0, /* WindColor - Color/pattern of title bar. */ 0, /* WindColor - Color of grow box. */ 0 /* WindColor - Color of information bar. */ }; ParamList myParamList = { 78, /* paramLength */ 0, /* wFrameBits */ nil, /* wTitle */ nil, /* wRefCon */ 0,0,0,0, /* wZoom */ &myWindColor, /* wColor */ 0, /* wYOrigin */ 0, /* wXOrigin */ 0, /* wDataH */ 0, /* wDataW */ 0, /* wMaxH */ 0, /* wMaxW */ 0, /* wScrollVer */ 0, /* wScrollHor */ 0, /* wPageVer */ 0, /* wPageHor */ nil, /* wInfoRefCon */ 0, /* wInfoHeight */ nil, /* wFrameDefProc */ nil, /* wInfoDefProc */ nil, /* wContDefProc */ 0,0,195,320, /* wPosition */ (GrafPortPtr)0xffffffff, /* wPlane */ nil /* wStorage */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/DES.aii b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/DES.aii new file mode 100644 index 0000000..c911a3a --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/DES.aii @@ -0,0 +1 @@ +************************************************** * * * des - data encryption standard. This routine is called with * low byte of the parameter list in the X reg and the high * byte of the parameter list in the Y reg. * * * written by 07-03-86 * david su * * modified : 01-27-87 06:00 (tde) * 5-29-87: Converted source to MacToGS (rbh) * * (c) 1987 paramis corporation * (c) 1987 Apple Computer Inc * all rights reserved * * Parameter List: * Pointer pointer <-- ; * Encription Key pointer <-- ;This is an eight byte padded password * Result pointer --> ;Eight Bytes * * Rick Hoiberg 5/29/87 * * modified : 08-23-88 (srk) * converted to MPW IIGS (MAX) assembler * ********************************************************** MACHINE M65816 EXPORT DES DES PROC Zp0 equ $c0 Zp1 equ $c4 * * * save four bytes of Zero page * phb ;save current data bank phk plb ;data bank = program bank lda Zp0 ;save on stack pha lda Zp0+2 pha lda Zp1 pha lda Zp1+2 pha * * save parameter list location * stx Zp0 ;save parameter list pointer sty Zp0+2 * * save key in our work area * lda (Zp0) ;save key sta Zp1 ldy #$02 lda (Zp0),y sta Zp1+2 ; ldx #3 ldy #$06 ;move all eight bytes of key des1 lda (Zp1),y sta key,y dey dey dex bpl des1 * * save password in our work area * ldy #$04 lda (Zp0),y sta Zp1 iny iny lda (Zp0),y sta Zp1+2 ; ldx #3 ldy #$06 ;move all eight bytes of key des2 lda (Zp1),y sta random,y dey dey dex bpl des2 ; ; ; * * initialize the count * ldx #0 des4 ; stz des_count,x inx inx cpx #32 bne des4 ; ; save our zero page values here - for some reason they are getting trashed ; when we do the encoding routines..... ; lda Zp0 sta saveZp0 lda Zp0+2 sta saveZp0+2 ; sep #$30 LONGA OFF LONGI OFF ; jsr keysched jsr encode * * save result * Rep #$30 LONGA ON LONGI ON ; ; restore Zp0 here - why is it getting trashed in our encoding routines above? ; lda saveZp0 sta Zp0 lda saveZp0+2 sta Zp0+2 ; ldy #$08 lda (Zp0),y sta Zp1 iny iny lda (Zp0),y sta Zp1+2 ; ldx #3 ldy #$06 ;move all eight bytes of key des3 lda des_work1,y sta (Zp1),y dey dey dex bpl des3 * * restore Zero page * pla sta Zp1+2 pla sta Zp1 pla sta Zp0+2 pla sta Zp0 plb ;restore data bank rtl ; ; ************************************************** * * keysched : key schedule * * this module takes 64 bits key and generates * the sixteen 48-bit keys k(1),k(2),...,k(16) * * entry : none * * exit : none * * ************************************************** keysched ; sep #$30 LONGA OFF LONGI OFF ldx #0 key1 ; stx des_x ; lda pc1tbl,x sta remainder lda #8 sta des_count key2 ; dec des_count sec lda remainder sbc #08 sta remainder beq key22 ;= 0 ? bcs key2 ;> 0 ? ; key22 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne key24 ;x = 0 ? ldx #8 ;set to 8, if yes key24 ; dex lda des_msk,x ldy des_count clc and key,y beq key3 sec key3 ; ldx #$07 key4 ; rol des_work1,x php dex bmi key5 plp bra key4 ; key5 ; plp ldx des_x inx cpx #56 bne key1 ; * * divide pc1 result into c0/d0 * ldx #0 key6 ; lda des_work2,x sta des_cd,x inx cpx #7 bne key6 ; * * rotate c and d left by rotate(n) times * key9 ; ldx #0 keya ; stx des_x ;save # of times ; ldy #0 keyb ; clc lda des_cd ;save left most bit(cn) rol a php ; lda des_msk+3 ;save left most bit(dn) clc and des_cd+3 beq keyb0 sec keyb0 ; ldx #6 keyc ; rol des_cd,x dex bpl keyc ; lda des_cd+3 and #%11101111 ;clear right most bit(cn) sta des_cd+3 ; lda #0 plp ;restore left most bit(cn) ror a ;move left most bit(cn) ror a ;to right most bit(cn) ror a ror a ora des_cd+3 sta des_cd+3 ; ldx des_x iny lda rotat_left,x sta des_temp cpy des_temp bne keyb ; * * permutation 2 * ldy #0 keye ; sty des_y ; lda pc2tbl,y sta remainder lda #7 ;7 bytes toal for cn+dn sta des_count keyf ; dec des_count sec lda remainder sbc #08 sta remainder beq keyf0 ;= 0 ? bcs keyf ;> 0 ? ; keyf0 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne keyf2 ;x = 0 ? ldx #8 ;set to 8, if yes keyf2 ; dex lda des_msk,x ldy des_count clc and des_cd,y beq key0 sec key0 ; ldx #7 key01 ; rol des_work1,x php dex bmi key02 plp bra key01 ; key02 ; plp ldy des_y iny cpy #48 bne keye ; * * move result of perm 2 to k(n) * ldx #0 key03 ; lda des_work3,x ldy des_k sta k1,y inc des_k inx cpx #6 bne key03 ; ldx des_x inx cpx #16 beq key04 jmp keya ; key04 rts ; ; ************************************************** * * encode - encryption module * * entry : random1,...,random8 * * exit : des_work1,...,des_work8 * * ************************************************** encode ; sep #$30 LONGA OFF LONGI OFF stZ des_y ;init des_y ; ldx #0 ecd1 ; stx des_x ; lda iniptbl,x sta remainder lda #8 sta des_count ecd2 ; dec des_count sec lda remainder sbc #08 sta remainder beq ecd22 ;= 0 ? bcs ecd2 ;> 0 ? ; ecd22 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne ecd24 ;x = 0 ? ldx #8 ;set x to 8, if yes ecd24 ; dex lda des_msk,x ldy des_count clc and random,y beq ecd3 sec ecd3 ; ldx #7 ecd4 ; rol des_work1,x php dex bmi ecd5 plp bra ecd4 ; ecd5 ; plp ldx des_x inx cpx #64 bne ecd1 ; * * move result of init perm to left/right block * move 8 times - first 4 bytes = des_l1 * - second 4 bytes = des_r1 * ldx #0 ecd6 ; lda des_work1,x sta des_l1,x inx cpx #08 bne ecd6 ; * * perform rn = ln eor f(rn,kn) * transform right 32 bits into 48 bits * stz key_x ;initiaiZe k(n) pointer ldx #0 ecd60 ; stx des_x1 ;save counter ; ldx #0 ecd65 ; lda des_r1,x ;save rn origin to temp sta des_temp1,x inx cpx #4 bne ecd65 ; ldx #0 ecd7 ; stx des_x ; ; lda etbl,x ;perform e function sta remainder lda #4 ;4 bytes only sta des_count ecd8 ; dec des_count sec lda remainder sbc #08 sta remainder beq ecd82 ;= 0 ? bcs ecd8 ;> 0 ? ; ecd82 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne ecd84 ;x = 0 ? ldx #8 ;set x to 8, if yes ecd84 ; dex lda des_msk,x ldy des_count clc and des_r1,y beq ecd9 sec ecd9 ; ldx #5 ecda ; rol des_work3,x php dex bmi ecdb0 plp bra ecda ; ecdb0 ; plp ldx des_x inx cpx #48 beq ecdb1 jmp ecd7 ; * * eor with k(48 bits) * ecdb1 ; ldy #0 ecdb ; ldx key_x ;get current k(n) pointer lda k1,x eor des_work3,y sta des_work3,y inx stx key_x ;save pointer for k(n) blocks iny cpy #6 bne ecdb ; * * transform 48 bits into 32 bits s(b1),...,s(bn) * ldx #0 ecdc ; jsr saddr stx des_temp lda des_work3 ;des_work will shift 6 times and #%10000100 ;bit 7/2 are row #'s bpl ecdd and #%01111111 ;strip out high bit ora #%00001000 ;save high bit to bit 3 ecdd ; lsr a lsr a tax ;save row # ; lda des_work3 and #%01111000 ;bit 6-3 are column #'s lsr a lsr a lsr a ;column # in acc now ; ecde ; cpx #0 beq ecdf clc adc #16 ;find s tbl pointer dex ;decrement row # bra ecde ; ecdf ; tay lda s1,y asl a ;shift result to high byte asl a asl a asl a ; * * move result to des_r1 * ldy #4 ecd10 ; rol a ldx #3 ecd11 ; rol des_temp2,x php dex bmi ecd110 plp bra ecd11 ; ecd110 ; plp dey bne ecd10 ; * * shift des_work left 6 more times * ldy #6 ecd12 ; ldx #5 ecd13 ; rol des_work3,x dex bpl ecd13 dey bne ecd12 ; * * 8 times already? * ldx des_temp inx cpx #8 beq ptbl0 jmp ecdc ;do next s tbl ; * * perform 32 bits permutation * use ptbl * ptbl0 ; ldx #0 ptbl1 ; stx des_x2 lda ptbl,x sta remainder lda #4 sta des_count ptbl2 ; dec des_count sec lda remainder sbc #08 sta remainder beq ptbl22 ;= 0 ? bcs ptbl2 ;> 0 ? ; ptbl22 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne ptbl24 ;x = 0 ? ldx #8 ;set to 8, if yes ptbl24 ; dex lda des_msk,x ldy des_count clc and des_temp2,y beq ptbl3 sec ptbl3 ; ldx #3 ptbl4 ; rol des_r1,x php dex bmi ptbl5 plp bra ptbl4 ; ptbl5 ; plp ldx des_x2 inx cpx #32 bne ptbl1 ; ; * * exclusive or with left block * perform function = ln eor f(rn,kn) * ldx #0 ecd112 ; lda des_r1,x ;load rn eor des_l1,x ;eor with ln sta des_r1,x ;save result to rn inx cpx #4 bne ecd112 ; ldx #0 ecd115 ; lda des_temp1,x ;move rn origin to ln sta des_l1,x inx cpx #4 bne ecd115 ; * * 16 times already? * ldx des_x1 inx cpx #16 beq ecd140 jmp ecd60 ;yes, go back ; * * perform inverse permutation * ecd140 ; jsr swap ;swap left and right halves ldx #0 ecd14 ; stx des_x ; lda invptbl,x sta remainder lda #8 sta des_count ecd15 ; dec des_count sec lda remainder sbc #08 sta remainder beq ecd152 ;= 0 ? bcs ecd15 ;> 0 ? ; ecd152 ; clc lda remainder adc #8 sta remainder ; ldx remainder bne ecd154 ;x = 0 ? ldx #8 ;set x to 8, if yes ecd154 ; dex lda des_msk,x ldy des_count clc and des_l1,y beq ecd16 sec ecd16 ; ldx #7 ecd17 ; rol des_work1,x php dex bmi ecd18 plp bra ecd17 ; ecd18 ; plp ldx des_x inx cpx #64 bne ecd14 ; rts ;end of des modules ; swap ; ;switch des_l1 and des_r1 ldx #3 swap1 lda des_l1,x pha lda des_r1,x sta des_l1,x pla sta des_r1,x dex bpl swap1 rts ; * * increment s table pointer * * x = s# (0-7) * saddr clc lda #s1 adc tab64l,x sta ecdf+2 lda #>s1 adc tab64h,x sta ecdf+3 rts saveZp0 dc.b 0,0,0,0,0,0,0,0 ; tab64l dc.b 0,64,128,192,0,64,128,192 tab64h dc.b 0,0,0,0,1,1,1,1 ; ; ************************************************** * * des data area * ************************************************** ; ; iniptbl dc.b 7,15,23,31,39,47,55,63 dc.b 5,13,21,29,37,45,53,61 dc.b 3,11,19,27,35,43,51,59 dc.b 1,9,17,25,33,41,49,57 dc.b 8,16,24,32,40,48,56,64 dc.b 6,14,22,30,38,46,54,62 dc.b 4,12,20,28,36,44,52,60 dc.b 2,10,18,26,34,42,50,58 ; invptbl dc.b 25,57,17,49,9,41,1,33 dc.b 26,58,18,50,10,42,2,34 dc.b 27,59,19,51,11,43,3,35 dc.b 28,60,20,52,12,44,4,36 dc.b 29,61,21,53,13,45,5,37 dc.b 30,62,22,54,14,46,6,38 dc.b 31,63,23,55,15,47,7,39 dc.b 32,64,24,56,16,48,8,40 ; etbl dc.b 1,32,31,30,29,28 dc.b 29,28,27,26,25,24 dc.b 25,24,23,22,21,20 dc.b 21,20,19,18,17,16 dc.b 17,16,15,14,13,12 dc.b 13,12,11,10,9,8 dc.b 9,8,7,6,5,4 dc.b 5,4,3,2,1,32 ; pc1tbl dc.b 8,16,24,32,40,48,56 dc.b 64,7,15,23,31,39,47 dc.b 55,63,6,14,22,30,38 dc.b 46,54,62,5,13,21,29 dc.b 2,10,18,26,34,42,50 dc.b 58,3,11,19,27,35,43 dc.b 51,59,4,12,20,28,36 dc.b 44,52,60,37,45,53,61 ; ;convert from des algorithm ;base 56 pc2tbl dc.b 43,40,46,33,56,52,54,29 dc.b 42,51,36,47,34,38,45,53 dc.b 31,49,41,50,30,37,44,55 dc.b 16,5,26,20,10,2,27,17 dc.b 6,12,24,9,13,8,18,1 dc.b 23,4,11,15,7,21,28,25 ; ptbl dc.b 17,26,13,12,4,21,5,16 dc.b 32,18,10,7,28,15,2,23 dc.b 31,25,9,19,1,6,30,24 dc.b 14,20,3,27,11,22,29,8 ; s1 dc.b 14,4,13,1,2,15,11,8 dc.b 3,10,6,12,5,9,0,7 dc.b 0,15,7,4,14,2,13,1 dc.b 10,6,12,11,9,5,3,8 dc.b 4,1,14,8,13,6,2,11 dc.b 15,12,9,7,3,10,5,0 dc.b 15,12,8,2,4,9,1,7 dc.b 5,11,3,14,10,0,6,13 ; s2 dc.b 15,1,8,14,6,11,3,4 dc.b 9,7,2,13,12,0,5,10 dc.b 3,13,4,7,15,2,8,14 dc.b 12,0,1,10,6,9,11,5 dc.b 0,14,7,11,10,4,13,1 dc.b 5,8,12,6,9,3,2,15 dc.b 13,8,10,1,3,15,4,2 dc.b 11,6,7,12,0,5,14,9 ; s3 dc.b 10,0,9,14,6,3,15,5 dc.b 1,13,12,7,11,4,2,8 dc.b 13,7,0,9,3,4,6,10 dc.b 2,8,5,14,12,11,15,1 dc.b 13,6,4,9,8,15,3,0 dc.b 11,1,2,12,5,10,14,7 dc.b 1,10,13,0,6,9,8,7 dc.b 4,15,14,3,11,5,2,12 ; s4 dc.b 7,13,14,3,0,6,9,10 dc.b 1,2,8,5,11,12,4,15 dc.b 13,8,11,5,6,15,0,3 dc.b 4,7,2,12,1,10,14,9 dc.b 10,6,9,0,12,11,7,13 dc.b 15,1,3,14,5,2,8,4 dc.b 3,15,0,6,10,1,13,8 dc.b 9,4,5,11,12,7,2,14 ; s5 dc.b 2,12,4,1,7,10,11,6 dc.b 8,5,3,15,13,0,14,9 dc.b 14,11,2,12,4,7,13,1 dc.b 5,0,15,10,3,9,8,6 dc.b 4,2,1,11,10,13,7,8 dc.b 15,9,12,5,6,3,0,14 dc.b 11,8,12,7,1,14,2,13 dc.b 6,15,0,9,10,4,5,3 ; s6 dc.b 12,1,10,15,9,2,6,8 dc.b 0,13,3,4,14,7,5,11 dc.b 10,15,4,2,7,12,9,5 dc.b 6,1,13,14,0,11,3,8 dc.b 9,14,15,5,2,8,12,3 dc.b 7,0,4,10,1,13,11,6 dc.b 4,3,2,12,9,5,15,10 dc.b 11,14,1,7,6,0,8,13 ; s7 dc.b 4,11,2,14,15,0,8,13 dc.b 3,12,9,7,5,10,6,1 dc.b 13,0,11,7,4,9,1,10 dc.b 14,3,5,12,2,15,8,6 dc.b 1,4,11,13,12,3,7,14 dc.b 10,15,6,8,0,5,9,2 dc.b 6,11,13,8,1,4,10,7 dc.b 9,5,0,15,14,2,3,12 ; s8 dc.b 13,2,8,4,6,15,11,1 dc.b 10,9,3,14,5,0,12,7 dc.b 1,15,13,8,10,3,7,4 dc.b 12,5,6,11,0,14,9,2 dc.b 7,11,4,1,9,12,14,2 dc.b 0,6,10,13,15,3,5,8 dc.b 2,1,14,7,4,10,8,13 dc.b 15,12,9,0,3,5,6,11 ; des_msk dc.b 1 dc.b 2 dc.b 4 dc.b 8 dc.b 16 dc.b 32 dc.b 64 dc.b 128 ; key ds.b 8 ; random ds.b 8 ; des_work1 dc.b 0 des_work2 dc.b 0 des_work3 dc.b 0 des_work4 dc.b 0 des_work5 dc.b 0 des_work6 dc.b 0 des_work7 dc.b 0 des_work8 dc.b 0 ; des_count dc.b 0 remainder dc.b 0 key_x dc.b 0 des_x dc.b 0 des_x1 dc.b 0 des_x2 dc.b 0 des_y dc.b 0 des_k dc.b 0 des_temp dc.b 0 des_temp1 ds.b 4 des_temp2 ds.b 4 ; des_l1 ds.b 4 des_r1 ds.b 4 ; des_cd ds.b 7 ; k1 ds.b 6 k2 ds.b 6 k3 ds.b 6 k4 ds.b 6 k5 ds.b 6 k6 ds.b 6 k7 ds.b 6 k8 ds.b 6 k9 ds.b 6 k10 ds.b 6 k11 ds.b 6 k12 ds.b 6 k13 ds.b 6 k14 ds.b 6 k15 ds.b 6 k16 ds.b 6 ; rotat_left dc.b 1,1,2,2,2,2,2,2 dc.b 1,2,2,2,2,2,2,1 ; ; ; ; ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/Dialog1.c b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/Dialog1.c new file mode 100644 index 0000000..a5caf56 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/Dialog1.c @@ -0,0 +1 @@ +/* File: Dialog1.c By : Scott Kuechle Copyright: ©1988-1989 by Apple Computer Inc. All rights reserved. #} 18-Feb-91 Dave Lyons Added Apple-G and Apple-R key equivalents for the Guest and Registered User radio buttons (My_FilterProc). */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "NewControls.h" #include "NewInterface.h" #include "ASPDefs.h" DES_Pckt DESPckt; /*extern char SRefNum;*/ extern struct MySRefNum SrvrSRefNum; extern Handle User_Name_Hndl; extern Word User_Name_Len; extern int DoingAutoLogon; extern editLineHndl EDIT1; extern ServerInfoPtr SrvrPtr; extern char User_Name[NameLength]; extern NewCtlRecHndl EditBoxCtl; extern Handle myHandle; extern Word PwrdWasChanged; char AFP_Version2[] = "\pAFPVersion 2.0"; char ClearTxt[] = "\pCleartxt passwrd"; char Guest[] = "\pNo User Authent"; char RandEx[] = "\pRandnum exchange"; Byte WrongVersion,GuestLoginOK,ClearTxtOK,RandExOK,Already_Logged_In; Word LogInAsGuest; GrafPortPtr Dialog1; FPGetSrvrInfoOutput SrvrInfoOutput; /*byte*/Word done; FPMapIDOutput MapIDOutput; char DES_Result[8]; char Password[NameLength],buf3[NameLength]; LoginInput LogCmd; LoginOutput LogReply; LoginCont LogContCmd; LoginContReply LogContReply; FPGetUserInfoOutput UserInfoOutput; int CancelButtonHit; Word currEvent; char keyHit; Word AlreadyAt31; #include "Dialog1Defs.h" int Do_Login(namebuf,passbuf) char *namebuf,*passbuf; { int err,i,pos; int CmdLen,RepLen; Pstrcpy(&LogCmd.data[0],AFP_Version2); pos = LogCmd.data[0] + 1; CmdLen = 1 + (AFP_Version2[0] + 1); if (LogInAsGuest) { Pstrcpy(&LogCmd.data[pos],Guest); CmdLen = CmdLen + Guest[0] + 1; RepLen = sizeof(struct LoginOutput); /* id number + 8 byte random number */ } else /* log in as registered user */ { if (RandExOK) { Pstrcpy(&LogCmd.data[pos],RandEx); CmdLen = CmdLen + RandEx[0] + 1 + (namebuf[0] + 1); RepLen = 2 + 8; /* id number plus 8 byte random number */ pos = pos + LogCmd.data[pos] + 1; Pstrcpy(&LogCmd.data[pos],namebuf); } else /* use Clear Text Password Transmission */ { Pstrcpy(&LogCmd.data[pos],ClearTxt); CmdLen = CmdLen + ClearTxt[0] + 1 + (namebuf[0] + 1) + 8; RepLen = 2; /* id number only? */ pos = pos + LogCmd.data[pos] + 1; Pstrcpy(&LogCmd.data[pos],namebuf); pos = pos + LogCmd.data[pos] + 1; if ( (pos-1) & 1) /* is password going to be put at an odd address ? */ { /* yes, so we must pad with a zero */ LogCmd.data[pos] = 0; pos = pos + 1; CmdLen = CmdLen + 1; } strcpy(&LogCmd.data[pos],passbuf); Pad_With_Nulls(&LogCmd.data[pos],8); } } LogCmd.command = LoginCmd; err = cFILogin2(CmdLen,RepLen,0); if (err == LoginContinue) { Pad_With_Nulls(passbuf,8); DESPckt.password = passbuf; DESPckt.randnum = LogReply.RandNum; DESPckt.result = DES_Result; asm { ldx #DESPckt ldy #^DESPckt jsl DES } LogContCmd.command = LoginContCmd; LogContCmd.ID = LogReply.ID; for ( i=0 ; i<8 ; ++i ) LogContCmd.EncryptedValue[i] = DES_Result[i]; if (RandExOK) { CmdLen = 1 + 1 + 2 + 8; } LogContCmd.command = LoginContCmd; err = cFILoginCont(CmdLen); } return err; } int Set_Up_For_Login() { int err; /* is the 'guest' radio button selected? */ LogInAsGuest = GetDItemValue(Dialog1,Id5); if (LogInAsGuest) { User_Name[0] = 0; Password[0] = 0; Pad_With_Nulls(Password,8); /* pad it with null characters */ } else /* log in as a registered user */ { GetIText(Dialog1,Id7,User_Name); /* get user name from edit box */ GetIText(Dialog1,Id8,Password); /* get password from edit box */ p2cstr(Password); /* need password to be a C-string for login */ Pad_With_Nulls(Password,8); /* pad it with null characters */ } err = Do_Login(User_Name,Password); if (err) { Show_PFI_Error(err); /* now move the cursor to the offending field */ switch(err) { /* bad user name, so put cursor there */ case 0x0a16: SelectIText(Dialog1,Id7,0,NameLength); break; /* bad password, so put cursor there */ case 0x0a15: case 0x0a17: SelectIText(Dialog1,Id8,0,8); break; } } return (err); } int Get_Server_Info() { char UAMCount,VerCount; int Pos,Pos2; int err,i; err = cSPGetStatus(); if (err == 0) { WrongVersion = true; GuestLoginOK = false; ClearTxtOK = false; RandExOK = false; /* use offset to get version count value but subtract 10 since offset is from start of reply buffer */ Pos = SwapInt(SrvrInfoOutput.VerOffset) - 10; /* get count of number of version strings returned */ VerCount = SrvrInfoOutput.data[ Pos ]; /* position of first string is right after count value in buffer */ Pos = Pos + 1; /* now examine each version string returned */ for (i=0 ; (idtBoundsRect.v1 = 18; dialog->dtBoundsRect.h1 = 165; dialog->dtBoundsRect.v2 = 195; dialog->dtBoundsRect.h2 = 475; } else { /* 320 mode */ dialog->dtBoundsRect.v1 = 18; dialog->dtBoundsRect.h1 = 7; dialog->dtBoundsRect.v2 = 195; dialog->dtBoundsRect.h2 = 313; } } unsigned RadButtonEnabled(theID) unsigned theID; { CtlRecHndl ctl = GetControlDItem(FrontWindow(),theID); return( (**ctl).ctlHilite != 0xFF ); } pascal Word my_FilterProc(theDialog,theEvent,theItem) GrafPortPtr theDialog; EventRecord *theEvent; word *theItem; /* was long *theItem, 18-Feb-91 DAL */ { CtlRecHndl tHandle,EditBoxHndl; Word PartCode; int i; int dbr; int flag; Pointer p; extern void BlinkControl(); /* added 18-Jan-91 DAL */ dbr = SaveDB(); /* set up event type */ currEvent = (*theEvent).what; /* set up which key was hit */ p = (char *)&theEvent->message; /* do this to find ASCII code of key hit */ keyHit = p[0]; /* check if <.> keys or were hit - if so, perform same action as cancel button. Also provide Apple-G/Apple-R = radio buttons */ if (currEvent == keyDownEvt) { if((*theEvent).modifiers & appleKey) { if( (keyHit=='g') || (keyHit=='G') ) { if(RadButtonEnabled(Id5)) *theItem = Id5; /* change it to a Guest button hit */ RestoreDB(dbr); return ((Word)true); } if( (keyHit=='r') || (keyHit=='R') ) { if(RadButtonEnabled(Id6)) *theItem = Id6; /* change it to a Registered User button hit */ RestoreDB(dbr); return ((Word)true); } } if (( ((*theEvent).modifiers & appleKey) && (keyHit == '.') ) || (keyHit == 0x1b)) { /* tell autologon code that cancel button was hit */ CancelButtonHit = false; BlinkControl(GetControlDItem(Dialog1,2)); /* added 18-Jan-91 DAL */ /* close this dialog window and go back to control panel window */ CloseDialog(Dialog1); done = true; RestoreDB(dbr); return ((Word)true); } } RestoreDB(dbr); return ((Word)false); } int CreateFirstDialog() { Word itemHit,length; CtlRecHndl ControlHndl,ControlHndl2; LongWord itemHitInfo; int i,err; char mode; CtlRecHndl hndl; #undef dtItemListLength #define dtItemListLength 7 /* position dialog on the screen for 640/320 mode */ SetDialogPosition(&MyDialog); /* first check if we already have a session with this server (CmdLen=0) */ err = cFILogin2(0,0,0); if (err == AlreadyLoggedIn) { Already_Logged_In = true; MainText.itemDescr = MainTextBuf2; /* switch text to "Already logged in as..." */ } else { MainText.itemDescr = MainTextBuf; /* switch text to "Connect to file server as..." */ Already_Logged_In = false; } err = Get_Server_Info(); if (err) Show_PFI_Error(err); if ( (err == 0) || (err == AlreadyLoggedIn) ) { if (WrongVersion) /* did we not find an AFP 2.0 server? */ Show_Alert_Message(Stop_Alert,"\pThe Server you want uses an\rincompatible version of AFP.\rYou cannot connect to it."); else /* we are using AFP 2.0 */ { if (DoingAutoLogon) { /* when doing auto-logon get user name from APPLESHARE.PREP file and put it in the edit box. */ Pstrcpy(NameEditBoxText,&SrvrPtr->User_Name.textLength); } else { /* get the text that is currently in the user name edit box so we can display it in the login screen */ HLock((Handle)EditBoxCtl); myHandle = LEGetTextHand((LERecHndl)(**EditBoxCtl).ctlData); length = LEGetTextLen((LERecHndl)(**EditBoxCtl).ctlData); /* if length is already at maximum, set our flag telling us so */ if (length == 31) AlreadyAt31 = true; else AlreadyAt31 = false; strncpy(NameEditBoxText,(*myHandle),length); if (length <= MaxNameLen) NameEditBoxText[length] = 0; /* null terminate the text */ c2pstr(NameEditBoxText); HUnlock((Handle)EditBoxCtl); } Dialog1 = GetNewModalDialog(&MyDialog); if (Already_Logged_In) Set_Up_For_AlreadyLoggedIn(); else Set_Up_For_Normal_Login(); /* now check and see if server supports the user changing passwords (set password should also be disabled if this dialog is brought up during boot time ) */ if (DoingAutoLogon || !(SwapInt(SrvrInfoOutput.Flags) & ChangePasswordBit)) { /* make set password button inactive during auto-logon since this operation cannot be done */ ControlHndl = GetControlDItem(Dialog1,Id3); HiliteControl(inactiveHilite,ControlHndl); } /* set flag we use with the message center - need to know if the password has been changed on us */ PwrdWasChanged = false; /* autologon code needs to know if cancel button hit */ CancelButtonHit = false; done = false; do { itemHit = ModalDialog((WordProcPtr)((long)my_FilterProc | 0xC0000000)); Handle_Item_Hit(itemHit); } while (!done); } } if (CancelButtonHit) /* was the cancel button selected? */ return true; /* yes, so inform autologon code that it was */ else return false; /* no */ } CopyPassword(dest,source,maxlen) char *source,*dest; int maxlen; { int i; char *src,*dst; /* do this so original pointers aren't changed when the copy is complete */ src = source; dst = dest; for (i=0; i #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ASPDefs.h" #include "Dialog2Defs.h" extern int _toolErr; extern struct MySRefNum SrvrSRefNum; extern myMemRecPtr LastSelectedZone,SelectedMember; extern Handle DataHndl; extern char SlotDrive; extern char MountFlag; extern int VolID; extern Word NetworkBoot; extern char User_Name[NameLength],Password[NameLength]; extern struct OpenRecGS myOpen; extern struct FileInfoRecGS myInfoRec; extern char AUTOLOGON_Path[]; extern Word LogInAsGuest; extern Byte Already_Logged_In; extern Handle MyMessData; extern ResultBuf32 buf; extern char *separator; extern ResultBuf32 theBootVol; extern Word BootVoldevNum; extern char pathbuf[255]; extern Word DoubleClick; extern LongWord PrevTickCount; extern Word OnePending; extern Word MyUserID; extern char VolPassBuf[9]; extern Handle MySrvrMessData; extern Handle MyVolMessData; extern Word PwrdWasChanged; extern char NewPasswordBuf[9]; extern Word NetNum; extern char NodeID,ScktNum; extern int DoingAutoLogon; extern Word LogInAsGuest; extern Rect ControlPanelRect; extern Word WritProtAlreadyShowed; extern pascal Word AlertWindow() inline(0x590e,dispatcher); /* List */ extern pascal int cmail(); extern GSString255 syspath; Word nothing; GrafPortPtr Dialog2; GetSrvrParmsInput CmdBuf; GetSrvrParmsOutput ReplyBuf; ListCtlRecHndl VolListHndl; CtlRecHndl listScrollHandle; LongWord listRefCons,scrollRefCons; CtlRecHndl OKButtonHndl, QuitButtonHndl; VolList LSBuf[MaxVols]; Word NumBoxesChecked; #define CheckBoxSpace 35 #define checked true #define unchecked false myMemRecPtr currRec; ServerInfo Srvr_Info; VolumeInfo Vol_Info; int Current_File_Pos; ServerInfoPtr curr_Server_record; VolumeInfoPtr curr_Volume_record; longword curr_AUTOLOGON_size; Word AnyChangesMade; int ServerSaved; char volbuf[MaxVolLength+1]; int SaveNameOnlyOriginalStatus = true; int OneVolumeInitiallySelected; Word PreviousFirstItem; Word UserNameChanged; char *CheckForVolPwrdMatch(data,volname) char *data; char *volname; { MyVolDataPtr p; p = (MyVolDataPtr)data; if ( (p->NetNum == NetNum) && (p->NodeID == NodeID) && (p->Socket == ScktNum) && upstrcmp(&p->VolName[0],volname) == 0) return &p->Password[0]; else return nil; } char *CheckForSrvrPwrdMatch(data) char *data; { MySrvrDataPtr p; p = (MySrvrDataPtr)data; if ( (p->NetNum == NetNum) && (p->NodeID == NodeID) && (p->Socket == ScktNum) ) return &p->Password[0]; else return nil; } char *GetPwrdFromMessCenter(GetSrvrPwrd,volname) Word GetSrvrPwrd; char *volname; { int i,found; char *DataPtr; MessageDataPtr HeaderPtr; Word count; char *ThisIsIt; /* get current data from message center */ if (GetSrvrPwrd) { /* get server data */ MessageCenter(getMessage,MySrvrMessID,MySrvrMessData); HeaderPtr = (MessageDataPtr)(*MySrvrMessData); } else /* get volume data */ { MessageCenter(getMessage,MyVolMessID,MyVolMessData); HeaderPtr = (MessageDataPtr)(*MyVolMessData); } /* how many passwords are currently saved? */ count = HeaderPtr->MessCount; /* set up pointer to first record */ DataPtr = (char *)(HeaderPtr) + sizeof(struct MessageData); if (count == 0) { return nil; } else { found = false; /* now check if server password is already saved */ for (i=0; iMessCount; /* set up pointer to first record */ DataPtr = (char *)(HeaderPtr) + sizeof(struct MessageData); if (count == 0) { if (GetSrvrPwrd) AddSrvrPwrd(); else AddVolPwrd(volname); } else { found = false; /* now check if server password is already saved */ for (i=0; iMessCount; ++i) { DataPtr = DataPtr + sizeof(struct MySrvrData); } /* increment count of number of passwords stored */ HeaderPtr->MessCount = HeaderPtr->MessCount + 1; SrvrData = (MySrvrDataPtr)DataPtr; /* store the new data */ SrvrData->NetNum = NetNum; SrvrData->NodeID = NodeID; SrvrData->Socket = ScktNum; CopyPassword(&SrvrData->Password[0],Password,8); /* save the new password data */ MessageCenter(addMessage,MySrvrMessID,MySrvrMessData); } AddVolPwrd(volname) char *volname; { MessageDataPtr HeaderPtr; char *DataPtr; LongWord hdlsize; int i; MyVolDataPtr VolData; /* since we are adding a password, we must resize the handle to accomodate the new data */ hdlsize = GetHandleSize(MyVolMessData); hdlsize = hdlsize + sizeof(struct MyVolData); /* add another record's worth */ SetHandleSize(hdlsize,MyVolMessData); /* set up pointers to data */ HeaderPtr = (MessageDataPtr)(*MyVolMessData); DataPtr = (char *)(HeaderPtr) + sizeof(struct MessageData); /* point to new space for data */ for (i=0; iMessCount; ++i) { DataPtr = DataPtr + sizeof(struct MyVolData); } /* increment count of number of passwords stored */ HeaderPtr->MessCount = HeaderPtr->MessCount + 1; VolData = (MyVolDataPtr)DataPtr; /* store the new data */ VolData->NetNum = NetNum; VolData->NodeID = NodeID; VolData->Socket = ScktNum; Pstrcpy(&VolData->VolName[0],volname); CopyPassword(&VolData->Password[0],VolPassBuf,8); /* save the new password data */ MessageCenter(addMessage,MyVolMessID,MyVolMessData); } HideRadioButtons() { /* hide radio buttons since box is now unchecked */ HideDItem(Dialog2,Id8); HideDItem(Dialog2,Id9); } ShowRadioButtons() { /* re-draw radio buttons */ ShowDItem(Dialog2,Id8); ShowDItem(Dialog2,Id9); } char dimmedMask[] = {0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA}; char NORmask[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; pascal void Draw_One_Line(theRect,theMem,theList) RectPtr theRect; myMemRecPtr theMem; ListCtlRecHndl theList; { int dbr,i; Rect temp; Word ActualFirstItem; Word difference; dbr=SaveDB(); /* this could be a scroll or a mouse down in the record itself, so we will draw the text for this record and then draw the check box associated with this record */ /* chop-off rectangle so we dont draw over check box */ (*theRect).h2 = (*theRect).h2 - CheckBoxSpace; MoveTo((*theRect).h1 + 10,(*theRect).v2 - 2); SetTextFace(0x0000); SetBackColor(white); SetForeColor(black); EraseRect(theRect); DrawString((*theMem).memPtr); /* draw the actual text */ /* we must show as dimmed those volumes that are already mounted or those volumes the user doesn't have privileges to mount */ if (((*theMem).memFlag == memDisabled) || (*theMem).memFlag == (memDisabled + memSelected)) { SetPenMask(dimmedMask); EraseRect(theRect); SetPenMask(NORmask); } /* highlight the text if selected */ if ( (*theMem).memFlag == memSelected) InvertRect(theRect); /* restore rect. to original size */ (*theRect).h2 = (*theRect).h2 + CheckBoxSpace; /* set up item that is the current first view-able item in the list */ ActualFirstItem = (**VolListHndl).ctlValue; /* did the user scroll the list? */ if (PreviousFirstItem != ActualFirstItem) { /* compute how many items (offset) were scrolled */ difference = (PreviousFirstItem > ActualFirstItem) ? (PreviousFirstItem - ActualFirstItem) : (ActualFirstItem - PreviousFirstItem); /* did they scroll up? */ if (PreviousFirstItem < ActualFirstItem) HideDItem(Dialog2,(*theMem).ckboxId - difference); /* hide previous check box */ else /* no, scroll down */ HideDItem(Dialog2,(*theMem).ckboxId + difference); /* hide previous check box */ /* if this item is the last view-able item we need to draw, then we can reset our flag - we cant reset this flag until all view-able items have been redrawn */ if (theMem == &VolNamesBuf[ (ActualFirstItem - 1) + (VolListRec.listView - 1) ]) PreviousFirstItem = ActualFirstItem; } /* now draw the actual check box */ GetDItemBox(Dialog2,(*theMem).ckboxId,&temp); temp.v1 = (*theRect).v1 + 1; temp.h1 = (*theRect).h2 - CheckBoxSpace + 6; temp.v2 = (*theRect).v2 -1/*+ 1*/; temp.h2 = (*theRect).h2; SetDItemBox(Dialog2,(*theMem).ckboxId,&temp); ShowDItem(Dialog2,(*theMem).ckboxId); RestoreDB(dbr); } ZeroRefCons() { SetCtlRefCon(0L,VolListHndl); SetCtlRefCon(0L,listScrollHandle); } RestoreRefCons() { SetCtlRefCon(listRefCons,VolListHndl); SetCtlRefCon(scrollRefCons,listScrollHandle); } void BlinkControl(handle) /* added 19-Jan-91 DAL */ CtlRecHndl handle; { HiliteControl(2,handle); HiliteControl(0,handle); } /* broke this out into a subroutine so I can call it after ListKey--18-Jan-91 DAL */ unsigned FixOkayStatus() { unsigned anySelected = false, i; for (i=0; iwhat==keyDownEvt || theEvent->what==autoKeyEvt) && theDialog==Dialog2) /* added 17-Jan-91 DAL, revved for autokey 18-Feb-91 DAL */ { char key = (char) theEvent->message; if (key==0x0D) { if (FixOkayStatus()) { /* only do OK if something selected 1-Jul-91 MSD */ BlinkControl(OKButtonHndl); *theItem=1; /* Return = OK button */ } tookEvent++; } if ( (key==0x1B) || ((key=='.')&&(theEvent->modifiers&appleKey)) ) { BlinkControl(QuitButtonHndl); *theItem=2; /* Apple-period or Escape = Quit button */ tookEvent++; } if(!tookEvent) { if( (QDVersion() & 0x0fff) >= 0x0307) { ListKey(0,theEvent,VolListHndl); /* let ListKey use arrows and other keys to jump around */ FixOkayStatus(); } } } if ((*theEvent).what == mouseDownEvt && theDialog==Dialog2) { PartCode = FindControl(&tHandle,(*theEvent).where,theDialog); if ((tHandle == VolListHndl) || (tHandle == listScrollHandle)) { RestoreRefCons(); PartCode = TrackControl((*theEvent).where,(LongProcPtr) -1, tHandle); ZeroRefCons(); if (PartCode == 0x88) /* mouse down in content of list control ? */ { /* go through the list of volume names and see if one was selected since some of the names could be disabled (vols already mounted) and therefore are not selectable */ anySelected = FixOkayStatus(); if(anySelected) { /* check for double-clicks here.... */ /* was there previously a mouse down saved? */ if (OnePending) { /* get current double-click time */ DblClickTime = GetDblTime(); /* was it a double-click? */ if ( ((*theEvent).when - PrevTickCount) <= DblClickTime ) { DoubleClick = true; OnePending = false; } else { DoubleClick = false; PrevTickCount = (*theEvent).when; } } else /* no previous mouse down saved */ { PrevTickCount = (*theEvent).when; OnePending = true; } } } RestoreDB(dbr); return (true); } } else { } RestoreDB(dbr); return (tookEvent); } int SetUpVolumeData(volrec) myMemRecPtr volrec; { integer i; Pointer pwrd; int err; err = 0; Vol_Info.Volume_Flags = 0; if ((*volrec).NodeID & PwrdFlag) /* is this a password protected volume? */ { Vol_Info.Volume_Flags = AutoLogonPwrdFlag; /* yes, so set password flag */ /* is the item dimmed? (meaning it is currently mounted) */ if ((*volrec).memFlag == memDisabled) { /* yes, so get password from message center */ pwrd = GetPwrdFromMessCenter((Word)false,(*volrec).memPtr); if (pwrd == nil) { /* what do we do here? password was not found in message center! */ } else CopyPassword(&Vol_Info.Volume_Password[0],pwrd,8); } else /* not in message center?, we'll probably have to ask user to enter it */ { /* try and see if it is in message center */ pwrd = GetPwrdFromMessCenter((Word)false,(*volrec).memPtr); if (pwrd == nil) /* not found in the message center? */ { /* well have to ask the user to enter it */ MountFlag = MountBit; if ((*volrec).NodeID & UserVolBit) /* is this a user volume ? */ MountFlag = MountFlag | UserVolBit; /* yes, so specify this in the mount call */ /* put up password dialog - we must mount the volume to ensure that the password they type is a valid one */ err = Do_Vol_Pwrd_Dialog(MountFlag,(*volrec).memPtr,&VolID,&SlotDrive); if (!err) /* no error getting password? */ { /* now un-mount the volume */ MountFlag = 0; err = cFIMountVol(MountFlag,(*volrec).memPtr,0L,&VolID,&SlotDrive,0); /* save password the user typed in */ CopyPassword(&Vol_Info.Volume_Password[0],VolPassBuf,8); } } else /* save what we got from message center */ { CopyPassword(&Vol_Info.Volume_Password[0],pwrd,8); } } /* passwords in the APPLESHARE.PREP file must be scrambled */ Scramble(&Vol_Info.Volume_Password[0]); } if ((*volrec).NodeID & UserVolBit) /* is this a user volume ? */ Vol_Info.Volume_Flags = Vol_Info.Volume_Flags | myUserVolBitFlag; /* yes, so set flag for boot-time logon code */ /* now save volume name */ Pstrcpy(&Vol_Info.Volume_Name.textLength,(*volrec).memPtr); /* return 0 = add this volume to the list. return non-zero = couldn't mount volume or it was password protected and couldn't mount it or user hit cancel button when prompted to enter the password. */ return err; } SetUpServerData() { integer i,value; char *Pwrd; char temp[9]; Pointer p; /* must keep track of changes to the user name */ UserNameChanged = false; /* first check radio button settings, but only if one of the check boxes is set and only if we are logged in as a registered user since guest login means we dont draw the save name and password radio buttons */ if (NumBoxesChecked && User_Name[0] != 0) { value = GetDItemValue(Dialog2,Id8); /* get status of "save name only" button */ if (value == 0) /* is it currently off? */ Srvr_Info.Server_Flags = 0; /* dont need to ask for password */ else Srvr_Info.Server_Flags = AutoLogonPwrdFlag; /* must ask for password */ } else Srvr_Info.Server_Flags = 0; /* dont need to ask for password */ Pstrcpy(&Srvr_Info.Server_Name.textLength,SelectedMember->memPtr); /* save server name */ p = LastSelectedZone->memPtr; if (*p == 0) { Srvr_Info.Server_Zone.textLength = 0; /* save null zone name */ /* if match was found in APPLESHARE.PREP file, we must update zone name because it could have been non-null (i.e. a valid zone name) and we now need to save a null zone name */ if (ServerSaved) curr_Server_record->Server_Zone.textLength = 0; } else { Pstrcpy(&Srvr_Info.Server_Zone.textLength,LastSelectedZone->memPtr); /* save zone */ /* if match was found in APPLESHARE.PREP file, we must update zone name because it could have been null (no zones) */ if (ServerSaved) Pstrcpy(&curr_Server_record->Server_Zone.textLength,LastSelectedZone->memPtr); } for (i=0 ; i<8 ; ++i) Srvr_Info.Server_Password[i] = 0; /* pad with nulls first */ /* if we are already logged in to the given server, then we must get the password from the message center (we stored it there earlier). If we didn't store it there, we would have no way of getting it at this point. */ if (Already_Logged_In) { Pwrd = GetPwrdFromMessCenter((Word)true,nil); if (Pwrd == nil) { /* if the password was not found in the message center and yet the volume is currently mounted, the the user must have mounted the volume using some other logon program (probably the ProDos8 Logon program). In this case the volume cannot be set for mounting at boot time since we do not have the password at this point. */ if (!ServerSaved) { /* put up error dialog only if the user has designated the volume to be mounted at boot time */ if (NumBoxesChecked) { Show_Alert_Message(Caution_Alert,"\pThe selected volumes werenÕt\rmounted with the Control Panel.\rYour name and password can\ronly be saved if you log on to\ra server from the Control\rPanel."); /* we must de-select all auto-logon boxes that were selected */ NumBoxesChecked = 0; for (i=0 ; iServer_Password[0],8); /* must de-scramble the password before we use it */ Scramble(&Srvr_Info.Server_Password[0]); } } else /* found it in the message center */ { CopyPassword(&Srvr_Info.Server_Password[0],Pwrd,8); } CopyPassword(Password,&Srvr_Info.Server_Password[0],8); } else { CopyPassword(&Srvr_Info.Server_Password[0],Password,8); } /* get current user name */ Pstrcpy(&Srvr_Info.User_Name.textLength,User_Name); /* now check if the user name/password has changed on us */ if (ServerSaved) /* is this server currently saved in APPLESHARE.PREP ? */ { /* is new user name different than what is currently saved? */ if (upstrcmp(&curr_Server_record->User_Name.textLength,User_Name) != 0) { UserNameChanged = true; /* copy in new name */ Pstrcpy(&curr_Server_record->User_Name.textLength,User_Name); /* copy in new password also */ CopyPassword(&curr_Server_record->Server_Password[0],&Srvr_Info.Server_Password[0],8); /* passwords stored in the APPLESHARE.PREP file must be scrambled */ Scramble(&curr_Server_record->Server_Password[0]); AnyChangesMade = true; /* 'force' an update of the APPLESHARE.PREP file */ } /* get currently saved password */ CopyPassword(temp,&curr_Server_record->Server_Password[0],8); /* de-scramble it so we can do a compare */ Scramble(temp); /* did the user change the password on us? (using the 'Set Password' option) */ if (PwrdWasChanged) { /* is the new one different than what is currently saved? */ if (strcmp(temp,NewPasswordBuf) != 0) { CopyPassword(&curr_Server_record->Server_Password[0],NewPasswordBuf,8); /* passwords stored in the APPLESHARE.PREP file must be scrambled */ Scramble(&curr_Server_record->Server_Password[0]); CopyPassword(Password,NewPasswordBuf,8); AnyChangesMade = true; /* 'force' an update of the APPLESHARE.PREP file */ } } /* was the password changed using the Admin. program on the server? */ else if (strcmp(temp,Password) != 0 && !Already_Logged_In) { /* copy in the new password */ CopyPassword(&curr_Server_record->Server_Password[0],Password,8); /* passwords stored in the APPLESHARE.PREP file must be scrambled */ Scramble(&curr_Server_record->Server_Password[0]); AnyChangesMade = true; /* 'force' an update of the APPLESHARE.PREP file */ } } else /* server is not currently saved in the APPLESHARE.PREP file */ { /* was password changed using the 'Set Password' option? */ if (PwrdWasChanged) { /* update our buffers */ CopyPassword(&Srvr_Info.Server_Password[0],NewPasswordBuf,8); CopyPassword(Password,NewPasswordBuf,8); } } /* passwords stored in the APPLESHARE.PREP file must be scrambled */ Scramble(&Srvr_Info.Server_Password[0]); Srvr_Info.Volume_Count = 0; } ToggleRadioButtons(itemHit) Word itemHit; { integer value; value = GetDItemValue(Dialog2,itemHit); /* get status of button that was hit */ if (value == 0) /* is it currently off? */ { SetDItemValue(1,Dialog2,itemHit); /* turn it on */ if (itemHit == NameButton.itemID) SetDItemValue(0,Dialog2,NamePwrdButton.itemID); /* turn off "save name only" button */ else SetDItemValue(0,Dialog2,NameButton.itemID); /* turn off "save name and password" button */ } } GetCheckBoxValues() { int i; Word value; for (i=0 ; i=Id10 && itemHit<=(Id10+MaxVols)) /* was this one of our check boxes? */ { CtlHndl = GetControlDItem(Dialog2,itemHit); ctlvalue = GetCtlValue(CtlHndl); /* get value to see if it is checked or not */ if (ctlvalue) /* was the box checked? */ { SetCtlValue(0,CtlHndl); /* un-check the box */ /* keep track of how many boxes are checked */ NumBoxesChecked = NumBoxesChecked - 1; /* hide radio buttons only if no boxes are checked */ if (NumBoxesChecked == 0) HideRadioButtons(); } else /* box was not currently checked */ { for (i=0; imemPtr; /* do server names match? */ if (upstrcmp(&pos->Server_Name.textLength,SelectedMember->memPtr) == 0) { /* do zone names match? */ if (upstrcmp(&pos->Server_Zone.textLength,LastSelectedZone->memPtr) == 0) return true; else if (pos->Server_Zone.textLength == 0 || *p == 0) { /* one of the zone names is null, so count that as a match */ AnyChangesMade = true; return true; } else return false; /* no match found */ } else return false; /* no match found */ } /* this procedure checks to see if the current server has already been saved in the users APPLESHARE.PREP file */ int IsServerAlreadySaved() { ServerInfoPtr pos; VolumeInfoPtr pos2; Word ServerCount; Pointer p; Integer i,j,count,found; char *x,*y; found = false; /* server starts out as not found */ /* check only if we were able to open the APPLESHARE.PREP file successfully */ if (DataHndl != nil) { p = (*DataHndl); /* de-reference handle */ ServerCount = *p; /* get number of servers stored in the file */ p = p + 2; /* point to first server info record */ pos = (ServerInfoPtr)p; /* point to first server info record */ for (i=0; iServer_Name.textLength,SelectedMember->memPtr) == 0 && upstrcmp(&pos->Server_Zone.textLength,LastSelectedZone->memPtr) == 0)*/ if (ServerMatch(pos)) { found = true; /* yes, we found it */ curr_Server_record = (ServerInfoPtr)pos; /* save position in file of server info rec */ } else /* move ahead to next server info record */ { count = (*pos).Volume_Count; /* get number of volumes */ pos = pos + 1; /* move over server record to first volume info record */ pos2 = (VolumeInfoPtr)pos; /* point at first volume record for this server */ for (j=0; j= MaxFileSize) { /* error - cant add any more entries!!!! */ Show_Alert_Message(Stop_Alert,"\pSorry. No more volumes may\r be set for mounting at\r system startup time."); } else { /* yes, need to update APPLESHARE.PREP file upon close of this dialog because we are adding a server. */ AnyChangesMade = true; dest = (*DataHndl) + curr_AUTOLOGON_size; /* destination points to end-of-file */ curr_Server_record = (ServerInfoPtr)dest; /* save pointer to current server info record */ BlockMove((Pointer)&Srvr_Info,dest,(longword)ServerRecSize); /* copy server info */ curr_AUTOLOGON_size = curr_AUTOLOGON_size + ServerRecSize; /* update current size of file */ p = (*DataHndl); /* get pointer to Number_of_Servers field */ *p = *p + 1; /* we added a server so we must increment this count */ } } DeleteServer() { LongWord SizeToBeMoved; Pointer eof,p; AnyChangesMade = true; /* yes, need to update APPLESHARE.PREP file upon close of this dialog */ eof = (*DataHndl) + curr_AUTOLOGON_size; SizeToBeMoved = (LongWord)(eof - (Pointer)(curr_Server_record + 1)); /* shift data over the record we want to delete */ BlockMove((Pointer)(curr_Server_record + 1),(Pointer)curr_Server_record,SizeToBeMoved); /* adjust size of file */ curr_AUTOLOGON_size = curr_AUTOLOGON_size - ServerRecSize; p = (*DataHndl); /* get pointer to Number_of_Servers field */ *p = *p - 1; /* we deleted a server so we must decrement this count */ } integer IsVolAlreadySaved(volname) char *volname; { integer i,found; found = false; /* point to first volume record for the current server */ curr_Volume_record = (VolumeInfoPtr)(curr_Server_record + 1); /* now loop through each volume looking for a match */ for (i=0; i < (*curr_Server_record).Volume_Count && !found; ++i) { if (upstrcmp(volname,&curr_Volume_record->Volume_Name.textLength) == 0) /* do volume names match? */ found = true; else curr_Volume_record = curr_Volume_record + 1; /* move to next volume record */ } return found; } /* to delete a volume we simply shift any data beyond the volume record on top of the volume record itself */ DeleteVolume() { LongWord SizeToMove; Pointer eof; AnyChangesMade = true; /* yes, need to update APPLESHARE.PREP file upon close of this dialog */ eof = (*DataHndl) + curr_AUTOLOGON_size; SizeToMove = (LongWord)(eof - (Pointer)(curr_Volume_record + 1)); /* shift data over the record we want to delete */ BlockMove((Pointer)(curr_Volume_record + 1),(Pointer)curr_Volume_record,SizeToMove); /* adjust size of file */ curr_AUTOLOGON_size = curr_AUTOLOGON_size - VolRecSize; /* adjust volume count for the server */ (*curr_Server_record).Volume_Count = (*curr_Server_record).Volume_Count - 1; } AddVolume() { LongWord SizeToBeMoved; Pointer source,dest; Word value; integer i; AnyChangesMade = true; /* yes, need to update APPLESHARE.PREP file upon close of this dialog */ /* first check if we can add any more volumes */ if ( (curr_AUTOLOGON_size + VolRecSize) >= MaxFileSize) { /* error - volume limit reached!!!! */ Show_Alert_Message(Stop_Alert,"\pSorry. No more volumes may\r be set for mounting at\r system startup time."); } else { /* next we must provide a space to insert our new volume, so we shift all data down by one volume record's worth of space */ /* source points to data after the current server record and its volumes */ source = (Pointer)curr_Server_record + ServerRecSize + ((*curr_Server_record).Volume_Count * VolRecSize); /* destination is one volume record offset from current location since we are inserting a volume record's worth of data */ dest = source + VolRecSize; /* shift data only if we arent appending to end-of-file */ if (dest <= ( (*DataHndl) + curr_AUTOLOGON_size) ) { /* (# bytes to be moved) = eof - (ptr to insertion point) */ SizeToBeMoved = ( (*DataHndl) + curr_AUTOLOGON_size) - source; /* shift data down to clear space for volume info */ BlockMove(source,dest,(LongWord)SizeToBeMoved); } /* add the volume info */ BlockMove((Pointer)&Vol_Info,source,(LongWord)VolRecSize); curr_AUTOLOGON_size = curr_AUTOLOGON_size + VolRecSize; /* update current size of file */ /* must increment the volume count for the current server */ Srvr_Info.Volume_Count = Srvr_Info.Volume_Count + 1; (*curr_Server_record).Volume_Count = (*curr_Server_record).Volume_Count + 1; CopyPassword(&curr_Server_record->Server_Password[0],Password,8); /* passwords stored in the APPLESHARE.PREP file must be scrambled */ Scramble(&curr_Server_record->Server_Password[0]); value = GetDItemValue(Dialog2,NameButton.itemID); /* is "save name only" button set? */ if (!value) { /* save both name and password */ (*curr_Server_record).Server_Flags = 0; /* dont need to ask for password */ } else /* save name only so we must ask for password */ (*curr_Server_record).Server_Flags = AutoLogonPwrdFlag; /* must ask user for password */ } } UpdateAUTOLOGONfile() { integer i,VolumeSaved,err; Do_AUTOLOGON_data(Get); /* open current APPLESHARE.PREP file */ /* do updates only if we have a valid APPLESHARE.PREP file */ if (DataHndl != nil) /* is file valid? */ { VolumeSaved = false; ServerSaved = IsServerAlreadySaved(); /* is the server already saved in the file? */ SetUpServerData(); /* now loop through all volumes in the list to see which ones were checked */ for (i=0 ; iServer_Flags = Srvr_Info.Server_Flags; AnyChangesMade = true; } else if ( (Srvr_Info.Server_Flags == 0) && (SaveNameOnlyOriginalStatus == true) ) { /* update to new password flag */ curr_Server_record->Server_Flags = Srvr_Info.Server_Flags; AnyChangesMade = true; } } /* only update APPLESHARE.PREP file if changes were made - and only if they have logged in with the same user name */ if (AnyChangesMade && !(UserNameChanged && NumBoxesChecked == 0) ) Do_AUTOLOGON_data(Set); /* save changes to APPLESHARE.PREP file */ else DisposeHandle(DataHndl); /* get rid of our memory handle */ } } Set_Up_Controls() { Word flag; /* create radio buttons (invisible to start) for autologon stuff */ flag = ctlInVis; /* radio buttons start out as invisible */ /* are any boxes checked? - if so we must draw the save name and password radio buttons but only if we are logged in as a registered user. */ if (NumBoxesChecked && !LogInAsGuest) flag = 0; /* yes, so display radio buttons initially */ NameButton.itemFlag = flag; /* make it invisible/visible */ NameButton.itemValue = SaveNameOnlyOriginalStatus; /* will be selected to start if password flag was set in vol record */ NamePwrdButton.itemFlag = flag; /* make it invisible/visible */ NamePwrdButton.itemValue = SaveNameOnlyOriginalStatus ^ 1; /* set to opposite of 'save name only' button */ GetNewDItem(Dialog2,&NameButton); GetNewDItem(Dialog2,&NamePwrdButton); VolListRec.listDraw = Draw_One_Line; VolListHndl = CreateList(Dialog2,&VolListRec); SortList(1L,&VolListRec); /* added 17-Jan-91 DAL--compareProc=1L does a case-insensitive sort */ SelectMember2(1,VolListHndl); /* added 25-Mar-91 DAL */ listScrollHandle = (**VolListHndl).ctlListBar; listRefCons = GetCtlRefCon(VolListHndl); scrollRefCons = GetCtlRefCon(listScrollHandle); ZeroRefCons(); /* get control handle to 'OK' button */ OKButtonHndl = GetControlDItem(Dialog2,Id1); QuitButtonHndl = GetControlDItem(Dialog2,Id2); /* added 19-Jan-91 DAL */ /* the 'OK' button must be enabled if there was a mount-able volume shown as initially selected in the list */ if (OneVolumeInitiallySelected) HiliteControl(noHilite,OKButtonHndl); /* enable the button */ else { /* make 'OK' button inactive since no volume was selected */ HiliteControl(inactiveHilite,OKButtonHndl); } } CreateSecondDialog() { Word itemHit; LongWord itemHitInfo; int err,i,j; int ptr,val; integer VolSaved; long AccessRights; char *rights; char parmflag; char EntriesReturned; #undef dtItemListLength #define dtItemListLength 0x07 /* position dialog on the screen for 640/320 mode */ SetDialogPosition(&MyDialog2); DoubleClick = false; PrevTickCount = 0; OnePending = false; /* this flag gets set if there is one (any) mount-able volume in the list that can be highlighted when the list is first put up. */ OneVolumeInitiallySelected = false; /* make the FPGetSrvrParms call to get a list of volumes */ CmdBuf.command = FPGetSrvrParmsCmd; err = cSPCommand(sizeof(struct GetSrvrParmsInput),&CmdBuf, sizeof(struct GetSrvrParmsOutput),&ReplyBuf,0); /* set size of volume names list */ VolListRec.listSize = ReplyBuf.VolNameStrings; if (VolListRec.listSize > MaxVols) { Show_Alert_Message(Stop_Alert,"\pThere are too many volumes\r" "to display. As many as pos-\r" "sible will appear in the list."); VolListRec.listSize = MaxVols; } /* initialize this value used in drawing check boxes (see Draw_One_Line() ) */ PreviousFirstItem = 1; /* find out which volumes are currently on-line */ EntriesReturned = cFIListSessions(); AnyChangesMade = false; /* no changes made to APPLESHARE.PREP file initially */ Do_AUTOLOGON_data(Get); /* open APPLESHARE.PREP file */ ServerSaved = IsServerAlreadySaved(); /* is this server currently saved in the file? */ /* copy our volume name strings into our list record member record for display */ ptr = 1; /* skip password flag, set pointer to first name initially */ for (i=0; iUser_Name.textLength,User_Name) == 0) { /* check if password flag is set - if so, then we must show the 'save name only' radio button as set initially */ if ( (*curr_Server_record).Server_Flags & AutoLogonPwrdFlag) SaveNameOnlyOriginalStatus = true; VolNamesBuf[i].ScktNum = true; /* check box for auto-logon starts out as checked */ } else VolNamesBuf[i].ScktNum = false; /* check box for auto-logon starts out as unchecked */ } else VolNamesBuf[i].ScktNum = false; /* check box for auto-logon starts out as unchecked */ VolNamesBuf[i].privflag = false; /* denied privileges flag starts out as false */ VolNamesBuf[i].memFlag = 0; /* volume starts out as un-selected */ for (j=0 ;j #include #include #include #include "myConstants.h" char O_K_Txt[] = "\pOK"; /* had 2 leading blanks, 18-Jan-91 DAL */ char UnknownUser[] = "\pUnknown user or log on is\r\ disabled. Please retype the\r\ name or contact the serverÕs\r\ administrator."; char NoResponse[] = "\pNo response from server."; char ShutDown[] = "\pServer going down."; char Generic[] = "\pNetwork Error."; char NotAuth[] = "\pSorry, your password is not\r\ correct. Please reenter it."; char Limit[] = "\pYou have reached the limit\rof the number of file\rservers you can log on to\rat one time."; char TooManyVols[] = "\pYou have reached the limit\rof the number of file\rserver volumes you can\rmount at one time."; char ServerBusy[] = "\p No more users may log on to\r this server. Please try\r again later."; char AlreadyMounted[] = "\p There canÕt be two disks\r with the same name on the\r desktop."; ItemTemplate Message = { Id2, /* ItemTemplate - itemID */ 30,50,70+20,300, /* ItemTemplate - itemRect */ statText + itemDisable, /* ItemTemplate - itemType */ Generic, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ 0, /* ItemTemplate - itemFlag */ nil /* pointer to appropriate ctl color table */ }; ItemTemplate the_OK_Btn = { ok, /* ItemTemplate - itemID */ 75+20,165,88+20,245, /* ItemTemplate - itemRect */ buttonItem, /* ItemTemplate - itemType */ O_K_Txt, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ boldButton, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; struct AlertTemplate myAlert = { 30,30,145,310, /* AlertTemplate - rect */ Id1, /* AlertTemplate - id */ 0x81, /* AlertTemplate - stage 1 byte */ 0x81, /* AlertTemplate - stage 2 byte */ 0x81, /* AlertTemplate - stage 3 byte */ 0x81, /* AlertTemplate - stage 4 byte */ &the_OK_Btn, &Message, 0 /* AlertTemplate - Null terminated array */ }; Show_Alert_Message(which_type,msg) int which_type; char *msg; { Word itemHit; Word screen; /* re-display the arrow cursor */ InitCursor(); Message.itemDescr = msg; /* set up message to print */ screen = (GetMasterSCB() & 0x80); if (screen) myAlert.atBoundsRect.h1 = 180; else myAlert.atBoundsRect.h1 = 20; myAlert.atBoundsRect.h2 = myAlert.atBoundsRect.h1 + 280; switch(which_type) { case Stop_Alert: itemHit = StopAlert(&myAlert,nil); break; case Note_Alert: itemHit = NoteAlert(&myAlert,nil); break; case Caution_Alert: itemHit = CautionAlert(&myAlert,nil); break; } } Show_PFI_Error(err) int err; { switch (err) { case 0x0a01: /* file server limit */ Show_Alert_Message(Stop_Alert,Limit); break; case 0x0a02: /* file server limit */ Show_Alert_Message(Stop_Alert,ServerBusy); break; case 0x0a03: /* no response from server */ case 0x0706: Show_Alert_Message(Note_Alert,NoResponse); break; case 0x0a08: /* volume limit */ Show_Alert_Message(Stop_Alert,TooManyVols); break; case 0x0a11: /* volume already mounted */ Show_Alert_Message(Stop_Alert,AlreadyMounted); break; case 0x0a15: /* user not authorized */ case 0x0a07: Show_Alert_Message(Stop_Alert,NotAuth); break; case 0x0a16: /* unknown user */ Show_Alert_Message(Stop_Alert,UnknownUser); break; case 0x0a17: /* server going down */ Show_Alert_Message(Caution_Alert,ShutDown); break; default: /* network error */ Show_Alert_Message(Caution_Alert,Generic); break; } } \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/GSOS.c b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/GSOS.c new file mode 100644 index 0000000..1f44cc5 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/GSOS.c @@ -0,0 +1 @@ +/* File: GSOS.c By : Scott Kuechle Copyright: ©1988-1989 by Apple Computer Inc. All rights reserved. #} */ #include "types.h" #include "gsos.h" #include "myConstants.h" extern ResultBuf32 buf,buf2; extern ResultBuf32 theBootVol; extern GSString255 syspath; typedef struct GetBootVolRec { Word pCount; ResultBuf255Ptr dataBuffer; } GetBootVolRec; typedef struct GetDevNumberRec { Word pCount; GSString32Ptr devName; Word devNum; } GetDevNumberRec; #define outsize 200 typedef struct OutputBuf { integer len; integer outlen; char buf[outsize]; } OutputBuf; typedef struct UserInfoParmList { Word pCount; Word FSTnum; Word Cmd; Word DevNum; ResultBuf32Ptr nameBuffer; ResultBuf32Ptr groupBuffer; } UserInfoParmList; typedef struct GetUserPathParmList { Word pCount; Word FSTnum; Word Cmd; Long path; } GetUserPathParmList; FileInfoRecGS myInfoRec; OpenRecGS myOpen; IORecGS myIORec; OutputBuf myBuf; SetPositionRecGS mySetPosRec; CreateGSOSString(path) char *path; { strcpy(&syspath.text[0],path); syspath.length = strlen(path); } GSOS_GetFileInfo() { myInfoRec.pCount = 10; myInfoRec.pathname = &syspath; myBuf.len = outsize + 2; myInfoRec.optionList = (LongWord)&myBuf; GetFileInfoGS(&myInfoRec); } GSOS_Open(accessByte) Word accessByte; { myOpen.pathname = &syspath; myOpen.pCount = 0x0d; myOpen.requestAccess = accessByte; myOpen.resourceNumber = datafork; OpenGS(&myOpen); } GSOS_SetMark(relativeTo,displacement) Word relativeTo; LongWord displacement; { mySetPosRec.pCount = 3; mySetPosRec.refNum = myOpen.refNum; mySetPosRec.base = relativeTo; mySetPosRec.displacement = displacement; SetMarkGS(&mySetPosRec); } GSOS_SetEOF(relativeTo,displacement) Word relativeTo; LongWord displacement; { GSOS_SetMark(relativeTo,displacement); SetEOFGS(&mySetPosRec); } GSOS_Write(buffer,requestCount) char *buffer; LongWord requestCount; { myIORec.pCount = 5; myIORec.refNum = myOpen.refNum; myIORec.requestCount = requestCount; myIORec.dataBuffer = buffer; WriteGS(&myIORec); } GSOS_Read(buffer,requestCount) char *buffer; LongWord requestCount; { myIORec.pCount = 5; myIORec.refNum = myOpen.refNum; myIORec.requestCount = requestCount; myIORec.dataBuffer = buffer; ReadGS(&myIORec); } GSOS_Close() { myOpen.pCount = 1; CloseGS(&myOpen); } GSOS_Create() { static struct CreateRecGS myCreateRec = { 7, /* */ &syspath, /* */ readEnable + writeEnable + renameEnable + destroyEnable, /* */ AppleTalkFile, /* */ 0L, /* */ 0, /* */ 2, /* */ 0L /* */ }; CreateGS(&myCreateRec); } GSOS_GetBootVol() { static struct GetBootVolRec myBootVolRec = { 1, &buf2 }; GetBootVolGS(&myBootVolRec); } Word GSOS_GetDevNumber(devName) GSString32Ptr devName; { static struct GetDevNumberRec myGetDevNumRec = { 2, 0L, 0 }; myGetDevNumRec.devName = devName; GetDevNumberGS(&myGetDevNumRec); return myGetDevNumRec.devNum; } Word GSOS_Volume() { static struct VolumeRecGS myVolRec = { 6, /* */ &buf.bufString, /* */ &theBootVol, /* */ 0L, /* */ 0L, /* */ 0, /* */ 0 /* */ }; VolumeGS(&myVolRec); return myVolRec.fileSysID; } GSOS_DInfo(devNum) Word devNum; { static struct DInfoRecGS myDInfoRec = { 2, /* */ 0, /* */ &buf, /* */ 0, /* */ 0L, /* */ 0, /* */ 0, /* */ 0, /* */ 0, /* */ 0, 0 }; myDInfoRec.devNum = devNum; DInfoGS(&myDInfoRec); } Word GSOS_GetFSTInfo(fstNum,buf) Word fstNum; ResultBuf255Ptr buf; { static struct FSTInfoRecGS myInfoRec = { 3, /* */ 0, /* */ 0, /* */ 0L, /* */ 0, /* */ 0, /* */ 0, /* */ 0L, /* */ 0L /* */ }; myInfoRec.fstName = buf; myInfoRec.fstNum = fstNum; GetFSTInfoGS(&myInfoRec); return myInfoRec.fileSysId; } #define FSTSpecific(pBlockPtr) SysCall(pBlockPtr,0x2033) AShareFST_UserInfo(namebuf,devNum) ResultBuf32Ptr namebuf; Word devNum; { static struct UserInfoParmList myUserInfoParm = { 4, AShareFST, 0x0006, 0, 0L, 0L }; myUserInfoParm.DevNum = devNum; myUserInfoParm.nameBuffer = namebuf; FSTSpecific(&myUserInfoParm); } AShareFST_GetUserPath(path) Long *path; { static struct GetUserPathParmList myGetUserPathParm = { 3, AShareFST, 0x0008, 0L }; FSTSpecific(&myGetUserPathParm); *path = myGetUserPathParm.path; } \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/GSOS.h b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/GSOS.h new file mode 100644 index 0000000..0f9d507 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/GSOS.h @@ -0,0 +1 @@ +/******************************************** ; File: GSOS.h ; ; ; Copyright Apple Computer, Inc. 1988 ; All Rights Reserved ; ********************************************/ #ifndef __types__ #include #endif #ifndef __GSOS__ #define __GSOS__ #define readEnable 0x0001 /*access - read enable bit: CreateRec, OpenRec access and requestAccess fields */ #define writeEnable 0x0002 /*access - write enable bit: CreateRec, OpenRec access and requestAccess fields */ #define backupNeeded 0x0020 /*access - backup needed bit: CreateRec, OpenRec access field. (Must be 0 in requestAccess field ) */ #define renameEnable 0x0040 /*access - rename enable bit: CreateRec, OpenRec access and requestAccess fields */ #define destroyEnable 0x0080 /*access - read enable bit: CreateRec, OpenRec access and requestAccess fields */ #define startPlus 0x0000 /*base - setMark = displacement */ #define eofMinus 0x0001 /*base - setMark = eof - displacement */ #define markPlus 0x0002 /*base - setMark = mark + displacement */ #define markMinus 0x0003 /*base - setMark = mark - displacement */ #define noCache 0x0000 /*cachePriority - do not cache blocks invloved in this read */ #define cache 0x0001 /*cachePriority - cache blocks invloved in this read if possible */ #define badSystemCall 0x0001 /*error - bad system call number */ #define invalidPcount 0x0004 /*error - invalid parameter count */ #define gsosActive 0x07 /*error - GS/OS already active */ #ifndef devNotFound /*error - device not found */ #define devNotFound 0x10 #endif #define invalidDevNum 0x11 /*error - invalid device number */ #define drvrBadReq 0x20 /*error - bad request or command */ #define drvrBadCode 0x0021 /*error - bad control or status code */ #define drvrBadParm 0x0022 /*error - bad call parameter */ #define drvrNotOpen 0x0023 /*error - character device not open */ #define drvrPriorOpen 0x0024 /*error - character device already open */ #define irqTableFull 0x0025 /*error - interrupt table full */ #define drvrNoResrc 0x0026 /*error - resources not available */ #define drvrIOError 0x0027 /*error - I/O error */ #define drvrNoDevice 0x0028 /*error - device not connected */ #define drvrBusy 0x0029 /*error - call aborted, driver is busy */ #define drvrWrtProt 0x002B /*error - device is write protected */ #define drvrBadCount 0x002C /*error - invalid byte count */ #define drvrBadBlock 0x002D /*error - invalid block address */ #define drvrDiskSwitch 0x002E /*error - disk has been switched */ #define drvrOffLine 0x002F /*error - device off line/ no media present */ #define badPathSyntax 0x0040 /*error - invalid pathname syntax */ #define invalidRefNum 0x0043 /*error - invalid reference number */ #ifndef pathNotFound /*error - subdirectory does not exist */ #define pathNotFound 0x44 #endif #define volNotFound 0x0045 /*error - volume not found */ #ifndef fileNotFound /*error - file not found */ #define fileNotFound 0x0046 #endif #define dupPathname 0x0047 /*error - create or rename with existing name */ #define volumeFull 0x0048 /*error - volume full error */ #define volDirFull 0x0049 /*error - volume directory full */ #define badFileFormat 0x004A /*error - version error (incompatible file format) */ #ifndef badStoreType /*error - unsupported (or incorrect) storage type */ #define badStoreType 0x004B #endif #ifndef eofEncountered /*error - end-of-file encountered */ #define eofEncountered 0x004C #endif #define outOfRange 0x004D /*error - position out of range */ #define invalidAccess 0x004E /*error - access not allowed */ #define buffTooSmall 0x004F /*error - buffer too small */ #define fileBusy 0x0050 /*error - file is already open */ #define dirError 0x0051 /*error - directory error */ #define unknownVol 0x0052 /*error - unknown volume type */ #ifndef paramRangeErr /*error - parameter out of range */ #define paramRangeErr 0x0053 #endif #define outOfMem 0x0054 /*error - out of memory */ #define dupVolume 0x0057 /*error - duplicate volume name */ #define notBlockDev 0x0058 /*error - not a block device */ #ifndef invalidLevel /*error - specifield level outside legal range */ #define invalidLevel 0x0059 #endif #define damagedBitMap 0x005A /*error - block number too large */ #define badPathNames 0x005B /*error - invalid pathnames for ChangePath */ #define notSystemFile 0x005C /*error - not an executable file */ #define osUnsupported 0x005D /*error - Operating System not supported */ #ifndef stackOverflow /*error - too many applications on stack */ #define stackOverflow 0x005F #endif #define dataUnavail 0x0060 /*error - Data unavailable */ #define endOfDir 0x0061 /*error - end of directory has been reached */ #define invalidClass 0x0062 /*error - invalid FST call class */ #define resNotFound 0x0063 /*error - file does not contain required resource */ #define proDOS 0x0001 /*fileSysID - ProDOS/SOS */ #define dos33 0x0002 /*fileSysID - DOS 3.3 */ #define dos32 0x0003 /*fileSysID - DOS 3.2 */ #define dos31 0x0003 /*fileSysID - DOS 3.1 */ #define appleIIPascal 0x0004 /*fileSysID - Apple II Pascal */ #define mfs 0x0005 /*fileSysID - Macintosh (flat file system) */ #define hfs 0x0006 /*fileSysID - Macintosh (hierarchical file system) */ #define lisa 0x0007 /*fileSysID - Lisa file system */ #define appleCPM 0x0008 /*fileSysID - Apple CP/M */ #define charFST 0x0009 /*fileSysID - Character FST */ #define msDOS 0x000A /*fileSysID - MS/DOS */ #define highSierra 0x000B /*fileSysID - High Sierra */ #define characterFST 0x4000 /*FSTInfo.attributes - character FST */ #define ucFST 0x8000 /*FSTInfo.attributes - SCM should upper case pathnames before passing them to the FST */ #define onStack 0x8000 /*QuitRec.flags - place state information about quitting program on the quit return stack */ #define restartable 0x4000 /*QuitRec.flags - the quitting program is capable of being restarted from its dormant memory */ #define seedling 0x0001 /*storageType - standard file with seedling structure */ #define sapling 0x0002 /*storageType - standard file with sapling structure */ #define tree 0x0003 /*storageType - standard file with tree structure */ #define pascalRegion 0x0004 /*storageType - UCSD Pascal region on a partitioned disk */ #define extendedFile 0x0005 /*storageType - extended file type (with resource fork) */ #define directoryFile 0x000D /*storageType - volume directory or subdirectory file */ #define minorRelNum 0x00FF /*version - minor release number */ #define majorRelNum 0x7F00 /*version - major release number */ #define finalRel 0x8000 /*version - final release */ typedef struct GSString255 { Word length; /* Number of Chars in text field */ unsigned char text[255]; /* */ } GSString255, *GSString255Ptr; typedef struct GSString32 { Word length; /* Number of characters in text field */ unsigned char text[32]; /* */ } GSString32, *GSString32Ptr; typedef struct ResultBuf255 { Word bufSize; /* */ GSString255 bufString; /* */ } ResultBuf255, *ResultBuf255Ptr; typedef struct ResultBuf32 { Word bufSize; /* */ GSString32 bufString; /* */ } ResultBuf32, *ResultBuf32Ptr; typedef struct ChangePathRecGS { Word pCount; /* */ GSString255Ptr pathname; /* */ GSString255Ptr newPathname; /* */ } ChangePathRecGS, *ChangePathRecPtrGS; typedef struct CreateRecGS { Word pCount; /* */ GSString255Ptr pathname; /* */ Word access; /* */ Word fileType; /* */ LongWord auxType; /* */ Word storageType; /* */ LongWord eof; /* */ LongWord resourceEOF; /* */ } CreateRecGS, *CreateRecPtrGS; typedef struct DAccessRecGS { Word pCount; /* */ Word devNum; /* */ Word code; /* */ Pointer list; /* */ LongWord requestCount; /* */ LongWord transferCount; /* */ } DAccessRecGS, *DAccessRecPtrGS; typedef struct DevNumRecGS { Word pCount; /* */ GSString32Ptr devName; /* */ Word devNum; /* */ } DevNumRecGS, *DevNumRecPtrGS; typedef struct DInfoRecGS { Word pCount; /* */ Word devNum; /* */ GSString32Ptr devName; /* */ Word characteristics; /* */ LongWord totalBlocks; /* */ Word slotNum; /* */ Word unitNum; /* */ Word version; /* */ Word deviceID; /* */ Word headLink; Word forwardLink; } DInfoRecGS, *DInfoRecPtrGS; typedef struct DIORecGS { Word pCount; /* */ Word devNum; /* */ Pointer buffer; /* */ LongWord requestCount; /* */ LongWord startingBlock; /* */ Word blockSize; /* */ LongWord transferCount; /* */ } DIORecGS, *DIORecPtrGS; typedef struct DirEntryRecGS { Word pCount; /* */ Word refNum; /* */ Word flags; /* */ Word base; /* */ Word displacement; /* */ Pointer name; /* */ Word entryNum; /* */ Word fileType; /* */ Longint eof; /* */ LongWord blockCount; /* */ TimeRec createDateTime; /* */ TimeRec modDateTime; /* */ Word access; /* */ LongWord auxType; /* */ Word fileSysID; /* */ ResultBuf255Ptr optionList; /* */ } DirEntryRecGS, *DirEntryRecPtrGS; typedef struct ExpandPathRecGS { Word pCount; /* */ GSString255Ptr inputPath; /* */ ResultBuf255Ptr outputPath; /* */ Word flags; /* */ } ExpandPathRecGS, *ExpandPathRecPtrGS; typedef struct FileInfoRecGS { Word pCount; /* */ GSString255Ptr pathname; /* */ Word access; /* */ Word fileType; /* */ Longint auxType; /* */ Word storageType; /* must be 0 for SetFileInfo */ TimeRec createDateTime; /* */ TimeRec modDateTime; /* */ LongWord optionList; /* */ LongWord eof; /* */ LongWord blocksUsed; /* must be 0 for SetFileInfo */ LongWord resourceEOF; /* must be 0 for SetFileInfo */ LongWord resourceBlocks; /* must be 0 for SetFileInfo */ } FileInfoRecGS, *FileInfoRecPtrGS; typedef struct FormatRecGS { Word pCount; /* */ GSString32Ptr devName; /* device name pointer */ GSString32Ptr volName; /* volume name pointer */ Word fileSysID; /* file system ID */ } FormatRecGS, *FormatRecPtrGS; typedef struct FSTInfoRecGS { Word pCount; /* */ Word fstNum; /* */ Word fileSysId; /* */ ResultBuf255Ptr fstName; /* */ Word version; /* */ Word attributes; /* */ Word blockSize; /* */ LongWord maxVolSize; /* */ LongWord maxFileSize; /* */ } FSTInfoRecGS, *FSTInfoRecPtrGS; typedef struct InterruptRecGS { Word pCount; /* */ Word intNum; /* */ Word vrn; /* used only by BindInt */ LongWord intCode; /* used only by BindInt */ } InterruptRecGS, *InterruptRecPtrGS; typedef struct IORecGS { Word pCount; /* */ Word refNum; /* */ Pointer dataBuffer; /* */ LongWord requestCount; /* */ LongWord transferCount; /* */ Word cachePriority; /* */ } IORecGS, *IORecPtrGS; typedef struct LevelRecGS { Word pCount; /* */ Word level; /* */ } LevelRecGS, *LevelRecPtrGS; typedef struct NameRecGS { Word pCount; /* */ GSString255Ptr name; /* full pathname or a filename depending on call */ } NameRecGS, *NameRecPtrGS; typedef struct NewlineRecGS { Word pCount; /* */ Word refNum; /* */ Word enableMask; /* */ Word numChars; /* */ Pointer newlineTable; /* */ } NewlineRecGS, *NewlineRecPtrGS; #if 0 typedef struct OpenRecGS { Word pCount; /* */ Word refNum; /* */ GSString255Ptr pathname; /* */ Word requestAccess; /* */ Word resourceNumber; /* For extended files: dataFork/resourceFork */ Word access; /* Value of file's access attribute */ Word fileType; /* Value of file's fileType attribute */ Word auxType; /* */ Word storageType; /* */ TimeRec createDateTime; /* */ TimeRec modDateTime; /* */ Word *optionList; /* */ LongWord eof; /* */ LongWord blocksUsed; /* */ LongWord resourceEOF; /* */ LongWord resourceBlocks; /* */ } OpenRecGS, *OpenRecPtrGS; #endif typedef struct OpenRecGS { Word pCount; /* */ Word refNum; /* */ GSString255Ptr pathname; /* */ Word requestAccess; /* */ Word resourceNumber; /* For extended files: dataFork/resourceFork */ Word access; /* Value of file's access attribute */ Word fileType; /* Value of file's fileType attribute */ Long auxType; /* */ Word storageType; /* */ TimeRec createDateTime; /* */ TimeRec modDateTime; /* */ Pointer optionList; /* */ LongWord eof; /* */ LongWord blocksUsed; /* */ LongWord resourceEOF; /* */ LongWord resourceBlocks; /* */ } OpenRecGS, *OpenRecPtrGS; typedef struct PositionRecGS { Word pCount; /* */ Word refNum; /* */ LongWord position; /* */ } PositionRecGS, *PositionRecPtrGS; typedef struct PrefixRecGS { Word pCount; /* */ Word prefixNum; /* */ GSString255Ptr prefix; /* */ } PrefixRecGS, *PrefixRecPtrGS; typedef struct QuitRecGS { Word pCount; /* */ GSString255Ptr pathname; /* pathname of next app to run */ Word flags; /* */ } QuitRecGS, *QuitRecPtrGS; typedef struct RefNumRecGS { Word pCount; /* */ Word refNum; /* */ } RefNumRecGS, *RefnumRecPtrGS; typedef struct SetPositionRecGS { Word pCount; /* */ Word refNum; /* */ Word base; /* */ LongWord displacement; /* */ } SetPositionRecGS, *SetPositionRecPtrGS; typedef struct SysPrefRecGS { Word pCount; /* */ Word preferences; /* */ } SysPrefRecGS, *SysPrefRecPtrGS; typedef struct VersionRecGS { Word pCount; /* */ Word version; /* */ } VersionRecGS, *VersionRecPtrGS; typedef struct VolumeRecGS { Word pCount; /* */ GSString32Ptr devName; /* */ ResultBuf255Ptr volName; /* */ LongWord totalBlocks; /* */ LongWord freeBlocks; /* */ Word fileSysID; /* */ Word blockSize; /* */ } VolumeRecGS, *VolumeRecPtrGS; /* make the old prodos calls use the new call method */ #define PDosInt(callnum,pBlockPtr) sysCall(pBlockPtr,callnum) #define stackEntry 0xE100B0 extern pascal void SysCall() inline(0x0000,stackEntry); #define GetSysPrefsGS(pBlockPtr) SysCall(pBlockPtr,0x200F) #define BeginSessionGS(pBlockPtr) SysCall(pBlockPtr,0x201D) #define EndSessionGS(pBlockPtr) SysCall(pBlockPtr,0x201E) #define SessionStatusGS(pBlockPtr) SysCall(pBlockPtr,0x201F) #define ResetCacheGS(pBlockPtr) SysCall(pBlockPtr,0x2026) #define ChangePathGS(pBlockPtr) SysCall(pBlockPtr,0x2004) #define ClearBackupBitGS(pBlockPtr) SysCall(pBlockPtr,0x200B) #define CloseGS(pBlockPtr) SysCall(pBlockPtr,0x2014) #define CreateGS(pBlockPtr) SysCall(pBlockPtr,0x2001) #define DControlGS(pBlockPtr) SysCall(pBlockPtr,0x202E) #define DestroyGS(pBlockPtr) SysCall(pBlockPtr,0x2002) #define DInfoGS(pBlockPtr) SysCall(pBlockPtr,0x202C) #define DReadGS(pBlockPtr) SysCall(pBlockPtr,0x202F) #define DStatusGS(pBlockPtr) SysCall(pBlockPtr,0x202D) #define DWriteGS(pBlockPtr) SysCall(pBlockPtr,0x2030) #define EraseDiskGS(pBlockPtr) SysCall(pBlockPtr,0x2025) #define ExpandPathGS(pBlockPtr) SysCall(pBlockPtr,0x200E) #define FlushGS(pBlockPtr) SysCall(pBlockPtr,0x2015) #define FormatGS(pBlockPtr) SysCall(pBlockPtr,0x2024) #define GetBootVolGS(pBlockPtr) SysCall(pBlockPtr,0x2028) #define GetDevNumberGS(pBlockPtr) SysCall(pBlockPtr,0x2020) #define GetDirEntryGS(pBlockPtr) SysCall(pBlockPtr,0x201C) #define GetEOFGS(pBlockPtr) SysCall(pBlockPtr,0x2019) #define GetFileInfoGS(pBlockPtr) SysCall(pBlockPtr,0x2006) #define GetFSTInfoGS(pBlockPtr) SysCall(pBlockPtr,0x202B) #define GetLevelGS(pBlockPtr) SysCall(pBlockPtr,0x201B) #define GetMarkGS(pBlockPtr) SysCall(pBlockPtr,0x2017) #define GetNameGS(pBlockPtr) SysCall(pBlockPtr,0x2027) #define GetPrefixGS(pBlockPtr) SysCall(pBlockPtr,0x200A) #define GetVersionGS(pBlockPtr) SysCall(pBlockPtr,0x202A) #define NewlineGS(pBlockPtr) SysCall(pBlockPtr,0x2011) #define NullGS(pBlockPtr) SysCall(pBlockPtr,0x200D) #define OpenGS(pBlockPtr) SysCall(pBlockPtr,0x2010) #define QuitGS(pBlockPtr) SysCall(pBlockPtr,0x2029) #define ReadGS(pBlockPtr) SysCall(pBlockPtr,0x2012) #define SetEOFGS(pBlockPtr) SysCall(pBlockPtr,0x2018) #define SetFileInfoGS(pBlockPtr) SysCall(pBlockPtr,0x2005) #define SetLevelGS(pBlockPtr) SysCall(pBlockPtr,0x201A) #define SetMarkGS(pBlockPtr) SysCall(pBlockPtr,0x2016) #define SetPrefixGS(pBlockPtr) SysCall(pBlockPtr,0x2009) #define UnbindIntGS(pBlockPtr) SysCall(pBlockPtr,0x2032) #define VolumeGS(pBlockPtr) SysCall(pBlockPtr,0x2008) #define WriteGS(pBlockPtr) SysCall(pBlockPtr,0x2013) #define BindIntGS(pBlockPtr) SysCall(pBlockPtr,0x2031) #ifndef __prodos__ #if 0 #define GetSysPrefs GetSysPrefsGS #define BeginSession BeginSessionGS #define EndSession EndSessionGS #define SessionStatus SessionStatusGS #define ResetCache ResetCacheGS #define ChangePath ChangePathGS #define ClearBackupBit ClearBackupBitGS #define Close CloseGS #define Create CreateGS #define DControl DControlGS #define Destroy DestroyGS #define DInfo DInfoGS #define DRead DReadGS #define DStatus DStatusGS #define DWrite DWriteGS #define EraseDisk EraseDiskGS #define ExpandPath ExpandPathGS #define Flush FlushGS #define Format FormatGS #define GetBootVol GetBootVolGS #define GetDevNumber GetDevNumberGS #define GetDirEntry GetDirEntryGS #define GetEOF GetEOFGS #define GetFileInfo GetFileInfoGS #define GetFSTInfo GetFSTInfoGS #define GetLevel GetLevelGS #define GetMark GetMarkGS #define GetName GetNameGS #define GetPrefix GetPrefixGS #define GetVersion GetVersionGS #define Newline NewlineGS #define Null NullGS #define Open OpenGS #define Quit QuitGS #define Read ReadGS #define SetEOF SetEOFGS #define SetFileInfo SetFileInfoGS #define SetLevel SetLevelGS #define SetMark SetMarkGS #define SetPrefix SetPrefixGS #define UnbindInt UnbindIntGS #define Volume VolumeGS #define Write WriteGS #define BindInt BindIntGS #define ChangePath ChangePathGS #define ClearBackupBit ClearBackupBitGS #define Close CloseGS #define Create CreateGS #define DControl DControlGS #define Destroy DestroyGS #define DInfo DInfoGS #define DRead DReadGS #define DStatus DStatusGS #define DWrite DWriteGS #define EraseDisk EraseDiskGS #define ExpandPath ExpandPathGS #define Flush FlushGS #define Format FormatGS #define GetBootVol GetBootVolGS #define GetDevNumber GetDevNumberGS #define GetDirEntry GetDirEntryGS #define GetEOF GetEOFGS #define GetFileInfo GetFileInfoGS #define GetFSTInfo GetFSTInfoGS #define GetLevel GetLevelGS #define GetMark GetMarkGS #define GetName GetNameGS #define GetPrefix GetPrefixGS #define GetVersion GetVersionGS #define Newline NewlineGS #define Null NullGS #define Open OpenGS #define Quit QuitGS #define Read ReadGS #define SetEOF SetEOFGS #define SetFileInfo SetFileInfoGS #define SetLevel SetLevelGS #define SetMark SetMarkGS #define SetPrefix SetPrefixGS #define UnbindInt UnbindIntGS #define Volume VolumeGS #define Write WriteGS #define ChangePathRec ChangePathRecGS #define CreateRec CreateRecGS #define DAccessRec DAccessRecGS #define DevNumRec DevNumRecGS #define DInfoRec DInfoRecGS #define DIORec DIORecGS #define DirEntryRec DirEntryRecGS #define ExpandPathRec ExpandPathRecGS #define FileInfoRec FileInfoRecGS #define FormatRec FormatRecGS #define FSTInfoRec FSTInfoRecGS #define InterruptRec InterruptRecGS #define IORec IORecGS #define LevelRec LevelRecGS #define NameRec NameRecGS #define NewlineRec NewlineRecGS #define OpenRec OpenRecGS #define PositionRec PositionRecGS #define PrefixRec PrefixRecGS #define QuitRec QuitRecGS #define RefNumRec RefNumRecGS #define SetPositionRec SetPositionRecGS #define SysPrefRec SysPrefRecGS #define VersionRec VersionRecGS #define VolumeRec VolumeRecGS #define DInfoRec DInfoRecGS #define FSTInfoRec FSTInfoRecGS #define OpenRec OpenRecGS #define VersionRec VersionRecGS #endif #endif #endif \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/LIST.H b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/LIST.H new file mode 100644 index 0000000..98166d4 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/LIST.H @@ -0,0 +1 @@ +/******************************************** ; File: List.h ; ; ; Copyright Apple Computer, Inc. 1986, 1987 ; All Rights Reserved ; ********************************************/ #ifndef __types__ #include #endif #ifndef __quickdraw__ #include #endif #ifndef __event__ #include #endif #ifndef __control__ #include #endif #ifndef __list__ #define __list__ #define cString 0x0001 /*ListType bit mask - null terminated string type */ #define LIST_STRG 0x0001 /*ListType bit mask - null terminated string type */ #define selectOnlyOne 0x0002 /*ListType bit mask - only one selection allowed */ #define LIST_SELECT 0x0002 /*ListType bit mask - single selection only */ #define memDisabled 0x40 /*memFlag - Sets member flag to disabled */ #define memSelected 0x80 /*memFlag - Sets member flag to selected */ #if 0 typedef struct MemRec { Pointer memPtr; /* MemRec - Pointer to string, or custom */ Byte memFlag; /* MemRec - Bit Flag */ } MemRec, *MemRecPtr, **MemRecHndl ; #endif typedef struct MemRec { Pointer memPtr; /* MemRec - Pointer to string, or custom */ Byte memFlag; /* MemRec - Bit Flag */ int NetNum; /* network number */ char NodeID; /* node id */ char ScktNum; /* socket number */ char Enumerator; /* enumerator */ char privflag; Word ckboxId; } MemRec, *MemRecPtr, **MemRecHndl ; typedef struct LColorTable { Word listFrameClr; /* LColorTable - Frame color */ Word listNorTextClr; /* LColorTable - Unhighlighted text color */ Word listSelTextClr; /* LColorTable - Highlighted text color */ Word listNorBackClr; /* LColorTable - Unhighlighted background color */ Word listSelBackClr; /* LColorTable - Highlighted backgraound color */ } LColorTable, *LColorTablePtr, **LColorTableHndl ; typedef struct ListCtlRec { CtlRecHndl ctlNext; /* ListCtlRec - Handle of Next Control */ GrafPortPtr ctlOwner; /* ListCtlRec - Window owner */ Rect ctlRect; /* ListCtlRec - Enclosing Rect */ Byte ctlFlag; /* ListCtlRec - Bit 7 visible, Bit 0 string type, Bit 1 multiple */ Byte ctlHilite; /* ListCtlRec - (not used) */ Word ctlValue; /* ListCtlRec - First member in display */ LongProcPtr ctlProc; /* ListCtlRec - Address of list definition procedure */ LongProcPtr ctlAction; /* ListCtlRec - Address of list action procedure */ LongWord ctlData; /* ListCtlRec - Low = view size, High = total members */ LongWord ctlRefCon; /* ListCtlRec - Not used */ LColorTablePtr ctlColor; /* ListCtlRec - Null for default colors */ VoidProcPtr ctlMemDraw; /* ListCtlRec - Address of routine to draw members */ Word ctlMemHeight; /* ListCtlRec - Member's Height in Pixels */ Word ctlMemSize; /* ListCtlRec - Bytes in member record */ MemRecPtr ctlList; /* ListCtlRec - Adress of first member record in array */ CtlRecHndl ctlListBar; /* ListCtlRec - Handle of list contrlo's scroll bar control */ } ListCtlRec, *ListCtlRecPtr, **ListCtlRecHndl ; typedef struct ListRec { Rect listRect; /* ListRec - Enclosing Rectangle */ Word listSize; /* ListRec - Number of List Members */ Word listView; /* ListRec - Max Viewable members */ Word listType; /* ListRec - Bit Flag */ Word listStart; /* ListRec - First member in view */ CtlRecHndl listCtl; /* ListRec - List control's handle */ VoidProcPtr listDraw; /* ListRec - Adress of Custum drawing routine */ Word listMemHeight; /* ListRec - Height of list members */ Word listMemSize; /* ListRec - Size of Member Records */ MemRecPtr listPointer; /* ListRec - Pointer to first element in MemRec[] */ LongWord listRefCon; /* ListRec - becomes Control's refCon */ BarColorsPtr listScrollClr; /* ListRec - Color table for list's scroll bar */ } ListRec, *ListRecPtr, **ListRecHndl ; extern pascal void ListBootInit() inline(0x011C,dispatcher); /* List */ extern pascal void ListStartup() inline(0x021C,dispatcher); /* List */ extern pascal void ListShutDown() inline(0x031C,dispatcher); /* List */ extern pascal Word ListVersion() inline(0x041C,dispatcher); /* List */ extern pascal void ListReset() inline(0x051C,dispatcher); /* List */ extern pascal Boolean ListStatus() inline(0x061C,dispatcher); /* List */ extern pascal ListCtlRecHndl CreateList() inline(0x091C,dispatcher); /* List */ extern pascal void DrawMember() inline(0x0C1C,dispatcher); /* List */ extern pascal LongProcPtr GetListDefProc() inline(0x0E1C,dispatcher); /* List */ extern pascal void NewList() inline(0x101C,dispatcher); /* List */ extern pascal MemRecPtr NextMember() inline(0x0B1C,dispatcher); /* List */ extern pascal MemRecPtr ResetMember() inline(0x0F1C,dispatcher); /* List */ extern pascal void SelectMember() inline(0x0D1C,dispatcher); /* List */ extern pascal void SortList() inline(0x0A1C,dispatcher); /* List */ extern pascal void ListKey() inline(0x171c,dispatcher); /* added 17-Jan-91 DAL */ #endif \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/MakeFile b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/MakeFile new file mode 100644 index 0000000..665492d --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/MakeFile @@ -0,0 +1 @@ +# # This is the makefile for the AppleShare (logon) CDEV. # # The CDEV file itself is called "AppleShare". Its code is put # in the file AppleShare.Load and then RezIIGS'd with the rest # of the resources into the CDEV. # # 31-May-90 MSD Fixed dependencies to accurately reflect # how files depend on each other (particularly # due to including ".h" files. # # # The CDEV file depends on the code segment, and on the resource # definitions. # AppleShare Ä AppleShare.Load AppleShare.r reziigs AppleShare.r -o AppleShare -t "C7 " -c "pdos" if {AutoDuplicate} == 1 DuplicateIIGS -y -mac AppleShare : End # # AppleShare.Load contains the single code segment used by # the CDEV. It depends on all of the object files. # AppleShare.Load Ä ¶ Appleshare.c.obj ¶ AutoLogon.c.obj ¶ Dialog1.c.obj ¶ Dialog2.c.obj ¶ ASPCalls.c.obj ¶ PasswordDialog.c.obj ¶ ErrorHandling.c.obj ¶ myglobals.c.obj ¶ GSOS.c.obj ¶ VolumePassword.c.obj ¶ DES.aii.obj ¶ AlphaSort.aii.obj ¶ ple.aii.obj ¶ cmail.aii.obj # used to say linkiigs -w -x..., but -w masks out missing-symbol errors! --DAL linkiigs -w -x -lseg:$1000 scott ¶ Appleshare.c.obj ¶ AutoLogon.c.obj ¶ Dialog1.c.obj ¶ Dialog2.c.obj ¶ ASPCalls.c.obj ¶ PasswordDialog.c.obj ¶ ErrorHandling.c.obj ¶ myglobals.c.obj ¶ GSOS.c.obj ¶ VolumePassword.c.obj ¶ DES.aii.obj ¶ AlphaSort.aii.obj ¶ ple.aii.obj ¶ cmail.aii.obj ¶ "{CIIGSLibrary}"CLib(@main) ¶ "{CIIGSLibrary}"CLib(@~globals) ¶ -lib "{CIIGSLibrary}"CLib ¶ -o AppleShare.Load # # Here are the specific dependencies for individual object files. # Each file depends on its source, and any local ".h" file it # includes. No build rules are included. These are only dependencies. # # Note: If the system-supplied include files (i.e. the ones in # MPW's Interface folder) change, the file should be completely # rebuilt. # Appleshare.c.obj Ä ¶ Appleshare.c ¶ TYPES.h ¶ GSOS.h ¶ LIST.h ¶ resmgr.h ¶ newcontrols.h ¶ newinterface.h ¶ ASPDefs.h ¶ myConstants.h ¶ AppleshareDefs.h ASPCalls.c.obj Ä ¶ ASPCalls.c ¶ TYPES.h ¶ LIST.h ¶ myConstants.h ¶ ASPDefs.h AutoLogon.c.obj Ä ¶ AutoLogon.c ¶ TYPES.h ¶ LIST.h ¶ myConstants.h ¶ ASPDefs.h ¶ AutoLogonDefs.h ¶ resmgr.h Dialog1.c.obj Ä ¶ Dialog1.c ¶ TYPES.h ¶ LIST.h ¶ resmgr.h ¶ NewControls.h ¶ NewInterface.h ¶ myConstants.h ¶ ASPDefs.h ¶ Dialog1Defs.h Dialog2.c.obj Ä ¶ Dialog2.c ¶ TYPES.h ¶ LIST.h ¶ GSOS.h ¶ myConstants.h ¶ ASPDefs.h ¶ Dialog2Defs.h ErrorHandling.c.obj Ä ¶ ErrorHandling.c ¶ TYPES.h ¶ myConstants.h GSOS.c.obj Ä ¶ GSOS.c ¶ types.h ¶ gsos.h ¶ myConstants.h myglobals.c.obj Ä ¶ myglobals.c ¶ TYPES.h PasswordDialog.c.obj Ä ¶ PasswordDialog.c ¶ TYPES.h ¶ LIST.h ¶ myConstants.h ¶ ASPDefs.h ¶ PasswordDefs.h VolumePassword.c.obj Ä ¶ VolumePassword.c ¶ TYPES.h ¶ LIST.h ¶ myConstants.h ¶ VolumePasswordDefs.h # # Default rules for building object files from sources # .c.obj Ä .c CIIGS {default}.c .aii.obj Ä .aii AsmIIGS {default}.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/NewControls.h b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/NewControls.h new file mode 100644 index 0000000..54d7f0b --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/NewControls.h @@ -0,0 +1 @@ +/* */ #ifndef __types__ #include #endif #ifndef __quickdraw__ #include #endif #ifndef __misctool__ #include #endif #ifndef __resmgr__ #include #endif #ifndef __newcontrols__ #define __newcontrols__ #define MachineCDEV 1 #define BootCDEV 2 #define ShutDownCDEV 3 #define InitCDEV 4 #define CloseCDEV 5 #define EventsCDEV 6 #define CreateCDEV 7 #define AboutCDEV 8 #define RectCDEV 9 #define HitCDEV 10 #define RunCDEV 11 #define reserved1 12 #define reserved2 13 #define reserved3 14 #define NeverUsed1 15 #define NeverUsed2 16 #define wantMachine 1 #define wantBoot 2 #define wantShutDown 4 #define wantInit 8 #define wantClose 16 #define wantEvents 32 #define wantCreate 64 #define wantAbout 128 #define wantRect 256 #define wantHit 512 #define wantRun 1024 #define wantReserved1 2048 #define wantReserved2 4096 #define wantReserved3 8192 #define updateSSfromBRAM 16384 #define CanBeUnActive 32768 #define CDEV_ResType 0x8018 #define FLAG_ResType 0x8019 #define TwoRect_ResType 0x801a #define CDEV_FileType 0xc7 #define CDEV_AuxType 0 #define CDEVDATA_FileType 0x00 #define CDEVDATA_AuxType 0x00 #define fCtlActive 0x8000 #define fCtlCanBeActive 0x4000 typedef String(8) Str8; typedef String(15) Str15; typedef struct NewCtlRec { struct NewCtlRec **ctlNext; /* CtlRec - Handle of next control. */ GrafPortPtr ctlOwner; /* CtlRec - Pointer to control's window. */ Rect ctlRect; /* CtlRec - Enclosing rectangle. */ Byte ctlFlag; /* CtlRec - Bit flags. */ Byte ctlHilite; /* CtlRec - Highlighted part. */ Integer ctlValue; /* CtlRec - Control's value. */ LongProcPtr ctlProc; /* CtlRec - Control's definition procedure. */ LongProcPtr ctlAction; /* CtlRec - Control's action procedure. */ Longint ctlData; /* CtlRec - Reserved for CtrlProc's use. */ Longint ctlRefCon; /* CtlRec - Reserved for application's use. */ Pointer ctlColor; /* CtlRec - Pointer to appropriate color table. */ char ctlReserved[0x10]; Longint ctlID; integer ctlMoreFlags; integer ctlVersion; } NewCtlRec, *NewCtlRecPtr, **NewCtlRecHndl ; typedef struct FlagsRec { Integer CDEVFlags; /* messages we need to respond to*/ byte Enabled; /* are we enabled?*/ byte Version; /* version # of the control panel it works with*/ byte Machine; /* what machine do we need to be run*/ byte System; /* what system do we need to be run*/ Rect DataRect; /* really the width & height; top, left = 0*/ Str15 name; /* name of the CDEV, upper/lower case*/ Str32 author; /* name of the author */ Str8 versStr; /* version of the CDEV */ } FlagsRec,*FlagsPtr,**FlagsHdl; typedef struct IconRec { Integer kind; /* always -1 = color*/ Integer size; /* always 280*/ Integer height;/* always 20*/ Integer width; /* always 28*/ char image[20][14]; char mask[20][14]; } IconRec, *IconPtr, **IconHdl; typedef struct CDEV { Str255 path; /* full path, including file name of the CDEV*/ FlagsRec flags; /* flags from above*/ IconRec icon; /* icon from above*/ integer reserved[5]; } CDEV, *CDEVFake; typedef struct CDEVHeader { Integer identifier; /* identifier, 'DL'*/ Integer version; /* should be 1*/ integer Count; /* # of CDEV's below*/ longint reserved[5]; /* reserved for future use*/ } CDEVHeader; typedef struct CDEVRec { CDEVHeader header; /* header from above*/ CDEV CDEVS[1]; /* the CDEV's*/ } CDEVRec,*CDEVPtr,**CDEVHdl; typedef struct DITLRec { longint theRefs[2]; } DITLRec, *DITLPtr, **DITLHdl; typedef struct editLineCtl { integer pCount; /* in this case - 7*/ longint ctlID; /* 1,2,3...*/ Rect ctlRect; /* the rect*/ longint ctlProcRef; /* $80000000*/ integer ctlFlag;/* 2*/ integer ctlMoreFlags;/* 2*/ longint ctlRefCon; /* 0 */ integer ctlMaxSize; longint ctlDefaultRef; integer ctlTextSize; } editLineCtl, *editLinePtr, **editLineHndl; typedef struct listCtlRec { integer pCount; longint ID; Rect ctlRect; longint ctlProcRef; integer ctlFlag; integer ctlMoreFlags; longint ctlRefCon; integer ctlListSize; integer ctlListView; integer ctlListType; integer ctlListStart; longint ctlListDraw; integer ctlListMemHeight; integer ctlListMemSize; longint ctlListRef; longint ctlColorRef; } listCtlRec, *listCtlPtr, **listCtlHndl; typedef struct statTextCtl { integer pCount; longint ID; Rect ctlRect; longint ctlProcRef; integer ctlFlag; integer ctlMoreFlags; longint ctlRefCon; longint ctlTextRef; integer ctlTextSize; } statTextCtl, *statTextCtlPtr, **statTextCtlHndl; #endif \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/NewInterface.h b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/NewInterface.h new file mode 100644 index 0000000..0dfda5a --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/NewInterface.h @@ -0,0 +1 @@ +/* */ #ifndef __quickdraw__ #include #endif #ifndef __event__ #include #endif #ifndef __newinterface__ #define __newinterface__ typedef struct NEWEventRecord { EventRecord oldRec; longint wmLastClick; integer wmclickcount; longint wmtaskData2; longint wmtaskData3; longint wmtaskData4; } NEWEventRecord; typedef struct simpleButtonRec { integer pCount; /* in this case - 7*/ longint ctlID; /* 1,2,3...*/ Rect ctlRect; /* the rect*/ longint ctlProcRef; /* $80000000*/ integer ctlFlag;/* 2*/ integer ctlMoreFlags;/* 2*/ longint ctlRefCon; /* 0 */ longint TitleRef; /* resource id of string*/ longint colorRef; } simpleButtonRec, *simpleButtonPtr, **simpleButtonHdl; typedef struct RadioButtonRec { integer pCount; /* in this case - 7*/ longint ctlID; /* 1,2,3...*/ Rect ctlRect; /* the rect*/ longint ctlProcRef; /* $80000000*/ integer ctlFlag;/* 2*/ integer ctlMoreFlags;/* 2*/ longint ctlRefCon; /* 0 */ longint TitleRef; /* resource id of string*/ Integer InitialValue; /* inital value*/ longint colorRef; } RadioButtonRec, *RadioButtonPtr, **RadioButtonHdl; typedef struct CheckButtonRec { integer pCount; /* in this case - 7*/ longint ctlID; /* 1,2,3...*/ Rect ctlRect; /* the rect*/ longint ctlProcRef; /* $80000000*/ integer ctlFlag;/* 2*/ integer ctlMoreFlags;/* 2*/ longint ctlRefCon; /* 0 */ longint TitleRef; /* resource id of string*/ Integer InitialValue; /* inital value*/ longint colorRef; } CheckButtonRec, *CheckButtonPtr, **CheckButtonHdl; extern pascal void ResBootInit() inline(0x011e,dispatcher); extern pascal Ptr LGetPathName2() inline(0x2211,dispatcher); #endif \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/PasswordDefs.h b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/PasswordDefs.h new file mode 100644 index 0000000..e405816 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/PasswordDefs.h @@ -0,0 +1 @@ +/* */ char OKTxt[] = "\pOK"; /* had 2 leading blanks, 18-Jan-91 DAL */ char CancelTxt[] = "\pCancel"; /* had a leading blank, 18-Jan-91 DAL */ char OldPasswordTxt[] = "\pOld Password:"; char NewPasswordTxt[] = "\pNew Password:"; char OldPassText[9]; char OldPassBuf[9]; char NewPassBuf[9]; char ConfirmMsg[] = "\pPlease reenter your\r\ new password for\r\ confirmation."; char NotTheSame[] = "\pThe confirmation password was\r\ not the same as the first.\r\ Please start over."; GrafPortPtr Dialog3; ItemTemplate OK_Btn = { ok, /* ItemTemplate - itemID */ 50,155,63,235, /* ItemTemplate - itemRect */ buttonItem, /* ItemTemplate - itemType */ OKTxt, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ boldButton, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; ItemTemplate CnclBtn = { cancel, /* ItemTemplate - itemID */ 50,35,63,115, /* ItemTemplate - itemRect */ buttonItem, /* ItemTemplate - itemType */ CancelTxt, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ simpRound, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; ItemTemplate OldPassEditBox = { Id3, /* ItemTemplate - itemID */ 7,140,21,220, /* ItemTemplate - itemRect */ editLine, /* ItemTemplate - itemType */ OldPassBuf, /* ItemTemplate - itemDescr */ 8+EditBoxPwrdFlag, /* ItemTemplate - itemValue */ 0, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; ItemTemplate NewPassEditBox = { Id4, /* ItemTemplate - itemID */ 27,140,41,220, /* ItemTemplate - itemRect */ editLine, /* ItemTemplate - itemType */ NewPassBuf, /* ItemTemplate - itemDescr */ 8+EditBoxPwrdFlag, /* ItemTemplate - itemValue */ 0, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; ItemTemplate OldText = { Id5, /* ItemTemplate - itemID */ 10,20,20,135, /* ItemTemplate - itemRect */ statText, /* ItemTemplate - itemType */ OldPasswordTxt, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ 0, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; ItemTemplate NewText = { Id6, /* ItemTemplate - itemID */ 30,20,40,135, /* ItemTemplate - itemRect */ statText, /* ItemTemplate - itemType */ NewPasswordTxt, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ 0, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; ItemTemplate Old_PassText = { Id7, /* ItemTemplate - itemID */ 10,140,24,220, /* ItemTemplate - itemRect */ statText, /* ItemTemplate - itemType */ OldPassText, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ 0, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; DialogTemplate MyDialog3 = { 30,30,100,300, /* DialogTemplate - dtBoundsRect */ TRUE, /* DialogTemplate - dtVisible */ nil, /* DialogTemplate - dtRefCon */ &OK_Btn, &CnclBtn, &OldPassEditBox, &NewPassEditBox, &OldText, &NewText, nil /* DialogTemplate - Null terminated array */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/PasswordDialog.c b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/PasswordDialog.c new file mode 100644 index 0000000..8d50384 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/PasswordDialog.c @@ -0,0 +1 @@ +/* File: PasswordDialog.c By : Scott Kuechle Copyright: ©1988-1989 by Apple Computer Inc. All rights reserved. #} */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ASPDefs.h" #include "PasswordDefs.h" extern DES_Pckt DESPckt; extern char DES_Result[8]; extern Word PwrdWasChanged; extern myMemRecPtr SelectedMember; extern Word LogInAsGuest; pascal Word my_FilterProc(); /*byte*/Word done2; char NewPasswordBuf[9],OldPasswordBuf[9],ConfirmNewPwrd[9]; char work1[9],work2[9]; pascal Word my_FilterProc3(theDialog,theEvent,theItem) GrafPortPtr theDialog; EventRecord *theEvent; long *theItem; { CtlRecHndl tHandle,EditBoxHndl; Word PartCode; int i; int dbr; int flag; Pointer p; dbr = SaveDB(); /* set up event type */ /* currEvent = (*theEvent).what; */ /* set up which key was hit */ p = (char *)&theEvent->message; /* do this to find ASCII code of key hit */ /* keyHit = p[0]; */ /* check if <.> keys or were hit - if so, perform same action as cancel button */ if ((*theEvent).what == keyDownEvt) { if (( ((*theEvent).modifiers & appleKey) && (p[0] == '.') ) || (p[0] == 0x1b)) { /* tell autologon code that cancel button was hit */ /* CancelButtonHit = false; */ /* close this dialog window and go back to control panel window */ /* CloseDialog(Dialog1); */ CloseDialog(Dialog3); done2 = true; RestoreDB(dbr); return ((Word)true); } } RestoreDB(dbr); return ((Word)false); } DoPwrdEncryption() { /* encrypt old password with new password as the key */ DESPckt.password = OldPasswordBuf; DESPckt.randnum = NewPasswordBuf; DESPckt.result = DES_Result; asm { ldx #DESPckt ldy #^DESPckt jsl DES } CopyPassword(work2,DES_Result,8); /* encrypt new password with old password as the key */ DESPckt.password = NewPasswordBuf; DESPckt.randnum = OldPasswordBuf; DESPckt.result = DES_Result; asm { ldx #DESPckt ldy #^DESPckt jsl DES } CopyPassword(work1,DES_Result,8); } ReDisplayBothEditBoxes() { OldPassBuf[0] = 0; /* remove text display of 'old password' */ RemoveDItem(Dialog3,Id7); /* re-create 'old password' edit box */ GetNewDItem(Dialog3,&OldPassEditBox); ShowDItem(Dialog3,Id3); /* show 'old password' edit box */ SetIText(Dialog3,Id4,"\0"); /* show 'new password' edit box */ } int Do_Pwrd_Dialog(UAM_Str,UserName,RandExOK,Already_Logged_In) char *UAM_Str; char *UserName; Byte RandExOK,Already_Logged_In; { Word itemHit; byte /* done2,*/ Ask_For_Confirmation; int err,err2,i,successful; Word screen; #undef dtItemListLength #define dtItemListLength 7 done2 = false; Ask_For_Confirmation = false; successful = false; /* re-display the arrow cursor */ InitCursor(); screen = (GetMasterSCB() & 0x80); if (screen) MyDialog3.dtBoundsRect.h1 = 185; else MyDialog3.dtBoundsRect.h1 = 25; MyDialog3.dtBoundsRect.h2 = MyDialog3.dtBoundsRect.h1 + 270; Dialog3 = GetNewModalDialog(&MyDialog3); do { itemHit = ModalDialog((WordProcPtr)((long)my_FilterProc3 | 0xC0000000)); if (!done2) switch (itemHit) { case Id1: /* OK button */ if (Ask_For_Confirmation) { GetIText(Dialog3,Id4,ConfirmNewPwrd); /* get confirmation of new password */ Pstrcpy(work1,NewPasswordBuf); Pstrcpy(work2,ConfirmNewPwrd); p2cstr(work1); p2cstr(work2); /* did user correctly re-type the new password ? */ if (strcmp(work1,work2)==0) { p2cstr(NewPasswordBuf); p2cstr(OldPasswordBuf); if (!Already_Logged_In) /* must log in before we can change the password */ { LogInAsGuest = false; /* must log in as a registered user */ err = Do_Login(UserName,OldPasswordBuf); } if (!err || Already_Logged_In) { Pad_With_Nulls(OldPasswordBuf,8); Pad_With_Nulls(NewPasswordBuf,8); if (RandExOK) { /* passwords for the FPChangePassword() call below must be encrypted before they are placed in the parameter list for RandEx method. */ DoPwrdEncryption(); /* encrypt both old and new passwords */ err = cFPChangePassword(UAM_Str,UserName,work1,work2); } else /* using Clear Text method */ { err = cFPChangePassword(UAM_Str,UserName,nil,nil); } if (err) { switch(err) { case 0x61ec: Show_Alert_Message(Stop_Alert,"\pSorry, your old password\ris incorrect. Please try\ragain."); break; case 0x78ec: default: Show_Alert_Message(Note_Alert,"\pYour password could not be\rchanged. Please try again\ror see your administrator."); break; } /* if we were not previously logged on to this server, then we had to logon before making the password change - but since the password change failed we must now logout. */ if (!Already_Logged_In) { err2 = cFILogout(); } } } else { /* check for 'User not authorized' error - means old password was bad */ if (err == 0x0a15) Show_Alert_Message(Stop_Alert,"\pSorry, your old password\ris incorrect. Please try\ragain."); else Show_PFI_Error(err); } if (!err) /* successfull change? */ { /* set flag we use with the message center - need to know if the password has been changed on us */ PwrdWasChanged = true; done2 = true; /* quit the dialog */ successful = true; /* set appropriate return flag */ CloseDialog(Dialog3); } else /* something happened, so let them try again */ { Ask_For_Confirmation = false; /* re-create 'old password' edit box */ ReDisplayBothEditBoxes(); } } else /* didn't re-enter new password correctly */ { Show_Alert_Message(Stop_Alert,NotTheSame); Ask_For_Confirmation = false; /* re-create 'old password' edit box */ ReDisplayBothEditBoxes(); } } else { Ask_For_Confirmation = true; GetIText(Dialog3,Id4,NewPasswordBuf); /* save new password here */ GetIText(Dialog3,Id3,OldPasswordBuf); /* save old password here */ Show_Alert_Message(Note_Alert,ConfirmMsg); RemoveDItem(Dialog3,Id3); /* remove old password edit box from dialog */ /* copy password for display--but this needs to be encrpypted */ Pstrcpy(OldPassText,OldPasswordBuf); /* print old password as encrypted (asterisks) */ for (i=1; i<=OldPassText[0]; ++i) OldPassText[i] = /* '*' */ '×'; GetNewDItem(Dialog3,&Old_PassText); ShowDItem(Dialog3,Id7); SetIText(Dialog3,Id4,"\0"); } break; case Id2: /* Cancel button */ CloseDialog(Dialog3); done2 = true; break; } } while (!done2); return (successful); } \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/RESMGR.H b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/RESMGR.H new file mode 100644 index 0000000..a35ced0 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/RESMGR.H @@ -0,0 +1 @@ +/* My implementation of Darryl Lovato's pascal implementation of the resource manager interface */ #ifndef __quickdraw__ #include #endif #ifndef __resmgr__ #define __resmgr__ #define rIcon 0x8001 #define rPicture 0x8002 #define rControlList 0x8003 #define rControlTemplate 0x8004 #define rWindow 0x8005 #define rString 0x8006 #define rStringList 0x8007 #define rMenuBar 0x8008 #define rMenu 0x8009 #define rMenuItem 0x800A #define rTextForLETextbox2 0x800B #define rCtlDefProc 0x800C #define rCtlColorTbl 0x800D #define rCDEVCode 0x8018 #define rCDEVFlags 0x8019 #define rTwoRects 0x801a #define login 1 #define logout 2 typedef struct ResourceRec { int resType; Longint resID; } ResourceRec; extern pascal void ResBootInit() inline(0x011e,dispatcher); extern pascal void ResStartup() inline(0x021e,dispatcher); extern pascal void ResShutdown() inline(0x031e,dispatcher); extern pascal Integer ResVersion() inline(0x041e,dispatcher); extern pascal void ResReset() inline(0x051e,dispatcher); extern pascal boolean ResStatus() inline(0x061e,dispatcher); extern pascal void CreateResFile() inline(0x091e,dispatcher); extern pascal Integer OpenResFile() inline(0x0a1e,dispatcher); extern pascal void CloseResFile() inline(0x0b1e,dispatcher); extern pascal void AddRes() inline(0x0c1e,dispatcher); extern pascal void UpdateResFile() inline(0x0d1e,dispatcher); extern pascal Handle LoadRes() inline(0x0e1e,dispatcher); extern pascal void RemoveRes() inline(0x0f1e,dispatcher); extern pascal void MarkResChange() inline(0x101e,dispatcher); extern pascal void SetCurResFile() inline(0x111e,dispatcher); extern pascal Integer GetCurResFile() inline(0x121e,dispatcher); extern pascal void SetCurResApp() inline(0x131e,dispatcher); extern pascal Integer GetCurResApp() inline(0x141e,dispatcher); extern pascal Integer HomeResFile() inline(0x151e,dispatcher); extern pascal void WriteRes() inline(0x161e,dispatcher); extern pascal void ReleaseRes() inline(0x171e,dispatcher); extern pascal void DetatchRes() inline(0x181e,dispatcher); extern pascal Longint UniqueResID() inline(0x191e,dispatcher); extern pascal void SetResID() inline(0x1a1e,dispatcher); extern pascal Integer GetResAttr() inline(0x1b1e,dispatcher); extern pascal void SetResAttr() inline(0x1c1e,dispatcher); extern pascal Longint GetResSize() inline(0x1d1e,dispatcher); extern pascal void MatchResHandle() inline(0x1e1e,dispatcher); extern pascal Integer GetOpenFileRefNum() inline(0x1f1e,dispatcher); extern pascal Integer CountTypes() inline(0x201e,dispatcher); extern pascal integer GetIndType() inline(0x211e,dispatcher); extern pascal Longint CountRes() inline(0x221e,dispatcher); extern pascal Handle GetIndRes() inline(0x231e,dispatcher); extern pascal void SetResLoad() inline(0x241e,dispatcher); extern pascal void SetResFileDepth() inline(0x251e,dispatcher); extern pascal Handle GetMapHandle() inline(0x261e,dispatcher); extern pascal void ResConverter() inline(0x281e,dispatcher); #endif \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/TYPES.H b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/TYPES.H new file mode 100644 index 0000000..bf6a168 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/TYPES.H @@ -0,0 +1 @@ +/******************************************** ; File: Types.h ; ; ; Copyright Apple Computer, Inc. 1986, 1987, 1988 ; All Rights Reserved ; ********************************************/ #ifndef __types__ #define __types__ extern int _ownerid; extern int _toolErr; #ifndef noError #define noError 0x0000 #endif #ifndef nil #define nil 0L #endif #ifndef NULL #define NULL 0L #endif #ifndef NIL #define NIL 0L #endif /* the tool locator dispatch location */ #define dispatcher 0xE10000 /* return type definitions */ typedef unsigned int Boolean, boolean, BOOLEAN ; #define FALSE 0 #define TRUE 1 #define true TRUE #define false FALSE typedef unsigned char Byte; typedef unsigned char byte; typedef unsigned int word; typedef unsigned int Word; typedef int integer; typedef int Integer; typedef long longint; typedef long Longint; typedef long Long; typedef unsigned long longword; typedef unsigned long Longword; typedef unsigned long LongWord; typedef unsigned long Dblword; /* retained for back compatibility */ typedef unsigned long DblWord; /* retained for back compatibility */ typedef char *ptr; typedef char *Ptr; typedef char *pointer; typedef char *Pointer; typedef ptr *handle; typedef ptr *Handle; typedef long Fixed; typedef long Frac; typedef short OSErr; typedef extended *ExtendPtr; typedef long (*ProcPtr)(); /* retained for back compatibility */ typedef pascal void (*VoidProcPtr)(); typedef pascal Word (*WordProcPtr)(); typedef pascal LongWord (*LongProcPtr)(); typedef struct Rect { Integer v1; /* Rect - */ Integer h1; /* Rect - */ Integer v2; /* Rect - */ Integer h2; /* Rect - */ } Rect, *RectPtr, **RectHndl; typedef struct Point { Integer v; /* Point - */ Integer h; /* Point - */ } Point, *PointPtr, **PointHndl; typedef struct TimeRec { Byte second; /* TimeRec - */ Byte minute; /* TimeRec - */ Byte hour; /* TimeRec - */ Byte year; /* TimeRec - */ Byte day; /* TimeRec - */ Byte month; /* TimeRec - */ Byte extra; /* TimeRec - */ Byte weekDay; /* TimeRec - */ } TimeRec, *TimeRecPtr, **TimeRecHndl ; #define String(size) struct { unsigned char length; unsigned char text[size]; } typedef String(255) Str255 , *StringPtr, **StringHandle; #endif \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/VolumePassword.c b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/VolumePassword.c new file mode 100644 index 0000000..ac5b147 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/VolumePassword.c @@ -0,0 +1 @@ +/* File: VolumePassword.c By : Scott Kuechle Copyright: ©1988-1989 by Apple Computer Inc. All rights reserved. #} */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "myConstants.h" #include "VolumePasswordDefs.h" char VolPassBuf[9]; int Do_Vol_Pwrd_Dialog(MountFlag,VolName,VolID,SlotDrive) char MountFlag; char *VolName; int *VolID; char *SlotDrive; { Word itemHit; byte done; int err,i; Word screen; done = false; ParamText(nil,VolName,nil,nil); /* re-display the arrow cursor */ InitCursor(); screen = (GetMasterSCB() & 0x80); if (screen) MyDialog4.dtBoundsRect.h1 = 210; else MyDialog4.dtBoundsRect.h1 = 50; MyDialog4.dtBoundsRect.h2 = MyDialog4.dtBoundsRect.h1 + 220; Dialog4 = GetNewModalDialog(&MyDialog4); do { itemHit = ModalDialog(0x40000000); switch (itemHit) { case ok: /* OK button */ GetIText(Dialog4,3,VolPassBuf); /* get password user has typed */ p2cstr(VolPassBuf); /* need password to be a C-string for login */ Pad_With_Nulls(VolPassBuf,8); /* pad it with null characters */ /* set bit indicating volume password pointer is valid */ MountFlag = MountFlag | VolPwrdBit; err = cFIMountVol(MountFlag,VolName,VolPassBuf,VolID,SlotDrive,0); if (err) Show_PFI_Error(err); else done = true; break; case cancel: /* Cancel button */ err = true; done = true; break; } } while (!done); CloseDialog(Dialog4); return (err); } \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/VolumePasswordDefs.h b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/VolumePasswordDefs.h new file mode 100644 index 0000000..d3177da --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/VolumePasswordDefs.h @@ -0,0 +1 @@ +/* File: VolumePasswordDefs.h By : Scott Kuechle Copyright: ©1988-1989 by Apple Computer Inc. All rights reserved. #} */ char vpOKTxt[] = "\pOK"; /* had 2 leading blanks, 18-Jan-91 DAL */ char vpCancelTxt[] = "\pCancel"; /* had a leading blank, 18-Jan-91 DAL */ char HelpTxt[] = "\pEnter the Password for this volume:"; char PwrdTxt[] = "\pPassword:"; char VolTxt[] = "\pÒ^1Ó"; char PassBuf[9]; GrafPortPtr Dialog4; ItemTemplate vpOK_Btn = { ok, /* ItemTemplate - itemID */ 75,165,88,245, /* ItemTemplate - itemRect */ buttonItem, /* ItemTemplate - itemType */ vpOKTxt, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ boldButton, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; ItemTemplate vpCnclBtn = { cancel, /* ItemTemplate - itemID */ 75,45,88,125, /* ItemTemplate - itemRect */ buttonItem, /* ItemTemplate - itemType */ vpCancelTxt, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ simpRound, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; ItemTemplate vpPassEditBox = { 3, /* ItemTemplate - itemID */ 42,140,56,220, /* ItemTemplate - itemRect */ editLine, /* ItemTemplate - itemType */ PassBuf, /* ItemTemplate - itemDescr */ 8+EditBoxPwrdFlag, /* ItemTemplate - itemValue */ 0, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; ItemTemplate vpVolText = { 4, /* ItemTemplate - itemID */ 15,45,25,400, /* ItemTemplate - itemRect */ statText, /* ItemTemplate - itemType */ VolTxt, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ 0, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; ItemTemplate vpHelpText = { 5, /* ItemTemplate - itemID */ 27,45,37,400, /* ItemTemplate - itemRect */ statText, /* ItemTemplate - itemType */ HelpTxt, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ 0, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; ItemTemplate vpPwrdText = { 6, /* ItemTemplate - itemID */ 44,62,58,128, /* ItemTemplate - itemRect */ statText, /* ItemTemplate - itemType */ PwrdTxt, /* ItemTemplate - itemDescr */ 0, /* ItemTemplate - itemValue */ 0, /* ItemTemplate - itemFlag */ nil /* pointer to appropreate ctl color table */ }; DialogTemplate MyDialog4 = { 30,30,130,350, /* DialogTemplate - dtBoundsRect */ TRUE, /* DialogTemplate - dtVisible */ nil, /* DialogTemplate - dtRefCon */ &vpOK_Btn, &vpCnclBtn, &vpPassEditBox, &vpVolText, &vpHelpText, &vpPwrdText, nil /* DialogTemplate - Null terminated array */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/cmail.aii b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/cmail.aii new file mode 100644 index 0000000..ada4d2c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/cmail.aii @@ -0,0 +1 @@ +;;; cmail - check for mail folder on AppleShare. ; ; Michael V. Stein 03/21/90. ; ; © Apple, 1990. blanks off case on ;; equates. ;; imported addresses. ;; include files. include '::commonmacros.h' include 'e16.dialog' include 'm16.dialog' include 'm16.gsos' include 'm16.misctool' include 'm16.qdaux' include 'm16.quickdraw' include 'm16.window' ;; macros. ;; main program. main proc ;; cmail - check for mail folder on AppleShare. ; ; entry user has logged into their AppleShare account ; stack contains a ptr to the pathname of the mail directory. ; ; exit If there are files in the mail folder, a note alert will come ; up and tell them this information. ;; exported addresses. export cmail cmail phb phk plb tsc lda 1+3+1,s get low word of ptr sta open_pblk+4 lo ptr to pathname to check lda 1+3+1+2,s get hi word of ptr sta open_pblk+4+2 hi ptr to pathname to check _OpenGS open_pblk bcs cmail1 if can't open file lda open_pblk+2 sta dir_pblk+2 refnum of open file _GetDirEntryGS dir_pblk php save error code _CloseGS close_pblk close the file plp bcs cmail1 if error occurred lda dir_pblk+$e get # of entries beq cmail1 if nothing in folder jsr daw display alert window cmail1 plb tsc lda 1,s sta 1+4,s move low 16 bits up lda 1+1,s sta 1+4+1,s move high 16 bits up pla pla remove parameter rtl ; data used here. ; parameter block to get the number of entries in the directory. close_pblk dc.w 1 PCount dc.w 0 refnum dir_pblk dc.w 6 PCount dc.w 0 refnum dc.w 0 flags dc.w 0 base dc.w 0 displacement dc.l dirbuff ptr to buffer to hold name dc.w 0 entrynum dirbuff ds.b 35 hold name returned by call aaf1 sta open_pblk+4 lo ptr to pathname stx open_pblk+6 hi ptr to pathname open_pblk dc.w 2 PCount dc.w 0 refnum dc.l 0 pathname ;; daw - display alert window. ; ; entry none. ; ; exit alert is displayed. daw ldx #(320-daww)/2 pha space for result _GetMasterSCB pla xba rol a bcc daw1 if 320 mode ldx #(640-daww)/2 daw1 stx dawa+1+2 left x txa clc adc #daww sta dawa+1+6 right x *** added 28-May-91 DAL pha _QDVersion pla and #$0fff cmp #$0307 bcc @skipbeep *** end of 28-May-91 DAL *** added 9-Mar-91 DAL pea $C100 ;"You have mail" SysBeep2 code = $0100; defer to GetNextEvent, silent ldx #$3803 jsl $e10000 ; _SysBeep2 *** end of 9-Mar-91 DAL @skipbeep pha space for result pushw #0 flags pha pha subsitution array - not used pushl #dawa reference to string _AlertWindow pla get item hit off of the stack rts daww equ 300 width of window dawa dc.b '0' dc.w 60,0,120,0 dc.b '3' dc.b '/You have mail waiting./^#0',0 endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/myConstants.h b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/myConstants.h new file mode 100644 index 0000000..5a2ac90 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/myConstants.h @@ -0,0 +1 @@ +/* File: myConstants.h By : Scott Kuechle Copyright: ©1988-1989 by Apple Computer Inc. All rights reserved. #} */ /* 22-May-91 DAL Changed MaxSrvrNames from 30 to 100. */ #define MyItemID 0x0001 /* default item (first in list) is set to this value */ #define Id1 MyItemID #define Id2 MyItemID + 1 #define Id3 MyItemID + 2 #define Id4 MyItemID + 3 #define Id5 MyItemID + 4 #define Id6 MyItemID + 5 #define Id7 MyItemID + 6 #define Id8 MyItemID + 7 #define Id9 MyItemID + 8 #define Id10 MyItemID + 9 #define Id11 MyItemID + 10 #define Id12 MyItemID + 11 #define Id13 MyItemID + 12 #define Id14 MyItemID + 13 #define Id15 MyItemID + 14 #define MaxVols 15 /* maximum number of volumes per server? */ #define MaxVolLength 27+1 /* volume name can be 27 characters long + 1 length char for pascal strings */ /* #define MaxSrvrNames 30 /* maximum number of file server names we can hold */ #define MaxSrvrNames 100 /* maximum number of file server names we can hold -- changed to 100 22-May-91 DAL */ #define MaxSrvrView 4 /* how many names in our list can be seen at once */ #define MaxZoneNames 255 /* max number of zones we can store */ #define MaxZoneView 4 /* max number of zones that can be displayed at once */ #define MaxZoneLength 33 #define NameLength 33 #define MaxOnline 15 #define BlockSize MaxZoneNames*(NameLength+1) #define MaxNameLen 31 #define Stop_Alert 1 #define Note_Alert 2 #define Caution_Alert 3 #define LeftEdge 10 #define RightEdge 190 #define FSListID 1 #define ZoneListID 2 #define ButtonID 3 #define UserNameBoxID 4 #define MySrvrMessID 0x44 #define MyVolMessID 0x46 #define ListSize 6 #define ListBugFixBit 4 #define EditBoxPwrdFlag 0x8000 #define AppleTalkFile 0xe2 #define AShareFST 0x0d #define datafork 0 #define UserNameLen 32 #define UserVolBitMask 0xfe #define UserVolBit 0x01 #define MountBit 0x80 #define PwrdFlag 0x80 #define AutoLogonPwrdFlag 0x8000 #define VolPwrdBit 0x40 /* for use with the PFI MountVol call */ #define myUserVolBitFlag 0x4000 /* used with boot time logon code to identify user volumes */ #define Set 0x80 /* for use with PFI & AFP calls */ #define Get 0x00 #define ctlVisible 0 /* make the control visible */ #define LoginContinue 0x0a04 #define ThisUserBit 0x01 #define UserIDBit 0x01 #define ChangePasswordBit 0x02 typedef struct MySRefNum { char SRefNum; } MySRefNum,*MySRefNumPtr; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/myglobals.c b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/myglobals.c new file mode 100644 index 0000000..039375e --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/myglobals.c @@ -0,0 +1 @@ +/* */ #include integer qFlag = 0; integer _toolErr; integer _argc; long _argv; integer _retCode; long qPath; long _cmdLine; long _1p; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/ple.aii b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/ple.aii new file mode 100644 index 0000000..06ddd6c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/LogonCDEV/ple.aii @@ -0,0 +1 @@ +;;; ple - print line with ellipses. ; ; Michael V. Stein 03/11/90. ; ; © Apple, 1990. blanks off case on ;; equates. recty0 equ 0 rectangle offsets rectx0 equ 2 recty1 equ 4 rectx1 equ 6 ;; imported addresses. ;; include files. include '::commonmacros.h' include '::dp.h' include 'e16.quickdraw' include 'm16.quickdraw' include 'm16.util2' ; include 'netprinter.h' ;; macros. ;; main program. main proc ;; exported addresses. export ple memrectptr equ dpsize+1+3+4 pointer to member's record that needs to be displayed rectptr equ dpsize+1+3+4+4 pointer to rect enclosing member ple tsc sec sbc #dpsize make room on stack for new direct page tcs phd save the current direct page tcd new direct page phb save callers data bank phk plb make sure our bank is set pushl #plec record to hold pen state _GetPenState pha _GetTexTMode save for later pushw #modeCopy _SetTextMode pushl rectptr _EraseRect clear the rectangle enclosing text pha pushl #pleb '...' _StringWidth pla lsr a sta w1 1/2 the length of the three dots ldy #rectx0 lda [rectptr],y clc adc #10 pha x loc of line ldy #recty1 lda [rectptr],y dea dea pha y loc of line _MoveTo ldy #rectx1 lda [rectptr],y ldy #rectx0 sec sbc [rectptr],y sbc #10 (c) set, left and right margin of 10 sta l3 save total width allowed lsr a sec sbc w1 1/2 the width of the three dots sta l3+2 save breaking point in line ldy #2 lda [memrectptr],y sta l2+2 lda [memrectptr] [a,x] = handle to string sta l2 lda [l2] sta l1 lda [l2],y sta l1+2 pha space for result pushl l2 ptr to string _StringWidth pla cmp l3 bcc ple1 if fits bne ple2 if doesn't fit ple1 jmp ple10 it fits, so just go draw it ple2 ldy #1 stz w2 current width ple3 sty w1 current character offset lda [l2],y get next char and #$ff pha pha char to check _CharWidth pla clc adc w2 sta w2 cmp l3+2 bcs ple4 if past the middle ldy w1 iny bra ple3 check next character ; Now start from right edge and see what can fit in string. ple4 lda [l2] and #$ff sta w6 length of string tay char to start looking at stz w3 width from right edge ple5 sty w4 lda [l2],y and #$ff pha space for result pha char to check _CharWidth pla clc adc w3 sta w3 width so far on the right ldy w4 cmp l3+2 beq ple7 if just fits bcs ple6 if past the middle dey bra ple5 check if next char to the left can fit ple6 inc w4 starting char after seperator ; create a string to print 'aaaaa...bbbbb'. ple7 ldy #0 ple8 lda [l2],y sta plea,y move these characters over iny iny cpy w1 bcc ple8 if more to copy from left edge ldx w1 lda pleb+1 sta plea,x put in the first space and the ellipses inx inx lda pleb+1+2 sta plea,x add in last part of seperator inx offset to store right edge ldy w4 place to start moving ple9 lda [l2],y get next character sta plea,x place into new string inx inx iny iny ;cpx w6 cpy w6 changed 2/21/91 by Monte Benaresh bcc ple9 if more to copy beq ple9 if more to copy shortmx lda w6 sec sbc w4 # of chars from right side -1 adc #3-1 (c) set , length( middle seperator) -1 adc w1 (c) clear, amt from left side +1 sta plea actual length of new string longmx pushl #plea bra ple11 ple10 pushl l2 ple11 _DrawString draw the string ldy #4 lda [memrectptr],y and #$80 beq ple12 if not selected pushl rectptr _InvertRect mark it as selected ple12 pushl #plec _SetPenState restore orginal penstate _SetTextMode restore original text mode plb restore orginal data bank pld restore original direct page lda dpsize+2,s sta dpsize+15-1,s move upper 16 bits to top of stack lda dpsize+1,s sta dpsize+15-2,s move lower 16 bits to top of stack tsc clc adc #dpsize+15-3 tcs return address is now on top of stack rtl ; data used here. ;plea ds.b namelen+5 leave some slop space plea ds.b 33+5 pleb dc.b 3,'...' plec ds.b pnStateSize hold pen state endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/MakeFile b/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/MakeFile new file mode 100644 index 0000000..0b42094 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/MakeFile @@ -0,0 +1 @@ + CDEV = Midi {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" if {dup} # test whether we should duplicateiigs duplicateiigs -m -y {CDEV} {CDEV} end {CDEV}.Load Ä ¶ midi.aii.obj ¶ sul.aii.obj LinkIIGS -x -lseg midi ¶ midi.aii.obj ¶ sul.aii.obj ¶ -o {CDEV}.Load midi.aii.obj Ä midi.aii asmiigs midi.aii sul.aii.obj Ä sul.aii asmiigs sul.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/commonmacros.h b/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/commonmacros.h new file mode 100644 index 0000000..48625c7 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/commonmacros.h @@ -0,0 +1 @@ +;............................................................... ; ; Push 2 bytes onto stack ; ; pushw loc -- pushes bytes onto stack from 'loc' ; pushw loc,x -- pushes bytes onto stack from 'loc,x' ; pushw #n -- pushes constant #n onto stack ; pushw -- pushes bytes onto stack (from A) ;............................................................... MACRO pushw &addr,® IF &addr[1:1]='#' AND &SETTING('LONGA')='ON' THEN pea |&addr[2:255] ELSE IF &addr­'' THEN IF ®­'' THEN lda &addr,® ELSE lda &addr ENDIF ENDIF pha ENDIF MEND ;............................................................ ; ; Pull long (4 bytes) from stack ; ; pulllong address - pull off stack to address ; pulllong addr1,addr2 - pull off stack into 2 places ; pulllong [zeropage],offset - pull off stack and store indirectly ; pulllong - pull off stack and leave in A ;............................................................... MACRO pulll &addr1,&addr2 IF &addr1='' THEN IF &addr2­'' THEN AERROR 'Illegal 2nd parameter' ENDIF pullw pullw ELSEIF &addr2='' THEN pullw &addr1 pullw &addr1+2 ELSEIF &addr1[1:1]='[' THEN ldy #&addr2 pullw &addr1,y ldy #&addr2+2 pullw &addr1,y ELSE pullw &addr1 sta &addr2 pullw &addr1+2 sta &addr2+2 ENDIF MEND ;............................................................... ; ; Pull 2 bytes from stack ; ; pullw loc -- pulls bytes off stack and stores in 'loc' ; pullw loc,x -- pulls bytes off stack and stores in 'loc,x' ; pullw -- pulls bytes off stack and leaves in A ;............................................................... MACRO pullw &addr,® pla IF &addr­'' THEN IF ®­'' THEN sta &addr,® ELSE sta &addr ENDIF ELSEIF ®­'' THEN AERROR 'Illegal 2nd parameter' ENDIF MEND ;............................................................ ; ; Push long (4 bytes) onto stack ; ; pushl address - push contents of address ; pushl address,x - push contents of address,x ; pushl const,s - push contents of stack+const ; pushl #address/const - push address or constant ; pushl [zeropage],offset - push using indirect address ;............................................................... MACRO pushl &addr,&offset IF &addr[1:1]='#' THEN pea &addr[2:255]>>16 pea |&addr[2:255] ELSEIF &addr[1:1]='[' THEN ldy #&offset+2 pushw &addr,y ldy #&offset pushw &addr,y ELSEIF &offset='s' THEN pushw &addr,s pushw &addr,s ELSEIF &offset='' THEN pushw &addr+2 pushw &addr ELSE pushw &addr+2,&offset pushw &addr,&offset ENDIF MEND ; skip1 - skip the next byte MACRO skip1 dc.b $24 ENDM ; skip2 - skip the next 2 bytes. MACRO skip2 dc.b $2c ENDM \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/midi.aii b/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/midi.aii new file mode 100644 index 0000000..5cf2568 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/midi.aii @@ -0,0 +1 @@ +;; midi - cdev to choose midi driver. ; ; Michael Stein 6/20/90 ; ; (c) Copyright Apple Computer 1990. msb off string asis blanks off INCLUDE 'E16.CONTROL' INCLUDE 'M16.UTIL' INCLUDE 'M16.GSOS' INCLUDE 'M16.CONTROL' INCLUDE 'M16.MISCTOOL' INCLUDE 'M16.LIST' INCLUDE 'M16.MEMORY' INCLUDE 'M16.INTMATH' INCLUDE 'M16.PRINT' ENTRY bogusCDEV,\ InitCDEV,\ hitCDEV, \ CloseCDEV,\ CreateCDEV,\ AboutCDEV ENTRY WriteData import sul zp0 equ 0 ;Zero page use zp1 equ zp0+4 zpsize equ zp1+4 ;Length of zero page. MemRecSize equ 5 ;Size of each member record. AShareFST equ $0d *############################################################################## * * Below is the main entry point for this CDEV. All messages (commands) * passed to the CDEV by the Control Panel go through this point. This CDEV * handles only 4 of the standard CDEV calls. These are listed below: * * Call Name Call Number * --------- ----------- * INIT 4 * CLOSE 5 * CREATE 7 * ABOUT 8 * * ON ENTRY: C,X,Y = Unknown * Stack = Result Space (Long) * Message (Word) * Data1 (Long) * Data2 (Long) * Return Address (3 Bytes) * * Message = Call Number * Data1 = Window Grafport * Data2 = Unused * * ON EXIT C,X,Y = Changed * Stack = Result (Long) * * Result = 0 (always) * *############################################################################## main PROC ENTRY Data1,Data2 ENTRY ControlList ENTRY AboutList ENTRY MErrorList ENTRY Mem1RecH ENTRY MyID ENTRY List1Count ENTRY List1ID ENTRY CreateError phb ;Save old data reg phk ;Set data reg = prog reg plb lda 5,s ;Load DATA2 off the stack sta Data2 ;and store it locally. lda 7,s sta Data2+2 lda 9,s ;Load DATA1 off the stack sta Data1 ;and store it locally. lda 11,s sta Data1+2 lda 13,s ;Load MESSAGE off the sta Message ;stack and store it locally. lda 1,s ;Bump the stack up to prepare sta 11,s ;to take off the 3 parameters lda 3,s ;that we stored about. sta 13,s PullWord ;Get rid of MESSAGE space PullLong ;Get rid of DATA1 space PullLong ;Get rid of DATA2 space lda Message ;Load the call number cmp #12 ;Compare againts max+1 bcs ret_addr ;If >= max+1, just leave. pea ret_addr-1 ;Push our return address asl a ;Times 2 into word table tax ;Move into index reg lda cdev_calls,x ;Load the address of call handler pha ;Push the address of routine on the stack rts ;Jump to the call handler ret_addr lda #0 ;Make sure we return zeros. sta 5,s sta 7,s plb ;Restore NDAs data bank register rtl ;Return to Control Panel NDA. Message dc.w 0 ;Local storage for MESSAGE Data1 dc.l 0 ;Local storage for DATA1 Data2 dc.l 0 ;Local storage for DATA2 MyID dc.w 0 CreateError dc.w 0 ;0 = no error, 1 = error cdev_calls dc.w bogusCDEV-1 ;0 ;Null dc.w bogusCDEV-1 ;1 ;MachineCDEV dc.w bogusCDEV-1 ;2 ;BootCDEV dc.w bogusCDEV-1 ;3 ;ShutdownCDEV dc.w InitCDEV-1 ;4 dc.w CloseCDEV-1 ;5 dc.w bogusCDEV-1 ;6 ;EventsCDEV dc.w CreateCDEV-1 ;7 dc.w AboutCDEV-1 ;8 dc.w bogusCDEV-1 ;9 ;RectCDEV dc.w hitCDEV-1 ;10 ;HitCDEV dc.w bogusCDEV-1 ;11 ;RunCDEV ControlList dc.l List1Control dc.l SText1Control ;Port: dc.l SText2Control dc.l radio1 dc.l radio2 dc.l radio3 dc.l radio4 dc.l radio5 dc.l radio6 dc.l radio7 dc.l radio8 dc.l radio9 dc.l radio10 dc.l 0 LeftEdge equ 10 RightEdge equ 190 TL1Vert equ 90 BR1Vert equ TL1Vert+42 TL2Vert equ 79 BR2Vert equ 121 TL3Vert equ TL1Vert-10 BR3Vert equ TL1Vert TL4Vert equ 69 BR4Vert equ 79 List1Control dc.w 14 ;PCount List1ID dc.l 1 ;ID number dc.w TL1Vert dc.w LeftEdge dc.w BR1Vert dc.w RightEdge dc.l $89000000 ;listcontrol ID dc.w 0 ;Flag dc.w $1401+fCtlCanBeTarget+fCtlWantEvents ;More Flags dc.l 0 ;Ref con List1Count dc.w 0 dc.w 0 ;Number seen dc.w 6 ;Single selection Pascal strings List1Start dc.w 1 ;1st member seen dc.l 0 ;Draw routine dc.w 10 ;Height dc.w 5 ;List record size Mem1RecH dc.l 0 SText1Control dc.w 8 ;PCount dc.l 3 ;ID number dc.w 3 dc.w LeftEdge dc.w 3+10 dc.w RightEdge dc.l $81000000 ;Static text dc.w 1 ;Flag dc.w $1000 ;More flag dc.l 0 dc.l SText1 dc.w SText1Len SText1 dc.b 'MIDI connection:' SText1Len equ *-SText1 SText2Control dc.w 8 ;PCount dc.l 3 ;ID number dc.w TL3Vert dc.w LeftEdge dc.w BR3Vert dc.w RightEdge dc.l $81000000 ;Static text dc.w 1 ;Flag dc.w $1000 ;More flag dc.l 0 dc.l SText2 dc.w SText2Len SText2 dc.b 'MIDI driver:' SText2Len equ *-SText2 AboutList dc.w 8 ;Pcount dc.l 1 ;ID dc.w 38,5,138,280 dc.l $81000000 dc.w 1 dc.w $1000 dc.l 0 dc.l AboutText dc.w AboutTextLen AboutText dc.b 'The MIDI Control Panel lets you specify how you are using ' dc.b 'a MIDI device. Select the port or slot that the MIDI ' dc.b 'device is connected to and then specify the MIDI driver.' DC.B $0D,'Example:',$0D DC.B ' An APPLE MIDI interface connects to either the ' DC.B 'printer or modem port, and the driver file is ' DC.B 'ÒApple.MidiÓ.', $0D DC.B ' MIDI driver files are read from the ÒDriversÓ folder. ' AboutTextLen equ *-AboutText MErrorList dc.w 8 ;Pcount dc.l 1 ;ID dc.w TL1Vert dc.w LeftEdge dc.w BR2Vert dc.w RightEdge dc.l $81000000 dc.w 1 dc.w $1000 dc.l 0 dc.l MErrorText dc.w MErrorTextLen MErrorText dc.b 'An error occured while trying to allocate ' dc.b 'memory. This CDEV requires some free ' dc.b 'memory in order to operate.' MErrorTextLen equ *-MErrorText ;leftedge2 equ 35 leftedge2 equ 10 radio1ID equ 10 radiotop equ 14 rhspace equ 40 rvspace equ 12 vertical spacing between radio buttons ; radio buttons. radio1 dc.w 8 Pcount dc.l radio1ID ID dc.w radiotop dc.w leftedge dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio1T ptr to title dc.w 0 initial value radio1t str 'Printer Port' radio2 dc.w 8 Pcount dc.l radio1ID+1 ID dc.w radiotop+rvspace dc.w leftedge dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio2T ptr to title dc.w 0 initial value radio2t str 'Modem Port' radio3 dc.w 8 Pcount dc.l radio1ID+2 ID dc.w radiotop+rvspace*2 ; dc.w leftedge+25 dc.w leftedge dc.w radiotop+rvspace*2+10 ; dc.w leftedge+25+100 dc.w leftedge+100 dc.l $81000000 ;Static text dc.w 1 ;Flag dc.w $1000 ;More flag dc.l 0 dc.l radio3t dc.w radio3len radio3t dc.b 'Card Slot:' radio3len equ *-radio3t radio4 dc.w 8 Pcount dc.l radio1ID+3 ID dc.w radiotop+rvspace*3 dc.w leftedge2 dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio4T ptr to title dc.w 0 initial value radio4t str '1' radio5 dc.w 8 Pcount dc.l radio1ID+4 ID dc.w radiotop+rvspace*3 dc.w leftedge2+rhspace dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio5T ptr to title dc.w 0 initial value radio5t str '2' radio6 dc.w 8 Pcount dc.l radio1ID+5 ID dc.w radiotop+rvspace*3 dc.w leftedge2+rhspace*2 dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio6T ptr to title dc.w 0 initial value radio6t str '3' radio7 dc.w 8 Pcount dc.l radio1ID+6 ID dc.w radiotop+rvspace*3 dc.w leftedge2+rhspace*3 dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio7T ptr to title dc.w 0 initial value radio7t str '4' radio8 dc.w 8 Pcount dc.l radio1ID+7 ID dc.w radiotop+rvspace*4 dc.w leftedge2 dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio8T ptr to title dc.w 0 initial value radio8t str '5' radio9 dc.w 8 Pcount dc.l radio1ID+8 ID dc.w radiotop+rvspace*4 dc.w leftedge2+rhspace dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio9T ptr to title dc.w 0 initial value radio9t str '6' radio10 dc.w 8 Pcount dc.l radio1ID+9 ID dc.w radiotop+rvspace*4 dc.w leftedge2+rhspace*2 dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio10T ptr to title dc.w 0 initial value radio10t str '7' ENDP *############################################################################## * Below are the CDEV handler routines * *############################################################################## bogusCDEV PROC rts ENDP HitCDEV PROC IMPORT scv,slot,intext hit lda data2 id of control cmp #10 bcc hit2 if not radio control cmp #12 beq hit2 if slot button bcs hit1 if external slot selection pha save for now lda slot clc adc #10+2 tax lda #0 jsr scv set control value pla sec sbc #10-1 (c) clear, convert to slot 1 or 2 sta slot save stz intext rts hit1 sbc #10+2 (c) set, convert to external slot 1-7 sta slot lda #1 sta intext hit2 rts ENDP InitCDEV PROC IMPORT slot,intext,scv,wptr init lda data1 sta wptr lda data1+2 sta wptr+2 PushLong #0 ;Result space PushLong Data1 ;Window pointer Pushlong #1 ;Push list # _GetCtlHandleFromID pla plx pha ;space for result pushword #0 ;start from top phx ;hi word of list control pha ;lo word of list control _NextMember2 ;find the selected item PushLong #0 ;Result space PushLong Data1 ;Window pointer pushLong #1 ;Push list # _GetCtlHandleFromID _SelectMember2 ;make sure it is visible ; init the radio buttons. lda #1 ldx intext bne init2 if external slot ldy slot cpy #2+1 bcs init3 if some sort of error occurred ldx #10 dey beq init1 if printer port inx init1 jmp scv set control value and return init2 lda slot clc adc #10+2 tax lda #1 jmp scv set control value and return init3 rts ENDP *############################################################################## ******************************************************************************* * Times5 * * This routine will multiply the number in X with 5 and return the result * in the variable AddIndex. * * Inputs: X = Number to mulitiply * * Outputs: AddIndex = Result (long) ******************************************************************************* Times5 PROC IMPORT drvr EXPORT AddIndex PushLong #0 ;Result space phx ;Item number PushWord #5 ;Item length _Multiply PullLong AddIndex ;Offset into member list rts AddIndex dc.l 0 ENDP CloseCDEV PROC IMPORT drvr phd ;Save the old D reg. tsc ;*Stack -> C reg. sec ;Add 4 bytes sbc #4 ; (actually minus) tcs ;C reg. -> *Stack ina tcd ;C reg. -> *DPage lda CreateError beq @CloseIt jmp Exit @CloseIt ldx List1ID ;Look at list #1 jsr FindSelected ;Find selected member bne @FoundOne ;Branch if we found one! jmp Exit ;No member selected! (just leave) @FoundOne dex ;Minus 1 for multiply jsr Times5 ;Times 5 for each record. ;------------------------------------------------------------------------------ ; Below we add the offset for this record number (# times 5) to the ; base location to the member pointer list. ;------------------------------------------------------------------------------ PushLong Mem1RecH _HLock lda Mem1RecH sta zp0 lda Mem1RecH+2 sta zp0+2 ldy #2 lda [zp0] tax lda [zp0],y sta zp0+2 stx zp0 clc lda AddIndex ;Load low word of offset adc zp0 ;Add it to low word of base sta zp0 ;Store on zero page. lda AddIndex+2 ;Now do the same for the adc zp0+2 ;high word. sta zp0+2 ldy #2 ;Zero page location 00-03 now lda [zp0] ;points to a value that is a tax ;pointer to the string to move. lda [zp0],y ;Get this pointer and hold it pha ;in the X and Y registers. ;Pushlong pointer to string. phx ;Must go onto the stack high-low! ;------------------------------------------------------------------------------ ; Below we move the name of the file from our member list into the ; MIDI.SETUP file buffer for writting out. We're falling through here ; with the source address pointer on the stack. ;------------------------------------------------------------------------------ PushLong #drvr PushLong #33 _BlockMove PushLong Mem1RecH _HUnlock jsr WriteData Exit tsc ;*Stack -> C reg. clc ;Subtract 4 bytes. adc #4 ; (actually plus) tcs ;C reg. -> *Stack pld ;Restore old D reg. lda MyID beq @NoID PushWord MyID ;Dispose of all our membory _DisposeAll PushWord MyID ;Dispose of our _DeleteID ;memory ID. @NoID rts ******************************************************************************* * FindSelected * * This routine will call the list manager tool to find the selected member * of the specified list and return it in X. * * Inputs: X = List number * * Outputs: X = Item number ( 0 = no item selected) ******************************************************************************* FindSelected PushWord #0 ;Result space (for _ResetMember2) ;------------------------------------------------------------------------------ ; Below we get the control handle for list #n and put it on the stack ; for the _ResetMember2 call. ;------------------------------------------------------------------------------ PushLong #0 ;Result space PushLong Data1 ;Window pointer PushWord #0 ;Push high word of list # phx ;Push low word of list # _GetCtlHandleFromID bcs @BadExit ;------------------------------------------------------------------------------ ; After the above code, the control handle is on the stack for use in the ; next call. ;------------------------------------------------------------------------------ ldx #$131C jsl >$E10000 ;_ResetMember2 plx ;Pull item number bcs @BadExit rts @BadExit lda #0 rts ENDP *############################################################################## AboutCDEV PROC PushLong #0 ;Space for result PushLong Data1 ;Grafport PushWord #0 ;Ptr to single PushLong #AboutList _NewControl2 PullLong rts ENDP *############################################################################## CreateCDEV PROC PushWord #0 ;Result space PushWord #$5000 ;DA type _GetNewID PullWord MyID bcc @GotID jmp @MemoryError1 @GotID PushLong #0 ;Result space PushLong #1 ;Size of block PushWord MyID ;User ID PushWord #$8018 ;Attributes PushLong #0 ;Pointer to mem _NewHandle PullLong Mem1RecH bcs @MemoryError2 stz List1Count stz PrePickFlag ;0 = don't pre-pick jsr ReadPSetup bcs @L1 inc PrePickFlag ;Try to pre-pick midi driver filename. ;------------------------------------------------------------------------------ ; Below we add zpsize bytes to the stack and point the direct page register ; there. We need zpsize bytes of zero page in SCAN4DRIVERS. ;------------------------------------------------------------------------------ @L1 phd ;Save the old D reg. tsc ;*Stack -> C reg. sec ;Add 12 bytes sbc #zpsize ; (actually minus) tcs ;C reg. -> *Stack ina tcd ;C reg. -> *DPage jsr Scan4Drivers tsc ;*Stack -> C reg. clc ;Subtract 12 bytes. adc #zpsize ; (actually plus) tcs ;C reg. -> *Stack pld ;Restore old D reg. PushLong #0 ;Space for result PushLong Data1 ;WindPort PushWord #3 ;Ptr to Ptrs PushLong #ControlList ;Ptr to control list _NewControl2 PullLong ;Discard zeros stz CreateError ;Flag no error! jsr stl ;sort the lists rts @MemoryError1 stz MyID ;Flag no ID @MemoryError2 lda #0001 ;Flag error! sta CreateError PushLong #0 ;Space for result PushLong Data1 ;WindPort PushWord #0 ;Ptr to single PushLong #MErrorList ;Ptr to control _NewControl2 PullLong ;Discard rts ;; gnp - generate network path. ; gnp phd ;Save the old D reg. tsc ;*Stack -> C reg. sec ;Add 12 bytes sbc #zpsize ; (actually minus) tcs ;C reg. -> *Stack ina tcd ;C reg. -> *DPage _FSTSpecific gup_pblk get user path lda gup_pblk+8 sta zp0 lda gup_pblk+8+2 sta zp0+2 ; copy over path to user's folder. sep #$30 longa off longi off lda [zp0] sta w1 # to copy ldy #2 ldx #0 gnp1 cpx w1 bcs gnp2 if done lda [zp0],y sta netobj,x save here for now iny inx bra gnp1 move next char ; add over the final ':Setup:MIDI.SETUP' gnp2 ldy #0 gnp3 cpy #aafaL bcs gnp4 if done lda aafa,y get next char of ending string sta netobj,x iny inx bra gnp3 process next char gnp4 lda w1 clc adc #aafaL rep #$30 longa on longi on and #$ff sta netobj length of gs/os string ldx #netobj ldy #^netobj tsc ;*Stack -> C reg. clc ;Subtract 12 bytes. adc #zpsize ; (actually plus) tcs ;C reg. -> *Stack pld ;Restore old D reg. rts ; parameter block to get user path from appleshare. aafa dc.b ':Setup:MIDI.SETUP' aafaL equ *-aafa length of this portion of path gup_pblk dc.w 3 3 parameters dc.w AShareFST id of the appleshare fst dc.w 8 command for get user path ds.b 4 ptr to pathname netobj ds.b 100 w1 ds.b 2 ;; inb - is network boot. ; ; entry (inba..) = gs/os parameter block to get info on boot device. ; ; exit (x) != 0 if this was a network boot. inb _DinfoGS inba get device info on boot device ldx #0 assume not network boot lda inba+$14 get device id cmp #$1e bne inb1 if not appleshare fst inx flag that this is a network boot inb1 rts inba dc.w 8 8 parameters needed dc.w 1 want info on the boot device dc.l bootdev buffer to name of boot device ds.b 14 hold results bootdev ds.b 35 hold name of boot device ;; stl - sort the lists. ; ; entry scrolling list has been initialized. ; ; exit lists will be sorted as if they were uppercase only. stl ldx #1 PushLong #0 ;Result space PushLong Data1 ;Window pointer PushWord #0 ;Push high word of list # phx ;Push low word of list # _GetCtlHandleFromID pla ;lo word of control handle ply ;hi word of control handle jmp sul ;sort uppercase list and return ;------------------------------------------------------------------------------ ; READPSETUP ; ; This routine reads in the MIDI.SETUP file in the system folder. If it ; doesn't exist, it will create one. ; ; Inputs: NONE ; Outputs: NONT - Global data only ;------------------------------------------------------------------------------ ENTRY optr,WriteData ReadPSetup jsr inb is network boot txa beq read1 if not network boot jsr gnp get network path stx optr lo ptr to pathname stx optr+2 hi ptr to pathname read1 _OpenGS OpenPBlock ;Open the file. bcs @L2 ;Branch if error. lda OPRef ;Transfer reference number sta RPRef ;to the read and close call sta CRef ;blocks. _ReadGS ReadPBlock ;Read the file. @L00 php ;Save the read/write error if any _CloseGS CloseBlock ;Close the file plp ;Restore read error flag @L1 rts @L2 cmp #$0046 ;File not found error? sec ;Assume branch condition bne @L1 ;Branch if not _CreateGS CreatePBlock ;Try to create the file bcs @L1 ;Branch on error sep #$30 longa off longi off ldy Defdrvr ;Move the default MIDI driver @L10 lda Defdrvr,y ;name into write buffer. sta drvr,y dey bpl @L10 if more to copy rep #$30 longa on longi on lda #defintext sta intext internal/external flag lda #defslot sta slot default slot WriteData _OpenGS OpenPBlock ;Open the file. bcs @L1 ;Branch on error lda OPRef ;Transfer reference number sta RPRef ;to the write and close call sta CRef ;blocks. _WriteGS ReadPBlock ;Write the file. php ;Save the read/write error if any _CloseGS CloseBlock ;Close the file plp ;Restore write error flag @L1 rts ;------------------------------------------------------------------------------ ; SCAN4DRIVERS ; ; This routine will scan the DRIVERS directory on the system disk in order ; to find all the MIDI and Port drivers. It will include the file names ; into the appropriate list. The AppleTalk driver will be ; excluded. ; ; Inputs: NONE - Global data only ; Outputs: NONT - Global data only ;------------------------------------------------------------------------------ Scan4Drivers _OpenGS OpenDBlock bcc @L1 rts @L1 lda ODRef sta GDERef sta CRef ScanLoop _GetDirEntryGS GetDirEntryBlock bcc @L00 cmp #$004F ;Is the name just too big? beq ScanLoop ;Branch if yes. jmp ScanExit ;Else, error out. @L00 lda FPath+2 ;Load length of string cmp #0033 ;Is the file name too large? bcs ScanLoop ;Branch if file name too large xba ;Turn string into Pascal type sta FPath+2 ;string. lda GDEFileType ;Is the file a driver? cmp #$00BB ;$BB = driver bne ScanLoop ;Branch if not. ldx GDEAUXType ;Is it a MIDI driver? ; cpx #$0001 ;1 = MIDI driver cpx #$300 ; $300 = MIDI driver bne Back2scan jsr movemidi bcs ScanLoop if error occurred inc List1Count ;bump the midi driver counter Back2Scan jmp ScanLoop ;Go back for more! ScanExit _CloseGS CloseBlock rts longa on longi on ******************************************************************************* * movemidi * * This routine will add the name to the list record and copies * into a new memory segment. * * Inputs: None * * Outputs: Carry: Clear = String copied and valid * Set = if memory error * ******************************************************************************* movemidi php rep #$30 longa on longi on lda List1Count ldx Mem1RecH ldy Mem1RecH+2 jsr BumpMemRec bcs PortBExit ;Branch on error longa off longi off lda PrePickFlag beq PortGExit ldy FPath+3 @L1 lda FPath+3,y cmp drvr,y bne PortGExit if not the selected one dey bpl @L1 ldy #4 lda #$80 sta [zp1],y PortGExit plp clc rts PortBExit plp sec rts ;----------------------------------------------------------------------------- ; The routine below will fetch a character from FPATH+3,Y and force it to ; upper case. ;----------------------------------------------------------------------------- GetUCase lda FPath+3,y ;Load the character cmp #$61 ;If < "a" don't bother bcc @L1 cmp #$7B ;If > "z"+1 don't bother bcs @L1 and #$DF ;Else force it to upper case. @L1 rts longa on longi on ;; scv - set control value. ; ; entry (a) = value to set. ; (x) = id of control. ; ; exit none. export scv scv pha value to set pha space for result pha pushlong wptr window pointer pushword #0 phx id of control _GetCtlHandleFromID _SetCtlValue value to set was already on stack rts ******************************************************************************* * BumbMemRec * * This routine will bump the member record list, move the file name pointed * to by FPATH+3 into a new memory handle, update the new member record to * point to the new memory handle containing the file name and zero the * selection byte for the new member record.. * * Inputs: A: ListCount for this record * X: Low word of MemberList handle * Y: High word of MemberList handle * * Outputs: Carry: Clear = String copied * Set = Memory allocation error * Long C,X,Y if error * Short C,X,Y if no error * ******************************************************************************* BumpMemRec sta zp0 ;Store the ListCount stx zp1 ;Store the handle (low word) sty zp1+2 ;Store the handle (high word) ;----------------------------------------------------------------------------- ; Below we first try to unlock the handle of the member record list. Then ; get the old size, add the length of a new record, and the re-size the ; handle. After that, we just lock it down. If we get any errors, we leave ; the BUMPMEMREC routine with the carry set. ;----------------------------------------------------------------------------- PushLong zp1 ;Push handle _HUnlock ;Unlock the handle bcc @OKUnlock ;Branch if no error @ShortExit jmp @Exit ;Else we exit with carry set. @OKUnlock PushLong #0 ;Result space PushLong zp1 ;Push handle _GetHandleSize ;Get the current handle size tay ;Save the error state for now ;We fall through with the current ;size of the handle on the stack. clc ;Add in the length of the new pla ;member record item so we can adc #MemRecSize ;re-size the member record list. tax pla adc #0 phy ;Save the error state on the stack. pha ;Push the new length of the phx ;handle onto the stack. PushLong zp1 ;Push the handle _SetHandleSize ;Set the new size pha ;Save the error state on the stack. PushLong zp1 ;Push the handle _HLock ;Lock the sucker. plx ;Pull error on SetHandleSize ply ;Pull error on GetHandleSize bcs @ShortExit ;Branch if error on _HLock sec ;Assume error bne @ShortExit ;Branch if error on GetHandleSize cpx #0 ;Error on SetHandleSize? bne @ShortExit ;Branch if yes. ;----------------------------------------------------------------------------- ; Below we ask for a segment of memory that will hold the file name in ; FPATH+3. ;----------------------------------------------------------------------------- PushLong #0 ;Result space PushWord #0 ;High word of size of block lda FPath+3 and #$00FF ina pha ;Low word of size of block PushWord MyID ;User ID PushWord #$C018 ;Attributes PushLong #0 ;Pointer to mem _NewHandle plx ;Pull the result off the stack ply ;and hold it in X and Y regs. bcs @Exit ;Branch if we didn't get the memory. pei zp0 ;Push the ListCount for later use. stx zp0 ;Store handle to file name sty zp0+2 ;buffer on zero page. ldy #2 ;De-reference the handle lda [zp0] ;and store it back on to tax ;the zero page at ZP0. lda [zp0],y sta zp0+2 stx zp0 ldy #2 ;Dereference handle that lda [zp1] ;points to the beginning of tax ;the member record list and lda [zp1],y ;put the result back into the sta zp1+2 ;zero page location ZP1. stx zp1 plx ;Pull the ListCount back off jsr Times5 ;and multiply it by 5. clc ;Add the offset to the address lda AddIndex ;of the beginning of the buffer adc zp1 ;to get new pointer to member sta zp1 ;record and put it back into lda AddIndex+2 ;the zero page location ZP1. adc zp1+2 sta zp1+2 ldy #2 ;Dereference handle that points lda zp0 ;to the location to put the sta [zp1] ;file name into and put it back lda zp0+2 ;into the zero page location ZP0. sta [zp1],y sep #$30 ;Short everything longa off longi off ldy #4 ;Force the selection byte to lda #00 ;zero (not selected). sta [zp1],y ldy FPath+3 ;Load the length byte @CopyLoop lda FPath+3,y ;Move the entire string including sta [zp0],y ;the length byte into buffer pointed dey ;to by ZPO bpl @CopyLoop clc ;No error! @Exit rts ;RETURN longa on longi on PrePickFlag dc.w 0 ATalkName str 'APPLETALK' OpenDBlock dc.w 3 ;PCount ODRef dc.w 0 dc.l DPath ;Pathname pointer dc.w 0001 ;Request access DPath dc.w DPathLen dc.b '*/SYSTEM/DRIVERS/' DPathLen equ *-DPath-2 GetDirEntryBlock dc.w 13 ;PCount GDERef dc.w 0 dc.w 0 ;Flags dc.w 1 ;Base dc.w 1 ;Displacement dc.l FPath dc.w 0 ;Entry number GDEFileType dc.w 0 ;FileType dc.l 0 ;EOF dc.l 0 ;Block count dc.l 0,0 ;Create date/time dc.l 0,0 ;Mod date/time dc.w 0 ;Access GDEAUXType dc.l 0 ;AUX type FPath dc.w FPathLen dc.w 0 ds.b 32 FPathLen equ *-FPath CreatePBlock dc.w 4 ;PCount dc.l PPath ;Pathname pointer dc.w $C3 ;Access byte dc.w 6 ;File type dc.l 0 ;AUX type OpenPBlock dc.w 3 ;PCount OPRef dc.w 0 optr dc.l PPath ;Pathname pointer dc.w 0003 ;Request access (R/W) PPath dc.w PPathLen dc.b '*/SYSTEM/DRIVERS/MIDI.SETUP' PPathLen equ *-PPath-2 ReadPBlock dc.w 4 ;PCount RPRef dc.w 0 dc.l ReadPBuffer dc.l filelen ;Request count dc.l 0 ;Transfer count CloseBlock dc.w 1 ;PCount CRef dc.w 0 export wptr,intext,slot,drvr wptr ds.b 4 window pointer ReadPBuffer intext ds.b 2 ;0 = internal, 1 = external slot ds.b 2 ;slot 1 - 7 drvr ds.b 32 ;pascal string containing name of midi driver filelen equ *-intext ;length of file ; default values. defintext equ 0 ;internal defslot equ 1 ;printer port defdrvr str 'Apple.Midi' ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/midi.r b/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/midi.r new file mode 100644 index 0000000..c10ff7c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/midi.r @@ -0,0 +1 @@ +/*******************************************************************/ /* /* MIDI.r /* /* Copyright (C) 1988-1992 /* Apple Computer, Inc. /* All Rights Reserved /* /* This file contains the source of the resources needed to build the /* MIDI CDEV. /* /*******************************************************************/ #include "typesiigs.r" resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"CCC0000FFFFFFFFF" $"FFFFFFFFFFFFFFFFFCCC000FFFFFFFFF" $"FFFFFFFFCCCCCFFFCCC00F000FFFFFFF" $"FFFF00000CCCFFFC00C0C00FFFFFFFFF" $"FFFFF000CCC0FCFCC0C0FFFFFFFFFFFF" $"FFFF0003FFFCCCC00FFFFFFFFFFFFFFF" $"FF0C3FFCFCC0C0FFFFFFFFFFFFFFFF03" $"CFFFFCCCC00FFFFFFFFDDDDDDD00CF3F" $"FCFCC0C0DDDFFFDDDDDDDDD003CFFFFC" $"00000DDDFFDDDDDDDDD00CCFFF000000" $"00DDFFDDDDDDDDDD0003C0000F0000DD" $"FFDDDDDDDDDDD00CC0000000000DFFDD" $"DDDDDDDDD00C00F00000F00DFFDDDDDD" $"DDDDDD0000000000000DFFDDDDDDDDDD" $"DDD000F00000F00DFFDDDDDDDDDDDDDD" $"0000000000DDFFDDDDDDDDDDDDDDD000" $"000000DDFFDDDDDDDDDDDDDDDD000000" $"0DDDFFFDDDDDDDDDDDDDDDDD000DDDDF", $"FFFFFFF000000000000000000000" /* new mask added 1/22/91 by Monte Benaresh */ $"FFFFFFFFFFF00000000000000000" $"FFFFFFFFFFFFFFFFF00000000000" $"FFFFFFFFFFFFFFFFFFF000000000" $"00000FFFFFFFFFFFFFFF00000000" $"00000000FFFFFFFFFFFFF0000000" $"0000000000FFFFFFFFFFFF000000" $"0000000000FFFFFFFFFFFFF00000" $"000FFFFFFFFFFFFFFFFFFFFFFFF0" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFF0"; }; read rCDEVCode (1,Convert) "MIDI.Load"; resource rCDEVFlags (1) { wantInit+wantClose+wantCreate+wanthit+wantAbout, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ {0,0,140,200}, /* DataRect {0,0,160,200} */ "MIDI", /* Name */ "Michael Stein", /* Author */ "v1.0"; /* VersStr */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/sul.aii b/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/sul.aii new file mode 100644 index 0000000..39ebeef --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/MIDICDEV/sul.aii @@ -0,0 +1 @@ +;;; sul - sort uppercase list. ; ; Michael V. Stein 02/21/90. ; ; © Apple, 1990. blanks off ;; equates. ;; imported addresses. ;; include files. include 'commonmacros.h' include 'm16.list' include 'm16.util2' ;; main program. main proc export sul sul Pushl #cue compare uppercase elements phy hi word to list handle pha lo word to list handle _SortList2 rts ;; cue - compare uppercase elements. ; ; entry none. ; ; exit none. memberA equ 4+2 memberB equ memberA+4 cue phd tsc tcd use stack as a direct page phb save data bank phk plb ldy #$02 lda [memberA] dereference first handle tax lda [memberA],y sta memberA+2 stx memberA lda [memberB] dereference second handle tax lda [memberB],y sta memberB+2 stx memberB shortmx lda [memberA] cmp [memberB] compare it to memberB bcc cue1 if length(memberB) >= length(memberA) lda [memberB] cue1 sta min shortest length of either string ldy #$00 cue2 iny lda [memberB],y jsr cal capitalize a letter sta temp lda [memberA],y jsr cal capitalize a letter cmp temp bne cue5 we have a difference cpy min chars are the same so check if more bytes to check bcc cue2 no more bytes to check cue4 lda [memberA] the shortest string is less than the longer cmp [memberB] set carry if a >= b cue5 longmx carry set if a >= b lda 0+2 sta 8+2 lda 2+2 sta 10+2 plb restore data bank pld restore direct page pla pla pla pla rtl min ds.b 1 temp ds.b 1 ;; cal - capitalize a letter. ; ; entry none. ; ; exit none. longa off longi off cal cmp #'a' bcc cal1 if not lowercase cmp #'z'+1 bcs cal1 if not lowercase sbc #$20-1 (c) clear cal1 rts endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/Modem.pii b/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/Modem.pii new file mode 100644 index 0000000..29d7326 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/Modem.pii @@ -0,0 +1 @@ +This sourcefile is no longer used. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/Modem.r b/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/Modem.r new file mode 100644 index 0000000..d9b6782 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/Modem.r @@ -0,0 +1 @@ +/*******************************************************************/ /* /* Modem.r /* /* Copyright (C) 1988-1992 /* Apple Computer, Inc. /* All Rights Reserved /* /* This file contains the source of the resources needed to build the /* Modem CDEV. /* /*******************************************************************/ #include "typesiigs.r" resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"FF000000FFFFFFFFF0FFFFFFFFFF" $"F0FFFFFF0FFFFFFFFF0FFFFFFFFF" $"F0FFFFFF0FFFFFF00FF0FFFFFFFF" $"0FFFFFFF0FFFFFF0F0FF0FFFFFFF" $"0FFFFFFF0FFFF0FF0F0FFFFFFFFF" $"0FFFFF00FFFFFF0FF00FFFFFFFFF" $"F0FFF0FFFFF00FF0FFFFFFFFFFFF" $"F0FFF0FFFFF0F0FF0FFFFFFFFFFF" $"FF0FF0FFF0FF0F0FFFFFFFFFFFFF" $"FF0FFF0FFF0FF00FFFFFFFFFFFFF" $"FFF0FF0FFFF0FFFFFFFFFFFFFFFF" $"FFF0FFF0FFFF0FFFFFFFFFFFFFFF" $"FFFF0FFF0FFFFFFFFFFFFFFFFFFF" $"FFFFF0FFF0FFFF00000FFFFFFFFF" $"FFFFFF0FFF0000FFFFF0FFFFFFFF" $"FFFFFFF0FFFFFFFFFFF0FFFFFFFF" $"FFFFFFFF0FFFFFFFFFF0FFFFFFFF" $"FFFFFFFFF00FFFFFFFF0FFFFFFFF" $"FFFFFFFFFFF00FFFF00FFFFFFFFF" $"FFFFFFFFFFFFF0000FFFFFFFFFFF", $"00FFFFFF000000000B0000000000" $"0FFFFFFFF000000000B000000000" $"0FFFFFFFF000000BB00B00000000" $"FFFFFFFFF000000B0B00B0000000" $"FFFFFFFFF0000B00B0B000000000" $"FFFFFFFF000000B00BB000000000" $"0FFFFF00000BB00B000000000000" $"0FFFFF00000B0B00B00000000000" $"00FFFF000B00B0B0000000000000" $"00FFFFF000B00BB0000000000000" $"000FFFF0000B0000000000000000" $"000FFFFF0000B000000000000000" $"0000FFFFF0000000000000000000" $"00000FFFFF0000FFFFF000000000" $"000000FFFFFFFFFFFFFF00000000" $"0000000FFFFFFFFFFFFF00000000" $"00000000FFFFFFFFFFFF00000000" $"000000000FFFFFFFFFFF00000000" $"00000000000FFFFFFFF000000000" $"0000000000000FFFF00000000000" ; }; read rCDEVCode (1,Convert) "Modem.Load"; resource rCDEVFlags (1) { wantHit+wantInit+wantCreate+wantAbout +wantRect+updateSSfromBRAM+wantRun, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ {0,0,125,200}, /* DataRect */ "Modem Port", /* Name */ "Darryl Lovato", /* Author */ "v1.1"; /* VersStr */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/ModemData.aii b/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/ModemData.aii new file mode 100644 index 0000000..d7cc442 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/ModemData.aii @@ -0,0 +1 @@ +;;; ModemData - Data for Modem CDEV. ; ; Michael V. Stein 04/01/90. ; ; © Copyright Apple Computer, 1990. blanks off ;; include files. include 'e16.control' ;; equates. y1 equ 2 y2 equ y1+9 ;y3 equ y2+10 y3 equ y1+15 y4 equ y3+15 y5 equ y4+15 y6 equ y5+15 y7 equ y6+15 y8 equ y7+10 y9 equ y8+10 y10 equ y9+10 y11 equ y10+10 y12 equ y11+10 y13 equ y12+10 ya3 equ y3 ya4 equ ya3+15 ya5 equ ya4+10 ya6 equ ya5+10 data proc ;; exported address. export devptr export devlen export nbut export modemabout export modemalist export modemlist export slotlen export slotptr slotptr dc.w sname0 dc.w sname1 dc.w sname2 dc.w sname3 slotlen dc.w sname1-sname0 dc.w sname2-sname1 dc.w sname3-sname2 dc.w send-sname3 sname0 dc.b 'Modem' sname1 dc.b 'Your Card' sname2 dc.b 'AppleTalk' sname3 dc.b 'Printer' send equ * devc dc.W 8 ; pcount dc.L $8001 ;static text item dc.W y1,5,y1+10,100 ; boundry rect dc.L statTextControl ; procRef dc.W inactiveHilite<<8 ; flag dc.W $1000 ; moreFlags dc.L 0 ; refCon dc.L devstr ; textRef dc.W devstrL ; text length devstr dc.b 'Device Type:' devstrL equ *-devstr devslt dc.W 8 ; pcount dc.L $8001 ;static text item dc.W y1,104,y1+10,195 ; boundry rect dc.L statTextControl ; procRef dc.W inactiveHilite<<8 ; flag dc.W $1000 ; moreFlags dc.L 0 ; refCon devptr dc.l devslt ; textRef (hi word is valid) devlen dc.W 0 ; text length string ASIS modem1 dc.w 9 dc.l 1 dc.w y3,5,y3+12,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 95 dc.l modem1Menu dc.w 1 modem1menu dc.B '>> Parity:\H' dc.W 1 dc.B $0D dc.B '== Odd\H' dc.W 1 dc.B $0D dc.B '== Even\H' dc.W 2 dc.B $0D dc.B '== None\IH' dc.W 3 dc.B $0D dc.B '.' modem2 dc.w 9 dc.l 2 dc.w y4,5,y4+12,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 95 dc.l modem2Menu dc.w 1 modem2menu dc.B '>> Baud:\H' dc.W 2 dc.B $0D dc.B '== 50\H' dc.W 1 dc.B $0D dc.B '== 75\H' dc.W 2 dc.B $0D dc.B '== 110\H' dc.W 3 dc.B $0D dc.B '== 134.5\H' dc.W 4 dc.B $0D dc.B '== 150\H' dc.W 5 dc.B $0D dc.B '== 300\H' dc.W 6 dc.B $0D dc.B '== 600\H' dc.W 7 dc.B $0D dc.B '== 1200\IH' dc.W 8 dc.B $0D dc.B '== 1800\H' dc.W 9 dc.B $0D dc.B '== 2400\H' dc.W 10 dc.B $0D dc.B '== 3600\H' dc.W 11 dc.B $0D dc.B '== 4800\H' dc.W 12 dc.B $0D dc.B '== 7200\H' dc.W 13 dc.B $0D dc.B '== 9600\H' dc.W 14 dc.B $0D dc.B '== 19200\H' dc.W 15 dc.B $0D dc.B '.' modem3 dc.w 9 dc.l 3 dc.w y5,5,y5+12,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 95 dc.l modem3Menu dc.w 1 modem3menu dc.B '>> Line Length:\H' dc.W 3 dc.B $0D dc.B '== Unlimited\IH' dc.W 1 dc.B $0D dc.B '== 40\H' dc.W 2 dc.B $0D dc.B '== 72\H' dc.W 3 dc.B $0D dc.B '== 80\H' dc.W 4 dc.B $0D dc.B '== 132\H' dc.W 5 dc.B $0D dc.B '.' modem4 dc.w 9 dc.l 4 dc.w y6,5,y6+12,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 95 dc.l modem4Menu dc.w 1 modem4menu dc.B '>> Data/Stop:\H' dc.W 4 dc.B $0D dc.B '== 5-1\H' dc.W 1 dc.B $0D dc.B '== 5-2\H' dc.W 2 dc.B $0D dc.B '== 6-1\H' dc.W 3 dc.B $0D dc.B '== 6-2\H' dc.W 4 dc.B $0D dc.B '== 7-1\H' dc.W 5 dc.B $0D dc.B '== 7-2\H' dc.W 6 dc.B $0D dc.B '== 8-1\IH' dc.W 7 dc.B $0D dc.B '== 8-2\H' dc.W 8 dc.B $0D dc.B '.' string PASCAL ; from here on, we need pascal strings modem5 dc.w 8 dc.L 5 dc.w y7,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L modem5Title dc.w 0 modem5Title dc.b 'Delete LF after CR' modem6 dc.w 8 dc.L 6 dc.w y8,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L modem6Title dc.w 0 modem6Title dc.b 'Add LF after CR' modem7 dc.w 8 dc.L 7 dc.w y10,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L modem8Title dc.w 0 modem7Title dc.b 'Echo' modem8 dc.w 8 dc.L 8 dc.w y9,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L modem7Title dc.w 0 modem8Title dc.b 'Buffering' modem9 dc.w 8 dc.L 9 dc.w y11,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L modem9Title dc.w 0 modem9Title dc.b 'DCD Handshake' modem10 dc.w 8 dc.L 10 dc.w y12,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L modem10Title dc.w 0 modem10Title dc.b 'DSR/DTR Handshake' modem11 dc.w 8 dc.L 11 dc.w y13,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L modem11Title dc.w 0 modem11Title dc.b 'XON/XOFF Handshake' modemList dc.l devc dc.l devslt dc.l modem1 dc.l modem2 dc.l modem3 dc.l modem4 dc.l modem5 dc.l modem6 dc.l modem7 dc.l modem8 dc.l modem9 dc.l modem10 dc.l modem11 dc.l nbut dc.l 0 string asis modemA1 dc.w 9 dc.l 3 dc.w ya3,5,ya3+12,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 95 dc.l modemA1Menu dc.w 1 modemA1menu dc.B '>> Line Length:\H' dc.W 3 dc.B $0D dc.B '== Unlimited\IH' dc.W 1 dc.B $0D dc.B '== 40\H' dc.W 2 dc.B $0D dc.B '== 72\H' dc.W 3 dc.B $0D dc.B '== 80\H' dc.W 4 dc.B $0D dc.B '== 132\H' dc.W 5 dc.B $0D dc.B '.' string PASCAL ; from here on, we need pascal strings modemA2 dc.w 8 dc.L 5 dc.w ya4,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L modemA2Title dc.w 0 modemA2Title dc.b 'Delete LF after CR' modemA3 dc.w 8 dc.L 6 dc.w ya5,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L modemA3Title dc.w 0 modemA3Title dc.b 'Add LF after CR' modemA4 dc.w 8 dc.L 8 dc.w ya6,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L modemA4Title dc.w 0 modemA4Title dc.b 'Echo' modemaList dc.l devc dc.l devslt dc.l modemA1 dc.l modemA2 dc.l modemA3 dc.l modemA4 dc.l nbut dc.l 0 modemAbout dc.w 8 dc.L 1 dc.w 38,5,138,280 dc.L $81000000 dc.w $0000 dc.w $1000 dc.L 0 dc.L TheText dc.w EndText-TheText string asis TheText dc.b 'The Modem Port Control Panel allows you to change the Modem Port ' dc.b 'settings. These include the Parity, Baud, Line Length, Data/Stop ' dc.b 'bits, and a host of others. If you are using a modem or printer, you should consult ' dc.b 'your UserÕs Guide for that peripheral. If the Modem Port (slot 2) is ' dc.b 'set up for AppleTalk, only a subset of the normal settings will be available ' dc.b 'for modification.' EndText string pascal nbut dc.w 9 Pcount dc.l 30 ID number dc.w 132-7 dc.w 5+10 dc.w 132+13-7 dc.w 195-10 dc.l simpleButtoncontrol dc.w simpRound dc.w fCtlWantEvents+fctlProcRefNotPtr dc.l 0 dc.l nbutit dc.w 0 length? dc.w 0 key equivalent string pascal nbutit dc.b 'Standard Settings' endp END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/makefile new file mode 100644 index 0000000..9343944 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/makefile @@ -0,0 +1 @@ + CDEV = MODEM {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" if {dup} # test whether we should duplicateiigs duplicateiigs -m -y {CDEV} {CDEV} end {CDEV}.Load Ä ¶ {CDEV}.aii.obj ¶ {CDEV}Data.aii.obj linkiigs ¶ -x -l -s >{CDEV}.map ¶ -lseg modem ¶ {CDEV}.aii.obj ¶ {CDEV}Data.aii.obj ¶ -o {CDEV}.Load {CDEV}.aii.obj Ä ¶ {CDEV}.aii asmiigs {CDEV}.aii {CDEV}Data.aii.obj Ä ¶ {CDEV}Data.aii asmiigs {CDEV}Data.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/modem.aii b/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/modem.aii new file mode 100644 index 0000000..42eac27 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/ModemCDEV/modem.aii @@ -0,0 +1 @@ +;;; modem - modem CDEV. ; ; Michael V. Stein 04/04/90. ; ; © Apple, 1990. blanks off ;; equates. recty0 equ 0 rectangle offsets rectx0 equ 2 recty1 equ 4 rectx1 equ 6 Slot2ID equ $22 battery parameter telling the value of the slot2 wind_atalk_h equ 47+15+22 ;window height for AppleTalk device wind_modem_h equ 131+15+22 ;window height for modem or printer device wind_w equ 200 ;window width ;; imported addresses. import devlen import devptr import nbut import modemabout import modemalist import modemlist import slotlen import slotptr ;; include files. include '::cdev.h' include '::commonmacros.h' include '::dp.h' include 'e16.control' include 'm16.control' include 'm16.event' include 'm16.menu' include 'm16.misctool' include 'm16.util2' ;; main program. main proc modem phb save calling data bank phk plb set our data bank ; make room on stack for direct page. tsc sec sbc #dpsize make room on stack for new direct page tcs phd save the current direct page tcd new direct page lda message cmp #12 bcs modem1 if message defintely not handled asl a times 2 into word table tax move into index reg jsr (t_cdev-2,x) call the handler of this message modem1 pld restore direct page tsc clc adc #dpsize tcs reset the stack lda 1,s Bump the stack up to prepare sta 11,s to take off the 3 parameters lda 3,s sta 13,s pla get rid of message space pla get rid of data1 space pla pla get rid of data2 space pla lda #0 return 0 to caller sta 5,s sta 7,s plb rtl t_cdev dc.w cccE Null - not used dc.w cccE handle machine message dc.w cccE handle boot message dc.w icc init cdev controls dc.w cccE close the cdev dc.w cccE handle event message dc.w ccc create cdev controls dc.w ham handle about message dc.w hrm handle rectangle message dc.w hhm handle hit message dc.w handle_run ;RunCDEV ;; ccc - create cdev controls. ; ; entry [data1] = window ptr. ; (modemlist..) = table of ptrs to controls if not appletalk selected. ; (modemalist..) = table of ptrs to controls if appletalk selected. ; slot2ID = battery parameter for slot 2 identification. ; (slotlen..) = table of string lengths of slot 2 possibilities. ; (slotptr..) = table of ptrs to slot 2 names. . ; ; exit (devlen) = length of slot 2 name. ; (devptr) = offset of name in bank. ; [wptr] = window pointer. ccc ldx #slot2ID jsr rbp read battery parameter sta old_dev ;save for comparisons asl a tax lda slotptr,x get lo ptr to string sta devptr lda slotlen,x get length of string sta devlen pha space for result pha lda data1+2 pha hi word of window ptr sta wptr+2 lda data1 pha lo word of window ptr sta wptr pushw #3 next item is a ptr to a list of template pointers ldx #slot2ID jsr rbp read battery parameter cmp #2 beq ccc1 if appletalk is set in slot 2 pushl #modemlist controls if not appletalk in port bra ccc2 ccc1 pushl #modemalist controls if appletalk is set in port ccc2 _NewControl2 pla pla don't care about result cccE rts ;; ham - handle about message. ; ; entry [data1] = ptr to window. ; (modemabout..) = template of about box control. ; ; exit About box control is created. ham pha space for result pha pushl data1 window pointer pushw #0 next item is a ptr to a template pushl #modemAbout _NewControl2 pla pla don't care about result rts goto .no_he ;don't assemble this routine! handle_event ;handle EventsCDEV message and poll for change ;in the type of device connected to our port lda [data1] ;get event code bne @no_action ;if not null, don't check BRAM @null ; check BRAM to see whether our device type has changed, and ; re-create the CDEV window if it has lda old_dev ;check whether inited bmi @no_action ldx #slot2ID jsr rbp ;check BRAM cmp old_dev ;did it change? beq @no_action @changed sta old_dev ;update for next time pei data2+2 ;push window ptr pei data2 _KillControls ;get rid of current controls pea wind_w lda old_dev ;get device type again cmp #2 ;AppleTalk? beq @atalk @modem pea wind_modem_h bra @resize @atalk pea wind_atalk_h @resize pei data2+2 ;push window ptr pei data2 ldx #$1C0E ;SizeWindow jsl $E10000 ;resize the window ; now we call our own CreateCDEV and InitCDEV ; routines to set up the new window lda data2 ldx data2+2 sta data1 ;put window ptr in data1 for CreateCDEV stx data1+2 stz data2 ;clear data2 (not used) stz data2+2 jsr ccc ;create new controls ; InitCDEV takes same params as CreateCDEV, so we'll ; just assume they're still in place jsr icc @no_action rts .no_he ;assembly skips to here handle_run ;handle RunCDEV message and poll for change ;in the type of device connected to our port ; check BRAM to see whether our device type has changed, and ; re-create the CDEV window if it has lda old_dev ;check whether inited bmi @no_action ldx #slot2ID jsr rbp ;check BRAM cmp old_dev ;did it change? beq @no_action @changed sta old_dev ;update for next time lda wptr+2 ;push window ptr pha lda wptr pha _KillControls ;get rid of current controls pea wind_w lda old_dev ;get device type again cmp #2 ;AppleTalk? beq @atalk @modem pea wind_modem_h bra @resize @atalk pea wind_atalk_h @resize lda wptr+2 ;push window ptr pha lda wptr pha ldx #$1C0E ;SizeWindow jsl $E10000 ;resize the window ; now we call our own RectCDEV, CreateCDEV, and InitCDEV ; routines to set up the new window stz hr_dummy_rect ;set up dummy rectangle stz hr_dummy_rect+2 lda #125 sta hr_dummy_rect+4 lda #200 sta hr_dummy_rect+6 lda #> Type:\H' dc.W 1 dc.B $0D dc.B '== Color\IH' dc.W 1 dc.B $0D dc.B '== Monochrome\H' dc.W 2 dc.B '.' ENDP monitor2 PROC EXPORT dc.w 9 dc.l 2 dc.w 17,5,29,195+20 dc.l $87000000 dc.w $0040 * dc.w $1004 dc.w $1084 ;turn on bit 7 = fDrawArrowIcon, 21-Jan-91 DAL dc.l 0 dc.w 80 dc.l monitor2Menu dc.w 1 monitor2menu dc.B '>> Columns:\H' dc.W 2 dc.B $0D dc.B '== 40\IH' dc.W 1 dc.B $0D dc.B '== 80\H' dc.W 2 dc.B $0D dc.B '.' ENDP monitor3 PROC EXPORT dc.w 9 dc.l 3 dc.w 32,5,44,195+20 dc.l $87000000 dc.w $0040 * dc.w $1004 dc.w $1084 ;turn on bit 7 = fDrawArrowIcon, 21-Jan-91 DAL dc.l 0 dc.w 80 dc.l monitor3Menu dc.w 1 monitor3menu dc.B '>> Text:\H' dc.W 3 dc.B $0D dc.B '== Black\H' dc.W 1 dc.B $0D dc.B '== Deep Red\H' dc.W 2 dc.B $0D dc.B '== Dark Blue\H' dc.W 3 dc.B $0D dc.B '== Purple\H' dc.W 4 dc.B $0D dc.B '== Dark Green\H' dc.W 5 dc.B $0D dc.B '== Dark Gray\H' dc.W 6 dc.B $0D dc.B '== Medium Blue\H' dc.W 7 dc.B $0D dc.B '== Light Blue\H' dc.W 8 dc.B $0D dc.B '== Brown\H' dc.W 9 dc.B $0D dc.B '== Orange\H' dc.W 10 dc.B $0D dc.B '== Light Gray\H' dc.W 11 dc.B $0D dc.B '== Pink\H' dc.W 12 dc.B $0D dc.B '== Light Green\H' dc.W 13 dc.B $0D dc.B '== Yellow\H' dc.W 14 dc.B $0D dc.B '== Aquamarine\H' dc.W 15 dc.B $0D dc.B '== White\IH' dc.W 16 dc.B $0D dc.B '.' ENDP monitor4 PROC EXPORT dc.w 9 dc.l 4 dc.w 47,5,59,195+20 dc.l $87000000 dc.w $0040 * dc.w $1004 dc.w $1084 ;turn on bit 7 = fDrawArrowIcon, 21-Jan-91 DAL dc.l 0 dc.w 80 dc.l monitor4Menu dc.w 1 monitor4menu dc.B '>> Back:\H' dc.W 4 dc.B $0D dc.B '== Black\H' dc.W 1 dc.B $0D dc.B '== Deep Red\H' dc.W 2 dc.B $0D dc.B '== Dark Blue\H' dc.W 3 dc.B $0D dc.B '== Purple\H' dc.W 4 dc.B $0D dc.B '== Dark Green\H' dc.W 5 dc.B $0D dc.B '== Dark Gray\H' dc.W 6 dc.B $0D dc.B '== Medium Blue\IH' dc.W 7 dc.B $0D dc.B '== Light Blue\H' dc.W 8 dc.B $0D dc.B '== Brown\H' dc.W 9 dc.B $0D dc.B '== Orange\H' dc.W 10 dc.B $0D dc.B '== Light Gray\H' dc.W 11 dc.B $0D dc.B '== Pink\H' dc.W 12 dc.B $0D dc.B '== Light Green\H' dc.W 13 dc.B $0D dc.B '== Yellow\H' dc.W 14 dc.B $0D dc.B '== Aquamarine\H' dc.W 15 dc.B $0D dc.B '== White\H' dc.W 16 dc.B $0D dc.B '.' ENDP monitor5 PROC EXPORT dc.w 9 dc.l 5 dc.w 62,5,74,195+20 dc.l $87000000 dc.w $0040 * dc.w $1004 dc.w $1084 ;turn on bit 7 = fDrawArrowIcon, 21-Jan-91 DAL dc.l 0 dc.w 80 dc.l monitor5Menu dc.w 1 monitor5menu dc.B '>> Border:\H' dc.W 5 dc.B $0D dc.B '== Black\H' dc.W 1 dc.B $0D dc.B '== Deep Red\H' dc.W 2 dc.B $0D dc.B '== Dark Blue\H' dc.W 3 dc.B $0D dc.B '== Purple\H' dc.W 4 dc.B $0D dc.B '== Dark Green\H' dc.W 5 dc.B $0D dc.B '== Dark Gray\H' dc.W 6 dc.B $0D dc.B '== Medium Blue\IH' dc.W 7 dc.B $0D dc.B '== Light Blue\H' dc.W 8 dc.B $0D dc.B '== Brown\H' dc.W 9 dc.B $0D dc.B '== Orange\H' dc.W 10 dc.B $0D dc.B '== Light Gray\H' dc.W 11 dc.B $0D dc.B '== Pink\H' dc.W 12 dc.B $0D dc.B '== Light Green\H' dc.W 13 dc.B $0D dc.B '== Yellow\H' dc.W 14 dc.B $0D dc.B '== Aquamarine\H' dc.W 15 dc.B $0D dc.B '== White\H' dc.W 16 dc.B $0D dc.B '.' ENDP checkbox6 PROC EXPORT dc.w 10 dc.l 6 dc.w 77,5+8,89,195+8 dc.l $82000000 ;checkbox dc.w 0 ;flag dc.w $3000 ;moreFlags dc.l 0 ;refcon dc.l checkTitle dc.w 0 ;initial value dc.l 0 ;color table dc.b $53,$73,0,0,0,0 ;key equiv = "S" checkTitle str 'Smoother Mouse Cursor' EndP string PASCAL ; from here on, we need pascal strings monitorsList PROC EXPORT dc.l monitor1 dc.l monitor2 dc.l monitor3 dc.l monitor4 dc.l monitor5 dc.l checkbox6 dc.l 0 ENDP About1 PROC EXPORT dc.w 8 dc.L 1 dc.w 38,5,138,280 dc.L $81000000 dc.w $0000 dc.w $1000 dc.L 0 dc.L TheText dc.w EndText-TheText string asis TheText ; dc.b 'The Monitor control panel allows you to change settings that affect ' ; dc.b 'the monitor. These include Color/Monochrome, the number of characters ' ; dc.b 'to display on each line, the text, background, and border colors. ' ; dc.b 'The text and background colors only affect the ' ; dc.b 'text screen in "classic" Apple II programs.' dc.b 'The Monitor control panel lets you change your monitor settings. ' dc.b 'The text and background colors affect only the text screen, not the ' dc.b 'desktop.' dc.b 13,13 dc.b 'ÒSmoother Mouse CursorÓ is useful with a Video Overlay Card ' dc.b 'or an accelerator.' EndText string pascal ENDP monitorAbout PROC EXPORT dc.l about1 dc.l 0 ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/MonitorCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/MonitorCDEV/makefile new file mode 100644 index 0000000..61d3b39 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/MonitorCDEV/makefile @@ -0,0 +1 @@ +# # Monitor control panel makefile # # Rewritten 8-Sep-92 DAL for all-assembly version (in System 6.0.1) # Monitor Ä Monitor.Load Monitor.r reziigs Monitor.r -o Monitor -t "C7 " -c "pdos" if {AutoDuplicate}==1 duplicateiigs -m -y Monitor : end Monitor.Load Ä Monitor.aii.obj MonitorData.aii.obj linkiigs -x -l -s >Monitor.map ¶ -lseg Main:$1000 ¶ Monitor.aii.obj ¶ MonitorData.aii.obj ¶ -o Monitor.Load Monitor.aii.obj Ä Monitor.aii asmiigs Monitor.aii MonitorData.aii.obj Ä MonitorData.aii asmiigs MonitorData.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/MakeFile b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/MakeFile new file mode 100644 index 0000000..790d5c2 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/MakeFile @@ -0,0 +1 @@ +CDEV = namer {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" if {dup} # test whether we should duplicateiigs duplicateiigs -m -y {CDEV} {CDEV} end {CDEV}.Load Ä ¶ namer.aii.obj ¶ rename.aii.obj ¶ namerdata.aii.obj ¶ sul.aii.obj linkiigs -x -lseg:$1000 namer ¶ namer.aii.obj ¶ rename.aii.obj ¶ namerdata.aii.obj ¶ sul.aii.obj ¶ -o {CDEV}.Load {CDEV}.aii.obj Ä {CDEV}.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs {CDEV}.aii rename.aii.obj Ä rename.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs rename.aii namerdata.aii.obj Ä namerdata.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs namerdata.aii sul.aii.obj Ä sul.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs sul.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/namer b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/namer new file mode 100644 index 0000000..e69de29 diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/namer.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/namer.aii new file mode 100644 index 0000000..ed518bf --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/namer.aii @@ -0,0 +1 @@ +;;; namer - AppleTalk Network Printer CDEV. ; ; Michael V. Stein 01/25/90. ; ; © Copyright Apple Computer, 1990. ;;; routines included in this source file. ; ; ccc - create cdev controls. ; ctc - close the cdev. ; ham - handle about messsage. ; hhm - handle hit message. ; icc - init cdev controls. ; rtc - run the cdev. ; acr - appletalk completion routine. ; ane - add next element. ; anl - add names to list. ; cac - create actual controls. ; cbs - change button status. ; cmd - close modal dialog. ; cnd - check for new devices. ; cps - copy pascal string. ; cst - create static text. ; ctp - close the printer. ; cus - compare uppercase strings. ; dah - dereference a handle. ; dam - display alert message. ; dwh - disable window highlighting. ; dzl - draw zone list. ; ewh - enable window highlighting. ; fsz - find starting zone in list. ; gap - get actual pointer. ; gdt - get device type. ; gpn - get printer names. ; gsz - get starting zone. ; ghp - get highlighted printer. ; ghz - get highlighted zone. ; gip - get index into printers. ; giz - get index into zones. ; gmz - get my zone. ; goa - get offset into array. ; gzl - get zone list. ; hom - handle out of memory. ; hpe - handle pap error. ; hpl - hit printer list. ; hpu - hit pop up. ; hzl - hit zone list. ; iai - is appletalk active. ; ipl - initialize printer list. ; knl - kill name lookup. ; mne - move to next element. ; omd - open modal dialog. ; otp - open the printer. ; rfp - read from printer. ; snl - start name lookup. ; stp - status the printer. ; wtp - write to printer. blanks off ;; equates. recty0 equ 0 rectangle offsets rectx0 equ 2 recty1 equ 4 rectx1 equ 6 stack_entry equ $e100b0 gs/os stack entry point ;; include files. include '::commonmacros.h' include '::cdev.h' include '::dp.h' include 'e16.control' include 'e16.dialog' include 'e16.event' include 'e16.gsos' include 'e16.lineedit' include 'e16.list' include 'e16.memory' include 'e16.quickdraw' include 'm16.control' include 'm16.dialog' include 'm16.gsos' include 'm16.intmath' include 'm16.lineedit' include 'm16.list' include 'm16.memory' include 'm16.misctool' include 'm16.quickdraw' include 'm16.print' include 'm16.QDAux' include 'm16.util2' include 'm16.window' include 'netprinter.h' ;; main program. main proc ;; exported addreses. export acr export cmd export cps export ctp export dah export dam export damE export devices export dptr export gdt export ghp export gip export hpe export hzl export knl export lookupF export lszone export mneE export myzonename export namesbuffer export netobj export omd export openblock export openblock2 export otp export plisthdl export rfp export rfpE export screenF export stp export stpE export wtp export zonebuffer export zlisthdl ;; imported addresses. import about import appletalk import asterisk ;import atalkerr import atalkerrm import atalkF import atinit:atinitrec import atinitlpath import cfe import choosepr import close_pblk import cprect import ctllist import emess1 import emess2 import emess3 import emess4 import emess5 import emess6 import emess7 import emess8 import emess10 import emess11 import emess12 import emess13 import NBPbusyMsg import entity:entityrec import GinfoParams import gmyp_pblk:NBPLType import gmyz_pblk import gup_pblk import iwebut import kill_pblk import newname import oktext import open_pblk import plist import popen_pblk:open_printer import pread_pblk:read_printer import prec:printersetup import psetpr_pblk:PMSetPrinterType import psetuppath import pstat_pblk:status_printer import ptext import ptypes import punload_pblk import pwrite_pblk:write_printer import rw_pblk import sm_pblk import tryagain import quit import rtp import rtpbut import sul import tryagain import typeptr import wtext import zlist import zonelist_pblk:gzonelist namer phb save calling data bank phk plb set our data bank ; make room on stack for direct page. tsc sec sbc #dpsize make room on stack for new direct page tcs phd save the current direct page tcd new direct page stz cdev_result ;init result for Control Panel stz cdev_result+2 lda message cmp #11+1 bcs namer1 if message defintely not handled ldx atalkf beq namer1 if appletalk isn't present asl a times 2 into word table tax move into index reg jsr (t_cdev-2,x) call the handler of this message namer1 pld restore direct page tsc clc adc #dpsize tcs reset the stack lda 1,s Bump the stack up to prepare sta 11,s to take off the 3 parameters lda 3,s sta 13,s pla get rid of message space pla get rid of data1 space pla pla get rid of data2 space pla lda cdev_result ;result for Control Panel sta 5,s lda cdev_result+2 sta 7,s plb rtl t_cdev dc.w Machine_CDEV handle machine message dc.w ctcE handle boot message - ignored dc.w ctcE handle shutdown message - ignored dc.w icc init cdev controls dc.w ctc close the cdev dc.w ctcE handle event message - ignored dc.w ccc create cdev controls dc.w ham handle about message dc.w ctcE handle rectangle message - ignored dc.w hhm handle hit message dc.w rtc run the cdev ; secondary routines. Machine_CDEV ;check for AppleTalk active and show alert if not ; check screen resolution in case we have to show alert box pha space for result _GetMasterSCB pla xba and #$8000 sta screenF != 0 if 640 mode jsr iai ;check for AppleTalk active bcs @no_atalk @active inc cdev_result ;return success rts @no_atalk lda #atalkerrm ldy #^atalkerrm brl dam ;display alert box rts ;return (default) 0 result --> failed ;; ccc - create cdev controls. ; ; entry (atalkerr..) = appletalk error message control. ; [data1] = window ptr. ; read = gs/os command to read from a file. ; ; exit if appletalk isn't installed, the appletalk error ; text control is created. ; ; if appletalk is active then: ; controls are created. ; the zonelist is created and sorted. ; (selF) = 0. ; [wptr] = window pointer. ccc ;jsr iai is appletalk active ;bcc ccc1 if active ;ldx #atalkerr 'AppleTalk must be installed to run É' ;ldy #^atalkerr ;brl cst create static text control and return ccc1 _Waitcursor stz selF no selection was made yet stz pmatch stz pmatch+2 stz pindex init printer index stz zonenamehdl stz zonenamehdl+2 ;no name handle yet ; next code moved to MachineCDEV by Monte Benaresh -- 12/4/91 ;pha space for result ;_GetMasterSCB ;pla ;xba ;and #$8000 ;sta screenF != 0 if 640 mode lda data1 sta wptr save window pointer for later lda data1+2 sta wptr+2 jsr gzl get zone list stz NBPBusyF assume NBP not busy jsr gpn get printer names cmp #$0408 too many NBP lookups active? bne @lookup_ok no, continue @cant_lookup dec NBPBusyF set flag to display message at init time @lookup_ok jsr ipl initialize printer list jsr cac create actual controls lda zlisthdl lo word of list handle ldy zlisthdl+2 hi word of list handle jsr sul sort uppercase list stz zindex zone index of 0 ; since szl will only sort the names, now go through list, find the local ; zone and show it as selected. jsr fsz find starting zone jsr dzl draw zone list _InitCursor rts ;; ctc - close the cdev. ; ; entry called when to close the cdev and appletalk is active. ; ; exit name lookup is stopped. ; memory is disposed. ;; alternate entrypoint: ctcE. ; ; ctcE is used as a convenient rts instruction. ctc lda #$ffff sta lookupF flag to not start any more lookups jsr knl kill name lookup pushl zonenamehdl _DisposeHandle get rid of memory we allocated ctcE ctc1 rts ;; ham - handle about messsage. ; ; entry (about..) = static text control containg the about text. ; ; exit The 'about' control is created. ham ldx #about ldy #^about brl cst create static text control and return ;; hhm - handle hit message. ; ; entry [data1] = handle to control. ; [data2] = id of control that was hit. ; ; exit control hit is processed. hhm lda data2 get id of control that was hit cmp #5+1 bcs hhm1 if not important control asl a tax jmp (hhmtab-2,x) jump to the proper handler and return hhm1 rts hhmtab dc.w hpu hit pop-up dc.w hpl hit printer list dc.w hzl hit zone list dc.w 0 dc.w rtp rename the printer ;; icc - init cdev controls. ; ; entry (atalkF) = 0 if appletalk isn't active. ; ; exit zone list is drawn if appletalk is active. icc lda atalkF beq icc1 if appletalk is not active brl dzl draw zone list and return icc1 rts ;; rtc - run the cdev. ; ; entry (lookupF) != 0 if not to do any more lookups. ; ; exit if lookups are allowed and out window is the frontmost, it starts a ; lookup if the last one has stopped. rtc lda NBPBusyF check flag for NBP busy beq @NBP_ok stz NBPBusyF clear flag lda #NBPbusyMsg 'A network search is already activeÉ' ldy #^NBPbusyMsg jsr dam display alert message @NBP_ok ; next code to check for zones appearing after none could ; be found adapted from AppleShare CDEV v2.0 by Mark Day ; ; added 11/16/91 by Monte Benaresh lda zonelist_pblk.numberzones and #$00FF ;keep byte only bne @have_zones ;we found zones, all OK jsr gzl ;no zones, try to find them now pushl #0 ;standard listDraw pushw #1 pushl #$ffffffff use current listref pushw #$ffff use current listrefdesc pushw zlist+$1a size of list pushl zlisthdl handle of list control record _NewList2 lda zlisthdl lo word of list handle ldy zlisthdl+2 hi word of list handle jsr sul sort uppercase list stz zindex zone index of 0 ; since szl will only sort the names, now go through list, find the local ; zone and show it as selected. jsr fsz find starting zone jsr dzl draw zone list @have_zones lda lookupF bne rtc1 if not to look for new devices pha pha _FrontWindow pla lo ptr to window plx hi ptr to window cmp wptr bne rtc1 if no longer the front window cpx wptr+2 bne rtc1 if no longer the front window brl cnd check for new devices and return rtc1 rts ; teriary routines called by the message handling routines. ;; acr - appletalk completion routine. ; ; entry called by the appletalk routines with a jsl when an asynch call ; has completed. ; ; exit (calcompF) = $ffff acr lda #$ffff sta >callcompF flag that the call completed rtl ;; ane - add next element. ; ; entry [l1] = ptr to current spot in the namelist. ; [l4] = ptr to current record in list manager list. ; ; exit entry is added to list. ; [l1] = ptr to next spot in the namelist. ; [l4] = ptr to next element in the list manager list. ; copy new element into our list. ane ldy #entityrec.netnum lda [l1],y ldy #memrec.netnum sta [l4],y lda l1 clc adc #entityrec.objname ldy #memrec.memptr sta [l4],y lda l1+2 adc #0 ldy #memrec.memptr+2 sta [l4],y shortmx ldy #entityrec.nodeid lda [l1],y ldy #memrec.nodeid sta [l4],y ldy #entityrec.scktnum lda [l1],y ldy #memrec.scktnum sta [l4],y ldy #entityrec.enumerator lda [l1],y ldy #memrec.enumerator sta [l4],y ldy #memrec.memflag lda #0 sta [l4],y mark it as not selected longmx ane3 jsr mne move to next element lda l4 clc adc #memrec.sizeof sta l4 bcc ane4 if didn't cross bank inc l4+2 ane4 rts ;; anl - add names to list. ; ; entry (gymp_pblk..) = parameter block for getting printer list. ; MaxSrvrs = max number of printers per zone to worry about. ; (openblock..) = current printer name list. ; (openblock2..) = new printer name list. ; [plisthdl] = handle to printer list. ; (plistsize) = current size of printer list. ; ; exit if the number of printers has changed then this routine will ; recreate the printer list with the info from the new call. anl lda gmyp_pblk.rgotten and #$ff cmp plistsize beq anl3 if same size (branch doesn't reach bottom) ; different # of objects, so copy openblock2 to openblock shortm ldx #MaxSrvrs*(99+5)-1 anl1 lda openblock2,x sta openblock,x dex bne anl1 longm lda #openblock sta l1 lda #^openblock sta l1+2 lda #0 sta w5 jsr gip get index into printers [l4] lda gmyp_pblk.rgotten and #$ff sta w6 responses received anl2 lda w5 current index cmp w6 compare against total bcs anl4 if done jsr ane add next element inc w5 bump the counter bra anl2 process next element anl3 rts anl4 lda w6 sta plistsize new size of list jsr ghp get highlighted printer anl6 pushl #0 ;standard listDraw pushw #1 pushl #$ffffffff use current listref pushw #$ffff use current listrefdesc pushw plistsize size of list pushl plisthdl handle of list control record _NewList2 lda plisthdl lo word of list handle ldy plisthdl+2 hi word of list handle jsr sul sort uppercase list stz pindex pushw pindex index of zone, might be zero pushl plisthdl _SelectMember2 scroll list so current zone is shown lda #noHilite assume laserwriter ldx pindex bne anl7 if a match was found lda #inactiveHilite anl7 brl cbs chnage button status and return ;; cac - create actual controls. ; ; entry (ctllist..) = table of long ptrs to control templates. ; [data1] = ptr to window. ; (devices) = index of current printer type. ; (choosepr..) = template for the popup menu. ; (plist..) = template for printer list. ; (rtpbut..) = template for rename button. ; (zlist..) = template for zone list. ; ; exit controls and created and program control falls into ; cbs to set the buttons appropriately. ; popup is set correctly. ; [plisthdl] = handle to printer list control ; [rtpbuthdl] = handle to rename button control. ; [zlisthdl] = handle to zone list control. cac lda devices ina sta choosepr+$20 set initial item in popup pha space for result pha pushl data1 window pointer pushw #3 next item is a ptr to a list of template pointers pushl #ctllist _NewControl2 pla pla don't care about result pha pha space for result pushl data1 window pointer pushw #0 next item is a control pushl #zlist _NewControl2 pulll zlisthdl handle to control pha pha space for result pushl data1 window pointer pushw #0 next item is a control pushl #plist _NewControl2 pulll plisthdl handle to control pha pha space for result pushl data1 window pointer pushw #0 next item is a control pushl #rtpbut _NewControl2 pulll rtpbuthdl handle to control lda #inactiveHilite ; routine falls into cbs and returns. Obviously things will work better ; if cbs is the next routine. ;; cbs - change button status. ; ; entry (a) = new status for rename button (inactive or nohilite). ; (devices) = type of device. ; [iwebuthdl] = handle to emulator button control. ; [rtpbuthdl] = handle to rename control. ; ; exit Rename button is set as specified. cbs pha pushl rtpbuthdl _HiLiteControl rts ;; cmd - close modal dialog. ; ; entry [l5] = dialog pointer. ; ; exit dialog is closed. ; window highlighting enabled. cmd _InitCursor ;25-Aug-92 DAL pushl l5 close the dialog _CloseDialog brl ewh enable window highlighting and return ;; cnd - check for new devices. ; ; entry (calcompF0 = 0 if last asynch call didn't complete. ; (gymp_pblk..) = paramater block to get printers in selected zone. ; (lookupF) = 0 if ok to do lookup. ; ; ; exit If (lookupF) is true then the current name lookup is killed and the ; routine exits. Else if the current call hasn't completed then ; the routine simply exits. If the call has completed, the retry counts ; are updated and the list is updated if the size has changed. If it finds ; no printers it will retry once else will assume that is correct. Then ; a new lookup is started. ;; alternate entrypoint: cndE. ; ; cndE will start a new lookup. cnd lda lookupF beq cnd1 if ok to do lookup brl knl kill name lookup and return cnd1 lda callcompF beq cnd8 if previous call didn't complete lda gmyp_pblk.retryper and #$ff cmp #5 bcs cnd2 if at maximum ina shortm sta gmyp_pblk.retryper increment retry period sta gmyp_pblk.retrycnt increment retry count longm cnd2 lda gmyp_pblk.rgotten # found so far and #$ff 255 max cmp plistsize bcs cnd3 if found something dec cnda bpl cnd4 if should try again cnd3 lda #1 sta cnda reset retry counter jsr anl add names to list ; start another lookup up cndE cnd4 jsr ghz get highlighted zone beq cnd5 if no other zones dea jsr giz get index into zones [l4] lda #myzonename sta l2 lda #^myzonename sta l2+2 ldy #memrec.memptr lda [l4],y sta l1 iny iny lda [l4],y sta l1+2 jsr cus comapre uppercase strings bcc cnd6 if didn't select the current zone cnd5 lda #asterisk the asterisk represents the current zone in search sta l3 lda #^asterisk sta l3+2 bra cnd7 cnd6 lda l1 save ptr to zone name to search sta l3 lda l1+2 sta l3+2 cnd7 stz callcompF call not completed brl snl start name lookup and return cnd8 rts cnda dc.w 1 ;; cps - copy pascal string. ; ; entry [l1] = ptr to destination string ; [l2] = ptr to source string. ; ; exit string is copied. cps ldx #$ff cpsE stx w1 save max # of chars to copy shortmx lda [l2] sta w2 length of source string ldy #0 cps1 sty w3 current index cpy w1 bcc cps2 if not past max count bne cps4 if past max count cps2 cpy w2 bcc cps3 if not past source string length bne cps5 if done cps3 lda [l2],y get char from source string sta [l1],y place into destination string iny bne cps1 if didn't wrap, process next char bra cps5 finish things up cps4 dey tya sta [l1] replace new length cps5 longmx rts ;; cst - create static text. ; ; entry [x,y] = ptr to control. ; [data1] = window ptr. ; ; exit control is created. cst pha space for result pha pushl data1 window pointer pushw #0 next item is a ptr to a control phy hi word of control phx lo word of control _NewControl2 create the control pla pla don't care about result rts ;; ctp - close the printer. ; ; entry (popen_pblk.refnum) = refnum of open connection. ; ; exit printer connection is closed. ctp ldx #punload_pblk ldy #^punload_pblk jsl $e11014 close all printer connections rts ;; cus - compare uppercase strings. ; ; entry [l1] = ptr to first pascal string. ; [l2] = ptr to second pascal string. ; ; exit strings are compared case insensitive. ; (c) set if strings are equal. cus shortmx lda [l1] sta w1 length of first string cmp [l2] bne cus4 if string lengths are different ldy #0 cus1 iny sty w3 lda [l1],y cmp #'a' bcc cus2 if not lowercase cmp #'z'+1 bcs cus2 if not lowercase sbc #$20-1 (c) clear cus2 sta w2 save lda [l2],y cmp #'a' bcc cus3 if not lowercase cmp #'z'+1 bcs cus3 if not lowercase sbc #$20-1 (c) clear cus3 cmp w2 bne cus4 if strings don't match cpy w1 bcc cus1 if more to check longmx rts (c) set, strings match cus4 longmx clc rts strings don't match ;; dah - dereference a handle. ; ; entry [a,x] = handle to dereference. ; ; exits (a) = upper word of dereferenced handle. ; [l1] = dereferenced handle dah sta l2 stx l2+2 lda [l2] sta l1 lo ptr ldy #2 lda [l2],y sta l1+2 hi ptr rts ;; dam - display alert message. ; ; entry [a,y] = ptr to message. ; ; exit centered caution alert displayed. ;; alternate entry point: damE. ; ; entry [a,y] = ptr to message. ; ; exit centered stop alert is displayed. dam sec skip1 damE clc ror damF save type wanted for now sta dammsg save message ptr sty dammsg+2 _InitCursor make sure cursor is reset ldx #(320-damw)/2 lda screenF bpl dam1 if 320 mode ldx #(640-damw)/2 dam1 stx damtemp+2 left edge txa clc adc #damw sta damtemp+6 right edge pha pushl #damtemp template pushl #0 no filter jsr dwh disable window highlighting lda damF bpl dam2 if user wants a stop alert _CautionAlert bra dam3 dam2 _StopAlert dam3 jsr ewh enable window highlighting pla ignore item hit but get it off the stack rts damt equ 60 damb equ 140 damh equ damb-damt daml equ 170 damr equ 470 damw equ damr-daml damtemp dc.w damt,daml,damb,damr dc.w 2376 id dc.b $80 dc.b $80 dc.b $80 dc.b $80 dc.l okitem dc.l damstr dc.l 0 okitem dc.w ok okay button dc.w damh-17,190,damh-4,260 dc.w buttonItem dc.l oktext,0,0 damstr dc.w 1348 text item dc.w 5,75,5+6*9,280 dc.w StatText+ItemDisable dammsg dc.l 0,0,0 damF dc.w 0 ;; dwh - disable window highlighting. ; ; entry none. ; ; exit window highlighting is disabled. dwh pha pushw #$0001 flag for disabling window highlighting _WindowGlobal pla rts ;; dzl - draw zone list. ; ; entry (zindex) = item # of selected zone. ; [zlisthdl] = handle to zone list. ; ; exit list is redrawn so current item is displayed. dzl pushw zindex index of zone pushl zlisthdl _SelectMember2 scroll list so current zone is shown rts ;; ewh - enable window highlighting. ; ; entry none. ; ; exit window highlighting enabled. ewh pha pushw #$FFFE flag for enabling window highlighting _WindowGlobal pla rts ;; fsz - find starting zone in list. ; ; This routine is called to see if a specified zone is in our zone list. ; If the zone is in the list, it is selected. ; ; entry (zonebuffer..) = list manager list containing zone list. ; (zonename..) = name of zone to look for. ; (zlist..) = zone list control template. ; ; exit If the zone is found: ; zone is selected. ; [cszone] = ptr to zone in list. ; [lszone] = ptr to zone in list. ; (zindex) = index of zone that was selected. fsz stz w4 init counter lda zlist+$1a get list size sta w5 # to check lda #zonebuffer sta l3 lda #^zonebuffer sta l3+2 lda #zonename sta l2 lo ptr to name of zone to look for lda #^zonename sta l2+2 hi ptr to name of zone to look for fsz1 lda w4 get index cmp w5 compare against total bcs fsz3 if not found inc w4 ldy #memrec.memPtr lda [l3],y sta l1 iny iny lda [l3],y sta l1+2 jsr cus compare uppercase string bcs fsz2 if found a match ; move to next element. lda l3 adc #memrec.sizeof (c) clear sta l3 bcc fsz1 if didn't cross bank inc l3+2 bra fsz1 process next entry ; found a match. fsz2 lda l3 sta cszone save current zone selection sta lszone lda l3+2 sta cszone+2 sta lszone+2 shortmx ldy #memrec.memflag lda #memselected sta [l3],y select the current printer longmx lda w4 sta zindex index of zone in list fsz3 rts ;; gap - get actual pointer. ; ; gap will retrieve the pointer to a string in an entry in a ; list manager list. ; ; entry [l4] = ptr to this entry in list manager list. ; ; exit [l2] = ptr to string for this item. gap ldy #memrec.memptr lda [l4],y sta l2 low ptr iny iny lda [l4],y hi ptr sta l2+2 rts ;; gdt - get device type. ; ; entry (devices) = index of printer type in table. ; (typeptr..) = ptrs to printer type names. ; ; exit [l2] = name of current printer type. gdt lda devices type of printer asl a tax lda typeptr,x sta l2 lda #^typeptr bank sta l2+2 rts ;; gpn - get printer names. ; ; entry (zonename..) = pascal string containing zone name to look in. ; ; exit name lookup is started. gpn lda #zonename sta l3 lda #^zonename sta l3+2 brl snl start name lookup and return ;; gsz - get starting zone. ; ; Unlike the netprinter CDEV, the current zone is always the starting zone. ; ; entry (myzonename..) = pascal string of current zone. ; ; exit (zonename..) = (myzonename..). ; if the length of (myzonename) > 0 then (lzwpns..) = (myzonename..). ; else (lzwpns) = 0. gsz lda #myzonename sta l2 lda #^myzonename sta l2+2 gsz2 lda #zonename sta l1 lda #^zonename sta l1+2 jsr cps copy pascal string lda #lzwpns sta l1 dest loc for eventual copy lda #^lzwpns sta l1+2 lda zonename and #$ff beq gsz3 if don't have a zone name lda #zonename source loc ldx #^zonename bra gsz6 copy zonename to lzwpns gsz3 stz lzwpns no zone name rts gsz6 sta l2 lo source ptr stx l2+2 hi source ptr brl cps copy pascal string and return gsz7 rts ;; ghp - get highlighted printer. ; ; entry [plisthdl] = handle to printer list control. ; ; exit (a) = item # of highlighted printer. ghp pha space for call pushw #0 start from top of list pushl plisthdl use printer list _NextMember2 pla rts ;; ghz - get highlighted zone. ; ; entry [zlisthdl] = handle to zone list control. ; ; exit (a) = item # of highlighted zone. ghz pha space for result pushw #0 start from top of list pushl zlisthdl _NextMember2 pla selected zone, or 0 if none selected rts ;; gip - get index into printers. ; ; entry (a) = index of desired printer. ; (namesbuffer..) = printer list definition. ; ; exit [l4] = ptr to entry in namesbuffer list. gip jsr goa get offset into array clc adc #namesbuffer sta l4 tya adc #^namesbuffer sta l4+2 rts ;; giz - get index into zones. ; ; entry (a) = index of desired zone. ; (zonebuffer..) = zone list definition. ; ; exit [l4] = ptr to entry in zonebuffer list. giz jsr goa get offset into array clc adc #zonebuffer sta l4 tya adc #^zonebuffer sta l4+2 rts ;; gmz - get my zone. ; ; entry (gmyz_pblk..) = parameter block to get current zone. ; ; exit (myzonename..) = pascal string containing user's zone. gmz ldx #gmyz_pblk ldy #^gmyz_pblk jsl $e11014 gmz1 lda gmyz_pblk+2 get status cmp #busy beq gmz1 if request not finished yet tay beq gmz2 if no error stz myzonename assume no name for zone gmz2 rts ;; goa - get offset into array. ; ; entry (a) = offset desired. ; memrec.sizeof = size of each element ; ; exit [l4] = offset of entry goa pha pha space for call pha element wanted pushw #memrec.sizeof _Multiply pla sta l4 ply sty l4+2 rts ;; gzl - get zone list. ; ; entry (ginfoprarams..) = parameter block to get appletalk info. ; maxzones = max # of zones to worry about. ; namelen = max length of object names. ; (zlist..) = zone list control template. ; (zonelist_pblk..) = parameter block to get zone list. ; ; exit [cszone] = 0. ; (devices) = starting device. ; (ldwpns) = starting device. ; [lszone] = 0. ; [zonenamehdl] = handle to memory for zone list. ; (zonebuffer..) = list mamanger list containing zones. ; ; if there is for memory for zonenamehdl, routine exits to hom. gzl ldx #GinfoParams get low word pointer to parameter list ldy #^GinfoParams get high word pointer to parameter list jsl $e11014 shortm lda GinfoParams+getinfo.ABridge sta bridge sta zonelist_pblk.brnode longm lda zonenamehdl ora zonenamehdl+2 ;do we have this handle yet? bne gzl_haveHndl ;yes, don't allocate again lda #maxzones*(namelen+1+5) gzl1 pha space for result pha space for result pushw #0 hi word of size to create pha lo word of size to create pha space for memory id _MMStartup put control panel mem ID on stack pushw #attrLocked pha pha _NewHandle pla sta zonenamehdl pla sta zonenamehdl+2 bcc gzl3 if no memory problems gzl2 brl hom handle out of memory and return gzl_haveHndl gzl3 lda bridge beq gzl6 if no bridge jsr gmz get my zone lda #3 sta w1 gzl4 lda zonenamehdl ldx zonenamehdl+2 jsr dah derefence a handle sta zonelist_pblk.bufptr+2 hi word lda l1 sta zonelist_pblk.bufptr lo word gzl5 ldx #zonelist_pblk ldy #^zonelist_pblk jsl $e11014 lda zonelist_pblk.numberzones and #$ff only 255 possible bne gzl6 if got some zones dec w1 bne gzl5 if should try again gzl6 sta zlist+$1a size of list - total # of zones that were found lda devices sta ldwpns last device with printer name selected jsr gsz get starting zone ; now create all of the pointers to the pascal strings in zonenames. lda zonenamehdl ldx zonenamehdl+2 jsr dah dereference a handle lda #zonebuffer sta l2 lda #^zonebuffer sta l2+2 stz w2 current index into list gzl9 ldy #memrec.memptr lda l1 sta [l2],y low ptr to this string iny iny lda l1+2 sta [l2],y high ptr to this string shortmx ldy #memrec.memflag lda #0 sta [l2],y entry is not selected longmx lda l2 clc adc #memrec.sizeof sta l2 bcc gzl10 inc l2+2 gzl10 jsr mneE move to next element lda w2 current index into zone list ina sta w2 cmp zlist+$1a compare against total zones bcc gzl9 if more zones to do lda #1 sta zlist+$20 start at top of list stz cszone stz cszone+2 nothing is currently selected stz lszone stz lszone+2 nothing was selected rts ;; hom - handle out of memory. ; ; entry program wasn't able to get memory wanted. ; ; exit memory dialog displayed and removed. ; (atalkF) = 0. hom stz atalkF pretend there is no appletalk lda #emess7 'There is not memory to continue' ldy #^emess7 brl damE display stop alert and return ;; hpe - handle pap error. ; ; entry (a) = error. ; (emess10..) = error message for when printer is not responding. ; (emess11..) = error message for when network error. ; (emess13..) = error message for when printer can't be found. ; ; exit error message is displayed in a centered stop alert. hpe cmp #$805 bne hpe1 if not a name not found error cmp #$807 bne hpe1 if not a network error lda #emess13 'The selected printer could not be found' bra hpe3 hpe1 cmp #$808 bne hpe2 if not a server not responding error lda #emess10 'The selected printer is not responding...' bra hpe3 hpe2 lda #emess11 'A network error has occurred...' hpe3 ldy #^emess11 bank is the same for all messages brl damE display alert message and return ;; hpl - hit printer list. ; ; entry user clicked in an entry in the printer list. ; Atalkon = flag to indicate that appletalk is on. ; (devices) = index of device type. ; [plisthdl] = handle to printer list control. ; [zlisthdl] = handle to zone list control. ; ; exit emulator button is highlighted if laserwriter. ; (ldwpns) = (devices). ; (lzwpns..) = last zone with printer name selected. ; (prec.appletlk) = Atalkon. ; (prec.netname..) = pascal string containing printer name. hpl jsr ghp get highlighted printer beq hpl2 if nothing selected, exits ldx #1 stx selF flag that a selection was made dea jsr gip get index into printers [l4] lda #noHilite jsr cbs jsr gap get actual pointer stz lzwpns jsr ghz get highlighted zone hpl2 beq hpl3 if no zone is selected dea jsr giz get index into zones [l4] jsr gap get actual pointer lda #lzwpns last zone with printer name selected sta l1 lda #^lzwpns sta l1+2 jsr cps copy pascal string hpl3 lda devices sta ldwpns last device with printer name selected rts ;; hpu - hit pop up. ; ; entry user has selected an item from the popup. ; [data1] = handle to popup control. ; (devices) = current device type. ; (ldwpns) = last device with printer name selected. ; (lzwpns..) = last zone with printer name selected. ; (selF) != 0 if selection was made. ; ; exit if the user chose the same as current nothing is done. Else a new printer ; list is generated for this zone. hpu pha space for result pushl data1 ptr to control _GetCtlValue pla dea cmp devices beq hpu9 if the same as previous printer type sta devices new device type to use lda ldwpns last device with printer name selected cmp devices bne hpu1 if not the same as selected device lda SelF beq hpu1 if no selection pha space for result pushl zlisthdl handle to list control _ResetMember2 unselect the current zone pushl zlisthdl _DrawMember2 redraw the zone unselected lda #lzwpns sta l2 lda #^lzwpns sta l2+2 lda #zonename sta l1 lda #^zonename sta l1+2 jsr cps copy pascal string jsr fsz find starting zone jsr dzl draw zone list hpu1 jsr ghz get highlighted zone beq hpu8 if no zones stz lszone stz lszone+2 force it to recalculate brl hzlE handle zone list (will get new list of printers) and return hpu8 brl hzlEE handle zone list and return hpu9 rts ;; hzl - hit zone list. ; ; entry user clicked in the zone list to select a zone. ; [lszone] = ptr to last selected zone. ; ; exit if the selected zone hasn't changed, routine just returns, else ; the current name lookup is stopped. ; a new name lookup is started with the selected zone. ; buttons are inactivated. ; [lszone] = ptr to zone the user clicked on. ; (pindex) = 0. ; [pmatch] = 0. ; (plistsize) = 0. ;; alternate entry point: hzlE. ; ; (a) = item # of zone. ;; alternate entry point: hzlEE. ; ; force routine to kill current lookup and restart a name lookup. hzl jsr ghz get highlighted zone hzlE dea jsr giz get index into zones [l4] ldx l4 stx cszone lo ptr to record of selected zone lda l4+2 sta cszone+2 hi ptr to record of selected zone cmp lszone+2 bne hzl1 if not the same zone cpx lszone beq hzl2 if selected the same zone as before hzl1 stx lszone sta lszone+2 save for next comparison hzlEE jsr knl kill name lookup stz pmatch stz pmatch+2 stz pindex nothing selected stz plistsize flag nothing valid pushl #0 ;use standard drawing routine pushw #1 item # of first displayed member pushl #$ffffffff use current value for listref pushw #$ffff no change to listref descriptor pushw #0 size of list pushl plisthdl handle to list _NewList2 lda #inactiveHilite jsr cbs change button status brl cndE check for new devices and return hzl2 rts ;; iai - is appletalk active. ; ; entry (iaia..) = gs/os parameter block to get the device # of appletalk driver. ; ; exit (c) set if appletalk driver isn't active. ; (atalkF) = 0 if no appletalk, else = 1. iai _GetDevNumberGS iaia lda #1 asssume found bcc iai1 if no error - appletalk active dea iai1 sta atalkF set flag rts iaia dc.w 2 two parameters dc.l iaib ptr to device name ds.b 2 result - not used iaib dc.w iaiblen dc.b '.APPLETALK' iaiblen equ *-iaib-2 ;; ipl - initialize printer list. ; ; ipl is used to go through the printer list and mark all of the ; items as unselected. ; ; entry maxsrvrs = max # of printers to worry about per zone. ; (namesbuffer..) = printer list. ; ; exits every element is unselected. ; (plistsize) = 0. ipl stz w1 init counter lda #namesbuffer sta l1 lda #^namesbuffer sta l1+2 stz plistsize nothing in the list ipl1 shortmx ldy #memrec.memflag lda #0 sta [l1],y longmx lda w1 ina sta w1 bump up counter cmp #maxsrvrs bcs ipl2 if done lda l1 adc #memrec.sizeof (c) clear sta l1 bcc ipl1 if didn't cross bank inc l1+2 bra ipl1 process next entry ipl2 rts ;; knl - kill name lookup. ; ; entry (kill_pblk..) = parameter block to stop name lookup. ; ; exit lookup is stopped. ; (gmyp_pblk.retryper) = 1 for next name lookup call. ; (gymp_pblk.retrycnt) = 1 for next name lookup call. knl ldx #kill_pblk ldy #^kill_pblk jsl $e11014 shortm lda #1 sta gmyp_pblk.retryper reset retry period for intial look sta gmyp_pblk.retrycnt reset retry count for initial look longm rts ;; mne - move to next element. ; ; mne is used to move past an entry in the buffer that is created ; by a name lookup call. ; ; entry [l1] = ptr to current entry in buffer. ; ; exit [l1] = ptr to next entry in buffer. ;; alternate entrypoint: mneE. ; ; mneE will move past a pascal string. ; ; entry [l1] = ptr to start of pascal string. ; ; exit [l1] = ptr is moved past the string mne lda l1 clc adc #5 sta l1 bcc mne1 if no carry into hi word inc l1+2 mne1 jsr mneE get past type field jsr mneE get past zone field twice ; routine jsr's to here from above since that is the most efficient ; way of doing this. mneE mne2 lda [l1] and #$ff get length of field sec adc l1 add in length of string + length byte sta l1 bcc mne3 if no carry into hi word inc l1+2 mne3 rts ;; omd - open modal dialog. ; ; entry [a,y] = fwa of dialog template. ; ; exit modal dialog is opened. ; window highlighting is turned off. ; [l5] = dialog pointer. omd pha space for result pha phy fwa of dialog template pha jsr dwh disable window highlighting _GetNewModalDialog pla get dialog pointer sta l5 low word of pointer sta dptr pla sta l5+2 high word of pointer sta dptr+2 rts ;; otp - open the printer. ; ; entry (popen_pblk..) = parameter block to open a printer connection. ; [pstat_pblk.prname] = ptr to printer name. ; ; exit (a) = result code. otp lda pstat_pblk.prname move ptr to name over sta popen_pblk.prname lda pstat_pblk.prname+2 sta popen_pblk.prname+2 ldx #popen_pblk get low word pointer to parameter list ldy #^popen_pblk get high word pointer to parameter list jsl $e11014 rts otp1 lda popen_pblk.result cmp #papbusy beq otp1 if busy otp2 rts ;; rfp - read from printer. ; ; rfp is used to keep a constant read coming from the printer so ; there is never a time when the printer is waiting to send status. ; The data read from the printer is ignored. ; ; entry (popen_pblk.refnum..) = refnum of open connection. ; (pread_pblk..) = parameter block to read from printer connection. ; ; exit read request is started if the last one has stopped. rfp lda pread_pblk.result cmp #PapBusy beq rfp1 if last call hasn't finished yet rfpE shortm lda popen_pblk.refnum sta pread_pblk.refnum set refnum of the connection longm lda #512 sta pread_pblk.buflen ldx #pread_pblk get low word pointer to parameter list ldy #^pread_pblk get high word pointer to parameter list jsl $e11014 rfp1 rts export readbuff readbuff ds.b 512 ;; snl - start name lookup. ; ; entry (gmyp_pblk..) = parameter block for getting namelist. ; ; exit namelookup is started. ; (lookupF) = 0. snl lda #('='<<8)+1 one char string of '=' sta netobj any object lda #netobj+2 sta l1 lda #^netobj+2 sta l1+2 jsr gdt get device type [l2] jsr cps copy pascal string jsr mneE move to next element snl1 lda l3 lo ptr to zonename to check sta l2 lda l3+2 hi ptr to zonemname to check sta l2+2 jsr cps copy pascal string stz lookupF don't stop the lookup ldx #gmyp_pblk ldy #^gmyp_pblk jsl $e11014 lda gmyp_pblk.result get result in case caller cares rts ;; stp - status the printer. ; ; entry a printer is selected. ; (pstat_pblk..) = parameter block to status a printer. ; ; exit (a) = result code. ; (netobj2..) = printer tuple. ;; alternate entry point: stpE. ; ; entry [pstat_pblk.prname] = ptr to printer tuple. stp jsr ghp get highlighted printer dea offset into list (always is 1 selected) jsr gip get index into printers ldy #memrec.memptr lda [l4],y sta l2 lo word of ptr to name iny iny lda [l4],y sta l2+2 hi word of ptr to name lda #netobj2 sta pstat_pblk.prname sta l1 lda #^netobj2 sta pstat_pblk.prname+2 sta l1+2 jsr cps copy pascal string jsr mneE move to next element jsr gdt get device type jsr cps copy pascal string jsr mneE move to next element lda cszone ora cszone+2 bne stp1 if have selected a zone lda #asterisk current zone bra stp2 stp1 lda #lzwpns last zone with printer name selected stp2 sta l2 lda #^lzwpns sta l2+2 jsr cps copy pascal string stpE jsr knl kill name lookup ldx #pstat_pblk ldy #^pstat_pblk jsl $e11014 stp3 lda pstat_pblk.result cmp #papbusy beq stp3 if not done yet rts ;; wtp - write to printer. ; ; entry (popen_pblk.refnum) = connection refnum. ; (pwrite_pblk..) = parameter block for write command. ; ; exit data is written to printer ; (a) = result code. wtp shortm lda popen_pblk.refnum sta pwrite_pblk.refnum longm ldx #pwrite_pblk ldy #^pwrite_pblk jsl $e11014 wtp1 lda pwrite_pblk.result cmp #PapBusy beq wtp1 if still busy rts ; uninitialized data. bridge ds.b 2 bridge # callcompF ds.b 2 != 0 if call completed cszone ds.b 4 ptr tp currently selected zone devices ds.b 2 offset of type of device dptr ds.b 4 dialog pointer ldwpns ds.b 2 last device with printer name selected lookupF ds.b 2 != 0 if to look for new devices lszone ds.b 4 ptr to last selected zone lzwpns ds.b namelen+1 last zone with printer name selected myzonename ds.b namelen+1 name of user's home zone namesbuffer ds.b memrec.sizeof*MaxSrvrs netobj ds.b 100 build network entity here netobj2 ds.b 100 hold name openblock ds.b MaxSrvrs*(99+5) holds memory for call to get printer names openblock2 ds.b MaxSrvrs*(99+5) holds memory for call to get printer names pindex ds.b 2 offset of printer in list plisthdl ds.b 4 handle to printer list control record plistsize ds.b 2 size of printer list pmatch ds.b 4 ptr to printer name in list rtpbuthdl ds.b 4 handle to rename button control screenF ds.b 2 high bit set if this is a 640 mode screen selF ds.b 2 != 0 if a selection was made wptr ds.b 4 window pointer zindex ds.b 2 index to zones zlisthdl ds.b 4 handle to zone list control zonebuffer ds.b memrec.sizeof*maxzones list of zones for list manager zonename ds.b 33 name of zone zonenamehdl ds.b 4 handle to zonename list from nbp call NBPBusyF ds.w 1 flag to say we couldn't lookup b/c NBP was busy cdev_result ds.l 1 ;result for Control Panel endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/namer.r b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/namer.r new file mode 100644 index 0000000..7a1f231 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/namer.r @@ -0,0 +1 @@ +/*******************************************************************/ /* /* namer.r /* /* Copyright (C) 1988-1992 /* Apple Computer, Inc. /* All Rights Reserved /* /* This file contains the source of the resources needed to build the /* AppleTalk Namer CDEV. /* /*******************************************************************/ #include "typesiigs.r" resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"FFF000000000000000000000000F" $"FF0F99FFF99FF99FFFFFF00FFF0F" $"F0FF9F9F9FF9F9F9FFFF07700F0F" $"F0FF99FF9FF9F99FFFF07077700F" $"F0FF9F9F9FF9F9F0000704077700" $"FF0F99FFF99FF99FFF0000077733" $"FFF0000000000000000700777733" $"FFF0FFFFFFFFFFFFFFF077777733" $"FFF0000000000000000000000000" $"FFF0F4FFFFFFFFFFFFFFFFFFFFF0" $"FFF0000000000000000000000000" $"FFF0F0F0F0F0F0F0F0F0F0F0F0F0" $"FFF0000000000000000000000000" $"FFFFFFFFFFFFFFF0F0FFFFFFFFFF" $"FFFFFFFFFFFFFF00000FFFFFFFFF" $"FFFFFFFFFFFFFF0FFF0FFFFFFFFF" $"FFFFFFFFFFFFFF00000FFFFFFFFF" $"00F00000000000FF0FF000000F00" $"FFFFFFFFFFFFFFF0F0FFFFFFFFFF" $"00F000000000000FFF0000000F00", $"000FFFFFFFFFFFFFFFFFFFFFFFF0" $"00FFFFFFFFFFFFFFFFFFFFFFFFF0" $"0FFFFFFFFFFFFFFFFFFFFFFFFFF0" $"0FFFFFFFFFFFFFFFFFFFFFFFFFF0" $"0FFFFFFFFFFFFFFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000000000000000FFF0000000000" $"00000000000000FFFFF000000000" $"00000000000000FFFFF000000000" $"00000000000000FFFFF000000000" $"FF0FFFFFFFFFFFFFFFFFFFFFF0FF" $"FF0FFFFFFFFFFFFF0FFFFFFFF0FF" $"FF0FFFFFFFFFFFF000FFFFFFF0FF"; }; read rCDEVCode (1,Convert) "namer.Load"; resource rCDEVFlags (1) { wantInit+wantClose+wantHit+wantCreate +wantAbout+wantRun+wantMachine, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ {0,0,145,280}, /* DataRect */ "Namer", /* Name */ "Michael Stein", /* Author */ "v1.1"; /* VersStr */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/namerdata.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/namerdata.aii new file mode 100644 index 0000000..1337747 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/namerdata.aii @@ -0,0 +1 @@ +;;; namerdata - data records and strings used by namer CDEV. ; ; Michael V. Stein 04/21/90. ; ; © Copyright Apple Computer, 1990. blanks off ;; equates. fCtlCanBeActive equ $4000 InsideScrollBar equ 4 ;; include files. include 'e16.control' include 'e16.gsos' include 'e16.list' include 'netprinter.h' ;; main program. netdata proc ;; exported addresses. export about export appletalk export asterisk ;export atalkerr export atalkerrm export atalkF export choosepr export cprect export ctllist export emess7 export emess10 export emess11 export emess13 export NBPbusyMsg export ginfoparams export gmyp_pblk export gmyz_pblk export kill_pblk export oktext export popen_pblk export plist export pread_pblk export psetpr_pblk export pstat_pblk export ptypes export punload_pblk export pwrite_pblk export quit export rtpbut export rtpstat export tryagain export typeptr export zlist export zonelist_pblk ;; imported addresses. import acr import myzonename import namesbuffer import netobj import openblock import openblock2 import readbuff import username import zonebuffer atalkF dc.w 1 != 0 if appletalk is active, defaults to active ; error strings. string asis emess7 dc.b emess7L dc.b 'There is not enough memory' dc.b $0d dc.b 'to continue.' emess7L equ *-emess7-1 ; error messages used by the rename and emulator routines. emess10 dc.b emess10L dc.b 'The selected printer' dc.b $0d dc.b 'is not responding.' dc.b $0d dc.b 'Please try again.' emess10L equ *-emess10-1 emess11 dc.b emess11L dc.b 'A network error has' dc.b $0d dc.b 'occurred. Please try' dc.b $0d dc.b 'again.' emess11L equ *-emess11-1 emess13 dc.b emess13L dc.b 'The selected printer' dc.b $0d dc.b 'could not be found.' emess13L equ *-emess13-1 NBPbusyMsg dc.b @end-@start @start dc.b 'A list of printers cannot', $0D dc.b 'be displayed because a', $0D dc.b 'network search is already', $0D dc.b 'in progress on this computer.' @end string pascal appletalk dc.b 'APPLETALK' asterisk dc.b '*' oktext dc.b 'OK' quit dc.b 'Quit' used in disk error alerts rtptitle dc.b 'Rename PrinterÉ' title of rtp button tryagain dc.b 'Try Again' used in disk error alerts ptypes laser dc.b 'LaserWriter' im dc.b 'ImageWriter' imlq dc.b 'LQ' typeptr dc.w laser,im,imlq string asis rtpstat dc.b rtpstatL dc.b ' Renaming the printer...' rtpstatL equ *-rtpstat-1 zonetext dc.b 'AppleTalk Zones:',0 zonetextL equ *-zonetext-1 ; appletalk parameter blocks. ; parameter block to get appletalk info. GinfoParams dc.b synchronous type dc.b GetInfoCmd command dc.w 0 result dc.l 0 completion routine dc.w 0 ThisNet dc.b 0 Abridge dc.b 0 HardWareID dc.w 0 Rom version dc.b 0 node number ; parameter block to find printers. gmyp_pblk dc.b asynchronous mode dc.b NBPLookup command dc.w busy result dc.l acr completion routine dc.l netobj ptr to name of what we want to find dc.b 1 retry period in 1/4 secs dc.b 1 # of times to retry dc.w 0 somehting internal dc.w pblocksize receive buffer size dc.l openblock2 store responses here dc.b maxsrvrs maximum # of responses allowed dc.b 0 actual number of responces received ; parameter block to get my zone. gmyz_pblk dc.b asynchronous mode dc.b GetMyZone command dc.w busy result dc.l 0 no completion routine dc.l myzonename bufptr dc.b 2 retry period dc.b 8 # of retrys dc.w 2 reserved ; parameter block to kill the current name lookup. kill_pblk dc.b synchronous mode dc.b KillNBP kill name binding protocol dc.w 0 result code dc.l gmyp_pblk starting parameter block ; parameter block to get the zone list. zonelist_pblk dc.b synchronous dc.b GetZoneList dc.w busy dc.l 0 iocomp dc.w MaxZones*(NameLen+4) buflen dc.l 0 bufptr (filled in dynamically) dc.b 0 brnode dc.w 1 strtindex dc.b 1 retryinterval dc.b 2 retrycount dc.w 0 # of zones?? dc.w 0 reserved ; pap parameter blocks. punload_pblk dc.b synchronous dc.b $27 pap unload command dc.w 0 result dc.l 0 completion ptr popen_pblk dc.b asynchronous dc.b Popen command dc.w 0 result dc.l 0 iocomp dc.b 0 refnum dc.l 0 ptr to name dc.b 1 flowq dc.l readbuff statbuf psetpr_pblk dc.b synchronous dc.b PMSetPrinterCmd command dc.w 0 result dc.l 0 iocomp dc.l atinitrec+34 ptr to printer tuple dc.b 0 flags dc.w 2 flush interval dc.w 30*4 timeout interval dc.w 20 # of buffers pstat_pblk dc.b asynchronous dc.b Pstatus command dc.w 0 result dc.l 0 iocomp dc.l 0 ptr to entity dc.l readbuff stat buffer pread_pblk dc.b asynchronous dc.b Pread command dc.w 0 result dc.l 0 iocomp dc.b 0 refnum dc.w 0 buflen dc.l readbuff bufptr dc.b 0 eofbyte dc.w 0 reserved pwrite_pblk dc.b asynchronous dc.w PWrite command dc.w 0 result dc.l 0 iocomp dc.b 0 refnum dc.w 0 buflen dc.l 0 bufptr dc.b 0 eofbyte ; ctllist contains a list of controls whose handles we don't need very often. ctllist dc.l choosepr dc.l ztext dc.l 0 choosepr dc.w 9 PCount dc.l 1 control ID dc.w 5,leftedge,17,rightedge rectangle dc.l $87000000 procRef dc.w $0040 flag dc.w $1084 moreflags (added $0080 popDownTriangle 25-Aug-92 DAL) dc.l 0 refcon dc.w 64 titleWidth dc.l chooseprmenu menuref dc.w 0 initialvalue chooseprmenu dc.b '>>Printer:\H' dc.w 1 dc.b $0D dc.b '==LaserWriter\H' dc.w 1 dc.b $0D dc.b '==ImageWriter\H' dc.w 2 dc.b $0d dc.b '==ImageWriter LQ\H' dc.w 3 dc.b $0d dc.b '.' about dc.w 8 Pcount dc.l 10 ID dc.w 38,5,138,280 dc.l statTextControl dc.w 0 dc.w fCtlProcRefNotPtr dc.l 0 dc.l atext dc.w AtextL atext dc.b 'The Namer Control Panel lets you rename ' dc.b 'any AppleTalk printer. Select the ' dc.b 'type of printer with the pop-up menu. ' dc.b 'Once you have chosen a printer, click ' dc.b 'on the "Rename PrinterÉ" button.' atextL equ *-atext ;atalkerr dc.w 8 PCount ;dc.l 11 id ;dc.w 8,leftedge,38,Rightedge+20 ;dc.l statTextControl ;dc.w 0 ;dc.w fCtlProcRefNotPtr ;dc.l 0 ;dc.l atalkerrm ptr to text ;dc.w atalkerrmL length atalkerrm dc.b atalkerrmL-1 dc.b 'AppleTalk must be' dc.b 13 dc.b 'installed and enabled to' dc.b 13 dc.b 'run this Control Panel.' dc.b 13 ;dc.b ' ' atalkerrmL equ *-atalkerrm plist dc.w 15 PCount dc.l 2 ID dc.w 20 rectangle dc.w LeftEdge dc.w 62 dc.w Rightedge dc.l listControl ctrldefproc dc.w $80 ctlFlag dc.w fCtlTarget+fCtlProcRefNotPtr+fCtlCanBeTarget+fCtlWantEvents moreFlags dc.l 0 ref con dc.w 0 ctlListSize dc.w MaxSrvrView ctlListView dc.w selectOnlyOne+InsideScrollBar dc.w 1 ctlListstart dc.l 0 ctlListDraw dc.w 10 ctlListMemHeight dc.w memrec.sizeof ctlListMemSize dc.l namesbuffer ctlListRef dc.l 0 ctlColorRef zlist dc.w 15 PCount dc.l 3 ID dc.w 100-3 rectangle dc.w LeftEdge dc.w 142-3 dc.w RightEdge dc.l listControl ctrldefproc dc.w $80 ctlflag dc.w fctlProcRefNotPtr+fCtlCanBeTarget+fCtlWantEvents moreFlags dc.l 0 ref con dc.w 0 ctlListSize dc.w MaxZoneView ctlListView dc.w selectOnlyOne+InsideScrollBar dc.w 1 ctlListstart dc.l 0 ctlListDraw dc.w 10 ctlListMemHeight dc.w memrec.sizeof ctlListMemSize dc.l zonebuffer ctlListRef dc.l 0 ctlColorRef cprect dc.w 0,0,200,300 control panel rectangle ztext dc.w 8 Pcount dc.l 9 ID number dc.w 94-4-3 dc.w leftedge dc.w 103-4-3 dc.w rightedge dc.l statTextcontrol dc.w 0 flag, c string dc.w fctlProcRefNotPtr dc.l 0 ref con dc.l zonetext text ref dc.w zonetextL length of string ; buttons. rtpbut dc.w 9 Pcount dc.l 5 ID number dc.w 69 dc.w leftedge+5+40 dc.w 69+13 dc.w rightedge-5-40 dc.l simpleButtoncontrol dc.w simpRound+ctlInvis dc.w fCtlWantEvents+fctlProcRefNotPtr dc.l 0 dc.l rtptitle dc.l 0 ;color table dc.b 'R','r' ;key equivalents R and r with dc.w $0100,$0100 ;the Command key EndP end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/netprinter.h b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/netprinter.h new file mode 100644 index 0000000..b9f631c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/netprinter.h @@ -0,0 +1 @@ + atinitrec record 0 name ds.b 33 pflags ds.b 1 tuple ds.b 99 sizeof ;size of this record endr printersetup record 0 printer ds.b 33 printer2 ds.b 33 port ds.b 33 name ds.b 16 netname ds.b 33 zone ds.b 33 Appletlk ds.b 2 sizeof ;size of this record endr MaxVols equ 16 maximum number of volumes per server? MaxVolLength equ 27+1 volume name can be 27 characters long + 1 length char for pascal strings MaxSrvrs equ 40 maximum number of file server names we can hold MaxSrvrView equ 4 how many names in our list can be seen at once MaxZones equ 255 max number of zones we can store MaxZoneView equ 4 max number of zones that can be displayed at once MaxZoneLength equ 33 namelen equ 32 entity name length for NBP Lookups unamelen equ 31 length of user name MaxOnline equ 15 BlockSize equ MaxZones*(namelen+1) pblocksize equ MaxSrvrs*(namelen+1) LeftEdge equ 10 RightEdge equ 190+80 ;25-Aug-92 DAL FSListID equ 1 ZoneListID equ 2 UserNameBoxID equ 1 AppleTalkFile equ $e2 Binary equ $06 ASCIIText equ $04 ATalkOn equ 1 BothDrivers equ 0 NetworkPrinter equ $80 LocalMask equ $bf EmulatorBit equ $20 AShareFST equ $0d read equ $2012 gs/os call number to read a file write equ $2013 gs/os call number to write a file ; asp defines. NBPLookup equ $10 KillNBP equ $46 PMSetPrinterCmd equ $28 FIAccess equ $32 FPGetUserInfoCmd equ $25 FPGetSrvrParmsCmd equ $10 FPMapIDCmd equ $15 SP_Cmd equ $20 SP_Stat equ $1d GetMyZone equ $1A GetZoneList equ $1B GetInfoCmd equ $02 GetSrvrInfoCmd equ $0f GetSrvrParmsCmd equ $10 asynchronous equ $80 synchronous equ $00 busy equ $ff TooManyProcesses equ $0408 CreatorBit equ $40 GroupBit equ $20 ; pap defines. TimerBusy equ $01ff PapBusy equ $08ff InstTimer equ $04 PStatus equ $22 POpen equ $23 PClose equ $24 PRead equ $25 PWrite equ $26 RPMSet equ $28 ;blocksize equ 512 MemRec record 0 memPtr ds.b 4 MemRec - Pointer to string, or custom memFlag ds.b 1 MemRec - Bit Flag NetNum ds.b 2 network number NodeID ds.b 1 node id ScktNum ds.b 1 socket number Enumerator ds.b 1 enumerator privflag ds.b 1 ckboxId ds.b 2 sizeof ;size of memrec record endr entityrec record 0 netnum ds.b 2 nodeID ds.b 1 scktNum ds.b 1 enumerator ds.b 1 objname ds.b namelen+1 ? verify this all endr NBPLType record 0 mode ds.b 1 command ds.b 1 result ds.b 2 iocomp ds.b 4 since this doesn't know about 4 byte pointers entity ds.b 4 ptr to name of what we want to find retryper ds.b 1 retry period in 1/4 secs retrycnt ds.b 1 number of times to retry internal ds.b 2 rsbsiz ds.b 2 size of following buffer rsbadr ds.b 4 responses will be stored here maxrsp ds.b 1 maximum number of responses allowed rgotten ds.b 1 actual number of responses returned endr KillNBPLtype record 0 Async ds.b 1 command ds.b 1 ResultCode ds.b 2 ParamPointer ds.b 4 endr GMyZone record 0 async ds.b 1 command ds.b 1 result ds.b 2 iocomp ds.b 4 bufptr ds.b 4 retryinterval ds.b 1 retrycount ds.b 1 resrvd ds.b 2 endr ; parameter block to get a zone list. gzonelist record 0 async ds.b 1 command ds.b 1 result ds.b 2 iocomp ds.b 4 buflen ds.b 2 bufptr ds.b 4 brnode ds.b 1 strtindex ds.b 2 retryinterval ds.b 1 retrycount ds.b 1 numberzones ds.b 2 resrvd ds.b 2 endr GetInfo record 0 async ds.b 1 command ds.b 1 ResultCode ds.b 2 CompRtnRet ds.b 4 ThisNet ds.b 2 ABridge ds.b 1 HardwareID ds.b 1 Romversion ds.b 2 NodeNumber ds.b 1 endr PMSetPrinterType record 0 async ds.b 1 command ds.b 1 Result ds.b 2 Entity ds.b 4 flags ds.b 1 FlushInterval ds.b 2 TimeoutInterval ds.b 2 NumOfBuffers ds.b 2 endr ; pap definitions. open_printer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 refnum ds.b 1 prname ds.b 4 flowq ds.b 1 statbuf ds.b 4 endr write_printer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 refnum ds.b 1 buflen ds.b 2 bufptr ds.b 4 eofbyte ds.b 1 endr read_printer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 refnum ds.b 1 buflen ds.b 2 bufptr ds.b 4 eofbyte ds.b 1 reserved ds.b 2 needed for bug in pap endr status_printer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 prname ds.b 4 statbuf ds.b 4 endr close_printer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 refnum ds.b 1 endr timer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 ticCount ds.b 2 running tick count howlong ds.b 2 how many 1/4th to wait reserved ds.b 4 endr \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/ple.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/ple.aii new file mode 100644 index 0000000..1dbe7e8 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/ple.aii @@ -0,0 +1 @@ +;;; ple - print line with ellipses. ; ; Michael V. Stein 03/11/90. ; ; 25-Aug-92 DAL: ; This file is no longer used. The List Manager now uses ; DrawStringWidth, so we don't need a custom drawProc. ; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/rename.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/rename.aii new file mode 100644 index 0000000..8eb1847 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/rename.aii @@ -0,0 +1 @@ +;;; rename - rename an AppleTalk printer. ; ; Michael V. Stein 02/26/90. ; ; © Copyright Apple Computer, 1990. ;;; routines included in this source file. ; ; rtp - rename this printer. ; cls - check for laserwriter spooler. ; cnn - check new name. ; fek - filter escape key. ; riw - rename imagewriter. ; rlw - rename LaserWriter. ; wfp - wait for printer. blanks off ;; equates. ;; include files. include '::commonmacros.h' include '::dp.h' include 'e16.event' include 'e16.control' include 'e16.dialog' include 'm16.control' include 'm16.dialog' include 'm16.list' include 'm16.qdaux' include 'm16.quickdraw' include 'm16.util2' include 'netprinter.h' ;; main program. rename proc ;; imported addresses. import cmd import cps import ctp import damE import devices import dptr import gdt import ghp import gip import hpe import hzl import knl import lookupF import lszone import mneE import omd import osd import osdE import otp import plisthdl import popen_pblk:open_printer import pread_pblk:read_printer import prec:printersetup import pstat_pblk:status_printer import pwrite_pblk:write_printer import readbuff import rfp import rfpE import rtpstat import screenF import stp import stpE import wtp ;; exported addresses. export newname export rtp ;; rtp - rename this printer. ; ; entry printer is selected. ; (screenF) = $8000 if 640 mode. ; ; exit if no error, printer is renamed. ; if error, user is told of the problem in an alert. rtp jsr ghp get highlighted printer dea offset into list jsr gip get index into printers ldy #memrec.memptr lda [l4],y sta rtpeptr lo word of ptr to name in pascal format sta l2 iny iny lda [l4],y sta rtpeptr+2 hi word of ptr to name in pascal format sta l2+2 ; adjust dialog for screen resolution. lda #(320-rtpw)/2 ldx screenF bpl rtp1 if 320 mode lda #(640-rtpw)/2 rtp1 sta rtpdlg+2 left x clc adc #rtpw sta rtpdlg+6 right x ; handle dialog. lda #rtpdlg ldy #^rtpdlg jsr omd open modal dialog stz newname make sure no name brl rtp14 inactivate the rename button rtp2 pha space for result lda #^fek ;;; ora #$8000 set high bit ora #$c000 ;also set bit 30 for I-beam (25-Aug-92 DAL) pha lda #fek pha stz eflag reset flag _ModalDialog ply get item hit bne @gotSomething lda eflag bmi rtp2a if user hit escape bne rtp2 if just a null event @gotSomething cpy #rtpcanID bne rtp3 if not cancel button rtp2a brl cmd close modal dialog and return rtp3 cpy #rtpokID beq rtp4 if hit ok brl rtp13 check other dialog items rtp4 jsr cnn check new name bcc rtp6 if user selected different name brl cmd close modal dialog and return rtp6 lda #$ffff sta lookupF flag to not start any more lookups jsr knl kill name lookup pushl l5 ptr to grapfport pushw #1 _RemoveDItem remove the ok button pushl l5 ptr to grapfport pushw #2 _RemoveDItem remove the cancel button pushl l5 ptr to grapfport pushw #rtpm3ID _RemoveDItem remove the cancel button pushl l5 ptr to grapfport pushw #rtpe1ID _RemoveDItem pushl l5 ptr to grapfport pushw #rtptitleID _RemoveDItem pushl l5 grafport pushl #rtpstatbut button _GetNewDItem pushl l5 grafport pushl #dlg2item button _GetNewDItem pushl l5 _DrawDialog _WaitCursor lda #status sta pstat_pblk.statbuf lda #^status sta pstat_pblk.statbuf+2 stz status+4 length of responce jsr stp status the printer tax bne rtp10 if error stating the printer jsr otp open the printer jsr wfp wait for printer bcs rtp11 if user gave up tay bne rtp10 if error occurred pushl l5 ptr to grapfport pushw #2 _RemoveDItem remove the cancel button pushl l5 pushw #3 pushl #rtpstat _SetIText lda devices beq rtp8 if laserwriter is selected jsr riw rename imagewriter bra rtp8b rtp8 jsr cls check for laserwriter spooler cpx #1+1 bcs rtp10 if error occured txa beq rtp8a if normal printer brl rtp20 is a spooler rtp8a jsr rlw rename laser writer rtp8b bcs rtp10 if error occurred lda #100 enough to wait for a while sta w3 ; make sure it eventually gives up. rtp9 jsr stpE status the printer dec w3 beq rtp11 if time to give up tax beq rtp9 if no error cmp #$805 beq rtp11 if the correct error cmp #$808 beq rtp11 if the correct error rtp10 pha jsr cmd close modal dialog pla jsr hpe handle pap error jsr ctp close the printer bra rtp12 rtp11 jsr ctp close the printer connection jsr cmd close modal dialog rtp12 _InitCursor stz lookupF stz lszone force recalc of printers stz lszone+2 brl hzl handle zone list and return rtp13 cpy #rtpe1ID bne rtp16 if not edit box, must be cancel rtp14 pushl l5 pushw #rtpe1ID pushl #newname _GetIText ldx #inactiveHilite lda newname and #$ff beq rtp15 if to inactivate the rename button cmp #1 ldx #nohilite activate the rename button rtp15 phx state of button pha pha space for result pushl l5 ptr to grafport pushw #rtpokID _GetControlDItem _HiliteControl hilite the rename button appropriately brl rtp2 rtp16 rts ; handle case of trying to rename a spooler. rtp20 jsr cmd close modal dialog jsr ctp close the printer connection lda #rtpspool ldy #^rtpspool jsr damE display stop alert message bra rtp12 finish things up rtpspool dc.b rtpspoolL dc.b 'That printer is a spooler' dc.b 13 dc.b 'and cannot be renamed.' rtpspoolL equ *-rtpspool-1 ; data used here. string pascal rtpl equ 170 rtpr equ 470 rtpw equ rtpr-rtpl rtpmid equ rtpw/2 rtpt equ 55 rtpb equ 130 rtph equ rtpb-rtpt rtpdlg dc.w rtpt,rtpl,rtpb,rtpr dc.w $FFFF visible dc.l 0 refcon dc.l rtptit dc.l rtpm3 dc.l rtpe1 dc.l rtpok,rtpcan dc.l 0 rtptitleID equ 3 rtptit dc.w rtptitleID id dc.w 3,rtpmid-55,3+9,rtpmid+60 dc.w statText+ItemDisable dc.l rtptittxt,0,0 rtptittxt dc.b 'Rename Printer' rtpm1ID equ rtptitleID+1 rtpm2ID equ rtpm1ID+1 rtpm3ID equ rtpm2ID+1 rtpm3 dc.w rtpm3ID dc.w 20,5,29,100 dc.w statText+ItemDisable dc.l rtpm3txt dc.l 0,0 rtpm3txt dc.b 'New Name:' rtpe1ID equ rtpm3ID+1 rtpe1 dc.w rtpe1ID dc.w 30,5,30+13,rtpw-5 5 pixels indented on either end dc.w EditLine rtpeptr dc.l 0 dc.w namelen-1 max chars for printer name dc.w 0 dc.l 0 rtpokID equ 1 rtpok dc.w rtpokID dc.w rtph-17,165,rtph-4,165+100 dc.w ButtonItem dc.l rtpoktxt,0,0 rtpoktxt dc.b 'Rename' rtpcanID equ rtpokID+1 rtpcan dc.w rtpcanID cancel button dc.w rtph-17,35,rtph-4,35+100 dc.w ButtonItem dc.l rtpcantxt,0,0 rtpcantxt dc.b 'Cancel' rtpstatbut dc.w 2 dc.w 50,100,63,100+84 dc.w ButtonItem dc.l rtpcantxt,0,0 dlg2item dc.w 3 item id dc.w 20,46,20+13,290 rectangle dc.w statText+ItemDisable type dc.l osdmess descr dc.w 0 value dc.w 0 flag dc.l 0 color table osdmess dc.b ' Looking for the printer...' ;; cls - check for laserwriter spooler. ; ; entry (pwrite_pblk..) = parameter block for writing to printer. ; (spquery..) = query to have spooler identify itself. ; ; exit (x) = 0 if real printer. ; (x) = 1 if spooler. cls lda #spqueryL sta pwrite_pblk.buflen lda #spquery sta pwrite_pblk.bufptr lda #^spquery sta pwrite_pblk.bufptr+2 shortm lda #1 sta pwrite_pblk.eofbyte this is all we want to send longm jsr rfpE read from printer jsr wtp write to printer tax bne cls2 if some sort of error occurred jsr rfp read from printer cls1 lda pread_pblk.result cmp #PapBusy beq cls1 if call hasn't completed tax bne cls2 if error of some sort ldx #0 assume it is a real printer lda readbuff cmp #'af' compare against first two lettters of 'false' beq cls2 if not a spooler inx flag as spooler cls2 rts string asis spquery dc.b '%%?BeginQuery: rUaSpooler' dc.b 13 dc.b 'false = flush' dc.b 13 dc.b '%%?EndQuery true' dc.b 13 spqueryL equ *-spquery ;; cnn - check new name. ; ; entry (newname..) = pascal string containing new name of printer. ; [l2] = ptr to original name ; ; exit (c) set if new name is equivalent to old name. cnn shortmx cnn2 lda [l2] get length of original name cmp newname compare against the new name length bne cnn4 if not equal lengths ldy #1 cnn3 lda [l2],y cmp newname,y bne cnn4 if not equal cpy newname bcs cnn5 if done checking and strings are equal iny bra cnn3 check next character cnn4 clc flag that strings are different cnn5 longmx rts ;; fek - filter escape key. ; ; entry from dialog manager after it gets an event. ; ; exit (eflag) = 1 if null event. ; (eflag) = $ffff if escape is hit. ; else (eflag) is unchanged. ; stack frame result equ 16 dlgptr equ 12 eventptr equ 8 itemptr equ 4 fek_waiting lda #$ffff bra common fek lda #0 common sta >handle_nulls tsc phd save direct page pha pld set new direct page ldx #0 assume we don't want to handle lda [eventptr] get the type of event bne fek1 if not a null event lda #1 sta >eflag flag a null event ;;; dex set x to $ffff - we want to handle it lda >handle_nulls tax bra fek4 finish things up fek1 cmp #keyDownEvt beq fek2 if key down cmp #autoKeyEvt bne fek4 if not auto key event fek2 ldy #2 lda [eventptr],y get message and #$ff cmp #$1b bne fek4 if user didn't type escape ; user wants out. fek3 pha space for result pha lda >dptr+2 pha hi ptr to grafport lda >dptr pha lo ptr to grafport pushw #2 id of cancel button _GetControlDItem pla low word of handle plx hi word of handle pushw #0 phx hi word of control pointer pha lo word of control pointer pushw #2 phx hi word of control pointer pha lo word of control pointer _HiliteControl highlight the cancel button _HiliteControl make it look normal ldx #$ffff txa sta >eflag flag that user wants to escape ; clear garbage off of stack. fek4 pld restore direct page lda 1,s tay lda 1+2,s sta 1+3+4+4+3,s store high word tya sta 1+3+4+4+1,s store low word txa sta 1+3+4+4+4,s store result tsc clc adc #3+4+4+4-3 tcs rtl handle_nulls dc.w 0 ;25-Aug-92 DAL ;; riw - rename imagewriter. ; ; entry (newname..) = pascal string containing new name of printer. ; ; exit imagewriter is renamed. ; (c) set if error occurred. riw lda #('b'<<8)+$1b first two chars are escape followed by 'b' sta riwa ; copy new name to command string. lda #riwa+2 sta l1 lda #^riwa+2 sta l1+2 lda #newname sta l2 lda #^newname sta l2+2 jsr cps copy pascal string ; copy new type to command string. lda [l2] pha save length for now jsr mneE move to next element jsr gdt get device type [l2] jsr cps copy pascal string jsr mneE move to next element lda #0 sta [l1] add in trailing zero byte ; send the command to the imagewriter. jsr rfpE read from printer lda #riwa sta pwrite_pblk.bufptr lo ptr to buffer to send lda #^riwa sta pwrite_pblk.bufptr+2 hi ptr to buffer to send pla retrieve length of new name shortm clc adc [l2] length of typename adc #2+1+1+1 2 for command, 2 for length bytes and 1 for 0 byte sta pwrite_pblk.buflen length of buffer to send stz pwrite_pblk.buflen+1 lda #1 sta pwrite_pblk.eofbyte not done yet longm jsr wtp write to printer tax bne riw1 if error occurred jsr ctp close the printer clc flag no error rts riw1 pha jsr ctp close the printer pla sec flag error occurred rts ; data used here. riwa ds.b 100 hold command for printer riwb ds.b 2 ;; rlw - rename LaserWriter. ; ; entry (newname..) = pascal string containing new name of printer. ; ; exit LaserWriter is renamed. ; (c) set if error occurred. rlw lda #rlwa sta pwrite_pblk.bufptr lo ptr to buffer to send lda #^rlwa sta pwrite_pblk.bufptr+2 hi ptr to buffer to send lda #rlwaL sta pwrite_pblk.buflen length of buffer to send shortm stz pwrite_pblk.eofbyte not done yet longm jsr rfpE read from printer rlw0 jsr wtp write to the printer tax bne rlw4 if error occurred shortmx ldx newname length of new name txy save for later rlw1 lda newname,x get char from name sta rlwc-1,x write new name dex bne rlw1 if more to copy rlw2 lda rlwd,x get last part of command sta rlwc,y copy it down iny inx cpx #rlwdl bcc rlw2 if more to copy longmx lda #rlwb sta pwrite_pblk.bufptr lo ptr to buffer to send lda #^rlwb sta pwrite_pblk.bufptr+2 hi ptr to buffer to send lda newname and #$ff clc adc #rlwbL+20 rlwbL+rlwdL sta pwrite_pblk.buflen length of buffer to send shortm lda #1 sta pwrite_pblk.eofbyte last bit of data longm jsr rfp read from printer jsr wtp write to printer tax bne rlw4 rlw3 jsr ctp close the printer clc flag no error rts rlw4 pha jsr ctp close the printer pla sec flag the error rts ; data used here. string asis rlwa dc.b 'serverdict begin 0 exitserver' dc.b 13 rlwaL equ *-rlwa rlwb dc.b 'statusdict begin(' rlwbL equ *-rlwb rlwc ds.b 35+20 holds new name of printer and rest of command rlwd dc.b ')setprintername end' dc.b 13 rlwdL equ *-rlwd ;; wfp - wait for printer. ; ; entry modal dialog is created. ; open call has been made to printer. ; ; exit either the connection will be established or ; the user will cancel out. ; (c) set if user cancelled out. wfp pha space for result lda #^fek_waiting ora #$8000 set high bit pha lda #fek_waiting pha stz eflag reset flag _ModalDialog ply get item hit lda eflag get flag from filter proc bmi wfp2 if user hit escape bne wfp1 if null event cpy #2 beq wfp2 if user clicked in escape button wfp1 lda popen_pblk.result get status cmp #papbusy beq wfp if printer is still busy clc flag that printer connection is now open rts wfp2 jsr ctp close the printer sec rts ; global data. eflag dc.w 0 escape flag newname ds.b 40 hold the new name for the printer status ds.b 256 hold status buffer endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/sul.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/sul.aii new file mode 100644 index 0000000..00c02de --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NamerCDEV/sul.aii @@ -0,0 +1 @@ +;;; sul - sort uppercase list. ; ; Michael V. Stein 02/21/90. ; ; © Apple, 1990. blanks off ;; equates. ;; imported addresses. ;; include files. include '::commonmacros.h' include 'm16.list' include 'm16.util2' ;; main program. main proc export sul sul Pushl #cue compare uppercase elements phy hi word to list handle pha lo word to list handle _SortList2 rts ;; cue - compare uppercase elements. ; ; entry from list manager. ; ; exit (c) set if first entry > second entry memberA equ 4+2 memberB equ memberA+4 cue phd tsc tcd use stack as a direct page ldy #$02 lda [memberA] dereference first handle tax lda [memberA],y sta memberA+2 stx memberA lda [memberB] dereference second handle tax lda [memberB],y sta memberB+2 stx memberB shortmx lda [memberA] cmp [memberB] compare it to memberB bcc cue1 if length(memberB) >= length(memberA) lda [memberB] cue1 sta min shortest length of either string ldy #$00 cue2 iny lda [memberB],y jsr cal capitalize a letter sta temp lda [memberA],y jsr cal capitalize a letter cmp temp bne cue5 we have a difference cpy min chars are the same so check if more bytes to check bcc cue2 no more bytes to check cue4 lda [memberA] the shortest string is less than the longer cmp [memberB] set carry if a >= b cue5 longmx lda 0+2 carry set if a >= b sta 8+2 lda 2+2 sta 10+2 pld pla pla pla pla rtl min ds.b 1 temp ds.b 1 ;; cal - capitalize a letter. ; ; entry (a) = letter to convert ; ; exit (a) = uppercase version of letter. longa off longi off cal cmp #'a' bcc cal1 if not lowercase cmp #'z'+1 bcs cal1 if not lowercase sbc #$20-1 (c) clear cal1 rts endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/MakeFile b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/MakeFile new file mode 100644 index 0000000..5979b08 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/MakeFile @@ -0,0 +1 @@ + CDEV = NetPrinter {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" if {dup} # test whether we should duplicateiigs duplicateiigs -m -y {CDEV} {CDEV} end {CDEV}.Load Ä ¶ netprinter.aii.obj ¶ emulator.aii.obj ¶ netdata.aii.obj ¶ sul.aii.obj linkiigs -x -lseg:$1000 netpr ¶ netprinter.aii.obj ¶ emulator.aii.obj ¶ netdata.aii.obj ¶ sul.aii.obj ¶ -o {CDEV}.Load {CDEV}.aii.obj Ä {CDEV}.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs {CDEV}.aii emulator.aii.obj Ä emulator.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs emulator.aii netdata.aii.obj Ä netdata.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs netdata.aii sul.aii.obj Ä sul.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs sul.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/NetPrinter b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/NetPrinter new file mode 100644 index 0000000..e69de29 diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/emulator.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/emulator.aii new file mode 100644 index 0000000..d8d44f9 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/emulator.aii @@ -0,0 +1 @@ +;;; emulator - download the Imagewriter emulator to an AppleTalk printer. ; ; Michael V. Stein 03/20/90. ; ; © Apple, 1990. ; ; 10-Jan-92 MSD There is a problem with downloading the IWEM to the Personal ; Laserwriter NT: after we send a packet, we read in the next block ; and the Laserwriter is sending its PAP SendData packet. If we had ; interrupts off while doing the read (reading from a floppy, for ; example), we'd miss the SendData and have to wait for the printer ; to retry and send it again approximately 15 seconds later. This ; means we average 512 bytes every 15 seconds -- very slow! ; ; The solution is to try to pre-load the IWEM file into memory before ; downloading it. We'll try to get a handle large enough for the whole ; file. If that fails, we resort to the old method of reading 512 bytes ; at a time. ; ; Note: So the version checking code wouldn't need to change, the first ; block still gets read into the internal buffer. If we get the handle, ; then we set the mark back to the start of the file and read the whole ; thing in. ; ; Procs affected: dte (Download The Emulator) ; blanks off ;; equates. ;; include files. include '::commonmacros.h' include '::dp.h' include 'e16.control' include 'e16.dialog' include 'e16.gsos' include 'm16.memory' include 'm16.control' include 'm16.dialog' include 'm16.gsos' include 'm16.list' include 'm16.qdaux' include 'm16.quickdraw' include 'm16.util2' include 'netprinter.h' ;; main program. emulator proc ;; imported addresses. import cfemes import close_pblk import cmd import ctp import damE import dtemes import emess4 import emess12 import gip import hfo import hpe import hzl import iwempath import lookupF import lszone import omd import open_pblk import osd import otp import pclose_pblk:close_printer import plisthdl import popen_pblk:open_printer import pread_pblk:read_printer import pstat_pblk:status_printer import pwrite_pblk:write_printer import readbuff import rfp import rfpE import rtpstat import rw_pblk import screenF import stp import stpE import wtp ; used by dte: import geteof import rewind import iwemHandle ;; exported addresses export cfe ;; cfe - check for emulator. ; ; entry controls have been set up and a printer selected. ; (cfemes..) = status dialog to display. ; (emess12..) = message to give when emulator is present. ; (emquery..) = postscript string to query for emulator presence. ; emqueryL = length of query message. ; PapBusy = status meaning that the pap call hasn't finished. ; (pread_pblk..) = parameter block for reading from a printer. ; (pwrite_pblk..) = parameter block for writing to a printer. ; (readbuff..512) = buffer to use when reading from a printer. ; ; exit The routine checks for the presence of the emulator. If the emulator ; is already present, it puts up an alert and exits. If the emulator isn't ; there it is downloaded to the printer. In any case, the routine exits to ; hzl to rebuild the zone list. cfe jsr oef open emulator file now txa test error beq @open_ok ; a file error has occurred when opening the iwem file and trying to read the first block. ; The routine hfo makes sure the file is closed so we remove the dialog ; and exit through hzl. ;jsr cmd close modal dialog brl cfe7 init cursor & return @open_ok ; At this point the 1st 512 bytes of the emulator image ; is in the buffer. We now search for a version string ; in the buffer. ;brk $8B ldy #$0000 index into buffer @search_string ldx #$0000 index to our copy @str_loop lda em_ver,x get 2 bytes of our string cmp writebuff,y check in buffer bne @next_buf no match, move on in buffer @maybe inx inx cpx #$0008 whole string? beq @match we're done iny iny move ahead in buffer bra @str_loop continue compare @next_buf phx plx test x bne @no_ybump only bump Y if X is 0 iny move ahead in buffer @no_ybump cpy #512-8+1 still room for our string? bcc @search_string start string loop again @not_found bra try_dnload no version, use default @match iny iny point to version numeral text in buf lda writebuff,y sta em_ver+8 iny lda writebuff,y copy 3 characters sta em_ver+9 try_dnload ;issue query and see if printer wants our emulator lda #cfemes ldy #^cfemes jsr osd open status dialog _WaitCursor jsr stp status the printer tax bne cfe4 if some sort of error occured jsr otp open the printer tax bne cfe4 if some sort of error occurred lda #emqueryL sta pwrite_pblk.buflen lda #emquery sta pwrite_pblk.bufptr lda #^emquery sta pwrite_pblk.bufptr+2 shortm lda #1 sta pwrite_pblk.eofbyte longm jsr rfpE read from printer jsr wtp write to printer tax bne cfe4 if some sort of error occurred jsr rfp read from printer cfe1 lda pread_pblk.result cmp #PapBusy beq cfe1 if call hasn't completed lda readbuff and #$ff cmp #'0' bne cfe2 if emulator is present jsr dte download the emulator bra cfe3 finish things up ; The emulator is already present. cfe2 jsr cmd close modal dialog jsr ctp close the printer lda #emess12 'The ImageWriter emulator is alreadyÉ' ldy #^emess12 jsr damE display alert message bra cfe6 close IWEM file & return cfe3 bcc cfe5 if no error occurred cfe4 pha jsr cmd close modal dialog pla jsr hpe handle pap error cfe5 jsr ctp close the printer cfe6 _CloseGS close_pblk close IWEm file cfe7 _InitCursor ; Since the GS has been occupied for a dozen seconds, better start a new name lookup. stz lookupF flag that it is ok to start name lookup stz lszone force recalc of printers stz lszone+2 brl hzl handle zone list and return - regets the printer list ;; oef - open emulator file. ; ; entry ASCIIText = file type for ASCII files. ; (iwempath..) = path to the emulator file. ; read = GS/OS call # for reading a file. ; (writebuff..512) = buffer to use when writing. ; ; exit (a) = return code. ; file is opened and the first block is read in. oef lda #read sta w1 save disk op lda #iwempath path to printer.setup file sta open_pblk+4 lda #^iwempath sta open_pblk+6 lda #writebuff sta rw_pblk+4 lo ptr to buffer lda #^writebuff sta rw_pblk+6 hi ptr to buffer lda #512 sta rw_pblk+8 lo word of request count stz rw_pblk+10 hi word of request count sta w3 flag that file should be kept open lda #ASCIIText type of file wanted brl hfo handle file operation ;; dte - download the emulator. ; ; entry [l5] = dialog pointer. ; oef must have been called successfully ; ; exit (c) set if error, (a) = error code. ; ; Note: On entry, the read parameter block (rw_pblk) points at a 512 byte buffer ; inside the CDEV's code space, and the request count is already set t0 512. ; dte pushl l5 pushw #3 pushl #dtemes _SetIText ; ; 10-Jan-92 MSD Get the file's EOF and try to allocate a handle of the same ; size. If we get it, change the buffer pointer, rewind, and ; read the file in. The general algorithm is: ; ; repeat ; read from file ; if (no read error) ; write buffer := read buffer ; while transfer count > 0 ; write Min(transfer count,512) bytes to printer ; transfer count := transfer count - 512 ; write buffer := write buffer + 512 ; until read error ; jsr rfp ; make sure we have an outstanding read to printer lda open_pblk+2 ; get file's refnum sta geteof+2 ; put in GetEOF block sta rewind+2 ; put in SetMark block _GetEOFGS geteof stz iwemHandle ; in case we don't get the handle stz iwemHandle+2 pha ; room for handle pha lda geteof+6 pha ; push size of handle (EOF of file) lda geteof+4 pha ; size low pha ; room for memory manager ID _MMStartup ; get our user ID pea $C000 ; locked/fixed attributes pha ; starting address (ignored) pha _NewHandle plx ; clean handle from stack ply bcs @write ; didn't get it - start writing 512 bytes at a time stx iwemHandle ; save handle so we can dispose of it later sty iwemHandle+2 phd ; save D so we can deref pointer phy ; put handle back on stack phx tsc tcd ; point D at stack lda [1] ; get low word of pointer sta rw_pblk+4 ldy #2 lda [1],y ; get high word of pointer sta rw_pblk+6 pla ; remove handle pla pld ; restore D lda geteof+4 ; copy EOF to request count sta rw_pblk+8 lda geteof+6 sta rw_pblk+10 _SetMarkGS rewind ; set mark to start of file ; ; Read the next "chunk" from the file. ; @read _ReadGS rw_pblk ; try to read some bcs @readerr ; done reading ; ; Point PAPWrite buffer to our read buffer ; @write lda rw_pblk+4 sta pwrite_pblk.bufPtr lda rw_pblk+6 sta pwrite_pblk.bufPtr+2 ; ; Keep looping as long as there is more to write to the printer ; @writeloop lda rw_pblk+14 ; did we get more than 64K? bne @big ; yes, so do 512 bytes lda rw_pblk+12 ; how much left? cmp #512 ; less than a block? blt @gotlen ; yes, so do just what's left @big lda #512 ; was 512 or more, so use 512 @gotlen sta pwrite_pblk.buflen stz pwrite_pblk.eofbyte ; don't set the EOF flag sep #$20 longa off lda popen_pblk.refnum sta pwrite_pblk.refnum ; make sure refnum is set rep #$20 longa on ; ; Write the next 512 bytes (or less) ; jsr @pwrite ; do the PAPWrite tax ; did we get a PAP error? bne @paperr ; yes, so close file an return error ; ; Adjust transfer count (i.e. amount left in buffer) and buffer pointer ; clc lda pwrite_pblk.bufPtr adc pwrite_pblk.buflen sta pwrite_pblk.bufPtr ; update buffer pointer bcc @nohi inc pwrite_pblk.bufPtr+2 @nohi sec lda rw_pblk+12 sbc pwrite_pblk.buflen sta rw_pblk+12 ; update transfer count lda rw_pblk+14 sbc #0 sta rw_pblk+14 ora rw_pblk+12 ; anything left in buffer? bne @writeloop ; yes, so write some more bra @read ; time to read some more from file @readerr pha ; save error code ; ; We got an error on read (possibly EOF error). Write zero bytes and EOF. ; stz pwrite_pblk.buflen inc pwrite_pblk.eofbyte ; set EOF byte jsr @pwrite tax ; was there an error? beq @ok ; no plx ; remove read error code from stack bra @paperr ; return the pap error @ok ; ; Dispose of our handle, close dialog, and if error was not EOF error, then ; display a message. ; jsr @dispose ; dispose of our handle jsr cmd ; close modal dialog pla ; get read error back cmp #eofEncountered ; was it EOF? bne @showerr ; no, so show the error clc ; no error rts @showerr lda #emess4 ldy #^emess4 jmp damE display alert message (stop alert) and return @paperr pha ; save error _CloseGS close_pblk ; close the file jsr @dispose ; dispose of our handle pla ; restore error sec rts @pwrite jsr rfp ; make sure there is an outstanding read ldx #>Printer:\H' dc.w 1 dc.b $0D dc.b '==LaserWriter\H' dc.w 1 dc.b $0D dc.b '==ImageWriter\H' dc.w 2 dc.b $0d dc.b '==ImageWriter LQ\H' dc.w 3 dc.b $0d dc.b '.' about dc.w 8 ;Pcount dc.l 10 ;ID dc.w 38,5,138,280 dc.l statTextControl dc.w 0 dc.w fCtlProcRefNotPtr dc.l 0 dc.l atext dc.w AtextL atext dc.b 'The Net Printer Control Panel allows you ' dc.b 'to direct your printer output to ' dc.b 'any printer on the AppleTalk network. ' dc.b 'Select the type of printer with the ' dc.b 'pop-up menu. The ImageWriter Emulator ' dc.b 'can be downloaded to any LaserWriter ' dc.b 'for those applications that normally print ' dc.b 'to an ImageWriter.' atextL equ *-atext ; static text control removed 12/3/91 by Monte Benaresh ; because an alert box is now used ;atalkerr dc.w 8 PCount ;dc.l 11 id ;dc.w 8,leftedge,38,Rightedge+20 ;dc.l statTextControl ;dc.w 0 ;dc.w fCtlProcRefNotPtr ;dc.l 0 ;dc.l atalkerrm ptr to text ;dc.w atalkerrmL length atalkerrm dc.b atalkerrmL-1 dc.b 'AppleTalk must be' dc.b 13 dc.b 'installed and enabled to' dc.b 13 dc.b 'run this Control Panel.' dc.b 13 ;dc.b ' ' atalkerrmL equ *-atalkerrm plist dc.w 15 PCount dc.l 2 ID dc.w 20 rectangle dc.w LeftEdge dc.w 62 dc.w Rightedge dc.l listControl ctrldefproc dc.w $80 ctlFlag dc.w fCtlProcRefNotPtr+fCtlCanBeTarget+fCtlWantEvents moreFlags dc.l 0 ref con dc.w 0 ctlListSize dc.w MaxSrvrView ctlListView dc.w selectOnlyOne+InsideScrollBar dc.w 1 ctlListstart dc.l 0 ctlListDraw dc.w 10 ctlListMemHeight dc.w memrec.sizeof ctlListMemSize dc.l namesbuffer ctlListRef dc.l 0 ctlColorRef zlist dc.w 15 PCount dc.l 3 ID dc.w 100-3 rectangle dc.w LeftEdge dc.w 142-3 dc.w RightEdge dc.l listControl ctrldefproc dc.w $80 ctlflag dc.w fctlProcRefNotPtr+fCtlCanBeTarget+fCtlWantEvents moreFlags dc.l 0 ref con dc.w 0 ctlListSize dc.w MaxZoneView ctlListView dc.w selectOnlyOne+InsideScrollBar dc.w 1 ctlListstart dc.l 0 ctlListDraw dc.w 10 ctlListMemHeight dc.w memrec.sizeof ctlListMemSize dc.l zonebuffer ctlListRef dc.l 0 ctlColorRef editrect dc.w 142,LeftEdge,162,RightEdge+20 edit box rectangle cprect dc.w 0,0,200,320 control panel rectangle edctl dc.w 8 PCount dc.l 20 ID number dc.w 155 rectangle dc.w LeftEdge dc.w 169 dc.w RightEdge dc.l editLineControl dc.w 0 flag dc.w fctlProcRefNotPtr+fctlWantEvents+fCtlCanBeActive dc.l 0 ref con dc.w NameLen length dc.l username ptr to name utext dc.w 8 Pcount dc.l 7 ID number dc.w 149-4 rectange dc.w leftedge dc.w 159-4 dc.w rightedge dc.l statTextcontrol procref dc.w 0 flag c strings dc.w fctlProcRefNotPtr dc.l 0 refcon dc.l usertitle text ref dc.w usertitleL length of string ztext dc.w 8 Pcount dc.l 9 ID number dc.w 94-4-3 dc.w leftedge dc.w 103-4-3 dc.w rightedge dc.l statTextcontrol dc.w 0 flag, c string dc.w fctlProcRefNotPtr dc.l 0 ref con dc.l zonetext text ref dc.w zonetextL length of string ; buttons. iwebut dc.w 9 Pcount dc.l 4 ID number dc.w 69 dc.w leftedge+5+40 dc.w 69+13 dc.w rightedge-5-40 dc.l simpleButtoncontrol dc.w simpRound+ctlInvis dc.w fCtlWantEvents+fctlProcRefNotPtr dc.l 0 dc.l btitle dc.w 0 length? dc.w 0 key equivalent ; gs/os paths used. atinitlpath dc.w atinitlpathL dc.b '*/SYSTEM/SYSTEM.SETUP/ATINIT' atinitlpathL equ *-atinitlpath-2 iwempath dc.w iwempathL dc.b '*/SYSTEM/DRIVERS/IWEM' iwempathL equ *-iwempath-2 psetuppath dc.w psetuppathL ;dc.b '*/SYSTEM/DRIVERS/PRINTER.SETUP' dc.b '*:SYSTEM:DRIVERS' dc.b ':PRINTER.SETUP' psetuppathL equ *-psetuppath-2 psetupname ;added 2/3/91 by Monte to support network boot dc.b ':SETUP:PRINTER.SETUP' psetupnmL equ *-psetupname endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/netprinter.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/netprinter.aii new file mode 100644 index 0000000..08a823c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/netprinter.aii @@ -0,0 +1 @@ +;;; netpr - AppleTalk Network Printer CDEV. ; ; Michael V. Stein 01/25/90. ; ; © Copyright Apple Computer, 1990. ;;; routines included in this source file. ; ; ccc - create cdev controls. ; ctc - close the cdev. ; alternate entrypoint: ctcE. ; ham - handle about messsage. ; hem - handle event message ; hhm - handle hit message. ; icc - init cdev controls. ; rtc - run the cdev. ; aaf - access atinit file. ; acr - appletalk completion routine. ; ane - add next element. ; anl - add names to list. ; asf - access setup file. ; cac - create actual controls. ; cbs - change button status. ; cmd - close modal dialog. ; cnd - check for new devices. ; alternate entrypoint: cndE. ; cps - copy pascal string. ; cst - create static text. ; ctp - close the printer. ; cus - compare uppercase strings. ; dah - dereference a handle. ; dam - display alert message. ; alternate entry point: damE. ; dwh - disable window highlighting. ; dzl - draw zone list. ; ewh - enable window highlighting. ; fsp - find selected printer. ; fsz - find starting zone in list. ; gap - get actual pointer. ; gcp - get and compare printer type. ; gdt - get device type. ; gpn - get printer names. ; gsd - get starting device. ; gsz - get starting zone. ; ghl - get handle and length of text. ; ghp - get highlighted printer. ; ghz - get highlighted zone. ; gip - get index into printers. ; giz - get index into zones. ; gmz - get my zone. ; goa - get offset into array. ; gzl - get zone list. ; heb - handle emulator button. ; hfo - handle file operation. ; hom - handle out of memory. ; hpe - handle pap error. ; hpl - hit printer list. ; hpu - hit pop up. ; hre - handle recoverable disk error. ; hzl - hit zone list. ; alternate entry point: hzlE. ; alternate entry point: hzlEE. ; iai - is appletalk active. ; inb - is network boot. ; ipl - initialize printer list. ; knl - kill name lookup. ; mne - move to next element. ; alternate entrypoint: mneE. ; omd - open modal dialog. ; osd - open status dialog. ; otp - open the printer. ; rfp - read from printer. ; snl - start name lookup. ; stp - status the printer. ; alternate entry point: stpE. ; ubd - unload both drivers. ; udf - update data files. ; wtp - write to printer. blanks off ;; equates. recty0 equ 0 rectangle offsets rectx0 equ 2 recty1 equ 4 rectx1 equ 6 stack_entry equ $e100b0 gs/os stack entry point ;; include files. include '::commonmacros.h' include '::cdev.h' include '::dp.h' include 'e16.control' include 'e16.dialog' include 'e16.event' include 'e16.gsos' include 'e16.lineedit' include 'e16.list' include 'e16.memory' include 'e16.quickdraw' include 'm16.control' include 'm16.dialog' include 'm16.gsos' include 'm16.intmath' include 'm16.lineedit' include 'm16.list' include 'm16.memory' include 'm16.misctool' include 'm16.QDAux' include 'm16.quickdraw' include 'm16.print' include 'm16.util2' include 'm16.window' include 'netprinter.h' ;; main program main proc ;; exported addreses. export acr export cmd export cps export ctp export dah export dam export damE export devices export gdt export ghp export gip export hfo export hpe export hzl export knl export lookupF export lszone export mneE export myzonename export namesbuffer export netobj export omd export openblock export openblock2 export osd export otp export plisthdl export rfp export rfpE export screenF export stp export stpE export username export wtp export zonebuffer export zlisthdl ;; imported addresses. import about import appletalk import asterisk ;import atalkerr import atalkerrm import atalkF import atinit:atinitrec import atinitlpath import cfe import choosepr import close_pblk import create_pblk ;added 2/4/91 by Monte Benaresh import cprect import ctllist import edctl import edctllen import emess1 import emess2 import emess3 import emess4 import emess5 import emess6 import emess7 import emess8 import emess10 import emess11 import emess12 import emess13 import NBPbusyMsg import fileLockedMsg import entity:entityrec import GinfoParams import gmyp_pblk:NBPLType import gmyz_pblk import gup_pblk import iwebut import kill_pblk import oktext import open_pblk import plist import popen_pblk:open_printer import pread_pblk:read_printer import prec:printersetup import psetpr_pblk:PMSetPrinterType import psetuppath import psetupname ;added 2/3/91 by Monte Benaresh toÉ import psetupnmL ;Ésupport access of printer.setup on network boot import pstat_pblk:status_printer import ptext import ptypes import punload_pblk import pwrite_pblk:write_printer import rw_pblk import sm_pblk import tryagain import quit import rtp import rtpbut import sul import tryagain import typeptr import wtext import zlist import zonelist_pblk:gzonelist netpr phb save calling data bank phk plb set our data bank ; make room on stack for direct page. tsc sec sbc #dpsize make room on stack for new direct page tcs phd save the current direct page tcd new direct page stz cdev_result ;init result for Control Panel stz cdev_result+2 lda message cmp #11+1 bcs netpr1 if message defintely not handled ldx atalkF beq netpr1 if appletalk isn't present asl a times 2 into word table tax move into index reg jsr (t_cdev-2,x) call the handler of this message netpr1 pld restore direct page tsc clc adc #dpsize tcs reset the stack lda 1,s Bump the stack up to prepare sta 11,s to take off the 3 parameters lda 3,s sta 13,s pla get rid of message space pla get rid of data1 space pla pla get rid of data2 space pla lda cdev_result ;result for Control Panel sta 5,s lda cdev_result+2 sta 7,s plb rtl t_cdev dc.w Machine_CDEV handle machine message dc.w ctcE handle boot message - ignored dc.w ctcE handle shutdown message - ignored dc.w icc init cdev controls dc.w ctc close the cdev dc.w hem handle event message dc.w ccc create cdev controls dc.w ham handle about message dc.w ctcE handle rectangle message - ignored dc.w hhm handle hit message dc.w rtc run the cdev ; secondary routines. Machine_CDEV ;check for AppleTalk active and show alert if not ; check screen resolution in case we have to show alert box pha space for result _GetMasterSCB pla xba and #$8000 sta screenF != 0 if 640 mode jsr iai ;check for AppleTalk active bcs @no_atalk @active inc cdev_result ;return success rts @no_atalk lda #atalkerrm ldy #^atalkerrm brl dam ;display alert box rts ;return (default) 0 result --> failed ;; ccc - create cdev controls. ; ; entry (atalkerr..) = appletalk error message control. ; [data1] = window ptr. ; read = gs/os command to read from a file. ; ; exit if appletalk isn't installed, the appletalk error ; text control is created. ; ; if appletalk is active: ; controls are created. ; the zonelist is created and sorted. ; current printer setup is read from files into prec. ; (prec..) = printer setup. ; (username..) = pascal string of the user's name. ; (selF) = 0. ; (screenF) != 0 if 640 mode ; [wptr] = window pointer. ccc ;jsr iai is appletalk active ;bcc ccc1 if active ;ldx #atalkerr 'AppleTalk must be installed to run É' ;ldy #^atalkerr ;brl cst create static text control and return ;lda #atalkerrm ;ldy #^atalkerrm ;brl dam ;display alert box ccc1 _Waitcursor stz selF no selection was made yet stz pmatch stz pmatch+2 stz pindex init printer index stz zonenamehdl stz zonenamehdl+2 ;no name handle yet ; next code moved to MachineCDEV by Monte Benaresh -- 12/3/91 ;pha space for result ;_GetMasterSCB ;pla ;xba ;and #$8000 ;sta screenF != 0 if 640 mode ldx #callcompF flag that the call completed compret jml 0 ; jump back to AppleTalk ;; ane - add next element. ; ; entry [l1] = ptr to current spot in the namelist. ; [l4] = ptr to current record in list manager list. ; ; exit entry is added to list. ; [l1] = ptr to next spot in the namelist. ; [l4] = ptr to next element in the list manager list. ; copy new element into our list. ane ldy #entityrec.netnum lda [l1],y ldy #memrec.netnum sta [l4],y lda l1 clc adc #entityrec.objname ldy #memrec.memptr sta [l4],y lda l1+2 adc #0 ldy #memrec.memptr+2 sta [l4],y shortmx ldy #entityrec.nodeid lda [l1],y ldy #memrec.nodeid sta [l4],y ldy #entityrec.scktnum lda [l1],y ldy #memrec.scktnum sta [l4],y ldy #entityrec.enumerator lda [l1],y ldy #memrec.enumerator sta [l4],y ldy #memrec.memflag lda #0 sta [l4],y mark it as not selected longmx ane3 jsr mne move to next element lda l4 clc adc #memrec.sizeof sta l4 bcc ane4 if didn't cross bank inc l4+2 ane4 rts ;; anl - add names to list. ; ; entry (gymp_pblk..) = parameter block for getting printer list. ; MaxSrvrs = max number of printers per zone to worry about. ; (openblock..) = current printer name list. ; (openblock2..) = new printer name list. ; [plisthdl] = handle to printer list. ; (plistsize) = current size of printer list. ; ; exit if the number of printers has changed then this routine will ; recreate the printer list with the info from the new call. anl lda gmyp_pblk.rgotten and #$ff cmp plistsize beq anl3 if same size (branch doesn't reach bottom) ; different # of objects, so copy openblock2 to openblock. shortm ldx #MaxSrvrs*(99+5)-1 anl1 lda openblock2,x sta openblock,x dex bne anl1 longm lda #openblock sta l1 lda #^openblock sta l1+2 lda #0 sta w5 jsr gip get index into printers [l4] lda gmyp_pblk.rgotten and #$ff sta w6 responses received anl2 lda w5 current index cmp w6 compare against total bcs anl4 if done jsr ane add next element inc w5 bump the counter bra anl2 process next element anl3 rts anl4 lda w6 sta plistsize new size of list jsr ghp get highlighted printer anl6 pushl #0 standard draw routine pushw #1 pushl #$ffffffff use current listref pushw #$ffff use current listrefdesc pushw plistsize size of list pushl plisthdl handle of list control record _NewList2 lda plisthdl lo word of list handle ldy plisthdl+2 hi word of list handle jsr sul sort uppercase list stz pindex jsr fsp find starting printer pushw pindex index of printer, might be zero pushl plisthdl _SelectMember2 scroll list so current zone is shown lda #noHilite assume laserwriter ldx pindex bne anl7 if a match was found lda #inactiveHilite anl7 brl cbs chnage button status and return ;; asf - access setup file. ; ; entry (a) = operation to perform $2012 = read, $2013 = write. ; (psetuppath..) = path to printer.setup file if local boot. ; (prec..+printersetup.sizeof) = buffer to use. ; Binary = filetype for binary files. ; printersetup = record describing format of printer.setup file ; sel2F = flag whether printer.setup dirty ; ; exit file is read or written. asf sta w1 save disk op ; network boot support added 2/3/91 by Monte Benaresh ;brk $93 cmp #$2013 do we intend to write the file? bne @read lda sel2F did user select a printer? bne @cont yes, update the file @untouched clc rts return without writing b/c no change @cont @read ldy netbootF beq asf_loc if local boot _FSTSpecific gup_pblk get user path lda gup_pblk+6 sta l1 lda gup_pblk+6+2 sta l1+2 ; copy over path to user's folder. shortmx lda [l1] sta w5 # to copy ldy #2 source index ldx #0 dest index @cpy_loop cpx w5 bcs up_done if done lda [l1],y sta netobj+2,x save here for now iny inx bra @cpy_loop move next char ; add over the final ':Setup:ATINIT' up_done ldy #0 @cpy2_loop cpy #psetupnmL bcs fn_done if done lda psetupname,y get next char of ending string sta netobj+2,x iny inx bra @cpy2_loop process next char fn_done lda w5 clc adc #psetupnmL longmx and #$ff sta netobj length of gs/os string lda #netobj ldx #^netobj bra asf_set_path asf_loc ;sta open_pblk+4 lo ptr to pathname ;stx open_pblk+6 hi ptr to pathname lda #psetuppath path to printer.setup file ldx #^psetuppath asf_set_path sta open_pblk+4 lo ptr to pathname stx open_pblk+6 hi ptr to pathname lda #prec sta rw_pblk+4 lo ptr to buffer lda #^prec sta rw_pblk+6 hi ptr to buffer lda #printersetup.sizeof sta rw_pblk+8 request count stz rw_pblk+10 stz w3 close file when done lda #Binary type of file wanted brl hfo handle file operation and return ;; cac - create actual controls. ; ; entry (ctllist..) = table of long ptrs to control templates. ; [data1] = ptr to window. ; (devices) = index of current printer type. ; (edctl..) = template for line edit control. ; (choosepr..) = template for the popup menu. ; (iwebut..) = template for emulator button. ; (plist..) = template for printer list. ; (rtpbut..) = template for rename button. ; (zlist..) = template for zone list. ; ; exit controls and created and program control falls into ; cbs to set the buttons appropriately. ; [edctl] = handle to lineedit control. ; [iwebuthdl] = handle to emulator button control. ; [plisthdl] = handle to printer list control ; [rtpbuthdl] = handle to rename button control. ; [zlisthdl] = handle to zone list control. cac lda devices ina sta choosepr+$20 set initial item in popup pha space for result pha pushl data1 window pointer pushw #3 next item is a ptr to a list of template pointers pushl #ctllist _NewControl2 pla pla don't care about result pha pha space for result pushl data1 window pointer pushw #0 next item is a control pushl #zlist _NewControl2 pulll zlisthdl handle to control pha pha space for result pushl data1 window pointer pushw #0 next item is a control pushl #plist _NewControl2 pulll plisthdl handle to control pha pha space for result pushl data1 window pointer pushw #0 next item is a control pushl #edctl _NewControl2 pulll edithdl handle to control pha pha space for result pushl data1 window pointer pushw #0 next item is a control pushl #iwebut _NewControl2 pulll iwebuthdl handle to control lda #inactiveHilite ; routine falls into cbs and returns. Obviously things will work better ; if cbs is the next routine. ;; cbs - change button status. ; ; entry (a) = new status for emulator button (inactive or nohilite). ; (devices) = type of device. ; [iwebuthdl] = handle to emulator button control. ; ; exit If the button is set to inactive then the emulator button is set ; to inactive. If the button is set to nohilite then if the current ; device is a laserwriter then the emualtor is set to nohilite, else it is ; set to inactive. cbs pha save on stack for emulator button cmp #noHilite bne cbs1 if making inactive lda devices beq cbs1 if laserwriter lda #inactiveHilite sta 1,s only laserwriter can use imagewriter emulator cbs1 pushl iwebuthdl _HiliteControl ; to eliminate annoying flicker due to a possibly pending update ; event, let's validate the button's control rect pei l1+2 ;save old values just in case pei l1 lda iwebuthdl sta l1 lda iwebuthdl+2 sta l1+2 lda [l1] ;deref control handle clc adc #octlRect ;make ptr to rect tax ldy #2 lda [l1],y bcc @no1_carry inc a @no1_carry sta l1+2 stx l1 ldy #6 ;init offset to last word @rect_loop lda [l1],y sta tempRect,y dey dey bpl @rect_loop pla sta l1 ;restore ptr pla sta l1+2 pea tempRect>>16 pea tempRect _ValidRect rts tempRect ds.w 4 ;space for copy of control rect ;; cmd - close modal dialog. ; ; entry [l5] = dialog pointer. ; ; exit dialog is closed. ; window highlighting enabled. cmd pushl l5 close the dialog _CloseDialog brl ewh enable window highlighting and return ;; cnd - check for new devices. ; ; entry (calcompF0 = 0 if last asynch call didn't complete. ; (gymp_pblk..) = paramater block to get printers in selected zone. ; (lookupF) = 0 if ok to do lookup. ; ; ; exit If (lookupF) is true then the current name lookup is killed and the ; routine exits. Else if the current call hasn't completed then ; the routine simply exits. If the call has completed, the retry counts ; are updated and the list is updated if the size has changed. If it finds ; no printers it will retry once else will assume that is correct. Then ; a new lookup is started. ;; alternate entrypoint: cndE. ; ; cndE will start a new lookup. cnd lda lookupF beq cnd1 if ok to do lookup brl knl kill name lookup and return cnd1 lda callcompF beq cnd8 if previous call didn't complete lda gmyp_pblk.retryper and #$ff cmp #5 bcs cnd2 if at maximum ina shortm sta gmyp_pblk.retryper increment retry period sta gmyp_pblk.retrycnt increment retry count longm cnd2 lda gmyp_pblk.rgotten # found so far and #$ff 255 max cmp plistsize bcs cnd3 if found something dec cnda bpl cnd4 if should try again cnd3 lda #1 sta cnda reset retry counter jsr anl add names to list ; start another lookup. cndE cnd4 jsr ghz get highlighted zone beq cnd5 if no other zones dea jsr giz get index into zones [l4] lda #myzonename sta l2 lda #^myzonename sta l2+2 ldy #memrec.memptr lda [l4],y sta l1 iny iny lda [l4],y sta l1+2 jsr cus comapre uppercase strings bcc cnd6 if didn't select the current zone cnd5 lda #asterisk the asterisk represents the current zone in search sta l3 lda #^asterisk sta l3+2 bra cnd7 cnd6 lda l1 save ptr to zone name to search sta l3 lda l1+2 sta l3+2 cnd7 stz callcompF call not completed brl snl start name lookup and return cnd8 rts cnda dc.w 1 ;; cps - copy pascal string. ; ; entry [l1] = ptr to destination string ; [l2] = ptr to source string. ; ; exit string is copied. cps ldx #$ff cpsE stx w1 save max # of chars to copy shortmx lda [l2] sta w2 length of source string ldy #0 cps1 sty w3 current index cpy w1 bcc cps2 if not past max count bne cps4 if past max count cps2 cpy w2 bcc cps3 if not past source string length bne cps5 if done cps3 lda [l2],y get char from source string sta [l1],y place into destination string iny bne cps1 if didn't wrap, process next char bra cps5 finish things up cps4 dey tya sta [l1] replace new length cps5 longmx rts ;; cst - create static text. ; ; entry [x,y] = ptr to control. ; [data1] = window ptr. ; ; exit control is created. cst pha space for result pha pushl data1 window pointer pushw #0 next item is a ptr to a control phy hi word of control phx lo word of control _NewControl2 create the control pla pla don't care about result rts ;; ctp - close the printer. ; ; entry (popen_pblk.refnum) = refnum of open connection. ; ; exit printer connection is closed. ctp ldx #punload_pblk ldy #^punload_pblk jsl $e11014 close all printer connections rts ;; cus - compare uppercase strings. ; ; entry [l1] = ptr to first pascal string. ; [l2] = ptr to second pascal string. ; ; exit strings are compared case insensitive. ; (c) set if strings are equal. cus shortmx lda [l1] sta w1 cmp [l2] bne cus4 if string lengths are different ldy #0 cus1 iny sty w3 lda [l1],y cmp #'a' bcc cus2 if not lowercase cmp #'z'+1 bcs cus2 if not lowercase sbc #$20-1 (c) clear cus2 sta w2 save lda [l2],y cmp #'a' bcc cus3 if not lowercase cmp #'z'+1 bcs cus3 if not lowercase sbc #$20-1 (c) clear cus3 cmp w2 bne cus4 if strings don't match cpy w1 bcc cus1 if more to check longmx rts (c) set, strings match cus4 longmx clc rts strings don't match ;; dah - dereference a handle. ; ; entry [a,x] = handle to dereference. ; ; exits (a) = upper word of dereferenced handle. ; [l1] = dereferenced handle dah sta l2 stx l2+2 lda [l2] sta l1 lo ptr ldy #2 lda [l2],y sta l1+2 hi ptr rts ;; dam - display alert message. ; ; entry [a,y] = ptr to message. ; ; exit centered caution alert displayed. ;; alternate entry point: damE. ; ; entry [a,y] = ptr to message. ; ; exit centered stop alert is displayed. dam sec skip1 damE clc ror damF save type wanted for now sta dammsg save message ptr sty dammsg+2 _InitCursor make sure cursor is reset ldx #(320-damw)/2 lda screenF bpl dam1 if 320 mode ldx #(640-damw)/2 dam1 stx damtemp+2 left edge txa clc adc #damw sta damtemp+6 right edge pha pushl #damtemp template pushl #0 no filter jsr dwh disable window highlighting lda damF bpl dam2 if user wants a stop alert _CautionAlert bra dam3 dam2 _StopAlert dam3 jsr ewh enable window highlighting pla ignore item hit but get it off the stack rts damt equ 60 damb equ 140 damh equ damb-damt daml equ 170 damr equ 470 damw equ damr-daml damtemp dc.w damt,daml,damb,damr dc.w 2376 id dc.b $80 dc.b $80 dc.b $80 dc.b $80 dc.l okitem dc.l damstr dc.l 0 okitem dc.w ok okay button dc.w damh-17,190,damh-4,260 dc.w buttonItem dc.l oktext,0,0 damstr dc.w 1348 text item dc.w 5,75,5+6*9,280 dc.w StatText+ItemDisable dammsg dc.l 0,0,0 damF dc.w 0 ;; dwh - disable window highlighting. ; ; entry none. ; ; exit window highlighting disabled. dwh pha pushw #$0001 flag for disabling window highlighting _WindowGlobal pla rts ;; dzl - draw zone list. ; ; entry (zindex) = item # of selected zone. ; [zlisthdl] = handle to zone list. ; ; exit list is redrawn so current item is displayed. dzl pushw zindex index of zone pushl zlisthdl _SelectMember2 scroll list so current zone is shown rts ;; ewh - enable window highlighting. ; ; entry none. ; ; exit window highlighting enabled. ewh pha pushw #$FFFE flag for enabling window highlighting _WindowGlobal pla rts ;; fsp - find selected printer. ; ; fsp is called when we have a new printer list. It goes through the list ; to see if the default printer specified in the printer.setup file is ; in this list. If it is, then the routine selects the printer. ; ; ; entry (namesbuffer..) = list manager list for printer list. ; (plistsize) = size of printer list for zone. ; (prec..) = info from printer.setup file. ; ; exit If the specified printer in the printer.setup file is found then ; printer drivers are unloaded. ; entry is selected. ; [cszone] = ptr to zone that is selected. ; (pindex) = index of selected printer. ; [pmatch] = ptr to entry that is selected. ; (selF) = 1. fsp0 rts fsp stz w4 init counter lda plistsize get size of list sta w5 # to check lda #namesbuffer sta l3 lda #^namesbuffer sta l3+2 fsp1 lda w4 get index cmp w5 compare against total bcs fsp0 if not found inc w4 bump up ctr ldy #memrec.memptr lda [l3],y sta l1 lo ptr to name iny iny lda [l3],y sta l1+2 hi ptr to name lda #prec.netname name of printer specified in printer.setup sta l2 lda #^prec.netname sta l2+2 jsr cus compare uppercase strings bcs fsp2 if matched brl fsp6 fsp2 lda prec.zone and #$ff beq fsp3 if no zone named in file lda cszone clc adc #memrec.memptr sta l1 lo word of ptr to selected zone record lda cszone+2 adc #0 sta l1+2 hi word of ptr to selected zone record ldy #memrec.memptr lda [l1],y tax iny iny lda [l1],y sta l1+2 stx l1 [l1] = ptr to currently selected zone lda #prec.zone sta l2 lda #^prec.zone sta l2+2 jsr cus compare uppercase strings bcc fsp6 if zones don't match fsp3 jsr gcp get and compare printer type bcc fsp6 if device types don't match lda prec.appletlk beq fsp6 if not appletalk printer shortmx lda #memselected ldy #memrec.memflag sta [l3],y mark it as selected longmx lda #1 sta selF flag that something is selected lda l3 sta pmatch lo word of ptr lda l3+2 sta pmatch+2 hi word of ptr lda w4 current index in list (has been incremented) sta pindex item that is selected in list jsr ubd unload both drivers bra fsp7 fsp6 shortmx ldy #memrec.memflag lda #0 sta [l3],y mark it as not selected longmx fsp7 lda l3 clc adc #memrec.sizeof sta l3 bcc fsp8 if didn't cross bank inc l3+2 fsp8 brl fsp1 ;; fsz - find starting zone in list. ; ; This routine is called to see if a specified zone is in our zone list. ; If the zone is in the list, it is selected. ; ; ; entry (zonebuffer..) = list manager list containing zone list. ; (zonename..) = name of zone to look for. ; (zlist..) = zone list control template. ; ; exit If the zone is found: ; zone is selected. ; [cszone] = ptr to zone in list. ; [lszone] = ptr to zone in list. ; (zindex) = index of zone that was selected. fsz stz w4 init counter lda zlist+$1a get list size sta w5 # to check lda #zonebuffer sta l3 lda #^zonebuffer sta l3+2 lda #zonename sta l2 lda #^zonename sta l2+2 fsz1 lda w4 get index cmp w5 compare against total bcs fsz3 if not found inc w4 ldy #memrec.memPtr lda [l3],y sta l1 iny iny lda [l3],y sta l1+2 jsr cus compare uppercase string bcs fsz2 if found a match ; move to next element. lda l3 adc #memrec.sizeof (c) clear sta l3 bcc fsz1 if didn't cross bank inc l3+2 bra fsz1 process next entry ; found a match. fsz2 lda l3 sta cszone save current zone selection sta lszone lda l3+2 sta cszone+2 sta lszone+2 shortmx ldy #memrec.memflag lda #memselected sta [l3],y select the current printer longmx lda w4 sta zindex index of zone in list fsz3 rts ;; gap - get actual pointer. ; ; gap will retrieve the pointer to a string in an entry in a ; list manager list. ; ; ; entry [l4] = ptr to this entry in list manager list. ; ; exit [l2] = ptr to string for this item. gap ldy #memrec.memptr lda [l4],y sta l2 low owrd of ptr iny iny lda [l4],y sta l2+2 high word of ptr rts ;; gcp - get and compare printer type. ; ; entry (prec.printer..) = name of last selected printer type. ; ; exit (c) set if the name of the last selected printer type is same as current. gcp jsr gdt get device type [l2] lda #prec.printer sta l1 lda #^prec.printer sta l1+2 brl cus compare uppercase strings and return ;; gdt - get device type. ; ; entry (devices) = index of printer type in table. ; (typeptr..) = ptrs to printer type names. ; ; exit [l2] = name of current printer type. gdt lda devices type of printer asl a tax lda typeptr,x sta l2 lda #^typeptr bank sta l2+2 rts ;; gpn - get printer names. ; ; entry (zonename..) = pascal string containing zone name to look in. ; ; exit name lookup is started. gpn lda #zonename sta l3 lda #^zonename sta l3+2 brl snl start name lookup and return ;; gsd - get starting device. ; ; entry none. ; ; exit (devices) = 2 if printer is imagewriter LQ. ; (devices) = 1 if printer is an imagewriter. ; (devices) = 0 if printer is laserwriter, or if ; none of the others are found. ; (c) set if found device in printer.setup file. gsd ldx #0 gsd1 stx devices index jsr gcp get and compare printer type bcs gsd2 if found starting type ldx devices inx cpx #2+1 bcc gsd1 if more to check stz devices couldn't find it so default to laserwriter clc gsd2 rts ;; gsz - get starting zone. ; ; entry (appletalk..) = pascal string of "Appletalk". ; (myzonename..) = pascal string of user's zone. ; (prec.appletlk) = 0 if not an appletalk printer. ; (prec.port..) = pascal string describing connection. ; (prec.zone..) = pascal string of printer's zone in file. ; ; exit ; ; if the printer.setup file shows appletalk on, the current printer, ; the port is correct, a zone is specified and the user has more than one ; zone, then set 'zonename' equal to the zone in the printer.setup file. ; ; else, set 'zonename' equal to myzonename. ; ; ; if no zone in the printer.setup file and there is a current zone, copy the zone ; name into lzwpns. Else if there is no current zone and there is a zone ; specified in the printer.setup file, remove the name from prec and lzwnps, else ; set lzwpns to the zone specified in the printer.setup file. gsz lda prec.appletlk beq gsz1 if not appletalk printer selected jsr gcp get and compare printer type bcc gsz1 if not same type of printer lda #prec.port sta l1 lda #^prec.port sta l1+2 lda #appletalk string 'Appletalk' sta l2 lda #^appletalk sta l2+2 jsr cus compare uppercase strings bcc gsz1 if not appletalk printer lda myzonename and #$ff beq gsz1 if there is no other zones lda prec.zone and #$ff beq gsz1 if no zone specified in file ; use the zone in the printer.setup file as the starting zone. lda #prec.zone sta l2 lda #^prec.zone sta l2+2 bra gsz2 ; use my current zone as the starting zone. gsz1 lda #myzonename sta l2 lda #^myzonename sta l2+2 gsz2 lda #zonename sta l1 lda #^zonename sta l1+2 jsr cps copy pascal string lda #lzwpns sta l1 dest loc for eventual copy lda #^lzwpns sta l1+2 lda zonename and #$ff beq gsz3 if don't have a zone name lda prec.zone and #$ff bne gsz4 if a zone is specified in printer.setup lda #zonename source loc ldx #^zonename bra gsz6 copy zonename to lzwpns gsz3 lda prec.zone and #$ff beq gsz5 if no name in setup file gsz4 lda zonename and #$ff bne gsz5 if a zonename is present stz prec.zone no zone name stz lzwpns no zone name bra gsz7 gsz5 lda #prec.zone ldx #^prec.zone gsz6 sta l2 lo source ptr stx l2+2 hi source ptr brl cps copy pascal string and return gsz7 rts ;; ghl - get handle and length of text. ; ; entry [edithdl] = handle to linedit control. ; ; exit (a) = length of text. ; [l1] = ptr to text. ghl lda edithdl ldx edithdl+2 jsr dah derefence a handle pha space on stack ldy #octlData+2 lda [l1],y pha hi word tax save for later dey dey lda [l1],y pha lo word pha space on stack pha space on stack phx hi word pha lo word _LEGetTextHand pla lo byte of handle to text plx hi word of handle to text jsr dah derefence a handle _LEGetTextLen data is already on stack pla length of field rts ;; ghp - get highlighted printer. ; ; entry [plisthdl] = handle to printer list control. ; ; exit (a) = item # of highlighted printer. ghp pha space for call pushw #0 start from top of list pushl plisthdl use printer list _NextMember2 pla rts ;; ghz - get highlighted zone. ; ; entry [zlisthdl] = handle to zone list control. ; ; exit (a) = item # of highlighted zone. ghz pha space for result pushw #0 start from top of list pushl zlisthdl _NextMember2 pla selected zone, or 0 if none selected rts ;; gip - get index into printers. ; ; entry (a) = index of desired printer. ; (namesbuffer..) = printer list definition. ; ; exit [l4] = ptr to entry in namesbuffer list. gip jsr goa get offset into array clc adc #namesbuffer sta l4 low word of ptr tya adc #^namesbuffer sta l4+2 high word of ptr rts ;; giz - get index into zones. ; ; entry (a) = index of desired zone. ; (zonebuffer..) = zone list definition. ; ; exit [l4] = ptr to entry in zonebuffer list. giz jsr goa get offset into array clc adc #zonebuffer sta l4 low word of ptr tya adc #^zonebuffer sta l4+2 hi word of ptr rts ;; gmz - get my zone. ; ; entry (gmyz_pblk..) = parameter block to get current zone. ; ; exit (myzonename..) = pascal string containing user's zone. gmz ldx #gmyz_pblk ldy #^gmyz_pblk jsl $e11014 gmz1 lda gmyz_pblk+2 cmp #busy beq gmz1 if request not finished yet tay beq gmz2 if no error stz myzonename assume no name for zone gmz2 rts ;; goa - get offset into array. ; ; entry (a) = offset desired. ; memrec.sizeof = size of each element ; ; exit [l4] = offset of entry goa pha pha space for call pha element wanted pushw #memrec.sizeof _Multiply pla sta l4 low word of ptr ply sty l4+2 high word of ptr rts ;; gzl - get zone list. ; ; entry (ginfoprarams..) = parameter block to get appletalk info. ; maxzones = max # of zones to worry about. ; namelen = max length of object names. ; (zlist..) = zone list control template. ; (zonelist_pblk..) = parameter block to get zone list. ; ; exit [cszone] = 0. ; (devices) = starting device. ; (ldwpns) = starting device. ; [lszone] = 0. ; [zonenamehdl] = handle to memory for zone list. ; (zonebuffer..) = list mamanger list containing zones. ; ; if there is for memory for zonenamehdl, routine exits to hom. gzl shortm lda GinfoParams+getinfo.ABridge sta bridge sta zonelist_pblk.brnode longm lda zonenamehdl ora zonenamehdl+2 ;do we have this handle yet? bne gzl_haveHndl ;yes, don't allocate again lda #maxzones*(namelen+1+5) gzl1 pha space for result pha space for result pushw #0 hi word of size to create pha lo word of size to create pha space for memory id _MMStartup put control panel mem ID on stack pushw #attrLocked pha pha _NewHandle pla sta zonenamehdl pla sta zonenamehdl+2 bcc gzl3 if no memory problems gzl2 brl hom handle out of memory and return gzl_haveHndl gzl3 lda bridge beq gzl6 if no bridge jsr gmz get my zone lda #3 sta w1 gzl4 lda zonenamehdl ldx zonenamehdl+2 jsr dah derefence a handle sta zonelist_pblk.bufptr+2 hi word lda l1 sta zonelist_pblk.bufptr lo word gzl5 ldx #zonelist_pblk ldy #^zonelist_pblk jsl $e11014 lda zonelist_pblk.numberzones and #$ff only 255 possible bne gzl6 if got some zones dec w1 bne gzl5 if should try again gzl6 sta zlist+$1a size of list - total # of zones that were found ; next 3 lines moved to ccc so this routine could be used by rtc ;jsr gsd get starting device ;lda devices ;sta ldwpns last device with printer name selected jsr gsz get starting zone ; now create all of the pointers to the pascal strings in zonenames. lda zonenamehdl ldx zonenamehdl+2 jsr dah dereference a handle lda #zonebuffer sta l2 lda #^zonebuffer sta l2+2 stz w2 current index into list gzl9 ldy #memrec.memptr lda l1 sta [l2],y low ptr to this string iny iny lda l1+2 sta [l2],y high ptr to this string shortmx ldy #memrec.memflag lda #0 sta [l2],y entry is not selected longmx lda l2 clc adc #memrec.sizeof sta l2 bcc gzl10 inc l2+2 gzl10 jsr mneE move to next element lda w2 current index into zone list ina sta w2 cmp zlist+$1a compare against total zones bcc gzl9 if more zones to do lda #1 sta zlist+$20 start at top of list stz cszone stz cszone+2 nothing is currently selected stz lszone stz lszone+2 nothing was selected rts ;; heb - handle emulator button. ; ; entry user has clicked on the imagewriter emulator button. ; ; exit the current name lookup is killed then the program ; attempts to download the emulator. heb lda #$ffff sta lookupF jsr knl kill name lookup brl cfe check for emulator and return ;; hfo - handle file operation. ; ; entry (a) = type of file wanted. ; appletalkfile = file type for appletalk files. ; (close_pblk..) = parameter block for closing gs/os file. ; (diskerror) != 0 if get error previously. ; (emess2..) = volume not found error message. ; (emess3..) = access denied error message. ; (emess4..) = i/o error message. ; (emess5..) = write protect error message ; (emess6) = disk full error message. ; (open_pblk..) = parameter block for gs/os open call. ; (rw_pblk..) = parameter block for gs/os read/write calls. ; (sm_pblk..) = parameter block for setting a file mark. ; (w1) = gs/os command, read = $2011, write = $2012 ; (w3) != 0 if file is to be kept open after operation. ; ; exit (c) set if file operation couldn't be performed. ; (close_pblk..) has refnum set so the file can be closed. ; (diskerror) = error #, =1 if user quit. hfo sta w2 save type of file wanted for now lda #1 sta w4 assume no error stz diskerr clear error word hfo1 _OpenGS open_pblk ldx open_pblk+2 file reference number stx close_pblk+2 stx sm_pblk+2 stx rw_pblk+2 bcc hfo3 if no problems hfo_open_err stz w4 flag that an error occurred stz close_pblk+2 clear ref num so we won't close cmp #fileNotFound bne @err2 @not_there ldx w2 get type of file cpx #Binary is it printer.setup? bne @err2 no, continue error handling @psetup_missing lda w1 check caller command cmp #$2013 do we intend to write? beq @create if writing, create it @clear ; no printer.setup to read, so clear rec in mem ldx #printersetup.sizeof-2 point to last word @clr_loop stz prec,x dex dex bpl @clr_loop stz prec clear 1st byte in case size was odd number bra hfo1a return error if anyone cares @create lda open_pblk+4 lo ptr to pathname ldx open_pblk+6 hi ptr to pathname sta create_pblk+2 copy to create params stx create_pblk+2+2 _CreateGS create_pblk bcc hfo1 try again to open it bra hfo_open_err handle error @err2 cmp #volnotfound bne hfo2 if not a volume not found problem lda #emess2 ldy #^emess2 jsr hre handle recoverable disk error tax bmi hfo1a if user wants to quit bra hfo1 try again hfo1a sec ldx #1 stx diskerr rts hfo2 cmp #invalidAccess bne hfo4 if not an invalid access problem, give generic message lda #emess3 'Access Denied error. É' bra hfo5 uses same bank as emess4 hfo3 lda open_pblk+$e get filetype of file cmp w2 beq hfo6 if found the correct file _CloseGS close_pblk make sure it gets closed hfo4 lda #emess4 'Havng trouble accessing printer data files É' hfo5 ldy #^emess4 jsr dam display alert message bra hfo10a finish things up hfo6 lda w2 cmp #appletalkfile bne hfo7 if not atint file, no need to set mark _SetMarkGS sm_pblk bcs hfo4 if an error occured of some sort - should never happen hfo7 pushl #rw_pblk parameter block ;lda w1 pushw w1 either $2012 or $2013 jsl stack_entry make the call bcc hfo11 if no error stz w4 flag an error cmp #$2b bne hfo7a if not a write-protect error lda #emess5 ldy #^emess5 jsr hre handle recoverable error tax bmi hfo10a if user wants to quit bra hfo7 try again hfo7a cmp #invalidAccess bne hfo8 if not an invalid access problem lda open_pblk+$C ;get access word and #$0002 ;check write enable bne @vol_access_err ;not locked file, must be access denial @file_locked lda #fileLockedMsg ldy #^fileLockedMsg ;tell user file is locked bra hfo_show @vol_access_err lda #emess3 'Access Denied' error bra hfo10 hfo8 cmp #volumeFull bne hfo9 if volume full error lda #emess6 'The disk is full. É' bra hfo10 uses same bank as emess4 hfo9 lda #emess4 hfo10 ldy #^emess4 hfo_show jsr dam display alert message _CloseGS close_pblk make sure it gets closed hfo10a lda #1 sta diskerr flag error for next file hfo11 ldx w4 bne hfo13 if no error ever occurred pushl #cprect _InvalRect invalidate the control panel rectangle hfo13 lda w3 bne hfo14 if user wants file left open lda close_pblk+2 check if we ever opened beq hfo14 invalid ref num, don't close _CloseGS close_pblk hfo14 ldx diskerr error flag rts ;; hom - handle out of memory. ; ; entry program wasn't able to get memory wanted. ; ; exit memory dialog displayed and removed. ; (atalkF) = 0. hom stz atalkF pretend there is no appletalk lda #emess7 'There is not memory to continue' ldy #^emess7 brl damE display stop alert and return ;; hpe - handle pap error. ; ; entry (a) = error. ; (emess10..) = error message for when printer is not responding. ; (emess11..) = error message for when network error. ; (emess13..) = error message for when printer can't be found. ; ; exit error message is displayed in a centered stop alert. hpe cmp #$805 bne hpe1 if not a name not found error cmp #$807 bne hpe1 if not a network error lda #emess13 'The selected printer could not be found' bra hpe3 hpe1 cmp #$808 bne hpe2 if not a server not responding error lda #emess10 'The selected printer is not responding...' bra hpe3 hpe2 lda #emess11 'A network error has occurred...' hpe3 ldy #^emess11 bank is the same for all messages brl damE display alert message and return ;; hpl - hit printer list. ; ; entry user clicked in an entry in the printer list. ; Atalkon = flag to indicate that appletalk is on. ; (devices) = index of device type. ; [plisthdl] = handle to printer list control. ; [zlisthdl] = handle to zone list control. ; ; exit emulator button is highlighted if laserwriter. ; (ldwpns) = (devices). ; (lzwpns..) = last zone with printer name selected. ; (prec.appletlk) = Atalkon. ; (prec.netname..) = pascal string containing printer name. ; (sel2F) = 1. hpl jsr ghp get highlighted printer beq hpl2 if nothing selected, exits ldx #1 stx selF flag that a selection was made stx sel2F flag that printersetup might have changed dea jsr gip get index into printers [l4] lda #noHilite jsr cbs jsr gap get actual pointer lda #prec.netname sta l1 lda #^prec.netname sta l1+2 jsr cps copy pascal string stz prec.zone stz lzwpns jsr ghz get highlighted zone hpl2 beq hpl3 if no zone is selected dea jsr giz get index into zones [l4] jsr gap get actual pointer lda #lzwpns last zone with printer name selected sta l1 lda #^lzwpns sta l1+2 jsr cps copy pascal string lda #prec.zone sta l1 lda #^prec.zone sta l1+2 jsr cps copy pascal string hpl3 lda devices sta ldwpns last device with printer name selected ; next code added 9/16/91 by Monte Benaresh cmp #2 ImageWriterLQ? bne @not_LQ ; For ImageWriterLQ we leave our "internal" version of the printer ; name in the printer.setup image, which is "LQ". lda #$0002 sta prec.printer set length byte & next byte as garbage lda #'QL' 'LQ' sta prec.printer+1 bra @name_done @not_LQ jsr gdt get device type in [l2] lda #prec.printer sta l1 lda #^prec.printer sta l1+2 jsr cps copy pascal string @name_done lda #ATalkOn sta prec.Appletlk rts ;; hpu - hit pop up. ; ; entry user has selected an item from the popup. ; [data1] = handle to popup control. ; (devices) = current device type. ; (ldwpns) = last device with printer name selected. ; (lzwpns..) = last zone with printer name selected. ; (selF) != 0 if selection was made. ; ; exit if the user chose the same as current nothing is done. Else a new printer ; list is generated for this zone. hpu pha space for result pushl data1 ptr to control _GetCtlValue pla dea cmp devices beq hpu9 if the same as previous printer type sta devices new device type to use lda ldwpns last device with printer name selected cmp devices bne hpu1 if not the same as selected device lda SelF beq hpu1 if no selection pha space for result pushl zlisthdl handle to list control _ResetMember2 unselect the current zone pushl zlisthdl _DrawMember2 redraw the zone unselected lda #lzwpns sta l2 lda #^lzwpns sta l2+2 lda #zonename sta l1 lda #^zonename sta l1+2 jsr cps copy pascal string jsr fsz find starting zone jsr dzl draw zone list hpu1 jsr ghz get highlighted zone beq hpu8 if no zones stz lszone stz lszone+2 force it to recalculate brl hzlE handle zone list (will get new list of printers) and return hpu8 brl hzlEE handle zone list and return hpu9 rts ;; hre - handle recoverable disk error. ; ; entry [a,y] = ptr to message. ; ; exit centered stop alert displayed. ; (a) = 0 if user wants to try again. ; (a) = $ffff if user wants to quit. hre sta hremsg lo ptr to text sty hremsg+2 hi ptr to text jsr dwh disable window highlighting _InitCursor ldx #(320-hrew)/2 lda screenF bpl hre1 if 320 mode ldx #(640-hrew)/2 hre1 stx hredlg+2 txa clc adc #hrew sta hredlg+6 pha pushl #hredlg alert template pushl #0 no filter _StopAlert pla get item hit cmp #ok bne hre2 if user wants to quit lda #0 rts hre2 lda #$ffff rts hrel equ 10 hrer equ 310 hrew equ hrer-hrel hret equ 60 hreb equ 130 hreh equ hreb-hret hredlg dc.w hret,hrel,hreb,hrer dc.b $b1,$82 dc.b $80,$80,$80,$80 dc.l hretext,hrecanc,hreok,0 hreok dc.w ok ok button dc.w hreh-17,165,hreh-4,165+100 dc.w ButtonItem dc.l tryagain,0,0 hrecanc dc.w cancel quit button dc.w hreh-17,35,hreh-4,35+100 dc.w ButtonItem dc.l quit,0,0 hretext dc.w 3 text item dc.w 5,75,5+4*9,hrew dc.w StatText+ItemDisable hremsg dc.l 0 ptr to text message dc.l 0,0 ;; hzl - hit zone list. ; ; entry user clicked in the zone list to select a zone. ; [lszone] = ptr to last selected zone. ; ; exit if the selected zone hasn't changed, routine just returns, else ; the current name lookup is stopped. ; a new name lookup is started with the selected zone. ; buttons are inactivated. ; [lszone] = ptr to zone the user clicked on. ; (pindex) = 0. ; [pmatch] = 0. ; (plistsize) = 0. ;; alternate entry point: hzlE. ; ; (a) = item # of zone. ;; alternate entry point: hzlEE. ; ; force routine to kill current lookup and restart a name lookup. hzl jsr ghz get highlighted zone hzlE dea jsr giz get index into zones [l4] ldx l4 stx cszone lo ptr to record of selected zone lda l4+2 sta cszone+2 hi ptr to record of selected zone cmp lszone+2 bne hzl1 if not the same zone cpx lszone beq hzl2 if selected the same zone as before hzl1 stx lszone sta lszone+2 save for next comparison hzlEE jsr knl kill name lookup stz pmatch stz pmatch+2 stz pindex nothing selected stz plistsize flag nothing valid pushl #0 use standard pushw #1 item # of first displayed member pushl #$ffffffff use current value for listref pushw #$ffff no change to listref descriptor pushw #0 size of list pushl plisthdl handle to list _NewList2 lda #inactiveHilite jsr cbs change button status brl cndE check for new devices and return hzl2 rts ;; iai - is appletalk active. ; ; entry (iaia..) = gs/os parameter block to get the device # of appletalk driver. ; ; exit (c) set if appletalk driver isn't active. ; (atalkF) = 0 if no appletalk, else = 1. iai _GetDevNumberGS iaia lda #1 asssume found bcc iai1 if no error - appletalk active dea iai1 sta atalkF set flag rts iaia dc.w 2 two parameters dc.l iaib ptr to device name ds.b 2 result - not used iaib dc.w iaiblen dc.b '.APPLETALK' iaiblen equ *-iaib-2 ;; inb - is network boot. ; ; entry (inba..) = gs/os parameter block to get info on boot device. ; ; exit (c) set if network boot. ; (netbootF) != 0 if this was a network boot. inb _DinfoGS inba get device info on boot device stz netbootF assume not network boot lda inba+$14 get device id cmp #$1e bne inb1 if not appleshare fst sta netbootF flag that this is a network boot inb1 rts inba dc.w 8 8 parameters needed dc.w 1 want info on the boot device dc.l bootdev buffer to name of boot device ds.b 14 hold results ;; ipl - initialize printer list. ; ; ipl is used to go through the printer list and mark all of the ; items as unselected. ; ; entry maxsrvrs = max # of printers to worry about per zone. ; (namesbuffer..) = printer list. ; ; exits every element is unselected. ; (plistsize) = 0. ipl stz w1 init counter lda #namesbuffer sta l1 lda #^namesbuffer sta l1+2 stz plistsize nothing in the list ipl1 shortmx ldy #memrec.memflag lda #0 sta [l1],y longmx lda w1 ina sta w1 bump up counter cmp #maxsrvrs bcs ipl2 if done lda l1 adc #memrec.sizeof (c) clear sta l1 bcc ipl1 if didn't cross bank inc l1+2 bra ipl1 process next entry ipl2 rts ;; knl - kill name lookup. ; ; entry (kill_pblk..) = parameter block to stop name lookup. ; ; exit lookup is stopped. ; (gmyp_pblk.retryper) = 1 for next name lookup call. ; (gymp_pblk.retrycnt) = 1 for next name lookup call. knl ldx #kill_pblk ldy #^kill_pblk jsl $e11014 shortm lda #1 sta gmyp_pblk.retryper reset retry period for intial look sta gmyp_pblk.retrycnt reset retry count for initial look longm rts ;; mne - move to next element. ; ; mne is used to move past an entry in the buffer that is created ; by a name lookup call. ; ; entry [l1] = ptr to current entry in buffer. ; ; exit [l1] = ptr to next entry in buffer. ;; alternate entrypoint: mneE. ; ; mneE will move past a pascal string. ; ; entry [l1] = ptr to start of pascal string. ; ; exit [l1] = ptr is moved past the string mne lda l1 clc adc #5 sta l1 bcc mne1 if no carry into hi word inc l1+2 mne1 jsr mneE get past type field jsr mneE get past zone field twice ; routine jsr's to here from above since that is the most efficient ; way of doing this. mneE mne2 lda [l1] and #$ff get length of field sec adc l1 add in length of string + length byte sta l1 bcc mne3 if no carry into hi word inc l1+2 mne3 rts ;; omd - open modal dialog. ; ; entry [a,y] = fwa of dialog template. ; ; exit modal dialog is opened. ; window highlighting is turned off. ; [l5] = dialog pointer. omd pha space for result pha phy hi ptr to dialog template pha lo ptr to dialog template jsr dwh disable window highlighting _GetNewModalDialog pla get dialog pointer sta l5 pla sta l5+2 rts ;; osd - open status dialog. ; ; osd is used to create a dialog containg just a status message. ; ; entry [a,y] = ptr to text to display in dialog. ; dlgw = width of dialog. ; (osdlg..) = dialog template. ; (screenF) = $8000 if 640 mode. ; ; exit dialog is created and displayed. osd sta osdptr sty osdptr+2 save ptr to text ; adjust the location ldx #(320-dlgw)/2 lda screenF bpl osd1 if 320 mode ldx #(640-dlgw)/2 osd1 stx osddlg+2 left edge txa clc adc #dlgw sta osddlg+6 right edge lda #osddlg ldy #^osddlg jsr omd open modal dialog pushl l5 _DrawDialog rts ; data used here. dlgt equ 60 dlgb equ 122 dlgh equ dlgb-dlgt dlgl equ 170 dlgr equ 470 dlgw equ dlgr-dlgl osddlg dc.w dlgt,dlgl,dlgb,dlgr rectangle dc.w $ffff visisble dc.l 0 refcon dc.l osditem dc.l 0 osditem dc.w 3 item id dc.w 20,46,60,300 rectangle dc.w statText+ItemDisable type osdptr dc.l 0 ptr dc.w 0 value dc.w 0 flag dc.l 0 color table ;; otp - open the printer. ; ; entry (popen_pblk..) = parameter block to open a printer connection. ; [pstat_pblk.prname] = ptr to printer name. ; ; exit (a) = result code. otp lda pstat_pblk.prname move ptr to name over sta popen_pblk.prname lda pstat_pblk.prname+2 sta popen_pblk.prname+2 ldx #popen_pblk get low word pointer to parameter list ldy #^popen_pblk get high word pointer to parameter list jsl $e11014 otp1 lda popen_pblk.result cmp #papbusy bne otp2 if no longer busy bra otp1 otp2 rts ;; rfp - read from printer. ; ; rfp is used to keep a constant read coming from the printer so ; there is never a time when the printer is waiting to send status. ; The data read from the printer is ignored. ; ; entry (popen_pblk.refnum..) = refnum of open connection. ; (pread_pblk..) = parameter block to read from printer connection. ; ; exit read request is started if the last one has stopped. rfp lda pread_pblk.result cmp #PapBusy beq rfp1 if last call hasn't finished yet rfpE shortm lda popen_pblk.refnum sta pread_pblk.refnum longm lda #512 sta pread_pblk.buflen ldx #pread_pblk get low word pointer to parameter list ldy #^pread_pblk get high word pointer to parameter list jsl $e11014 rfp1 rts export readbuff readbuff ds.b 512 ;; snl - start name lookup. ; ; entry none. ; ; exit namelookup is started. ; (lookupF) = 0. snl lda #('='<<8)+1 one char string of '=' sta netobj any object lda #netobj+2 sta l1 lda #^netobj+2 sta l1+2 jsr gdt get device type [l2] jsr cps copy pascal string jsr mneE move to next element snl1 lda l3 lo ptr to zonename to check sta l2 lda l3+2 hi ptr to zonemname to check sta l2+2 jsr cps copy pascal string stz lookupF don't stop the lookup ldx #gmyp_pblk ldy #^gmyp_pblk jsl $e11014 lda gmyp_pblk.result get result in case caller cares rts ;; stp - status the printer. ; ; entry a printer is selected. ; (pstat_pblk..) = parameter block to status a printer. ; ; exit (a) = result code. ; (netobj2..) = printer tuple. ;; alternate entry point: stpE. ; ; entry [pstat_pblk.prname] = ptr to printer tuple. stp jsr ghp get highlighted printer dea offset into list (always is 1 selected) jsr gip get index into printers ldy #memrec.memptr lda [l4],y sta l2 lo word of ptr to name iny iny lda [l4],y sta l2+2 hi word of ptr to name lda #netobj2 sta pstat_pblk.prname sta l1 lda #^netobj2 sta pstat_pblk.prname+2 sta l1+2 jsr cps copy pascal string jsr mneE move to next element jsr gdt get device type jsr cps copy pascal string jsr mneE move to next element lda cszone ora cszone+2 bne stp1 if have selected a zone lda #asterisk current zone bra stp2 stp1 lda #lzwpns last zone with printer name selected stp2 sta l2 lda #^lzwpns sta l2+2 jsr cps copy pascal string stpE jsr knl kill name lookup ldx #pstat_pblk ldy #^pstat_pblk jsl $e11014 stp3 lda pstat_pblk.result cmp #papbusy beq stp3 if not done yet rts ;; ubd - unload both drivers. ; ; entry none. ; ; exit printer drivers are unloaded if necessary. ubd pha space for result _PMStatus pla bcs ubd1 if error occured beq ubd1 if print manager isn't active pushw #0 want to unload both drivers _PMUnloadDriver ubd1 rts ;; udf - update data files. ; ; entry none. ; ; exit atinit and printer.setup are created. udf jsr ghl get LineEdit handle and length sta udfa length of text shortx ldy #0 udf1 lda [l1],y move the name over sta udfa+1,y iny iny cpy udfa bcc udf1 if more to copy longx ; copy the user's name into the printer setup record. lda #udfa sta l2 lda #^udfa sta l2+2 source loc lda #prec.name sta l1 lda #^prec.name sta l1+2 dest ldx #15 # of chars to copy jsr cpsE copy pascal string ; copy the user's name into the ATINIT record. lda #atinit.name sta l1 lda #^atinit.name sta l1+2 jsr cps copy pascal string ; copy the zone over into the printer setup record. lda bridge bne udf1a if there is a bridge lda #asterisk use asterisk for current zone sta l2 source ptr lda #^asterisk bra udf1b udf1a lda #lzwpns last zone with printer name selected sta l2 lda #^lzwpns udf1b sta l2+2 lda #prec.zone sta l1 dest ptr lda #^prec.zone sta l1+2 jsr cps copy pascal string lda sel2F beq udf2 if no selection was made lda #1 sta prec.AppleTlk flag that appletalk is on lda #appletalk sta l2 source ptr lda #^appletalk sta l2+2 ptr to the string "appletalk" lda #prec.port sta l1 dest ptr lda #^prec.port sta l1+2 jsr cps copy pascal string lda ldwpns last device with printer name selected cmp #2 bne udf1c if not imagewriterLQ ina increase so it returns the correct name udf1c sta devices jsr gdt get device type lda #prec.printer sta l1 dest ptr lda #^prec.printer sta l1+2 jsr cps copy pascal string lda ATINIT.pflags and #$9f mask off local printer (bit 6) and emulator bit (bit 5) ora #networkprinter flag as network printer ldx devices bne udf1d if not laserwriter ora #emulatorBit flag that this printer has a postscript emulator udf1d sta ATINIT.pflags replace the flag byte jsr ubd unload both drivers udf2 stz diskerr assume no error has occurred so far lda #write jsr asf access setup file ; copy over the printer tuple: net, printer, zone. lda ldwpns sta devices jsr gdt get device type shortmx ldx #-1 udf3 inx lda prec.netname,x copy over netname sta atinit.tuple,x cpx prec.netname bcc udf3 if more to copy lda [l2] sta w1 save length of typename for now ldy #-1 udf4 inx iny lda [l2],y get next char of typename sta atinit.tuple,x cpy w1 bcc udf4 if more to copy ldy #-1 udf5 inx iny lda lzwpns,y last zone with printer name selected sta atinit.tuple,x cpy lzwpns bcc udf5 if more to copy longmx lda #write jsr aaf access atinit file lda prec.appletlk beq udf6 if not appletalk printer lda #prec.port sta l2 lda #^prec.port sta l2+2 lda #appletalk sta l1 lda #^appletalk sta l1+2 jsr cus compare uppercase strings bcc udf6 if not appletalk printer shortm lda #1 sta psetpr_pblk.flags want to retrieve current settings longm lda #openblock2 lo ptr to dummy buffer to use sta psetpr_pblk.entity lda #^openblock2 hi ptr to dummy buffer to use sta psetpr_pblk.entity+2 ldx #psetpr_pblk ldy #^psetpr_pblk jsl $e11014 shortm lda ATINIT.pflags get flag byte to use sta psetpr_pblk.flags longm lda #ATInit.tuple low ptr to entity name sta psetpr_pblk.entity lda #^ATInit.tuple hi ptr to entity name sta psetpr_pblk.entity+2 ldx #psetpr_pblk ldy #^psetpr_pblk jsl $e11014 udf6 rts ; data used here. udfa ds namelen+5 ;; wtp - write to printer. ; ; entry (popen_pblk.refnum) = connection refnum. ; (pwrit_pblk..) = parameter block for write command. ; ; exit data is written to printer ; (a) = result code. wtp shortm lda popen_pblk.refnum sta pwrite_pblk.refnum longm ldx #pwrite_pblk ldy #^pwrite_pblk jsl $e11014 wtp1 lda pwrite_pblk.result cmp #PapBusy beq wtp1 if still busy rts ; uninitialized data. bootdev ds.b 35 holds name of boot device - not used bridge ds.b 2 bridge # callcompF ds.b 2 != 0 if call completed cszone ds.b 4 ptr tp currently selected zone devices ds.b 2 offset of type of device diskerr ds.b 2 != 0 if got a disk error edithdl ds.b 4 handle to edit box control iwebuthdl ds.b 4 handle to emulator button control ldwpns ds.b 2 last device with printer name selected lookupF ds.b 2 != 0 if to look for new devices lszone ds.b 4 ptr to last selected zone lzwpns ds.b namelen+1 last zone with printer name selected myzonename ds.b namelen+1 name of user's home zone namesbuffer ds.b memrec.sizeof*MaxSrvrs netbootF ds.b 2 != 0 if network boot netobj ds.b 100 build network entity here netobj2 ds.b 100 hold name openblock ds.b MaxSrvrs*(99+5) holds memory for call to get printer names openblock2 ds.b MaxSrvrs*(99+5) holds memory for call to get printer names pindex ds.b 2 offset of printer in list plisthdl ds.b 4 handle to printer list control record plistsize ds.b 2 size of printer list pmatch ds.b 4 ptr to printer name in list screenF ds.b 2 = $8000 if this is a 640 mode screen selF ds.b 2 != 0 if a selection was made sel2F ds.b 2 != 0 if printersetup might have changed username ds.b 33 user name wptr ds.b 4 window pointer zindex ds.b 2 index to zones zlisthdl ds.b 4 handle to zone list control zonebuffer ds.b memrec.sizeof*maxzones list of zones for list manager zonename ds.b 33 name of zone zonenamehdl ds.b 4 handle to zonename list from nbp call NBPBusyF ds.w 1 flag to say we couldn't lookup b/c NBP was busy cdev_result ds.l 1 ;result for Control Panel endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/netprinter.h b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/netprinter.h new file mode 100644 index 0000000..b9f631c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/netprinter.h @@ -0,0 +1 @@ + atinitrec record 0 name ds.b 33 pflags ds.b 1 tuple ds.b 99 sizeof ;size of this record endr printersetup record 0 printer ds.b 33 printer2 ds.b 33 port ds.b 33 name ds.b 16 netname ds.b 33 zone ds.b 33 Appletlk ds.b 2 sizeof ;size of this record endr MaxVols equ 16 maximum number of volumes per server? MaxVolLength equ 27+1 volume name can be 27 characters long + 1 length char for pascal strings MaxSrvrs equ 40 maximum number of file server names we can hold MaxSrvrView equ 4 how many names in our list can be seen at once MaxZones equ 255 max number of zones we can store MaxZoneView equ 4 max number of zones that can be displayed at once MaxZoneLength equ 33 namelen equ 32 entity name length for NBP Lookups unamelen equ 31 length of user name MaxOnline equ 15 BlockSize equ MaxZones*(namelen+1) pblocksize equ MaxSrvrs*(namelen+1) LeftEdge equ 10 RightEdge equ 190+80 ;25-Aug-92 DAL FSListID equ 1 ZoneListID equ 2 UserNameBoxID equ 1 AppleTalkFile equ $e2 Binary equ $06 ASCIIText equ $04 ATalkOn equ 1 BothDrivers equ 0 NetworkPrinter equ $80 LocalMask equ $bf EmulatorBit equ $20 AShareFST equ $0d read equ $2012 gs/os call number to read a file write equ $2013 gs/os call number to write a file ; asp defines. NBPLookup equ $10 KillNBP equ $46 PMSetPrinterCmd equ $28 FIAccess equ $32 FPGetUserInfoCmd equ $25 FPGetSrvrParmsCmd equ $10 FPMapIDCmd equ $15 SP_Cmd equ $20 SP_Stat equ $1d GetMyZone equ $1A GetZoneList equ $1B GetInfoCmd equ $02 GetSrvrInfoCmd equ $0f GetSrvrParmsCmd equ $10 asynchronous equ $80 synchronous equ $00 busy equ $ff TooManyProcesses equ $0408 CreatorBit equ $40 GroupBit equ $20 ; pap defines. TimerBusy equ $01ff PapBusy equ $08ff InstTimer equ $04 PStatus equ $22 POpen equ $23 PClose equ $24 PRead equ $25 PWrite equ $26 RPMSet equ $28 ;blocksize equ 512 MemRec record 0 memPtr ds.b 4 MemRec - Pointer to string, or custom memFlag ds.b 1 MemRec - Bit Flag NetNum ds.b 2 network number NodeID ds.b 1 node id ScktNum ds.b 1 socket number Enumerator ds.b 1 enumerator privflag ds.b 1 ckboxId ds.b 2 sizeof ;size of memrec record endr entityrec record 0 netnum ds.b 2 nodeID ds.b 1 scktNum ds.b 1 enumerator ds.b 1 objname ds.b namelen+1 ? verify this all endr NBPLType record 0 mode ds.b 1 command ds.b 1 result ds.b 2 iocomp ds.b 4 since this doesn't know about 4 byte pointers entity ds.b 4 ptr to name of what we want to find retryper ds.b 1 retry period in 1/4 secs retrycnt ds.b 1 number of times to retry internal ds.b 2 rsbsiz ds.b 2 size of following buffer rsbadr ds.b 4 responses will be stored here maxrsp ds.b 1 maximum number of responses allowed rgotten ds.b 1 actual number of responses returned endr KillNBPLtype record 0 Async ds.b 1 command ds.b 1 ResultCode ds.b 2 ParamPointer ds.b 4 endr GMyZone record 0 async ds.b 1 command ds.b 1 result ds.b 2 iocomp ds.b 4 bufptr ds.b 4 retryinterval ds.b 1 retrycount ds.b 1 resrvd ds.b 2 endr ; parameter block to get a zone list. gzonelist record 0 async ds.b 1 command ds.b 1 result ds.b 2 iocomp ds.b 4 buflen ds.b 2 bufptr ds.b 4 brnode ds.b 1 strtindex ds.b 2 retryinterval ds.b 1 retrycount ds.b 1 numberzones ds.b 2 resrvd ds.b 2 endr GetInfo record 0 async ds.b 1 command ds.b 1 ResultCode ds.b 2 CompRtnRet ds.b 4 ThisNet ds.b 2 ABridge ds.b 1 HardwareID ds.b 1 Romversion ds.b 2 NodeNumber ds.b 1 endr PMSetPrinterType record 0 async ds.b 1 command ds.b 1 Result ds.b 2 Entity ds.b 4 flags ds.b 1 FlushInterval ds.b 2 TimeoutInterval ds.b 2 NumOfBuffers ds.b 2 endr ; pap definitions. open_printer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 refnum ds.b 1 prname ds.b 4 flowq ds.b 1 statbuf ds.b 4 endr write_printer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 refnum ds.b 1 buflen ds.b 2 bufptr ds.b 4 eofbyte ds.b 1 endr read_printer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 refnum ds.b 1 buflen ds.b 2 bufptr ds.b 4 eofbyte ds.b 1 reserved ds.b 2 needed for bug in pap endr status_printer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 prname ds.b 4 statbuf ds.b 4 endr close_printer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 refnum ds.b 1 endr timer record 0 async ds.b 1 command ds.b 1 Result ds.b 2 iocomp ds.b 4 ticCount ds.b 2 running tick count howlong ds.b 2 how many 1/4th to wait reserved ds.b 4 endr \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/netprinter.r b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/netprinter.r new file mode 100644 index 0000000..a6a2a4c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/netprinter.r @@ -0,0 +1 @@ +/*******************************************************************/ /* /* netprinter.r /* /* Copyright (C) 1988-1992 /* Apple Computer, Inc. /* All Rights Reserved /* /* This file contains the source of the resources needed to build the /* Netprinter CDEV. /* /*******************************************************************/ #include "typesiigs.r" resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"FFF000000000000000000000000F" $"FF0FFFFFFFFFFFFFFFF0FFFFFF0F" $"F0FFFFFFFFFFFFFFFFF0FFFFFF0F" $"F0FFFFFFFFFFFFFFFFF0FFFFFF0F" $"F0FFFFFFFFFFFFFFFFF000000000" $"FF0FFFFFFFFFFFFFFFF0FFFFFFF0" $"FFF00000000000000000FFFFFFF0" $"FFF0FFFFFFFFFFFFFFFFFFFFFFF0" $"FFF00000000000000000F0F0F0F0" $"FFF0F4FFFFFFFFFFFFFFFFFFFFF0" $"FFF0000000000000000000000000" $"FFF0F0F0F0F0F0F0F0F0F0F0F0F0" $"FFF0000000000000000000000000" $"FFFFFFFFFFFFFFF0F0FFFFFFFFFF" $"FFFFFFFFFFFFFF00000FFFFFFFFF" $"FFFFFFFFFFFFFF0FFF0FFFFFFFFF" $"FFFFFFFFFFFFFF00000FFFFFFFFF" $"00F00000000000FF0FF000000F00" $"FFFFFFFFFFFFFFF0F0FFFFFFFFFF" $"00F000000000000FFF0000000F00", $"000FFFFFFFFFFFFFFFFFFFFFFFF0" $"00FFFFFFFFFFFFFFFFFFFFFFFFF0" $"0FFFFFFFFFFFFFFFFFFFFFFFFFF0" $"0FFFFFFFFFFFFFFFFFFFFFFFFFF0" $"0FFFFFFFFFFFFFFFFFFFFFFFFFFF" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" $"000000000000000FFF0000000000" $"00000000000000FFFFF000000000" $"00000000000000FFFFF000000000" $"00000000000000FFFFF000000000" $"FF0FFFFFFFFFFFFFFFFFFFFFF0FF" $"FF0FFFFFFFFFFFFF0FFFFFFFF0FF" $"FF0FFFFFFFFFFFF000FFFFFFF0FF"; }; read rCDEVCode (1,Convert) "netprinter.Load"; resource rCDEVFlags (1) { wantInit+wantClose+wantEvents+wantHit +wantCreate+wantAbout+wantRun+wantMachine, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ {0,0,175,280}, /* DataRect */ "Net Printer", /* Name */ "Michael Stein", /* Author */ "v1.1"; /* VersStr */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/ple.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/ple.aii new file mode 100644 index 0000000..fc6d7b6 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/ple.aii @@ -0,0 +1 @@ +;;; ple - print line with ellipses. ; ; 25-Aug-92 DAL: ; This file is no longer used--the List Manager can ; print strings with ellipses all by its own-self now. ; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/sul.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/sul.aii new file mode 100644 index 0000000..00c02de --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetPrinterCDEV/sul.aii @@ -0,0 +1 @@ +;;; sul - sort uppercase list. ; ; Michael V. Stein 02/21/90. ; ; © Apple, 1990. blanks off ;; equates. ;; imported addresses. ;; include files. include '::commonmacros.h' include 'm16.list' include 'm16.util2' ;; main program. main proc export sul sul Pushl #cue compare uppercase elements phy hi word to list handle pha lo word to list handle _SortList2 rts ;; cue - compare uppercase elements. ; ; entry from list manager. ; ; exit (c) set if first entry > second entry memberA equ 4+2 memberB equ memberA+4 cue phd tsc tcd use stack as a direct page ldy #$02 lda [memberA] dereference first handle tax lda [memberA],y sta memberA+2 stx memberA lda [memberB] dereference second handle tax lda [memberB],y sta memberB+2 stx memberB shortmx lda [memberA] cmp [memberB] compare it to memberB bcc cue1 if length(memberB) >= length(memberA) lda [memberB] cue1 sta min shortest length of either string ldy #$00 cue2 iny lda [memberB],y jsr cal capitalize a letter sta temp lda [memberA],y jsr cal capitalize a letter cmp temp bne cue5 we have a difference cpy min chars are the same so check if more bytes to check bcc cue2 no more bytes to check cue4 lda [memberA] the shortest string is less than the longer cmp [memberB] set carry if a >= b cue5 longmx lda 0+2 carry set if a >= b sta 8+2 lda 2+2 sta 10+2 pld pla pla pla pla rtl min ds.b 1 temp ds.b 1 ;; cal - capitalize a letter. ; ; entry (a) = letter to convert ; ; exit (a) = uppercase version of letter. longa off longi off cal cmp #'a' bcc cal1 if not lowercase cmp #'z'+1 bcs cal1 if not lowercase sbc #$20-1 (c) clear cal1 rts endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/makefile new file mode 100644 index 0000000..c39d8c4 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/makefile @@ -0,0 +1 @@ + CDEV = network OPTIONS = -d Ethernet=0 {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {OPTIONS} {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" if {dup} # test whether we should duplicateiigs duplicateiigs -m -y {CDEV} {CDEV} end {CDEV}.Load Ä ¶ network.aii.obj ¶ networkdata.aii.obj linkiigs -x -lseg:$1000 network ¶ network.aii.obj ¶ networkdata.aii.obj ¶ -o {CDEV}.Load {CDEV}.aii.obj Ä {CDEV}.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs {OPTIONS} {CDEV}.aii networkdata.aii.obj Ä networkdata.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs {OPTIONS} networkdata.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network new file mode 100644 index 0000000..e69de29 diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.Load b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.Load new file mode 100644 index 0000000..d9b88b0 Binary files /dev/null and b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.Load differ diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.aii new file mode 100644 index 0000000..4a8e16c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.aii @@ -0,0 +1 @@ + ;;; network - AppleTalk Network CDEV. ; ; From original code by Michael V. Stein 01/25/90. ; ; Adapted 4/30/91 by Monte Benaresh ; ; © Copyright Apple Computer, 1991 ; ;blanks off ;; equates. recty0 equ 0 ;rectangle offsets rectx0 equ 2 recty1 equ 4 rectx1 equ 6 stack_entry equ $e100b0 ;gs/os stack entry point ;; include files. include '::commonmacros.h' include '::cdev.h' include '::dp.h' include 'e16.control' include 'e16.dialog' include 'e16.event' include 'e16.gsos' include 'e16.lineedit' include 'e16.list' include 'e16.memory' include 'e16.quickdraw' include 'm16.control' include 'm16.dialog' include 'm16.gsos' include 'm16.intmath' include 'm16.lineedit' include 'm16.list' include 'm16.memory' include 'm16.misctool' include 'm16.quickdraw' include 'm16.print' include 'm16.QDAux' include 'm16.util2' include 'm16.window' include 'network.h' ;; main program. main proc ;; exported addreses. ;export acr ;export cmd ;export cps ;export ctp ;export dah ;export dam ;export damE ;export dptr ;export gdt ;export ghp ;export gip ;export hpe ;export hzl ;export knl ;export lookupF ;export mneE ;export netobj ;export omd ;export openblock ;export openblock2 ;export otp ;export rfp ;export rfpE ;export screenF ;export stp ;export stpE ;export wtp ;; imported addresses. import about ;import appletalk ;import asterisk ;import atalkerr import atalkF ;import atinit:atinitrec ;import atinitlpath ;import cfe ;import cprect import ctllist ;import emess1 ;import emess2 ;import emess3 ;import emess4 ;import emess5 ;import emess6 ;import emess7 ;import emess8 ;import emess10 ;import emess11 ;import emess12 ;import emess13 ;import GinfoParams import GSRad ;import oktext import P8Rad ;import tryagain ;import quit ;import rtp ;import sul ;import tryagain ;import wtext import local_icbut import ether_icbut net_cdev phb ;save calling data bank phk plb ;set our data bank ; make room on stack for direct page. tsc sec sbc #dpsize ;make room on stack for new direct page tcs phd ;save the current direct page tcd ;new direct page lda message cmp #11+1 bcs net_cdev1 ;if message defintely not handled ;ldx atalkf ;beq net_cdev1 ;if appletalk isn't present asl a ;times 2 into word table tax ;move into index reg jsr (t_cdev-2,x) ;call the handler of this message net_cdev1 pld ;restore direct page tsc clc adc #dpsize tcs ;reset the stack lda 1,s ;Bump the stack up to prepare sta 11,s ;to take off the 3 parameters lda 3,s sta 13,s pla ;get rid of message space pla ;get rid of data1 space pla pla ;get rid of data2 space pla lda #0 ;return 0 to caller sta 5,s sta 7,s plb rtl t_cdev dc.w ctcE ;handle machine message - ignored dc.w ctcE ;handle boot message - ignored dc.w ctcE ;handle shutdown message - ignored dc.w icc ;init cdev controls dc.w ctc ;close the cdev dc.w ctcE ;phandle event message - ignored dc.w ccc ;create cdev controls dc.w ham ;handle about message dc.w ctcE ;handle rectangle message - ignored dc.w hhm ;handle hit message dc.w rtc ;run the cdev ; secondary routines ;; ccc - create cdev controls. ; ; entry (atalkerr..) = appletalk error message control. ; [data1] = window ptr. ; read = gs/os command to read from a file. ; ; exit if appletalk isn't installed, the appletalk error ; text control is created. ; ; if appletalk is active then: ; controls are created. ; [wptr] = window pointer. ccc ;jsr iai ;is appletalk active ;bcc ccc1 ;if active ;ldx #atalkerr ;'AppleTalk must be installed to run É' ;ldy #^atalkerr ;brl cst ;create static text control and return if Ethernet then jsr check_ether ;set flag for presence of ethertalk endif ccc1 _Waitcursor pha ;space for result _GetMasterSCB pla xba and #$8000 sta screenF ;!= 0 if 640 mode lda data1 sta wptr ;save window pointer for later lda data1+2 sta wptr+2 jsr cac ;create actual controls _InitCursor rts ;; ctc - close the cdev. ; ; entry called when to close the cdev and appletalk is active. ; ; exit name lookup is stopped. ; memory is disposed. ;; alternate entrypoint: ctcE. ; ; ctcE is used as a convenient rts instruction. ctc ;lda #$ffff ;sta lookupF ;flag to not start any more lookups ;jsr knl ;kill name lookup ctcE ctc1 rts ;; ham - handle about messsage. ; ; entry (about..) = static text control containg the about text. ; ; exit The 'about' control is created. ham ldx #about ldy #^about brl cst ;create static text control and return ;; hhm - handle hit message. ; ; entry [data1] = handle to control. ; [data2] = id of control that was hit. ; ; exit control hit is processed. hhm lda data2 ;get id of control that was hit cmp #P8_id ;P8 radio button? bne @next1 @p8 lda #$0002 ;BRAM value for P8 bra @set_bram @next1 cmp #GS_id ;GS/OS radio button? bne @next2 @gs lda #$0001 ;BRAM value for GS/OS @set_bram ldx #$0062 ;BRAM location for net boot os jsr wbp ;new value in A bra hhm1 @next2 ********** if Ethernet then cmp #localIcID ;LocalTalk icon? bne @next3 lda current_media ;what is currently selected? beq hhm1 ;already LocalTalk @set_local stz current_media ;set to localtalk ldx etherIcHdl ldy etherIcHdl+2 bra @clear_icon ;reset the ethertalk icon @next3 cmp #etherIcID ;Ethertalk icon? bne @next4 lda current_media ;what is currently selected? bne hhm1 ;already ether @set_ether inc a ;A=1 sta current_media ;set to ether ldx localIcHdl ldy localIcHdl+2 ;reset localtalk icon @clear_icon ;get here with icon control handle in X, Y phy phx ;leave handle on stack for DrawOneCtl pea $0000 ;new control value phy phx _SetCtlValue _DrawOneCtl ;handle is on stack ; now set BRAM accordingly lda current_media inc a ;this converts to correct BRAM value ldx #$0061 ;BRAM location for network media jsr wbp ;write to BRAM bra hhm1 ;all done @next4 endif ;if Ethernet ********** hhm1 rts ;; icc - init cdev controls. ; ; entry (atalkF) = 0 if appletalk isn't active. icc ;lda atalkF ;beq icc1 ;if appletalk is not active ldx #$0062 ;battery parameter loc for startup OS jsr rbp ;read from BRAM cmp #$0002 ;is P8 selected? beq @p8 ;go set P8 button @gs ldx #$0062 lda #$0001 ;make sure standard value is there jsr wbp lda GSHdl ;get handle ldx GSHdl+2 bra @set_button @p8 lda P8Hdl ldx P8Hdl+2 @set_button pea $0001 ;set value to 1 phx ;high word of hdl pha ;low " " " _SetCtlValue ;hilight button ********** if Ethernet then ldx #$0061 ;battery parameter loc for net media type jsr rbp ;read from BRAM cmp #$0002 ;is EtherTalk selected? beq @ether ;go select EtherTalk icon @local ldx #$0061 lda #$0001 ;make sure standard value is there jsr wbp stz current_media ;set to LocalTalk lda localIcHdl ;get handle ldx localIcHdl+2 bra @set_icon @ether lda #$0001 sta current_media ;set to EtherTalk lda etherIcHdl ldx etherIcHdl+2 @set_icon pea $0001 ;set value to 1 phx ;high word of hdl pha ;low " " " _SetCtlValue ;hilight icon endif ********** icc1 rts ;; rtc - run the cdev. ; ; entry (lookupF) != 0 if not to do any more lookups. ; ; exit if lookups are allowed and out window is the frontmost, it starts a ; lookup if the last one has stopped. rtc ;lda lookupF ;bne rtc1 ;if not to look for new devices ;pha ;pha ;_FrontWindow ;pla ;lo ptr to window ;plx ;hi ptr to window ;cmp wptr ;bne rtc1 ;if no longer the front window ;cpx wptr+2 ;bne rtc1 ;if no longer the front window ;brl cnd ;check for new devices and return rtc1 rts ;; cst - create static text. ; ; entry [x,y] = ptr to control. ; [data1] = window ptr. ; ; exit control is created. cst pha ;space for result pha pushl data1 ;window pointer pushw #0 ;next item is a ptr to a control phy ;hi word of control phx ;lo word of control _NewControl2 ;create the control pla pla ;don't care about result rts ;; cac - create actual controls. ; ; entry (ctllist..) = table of long ptrs to control templates. ; [data1] = ptr to window. ; ; exit controls are created cac pha ;space for result pha pushl data1 ;window pointer pushw #3 ;next item is a ptr to a list of template pointers pushl #ctllist _NewControl2 pla pla ;don't care about result pha pha ;space for result pushl data1 ;window pointer pushw #0 ;next item is a control pushl #P8Rad _NewControl2 pulll P8Hdl ;handle to control pha pha ;space for result pushl data1 ;window pointer pushw #0 ;next item is a control pushl #GSRad _NewControl2 pulll GSHdl ;handle to control if Ethernet then pha pha ;space for result pushl data1 ;window pointer pushw #0 ;next item is a control pushl #local_icbut _NewControl2 pulll localIcHdl ;handle to control pha pha ;space for result pushl data1 ;window pointer pushw #0 ;next item is a control pushl #ether_icbut _NewControl2 pulll etherIcHdl ;handle to control endif rts if Ethernet then check_ether ;routine to check for presence of EtherTalk ;card and set haveEtherF accordingly lda #$0001 ;for now, pretend it's there sta haveEtherF rts endif ; next routines from General CDEV ;; rbp - read battery parameter. ; ; entry (x) = parameter to read. ; ; exit (a) = value of parameter. rbp pha space for result phx parameter to read _ReadBparam pla get value rts ;; wbp - write battery parameter. ; ; entry (a) = value of parameter to set. ; (x) = battery parameter to set. ; ; exit battery parameter is set. wbp pha new value phx parameter to set _WriteBparam rts wptr ds.b 4 ;window pointer screenF ds.b 2 ;high bit set if this is a 640 mode screen P8Hdl ds.l 1 ;P8 radio button handle GSHdl ds.l 1 ;GS/OS radio button handle if Ethernet then localIcHdl ds.l 1 ;LocalTalk icon control handle etherIcHdl ds.l 1 ;EtherTalk icon control handle haveEtherF ds.w 1 ;flag for presence of EtherTalk card ; 0 --> no EtherTalk card ; 1 --> have EtherTalk card current_media ds.w 1 ;currently selected network media ; 0 --> LocalTalk ; 1 --> EtherTalk endif STRING ASIS ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.h b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.h new file mode 100644 index 0000000..283ee2b --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.h @@ -0,0 +1 @@ + *********************************************************** * * Equates for network CDEV * * From original code by Mike Stein * * Adapted 5/1/91 by Monte Benaresh * *********************************************************** atinitrec record 0 name ds.b 33 pflags ds.b 1 tuple ds.b 99 sizeof ;size of this record endr MaxVols equ 16 ;maximum number of volumes per server? MaxVolLength equ 27+1 ;volume name can be 27 characters long + 1 length char for pascal strings MaxSrvrs equ 40 ;maximum number of file server names we can hold MaxSrvrView equ 4 ;how many names in our list can be seen at once MaxZones equ 255 ;max number of zones we can store MaxZoneView equ 4 ;max number of zones that can be displayed at once MaxZoneLength equ 33 namelen equ 32 ;entity name length for NBP Lookups unamelen equ 31 ;length of user name MaxOnline equ 15 BlockSize equ MaxZones*(namelen+1) pblocksize equ MaxSrvrs*(namelen+1) FSListID equ 1 ZoneListID equ 2 UserNameBoxID equ 1 AppleTalkFile equ $e2 Binary equ $06 ASCIIText equ $04 ATalkOn equ 1 BothDrivers equ 0 NetworkPrinter equ $80 LocalMask equ $bf EmulatorBit equ $20 AShareFST equ $0d read equ $2012 ;gs/os call number to read a file write equ $2013 ;gs/os call number to write a file ; asp defines. NBPLookup equ $10 KillNBP equ $46 PMSetPrinterCmd equ $28 FIAccess equ $32 FPGetUserInfoCmd equ $25 FPGetSrvrParmsCmd equ $10 FPMapIDCmd equ $15 SP_Cmd equ $20 SP_Stat equ $1d GetMyZone equ $1A GetZoneList equ $1B GetInfoCmd equ $02 GetSrvrInfoCmd equ $0f GetSrvrParmsCmd equ $10 asynchronous equ $80 synchronous equ $00 busy equ $ff TooManyProcesses equ $0408 CreatorBit equ $40 GroupBit equ $20 ; control ID's P8_id equ $3301 GS_id equ $3302 localIcID equ $3303 etherIcID equ $3304 MemRec record 0 memPtr ds.b 4 ;MemRec - Pointer to string, or custom memFlag ds.b 1 ;MemRec - Bit Flag NetNum ds.b 2 ;network number NodeID ds.b 1 ;node id ScktNum ds.b 1 ;socket number Enumerator ds.b 1 ;enumerator privflag ds.b 1 ckboxId ds.b 2 sizeof ;size of memrec record endr entityrec record 0 netnum ds.b 2 nodeID ds.b 1 scktNum ds.b 1 enumerator ds.b 1 objname ds.b namelen+1 ;? verify this all endr GMyZone record 0 async ds.b 1 command ds.b 1 result ds.b 2 iocomp ds.b 4 bufptr ds.b 4 retryinterval ds.b 1 retrycount ds.b 1 resrvd ds.b 2 endr ; parameter block to get a zone list. gzonelist record 0 async ds.b 1 command ds.b 1 result ds.b 2 iocomp ds.b 4 buflen ds.b 2 bufptr ds.b 4 brnode ds.b 1 strtindex ds.b 2 retryinterval ds.b 1 retrycount ds.b 1 numberzones ds.b 2 resrvd ds.b 2 endr GetInfo record 0 async ds.b 1 command ds.b 1 ResultCode ds.b 2 CompRtnRet ds.b 4 ThisNet ds.b 2 ABridge ds.b 1 HardwareID ds.b 1 Romversion ds.b 2 NodeNumber ds.b 1 endr \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.r b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.r new file mode 100644 index 0000000..4f8d7d7 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/network.r @@ -0,0 +1 @@ +/*******************************************************************/ /* /* Network.r /* /* Copyright (C) 1991-1993 /* Apple Computer, Inc. /* All Rights Reserved /* /* This file contains the source of the resources needed to build the /* Network CDEV. /* /*******************************************************************/ #include "typesiigs.r" resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"F000000000FFFFFFFF00000000FF" $"F0CCCCCCC0FFFFFFFF0FFFFFC00F" $"F0CDDDDDC0FFFFFFFF0FFFFFFC0F" $"F0CDDDDDC0FFFFFFFF0FFFFFFF0F" $"F0CDDDDDC0FFFFFFFF0FFFFFFF0F" $"00000000000FFFFFF00000000000" $"0FFFFFFFFF0FFFFFF0FFFFFFFFF0" $"0F4FFFFFFF0FFFFFF0F4FFFFFFF0" $"00000000000FFFFFF00000000000" $"FFFFF0FFFFFFFFFFFFFFFF0FFFFF" $"FFFFF0FFFFFFFFFFFFFFFF0FFFFF" $"FFFFF0FFFFFFFFFFFFF000000000" $"FFFFF0FFFFFFFFFFFFF0CCCCCCC0" $"00000000000FFFFFFFF0CDDDDDD0" $"0FFFFFFFFF0FFFFFFFF0CDDDDDD0" $"0F48FFFFF00FFFFFFFF000000000" $"0FFFFFFFF0FFFFFFFFF0FFFFFFF0" $"0000000000FFFFFFFFF0F4F111F0" $"0FFFFFFFF00000000000FFFFFFF0" $"0000000000FFFFFFFFF000000000" , $"0FFFFFFFFF00000000FFFFFFFF00" $"0FFFFFFFFF00000000FFFFFFFFF0" $"0FFFFFFFFF00000000FFFFFFFFF0" $"0FFFFFFFFF00000000FFFFFFFFF0" $"0FFFFFFFFF00000000FFFFFFFFF0" $"FFFFFFFFFFF000000FFFFFFFFFFF" $"FFFFFFFFFFF000000FFFFFFFFFFF" $"FFFFFFFFFFF000000FFFFFFFFFFF" $"FFFFFFFFFFF000000FFFFFFFFFFF" $"00000F0000000000000000F00000" $"00000F0000000000000000F00000" $"00000F0000000000000FFFFFFFFF" $"00000F0000000000000FFFFFFFFF" $"FFFFFFFFFFF00000000FFFFFFFFF" $"FFFFFFFFFFF00000000FFFFFFFFF" $"FFFFFFFFFFF00000000FFFFFFFFF" $"FFFFFFFFFF000000000FFFFFFFFF" $"FFFFFFFFFF000000000FFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFF000000000FFFFFFFFF"; }; read rCDEVCode (1,Convert) "network.Load"; resource rCDEVFlags (1) { wantInit+wantClose+wantHit+wantCreate +wantAbout+wantRun, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ //{0,0,145,200}, /* DataRect */ #if Ethernet {0,0,120,200}, /* DataRect */ #else {0,0,50,200}, /* DataRect */ #endif "Network", /* Name */ "Monte & Mark", /* Author */ #if Ethernet "v1.1e"; /* VersStr */ #else "v1.1"; /* VersStr */ #endif }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/networkdata.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/networkdata.aii new file mode 100644 index 0000000..6f3c5f2 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/networkdata.aii @@ -0,0 +1 @@ +************************************************************************ ; ;;; networkdata - data records and strings used by Network CDEV. ; ; From Namer CDEV code originally by Michael V. Stein 04/21/90. ; ; Adapted 4/30/91 by Monte Benaresh ; ; © Copyright Apple Computer, 1991-92 ; ************************************************************************ * * REVISION HISTORY * * 18-Jun-92 DAL for 6.0.1d6 * Added keyboard equivalents to the two radio buttons and the two * icon buttons. * * 9-Sep-92 DAL for 6.0.1d10 * Changed EtherTalk button to read Ethernet. Fixed capitalization * in help to be "Network control panel". * ************************************************************************ ;blanks off BLANKS ON ;; equates. fCtlCanBeActive equ $4000 ListBugFixBit equ 4 ;; include files. include 'e16.control' include 'e16.gsos' include 'e16.list' include 'network.h' netdata proc ;; exported addresses. export about ;export appletalk ;export asterisk export atalkerr export atalkF ;export cprect export ctllist ;export emess7 ;export emess10 ;export emess11 ;export emess13 export ginfoparams export GSRad ;export oktext export P8Rad ;export quit ;export tryagain ;export local_icbut ;export ether_icbut ;; imported addresses. import acr import netobj import openblock import openblock2 import readbuff atalkF dc.w 1 ;!= 0 if appletalk is active, defaults to active ; error strings. ; ; string asis ;; ;emess7 dc.b emess7L ; dc.b 'There is not enough memory' ; dc.b $0d ; dc.b 'to continue.' ;emess7L equ *-emess7-1 ; ; ; error messages used by the rename and emulator routines. ; ;emess11 dc.b emess11L ; dc.b 'A network error has' ; dc.b $0d ; dc.b 'occurred. Please try' ; dc.b $0d ; dc.b 'again.' ;emess11L equ *-emess11-1 ; ; ; string pascal ; ;appletalk dc.b 'APPLETALK' ; ;asterisk dc.b '*' ; ;oktext dc.b 'OK' ; ;quit dc.b 'Quit' ;used in disk error alerts ; ;tryagain dc.b 'Try Again' ;used in disk error alerts ; string asis ; appletalk parameter blocks. ; parameter block to get appletalk info. GinfoParams dc.b synchronous ;type dc.b GetInfoCmd ;command dc.w 0 ;result dc.l 0 ;completion routine dc.w 0 ;ThisNet dc.b 0 ;Abridge dc.b 0 ;HardWareID dc.w 0 ;Rom version dc.b 0 ;node number ; ctllist contains a list of controls whose handles we don't need very often. ctllist ;dc.l local_icbut * these are created * ;dc.l ether_icbut * with NewControl2 * if Ethernet then dc.l netText endif dc.l startText if Ethernet then dc.l rectCtl endif ;dc.l P8Rad * these are created * ;dc.l GSRad * with NewControl2 * dc.l 0 about dc.w 8 ;Pcount dc.l 10 ;ID dc.w 38,5,138,280 dc.l statTextControl dc.w 0 dc.w fCtlProcRefNotPtr dc.l 0 dc.l atext dc.w AtextL atext dc.b 'The Network control panel lets you choose ' if Ethernet then dc.b 'the type of network connection to use and ' ;dc.b *'the network zone you want to connect to.' endif dc.b 'which operating system will be loaded when you ' dc.b 'start up over the network.' atextL equ *-atext atalkerr dc.w 8 ;PCount dc.l 11 ;id dc.w 8,leftedge,38,Rightedge+20 dc.l statTextControl dc.w 0 dc.w fCtlProcRefNotPtr dc.l 0 dc.l atalkerrm ;ptr to text dc.w atalkerrmL ;length atalkerrm dc.b 'AppleTalk must be' dc.b 13 dc.b 'installed and enabled' dc.b 13 dc.b 'to run this Control' dc.b 13 dc.b 'Panel.' atalkerrmL equ *-atalkerrm BLANKS ON if Ethernet then netText dc.w 8 ;Pcount dc.l 2 ;ID number dc.w 5 ;rect - top dc.w 15 ; left dc.w 5+10 ; bottom dc.w 190 ; right dc.l statTextcontrol dc.w 0 ;flag, c string dc.w fctlProcRefNotPtr dc.l 0 ;ref con dc.l netStr ;text ref dc.w netLen ;length of string netStr dc.b 'Network type:' netLen equ * - netStr ;coordinate position constants for icons ;icY equ 3 icY equ 20 ic1X equ 7 ic2X equ 100 icHeight equ 40 icWidth equ 93 local_icbut ;icon button for LocalTalk dc.w 11 ;pcount dc.l localIcID ;ctl ID dc.w icY, ic1X, icY+icHeight, ic1X+icWidth ;rect dc.l iconButtonControl ;procRef dc.w $0012 ;flags dc.w $3000 ;more flags dc.l 0 ;ref con dc.l local_icon ;icon ref dc.l local_title ;title ref dc.l 0 ;color table dc.w 0 ;display mode dc.b 'B','b' ;key equivs dc.w 0,0 ;modifier masks ether_icbut ;icon button for Ethernet dc.w 11 ;pcount dc.l etherIcID ;ctl ID dc.w icY, ic2X, icY+icHeight, ic2X+icWidth ;rect dc.l iconButtonControl ;procRef dc.w $0012 ;flags dc.w $3000 ;more flags dc.l 0 ;ref con dc.l ether_icon ;icon ref dc.l ether_title ;title ref dc.l 0 ;color table dc.w 0 ;display mode dc.b 'E','e' ;key equivs dc.w 0,0 ;modifier masks local_icon dc.w $0000, $00E4, $0013, $0018 dc.b $FF, $FF, $FF, $FF, $FF, $C0, $00, $3F, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $00, $FC, $03, $F0, $0F, $FF, $FF, $FF dc.b $FF, $FF, $FF, $F0, $FF, $FF, $FF, $FF, $F0, $FF, $FF, $FF dc.b $FF, $FF, $FF, $C3, $F0, $FF, $0F, $F0, $FC, $3F, $FF, $FF dc.b $FF, $FF, $FF, $0F, $FF, $FF, $FF, $FF, $FF, $0F, $FF, $FF dc.b $FF, $FF, $FF, $0F, $03, $FF, $03, $F0, $3F, $0F, $FF, $FF dc.b $FF, $FF, $FF, $C3, $FF, $FF, $FF, $FF, $FC, $3F, $FF, $FF dc.b $FF, $FF, $FF, $F0, $0F, $C0, $FC, $0F, $00, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $03, $FF, $FF, $FC, $0F, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $00, $00, $0F, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $F0, $3F, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FC, $0F, $FC, $00, $00, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FC, $0F, $C0, $F0, $3C, $0F, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FC, $0F, $FF, $F0, $3F, $FF, $FF, $FF dc.b $FF, $FF, $FF, $F0, $3C, $0F, $03, $F0, $3F, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $00, $00, $3F, $F0, $3F, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FC, $0F, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $00, $00, $00, $00, $00, $FF, $FF, $F0, $00, $00, $00, $00 dc.b $00, $00, $00, $00, $FF, $0F, $FF, $0F, $F0, $00, $00, $00 dc.b $00, $00, $00, $0F, $00, $00, $00, $00, $0F, $00, $00, $00 dc.b $00, $00, $00, $FF, $0F, $00, $F0, $0F, $0F, $F0, $00, $00 dc.b $00, $00, $00, $F0, $00, $00, $00, $00, $00, $F0, $00, $00 dc.b $00, $00, $00, $F0, $FF, $00, $FF, $0F, $F0, $F0, $00, $00 dc.b $00, $00, $00, $FF, $00, $00, $00, $00, $0F, $F0, $00, $00 dc.b $00, $00, $00, $0F, $F0, $FF, $0F, $F0, $FF, $00, $00, $00 dc.b $00, $00, $00, $00, $FF, $00, $00, $0F, $F0, $00, $00, $00 dc.b $00, $00, $00, $00, $00, $FF, $FF, $F0, $00, $00, $00, $00 dc.b $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 dc.b $00, $00, $00, $00, $00, $00, $00, $0F, $F0, $00, $00, $00 dc.b $00, $00, $00, $00, $0F, $F0, $0F, $FF, $FF, $00, $00, $00 dc.b $00, $00, $00, $00, $0F, $F0, $FF, $0F, $FF, $F0, $00, $00 dc.b $00, $00, $00, $00, $0F, $F0, $00, $0F, $F0, $00, $00, $00 dc.b $00, $00, $00, $0F, $FF, $F0, $FF, $0F, $F0, $00, $00, $00 dc.b $00, $00, $00, $00, $FF, $FF, $F0, $0F, $F0, $00, $00, $00 dc.b $00, $00, $00, $00, $0F, $F0, $00, $00, $00, $00, $00, $00 dc.b $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ether_icon dc.w $0000, $00E4, $0013, $0018 dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FC, $3F, $0F, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $C3, $C0, $F0, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FC, $3F, $FC, $3F, $0F, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $C3, $FF, $C3, $F0, $FF dc.b $F0, $0F, $00, $0F, $00, $00, $00, $00, $3F, $FC, $3F, $0F dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $C3, $F0 dc.b $0F, $00, $0F, $00, $00, $00, $00, $00, $3F, $FC, $3F, $0F dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $C3, $FF, $C3, $F0, $FF dc.b $FF, $FF, $F0, $FC, $3F, $FF, $FC, $3F, $FC, $3F, $0F, $FF dc.b $FF, $FF, $0F, $03, $C3, $FF, $FF, $C3, $C0, $F0, $FF, $FF dc.b $FF, $F0, $FC, $3F, $FC, $3F, $FF, $FC, $3F, $0F, $FF, $FF dc.b $FF, $0F, $C3, $FF, $C3, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $F0, $FC, $3F, $FC, $00, $00, $00, $00, $00, $F0, $00, $F0 dc.b $0F, $C3, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $F0, $FC, $3F, $FC, $00, $00, $00, $00, $F0, $00, $F0, $0F dc.b $FF, $0F, $C3, $FF, $C3, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $F0, $FC, $3F, $FC, $3F, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $0F, $03, $C3, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $F0, $FC, $3F, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF dc.b $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF STRING ASIS local_title dc.b @end-@start ;length byte @start dc.b 'Built-In' @end ether_title dc.b @end-@start ;length byte @start dc.b 'Ethernet' ;was EtherTalk, 9-Sep-92 DAL @end rectCtl ;rectangle control used to draw a line dc.w 6 ;Pcount dc.l 1 ;ID number dc.w startYBase-8 ;rect - top dc.w LeftEdge-7 ; left dc.w startYBase-7 ; bottom dc.w RightEdge+1 ; right dc.l rectangleControl dc.w $FF02 ;flag, disabled, black pattern dc.w fctlProcRefNotPtr dc.l 0 ;ref con zoneYbase equ 45 cprect dc.w 0,0,200,300 ;control panel rectangle ****************************************************************** endif ;if Ethernet LeftEdge equ 15 RightEdge equ 190 ;startYBase equ 105 ;for Dudley version if Ethernet then startYBase equ 75 ;for DoRight version else startYBase equ 6 ;for 6.0 version endif startText dc.w 8 ;Pcount dc.l 1 ;ID number dc.w startYBase ;rect dc.w leftedge dc.w startYBase+10 dc.w rightedge dc.l statTextcontrol dc.w 0 ;flag, c string dc.w fctlProcRefNotPtr dc.l 0 ;ref con dc.l startStr ;text ref dc.w startLen ;length of string startStr dc.b 'Start up with:' startLen equ * - startStr P8Rad dc.w 10 ;pcount through init val dc.l P8_id ;ctl ID dc.w startYBase+13 ;top ** rect dc.w leftedge+15 ;left dc.w startYBase+13+10 ;bottom dc.w leftedge+15+100 ;right dc.l radioProc ;procref dc.w $0001 ;flags & family dc.w $3000 ;more flags dc.l 0 ;ref con dc.l P8String ;title ref dc.w 0 ;initial value dc.l 0 ;color table dc.b 'P','p' ;key equivs dc.w 0,0 ;modifier masks P8String dc.b @end-@start ;length byte @start dc.b 'ProDOS 8' @end GSRad dc.w 10 ;pcount through init val dc.l GS_id ;ctl ID dc.w startYBase+25 ;top ** rect dc.w leftedge+15 ;left dc.w startYBase+25+10 ;bottom dc.w leftedge+15+100 ;right dc.l radioProc ;procref dc.w $0001 ;flags & family dc.w $3000 ;more flags dc.l 0 ;ref con dc.l GSString ;title ref dc.w 0 ;initial value dc.l 0 ;color table dc.b 'G','g' ;key equivs dc.w 0,0 ;modifier masks GSString dc.b @end-@start ;length byte @start dc.b 'GS/OS' @end endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/ple.aii b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/ple.aii new file mode 100644 index 0000000..b0af24d --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/NetworkCDEV/ple.aii @@ -0,0 +1 @@ +;;; ple - print line with ellipses. ; ; Michael V. Stein 03/11/90. ; ; © Apple, 1990. blanks off ;; equates. recty0 equ 0 rectangle offsets rectx0 equ 2 recty1 equ 4 rectx1 equ 6 ;; imported addresses. ;; include files. include '::commonmacros.h' include '::dp.h' include 'e16.quickdraw' include 'm16.quickdraw' include 'm16.util2' ; include 'netprinter.h' ;; macros. ;; main program. main proc ;; exported addresses. export ple memrectptr equ dpsize+1+3+4 pointer to member's record that needs to be displayed rectptr equ dpsize+1+3+4+4 pointer to rect enclosing member ple tsc sec sbc #dpsize make room on stack for new direct page tcs phd save the current direct page tcd new direct page phb save callers data bank phk plb make sure our bank is set pushl #plec record to hold pen state _GetPenState pha _GetTexTMode save for later pushw #modeCopy _SetTextMode pushl rectptr _EraseRect clear the rectangle enclosing text pha pushl #pleb '...' _StringWidth pla lsr a sta w1 1/2 the length of the three dots ldy #rectx0 lda [rectptr],y clc adc #10 pha x loc of line ldy #recty1 lda [rectptr],y dea dea pha y loc of line _MoveTo ldy #rectx1 lda [rectptr],y ldy #rectx0 sec sbc [rectptr],y sbc #10 (c) set, left and right margin of 10 sta l3 save total width allowed lsr a sec sbc w1 1/2 the width of the three dots sta l3+2 save breaking point in line ldy #2 lda [memrectptr],y sta l2+2 lda [memrectptr] [a,x] = handle to string sta l2 lda [l2] sta l1 lda [l2],y sta l1+2 pha space for result pushl l2 ptr to string _StringWidth pla cmp l3 bcc ple1 if fits bne ple2 if doesn't fit ple1 jmp ple10 it fits, so just go draw it ple2 ldy #1 stz w2 current width ple3 sty w1 current character offset lda [l2],y get next char and #$ff pha pha char to check _CharWidth pla clc adc w2 sta w2 cmp l3+2 bcs ple4 if past the middle ldy w1 iny bra ple3 check next character ; Now start from right edge and see what can fit in string. ple4 lda [l2] and #$ff sta w6 length of string tay char to start looking at stz w3 width from right edge ple5 sty w4 lda [l2],y and #$ff pha space for result pha char to check _CharWidth pla clc adc w3 sta w3 width so far on the right ldy w4 cmp l3+2 beq ple7 if just fits bcs ple6 if past the middle dey bra ple5 check if next char to the left can fit ple6 inc w4 starting char after seperator ; create a string to print 'aaaaa...bbbbb'. ple7 ldy #0 ple8 lda [l2],y sta plea,y move these characters over iny iny cpy w1 bcc ple8 if more to copy from left edge ldx w1 lda pleb+1 sta plea,x put in the first space and the ellipses inx inx lda pleb+1+2 sta plea,x add in last part of seperator inx offset to store right edge ldy w4 place to start moving ple9 lda [l2],y get next character sta plea,x place into new string inx inx iny iny ;cpx w6 cpy w6 changed 2/21/91 by Monte Benaresh bcc ple9 if more to copy beq ple9 if more to copy shortmx lda w6 sec sbc w4 # of chars from right side -1 adc #3-1 (c) set , length( middle seperator) -1 adc w1 (c) clear, amt from left side +1 sta plea actual length of new string longmx pushl #plea bra ple11 ple10 pushl l2 ple11 _DrawString draw the string ldy #4 lda [memrectptr],y and #$80 beq ple12 if not selected pushl rectptr _InvertRect mark it as selected ple12 pushl #plec _SetPenState restore orginal penstate _SetTextMode restore original text mode plb restore orginal data bank pld restore original direct page lda dpsize+2,s sta dpsize+15-1,s move upper 16 bits to top of stack lda dpsize+1,s sta dpsize+15-2,s move lower 16 bits to top of stack tsc clc adc #dpsize+15-3 tcs return address is now on top of stack rtl ; data used here. ;plea ds.b namelen+5 leave some slop space plea ds.b 33+5 pleb dc.b 3,'...' plec ds.b pnStateSize hold pen state endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/Printer.pii b/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/Printer.pii new file mode 100644 index 0000000..29d7326 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/Printer.pii @@ -0,0 +1 @@ +This sourcefile is no longer used. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/Printer.r b/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/Printer.r new file mode 100644 index 0000000..35b1573 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/Printer.r @@ -0,0 +1 @@ +/*******************************************************************/ /* /* Printer.r /* /* Copyright (C) 1988-1992 /* Apple Computer, Inc. /* All Rights Reserved /* /* This file contains the source of the resources needed to build the /* Printer CDEV. /* /*******************************************************************/ #include "typesiigs.r" resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFF00000000000000FFFFFFFFFF" $"FFFF0FFFFFFFFFFFF00FFFFFFFFF" $"FFFF0FFFFFFFFFFFF0F0FFFFFFFF" $"FFFF0FFFFFFFFFFFF0000FFFFFFF" $"FFFF0FFFFFFFFFFFFFFF0FFFFFFF" $"FFFF0FFFFFFFFFFFFFFF0FFFFFFF" $"FFFF0FFFFFFFFFFFFFFF0FFFFFFF" $"FFFF0FFFFFFFFFFFFFFF0FFFFFFF" $"FFFF0FFFFFFFFFFFFFFF0FFFFFFF" $"FFFF0FFFFFFFFFFFFFFF0FFFFFFF" $"FFFF0FFFFFFFFFFFFFFF0FFFFFFF" $"F0000FFFFFFFFFFFFFFF0000FFFF" $"F0FF0FFFFFFFFFFFFFFF0FF000FF" $"F0FF00000000000000000FF0F0FF" $"F0FFFFFFFFFFFFFFFFFFFFF0F0FF" $"F0FF8FFFFFFFFFFFFFFFFFF000FF" $"F0FF4FCCCFFFFFFFFFFFFFF0FFFF" $"F0FFFFFFFFFFFFFFFFFFFFF0FFFF" $"F00000000000000000000000FFFF", $"0000000000000000000000000000" $"0000FFFFFFFFFFFFFF0000000000" $"0000FFFFFFFFFFFFFFF000000000" $"0000FFFFFFFFFFFFFFFF00000000" $"0000FFFFFFFFFFFFFFFFF0000000" $"0000FFFFFFFFFFFFFFFFF0000000" $"0000FFFFFFFFFFFFFFFFF0000000" $"0000FFFFFFFFFFFFFFFFF0000000" $"0000FFFFFFFFFFFFFFFFF0000000" $"0000FFFFFFFFFFFFFFFFF0000000" $"0000FFFFFFFFFFFFFFFFF0000000" $"0000FFFFFFFFFFFFFFFFF0000000" $"0FFFFFFFFFFFFFFFFFFFFFFF0000" $"0FFFFFFFFFFFFFFFFFFFFFFFFF00" $"0FFFFFFFFFFFFFFFFFFFFFFFFF00" $"0FFFFFFFFFFFFFFFFFFFFFFFFF00" $"0FFFFFFFFFFFFFFFFFFFFFFFFF00" $"0FFFFFFFFFFFFFFFFFFFFFFF0000" $"0FFFFFFFFFFFFFFFFFFFFFFF0000" $"0FFFFFFFFFFFFFFFFFFFFFFF0000"; }; read rCDEVCode (1,Convert) "Printer.Load"; resource rCDEVFlags (1) { wantHit+wantInit+wantCreate+wantAbout +wantRect+updateSSfromBRAM+wantRun, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ {0,0,125,200}, /* DataRect */ "Printer Port", /* Name */ "Darryl Lovato", /* Author */ "v1.1"; /* VersStr */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/PrinterData.aii b/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/PrinterData.aii new file mode 100644 index 0000000..a01b53c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/PrinterData.aii @@ -0,0 +1 @@ +;;; printerdata - initialized data for the printer cdev. ; ; Michael V. Stein 04/01/90. ; ; © Copyright Apple Computer, 1990. blanks off ;; include files. include 'e16.control' ;; equates. y1 equ 2 y2 equ y1+9 y3 equ y1+15 y4 equ y3+15 y5 equ y4+15 y6 equ y5+15 y7 equ y6+15 y8 equ y7+10 y9 equ y8+10 y10 equ y9+10 y11 equ y10+10 y12 equ y11+10 y13 equ y12+10 ya3 equ y3 ya4 equ ya3+15 ya5 equ ya4+10 ya6 equ ya5+10 data proc ;; exported addresses. export devptr export devlen export nbut export printerabout export printeralist export printerlist export slotlen export slotptr slotptr dc.w sname0 dc.w sname1 dc.w sname2 dc.w sname3 slotlen dc.w sname1-sname0 dc.w sname2-sname1 dc.w sname3-sname2 dc.w send-sname3 sname0 dc.b 'Printer' sname1 dc.b 'Your Card' sname2 dc.b 'AppleTalk' sname3 dc.b 'Modem' send equ * devc dc.W 8 ; pcount dc.L $8001 ;static text item dc.W y1,5,y1+10,100 ; boundry rect dc.L statTextControl ; procRef dc.W inactiveHilite<<8 ; flag dc.W $1000 ; moreFlags dc.L 0 ; refCon dc.L devstr ; textRef dc.W devstrL ; text length devstr dc.b 'Device Type:' devstrL equ *-devstr devslt dc.W 8 ; pcount dc.L $8001 ;static text item dc.W y1,104,y1+10,195 ; boundry rect dc.L statTextControl ; procRef dc.W inactiveHilite<<8 ; flag dc.W $1000 ; moreFlags dc.L 0 ; refCon devptr dc.l devslt ; textRef (hi word is valid) devlen dc.W 0 ; text length string ASIS Printer1 dc.w 9 dc.l 1 dc.w y3,5,y3+12,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 95 dc.l Printer1Menu dc.w 1 Printer1menu dc.B '>> Parity:\H' dc.W 1 dc.B $0D dc.B '== Odd\H' dc.W 1 dc.B $0D dc.B '== Even\H' dc.W 2 dc.B $0D dc.B '== None\IH' dc.W 3 dc.B $0D dc.B '.' Printer2 dc.w 9 dc.l 2 dc.w y4,5,y4+12,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 95 dc.l Printer2Menu dc.w 1 Printer2menu dc.B '>> Baud:\H' dc.W 2 dc.B $0D dc.B '== 50\H' dc.W 1 dc.B $0D dc.B '== 75\H' dc.W 2 dc.B $0D dc.B '== 110\H' dc.W 3 dc.B $0D dc.B '== 134.5\H' dc.W 4 dc.B $0D dc.B '== 150\H' dc.W 5 dc.B $0D dc.B '== 300\H' dc.W 6 dc.B $0D dc.B '== 600\H' dc.W 7 dc.B $0D dc.B '== 1200\H' dc.W 8 dc.B $0D dc.B '== 1800\H' dc.W 9 dc.B $0D dc.B '== 2400\H' dc.W 10 dc.B $0D dc.B '== 3600\H' dc.W 11 dc.B $0D dc.B '== 4800\H' dc.W 12 dc.B $0D dc.B '== 7200\H' dc.W 13 dc.B $0D dc.B '== 9600\IH' dc.W 14 dc.B $0D dc.B '== 19200\H' dc.W 15 dc.B $0D dc.B '.' Printer3 dc.w 9 dc.l 3 dc.w y5,5,y5+12,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 95 dc.l Printer3Menu dc.w 1 Printer3menu dc.B '>> Line Length:\H' dc.W 3 dc.B $0D dc.B '== Unlimited\IH' dc.W 1 dc.B $0D dc.B '== 40\H' dc.W 2 dc.B $0D dc.B '== 72\H' dc.W 3 dc.B $0D dc.B '== 80\H' dc.W 4 dc.B $0D dc.B '== 132\H' dc.W 5 dc.B $0D dc.B '.' Printer4 dc.w 9 dc.l 4 dc.w y6,5,y6+12,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 95 dc.l Printer4Menu dc.w 1 Printer4menu dc.B '>> Data/Stop:\H' dc.W 4 dc.B $0D dc.B '== 5-1\H' dc.W 1 dc.B $0D dc.B '== 5-2\H' dc.W 2 dc.B $0D dc.B '== 6-1\H' dc.W 3 dc.B $0D dc.B '== 6-2\H' dc.W 4 dc.B $0D dc.B '== 7-1\H' dc.W 5 dc.B $0D dc.B '== 7-2\H' dc.W 6 dc.B $0D dc.B '== 8-1\IH' dc.W 7 dc.B $0D dc.B '== 8-2\H' dc.W 8 dc.B $0D dc.B '.' string PASCAL ; from here on, we need pascal strings Printer5 dc.w 8 dc.L 5 dc.w y7,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L Printer5Title dc.w 0 Printer5Title dc.b 'Delete LF after CR' Printer6 dc.w 8 dc.L 6 dc.w y8,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L Printer6Title dc.w 0 Printer6Title dc.b 'Add LF after CR' Printer7 dc.w 8 dc.L 7 dc.w y10,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L Printer8Title dc.w 0 Printer7Title dc.b 'Echo' Printer8 dc.w 8 dc.L 8 dc.w y9,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L Printer7Title dc.w 0 Printer8Title dc.b 'Buffering' Printer9 dc.w 8 dc.L 9 dc.w y11,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L Printer9Title dc.w 0 Printer9Title dc.b 'DCD Handshake' Printer10 dc.w 8 dc.L 10 dc.w y12,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L Printer10Title dc.w 0 Printer10Title dc.b 'DSR/DTR Handshake' Printer11 dc.w 8 dc.L 11 dc.w y13,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L Printer11Title dc.w 0 Printer11Title dc.b 'XON/XOFF Handshake' PrinterList dc.l devc dc.l devslt dc.l Printer1 dc.l Printer2 dc.l Printer3 dc.l Printer4 dc.l Printer5 dc.l Printer6 dc.l Printer7 dc.l Printer8 dc.l Printer9 dc.l Printer10 dc.l Printer11 dc.l nbut dc.l 0 string asis PrinterA1 dc.w 9 dc.l 3 dc.w ya3,5,ya3+12,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 95 dc.l PrinterA1Menu dc.w 1 PrinterA1menu dc.B '>> Line Length:\H' dc.W 3 dc.B $0D dc.B '== Unlimited\IH' dc.W 1 dc.B $0D dc.B '== 40\H' dc.W 2 dc.B $0D dc.B '== 72\H' dc.W 3 dc.B $0D dc.B '== 80\H' dc.W 4 dc.B $0D dc.B '== 132\H' dc.W 5 dc.B $0D dc.B '.' string PASCAL ; from here on, we need pascal strings PrinterA2 dc.w 8 dc.L 5 dc.w ya4,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L PrinterA2Title dc.w 0 PrinterA2Title dc.b 'Delete LF after CR' PrinterA3 dc.w 8 dc.L 6 dc.w ya5,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L PrinterA3Title dc.w 0 PrinterA3Title dc.b 'Add LF after CR' PrinterA4 dc.w 8 dc.L 8 dc.w ya6,5,0,0 dc.L $82000000 dc.w 0 dc.w $1000 dc.L 0 dc.L PrinterA4Title dc.w 0 PrinterA4Title dc.b 'Echo' PrinteraList dc.l devc dc.l devslt dc.l PrinterA1 dc.l PrinterA2 dc.l PrinterA3 dc.l PrinterA4 dc.l nbut dc.l 0 PrinterAbout dc.w 8 dc.L 1 dc.w 38,5,138,280 dc.L $81000000 dc.w $0000 dc.w $1000 dc.L 0 dc.L TheText dc.w EndText-TheText string asis TheText dc.b 'The Printer Port Control Panel allows you to change the Printer Port ' dc.b 'settings. These include the Parity, Baud, Line Length, Data/Stop ' dc.b 'bits, and a host of others. If you are using a modem or printer, you should consult ' dc.b 'your UserÕs Guide for that peripheral. If the Printer Port (slot 1) is ' dc.b 'set up for AppleTalk, only a subset of the normal settings will be available ' dc.b 'for modification.' EndText string pascal nbut dc.w 9 Pcount dc.l 30 ID number dc.w 132-7 dc.w 5+10 dc.w 132+13-7 dc.w 195-10 dc.l simpleButtoncontrol dc.w simpRound dc.w fCtlWantEvents+fctlProcRefNotPtr dc.l 0 dc.l nbutit dc.w 0 length? dc.w 0 key equivalent string pascal nbutit dc.b 'Standard Settings' endp END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/makefile new file mode 100644 index 0000000..c192b74 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/makefile @@ -0,0 +1 @@ + CDEV = PRINTER {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" if {dup} # test whether we should duplicateiigs duplicateiigs -m -y {CDEV} {CDEV} end {CDEV}.Load Ä ¶ {CDEV}.aii.obj ¶ {CDEV}Data.aii.obj linkiigs ¶ -x -l -s >{CDEV}.map ¶ -lseg printer ¶ {CDEV}.aii.obj ¶ {CDEV}Data.aii.obj ¶ -o {CDEV}.Load {CDEV}.aii.obj Ä ¶ {CDEV}.aii asmiigs {CDEV}.aii {CDEV}Data.aii.obj Ä ¶ {CDEV}Data.aii asmiigs {CDEV}Data.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/printer.aii b/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/printer.aii new file mode 100644 index 0000000..dc5960e --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/PrinterCDEV/printer.aii @@ -0,0 +1 @@ +;;; printer - printer CDEV. ; ; Michael V. Stein 04/01/90. ; ; © Apple, 1990. blanks off ;; equates. recty0 equ 0 rectangle offsets rectx0 equ 2 recty1 equ 4 rectx1 equ 6 slot1ID equ $21 battery parameter telling the value of the slot1 wind_atalk_h equ 47+15+22 ;window height for AppleTalk device wind_printer_h equ 131+15+22 ;window height for printer or modem device wind_w equ 200 ;window width ;; imported addresses. import devlen import devptr import nbut import printerabout import printeralist import printerlist import slotlen import slotptr ;; include files. include '::cdev.h' include '::commonmacros.h' include '::dp.h' include 'e16.control' include 'm16.control' include 'm16.event' include 'm16.menu' include 'm16.misctool' include 'm16.util2' ;; main program. main proc printer phb save calling data bank phk plb set our data bank ; make room on stack for direct page. tsc sec sbc #dpsize make room on stack for new direct page tcs phd save the current direct page tcd new direct page lda message cmp #12 bcs printer1 if message defintely not handled asl a times 2 into word table tax move into index reg jsr (t_cdev-2,x) call the handler of this message printer1 pld restore direct page tsc clc adc #dpsize tcs reset the stack lda 1,s Bump the stack up to prepare sta 11,s to take off the 3 parameters lda 3,s sta 13,s pla get rid of message space pla get rid of data1 space pla pla get rid of data2 space pla lda #0 return 0 to caller sta 5,s sta 7,s plb rtl t_cdev dc.w cccE Null dc.w cccE handle machine message dc.w cccE handle boot message dc.w icc init cdev controls dc.w cccE close the cdev dc.w cccE handle event message dc.w ccc create cdev controls dc.w ham handle about message dc.w hrm handle rectangle message dc.w hhm handle hit message dc.w handle_run ;RunCDEV ;; ccc - create cdev controls. ; ; entry [data1] = window ptr. ; (printerlist..) = table of ptrs to controls if not appletalk selected. ; (printeralist..) = table of ptrs to controls if appletalk selected. ; slot1ID = battery parameter for slot 1 identification. ; (slotlen..) = table of string lengths of slot 1 possibilities. ; (slotptr..) = table of ptrs to slot 1 names. . ; ; exit (devlen) = length of slot 1 name. ; (devptr) = offset of name in bank. ; [wptr] = window pointer. ccc ldx #slot1ID jsr rbp read battery parameter sta old_dev ;save for comparisons asl a tax lda slotptr,x get lo ptr to string sta devptr lda slotlen,x get length of string sta devlen pha space for result pha lda data1+2 pha hi word of window ptr sta wptr+2 lda data1 pha lo word of window ptr sta wptr pushw #3 next item is a ptr to a list of template pointers ldx #$21 jsr rbp read battery parameter cmp #2 beq ccc1 if appletalk is set in slot 2 pushl #printerlist controls if not appletalk in port bra ccc2 ccc1 pushl #printeralist controls if appletalk is set in port ccc2 _NewControl2 pla pla don't care about result cccE rts ;; ham - handle about message. ; ; entry [data1] = ptr to window. ; (printerabout..) = template of about box control. ; ; exit About box control is created. ham pha space for result pha pushl data1 window pointer pushw #0 next item is a ptr to a template pushl #printerAbout _NewControl2 pla pla don't care about result rts handle_run ;handle RunCDEV message and poll for change ;in the type of device connected to our port ; check BRAM to see whether our device type has changed, and ; re-create the CDEV window if it has lda old_dev ;check whether inited bmi @no_action ldx #slot1ID jsr rbp ;check BRAM cmp old_dev ;did it change? beq @no_action @changed sta old_dev ;update for next time lda wptr+2 ;push window ptr pha lda wptr pha _KillControls ;get rid of current controls pea wind_w lda old_dev ;get device type again cmp #2 ;AppleTalk? beq @atalk @modem pea wind_printer_h bra @resize @atalk pea wind_atalk_h @resize lda wptr+2 ;push window ptr pha lda wptr pha ldx #$1C0E ;SizeWindow jsl $E10000 ;resize the window ; now we call our own RectCDEV, CreateCDEV, and InitCDEV ; routines to set up the new window stz hr_dummy_rect ;set up dummy rectangle stz hr_dummy_rect+2 lda #125 sta hr_dummy_rect+4 lda #200 sta hr_dummy_rect+6 lda #$e115ff set ram disk power up byte in memory longm rts hhm2 cmp #1 bne hhm3 if not ram disk scroll bar pha space for result pushl data1 _GetCtlValue lda max sec sbc 1,s jsr grsE set the ramdisk battery params pla ;jmp drs display ramdisk setting and return rts hhm3 cmp #2 bne hhm5 if not cache scroll bar pha pushl data1 _GetCtlValue lda max sec sbc 1,s jsr gcsE set the ramdisk battery params pla ;jmp dcs display cache size and return rts hhm5 rts ;; hrm - handle rectangle message. ; ; entry [data1] = ptr to rectangle. ; ; exit rectangle is adjusted if the resize checkbox isn't there. hrm jsr dmt determine machine type bcs hrm1 if tenspeed or greater machine lda #96 ldy #recty1 sta [data1],y set lower part of rectangle hrm1 rts ;; icc - init cdev controls. ; ; entry [data1] = window pointer. ; (iccbat..) = table of battery parameters to check. ; ; exit controls are intialized to the battery settings. icc pha pha ;space for result _GetTick pla plx sta last_redraw ;save low word only, keep track of lastÉ ;Étime we redrew ram usage statistics jsr gcs get cache size jsr grs get ram disk size lda max sec sbc ramdisk ldx #1 jsr scv set control value lda max sec sbc cache ldx #2 jsr scv set control value jsr dmt determine machine type bcc icc1 if not resize control ldx #$54 jsr rbp read battery parameter ldx #9 id of resize box jsr scvE set control value icc1 ldx #1 if of control jsr scp set control params ldx #2 id of control to set jsr scp set control params lda #hrc handle ram control ldx #1 id of control jsr sca set control action lda #hcc handle cache control ldx #2 id of control jsr sca set control action jsr dcs display cache size jmp drs display ram size and return ; teriary routines called by the above routines. ;; cms - calculate max size. ; ; entry (a) = total memory / 256. ; ; exit (max) = max size of ramdisk or cache in 32K chunks. cms lsr a lsr a divide by 1024 sec sbc #256 lsr a lsr a lsr a lsr a lsr a divide by 32 cmp #$fe bcc cms1 if ok value lda #$fe maximum value can be 254*32 cms1 sta max rts ;; dcs - display cache size. ; ; entry (cache) = current size of cache in 32K chunks. ; ; exit cache size is displayed. ; (cstr..) = ascii representation of size of cache in kilobytes. dcs lda cache asl a asl a asl a asl a asl a *32 pha int to convert pushl #cstr cache string pushw #5 5 chars long pushw #0 unsigned _Int2Dec pushl cachehdl _DrawOneCtl rts ;; dmt - determine machine type. ; ; entry none. ; ; exit (c) set if not a rom 1 machine dmt lda #0 pha space pha space pha space pha space pha (a) pha (x) pha (y) pushw #$fe1f entrypoint to call _FWEntry call the firmware ply (y) plx (a) - unused plx (x) - unused plx (p) - unused cpy #2 rts ;; drs - display ram size. ; ; entry (ramdisk) = size of ram disk in 32K chunks. ; ; exit cache size is displayed. ; (cstr..) = ascii representation of size of cache in kilobytes.. drs lda ramdisk asl a asl a asl a asl a asl a *32 pha int to convert pushl #rstr cache string pushw #5 5 chars long pushw #0 unsigned _Int2Dec pushl ramhdl _DrawOneCtl rts ;; gcs - get cache size. ; ; entry battery parameter $81 = cache size or $ff if unitialized. ; ; exit battery parameter is updated if out of range. ; (cache) = size of cache. ;; alternate entry point: gcsE. ; ; entry (a) = new size of cache. ; ; exit battery parameters are updated. ; (cache) = new size of cache. gcs ldx #$81 battery parameter for cache size jsr rbp read battery parameter and #$ff sta cache save size of cache cmp #$ff bne gcs1 if has been initialized allready lda #1 bra gcs2 reset to smallest size gcs1 cmp max bcc gcs3 if ok beq gcs3 if ok lda max gcsE gcs2 sta cache save ldx #$81 battery parameter for cache size jmp wbp write battery parameter and return gcs3 rts ;; grs - get ram disk size. ; ; entry battery parameter $36 = ramdisk size or $ff if unitialized. ; ; exit both battery parameters are updated if out of range. ; (ramdisk) = size of ramdisk. ;; alternate entry point: grsE. ; ; entry (a) = new size of ramdisk. ; ; exit both battery parameters are updated. ; (ramdisk) = new size of ramdisk. grs ldx #$36 battery parameter for minimum ram disk size jsr rbp read battery parameter and #$ff sta ramdisk save size of ramdisk cmp #$ff bne grs1 if has been initialized allready lda #1 bra grs2 reset to smallest size grs1 cmp max bcc grs3 if ok beq grs3 if ok lda max grsE grs2 sta ramdisk save pha save for now ldx #$36 jsr wbp write battery parameter pla ldx #$37 jmp wbp write battery parameter and return grs3 rts ;; hcc - handle cache control. ; ; entry [handleid,s] = handle of control that was hit. ; maxpitch = maximum pitch used on the GS. ; (part,s) = part of control that was hit. ; ; called by control manager. ; ; exit (cache) = new size of the cache. ; control value is set and new value displayed if different. hcc phb phk plb lda part,s cmp #5 bne hcc1 if not hit in scroll bar up arrow lda cache cmp max bcs hcc7 if already the highest possible ina bra hcc4 set the new value hcc1 cmp #6 bne hcc2 if not in scroll bar down arrow lda cache beq hcc7 if alredy the lowest possible dea bra hcc4 set the new value hcc2 cmp #7 bne hcc3 if not page up lda cache clc adc #4 cmp max bcc hcc4 if ok lda max bra hcc4 set to the max possible hcc3 cmp #8 page down ;bne hcc7 if dragging the thumb bne @thumb if dragging the thumb *** changed 10/28/91 by Monte lda cache sec sbc #4 bcs hcc4 if ok, set the new value lda #0 reset to min possible ;*** next code added 10/28/91 by Monte Benaresh bra @set_val @thumb pha ;space for result lda handleid+2+2,s hi word of handleid pha lda handleid+4,s lo word of handleid pha _GetCtlValue lda max sec sbc 1,s ;subtract new value plx ;fix stack ; fall through and set new value @set_val ;*** end 10/28/91 hcc4 cmp cache beq hcc7 if nothing changes sta cache save new value lda max sec sbc cache pha new ram disk lda handleid+2+2,s hi word of handleid pha lda handleid+4,s lo word of handleid pha _SetCtlValue hcc6 jsr dcs display cache size hcc7 jmp hrcE clean up stack and exit ;; hrc - handle ram control. ; ; entry [handleid,s] = handle of control that was hit. ; (part,s) = part of control that was hit. ; ; called by control manager. ; ; exit (ramdisk) = new size of ramdisk. ; display is updated if out of range. ;; alternate entry point: hrcE. ; ; hrcE is used to get the stuff off the stack from this sort of call. hrc phb phk plb lda part,s cmp #5 bne hrc1 if not hit in scroll bar up arrow lda ramdisk cmp max bcs hrc7 if already the highest possible ina bra hrc4 set the new value hrc1 cmp #6 bne hrc2 if not in scroll bar down arrow lda ramdisk beq hrc7 if alredy the lowest possible dea bra hrc4 set the new value hrc2 cmp #7 bne hrc3 if not page up lda ramdisk clc adc #4 cmp max bcc hrc4 if ok beq hrc4 if ok (max possible) lda max bra hrc4 set to the max possible hrc3 cmp #8 page down ;bne hrc6 if dragging the thumb bne @thumb if dragging the thumb *** changed 10/28/91 by Monte lda ramdisk sec sbc #4 bcs hrc4 if ok, set the new value lda #0 reset to min possible ;*** next code added 10/28/91 by Monte Benaresh bra @set_val @thumb pha ;space for result lda handleid+2+2,s hi word of handleid pha lda handleid+4,s lo word of handleid pha _GetCtlValue lda max sec sbc 1,s ;subtract new value plx ;fix stack ; fall through and set new value @set_val ;*** end 10/28/91 hrc4 cmp ramdisk beq hrc7 if hasn't changed ; jsr grsE set the ramdisk battery params sta ramdisk lda max sec sbc ramdisk pha new ram disk lda handleid+2+2,s hi word of handleid pha lda handleid+4,s lo word of handleid pha _SetCtlValue hrc6 jsr drs display ram size hrc7 hrcE plb restore data bank lda 1,s sta 7,s lda 2,s sta 8,s tsc clc adc #6 move stack up tcs rtl ;; rbp - read battery parameter. ; ; entry (x) = parameter to read. ; ; exit (a) = value of parameter. rbp pha space for result phx parameter to read _ReadBparam pla get value rts ;; sca - set control action. ; ; entry (a) = address of action proc. ; (x) = lo word of control id. ; [data1] = window ptr. ; ; exit action proc is set. sca ldy #^sca phy bank of action procedure pha address of action proc pha pha space for result pushl data1 window ptr pushw #0 hi word of control id phx lo word of control id _GetCtlHandleFromID _SetCtlAction set action proc rts ;; scp - set control params. ; ; entry (x) = lo word of control id. ; [data1] = windwo ptr. ; (max) = data size of scroll bar. ; ; exit control parameters are set for scroll bar. scp lda max ina *** added 9-Dec-91 DAL *** Since we're passing 4 for the View size, we need to pass *** max+4, not max+1, as the data size. inc a inc a inc a *** end 9-Dec-91 pha data size of scroll bar pushw #4 view of scroll bar pha pha space for result pushl data1 window pointer pushw #0 hi word of id phx lo word of id _GetCtlHandleFromID _SetCtlParams handle to control is on the stack rts ;; scv - set control value. ; ; entry (a) = value of control to set -1. ; (x) = id of control. ; [data1] = window pointer. ; ; exit control is set to the value desired. ;; alternate entry point: scvE. ; ; scvE is called when setting the contol value of a checkbox. scvE tay beq scv1 if checkbox not set lda #1 scv scv1 pha value to set pha space for result pha pushl data1 window pointer pushw #0 hi word of id phx lo word of id _GetCtlHandleFromID _SetCtlValue handle to control is on the stack rts get_mem_state ;get state of memory use and update strings ;made subroutine 10/29/91 by Monte Benaresh pha pha ;space for result _RealFreeMem changed 1/24/91 by Monte Benaresh -- ; Note that this changes the value shown for ; "Memory in use" to NOT include purgeable ; memory pulll l2 free memory available lda my_total_mem sec sbc l2 sta l3 lda my_total_mem+2 sbc l2+2 sta l3+2 memory in use lda l3+1 lsr a lsr a / (256 * 4) pha int to convert pushl #str1 dest string pushw #5 5 chars long pushw #0 unsigned _Int2Dec lda l2+1 lsr a lsr a / 256 * 4 pha int to convert pushl #str2 dest string pushw #5 5 chars long pushw #0 unsigned _Int2Dec pha pha _MaxBlock pulll l1 lda l1+1 lsr a lsr a / (256 * 4) pha int to convert pushl #str3 dest string pushw #5 5 chars long pushw #0 unsigned _Int2Dec rts ;; wbp - write battery parameter. ; ; entry (a) = value of parameter to set. ; (x) = battery parameter to set. ; ; exit battery parameter is set. wbp pha new value phx parameter to set _WriteBparam rts ; data used here. cache ds.b 2 size of cache cachehdl ds.b 4 handle to cache control ramdisk ds.b 2 size of ram ramhdl ds.b 4 handle to ramdisk control max ds.b 2 max size of cache or ram disk ;next storage added by Monte Benaresh -- Oct 1991 my_wind_ptr ds.l 1 ;CDEV's window pointer my_total_mem ds.l 1 ;total machine memory last_redraw ds.w 1 ;low word of tick count at last redraw ; define storage for total memory amount. str1 ds.b 5 5 chars for string dc.b 'K' ; define storage for free memory amount. str2 ds.b 5 5 chars for string dc.b 'K' ; define storage for max block amount. str3 ds.b 5 5 chars for string dc.b 'K' ; define storage for cache amount. cstr ds.b 5 5 chars for string dc.b 'K' append the K ; define storage for ramdisk amount. rstr ds.b 5 5 chars for the string dc.b 'K' append the K endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/RamDiskCDEV/RamDisk.pii b/IIGS.601.SRC/A.U.G/CtlPanel/RamDiskCDEV/RamDisk.pii new file mode 100644 index 0000000..29d7326 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/RamDiskCDEV/RamDisk.pii @@ -0,0 +1 @@ +This sourcefile is no longer used. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/RamDiskCDEV/RamDiskData.aii b/IIGS.601.SRC/A.U.G/CtlPanel/RamDiskCDEV/RamDiskData.aii new file mode 100644 index 0000000..4cb3527 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/RamDiskCDEV/RamDiskData.aii @@ -0,0 +1 @@ + ;;; ramdiskdata - data for the ram CDEV.. ; ; Michael V. Stein 04/01/90. ; ; © Apple, 1990. blanks off string ASIS include 'e16.control' data proc ;; imported address. ; import cstr import rstr import str1 import str2 import str3 ;; exported addresses. ; export killresize export ramabout export ramlist export ram1 export ram2 ;scrW equ 38 ;width for scroll bars scrW equ 36 ;width for scroll bars in 640 mode, changedÉ ;Éin ccc for 320 mode ram1 dc.w 9 ;pcount dc.l 1 ;ctl ID dc.w 11,55,60,55+scrW ;rect dc.l scrollBarControl dc.w 3 ;flag dc.w $1000 ;more flag dc.l 0 ;ref con dc.w 14 ;max size dc.w 1 ;view size dc.w 0 ;init value ram2 dc.w 9 dc.l 2 dc.w 11,152,60,152+scrW dc.l scrollBarControl dc.w 3 dc.w $1000 dc.l 0 dc.w 14 dc.w 1 dc.w 0 ram3 dc.w 8 dc.l 3 dc.w 1,20,11,100 dc.l statTextControl dc.w 0 dc.w $1000 dc.l 0 dc.l ram3t dc.w ram3tL ram3t dc.b 'RAM Disk:' ram3tL equ *-ram3t ram4 dc.w 8 dc.l 4 dc.w 1,110,11,200 dc.l statTextControl dc.w 0 dc.w $1000 dc.l 0 dc.l ram4t dc.w ram4tL ram4t dc.b 'RAM Cache:' ram4tL equ *-ram4t ram5 dc.w 8 dc.l 5 dc.w 64,10,74,120 dc.l statTextControl dc.w 0 dc.w $1000 dc.l 0 dc.l ram5t dc.w ram5tL ram5t dc.b 'Memory in use:' ram5tL equ *-ram5t ram6 dc.w 8 dc.l 6 dc.w 74,10,84,145 dc.l statTextControl dc.w 0 dc.w $1000 dc.l 0 dc.l ram6t dc.w ram6tL ;ram6t dc.b 'Free memory:' ram6t dc.b 'Available memory:' changed 1/24/91 by Monte Benaresh ram6tL equ *-ram6t ; ramdisk K size ram7 dc.w 9 dc.l 7 dc.w 30,10,40,55-4 dc.l statTextControl dc.w 0 dc.w $1000 dc.l 0 dc.l rstr dc.w 6 dc.w -1 ; cache K size. ram8 dc.w 9 dc.l 8 dc.w 30,105,40,150-4 dc.l statTextControl dc.w 0 dc.w $1000 dc.l 0 dc.l cstr dc.w 6 dc.w -1 string PASCAL ; from here on, we need pascal strings Ram9 dc.w 8 dc.l 9 dc.w 85+10,10,0,0 dc.l checkControl dc.w 0 dc.w $1000 dc.l 0 dc.l Ram9Title dc.w 0 Ram9Title dc.b 'Resize after reset' ; value string for memory in use. ram10 dc.w 9 dc.l 10 dc.w 64,195-70,74,190 dc.l statTextControl dc.w 0 dc.w $1000 dc.l 0 dc.l str1 dc.w 6 dc.w -1 right justified ; value string for available memory. ram11 dc.w 9 dc.l 11 dc.w 74,140,84,190 dc.l statTextControl dc.w 0 dc.w $1000 dc.l 0 dc.l str2 dc.w 6 dc.w -1 right justified string asis ram12 dc.w 8 dc.l 6 dc.w 84,10,94,120 dc.l statTextControl dc.w 0 dc.w $1000 dc.l 0 dc.l ram12t dc.w ram12tL ram12t dc.b 'Max block size:' ram12tL equ *-ram12t ; value string for max block ram13 dc.w 9 dc.l 13 dc.w 84,195-70,94,190 dc.l statTextControl dc.w 0 dc.w $1000 dc.l 0 dc.l str3 dc.w 6 dc.w -1 right justified ramList dc.l ram1 dc.l ram2 dc.l ram3 dc.l ram4 dc.l ram5 dc.l ram6 dc.l ram7 dc.l ram8 dc.l ram10 dc.l ram11 dc.l ram12 dc.l ram13 KillResize dc.l ram9 dc.l 0 RamAbout dc.w 8 dc.l 1 dc.w 38,5,138,280 dc.l statTextControl dc.w $0000 dc.w $1000 dc.l 0 dc.l TheText dc.w EndText-TheText string asis TheText dc.b 'The RAM control panel lets you change the sizes of the RAM cache and ' dc.b 'RAM disk. If you set ' dc.b 'the RAM disk to zero K, no RAM disk is created. If resize ' dc.b 'after next reset is enabled (ROM 3 only), ' dc.b 'the RAM disk will be resized the next time you boot. The RAM cache ' dc.b 'is the amount of memory set aside for GS/OS ' dc.b 'to speed up disk access.' EndText string pascal ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/RamDiskCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/RamDiskCDEV/makefile new file mode 100644 index 0000000..17d3232 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/RamDiskCDEV/makefile @@ -0,0 +1 @@ + CDEV = ramdisk {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {CDEV}.r -o {CDev} -t "C7 " -c "pdos" if {dup} # test whether we should duplicateiigs duplicateiigs -m -y {CDEV} {CDEV} end {CDEV}.Load Ä {CDEV}.aii.obj ¶ {CDEV}Data.aii.obj linkiigs -x -lseg gen ¶ {CDEV}.aii.obj ¶ {CDEV}Data.aii.obj ¶ -o {CDEV}.Load {CDEV}.aii.obj Ä {CDEV}.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs {CDEV}.aii {CDEV}Data.aii.obj Ä {CDEV}Data.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs {CDEV}Data.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/RamDiskCDEV/ramdisk b/IIGS.601.SRC/A.U.G/CtlPanel/RamDiskCDEV/ramdisk new file mode 100644 index 0000000..e69de29 diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/Release Notes.CtlPanel b/IIGS.601.SRC/A.U.G/CtlPanel/Release Notes.CtlPanel new file mode 100644 index 0000000..f044e71 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/Release Notes.CtlPanel @@ -0,0 +1 @@ +GS Graphic Control Panel 6.0d18 Release Notes Michael Stein Netprinter CDEV 1.0a2 BRC #74300 (machine hangs after renaming a printer and starting a new app without closing control panel first.) Eventually traced it down to the fact that an AppleTalk parameter block had a bad pointer and so it was trashing some memory when you downloaded the emulator Namer CDEV 1.0a2 BRC #74300 (machine hangs after renaming a printer and starting a new app without closing control panel first.) Eventually traced it down to the fact that an AppleTalk parameter block had a bad pointer and so it was trashing some memory when you renamed a printer. MIDI CDEV 1.0b2 Enhanced user interface. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/CDevIntf.p b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/CDevIntf.p new file mode 100644 index 0000000..f0408ac --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/CDevIntf.p @@ -0,0 +1 @@ +{ Max Pascal interface to the CDEV Manager by Darryl Lovato Copyright (c) 1989 by Apple Computer, Inc. } unit CDEVIntF; interface const MachineCDEV = 1; { machine test, return 0 if NOT ok to run on this machine } BootCDEV = 2; { boot time init call or Install call - no parms } ShutDownCDEV = 3; { shut down or de-install the CDEV - no parms } InitCDEV = 4; { called when being shown - data1 = windowPtr } CloseCDEV = 5; { called when being removed - data1 = windowPtr } EventsCDEV = 6; { call3ed when an event - data1 = ptr to event record } CreateCDEV = 7; { called so that a CDEV can create its controls inline - data1 = window } AboutCDEV = 8; { called so that a CDEV can create its about text inline - no parms } RectCDEV = 9; { called so that a CDEV can dynamically compute its rectangle data1 = rectprr } HitCDEV = 10; { called when ctl is "hit" - data1 = Hdl to ctl hit, data2 = Ctl Id } RunCDEV = 11; { called when daRun is called } reserved1 = 12; { reserved for Apple Computer's future use } reserved2 = 13; { reserved for Apple Computer's future use } reserved3 = 14; { reserved for Apple Computer's future use } NeverUsed1 = 15; NeverUsed2 = 16; wantMachine = 1; { these flags are set in the CDEV flags resource to tell the Control } wantBoot = 2; { panel which of the above messages the CDEV actually needs } wantShutDown = 4; wantInit = 8; wantClose = 16; wantEvents = 32; wantCreate = 64; wantAbout = 128; wantRect = 256; wantHit = 512; wantRun = 1024; wantReserved1 = 2048; wantReserved2 = 4096; wantReserved3 = 8192; updateSSfromBRAM = 16384; { this is for use by Apple Computer, Inc ONLY! <- I mean it! } CanBeUnActive = 32768; { set this bit if the cdev can be made inactive by the user } implementation end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/OpenFile.aii b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/OpenFile.aii new file mode 100644 index 0000000..631ba69 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/OpenFile.aii @@ -0,0 +1 @@ + include 'SetStart.mac' **************************************************************************************************** * * OpenFile - opens the SetStart CDev's data file (resource file, actually). It has to determine * the correct location of the file first, depending on whether the machine has been booted up * from a local device or over a network. * * This routine modifies prefix 8, without restoring it when done. * **************************************************************************************************** OpenFile Proc Export Import fileID stz fileID ;init variable (file's not open yet) _DInfoGS infoParms ;get the device name for the boot device bcs oops _VolumeGS volParms ;now do a Volume call to get the ID of the boot FST bcs oops lda fst_id ;get the ID number of the boot FST cmp #$000D ;is it AppleShare? bne local_boot ;no, must have been a local boot aShare_boot _FSTSpecificGS fstParms ;do an FSTSpecific GetUserPath call bcs oops ;punt if we can't determine the pathname of the user's folder ldx userPfx ;get the pointer to the prefix ldy userPfx+2 bra do_setPfx ;go set the prefix local_boot ldx #localPfx ;get the pointer to the local prefix ldy #localPfx>>16 do_setPfx stx prefix ;store the pointer to the prefix to use sty prefix+2 _SetPrefixGS pfxParms ;set the prefix to the correct location bcs oops jsl $E100A8 ;call GS/OS dc.w $2010 ;to open the file dc.l openParms bcc good ;if error, set fileID to 0 stz fileID oops good rts ;return to caller, carry set if an error occurred infoParms dc.w 2 ;pCount dc.w 1 ;device number (boot device is ALWAYS device 1) dc.l devName ;pointer to result buffer for device name devName dc.w 36 ;buffer length devName2 dc.w 0 ;string length ds.b 32 ;buffer for device name volParms dc.w 5 ;pCount dc.l devName2 ;pointer to device name dc.l volname ;pointer to volume name buffer dc.l 0 ;total blocks dc.l 0 ;free blocks fst_id dc.w 0 ;FST ID number volname dc.w 36 ;buffer length volname2 dc.w 0 ;string length ds.b 32 ;string buffer fstParms dc.w 3 ;pCount dc.w $000d ;FST ID number (AppleShare) dc.w 8 ;command number (GetUserPath) userPfx ds.l 1 ;space for the prefix pointer pfxParms dc.w 2 ;pCount dc.w 8 ;prefix number prefix ds.l 1 ;space for the prefix pointer localPfx wstr '*:System:' Export fileName fileName wstr '8:SetStart.data' Export fileID openParms dc.w 3 ;pCount fileID ds.w 1 ;refNum pathname dc.l fileName ;pathname pointer requestAccess dc.w 3 ;open file for reading & writing EndP End \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart new file mode 100644 index 0000000..e69de29 diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.aii b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.aii new file mode 100644 index 0000000..24712fe --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.aii @@ -0,0 +1 @@ +******************************************************************************************* ;# # ;# File: SetStart.aii # ;# Version: 1.0 # ;# Author: Greg Branche # ;# Copyright: (c) 1989-1993 # ;# Apple Computer, Inc. # ;# All Rights Reserved # ;# # ;# Description: This file contains the assembler needed # ;# by the SetStart CDEV on the IIGS. # ;# # ;# Based upon the example shell CDEV by Darryl Lovato # ;# # ******************************************************************************************* * * Revision History * * 6.0 * * Who Date The Modification * --- -------- ---------------- * GAB 05/12/89 Created the file * ******************************************************************************************* * * Begin 6.0.1 * * 29-Oct-92 DAL * Added checkboxes (programmer CDAs; show boot icons) * * 15-Jan-93 DAL * Added code in doBoot to initialize location $59 (programmer CDAs) to $00 if there * is a $FF there. * ******************************************************************************************* blanks off string asis maxNameLen equ 20 ;maximum length of name in menu, must be even bootname Proc dc.b '==' dcb.b maxNameLen,$20 dc.b '\H' dc.w 2 dc.b $0d dc.b '.' endp ;################################################################ ;# # ;# Variables used by the CDev # ;# # ;################################################################ myVars Record fileSelected ds.w 1 CtlHndl ds.l 1 export goodInit goodInit ds.w 1 ownerID ds.w 1 dPageHndl ds.l 1 pfx0 ds.l 1 pfx8 ds.l 1 SFActive ds.w 1 nullPfx dc.w 0 ;looks like a null prefix parmBlock pCount dc.w 0 prefixNum dc.w 0 bufPtr dc.l 0 eofParms dc.w 2 ;pCount eof_refnum dc.w 0 file_length dc.l 0 readParms dc.w 4 ;pCount read_refNum dc.w 0 read_buff dc.l 0 read_count dc.l 0 read_xfer dc.l 0 closeParms dc.w 1 ;pCount close_refNum dc.w 0 createParms dc.w 5 ;pCount cr_path dc.l 0 ;pathname cr_access dc.w %0000000011100111 ;access (invisible) cr_filetype dc.w $5A ;filetype cr_auxtype dc.l 4 ;auxtype cr_storage dc.w 0 ;storage type (standard file) set_eof_parms dc.w 3 ;pCount set_eof_refnum dc.w 0 dc.w 0 ;base dc.l 0 ;displacement endr ;################################################################ ;# # ;# Various procedures for the Pascal CDEV shell # ;# (done in assembly since I don't like Pascal!) # ;# # ;################################################################ include 'SetStart.mac' seg 'main' ;################################################################ ;# # ;# getMenuName procedure # ;# # ;# This procedure accepts a pointer to a word-length # ;# pathname string and builds a string suitable for # ;# insertion into a menu. The pointer to the string is # ;# passed as a parameter on the stack, and the menu string # ;# is built in the buffer named bootname. # ;# The string pointer is removed from the stack prior # ;# to returning to the caller (Pascal protocol) # ;# # ;################################################################ getMenuName proc strPtr equ $03 tsc ;make local direct page phd tcd lda #'='+('='<<8) ;initialize menu string sta bootname ldy #maxNameLen ;clear new menu item string to blanks lda #' '+(' '<<8) @clear sta bootname,y dey dey bne @clear lda [strPtr] ;get length of complete pathname tay ;put into Y register iny ;adjust for length word iny sep #$20 ;8-bit accumulator longa off lda #':' ;look for pathname separator @loop dey cmp [strPtr],y ;look at character bne @loop ;(there's got to be at least 1 separator) rep #$20 ;back to 16-bit accumulator longa on tya ;get offset to filename separator sec sbc [strPtr] ;calculate length of filename eor #-1 ;(two's compliment math) inc a inc a ;bump past separator tax ;save length of filename in X for a bit tya ;get offset to filename separator again clc adc strPtr ;adjust pointer sta strPtr ;to separator character lda strPtr+2 adc #0 sta strPtr+2 sep #$20 ;8-bit accumulator again longa off cpx #maxNameLen+1 ;filename too long? bcc good_len ;no... ldy #maxNameLen/2 ;else must shrink the name to fit @loop2 lda [strPtr],y ;copy the first 6 characters sta bootname+1,y dey bne @loop2 lda #'É' ;then pop in an elipsis sta bootname+(maxNameLen/2+2) txy ;set pointer to end of name ldx #maxNameLen/2-1 ;copy 5 characters from end of name @loop3 lda [strPtr],y sta bootname+(maxNameLen/2+2),x dey dex bne @loop3 bra menu_set_up ;menu string's all set up now, go insert it good_len txy ;put count into Y @loop lda [strPtr],y ;copy filename to menu string sta bootname+1,y dey bne @loop menu_set_up rep #$20 ;back to long accumulator longa on pld ;restore original direct page pla ;remove parameter by moving return address up sta 3,s ;over it (only a 2 byte return address here) pla rts endp ;################################################################ ;# # ;# openStdFile procedure # ;# used to start up the Standard File toolset # ;# # ;# returns carry set if the operation fails # ;# # ;################################################################ openStdFile proc with myVars tmpPtr equ 1 pha ;make space for temp pointer pha tsc phd tcd stz SFActive ;initialize variable pha ;space for returned result _SFStatus ;check for StdFile active pla bcs must_load ;must load the toolset sta SFActive ;save status for shutdown later bne is_active ;function returned TRUE, StdFile already active must_load pea 23 ;load tool023 (StdFile) pea $0300 ;must be at least version 3.0 _LoadOneTool ;load the tool bcc load_ok ;so far, so good pha ;space for result pea %0000000000000110 ;alertFlags (alertStrRef is a resource ID) lda #0 pha ;subStrPtr (not used) pha pha ;resource ID for AlertWindow pea 3 _AlertWindow ;make the alert window bra errExit load_ok pha ;make space for newhandle call pha pea 0 ;size of block to create pea 256 ;(one page) lda ownerID pha pea %1100000000010101 ;attributes (locked, noMove, noCross,pageAligned,fixedBank pea 0 ;put in bank 0 (direct page) pea 0 _NewHandle pla ;retrieve handle sta dPageHndl sta tmpPtr pla sta dPageHndl+2 sta tmpPtr+2 bcc start_it lda #0 pha ;oops! put up an ErrorWindow pha ;subString type (not used) pha ;subStringPtr (not used) pha pea $8D ;"Memory is full" _ErrorWindow errExit pla ;retrieve button number sec bra exit ;then just exit start_it lda ownerID ;set up for SFStartup call pha lda [tmpPtr] ;dereference handle to get address of DPage pha _SFStartUp is_active clc exit pld pla pla rts endp ;################################################################ ;# # ;# closeStdFile procedure # ;# used to shutdown the Standard File toolset IF we # ;# started it up # ;# # ;################################################################ closeStdFile proc with myVars lda SFActive ;was StdFile active before we took control? bne leave_active ;yes, so leave it active _SFShutDown ;shut down Standard File lda dPageHndl+2 ;deallocate StdFile direct page pha lda dPageHndl pha _DisposeHandle pea 23 ;then unload the tool _UnloadOneTool leave_active rts endp ;################################################################ ;# # ;# loadResource procedure # ;# loads the start pathname and returns a handle # ;# in X and Y # ;# # ;################################################################ loadResource proc Import fileID with myVars rHndl equ 1 pha ;make space for local handle pha tsc phd ;save caller's direct page tcd ;make local direct page ; GetEOF to determine size of pathname lda fileID sta eof_refnum sta read_refnum jsl $E100A8 ;call GS/OS dc.w $2019 ;to get the file's length dc.l eofParms bcs no_data ; calculate size of memory block required lda file_length sta read_count tax ;save in X too lda file_length+2 sta read_count+2 tay ora file_length ;is there anything in the file? beq no_data ;no... ; NewHandle a memory block pha ;result space pha phy ;blocksize phx pha ;get our userID ldx #$0202 ;MMStartup jsl $E10000 ;(leave result on stack) pea %0000000000010000 ;attributes(locked, nocross) lda #0 pha ;location pointer pha _NewHandle plx ;retrieve handle ply bcs no_data ;exit on error stx rHndl sty rHndl+2 ; Read the string into Handle ldy #2 ;deref lda [rHndl],y tax lda [rHndl] sta read_buff stx read_buff+2 jsl $E100A8 ;call GS/OS dc.w $2012 ;to read the file dc.l readParms bcc all_done no_data sec ;signify error all_done pld ;restore caller's direct page plx ;return handle ply rts EndP ;################################################################ ;# ;# doRect(rectPtr) procedure ;# ;# Replaces Pascal code: ;# ;# if Not doInit then { save the current default prefix & check for STDFile } ;# RectPtr(data1)^.bottom := 32; ;# ;# and then also adjusts the rectangle height to include one ;# or two new checkboxes: ;# ;# Start up with: [Finder v] ;# [x] Show startup icons ;# [x] Enable programmer CDAs ;# ;################################################################ doRect proc export import doInit phd tsc tcd @rect equ 6 ;1-2=DP, 3-5=RTL, 6-9=rect ptr pha ;space for function result jsl doInit pla bne @initOkay lda #32 bra @setHeight @initOkay ; Check for ROM 3 w/ Control Panel jumper set--only show top checkbox pha pha pha pha ;space for results pha pha pha ;A, X, Y (who cares) pea $FE1F _FWEntry ply ;Y value plx ;X value pla ;A value pla ;P value cpy #3 ;Is this ROM 3? bne @FullSize pushlong #IsPanelActive pushlong #ReadLocation pea $0009 ;read location and store result at IsPanelActive _ReadKeyMicroMemory lda >IsPanelActive and #$0040 ;save bit 6 (jumper active) beq @FullSize lda #34 ;height with one checkbox bra @setHeight @fullSize lda #47 ;height with both checkboxes @setHeight ldy #4 ;bottom of rect sta [<@rect],y pld lda 2,s ;pull rect ptr from stack sta 2+4,s lda 1,s sta 1+4,s pla pla rtl ReadLocation dc.l $00E8 ;key micro $E8 bit 6 has control panel jumper IsPanelActive dc.w 0 endp ;################################################################ ;# # ;# doInit function # ;# called during init to save the current GSOS prefix # ;# and load Standard File if it's not already loaded # ;# # ;# Returns 'True' if all goes well, 'False' if something # ;# wierd happens. # ;# # ;################################################################ doInit proc export Import getPfx with myVars retValue equ $9 tmpPtr equ $1 phb ;save current DBR phk plb pha ;make space for temp pointer pha tsc phd tcd stz retValue ;init return value (assume the worst) pha ;space for ID pea $5000 ;ID type = DA _GetNewID pla ;get the ID sta ownerID lda #0 ;go get prefix 0 jsr getPfx bcs exit ;error occurred stx pfx0 sty pfx0+2 lda #8 ;and prefix 8 jsr getPfx bcs exit ;error occurred stx pfx8 sty pfx8+2 inc retValue ;the world is fine, return TRUE exit lda retValue ;copy return value to global variable sta goodInit pld ;restore original direct page pla ;remove extra space from stack pla plb ;restore DBR rtl endp ;################################################################ ;# # ;# getPfx - retrieves current prefix for the supplied # ;# prefix number. The handle to the stored prefix is # ;# returned to the caller. # ;# # ;# on entry: # ;# Acc = prefix number # ;# # ;# on exit: # ;# X, Y = handle of stored prefix (low,high) # ;# # ;################################################################ getPfx Proc with myVars tmpPtr equ $01 pfxHndl equ $05 ;handle to stored prefix sta prefixNum ;put prefix number in parmblock (for later) pha ;make space for temp pointer pha pha ;and prefix handle pha tsc ;make stack frame phd tcd pha ;make space for NewHandle call pha pea 0 ;size of block to create pea 256 ;we'll try 256 bytes at first lda ownerid ;put our ID on the stack pha pea %1000000000010000 ;attributes pea 0 ;location pointer pea 0 ;(not used) _NewHandle ;go get some memory pla ;retreive handle plx bcc got_mem memerr lda #0 pha ;oops! put up an ErrorWindow pha ;subString type (not used) pha ;subStringPtr (not used) pha pea $8D ;"Memory is full" bra showErr got_mem sta pfxHndl ;save for return to caller stx pfxHndl+2 ldy #2 ;dereference handle lda [pfxHndl] sta tmpPtr sta bufPtr lda [pfxHndl],y sta tmpPtr+2 sta bufPtr+2 lda #256 ;initialize length of buffer sta [tmpPtr] lda #2 ;set up parm block sta pCount ;prefixNum set up above try_again _GetPrefixGS parmBlock ;get the current prefix bcc got_prefix ;no error, continue cmp #$4f ;buffer too small? beq grow_buf ;yes, grow the buffer and try again pha ;else just puke! pea 0 ;subString type (not used) pea 0 ;subStringPtr (not used) pea 0 pha ;put error code on stack showErr _ErrorWindow pla ;retrieve button number sec ;we had a problem bra exit ;just exit grow_buf ldy #2 lda [tmpPtr],y ;get returned length word clc adc #4 ;allow for length words pha ;save new length on stack pea 0 ;high word of new size allocation pha ;low word of length pei pfxHndl+2 ;put handle on stack pei pfxHndl ldy #4 ;unlock the handle first lda [pfxHndl],y and #$7FFF sta [pfxHndl],y _SetHandleSize ;make the block bigger bcs memerr ;abort on error ldy #4 ;lock it down again lda [pfxHndl],y ora #$8000 sta [pfxHndl],y ldy #2 ;dereference handle again lda [pfxHndl] sta tmpPtr sta bufPtr lda [pfxHndl],y sta tmpPtr+2 sta bufPtr+2 pla ;retrieve new length of buffer sta [tmpPtr] ;store in buffer bra try_again ;go try again got_prefix ldy #4 ;unlock the handle lda [pfxHndl],y and #$7FFF sta [pfxHndl],y pea 0 ;high word of new size allocation ldy #2 lda [tmpPtr],y ;get the length of the returned string clc adc #4 ;include length words pha ;put on stack for call pei pfxHndl+2 pei pfxHndl _SetHandleSize ;resize the handle so it's just the right size ldy pfxHndl+2 ;return handle to caller ldx pfxHndl clc ;no error exit pld ;clean up stack frame pla pla pla pla rts endp ;################################################################ ;# # ;# doClose procedure # ;# restores default prefix to it's original setting # ;# This is called from the close portion of the # ;# Pascal CASE statement # ;# # ;################################################################ doClose proc export Import setPfx with myVars phb ;save current DBR phk plb tsc ;make stack frame phd tcd lda #8 ;restore prefix 8 ldx pfx8 ldy pfx8+2 phy ;save on stack for DisposeHandle call phx jsr setPfx _DisposeHandle ;now dispose of the memory lda #0 ;restore prefix 0 ldx pfx0 ldy pfx0+2 phy ;save on stack for DisposeHandle call phx jsr setPfx _DisposeHandle ;now dispose of the memory lda ownerID ;and our local ID pha _DeleteID pld ;restore original direct page plb ;restore DBR rtl endp ;################################################################ ;# # ;# setPfx - restore prefix to it's original value # ;# # ;# on entry: # ;# Acc = prefix number # ;# X,Y = handle to stored prefix # ;# # ;################################################################ setPfx Proc tmpPtr equ $01 with myVars sta prefixNum ;save prefix number in parm block pha ;make space on stack for temp pointer pha tsc ;make stack frame phd tcd lda #2 ;2 parms for SetPrefix call sta pCount stx tmpPtr sty tmpPtr+2 ldy #2 ;dereference handle to prefix string lda [tmpPtr] ;but set pointer to length clc ;word within buffer adc #2 sta bufPtr lda [tmpPtr],y adc #0 sta bufPtr+2 _SetPrefixGS parmBlock pld ;clean up stack pla pla rts endp ;################################################################ ;# # ;# doBoot procedure # ;# copies filename resource within data file # ;# returns 0: operation proceeded # ;# 1: operation skipped at user's request # ;# # ;################################################################ doBoot func export Import OpenFile,fileID with myVars rHndl equ $01 tmpPtr equ $05 rtlAddr equ $09 flag equ $0c pha ;make room for local variables pha pha pha tsc ;make stack frame phd tcd *** added 15-Jan-93 DAL -- if BRAM location $59 is set to $FF, that's annoying; set it to zero pha pea $59 _ReadBParam pla cmp #$00ff bne @iLike pea 0 pea $59 _WriteBParam @iLike *** end 15-Jan-93 phb ;set DBR to our memory phk plb lda #1 ;assume we're gonna see the Apple key pressed sta [flag] sep #$20 ;8-bit accumulator lda >$E0C025 ;get keyboard modifiers state rep #$20 ;16-bit accumulator and #%0000000010000000 ;open-apple key pressed? bne skip_it ;yup, just skip the startup app sta [flag] ;don't draw an X through the icon jsr OpenFile ;go open the resource file bcs skip_it ;just skip it if an error occurs jsr loadResource ;go get the pathname from the data file bcs skip_it2 ;just forget it then! stx rHndl ;store the returned handle sty rHndl+2 lda [rHndl] ;deref sta tmpPtr ldy #2 lda [rHndl],y sta tmpPtr+2 lda [tmpPtr] ;get length of pathname pha ;save on stack for a minute clc adc #8 ;+2 (length word) + 6 (header length) pea 0 ;always <64K pha ;new length pei rHndl+2 pei rHndl _SetHandleSize ;grow the handle plx ;retrieve pathname length bcs skip_it2 ;punt if there's no memory pei rHndl+2 ;source handle pei rHndl ldy #2 lda [rHndl],y ;destination pointer pha lda [rHndl] clc adc #6 pha pea 0 ;always <64K inx ;+2 for length word inx phx _HandToPtr ;move pathname up in the handle pea 1 ;place the pathname in the message pea messageID ;my reserved message type pei rHndl+2 ;handle to message pei rHndl _MessageCenter skip_it2 lda fileID ;close the file sta close_refnum jsl $E100A8 ;call GS/OS dc.w $2014 dc.l closeParms skip_it lda #2 ;null out prefix 8 sta pCount lda #8 sta prefixNum lda #nullPfx>>16 sta bufPtr+2 lda #nullPfx sta bufPtr _SetPrefixGS parmBlock ;set the prefix lda rtlAddr+1 ;clean up stack frame sta flag+2 lda rtlAddr sta flag+1 plb ;restore DBR pld ;restore original direct page tsc ;remove stuff from stack clc adc #12 tcs rtl endf ;################################################################ ;# # ;# initMenu function # ;# Inserts filename in popup menu if a filename is # ;# available. This function returns the menu item # ;# ID of the initial item to display. 1 if there # ;# no filename currently selected, or 2 if there is. # ;# # ;################################################################ initMenu proc export Import OpenFile,fileID with myVars rHndl equ $01 ;resource handle rPtr equ $05 ;resource pointer (dereferenced handle) controlH equ $0d ;control handle passed from Pascal retValue equ $11 ;space for return value phb ;put DBR on stack tsc ;get stack pointer sec sbc #8 ;make room for temporary variables tcs phd ;save original direct page tcd ;make local direct page phk ;set to our memory plb lda #1 sta fileSelected ;initialize our flag to initial menu item jsr OpenFile ;open the data file bcc get_resource ;file opened, so go get the resource brl no_file ;else just exit get_resource jsr loadResource ;get the pathname bcc got_resource brl skip_it ;if no resource, leave things as is got_resource stx rHndl ;store the handle sty rHndl+2 ldy #2 ;dereference handle lda [rHndl] tax lda [rHndl],y pha ;put pointer to string on stack phx jsr getMenuName ;go build the menu string lda #2 ;return item number of selected filename sta fileSelected pha ;space for result pha _GetMenuBar ;get handle to current menu bar and leave on stack pei controlH+2 ;get handle to popup control pei controlH _SetMenuBar ;make it the current menu bar pea bootname>>16 ;insert filename into menu pea bootname pea 1 ;insert after first item pea 1 ;insert into menu #1 (only one we have!) _InsertMItem pea 0 ;remove the checkmark from Finder pea 1 _SetMItemMark pea 18 ;and put it with the selected filename pea 2 _SetMItemMark pea 0 ;recalculate menu size pea 0 pea 1 _CalcMenuSize _SetMenuBar ;reset to original menu bar skip_it lda fileID ;must close the file before exiting sta close_refnum jsl $E100A8 ;call GS/OS dc.w $2014 dc.l closeParms no_file lda fileSelected ;return the current setting sta retValue pld ;restore original direct page tsc ;remove temporary variables from stack clc adc #8 tcs pla ;move return address up over parameter sta 3,s pla sta 3,s plb rtl endp ; ; InitCheckBoxes ; InitCheckBoxes proc export import CheckLocation,CheckBitMask,CheckNegateMask,CheckBoxIndex phd tsc tcd phb phk plb windPtr equ 6 ldx #0 @nextOne stx CheckBoxIndex pha ;space for result lda CheckLocation,x pha _ReadBParam pla ldx CheckBoxIndex and CheckBitMask,x eor CheckNegateMask,x beq @zero lda #1 @zero pha ;push new checkbox value pei >16 sta cr_path+2 jsl $E100A8 ;call GS/OS dc.w $2001 ;to create the file dc.l createParms bcc open_it ;now that it's created, go open it ; else fall through and report the error oops pha ;space for result pea %0000000000000110 ;alertFlags (alertStrRef is a resource ID) pea 0 ;subStrPtr (not used) pea 0 pea 0 ;resource ID for AlertWindow pea 1 _AlertWindow ;make the alert window pla ;remove returned parameter brl show_filename ;then just exit file_opened lda #8 ;restore prefix 8 for Standard File ldx pfx8 ldy pfx8+2 jsr setPfx pha ;space for result pei ctrlHndl+2 pei ctrlHndl _GetCtlValue ;get the control value pla dec a ;make 0-3 asl a ;make offset into jump table tax jsr (itemTable,x) ;go to the necessary subroutine show_filename lda fileSelected ;set the value to display the current setting pha pei ctrlHndl+2 pei ctrlHndl _SetCtlValue close_file lda fileID ;get the resource file ID beq exit ;if not open, don't try to close it sta close_refnum jsl $E100A8 ;close the data file dc.w $2014 dc.l closeParms exit lda retAddr ;move return address up in stack frame sta ctrlHndl lda retAddr+2 sta ctrlHndl+2 pld ;restore original direct page tsc ;clean up stack frame clc adc #18 tcs plb ;remove extra byte from stack rtl *** 29-Oct-92 DAL -- handle a checkbox (control ID in A; box already toggled) HandleCheckbox lda ctrlID sec sbc #$00c1 ;0=startup icons, 1=enable prog CDAs asl a sta checkBoxIndex pha ;space for result pei >16 ;pointer to filter proc pea sfFilterProc pea typelist>>16 ;pointer to type list pea typelist pea replylist>>16 ;pointer to reply list pea replylist _SFGetFile2 ;go get the filename of the application jsr closeStdFile ;now we can shut it down again lda isGood ;did the user press cancel? beq do_nothing2 ;yes, just show the existing filename lda pathRef+2 ;put handle into direct page sta memHandle+2 lda pathRef sta memHandle ldy #4 ;lock the handle lda [memHandle],y ora #$8000 sta [memHandle],y ldy #2 ;dereference handle lda [memHandle],y tax lda [memHandle] clc adc #2 ;set pointer to length word of string sta tmpPtr txa adc #0 sta tmpPtr+2 pha ;put pointer on stack pei tmpPtr pei memHandle+2 ;put handle on stack pei memHandle pea 0 ;has to be < 64K bytes lda [tmpPtr] ;get length of pathname inc a ;allow for length word inc a sta tmpVal ;save for a bit pha ;put length of move on stack _PtrToHand ;copy pathname down over buffer length word ldy #4 ;unlock the block lda [memHandle],y and #$7FFF sta [memHandle],y pea 0 ;set to new size pei tmpVal pei memHandle+2 pei memHandle _SetHandleSize ;shrink the handle lda nameRef+2 ;now delete the filename handle pha lda nameRef pha _DisposeHandle _common_ lda fileID sta set_eof_refnum jsl $E100A8 ;call GS/OS dc.w $2018 ;SetEOF dc.l set_eof_parms bcs do_error_window jsr $E100A8 ;then reset the mark dc.w $2016 dc.l set_eof_parms bcs do_error_window lda [memHandle] ;deref the handle sta read_buff ;set I/O buffer ldy #2 lda [memHandle],y sta read_buff+2 pha ;result space pha pei memHandle+2 pei memHandle ldx #$1802 ;GetHandleSize jsl $E10000 pla plx bcs skip sta read_count stx read_count+2 lda fileID sta read_refNum jsl $E100A8 ;call GS/OS dc.w $2013 ;to write the pathname to the file dc.l readParms bcc all_ok do_error_window ldx #0 phx ;space for result phx ;type of substitution string phx ;pointer to substitution string (none) phx pha ;error number ldx #$620e ;ErrorWindow jsl $E10000 pla ;remove result from stack sec skip bra oops2 all_ok ldy #2 ;deref the pathname handle lda [memHandle],y pha lda [memHandle] pha jsr getMenuName ;go make a menu string pha ;space for result pha _GetMenuBar ;get current menu bar and leave handle on stack pei ctrlHndl+2 ;set current menu to our popup pei ctrlHndl _SetMenuBar pea 2 _DeleteMItem ;delete the filename from the menu pea bootname>>16 ;insert filename into menu pea bootname pea 1 ;insert after first item pea 1 ;insert into menu #1 (only one we have!) _InsertMItem pea 0 ;remove the checkmark from Finder pea 1 _SetMItemMark pea 18 ;and put it with the selected filename pea 2 _SetMItemMark pea 0 ;recalculate menu size pea 0 pea 1 _CalcMenuSize _SetMenuBar ;reset to original menu bar lda #2 ;set our flag sta fileSelected oops2 pei memHandle+2 pei memHandle _DisposeHandle ;dispose of the memory block rts ;back to main block of code typelist dc.w 2 ;allow only two filetypes (SYS and S16) dc.w %1000000000000000 ;display SYS with any auxtype dc.w $ff ;SYS file dc.l 0 dc.w %1000000000000000 ;display S16 with any auxtype dc.w $b3 ;S16 file dc.l 0 replylist isGood dc.w 0 dc.w 0 ;space for filetype dc.l 0 ;space for auxtype nameVerb dc.w 3 ;name verb nameRef dc.l 0 ;space for returned handle pathVerb dc.w 3 ;path verb pathRef dc.l 0 ;space for returned handle nameParms dc.w 2 ;parameter block for GetName call dc.l nameBuf appID ds.w 1 ;space for application's user ID nameBuf dc.w 36 ;application name buffer for GetName call appName dc.w 0 ds.b 32 infoParms dc.w 2 ;parameter block for GetFileInfo call infoName dc.l 0 ;space for name pointer access dc.w 0 ;we don't really care, but this has to be here endp ;################################################################ ;# # ;# sfFilterProc procedure # ;# used by SFGetFile2 call to filter out certain files # ;# (namely ProDOS, Start, and Finder) # ;# # ;################################################################ sfFilterProc Proc tmpPtr equ 1 namePtr equ tmpPtr+2 OrigDirect equ namePtr+4 RTLAdr equ OrigDirect+2 EntryPtr equ RTLAdr+3 Result equ EntryPtr+4 o_name equ $0a ; offset to filename phd ; save caller's direct page pha ; make space for name pointer pha pha ; make space for temp pointer tsc tcd phb phk plb lda #2 ; assume selectable sta Result ldy #o_name+2 ;get pointer to name buffer lda [EntryPtr],y tax dey dey lda [EntryPtr],y clc adc #2 ;bump past buffer length word bcc @1 ;to get to string length word inx @1 sta namePtr stx namePtr+2 ldx #-2 ; index into name table compare rep #$20 ; make sure we've got 16-bit Acc longa on inx ; move to next table entry inx lda nameTable,x beq AllsOK ; end of table reached with no matches sta tmpPtr lda [namePtr] ; get the length of the name cmp (tmpPtr) ; same length? bne compare ; no, can't match inc a ; account for high byte of length word tay ; into Y as index sep #$20 longa off nameLoop lda [namePtr],y and #%11011111 ; shift to upper case cmp (tmpPtr),y bne compare ; no match, move to next name dey bne nameLoop DimThisOne rep #$20 ; we have a match longa on stz result ; don't even display this file longa off AllsOK lda RTLAdr+1 sta RTLAdr+4+1 lda RTLAdr sta RTLAdr+4 plb ; restore caller's DBR pla ; remove name pointer pla pla ; remove temp pointer pld ; restore direct register pla ; remove passed pointer pla rtl ; return nameTable dc.w ProDOSName dc.w StartName dc.w FinderName dc.w 0 ; terminator ProDOSName wstr 'PRODOS' StartName wstr 'START' FinderName wstr 'FINDER' longa on ENDP end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.mac b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.mac new file mode 100644 index 0000000..d4d4299 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.mac @@ -0,0 +1 @@ + MACRO &lab _ReadBParam &lab ldx #$0C03 jsl $E10000 MEND MACRO &lab _WriteBParam &lab ldx #$0B03 jsl $E10000 MEND MACRO &lab _FWEntry &lab ldx #$2403 jsl $E10000 MEND MACRO &lab _ReadKeyMicroMemory &lab ldx #$0B09 jsl $E10000 MEND ;............................................................ ; ; Push long (4 bytes) onto stack ; ; pushlong address - push contents of address ; pushlong address,x - push contents of address,x ; pushlong const,s - push contents of stack+const ; pushlong #address/const - push address or constant ; pushlong [zeropage],offset - push using indirect address ;............................................................... MACRO pushlong &addr,&offset IF &addr[1:1]='#' THEN pea &addr[2:255]>>16 pea |&addr[2:255] ELSEIF &addr[1:1]='[' THEN ldy #&offset+2 pushword &addr,y ldy #&offset pushword &addr,y ELSEIF &offset='s' THEN pushword &addr+2,s pushword &addr+2,s ELSEIF &offset='' THEN pushword &addr+2 pushword &addr ELSE pushword &addr+2,&offset pushword &addr,&offset ENDIF MEND MACRO wstr &string lclc &sset &sset SETC &SETTING('STRING') STRING ASIS dc.w (&len(&string)-2) ;must allow for string delimiters dc.B &string STRING &sset MEND MACRO &lab _ResourceStartup &lab ldx #$021E jsl $E10000 MEND MACRO &lab _ResourceShutdown &lab ldx #$031E jsl $E10000 MEND MACRO &lab _DetachResource &lab ldx #$181E jsl $E10000 MEND MACRO &lab _LoadResource &lab ldx #$0E1E jsl $E10000 MEND MACRO &lab _OpenResourceFile &lab ldx #$0A1E jsl $E10000 MEND MACRO &lab _RemoveResource &lab ldx #$0F1E jsl $E10000 MEND MACRO &lab _CloseResourceFile &lab ldx #$0B1E jsl $E10000 MEND MACRO &lab _AddResource &lab ldx #$0C1E jsl $E10000 MEND MACRO &lab _QuitGS ¶ms &lab jsl $E100A8 DC.W $2029 DC.L ¶ms MEND MACRO &lab _GetNameGS ¶ms &lab jsl $E100A8 DC.W $2027 DC.L ¶ms MEND MACRO &lab _GetFileInfoGS ¶ms &lab jsl $E100A8 DC.W $2006 DC.L ¶ms MEND MACRO &lab _SetSysPrefsGS ¶ms &lab jsl $E100A8 DC.W $200C DC.L ¶ms MEND MACRO &lab _DInfoGS ¶ms &lab jsl $E100A8 DC.W $202C DC.L ¶ms MEND MACRO &lab _VolumeGS ¶ms &lab jsl $E100A8 DC.W $2008 DC.L ¶ms MEND MACRO &lab _FSTSpecificGS ¶ms &lab jsl $E100A8 DC.W $2033 DC.L ¶ms MEND MACRO &lab _SetPrefixGS ¶ms &lab jsl $E100A8 DC.W $2009 DC.L ¶ms MEND MACRO &lab _DeleteMItem &lab ldx #$100F jsl $E10000 MEND MACRO &lab _CalcMenuSize &lab ldx #$1C0F jsl $E10000 MEND MACRO &lab _InsertMItem &lab ldx #$0F0F jsl $E10000 MEND MACRO &lab _GetCtlValue &lab ldx #$1A10 jsl $E10000 MEND MACRO &lab _GetMenuBar &lab ldx #$0A0F jsl $E10000 MEND MACRO &lab _SetMenuBar &lab ldx #$390F jsl $E10000 MEND MACRO &lab _SFGetFile2 &lab ldx #$0E17 jsl $E10000 MEND MACRO &lab _PtrToHand &lab ldx #$2802 jsl $E10000 MEND MACRO _HandToPtr ldx #$2902 jsl $E10000 MEND MACRO &lab _DisposeHandle &lab ldx #$1002 jsl $E10000 MEND MACRO &lab _SetCtlValue &lab ldx #$1910 jsl $E10000 MEND MACRO &lab jeq &target &lab bne *+5 brl &target MEND MACRO &lab jne &target &lab beq *+5 brl &target MEND MACRO &lab _GetNewID &lab ldx #$2003 jsl $E10000 MEND MACRO &lab _NewHandle &lab ldx #$0902 jsl $E10000 MEND MACRO &lab _SysFailMgr &lab ldx #$1503 jsl $E10000 MEND MACRO &lab _GetPrefixGS ¶ms &lab jsl $E100A8 DC.W $200A DC.L ¶ms MEND MACRO &lab _SetHandleSize &lab ldx #$1902 jsl $E10000 MEND MACRO &lab _DeleteID &lab ldx #$2103 jsl $E10000 MEND MACRO &lab _SetMItemMark &lab ldx #$330F jsl $E10000 MEND MACRO &lab _SFStatus &lab ldx #$0617 jsl $E10000 MEND MACRO &lab _LoadOneTool &lab ldx #$0F01 jsl $E10000 MEND MACRO &lab _SFStartUp &lab ldx #$0217 jsl $E10000 MEND MACRO &lab _SFShutDown &lab ldx #$0317 jsl $E10000 MEND MACRO &lab _UnloadOneTool &lab ldx #$1001 jsl $E10000 MEND MACRO &lab _SysBeep &lab ldx #$2C03 jsl $E10000 MEND MACRO &lab _GetMasterSCB &lab ldx #$1704 jsl $E10000 MEND MACRO &lab _AlertWindow &lab ldx #$590E jsl $E10000 MEND MACRO &lab _ErrorWindow &lab ldx #$620E jsl $E10000 MEND MACRO &lab _CreateResourceFile &lab ldx #$091E jsl $E10000 MEND MACRO &lab _HLock &lab ldx #$2002 jsl $E10000 MEND MACRO &lab _HUnlock &lab ldx #$2202 jsl $E10000 MEND messageID equ $0007 ;private message type (cleared with Dave Lyons) MACRO _MessageCenter ldx #$1501 jsl $E10000 MEND \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.p b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.p new file mode 100644 index 0000000..5d1416f --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.p @@ -0,0 +1 @@ +{############################################################} {# #} {# File: SetStart.p #} {# Version: 1.1 #} {# Author: Greg Branche #} {# Copyright: (c) 1989 by Apple Computer, Inc. #} {# #} {# Description: This file contains the cdev pascal #} {# routine used by the SetStart CDEV. #} {# #} {# Based on the example shell CDEV by Darryl Lovato #} {# #} {#----------------------------------------------------------#} {# #} {# Development History: #} {# #} {# Who Date The Modification #} {# --- -------- ---------------- #} {# GAB 05/12/89 Created the file #} {# DAL 10/28/92 RectCDEV calls doRect #} {# #} {############################################################} {$R-} unit SetStart; interface uses Types, GSOS, Quickdraw, Fonts, Memory, IntMath, Events, ProDOS, Locator, Controls, Windows, Lists, Scrap, Dialogs, Menus, Desk, StdFile, QDAUX, Print, MiscTool, LineEdit, Resources, CDEVIntF; {############################################################} {# Define the CDEV constants/types,vars #} {############################################################} function SetStartCDEV(message : integer; data1, data2 : LongInt) : LongInt; implementation {############################################################} {# Actual CDEV, this is called by the control panel #} {############################################################} var {$J+} GOODINIT: Boolean; { this is really defined in assembler } procedure doBoot(flag : UNIV IntPtr); External; procedure doRect(data1: univ longint); External; procedure doClose; External; function initMenu(ctlHndl : UNIV CtlRecHndl) : integer; External; procedure doSelect(ctlHndl : UNIV CtlRecHndl; theID: longint); External; procedure InitCheckBoxes(windPtr: UNIV ptr); External; { This routine is eventually linked and then placed into a cdev code resource. The only requirements are that this routine is at the beginning of the resource so if the CDEV has any other routines they must follow this one. The cdev's resource fork is always opened when a call to the cdev is made. The cdev can also assume that the current port is set to the ctl panel window except in the boot message, where quickdraw isn't even started, and in the about message, where it is the port of the help window. All normal managers will be stared up for all calls except the boot call, which will only have miscTools & Resource Manager started. } function SetStartCDEV(message : integer; data1, data2 : longint) : longint; var tempCtl : CtlRecHndl; begin { this will only get called when a ctl is hit } SetStartCDEV := 0; { initialize the function result to zero, so that we will work in future versions of the Control Panel! } case message of BootCDEV: begin { If the wantBoot flag is set, this routine will be called during the startup sequence. The control panel takes care of drawing the "boot" icon. When this call is made, the machine state is bad at best. QuickDraw is not even started up. The parameters to this call are undefined. } doBoot(data1); end; (* MachineCDEV: begin { This is called if the wantMachine bit is set in the CDEV flags. It enables the CDEV to do further checking to see if it makes sense for the CDEV to be visible to the user or not. For instance, if the CDEV controls a setting for some hardware, we could check to see if the hardware is really connected. The parameters are undefined for this call and the result is passed back as the function result. 0 = don't show this CDEV, <>0 = show this CDEV. The control panel will do some machine checking even before calling this routine by checking the ROM version number against the machine field of the cdev flags resource } end; *) CreateCDEV: begin { If the wantCreate bit is set, this message is called with the control panel's window ptr passed in data1. The cdev must create any controls it has during this call. The CDEV's resource fork is open during this call so resource manager calls can be made. All controls rectangles MUST be relative to 0,0. The control panel handles offsetting controls to the proper place in the window. Initialization of the controls needs to be done in the InitCDEV call. Just create the controls in this call. } if goodInit then tempCtl := NewControl2(WindowPtr(data1),resourceToResource,Ref(1)) else tempCtl := NewControl2(WindowPtr(data1),singleResource,Ref(2)); end; InitCDEV: begin { If the wantInit flag is set, then this message is passed with data1 = the control panel's window ptr. By this time the CreateCDEV call will have been made and thus the controls used by the CDEV created. This call enables the CDEV to initialize the controls before they are displayed. } if goodInit then Begin tempCtl := GetCtlHandleFromID(WindowPtr(data1),1); SetCtlValue(initMenu(tempCtl), tempCtl); InitCheckBoxes(data1); end; end; AboutCDEV: begin { If the wantAbout bit is set in the CDEV flags, this call is made when the user selects help. Data1 = window ptr to the help window. The control panel automatically handles the icon, author, and version # display.} tempCtl := NewControl2(WindowPtr(data1),singleResource,Ref(100)); end; RectCDEV: begin { If a CDEV has a different size data rectangle depending on some state, like the printer & modem port cdev's, then you can get a chance to tell the control panel this by setting the wantRect bit in the CDEV flags. In this call, data1 is a ptr to the rect and can be directly modified by the CDEV. } (* if Not doInit then { save the current default prefix & check for STDFile } RectPtr(data1)^.bottom := 32; { reset the vertical size of the CDev rect } *) doRect(data1); end; (* EventsCDEV: begin { If the wantEvents bit is set, the control panel will call this routine with data1 = ptr to the event record. This allows the cdev to intercept and even *gasp* change the event record before it is handled by the control panel. } end; *) HitCDEV: begin { If the CDEV wants to know when a control has been "hit", it can set the wantHit bit in the CDEV flags. When called, data1 = Hdl to Ctl Hit & data2 = Ctl ID of hit control. This message allows the CDEV to perform actions based on the control that was selected by the user.} doSelect(data1,data2); end; (* RunCDEV: begin { This message is called if the "wantRun" bit is set in the CDEV flags. It enables CDEVs like time to update the display. It is called every 60th of a second - every time the DARun call is issued to the control panel. -no parameters are passed to this routine. } end; *) CloseCDEV: begin { The CloseCDEV message is passed if the wantClose bit is set in the CDEV flags and the control panel is closing or when the user selects another CDEV. During this call data1 = windowPtr. In general, CDEVs can do any memory disposal and saving of settings during this call. The disposal of the CDEV's controls is handled automatically by the Control Panel. } if goodInit then doClose; { restore the default prefix (saved during init message) } end; (* ShutDownCDEV: begin { If the wantShutDown bit is set in the CDEV flags resource then this routine is called when the user either disables the CDEV or *someday* when the machine is being turned off. It gives the CDEV a chance to turn itself off (or any hardware or software it controls). The parameters are undefined in this call. } end; *) end; end; end. { SetStart CDEV unit } \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.r b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.r new file mode 100644 index 0000000..88aa6c1 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/SetStart.r @@ -0,0 +1 @@ +//########################################################### //# # //# File: SetStart.r # //# Version: 1.1 # //# Author: Greg Branche # //# Copyright: (c) 1991-93 by Apple Computer, Inc. # //# # //# Description: This file contains the resource # //# definitions used by the SetStart CDEV # //# # //# Based on the example shell CDEV by Darryl Lovato # //# # //#---------------------------------------------------------# //# # //# Development History: # //# # //# Who Date The Modification # //# --- -------- ---------------- # //# GAB 05/12/89 Created the file # //# DAL 10/28/92 Added a pop-down triangle to the # //# menu; use typographical quotes; # //# rewrote help text; added two # //# checkboxes # //# DAL 01/18/93 Fixed version & copyright stuff # //# DAL 03/24/93 Version d15; modified Help # //# SS 04/01/93 Version 1.1 (release) # //########################################################### //########################################################### //# Read any standard includes & define our own # //########################################################### #include "typesiigs.r" // include the type definitions //########################################################### //# Read the resources built elsewhere # //########################################################### read rCDEVCode (1, Convert) "SetStartcode"; // this is the code resource //########################################################### //# Define our resources # //########################################################### #define VERSION "v1.1" // change this when necessary resource rVersion (1) { { 1,1,0, // major, minor, bug fix version numbers release, $00 // non-final release # }, verUS, // country code "SetStart", "Copyright © 1992-93, Apple Computer, Inc., All Rights Reserved" }; resource rCDEVFlags (1) { wantBoot+wantHit+wantInit+ wantCreate+wantAbout+ wantRect+wantClose, // CDEV flags 1, // enabled = True 1, // Version = 1 1, // Machine = v1 ROMs or higher 5, // System = v5.0 or higher {0,0,20,290}, // DataRect - top left MUST be 0,0 "SetStart", // Name "Greg Branche", // Author VERSION; // Version String }; resource rAlertString (1) { "2" // 60-character display window "3" // use the NOTE icon "/" // separator character "I canÕt open my data file!" // the error message "/" "^Bummer!" // button title "\$00" // terminator }; resource rAlertString (2) { "3" // 110-character display window "3" // use the NOTE icon "/" // separator character "I canÕt find the current application! " // the error message "Try using the ÒSelect ApplicationÉÓ option." "/" "^Uncool!" // button title "\$00" // terminator }; resource rAlertString (3) { "2" // 60-character display window "3" // use the NOTE icon "/" // separator character "CanÕt load the Standard File tool set." // the error message "/" "^Bummer!" // button title "\$00" // terminator }; resource rPString (75, noCrossBank) { "Please select start application:" }; resource rControlList(1) {{ 1, // pop-up menu $C1, // first checkbox = Show startup icons $C2 // second checkbox = Enable programmer CDAs }}; resource rControlTemplate (1) { // Popup menu 1, // ID {3,5,16,285}, // rect PopUpControl {{ // ProcRef fType2PopUp, // flags fCtlProcNotPtr+RefIsResource+$0080, // moreFlags ($80 is pop-down triangle) 0, // refcon 0, /* 76 */ // titleWidth 1, // menuRef 1 // initialValue }} }; resource rControlTemplate ($C1) { $000000C1, // ID { 21, 54, 30, 285 }, // rect checkControl {{ $0000, // flag $3002, // moreFlags $00000000, // refCon $C1, // titleRef $0000 // initialValue }}; }; resource rControlTemplate ($C2) { $000000C2, // ID { 34, 54, 43, 285 }, // rect checkControl {{ $0000, // flag $3002, // moreFlags $00000000, // refCon $C2, // titleRef $0000 // initialValue }}; }; resource rPString($C1) { "Show startup icons" }; resource rPString($C2) { "Enable programmer CDAs" }; resource rControlTemplate (2) { // "Out of order" control 1, // ID {3,1,32,195}, // rect StatTextControl { { // procRef 0, // flag FctlProcNotPtr+RefIsResource, // moreFlags 0, // refCon 2 // textRef }} }; resource rTextForLETextBox2 (2) { // Out of order static text "We are experiencing technical difficulties. " "Please stand by..." }; resource rMenu (1) { 1, // menu ID RefIsResource*menuTitleRefShift+RefIsResource*ItemRefShift+fAllowCache, 50, // ID of title string { 1,3,4 // IDs of items }; }; resource rPString (50, noCrossBank) { " Start up with: " }; resource rMenuItem (1) { 1, "", "", 18, RefIsResource*ItemTitleRefShift+rMIItalic, 1 }; resource rPString (1, noCrossBank) { "Finder" }; resource rMenuItem (3) { 3, "", "", 0, RefIsResource*ItemTitleRefShift, 3 }; resource rPString (3) { "Current Application" }; resource rMenuItem (4) { 4, "", "", 0, RefIsResource*ItemTitleRefShift, 4 }; resource rPString (4, noCrossBank) { "Select ApplicationÉ" }; resource rControlTemplate (100) { // About box control 1, // ID {38,5,138,280}, // rect StatTextControl { { // procRef 0, // flag FctlProcNotPtr+RefIsResource, // moreFlags 0, // refCon 100 // textRef }} }; resource rTextForLETextBox2 (100) { // About box text "This control panel lets you choose what application will " "start up automatically when you start (boot) your " "Apple IIgs." "\$0D\$0D" "The checkboxes let you control whether icons appear while " "the computer is starting up, and whether Classic Desk " "Accessories such as Visit Monitor and Memory Peeker appear." }; resource rIcon (1) { // the "CDEV" icon 0x8000, // kind 20, // height 28, // width $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFF22222222FF" $"FFFFFFFFFFFFFFFFF2222222222F" $"FFFFFFFFFFFFFFFFF0002222222F" $"FFFFFFFFFFFFFFFF22222222222F" $"FFFFFFFFFFFFFFF200222222222F" $"FFFFFFFFFFFFFF0222022222222F" $"FFFFFFFFFFFF022022222222222F" $"FFFF22220202022202222222222F" $"FFF222220202202222222222222F" $"FF2222222222222222222222222F" $"F22222222222222222222222222F" $"F00000000000000000000000000F" $"FF0000000000000FFFF00000000F" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF", $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000" $"000000000000000000FFFFFFFF00" $"00000000000000000FFFFFFFFFF0" $"00000000000000000FFFFFFFFFF0" $"0000000000000000FFFFFFFFFFF0" $"000000000000000FFFFFFFFFFFF0" $"00000000000000FFFFFFFFFFFFF0" $"000000000000FFFFFFFFFFFFFFF0" $"0000FFFFFFFFFFFFFFFFFFFFFFF0" $"000FFFFFFFFFFFFFFFFFFFFFFFF0" $"00FFFFFFFFFFFFFFFFFFFFFFFFF0" $"0FFFFFFFFFFFFFFFFFFFFFFFFFF0" $"0FFFFFFFFFFFFFFFFFFFFFFFFFF0" $"00FFFFFFFFFFFFF0000FFFFFFFF0" $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000" }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/Startup.Aii b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/Startup.Aii new file mode 100644 index 0000000..d849278 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/Startup.Aii @@ -0,0 +1 @@ +;------------------------------------------ ; ; Equates from procedure ; ;------------------------------------------ rHndl equ 0 strptr equ rHndl+4 real_length equ strptr+4 INCLUDE 'SetStart.mac' startup PROC Export phk plb ldx #2 ;reset infoParms pCount stx infoParms pha ;make space for NewHandle call pha pea 0 ;size of block to create pea 256 ;this ought to be enough ora #$0100 ;alter auxID field pha ;put our ID on the stack pea %0000000000010000 ;attributes (noCross) lda #0 pha ;location pointer pha ;(not used) _NewHandle ;go get some memory pla ;retrieve handle plx bcs @skip_to_finder ;just skip it if there's not enough memory stx rHndl+2 sta rHndl pea 2 ;action = getMessage pea messageID ;private message type phx ;handle for retrieved message pha _MessageCenter ;go get the message bcs @skip_to_finder ;skip it if the message doesn't exist ldy #4 ;lock the handle lda [rHndl],y ora #$8000 sta [rHndl],y ldy #2 lda [rHndl] ;dereference message handle clc adc #6 ;skip message header sta quitPath ;store into parmlist sta infoPath sta strptr lda [rHndl],y sta quitPath+2 sta infoPath+2 sta strptr+2 lda #%1100000000000000 ;initialize the quit flags sta quitFlags ; to place us on the quit stack lda #$8000 ;set system preferences sta prefFlag ;(display Mount dialog) _SetSysPrefsGS prefparms _GetFileInfoGS infoparms ;ensure the file is there php ;save status stz prefFlag ;reset system preferences _SetSysPrefsGS prefparms plp ;restore status from GetFileInfo call @skip_to_finder bcs do_finder ;had a problem, punt to the Finder lda [strptr] ;get length of pathname sta real_length ;save for a bit tax ;into X temporarily inx ;adjust for leading length word sep #$20 ;8-bit accumulator longa off ldy #2 ;get leading separator character lda [strptr],y txy ;get indexor @loop cmp [strptr],y ;parse backwards looking for last beq @found ; separator dey bne @loop bra @skip_prefix ;impossible! @found rep #$20 ;found end of pathname portion longa on dey ;adjust final length tya sta [strptr] ;store as length of prefix stz infoparms ;prefix # = 0 _SetPrefixGS pfxParms ;set the prefix lda real_length ;reset the original pathname length sta [strptr] @skip_prefix rep #$20 ;make sure we're in 16-bit mode longa on bra do_quit ;now we can launch it do_finder stz quitFlags ;fix flags for quitting to finder lda #fndr ;store pointer to pathname sta quitPath sta infoPath lda #fndr>>16 sta quitPath+2 sta infoPath+2 _GetFileInfoGS infoparms ;is the Finder available? bcc do_quit ;yes, we can 'quit' to it stz quitPath ;else null out the pathname pointer stz quitPath+2 ; so GQuit will use the Program Launcher do_quit pea 3 ;action = deleteMessage pea messageID ;private message type phx ;handle (not used for delete) pha _MessageCenter ; ignore errors (doesn't matter if message didn't exist) _quitGS quitparms brk quitparms DC.W 2 quitPath DC.L fndr quitFlags DC.W %1100000000000000 pfxParms dc.w 2 ;pCount for SetPrefix call infoparms DC.W 2 ;pCount for GetFileInfo call, prefix num for SetPrefix infoPath DC.L 0 ;pathname pointer DC.W 0 ;access prefparms DC.W 1 ;pCount prefFlag DC.W 0 ;preferences fndr wstr '*:System:Finder' ENDP end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/makefile new file mode 100644 index 0000000..387d249 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/makefile @@ -0,0 +1 @@ +############################################################# # # # File: SetStart.make # # Version: 1.0 # # Author: Greg Branche # # Copyright: (c) 1989 by Apple Computer, Inc. # # # # Description: This file contains the commands needed # # to build the SetStart CDEV for the IIgs # # # # Based on the example shell CDEV by Darryl Lovato # # # #-----------------------------------------------------------# # # # Development History: # # # # Who Date The Modification # # --- -------- ---------------- # # GAB 05/12/89 Created the file # # GAB 06/07/89 Added dependencies for START # # # ############################################################# all ÄÄ SetStart Start SetStart ÄÄ SetStartcode SetStart.r RezIIgs SetStart.r -o SetStart -t "C7 " -c "pdos" SetStart.p.obj Ä SetStart.p PascalIIgs SetStart.p -o SetStart.p.obj SetStart.aii.obj Ä SetStart.aii SetStart.mac AsmIIgs SetStart.aii -o SetStart.aii.obj OpenFile.obj Ä OpenFile.aii AsmIIGS OpenFile.aii -o OpenFile.obj SetStartcode Ä SetStart.p.obj SetStart.aii.obj OpenFile.obj LinkIIgs -w2 -x ¶ -lib "{PIIGSLibraries}PLib" ¶ -lseg SetStart:$1000 ¶ SetStart.p.obj ¶ SetStart.aii.obj ¶ OpenFile.obj ¶ "{PIIGSLibraries}PLib"(@main,@PLib,@~globals) ¶ -o SetStartcode ¶ -l >setstart.map ######################################################################### Start ÄÄ Startup.aii.obj LinkIIGS -o Start -t S16 -at $DB03 Startup.aii.obj Startup.aii.obj Ä Startup.aii SetStart.mac AsmIIGS Startup.aii -o Startup.aii.obj \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/setstart.map b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/setstart.map new file mode 100644 index 0000000..4f9c7e4 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SetStartCDEV/setstart.map @@ -0,0 +1 @@ +------------------------------------------------------------------------------- 0001 Load Segment "SetStart:$1000" relocatable LENGTH=$C92 KIND=$0000 ------------------------------------------------------------------------------- 0001 00000000 00000108 SETSTARTCDEV 0002 00000108 0000001C BOOTNAME 0003 00000124 00000058 MYVARS 0004 0000017C 00000074 GETMENUNAME 0005 000001F0 0000008F OPENSTDFILE 0006 0000027F 00000026 CLOSESTDFILE 0007 000002A5 0000006F LOADRESOURCE 0008 00000314 00000068 DORECT 0009 0000037C 00000041 DOINIT 000A 000003BD 000000EF GETPFX 000B 000004AC 0000003E DOCLOSE 000C 000004EA 00000034 SETPFX 000D 0000051E 000000E0 DOBOOT 000E 000005FE 000000B4 INITMENU 000F 000006B2 00000055 INITCHECKBOXES 0010 00000707 000003FA DOSELECT 0011 00000B01 00000079 SFFILTERPROC 0012 00000B7A 000000FB OPENFILE 0013 00000C75 00000006 SETCTLVALUE 0014 00000C7B 00000006 GETCTLHANDLEFROMID 0015 00000C81 00000006 NEWCONTROL2 0016 00000C87 00000009 TOOLGLUE 0017 00000C90 00000002 _toolErr Output Load File "SetStartcode" contains 1 Load Segments with a total length of $C92 bytes. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/Slots.pii b/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/Slots.pii new file mode 100644 index 0000000..1defb88 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/Slots.pii @@ -0,0 +1 @@ +{*****************************************************************} { { Slots CDEV { { Copyright (C) 1988-1991 { Apple Computer, Inc. { All Rights Reserved { { By Darryl Lovato { { This is the pascal code to implement the SLOTS CDEV { { { Change History { { 24 Mar 89 Steven Glass { { Added check for what machine we are on so can treat GS { different from Tenspeed. { { Create different controls if running on GS vs TenSpeed. { { Changed CheckPopUpItems to see what machine. { { 3-Jun-91 Dave Lyons (and a couple weeks ago, too) { { Changed slot 5 to be dimmed on Mark Twain. Changed slot 7 { to say "SCSI" instead of "Your Card" (you can also still set { 7 to AppleTalk). { { 1-Jul-91 DAL { { Commented out Mark Twain stuff. { {*****************************************************************} {$LongGlobals+} {$toolerrorchk-} {$a+} unit Slots; interface uses QDIntf, GSIntf, misctools, Prodos16, ResMgr, CDEVMgr, newinterface; function Slots_DEFPROC(message : Integer; data1, data2 : Longint) : Longint; procedure EnablePopupItem(ctlID : integer; item : integer); procedure DisablePopupItem(ctlID : integer; item : integer); procedure CheckPopupItems; implementation const { BParam ID Values } Slot1ID = $21; Slot2ID = $22; Slot3ID = $23; Slot4ID = $24; Slot5ID = $25; Slot6ID = $26; Slot7ID = $27; BootID = $28; { BParam Setting Values } Slot1Printer = 0; Slot1YourCard = 1; Slot1ATalk = 2; Slot1modem = 3; Slot2Modem = 0; Slot2YourCard = 1; Slot2ATalk = 2; Slot2Printer = 3; Slot7Appletalk = 0; Slot7YourCard = 1; { Control IDs are equal to setting values plus 1 } var OrigGS : boolean; wind : windowPtr; {$XRefVar+} GSSlotsList : integer; TenSpeedSlotsList : integer; { MarkTwainSlotsList : integer; } SlotsAbout : integer; {$XRefVar-} function Slots_DEFPROC(message : Integer; data1, data2 : Longint) : Longint; var tempCtl : ControlHandle; Atemp, XTemp, YTemp, PTemp : integer; slot1Item, slot2Item, popVal, slotSet : INTEGER; { added 10/23/91 by Monte Benaresh } procedure debug; inline $00; begin { this will only get called when a ctl is hit, and before its displayed } Slots_DEFPROC := 0; case message of CreateCDEV : begin FWEntry(Atemp,XTemp,YTemp,PTemp,$FE1F); OrigGS := YTemp < 2 ; wind := WindowPtr(data1); if OrigGS then tempCtl := NewControl2(wind,3,ord4(@GSSlotsList)) else { if YTemp=3 then } tempCtl := NewControl2(wind,3,ord4(@TenSpeedSlotsList)) { else tempCtl := NewControl2(wind,3,ord4(@MarkTwainSlotsList)) } ; end; InitCDEV : begin { for slots 1 & 2, on ROM 01 we set the popup item based on the actualÉ } {Éslot setting AND the device type of the corresponding port } IF OrigGS THEN BEGIN IF ReadBParam(Slot1ID) = Slot1YourCard THEN slot1Item := 2 { set to "your card" } ELSE { check port setting } IF ReadBParam($0) = 0 THEN { port 1 set to printer? } slot1Item := 1 ELSE slot1Item := 3; { set to modem } IF ReadBParam(Slot2ID) = Slot2YourCard THEN slot2Item := 2 { set to "your card" } ELSE { check port setting } IF ReadBParam($C) = 1 THEN { port 2 set to modem? } slot2Item := 1 ELSE slot2Item := 3; { set to printer } END ELSE BEGIN { set Tenspeed the easy way } slot1Item := ReadBParam(Slot1ID)+1; slot2Item := ReadBParam(Slot2ID)+1; END; SetCtlValue(slot1Item,GetCtlHandleFromID(WindowPtr(data1),1)); SetCtlValue(slot2Item,GetCtlHandleFromID(WindowPtr(data1),2)); { SetCtlValue(ReadBParam(Slot1ID)+1, GetCtlHandleFromID(WindowPtr(data1),1)); } { SetCtlValue(ReadBParam(Slot2ID)+1, GetCtlHandleFromID(WindowPtr(data1),2)); } SetCtlValue(ReadBParam(Slot3ID)+1,GetCtlHandleFromID(WindowPtr(data1),3)); SetCtlValue(ReadBParam(Slot4ID)+1,GetCtlHandleFromID(WindowPtr(data1),4)); SetCtlValue(ReadBParam(Slot5ID)+1,GetCtlHandleFromID(WindowPtr(data1),5)); SetCtlValue(ReadBParam(Slot6ID)+1,GetCtlHandleFromID(WindowPtr(data1),6)); SetCtlValue(ReadBParam(Slot7ID)+1,GetCtlHandleFromID(WindowPtr(data1),7)); SetCtlValue(ReadBParam(BootID)+1,GetCtlHandleFromID(WindowPtr(data1),8)); CheckpopupItems; end; HitCDEV : begin { for slots 1 & 2, on ROM 01 we must set the serial port device typeÉ } {Ébased on the popup menu item } IF OrigGS AND ((data2 = 1) OR (data2 = 2)) { check ctl ID } THEN BEGIN popVal := GetCtlValue(ControlHandle(data1)); CASE popVal OF 2: slotSet := 1; { set to "Your Card } 1,3: BEGIN slotSet := 0; { set to internal } IF data2 = 1 THEN { printer port? } BEGIN IF popVal = 1 THEN WriteBParam(0,0) { set to printer } ELSE WriteBParam(1,0); { set to modem } END ELSE BEGIN IF popVal = 3 THEN WriteBParam(0,$C) { set to printer } ELSE WriteBParam(1,$C); { set to modem } END; END; END; {case} WriteBParam(slotSet, $20 + loword(data2)); { set slot int/ext } END {begin} ELSE WriteBParam(GetCtlValue(ControlHandle(data1))-1, $20 + loword(data2)); CheckpopupItems; end; AboutCDEV : tempCtl := NewControl2(WindowPtr(data1),3,ord4(@SlotsAbout)); end; {case} end; procedure EnablePopupItem(ctlID : integer; item : integer); var mymenuBar : MenuBarHandle; begin mymenuBar := GetMenuBar; SetMenuBar(MenuBarHandle(GetCtlHandleFromID(wind,ctlID))); EnableMItem(item); SetMenuBar(mymenuBar); end; procedure DisablePopupItem(ctlID : integer; item : integer); var mymenuBar : MenuBarHandle; begin mymenuBar := GetMenuBar; SetMenuBar(MenuBarHandle(GetCtlHandleFromID(wind,ctlID))); DisableMItem(item); SetMenuBar(mymenuBar); end; procedure CheckPopupItems; var bytePtr : StringPtr; { saveit : integer; } tempHndl : ControlHandle; begin if OrigGS then begin { Assume every thing is ok by enabling appletalk in slot 7 pop up} EnablePopupItem(7,Slot7AppleTalk+1); { Now check if we have the case that AppleTalk is not allowed } if (ReadBParam(Slot1ID) = Slot1Printer) and (ReadBParam(Slot2ID) = Slot2Modem) then begin { Both slot 1 and 2 are set to internal so must disable appletalk in 7 } { and force the pop up to have your card. } DisablePopupItem(7,1); SetCtlValue(Slot7YourCard+1, GetCtlHandleFromID(wind,7)); WriteBParam(Slot7YourCard,slot7Id); end; end else begin EnablePopupItem(1,3); EnablePopupItem(2,3); EnablePopupItem(7,1); if ReadBParam($21) = 2 then DisablePopupItem(2,3) else if ReadBParam($22) = 2 then DisablePopupItem(1,3) else begin WriteBParam(1, $27); SetCtlValue(2, GetCtlHandleFromID(wind,7)); DisablePopupItem(7,1); end; end; if origGS then { case ReadBParam(slot1ID) of *** removed 10/24/91 by Monte Slot1Printer : writeBParam(0,0); (* start JAM 07/26/89: Fixing BRC #51944 *) Slot1YourCard : BEGIN (* writeBParam(1,0) *) END (* null statement *); (* In fixing BRC #51944, we leave slot 1 firmware alone when switching to Your Card. This helps those such as Remote Print Manager, who want to treat AppleTalk as a printer, but cannot unless the proper firmware is in place. Real solution to this problem is to rewrite printer port and modem port CDEVs to allow the user to change the type of device connected, and avoid switching the firmware in the slots CDEV at all. *) (* end JAM 07/26/89: Fixing BRC #51944 *) end } else case ReadBParam(slot1ID) of Slot1Printer : writeBParam(0,0); Slot1YourCard : writeBParam(3,0); Slot1ATalk : writeBParam(2,0); Slot1Modem : writeBParam(1,0); end; bytePtr := StringPtr($E102E1); { BRAM buffer starts at $E102C0 } if (ReadBParam(slot7ID) = Slot7Appletalk) and (ReadBParam(slot1ID) = slot1Atalk) then bytePtr^[0] := char(1) else bytePtr^[0] := char(0); if origGS then (* case ReadBParam(slot2ID) of *** removed 10/24/91 by Monte Slot2Modem : writeBParam(1,$C); Slot2YourCard : { writeBParam(0,$C) removed 10/21/91 by Monte } ; end *) else { TenSpeed } BEGIN case ReadBParam(Slot2ID) of Slot2Printer : writeBParam(0,$C); Slot2YourCard : writeBParam(3,$C); Slot2ATalk : writeBParam(2,$C); Slot2Modem : writeBParam(1,$C); end; { on TenSpeed check whether boot slot can be AppleTalk } IF (ReadBParam(slot1ID) <> Slot1ATalk) AND (ReadBParam(slot2ID) <> Slot2ATalk) THEN BEGIN { don't allow boot from AppleTalk } tempHndl := GetCtlHandleFromID(WindowPtr(wind),8); IF GetCtlValue(tempHndl) = 11 THEN BEGIN { must change setting } SetCtlValue(1, tempHndl); { set to "Scan" } WriteBParam(0, BootID); END; DisablePopupItem(8,11); { disable AppleTalk startup } END ELSE BEGIN { allow boot from AppleTalk } EnablePopupItem(8,11); { enable AppleTalk startup } END; END; end; end. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/Slots.r b/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/Slots.r new file mode 100644 index 0000000..cdfc64b --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/Slots.r @@ -0,0 +1 @@ +/*******************************************************************/ /* /* Slots.r /* /* Copyright (C) 1988-1992 /* Apple Computer, Inc. /* All Rights Reserved /* /* This file contains the source of the resources needed to build the /* Slots CDEV. /* /*******************************************************************/ #include "typesiigs.r" resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"FF00000000000000000000000FFF" $"FF0CCCCC0BBBBBBBBBBBBBBB0FFF" $"FF0CCCCC0B4B4B4B4B4B4B4B0FFF" $"FF0CCCCC0B4B4B4B4B4B4B4B0FFF" $"FF0CCCCC0B4B4B4B4B4B4B4B0FFF" $"FF0CCCCC0B4B4B4B4B4B4B4B0FFF" $"FF0CCCCC0BBBBBBBBBBBBBBB0FFF" $"FF0CCCCC0B0B00B00B0BB0BB0FFF" $"FF0000000B0B00B00B0BB0BB0FFF" $"FF0C0C0C0BBBBBBBBBB00BBB0FFF" $"FF00C0C00B00B0BB00B00BBB0FFF" $"FF0C0C0C0B00B0BB00B00B0B0FFF" $"FF00C0C00BBBBBBBBBB00B0B0FFF" $"FF0C0C0C0B0B0B0B00BBBB0B0FFF" $"FF00C0C00B0B0B0B00B0BB0B0FFF" $"FF0C0C0C0BBBBBBBBBBBBBBB0FFF" $"FF00000000000000000000000FFF" $"FF0FFFFFFFFFFFFFFFFFFFBF0FFF" $"FF0FFFFFFFFFFFFFFFFFFFBF0FFF" $"FF00000000000000000000000FFF", $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"00FFFFFFFFFFFFFFFFFFFFFFF000"; }; read rCDEVCode (1,Convert) "Slots.Load"; resource rCDEVFlags (1) { wantHit+wantInit+wantCreate +wantAbout+updateSSfromBRAM, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ {0,0,122,200}, /* DataRect */ "Slots", /* Name */ "Darryl Lovato", /* Author */ "v1.2"; /* VersStr */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/SlotsData.aii b/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/SlotsData.aii new file mode 100644 index 0000000..3742af2 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/SlotsData.aii @@ -0,0 +1 @@ + MarkTwain equ 0 blanks off string ASIS Slot1TenSpeed PROC EXPORT dc.w 9 dc.l 1 dc.w 2,5,14,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l Slot1MenuTenSpeed dc.w 1 Slot1menuTenSpeed dc.B '>> Slot #1:\H' dc.W 1 dc.B $0D dc.B '== Printer\IH' dc.W 1 dc.B $0D dc.B '== Your Card\H' dc.W 2 dc.B $0D dc.B '== AppleTalk\H' dc.W 3 dc.B $0D dc.B '== Modem\H' dc.W 4 dc.B $0D dc.B '.' ENDP Slot1GS PROC EXPORT dc.w 9 dc.l 1 dc.w 2,5,14,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l Slot1MenuGS dc.w 1 Slot1menuGS dc.B '>> Slot #1:\H' dc.W 1 dc.B $0D dc.B '== Printer\IH' dc.W 1 dc.B $0D dc.B '== Your Card\H' dc.W 2 dc.B $0D dc.B '== Modem\H' dc.W 3 dc.B $0D dc.B '.' ENDP Slot2TenSpeed PROC EXPORT dc.w 9 dc.l 2 dc.w 17,5,29,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l Slot2MenuTenSpeed dc.w 1 Slot2menuTenSpeed dc.B '>> Slot #2:\H' dc.W 2 dc.B $0D dc.B '== Modem\IH' dc.W 1 dc.B $0D dc.B '== Your Card\H' dc.W 2 dc.B $0D dc.B '== AppleTalk\H' dc.W 3 dc.B $0D dc.B '== Printer\H' dc.W 4 dc.B $0D dc.B '.' ENDP Slot2GS PROC EXPORT dc.w 9 dc.l 2 dc.w 17,5,29,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l Slot2MenuGS dc.w 1 Slot2menuGS dc.B '>> Slot #2:\H' dc.W 2 dc.B $0D dc.B '== Modem\IH' dc.W 1 dc.B $0D dc.B '== Your Card\H' dc.W 2 dc.B $0D dc.B '== Printer\H' dc.W 3 dc.B $0D dc.B '.' ENDP Slot3 PROC EXPORT dc.w 9 dc.l 3 dc.w 32,5,44,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l Slot3Menu dc.w 1 Slot3menu dc.B '>> Slot #3:\H' dc.W 3 dc.B $0D dc.B '== Text Display\IH' dc.W 1 dc.B $0D dc.B '== Your Card\H' dc.W 2 dc.B $0D dc.B '.' ENDP Slot4 PROC EXPORT dc.w 9 dc.l 4 dc.w 47,5,59,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l Slot4Menu dc.w 1 Slot4menu dc.B '>> Slot #4:\H' dc.W 4 dc.B $0D dc.B '== Mouse Port\IH' dc.W 1 dc.B $0D dc.B '== Your Card\H' dc.W 2 dc.B $0D dc.B '.' ENDP Slot5 PROC EXPORT dc.w 9 dc.l 5 dc.w 62,5,74,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l Slot5Menu dc.w 1 IF MarkTwain THEN export Slot5Dimmed Slot5Dimmed dc.w 9 dc.l 5 dc.w 62,5,74,195 dc.l $87000000 dc.w $FF40 dc.w $1004 dc.l 0 dc.w 70 dc.l Slot5Menu dc.w 1 ENDIF Slot5menu dc.B '>> Slot #5:\H' dc.W 5 dc.B $0D dc.B '== Smart Port\IH' dc.W 1 dc.B $0D dc.B '== Your Card\H' dc.W 2 dc.B $0D dc.B '.' ENDP Slot6 PROC EXPORT dc.w 9 dc.l 6 dc.w 77,5,89,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l Slot6Menu dc.w 1 Slot6menu dc.B '>> Slot #6:\H' dc.W 6 dc.B $0D dc.B '== Disk Port\IH' dc.W 1 dc.B $0D dc.B '== Your Card\H' dc.W 2 dc.B $0D dc.B '.' ENDP Slot7 PROC EXPORT dc.w 9 dc.l 7 dc.w 92,5,104,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l Slot7Menu dc.w 1 Slot7menu dc.B '>> Slot #7:\H' dc.W 7 dc.B $0D dc.B '== AppleTalk\H' dc.W 1 dc.B $0D dc.B '== Your Card\IH' dc.W 2 dc.B $0D dc.B '.' ENDP IF MarkTwain THEN Slot7SCSI PROC EXPORT ;for Mark Twain dc.w 9 dc.l 7 dc.w 92,5,104,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l Slot7Menu dc.w 1 Slot7menu dc.B '>> Slot #7:\H' dc.W 7 dc.B $0D dc.B '== AppleTalk\H' dc.W 1 dc.B $0D dc.B '== SCSI Port\IH' dc.W 2 dc.B $0D dc.B '.' ENDP ENDIF Startup PROC EXPORT dc.w 9 dc.l 8 dc.w 107,5,119,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l StartupMenu dc.w 1 Startupmenu dc.B '>> Startup:\H' dc.W 8 dc.B $0D dc.B '== Scan\IH' dc.W 1 dc.B $0D dc.B '== Slot #1\H' dc.W 2 dc.B $0D dc.B '== Slot #2\H' dc.W 3 dc.B $0D dc.B '== Slot #3\H' dc.W 4 dc.B $0D dc.B '== Slot #4\H' dc.W 5 dc.B $0D dc.B '== Slot #5\H' dc.W 6 dc.B $0D dc.B '== Slot #6\H' dc.W 7 dc.B $0D dc.B '== Slot #7\H' dc.W 8 dc.B $0D dc.B '== RAM Disk\H' dc.W 9 dc.B $0D dc.B '== ROM Disk\H' dc.W 10 dc.B $0D dc.B '.' ENDP StartupTenSpeed PROC EXPORT dc.w 9 dc.l 8 dc.w 107,5,119,195 dc.l $87000000 dc.w $0040 dc.w $1004 dc.l 0 dc.w 70 dc.l StartupMenuTenSpeed dc.w 1 Startupmenutenspeed dc.B '>> Startup:\H' dc.W 8 dc.B $0D dc.B '== Scan\IH' dc.W 1 dc.B $0D dc.B '== Slot #1\H' dc.W 2 dc.B $0D dc.B '== Slot #2\H' dc.W 3 dc.B $0D dc.B '== Slot #3\H' dc.W 4 dc.B $0D dc.B '== Slot #4\H' dc.W 5 dc.B $0D dc.B '== Slot #5\H' dc.W 6 dc.B $0D dc.B '== Slot #6\H' dc.W 7 dc.B $0D dc.B '== Slot #7\H' dc.W 8 dc.B $0D dc.B '== RAM Disk\H' dc.W 9 dc.B $0D dc.B '== ROM Disk\H' dc.W 10 dc.B $0D dc.B '== AppleTalk\H' dc.W 11 dc.B $0D dc.B '.' ENDP GSSlotsList PROC EXPORT dc.l Slot1GS dc.l Slot2GS dc.l Slot3 dc.l Slot4 dc.l Slot5 dc.l Slot6 dc.l Slot7 dc.l Startup dc.l 0 ENDP TenSpeedSlotsList PROC EXPORT dc.l Slot1TenSpeed dc.l Slot2TenSpeed dc.l Slot3 dc.l Slot4 dc.l Slot5 dc.l Slot6 dc.l Slot7 dc.l StartupTenSpeed dc.l 0 ENDP if MarkTwain then MarkTwainSlotsList PROC EXPORT dc.l Slot1TenSpeed dc.l Slot2TenSpeed dc.l Slot3 dc.l Slot4 dc.l Slot5Dimmed dc.l Slot6 dc.l Slot7SCSI dc.l StartupTenSpeed dc.l 0 ENDP EndIf About1 PROC EXPORT dc.w 8 dc.L 1 dc.w 38,5,138,280 dc.L $81000000 dc.w $0000 dc.w $1000 dc.L 0 dc.L TheText dc.w EndText-TheText string asis TheText dc.b 'The Slots Control Panel allows you to configure your slots. ' dc.b 'Each of the slots can be set to any of the devices that are ' dc.b 'compatible with it. The ÒstartupÓ item allows you to choose the slot ' dc.b 'in which your system will first expect to find the boot device.' EndText string pascal ENDP slotsAbout PROC EXPORT dc.l about1 dc.l 0 ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/makefile new file mode 100644 index 0000000..548cd9e --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SlotsCDEV/makefile @@ -0,0 +1 @@ + CDEV = SLOTS SpecialInterfaces = {PiigsInclude}ResMgr.USym ¶ {PiigsInclude}NewInterface.USym {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" {CDEV}.Load Ä ¶ {CDEV}.pii.aii.obj ¶ {CDEV}Data.aii.obj linkiigs ¶ -x -l -s >{CDEV}.map ¶ -lseg Darryl:$1000 ¶ {CDEV}.pii.aii.obj ¶ {CDEV}Data.aii.obj ¶ "{PIIGSLibrary}PIIGSRuntime.obj" ¶ -lib "{PIIGSLibrary}PIIGSRuntime.obj" ¶ -o {CDEV}.Load {CDEV}.pii.aii.obj Ä ¶ {CDEV}.pii ¶ {SpecialInterfaces} TMLPascal {CDEV}.pii asmiigs {CDEV}.pii.aii {CDEV}Data.aii.obj Ä ¶ {CDEV}Data.aii asmiigs {CDEV}Data.aii .USym Ä .pii set ThisDir `Directory` Directory {PiigsInclude} TMLPascal {default}.pii Directory {ThisDir} \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/ReqProc.Load b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/ReqProc.Load new file mode 100644 index 0000000..71c693a Binary files /dev/null and b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/ReqProc.Load differ diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/ReqProc.aii b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/ReqProc.aii new file mode 100644 index 0000000..8fa41c7 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/ReqProc.aii @@ -0,0 +1 @@ +*************************************************************** ************************************************************** * * ReqProc.aii -- AcceptRequests procedure for Sound CDev * by David A. Lyons * * Copyright 1991-92, Apple Computer, Inc. * All Rights Reserved * ************************************************************** ************************************************************** * * REVISION HISTORY * * 24-Jun-91 DAL * Borrowed skeleton from Noises init (by DAL). * * 21-Oct-91 DAL * Start putting some real guts in here. To set the sound * configuration handle, we now accept srqConfigSounds. * * 28..29-Oct-91 DAL * Got this thing working for real. * * 30-Oct-91 DAL (version 2.0b10) * In the SoundCPStdBeep routine (chained into BELLVECTOR), * if I can't handle the request I now chain to the old routine, * rather than RTLing with the carry set. * * 4-Nov-91 DAL * Accepts new request $8003, srqMakeStdBeep, which tries to * make the standard beep even if the system beep is remapped. * * 6-Nov-91 DAL * Add support for asynchronous sounds. * Accept srqHelloWorld for patching Sound tools, etc. * * 7-Nov-91 DAL * Calls SetDefaultTPT after patching Sound tools. * * 9-Nov-91 DAL * Make direct-page space high in bank 0, not low (just * for kicks). * * 19-Nov-91 DAL * FindSoundHandle returns SEC if handle is NIL. * Implemented srqGetrSoundSample (loads sounds from disk * as needed, when possible). * Forces sounds to be unlocked and not-purgeable when loaded. * * 21-Nov-91 DAL (2.0b14 for 6.0d59) * Loading a sound on the fly is now case-insensitive like it * was supposed to be (was mistakenly passing original name * through to RMFindNamedResource instead of using the one we * carefully stored in soundsHandle). * * 24-Jan-92 DAL (2.0b15 for 6.0d65) * When we play a sound handle, we now call SendRequest with * code srqPlayrSoundSample. This way if we can't play the * sound (because the Sound Tools are in use, for example), * then maybe somebody else can play it for us. * Visual indication of sounds now applies to certain SysBeep2 * codes as well as System Beep. It applies to codes 0..$F, * $30, $33, $50..$59, $0Exx, and $0Fxx (reserved). * * 25-Jan-92 DAL (2.0b16 for 6.0d66) * No visual indication of sounds assigned to silence. * Visual indication of SysBeep even if it's reassigned to a * sampled sound. * Visual indication comes after sound is started, not before, * and it's done locally (not through volume=0, SysBeep). * * 27-Jan-92 DAL (still for d66) * If a SysBeep or SysBeep2 happens while the stack is in the * $01xx page, we are running out of space & going ka-boom. * So now I preserve the stack while handling request $0006, * srqPlayrSoundSample. * ************************************************************** * * 2-Apr-92 DAL for 6.1d3 * * Fixed chopped-off Restart sound (WaitForSoundToFinish was * assuming the bank register was set). * * 7-Jul-92 DAL (2.1d6 for 6.0.1d6) * * Added srqConvertRelPitch ($8200). dataIn low = relPitch, * dataOut +002 = frequency value for FFStartSound. * * Made srqHelloWorld not do any damage on a redundant call. * ************************************************************** ************************************************************** DebugSymbols equ 0 include 'all.macros' include 'e16.locator' include 'e16.resources' srqSetSoundGlobals equ $8000 ;set data from dataIn srqGetSoundGlobals equ $8001 ;return info at dataIn srqMakeStdBeep equ $8003 ;play a standard beep srqHelloWorld equ $8100 ;initialize self srqConvertRelPitch equ $8200 ;convert relPitch to FFStartSound freq (6.0.1) ;--------------------------------------------------------------------- ; ; configHandle ; ; configHandle records mappings for all the sounds in the ; user's active set ; ; The format is exactly like an rTaggedStrings resource, mapping ; from events into strings. ; ; +000: Count ; +002: TagWord1 ; +004: PString1 ; +xxx: TagWord2 ; +yyy: PString2 ; +zzz: ... ; ; The strings are the names of Sound resources. ; There are a few special strings: ; "0" = silence ; "*" = standard beep ; ;--------------------------------------------------------------------- ; ; data structure for soundsHandle ; ; soundHandle records mappings for all the sounds appearing ; in the Sound pop-up ; ; IMPORTANT! The soundsHandle is locked while the Sound pop-up menu ; exists. The menu items are pointers into this handle. ; ;--------------------------------------------------------------------- oVersion equ 0 ;zero oEntryOffset equ 2 ;offset to the entry list oEntryCount equ 4 ;number of entries following HEADERSIZE equ 6 ; ; Each entry: ; oNextEntry equ 0 ;offset to next entry (from here) oNameHash equ 2 ;quick check against name oMenuItem equ 4 ;menu item number in Sounds pop-up oPathOffset equ 6 ;offset from entry to pathname (WString) (or zero) oNameOffset equ 8 ;offset from entry to resname (PString) (or zero) oSoundData equ 10 ;long sound data (for ex, handle to sound sample) ENTRYSIZE equ 14 ;(not including strings!) ; ; Values for Binding field (these match the menu item ; numbers for the first 3 items in the Sound pop-up). ; itemNotAssigned equ 1 itemSilence equ 2 itemStandardBeep equ 3 CLOCKCTL equ $C034 ; DFB 0 ;Clock control register VERTCNT EQU $C02E ; DFB 0 ;Addr for read of video cntr bits V5-VB ************************************************************** ************************************************************** * * SoundCPReqProc * * Plays user-selected sounds in reponse to systemSaysSound, * and responds to a few other request codes. * ************************************************************** SoundCPPermCode proc export ;DON'T NAME THIS PROC! brl SoundCPReqProc ;+0 brl SoundCPStdBeep ;+3 SoundCPReqProc name oldDPage equ 1 RTL1 equ 3 DataOut equ 6 DataIn equ 10 Request equ 14 Result equ 16 phd tsc tcd phb phk plb lda @requestTable pha ;preserve for interrupt lda $e102c0+$5e ;peek at BRAM location $5E lsr a bcs @noVisIndication *** Blink border for sounds 0..$F, $30, $33, $50..59, $0Exx, $0Fxx, maybe $FFFE ;;; lda $000100,x sta stackImage,x dex dex bpl @keepStack tsc inc a inc a sta theOldStackPtr plx lda #$01ff tcs phx @notPageOne rts * * RestoreTheStack -- preserves the Carry! * RestoreTheStack lda theOldStackPtr beq @noFutzing ply ;rts address php php pla sta pRegister sei ;preserve and disable interrupts & Carry flag ldx #$fe @restoreStack lda stackImage,x sta >$000100,x dex dex bpl @restoreStack lda theOldStackPtr tcs lda pRegister pha plp plp ;restore interrupt status and Carry flag phy ;rts address @noFutzing rts theOldStackPtr dc.w 0 ;zero means we didn't preserve the stack stackImage ds.b 256 pRegister dc.w 0 *** end 27-Jan-92 ************************************************************************* * * PlaySoundHandle * * Input: Handle to rSoundSample in AY * Special cases: * $00000001 = silence * $00000002 = standard beep * * Output: CLC if we played it * ************************************************************************* ; ; Format of an rSoundSample resource (handle) ; oFormat equ 0 oWaveSize equ 2 oRelPitch equ 4 oStereo equ 6 oSampleRate equ 8 oSound equ 10 PlaySoundHandle name import RelPitchAtoFreq tax bne @notSpecial ; ; Special case $00000001 = silence ; cpy #1 bne @notSilence clc rts ; ; Special case $00000002 = standard beep ; @notSilence cpy #2 bne @notSpecial inc StandardBeepKludge _SysBeep stz StandardBeepKludge clc rts @notSpecial phd pha phy pha phy tsc tcd @handle equ 1 @ptr equ 5 jsr StealSoundTools bcc @ok brl @exit ;return sec = fail @ok *** lock & dereference handle and set lda <@handle+2 ldy <@handle sta activeSoundHandle+2 sty activeSoundHandle ldy #4 lda [<@handle],y sta oldAttributes ora #$8000 sta [<@handle],y dey dey lda [<@handle],y sta <@ptr+2 tax lda [<@handle] sta <@ptr clc adc #oSound ;offset to sound data bcc @1 inx @1 stx ffSoundPtr+2 sta ffSoundPtr *** resource Format must be zero sec lda [<@ptr] ;sound Format must be 0 bne @stopAndExit *** set up wave size ldy #oWaveSize lda [<@ptr],y sta ffWaveSize *** set up the pitch ldy #oRelPitch lda [<@ptr],y ;;; bmi @relSubtract ;;; ;;; clc ;;; adc #$3C00 ;middle C (semitone 60) ;;; bra @getPitch ;;; ;;;@relSubtract and #$7FFF ;;; eor #$FFFF ;;; inc a ;negate ;;; adc #$3C00 ;middle C minus relPitch ;;; ;;;@getPitch jsr PitchToFreq *** 7-Jul-92 DAL -- Made into subroutine for new request handler jsr RelPitchAtoFreq *** end 7-Jul-92 sta ffFreq *** start the sound ldy #oStereo ;low nibble = channel number lda [<@ptr],y and #$000f xba asl a asl a asl a asl a ora #$0201 ;Generator 2, FFSynth pha pushlong #ffSoundBlock _FFStartSound bcs @stopAndExit ;;;*** wait until the sound is done playing ;;;@wait pha ;;; pea $0002 ;generator 2 ;;; _FFSoundDoneStatus ;;; pla ;;; beq @wait ;;; ;;;*** free up the generator ;;; pea $0004 ;;; _FFStopSound clc bra @exit @stopAndExit php jsr RelinquishSoundTools *** restore handle state ldy #4 lda oldAttributes sta [<@handle],y plp bra @exit @exit ply ;clc = played soiund ply ply ply pld rts activeSoundHandle dc.l 0 ;handle to the sound we're playing oldAttributes dc.w 0 ;old state of sound-sample handle ffSoundBlock ffSoundPtr dc.l 0 ffWaveSize dc.w 0 ;in pages ffFreq dc.w 0 ;frequency dc.w $8000 ;address in sound RAM dc.w $0006 ;use 16K DOC buffer dc.l 0 ;next wave (none) dc.w $00FF ;maximum volume ************************************************************** * * StealSoundTools * ************************************************************** StealSoundTools name lda StoleSoundTools beq @continue jsr RelinquishSoundTools @continue pea 0 _SoundToolStatus pla bne @fail ;somebody else using Sound tools pha pha pushlong #$0100 ;size = 1 page pha _MMStartUp ;my id pea $8015 ;dp attributes ldx #0 phx phx ;zero (bank) _NewHandle plx ply bcs @fail sty dpSoundHandle+2 stx dpSoundHandle phy phx phd tsc tcd lda [3] pha _SoundStartUp pld plx ply inc StoleSoundTools clc rts @fail sec rts ;StopSoundTools name ; _SoundShutDown ; pushlong dpSoundHandle ; _DisposeHandle ; stz dpSoundHandle+1 ; rts dpSoundHandle dc.l 0 stoleSoundTools dc.w 0 ************************************************************** * * WaitForSoundToFinish * * If interrupts are enabled, just wait until our sound * is done playing. * * BANK REGISTER IS NOT NECESSARILY SET! -- 2-Apr-92 DAL * ************************************************************** WaitForSoundToFinish name php php pla and #$0004 ;I bit bne @dontWait @busyWaiting lda >StoleSoundTools ;long addressing! (2-Apr-92 DAL) beq @dontWait pha pea $0002 ;generator 2 _FFSoundDoneStatus pla beq @busyWaiting @dontWait sec ;accept request rts ************************************************************** * * RelinquishSoundTools * * Stop playing my sound, shut down sound tools, dispose of * direct-page space, and clear the StoleSoundTools flag. * ************************************************************** RelinquishSoundTools name lda >StoleSoundTools beq @done phb phk plb pea $0004 ;generator 2 _FFStopSound ; unlock the previously-playing sound lda activeSoundHandle+1 beq @noSound phd pushlong activeSoundHandle tsc tcd ldy #4 lda [1],y asl a lsr a sta [1],y ply ply pld stz activeSoundHandle+1 @noSound _SoundShutDown pushlong dpSoundHandle _DisposeHandle stz dpSoundHandle+1 stz StoleSoundTools plb @done rts ************************************************************** ************************************************************** * * PatchSoundTools * ************************************************************** PatchSoundTools name pha pha pea 0 pea 8 _GetTSPtr phd tsc tcd lda [3] sta mySoundPatch pld ply ply pha pha pea 0 ;system tool pea $0608 ;SoundToolStatus _GetFuncPtr pla inc a sta oldSoundStatus+1 pla sep #$20 sta oldSoundStatus+3 rep #$20 pha pha pea 0 ;system tool pea $0208 ;SoundStartUp _GetFuncPtr pla inc a sta oldSoundStartUp+1 pla sep #$20 sta oldSoundStartUp+3 rep #$20 pea $0000 ;system tool pea $0008 ;Sound pushlong #mySoundPatch _SetTSPtr _SetDefaultTPT ;added 7-Nov-91 DAL rts mySoundPatch dc.l 0 ;function count (filled in) dc.l sBootInit-1 ;$0108 SoundBootInit dc.l sStartUp-1 ;$0208 SoundStartUp dc.l 0 ;$0308 SoundShutDown dc.l 0 ;$0408 SoundVersion dc.l 0 ;$0508 SoundReset dc.l sStatus-1 ;$0608 SoundToolStatus dc.l 0 ;$0708 dc.l 0 ;$0808 dc.l 0 ;$0908 WriteRamBlock dc.l 0 ;$0A08 ReadRamBlock dc.l 0 ;$0B08 GetTableAddress dc.l 0 ;$0C08 GetSoundVolume dc.l 0 ;$0D08 SetSoundVolume dc.l 0 ;$0E08 FFStartSound dc.l 0 ;$0F08 FFStopSound dc.l 0 ;$1008 FFSoundStatus dc.l 0 ;$1108 FFGeneratorStatus dc.l 0 ;$1208 SetSoundMIRQV dc.l 0 ;$1308 SetUserSoundIRQV dc.l 0 ;$1408 FFSoundDoneStatus dc.l 0 ;$1508 FFSetUpSound dc.l 0 ;$1608 FFStartPlaying dc.l 0 ;$1708 SetDocReg dc.l 0 ;$1808 ReadDocReg dc.l 0 ;$1908 expansion dc.l 0 ;$1A08 expansion dc.l 0 ;$1B08 expansion dc.l 0 ;$1C08 expansion dc.l 0 ;$1D08 expansion dc.l 0 ;$1E08 expansion dc.l 0 ;$1F08 expansion dc.l 0 ;$2008 expansion dc.l 0 ;$2108 expansion dc.l 0 ;$2208 expansion ************************************************************** * * SoundToolStatus patch -- If I have stolen the sound tools, * return FALSE. * ************************************************************** sStatus pha lda >StoleSoundTools beq @old pla lda #0 sta 7,s ;return status = false clc rtl @old pla oldSoundStatus jml >$777777 ************************************************************** * * SoundBootInit patch -- do nothing * ************************************************************** sBootInit lda #0 clc rtl ************************************************************** * * SoundStartUp patch -- give up the sound tools and pass * control to the real startup function. * ************************************************************** sStartUp pha phx phy jsr RelinquishSoundTools ply plx pla oldSoundStartUp jml >$777777 ************************************************************** ************************************************************** * * Install notify proc -- give up sound tools on switch to P8 * ************************************************************** InstallSoundNP name pushlong #notifyParms pea $2034 ;AddNotifyProc jsl $e100b0 rts notifyParms dc.w 1 dc.l myNotifyProc myNotifyProc dc.l 0 ;link (reserved) dc.w 0 ;reserved dc.w $a55a ;signature dc.l $00000022 ;event flags (shutdown, switch to P8) dc.l 0 ;event code SoundCPNotifyProc name jsr WaitForSoundToFinish jsr RelinquishSoundTools rtl ************************************************************************* ************************************************************************* * * convertRelPitch -- handle an srqConvertRelPitch request (new for 6.0.1) * * * Input: AY = dataIn value (Y = relPitch value) * * Output: sec to accept the request * dataOut: * +000: recvCount * +002: frequency for FFStartSound * ************************************************************************* convertRelPitch name import RelPitchAtoFreq tya jsr RelPitchAtoFreq ldy #2 sta [$777777 ;JML to old BELLVECTOR ENDGLOBALS ************************************************************************* resNameBuffer ds.b 256 resNameHash dc.w 0 EndP **************************************************************** * * RelPitchAtoFreq * * Input: * relPitch value in A * * Output: * FFStartSound frequenty value in A * **************************************************************** RelPitchAtoFreq procname export tay bmi @relSubtract clc adc #$3C00 ;middle C (semitone 60) bra @getPitch @relSubtract and #$7FFF eor #$FFFF inc a ;negate adc #$3C00 ;middle C minus relPitch @getPitch ;;; fall into PitchToFreq **************************************************************** * * PitchToFreq * * Inputs: Pitch word in A, full native mode * * Outputs: Freq word in A * * Uses: x and y * * * (Stolen from HyperCard IIgs 1.1, 23-Oct-91 DAL) * **************************************************************** export PitchToFreq PitchToFreq name octave equ 12*256 Adjust equ $07C8 ; 3 half steps, 41/128th step (Mark 341) clc adc #Adjust ldy #11 ; maximum octave count sec sbc #octave bmi hitbottom ploop dey ; keep subtracting octaves to sbc #octave ; find out how many bpl ploop hitbottom adc #octave ; went too far; back up. (carry was ok) * now the octave count is in y and the remainder is in a phy and #$FFFE tay lda freqtable,y ; lookup in top octave table * now we have the right pitch, but the wrong octave, in a ply dey bmi Pdone shift lsr A ; divide by two for each octave down dey bpl shift Pdone rts * the frequency table * for a doc clock of 892337.5 * middle c is 261.625565 Hz freqtable DC.W 20905,20914,20924,20933,20943,20952,20962,20971 ;0 DC.W 20981,20990,21000,21009,21018,21028,21037,21047 DC.W 21056,21066,21075,21085,21094,21104,21114,21123 DC.W 21133,21142,21152,21161,21171,21180,21190,21199 DC.W 21209,21219,21228,21238,21247,21257,21267,21276 DC.W 21286,21295,21305,21315,21324,21334,21343,21353 DC.W 21363,21372,21382,21392,21401,21411,21421,21430 DC.W 21440,21450,21459,21469,21479,21488,21498,21508 DC.W 21518,21527,21537,21547,21556,21566,21576,21586 DC.W 21595,21605,21615,21625,21634,21644,21654,21664 DC.W 21673,21683,21693,21703,21713,21722,21732,21742 DC.W 21752,21762,21772,21781,21791,21801,21811,21821 DC.W 21831,21840,21850,21860,21870,21880,21890,21900 DC.W 21909,21919,21929,21939,21949,21959,21969,21979 DC.W 21989,21999,22009,22019,22028,22038,22048,22058 DC.W 22068,22078,22088,22098,22108,22118,22128,22138 DC.W 22148,22158,22168,22178,22188,22198,22208,22218 ;1 DC.W 22228,22238,22248,22258,22268,22278,22288,22299 DC.W 22309,22319,22329,22339,22349,22359,22369,22379 DC.W 22389,22399,22409,22420,22430,22440,22450,22460 DC.W 22470,22480,22491,22501,22511,22521,22531,22541 DC.W 22551,22562,22572,22582,22592,22602,22613,22623 DC.W 22633,22643,22653,22664,22674,22684,22694,22705 DC.W 22715,22725,22735,22746,22756,22766,22777,22787 DC.W 22797,22807,22818,22828,22838,22849,22859,22869 DC.W 22880,22890,22900,22911,22921,22931,22942,22952 DC.W 22962,22973,22983,22993,23004,23014,23025,23035 DC.W 23045,23056,23066,23077,23087,23097,23108,23118 DC.W 23129,23139,23150,23160,23170,23181,23191,23202 DC.W 23212,23223,23233,23244,23254,23265,23275,23286 DC.W 23296,23307,23317,23328,23338,23349,23359,23370 DC.W 23381,23391,23402,23412,23423,23433,23444,23455 DC.W 23465,23476,23486,23497,23507,23518,23529,23539 ;2 DC.W 23550,23561,23571,23582,23593,23603,23614,23624 DC.W 23635,23646,23656,23667,23678,23689,23699,23710 DC.W 23721,23731,23742,23753,23763,23774,23785,23796 DC.W 23806,23817,23828,23839,23849,23860,23871,23882 DC.W 23893,23903,23914,23925,23936,23946,23957,23968 DC.W 23979,23990,24001,24011,24022,24033,24044,24055 DC.W 24066,24077,24087,24098,24109,24120,24131,24142 DC.W 24153,24164,24174,24185,24196,24207,24218,24229 DC.W 24240,24251,24262,24273,24284,24295,24306,24317 DC.W 24328,24339,24350,24361,24372,24383,24394,24405 DC.W 24416,24427,24438,24449,24460,24471,24482,24493 DC.W 24504,24515,24526,24537,24548,24559,24570,24582 DC.W 24593,24604,24615,24626,24637,24648,24659,24670 DC.W 24682,24693,24704,24715,24726,24737,24748,24760 DC.W 24771,24782,24793,24804,24816,24827,24838,24849 DC.W 24860,24872,24883,24894,24905,24917,24928,24939 ;3 DC.W 24950,24962,24973,24984,24995,25007,25018,25029 DC.W 25041,25052,25063,25075,25086,25097,25108,25120 ;1 DC.W 25131,25142,25154,25165,25177,25188,25199,25211 DC.W 25222,25233,25245,25256,25268,25279,25290,25302 ;2 DC.W 25313,25325,25336,25348,25359,25370,25382,25393 DC.W 25405,25416,25428,25439,25451,25462,25474,25485 ;3 DC.W 25497,25508,25520,25531,25543,25554,25566,25577 DC.W 25589,25600,25612,25624,25635,25647,25658,25670 ;4 DC.W 25681,25693,25705,25716,25728,25739,25751,25763 DC.W 25774,25786,25798,25809,25821,25833,25844,25856 DC.W 25868,25879,25891,25903,25914,25926,25938,25949 DC.W 25961,25973,25985,25996,26008,26020,26032,26043 DC.W 26055,26067,26079,26090,26102,26114,26126,26137 DC.W 26149,26161,26173,26185,26196,26208,26220,26232 DC.W 26244,26256,26268,26279,26291,26303,26315,26327 DC.W 26339,26351,26363,26374,26386,26398,26410,26422 ;4 DC.W 26434,26446,26458,26470,26482,26494,26506,26518 DC.W 26530,26542,26554,26566,26578,26590,26602,26614 DC.W 26626,26638,26650,26662,26674,26686,26698,26710 DC.W 26722,26734,26746,26758,26770,26782,26794,26806 DC.W 26818,26831,26843,26855,26867,26879,26891,26903 DC.W 26915,26928,26940,26952,26964,26976,26988,27001 DC.W 27013,27025,27037,27049,27062,27074,27086,27098 DC.W 27111,27123,27135,27147,27160,27172,27184,27196 DC.W 27209,27221,27233,27245,27258,27270,27282,27295 DC.W 27307,27319,27332,27344,27356,27369,27381,27393 DC.W 27406,27418,27431,27443,27455,27468,27480,27492 DC.W 27505,27517,27530,27542,27555,27567,27579,27592 DC.W 27604,27617,27629,27642,27654,27667,27679,27692 DC.W 27704,27717,27729,27742,27754,27767,27779,27792 DC.W 27804,27817,27829,27842,27855,27867,27880,27892 DC.W 27905,27918,27930,27943,27955,27968,27981,27993 ;5 DC.W 28006,28019,28031,28044,28056,28069,28082,28094 DC.W 28107,28120,28133,28145,28158,28171,28183,28196 DC.W 28209,28222,28234,28247,28260,28273,28285,28298 DC.W 28311,28324,28336,28349,28362,28375,28388,28400 DC.W 28413,28426,28439,28452,28465,28477,28490,28503 DC.W 28516,28529,28542,28555,28568,28580,28593,28606 DC.W 28619,28632,28645,28658,28671,28684,28697,28710 DC.W 28723,28736,28749,28762,28775,28788,28801,28814 DC.W 28827,28840,28853,28866,28879,28892,28905,28918 DC.W 28931,28944,28957,28970,28983,28996,29009,29022 DC.W 29035,29049,29062,29075,29088,29101,29114,29127 DC.W 29140,29154,29167,29180,29193,29206,29219,29233 DC.W 29246,29259,29272,29285,29299,29312,29325,29338 DC.W 29352,29365,29378,29391,29405,29418,29431,29444 DC.W 29458,29471,29484,29498,29511,29524,29538,29551 DC.W 29564,29578,29591,29604,29618,29631,29644,29658 ;6 DC.W 29671,29685,29698,29711,29725,29738,29752,29765 DC.W 29779,29792,29805,29819,29832,29846,29859,29873 DC.W 29886,29900,29913,29927,29940,29954,29967,29981 DC.W 29994,30008,30021,30035,30049,30062,30076,30089 DC.W 30103,30116,30130,30144,30157,30171,30184,30198 DC.W 30212,30225,30239,30253,30266,30280,30294,30307 DC.W 30321,30335,30348,30362,30376,30389,30403,30417 DC.W 30431,30444,30458,30472,30486,30499,30513,30527 DC.W 30541,30554,30568,30582,30596,30610,30623,30637 DC.W 30651,30665,30679,30693,30707,30720,30734,30748 DC.W 30762,30776,30790,30804,30818,30831,30845,30859 DC.W 30873,30887,30901,30915,30929,30943,30957,30971 DC.W 30985,30999,31013,31027,31041,31055,31069,31083 DC.W 31097,31111,31125,31139,31153,31167,31181,31195 DC.W 31209,31224,31238,31252,31266,31280,31294,31308 DC.W 31322,31336,31351,31365,31379,31393,31407,31421 ;7 DC.W 31436,31450,31464,31478,31492,31507,31521,31535 DC.W 31549,31564,31578,31592,31606,31621,31635,31649 DC.W 31663,31678,31692,31706,31721,31735,31749,31764 DC.W 31778,31792,31807,31821,31835,31850,31864,31878 DC.W 31893,31907,31922,31936,31950,31965,31979,31994 DC.W 32008,32023,32037,32052,32066,32080,32095,32109 DC.W 32124,32138,32153,32167,32182,32197,32211,32226 DC.W 32240,32255,32269,32284,32298,32313,32328,32342 DC.W 32357,32371,32386,32401,32415,32430,32444,32459 DC.W 32474,32488,32503,32518,32532,32547,32562,32577 DC.W 32591,32606,32621,32635,32650,32665,32680,32694 DC.W 32709,32724,32739,32753,32768,32783,32798,32813 DC.W 32827,32842,32857,32872,32887,32902,32916,32931 DC.W 32946,32961,32976,32991,33006,33021,33035,33050 DC.W 33065,33080,33095,33110,33125,33140,33155,33170 DC.W 33185,33200,33215,33230,33245,33260,33275,33290 ;8 DC.W 33305,33320,33335,33350,33365,33380,33395,33410 DC.W 33425,33440,33456,33471,33486,33501,33516,33531 DC.W 33546,33561,33577,33592,33607,33622,33637,33652 DC.W 33668,33683,33698,33713,33728,33744,33759,33774 DC.W 33789,33805,33820,33835,33850,33866,33881,33896 DC.W 33912,33927,33942,33957,33973,33988,34003,34019 DC.W 34034,34050,34065,34080,34096,34111,34126,34142 DC.W 34157,34173,34188,34204,34219,34234,34250,34265 DC.W 34281,34296,34312,34327,34343,34358,34374,34389 DC.W 34405,34420,34436,34451,34467,34483,34498,34514 DC.W 34529,34545,34560,34576,34592,34607,34623,34638 DC.W 34654,34670,34685,34701,34717,34732,34748,34764 DC.W 34779,34795,34811,34827,34842,34858,34874,34889 DC.W 34905,34921,34937,34953,34968,34984,35000,35016 DC.W 35031,35047,35063,35079,35095,35111,35126,35142 DC.W 35158,35174,35190,35206,35222,35238,35253,35269 ;9 DC.W 35285,35301,35317,35333,35349,35365,35381,35397 DC.W 35413,35429,35445,35461,35477,35493,35509,35525 DC.W 35541,35557,35573,35589,35605,35621,35637,35653 DC.W 35670,35686,35702,35718,35734,35750,35766,35782 DC.W 35799,35815,35831,35847,35863,35879,35896,35912 DC.W 35928,35944,35960,35977,35993,36009,36025,36042 DC.W 36058,36074,36091,36107,36123,36139,36156,36172 DC.W 36188,36205,36221,36237,36254,36270,36287,36303 DC.W 36319,36336,36352,36368,36385,36401,36418,36434 DC.W 36451,36467,36484,36500,36516,36533,36549,36566 DC.W 36582,36599,36615,36632,36649,36665,36682,36698 DC.W 36715,36731,36748,36765,36781,36798,36814,36831 DC.W 36848,36864,36881,36897,36914,36931,36947,36964 DC.W 36981,36998,37014,37031,37048,37064,37081,37098 DC.W 37115,37131,37148,37165,37182,37198,37215,37232 DC.W 37249,37266,37282,37299,37316,37333,37350,37367 ;10 DC.W 37384,37400,37417,37434,37451,37468,37485,37502 DC.W 37519,37536,37553,37570,37587,37603,37620,37637 DC.W 37654,37671,37688,37705,37722,37739,37757,37774 DC.W 37791,37808,37825,37842,37859,37876,37893,37910 DC.W 37927,37944,37962,37979,37996,38013,38030,38047 DC.W 38064,38082,38099,38116,38133,38150,38168,38185 DC.W 38202,38219,38237,38254,38271,38288,38306,38323 DC.W 38340,38358,38375,38392,38410,38427,38444,38462 DC.W 38479,38496,38514,38531,38548,38566,38583,38601 DC.W 38618,38636,38653,38670,38688,38705,38723,38740 DC.W 38758,38775,38793,38810,38828,38845,38863,38880 DC.W 38898,38916,38933,38951,38968,38986,39003,39021 DC.W 39039,39056,39074,39092,39109,39127,39145,39162 DC.W 39180,39198,39215,39233,39251,39268,39286,39304 DC.W 39322,39339,39357,39375,39393,39410,39428,39446 DC.W 39464,39482,39499,39517,39535,39553,39571,39589 ;11 DC.W 39606,39624,39642,39660,39678,39696,39714,39732 DC.W 39750,39768,39786,39804,39822,39840,39858,39876 DC.W 39894,39912,39930,39948,39966,39984,40002,40020 DC.W 40038,40056,40074,40092,40110,40128,40146,40164 DC.W 40183,40201,40219,40237,40255,40273,40292,40310 DC.W 40328,40346,40364,40383,40401,40419,40437,40456 DC.W 40474,40492,40510,40529,40547,40565,40584,40602 DC.W 40620,40638,40657,40675,40694,40712,40730,40749 DC.W 40767,40785,40804,40822,40841,40859,40878,40896 DC.W 40915,40933,40951,40970,40988,41007,41025,41044 DC.W 41062,41081,41100,41118,41137,41155,41174,41192 DC.W 41211,41230,41248,41267,41285,41304,41323,41341 DC.W 41360,41379,41397,41416,41435,41453,41472,41491 DC.W 41510,41528,41547,41566,41585,41603,41622,41641 DC.W 41660,41679,41697,41716,41735,41754,41773,41792 ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/SOUND b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/SOUND new file mode 100644 index 0000000..e69de29 diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sound.pii b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sound.pii new file mode 100644 index 0000000..5bb2e52 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sound.pii @@ -0,0 +1 @@ + This file has been replaced by sound.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sound.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sound.r new file mode 100644 index 0000000..acfb246 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sound.r @@ -0,0 +1 @@ +/******************************************************************* * * Sound.r * * Copyright (C) 1988-1992 * Apple Computer, Inc. * All Rights Reserved * * This file contains the source of the resources needed to build the * Sound Control Panel. * *******************************************************************/ #include "typesiigs.r" // --- type $8003 defines #define CTLLST_00000001 $00000001 #define CTLTMP_00000001 $00000001 #define CTLTMP_00000002 $00000002 #define CTLTMP_00000003 $00000003 #define CTLTMP_00000004 $00000004 #define CTLTMP_00000005 $00000005 #define CTLTMP_00000006 $00000006 #define CTLTMP_00000007 $00000007 #define CTLTMP_00000009 $00000009 #define CTLTMP_0000000A $0000000A // --- type $8006 defines #define PSTR_00000001 $00000001 #define PSTR_00000007 $00000007 #define PSTR_00000009 $00000009 #define PSTR_0000000A $0000000A #define PSTR_00000120 $00000120 #define PSTR_00000122 $00000122 #define PSTR_00000123 $00000123 #define PSTR_00000127 $00000127 // --- type $8009 defines #define MENU_00000001 $00000001 #define MENU_00000003 $00000003 #define MENU_00000004 $00000004 // --- type $800A defines #define MENUITEM_00000004 $00000004 #define MENUITEM_00000120 $00000120 #define MENUITEM_0000F001 $0000F001 #define MENUITEM_00000122 $00000122 #define MENUITEM_00000123 $00000123 #define MENUITEM_00000127 $00000127 // --- type $800B defines #define LETXTBOX_00000001 $00000001 #define LETXTBOX_00000002 $00000002 resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFF0FFFFFFFFFDFFFFFFF" $"FFFFFFFFF00FFFFFFFEFFDFFFFFF" $"FFFFFFFF0F0FFFFFAFFEFFDFFFFF" $"FFFFFFF0FF0FF7FFAFFEFFDFFFFF" $"FF00000FFF0FFF7FFAFFEFFDFFFF" $"F0FFFF0FFF0FFF7FFAFFEFFDFFFF" $"F0FFFF0FFF0FFF7FFAFFEFFDFFFF" $"F0FFFF0FFF0FFF7FFAFFEFFDFFFF" $"FF00000FFF0FFF7FFAFFEFFDFFFF" $"FFFFFFF0FF0FF7FFAFFEFFDFFFFF" $"FFFFFFFF0F0FFFFFAFFEFFDFFFFF" $"FFFFFFFFF00FFFFFFFEFFDFFFFFF" $"FFFFFFFFFF0FFFFFFFFFDFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF" $"FFFFFFFFFFFFFFFFFFFFFFFFFFFF", $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000F000000000F0000000" $"000000000FF0000000F00F000000" $"00000000FFF00000F00F00F00000" $"0000000FFFF00F00F00F00F00000" $"00FFFFFFFFF000F00F00F00F0000" $"0FFFFFFFFFF000F00F00F00F0000" $"0FFFFFFFFFF000F00F00F00F0000" $"0FFFFFFFFFF000F00F00F00F0000" $"00FFFFFFFFF000F00F00F00F0000" $"0000000FFFF00F00F00F00F00000" $"00000000FFF00000F00F00F00000" $"000000000FF0000000F00F000000" $"0000000000F000000000F0000000" $"0000000000000000000000000000" $"0000000000000000000000000000" $"0000000000000000000000000000"; }; read rCDEVCode (1,Convert) "Sound.Load"; read rCodeResource(1,Convert) "ReqProc.Load"; resource rCDEVFlags (1) { wantHit+wantInit+wantCreate+wantAbout+ updateSSfromBRAM+wantBoot+wantClose+ wantRun+wantEvents+wantEdit, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ {0,0,142-5-40,300}, /* DataRect */ "Sound", /* Name */ "Dave Lyons", /* Author */ "v2.1"; /* VersStr */ }; // --- Control List Definitions resource rControlList (CTLLST_00000001, preload) { { CTLTMP_00000001, // control 1 CTLTMP_00000002, // control 2 CTLTMP_00000003, // control 3 CTLTMP_00000004, // control 4 CTLTMP_00000005, // control 5 CTLTMP_00000009, // control 9 CTLTMP_0000000A, // control 10 }; }; // --- Control Templates // Volume scroller resource rControlTemplate (CTLTMP_00000002, preload) { $00000001, // ID { 6, 20, 19,196+20}, // rect ScrollControl {{ $001C, // flag $1002, // moreFlags $00000000, // refCon $0010, // maxSize $0002, // viewSize $0000, // initialValue 0 // colorTableRef }}; }; // Pitch scroller resource rControlTemplate (CTLTMP_00000001, preload) { $00000002, // ID { 23, 20, 36,196+20}, // rect ScrollControl {{ $001C, // flag $1002, // moreFlags $00000000, // refCon $0010, // maxSize $0002, // viewSize $0000, // initialValue 0 // colorTableRef }}; }; // Pitch label resource rControlTemplate (CTLTMP_00000003, preload) { $00000003, // ID { 25,206+20,34,253+20}, // rect statTextControl {{ $0004, // flag $1002, // moreFlags $00000000, // refCon LETXTBOX_00000001, // textRef 0, // textSize $0000 // just }}; }; resource rTextForLETextBox2 (LETXTBOX_00000001, preload) { "Pitch" }; // Volume label resource rControlTemplate (CTLTMP_00000004, preload) { $00000004, // ID { 8,206+20,18,271+20}, // rect statTextControl {{ $0004, // flag $1002, // moreFlags $00000000, // refCon LETXTBOX_00000002, // textRef 0, // textSize $0000 // just }}; }; resource rTextForLETextBox2 (LETXTBOX_00000002, preload) { "Volume" }; // Check box "Visual Indication of Sounds" resource rControlTemplate (CTLTMP_00000005, preload) { $00000005, // ID { 43, 20, 53,282}, // rect checkControl {{ $0000, // flag $3002, // moreFlags $00000000, // refCon PSTR_00000001, // titleRef $0000, // initialValue 0, // colorTableRef {"G","g",$0000,$0000} // key equivalents }}; }; resource rPString (PSTR_00000001, preload) { "Give visual indication of sounds" }; // ******************************************************************* // // Event pop-up // // ******************************************************************* resource rControlTemplate (CTLTMP_00000009, preload) { $00000009, // ID { 61, 36, 73, 265}, // rect popUpControl {{ $0042, // flag $1082, // moreFlags $00000000, // refCon $0000, // titleWidth MENU_00000003, // menuRef $FFFE, // initialValue 0 // colorTableRef }}; }; resource rMenu (MENU_00000003, preload) { $0001, // menuID $A000, // menuFlag PSTR_00000007, { // menuTitleRef MENUITEM_00000127, MENUITEM_00000120 /* divider */ }; }; resource rPString (PSTR_00000007, preload) { " Event " }; // System Beep resource rMenuItem (MENUITEM_00000127, preload) { $FFFE, // itemID "","", // itemChar, itemAltChar NIL, // itemCheck $8000, // itemFlag PSTR_00000127 // itemTitleRef }; resource rPString (PSTR_00000127, preload) { "System Beep" }; /* rTaggedStrings(1) lists the event names for the Event pop-up, in order of appearance, with their corresponding SysBeep2 codes. */ resource rTaggedStrings(1,preload,locked,fixed) {{ $0050, "Attention", $0033, "Bad disk", $0008, "Bad keypress", $0009, "Bad input value", $0004, "CanÕt click there", $0054, "Caution alert", $0014, "Disk ejected", $0013, "Disk inserted", $0030, "Disk request", $0043, "Empty trash", $0042, "Fill trash", $000A, "Input field full", $0053, "Note alert", $0052, "Stop alert", $0031, "System startup", $0015, "System shutdown", $0005, "Task completed", $000C, "Task failed", $000B, "Task impossible", $0041, "Whoosh closed", $0040, "Whoosh open", $0100, "You Have Mail" }}; // ******************************************************************* // // Sound pop-up // // ******************************************************************* resource rControlTemplate (CTLTMP_0000000A, preload) { $0000000A, // ID { 77, 36, 89, 265}, // rect popUpControl {{ $0042, // flag $1082, // moreFlags $00000000, // refCon $0000, // titleWidth MENU_00000004, // menuRef $0001, // initialValue 0 // colorTableRef }}; }; resource rMenu (MENU_00000004, preload) { $0001, // menuID $A000, // menuFlag PSTR_00000009, { // menuTitleRef MENUITEM_00000123, /* "Not assigned" */ MENUITEM_00000120, /* ------- */ MENUITEM_00000122, /* Silence */ MENUITEM_00000004, /* Standard Beep */ MENUITEM_0000F001 /* ------- */ }; }; resource rPString (PSTR_00000009, preload) { " Sound " }; resource rMenuItem (MENUITEM_00000120, preload) { $F000, // itemID "","", // itemChar, itemAltChar NIL, // itemCheck $8080, // itemFlag PSTR_00000120 // itemTitleRef }; // Item F001--dividing line that I kill if there are no sounds resource rMenuItem (MENUITEM_0000F001, preload) { $F001, // itemID "","", // itemChar, itemAltChar NIL, // itemCheck $8080, // itemFlag PSTR_00000120 // itemTitleRef }; resource rPString (PSTR_00000120, preload) { "-" }; // Not Assigned (1) resource rMenuItem (MENUITEM_00000123, preload) { $0001, // itemID "","", // itemChar, itemAltChar NIL, // itemCheck $8000, // itemFlag PSTR_00000123 // itemTitleRef }; resource rPString (PSTR_00000123, preload) { "Not assigned" }; // Silence (2) resource rMenuItem (MENUITEM_00000122, preload) { $0002, // itemID "","", // itemChar, itemAltChar NIL, // itemCheck $8000, // itemFlag PSTR_00000122 // itemTitleRef }; resource rPString (PSTR_00000122, preload) { "Silence" }; // Standard Beep (3) resource rMenuItem (MENUITEM_00000004, preload) { $0003, // itemID "","", // itemChar, itemAltChar NIL, // itemCheck $8000, // itemFlag PSTR_0000000A // itemTitleRef }; resource rPString (PSTR_0000000A, preload) { "Standard Beep" }; // // --- obsolete stuff // // resource rPString (PSTR_00000003, preload) { " Sound In " }; // resource rPString (PSTR_00000004, preload) { "Apple Mic. Jack" }; // resource rPString (PSTR_00000107, preload) { "Sound Exp. Pins" }; // // Record... button // resource rControlTemplate (CTLTMP_00000006, preload) { // $00000006, // ID // {121-4, 80,135-4,218}, // rect // simpleButtonControl {{ // $0000, // flag // $3002, // moreFlags // $00000000, // refCon // PSTR_00000002, // titleRef // 0, // colorTableRef // {"R","r",$0000,$0000} // key equivalents // }}; // }; // // resource rPString (PSTR_00000002, preload) { "Record Sound..." }; // // // Sound Input pop-up // resource rControlTemplate (CTLTMP_00000007, preload) { // $00000007, // ID // { 62-1, 16, 0, 0}, // rect // popUpControl {{ // $0002, // flag // $1082, // moreFlags // $00000000, // refCon // $0000, // titleWidth // MENU_00000001, // menuRef // $0107, // initialValue // 0 // colorTableRef // }}; // }; // // resource rMenu (MENU_00000001, preload) { // $0001, // menuID // $A000, // menuFlag // PSTR_00000003, { // menuTitleRef // MENUITEM_00000001, // MENUITEM_00000107 // }; // }; // // resource rMenuItem (MENUITEM_00000001, preload) { // $0001, // itemID // "","", // itemChar, itemAltChar // NIL, // itemCheck // $8000, // itemFlag // PSTR_00000004 // itemTitleRef // }; // // resource rMenuItem (MENUITEM_00000107, preload) { // $0107, // itemID // "","", // itemChar, itemAltChar // NIL, // itemCheck // $8002, // itemFlag // PSTR_00000107 // itemTitleRef // }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/SoundData.aii b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/SoundData.aii new file mode 100644 index 0000000..db2727e --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/SoundData.aii @@ -0,0 +1 @@ +******************************************************************* ; ; SoundData - data for the Sound CDEV. ; ; Michael V. Stein 03/21/90. ; ; © Copyright Apple Computer, 1990. ; ; 9-Mar-91 DAL--added 'g' and 'G' key equivs to check box ; ; DAL--moved most of this stuff to the .r file (control templates) ; ; 30-Oct-91 DAL ; Edited the help text to for sound-remapping features. ; ******************************************************************* blanks off string ASIS soundAbout PROC EXPORT dc.w 8 dc.l 1 dc.w 38,5,138,280 dc.l $81000000 dc.w $0000 dc.w $1000 dc.l 0 dc.l TheText dc.w EndText-TheText string asis TheText dc.b 'The Sound Control Panel lets you change the pitch of the ' dc.b 'standard beep and the volume of all sounds.',13,13 ; dc.b 'The check box is for use with software applications that can ' ; dc.b 'provide visual cues to substitute for sound.' dc.b 'To assign a sound to an event, first choose the event from ' dc.b 'the Event menu, and then choose a sound from the Sound ' dc.b 'menu. Sounds are stored in the Sounds folder inside the ' dc.b 'System folder.' EndText string pascal ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Ahh.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Ahh.r new file mode 100644 index 0000000..0d6387e --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Ahh.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 0F00 0000 0341 6868" /* ...........Ahh */ }; data $8024 (0xF) { $"0000 3D00 E88E 0000 772B 8080 8080 8080" /* ..=..Ž..w+€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" /* ................ */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" /* ................ */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" /* ................ */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" /* ................ */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" /* ................ */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" /* ................ */ $"7F7F 7F7F 7F7F 7F7F 7E7E 7E7E 7E7E 7E7F" /* ........~~~~~~~. */ $"8081 8181 8080 8080 8080 7F7E 7E7D 7C7B" /* €���€€€€€€.~~}|{ */ $"7A79 797A 7C7F 8283 8484 8384 8483 8281" /* zyyz|.‚ƒ„„ƒ„„ƒ‚� */ $"8080 7F7E 7C79 7673 7374 787C 8083 8586" /* €€.~|yvsstx|€ƒ…† */ $"8787 8685 8380 8080 807F 7B76 716E 6D70" /* ‡‡†…ƒ€€€€.{vqnmp */ $"7478 7C80 8387 898B 8B88 8687 888A 8B88" /* tx|€ƒ‡‰‹‹ˆ†‡ˆŠ‹ˆ */ $"827C 7774 7476 787C 7E80 8488 8B8D 8C8A" /* ‚|wttvx|~€„ˆ‹�ŒŠ */ $"8B8C 8E8F 8C86 7E76 7270 706F 6F70 6F70" /* ‹ŒŽ�Œ†~vrppoopop */ $"7273 7474 7478 7E83 8888 847F 7A78 797C" /* rstttx~ƒˆˆ„.zxy| */ $"7E7F 7F7D 7A79 7673 6F70 747B 848C 8F8D" /* ~..}zyvsopt{„Œ�� */ $"8885 8283 888E 969B 9C9B 9991 8880 7876" /* ˆ…‚ƒˆŽ–›œ›™‘ˆ€xv */ $"777B 8080 7B74 6E6A 696C 6E70 7578 7C80" /* w{€€{tnjilnpux|€ */ $"7E7C 7B79 7D85 8E95 9590 8A82 7A74 7270" /* ~|{y}…Ž••�Š‚ztrp */ $"6D6E 7173 7677 746C 6664 646B 747D 868C" /* mnqsvwtlfddkt}†Œ */ $"8F91 9396 9590 8F91 9497 9793 8D87 8382" /* �‘“–•��‘”——“�‡ƒ‚ */ $"888E 908C 8174 6961 5D5E 636D 7883 8C8E" /* ˆŽ�Œ�tia]^cmxƒŒŽ */ $"8A80 7775 7577 7D82 7F7B 7876 787E 878E" /* Š€wuuw}‚.{xvx~‡Ž */ $"8D89 8681 7B77 7371 7376 7D85 8987 827B" /* �‰†�{wsqsv}…‰‡‚{ */ $"7775 777A 7A78 777A 7E82 898D 8C8C 8B87" /* wuwzzxwz~‚‰�ŒŒ‹‡ */ $"888B 8D8D 8B86 8281 7C77 7472 7476 797E" /* ˆ‹��‹†‚�|wtrtvy~ */ $"7D76 7070 6F74 8087 8885 7F76 7477 7D85" /* }vppot€‡ˆ….vtw}… */ $"8A8C 8D8B 887F 726D 6F75 7F8A 908E 897F" /* ŠŒ�‹ˆ.rmou.Š�މ. */ $"7675 787D 8282 7F7A 746F 6D6C 6E73 7880" /* vux}‚‚.ztomlnsx€ */ $"8B92 9492 9090 8F91 9393 8C84 7F78 7473" /* ‹’”’���‘““Œ„.xts */ $"706C 6666 6C76 838F 9493 8879 6D64 5D5B" /* plfflvƒ�”“ˆymd][ */ $"5D69 7580 8A8F 8C8A 8C92 9AA4 ACA9 A091" /* ]iu€Š�ŒŠŒ’𤬩 ‘ */ $"8275 7172 7274 787A 7B7A 7166 605D 616B" /* ‚uqrrtxz{zqf`]ak */ $"757D 7D79 7574 767F 8A90 9497 9494 989B" /* u}}yutv.Š�”—””˜› */ $"9B9C 978D 8780 766D 6768 6B6F 7577 736B" /* ›œ—�‡€vmghkouwsk */ $"645F 5E65 6B6F 767A 7B85 919C A6AE B0AE" /* d_^ekovz{…‘œ¦®°® */ $"AAA1 968A 7D72 6B68 6663 6160 6063 707D" /* ª¡–Š}rkhfca``cp} */ $"868D 918B 827C 7979 7C7F 7F7D 7873 6F6E" /* †�‘‹‚|yy|..}xson */ $"7078 8292 A3AC B2B1 A69A 9186 8080 807C" /* px‚’£¬²±¦š‘†€€€| */ $"746B 6159 5251 5258 646F 7781 8788 8C8E" /* tkaYRQRXdow�‡ˆŒŽ */ $"8E90 918F 8A84 837F 7978 756E 6E73 7A82" /* Ž�‘�Š„ƒ.yxunnsz‚ */ $"919D 9D99 917E 6F66 5E5C 6166 6B73 797B" /* ‘��™‘~of^\afksy{ */ $"7C7C 808A 93A2 B3BB C0C2 B6A3 947E 6960" /* ||€Š“¢³»À¶£”~i` */ $"5D5C 6267 6560 5C54 5153 5967 7681 8785" /* ]\bge`\TQSYgv�‡… */ $"7F7A 7574 7E8B 959E A8A6 9E96 8B81 7A75" /* .zut~‹•ž¨¦ž–‹�zu */ $"7A81 8892 9B9A 9893 897C 6C5F 5B5A 585C" /* z�ˆ’›š˜“‰|l_[ZX\ */ $"6464 6464 6569 7079 8D9F AFBC BEB7 A898" /* ddddeipy�Ÿ¯¼¾·¨˜ */ $"897A 7474 797D 786F 685E 5151 6074 8797" /* ‰ztty}xoh^QQ`t‡— */ $"A19D 8D7A 6B5F 5A63 7280 8B90 9291 8F8D" /* ¡��zk_Zcr€‹�’‘�� */ $"96A3 A9AB AEAE A595 897E 7569 5E53 443A" /* –£©«®®¥•‰~ui^SD: */ $"3738 3A40 4A5C 6D7C 8B9A A6AD B1B2 B1A9" /* 78:@J\m|‹š¦­±²±© */ $"9C91 8E8B 898B 9294 8B7F 7876 7475 7D7F" /* œ‘Ž‹‰‹’”‹.xvtu}. */ $"7771 6A5D 514E 5563 6E7A 868A 837A 7A82" /* wqj]QNUcnz†Šƒzz‚ */ $"8A9A B1C2 C8BF AF99 806B 6468 6B6C 7473" /* Šš±ÂÈ¿¯™€kdhklts */ $"634F 3D34 323D 5670 7F89 9193 8F8A 8F9D" /* cO=42=Vp.‰‘“�Š�� */ $"A9B2 B8BC B6A7 9686 786A 6772 7F85 8E95" /* ©²¸¼¶§–†xjgr.…Ž• */ $"9692 867A 6E62 5858 5C56 4F4F 4F4E 515A" /* –’†znbXX\VOOONQZ */ $"687B 8CA1 B7BF BFC1 BFB5 A796 8780 7971" /* h{Œ¡·¿¿Á¿µ§–‡€yq */ $"6C63 5249 4B4D 5460 7386 9395 9694 897C" /* lcRIKMT`s†“•–”‰| */ $"7773 6F72 7B82 898A 93A1 A7AE B4B7 B4AB" /* wsor{‚‰Š“¡§®´·´« */ $"A197 8875 6869 6454 4D45 3726 1F27 3547" /* ¡—ˆuhidTME7&.'5G */ $"627A 8E9B A0A8 AEB2 BEC9 C9BE B1A6 937A" /* bzŽ› ¨®²¾Éɾ±¦“z */ $"6663 6D76 8089 887D 6F62 5A55 5863 7079" /* fcmv€‰ˆ}obZUXcpy */ $"7E7F 7B75 7272 7476 7D88 97A0 A1A9 B4BD" /* ~.{urrtv}ˆ— ¡©´½ */ $"BAB0 A18A 7362 5D58 5350 4D44 3C3F 4653" /* º°¡Šsb]XSPMD+. */ $"0F13 2434 465E 798A 949F AABB CCDB E2DB" /* ..$4F^yŠ”Ÿª»Ì... */ $"CFBA 9B80 706A 6E71 7277 8383 7469 6260" /* Ϻ›€pjnqrwƒƒtib` */ $"6060 6265 686E 7371 7178 736F 7985 97AB" /* ``behnsqqxsoy…—« */ $"B7BE C5C5 B8A5 9A92 8676 675A 4A38 2F25" /* ·¾ÅŸ¥š’†vgZJ8/% */ $"1F27 3444 6184 A4B2 AEA6 9C8E 8385 93A4" /* .'4Da„¤²®¦œŽƒ…“¤ */ $"BBC5 BCB1 A08C 796C 6E7A 8284 8484 7C78" /* »Å¼± Œylnz‚„„„|x */ $"7569 666E 6E6C 7172 6D62 5B54 4F53 5D70" /* uifnnlqrmb[TOS]p */ $"8497 A4A1 9A94 8D89 8A8B 96A7 B1AC 9E8A" /* „—¤¡š”�‰Š‹–§±¬žŠ */ $"7762 4F44 434C 596E 8390 9288 8078 7278" /* wbODCLYnƒ�’ˆ€xrx */ $"878E 8986 837A 7479 8A9C B0C3 CBCC C0AC" /* ‡Ž‰†ƒztyŠœ°ÃËÌÀ¬ */ $"947E 746C 6462 5D50 4234 271C 1D26 2A39" /* ”~tldb]PB4'..&*9 */ $"5168 809A B1C5 D5DE E0DF DDD6 C4AC 9587" /* Qh€š±ÅÕ....ÖĬ•‡ */ $"7A70 6A64 6261 5E5C 5C5A 5652 5153 5864" /* zpjdba^\\ZVRQSXd */ $"717D 8893 9790 8C8C 8B93 A3B1 C1CC C6B0" /* q}ˆ“—�ŒŒ‹“£±ÁÌÆ° */ $"9A8D 7E6D 6662 5848 3622 1412 1D2E 4A6E" /* š�~mfbXH6"....Jn */ $"90A7 B5B5 ACA4 A0A4 ABB5 BEC4 C1B5 A189" /* �§µµ¬¤ ¤«µ¾ÄÁµ¡‰ */ $"6F60 5F6A 747B 807F 7B73 6B6D 7173 7472" /* o`_jt{€.{skmqstr */ $"6D69 6765 6767 6465 6970 7A87 949A 9995" /* migeggdeipz‡”𙕠*/ $"9189 8584 8A92 9AA4 A29B 8F7A 665A 5252" /* ‘‰…„В𤢛�zfZRR */ $"5968 7478 7977 6F68 6268 7587 9AA3 A5A2" /* Yhtxywohbhu‡š£¥¢ */ $"968C 8C92 9FB0 C1C4 B9A8 917B 6C66 6866" /* –ŒŒ’Ÿ°ÁŨ‘{lfhf */ $"6460 5545 311F 1315 2437 4A62 788B 9BAB" /* d`UE1...$7Jbx‹›« */ $"BACB DCE8 EFEF E8D8 C0A5 8F7E 6B57 473C" /* ºË.....ØÀ¥�~kWG< */ $"312D 2F37 424C 5767 737E 8D98 9DA5 AEAB" /* 1-/7BLWgs~�˜�¥®« */ $"A397 8983 8991 9FB2 BEBF B7A4 8D74 5949" /* £—‰ƒ‰‘Ÿ²¾¿·¤�tYI */ $"423A 3838 2C25 2327 344A 6C93 B1C7 CEC7" /* B:88,%#'4Jl“±ÇÎÇ */ $"BCB2 AEAC B0B8 B4AC A190 7F6E 605F 626D" /* ¼²®¬°¸´¬¡�.n`_bm */ $"777A 7973 6C66 6772 7778 7F7C 767A 7C79" /* wzyslfgrwx.|vz|y */ $"7777 7B7A 7876 7677 706E 747C 8891 979D" /* ww{zxvvwpnt|ˆ‘—� */ $"9FA0 9FA1 9C91 887B 675A 5656 5554 5B60" /* Ÿ Ÿ¡œ‘ˆ{gZVVUT[` */ $"646B 7179 868D 93A1 ABAB A8A4 A2A4 A3A6" /* dkqy†�“¡««¨¤¢¤£¦ */ $"ACA9 9E95 8570 6564 6462 6364 615C 554B" /* ¬©ž•…peddbcda\UK */ $"4135 2928 3343 5566 7C90 A4BB D5EC F8FE" /* A5)(3CUf|�¤»Õ... */ $"FFF8 E1C3 A37E 5738 251D 1C23 313C 4956" /* ...ã~W8%..#15+% */ $"2C3B 4A5F 778E A4B2 B9BE BBB4 ACA4 9E99" /* ,;J_wޤ²¹¾»´¬¤ž™ */ $"9B9B 9895 9591 8E86 796D 5D51 4F56 616A" /* ››˜••‘ކym]QOVaj */ $"6F73 7471 7384 949F A6A3 9988 7464 5B57" /* ostqs„”Ÿ¦£™ˆtd[W */ $"5E6E 7F8C 8B87 7F72 6F76 8593 999D 9E98" /* ^n.Œ‹‡.rov…“™�ž˜ */ $"8F85 7C74 6860 5C5B 5C5A 5859 5A64 7289" /* �…|th`\[\ZXYZdr‰ */ $"A2B0 B8BC B6B0 ACAE ABA1 9584 7772 6E72" /* ¢°¸¼¶°¬®«¡•„wrnr */ $"7977 726C 6663 5F5A 585B 6165 655D 4A3D" /* ywrlfc_ZX[aee]J= */ $"3C48 6180 9CB3 C5CD D3D8 D9D9 D4BC 9F87" /* JXfqyvuy{~ */ $"878F 9491 877C 7067 6A73 8090 9CA9 B2B1" /* ‡�”‘‡|pgjs€�œ©²± */ $"B0A8 9D90 847B 726A 686B 757E 8896 9B94" /* °¨��„{rjhku~ˆ–›” */ $"8E8C 8B8D 98A1 A29F 9484 7563 5957 5755" /* ŽŒ‹�˜¡¢Ÿ”„ucYWWU */ $"4E42 3427 222B 435E 7897 AFB1 AA9E 8E81" /* NB4'"+C^x—¯±ªžŽ� */ $"7C87 959E A3A2 9C91 8176 7275 808E 9AA2" /* |‡•ž£¢œ‘�vru€Žš¢ */ $"A3A1 9E9C 9A9C 9D93 867C 7062 5550 515C" /* £¡žœšœ�“†|pbUPQ\ */ $"6A77 899A 9F9B 9284 715F 4D41 3D43 4D57" /* jw‰šŸ›’„q_MA=CMW */ $"6065 6868 6569 768A 97A4 B4BA B8B1 ABA3" /* `ehheivŠ—¤´º¸±«£ */ $"9992 8B85 827D 7468 5F60 6C81 9DB3 C0C5" /* ™’‹…‚}th_`l��³ÀÅ */ $"B8A1 8C7D 726B 7485 8883 7867 5445 3A38" /* ¸¡Œ}rkt…ˆƒxgTE:8 */ $"4355 6571 7574 6E6B 7075 7781 8885 817E" /* CUequtnkpuw�ˆ…�~ */ $"7974 7177 889F B5C5 C9C1 AC93 7E75 7070" /* ytqwˆŸµÅÉÁ¬“~upp */ $"7B87 8E94 948B 7E70 6A6A 6D77 8496 A2A3" /* {‡Ž””‹~pjjmw„–¢£ */ $"A19A 9188 807A 7266 5645 342C 292D 3645" /* ¡š‘ˆ€zrfVE4,)-6E */ $"5E75 8692 9698 928A 8C96 A1AD B6B8 B0A3" /* ^u†’–˜’ŠŒ–¡­¶¸°£ */ $"927F 7068 6973 7D8A 999F 9D93 9094 9393" /* ’.phis}Š™Ÿ�“�”““ */ $"938E 7F6D 6260 636B 7784 8F96 9894 856E" /* “Ž.mb`ckw„�–˜”…n */ $"574A 4648 5467 6F68 5F55 4842 4A5A 6C7E" /* WJFHTgoh_UHBJZl~ */ $"8F9E ABB4 B9BE BEBD BDBD B8A4 8B74 635A" /* �ž«´¹¾¾½½½¸¤‹tcZ */ $"5760 6D73 7E8D 9495 918B 837E 838E 989D" /* W`ms~�”•‘‹ƒ~ƒŽ˜� */ $"9A92 8677 6B5F 5855 4F4D 5359 5D64 696B" /* š’†wk_XUOMSY]dik */ $"6A6A 6B6C 6D71 7471 6F76 7D86 97A4 AEB7" /* jjklmqtqov}†—¤®· */ $"B8B3 AB9E 9188 878D 969F 9B90 8274 6D68" /* ¸³«ž‘ˆ‡�–Ÿ›�‚tmh */ $"6771 7A7F 8384 8380 7E80 8690 9697 907E" /* gqz.ƒ„ƒ€~€†�–—�~ */ $"6753 4239 3B48 5560 686B 6765 6464 6E7D" /* gSB9;HU`hkgeddn} */ $"8FA2 B4C1 B9AA 9A8B 8180 868D 9295 9289" /* �¢´Á¹ªš‹�€†�’•’‰ */ $"847F 7777 7C80 848C 9494 918C 857D 7C7F" /* „.ww|€„Œ””‘Œ…}|. */ $"8086 8F90 8E87 7765 5650 5055 646F 6E6A" /* €†��އweVPPUdonj */ $"6152 4441 4752 667C 8A96 A3A7 A4A3 A7AD" /* aRDAGRf|Š–£§¤£§­ */ $"B4BA BFB9 AFA3 8C7A 736A 6060 6263 6568" /* ´º¿¹¯£Œzsj``bceh */ $"6F76 7E8C 959B 9C9A 938A 8380 8082 7F79" /* ov~Œ•›œš“Šƒ€€‚.y */ $"746E 6869 6E77 7974 6F65 523F 383A 4457" /* tnhinwytoeR?8:DW */ $"6B7D 898F 9598 99A1 A9B3 BFBE BAB7 ADA2" /* k}‰�•˜™¡©³¿¾º·­¢ */ $"968C 8174 7274 7374 7778 7876 7678 7877" /* –Œ�trtstwxxvvxxw */ $"767A 7C7A 7A78 746D 6564 6569 7683 8786" /* vz|zzxtmedeivƒ‡† */ $"8077 685A 585E 6C7B 8996 988E 8279 7372" /* €whZX^l{‰–˜Ž‚ysr */ $"7F93 9FA5 A8A1 948A 8884 7F82 8C95 958C" /* .“Ÿ¥¨¡”Šˆ„.‚Œ••Œ */ $"8071 6B6E 7486 979D A2A3 988C 8175 6B64" /* €qknt†—�¢£˜Œ�ukd */ $"6563 5C58 534F 4D4B 4E57 5F65 696D 757C" /* ec\XSOMKNW_eimu| */ $"808B 9599 9DA1 A4A6 ADB3 B5B0 ACA6 9C8F" /* €‹•™�¡¤¦­³µ°¬¦œ� */ $"8376 6E66 6667 6769 645F 646A 747F 878D" /* ƒvnffggid_djt.‡� */ $"9294 9492 8B89 8985 8789 8A89 8681 7C75" /* ’””’‹‰‰…‡‰Š‰†�|u */ $"6F68 6057 4A3C 3230 3642 5062 7486 9AA7" /* oh`WJ<206BPbt†š§ */ $"B2BA C3CD CFCB C3B5 A38C 7C78 7C83 8584" /* ²ºÃÍÏËõ£Œ|x|ƒ…„ */ $"7F78 726E 6B6B 6B6B 7171 6D6A 6660 5F65" /* .xrnkkkkqqmjf`_e */ $"6B71 7B82 888B 8385 8D8E 9192 8E89 837E" /* kq{‚ˆ‹ƒ…�Ž‘’މƒ~ */ $"766E 675F 5F60 626D 7070 767D 8897 A0A5" /* vng__`bmppv}ˆ— ¥ */ $"A5A0 9E9D 9B99 968D 7F76 706C 737A 818B" /* ¥ ž�›™–�.vplsz�‹ */ $"9397 9C9E 9B94 8A7F 7365 5A51 453C 3837" /* “—œž›”Š.seZQE<87 */ $"4156 6777 8486 868A 8D90 8E8A 8C93 9A9F" /* AVgw„††Š��ŽŠŒ“šŸ */ $"A09B 9694 969B A4A1 978D 7C6B 676B 6B69" /*  ›–”–›¤¡—�|kgkki */ $"696C 6D6D 7379 7976 7271 7A87 919A 9E9B" /* ilmmsyyvrqz‡‘šž› */ $"9695 9A9C 9A9D 978B 7F74 6552 4034 2E2F" /* –•šœš�—‹.teR@4./ */ $"3540 5158 5965 7A8F A2B4 BBBA BCBE BDB8" /* 5@QXYez�¢´»º¼¾½¸ */ $"AFA6 9A8F 9095 9594 9082 736A 655E 5D5E" /* ¯¦š��••”�‚sje^]^ */ $"5B57 585F 656B 6F70 7277 7D82 898E 8D88" /* [WX_ekoprw}‚‰Ž�ˆ */ $"8888 8B94 9EA0 A09E 988A 7A68 4F3F 393D" /* ˆˆ‹”ž  ž˜ŠzhO?9= */ $"4E60 686C 6F74 8092 A5B6 BCBD B9AC 9C8D" /* N`hlot€’¥¶¼½¹¬œ� */ $"8278 777E 858A 8B89 827A 787E 8995 9B97" /* ‚xw~…Š‹‰‚zx~‰•›— */ $"8773 6153 4841 3C3F 454F 5F6C 757B 7E81" /* ‡saSHA.+3>O_jt.‰ */ $"98A4 ACB3 AD9F 9896 9596 9AA5 ABAB A795" /* ˜¤¬³­Ÿ˜–•–𥫫§• */ $"7A60 4B4A 5B73 8B9B 9E93 7E69 594B 484E" /* z`KJ[s‹›ž“~iYKHN */ $"5255 5758 5859 5F72 8CA4 BBC5 C1B6 A390" /* RUWXXY_rŒ¤»ÅÁ¶£� */ $"837F 8894 9EA4 9E92 816A 584D 484C 586D" /* ƒ.ˆ”ž¤ž’�jXMHLXm */ $"818A 9092 8C86 817B 7267 6364 7180 8E9D" /* �Š�’Œ†�{rgcdq€Ž� */ $"ABAF B0B6 B9B2 A79C 8A73 5945 3C38 3C49" /* «¯°¶¹²§œŠsYE<8=Lj�²Ì..Ñ */ $"C9C1 B5AB A79E 958D 8174 6A60 5A5F 6669" /* ÉÁµ«§ž•��tj`Z_fi */ $"6861 5447 3E3F 4C61 7A8E 9EA4 9F98 918A" /* haTG>?LazŽž¤Ÿ˜‘Š */ $"8683 8690 9AA4 ADB1 ADA0 9284 7463 5341" /* †ƒ†�𤭱­ ’„tcSA */ $"322B 2C37 4A5C 6B7E 919D A4AA ABA6 A19E" /* 2+,7J\k~‘�¤ª«¦¡ž */ $"A0A7 AEB3 B1A9 9B87 766C 625D 5F62 6772" /*  §®³±©›‡vlb]_bgr */ $"818B 8B83 786D 655F 5A52 483E 3A46 5A6E" /* �‹‹ƒxme_ZRH>:FZn */ $"879E AEBA C1BF B7A9 9689 8584 8891 958E" /* ‡ž®ºÁ¿·©–‰…„ˆ‘•Ž */ $"877E 7369 6058 5B5E 5F69 7882 8584 7D75" /* ‡~si`X[^_ix‚…„}u */ $"7171 767D 8489 8E91 949B A1A4 A9AF B3B1" /* qqv}„‰Ž‘”›¡¤©¯³± */ $"A38D 7156 433C 404C 5B63 625C 5345 3B38" /* £�qVC<@L[cb\SE;8 */ $"4258 748C 9EAF C0CA D1D9 E0DE D4C6 B195" /* BXtŒž¯ÀÊÑ...ÔÆ±• */ $"8273 6762 5F5C 574F 4A49 4A4E 565F 686F" /* ‚sgb_\WOJIJNV_ho */ $"7478 7D84 898E 969A 9995 8D85 8588 93A4" /* tx}„‰Ž–š™•�……ˆ“¤ */ $"B0B7 B9AD 977E 6550 4039 3633 3234 3B48" /* °·¹­—~eP@96324;H */ $"5C72 8DA6 BAC8 CABF B4AD ABB2 B8B2 A89A" /* \r�¦ºÈÊ¿´­«²¸²¨š */ $"846D 5D56 555A 6470 7A82 827C 746E 6E6F" /* „m]VUZdpz‚‚|tnno */ $"7071 6D64 5648 3F46 5870 8BA1 AFB5 B1AA" /* pqmdVH?FXp‹¡¯µ±ª */ $"A9A5 A1A3 A3A1 9D92 857A 726C 655F 5B59" /* ©¥¡££¡�’…zrle_[Y */ $"5554 5C6B 7B88 908F 8982 7D7C 7E83 8D93" /* UT\k{ˆ��‰‚}|~ƒ�“ */ $"908C 8881 8088 939F A9A9 A298 8973 6257" /* �Œˆ�€ˆ“Ÿ©©¢˜‰sbW */ $"5256 5A5B 584A 3C34 3037 485E 7893 ABBD" /* RVZ[XJ<407H^x“«½ */ $"CAD3 DAE0 E1DA D0C1 AD98 8371 6053 4A41" /* ÊÓ....ÐÁ­˜ƒq`SJA */ $"3A3A 3F4B 5862 6B73 777C 8080 7F80 7F7E" /* ::?KXbksw|€€.€.~ */ $"7E7E 7E84 8A8E 98A5 AAAF B4B6 B2A8 9986" /* ~~~„ŠŽ˜¥ª¯´¶²¨™† */ $"7059 4430 2626 2C37 4452 5F6E 8496 A8B8" /* pYD0&&,7DR_n„–¨¸ */ $"C3C9 CCD0 CFC3 B3A1 8E7B 6F69 6360 5D58" /* ÃÉÌÐÏó¡Ž{oic`]X */ $"5459 6673 7A7C 7D7B 7B7B 7874 6E66 5E59" /* TYfsz|}{{{xtnf^Y */ $"5250 5661 7289 9DAB B5BA BAB3 ACA9 ACAE" /* RPVar‰�«µºº³¬©¬® */ $"ADA3 8F76 5D46 3937 3B4B 5E6F 7E87 8A88" /* ­£�v]F97;K^o~‡Šˆ */ $"8079 7E88 949F A095 8675 6A68 6E7B 8A94" /* €y~ˆ”Ÿ •†ujhn{Š” */ $"9DA4 A6A4 9F95 8B82 796E 665D 534A 433A" /* �¤¦¤Ÿ•‹‚ynf]SJC: */ $"3432 343A 485F 7C9C BCDB EAE6 DACC BDB8" /* 424:H_|œ¼....̽¸ */ $"BAB8 B2A8 906E 5034 2221 3047 5F73 8384" /* º¸²¨�nP4"!0G_sƒ„ */ $"7566 5F5D 6578 8D96 9184 7A72 717A 8A9F" /* uf_]ex�–‘„zrqzŠŸ */ $"B3BC BEBC B4AB A49A 8A78 675A 4A39 2E29" /* ³¼¾¼´«¤šŠxgZJ9.) */ $"2E38 4656 626A 7586 9CB8 D4E6 E9DD C4A9" /* .8FVbju†œ¸Ô...Ä© */ $"988E 8B86 7D72 675B 5148 464C 586B 8090" /* ˜Ž‹†}rg[QHFLXk€� */ $"9895 8B7A 6D69 6C6D 685E 534C 4D59 718F" /* ˜•‹zmilmh^SLMYq� */ $"A8B7 C1C5 C3C2 C0BA B0A4 9787 745D 4330" /* ¨·ÁÅÃÂÀº°¤—‡t]C0 */ $"2A33 475F 747D 7D7B 787C 8696 A6AB A194" /* *3G_t}}{x|†–¦«¡” */ $"887F 756A 6468 707C 8D9A A1A3 A0A0 A19F" /* ˆ.ujdhp|�š¡£  ¡Ÿ */ $"9D94 8169 4F3F 3D3F 3F3F 3C36 3343 627E" /* �”�iO?=???<63Cb~ */ $"99B8 CCD4 D5D2 CEC9 C0B6 B1AD A38F 7354" /* ™¸ÌÔÕÒÎÉÀ¶±­£�sT */ $"3829 3147 5C6F 7672 6860 636B 7277 7776" /* 8)1G\ovrh`ckrwwv */ $"7676 7779 7C81 8A9A AAB5 B6AF A59D 9A9F" /* vvwy|�Ššªµ¶¯¥�šŸ */ $"A3A2 977C 5D47 3D38 3B40 413E 4049 5563" /* £¢—|]G=8;@A>@IUc */ $"7A92 A8C1 D5DF E3DC C5AC 9C90 8985 7E6B" /* z’¨ÁÕ...Ŭœ�‰…~k */ $"5244 434B 5A67 7075 7678 8188 8C89 7F75" /* RDCKZgpuvx�ˆŒ‰.u */ $"695C 524A 4548 5771 91AC BCC2 C0BB BCC5" /* i\RJEHWq‘¬¼ÂÀ»¼Å */ $"D0CF BFA4 7C55 3B2B 272D 3846 586A 7982" /* ÐÏ¿¤|U;+'-8FXjy‚ */ $"8381 848D 98A6 AFAC 9D88 766D 6E70 7275" /* ƒ�„�˜¦¯¬�ˆvmnpru */ $"7579 899A A4A8 A59D 948A 847F 7565 554C" /* uy‰š¤¨¥�”Š„.ueUL */ $"4641 3F3D 3C40 4F6B 8BA3 B4BB B6AF AEB2" /* FA?=<@Ok‹£´»¶¯®² */ $"BBC3 C6C3 B7A2 8A73 5B46 3C3C 4A5B 676D" /* »ÃÆÃ·¢Šs[F<EJMR\ixˆ™¨µ½¹ */ $"A791 7D6D 676C 747B 7D7B 7A7A 7D86 9196" /* §‘}mglt{}{zz}†‘– */ $"999A 9590 8A80 7569 5C55 504E 4D49 4C56" /* ™š•�Š€ui\UPNMILV */ $"657C 92A0 A7A9 A7A8 B2BD C4C5 B9A2 8A72" /* e|’ §©§¨²½ÄŹ¢Šr */ $"6058 575E 6870 7474 6C5F 5856 5A6A 7D84" /* `XW^hpttl_XVZj}„ */ $"847B 7066 6167 7581 8C95 9DA6 ACAE ACAC" /* „{pfagu�Œ•�¦¬®¬¬ */ $"AAA8 A9A9 9C89 7560 4B48 4E50 483D 3633" /* ª¨©©œ‰u`KHNPH=63 */ $"3C53 6B82 99A7 ACB0 B4B7 BFCA CFCE C4AD" /* :BUgsqkdcly‚ */ $"8682 7566 5C58 5B65 7383 9AAD B5BA B8B4" /* †‚uf\X[esƒš­µº¸´ */ $"B4B6 BBBB AF99 7B5A 4038 3C40 474F 5152" /* ´¶»»¯™{Z@8<@GOQR */ $"5760 7287 99A9 B6B7 AD9D 8978 6F70 7B8A" /* W`r‡™©¶·­�‰xop{Š */ $"9291 897A 6D68 707D 858A 8D8D 8A84 817F" /* ’‘‰zmhp}…Š��Š„�. */ $"7C7A 7770 665A 4C45 4A55 6A85 989E A0A1" /* |zwpfZLEJUj…˜ž ¡ */ $"A1A7 B5BF BFB4 9F88 715E 585E 6874 7C7C" /* ¡§µ¿¿´Ÿˆq^X^ht|| */ $"7368 5C52 5460 748C 9792 846F 5B52 5665" /* sh\RT`tŒ—’„o[RVe */ $"7789 959D A4A9 AAAA ADAE ACAA A698 8674" /* w‰•�¤©ªª­®¬ª¦˜†t */ $"6255 5255 5856 514C 484C 5A67 727C 8488" /* bURUXVQLHLZgr|„ˆ */ $"90A1 B3C2 CED2 CBBD A588 715F 5456 606B" /* �¡³ÂÎÒ˽¥ˆq_TV`k */ $"7372 695B 5051 5E6D 7A82 8179 7169 666D" /* sri[PQ^mz‚�yqifm */ $"7881 8C99 9E9F 9F9C 9DA3 A8AE B0A9 9E8D" /* x�Œ™žŸŸœ�£¨®°©ž� */ $"7665 5C56 514D 4743 464E 5C70 8393 9D9F" /* ve\VQMGCFN\pƒ“�Ÿ */ $"A09D 9895 9291 9596 928A 7F70 615C 5D65" /*  �˜•’‘•–’Š.pa\]e */ $"717C 868C 9091 8E89 8887 827A 7064 5B55" /* q|†Œ�‘މˆ‡‚zpd[U */ $"4F51 5D6B 7A88 929A A4AB B0AF A69D 9488" /* OQ]kzˆ’𤫰¯¦�”ˆ */ $"7E79 797C 807F 7A73 6A63 6262 6874 7D83" /* ~yy|€.zsjcbbht}ƒ */ $"857E 7368 6568 6E75 7E86 8C8E 8C87 8488" /* …~shehnu~†ŒŽŒ‡„ˆ */ $"8E95 9EA5 A8A4 988B 817B 7673 716E 675A" /* Ž•ž¥¨¤˜‹�{vsqngZ */ $"4D45 4244 4A56 6984 9EB1 BBC0 BFB8 AEA4" /* MEBDJVi„ž±»À¿¸®¤ */ $"9E98 9189 7E74 6A5F 595C 6064 6D76 7B7B" /* ž˜‘‰~tj_Y\`dmv{{ */ $"766E 6764 6970 777E 8386 847E 7E85 8C93" /* vngdipw~ƒ†„~~…Œ“ */ $"9CA7 AFB1 ADA3 9380 746F 6D6C 7071 6D69" /* œ§¯±­£“€tomlpqmi */ $"645F 5C58 575E 6B7A 8996 A0A4 A3A2 A19F" /* d_\XW^kz‰– ¤£¢¡Ÿ */ $"9D9C 9B90 7E6C 5B4C 474C 5A6C 8297 A5A8" /* �œ›�~l[LGLZl‚—¥¨ */ $"9F90 7F73 6F72 7679 7872 6A62 5C5B 6472" /* Ÿ�.sorvyxrjb\[dr */ $"8396 A9B4 B7B1 A79B 908B 8A85 7C72 655B" /* ƒ–©´·±§›�‹Š…|re[ */ $"585C 626B 7278 828D 8F8A 847C 716A 6A6E" /* X\bkrx‚��Š„|qjjn */ $"7479 8187 8A8F 948F 867E 7A7C 8590 999D" /* ty�‡Š�”�†~z|…�™� */ $"9A8F 8886 8179 7067 5F57 5253 5559 5F6A" /* š�ˆ†�ypg_WRSUY_j */ $"7A8E A3B2 B5AD A399 979C 9F9C 9284 756B" /* zŽ£²µ­£™—œŸœ’„uk */ $"6762 5A57 5A60 6872 787C 7D7D 7B7F 8587" /* gbZWZ`hrx|}}{.…‡ */ $"8177 6D66 6875 8690 9699 9A9D A4A9 A499" /* �wmfhu†�–™š�¤©¤™ */ $"8C80 7771 7070 6C67 6667 6A71 726C 645E" /* Œ€wqpplgfgjqrld^ */ $"6472 8392 9EA5 A4A1 A0A0 9C93 897F 766E" /* drƒ’ž¥¤¡  œ“‰.vn */ $"6864 605A 585C 6576 8B96 9792 8B86 8282" /* hd`ZX\ev‹–—’‹†‚‚ */ $"827A 7471 6E6D 7273 6B66 6771 8295 A7B1" /* ‚ztqnmrskfgq‚•§± */ $"B4B0 A69D 9385 776C 6969 6B70 746F 6562" /* ´°¦�“…wliikptoeb */ $"646A 7A8D 9B9C 9287 7B71 6B6A 7076 7C85" /* djz�›œ’‡{qkjpv|… */ $"8E8F 8A80 746F 6E77 8DA0 A8AA A696 8273" /* Ž�Š€tonw� ¨ª¦–‚s */ $"6960 5959 5E63 6463 5F59 575F 728B A9C1" /* i`YY^cdc_YW_r‹©Á */ $"D0D0 C2AF 9E8D 8078 7475 7676 756E 6053" /* ÐЯž�€xtuvvun`S */ $"4B4F 6074 8C9E A19D 8F7A 685F 606A 7481" /* KO`tŒž¡��zh_`jt� */ $"8D95 9692 8980 7C81 8C9B A4A2 9887 7463" /* �•–’‰€|�Œ›¤¢˜‡tc */ $"5955 5760 6972 7B7C 7975 706D 6F7A 8C9D" /* YUW`ir{|yupmozŒ� */ $"A7AE B2AD A498 887C 7572 706E 6A64 6261" /* §®²­¤˜ˆ|urpnjdba */ $"5D5C 6570 8299 AAB3 AFA0 917F 6F67 6261" /* ]\ep‚™ª³¯ ‘.ogba */ $"676B 6B69 6968 676E 7B8B 9FB0 B5B0 A392" /* gkkiihgn{‹Ÿ°µ°£’ */ $"8174 7075 7A7D 7E78 6F68 676A 7481 8B93" /* �tpuz}~xohgjt�‹“ */ $"9591 8A7F 7167 666D 767D 7D7C 766F 707A" /* •‘Š.qgfmv}}|vopz */ $"8692 9EA4 A49F 9892 8D84 7B73 6A62 5E59" /* †’ž¤¤Ÿ˜’�„{sjb^Y */ $"5048 4449 5765 7482 8F9E ADBD C7C8 C3B3" /* PHDIWet‚�ž­½ÇÈó */ $"9D88 7B76 7672 6C66 615C 5A5B 6169 7688" /* �ˆ{vvrlfa\Z[aivˆ */ $"969B 988B 7969 605F 6A7C 8C96 9588 7A74" /* –›˜‹yi`_j|Œ–•ˆzt */ $"767E 8895 A1A8 A495 816D 5B53 5560 6B74" /* v~ˆ•¡¨¤•�m[SU`kt */ $"7876 706E 747C 8693 9C9E 9FA1 9E9A 9690" /* xvpnt|†“œžŸ¡žš–� */ $"8880 7770 6D6B 6B6E 6E6C 6866 6A70 788B" /* ˆ€wpmkknnlhfjpx‹ */ $"A1AD B4B3 A792 7B6A 5F5C 5B5C 6263 6060" /* ¡­´³§’{j_\[\bc`` */ $"5F5E 6676 8FA5 AEAE ABA2 978C 8682 8285" /* _^fv�¥®®«¢—Œ†‚‚… */ $"8988 7F74 6E70 7276 828D 8D85 7E79 7573" /* ‰ˆ.tnprv‚��…~yus */ $"7677 7064 5D5E 656C 7B8E 9FA9 A9A5 9E97" /* vwpd]^el{ŽŸ©©¥ž— */ $"9797 9592 8C84 7965 4E3E 3B42 4A56 6266" /* ——•’Œ„yeN>;BJVbf */ $"666B 7887 98AB BEC6 C6C0 B49F 8E80 7778" /* fkx‡˜«¾ÆÆÀ´ŸŽ€wx */ $"7A79 7469 5F5F 636D 7A86 9090 8473 6966" /* zyti__cmz†��„sif */ $"646A 777F 8485 817C 7775 7B85 8E98 A1A1" /* djw.„…�|wu{…Ž˜¡¡ */ $"9485 7971 7074 7A7D 756A 6769 6B6E 747D" /* ”…yqptz}ujgiknt} */ $"8787 8283 8586 8F9B A19E 9A90 8173 6E72" /* ‡‡‚ƒ…†�›¡žš��snr */ $"7A81 8381 7461 565B 6C80 98AD B9B5 A28D" /* z�ƒ�taV[l€˜­¹µ¢� */ $"7B6D 645E 6166 6865 5E53 474A 5A6B 7F98" /* {md^afhe^SGJZk.˜ */ $"AEB6 B0A7 9F98 8F8C 8E8D 8987 8580 7A74" /* ®¶°§Ÿ˜�ŒŽ�‰‡…€zt */ $"6F6E 6F6D 6F75 787A 7F81 7E78 7369 5D5B" /* onomouxz.�~xsi][ */ $"677E 929B A19D 948B 868A 96A0 ABB0 A692" /* g~’›¡�”‹†Š– «°¦’ */ $"7A62 4B3C 3A3F 4955 6065 6461 626E 7F8F" /* zbK<:?IU`edabn.� */ $"A1B4 C2C5 BFB8 AF9C 897F 7876 7C81 807A" /* ¡´ÂÅ¿¸¯œ‰.xv|�€z */ $"726D 6B68 6769 6C6D 7078 7D7B 766D 6A6D" /* rmkhgilmpx}{vmjm */ $"6F7A 8F9C A2A3 9E94 877C 7476 7D83 8E94" /* oz�œ¢£ž”‡|tv}ƒŽ” */ $"8D84 796A 5B5A 636D 7273 7171 7071 777E" /* �„yj[Zcmrsqqpqw~ */ $"858F 989F A4A5 9E96 9089 8583 7F78 7370" /* …�˜Ÿ¤¥ž–�‰…ƒ.xsp */ $"6E72 7B82 8580 797B 7F83 8C90 8D85 7562" /* nr{‚…€y{.ƒŒ��…ub */ $"534B 474D 5B67 7682 888B 8D8E 959F A8AE" /* SKGM[gv‚ˆ‹�Ž•Ÿ¨® */ $"B1AB 9B8F 867E 7A79 7875 6B62 6162 6365" /* ±«›�†~zyxukbabce */ $"696F 767F 888C 8883 8080 8488 8B8C 8883" /* iov.ˆŒˆƒ€€„ˆ‹Œˆƒ */ $"8087 96A1 AAAD A394 8476 6A5F 5757 5857" /* €‡–¡ª­£”„vj_WWXW */ $"5450 4C48 4952 6479 8C9B A2A4 A6AC B8C0" /* TPLHIRdyŒ›¢¤¦¬¸À */ $"C1BE B09B 8C81 7B78 7572 6D69 6562 5F5D" /* Á¾°›Œ�{xurmieb_] */ $"5C5C 636C 747A 7975 6F72 8193 A4B3 B3A5" /* \\cltzyuor�“¤³³¥ */ $"9382 7572 767E 8691 9694 8D7F 6D60 5A5A" /* “‚urv~†‘–”�.m`ZZ */ $"636B 706E 6359 5861 6F7F 8D94 989B A0A7" /* ckpncYXao.�”˜› § */ $"ACAD A7A1 9A91 8B89 8379 7069 6563 6463" /* ¬­§¡š‘‹‰ƒypiecdc */ $"6161 6B7C 92A2 A090 785C 4843 4E60 7180" /* aak|’¢ �x\HCN`q€ */ $"8A8B 8885 8484 8997 A8B6 BEB8 A58F 7767" /* Š‹ˆ…„„‰—¨¶¾¸¥�wg */ $"6771 7675 7165 544B 4C51 5964 7283 95A4" /* gqvuqeTKLQYdrƒ•¤ */ $"AEAD A092 8881 8388 8B8E 8E8C 8E93 9693" /* ®­ ’ˆ�ƒˆ‹ŽŽŒŽ“–“ */ $"8B7D 6D67 6869 6A6A 645D 5651 4F4E 5056" /* ‹}mghijjd]VQONPV */ $"6473 808F 9B9F A0A6 B0BF CED6 CEB9 9E84" /* ds€�›Ÿ ¦°¿ÎÖιž„ */ $"7165 5E5B 5E61 6261 615F 5A58 5558 6371" /* qe^[^abaa_ZXUXcq */ $"808D 9395 989E A6AE AFA4 9587 7D77 777A" /* €�“•˜ž¦®¯¤•‡}wwz */ $"7E83 8789 8781 776C 6058 5759 5B5B 5652" /* ~ƒ‡‰‡�wl`XWY[[VR */ $"5860 6B80 95A0 A8AD B0B3 B2B2 B4B2 AEA8" /* X`k€• ¨­°³²²´²®¨ */ $"A095 8671 5C4A 403C 4453 606D 7983 8A8E" /*  •†q\J@M^mz„‰�–¤´ÀÊÏÊÆ */ $"C3B5 A492 7E6E 665D 5046 3F3A 3943 5569" /* õ¤’~nf]PF?:9CUi */ $"7F91 9D9F A1A2 9F98 9086 7A72 747D 8486" /* .‘�Ÿ¡¢Ÿ˜�†zrt}„† */ $"8481 7E7F 7E79 7675 7275 7B7F 807E 7466" /* „�~.~yvuru{.€~tf */ $"5D5B 6066 6D77 8086 8A90 9699 9DA4 ABB1" /* ][`fmw€†Š�–™�¤«± */ $"B1A5 9380 6E63 6167 7484 9193 8E89 8683" /* ±¥“€ncagt„‘“މ†ƒ */ $"7D76 7476 7674 736B 5E56 504D 5054 575C" /* }vtvvtsk^VPMPTW\ */ $"6773 8094 A5B4 C2C9 C4BC B3A9 9986 786E" /* gs€”¥´ÂÉﳩ™†xn */ $"645A 5351 5058 666E 767D 7D79 7672 737C" /* dZSQPXfnv}}yvrs| */ $"8A99 A7B3 B6AD A49D 958B 8688 8B8A 847B" /* Š™§³¶­¤�•‹†ˆ‹Š„{ */ $"7166 605D 5951 4D49 443F 3A39 4153 6782" /* qf`]YQMID?:9ASg‚ */ $"9DB1 BCC1 C1BA B2B0 B1B3 B1AE A79B 8C80" /* �±¼ÁÁº²°±³±®§›Œ€ */ $"7261 524C 4845 4547 4F5F 7182 94A3 AAAC" /* raRLHEEGO_q‚”£ª¬ */ $"A8A0 9891 8B83 786B 6669 727D 8991 8F88" /* ¨ ˜‘‹ƒxkfir}‰‘�ˆ */ $"7F73 6659 5256 636F 7A81 8179 6E64 5E64" /* .sfYRVcoz��ynd^d */ $"7587 969F A5A9 A9A6 A3A5 A6A3 9F99 8B7B" /* u‡–Ÿ¥©©¦£¥¦£Ÿ™‹{ */ $"6B5B 5457 6275 8999 9E9A 9084 7B75 6F68" /* k[TWbu‰™žš�„{uoh */ $"6466 6C6F 6B65 5D52 4D4F 5865 7382 91A0" /* dfloke]RMOXes‚‘  */ $"AEBA C3C3 BBB0 A192 8578 6A5A 4A44 454E" /* ®ºÃû°¡’…xjZJDEN */ $"6278 8A97 9B94 8B80 7774 7981 8A97 A4AA" /* bxŠ—›”‹€wty�Š—¤ª */ $"A8A1 9993 9395 9591 8579 6D60 5750 4B4C" /* ¨¡™““••‘…ym`WPKL */ $"4E4F 5151 4E4B 484C 5A6E 859E B2BF C5C2" /* NOQQNKHLZn…ž²¿Å */ $"BBB4 ABA2 9F9C 9C9D 9A93 8676 6859 4A41" /* »´«¢Ÿœœ�š“†vhYJA */ $"434E 5862 6D79 828A 929A A4AF B8B8 AF9A" /* CNXbmy‚В𤝏¸¯š */ $"816C 5C57 5D65 707B 858A 8576 665B 5857" /* �l\W]ep{…Š…vf[XW */ $"5F6B 7379 786F 6C72 7A81 8687 8B90 9397" /* _ksyxolrz�†‡‹�“— */ $"9DA2 A5A8 A8A6 A7A1 9589 7C6E 645F 5F60" /* �¢¥¨¨¦§¡•‰|nd__` */ $"666F 7A87 96A0 9F91 8177 6E6A 6B69 6561" /* foz‡– Ÿ‘�wnjkiea */ $"5B56 5356 585A 6474 899D A9B0 ABA2 9E9C" /* [VSVXZdt‰�©°«¢žœ */ $"9DA0 9B8C 755C 4B46 4B56 647A 8F9A 9F9F" /* � ›Œu\KFKVdz�šŸŸ */ $"9C93 8982 8184 8689 8782 828B 95A0 AAAB" /* œ“‰‚�„†‰‡‚‚‹• ª« */ $"A698 8272 6960 5750 504F 4E4D 4B4D 5053" /* ¦˜‚ri`WPPONMKMPS */ $"5E6E 7B83 8581 7F85 94A6 B5BB B6AD 9F92" /* ^n{ƒ…�.…”¦µ»¶­Ÿ’ */ $"8F93 9491 8C8A 887E 7266 5B54 555E 676F" /* �“”‘ŒŠˆ~rf[TU^go */ $"787E 8288 93A0 ABB1 ABA0 9485 766F 6A68" /* x~‚ˆ“ «±« ”…vojh */ $"6766 6A6F 7272 7270 6C70 736F 6760 5A56" /* gfjorrrplpsog`ZV */ $"5B6C 7D89 8F8D 8886 8A92 9BA5 ACAE B0AE" /* [l}‰��ˆ†Š’›¥¬®°® */ $"A9A3 988D 8683 8380 7365 5B57 5860 7387" /* ©£˜�†ƒƒ€se[WX`s‡ */ $"959C 9A91 847B 746D 6664 6465 6663 5F60" /* •œš‘„{tmfddefc_` */ $"646A 798A 9295 9797 9591 8B86 8278 6E66" /* djyŠ’•——•‘‹†‚xnf */ $"6164 6C75 7C82 888F 9AA2 A6AC AAA0 968A" /* adlu|‚ˆ�𢦬ª –Š */ $"7C71 6660 6671 8296 A5AA A69C 9185 7C75" /* |qf`fq‚–¥ª¦œ‘…|u */ $"706A 625C 554D 4945 4855 6474 8185 837F" /* pjb\UMIEHUdt�…ƒ. */ $"7A75 747C 868F 9799 9797 989B 9EA0 A1A0" /* zut|†�—™——˜›ž ¡  */ $"9E9A 9388 7B6E 625F 6164 6970 767C 848B" /* žš“ˆ{nb_adipv|„‹ */ $"9195 9491 8D87 8483 7F7B 7C7F 8283 7F79" /* ‘•”‘�‡„ƒ.{|.‚ƒ.y */ $"726D 6761 5D5A 5858 5A5B 5C62 6C76 7D82" /* rmga]ZXXZ[\blv}‚ */ $"868A 8F96 9FA4 A7A8 ABAD ABA8 A49E 9691" /* †Š�–Ÿ¤§¨«­«¨¤ž–‘ */ $"8A80 756D 645C 5B5F 6973 797F 8383 8180" /* Š€umd\[_isy.ƒƒ�€ */ $"8082 878D 8F8A 7F71 6357 5154 5E6C 7B85" /* €‚‡��Š.qcWQT^l{… */ $"8B8D 847A 7572 6F6D 6D70 7272 767C 8189" /* ‹�„zurommprrv|�‰ */ $"9AA9 B4BD BEB6 AB99 8777 695C 575B 646F" /* š©´½¾¶«™‡wi\W[do */ $"7A84 8C90 9497 9692 8F8C 8885 8179 6D61" /* z„Œ�”—–’�Œˆ…�yma */ $"5652 5559 616C 7477 756D 6664 6267 6E73" /* VRUYaltwumfdbgns */ $"7A84 8C91 9292 989E A4AE B5B0 A597 887E" /* z„Œ‘’’˜ž¤®µ°¥—ˆ~ */ $"7B7A 7A79 736E 6B68 696A 6E75 7B83 8B8C" /* {zzysnkhijnu{ƒ‹Œ */ $"8884 8388 919C A6A9 A391 7B68 5B54 5455" /* ˆ„ƒˆ‘œ¦©£‘{h[TTU */ $"5554 5455 5554 575D 6372 8697 A1A4 9F98" /* UTTUUTW]cr†—¡¤Ÿ˜ */ $"9696 999E A1A1 A2A3 A7A8 A092 816E 605C" /* ––™ž¡¡¢£§¨ ’�n`\ */ $"5D62 6C75 787A 7C7B 7B80 868E 98A1 A7A0" /* ]bluxz|{{€†Ž˜¡§  */ $"917C 6251 4E56 6879 8485 7D6F 6052 4B50" /* ‘|bQNVhy„…}o`RKP */ $"5C6A 7A87 8A87 7E71 6F7C 92AD C5D0 CFBF" /* \jz‡Š‡~qo|’­ÅÐÏ¿ */ $"A996 8375 6C6A 6A6D 6F6A 6661 5F65 7284" /* ©–ƒuljjmojfa_er„ */ $"99AD B7B5 A697 8D83 7D79 7676 7676 7570" /* ™­·µ¦—�ƒ}yvvvvup */ $"6455 4742 444C 5865 6F76 7877 767A 828C" /* dUGBDLXeovxwvz‚Œ */ $"959E A7AD AEAA 9C8E 8A8B 909B A3A0 9486" /* •ž§­®ªœŽŠ‹�›£ ”† */ $"7463 5856 5A62 6E7C 8488 8880 7675 7E8F" /* tcXVZbn|„ˆˆ€vu~� */ $"A6B7 BDB6 A48F 7A66 5752 5151 514F 4B4B" /* ¦·½¶¤�zfWRQQQOKK */ $"4A48 4D57 667E 98A9 AEA9 9D8F 8484 8C96" /* JHMWf~˜©®©��„„Œ– */ $"A4B0 B5AD 9D89 715F 595B 6A82 9398 9387" /* ¤°µ­�‰q_Y[j‚“˜“‡ */ $"7A76 7881 8C98 9F9E 968B 7E6F 6464 6871" /* zvx�Œ˜Ÿž–‹~oddhq */ $"7B80 7F76 6655 4948 5362 6D71 7275 7572" /* {€.vfUIHSbmqruur */ $"7273 797F 8A9C AFBC BFBF B9A8 9788 7A6E" /* rsy.Šœ¯¼¿¿¹¨—ˆzn */ $"6866 6562 6267 6A68 6974 8599 AAB4 B6B2" /* hfebbgjhit…™ª´¶² */ $"A598 8E8D 9094 9690 816D 5845 3227 2937" /* ¥˜Ž��”–��mXE2')7 */ $"4A62 7379 766F 6A6F 7C8A 959A 9B95 8B83" /* Jbsyvojo|Е𛕋ƒ */ $"838B 94A1 ACB0 AFA5 9789 7D76 777E 8282" /* ƒ‹”¡¬°¯¥—‰}vw~‚‚ */ $"7F76 695F 5C5E 6670 7A87 95A4 AFB3 B4B1" /* .vi_\^fpz‡•¤¯³´± */ $"A28F 847B 7165 5749 403D 3D42 484E 5C6C" /* ¢�„{qeWI@==BHN\l */ $"7C89 9295 938B 858A 929A A2A7 A496 8573" /* |‰’•“‹…В𢧤–…s */ $"6863 646E 8194 A2AC ACA7 9D92 8F8F 8D8C" /* hcdn�”¢¬¬§�’���Œ */ $"877D 736C 696A 6D6E 7177 7B7E 807E 776D" /* ‡}slijmnqw{~€~wm */ $"625A 5C61 676D 6E6F 7273 716F 6E70 7B8B" /* bZ\agmnorsqonp{‹ */ $"9BA9 B1B2 AEA2 9288 837F 7C78 746E 6762" /* ›©±²®¢’ˆƒ.|xtngb */ $"6060 6873 8297 A5AB ACAA A5A0 A5AC B0AD" /* ``hs‚—¥«¬ª¥ ¥¬°­ */ $"A18F 7A62 5046 3E38 3941 4A52 5B63 686B" /* ¡�zbPF>89AJR[chk */ $"707C 8486 8784 7F7B 7C82 888B 8E93 9A9F" /* p|„†‡„.{|‚ˆ‹Ž“šŸ */ $"A3A9 ABA3 9B94 8D84 8081 7F7A 7875 6D63" /* £©«£›”�„€�.zxumc */ $"5752 5661 7288 9DAF B2B0 AEA7 9B94 928C" /* WRVarˆ�¯²°®§›”’Œ */ $"7F71 6353 4237 3536 3E51 687B 898E 8A84" /* .qcSB756>Qh{‰ŽŠ„ */ $"7F7B 7F86 8B8C 8C86 7C76 7372 7882 91A3" /* .{.†‹ŒŒ†|vsrx‚‘£ */ $"ADB4 B9B4 AEAB A298 9185 7974 6F67 6566" /* ­´¹´®«¢˜‘…ytogef */ $"6667 6B71 7574 7376 736B 686A 6A6D 727A" /* fgkqutsvskhjjmrz */ $"8081 7F80 827D 7674 7475 7576 7F85 838A" /* €�.€‚}vttuuv.…ƒŠ */ $"918F 8A88 8884 7D78 7876 6E6C 7279 818C" /* ‘�Šˆˆ„}xxvnlry�Œ */ $"9BA6 A9A7 A8AD AAA7 ABAD A9A0 917C 634B" /* ›¦©§¨­ª§«­© ‘|cK */ $"3E37 3236 414C 555B 5E62 6A70 7782 8D94" /* >726ALU[^bjpw‚�” */ $"9490 8A7F 7576 7C86 909B A09D 9995 8C86" /* ”�Š.uv|†�› �™•Œ† */ $"888E 9498 9A96 8A7E 7266 5E59 575C 6471" /* ˆŽ”˜š–Š~rf^YW\dq */ $"8293 A0A8 ADB1 AEA8 A19A 9182 7264 5647" /* ‚“ ¨­±®¨¡š‘‚rdVG */ $"403E 4250 5F69 737A 7B76 716E 6A6A 737C" /* @>BP_isz{vqnjjs| */ $"8385 8481 7C7B 838F 9BA7 B4BD BFB9 AFA5" /* ƒ…„�|{ƒ�›§´½¿¹¯¥ */ $"9A90 8984 8180 7C75 716F 6E6E 7071 6F6D" /* š�‰„�€|uqonnpqom */ $"6A65 605C 5A5B 616A 798A 99A3 A8A8 A195" /* je`\Z[ajyŠ™£¨¨¡• */ $"887F 7263 5A52 4F56 5E65 6C75 7C83 8D94" /* ˆ.rcZROV^elu|ƒ�” */ $"9696 928C 8988 8989 8788 898C 939A A4AD" /* ––’Œ‰ˆ‰‰‡ˆ‰Œ“𤭠*/ $"AFAE AEAC A8A0 9787 7667 5A4D 423A 3834" /* ¯®®¬¨ —‡vgZMB:84 */ $"3239 4857 6574 8592 9B9F 9E97 8A7E 7A7B" /* 29HWet…’›Ÿž—Š~z{ */ $"848E 9190 887D 7A79 7980 8A92 979A 9B9C" /* „Ž‘�ˆ}zyy€Š’—š›œ */ $"998C 7E74 6C6A 6E74 7876 7678 7D86 95A5" /* ™Œ~tljntxvvx}†•¥ */ $"ADB1 B1AC 9F8C 7765 5447 4752 5C64 6968" /* ­±±¬ŸŒweTGGR\dih */ $"6562 5F5D 5956 5860 6D7E 8F9A 9A92 898A" /* eb_]YVX`m~�šš’‰Š */ $"929D A9AF ACA2 9792 918F 8C8C 8E90 959A" /* ’�©¯¬¢—’‘�ŒŒŽ�•š */ $"9587 7C74 6D6C 7378 746B 6057 5455 5758" /* •‡|tmlsxtk`WTUWX */ $"5B67 7A90 A6B6 BCB7 A691 8072 6354 4845" /* [gz�¦¶¼·¦‘€rcTHE */ $"464C 5865 7178 7E87 909A A5A6 9B8C 827E" /* FLXeqx~‡�𥦛Œ‚~ */ $"8188 8C90 9494 9BA3 A5A1 9996 999D A1A4" /* �ˆŒ�””›£¥¡™–™�¡¤ */ $"9E90 7F6B 574D 4841 3932 313A 4858 6877" /* ž�.kWMHA921:HXhw */ $"828C 959D A19E 9892 8C88 8788 857F 7975" /* ‚Œ•�¡ž˜’Œˆ‡ˆ….yu */ $"7275 7B7E 7B76 787F 8A96 9FA1 9D95 8B84" /* ru{~{vx.Š–Ÿ¡�•‹„ */ $"827E 7978 7C80 868F 9495 9595 9798 948D" /* ‚~yx|€†�”•••—˜”� */ $"7F6C 5A4C 4546 4D55 5B60 6260 5E5D 5B5E" /* .lZLEFMU[`b`^][^ */ $"6A7A 8A98 A2A6 A49F 9C9C 9B9A 958A 7F76" /* jzŠ˜¢¦¤Ÿœœ›š•Š.v */ $"6F70 7782 8D96 9DA3 A6A7 A39E 978D 837A" /* opw‚�–�£¦§£ž—�ƒz */ $"7167 5C57 5555 5A61 6568 6E7A 838A 949D" /* qg\WUUZaehnzƒŠ”� */ $"A0A0 9787 745F 4F46 464C 5664 6F76 7C85" /*   —‡t_OFFLVdov|… */ $"8F96 9EA5 A69F 968C 7F75 7276 808B 9399" /* �–ž¥¦Ÿ–Œ.urv€‹“™ */ $"9C9B 9CA0 A5A9 AAAA A599 8A7C 6D5D 5048" /* œ›œ ¥©ªª¥™Š|m]PH */ $"403D 3B3D 3F43 5061 758C A2AA A79F 9387" /* @=;=?CPauŒ¢ª§Ÿ“‡ */ $"8485 898D 8E8B 8173 6761 6068 767F 848B" /* „…‰�Ž‹�sga`hv.„‹ */ $"8A86 8586 8A94 A1AB A9A0 968E 8883 8487" /* І…†Š”¡«© –Žˆƒ„‡ */ $"8A8D 8E8C 8B87 817A 726C 6762 5E59 5857" /* Š�ŽŒ‹‡�zrlgb^YXW */ $"5758 5858 5755 5860 7087 9CB0 BDBF B7A9" /* WXXXWUX`p‡œ°½¿·© */ $"9888 807A 7570 6B62 5957 5966 7A8F A7BE" /* ˜ˆ€zupkbYWYfz�§¾ */ $"C9C7 BAAA 9D92 8B89 8783 7E77 6959 504D" /* ÉǺª�’‹‰‡ƒ~wiYPM */ $"4F56 6272 8088 8E8C 857F 766E 6D69 6463" /* OVbr€ˆŽŒ….vnmidc */ $"6262 6871 7C85 8D94 9797 9694 8D83 7C75" /* bbhq|…�”——–”�ƒ|u */ $"7276 7A7D 8188 8B8A 8989 8C93 A0AB B2B6" /* rvz}�ˆ‹Š‰‰Œ“ «²¶ */ $"B3A9 9F94 8474 685B 5048 403B 3A42 515E" /* ³©Ÿ”„th[PH@;:BQ^ */ $"6877 858E 9599 9691 8C87 878A 8A8A 8984" /* hw…Ž•™–‘Œ‡‡ŠŠŠ‰„ */ $"7A6E 6155 5055 6373 8497 A5A7 A39D 9894" /* znaUPUcs„—¥§£�˜” */ $"9396 9B9D 9F9E 978D 8680 7E84 8C93 9690" /* “–›�Ÿž—�†€~„Œ“–� */ $"806A 5645 393B 4B5B 656A 6B67 5F5D 6470" /* €jVE9;K[ejkg_]dp */ $"859E B5C0 BFB6 A693 8172 6C68 635E 5E5D" /* …žµÀ¿¶¦“�rlhc^^] */ $"5A5E 6A75 7F88 8F9A A2A7 ADB0 AFAD AAA6" /* Z^ju.ˆ�𢧭°¯­ª¦ */ $"A19D 9892 887C 726A 5D4D 4342 4852 6270" /* ¡�˜’ˆ|rj]MCBHRbp */ $"797A 756F 6861 636E 7984 8E93 938E 8883" /* yzuohacny„Ž““Žˆƒ */ $"8086 8F97 9B95 8879 6960 6166 727D 8181" /* €†�—›•ˆyi`afr}�� */ $"8282 838C 97A4 B4C1 C7C3 B49C 826B 5E5A" /* ‚‚ƒŒ—¤´ÁÇôœ‚k^Z */ $"5C5E 5E5B 5654 5A62 6B74 7879 7976 7373" /* \^^[VTZbktxyyvss */ $"777B 7F89 9093 928C 8277 716F 6C6A 6864" /* w{.‰�“’Œ‚wqoljhd */ $"6369 7585 929D A4A5 A4A2 9F9C 9A9F A19F" /* ciu…’�¤¥¤¢ŸœšŸ¡Ÿ */ $"9F9A 9287 786E 6E73 7978 7268 594C 4647" /* Ÿš’‡xnnsyxrhYLFG */ $"505A 656E 767B 8086 8A94 A2AF B9BB AF9A" /* PZenv{€†Š”¢¯¹»¯š */ $"8065 5149 4D53 5A62 676C 6F71 767A 828D" /* €eQIMSZbgloqvz‚� */ $"97A2 A7A6 A19D 9EA3 ABB4 B8B7 B1A5 9685" /* —¢§¦¡�ž£«´¸·±¥–… */ $"7565 5447 4041 484F 5558 5A5E 6066 7078" /* ueTG@AHOUXZ^`fpx */ $"7D82 878E 9599 9894 8F8D 9094 989A 9386" /* }‚‡Ž•™˜”���”˜š“† */ $"7768 5D58 5453 5C6A 7787 969D 9EA0 A1A4" /* wh]XTS\jw‡–�ž ¡¤ */ $"AAAC A9A1 9485 7A74 6E6C 6B6D 7175 7E87" /* ª¬©¡”…ztnlkmqu~‡ */ $"857E 756B 6464 6463 6463 6268 6F76 7F87" /* …~ukdddcdcbhov.‡ */ $"8888 8A8A 8884 7D76 716E 7176 777A 8690" /* ˆˆŠŠˆ„}vqnqvwz†� */ $"99A8 B4B6 B2AB A297 8B83 8280 7D7B 7A7A" /* ™¨´¶²«¢—‹ƒ‚€}{zz */ $"7872 6A62 5A55 595F 6264 6667 6A70 7C8B" /* xrjbZUY_bdfgjp|‹ */ $"97A1 A9AB ABA4 998B 7C6F 6664 6667 6764" /* —¡©««¤™‹|ofdfggd */ $"615F 5E5E 6267 717C 8694 9EA4 A8AB AAAA" /* a_^^bgq|†”ž¤¨«ªª */ $"ABAA ABAC AAA6 A097 8C82 786D 645E 5A56" /* «ª«¬ª¦ —Œ‚xmd^ZV */ $"524A 4441 4248 535F 6C78 838D 9395 989B" /* RJDABHS_lxƒ�“•˜› */ $"9C9E A2A4 A4A2 9C92 8576 685C 534D 505A" /* œž¢¤¤¢œ’…vh\SMPZ */ $"6672 7F8B 959A 9EA1 9E9B 978F 847C 7A7A" /* fr.‹•šž¡ž›—�„|zz */ $"7C81 858C 9398 9A99 948A 7D71 655C 5959" /* |�…Œ“˜š™”Š}qe\YY */ $"5A5B 5D5E 6064 676A 6F76 7D85 8C8E 9091" /* Z[]^`dgjov}…ŒŽ�‘ */ $"8E89 847E 7B78 7677 7E8A 96A2 A9A9 A6A3" /* މ„~{xvw~Š–¢©©¦£ */ $"A09A 9187 7C73 6A65 6565 676D 7175 7976" /*  š‘‡|sjeeegmquyv */ $"726F 6762 6468 707D 8B97 9D9F A0A0 9D96" /* rogbdhp}‹—�Ÿ  �– */ $"8E82 746B 635C 5B5B 5A5C 6063 6569 6C70" /* Ž‚tkc\[[Z\`ceilp */ $"7883 92A0 A9AF AFAA A3A1 9E9A 9793 918F" /* xƒ’ ©¯¯ª£¡žš—“‘� */ $"8C8A 8988 8987 837B 6E5F 4E3B 2B25 2C3C" /* ŒŠ‰ˆ‰‡ƒ{n_N;+%,< */ $"5168 7B85 8B92 9AA3 ACB1 B0AD A79D 938E" /* Qh{…‹’𣬱°­§�“Ž */ $"8881 7C76 6E66 605A 5556 5E6A 7887 939A" /* ˆ�|vnf`ZUV^jx‡“š */ $"9996 9490 8B84 7C78 787A 828C 949B A1A5" /* ™–”�‹„|xxz‚Œ”›¡¥ */ $"A39D 978E 7D6A 5F57 5253 5656 5353 5861" /* £�—Ž}j_WRSVVSSXa */ $"6B75 7D81 8384 848A 949C A0A1 9C94 8A83" /* ku}�ƒ„„Š”œ ¡œ”Šƒ */ $"7E79 7880 8C95 9B9E 968A 827D 7A79 7774" /* ~yx€Œ•›ž–Š‚}zywt */ $"6F6B 6A6B 6E74 7A7E 8386 837C 766D 6465" /* okjkntz~ƒ†ƒ|vmde */ $"6E7E 8E9E A8A9 A49F 978D 8175 685E 5955" /* n~Žž¨©¤Ÿ—��uh^YU */ $"5458 5C5E 626A 737F 8991 9392 9294 9392" /* TX\^bjs.‰‘“’’”“’ */ $"9394 9498 9A9A 9892 8B86 8487 8D94 9794" /* “””˜šš˜’‹†„‡�”—” */ $"8978 6350 4036 3133 3E4C 5C6B 757E 8896" /* ‰xcP@613>L\ku~ˆ– */ $"A4B3 C2C7 C1B4 A494 857A 7572 706F 6C68" /* ¤³ÂÇÁ´¤”…zurpolh */ $"6561 5D5D 626C 7883 8A8E 8F8E 8A84 807E" /* ea]]blxƒŠŽ�ŽŠ„€~ */ $"7E7D 828A 9199 A2A8 A8A5 A198 8B7F 746A" /* ~}‚Š‘™¢¨¨¥¡˜‹.tj */ $"615A 5652 4C47 474F 5965 7380 888C 8F90" /* aZVRLGGOYes€ˆŒ�� */ $"9091 969B A0A4 A6A3 9789 7C72 6F71 777D" /* �‘–› ¤¦£—‰|roqw} */ $"8182 8382 807D 7B7B 7B7C 7C7B 7774 7270" /* �‚ƒ‚€}{{{||{wtrp */ $"7274 787B 7A77 7577 808B 959E 9E98 9391" /* rtx{zwuw€‹•žž˜“‘ */ $"8E8B 8983 7A70 6860 5851 4E51 5D70 828F" /* Ž‹‰ƒzph`XQNQ]p‚� */ $"9792 8983 8489 8F95 9690 8882 7E7B 7C80" /* —’‰ƒ„‰�•–�ˆ‚~{|€ */ $"8790 999F A19E 968A 827D 7973 6959 4838" /* ‡�™Ÿ¡ž–Š‚}ysiYH8 */ $"3136 4352 6475 8290 A0AE B8BC BBBA B7AF" /* 16CRdu‚� ®¸¼»º·¯ */ $"A595 8270 635B 5C63 696C 6C6B 6B6C 7176" /* ¥•‚pc[\cillkklqv */ $"7B7D 7E7E 7F81 807C 7977 777E 8994 9DA3" /* {}~~.�€|yww~‰”�£ */ $"A7A8 A6A6 A49B 8978 6B62 5D59 5650 4842" /* §¨¦¦¤›‰xkb]YVPHB */ $"434C 5A6B 7D8D 989E A1A0 9B97 9495 999F" /* CLZk}�˜ž¡ ›—”•™Ÿ */ $"A6A8 9F8A 7565 5E60 6A78 8184 827F 7A73" /* ¦¨ŸŠue^`jx�„‚.zs */ $"6E6B 6A70 7D87 8B87 7B6E 6665 6C7C 8990" /* nkjp}‡‹‡{nfel|‰� */ $"908E 8C8C 8E8D 8D8E 9092 9291 8B7C 6A58" /* �ŽŒŒŽ��Ž�’’‘‹|jX */ $"4D4C 525B 646D 7680 8B96 9B98 918A 8485" /* MLR[dmv€‹–›˜‘Š„… */ $"8B8F 887F 7975 7378 838C 9091 9498 9B98" /* ‹�ˆ.yusxƒŒ�‘”˜›˜ */ $"8F84 7970 6C6B 6861 5649 3E3D 475A 6D7D" /* �„yplkhaVI>=GZm} */ $"8B9A A8B3 BABC BAB0 A49A 968F 8374 665C" /* ‹š¨³º¼º°¤š–�ƒtf\ */ $"5E66 6E75 766F 6660 636C 7881 8585 8482" /* ^fnuvof`clx�……„‚ */ $"7D78 7372 747B 8C9F ACAE A79C 9697 999A" /* }xsrt{ŒŸ¬®§œ–—™š */ $"968B 7964 5248 4343 454A 5567 7A86 8B8A" /* –‹ydRHCCEJUgz†‹Š */ $"8682 838C 99A4 AAAC ABAA A8A1 9584 7266" /* †‚ƒŒ™¤ª¬«ª¨¡•„rf */ $"6165 6E75 766D 635E 616B 7379 8187 8885" /* aenuvmc^aksy�‡ˆ… */ $"827B 726B 6A73 8494 9F9D 9083 7D7D 828D" /* ‚{rkjs„”Ÿ��ƒ}}‚� */ $"999F 9D97 8D82 7667 5851 5056 606A 747A" /* ™Ÿ�—�‚vgXQPV`jtz */ $"7C80 858D 969B 9893 8F8C 8A87 837E 7973" /* |€…�–›˜“�ŒŠ‡ƒ~ys */ $"747C 8489 8883 7F7F 8082 8382 817D 7773" /* t|„‰ˆƒ..€‚ƒ‚�}ws */ $"7068 5D52 4C50 5B69 7784 8F97 9DA3 ABB1" /* ph]RLP[iw„�—�£«± */ $"B0AB A39A 918A 8077 726E 6B6E 7171 6D65" /* °«£š‘Š€wrnknqqme */ $"5E5E 6470 7A80 8281 7C78 787C 8289 8D92" /* ^^dpz€‚�|xx|‚‰�’ */ $"999C 9993 8D8A 8A8D 9394 8E84 7564 5854" /* ™œ™“�ŠŠ�“”Ž„udXT */ $"575B 6065 6A6B 6A6D 7177 7D86 919C A4A9" /* W[`ejkjmqw}†‘œ¤© */ $"ACAD AAA9 A59D 9388 7C71 6B66 6462 5D57" /* ¬­ª©¥�“ˆ|qkfdb]W */ $"5454 5C69 7785 8B8B 8882 7E7D 7F82 858B" /* TT\iw…‹‹ˆ‚~}.‚…‹ */ $"9091 8E87 8380 7F84 8F97 9A98 8F83 776E" /* �‘އƒ€.„�—š˜�ƒwn */ $"6966 6667 6968 686A 6C6F 747C 8996 9FA2" /* iffgihhjlot|‰–Ÿ¢ */ $"A09A 928B 8785 8480 7C77 7372 7273 7578" /*  š’‹‡…„€|wsrrsux */ $"7B7C 7C7D 8080 7E7C 7A7A 7874 706D 6A6B" /* {||}€€~|zzxtpmjk */ $"7177 7E84 8788 888B 909A A2A6 A59E 9489" /* qw~„‡ˆˆ‹�𢦥ž”‰ */ $"817D 7874 7272 706B 6660 5C5F 6771 7A81" /* �}xtrrpkf`\_gqz� */ $"8381 7D7B 7C83 8B93 9794 8F89 8482 8588" /* ƒ�}{|ƒ‹“—”�‰„‚…ˆ */ $"8889 8884 807A 726E 6E6E 7072 706A 6360" /* ˆ‰ˆ„€zrnnnprpjc` */ $"6166 717E 878B 8E94 99A0 A8AC ACAA A59E" /* afq~‡‹Ž”™ ¨¬¬ª¥ž */ $"968B 7E72 6A63 5D58 5451 5154 5B63 6F7C" /* –‹~rjc]XTQQT[co| */ $"8589 8987 898D 9295 9590 8882 8080 8184" /* …‰‰‡‰�’••�ˆ‚€€�„ */ $"8A8F 9190 8C84 7C75 706F 7172 716D 6560" /* Š�‘�Œ„|upoqrqme` */ $"6268 747F 888F 9293 9394 9394 9696 9490" /* bht.ˆ�’““”“”––”� */ $"8981 786D 6461 6369 6E71 716E 6E72 7880" /* ‰�xmdacinqqnnrx€ */ $"888D 8E8A 8581 7F7C 7B7C 7D80 8180 807F" /* ˆ�ŽŠ…�.|{|}€�€€. */ $"7F80 848B 8F93 9492 918F 8D8A 847D 736A" /* .€„‹�“”’‘��Š„}sj */ $"6260 6267 6C70 7172 7576 797F 8489 8D90" /* b`bglpqruvy.„‰�� */ $"918D 8780 7C7E 8186 8C8E 8A83 7C75 7072" /* ‘�‡€|~�†ŒŽŠƒ|upr */ $"7A80 8585 827B 6F64 5E59 5C64 717F 8A91" /* z€……‚{od^Y\dq.Š‘ */ $"9497 999E A3A9 ADAC A69D 9082 766A 5F55" /* ”—™ž£©­¬¦��‚vj_U */ $"5252 5558 5B5C 5D61 6872 7F8C 979D A0A0" /* RRUX[\]ahr.Œ—�   */ $"9C95 8E85 7F7C 7C80 868C 8E8A 8480 7C78" /* œ•Ž….||€†ŒŽŠ„€|x */ $"7673 6F6D 6D6F 7070 6F6E 6E73 7C85 8E93" /* vsommopponns|…Ž“ */ $"9393 9393 9699 9A98 938D 857C 7062 5A52" /* ““““–™š˜“�…|pbZR */ $"5056 606A 7277 7A7D 8084 898B 8C8C 8D8D" /* PV`jrwz}€„‰‹ŒŒ�� */ $"8C89 8581 7C78 797B 7C7B 7A79 7B81 8A93" /* Œ‰…�|xy{|{zy{�Š“ */ $"9A9B 9793 8C83 7B72 6B63 6063 676B 7175" /* š›—“Œƒ{rkc`cgkqu */ $"787C 8187 8C8E 8C88 8481 8182 8280 7E7B" /* x|�‡ŒŽŒˆ„��‚‚€~{ */ $"7A7B 7B78 7877 7A80 8488 8B8B 8781 7C76" /* z{{xxwz€„ˆ‹‹‡�|v */ $"6F6A 635F 5F63 6D7C 8B98 A1A8 ABAC A9A5" /* ojc__cm|‹˜¡¨«¬©¥ */ $"9D91 8883 7E77 716B 6157 5250 5358 5F64" /* �‘ˆƒ~wqkaWRPSX_d */ $"6B72 7B84 8D93 9798 9A9A 9894 8F86 7E7A" /* kr{„�“—˜šš˜”�†~z */ $"797B 7E82 8788 8682 7E79 726D 6866 676F" /* y{~‚‡ˆ†‚~yrmhfgo */ $"767D 8080 807E 7E81 868C 9196 9CA0 A19F" /* v}€€€~~�†Œ‘–œ ¡Ÿ */ $"998E 8075 6E68 6360 5B56 5354 5B64 707B" /* ™Ž€unhc`[VST[dp{ */ $"868F 9698 9590 8B86 8586 898B 8C8A 8278" /* †�–˜•�‹†…†‰‹ŒŠ‚x */ $"726F 6E71 767C 8188 8F93 938F 8B84 7F7B" /* ronqv|�ˆ�““�‹„.{ */ $"7775 716D 6B6A 6D71 7980 8485 888B 8D8C" /* wuqmkjmqy€„…ˆ‹�Œ */ $"8B88 837F 7B79 7877 7472 6F6D 6F74 797E" /* ‹ˆƒ.{yxwtromoty~ */ $"8287 8B8D 8E8D 877E 746E 6B6A 6C6E 7275" /* ‚‡‹�Ž�‡~tnkjlnru */ $"7C86 9097 9D9F 9F9E 9B97 938B 8178 726C" /* |†�—�ŸŸž›—“‹�xrl */ $"6968 635C 5857 5C64 6E77 8084 888B 9094" /* ihc\XW\dnw€„ˆ‹�” */ $"9595 9490 8B89 8682 7E7A 7778 7A7D 7D79" /* ••”�‹‰†‚~zwxz}}y */ $"7574 7373 7475 787A 797A 7D80 8080 8080" /* utsstuxzyz}€€€€€ */ $"838B 939A 9D9D 9B96 918C 867D 746C 6663" /* ƒ‹“š��›–‘Œ†}tlfc */ $"605E 5C5A 5B5F 6772 7E86 8B8E 8E8F 9293" /* `^\Z[_gr~†‹ŽŽ�’“ */ $"9292 918F 8C88 827B 746D 6D70 767C 8083" /* ’’‘�Œˆ‚{tmmpv|€ƒ */ $"8584 8384 8381 807D 7B7A 7D80 807E 7C7C" /* …„ƒ„ƒ�€}{z}€€~|| */ $"7C7D 8082 8486 8787 8786 817D 7774 7374" /* |}€‚„†‡‡‡†�}wtst */ $"7678 7775 716E 6D73 7980 8589 8A8A 8882" /* vxwuqnmsy€…‰ŠŠˆ‚ */ $"7D78 7779 7D81 8384 8381 8082 888B 8C8E" /* }xwy}�ƒ„ƒ�€‚ˆ‹ŒŽ */ $"9090 908F 8D88 8179 716A 6763 6366 6769" /* �����ˆ�yqjgccfgi */ $"6E72 777A 8086 8A90 989C 9893 8B82 7A77" /* nrwz€†Š�˜œ˜“‹‚zw */ $"787A 7E7F 7C78 746F 6D6C 6E73 7A80 8382" /* xz~.|xtomlnsz€ƒ‚ */ $"7E7A 7777 7A81 888F 9394 9190 9090 9090" /* ~zwwz�ˆ�“”‘����� */ $"8F8C 8883 7E77 6F6A 6765 6464 6567 676A" /* �Œˆƒ~wojgeddeggj */ $"6F75 7C83 888C 8F90 9396 9795 9089 817A" /* ou|ƒˆŒ��“–—•�‰�z */ $"7573 7374 7778 7979 797A 7C7E 8081 8383" /* usstwxyyyz|~€�ƒƒ */ $"817E 7976 767A 8086 8B8D 8B89 8888 8888" /* �~yvvz€†‹�‹‰ˆˆˆˆ */ $"8887 837F 7A75 716E 6C6D 7074 7879 7974" /* ˆ‡ƒ.zuqnlmptxyyt */ $"706F 7276 7C81 8485 8587 8787 8888 8887" /* porv|�„……‡‡‡ˆˆˆ‡ */ $"8786 8582 807D 7C7E 8185 8889 8988 8783" /* ‡†…‚€}|~�…ˆ‰‰ˆ‡ƒ */ $"7F79 736E 6B6A 6C70 7273 7373 787E 868E" /* .ysnkjlprsssx~†Ž */ $"9596 9695 908A 837B 7571 7072 7475 7674" /* •––•�Šƒ{uqprtuvt */ $"7272 7478 7A7D 7D7B 7A7A 7A7B 7E81 858B" /* rrtxz}}{zzz{~�…‹ */ $"9094 9797 9590 8B87 8482 8384 8381 807D" /* �”——•�‹‡„‚ƒ„ƒ�€} */ $"7871 6B66 6363 676A 6E71 7273 787D 848B" /* xqkfccgjnqrsx}„‹ */ $"9298 9999 9791 8A83 7E7A 7878 7979 7672" /* ’˜™™—‘Šƒ~zxxyyvr */ $"6E6D 6E73 7B82 8686 8684 817E 7B7A 7A7C" /* nmns{‚†††„�~{zz| */ $"8083 888C 8F90 8F8E 8C8B 8884 807D 7976" /* €ƒˆŒ���ŽŒ‹ˆ„€}yv */ $"7371 6E6C 6C6D 7073 7575 7370 6E6F 737A" /* sqnllmpsuuspnosz */ $"838C 9192 9291 8D88 8380 8183 8484 827F" /* ƒŒ‘’’‘�ˆƒ€�ƒ„„‚. */ $"7B7A 7B80 8488 8A89 857F 7873 6F6E 6F70" /* {z{€„ˆŠ‰….xsonop */ $"7375 787A 7C7E 8085 8B90 9496 9590 8A83" /* suxz|~€…‹�”–•�Šƒ */ $"7C75 6E6A 696B 6F75 7879 7875 7372 7477" /* |unjikouxyxusrtw */ $"7B7F 8081 8180 8080 848A 929A 9E9F 9990" /* {.€��€€€„Š’šžŸ™� */ $"857B 7575 7A80 8588 857D 746B 6565 676D" /* …{uuz€…ˆ…}tkeegm */ $"7378 7A79 7572 7277 8089 939A 9B98 938D" /* sxzyurrw€‰“š›˜“� */ $"8781 7D7B 7876 7674 7271 6F6E 6E71 757B" /* ‡�}{xvvtrqonnqu{ */ $"8287 8989 8884 7F7A 7778 7B83 8D94 9898" /* ‚‡‰‰ˆ„.zwx{ƒ�”˜˜ */ $"9289 827E 7F80 8486 8480 7971 6864 656A" /* ’‰‚~.€„†„€yqhdej */ $"727B 807F 7971 6B69 6D76 838E 9495 9089" /* r{€.yqkimvƒŽ”•�‰ */ $"827E 7D80 8487 8989 8480 7A76 7678 7B80" /* ‚~}€„‡‰‰„€zvvx{€ */ $"8282 807C 7875 7373 7576 7678 7C80 8285" /* ‚‚€|xussuvvx|€‚… */ $"8787 8889 8B8D 8E8E 8D89 847C 746E 6B6C" /* ‡‡ˆ‰‹�ŽŽ�‰„|tnkl */ $"6F75 7A7C 7974 6D66 6467 6F7A 838A 8D8C" /* ouz|ytmfdgozƒŠ�Œ */ $"8884 8386 8C93 9A9B 968E 847B 7370 737B" /* ˆ„ƒ†Œ“š›–Ž„{sps{ */ $"8084 847F 776E 6968 6A70 777B 7D7D 7A76" /* €„„.wnihjpw{}}zv */ $"7579 8086 8D92 9595 9491 8D88 827D 7772" /* uy€†�’••”‘�ˆ‚}wr */ $"6F6E 6E6E 6E6E 6F71 7375 797E 8388 8B8A" /* onnnnnoqsuy~ƒˆ‹Š */ $"8580 7B7B 8086 8E94 9793 8C84 7D78 797C" /* …€{{€†Ž”—“Œ„}xy| */ $"7F80 8382 807B 746F 6C6D 7378 7C7E 7C77" /* .€ƒ‚€{tolmsx|~|w */ $"7473 7478 7E83 888B 8B8A 8784 8180 8083" /* tstx~ƒˆ‹‹Š‡„�€€ƒ */ $"8587 8683 7E78 7674 7374 7678 7B7F 8183" /* …‡†ƒ~xvtstvx{.�ƒ */ $"8280 7E7B 7878 7C80 8183 8485 8485 8585" /* ‚€~{xx|€�ƒ„…„……… */ $"8587 8A8B 8B88 847F 7874 7271 7070 6E6C" /* …‡Š‹‹ˆ„.xtrqppnl */ $"6968 6869 6C74 7C82 8B92 9696 9390 8D8B" /* ihhilt|‚‹’––“��‹ */ $"8784 8381 807F 7F7E 7D7C 7C7A 7A7C 7C7B" /* ‡„ƒ�€..~}||zz||{ */ $"7875 7372 7274 7679 7B7C 7F81 8385 898D" /* xusrrtvy{|.�ƒ…‰� */ $"8F91 9191 8E8A 837C 7671 6E6C 6A69 6969" /* �‘‘‘ŽŠƒ|vqnljiii */ $"6A6E 7178 7D80 8386 888A 8A8A 8989 898A" /* jnqx}€ƒ†ˆŠŠŠ‰‰‰Š */ $"8A8A 8783 807F 7C7C 7B7B 7B7C 7F80 8182" /* ŠŠ‡ƒ€.||{{{|.€�‚ */ $"807C 7773 7171 7376 787A 7B7B 7B7C 8083" /* €|wsqqsvxz{{{|€ƒ */ $"878A 8B8B 8A87 817C 7979 7B7E 8080 7F79" /* ‡Š‹‹Š‡�|yy{~€€.y */ $"7572 7172 767C 8185 8888 8682 807E 7C7C" /* urqrv|�…ˆˆ†‚€~|| */ $"7F80 8080 7D7C 7C7E 8085 898D 8E8E 8D89" /* .€€€}||~€…‰�ŽŽ�‰ */ $"8580 7A75 726F 6F6D 6C6C 6B69 6A6F 747C" /* …€zuroomllkijot| */ $"8289 8E93 9392 8F8A 8682 8080 7F80 7F7D" /* ‚‰Ž““’�І‚€€.€.} */ $"7C7C 7B7B 7B7D 8080 807E 7B78 7572 7275" /* ||{{{}€€€~{xurru */ $"797C 8080 8284 8687 898D 8F8F 8F8C 8985" /* y|€€‚„†‡‰����Œ‰… */ $"817D 7974 6F6C 6967 6769 6A6E 7277 7C80" /* �}ytoliggijnrw|€ */ $"8387 8B8D 8F8F 8F8F 8C89 8580 7E7C 7A7A" /* ƒ‡‹�����Œ‰…€~|zz */ $"7A7C 7E7F 8081 8180 7D7D 7D7D 7C7B 7A79" /* z|~.€��€}}}}|{zy */ $"7777 7777 777A 7D81 868B 8D8C 8883 807F" /* wwwwwz}�†‹�Œˆƒ€. */ $"7D7E 7F7D 7B79 7773 7070 7174 7A80 8487" /* }~.}{ywsppqtz€„‡ */ $"8785 817F 7E80 8286 8685 8481 7E7B 7978" /* ‡…�.~€‚††…„�~{yx */ $"797C 8187 8B8C 8C8A 8682 807F 7D7A 7673" /* y|�‡‹ŒŒŠ†‚€.}zvs */ $"7170 6E6D 6B6A 6E74 7D85 8C8F 8F8A 8582" /* qpnmkjnt}…Œ��Š…‚ */ $"8283 8485 8584 8280 7D79 7574 777A 7E82" /* ‚ƒ„……„‚€}yutwz~‚ */ $"8481 7E7A 7879 7A7C 7D7D 7D7F 8081 8282" /* „�~zxyz|}}}.€�‚‚ */ $"8385 8788 8B8B 8A88 8582 807D 7974 6F6B" /* ƒ…‡ˆ‹‹Šˆ…‚€}ytok */ $"6A6D 7072 7372 7273 777E 858B 9092 9290" /* jmprsrrsw~…‹�’’� */ $"8C88 8380 7C7B 7C7D 7E7D 7A77 777A 7E81" /* Œˆƒ€|{|}~}zwwz~� */ $"8484 8280 7E7E 7D7D 7C7A 7A7A 7B7D 8080" /* „„‚€~~}}|zzz{}€€ */ $"8182 8283 8382 8180 8080 8080 7D79 746F" /* �‚‚ƒƒ‚�€€€€€}yto */ $"6D6F 7579 7D80 8080 8080 8082 8586 888A" /* mouy}€€€€€€‚…†ˆŠ */ $"8784 807B 7676 797D 8183 8280 7E7E 8084" /* ‡„€{vvy}�ƒ‚€~~€„ */ $"8789 8987 8480 7B78 7573 7375 7577 7878" /* ‡‰‰‡„€{xussuuwxx */ $"7878 7B7F 8283 8482 8080 8080 8282 8281" /* xx{.‚ƒ„‚€€€€‚‚‚� */ $"807D 7D7D 7C7B 7B7B 7B7C 7D7E 7F80 8082" /* €}}}|{{{{|}~.€€‚ */ $"8382 807F 7D7D 7E81 8586 8584 8280 8080" /* ƒ‚€.}}~�…†…„‚€€€ */ $"8284 8483 807C 7875 7271 7174 7779 7978" /* ‚„„ƒ€|xurqqtwyyx */ $"7675 767A 8189 8E90 908C 8782 7E7C 7B7C" /* vuvz�‰Ž��Œ‡‚~|{| */ $"7D7D 7C7B 7877 7779 7C80 8487 8785 8482" /* }}|{xwwy|€„‡‡…„‚ */ $"8080 807F 7E7D 7E7F 8080 807D 7C7B 7B7C" /* €€€.~}~.€€€}|{{| */ $"7F80 8281 807D 7976 7371 7276 7B80 8384" /* .€‚�€}yvsqrv{€ƒ„ */ $"8381 7F7E 8082 8587 8784 817D 7877 787B" /* ƒ�.~€‚…‡‡„�}xwx{ */ $"7F82 8484 8380 7E7D 7E80 8183 8484 8280" /* .‚„„ƒ€~}~€�ƒ„„‚€ */ $"7F7D 7B7B 7B7A 7A7B 7B7B 7B7B 7B7B 7B7B" /* .}{{{zz{{{{{{{{{ */ $"7B7C 7D7E 8082 8283 8281 7F7D 7D7D 7E7F" /* {|}~€‚‚ƒ‚�.}}}~. */ $"7F7D 7A79 7A7B 7E81 8486 8786 8482 8080" /* .}zyz{~�„†‡†„‚€€ */ $"7E7F 8080 8180 7F7E 7D7E 8080 807F 7D7B" /* ~.€€�€.~}~€€€.}{ */ $"7979 797A 7B7B 7B7B 7A79 797B 7D80 8284" /* yyyz{{{{zyy{}€‚„ */ $"8686 8380 7E7E 8081 8280 7E7B 7877 7879" /* ††ƒ€~~€�‚€~{xwxy */ $"7B7D 7F80 8183 8484 8383 8384 8586 8684" /* {}.€�ƒ„„ƒƒƒ„…††„ */ $"8281 807D 7B79 7776 7577 797B 7D7D 7B79" /* ‚�€}{ywvuwy{}}{y */ $"7979 7B7D 8082 8383 8282 807F 7E7F 8084" /* yy{}€‚ƒƒ‚‚€.~.€„ */ $"8585 827D 7977 7879 7D80 8282 8280 807F" /* ……‚}ywxy}€‚‚‚€€. */ $"7D7C 7B7C 7D80 8284 8483 8282 8282 8281" /* }|{|}€‚„„ƒ‚‚‚‚‚� */ $"807E 7D7B 7978 7573 7273 777B 8081 8281" /* €~}{yxusrsw{€�‚� */ $"8080 8081 8181 8181 8180 7D7A 7776 767A" /* €€€������€}zwvvz */ $"8085 8787 8584 8382 8383 8381 807F 7E7C" /* €…‡‡…„ƒ‚ƒƒƒ�€.~| */ $"7B7A 7A7A 7C7E 7F7E 7C79 7979 7C7E 8080" /* {zzz|~.~|yyy|~€€ */ $"8080 7F7F 8081 8181 807E 7C7C 7D7E 7E7E" /* €€..€���€~||}~~~ */ $"8080 807F 7E7A 7979 7A7C 7F80 7F7E 7E80" /* €€€.~zyyz|.€.~~€ */ $"8185 8687 8585 8484 8687 8785 8380 7C77" /* �…†‡……„„†‡‡…ƒ€|w */ $"7270 6F70 7275 7879 7979 797D 8186 8B8C" /* rpopruxyyyy}�†‹Œ */ $"8A87 8380 7E7E 7E7E 7F80 807E 7C7A 7878" /* Їƒ€~~~~.€€~|zxx */ $"787C 8084 8585 8280 7E7C 7C7B 7A7A 7C7E" /* x|€„……‚€~||{zz|~ */ $"8083 8586 8685 8585 8583 807F 7C7A 7775" /* €ƒ…††…………ƒ€.|zwu */ $"7473 7375 787C 8081 8180 7D7D 7E81 8587" /* tssux|€��€}}~�…‡ */ $"8886 8380 7C78 7575 777A 7E80 8283 8381" /* ˆ†ƒ€|xuuwz~€‚ƒƒ� */ $"8184 8687 8785 807D 7B7A 7A7A 7A7A 7A7A" /* �„†‡‡…€}{zzzzzzz */ $"7A7A 7B7C 7D7F 8080 8181 8282 8283 8584" /* zz{|}.€€��‚‚‚ƒ…„ */ $"817C 7876 7679 7C80 8183 817F 7C7B 7B7B" /* �|xvvy|€�ƒ�.|{{{ */ $"7B7C 7E80 7F7E 7C7B 7C7F 8286 8888 8684" /* {|~€.~|{|.‚†ˆˆ†„ */ $"8384 8587 8785 827F 7B77 7573 7170 7172" /* ƒ„…‡‡…‚.{wusqpqr */ $"7476 787B 8084 888B 8D8B 8885 8180 8181" /* tvx{€„ˆ‹�‹ˆ…�€�� */ $"8180 7C79 7776 7677 7A7C 7D7E 7F7F 8080" /* �€|ywvvwz|}~..€€ */ $"8080 8182 8280 7E7C 7B7C 8084 888A 8886" /* €€�‚‚€~|{|€„ˆŠˆ† */ $"8483 8181 8080 7D7A 7875 7371 7174 787C" /* „ƒ��€€}zxusqqtx| */ $"8082 8180 7E7D 7F83 878A 8A88 847F 7B78" /* €‚�€~}.ƒ‡ŠŠˆ„.{x */ $"7777 7879 7B7C 7E80 8081 8183 8486 8685" /* wwxy{|~€€��ƒ„††… */ $"8380 7E7C 7B7B 7A78 7778 7A7D 8083 8381" /* ƒ€~|{{zxwxz}€ƒƒ� */ $"807D 7C7E 8184 8686 8482 7E79 7573 767B" /* €}|~�„††„‚~yusv{ */ $"8083 8483 7E79 7675 787C 8082 8280 7E7C" /* €ƒ„ƒ~yvux|€‚‚€~| */ $"7B7B 7C80 8488 8A8A 8884 8180 8081 8484" /* {{|€„ˆŠŠˆ„�€€�„„ */ $"8380 7B77 7473 7272 7273 7578 7C80 8487" /* ƒ€{wtsrrrsux|€„‡ */ $"8888 8888 8785 8484 8482 807E 7A77 7574" /* ˆˆˆˆ‡…„„„‚€~zwut */ $"7678 7B7D 7D7B 7B7A 7B7C 7E81 8484 8483" /* vx{}}{{z{|~�„„„ƒ */ $"8280 8080 8184 8788 8785 827F 7D7B 7B7C" /* ‚€€€�„‡ˆ‡…‚.}{{| */ $"7C7B 7877 7777 787A 7C7E 8080 8080 8080" /* |{xwwwxz|~€€€€€€ */ $"8284 8587 8684 817F 7D7B 7B7B 7B7B 7A7A" /* ‚„…‡†„�.}{{{{{zz */ $"7B7B 7C7E 8082 8484 8482 817F 7E7D 7D7E" /* {{|~€‚„„„‚�.~}}~ */ $"7E7E 7D7C 7C7D 7D7E 8080 8080 8080 8181" /* ~~}||}}~€€€€€€�� */ $"8181 8180 807E 7E7E 7E7D 7D7D 7C7B 7A79" /* ���€€~~~~}}}|{zy */ $"797A 7B7B 7B7C 7D7E 8080 8283 8484 8484" /* yz{{{|}~€€‚ƒ„„„„ */ $"8483 8382 8282 8181 807E 7D7B 7B7A 7A79" /* „ƒƒ‚‚‚��€~}{{zzy */ $"7877 7777 777A 7D80 8284 8586 8686 8686" /* xwwwwz}€‚„…††††† */ $"8584 8381 807E 7B7A 7877 7777 7778 7879" /* …„ƒ�€~{zxwwwwxxy */ $"7A7B 7B7C 7D7E 8082 8486 8686 8685 8382" /* z{{|}~€‚„††††…ƒ‚ */ $"8281 8181 8181 807D 7A78 7878 797C 7D7F" /* ‚�����€}zxxxy|}. */ $"7F7E 7C7B 797A 7C80 8283 8484 8381 807F" /* .~|{yz|€‚ƒ„„ƒ�€. */ $"8080 8182 8180 7D7A 7978 797C 7D80 8181" /* €€�‚�€}zyxy|}€�� */ $"8180 807E 7D7D 7E80 8081 8181 807F 7E7D" /* �€€~}}~€€���€.~} */ $"7D7D 7E80 8081 8180 807F 7E7E 8081 8283" /* }}~€€��€€.~~€�‚ƒ */ $"8381 7F7C 7A78 7879 7A7B 7B7C 7B7A 7A7B" /* ƒ�.|zxxyz{{|{zz{ */ $"7C80 8284 8686 8483 8280 8080 8181 8282" /* |€‚„††„ƒ‚€€€��‚‚ */ $"8180 7E7D 7C7C 7C7C 7C7C 7B7A 7878 797B" /* �€~}||||||{zxxy{ */ $"7D80 8183 8484 8484 8484 8383 8383 8281" /* }€�ƒ„„„„„„ƒƒƒƒ‚� */ $"7F7C 7A79 7777 7777 7879 797A 7B7B 7C7D" /* .|zywwwwxyyz{{|} */ $"8082 8587 8786 8583 8281 8282 8383 8281" /* €‚…‡‡†…ƒ‚�‚‚ƒƒ‚� */ $"807D 7B7A 7B7C 7C7E 7F7E 7D7B 7978 797B" /* €}{z{||~.~}{yxy{ */ $"7C80 8283 8382 8180 8080 8081 8282 8280" /* |€‚ƒƒ‚�€€€€�‚‚‚€ */ $"7E7C 7B7A 7A7B 7C7E 7F7F 7F7E 7C7C 7C7C" /* ~|{zz{|~...~|||| */ $"7D80 8182 8383 8280 7D7C 7D7E 8081 8283" /* }€�‚ƒƒ‚€}|}~€�‚ƒ */ $"8281 7F7E 7E7F 8082 8282 827F 7C7A 7878" /* ‚�.~~.€‚‚‚‚.|zxx */ $"787A 7C7C 7D7D 7D7D 7D7D 7D7E 8082 8282" /* xz||}}}}}}}~€‚‚‚ */ $"8282 8180 8080 8181 8282 8281 807D 7C7B" /* ‚‚�€€€��‚‚‚�€}|{ */ $"7A7A 7B7C 7D7D 7D7D 7C7C 7C7D 8081 8384" /* zz{|}}}}|||}€�ƒ„ */ $"8584 8483 8282 8181 8181 807E 7C7B 7A79" /* …„„ƒ‚‚����€~|{zy */ $"7979 7979 7A7A 7B7C 7C7E 8080 8181 8282" /* yyyyzz{||~€€��‚‚ */ $"8282 8282 8283 8383 8282 8180 807F 7E7D" /* ‚‚‚‚‚ƒƒƒ‚‚�€€.~} */ $"7C7B 7A7A 7A7B 7B7C 7D7E 7F80 8181 8180" /* |{zzz{{|}~.€���€ */ $"8081 8181 8181 8282 8180 7F7D 7C7A 7A7A" /* €�����‚‚�€.}|zzz */ $"7B7C 7D7D 7D7D 7C7C 7D7E 7F80 8181 8180" /* {|}}}}||}~.€���€ */ $"7F7E 7E7F 8081 8283 8382 8181 8182 8282" /* .~~.€�‚ƒƒ‚���‚‚‚ */ $"8180 7F7D 7C7B 7B7A 7A7B 7B7D 7E7F 8081" /* �€.}|{{zz{{}~.€� */ $"8181 807F 7E7C 7B7C 7D7F 8181 8080 7F7F" /* ��€.~|{|}.��€€.. */ $"8080 8282 8281 807E 7D7D 7C7D 7D7E 7F7F" /* €€‚‚‚�€~}}|}}~.. */ $"7E7D 7C7C 7E80 8284 8585 8483 8281 8181" /* ~}||~€‚„……„ƒ‚��� */ $"807F 7E7D 7C7C 7B7B 7C7D 7E7E 7D7D 7C7B" /* €.~}||{{|}~~}}|{ */ $"7B7D 7E7F 807F 7E7D 7D7D 7E80 8182 8282" /* {}~.€.~}}}~€�‚‚‚ */ $"8282 8282 8282 8281 807F 7D7C 7B7B 7D7E" /* ‚‚‚‚‚‚‚�€.}|{{}~ */ $"7F80 7F7E 7E7F 8080 8181 8181 8080 8080" /* .€.~~.€€����€€€€ */ $"8080 8080 807E 7C79 7879 7B7D 7F80 807F" /* €€€€€~|yxy{}.€€. */ $"7D7D 7D7D 7E80 8080 7F7D 7C7C 7D7F 8183" /* }}}}~€€€.}||}.�ƒ */ $"8586 8583 8281 8181 8181 807E 7C7B 7A7B" /* …†…ƒ‚�����€~|{z{ */ $"7B7C 7D7D 7D7D 7E7E 8081 8282 8281 807E" /* {|}}}}~~€�‚‚‚�€~ */ $"7C7B 7B7C 7D7D 7E7D 7D7D 7D7F 8081 8281" /* |{{|}}~}}}}.€�‚� */ $"8180 7E7D 7D7D 7D7F 7F80 807F 7F7F 7F80" /* �€~}}}}..€€....€ */ $"8283 8484 8383 8181 8080 7F7E 7C7B 7A7A" /* ‚ƒ„„ƒƒ��€€.~|{zz */ $"7A7A 7B7D 7F80 8081 8080 7F7E 7E7E 7E7D" /* zz{}.€€�€€.~~~~} */ $"7C7B 7B7B 7B7D 7F80 8081 8080 8081 8182" /* |{{{{}.€€�€€€��‚ */ $"8383 8281 807E 7D7C 7D7D 7E7F 8080 8080" /* ƒƒ‚�€~}|}}~.€€€€ */ $"8081 8282 8180 807E 7D7D 7C7C 7C7D 7D7E" /* €�‚‚�€€~}}|||}}~ */ $"7E7E 7D7D 7D7D 7D7D 7E7E 7F7F 7F7F 7F7F" /* ~~}}}}}}~~...... */ $"7F7E 7D7D 7D7E 7F80 8080 8081 8283 8383" /* .~}}}~.€€€€�‚ƒƒƒ */ $"8382 8180 807F 7E7D 7D7D 7D7E 7D7D 7C7C" /* ƒ‚�€€.~}}}}~}}|| */ $"7D7F 8081 8282 8181 8080 7F7D 7C7B 7A7A" /* }.€�‚‚��€€.}|{zz */ $"7A7B 7B7C 7D7F 8081 8282 8180 807F 7F7E" /* z{{|}.€�‚‚�€€..~ */ $"7E7E 7E7F 8080 8181 8181 8181 8282 8382" /* ~~~.€€������‚‚ƒ‚ */ $"8180 7F7F 7E7E 7C7C 7B7B 7C7D 7D7E 7E7E" /* �€..~~||{{|}}~~~ */ $"8080 8181 8180 7F7E 7C7C 7C7C 7C7D 7E7E" /* €€���€.~|||||}~~ */ $"7F7E 7D7C 7C7D 7F81 8283 8382 8181 8080" /* .~}||}.�‚ƒƒ‚��€€ */ $"8080 8080 7F7F 7F7E 7E7F 8081 8283 8381" /* €€€€...~~.€�‚ƒƒ� */ $"807E 7C7C 7C7C 7D7D 7E7E 7F7F 7E7D 7C7C" /* €~||||}}~~..~}|| */ $"7C7D 7F80 8080 8080 807F 7E7E 7E7E 7F7F" /* |}.€€€€€€.~~~~.. */ $"807F 7E7E 7E7F 8082 8383 8382 8180 807F" /* €.~~~.€‚ƒƒƒ‚�€€. */ $"7F7F 7F80 807F 7E7D 7C7C 7C7E 8081 8282" /* ...€€.~}|||~€�‚‚ */ $"8181 807F 7E7D 7B7A 7A7A 7B7C 7D7D 7E7E" /* ��€.~}{zzz{|}}~~ */ $"7F80 8181 8181 8180 807F 7E7E 7E7E 8081" /* .€�����€€.~~~~€� */ $"8282 8281 8080 8080 8080 8180 8080 7F7E" /* ‚‚‚�€€€€€€�€€€.~ */ $"7D7C 7C7D 7E7F 8080 7F7E 7E7E 7F80 807F" /* }||}~.€€.~~~.€€. */ $"7E7E 7E7E 7E7E 7D7D 7D7D 7D7E 7E7E 7E7E" /* ~~~~~~}}}}}~~~~~ */ $"7F80 8080 8181 8182 8282 8180 7F7E 7D7E" /* .€€€���‚‚‚�€.~}~ */ $"7F80 8081 8080 8080 807F 7F7F 7F7F 7F7E" /* .€€�€€€€€......~ */ $"7E7D 7C7D 7D7E 7F80 7F7E 7D7D 7E7E 7E7E" /* ~}|}}~.€.~}}~~~~ */ $"7E7E 7F7F 8080 7F7F 7F7F 7F7F 807F 7F7F" /* ~~..€€......€... */ $"7F80 8080 8081 8181 8282 8180 7F7E 7E7E" /* .€€€€���‚‚�€.~~~ */ $"7F7F 7F7F 7F7E 7F7F 8080 807F 7F7F 7E7E" /* .....~..€€€...~~ */ $"7D7C 7B7C 7D7E 7F80 7F7E 7D7D 7E7F 8080" /* }|{|}~.€.~}}~.€€ */ $"8181 8180 807F 7E7E 7F80 8081 8181 807F" /* ���€€.~~.€€���€. */ $"7E7E 7E7F 8080 8080 8080 7F7F 7F80 8081" /* ~~~.€€€€€€...€€� */ $"8181 807F 7E7C 7C7D 7E7E 7F7F 7F80 807F" /* ��€.~||}~~...€€. */ $"7E7C 7C7C 7C7E 7F80 8080 8080 8080 8181" /* ~||||~.€€€€€€€�� */ $"8181 8181 8080 7E7E 7E7F 8081 8181 807F" /* ����€€~~~.€���€. */ $"7E7D 7D7E 7E7F 8080 8080 7F7E 7E7E 7F80" /* ~}}~~.€€€€.~~~.€ */ $"8181 8180 7E7E 7D7D 7D7D 7D7E 7E7E 7E7E" /* ���€~~}}}}}~~~~~ */ $"7F7F 7F80 8081 8181 807F 7E7E 7E7E 8080" /* ...€€���€.~~~~€€ */ $"8181 8282 8281 807F 7E7E 7E7F 8080 807F" /* ��‚‚‚�€.~~~.€€€. */ $"7F7F 7F7F 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ....~~~~~~~~~~~~ */ $"7F80 8080 7F7E 7E7E 7E7E 7F7F 7F80 8080" /* .€€€.~~~~~...€€€ */ $"8080 7F7E 7E7F 8080 8080 7F7F 7F7F 7F7E" /* €€.~~.€€€€.....~ */ $"7E7E 7F80 8081 8181 8181" /* ~~.€€����� */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Chirp.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Chirp.r new file mode 100644 index 0000000..c11b86a --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Chirp.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 1500 0000 0543 6869 7270" /* ...........Chirp */ }; data $8024 (0x15) { $"0000 1500 E882 0000 EE56 8080 8080 8080" /* .....‚...V€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"5944 3831 3540 546C 86A0 B6C6 CDCD C3B2" /* YD815@Tl† ¶ÆÍÍò */ $"9A81 674F 3E34 3139 485E 7793 AABE CBCF" /* š�gO>419H^w“ª¾ËÏ */ $"CABD A990 765D 4839 3134 3E4F 6781 9BB2" /* ʽ©�v]H914>Og�›² */ $"C3CD CFC7 B7A2 876D 5643 3531 3543 566D" /* ÃÍÏÇ·¢‡mVC515CVm */ $"87A2 B7C6 CDCD C3B3 9D82 6A52 3F34 3138" /* ‡¢·ÆÍÍó�‚jR?418 */ $"4559 718B A4B9 C7CF CCC2 B19A 8167 513F" /* EYq‹¤¹ÇÏ̱š�gQ? */ $"3431 3845 5971 8AA3 B8C7 CFCD C3B3 9D84" /* 418EYqŠ£¸ÇÏÍó�„ */ $"6B53 4235 3135 4254 6C85 9DB3 C3CD CFC7" /* kSB515BTl…�³ÃÍÏÇ */ $"B9A5 8E74 5C48 3931 333B 4C60 7A93 A9BC" /* ¹¥Žt\H913;L`z“©¼ */ $"C8CF CCC2 B19B 826A 5342 3631 353F 5167" /* ÈÏ̱›‚jSB615?Qg */ $"7F98 ADC0 CBCF CBC0 AF99 8168 5340 3531" /* .˜­ÀËÏËÀ¯™�hS@51 */ $"353F 4F66 7E95 ACBD CACF CCC2 B39E 866F" /* 5?Of~•¬½ÊÏ̳ž†o */ $"5845 3931 333A 485C 728A A2B4 C3CC CFC8" /* XE913:H\rŠ¢´ÃÌÏÈ */ $"BDAC 967E 6752 4236 3134 3D4C 6076 8EA3" /* ½¬–~gRB614=L`vŽ£ */ $"B7C5 CDCF C8BD AC96 806A 5443 3831 333A" /* ·ÅÍÏȽ¬–€jTC813: */ $"485B 7086 9DB1 C1CB CFCC C3B4 A38C 7660" /* H[p†�±ÁËÏÌô£Œv` */ $"4D3F 3531 343E 4C5E 758A A0B3 C1CB CFCC" /* M?514>L^uŠ ³ÁËÏÌ */ $"C3B6 A38F 7963 4F40 3631 333A 4758 6D82" /* ö£�ycO@613:GXm‚ */ $"98AC BCC7 CDCF C8BE AE9B 8671 5D4C 3D34" /* ˜¬¼ÇÍÏȾ®›†q]L=4 */ $"3134 3D49 5B6F 8499 ACBB C7CD CFCA C0B1" /* 14=I[o„™¬»ÇÍÏÊÀ± */ $"A08B 7662 5142 3831 3338 4351 6377 8CA0" /*  ‹vbQB8138CQcwŒ  */ $"B2C0 CACF CDC8 BDAF 9D89 7561 4F42 3833" /* ²ÀÊÏÍȽ¯�‰uaOB83 */ $"3138 404F 6074 879B ADBC C7CD CFCB C2B6" /* 18@O`t‡›­¼ÇÍÏ˶ */ $"A593 806C 594A 3D35 3133 3944 5263 768A" /* ¥“€lYJ=5139DRcvŠ */ $"9DAE BCC7 CDCF CBC3 B8A8 9684 715E 4E40" /* �®¼ÇÍÏËø¨–„q^N@ */ $"3833 3136 3F4C 5B6C 7F93 A4B4 C1CA CFCF" /* 8316?L[l.“¤´ÁÊÏÏ */ $"CAC1 B4A5 9381 6D5D 4D40 3833 3135 3E4A" /* ÊÁ´¥“�m]M@8315>J */ $"586A 7C8F A0B1 BDC7 CDCF CCC5 B9AC 9B89" /* Xj|� ±½ÇÍÏÌŹ¬›‰ */ $"7665 5447 3B34 3133 3842 4E5D 6F81 93A4" /* veTG;4138BN]o�“¤ */ $"B3C0 C8CD CFCB C3B9 AA9A 8976 6556 473D" /* ³ÀÈÍÏËùªš‰veVG= */ $"3531 3338 404C 5B6C 7E8F A0AF BDC7 CCCF" /* 5138@L[l~� ¯½ÇÌÏ */ $"CCC7 BDB1 A08F 7E6C 5C4D 4038 3331 343B" /* Ìǽ± �~l\M@8314; */ $"4553 6374 8696 A8B6 C1CA CDCF CBC3 B9AA" /* ESct†–¨¶ÁÊÍÏËùª */ $"9B8A 7967 5749 3E36 3131 353E 4857 6777" /* ›ŠygWI>6115>HWgw */ $"8A9A AAB8 C3CB CFCD CAC2 B6A8 9886 7663" /* Ššª¸ÃËÏÍʶ¨˜†vc */ $"5447 3D35 3133 383F 4C59 6A7B 8C9E ADBB" /* TG=5138?LYj{Œž­» */ $"C5CC CFCD C8C0 B3A5 9482 7160 5144 3A34" /* ÅÌÏÍÈÀ³¥”‚q`QD:4 */ $"3134 3943 4F5E 6F81 93A3 B3BE C8CD CFCC" /* 149CO^o�“£³¾ÈÍÏÌ */ $"C6BB AD9E 8C7A 6A58 4A3E 3631 3136 3E49" /* Æ»­žŒzjXJ>6116>I */ $"5868 7A8B 9DAD BBC6 CCCF CDC7 BEB1 A290" /* Xhz‹�­»ÆÌÏÍǾ±¢� */ $"7E6C 5B4C 3F38 3331 353E 4958 687A 8C9E" /* ~l[L?8315>IXhzŒž */ $"AFBC C6CC CFCC C6BC AD9D 8B79 6756 473D" /* ¯¼ÆÌÏÌÆ¼­�‹ygVG= */ $"3431 3339 434F 6071 8598 A8B8 C3CB CFCD" /* 4139CO`q…˜¨¸ÃËÏÍ */ $"C8BE B1A0 8F7B 6857 483D 3431 3339 4351" /* Ⱦ± �{hWH=4139CQ */ $"6275 899B ADBB C6CC CFCC C5B9 AA98 8571" /* bu‰›­»ÆÌÏÌŹª˜…q */ $"5E4E 4038 3331 3640 4D5E 7185 99AA B9C6" /* ^N@8316@M^q…™ª¹Æ */ $"CCCF CCC5 B8A8 9682 6D5B 4A3E 3531 333A" /* ÌÏÌŸ¨–‚m[J>513: */ $"4554 677A 8FA2 B3C1 CACF CDC7 BCAD 9A86" /* ETgz�¢³ÁÊÏÍǼ­š† */ $"715D 4D3F 3531 333A 4556 687E 93A5 B6C3" /* q]M?513:EVh~“¥¶Ã */ $"CCCF CCC3 B7A5 937E 6754 4439 3331 3642" /* ÌÏÌ÷¥“~gTD9316B */ $"5163 798E A2B4 C2CB CFCC C3B6 A590 7B66" /* QcyŽ¢´ÂËÏÌö¥�{f */ $"5243 3831 3339 4556 6A80 96AA BBC7 CDCF" /* RC8139EVj€–ª»ÇÍÏ */ $"C8BD AD99 826C 5847 3933 3138 4354 687E" /* Ƚ­™‚lXG9318CTh~ */ $"95A9 BBC7 CDCD C7BB A994 7E67 5342 3631" /* •©»ÇÍÍÇ»©”~gSB61 */ $"333B 495C 7189 A0B3 C2CC CFCB C1AF 9B85" /* 3;I\q‰ ³ÂÌÏËÁ¯›… */ $"6D58 4539 3333 3A48 5B71 879F B3C2 CCCF" /* mXE933:H[q‡Ÿ³ÂÌÏ */ $"CABE AD99 816A 5342 3631 343D 4D62 7A91" /* ʾ­™�jSB614=Mbz‘ */ $"A8BB C7CF CDC5 B6A3 8B72 5C48 3A33 333A" /* ¨»ÇÏÍŶ£‹r\H:33: */ $"485C 728B A3B7 C6CD CDC7 B8A4 8E75 5D48" /* H\r‹£·ÆÍÍǸ¤Žu]H */ $"3A33 333A 495D 768E A5B9 C7CF CDC3 B49F" /* :33:I]vŽ¥¹ÇÏÍôŸ */ $"866D 5744 3831 343F 4F67 7F98 AFC1 CBCF" /* †mWD814?Og.˜¯ÁËÏ */ $"CABD AA93 7A61 4C3B 3333 3A49 5D76 90A8" /* ʽª“zaL;33:I]v�¨ */ $"BCC8 CFCC C1AF 997F 664F 3E34 3138 475B" /* ¼ÈÏÌÁ¯™.fO>418G[ */ $"748E A5B9 C8CF CCC2 B199 8066 4F3E 3431" /* tŽ¥¹ÈÏ̱™€fO>41 */ $"3947 5C75 8FA8 BCC8 CFCC C0AD 967C 624C" /* 9G\u�¨¼ÈÏÌÀ­–|bL */ $"3B33 333A 4A61 7A94 ADC0 CBCF CABC A88F" /* ;33:Jaz”­ÀËÏʼ¨� */ $"755C 4738 3134 3F51 6882 9DB3 C3CD CDC6" /* u\G814?Qh‚�³ÃÍÍÆ */ $"B69F 866B 5340 3431 3845 5B72 8EA7 BBC8" /* ¶Ÿ†kS@418E[rާ»È */ $"CFCB C0AD 947A 604A 3A33 333D 4D65 7F99" /* ÏËÀ­”z`J:33=Me.™ */ $"B1C2 CCCF C7B8 A389 6D56 4235 3136 4358" /* ±ÂÌÏǸ£‰mVB516CX */ $"708A A4B9 C8CF CCC1 AF96 7E63 4D3B 3333" /* pФ¹ÈÏÌÁ¯–~cM;33 */ $"3B4C 627B 96AD C1CC CFC8 BBA5 8C72 5945" /* ;Lb{–­ÁÌÏÈ»¥ŒrYE */ $"3831 3440 536B 859F B4C5 CDCD C5B4 9E85" /* 814@Sk…Ÿ´ÅÍÍÅ´ž… */ $"6A53 4034 3138 4559 718B A5B9 C8CF CCC1" /* jS@418EYq‹¥¹ÈÏÌÁ */ $"AF99 7F66 4F3D 3431 3948 5D76 8FA8 BCC8" /* ¯™.fO=419H]v�¨¼È */ $"CFCC C1AE 967E 634D 3D34 3139 485D 758F" /* ÏÌÁ®–~cM=419H]u� */ $"A7BB C8CF CCC1 B199 8167 513F 3431 3844" /* §»ÈÏÌÁ±™�gQ?418D */ $"586F 89A0 B6C6 CDCD C6B6 A28A 7058 4538" /* Xo‰ ¶ÆÍÍÆ¶¢ŠpXE8 */ $"3134 3E4E 637E 96AD BECB CFCB C0AE 987F" /* 14>Nc~–­¾ËÏËÀ®˜. */ $"6751 3F35 3136 4253 6A82 9BB1 C1CC CFCA" /* gQ?516BSj‚›±ÁÌÏÊ */ $"BEAC 967E 664F 3F34 3136 4253 6A81 99AE" /* ¾¬–~fO?416BSj�™® */ $"C0CB CFCB C1B1 9B82 6B56 4338 3134 3D4C" /* ÀËÏËÁ±›‚kVC814=L */ $"6076 8FA4 B8C6 CDCF C7BB A893 7B63 4F3F" /* `v�¤¸ÆÍÏÇ»¨“{cO? */ $"3531 353F 4F63 7A91 A7B9 C7CD CDC7 BBA9" /* 515?Ocz‘§¹ÇÍÍÇ»© */ $"947E 6752 4236 3134 3D4A 5D72 8AA0 B3C2" /* ”~gRB614=J]rŠ ³Â */ $"CCCF CBC1 B39F 8A72 5D4A 3D34 3135 3F4F" /* ÌÏËÁ³ŸŠr]J=415?O */ $"6277 8EA3 B4C3 CCCF CBC1 B3A0 8A75 604D" /* bwŽ£´ÃÌÏËÁ³ Šu`M */ $"3F35 3134 3D4A 5B70 869A AEBD C8CF CDC7" /* ?514=J[p†š®½ÈÏÍÇ */ $"BCAC 9882 6D5B 483B 3431 353E 4C5D 7186" /* ¼¬˜‚m[H;415>L]q† */ $"9BAE BDC8 CDCF C8BE AF9D 8974 604D 3F36" /* ›®½ÈÍÏȾ¯�‰t`M?6 */ $"3133 3944 5467 7B8F A3B4 C1CB CFCD C7BB" /* 139DTg{�£´ÁËÏÍÇ» */ $"AC99 8671 5E4D 3F36 3133 3943 5163 768A" /* ¬™†q^M?6139CQcvŠ */ $"9EAF BEC8 CDCF CAC1 B3A3 907C 6A57 483B" /* ž¯¾ÈÍÏÊÁ³£�|jWH; */ $"3431 343A 4554 677A 8CA0 B1BE C8CD CFCB" /* 414:ETgzŒ ±¾ÈÍÏË */ $"C2B6 A594 816D 5C4C 3F36 3133 3840 4D5D" /* ¶¥”�m\L?6138@M] */ $"7082 95A7 B6C2 CBCF CDC8 C0B3 A390 7E6B" /* p‚•§¶ÂËÏÍÈÀ³£�~k */ $"5B4A 3F36 3133 363F 4C5B 6D7F 93A3 B3C0" /* [J?6136?L[m.“£³À */ $"C8CD CFCB C3B8 A999 8674 6252 443A 3431" /* ÈÍÏËø©™†tbRD:41 */ $"3439 4351 6071 8496 A7B6 C1CA CFCF CAC2" /* 49CQ`q„–§¶ÁÊÏÏÊ */ $"B7A8 9886 7462 5345 3A34 3133 3942 4E5D" /* ·¨˜†tbSE:4139BN] */ $"6F80 93A3 B2BE C8CD CFCC C6BB AE9E 8C7B" /* o€“£²¾ÈÍÏÌÆ»®žŒ{ */ $"6A59 4A3F 3633 3135 3D48 5666 7689 99A9" /* jYJ?6315=HVfv‰™© */ $"B8C2 CBCF CFCA C2B7 A899 8776 6554 473D" /* ¸ÂËÏÏÊ·¨™‡veTG= */ $"3531 3336 3F4A 596A 7A8C 9DAD BBC5 CCCF" /* 5136?JYjzŒ�­»ÅÌÏ */ $"CDC8 C1B4 A595 8472 6152 443A 3431 3338" /* ÍÈÁ´¥•„raRD:4138 */ $"404D 5C6C 7E8F A0AF BDC6 CCCF CDC7 BEB1" /* @M\l~� ¯½ÆÌÏÍǾ± */ $"A391 806D 5D4E 4239 3331 343A 4451 6171" /* £‘€m]NB9314:DQaq */ $"8495 A5B4 C1C8 CDCF CBC3 B9AA 9B8A 7767" /* „•¥´ÁÈÍÏËùª›Šwg */ $"5648 3D35 3133 383F 4C5B 6B7E 8FA0 AFBD" /* VH=5138?L[k~� ¯½ */ $"C7CC CFCC C6BC AF9F 8E7B 6A58 4A3E 3631" /* ÇÌÏÌÆ¼¯ŸŽ{jXJ>61 */ $"3136 3F4C 5B6B 7E8F A0B1 BEC7 CDCF CCC5" /* 16?L[k~� ±¾ÇÍÏÌÅ */ $"B9AA 9A89 7663 5345 3A34 3134 3A44 5263" /* ¹ªš‰vcSE:414:DRc */ $"7587 9AAA B9C5 CCCF CCC7 BCAE 9D8B 7966" /* u‡šª¹ÅÌÏÌǼ®�‹yf */ $"5445 3A34 3134 3A45 5365 798B 9EAF BDC7" /* TE:414:ESey‹ž¯½Ç */ $"CDCF CBC3 B7A8 9582 6F5C 4C3F 3631 3338" /* ÍÏË÷¨•‚o\L?6138 */ $"424F 6174 879B ADBC C7CD CFCB C2B6 A593" /* BOat‡›­¼ÇÍÏ˶¥“ */ $"7F6B 5848 3D34 3134 3B47 576A 7E91 A5B6" /* .kXH=414;GWj~‘¥¶ */ $"C2CB CFCC C6B9 AA98 826F 5B4A 3D35 3134" /* ÂËÏÌÆ¹ª˜‚o[J=514 */ $"3B48 586B 8095 A8B8 C5CC CFCB C2B4 A38F" /* ;HXk€•¨¸ÅÌÏË´£� */ $"7A65 5243 3833 3338 4353 677B 90A5 B6C3" /* zeRC8338CSg{�¥¶Ã */ $"CCCF CBC2 B4A3 8E77 634F 4036 3133 3A48" /* ÌÏË´£ŽwcO@613:H */ $"596D 8299 ADBD C8CF CDC7 BBA9 957F 6A54" /* Ym‚™­½ÈÏÍÇ»©•.jT */ $"4438 3333 3945 576C 8298 ADBD C8CF CDC6" /* D8339EWl‚˜­½ÈÏÍÆ */ $"B8A7 917A 634F 4035 3134 3D4C 6076 8CA3" /* ¸§‘zcO@514=L`vŒ£ */ $"B6C3 CCCF CABE AD98 816A 5443 3831 333B" /* ¶ÃÌÏʾ­˜�jTC813; */ $"4A5D 748B A2B6 C5CC CFC8 BDAA 957E 6651" /* J]t‹¢¶ÅÌÏȽª•~fQ */ $"4035 3135 3F4F 657C 94AA BCC8 CFCC C3B4" /* @515?Oe|”ª¼ÈÏÌô */ $"9F87 7058 4539 3133 3B4A 5E76 8FA5 B9C7" /* Ÿ‡pXE913;J^v�¥¹Ç */ $"CFCD C5B6 A28A 7159 4739 3133 3D4C 6079" /* ÏÍŶ¢ŠqYG913=L`y */ $"91A8 BCC8 CFCC C2B2 9B82 6A53 4235 3135" /* ‘¨¼ÈÏ̲›‚jSB515 */ $"4053 6A82 9BB1 C2CC CFC8 BBA7 8F76 5D48" /* @Sj‚›±ÂÌÏÈ»§�v]H */ $"3A33 333B 4C61 7A93 AABE CACF CBBE AD95" /* :33;Laz“ª¾ÊÏ˾­• */ $"7B62 4D3D 3333 3A49 5E77 90A8 BCCA CFCB" /* {bM=33:I^w�¨¼ÊÏË */ $"C0AD 967C 634D 3B33 333A 4A60 7993 AABE" /* À­–|cM;33:J`y“ª¾ */ $"CBCF CBBD AA93 795E 493A 3333 3D4D 657E" /* ËÏ˽ª“y^I:33=Me~ */ $"98AF C1CC CFC8 B9A4 8B71 5844 3631 3540" /* ˜¯ÁÌÏȹ¤‹qXD615@ */ $"546C 86A0 B6C6 CDCD C3B3 9B82 674F 3E34" /* Tl† ¶ÆÍÍó›‚gO>4 */ $"3139 485D 7691 AABD CBCF CABD A990 765D" /* 19H]v‘ª½ËÏʽ©�v] */ $"4839 3134 3F51 6882 9DB3 C3CD CDC6 B49F" /* H914?Qh‚�³ÃÍÍÆ´Ÿ */ $"856A 533F 3431 3845 5B74 8FA8 BCCA CFCB" /* …jS?418E[t�¨¼ÊÏË */ $"C0AC 937A 604A 3A33 333D 4E66 7F99 B1C2" /* À¬“z`J:33=Nf.™±Â */ $"CCCF C7B8 A389 6F56 4336 3135 4356 6F89" /* ÌÏǸ£‰oVC615CVo‰ */ $"A2B8 C7CF CCC3 B19A 8167 4F3E 3431 3948" /* ¢¸ÇÏÌñš�gO>419H */ $"5D76 8FA8 BCCA CFCB C0AD 957B 624C 3B33" /* ]v�¨¼ÊÏËÀ­•{bL;3 */ $"333A 4A60 7A93 AABE CBCF CBBE AA93 7A60" /* 3:J`z“ª¾ËÏ˾ª“z` */ $"4C3B 3333 3A4A 6079 93AA BDCA CFCB C0AD" /* L;33:J`y“ª½ÊÏËÀ­ */ $"967E 634D 3D34 3139 475B 728C A4B9 C7CF" /* –~cM=419G[rŒ¤¹ÇÏ */ $"CDC3 B39E 866C 5643 3631 353F 5167 8099" /* Íóž†lVC615?Qg€™ */ $"AFC1 CCCF CABD AA94 7C63 4E3E 3431 3844" /* ¯ÁÌÏʽª”|cN>418D */ $"576D 869E B3C3 CCCF C8BC A893 7A62 4D3D" /* Wm†ž³ÃÌÏȼ¨“zbM= */ $"3431 3844 566C 859D B1C1 CCCF CABE AD98" /* 418DVl…�±ÁÌÏʾ­˜ */ $"8068 5342 3631 343E 4E63 7A91 A8BB C7CD" /* €hSB614>Ncz‘¨»ÇÍ */ $"CDC6 B8A5 8F77 614D 3E34 3136 4051 677E" /* ÍÆ¸¥�waM>416@Qg~ */ $"94AA BCC8 CFCD C6B8 A590 7A63 4F3F 3531" /* ”ª¼ÈÏÍÆ¸¥�zcO?51 */ $"343E 4D60 768E A3B6 C3CC CFCA C0AF 9D86" /* 4>M`vŽ£¶ÃÌÏÊÀ¯�† */ $"705B 483B 3331 3642 5165 7A91 A5B8 C5CC" /* p[H;316BQez‘¥¸ÅÌ */ $"CFCA C0B1 9D87 715D 4A3D 3431 353E 4C5E" /* ÏÊÀ±�‡q]J=415>L^ */ $"7289 9EB1 C0CA CFCD C6B9 A995 806B 5747" /* r‰ž±ÀÊÏÍÆ¹©•€kWG */ $"3A33 3136 3F4E 6075 8A9E B1C0 CACF CDC7" /* :316?N`uŠž±ÀÊÏÍÇ */ $"BCAD 9985 715D 4C3E 3531 343A 4757 6A7E" /* ¼­™…q]L>514:GWj~ */ $"93A5 B6C3 CCCF CCC6 B9A9 9682 6F5C 4A3E" /* “¥¶ÃÌÏÌÆ¹©–‚o\J> */ $"3531 333A 4554 667A 8EA0 B2C0 C8CF CDC8" /* 513:ETfzŽ ²ÀÈÏÍÈ */ $"C0B1 A08E 7A67 5445 3A34 3134 3D48 576A" /* À± ŽzgTE:414=HWj */ $"7C8F A3B3 C0C8 CFCF CAC1 B3A3 917E 6B59" /* |�£³ÀÈÏÏÊÁ³£‘~kY */ $"4A3E 3531 3338 424F 6072 8598 A9B8 C3CB" /* J>5138BO`r…˜©¸ÃË */ $"CFCD C7BD AFA0 8E7B 6858 483D 3531 3338" /* ÏÍǽ¯ Ž{hXH=5138 */ $"424E 5D70 8295 A5B4 C1CA CFCF CAC1 B6A7" /* BN]p‚•¥´ÁÊÏÏÊÁ¶§ */ $"9684 7160 4F43 3933 3134 3A45 5363 7586" /* –„q`OC9314:EScu† */ $"99A9 B8C3 CBCF CDC8 C1B4 A595 8271 6051" /* ™©¸ÃËÏÍÈÁ´¥•‚q`Q */ $"4339 3431 343A 4451 6071 8295 A5B4 C1C8" /* C9414:DQ`q‚•¥´ÁÈ */ $"CDCF CBC3 B9AC 9B8A 7967 5748 3E35 3131" /* ÍÏËù¬›ŠygWH>511 */ $"363E 4958 677A 8A9D ACB9 C3CB CFCD C8C1" /* 6>IXgzŠ�¬¹ÃËÏÍÈÁ */ $"B4A7 9685 7262 5245 3B34 3133 3840 4D5B" /* ´§–…rbRE;4138@M[ */ $"6C7E 8FA0 AFBC C6CC CFCD C7BE B2A3 9381" /* l~� ¯¼ÆÌÏÍǾ²£“� */ $"705E 4F43 3934 3134 3943 4F5E 6F81 93A3" /* p^OC94149CO^o�“£ */ $"B2BE C7CD CFCC C6BC AFA0 8F7E 6B5B 4C40" /* ²¾ÇÍÏÌÆ¼¯ �~k[L@ */ $"3833 3134 3B45 5363 7586 98A8 B6C2 CACF" /* 8314;EScu†˜¨¶ÂÊÏ */ $"CFCA C2B7 A899 8675 6353 453B 3431 3338" /* ÏÊ·¨™†ucSE;4138 */ $"404D 5D6D 7F91 A3B2 BEC8 CDCF CCC5 BBAD" /* @M]m.‘£²¾ÈÍÏÌÅ»­ */ $"9D8A 7967 5648 3D35 3133 3840 4D5D 6D80" /* �ŠygVH=5138@M]m€ */ $"93A3 B3C0 C8CD CFCB C3B8 A898 8672 6151" /* “£³ÀÈÍÏËø¨˜†raQ */ $"4339 3331 343B 4754 6677 8A9D ADBC C6CC" /* C9314;GTfwŠ�­¼ÆÌ */ $"CFCC C6BB AC9A 8976 6352 4439 3331 343D" /* ÏÌÆ»¬š‰vcRD9314= */ $"4857 687B 8FA0 B1BE C8CD CFCA C1B4 A493" /* HWh{� ±¾ÈÍÏÊÁ´¤“ */ $"7F6C 594A 3D35 3133 3944 5363 778A 9EAF" /* .lYJ=5139DScwŠž¯ */ $"BDC8 CDCF CAC1 B3A3 907C 6856 473A 3431" /* ½ÈÍÏÊÁ³£�|hVG:41 */ $"343D 4959 6C80 95A8 B8C3 CCCF CCC3 B8A8" /* 4=IYl€•¨¸ÃÌÏÌø¨ */ $"9480 6B58 483B 3431 343D 4A5B 6F82 98AA" /* ”€kXH;414=J[o‚˜ª */ $"BBC7 CDCF CAC1 B2A0 8B76 624F 4036 3133" /* »ÇÍÏÊÁ² ‹vbO@613 */ $"3945 566A 7E94 A8B8 C6CC CFCB C1B2 9F8A" /* 9EVj~”¨¸ÆÌÏËÁ²ŸŠ */ $"7560 4D3F 3531 343D 4A5C 7186 9DAF C0CA" /* u`M?514=J\q†�¯ÀÊ */ $"CFCD C6B8 A793 7B66 5242 3631 333A 485B" /* ÏÍÆ¸§“{fRB613:H[ */ $"6F85 9BAF C0CA CFCC C3B6 A38E 7661 4D3E" /* o…›¯ÀÊÏÌö£ŽvaM> */ $"3431 353F 4F63 7A90 A5B8 C6CD CFC8 BCAA" /* 415?Ocz�¥¸ÆÍÏȼª */ $"957E 6752 4036 3134 3D4D 6077 8FA5 B8C6" /* •~gR@614=M`w�¥¸Æ */ $"CDCD C7BB A891 7A63 4E3E 3431 3642 5368" /* ÍÍÇ»¨‘zcN>416BSh */ $"8098 ADBE CACF CCC1 B19D 846C 5643 3831" /* €˜­¾ÊÏÌÁ±�„lVC81 */ $"343D 4D62 7A93 A9BC C8CF CCC3 B39E 866D" /* 4=Mbz“©¼ÈÏÌóž†m */ $"5744 3831 343E 4E63 7C95 ACBE CACF CBC1" /* WD814>Nc|•¬¾ÊÏËÁ */ $"AF99 8067 513F 3431 3643 566D 869F B4C5" /* ¯™€gQ?416CVm†Ÿ´Å */ $"CDCF C7B8 A38B 715B 4538 3134 3E4E 657E" /* ÍÏǸ£‹q[E814>Ne~ */ $"96AE C1CB CFCA BCA9 9177 5E4A 3A33 333B" /* –®ÁËÏʼ©‘w^J:33; */ $"4C62 7A94 ACBE CBCF CABD AA93 7960 4A3A" /* Lbz”¬¾ËÏʽª“y`J: */ $"3333 3D4D 637C 96AE C1CC CFC8 BBA7 8F75" /* 33=Mc|–®ÁÌÏÈ»§�u */ $"5B47 3831 343F 5168 829B B3C3 CDCD C6B6" /* [G814?Qh‚›³ÃÍÍÆ¶ */ $"A087 6D56 4235 3136 4458 708A A3B9 C7CF" /*  ‡mVB516DXpŠ£¹ÇÏ */ $"CCC1 AF98 7E63 4D3D 3333 3A4A 617A 95AD" /* ÌÁ¯˜~cM=33:Jaz•­ */ $"C0CC CFC8 BBA5 8C72 5945 3831 3540 536C" /* ÀÌÏÈ»¥ŒrYE815@Sl */ $"86A0 B6C6 CDCD C3B2 9B81 674F 3E34 3139" /* † ¶ÆÍÍò›�gO>419 */ $"485E 7793 AABE CBCF CABD A88F 765C 4738" /* H^w“ª¾ËÏʽ¨�v\G8 */ $"3134 3F51 6A82 9DB3 C5CD CDC6 B49F 856B" /* 14?Qj‚�³ÅÍÍÆ´Ÿ…k */ $"5340 3531 3845 5972 8CA5 BBC8 CFCC C1AE" /* S@518EYrŒ¥»ÈÏÌÁ® */ $"967E 634D 3D33 333A 4A60 7A93 ACBE CBCF" /* –~cM=33:J`z“¬¾ËÏ */ $"CABD A991 775E 493A 3133 3D4D 637E 96AE" /* ʽ©‘w^I:13=Mc~–® */ $"C1CC CFC8 BCA8 8F76 5D48 3931 333D 4D63" /* ÁÌÏȼ¨�v]H913=Mc */ $"7C96 ADC0 CBCF CABD AA93 7A60 4C3B 3333" /* |–­ÀËÏʽª“z`L;33 */ $"3A49 5E76 90A8 BCC8 CFCC C2B1 9A82 6A52" /* :I^v�¨¼ÈÏ̱š‚jR */ $"4035 3136 4254 6B84 9DB2 C2CC CFC8 BCA8" /* @516BTk„�²ÂÌÏȼ¨ */ $"9179 604C 3B33 3139 475B 718A A2B6 C5CD" /* ‘y`L;319G[qŠ¢¶ÅÍ */ $"CDC7 B9A5 8F76 5E4A 3B33 3139 4559 7087" /* Íǹ¥�v^J;319EYp‡ */ $"A0B4 C3CC CFC8 BCAA 947C 654F 3F35 3135" /*  ´ÃÌÏȼª”|eO?515 */ $"4051 667E 95AA BDC8 CFCC C5B6 A38B 745D" /* @Qf~•ª½ÈÏÌŶ£‹t] */ $"4A3B 3331 3843 546A 8198 ADBE CACF CCC5" /* J;318CTj�˜­¾ÊÏÌÅ */ $"B6A3 8E76 604D 3E34 3135 3F4F 637A 90A5" /* ¶£Žv`M>415?Ocz�¥ */ $"B8C6 CDCF C8BD AD99 826C 5845 3933 3138" /* ¸ÆÍÏȽ­™‚lXE9318 */ $"4354 687E 94A8 B9C7 CDCF C8BD AD99 846F" /* CTh~”¨¹ÇÍÏȽ­™„o */ $"5B48 3B34 3135 3F4F 6176 8CA0 B3C1 CBCF" /* [H;415?OavŒ ³ÁËÏ */ $"CCC5 B8A5 937C 6754 4439 3331 3842 5163" /* ÌŸ¥“|gTD9318BQc */ $"778C A0B3 C1CB CFCD C6B9 A996 826D 5B49" /* wŒ ³ÁËÏÍÆ¹©–‚m[I */ $"3D34 3134 3D49 596D 8195 A8B8 C5CC CFCC" /* =414=IYm�•¨¸ÅÌÏÌ */ $"C3B7 A794 7F6B 5848 3D34 3134 3B47 576A" /* ÷§”.kXH=414;GWj */ $"7E90 A3B4 C1CB CFCD C7BD AF9D 8A76 6352" /* ~�£´ÁËÏÍǽ¯�ŠvcR */ $"4339 3331 353E 4A5B 6C7F 93A5 B4C1 CACF" /* C9315>J[l.“¥´ÁÊÏ */ $"CDC8 BEB1 A08F 7A67 5647 3B34 3133 3944" /* ÍȾ± �zgVG;4139D */ $"5263 7689 9AAC BBC6 CCCF CCC6 BCAD 9D8A" /* Rcv‰š¬»ÆÌÏÌÆ¼­�Š */ $"7966 5647 3B34 3133 3943 5161 7285 98A8" /* yfVG;4139CQar…˜¨ */ $"B7C3 CBCF CDC8 C0B3 A493 816D 5D4D 4038" /* ·ÃËÏÍÈÀ³¤“�m]M@8 */ $"3331 353D 4756 6677 8A9B ACB9 C5CC CFCD" /* 315=GVfwŠ›¬¹ÅÌÏÍ */ $"C8BE B3A3 9380 6D5D 4E42 3833 3134 3B45" /* Ⱦ³£“€m]NB8314;E */ $"5363 7586 98A8 B6C2 CACF CFCB C2B7 A999" /* Scu†˜¨¶ÂÊÏÏË·©™ */ $"8776 6354 473D 3531 3338 3F4C 5B6A 7C8E" /* ‡vcTG=5138?L[j|Ž */ $"9FAE BCC6 CCCF CDC8 BEB3 A493 8270 604F" /* Ÿ®¼ÆÌÏÍȾ³¤“‚p`O */ $"433A 3431 3439 424F 5D6F 8093 A3B1 BEC7" /* C:4149BO]o€“£±¾Ç */ $"CDCF CCC6 BDAF A090 7E6D 5C4D 4238 3331" /* ÍÏÌÆ½¯ �~m\MB831 */ $"343A 4451 6171 8495 A5B4 C0C8 CDCF CCC5" /* 4:DQaq„•¥´ÀÈÍÏÌÅ */ $"BBAD 9D8B 7A68 584A 3F36 3331 353D 4856" /* »­�‹zhXJ?6315=HV */ $"6777 8A9A AAB8 C3CB CFCD C8C1 B4A5 9684" /* gwŠšª¸ÃËÏÍÈÁ´¥–„ */ $"7161 5144 3A34 3134 3943 4F60 7182 94A5" /* qaQD:4149CO`q‚”¥ */ $"B4C1 C8CD CFCB C3B8 AA99 8776 6353 453B" /* ´ÁÈÍÏËøª™‡vcSE; */ $"3431 3339 434F 6071 8295 A5B6 C1CA CFCF" /* 4139CO`q‚•¥¶ÁÊÏÏ */ $"CAC1 B6A5 9582 705E 4E42 3833 3135 3D48" /* ÊÁ¶¥•‚p^NB8315=H */ $"5768 7B8E A0AF BDC7 CDCF CBC3 B8A9 9885" /* Wh{Ž ¯½ÇÍÏËø©˜… */ $"7260 4F42 3833 3135 3E4A 596B 7E91 A3B3" /* r`OB8315>JYk~‘£³ */ $"C1CA CFCD C8C0 B3A2 8F7C 6857 483B 3431" /* ÁÊÏÍÈÀ³¢�|hWH;41 */ $"343A 4556 677A 8EA0 B2C0 C8CF CDC8 C0B1" /* 4:EVgzŽ ²ÀÈÏÍÈÀ± */ $"A08E 7A66 5344 3933 3135 3E4C 5C70 8498" /*  ŽzfSD9315>L\p„˜ */ $"AAB9 C6CC CFCB C2B6 A491 7E68 5645 3A33" /* ª¹ÆÌÏ˶¤‘~hVE:3 */ $"3135 3F4C 5D71 869A ADBD C8CD CFC8 BEAF" /* 15?L]q†š­½ÈÍÏȾ¯ */ $"9D89 745E 4D3F 3531 343A 4858 6C82 96AA" /* �‰t^M?514:HXl‚–ª */ $"BBC7 CDCF C8BE AF9D 8671 5D4A 3D34 3135" /* »ÇÍÏȾ¯�†q]J=415 */ $"3E4D 5E74 8A9F B2C1 CBCF CCC3 B6A3 8F79" /* >M^tŠŸ²ÁËÏÌö£�y */ $"634F 3F35 3134 3D4A 5D71 899E B2C1 CBCF" /* cO?514=J]q‰ž²ÁËÏ */ $"CCC2 B3A0 8A74 5D4A 3D34 3136 4051 667C" /* ̳ Št]J=416@Qf| */ $"93A8 BBC7 CDCD C7B9 A791 7A63 4F3F 3531" /* “¨»ÇÍÍǹ§‘zcO?51 */ $"353F 4F63 7B93 A8BB C7CF CDC6 B8A4 8F76" /* 5?Oc{“¨»ÇÏÍÆ¸¤�v */ $"604C 3D34 3138 4456 6C84 9BB1 C1CB CFCB" /* `L=418DVl„›±ÁËÏË */ $"C0AE 9981 6853 4235 3135 3F4F 667E 96AD" /* À®™�hSB515?Of~–­ */ $"BECA CFCC C1B1 9A82 6A53 4235 3135 3F51" /* ¾ÊÏÌÁ±š‚jSB515?Q */ $"6780 99AF C1CB CFCA BEAC 957C 634D 3D34" /* g€™¯ÁËÏʾ¬•|cM=4 */ $"3138 4559 718A A3B7 C6CD CDC5 B6A0 876D" /* 18EYqŠ£·ÆÍÍŶ ‡m */ $"5743 3631 343F 5168 829A B1C2 CCCF C8BB" /* WC614?Qh‚š±ÂÌÏÈ» */ $"A58E 745B 4739 3134 3E4F 667E 98AF C1CC" /* ¥Žt[G914>Of~˜¯ÁÌ */ $"CFC8 BBA7 8F75 5C47 3931 343E 4F67 8099" /* ÏÈ»§�u\G914>Og€™ */ $"B1C2 CCCF C7B8 A38A 7158 4436 3135 4053" /* ±ÂÌÏǸ£ŠqXD615@S */ $"6C86 9FB6 C6CD CDC5 B39D 846A 523F 3431" /* l†Ÿ¶ÆÍÍų�„jR?41 */ $"3847 5B74 8FA7 BCC8 CFCB C0AD 947A 604A" /* 8G[t�§¼ÈÏËÀ­”z`J */ $"3A33 333D 4D65 7E99 B1C2 CCCF C7B8 A389" /* :33=Me~™±ÂÌÏǸ£‰ */ $"6F56 4335 3136 4357 708A A3B9 C7CF CCC1" /* oVC516CWpŠ£¹ÇÏÌÁ */ $"AF98 7E63 4D3B 3333 3B4C 627B 96AE C1CC" /* ¯˜~cM;33;Lb{–®ÁÌ */ $"CFC8 B9A5 8B71 5844 3631 3542 546D 86A0" /* Ïȹ¥‹qXD615BTm†  */ $"B6C6 CDCD C3B2 9B81 674F 3E34 3139 485D" /* ¶ÆÍÍò›�gO>419H] */ $"7690 A8BD CACF CBBE AA93 7A60 4A3A 3333" /* v�¨½ÊÏ˾ª“z`J:33 */ $"3D4D 637E 96AF C1CC CFC8 BBA5 8E74 5B47" /* =Mc~–¯ÁÌÏÈ»¥Žt[G */ $"3831 343F 5167 819A B1C2 CCCF C7B9 A48B" /* 814?Qg�š±ÂÌÏǹ¤‹ */ $"715B 4538 3134 3F51 6780 99B1 C1CC CFC8" /* q[E814?Qg€™±ÁÌÏÈ */ $"BBA7 8F76 5D48 3933 333D 4C62 7A94 AABD" /* »§�v]H933=Lbz”ª½ */ $"CACF CBC0 AE96 7E66 4F3E 3431 3844 586F" /* ÊÏËÀ®–~fO>418DXo */ $"87A0 B4C5 CDCF C7B9 A58E 755D 483A 3333" /* ‡ ´ÅÍÏǹ¥Žu]H:33 */ $"3A49 5D75 8EA5 B9C7 CDCD C6B6 A38A 725B" /* :I]uŽ¥¹ÇÍÍÆ¶£Šr[ */ $"4839 3333 3A48 5C74 8BA3 B7C6 CDCF C7BB" /* H933:H\t‹£·ÆÍÏÇ» */ $"A890 7961 4D3D 3431 3642 536A 8199 ADBE" /* ¨�yaM=416BSj�™­¾ */ $"CACF CCC2 B39F 8771 5B48 3A33 3339 4558" /* ÊÏ̳Ÿ‡q[H:339EX */ $"6D84 9BAF C0CB CFCC C2B3 A08A 725D 4A3B" /* m„›¯ÀËÏ̳ Šr]J; */ $"3431 3642 5267 7E94 A8BB C7CD CDC7 BCAA" /* 416BRg~”¨»ÇÍÍǼª */ $"967F 6A54 4438 3133 3945 576B 8198 ACBC" /* –.jTD8139EWk�˜¬¼ */ $"C8CD CDC7 BCAA 9681 6B57 453A 3331 3842" /* ÈÍÍǼª–�kWE:318B */ $"5165 7A8F A4B6 C3CC CFCC C2B4 A38F 7A65" /* Qez�¤¶ÃÌÏÌ´£�ze */ $"5242 3831 3339 4453 677B 90A4 B6C3 CCCF" /* RB8139DSg{�¤¶ÃÌÏ */ $"CCC5 B8A7 937F 6A57 473A 3431 353E 4C5C" /* ÌŸ§“.jWG:415>L\ */ $"7084 99AA BBC6 CDCF CBC2 B4A4 907C 6856" /* p„™ª»ÆÍÏË´¤�|hV */ $"473A 3431 343D 4959 6C80 94A5 B6C3 CBCF" /* G:414=IYl€”¥¶ÃËÏ */ $"CDC6 BBAD 9A87 7460 4F42 3833 3136 3F4C" /* ÍÆ»­š‡t`OB8316?L */ $"5D6F 8296 A8B7 C3CB CFCD C7BD AF9E 8A77" /* ]o‚–¨·ÃËÏÍǽ¯žŠw */ $"6553 453A 3431 343A 4554 6679 8B9D AEBC" /* eSE:414:ETfy‹�®¼ */ $"C7CC CFCC C5B9 AA9A 8776 6353 443A 3431" /* ÇÌÏÌŹªš‡vcSD:41 */ $"343A 4553 6376 879A AAB9 C3CC CFCD C7BE" /* 4:EScv‡šª¹ÃÌÏÍǾ */ $"B1A2 907E 6B5B 4C3F 3633 3135 3E49 5868" /* ±¢�~k[L?6315>IXh */ $"7A8C 9EAE BCC6 CCCF CCC7 BDB1 A08F 7E6B" /* zŒž®¼ÆÌÏÌǽ± �~k */ $"5B4C 3F38 3331 353D 4756 6676 899A AAB8" /* [L?8315=GVfv‰šª¸ */ $"C3CB CFCD CAC1 B4A7 9685 7262 5244 3A34" /* ÃËÏÍÊÁ´§–…rbRD:4 */ $"3133 3842 4D5D 6D7F 90A2 B1BD C7CC CFCC" /* 138BM]m.�¢±½ÇÌÏÌ */ $"C7BD B1A2 907F 6D5D 4E42 3933 3134 3A44" /* ǽ±¢�.m]NB9314:D */ $"5160 7182 94A5 B3C0 C8CD CFCC C5BB AE9E" /* Q`q‚”¥³ÀÈÍÏÌÅ»®ž */ $"8E7B 6A5B 4C3F 3833 3135 3B47 5363 7586" /* Ž{j[L?8315;GScu† */ $"98A8 B6C1 CACD CFCB C3B8 AA9A 8977 6656" /* ˜¨¶ÁÊÍÏËøªš‰wfV */ $"483D 3531 3336 3F4A 5868 7A8C 9DAD BBC5" /* H=5136?JXhzŒ�­»Å */ $"CCCF CDC8 C0B3 A493 8170 5E4F 4239 3331" /* ÌÏÍÈÀ³¤“�p^OB931 */ $"343A 4452 6274 8596 A8B6 C2CA CFCF CAC2" /* 4:DRbt…–¨¶ÂÊÏÏÊ */ $"B6A8 9685 7261 5144 3A34 3134 3A44 5262" /* ¶¨–…raQD:414:DRb */ $"7486 98A8 B8C3 CBCF CDC8 C0B3 A393 806D" /* t†˜¨¸ÃËÏÍÈÀ³£“€m */ $"5C4C 3F38 3331 363E 4A59 6B7E 90A3 B2C0" /* \L?8316>JYk~�£²À */ $"C8CD CFCB C2B6 A795 8270 5D4D 4038 3331" /* ÈÍÏ˶§•‚p]M@831 */ $"363F 4C5C 6D81 94A5 B6C2 CBCF CDC8 BEAF" /* 6?L\m�”¥¶ÂËÏÍȾ¯ */ $"9F8C 7A66 5445 3A34 3134 3D48 586A 7E91" /* ŸŒzfTE:414=HXj~‘ */ $"A3B4 C1CA CFCD C8BD AF9D 8A76 6351 4338" /* £´ÁÊÏÍȽ¯�ŠvcQC8 */ $"3331 363F 4E60 7286 9AAD BCC7 CDCF CAC1" /* 316?N`r†š­¼ÇÍÏÊÁ */ $"B3A2 8F7A 6653 4439 3331 3640 4F60 758A" /* ³¢�zfSD9316@O`uŠ */ $"9EAF BEC8 CFCD C7BC AD99 8570 5C4A 3D34" /* ž¯¾ÈÏÍǼ­™…p\J=4 */ $"3134 3D4A 5B70 8599 ADBD C8CD CDC8 BCAD" /* 14=J[p…™­½ÈÍÍȼ­ */ $"9984 6D59 483B 3431 353F 4F62 778E A3B4" /* ™„mYH;415?ObwŽ£´ */ $"C3CC CFCB C2B3 A08B 7660 4D3E 3431 343E" /* ÃÌÏ˳ ‹v`M>414> */ $"4D60 768B A2B4 C3CC CFCB C1B1 9D86 705B" /* M`v‹¢´ÃÌÏËÁ±�†p[ */ $"483A 3331 3843 546A 8096 ACBD C8CF CDC5" /* H:318CTj€–¬½ÈÏÍÅ */ $"B7A4 8F76 604D 3D34 3136 4252 677E 96AA" /* ·¤�v`M=416BRg~–ª */ $"BDC8 CFCC C3B6 A28A 725C 483A 3331 3945" /* ½ÈÏÌö¢Šr\H:319E */ $"586F 869E B3C3 CCCF CABD" /* Xo†ž³ÃÌÏʽ */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Clavichord.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Clavichord.r new file mode 100644 index 0000000..34a3079 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Clavichord.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 1600 0000 0A43 6C61 7669" /* ...........Clavi */ $"6368 6F72 64" /* chord */ }; data $8024 (0x16) { $"0000 4700 E88E 0000 772B 8080 8080 8080" /* ..G..Ž..w+€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 807F 7E7F 7D7A 7C7E 7E7D 7B7B 7C7C" /* €€€.~.}z|~~}{{|| */ $"7A7A 7B7C 7B7C 8383 8080 8583 828B 8F90" /* zz{|{|ƒƒ€€…ƒ‚‹�� */ $"9797 948E 827C 7B7C 7F7D 7778 7B7C 7975" /* ——”Ž‚|{|.}wx{|yu */ $"726E 6E6D 6B6A 6B6E 7173 797D 7A75 706E" /* rnnmkjknqsy}zupn */ $"7072 7070 7680 8585 8787 878B 8F90 8F8A" /* prppv€……‡‡‡‹���Š */ $"8687 8E93 989A 8D81 8788 7C78 7876 7C81" /* †‡Ž“˜š��‡ˆ|xxv|� */ $"7770 6F73 8087 857A 7576 808A 8B84 8793" /* wpos€‡…zuv€Š‹„‡“ */ $"9697 9D9D 9A9F A3A5 9C8B 8181 858C 8F87" /* –—��šŸ£¥œ‹��…Œ�‡ */ $"7E7D 7F7A 7166 6165 6B71 7270 6B66 6265" /* ~}.zqfaekqrpkfbe */ $"6F74 6A62 6569 6C72 706F 7B82 807A 6C64" /* otjbeilrpo{‚€zld */ $"6A77 7F80 7A72 707A 7F80 7F75 6C75 7C72" /* jw.€zrpz.€.ulu|r */ $"6D71 7079 8075 6B62 6677 8789 7F7A 7982" /* mqpy€ukbfw‡‰.zy‚ */ $"9399 9190 989D 9FA5 A5A7 ABAE B3B0 A297" /* “™‘�˜�Ÿ¥¥§«®³°¢— */ $"9290 969D 988D 8A88 8783 7B76 7474 7779" /* ’�–�˜�Šˆ‡ƒ{vttwy */ $"7A77 6F67 646C 7774 6A6B 6E6E 7373 6F78" /* zwogdlwtjknnssox */ $"8184 8177 6A68 727E 8686 7F77 7B83 8787" /* �„�wjhr~††.w{ƒ‡‡ */ $"8072 7780 7974 736C 727A 756C 615E 6776" /* €rw€ytslrzula^gv */ $"7D7D 746D 707F 8A88 858B 8B89 8F92 999D" /* }}tmp.Šˆ…‹‹‰�’™� */ $"A0A6 A69B 9186 7F84 8E8D 847E 7C7C 7A77" /*  ¦¦›‘†.„Ž�„~||zw */ $"7572 6F70 7277 7773 6C66 6C7E 8376 7175" /* uroprwwslfl~ƒvqu */ $"767D 7F7A 7D86 8E90 8B80 7574 7E88 8D8B" /* v}.z}†Ž�‹€ut~ˆ�‹ */ $"807D 868D 918C 7C7B 827D 7B78 7073 7779" /* €}†�‘Œ|{‚}{xpswy */ $"736A 6769 727E 857D 7372 7D8B 8C8A 8F8E" /* sjgir~…}sr}‹ŒŠ�Ž */ $"8D8E 9299 A0A2 A5A5 A19A 8C81 7F86 8B89" /* �Ž’™ ¢¥¥¡šŒ�.†‹‰ */ $"837E 7E7A 777A 7B7B 7974 6F6F 6E65 5B5B" /* ƒ~~zwz{{ytoone[[ */ $"6A79 7065 6364 6B72 7371 757F 8183 8170" /* jypecdkrsqu.�ƒ�p */ $"6A6A 6E78 7A6F 696C 7685 8073 7275 7579" /* jjnxzoilv…€sruuy */ $"746F 6C72 7979 7674 7173 828A 8A7E 747F" /* tolryyvtqs‚ŠŠ~t. */ $"8E93 9697 9A9E A1A6 AEB4 B9BA B3B0 A694" /* Ž“–—šž¡¦®´¹º³°¦” */ $"8580 858F 908C 8582 7D7A 8288 8C8A 7E7A" /* …€…��Œ…‚}z‚ˆŒŠ~z */ $"7B78 7065 5A63 7370 6866 6872 7D80 7F7D" /* {xpeZcsphfhr}€.} */ $"8287 8A8D 8273 6F70 757B 7466 6168 767B" /* ‚‡Š�‚sopu{tfahv{ */ $"7470 7071 7374 6F69 6C72 7473 7268 636E" /* tppqstoilrtsrhcn */ $"777D 7668 6977 7E83 888D 9092 969C A8B2" /* w}vhiw~ƒˆ��’–œ¨² */ $"B1AB A59B 8A79 6E6F 7A82 8686 8180 838C" /* ±«¥›Šynoz‚††�€ƒŒ */ $"99A1 9888 8080 807D 7265 636C 716A 696E" /* ™¡˜ˆ€€€}reclqjin */ $"7782 8B8D 8B8D 9199 9D95 8477 7272 797A" /* w‚‹�‹�‘™�•„wrryz */ $"7063 6371 7A76 726F 6D71 7372 6D6D 6F71" /* pccqzvromqsrmmoq */ $"7473 6B67 6A71 7C78 6762 6C77 8088 8E93" /* tskgjq|xgblw€ˆŽ“ */ $"9495 9DA8 B4B8 B4AD A193 8174 7077 8287" /* ”•�¨´¸´­¡“�tpw‚‡ */ $"8885 8184 8C9A A49D 8C80 7D7B 7870 635B" /* ˆ…�„Œš¤�Œ€}{xpc[ */ $"5E64 6263 686E 7782 8585 8586 8E95 9488" /* ^dbchnw‚………†Ž•”ˆ */ $"7A70 6D6F 7674 6661 6E79 7B78 716F 7276" /* zpmovtfany{xqorv */ $"7775 7271 7175 7773 7172 7581 8272 6A70" /* wurqquwsqru�‚rjp */ $"7A83 8C92 9698 989E A9B4 B8B7 B0A1 9485" /* zƒŒ’–˜˜ž©´¸·°¡”… */ $"756D 727A 7F84 8581 848B 96A1 A091 837E" /* umrz.„…�„‹–¡ ‘ƒ~ */ $"7B77 7269 5F5A 5E60 6369 6E76 8086 8887" /* {wri_Z^`cinv€†ˆ‡ */ $"8488 9194 8D82 7871 6F75 786F 656D 797D" /* „ˆ‘”�‚xqouxoemy} */ $"7B75 706F 7375 7372 6C6A 6F71 6E6E 7171" /* {uposusrljoqnnqq */ $"7B82 7468 6B72 7A84 888A 8E8E 92A0 ABAE" /* {‚thkrz„ˆŠŽŽ’ «® */ $"B2B1 A69A 8D7D 7274 7B80 888A 878B 9197" /* ²±¦š�}rt{€ˆŠ‡‹‘— */ $"A1A3 968A 847E 7A76 6F68 6160 6164 686D" /* ¡£–Š„~zvoha`adhm */ $"757D 8387 8682 858D 908E 867C 7772 6F76" /* u}ƒ‡†‚…��ކ|wrov */ $"7267 6C77 7A79 756D 6A70 7272 716C 676B" /* rglwzyumjprrqlgk */ $"6D6A 6E70 707A 8377 6B6B 6F78 8286 898B" /* mjnppzƒwkkox‚†‰‹ */ $"8C90 9CA5 AAAE AFA8 9C8F 8072 7074 7A83" /* Œ�œ¥ª®¯¨œ�€rptzƒ */ $"8685 8A90 959D A197 8E86 7F7D 7871 6D68" /* †…Š�•�¡—ކ.}xqmh */ $"6464 666A 6F79 7E83 8988 8486 8B8E 8E8A" /* ddfjoy~ƒ‰ˆ„†‹ŽŽŠ */ $"8380 7973 7875 6C6E 797E 7F7A 736F 7176" /* ƒ€ysxulny~.zsoqv */ $"7875 6C6A 6A69 6868 6668 717C 806F 6C71" /* xuljjihhfhq|€olq */ $"7990 9DA9 A393 8B97 A6A2 A2AB A594 8271" /* y��©£“‹—¦¢¢«¥”‚q */ $"5C55 5B65 787B 6F6F 7A80 8696 9B94 8C8A" /* \U[ex{ooz€†–›”ŒŠ */ $"8F87 7A77 808A 8573 7D80 7E7E 7F7D 7173" /* �‡zw€Š…s}€~~.}qs */ $"8491 8179 838C 7F84 898E 8D90 9190 7969" /* „‘�yƒŒ.„‰Ž��‘�yi */ $"6C77 7479 8980 6861 6063 6A66 666F 726B" /* lwty‰€ha`cjffork */ $"6E71 615B 6C76 7774 7676 756F 7C92 A19C" /* nqa[lvwtvvuo|’¡œ */ $"91A2 9083 7B77 5952 688F 9C92 8FA3 AFA8" /* ‘¢�ƒ{wYRh�œ’�£¯¨ */ $"C1C6 C1B5 BDBD AB82 6D71 7874 787B 6653" /* ÁÆÁµ½½«‚mqxtx{fS */ $"565F 656E 6A6A 7672 6A70 7977 7684 8875" /* V_enjjvrjpywv„ˆu */ $"6169 777D 8088 8C88 7471 8675 6C68 7053" /* aiw}€ˆŒˆtq†ulhpS */ $"434A 646F 7279 8779 5D6F 858F 93A9 B0A3" /* CJdory‡y]o…�“©°£ */ $"877F 93A2 9FAA B6A3 887B 746D 6D72 7F89" /* ‡.“¢Ÿª¶£ˆ{tmmr.‰ */ $"8579 859D A7A5 AAA2 8D7D 858A 7A6D 6F79" /* …y…�§¥ª¢�}…Šzmoy */ $"795E 5867 6369 7482 6756 5E81 938D 8698" /* y^Xgcit‚gV^�“�†˜ */ $"8D77 88A3 A493 9CAA A78D 7B7D 7B70 7D8E" /* �wˆ£¤“œª§�{}{p}Ž */ $"7A57 484E 5151 5252 5357 5666 706F 6973" /* zWHNQQRRSWVfpois */ $"7777 7279 8180 8593 AEB6 9B99 A2A5 9A8E" /* wwry�€…“®¶›™¢¥šŽ */ $"8765 5866 8998 8E8D ABA5 959B AFB1 A6B3" /* ‡eXf‰˜Ž�«¥•›¯±¦³ */ $"BEA9 7B62 686F 6770 796D 5B5A 616C 6B70" /* ¾©{bhogpym[Zalkp */ $"7381 8071 717A 8181 8A88 7760 6470 7B7A" /* s�€qqz��Šˆw`dp{z */ $"7580 8268 6C74 7463 6068 5544 435C 6F6D" /* u€‚hlttc`hUDC\om */ $"7896 8973 748E A1A3 B2BE B499 8D9C A79D" /* x–‰stŽ¡£²¾´™�œ§� */ $"A0AA AA97 8271 7173 7E73 807C 777E 909B" /*  ªª—‚qqs~s€|w~�› */ $"9396 9A8F 7F7C 8176 5D4D 5F68 5349 5261" /* “–š�.|�v]M_hSIRa */ $"6066 766C 565B 7E98 8583 968D 848D A6AB" /* `fvlV[~˜…ƒ–�„�¦« */ $"9FA2 B3B5 A385 7368 6473 827D 6551 5160" /* Ÿ¢³µ£…shds‚}eQQ` */ $"6E5F 4648 4F4F 5361 7A7D 8493 9992 8B91" /* n_FHOOSaz}„“™’‹‘ */ $"908B 88A3 A68B 8095 AEA6 8F82 7664 687E" /* �‹ˆ£¦‹€•®¦�‚vdh~ */ $"9784 8999 9E94 94A5 B8B5 B9C4 B78F 5F48" /* —„‰™ž””¥¸µ¹Ä·�_H */ $"4B58 616A 757B 808B 9C9D 8679 807C 6754" /* KXaju{€‹œ�†y€|gT */ $"5977 8B95 9C94 7C68 727A 6E52 5F5D 4F49" /* Yw‹•œ”|hrznR_]OI */ $"5966 655C 6564 4D39 4664 626F 7E85 8488" /* Yfe\edM9Fdbo~…„ˆ */ $"9BBC CACF D5CB AF86 797F 8786 94A3 AB9C" /* ›¼ÊÏÕ˯†y.‡†”£«œ */ $"9294 927D 696C 6E5F 556A 8C9D 9FA7 A595" /* ’”’}iln_UjŒ�Ÿ§¥• */ $"8986 7B5C 3E4E 5C57 4D5D 737E 828D 866A" /* ‰†{\>N\WM]s~‚�†j */ $"5A73 8E7F 7471 7C8A 98A4 BAB3 B0BC C1A2" /* ZsŽ.tq|Š˜¤º³°¼Á¢ */ $"6B4F 505B 616B 6F7B 777A 8585 6443 404B" /* kOP[ako{wz……dC@K */ $"4A4A 5C78 888A 9BA6 9D8C 868D 7E6B 7D85" /* JJ\xˆŠ›¦�Œ†�~k}… */ $"7A74 899A 9C88 8074 6351 6D8E 8777 7D95" /* zt‰šœˆ€tcQmއw}• */ $"A8AA ABBC C3C9 D2C7 9656 3E4B 6163 666E" /* ¨ª«¼ÃÉÒÇ–V>Kacfn */ $"848F 9CA6 9D7D 6B6F 705E 4C51 6E8A 919C" /* „�œ¦�}kop^LQnŠ‘œ */ $"947E 7177 8672 585B 615D 5B65 727C 716F" /* ”~qw†rX[a][er|qo */ $"6952 3344 646A 6A71 8594 9B9C B4C5 CDD2" /* iR3Ddjjq…”›œ´ÅÍÒ */ $"CEAC 7F6C 7582 8686 899A 9894 9591 7869" /* ά.lu‚††‰š˜”•‘xi */ $"737D 6A5D 688B 9896 9E9D 948B 8881 5C41" /* s}j]h‹˜–ž�”‹ˆ�\A */ $"4B5A 5755 6271 8288 8A7F 6659 7587 7D6A" /* KZWUbq‚ˆŠ.fYu‡}j */ $"6273 8FA5 A7AD ACB4 C1C6 A77A 5E5E 6A72" /* bs�¥§­¬´ÁƧz^^jr */ $"6767 7B83 878F 865B 3F42 5453 545E 787A" /* gg{ƒ‡�†[?BTST^xz */ $"8091 9997 8A8F 8F7A 6973 7973 788A 9192" /* €‘™—Š��zisysxŠ‘’ */ $"8A7F 7261 5E7B 938C 7976 8DA7 B3AE B4BB" /* Š.ra^{“Œyv�§³®´» */ $"CAD1 C898 6146 4D62 695C 5E72 899A A99C" /* ÊÑȘaFMbi\^r‰š©œ */ $"7C6E 706E 5D51 5266 758C 988F 837A 878B" /* |npn]QRfuŒ˜�ƒz‡‹ */ $"7967 635D 5662 7377 7A7A 7466 4A34 425C" /* ygc]VbswzztfJ4B\ */ $"6968 707E 919D A4AC BAC7 D5D4 B187 7173" /* ihp~‘�¤¬ºÇÕÔ±‡qs */ $"868C 827D 848C 939F 957D 7480 806D 636D" /* †Œ‚}„Œ“Ÿ•}t€€mcm */ $"7B80 8D98 958E 878E 805D 4947 4B4A 6073" /* {€�˜•އހ]IGKJ`s */ $"767C 8E8E 8369 6574 807D 6E66 6C87 AAB9" /* v|ŽŽƒiet€}nfl‡ª¹ */ $"AFAA B0C6 C9AE 896B 606C 7168 626A 7583" /* ¯ª°ÆÉ®‰k`lqhbjuƒ */ $"9482 573E 4952 545F 6F6D 697A 9096 9490" /* ”‚W>IRT_omiz�–”� */ $"9C94 7A6E 6F6D 6A82 958B 8082 7C71 5F62" /* œ”znomj‚•‹€‚|q_b */ $"7C8E 8879 787E 94AF BCB5 B2BA D0C6 9F70" /* |Žˆyx~”¯¼µ²ºÐÆŸp */ $"5354 6974 6E63 6A7F 9BB3 A586 7577 6E5E" /* STitncj.›³¥†uwn^ */ $"5A5F 606B 8999 8D7C 7A8B 8976 6C62 524C" /* Z_`k‰™�|z‹‰vlbRL */ $"667D 7870 7273 633D 3043 5862 6E7B 7A7F" /* f}xprsc=0CXbn{z. */ $"99B0 B1B1 BFD7 D0B2 8C79 7788 918B 776C" /* ™°±±¿×вŒywˆ‘‹wl */ $"6F85 9D97 8782 8D82 716F 7772 778F 9B95" /* o…�—‡‚�‚qowrw�›• */ $"8886 9384 6252 4D47 4D6A 8178 7682 8C7F" /* ˆ†“„bRMGMj�xv‚Œ. */ $"6464 777B 746E 6968 7AA5 C0B3 A3AE C6C5" /* ddw{tnihz¥À³£®ÆÅ */ $"B090 7769 7278 7264 5D64 7E93 805B 4750" /* °�wirxrd]d~“€[GP */ $"535D 6D75 6460 798F 9288 8C9C 937A 726D" /* S]mud`y�’ˆŒœ“zrm */ $"666E 8898 856E 6E79 705E 708D 8D85 817E" /* fnˆ˜…nnyp^p��…�~ */ $"7A8A AFC4 B8B1 BBCC C19F 7560 596C 7973" /* zНď±»ÌÁŸu`Ylys */ $"615F 6E92 ABA3 8C7B 7C6E 6257 5950 6586" /* a_n’«£Œ{|nbWYPe† */ $"988E 7A7C 9391 817D 7165 6B80 9385 6D6F" /* ˜Žz|“‘�}qek€“…mo */ $"7C61 393D 5259 6176 7672 7490 ACAB A6AF" /* |a9=RYavvrt�¬«¦¯ */ $"C0BA 9C73 5654 7271 5F4E 5062 8293 8F8D" /* ÀºœsVTrq_NPb‚“�� */ $"8E94 8F8C 8E99 8D92 A3A9 A59A 9FB2 B098" /* Ž”�ŒŽ™�’£©¥šŸ²°˜ */ $"8679 6D77 9399 816F 767B 6651 5C5F 513C" /* †ymw“™�ov{fQ\_Q< */ $"3A37 3447 759D A9A3 9CA5 A092 7C6F 6B85" /* :74Gu�©£œ¥ ’|ok… */ $"8982 796B 6082 A69E 8079 909C 9E8A 8D87" /* ‰‚yk`‚¦ž€y�œžŠ�‡ */ $"8792 A29B 878E A191 6F55 484A 5668 6B52" /* ‡’¢›‡Ž¡‘oUHJVhkR */ $"4256 5F47 2E40 5462 656F 7278 8AAB B2A8" /* BV_G.@TbeorxŠ«²¨ */ $"B0C3 D5CF C5AE 9E8A 8E91 8B7E 7574 92B5" /* °ÃÕÏÅ®žŠŽ‘‹~ut’µ */ $"BBAC 9488 7056 4654 5D65 7C9A 926F 7176" /* »¬”ˆpVFT]e|š’oqv */ $"634E 4C57 636A 7284 7356 5461 4B33 4664" /* cNLWcjr„sVTaK3Fd */ $"8591 8A7C 8088 A5BB BFC4 CDE1 DDC4 9877" /* …‘Š|€ˆ¥»¿ÄÍ..Ęw */ $"7283 877C 635A 607A 9998 877F 837D 777A" /* rƒ‡|cZ`z™˜‡.ƒ}wz */ $"8082 858B 8B83 6F79 8781 747C 7661 626E" /* €‚…‹‹ƒoy‡�t|vabn */ $"7C74 6167 7971 6870 7065 5043 445D 6D89" /* |tagyqhppePCD]m‰ */ $"B2C4 BBB9 B6AD 9D7C 6983 968F 8881 6855" /* ²Ä»¹¶­�|iƒ–�ˆ�hU */ $"6A86 7E6D 6C8E A28A 7472 7478 848B 8672" /* j†~mlŽ¢Štrtx„‹†r */ $"829A 8E6A 5756 535F 675E 525C 697B 6450" /* ‚šŽjWVS_g^R\i{dP */ $"637B 7873 7F8B 9CAD BCC5 C4C0 CDD8 CDB8" /* c{xs.‹œ­¼ÅÄÀÍØÍ¸ */ $"AFA5 A198 8986 876E 5E79 98A5 A093 7F5F" /* ¯¥¡˜‰†‡n^y˜¥ “._ */ $"362C 424D 475B 797D 6960 5B53 4440 505E" /* 6,BMG[y}i`[SD@P^ */ $"6571 7976 655A 5B49 3D46 6D93 9A90 888D" /* eqyveZ[I=Fm“š�ˆ� */ $"A2B4 C9D4 D5E4 F4E8 BD8C 7476 817A 6348" /* ¢´ÉÔÕ...½Œtv�zcH */ $"353B 6C8B 8678 8282 6F58 5A68 717A 817B" /* 5;l‹†x‚‚oXZhqz�{ */ $"6550 5A63 5F6E 878F 8678 8291 9893 949F" /* ePZc_n‡�†x‚‘˜“”Ÿ */ $"9D95 9797 8667 5D73 8B93 96AD CBDA E3D5" /* �•——†g]s‹“–­Ë..Õ */ $"BFA1 8275 7D7C 726B 6A4D 3140 4B44 3D5A" /* ¿¡‚u}|rkjM1@KD=Z */ $"7275 655A 5B65 6E78 7E74 7181 8776 6667" /* rueZ[enx~tq�‡vfg */ $"6E79 8080 6C65 708A A595 7E89 A1A2 968C" /* ny€€lepŠ¥•~‰¡¢–Œ */ $"9398 A8BC C0BC B3B7 B3AC 9E96 8E88 756F" /* “˜¨¼À¼³·³¬ž–Žˆuo */ $"6F6B 5343 5C7A 8384 8268 4027 354D 5A55" /* okSC\zƒ„‚h@'5MZU */ $"566B 808D 907C 6A72 828A 8E8C 8891 9A90" /* Vk€��|jr‚ŠŽŒˆ‘š� */ $"7D6C 493F 5B8B A4A1 8E8A 95A1 AFB7 BDC6" /* }lI?[‹¤¡ŽŠ•¡¯·½Æ */ $"CFCC BA91 6D5C 6B6F 6650 341D 295E 8288" /* Ï̺‘m\kofP4.)^‚ˆ */ $"8595 8970 5C69 6B74 8C96 836C 6266 636B" /* …•‰p\iktŒ–ƒlbfck */ $"90AC A896 9297 969B 9694 9783 7D7E 7B64" /* �¬¨–’—–›–”—ƒ}~{d */ $"5458 666F 6C6A 77A1 C7DC C39F 7E6E 6571" /* TXfoljw¡Ç.ß~neq */ $"756A 666A 513C 423C 3E57 8593 8A6F 6A79" /* ujfjQW…“Šojy */ $"8CA2 A694 868D 9085 7D82 8386 8D85 6E50" /* Œ¢¦”†��…}‚ƒ†�…nP */ $"4859 7485 7C76 7A7E 7A78 7C80 7C90 A8A0" /* HYt…|vz~zx|€|�¨  */ $"A2A9 AFA3 999E A9A0 9190 9896 9179 687F" /* ¢©¯£™ž© ‘�˜–‘yh. */ $"9197 A1A3 7E57 4C5B 625F 6262 6C7A 928A" /* ‘—¡£~WL[b_bblz’Š */ $"6C5D 6979 7D7C 726B 7477 6E61 3F1F 2C4F" /* l]iy}|rktwna?.,O */ $"788F 8B7A 8593 A8BC B3B9 D8E7 DBC3 A787" /* x�‹z…“¨¼³¹Ø..ç‡ */ $"7887 927F 5B40 3645 6C8A 949B 9884 726A" /* x‡’.[@6ElŠ”›˜„rj */ $"6B62 7193 8F73 5850 4A3D 558E AF99 8990" /* kbq“�sXPJ=Uޝ™‰� */ $"9193 9089 8C85 7680 8675 5E5F 6E76 6E6E" /* ‘“�‰Œ…v€†u^_nvnn */ $"7784 A8DD EFD0 AD8E 7A74 7A80 7979 715A" /* w„¨..ЭŽztz€yyqZ */ $"4A3E 353D 587B 9184 6568 7486 A5A0 857A" /* J>5=X{‘„eht†¥ …z */ $"8586 7773 7D86 878B 7F64 4B4C 6075 767E" /* …†ws}†‡‹.dKL`uv~ */ $"9190 827E 878F 8B8E A4AC 9B97 ABA6 8478" /* ‘�‚~‡�‹Ž¤¬›—«¦„x */ $"96A3 8F87 9394 937F 5A4D 5A77 828B 8975" /* –£�‡“”“.ZMZw‚‹‰u */ $"5958 6464 6C7B 7B82 9AB2 A689 7882 988D" /* YXddl{{‚𲦉x‚˜� */ $"746C 8487 7A6F 5F3C 282F 4158 6A68 646D" /* tl„‡zo_<(/AXjhdm */ $"829D 9B9A A7CD DECA A79F 9B94 9592 7D5F" /* ‚�›š§Í.ʧŸ›”•’}_ */ $"5342 3E54 85A0 9985 8284 7E67 5463 818C" /* SB>T… ™…‚„~gTc�Œ */ $"7460 665B 4063 99B5 A698 8E98 ABAD A28B" /* t`f[@c™µ¦˜Ž˜«­¢‹ */ $"7278 9386 5543 627D 6D56 6276 7F89 AEB3" /* rx“†UCb}mVbv.‰®³ */ $"A894 776E 8089 7E84 7770 6E65 494A 6384" /* ¨”wn€‰~„wpneIJc„ */ $"97A0 8C81 887E 7F9C B8A7 8681 8F8E 8A7E" /* — Œ�ˆ~.œ¸§†��ŽŠ~ */ $"776E 797C 655B 6778 705D 6285 8973 6884" /* wny|e[gxp]b…‰sh„ */ $"9C9F 9897 999E ACB3 8C75 8A9D 947F 8AA0" /* œŸ˜—™ž¬³ŒuŠ�”.Š  */ $"9C7A 604F 5968 8292 A29C 7F63 575F 5E60" /* œz`OYh‚’¢œ.cW_^` */ $"6377 8F97 9189 7473 7C7D 6866 8086 7262" /* cw�—‘‰ts|}hf€†rb */ $"6968 370A 162D 4A5B 6578 8C95 989B 98AF" /* ih7..-J[exŒ•˜›˜¯ */ $"DAE2 C9BF C2B8 A49A 948A 6F48 3853 6F8D" /* ..ɿ¸¤š”ŠoH8So� */ $"9289 8F9D 9272 5650 6980 8A86 7F6D 5040" /* ’‰��’rVPi€Š†.mP@ */ $"548A A697 8EA2 BBBE AC92 7B73 7C7D 7167" /* TЦ—Ž¢»¾¬’{s|}qg */ $"6373 7569 697A 7A75 829F B7AE 9488 8E92" /* csuiizzu‚Ÿ·®”ˆŽ’ */ $"8776 7277 6D5B 5A64 6C6A 7171 797C 705F" /* ‡vrwm[Zdljqqy|p_ */ $"5B79 99AB 8B6C 7D8D 7D6E 6B64 6868 6D76" /* [y™«‹l}�}nkdhhmv */ $"7A6C 614E 3A5C 7F7D 6D7A A2B7 AB8F 8A9B" /* zlaN:\.}mz¢·«�Š› */ $"A4A7 B0A8 9794 8D93 A3A6 9E92 8067 6973" /* ¤§°¨—”�“£¦ž’€gis */ $"87A8 B7B2 9D79 5559 6562 5771 969A 8A78" /* ‡¨·²�yUYebWq–šŠx */ $"7770 6872 7572 646C 6A69 7172 612E 080D" /* wphrurdljiqra.. */ $"3956 6887 A0A3 9285 8FA6 B3CD DAE4 DFD9" /* 9Vh‡ £’…�¦³Í.... */ $"C8A5 8F86 7F6D 5853 5A68 6774 919C 9072" /* È¥�†.mXSZhgt‘œ�r */ $"5D4B 5470 8199 8F75 5C30 2543 6B7A 6F87" /* ]KTp�™�u\0%Ckzo‡ */ $"A7BA BD91 6B55 5368 8599 7D60 5B70 8B8F" /* §º½‘kUSh…™}`[p‹� */ $"867C 7981 A8D1 D0CB B5A2 A08F 878E 886F" /* †|y�¨ÑÐ˵¢ �‡Žˆo */ $"5975 9085 745E 5858 5255 7084 8387 8570" /* Yu�…t^XXRUp„ƒ‡…p */ $"809C 8D70 5C52 586E 7595 956E 5949 4047" /* €œ�p\RXnu••nYI@G */ $"535F 667B 93B0 C8A0 8181 8BA5 CEEC CF9A" /* S_f{“°È ��‹¥Î.Ïš */ $"7778 AAB9 A69A 836E 6679 88AE B799 9885" /* wxª¹¦šƒnfyˆ®·™˜… */ $"6351 4135 3355 7C96 9977 6855 4255 7F93" /* cQA53U|–™whUBU.“ */ $"7F69 606A 8B82 6A51 2C0E 1A49 6B93 998D" /* .i`j‹‚jQ,..Ik“™� */ $"9284 88A7 A4A3 C7F7 FEF7 ECC3 A17E 646D" /* ’„ˆ§¤£Ç....á~dm */ $"7D7B 6E60 585A 7A88 8778 5B45 4358 7DAB" /* }{n`XZzˆ‡x[ECX}« */ $"A781 7D63 3A37 3D56 6A7D A2C7 D3B2 8855" /* §�}c:7=Vj}¢ÇÓ²ˆU */ $"3359 95B6 AD81 5E59 716D 6E6F 6F72 87B4" /* 3Y•¶­�^Yqmnoor‡´ */ $"DEE7 C9A9 A188 777A 6362 6476 8FA0 885E" /* ..É©¡ˆwzcbdv� ˆ^ */ $"4A3B 3143 6586 877D 7C72 6670 958C 7369" /* J;1Ce†‡}|rfp•Œsi */ $"6978 8F9F 9E8E 7858 4337 344E 6784 9FB5" /* ix�ŸžŽxXC74Ng„Ÿµ */ $"B3A4 8A6F 6A8C B9EC ECC1 947C 7A84 9090" /* ³¤ŠojŒ¹..Á”|z„�� */ $"9281 6F7B 9A9C A3AB A48C 735B 423E 3E58" /* ’�o{šœ£«¤Œs[B>>X */ $"7593 9382 6E5C 3A44 79A5 957B 7575 7576" /* u““‚n\:Dy¥•{uuuv */ $"7763 4830 263C 687C 7E81 837F 808B 8E94" /* wcH0&„¾¶¡ */ $"8872 5744 5361 6D72 7FB0 D7D8 BBB7 B098" /* ˆrWDSamr.°×Ø»·°˜ */ $"8374 6B70 798B 99A2 9172 552E 1B35 5E6F" /* ƒtkpy‹™¢‘rU..5^o */ $"6B7A 8275 524B 7992 8D76 7C9D A799 878D" /* kz‚uRKy’�v|�§™‡� */ $"8577 6946 2B4B 7285 98B3 AC89 725A 607D" /* …wiF+Kr…˜³¬‰rZ`} */ $"A8C8 CEC9 B79C 796A 7579 848D 92AC BCAC" /* ¨ÈÎÉ·œyjuy„�’¬¼¬ */ $"95AD B7AC 956F 5F60 4C44 627A 8167 5A4B" /* •­·¬•o_`LDbz�gZK */ $"3B3C 597C 704F 4A56 3335 5871 6D36 3169" /* ;J@:BGJ<@Vz£�£®  */ $"A395 757B 8270 7879 7886 8D90 9CA9 BBBA" /* £•u{‚pxyx†��œ©»º */ $"997F 7561 433F 6180 98A4 9D97 937E 94B0" /* ™.uaC?a€˜¤�—“~”° */ $"A6AF A99A 8561 5E5D 5A81 9F86 5132 2B38" /* ¦¯©š…a^]Z�Ÿ†Q2+8 */ $"3A46 535A 616E 8198 B8CA DFDF C39E 7C69" /* :FSZan�˜¸Ê..Þ|i */ $"6B77 8781 625B 5D7C 8D79 6D6B 7383 7B7C" /* kw‡�b[]|�ymksƒ{| */ $"9EB6 BEC6 A992 8C8F 9589 7977 7E78 7688" /* ž¶¾Æ©’Œ�•‰yw~xvˆ */ $"A0AA ACBC B38F 6F57 3A1B 0B1D 3B5A 6E6B" /*  ª¬¼³�oW:...;Znk */ $"665F 586B 8182 7E78 7270 5147 565C 7691" /* f_Xk�‚~xrpQGV\v‘ */ $"9F90 685B 7083 878A 7C7A 8FAD C1CD D2DC" /* Ÿ�h[pƒ‡Š|z�­ÁÍÒ. */ $"EBEC BD83 7F82 7C79 6F63 656D 746C 5D59" /* ..½ƒ.‚|yocemtl]Y */ $"4B3A 4054 697B 8490 969A 9C93 8783 7156" /* K:@Ti{„�–šœ“‡ƒqV */ $"464A 5658 6482 8892 AEB8 B7A1 816D 615A" /* FJVXd‚ˆ’®¸·¡�maZ */ $"6581 9DA6 A9AD 9C85 98C4 DBCE AF9E 9179" /* e��¦©­œ…˜Ä.ίž‘y */ $"6664 707F 888E 7540 2C37 3832 3537 3C4C" /* fdp.ˆŽu@,782577' */ $"3F75 8E8F A3A3 A9BB B899 6022 0F1E 2C37" /* ?uŽ�££©»¸™`"..,7 */ $"4068 807D 5B59 7C93 A7A3 93AE DEF2 F6FD" /* @h€}[Y|“§£“®.... */ $"EED5 C8BD B2B3 B69C 7250 6289 A6B2 B496" /* .ÕȽ²³¶œrPb‰¦²´– */ $"5C29 0601 162F 4368 5435 2E30 4C98 DBDB" /* \).../ChT5.0L˜.. */ $"BA9F 805C 473B 3641 4D63 8296 A2A6 9069" /* ºŸ€\G;6AMc‚–¢¦�i */ $"5B4C 5962 5B74 99A0 9DC5 E7FD FFFF E4CB" /* [LYb[t™ �Å.....Ë */ $"B2A2 A5A9 9D7C 5A44 3738 342C 1007 142A" /* ²¢¥©�|ZD784,...* */ $"363B 4D5E 7267 5E6E 8688 8086 6055 5D6C" /* 6;M^rg^n†ˆ€†`U]l */ $"85C0 F7FF FFEE B693 8D85 8294 9B81 6974" /* …À....¶“�…‚”›�it */ $"8990 909C B1C4 CEAE 816F 6958 525D 6D98" /* ‰��œ±Äή�oiXR]m˜ */ $"B7AE 7963 6D6D 585A 5246 372F 3357 8092" /* ·®ycmmXZRF7/3W€’ */ $"9694 958F 765D 5959 5E51 313A 6377 8185" /* –”•�v]YY^Q1:cw�… */ $"8187 8B80 80AA DAEC E1E7 DACD C5AD 9DAA" /* �‡‹€€ª.....ÍÅ­�ª */ $"9C68 2F1F 4172 8E8C 8787 896D 4440 432F" /* œh/.ArŽŒ‡‡‰mD@C/ */ $"293E 4B4B 5657 4D6E ABBD BDCD C5B3 8D4F" /* )>KKVWMn«½½Íų�O */ $"283F 5355 5779 979B 7D64 6C76 827D 6C72" /* (?SUWy—›}dlv‚}lr */ $"9AAE B8C7 D0E9 FAEF CDC8 D7C8 AB9A 8879" /* š®¸ÇÐ...ÍÈ×È«šˆy */ $"6849 415F 5D3D 190B 172B 2E36 3D4A 6F74" /* hIA_]=...+.6=Jot */ $"7791 AEA0 8E83 776F 706B 6891 C0C8 C9D0" /* w‘® Žƒwopkh‘ÀÈÉÐ */ $"CBB7 9B6F 4E56 767E 605C 757C 655C 7093" /* Ë·›oNVv~`\u|e\p“ */ $"B8AF 9186 805A 4C56 6685 9C99 8181 9294" /* ¸¯‘†€ZLVf…œ™��’” */ $"7F63 5451 4E38 3B61 7D83 8691 A5A8 8D73" /* .cTQN8;a}ƒ†‘¥¨�s */ $"6667 6E5D 4A53 7187 9C9D 8687 8E8E 86A5" /* fgn]JSq‡œ�†‡ŽŽ†¥ */ $"D2DE C5D5 EDED D9B0 A5A6 9D8F 603B 2D44" /* Ò.ÅÕ...°¥¦��`;-D */ $"494C 5063 8B88 6857 6460 4A50 5162 6053" /* ILPc‹ˆhWd`JPQb`S */ $"5768 83A8 ADBE CACC B97C 4F47 5761 5E65" /* Whƒ¨­¾Ê̹|OGWa^e */ $"717F 6753 5264 7C64 5366 89AA BABD ACB9" /* q.gSRd|dSf‰ªº½¬¹ */ $"CFD1 CDC5 B4AA 8974 7374 643C 2B3D 6064" /* ÏÑÍÅ´ª‰tstd<+=`d */ $"4F44 414B 2F2C 3142 7788 8D9B B3C8 CBC3" /* ODAK/,1Bwˆ�›³ÈËà */ $"ABAE 9B80 8A9D A7AF 9F96 ACB5 9368 5152" /* «®›€Š�§¯Ÿ–¬µ“hQR */ $"7386 8A84 8187 6F5C 5876 A0A1 9592 8D84" /* s†Š„�‡o\Xv ¡•’�„ */ $"6C60 5C76 807E 8C91 8E90 7253 4747 3C35" /* l`\v€~Œ‘Ž�rSGG<5 */ $"415C 838B 8DAB C2C3 A489 7075 8675 6B63" /* A\ƒ‹�«Âä‰pu†ukc */ $"5A6E 777D 7A7E 726C 8498 A6B2 9294 B3CB" /* Znw}z~rl„˜¦²’”³Ë */ $"B191 8C9C B09E 8276 625E 5E59 505A 7478" /* ±‘Œœ°ž‚vb^^YPZtx */ $"8A90 7B79 614F 5869 5D58 7487 8895 8590" /* Š�{yaOXi]Xt‡ˆ•…� */ $"9FA5 937F 7470 715F 5373 8889 785D 5157" /* Ÿ¥“.tpq_Ssˆ‰x]QW */ $"635F 7079 7EA3 A8A6 B6BC B8C6 E2E9 DBC9" /* c_py~£¨¦¶¼¸Æ...É */ $"8B79 7166 4831 364E 6568 5E6F 6555 4A36" /* ‹yqfH16Neh^oeUJ6 */ $"3035 4D6B 969D 96B5 B0A9 B7AC 8D78 86A7" /* 05Mk–�–µ°©·¬�x†§ */ $"AFA4 7377 817A 695E 5E68 737D 7A90 8B80" /* ¯¤sw�zi^^hs}z�‹€ */ $"7E6B 666C 7A87 ABB4 A7AA 8668 6E66 677A" /* ~kflz‡«´§ª†hnfgz */ $"99AF ADA4 7367 5D3F 2423 3F67 787B 7295" /* ™¯­¤sg]?$#?gx{r• */ $"A39F A091 8678 7476 8E81 616B 6662 766A" /* £Ÿ ‘†xtvŽ�akfbvj */ $"626A 87AD B9BA 9092 A69A 9094 A5B8 B8B8" /* bj‡­¹º�’¦š�”¥¸¸¸ */ $"A9A4 7750 5C66 695C 5B69 8A93 9296 755D" /* ©¤wP\fi\[iŠ“’–u] */ $"6657 4E59 829F 9789 676F 7963 697F 8A89" /* fWNY‚Ÿ—‰goyci.Љ */ $"786D 626D 635D 6A65 5E4E 4D5D 8381 819F" /* xmbmc]je^NM]ƒ��Ÿ */ $"A1A2 AA9D A3BF EBFD F1D9 A386 7A53 4A4D" /* ¡¢ª�£¿....£†zSJM */ $"4F58 5D6A 7577 543C 484F 5241 4163 8F88" /* OX]juwTD */ $"545F 5F5C 6A70 746E 8BA2 A5A9 A5A7 A0BA" /* T__\jptn‹¢¥©¥§ º */ $"E9F2 F3DC B590 6B42 4465 6656 5D78 8362" /* ....µ�kBDefV]xƒb */ $"4137 3B4D 565F 6E6E 7770 8DA3 A6A0 8F87" /* A7;MV_nnwp�£¦ �‡ */ $"86AA C3B2 B2A3 816B 5E44 466E 7767 6E88" /* †ªÃ²²£�k^DFnwgnˆ */ $"9B7B 5657 6E84 8183 939C 9A8B AEC2 B08C" /* ›{VWn„�ƒ“œš‹®Â°Œ */ $"6C64 6080 A2A2 A99A 856F 553B 4660 5953" /* ld`€¢¢©š…oU;F`YS */ $"6E92 A474 4D50 6073 7388 ABAE 8D6A 828A" /* n’¤tMP`ssˆ«®�j‚Š */ $"7F72 5B4D 5173 9094 A299 8C7C 6E70 8DB0" /* .r[MQs�”¢™Œ|np�° */ $"ACA3 C0DD DCA2 745D 4547 5D75 9391 725C" /* ¬£À..¢t]EG]u“‘r\ */ $"819B 9C87 655F 7089 9792 9982 5F46 3C43" /* �›œ‡e_p‰—’™‚_FQ^p�‰ */ $"6559 8093 9EA6 9CA2 B7CC DADE E8CC A483" /* eY€“ž¦œ¢·Ì...̤ƒ */ $"6B5B 586D 6B60 697B 7953 3F39 364B 617C" /* k[Xmk`i{yS?96Ka| */ $"9E90 665E 8696 A0A0 8982 8EA6 C7C2 AB8A" /* ž�f^†–  ‰‚ަÇÂ«Š */ $"6E56 4F60 666A 605D 7288 886B 584D 5075" /* nVO`fj`]rˆˆkXMPu */ $"93A6 BEA6 878C A7B3 BAA6 7167 7C90 A29C" /* “¦¾¦‡Œ§³º¦qg|�¢œ */ $"967B 665A 5561 646C 645C 748C 8A6D 5544" /* –{fZUadld\tŒŠmUD */ $"4568 7B8C AFAB 907C 828A 907C 5559 697A" /* Eh{Œ¯«�|‚Š�|UYiz */ $"9592 8D76 6363 718D 9CAD AC9E B0D0 D3AC" /* •’�vccq�œ­¬ž°ÐÓ¬ */ $"7D58 474C 5684 AC92 6C63 6E86 9E8F 656B" /* }XGLV„¬’lcn†ž�ek */ $"86A4 B496 8166 4A3C 4261 6D6D 666A 96B3" /* †¤´–�fJL.£¶°ª± */ $"C0C4 AE8B 7369 7173 8C9D 8A77 4E56 7287" /* ÀÄ®‹siqsŒ�ŠwNVr‡ */ $"8569 6D84 9FB6 A99E 7B56 2E34 6080 8B73" /* …im„Ÿ¶©ž{V.4`€‹s */ $"5E68 808E 7A5C 4D47 515F 8FAF A082 5154" /* ^h€Žz\MGQ_�¯ ‚QT */ $"6B7F 7D71 85AB DBF1 D5C3 A58D 7284 B0BF" /* k.}q…«..ÕÃ¥�r„°¿ */ $"AD79 5356 616A 5436 231F 395C 93AD A79C" /* ­ySVajT6#.9\“­§œ */ $"7874 8496 9382 8DA4 BBB8 9583 6956 4B6C" /* xt„–“‚�¤»¸•ƒiVKl */ $"9B9D 8A74 6974 7477 5E3E 3335 4C6A A8CB" /* ›�Štittw^>35Lj¨Ë */ $"C1A1 7781 9DB3 B1A6 ACAC A693 706A 6658" /* Á¡w��³±¦¬¬¦“pjfX */ $"4454 7F8E 876F 6174 8A9C 7B53 3F3B 5275" /* DT.އoatŠœ{S?;Ru */ $"A4AD 9B80 626C 8590 8D81 7779 8C95 7E72" /* ¤­›€bl…���wyŒ•~r */ $"644F 3F59 8E9A 9394 ABC6 C1BC A186 7971" /* dO?YŽš“”«ÆÁ¼¡†yq */ $"7B8C A29D 896A 4D60 7F84 766B 768E 9DA5" /* {Œ¢�‰jM`.„vkvŽ�¥ */ $"9B9A 8459 3E4B 7275 6F6D 6F7D 7D7F 654A" /* ›š„Y>Kruomo}}.eJ */ $"4748 5C79 989F 9882 626E 7D6F 6671 8EA5" /* GH\y˜Ÿ˜‚bn}ofqŽ¥ */ $"BAD4 CABD A483 7790 BCBA A790 7364 534C" /* ºÔʽ¤ƒw�¼º§�sdSL */ $"3B30 342C 3A66 949E 9C97 8999 9D91 8E92" /* ;04,:f”žœ—‰™�‘Ž’ */ $"9CA3 AAAC 9582 5E3C 4577 A596 7D71 717B" /* œ£ª¬•‚^Wd */ $"7382 9096 B3CF D2C3 AEB4 AE9A 836D 7A8E" /* s‚�–³ÏÒî´®šƒmzŽ */ $"8C75 5D57 646B 746B 655B 4837 3C55 698A" /* Œu]Wdktke[H7R{� */ $"A9AD B496 6958 5F77 7665 5350 5463 8183" /* ©­´–iX_wveSPTc�ƒ */ $"7373 7173 778A 9FA6 9982 8DA8 9B7E 666D" /* ssqswŠŸ¦™‚�¨›~fm */ $"8AA1 A4A4 A284 6B7B 93B4 B08E 7164 523E" /* Š¡¤¤¢„k{“´°ŽqdR> */ $"372A 202C 3B5B 7C9E BECC C4B6 C4DD CBA9" /* 7* ,;[|ž¾ÌĶÄ.Ë© */ $"857B 898B 8285 8F78 595A 6779 5F38 2B2E" /* …{‰‹‚…�xYZgy_8+. */ $"3648 6571 7584 8A96 A2AB B1A6 8C7C 90B2" /* 6Hequ„Š–¢«±¦Œ|�² */ $"AD9C 8886 8E88 8388 8A70 555E 6C80 715D" /* ­œˆ†ŽˆƒˆŠpU^l€q] */ $"5F65 6B7A 8E8E 8078 707A 8999 A59B 8585" /* _ekzŽŽ€xpz‰™¥›…… */ $"A3BC A381 5636 2F35 4661 7167 607B 9BB6" /* £¼£�V6/5Faqg`{›¶ */ $"A28B 8F98 A1A6 A597 8A84 8195 AAB2 AF98" /* ¢‹�˜¡¦¥—Š„�•ª²¯˜ */ $"755C 5F69 5449 3C45 617B 99B2 B6A0 847E" /* u\_iTIDOPIUu’ ˜‹�˜¬½ */ $"BA9A 7E65 759F C3D3 C8A3 8168 634F 464A" /* ºš~euŸÃÓÈ£�hcOFJ */ $"423C 4767 8AA4 A89E 9B9A 8E7C 5F48 474D" /* B9 */ $"3B3F 3A44 556D 90A8 ABA5 A396 7C5F 4749" /* ;?:DUm�¨«¥£–|_GI */ $"4B47 4A73 A9C4 CABD AEA1 8E78 6C7A 8A86" /* KGJs©Äʽ®¡ŽxlzІ */ $"7E78 7F88 7F79 7C87 9494 8573 6C6A 6B64" /* ~x.ˆ.y|‡””…sljkd */ $"5B62 6766 6683 A2AC A188 7A76 6D60 668D" /* [bgffƒ¢¬¡ˆzvm`f� */ $"A9AD ABAA AEA8 958B 8C92 9898 897B 7469" /* ©­«ª®¨•‹Œ’˜˜‰{ti */ $"5634 1B17 1610 1140 7BA5 B1AF BECA BEA7" /* V4.....@{¥±¯¾Ê¾§ */ $"9AA3 9B8A 817C 7D79 6D68 6C77 8896 8E86" /* š£›Š�|}ymhlwˆ–ކ */ $"817E 745C 545C 5854 6296 C3D4 C8AF A293" /* �~t\T\XTb–ÃÔȯ¢“ */ $"7659 5470 7E7E 8287 8E85 715F 5756 595E" /* vYTp~~‚‡Ž…q_WVY^ */ $"585C 626E 7467 6B7F 8B91 9ECC F1FC EACD" /* X\bntgk.‹‘žÌ...Í */ $"C4B4 9574 636E 6654 4C47 4333 2427 3C58" /* Ä´•tcnfTLGC3$'!. */ $"2144 5D55 453C 3E58 7189 979E A2A4 ADB5" /* !D]UE<>Xq‰—ž¢¤­µ */ $"BBB4 9274 7183 9089 7363 6E81 8F9B 9588" /* »´’tqƒ�‰scn��›•ˆ */ $"7164 7A9D A98E 6D55 4E5C 6367 696E 7684" /* qdz�©ŽmUN\cginv„ */ $"939C A7A9 9688 90A2 A592 7260 6266 696D" /* “œ§©–ˆ�¢¥’r`bfim */ $"6A6A 615F 7EA9 B9AB 998A 8997 9FA4 A397" /* jja_~©¹«™Š‰—Ÿ¤£— */ $"8270 6055 5C5C 4434 4464 746C 5757 6D84" /* ‚p`U\\D4DdtlWWm„ */ $"9DAB A49B 8373 839C 9A84 6A56 5A6F 7A80" /* �«¤›ƒsƒœš„jVZoz€ */ $"8A93 98A3 ADB0 B9B4 9987 8B98 937A 5B4D" /* Š“˜£­°¹´™‡‹˜“z[M */ $"4D51 616A 6B6A 5A53 6E94 9D8F 7B6B 707C" /* MQajkjZSn”��{kp| */ $"776D 6C6E 6D78 8696 AAAC 9C96 AAC7 CCBA" /* wmlnmx†–ª¬œ–ªÇ̺ */ $"A19B 9FA2 A08B 6F54 2C15 2640 4646 423F" /* ¡›Ÿ¢ ‹oT,.&@FFB? */ $"4D5E 666F 849B A9B7 BABB BCA9 8772 7B8E" /* M^fo„›©·º»¼©‡r{Ž */ $"8B7B 6C6B 6A71 8693 9890 7465 7C98 9B8F" /* ‹{lkjq†“˜�te|˜›� */ $"7461 656C 655D 626F 7B8C 949F A597 8482" /* taele]bo{Œ”Ÿ¥—„‚ */ $"9AAF A78E 776C 6567 6F6D 6A65 5655 7495" /* š¯§ŽwlegomjeVUt• */ $"9F9E 938F 9DA5 9E9B A6A9 9D91 7C6A 5D48" /* Ÿž“��¥ž›¦©�‘|j]H */ $"3430 4A64 645B 5156 5E71 8C9E A9A1 887D" /* 40Jdd[QV^qŒž©¡ˆ} */ $"8E9B 9385 7269 757D 7B79 8693 9AA6 ACB2" /* Ž›“…riu}{y†“𦬲 */ $"B29F 8B87 989F 866E 5D57 5152 5A60 6865" /* ²Ÿ‹‡˜Ÿ†n]WQRZ`he */ $"5656 6E85 8E8E 817B 888C 8275 7576 757D" /* VVn…ŽŽ�{ˆŒ‚uuvu} */ $"8694 9D95 8B8F A7B6 AEA9 A6A4 A1A7 A99C" /* †”�•‹�§¶®©¦¤¡§©œ */ $"8665 3C28 3037 3433 3544 5B61 5F63 7789" /* †e<(07435D[a_cw‰ */ $"9AB3 C2C8 BFA4 897D 888A 7972 7379 7676" /* š³ÂÈ¿¤‰}ˆŠyrsyvv */ $"7E89 928D 7A75 828B 8B86 7C79 7E76 6862" /* ~‰’�zu‚‹‹†|y~vhb */ $"6365 6E83 949F 9F8C 7D82 9AA2 978F 867C" /* cenƒ”ŸŸŒ}‚š¢—�†| */ $"6E69 6C6D 675D 5561 7582 898C 8F9A A7A6" /* nilmg]Uau‚‰Œ�𧦠*/ $"A0A2 ACAD A5A5 9C86 6740 2F36 4950 4C50" /*  ¢¬­¥¥œ†g@/6IPLP */ $"5557 5963 778C 9998 8E8E 9291 8C82 7C7E" /* UWYcwŒ™˜ŽŽ’‘Œ‚|~ */ $"837E 7E87 8E90 95A6 B2B1 A896 8B8D 9692" /* ƒ~~‡Ž�•¦²±¨–‹�–’ */ $"8377 6B64 5C59 5C5C 5A55 5361 7078 7F84" /* ƒwkd\Y\\ZUSapx.„ */ $"888C 8F8C 8886 8077 727D 868B 8C85 8892" /* ˆŒ�Œˆ†€wr}†‹Œ…ˆ’ */ $"9A9B 979A A1A6 A6AA AFA5 9074 5B4E 4137" /* š›—š¡¦¦ª¯¥�t[NA7 */ $"312F 3847 575B 5F68 7078 86A1 BAC4 BDA7" /* 1/8GW[_hpx†¡ºÄ½§ */ $"9689 8179 7272 747C 8183 827E 7E7F 8188" /* –‰�yrrt|�ƒ‚~~.�ˆ */ $"8884 8180 8587 877F 7B75 6B62 6379 8D95" /* ˆ„�€…‡‡.{ukbcy�• */ $"9289 8787 8C90 9193 9087 7A6F 6963 5C56" /* ’‰‡‡Œ�‘“�‡zoic\V */ $"5B6B 7278 7C83 939E A4A5 A8A9 A8A8 AAB1" /* [krx|ƒ“ž¤¥¨©¨¨ª± */ $"AF9C 7753 3F38 393D 444D 5052 575E 676E" /* ¯œwS?89=DMPRW^gn */ $"7A86 96A0 998E 8585 8988 8686 8E93 9494" /* z†– ™Ž……‰ˆ††Ž“”” */ $"99A7 B0AA 9B90 8D89 8480 8484 7668 6260" /* ™§°ª›��‰„€„„vhb` */ $"5D52 4B4A 5866 6D71 7584 9394 9093 9B96" /* ]RKJXfmqu„“”�“›– */ $"897D 7C83 8682 7B7D 868B 8F8F 9499 9698" /* ‰}|ƒ†‚{}†‹��”™–˜ */ $"A2AA A99C 8C84 806F 5944 383A 3E41 4858" /* ¢ª©œŒ„€oYD8:>AHX */ $"686B 696C 7D94 A6AD AFAF A690 7E73 7679" /* hkil}”¦­¯¯¦�~svy */ $"7476 818A 8575 707A 8A8C 8781 7E82 8584" /* tv�Š…upzŠŒ‡�~‚…„ */ $"8690 9385 7267 6B74 7B7E 8288 8780 7F86" /* †�“…rgkt{~‚ˆ‡€.† */ $"979B 908B 877E 6B58 5059 6669 6E71 7782" /* —›�‹‡~kXPYfinqw‚ */ $"8C95 A0B1 B5AA 9F9F ABB4 B1A1 8A6E 4D37" /* Œ• ±µªŸŸ«´±¡ŠnM7 */ $"2F35 484C 474C 565B 5654 6282 9CA0 9E94" /* /5HLGLV[VTb‚œ ž” */ $"8A87 8988 8C9B 9E98 9497 A7B3 B2A6 9A90" /* Ї‰ˆŒ›ž˜”—§³²¦š� */ $"8279 767A 8986 7771 6C61 544C 4B57 605F" /* ‚yvz‰†wqlaTLKW`_ */ $"666E 747E 8990 99A7 A89A 8A7E 8489 8378" /* fnt~‰�™§¨šŠ~„‰ƒx */ $"7474 7279 8290 A199 8B8E 969A 968F 8E97" /* ttry‚�¡™‹Ž–š–�Ž— */ $"9787 765F 4A42 4040 4C62 6867 6364 7A8A" /* —‡v_JB@@LbhgcdzŠ */ $"9397 9EA2 9C91 817E 8376 6C73 7D81 7C75" /* “—ž¢œ‘�~ƒvls}�|u */ $"7A8C 9490 8E82 7A7C 7D7F 8DA1 A399 826E" /* zŒ”�Ž‚z|}.�¡£™‚n */ $"7375 706E 7579 7876 7786 9A96 8F92 8E7F" /* supnuyxvw†š–�’Ž. */ $"6955 5563 6868 7070 717B 848E A5BE BFB4" /* iUUchhppq{„Ž¥¾¿´ */ $"9F96 A8B1 ACA3 967E 6043 353F 4C43 4048" /* Ÿ–¨±¬£–~`C5?LC@H */ $"4C4C 4745 597B 929C A195 8884 8188 9AAA" /* LLGEY{’œ¡•ˆ„�ˆšª */ $"AAA0 9192 AAB7 B4AC A192 7D6C 6A7A 867D" /* ª ‘’ª·´¬¡’}ljz†} */ $"7778 7163 5248 5563 6565 6965 6873 7C8B" /* wxqcRHUceeiehs|‹ */ $"A3B5 B4A5 8D81 8888 7F76 706D 6766 7896" /* £µ´¥��ˆˆ.vpmgfx– */ $"A496 8D8D 8C8A 8484 929E 9D98 8F73 594C" /* ¤–��ŒŠ„„’ž�˜�sYL */ $"454B 5E6F 7267 565A 7280 848A 9194 8C86" /* EK^orgVZr€„Š‘”Œ† */ $"898E 8A74 696D 7276 7477 8695 9BA0 9C84" /* ‰ŽŠtimrvtw†•› œ„ */ $"736E 6E7B 95AC B1A1 887A 7E79 6D68 6B6F" /* snn{•¬±¡ˆz~ymhko */ $"6A6C 7A8D 938A 898E 8D85 7163 6266 686E" /* jlz�“ЉŽ�…qcbfhn */ $"7268 646A 7590 B0C8 CCB8 9A90 9CA3 9F9A" /* rhdju�°È̸š�œ£Ÿš */ $"978A 6C54 4D51 5040 383C 4144 434B 5E72" /* —ŠlTMQP@8DPajfhqwsh`lŒ¯Ä */ $"C7B9 9D7F 6F6E 7B8F 9C9A 9CA8 AEA3 927F" /* ǹ�.on{�œšœ¨®£’. */ $"6854 4B4A 5367 7476 7F8B 8C7F 6D63 6A84" /* hTKJSgtv.‹Œ.mcj„ */ $"A3B6 B8AD 9478 6B70 8293 9482 6F66 5C4E" /* £¶¸­”xkp‚“”‚of\N */ $"4B50 5760 6E7F 91A2 A9A6 AAB0 AB99 7E69" /* KPW`n.‘¢©¦ª°«™~i */ $"6B83 A0B3 B6A6 8667 5753 5A64 645A 5457" /* kƒ ³¶¦†gWSZddZTW */ $"5856 5B61 6465 686C 7581 858A 99A9 AFA7" /* XV[adehlu�…Š™©¯§ */ $"998F 95A9 BDC3 BCA6 8262 585E 7184 8981" /* ™�•©½Ã¼¦‚bX^q„‰� */ $"7875 6F64 5F5C 5B5A 5B60 7082 8F98 A7B1" /* xuod_\[Z[`p‚�˜§± */ $"AA90 6F54 5269 87A1 ADA9 9887 8083 93A3" /* ª�oTRi‡¡­©˜‡€ƒ“£ */ $"A69D 9389 7762 564F 4C4D 4F52 5C65 6667" /* ¦�“‰wbVOLMOR\efg */ $"727B 7B6F 615E 7192 B1C2 C3B4 9576 6565" /* r{{oa^q’±Âô•vee */ $"788B 979B A0A6 9F8F 857E 7770 6760 6265" /* x‹—› ¦Ÿ�…~wpg`be */ $"676B 7988 8C81 706A 7993 A9B7 B6A5 896E" /* gkyˆŒ�pjy“©·¶¥‰n */ $"6165 788B 948F 8373 573B 343C 4F62 7384" /* aex‹”�ƒsW;4Fª */ $"A896 7C96 8268 5850 A0D4 A078 6C4A 90AE" /* ¨–|–‚hXP Ô xlJ�® */ $"9854 4A74 7496 9286 ACA2 4C4E 4E7A AABA" /* ˜TJtt–’†¬¢LNNzªº */ $"8842 667C 8696 7054 947A 6A82 AAB4 9484" /* ˆBf|†–pT”zj‚ª´”„ */ $"3A2A 749C A6AC 565E 8680 6E72 9A74 6A76" /* :*tœ¦¬V^†€nrštjv */ $"627C BC96 8856 224E 92B4 8290 926A 7286" /* b|¼–ˆV"N’´‚�’jr† */ $"6494 9A6E 6C5E 6A8C C694 4A4E 6056 96A6" /* d”šnl^jŒÆ”JN`V–¦ */ $"929C 7462 6072 6A84 9C6E 3674 9294 BA7E" /* ’œtb`rj„œn6t’”º~ */ $"5C52 5A74 A0A6 887C 9450 3480 8098 885E" /* \RZt ¦ˆ|”P4€€˜ˆ^ */ $"547C A2A8 9A7A 3650 8E60 84A4 9E88 6844" /* T|¢¨šz6PŽ`„¤žˆhD */ $"548A AE8C 7C6C 46A8 BC7E 6A6A 5E58 5A6E" /* TŠ®Œ|lF¨¼~jj^XZn */ $"90BC A856 6242 5EB6 AE68 5472 8C8C 8274" /* �¼¨VbB^¶®hTrŒŒ‚t */ $"7096 5042 788E B2D2 9840 3E74 988C 8858" /* p–PBxŽ²Ò˜@>t˜ŒˆX */ $"7896 666C 8E88 8280 4C3C 72D2 BE96 6030" /* x–flŽˆ‚€Lr„Œ¾ŽptXX‚„ª */ $"B082 4A5A A286 827A 464A 7682 ACA8 8674" /* °‚JZ¢†‚zFJv‚¬¨†t */ $"6E60 3A86 BA98 8672 4C72 8E90 8C68 545A" /* n`:†º˜†rLrŽ�ŒhTZ */ $"A29C 84AA A660 4E46 5898 A698 7064 5476" /* ¢œ„ª¦`NFX˜¦˜pdTv */ $"AE8C 567A 7C6C 8684 A4A6 904E 3658 72A8" /* ®ŒVz|l†„¤¦�N6Xr¨ */ $"D282 5480 8290 7C78 7A7E 7650 70A4 989C" /* Ò‚T€‚�|xz~vPp¤˜œ */ $"8222 3474 B0AC 8E80 7488 7652 809A 6E7E" /* ‚"4t°¬Ž€tˆvR€šn~ */ $"645A 82BA C47C 5042 64A2 9C7A AA8E 6A62" /* dZ‚ºÄ|PBd¢œzªŽjb */ $"5C68 7CA2 8656 5A78 A4D4 8258 685E 6278" /* \h|¢†VZx¤Ô‚Xh^bx */ $"9C98 988E 6848 6C76 ACAE 5C56 80A2 9A96" /* œ˜˜ŽhHlv¬®\V€¢š– */ $"8662 4A62 5882 A090 AE84 4448 86A4 9478" /* †bJbX‚ �®„DH†¤”x */ $"7A5E 8098 88A0 6E54 686A 6286 BCCA 7E60" /* z^€˜ˆ nThjb†¼Ê~` */ $"5658 9888 867E 5E62 8E96 806C 8E7A 4662" /* VX˜ˆ†~^bŽ–€lŽzFb */ $"70B4 CA98 6A5C 4C6C 909A 7266 987E 7E82" /* p´Ê˜j\Ll�šrf˜~~‚ */ $"88A0 8E4C 4A6C 94B0 AC92 3A4E 7476 7E80" /* ˆ ŽLJl”°¬’:Ntv~€ */ $"84A2 8860 7294 AA7C 744E 3E82 B8AC 9868" /* „¢ˆ`r”ª|tN>‚¸¬˜h */ $"5C7A 6668 7AB4 A074 7468 6C9E 966E 5638" /* \zfhz´ tthlž–nV8 */ $"709C B28E 8696 664A 6C78 94B2 887C 5668" /* pœ²Ž†–fJlx”²ˆ|Vh */ $"84A4 944E 547E 7C92 B294 966C 5A4C 6082" /* „¤”NT~|’²”–lZL`‚ */ $"96B2 8646 5E94 8698 7868 6876 8A92 A694" /* –²†F^”†˜xhhvŠ’¦” */ $"8076 5026 80B0 B094 6E66 7694 8C80 786A" /* €vP&€°°”nfv”Œ€xj */ $"5E90 7076 AAA8 7C3E 3C5E A0BA A076 8664" /* ^�pvª¨|><^ º v†d */ $"7E94 6C6E 808A 645E 7CAE B6A0 4442 6872" /* ~”ln€Šd^|®¶ DBhr */ $"ACA8 8C72 8074 5E60 8A84 9272 448A ACB4" /* ¬¨Œr€t^`Š„’rDЬ´ */ $"A07C 3E48 80A4 868E 907C 8C56 548A A888" /*  |>H€¤†Ž�|ŒVTЍˆ */ $"7A66 6A8A C4AC 605E 486A 827A 7EB0 9E74" /* zfjŠÄ¬`^Hj‚z~°žt */ $"5A66 788E B674 5E6A 80A0 B074 606C 665E" /* Zfx޶t^j€ °t`lf^ */ $"6CAA 98AC 9A5E 5270 7E9E 8C5A 5C78 9E7A" /* lª˜¬š^Rp~žŒZ\xžz */ $"968A 6068 6E64 8AA4 AAAC 7250 428E 9078" /* –Š`hndФª¬rPBŽ�x */ $"8472 648E 9C90 8E6E 7664 6E5A 82C8 A86C" /* „rdŽœ�ŽnvdnZ‚Ȩl */ $"5E4E 6298 8A88 6E80 8496 966E 829C 6842" /* ^Nb˜Šˆn€„––n‚œhB */ $"6476 B0AE 945E 566C 7694 8A68 8AA8 6A70" /* dv°®”^Vlv”ŠhЍjp */ $"7894 8E76 5042 78A2 AEAC 8448 7E82 7070" /* x”ŽvPBx¢®¬„H~‚pp */ $"869C 8C7C 606A 969C 7276 4054 A4BE 9E72" /* †œŒ|`j–œrv@T¤¾žr */ $"7C74 6A64 6278 B286 7876 6084 ACA6 5A4C" /* |tjdbx²†xv`„¬¦ZL */ $"7092 98A2 7C92 8E50 5466 7A8C AE92 5E5A" /* p’˜¢|’ŽPTfzŒ®’^Z */ $"9292 9872 4C76 7A76 84A4 8E7A 7468 4274" /* ’’˜rLvzv„¤ŽzthBt */ $"A2AA AA6A 6088 9A7A 7E78 685A 8888 78A0" /* ¢ªªj`ˆšz~xhZˆˆx  */ $"948C 6640 50A2 AE8E 727C 686A 9A76 6E72" /* ”Œf@P¢®Žr|hjšvnr */ $"747E 846E 96BC AA5C 426E 6A9C AA84 7072" /* t~„n–¼ª\Bnjœª„pr */ $"728A 7A68 7496 8E48 769E A2A0 7C48 4A62" /* rŠzht–ŽHvž¢ |HJb */ $"86A0 9278 6CA2 7C54 7A96 8E86 6460 869E" /* † ’xl¢|Tz–ކd`†ž */ $"A882 6A34 569C 8A72 969C 8870 566E 869E" /* ¨‚j4VœŠr–œˆpVn†ž */ $"746A 6A5E 92C2 885C 6870 7E72 8896 B098" /* tjj^’ˆ\hp~rˆ–°˜ */ $"5E62 6C66 92A2 6458 6E9E 9A8E 786C 7C66" /* ^blf’¢dXnžšŽxl|f */ $"5486 9E88 A082 5846 769A 907E 6672 9C90" /* T†žˆ ‚XFvš�~frœ� */ $"7AA2 8066 646E 6874 AAAC 8C68 4A68 A480" /* z¢€fdnhtª¬ŒhJh¤€ */ $"7E84 7E72 849A 7E78 8470 5E64 5EAA C890" /* ~„~r„š~x„p^d^ªÈ� */ $"6868 706C 8890 7674 8A76 8676 7096 8C56" /* hhplˆ�vtŠv†vp–ŒV */ $"4478 9EA4 A28C 566A 6E74 8878 7A96 9264" /* Dxž¤¢ŒVjntˆxz–’d */ $"6A98 A67E 7454 5A94 A0A4 9270 5C76 7A5E" /* j˜¦~tTZ” ¤’p\vz^ */ $"68A8 987A 7860 809C 9274 6252 6A9C B27A" /* h¨˜zx`€œ’tbRjœ²z */ $"7492 6A60 5E70 9AAA 8A72 6A74 80A4 9246" /* t’j`^pšªŠrjt€¤’F */ $"5C7A 828A 8E8C 9680 5A4E 748E 92B2 8050" /* \z‚ŠŽŒ–€ZNtŽ’²€P */ $"6A90 8E84 6A66 767E 7A82 AC92 807C 5244" /* j�Ž„jfv~z‚¬’€|RD */ $"7EA4 A482 6468 7C94 7076 886C 6E86 7884" /* ~¤¤‚dh|”pvˆln†x„ */ $"A4A2 7C48 4C62 9EAA 7C7C 866E 7C8A 7878" /* ¤¢|HLbžª||†n|Šxx */ $"8088 686A 7E98 B888 424E 6C78 9898 8872" /* €ˆhj~˜¸ˆBNlx˜˜ˆr */ $"8280 6C76 7886 9868 467C A2A8 8E74 5254" /* ‚€lvx†˜hF|¢¨ŽtRT */ $"828E 8E94 8284 905A 5680 A088 6A66 648C" /* ‚ŽŽ”‚„�ZV€ ˆjfdŒ */ $"B09E 7E6A 5074 8A7C 7C9E A674 5A5E 6E94" /* °ž~jPtŠ||ž¦tZ^n” */ $"A474 6A66 76A6 AA80 5E74 785C 6888 94AE" /* ¤tjfv¦ª€^tx\hˆ”® */ $"8A5C 5C68 869E 9866 5888 9C84 8C7E 787C" /* Š\\h†ž˜fXˆœ„Œ~x| */ $"5A5C 7CA2 A8A2 824E 5094 9884 7A6A 7E86" /* Z\|¢¨¢‚NP”˜„zj~† */ $"7E7A 8C8A 7266 6656 86C2 A880 5C58 768C" /* ~zŒŠrffV†Â¨€\XvŒ */ $"8078 8286 7280 8872 949A 7452 567E B0B4" /* €x‚†r€ˆr”štRV~°´ */ $"8A60 6A6E 6488 8478 8A92 786C 7696 A488" /* Š`jndˆ„xŠ’xlv–¤ˆ */ $"5244 8496 9CA4 7E60 6E76 7476 889A 9684" /* RD„–œ¤~`nvtvˆš–„ */ $"4E6A A298 806C 505C 84A0 9A84 846E 7A6A" /* Nj¢˜€lP\„ š„„nzj */ $"5688 B296 7668 6882 9A9A 6A60 6476 9E96" /* Vˆ²–vhh‚ššj`dvž– */ $"8096 986A 545C 7E94 A888 6066 728C A27A" /* €–˜jT\~”¨ˆ`frŒ¢z */ $"5674 827C 7A94 9A8E 8056 4C70 88A2 A66E" /* Vt‚|z”šŽ€VLpˆ¢¦n */ $"5C78 9686 7680 7678 786A 80A0 928C 6E46" /* \x–†v€vxxj€ ’ŒnF */ $"4C88 B094 807A 7482 8670 8684 7676 7270" /* Lˆ°”€zt‚†p†„vvrp */ $"7EB2 A86A 505A 72A0 9484 887E 7470 7E70" /* ~²¨jPZr ”„ˆ~tp~p */ $"7696 8256 6682 AAB2 7E5A 5E72 788E 9A82" /* v–‚Vf‚ª²~Z^rxŽš‚ */ $"7A90 6E5A 7086 A08E 6456 82A0 9A8E 7C50" /* z�nZp† ŽdV‚ šŽ|P */ $"5E82 7A80 8896 9476 525E 92A6 8478 6E5E" /* ^‚z€ˆ–”vR^’¦„xn^ */ $"8CA4 9478 6868 7672 6E84 B6A4 6864 5E72" /* Œ¤”xhhvrn„¶¤hd^r */ $"969A 7C64 647E 9294 7672 8E6C 5670 8CA2" /* –š|dd~’”vrŽlVpŒ¢ */ $"AC8E 6452 6A88 968E 5E70 907E 768A 8E86" /* ¬ŽdRjˆ–Ž^p�~vŠŽ† */ $"7462 5C74 A0A2 A070 4464 8E82 7880 8482" /* tb\t ¢ pDdŽ‚x€„‚ */ $"7C7E 7892 927C 7258 5496 BA96 7062 6E70" /* |~x’’|rXT–º–pbnp */ $"827C 7E92 887A 7E6C 729E 9A68 4264 869E" /* ‚|~’ˆz~lržšhBd†ž */ $"A684 7478 686E 847A 8498 9664 5888 9C9A" /* ¦„txhn„z„˜–dXˆœš */ $"7A4E 5E82 8A9E 9E82 6C7A 7858 6C96 A094" /* zN^‚Šžž‚lzxXl– ” */ $"6E52 7E9A 9282 7460 6292 9C84 8890 7E70" /* nR~š’‚t`b’œ„ˆ�~p */ $"505A 94AA 8E70 706A 7EA2 9064 686E 8086" /* PZ”ªŽppj~¢�dhn€† */ $"7686 A096 604E 6A7C 96AE 8464 6E80 988C" /* v† –`Nj|–®„dn€˜Œ */ $"7068 8480 6270 9A98 9884 5452 7098 A48E" /* ph„€bpš˜˜„TRp˜¤Ž */ $"6866 8C8E 6676 8878 7C70 6C80 A0A8 8E66" /* hfŒŽfvˆx|pl€ ¨Žf */ $"485E A09E 7680 847C 7876 7280 8C82 706A" /* H^ žv€„|xvr€Œ‚pj */ $"6690 C290 5856 6A7C 8A88 8086 8876 7278" /* f�Â�XVj|Šˆ€†ˆvrx */ $"7094 A670 4E6E 98A6 9476 5E66 7872 8A8C" /* p”¦pNn˜¦”v^fxrŠŒ */ $"7E92 9060 567C A092 705A 5C90 9E8C 8A70" /* ~’�`V| ’pZ\�žŒŠp */ $"5A76 8472 769E AA84 6654 72A2 906E 6E66" /* Zv„rvžª„fTr¢�nnf */ $"6E98 A080 6A80 7A68 646C 9CB6 865C 626A" /* n˜ €j€zhdlœ¶†\bj */ $"8096 9466 6084 8E90 8478 8E8C 5A50 7298" /* €–”f`„Ž�„xŽŒZPr˜ */ $"9C9E 8250 5C84 908C 7062 888E 7270 9096" /* œž‚P\„�ŒpbˆŽrp�– */ $"7A6E 5852 82AC A68C 5C5C 8692 766E 8C86" /* znXR‚¬¦Œ\\†’vnŒ† */ $"727A 7678 9890 7C5C 486C A8B4 7E68 7A76" /* rzvx˜�|\Hl¨´~hzv */ $"6E7C 7682 8E82 726A 708E AE92 4E4E 7E8E" /* n|v‚Ž‚rjpŽ®’NN~Ž */ $"9894 807E 786E 6A72 7C8C 9C7C 486C 9EA0" /* ˜”€~xnjr|Œœ|Hlž  */ $"8C68 5A6A 8088 8C8E 8076 8664 5082 AA9E" /* ŒhZj€ˆŒŽ€v†dP‚ªž */ $"785E 6A90 A08C 7670 5C6E 9280 7692 9C7C" /* x^j� Œvp\n’€v’œ| */ $"5852 78A0 A276 6872 708E 9E78 6072 8276" /* XRx ¢vhrpŽžx`r‚v */ $"6E80 9CAC 8A50 5A76 849E 986C 5E78 9486" /* n€œ¬ŠPZv„ž˜l^x”† */ $"7472 7A8E 6C56 82A0 9C8E 7052 5486 A08C" /* trzŽlV‚ œŽpRT† Œ */ $"7A68 7E98 7868 8A92 7E6E 6A6C 86B0 A074" /* zh~˜xhŠ’~njl†° t */ $"544E 7C9E 7E72 8A8C 7A70 7A78 8A96 765E" /* TN|ž~rŠŒzpzxŠ–v^ */ $"5C72 AEB2 7658 6A7C 767E 8A86 9088 6E6A" /* \r®²vXj|v~І�ˆnj */ $"6C7E A28C 524A 82A4 9688 7466 7874 7284" /* l~¢ŒRJ‚¤–ˆtfxtr„ */ $"8490 987E 505C 9AA4 8068 5E74 9892 8C84" /* „�˜~P\š¤€h^t˜’Œ„ */ $"7470 7A72 5C7A B29E 6E58 5C88 9A86 726E" /* tpzr\z²žnX\ˆš†rn */ $"6E7A 9690 6E80 9474 5856 7EAE A87A 5E6C" /* nz–�n€”tXV~®¨z^l */ $"7A84 9882 5C76 8A80 7474 8C9A 7C50 5080" /* z„˜‚\vŠ€ttŒš|PP€ */ $"9898 9A6E 587A 8E84 746E 828C 7A60 74A6" /* ˜˜šnXzŽ„tn‚Œz`t¦ */ $"987C 6E54 6292 A892 7064 7486 7C60 7A98" /* ˜|nTb’¨’pdt†|`z˜ */ $"806E 6E6E 88A2 986C 4E5E 82A6 906A 7E8C" /* €nnnˆ¢˜lN^‚¦�j~Œ */ $"746C 707E 8E96 8460 647E 9EAA 7248 6684" /* tlp~Ž–„`d~žªrHf„ */ $"8282 8686 8282 6C60 768A 9E96 5C4E 82A4" /* ‚‚††‚‚l`vŠž–\N‚¤ */ $"9678 6E6A 7482 7A80 928C 8E7A 4E5C 94AA" /* –xnjt‚z€’ŒŽzN\”ª */ $"8660 6470 8E94 7A78 766E 7E7C 6C80 A8A2" /* †`dpŽ”zxvn~|l€¨¢ */ $"664E 6484 A492 6E6E 7680 928C 7472 9082" /* fNd„¤’nnv€’Œtr�‚ */ $"5C64 88A4 A674 5060 7A8C 9488 686C 9288" /* \dˆ¤¦tP`zŒ”ˆhl’ˆ */ $"6E78 8896 8458 5880 A49E 8A72 526C 9C90" /* nxˆ–„XX€¤žŠrRlœ� */ $"7876 808E 7E66 6E92 9A78 6862 5E94 B490" /* xv€Ž~fn’šxhb^”´� */ $"6E62 7288 8472 7898 926C 7076 7A9E 9A70" /* nbrˆ„rx˜’lpvzžšp */ $"5464 8EA8 9670 6A86 7864 7A82 8694 8868" /* Tdލ–pj†xdz‚†”ˆh */ $"5A78 9EA0 7E4E 6098 9082 8680 7A7A 7268" /* Zxž ~N`˜�‚†€zzrh */ $"7292 A094 6E48 76A8 9474 6C6C 7884 887A" /* r’ ”nHv¨”tllx„ˆz */ $"7C86 7E78 6058 94B6 8E66 6276 8690 886E" /* |†~x`X”¶Žfbv†�ˆn */ $"747A 7E8A 7472 9C9E 6C4C 6890 9C9A 7A64" /* tz~ŠtrœžlLh�œšzd */ $"7276 8490 706A 8A90 6E60 88A0 947C 5860" /* rv„�pjŠ�n`ˆ ”|X` */ $"828E 9A90 6862 8490 706A 8C94 866E 5E7E" /* ‚Žš�hb„�pjŒ”†n^~ */ $"9A90 846C 5662 96A4 786E 8482 7E68 6890" /* š�„lVb–¤xn„‚~hh� */ $"9E88 726E 6C7C A89C 605A 748A 927A 7A90" /* žˆrnl|¨œ`ZtŠ’zz� */ $"8E6E 6074 7A8C A884 525E 829E 906A 6680" /* Žn`tzŒ¨„R^‚ž�jf€ */ $"8A76 7892 888A 8E64 5270 9AAC 8860 5E86" /* Švx’ˆŠŽdRpš¬ˆ`^† */ $"9878 7888 747E 8472 7086 9E94 664A 609E" /* ˜xxˆt~„rp†ž”fJ`ž */ $"A878 787C 7282 887C 7482 9082 6A62 80B4" /* ¨xx|r‚ˆ|t‚�‚jb€´ */ $"965A 5C6E 8094 9284 727C 8278 7264 84AA" /* –Z\n€”’„r|‚xrd„ª */ $"7C52 688A 9E94 7C64 607E 8A92 8A70 8898" /* |RhŠž”|d`~Š’Špˆ˜ */ $"6A52 709A 9A80 6C60 7896 928A 6E56 7A92" /* jRpšš€l`x–’ŠnVz’ */ $"7A6C 88A0 8468 5E64 8C9A 8C82 6666 92A4" /* zlˆ „h^dŒšŒ‚ff’¤ */ $"8260 7688 7672 7082 A08C 7066 5C6E 98A6" /* ‚`vˆvrp‚ Œpf\n˜¦ */ $"7658 7A8C 827C 6C78 8872 6A76 8290 A296" /* vXzŒ‚|lxˆrjv‚�¢– */ $"5A4A 8096 9480 6C80 8878 727C 807A 8680" /* ZJ€–”€l€ˆxr|€z†€ */ $"586E A0A6 8E62 5274 8A82 7886 8678 887E" /* Xn ¦ŽbRtŠ‚x††xˆ~ */ $"607A 9694 7658 6A98 AC8A 666E 6A6A 8A82" /* `z–”vXj˜¬ŠfnjjŠ‚ */ $"7486 928A 6C5C 749A 9C6C 587A 828E 9C7E" /* t†’Šl\tšœlXz‚Žœ~ */ $"666C 7C80 7678 8EA8 985C 5A82 888C 846C" /* fl|€vxލ˜\Z‚ˆŒ„l */ $"6478 9492 8070 708A 7854 749E 9C8A 7260" /* dx”’€ppŠxTtžœŠr` */ $"627E 9484 7468 76A0 906A 7C90 826C 6670" /* b~”„thv �j|�‚lfp */ $"80A0 9A7C 6656 729E 8466 7690 8C76 7A7E" /* € š|fVrž„fv�Œvz~ */ $"828A 7264 6870 9CB4 865C 6688 8478 7E7E" /* ‚Šrdhpœ´†\fˆ„x~~ */ $"8A8C 7676 7A78 8E8A 624A 74A6 9E88 786C" /* ŠŒvvzxŽŠbJt¦žˆxl */ $"7C78 6A7C 8280 8E8C 6C5C 8AA2 8266 5C72" /* |xj|‚€ŽŒl\Š¢‚f\r */ $"9A98 8888 7C70 7276 6268 9CA4 7E68 6082" /* š˜ˆˆ|prvbhœ¤~h`‚ */ $"9C84 6A68 727A 8E9A 7C74 8E7E 6258 6AA0" /* œ„jhrzŽš|tŽ~bXj  */ $"AC88 6872 827E 8886 6066 8488 8076 8094" /* ¬ˆhr‚~ˆ†`f„ˆ€v€” */ $"885C 4A74 9490 9886 6270 868A 7666 7286" /* ˆ\Jt”�˜†bp†Švfr† */ $"8870 709E A07E 705C 5E80 9E9E 826C 7082" /* ˆppž ~p\^€žž‚lp‚ */ $"8666 648C 8874 767A 8898 987A 5654 709A" /* †fdŒˆtvzˆ˜˜zVTpš */ $"A076 7690 806C 6C78 868C 8A76 6E7E 90A6" /*  vv�€llx†ŒŠvn~�¦ */ $"884A 5278 8482 828C 8A82 7662 6E7C 8A9A" /* ˆJRx„‚‚ŒŠ‚vbn|Šš */ $"7856 76A0 A07C 686A 6A7C 8084 9890 8A88" /* xVv  |hjj|€„˜�Šˆ */ $"6250 769E 946A 6876 8A96 8074 7466 7084" /* bPvž”jhvŠ–€ttfp„ */ $"7C7E 9AAE 8252 5670 9294 7876 7E7E 8C92" /* |~š®‚RVp’”xv~~Œ’ */ $"806A 7684 6A62 7E9E AC88 5858 6A7A 8A92" /* €jv„jb~ž¬ˆXXjzŠ’ */ $"806E 8898 7C70 7886 8864 567A 9EA4 9280" /* €nˆ˜|px†ˆdVzž¤’€ */ $"5E54 7E92 847E 8092 906E 647C 947C 646A" /* ^T~’„~€’�nd|”|dj */ $"6A82 AEA8 8462 5C7A 8276 7492 A27E 6A76" /* j‚®¨„b\z‚vt’¢~jv */ $"7684 907C 645C 80A8 AC88 6874 785E 6682" /* v„�|d\€¨¬ˆhtx^f‚ */ $"8C9A 927C 6468 8498 8C64 5688 A28E 8A86" /* Œš’|dh„˜ŒdVˆ¢ŽŠ† */ $"7C70 6866 6E88 A0A2 8C5E 5A8E 9478 6A6E" /* |phfnˆ ¢Œ^ZŽ”xjn */ $"7A84 8A88 8482 7A70 6854 78B0 AC84 6A70" /* z„Šˆ„‚zphTx°¬„jp */ $"7C80 7E74 747E 7C8C 8A76 8A9C 8052 507E" /* |€~tt~|ŒŠvŠœ€RP~ */ $"9EA2 9472 7272 7082 7A6A 8098 8C6E 789C" /* ž¢”rrrp‚zj€˜Œnxœ */ $"9882 5C52 768A 98A0 886A 7082 7860 7694" /* ˜‚\RvŠ˜ ˆjp‚x`v” */ $"9686 6872 9494 8270 5A58 78A4 9A7C 8284" /* –†hr””‚pZXx¤š|‚„ */ $"806C 5A78 9E96 8276 7476 8EA2 7654 627C" /* €lZxž–‚vtvŽ¢vTb| */ $"9690 8092 987E 6060 727A 9A9C 7262 7892" /* –�€’˜~``rzšœrbx’ */ $"9C78 5E6C 8482 7892 9A8C 8A76 525A 7CA0" /* œx^l„‚x’šŒŠvRZ|  */ $"A076 647A 9A88 6E7A 7870 7E7E 7C8A 9698" /*  vdzšˆnzxp~~|Š–˜ */ $"7852 4A78 A690 7A86 8080 867C 7674 7E82" /* xRJx¦�z†€€†|vt~‚ */ $"786C 74A4 B074 5060 7288 8E8C 8480 847E" /* xlt¤°tP`rˆŽŒ„€„~ */ $"7668 6890 9260 6082 A0A0 886E 5E6A 7E8A" /* vhh�’``‚  ˆn^j~Š */ $"9282 7A9A 865C 5C7E 9486 706A 7494 9C90" /* ’‚zš†\\~”†pjt”œ� */ $"8258 5A80 8472 7A9C 9C7C 6460 7694 8882" /* ‚XZ€„rzœœ|d`v”ˆ‚ */ $"7A68 80A2 9A70 6278 786A 707A 9CA4 8070" /* zh€¢špbxxjpzœ¤€p */ $"6664 7E9A 8C64 668C 9086 766E 8278 666C" /* fd~šŒdfŒ�†vn‚xfl */ $"808E 9EA2 7E50 6288 8C84 6C72 8C88 787E" /* €Žž¢~PbˆŒ„lrŒˆx~ */ $"847C 747C 6A5E 8CAA A27C 5660 807E 747A" /* „|t|j^Œª¢|V`€~tz */ $"8A82 8090 7A74 888E 7E60 5A84 AAA0 7A6C" /* Š‚€�ztˆŽ~`Z„ª zl */ $"7464 7282 7A7E 8E90 846A 6A86 9A7E 5062" /* tdr‚z~Ž�„jj†š~Pb */ $"8088 9A96 786E 7078 7872 8298 A67C 5874" /* €ˆš–xnpxxr‚˜¦|Xt */ $"8C86 7E6E 606C 849C 9484 727A 8060 5888" /* Œ†~n`l„œ”„rz€`Xˆ */ $"A094 7E6C 6C76 8A8A 7A6A 6688 A286 7C90" /*  ”~llvŠŠzjfˆ¢†|� */ $"8A70 5662 7692 A08C 7666 668C 946E 687C" /* ŠpVbv’ ŒvffŒ”nh| */ $"8A7C 7886 8C8E 785C 5C68 80AC A476 647C" /* Š|x†ŒŽx\\h€¬¤vd| */ $"8C7A 7478 8088 7A72 8484 8C90 724A 548E" /* Œztx€ˆzr„„Œ�rJTŽ */ $"A694 8276 7A80 6A6E 7E7C 8286 7E68 7EA4" /* ¦”‚vz€jn~|‚†~h~¤ */ $"9A70 585C 8298 8C8C 887C 6E74 7064 7C9C" /* špX\‚˜ŒŒˆ|ntpd|œ */ $"886E 667C A298 7260 6870 7890 927C 8488" /* ˆnf|¢˜r`hpx�’|„ˆ */ $"7060 6084 A092 6E6C 848E 888A 725A 6A7A" /* p``„ ’nl„ŽˆŠrZjz */ $"827E 8494 9474 525E 8890 8888 726E 8290" /* ‚~„””tR^ˆ�ˆˆrn‚� */ $"8870 6672 807A 6C8A AC94 7866 5C6C 8896" /* ˆpfr€zlЬ”xf\lˆ– */ $"8870 6E80 9080 627A 8874 6A72 849A 9E8A" /* ˆpn€�€bzˆtjr„šžŠ */ $"6856 627E 9C86 6E82 9080 7478 8286 8074" /* hVb~œ†n‚�€tx‚†€t */ $"6676 8AA2 A06A 4A64 8080 7C82 8C88 8270" /* fvŠ¢ jJd€€|‚Œˆ‚p */ $"6E7E 808A 7E5C 6090 AA96 726A 6A74 7E7A" /* n~€Š~\`�ª–rjjt~z */ $"8A92 8A88 7A5E 6A8E 9872 5A6A 849C 947E" /* Š’Šˆz^jŽ˜rZj„œ”~ */ $"7A70 6876 7A78 86A2 9A6A 5C6C 8894 7C68" /* zphvzx†¢šj\lˆ”|h */ $"7680 8A96 927A 6C7C 7462 6C8A A49C 6E5C" /* v€Š–’zl|tblФœn\ */ $"6E7C 8486 806C 7490 927E 7C80 8674 5464" /* n|„†€lt�’~|€†tTd */ $"8CA6 988A 7660 6E8C 8678 727C 9084 7276" /* Œ¦˜Šv`nŒ†xr|�„rv */ $"908C 6A5E 6672 96AA 9476 6270 827E 6E76" /* �Œj^fr–ª”vbp‚~nv */ $"908E 7476 7E84 9284 6C5A 6890 A898 726E" /* �Žtv~„’„lZh�¨˜rn */ $"8076 6272 7C8A 8C82 726E 8296 9270 5064" /* €vbr|ŠŒ‚rn‚–’pPd */ $"9294 8A86 827C 726A 6A78 8C98 8E76 5E80" /* ’”І‚|rjjxŒ˜Žv^€ */ $"A08A 6A62 6C7C 868A 8686 8678 7460 6492" /*  Šjbl|†Š†††xt`d’ */ $"AA8E 6A6A 808C 867A 6C72 7680 8E82 8096" /* ªŽjj€Œ†zlrv€Ž‚€– */ $"946A 5066 8E98 9074 6E7C 7C82 846E 6A82" /* ”jPfŽ˜�tn||‚„nj‚ */ $"8C7C 708C 9E92 7254 6482 8E92 8C74 7084" /* Œ|pŒž’rTd‚Ž’Œtp„ */ $"8E74 6A82 8A86 706C 889C 8C78 665E 6A8E" /* Žtj‚ІplˆœŒxf^jŽ */ $"9C80 7682 8A84 6C6A 8890 8070 727C 88A0" /* œ€v‚Š„ljˆ�€pr|ˆ  */ $"8E62 5A70 8A90 7C7C 908E 7464 747C 8490" /* ŽbZpŠ�||�Žtdt|„� */ $"7A62 708C 9E8E 6664 7A88 7A7C 9090 8886" /* zbpŒžŽfdzˆz|��ˆ† */ $"6A60 748E 9A80 646C 929E 8074 7A72 767C" /* j`tŽš€dl’ž€tzrv| */ $"767E 8A96 8A6A 5668 969A 7672 7E82 8C86" /* v~Š–ŠjVh–švr~‚Œ† */ $"7C74 7880 7C70 6E88 AC92 6060 7284 8A86" /* |tx€|pnˆ¬’``r„І */ $"7C76 8086 8278 6C7C 9476 5C6E 92A2 927A" /* |v€†‚xl|”v\n’¢’z */ $"6668 7C86 8882 7286 9678 6474 908C 7668" /* fh|†ˆ‚r†–xdt�Œvh */ $"6A84 9A92 866E 5C76 887A 6C7E 9488 746C" /* j„š’†n\vˆzl~”ˆtl */ $"728C 8E7C 7468 7294 A282 646E 827A 7270" /* rŒŽ|thr”¢‚dn‚zrp */ $"829C 8C74 706E 7A90 906E 587A 948E 7E6C" /* ‚œŒtpnz��nXz”Ž~l */ $"7A86 746A 7686 9098 8C66 5E84 948A 7064" /* z†tjv†�˜Œf^„”Špd */ $"7E8E 8278 8082 7A7C 7862 7498 9E88 645E" /* ~Ž‚x€‚z|xbt˜žˆd^ */ $"7E90 8070 7A82 7E88 8272 7E8E 8872 5C6E" /* ~�€pz‚~ˆ‚r~Žˆr\n */ $"96A2 8268 7678 7884 7C72 7E8A 8A78 6A7C" /* –¢‚hvxx„|r~ŠŠxj| */ $"9490 645A 7A88 8E90 7C70 7680 8474 7080" /* ”�dZzˆŽ�|pv€„tp€ */ $"9A90 6666 888E 8474 666C 7E92 9080 7074" /* š�ffˆŽ„tfl~’�€pt */ $"8A7E 5E6E 9092 8270 6E7A 888C 7C6E 667A" /* Š~^n�’‚pnzˆŒ|nfz */ $"9E92 707A 8C88 7066 7082 948C 7870 6C82" /* ž’pzŒˆpfp‚”Œxpl‚ */ $"9A7E 5E6C 8A8E 7A78 8088 8872 686E 7490" /* š~^lŠŽzx€ˆˆrhnt� */ $"9E7E 6474 928A 726C 7686 8874 7880 808C" /* ž~dt’Šrlv†ˆtx€€Œ */ $"8668 5878 9C92 7A70 788C 826A 747C 7E86" /* †hXxœ’zpxŒ‚jt|~† */ $"8674 6E8C 9C80 6664 7A96 8A78 7C80 7C7E" /* †tnŒœ€fdz–Šx|€|~ */ $"7C6C 6A88 907A 6C70 8E9C 7C66 6C7A 7E84" /* |ljˆ�zlpŽœ|flz~„ */ $"8A76 748A 8674 666E 9096 7868 7C8E 8880" /* ŠvtІtfn�–xh|Žˆ€ */ $"7C66 6C84 867E 747C 928C 6A5C 7A90 8480" /* |fl„†~t|’Œj\z�„€ */ $"7A72 808E 8676 6870 8A8C 746E 9098 8076" /* zr€Ž†vhpŠŒtn�˜€v */ $"6C6E 828C 8678 6E7C 908C 6862 8688 7874" /* ln‚Œ†xn|�Œhb†ˆxt */ $"7884 908A 7A68 6878 908E 6A70 9090 7A70" /* x„�Šzhhx�Žjp��zp */ $"7480 8682 7472 7C88 9A82 5A64 8686 7874" /* t€†‚tr|ˆš‚Zd††xt */ $"7E8A 8C7E 6E76 7880 8C7A 6278 9894 786A" /* ~ŠŒ~nvx€Œzbx˜”xj */ $"727E 8476 7486 8888 8A72 5E76 9086 6A6A" /* r~„vt†ˆˆŠr^v�†jj */ $"7E90 9076 707C 787A 8074 748A 9C84 6868" /* ~��vp|xz€ttŠœ„hh */ $"7A8C 846C 7486 868A 867A 6E7E 8A74 6874" /* zŒ„lt††Š†zn~Štht */ $"8C9A 8666 6E7E 807C 7C76 748C 947E 7076" /* Œš†fn~€||vtŒ”~pv */ $"828A 7062 7892 9284 7E70 7084 8674 7278" /* ‚Špbx’’„~pp„†trx */ $"8E90 766A 7C8C 7C6C 7074 8098 907C 6E70" /* Ž�vj|Œ|lpt€˜�|np */ $"8686 706A 8496 8474 7A7A 8488 786E 6C80" /* ††pj„–„tzz„ˆxnl€ */ $"9696 7A6C 7C88 726A 5A08 68CE F4B0 605C" /* ––zl|ˆrjZ.hÎ.°`\ */ $"44A0 C294 8A58 76B2 4EAA FF84 3042 7078" /* D Â”ŠXv²Nª.„0Bpx */ $"8AA8 CEDE DC80 2818 7E66 72BE 8252 B4F8" /* ЍÎ..€(.~fr¾‚R´. */ $"A440 2674 B4C4 A8AA 8C8C 5204 74AE A0D6" /* ¤@&t´Ä¨ªŒŒR.t® Ö */ $"F886 1E4C 9E90 4C24 6096 D4FE AC8C 6C06" /* .†.Lž�L$`–Ô.¬Œl. */ $"36AC B294 98A0 5014 26A8 D890 8A76 84B2" /* 6¬²”˜ P.&¨Ø�Šv„² */ $"985A 6444 3C6A CCE6 B892 725E 1A72 CEBE" /* ˜ZdDŽrj¨®‚ˆªÄt.N */ $"3646 9AC2 E8B4 4A10 569A 7482 A6AC 5228" /* 6FšÂ.´J.Všt‚¦¬R( */ $"869E 5274 8884 C0C0 AE9C 7E01 0158 909C" /* †žRtˆ„ÀÀ®œ~..X�œ */ $"A0DA B23E 3870 7682 806C 72A2 8460 7A68" /*  .²>8pv‚€lr¢„`zh */ $"5658 8EE4 A276 9856 1A10 487A D2C0 6E92" /* VXŽ.¢v˜V..HzÒÀn’ */ $"AE7C 6274 8C70 42B0 BC76 5064 726A 6C6C" /* ®|btŒpB°¼vPdrjll */ $"C8DE 7E34 3854 6040 80C4 9484 BEA8 4848" /* È.~48T`@€Ä”„¾¨HH */ $"5A72 9060 609E 9E76 1838 929C 9AC4 C262" /* Zr�``žžv.8’œšÄÂb */ $"5666 4C46 5C76 D4C4 9A7A 66A4 720C 148E" /* VfLF\vÔÄšzf¤r..Ž */ $"928E B482 464A 5480 ACA6 ACA6 AA64 0128" /* ’Ž´‚FJT€¬¦¬¦ªd.( */ $"A28E 3270 B4B0 C692 6644 1A46 86B8 AC88" /* ¢Ž2p´°Æ’fD.F†¸¬ˆ */ $"7A98 6212 74FF C468 6654 7A6A 6650 3C5A" /* z˜b.t.ÄhfTzjfPP */ $"76B2 FCBE 4A5A 7A54 4E52 66AE B2A6 8682" /* v².¾JZzTNRf®²¦†‚ */ $"9A74 4252 7264 A2E4 8C4A 5668 AAAA 8294" /* štBRrd¢.ŒJVhªª‚” */ $"A6A0 6A26 3266 5E58 ACB0 7CB0 B47E 3628" /* ¦ j&2f^X¬°|°´~6( */ $"6CA2 A290 7876 986C 3E84 B478 A0BA 7250" /* l¢¢�xv˜l>„´x ºrP */ $"5266 5848 62A4 D6DE BE64 4E74 424A 9E9A" /* RfXHb¤Ö.¾dNtBJžš */ $"8C8A 826E 526A 8A7C 7C8E 8C86 B874 0E4E" /* ŒŠ‚nRjŠ||ŽŒ†¸t.N */ $"726C AAE4 DAAE 624E 5252 6280 8690 844C" /* rlª..®bNRRb€†�„L */ $"9AC4 8664 7682 7C90 B4BA 5C12 3E6C 8ED2" /* šÄ†dv‚|�´º\.>lŽÒ */ $"BAAA B04C 205E 8270 6A7A 786E 7EBC CA6A" /* ºª°L ^‚pjzxn~¼Êj */ $"525A 76C2 C682 7254 2C38 6AB8 D0B8 9E98" /* RZvÂÆ‚rT,8j¸Ð¸ž˜ */ $"403C 8A80 726A 4C7A E0C8 806A 6E60 5872" /* @<Š€rjLz.È€jn`Xr */ $"B8A4 6A7A 4616 4478 BAE8 AA66 80AE 844C" /* ¸¤jzF.Dxº.ªf€®„L */ $"3260 8066 A2D4 8E86 965E 5054 72B0 D07C" /* 2`€f¢Ôކ–^PTr°Ð| */ $"2E3C 7294 6E82 C0B0 9CB2 7446 5652 5A72" /* .š ~¢Ž,D”°ÄÀ¨�>. */ $"468C A896 6C82 B696 86A0 7232 3E64 AAA2" /* FŒ¨–l‚¶–† r2>dª¢ */ $"8C98 6840 5884 BAF6 B44E 5058 365C 7C7A" /* Œ˜h@X„º.´NPX6\|z */ $"826E 92BA AA94 7648 4C5E 62AA DC98 504C" /* ‚n’ºª”vHL^bª.˜PL */ $"6480 88AA D298 5258 5656 725E 5CB0 A288" /* d€ˆªÒ˜RXVVr^\°¢ˆ */ $"CACC 863E 4064 6662 9EBA 865A 4E50 8CA8" /* Ê̆>@dfbžº†ZNPŒ¨ */ $"7EA0 AA70 545C 6E66 4C7C B49A 9CC8 AA7C" /* ~ ªpT\nfL|´šœÈª| */ $"6624 328C 967A 8A8C 7460 6C9A 9C90 AA98" /* f$2Œ–zŠŒt`lšœ�ª˜ */ $"606A 5658 866E 4A7C CAD6 9E62 605C 3C56" /* `jVX†nJ|ÊÖžb`\t°ˆ``bhvŒš */ $"7A7E AEA8 A49C 5434 6E5C 4698 C6AA 8A6E" /* z~®¨¤œT4n\F˜ÆªŠn */ $"7276 6A8A 8676 7466 6E9C 8840 6AAE A29C" /* rvjІvtfnœˆ@j®¢œ */ $"A6A2 782C 305C 5A78 A6A0 A89E 6878 AA76" /* ¦¢x,0\Zx¦ ¨žhxªv */ $"4066 8898 9090 8858 447A A2A8 BC96 7078" /* @fˆ˜��ˆXDz¢¨¼–px */ $"4824 5888 8E7C 72A4 BCA6 9A76 363A 7082" /* H$XˆŽ|r¤¼¦šv6:p‚ */ $"A8AA 5852 7474 6E8A C2CA 744C 626A 7A8A" /* ¨ªXRttnŠÂÊtLbjzŠ */ $"705E 808C B8E0 A450 4060 7866 66B0 AC56" /* p^€Œ¸.¤P@`xff°¬V */ $"4C64 6CAE CAA4 8862 5070 9076 3C44 92B6" /* Ldl®Ê¤ˆbPp�vX */ $"5C94 AC82 86A4 947C 6866 786C 5E64 80A6" /* \”¬‚†¤”|hfxl^d€¦ */ $"A45E 3E68 7C9C D6B6 746A 5C54 5E62 7C90" /* ¤^>h|œÖ¶tj\T^b|� */ $"9C9E 8482 AAA0 5A3E 5068 94A8 9076 5E60" /* œž„‚ª Z>Ph”¨�v^` */ $"8692 A4A6 8688 7432 4088 8A70 707E 92A4" /* †’¤¦†ˆt2@ˆŠpp~’¤ */ $"A290 6E4A 5470 8A9C 8070 8A6E 487E AEB6" /* ¢�nJTpŠœ€pŠnH~®¶ */ $"9A76 6C5E 5470 7460 728E 9CBA BA7A 6270" /* švl^Tpt`rŽœººzbp */ $"5252 7696 A48C 7266 5A78 9888 8C98 7A6C" /* RRv–¤ŒrfZx˜ˆŒ˜zl */ $"8274 4E4E 6682 989E BEB8 8868 4E48 747E" /* ‚tNNf‚˜ž¾¸ˆhNHt~ */ $"6E94 926C 6E94 9678 6C84 9480 8082 6A56" /* n”’ln”–xl„”€€‚jV */ $"5656 86B0 9898 A07C 5650 6A82 7068 7E7E" /* VV†°˜˜ |VPj‚ph~~ */ $"7A96 947E 847E 7694 9A76 6660 625C 649C" /* z–”~„~v”švf`b\dœ */ $"BEAC 9E78 4E66 7468 707E 7276 92A0 8A6E" /* ¾¬žxNfthp~rv’ Šn */ $"7288 746A 989C 886A 3434 6A8E A4B8 B08A" /* rˆtj˜œˆj44jޤ¸°Š */ $"6A7C 8C62 446C 8472 849A A0AA 864E 567A" /* j|ŒbDl„r„š ª†NVz */ $"92AA 9E7E 4C36 6C94 868E ACA2 8C80 6C6E" /* ’ªž~L6l”†Ž¬¢Œ€ln */ $"8070 4A48 70A8 B0A2 9252 4A8A 9E94 8E72" /* €pJHp¨°¢’RJŠž”Žr */ $"626A 6056 7CB6 BC92 7284 967E 7E6A 3842" /* bj`V|¶¼’r„–~~j8B */ $"82AE B892 6E7A 7E78 6E84 B4AC 6244 5A5A" /* ‚®¸’nz~xn„´¬bDZZ */ $"72A0 9C76 829C B0A0 6440 485E 787A 92C2" /* r œv‚œ° d@H^xz’ */ $"AE7E 6C66 6A8E A892 6C60 6E82 7E72 6666" /* ®~lfjލ’l`n‚~rff */ $"A2C2 968A 9674 5044 4A72 9EB2 A086 7472" /* ¢Â–Š–tPDJrž² †tr */ $"7E98 9058 528A 946C 6C76 7C7C 7C98 B0A8" /* ~˜�XRŠ”llv|||˜°¨ */ $"A07C 524A 486C B0AA 7270 9A94 7C80 8078" /*  |RJHl°ªrpš”|€€x */ $"7072 807A 807E 6066 747A B0D6 AC66 4648" /* pr€z€~`ftz°Ö¬fFH */ $"5A68 748A 908C 9088 8294 805C 707A 748E" /* ZhtŠ�Œ�ˆ‚”€\pztŽ */ $"A694 6040 608C A6BA AC92 7C54 3E5E 8066" /* ¦”`@`Œ¦º¬’|T>^€f */ $"6E92 9A90 92A0 9E62 3C5E 748E 9A88 725E" /* n’š�’ žb<^tŽšˆr^ */ $"4C5A 9EBC A08A 8E7C 5852 767E 6676 808A" /* LZž¼ ŠŽ|XRv~fv€Š */ $"B2B2 907E 6046 5E90 A88A 6460 686A 7CA0" /* ²²�~`F^�¨Šd`hj|  */ $"A6A0 9468 5C72 7264 686C 6E7A B0D4 9A5E" /* ¦ ”h\rrdhlnz°Ôš^ */ $"545C 6A80 828A 9A78 4A5C 848E 9EA8 A27E" /* T\j€‚ŠšxJ\„Žž¨¢~ */ $"6286 9862 3846 6A98 AAAC A898 724C 4E6A" /* b†˜b8Fj˜ª¬¨˜rLNj */ $"828A 9A92 584C 8498 867E 7084 A69A 7A60" /* ‚Šš’XL„˜†~p„¦šz` */ $"5852 4E66 92B0 B6B4 9258 4C6E 8A94 7C5E" /* XRNf’°¶´’XLnŠ”|^ */ $"6E90 9E82 647E 8E76 84A2 8A76 6C54 3C4E" /* n�ž‚d~Žv„¢ŠvlTH */ $"8EBC B298 7458 504C 607E 92A0 9E90 947C" /* ޼²˜tXPL`~’ ž�”| */ $"708C 6E30 3A88 B8B2 9476 666A 768E A4A2" /* pŒn0:ˆ¸²”vfjvޤ¢ */ $"8864 645C 4268 A49A 7676 9CB6 9A72 5844" /* ˆdd\Bh¤švvœ¶šrXD */ $"4A6E 8E9E A282 6272 7670 94B2 9A6A 4E5A" /* JnŽž¢‚brvp”²šjNZ */ $"6C74 8274 769A A6A2 AA98 5E40 5266 7A94" /* lt‚tvš¦¢ª˜^@Rfz” */ $"A4A2 7854 647A 989E 7C76 826A 5C74 7A5E" /* ¤¢xTdz˜ž|v‚j\tz^ */ $"5888 B0AE A8A0 804A 3840 669C 9E88 968A" /* Xˆ°®¨ €J8@fœžˆ–Š */ $"6A72 909A 7C6C 8490 8076 7260 5A6C 84A6" /* jr�š|l„�€vr`Zl„¦ */ $"C4AE 826A 5240 4C7A 9A82 7688 8C94 9678" /* Ä®‚jR@Lzš‚vˆŒ”–x */ $"6474 7A7A 8A92 7458 5668 788A B8C8 9A68" /* dtzzŠ’tXVhxŠ¸Èšh */ $"4E50 7680 6E76 8890 8894 A486 606C 8274" /* NPv€nvˆ�ˆ”¤†`l‚t */ $"789C 946A 4630 60AE BEAC 9A86 6C56 6270" /* xœ”jF0`®¾¬š†lVbp */ $"5C5A 8294 8E94 A29A 7852 4068 A4BA 9864" /* \Z‚”Ž”¢šxR@h¤º˜d */ $"5452 5A88 AA98 9EA2 8876 6C64 626C 5E4E" /* TRZˆª˜ž¢ˆvldbl^N */ $"74BE D49E 6254 5262 9098 8A78 686A 706C" /* t¾ÔžbTRb�˜Šxhjpl */ $"7A9A AE9E 6664 9A9E 6648 4E50 7CB6 BEA8" /* zš®žfdšžfHNP|¶¾¨ */ $"8064 6A74 7478 8CA2 7E44 4E7E 908E 8A80" /* €djttxŒ¢~DN~�ŽŠ€ */ $"7C90 9E90 6842 3E54 78A0 A4A4 B288 4A4E" /* |�ž�hB>Tx ¤¤²ˆJN */ $"748E 9688 6E68 7A84 7874 7270 84B2 BA8C" /* tŽ–ˆnhz„xtrp„²ºŒ */ $"7470 5238 467A BAC2 A488 7270 726E 7270" /* tpR8FzºÂ¤ˆrprnrp */ $"5E6E A09E 7068 7A74 6E80 A6B8 9E76 463A" /* ^n žphztn€¦¸žvF: */ $"586E 8CAE 9E7C 8CA0 8E6C 6066 7076 8094" /* XnŒ®ž|Œ Žl`fpv€” */ $"928A 7854 6290 A2AC AE80 4A3A 5674 7882" /* ’ŠxTb�¢¬®€J:Vtx‚ */ $"8C94 9A98 7E78 805E 466E 9696 9C96 7850" /* Œ”š˜~x€^Fn––œ–xP */ $"4676 AEB6 A88C 6E60 4E4C 708C 8080 A6B8" /* Fv®¶¨Œn`NLpŒ€€¦¸ */ $"9E88 8064 3638 76A0 B2AA 7256 5E5E 7CA4" /* žˆ€d68v ²ªrV^^|¤ */ $"A88C 7676 7060 5E6C 7070 84A0 B0C2 A25A" /* ¨Œvvp`^lpp„ °Â¢Z */ $"3A3E 5C82 A2AE 8C66 6A7A 7888 9694 8E7E" /* :>\‚¢®Œfjzxˆ–”Ž~ */ $"5E6A 8C7C 5658 7492 ACBE B470 3A46 5E76" /* ^jŒ|VXt’¬¾´p:F^v */ $"8892 9A90 6C54 6E98 9E86 7C80 7C7A 8C7E" /* ˆ’š�lTn˜ž†|€|zŒ~ */ $"4442 6C90 BAC4 AC92 764E 364E 88A4 9A8E" /* DBl�ºÄ¬’vN6Nˆ¤šŽ */ $"7E6E 7A94 8268 6A7A 98AA 8E60 4850 6460" /* ~nz”‚hjz˜ªŽ`HPd` */ $"7CC2 D2AC 845E 445A 787C 7C7C 7C9A B494" /* |ÂÒ¬„^DZx||||š´” */ $"5E50 7A8C 788C A692 7054 4458 82AA BCA8" /* ^PzŒxŒ¦’pTDX‚ª¼¨ */ $"806A 7482 6E44 4A84 968C 9C9A 8274 6864" /* €jt‚nDJ„–Œœš‚thd */ $"7294 AE9C 7650 3C5C 9AA6 8E8E 9E98 866E" /* r”®œvP<\š¦ŽŽž˜†n */ $"585C 6666 7288 ACBA 987A 5C40 62AA BC90" /* X\ffrˆ¬º˜z\@bª¼� */ $"6A66 6666 6872 8C9C 9888 8C96 785E 644C" /* jfffhrŒœ˜ˆŒ–x^dL */ $"3C78 C4D8 AC76 605E 6678 8A96 9680 6668" /* lš¤ */ $"ACAC 8258 5C6E 768A 8E78 6664 7C90 8E7C" /* ¬¬‚X\nvŠŽxfd|�Ž| */ $"6A70 9CA8 948E 7E52 3654 869E AAB0 986A" /* jpœ¨”Ž~R6T†žª°˜j */ $"5666 8292 8662 6A8A 807A 8E86 6660 84A4" /* Vf‚’†bjŠ€zކf`„¤ */ $"A294 8260 3E3C 5E8C B6B4 8E80 7E70 6C76" /* ¢”‚`><^Œ¶´Ž€~plv */ $"7A68 6286 9A90 8E7E 6266 7A82 9ABA A066" /* zhb†š�Ž~bfz‚šº f */ $"4A4C 5C74 8EA0 968A 9290 8878 5652 6E7E" /* JL\tŽ –Š’�ˆxVRn~ */ $"7A8C A696 6256 6E82 8CA2 A274 5C62 6A82" /* zŒ¦–bVn‚Œ¢¢t\bj‚ */ $"8068 7EA8 A892 8688 7250 546A 7A96 AE9C" /* €h~¨¨’†ˆrPTjz–®œ */ $"705A 6286 A69C 786A 7680 6E5E 7072 728E" /* pZb†¦œxjv€n^prrŽ */ $"9698 A49C 6E48 4050 7AB0 B484 6674 8A7C" /* –˜¤œnH@Pz°´„ftŠ| */ $"7A86 8A8A 8274 7880 7468 6068 78A2 D0C2" /* z†ŠŠ‚tx€th`hx¢Ð */ $"7036 4862 6880 9694 9286 7476 8082 7C76" /* p6Hbh€–”’†tv€‚|v */ $"6C60 7EB0 9C5A 3E56 7EA2 B8AA 907A 604E" /* l`~°œZ>V~¢¸ª�z`N */ $"5270 9496 9084 6A7A A8A2 7456 5670 98A4" /* Rp”–�„jz¨¢tVVp˜¤ */ $"8268 6866 5E7C AEB8 9E8C 683A 4A7A 948E" /* ‚hhf^|®¸žŒh:Jz”Ž */ $"7068 86A0 9C80 6A70 6C66 7C9E 947C 7C60" /* ph† œ€jplf|ž”||` */ $"4462 A2C6 B688 665A 6A74 6068 8282 869A" /* Db¢Æ¶ˆfZjt`h‚‚†š */ $"9E88 7C76 5C4E 6490 ACA0 7A54 4A70 948E" /* žˆ|v\Nd�¬ zTJp”Ž */ $"909A 8E76 726E 6264 7274 7A94 A4A8 A482" /* �šŽvrnbdrtz”¤¨¤‚ */ $"4A42 788E 888A 8674 6870 8284 8086 8888" /* JBxŽˆŠ†thp‚„€†ˆˆ */ $"8074 7076 6A4E 649C AC9E 9484 604E 6A82" /* €tpvjNdœ¬ž”„`Nj‚ */ $"8084 8274 7E82 747C 9088 7882 948E 806C" /* €„‚t~‚t|�ˆx‚”Ž€l */ $"5650 6290 ACAE A480 6266 6E68 6C82 8C7C" /* VPb�¬®¤€bfnhl‚Œ| */ $"7888 8882 7A6C 627A 969C 9E86 4630 5E82" /* xˆˆ‚zlbz–œž†F0^‚ */ $"909A AAA2 806E 6E6C 7076 7476 7E8E 9EAC" /* �šª¢€nnlpvtv~Žž¬ */ $"9256 466E 989E 9490 704E 5868 7498 AA96" /* ’VFn˜ž”�pNXht˜ª– */ $"8278 7276 887A 504A 709A A8A2 8A68 606E" /* ‚xrvˆzPJpš¨¢Šh`n */ $"7084 A29E 7E5E 5458 72A2 B890 6E7E 928C" /* p„¢ž~^TXr¢¸�n~’Œ */ $"7C62 4E62 7A7E 94AC 9E7A 685E 546E B0BC" /* |bNbz~”¬žzh^Tn°¼ */ $"8456 526A 8088 7E7E 9298 8E86 7E70 5C5A" /* „VRj€ˆ~~’˜Ž†~p\Z */ $"645E 7CC0 C892 6452 5C7C 968A 7A84 8472" /* d^|ÀÈ’dR\|–Šz„„r */ $"7076 747A 8C8A 7A88 9E94 764C 3656 92B4" /* pvtzŒŠzˆž”vL6V’´ */ $"A284 8882 6A68 787A 768C 8A6E 687A 8A8C" /* ¢„ˆ‚jhxzvŒŠnhzŠŒ */ $"7866 7CAE BA84 6062 5A5E 7E96 9296 9E8E" /* xf|®º„`bZ^~–’–žŽ */ $"7062 6C82 887A 6870 929C 745E 6870 88A8" /* pbl‚ˆzhp’œt^hpˆ¨ */ $"A686 726C 5C4E 687E 8EA6 A27E 708E 906C" /* ¦†rl\Nh~ަ¢~pŽ�l */ $"5A5C 6C92 A49A 826C 6668 8098 9690 9684" /* Z\l’¤š‚lfh€˜–�–„ */ $"5246 6E86 7A7A 828C 98A0 9672 584E 5482" /* RFn†zz‚Œ˜ –rXNT‚ */ $"A290 8892 7452 628E A098 8A76 6464 7680" /* ¢�ˆ’tRbŽ ˜Švddv€ */ $"7872 7078 A2B4 9A80 6C58 4A60 8EA2 9E90" /* xrpx¢´š€lXJ`Ž¢ž� */ $"7056 6A86 9098 966E 5A78 8678 6A68 707A" /* pVj†�˜–nZx†xjhpz */ $"8EA4 A89C 7E50 465A 728E ACA8 7252 6E90" /* ޤ¨œ~PFZrެ¨rRn� */ $"8E80 8482 7680 867A 7C6E 5A6C 8690 A0BA" /* Ž€„‚v€†z|nZl†� º */ $"A25C 384C 6E84 9092 8078 8282 8084 7A70" /* ¢\8Ln„�’€x‚‚€„zp */ $"787E 7E80 8E8C 6048 6892 B2BC 986A 6268" /* x~~€ŽŒ`Hh’²¼˜jbh */ $"5C68 8484 828C 8E80 768A 9072 6062 7CA0" /* \h„„‚ŒŽ€vŠ�r`b|  */ $"986C 5460 707C 96A6 987E 7A7A 5A4E 7890" /* ˜lT`p|–¦˜~zzZNx� */ $"847A 7888 A49C 725E 6876 8496 9872 6072" /* „zxˆ¤œr^hv„–˜r`r */ $"7A6E 7C9C A69E 8462 627A 7C6A 5A72 949E" /* zn|œ¦ž„bbz|jZr”ž */ $"A89A 705A 6A76 7480 8886 8878 5660 92A8" /* ¨špZjvt€ˆ†ˆxV`’¨ */ $"8C76 8686 8286 7254 5266 88A6 A494 8A8A" /* Œv††‚†rTRfˆ¦¤”ŠŠ */ $"6E50 5A90 A484 6C70 7078 948E 766C 7A92" /* nPZ�¤„lppx”Žvlz’ */ $"988A 6A58 6868 5A7A B0B8 987C 6458 728A" /* ˜ŠjXhhZz°¸˜|dXrŠ */ $"887C 6E72 7E8C 927C 7084 8A78 7E9A 9876" /* ˆ|nr~Œ’|p„Šx~š˜v */ $"5646 5480 A8B0 A08A 6C5E 788A 6E62 7E7E" /* VFT€¨° Šl^xŠnb~~ */ $"707C 9098 886C 6270 8EA2 9C8A 6844 4478" /* p|�˜ˆlbpŽ¢œŠhDDx */ $"A096 949C 8C72 6C7C 7E74 7268 6C8C 9C96" /*  –”œŒrl|~trhlŒœ– */ $"927E 565A 8AA2 988C 765E 5664 7A8C 9A9A" /* ’~VZŠ¢˜Œv^VdzŒšš */ $"827A 867E 7276 725C 5A82 A6A4 907A 6868" /* ‚z†~rvr\Z‚¦¤�zhh */ $"7C86 8C9A 865E 6272 6C78 989E 8676 8492" /* |†Œš†^brlx˜ž†v„’ */ $"8A76 5E56 6880 8E9A A082 666C 7878 7E94" /* Šv^Vh€Žš ‚flxx~” */ $"9872 5C68 7682 8A7C 748C 9C92 8A7E 6052" /* ˜r\hv‚Š|tŒœ’Š~`R */ $"6C80 848E 9E9A 7E6C 646C 8E96 7A6A 7684" /* l€„Žžš~ldlŽ–zjv„ */ $"807A 7C6E 688A A69E 847E 7060 5E56 6AA0" /* €z|nhЦž„~p`^Vj  */ $"AE88 727C 827C 8484 6862 8296 8C7A 6E70" /* ®ˆr|‚|„„hb‚–Œznp */ $"787E 7A8E ACA4 7852 5464 7694 9C7A 728A" /* x~zެ¤xRTdv”œzrŠ */ $"948A 7C6E 6474 8074 7C98 9470 5660 7498" /* ”Š|ndt€t|˜”pV`t˜ */ $"B4A0 705A 5C6C 8286 7C7A 909A 847A 9092" /* ´ pZ\l‚†|z�š„z�’ */ $"6E56 5C74 96B0 9A6C 5458 769E AA90 7680" /* nV\t–°šlTXvžª�v€ */ $"7856 5C7E 8A82 7878 829A A68E 6446 4C72" /* xV\~Š‚xx‚š¦ŽdFLr */ $"9EAC 8E70 7472 6674 94A0 9684 6C60 7690" /* ž¬Žptrft” –„l`v� */ $"846E 6668 80AE B88A 605E 5E62 7A8C 9C9C" /* „nfh€®¸Š`^^bzŒœœ */ $"8462 5C7C 9692 8878 6468 869A 785A 6476" /* „b\|–’ˆxdh†šxZdv */ $"8898 9C96 866E 5252 7A8E 9098 8662 648C" /* ˆ˜œ–†nRRzŽ�˜†bdŒ */ $"9884 7472 7482 8A82 7872 6A62 7494 A09C" /* ˜„trt‚Š‚xrjbt” œ */ $"9274 5450 708A 8A84 7C74 8490 8070 767A" /* ’tTPpŠŠ„|t„�€pvz */ $"6E7C 928C 807C 6C60 6A88 A4AA 966E 5E6E" /* n|’Œ€|l`jˆ¤ª–n^n */ $"7870 727E 7E78 8498 8C7A 7472 6668 8294" /* xpr~~x„˜Œztrfh‚” */ $"9686 6050 6E88 8E98 967C 6676 8072 7072" /* –†`PnˆŽ˜–|fv€rpr */ $"767C 8490 949C 8862 566E 8C9A 9482 645A" /* v|„�”œˆbVnŒš”‚dZ */ $"748A 8E8C 847C 7A80 746E 8282 625E 7E9C" /* tŠŽŒ„|z€tn‚‚b^~œ */ $"A4A0 865C 5068 8498 9274 6A76 7C72 7894" /* ¤ †\Ph„˜’tjv|rx” */ $"987A 6A76 868C 8A7A 5850 749E B4A4 7A62" /* ˜zjv†ŒŠzXPtž´¤zb */ $"6C76 6C74 9092 786E 6C76 8C9C 886A 6274" /* lvlt�’xnlvŒœˆjbt */ $"90A4 9264 4C5C 7E88 8E9A 9A84 685C 6682" /* �¤’dL\~ˆŽšš„h\f‚ */ $"988C 6E68 7286 A4A4 7456 708C 8A84 867C" /* ˜Œnhr†¤¤tVpŒŠ„†| */ $"725E 5670 98AC 9C84 6A5A 6E94 966C 526C" /* r^Vp˜¬œ„jZn”–lRl */ $"8E92 8C88 8078 726E 748C 9E8C 7460 5268" /* Ž’Œˆ€xrntŒžŒt`Rh */ $"A0B0 8E76 7A82 8888 7468 7278 747C 949E" /*  °Žvz‚ˆˆthrxt|”ž */ $"8E78 6258 6C92 A68C 645C 6C82 8C80 7A8A" /* ŽxbXl’¦Œd\l‚Œ€zŠ */ $"8C7A 7688 846E 6A66 6074 9EB0 9670 5E6C" /* Œzvˆ„njf`tž°–p^l */ $"8A90 7E7A 7E78 7078 8A88 7E82 8076 7A90" /* Š�~z~xpxŠˆ~‚€vz� */ $"9A7C 5A4E 5C84 A096 8680 766C 7888 807A" /* š|ZN\„ –†€vlxˆ€z */ $"7A74 6E78 868E 8A78 626C 94A4 9074 6664" /* ztnx†ŽŠxbl”¤�tfd */ $"6678 969E 9084 7A76 7A7E 8282 785C 5E8C" /* fx–ž�„zvz~‚‚x\^Œ */ $"A08A 7870 6A6C 8AA2 9882 685A 6674 7C8E" /*  ŠxpjlŠ¢˜‚hZft|Ž */ $"9C8E 706E 8894 8874 685E 6688 A29A 846C" /* œŽpnˆ”ˆth^fˆ¢š„l */ $"6072 8E92 8E90 825E 566E 828E 8E7E 6E76" /* `rŽ’Ž�‚^Vn‚ŽŽ~nv */ $"8A94 907E 584C 6C8E 968C 8C86 6E66 7890" /* Š”�~XLlŽ–ŒŒ†nfx� */ $"988E 7A64 5C6E 8294 906E 6282 A49A 8280" /* ˜Žzd\n‚”�nb‚¤š‚€ */ $"705C 6274 8A98 9682 6C66 6E88 A096 6C54" /* p\btŠ˜–‚lfnˆ –lT */ $"6884 8678 7A78 727E 8C92 948E 7658 566A" /* h„†xzxr~Œ’”ŽvXVj */ $"80A2 A67A 5A6C 8E96 8A7C 7078 7E76 7C86" /* €¢¦zZlŽ–Š|px~v|† */ $"8476 6E76 7C8C A6A0 7044 4E78 8E8A 7C74" /* „vnv|Œ¦ pDNxŽŠ|t */ $"7A82 8280 8884 706C 766E 7898 966E 5664" /* z‚‚€ˆ„plvnx˜–nVd */ $"8AA8 A688 6A6A 6E6E 767E 7E7A 7E80 7E86" /* Ѝ¦ˆjjnnv~~z~€~† */ $"9A98 7856 5C7C 969C 7C5A 627A 848E 9A8E" /* š˜xV\|–œ|Zbz„ŽšŽ */ $"7874 7068 7082 8C80 6E68 80A6 AC80 5C5E" /* xtphp‚Œ€nh€¦¬€\^ */ $"707E 8A90 846C 6876 7884 98A0 8C6E 5E66" /* p~Š�„lhvx„˜ Œn^f */ $"8896 745C 687A 8EA0 A488 6664 686C 7E8A" /* ˆ–t\hzŽ ¤ˆfdhl~Š */ $"8C84 705E 6A92 A494 7A70 767E 888C 765E" /* Œ„p^j’¤”zpv~ˆŒv^ */ $"6472 849C A092 8674 5C5A 809C 8C76 6C6C" /* dr„œ ’†t\Z€œŒvll */ $"7890 988A 786C 6C82 8E7C 7270 6C64 6C92" /* x�˜Šxll‚Ž|rpldl’ */ $"AC9E 826E 6466 7E90 8878 6868 8096 9080" /* ¬ž‚ndf~�ˆxhh€–�€ */ $"807E 7274 8C8E 7C72 5E5C 7290 A6A4 9070" /* €~rtŒŽ|r^\r�¦¤�p */ $"6272 8684 746E 7674 7C8A 8E8A 7E6E 6A7A" /* br†„tnvt|ŠŽŠ~njz */ $"9296 8C7E 5C4C 6C9A 9E8C 8882 787C 7C78" /* ’–Œ~\LlšžŒˆ‚x||x */ $"7A72 686E 7E8E 989A 8C68 5678 9C9E 8270" /* zrhn~Ž˜šŒhVxœž‚p */ $"6664 7688 8C8C 8880 7A7E 847C 827C 5A52" /* fdvˆŒŒˆ€z~„|‚|ZR */ $"789A A496 7A66 6E88 8E8A 8278 6C66 727E" /* xš¤–zfnˆŽŠ‚xlfr~ */ $"8492 947C 6A74 909A 8666 5262 8898 9090" /* „’”|jt�š†fRbˆ˜�� */ $"826C 6C7E 7E7E 8E8C 705C 6284 9E94 7866" /* ‚ll~~~ŽŒp\b„ž”xf */ $"7892 9894 8468 5864 7E86 889A 9C82 6664" /* x’˜”„hXd~†ˆšœ‚fd */ $"8094 987A 5862 828E 948E 7266 7A90 8E8C" /* €”˜zXb‚Ž”Žrfz�ŽŒ */ $"8C80 6E5C 586E 9AAA 8A68 6C80 8E92 8472" /* Œ€n\XnšªŠhl€Ž’„r */ $"626A 848A 8686 847C 746C 789E AA7E 565C" /* bj„І†„|tlxžª~V\ */ $"6C7E 9294 8270 7A8A 8A86 7C70 7672 6672" /* l~’”‚pzŠŠ†|pvrfr */ $"96A2 8264 6074 8A9C 9C7A 5A62 747C 8882" /* –¢‚d`tŠœœzZbt|ˆ‚ */ $"7884 8A80 7C92 967A 605C 6684 A09A 7A68" /* x„Š€|’–z`\f„ šzh */ $"6A72 8C9C 8674 787A 746C 7E8E 8270 707C" /* jrŒœ†txztl~Ž‚pp| */ $"90A0 9672 5E58 6288 A48E 7276 847C 7A8C" /* � –r^Xbˆ¤Žrv„|zŒ */ $"907E 726A 6C82 8E88 7C6E 6272 9AAC 946E" /* �~rjl‚Žˆ|nbrš¬”n */ $"5E66 6C76 8C8C 827C 7474 8896 8E7A 7064" /* ^flvŒŒ‚|ttˆ–Žzpd */ $"6082 9E8C 6C60 687C 949A 8C86 745E 647C" /* `‚žŒl`h|”šŒ†t^d| */ $"8A88 8480 7268 86A2 9A76 5E60 748C 9286" /* Šˆ„€rh†¢šv^`tŒ’† */ $"7C6E 606E 8E9C 8E88 8662 5270 8E90 8068" /* |n`nŽœŽˆ†bRpŽ�€h */ $"647C 969A 8A7A 645E 7086 8E86 827E 6A64" /* d|–šŠzd^p†Ž†‚~jd */ $"7A96 A698 765E 6886 8E7C 746C 647A 9A9C" /* z–¦˜v^h†Ž|tldzšœ */ $"8882 7666 666A 829E 9670 586A 8C94 8E86" /* ˆ‚vffj‚ž–pXjŒ”ކ */ $"7466 728A 8C78 6E74 7674 7A90 A49C 7450" /* tfrŠŒxntvtz�¤œtP */ $"6084 8C8E 866A 6278 9292 847A 767C 7C72" /* `„ŒŽ†jbx’’„zv||r */ $"768A 8A70 5868 8CA2 A68C 6C5C 6882 8A82" /* vŠŠpXhŒ¢¦Œl\h‚Š‚ */ $"766E 7888 8076 8896 7C62 6E84 9698 7E60" /* vnxˆ€vˆ–|bn„–˜~` */ $"586A 8AA2 A284 6A78 8474 6C7C 8678 6870" /* XjŠ¢¢„jx„tl|†xhp */ $"889A 9884 6A5A 6C8A 9C9A 7856 6680 8080" /* ˆš˜„jZlŠœšxVf€€€ */ $"8E94 8272 7078 8890 7A62 5E72 8EA8 AA82" /* Ž”‚rpxˆ�zb^rލª‚ */ $"6064 7A86 8480 847A 6866 728A 9C8E 746E" /* `dz†„€„zhfrŠœŽtn */ $"747A 929C 7650 587A 9296 9088 7C70 6872" /* tz’œvPXz’–�ˆ|phr */ $"8E94 8072 6A64 7290 A28E 6C66 7E90 8C86" /* Ž”€rjdr�¢Žlf~�Œ† */ $"7866 6668 7A98 9E8E 7E70 6668 869A 866A" /* xffhz˜žŽ~pfh†š†j */ $"626E 8696 8C7A 7676 7282 9490 7E66 5E62" /* bn†–Œzvvr‚”�~f^b */ $"6A84 A29E 826A 6A80 9086 706E 7270 7C96" /* j„¢ž‚jj€�†pnrp|– */ $"967E 7276 7674 8692 8E7A 5A58 7A90 9088" /* –~rvvt†’ŽzZXz��ˆ */ $"8278 7482 908C 7266 7276 7884 8C90 826A" /* ‚xt‚�Œrfrvx„Œ�‚j */ $"687C 9896 8272 6462 7892 9282 7E7E 808A" /* h|˜–‚rdbx’’‚~~€Š */ $"8078 7C7A 6660 7894 9884 7268 6A82 9A9A" /* €x|zf`x”˜„rhj‚šš */ $"826A 6874 7E7C 7884 8C80 7284 9C90 786A" /* ‚jht~|x„Œ€r„œ�xj */ $"585C 7E9A A28C 6E68 7C8E 867E 8282 746A" /* X\~š¢Œnh|ކ~‚‚tj */ $"788A 8880 7668 6E88 A2A0 8060 5466 888E" /* xŠˆ€vhnˆ¢ €`TfˆŽ */ $"8084 8A7C 747E 888C 8A74 5E66 7A8C 9688" /* €„Š|t~ˆŒŠt^fzŒ–ˆ */ $"6A5A 749E A28C 7E78 6E64 6E84 9492 8270" /* jZtž¢Œ~xndn„”’‚p */ $"6C78 8C98 906E 4E68 9494 8276 726E 7280" /* lxŒ˜�nNh””‚vrnr€ */ $"949E 987C 645C 647C 9498 7C64 7492 9A8A" /* ”ž˜|d\d|”˜|dt’šŠ */ $"746C 6C6E 7E8A 9092 7C64 6674 88A0 A684" /* tlln~Š�’|dftˆ ¦„ */ $"5E5E 7284 8274 6E78 888C 8C96 8E70 6468" /* ^^r„‚tnxˆŒŒ–Žpdh */ $"7080 949C 8864 5E7A 9696 867A 767A 7672" /* p€”œˆd^z––†zvzvr */ $"8282 7072 8086 8A96 9A7E 605A 6E8C 9484" /* ‚‚pr€†Š–š~`ZnŒ”„ */ $"7274 7878 8290 887E 7878 7A76 7A82 786C" /* rtxx‚�ˆ~xxzvz‚xl */ $"7284 9CA6 8E6C 626A 727A 8A8A 7C74 7A80" /* r„œ¦ŽlbjrzŠŠ|tz€ */ $"8286 8684 8274 748E 9278 6060 7284 94A2" /* ‚††„‚ttŽ’x``r„”¢ */ $"9A7A 626A 7678 7A7C 8080 767C 8E96 826A" /* šzbjvxz|€€v|Ž–‚j */ $"6C78 7E8C 9882 6258 6882 9696 8C86 7C6E" /* lx~Œ˜‚bXh‚––Œ†|n */ $"6E7A 8480 706E 7A82 949C 8A6E 5E68 8298" /* nz„€pnz‚”œŠn^h‚˜ */ $"9278 686A 6C6E 849E 9A84 7A70 7080 8280" /* ’xhjln„žš„zpp€‚€ */ $"7260 668A A69C 7A6A 6E70 7488 9A8E 7868" /* r`fЦœzjnptˆšŽxh */ $"626A 7E96 A08E 746E 7E94 8864 5E6C 7484" /* bj~– Žtn~”ˆd^lt„ */ $"989A 907E 6C60 687E 949E 8A6A 5C6C 8E96" /* ˜š�~l`h~”žŠj\lŽ– */ $"8278 7A86 8A88 8278 6E64 6274 8C9E A296" /* ‚xz†Šˆ‚xndbtŒž¢– */ $"7856 628C 9684 746E 767E 7E80 8280 7A7A" /* xVbŒ–„tnv~~€‚€zz */ $"8284 8486 8266 5064 92A8 9A80 7476 7880" /* ‚„„†‚fPd’¨š€tvx€ */ $"807A 7E7C 767E 7E7A 868C 7A6A 7A96 9E8E" /* €z~|v~~z†Œzjz–žŽ */ $"6C58 6078 8A8E 9090 847A 7A74 7276 7C7C" /* lX`xŠŽ��„zztrv|| */ $"7074 8A98 8C72 606C 8C9C 908C 8266 606E" /* ptŠ˜Œr`lŒœ�Œ‚f`n */ $"787E 8694 927E 787E 8A84 6656 6C8C 9A96" /* x~†”’~x~Š„fVlŒš– */ $"8E78 666A 7C8E 8A86 887A 6666 7084 9080" /* Žxfj|ŽŠ†ˆzffp„�€ */ $"6E78 8E94 8C7E 6858 6480 9496 8E80 7070" /* nxŽ”Œ~hXd€”–Ž€pp */ $"747A 9298 8268 6070 8486 827C 7476 8C9E" /* tz’˜‚h`p„†‚|tvŒž */ $"9880 665A 6872 7A94 A28E 6A60 7280 8A92" /* ˜€fZhrz”¢Žj`r€Š’ */ $"8470 6C72 848C 7C6A 7082 8C92 9C96 7C5A" /* „plr„Œ|jp‚Œ’œ–|Z */ $"5064 7A92 A092 7A6C 6E7E 8A86 706C 7C84" /* Pdz’ ’zln~Іpl|„ */ $"8486 8476 6668 768C A49E 826C 5654 6E8E" /* „†„vfhvŒ¤ž‚lVTnŽ */ $"9684 7882 8A84 8080 7A6E 6C76 8492 8C7E" /* –„x‚Š„€€znlv„’Œ~ */ $"7062 6480 A6A6 7E68 6A6C 727A 8082 8280" /* pbd€¦¦~hjlrz€‚‚€ */ $"8288 887E 7A70 6466 7C9A 9878 6060 7286" /* ‚ˆˆ~zpdf|š˜x``r† */ $"9292 887C 746A 6C76 7A7C 8484 7C84 9890" /* ’’ˆ|tjlvz|„„|„˜� */ $"725C 5870 9296 8A80 786E 6A78 8688 8A8C" /* r\Xp’–Š€xnjx†ˆŠŒ */ $"846E 687A 8270 6066 88A4 A48C 7066 5E64" /* „nhz‚p`fˆ¤¤Œpf^d */ $"7E8E 8486 8C7E 6C6E 8490 8A74 6A7C 928E" /* ~Ž„†Œ~ln„�Štj|’Ž */ $"7A64 5C68 7E9A 9E8E 8076 6C64 6A80 8E8E" /* zd\h~šžŽ€vldj€ŽŽ */ $"7C68 708C 9882 706E 6E7E 928C 7A6A 646E" /* |hpŒ˜‚pnn~’Œzjdn */ $"7C8A 96A2 9C78 565C 7C8E 887C 7672 7C8C" /* |Š–¢œxV\|Žˆ|vr|Œ */ $"9280 6C6C 7A82 8888 8A86 684C 5E88 A0A2" /* ’€llz‚ˆˆŠ†hL^ˆ ¢ */ $"967C 6466 787E 786E 7080 8C90 8886 826C" /* –|dfx~xnp€Œ�ˆ†‚l */ $"5E68 86A0 A08A 6C58 607C 9296 8E80 7680" /* ^h†  ŠlX`|’–Ž€v€ */ $"8270 6E7A 746C 748E 9E9C 866A 5E68 788E" /* ‚pnztltŽžœ†j^hxŽ */ $"9A88 6A64 747C 7A84 908A 7A74 8084 7E76" /* šˆjdt|z„�Šzt€„~v */ $"6A68 7688 9CA4 8C66 6074 8080 8A8A 7E70" /* jhvˆœ¤Œf`t€€ŠŠ~p */ $"6C72 7C88 8880 8080 8088 8670 5A5C 7692" /* lr|ˆˆ€€€€ˆ†pZ\v’ */ $"9A96 8A7C 6E68 6C76 8688 7E80 8076 7C86" /* š–Š|nhlv†ˆ~€€v|† */ $"8470 6E86 989A 886E 6060 6476 929E 9084" /* „pn†˜šˆn``dv’ž�„ */ $"8278 6A6C 7E84 726E 8090 9288 7468 6E7A" /* ‚xjl~„rn€�’ˆthnz */ $"8896 947A 686A 6C6A 7E96 9886 7C7A 7E8C" /* ˆ–”zhjlj~–˜†|z~Œ */ $"826C 6A72 828E 968E 7668 707E 8488 908A" /* ‚ljr‚Ž–Žvhp~„ˆ�Š */ $"7662 586C 8E96 887E 8282 8086 8264 5A70" /* vbXlŽ–ˆ~‚‚€†‚dZp */ $"848C 8E8C 887A 645E 7A9C 9E8C 7A6C 686C" /* „ŒŽŒˆzd^zœžŒzlhl */ $"828A 7A7A 8894 9284 7A70 6860 607C 9EA6" /* ‚Šzzˆ”’„zph``|ž¦ */ $"9076 6860 7290 9082 7A76 7C80 7872 7680" /* �vh`r��‚zv|€xrv€ */ $"7E7A 849A 9A7E 6054 5C78 96A2 947C 7076" /* ~z„šš~`T\x–¢”|pv */ $"8282 7A7A 8A84 6A70 8686 7A72 7078 8C9E" /* ‚‚zzŠ„jp††zrpxŒž */ $"9A84 6250 647E 8A86 8A94 8470 707C 8482" /* š„bPd~ІД„pp|„‚ */ $"7C78 747C 8888 7866 6478 9AA4 9082 7C6A" /* |xt|ˆˆxfdxš¤�‚|j */ $"5E66 768A 9892 8278 7C7E 7A78 6E64 7692" /* ^fvŠ˜’‚x|~zxndv’ */ $"9A84 706C 7074 7A8C 9C96 846E 646A 6E78" /* š„plptzŒœ–„ndjnx */ $"8A88 7A82 9898 7C68 6870 7882 8C92 8A76" /* Šˆz‚˜˜|hhpx‚Œ’Šv */ $"6A72 7A82 9098 866E 6876 7E74 6C74 7E8A" /* jrz‚�˜†nhv~tlt~Š */ $"9290 867C 6C62 6E82 888E 8E7E 6A66 788A" /* ’�†|lbn‚ˆŽŽ~jfxŠ */ $"908A 7A78 807A 7274 7670 7288 9C9C 9082" /* �Šzx€zrtvprˆœœ�‚ */ $"7460 5A72 8E9A 9078 6E76 7678 848A 7E76" /* t`ZrŽš�xnvvx„Š~v */ $"868C 7E72 706C 6670 88A0 AA92 7062 6066" /* †Œ~rplfpˆ ª’pb`f */ $"7A8A 8E80 767E 8680 7A7C 7C7C 7E84 8A8E" /* zŠŽ€v~†€z|||~„ŠŽ */ $"8064 5A68 8094 A49E 7E66 666C 767A 787E" /* €dZh€”¤ž~fflvzx~ */ $"8884 7C82 8E86 706A 7884 8A8E 886C 5662" /* ˆ„|‚ކpjx„ŠŽˆlVb */ $"7E96 9890 8A82 7464 687E 8278 7C84 8488" /* ~–˜�Š‚tdh~‚x|„„ˆ */ $"9084 6C62 6A84 9890 7C6E 6A68 6878 929E" /* �„lbj„˜�|njhhx’ž */ $"9688 7A70 7078 766E 6E7C 90A0 9A7C 646A" /* –ˆzppxvnn|� š|dj */ $"7672 7E92 9286 7466 6876 868E 9088 7C82" /* vr~’’†tfhv†Ž�ˆ|‚ */ $"8C80 6052 6A82 888E 9692 806E 686C 7686" /* Œ€`Rj‚ˆŽ–’€nhlv† */ $"8C88 7A6A 6E86 8A76 7286 908C 8A7C 6E66" /* Œˆzjn†Švr†�ŒŠ|nf */ $"666E 7C8E 9A98 8C78 646C 828E 8476 787E" /* fn|Žš˜Œxdl‚Ž„vx~ */ $"807C 7674 7882 8486 928A 746C 625A 6C92" /* €|vtx‚„†’ŠtlbZl’ */ $"A69A 8476 747A 7872 787E 7E7C 848A 7C72" /* ¦š„vtzxrx~~|„Š|r */ $"7676 7480 9AA4 8A68 5A5C 6E82 8A90 928A" /* vvt€š¤ŠhZ\n‚Š�’Š */ $"7C7C 7E6E 6A76 7874 7E90 9486 7264 6882" /* ||~njvxt~�”†rdh‚ */ $"9898 9080 6E62 6876 7E84 8A8C 847E 8080" /* ˜˜�€nbhv~„ŠŒ„~€€ */ $"7A72 6266 8698 9288 7E6E 6678 8C90 8A82" /* zrbf†˜’ˆ~nfxŒ�Š‚ */ $"786E 6668 788C 8C7C 808E 8E84 786E 6462" /* xnfhxŒŒ|€ŽŽ„xndb */ $"7C96 988C 8276 6E70 7884 9690 7A6E 7072" /* |–˜Œ‚vnpx„–�znpr */ $"747A 807C 8094 9892 8068 5C66 727E 8A96" /* tz€|€”˜’€h\fr~Š– */ $"947C 6A6A 747C 8488 827A 7C7C 7E7A 6C6A" /* ”|jjt|„ˆ‚z||~zlj */ $"8296 948C 9084 645A 6272 8494 9488 7C72" /* ‚–”Œ�„dZbr„””ˆ|r */ $"7886 8270 7082 8C80 787A 766C 7482 8A92" /* x†‚pp‚Œ€xzvlt‚Š’ */ $"9286 6E60 606C 8490 827A 868C 8078 7872" /* ’†n``l„�‚z†Œ€xxr */ $"7880 8082 8680 726A 6C74 849E A286 6A68" /* x€€‚†€rjlt„ž¢†jh */ $"7070 7278 828C 8E8A 8682 786A 6C78 7680" /* pprx‚ŒŽŠ†‚xjlxv€ */ $"9898 745C 6476 8690 8E8A 887E 706E 6E70" /* ˜˜t\dv†�ŽŠˆ~pnnp */ $"7482 8C86 8A98 9272 5A5E 7488 948C 7C76" /* t‚Œ†Š˜’rZ^tˆ”Œ|v */ $"7472 7484 8A88 8C86 726E 7878 706A 7084" /* trt„ŠˆŒ†rnxxpjp„ */ $"9EA2 8870 6C6C 6C78 8A8E 8684 7E72 6E7E" /* ž¢ˆplllxŠŽ†„~rn~ */ $"9090 8076 7886 866E 626E 787E 92A0 907C" /* ��€vx††nbnx~’ �| */ $"786E 6268 7C90 9684 706E 8084 7A7A 7E80" /* xnbh|�–„pn€„zz~€ */ $"848A 8674 6668 6E74 8698 A09A 8868 586C" /* „Іtfhnt†˜ šˆhXl */ $"7E7E 8084 8280 8682 7874 7678 868E 8682" /* ~~€„‚€†‚xtvx†Ž†‚ */ $"8274 5C5E 7E96 9A92 887C 6E6E 7474 7476" /* ‚t\^~–š’ˆ|nntttv */ $"7E8C 8E82 7A80 7A6A 6E8A 948C 8272 6264" /* ~ŒŽ‚z€zjnŠ”Œ‚rbd */ $"788A 9290 847E 827A 6C6A 747A 7880 8C90" /* xŠ’�„~‚zljtzx€Œ� */ $"8A7E 7068 7086 9090 8870 626C 7A7A 7C8C" /* Š~php†��ˆpblzz|Œ */ $"948A 847E 7674 6E66 7082 8E94 9A8C 6A5C" /* ”Š„~vtnfp‚Ž”šŒj\ */ $"6E82 8884 8884 766E 6E74 7A80 848A 8C88" /* n‚ˆ„ˆ„vnntz€„ŠŒˆ */ $"8082 785A 5674 9298 968E 7C70 7070 7480" /* €‚xZVt’˜–Ž|pppt€ */ $"8484 827E 7474 8284 7876 8696 9686 725E" /* „„‚~tt‚„xv†––†r^ */ $"6070 7C86 9294 887C 786E 6C80 8A80 7478" /* `p|†’”ˆ|xnl€Š€tx */ $"8288 8270 6A7C 888A 908E 7A66 666A 6C74" /* ‚ˆ‚pj|ˆŠ�Žzffjlt */ $"90A2 947C 7078 7E7C 7472 7E88 8888 8272" /* �¢”|px~|tr~ˆˆˆ‚r */ $"6876 8480 8696 927E 6658 627C 908C 888C" /* hv„€†–’~fXb|�ŒˆŒ */ $"8882 7E74 6868 7886 8684 8684 7C6E 6470" /* ˆ‚~thhx††„†„|ndp */ $"8EA0 907A 7470 6A74 7E7C 7C8C 928E 8276" /* Ž �ztpjt~||Œ’Ž‚v */ $"7074 6E66 7494 9C88 7670 6C76 8692 8A7C" /* ptnft”œˆvplv†’Š| */ $"7C7E 7870 6C76 868A 8482 928E 7668 6466" /* |~xplv†Š„‚’Žvhdf */ $"7892 9A8A 7C76 747A 807C 808C 8A7A 7074" /* x’šŠ|vtz€|€ŒŠzpt */ $"7874 7276 8090 9A94 806A 6060 768A 8886" /* xtrv€�š”€j``vŠˆ† */ $"8E8C 746A 767E 7E80 8082 8482 7C74 6C66" /* ŽŒtjv~~€€‚„‚|tlf */ $"7494 A294 847E 7464 6476 848A 8C88 827C" /* t”¢”„~tddv„ŠŒˆ‚| */ $"7A7A 7876 7276 8C92 8070 706E 6E80 8E92" /* zzxvrvŒ’€ppnn€Ž’ */ $"928A 7468 686E 7682 8A82 7E88 8A80 726E" /* ’Šthhnv‚Š‚~ˆŠ€rn */ $"747E 888A 8682 7868 6A78 8288 9696 7C66" /* t~ˆŠ†‚xhjx‚ˆ––|f */ $"6C76 7474 7882 8C90 8880 7A6C 6876 8484" /* lvttx‚Œ�ˆ€zlhv„„ */ $"868E 886E 606C 7E8A 8E8C 867E 7A74 6C6C" /* †Žˆn`l~ŠŽŒ†~ztll */ $"707A 8A96 9084 867A 6864 6E7E 9094 8470" /* pzŠ–�„†zhdn~�”„p */ $"7274 747A 8286 848A 8A7E 6C6A 7074 7880" /* rttz‚†„ŠŠ~ljptx€ */ $"8E9C 967C 6666 7276 848E 8478 8086 7A70" /* Žœ–|ffrv„Ž„x€†zp */ $"7882 8A88 8080 867C 6862 6E7E 8C9A 9680" /* x‚Šˆ€€†|hbn~Œš–€ */ $"6C6E 7474 747C 868A 867C 767C 827A 747E" /* lnttt|†Š†|v|‚zt~ */ $"868C 9082 685C 687A 8C94 9088 8A80 6A62" /* †Œ�‚h\hzŒ”�ˆŠ€jb */ $"7282 8280 8486 8886 7C6E 6670 8696 9280" /* r‚‚€„†ˆ†|nfp†–’€ */ $"6E70 7268 6C88 9A94 8A82 7670 7676 7270" /* nprhlˆš”Š‚vpvvrp */ $"7A8A 9A92 7A6C 7276 767E 8C92 867A 6E68" /* zŠš’zlrvv~Œ’†znh */ $"7080 8C8A 8684 8282 806C 606E 7E86 8A8C" /* p€ŒŠ†„‚‚€l`n~†ŠŒ */ $"8A80 766C 6A7C 8C8E 8A7E 6E68 7884 7C78" /* Š€vlj|ŒŽŠ~nhx„|x */ $"8490 8E82 7874 6E6C 707A 8A94 928A 7E68" /* „�Ž‚xtnlpzŠ”’Š~h */ $"627A 8C86 8084 827A 7470 7078 8286 8C8E" /* bzŒ†€„‚ztppx‚†ŒŽ */ $"867C 746A 626C 8698 988E 8078 7272 7476" /* †|tjbl†˜˜Ž€xrrtv */ $"808A 8682 807A 7074 7C7C 808E 968C 7C68" /* €Š†‚€zpt||€Ž–Œ|h */ $"606E 7C82 8892 8C7C 7A7A 726A 7484 847E" /* `n|‚ˆ’Œ|zzrjt„„~ */ $"8488 8276 6C72 8292 908A 8474 666C 7A7C" /* „ˆ‚vlr‚’�Š„tflz| */ $"7C8C 968A 7E78 7476 7672 7888 928C 847A" /* |Œ–Š~xtvvrxˆ’Œ„z */ $"6C6A 7888 8C8A 867E 726C 6A6C 7E8C 8C84" /* ljxˆŒŠ†~rljl~ŒŒ„ */ $"888C 7E70 6E68 6A7E 9296 8C7E 7272 7470" /* ˆŒ~pnhj~’–Œ~rrtp */ $"7890 9686 7472 7270 7A80 7E80 8A96 927C" /* x�–†trrpz€~€Š–’| */ $"6864 6E78 7C82 9294 806E 6C70 788A 8E80" /* hdnx|‚’”€nlpxŠŽ€ */ $"787A 7E7E 7A70 7082 928E 8684 7E72 6664" /* xz~~zpp‚’ކ„~rfd */ $"7084 9696 8676 7074 7C82 7C74 808E 8270" /* p„––†vpt|‚|t€Ž‚p */ $"7276 7678 7E84 8E92 8674 665E 6886 968A" /* rvvx~„Ž’†tf^h†–Š */ $"7E86 8A7C 6E70 7A7E 8284 8280 807C 726C" /* ~†Š|npz~‚„‚€€|rl */ $"6E7E 969E 8872 7072 6E6E 7A84 8C94 8A7A" /* n~–žˆrprnnz„Œ”Šz */ $"7878 7474 7676 7E8E 927E 6868 7682 8888" /* xxttvv~Ž’~hhv‚ˆˆ */ $"8888 8676 686E 767A 848E 8A80 888A 7664" /* ˆˆ†vhnvz„ŽŠ€ˆŠvd */ $"667A 8A90 867C 7C7A 7074 8284 868E 8A76" /* fzŠ�†||zpt‚„†ŽŠv */ $"6870 7A76 707A 8896 9484 726A 6C70 7A88" /* hpzvpzˆ–”„rjlpzˆ */ $"8C86 8680 706A 7A86 8888 807A 8082 7264" /* Œ††€pjz†ˆˆ€z€‚rd */ $"6C78 8290 9A90 8074 6E6A 6A78 8890 8E7A" /* lx‚�š�€tnjjxˆ�Žz */ $"7078 827C 747E 847E 848A 7C6A 6870 7A84" /* px‚|t~„~„Š|jhpz„ */ $"9096 9888 6A5E 6A7A 7E84 8A82 7A80 827C" /* �–˜ˆj^jz~„Š‚z€‚| */ $"7274 7C84 8684 807E 7668 6478 8E96 968E" /* rt|„†„€~vhdxŽ––Ž */ $"7666 6C72 767C 7E80 888C 8276 7C7E 7474" /* vflrv|~€ˆŒ‚v|~tt */ $"808C 8E86 7868 646E 8496 968A 7C7A 7C6E" /* €ŒŽ†xhdn„––Š|z|n */ $"6474 8480 8088 8A84 807A 6C6A 7686 948E" /* dt„€€ˆŠ„€zljv†”Ž */ $"7866 6C78 767A 8A92 8E86 7C72 6C72 7878" /* xflxvzВކ|rlrxx */ $"7C86 9094 9078 646A 7E82 8286 847E 7872" /* |†�”�xdj~‚‚†„~xr */ $"6C76 868A 888A 8278 7E7E 6A5E 708A 9490" /* lv†ŠˆŠ‚x~~j^pŠ”� */ $"867E 7872 7070 7C86 8684 8074 6C7C 8A80" /* †~xrpp|††„€tl|Š€ */ $"7682 928E 8272 6468 747E 848E 8E86 827A" /* v‚’Ž‚rdht~„ŽŽ†‚z */ $"686A 7C8A 8478 7C82 8480 746C 788A 8E8A" /* hj|Š„x|‚„€tlxŠŽŠ */ $"867C 6E6A 6E70 768C 9C94 8278 727A 8274" /* †|njnpvŒœ”‚xrz‚t */ $"6E7C 8A88 8482 786C 727E 8484 8C92 826C" /* n|Šˆ„‚xlr~„„Œ’‚l */ $"5C62 7C8E 8C86 8888 8078 7A70 6674 8684" /* \b|ŽŒ†ˆˆ€xzpft†„ */ $"8288 867C 7268 708A 9A90 8076 6E6C 7482" /* ‚ˆ†|rhpŠš�€vnlt‚ */ $"8282 8A8C 8680 7872 7274 7072 8898 8E78" /* ‚‚ŠŒ†€xrrtprˆ˜Žx */ $"706E 7080 908C 867E 7470 7270 7486 9086" /* pnp€�Œ†~tprpt†�† */ $"7E88 8C7C 6C6A 6C74 8894 9286 7670 767C" /* ~ˆŒ|ljltˆ”’†vpv| */ $"7E82 8C90 7C6C 7278 7478 8080 8690 9084" /* ~‚Œ�|lrxtx€€†��„ */ $"7666 6270 8088 888E 8C7A 6E70 747C 8484" /* vfbp€ˆˆŽŒznpt|„„ */ $"807C 7C7A 7876 7474 8498 9482 7C76 6C68" /* €||zxvtt„˜”‚|vlh */ $"707C 868C 8A82 7C78 727A 827A 7482 8E82" /* p|†ŒŠ‚|xrz‚zt‚Ž‚ */ $"7472 7478 8088 8E8C 847C 706C 6C70 8290" /* trtx€ˆŽŒ„|pllp‚� */ $"867C 848A 8074 7474 7C86 8A84 7C76 7070" /* †|„Š€ttt|†Š„|vpp */ $"7C80 8492 927E 6C68 7076 787A 7C88 928E" /* |€„’’~lhpvxz|ˆ’Ž */ $"8076 726C 7282 8480 8688 7866 6A7E 8C92" /* €vrlr‚„€†ˆxfj~Œ’ */ $"8A7C 7E82 7870 7272 7286 968E 8484 8072" /* Š|~‚xprrr†–Ž„„€r */ $"646A 7E8C 9082 7070 767A 8086 8480 8688" /* dj~Œ�‚ppvz€†„€†ˆ */ $"7C6E 7276 7676 7E88 9498 8068 6670 7A84" /* |nrvvv~ˆ”˜€hfpz„ */ $"8A84 7C7E 7E7A 7880 868A 887E 7680 8472" /* Š„|~~zx€†Šˆ~v€„r */ $"646C 7E8C 9496 8870 6C72 7278 8086 8C88" /* dl~Œ”–ˆplrrx€†Œˆ */ $"746E 7E86 7E78 7E82 8688 8672 626A 7684" /* tn~†~x~‚†ˆ†rbjv„ */ $"8E90 908C 7E6C 6472 8286 8280 807E 8482" /* Ž��Œ~ldr‚†‚€€~„‚ */ $"7470 787E 888C 8278 7474 6E6E 8296 968C" /* tpx~ˆŒ‚xttnn‚––Œ */ $"7E74 7476 7676 7A7C 808A 8A7E 7274 807C" /* ~ttvvvz|€ŠŠ~rt€| */ $"7886 8C84 7870 6C72 7E88 8E8C 827A 7E7C" /* x†Œ„xplr~ˆŽŒ‚z~| */ $"7068 7482 8286 8A84 7E78 7274 7E86 8C88" /* pht‚‚†Š„~xrt~†Œˆ */ $"8072 6C74 8082 8086 8C88 867C 706E 7274" /* €rlt€‚€†Œˆ†|pnrt */ $"7C88 928C 8682 7268 7686 8882 7E7A 7A7A" /* |ˆ’Œ†‚rhv†ˆ‚~zzz */ $"7474 7A80 848A 8C88 7872 726A 687E 9296" /* ttz€„ŠŒˆxrrjh~’– */ $"8C80 7674 787C 7E80 807E 7E82 7A72 7C82" /* Œ€vtx|~€€~~‚zr|‚ */ $"7C80 888E 8C7E 6E64 687A 888C 8A84 7C78" /* |€ˆŽŒ~ndhzˆŒŠ„|x */ $"7C78 747C 8282 7C7C 8084 8076 6C78 8E90" /* |xt|‚‚||€„€vlxŽ� */ $"8C84 7264 6A76 7E80 888E 8A7E 7074 7C82" /* Œ„rdjv~€ˆŽŠ~pt|‚ */ $"7A72 7C88 8886 7E72 6A74 8A8E 8684 8278" /* zr|ˆˆ†~rjtŠŽ†„‚x */ $"6C66 6A80 928C 8282 827E 807A 6E6C 7A8A" /* lfj€’Œ‚‚‚~€znlzŠ */ $"8E86 8078 7676 7476 8896 8C78 6E6E 747C" /* ކ€xvvtvˆ–Œxnnt| */ $"8282 7E86 8E88 8074 6872 7C78 7886 9286" /* ‚‚~†Žˆ€thr|xx†’† */ $"726E 727C 868C 867A 767A 7C7A 7074 8490" /* rnr|†Œ†zvz|zpt„� */ $"8A80 8282 786C 6E74 7C8A 9284 7674 747E" /* Š€‚‚xlnt|Š’„vtt~ */ $"847C 7A84 887E 7472 7676 7C80 828A 8E86" /* „|z„ˆ~trvv|€‚ŠŽ† */ $"766A 666E 808C 8880 8086 8072 747A 7E82" /* vjfn€Œˆ€€†€rtz~‚ */ $"807E 8080 7870 7274 7A90 9C8C 7670 7474" /* €~€€xprtz�œŒvptt */ $"7278 8086 8882 807E 7A78 7878 787A 8890" /* rx€†ˆ‚€~zxxxxzˆ� */ $"806C 6A74 7C88 8E88 847E 7470 747A 7C80" /* €ljt|ˆŽˆ„~tptz|€ */ $"8680 7C84 887E 726C 7280 8C8A 807A 7470" /* †€|„ˆ~rlr€ŒŠ€ztp */ $"7480 8C8A 8486 7A6A 707A 7E7A 787C 8A92" /* t€ŒŠ„†zjpz~zx|Š’ */ $"887A 7470 6C76 8A90 8480 7E72 6C74 848E" /* ˆztplvŠ�„€~rlt„Ž */ $"8A80 7A78 7C78 7272 7478 8496 9280 7A74" /* Š€zx|xrrtx„–’€zt */ $"6E6E 7682 8C8C 8070 6E7A 7E7E 8280 7C82" /* nnv‚ŒŒ€pnz~~‚€|‚ */ $"8580 746E 727A 8185 898F 8B7A 6668 7A80" /* …€tnrz�…‰�‹zfhz€ */ $"8385 8078 7881 817A 787C 8387 8078 7C80" /* ƒ…€xx��zx|ƒ‡€x|€ */ $"7468 7685 8B91 897A 6C6A 767E 7E7C 7E83" /* thv…‹‘‰zljv~~|~ƒ */ $"857E 7478 807E 7A80 8587 837C 6E66 7083" /* …~tx€~z€…‡ƒ|nfpƒ */ $"8D8F 897A 7C7E 746C 7480 8583 8383 8380" /* ��‰z|~tlt€…ƒƒƒƒ€ */ $"7870 6E78 858D 8D7C 6A6E 7A7C 7A80 8D8D" /* xpnx…��|jnz|z€�� */ $"837C 7874 7878 7478 8085 8F8F 7A66 6C7C" /* ƒ|xtxxtx€…��zfl| */ $"8381 8181 7C76 7474 7A85 8785 807C 7E81" /* ƒ���|vttz…‡…€|~� */ $"8172 666E 818D 8985 7E74 7676 7680 8987" /* �rfn��‰…~tvvv€‰‡ */ $"7E78 7472 7E89 8378 7A85 8B83 766C 6C74" /* ~xtr~‰ƒxz…‹ƒvllt */ $"7881 8D8F 877C 7470 6E7C 8D89 7874 7C80" /* x���‡|tpn|�‰xt|€ */ $"7E78 7278 8183 8589 8176 6C6E 6E72 8797" /* ~xrx�ƒ…‰�vlnnr‡— */ $"9183 7674 7A7E 7C78 7A80 8181 807E 7874" /* ‘ƒvtz~|xz€��€~xt */ $"7C7E 7E87 8B83 766A 6676 8589 8383 837C" /* |~~‡‹ƒvjfv…‰ƒƒƒ| */ $"767A 7A74 767C 8080 8180 817C 7074 818D" /* vzztv|€€�€�|pt�� */ $"8B7C 7874 6C72 8085 8181 8583 7E78 7678" /* ‹|xtlr€…��…ƒ~xvx */ $"7878 7881 8D85 7C78 7472 808B 8B83 7C76" /* xxx��…|xtr€‹‹ƒ|v */ $"7474 7478 8087 8781 8185 7E74 706E 7481" /* tttx€‡‡��…~tpnt� */ $"8B8D 8378 7272 7E81 7C80 8780 7476 7878" /* ‹�ƒxrr~�|€‡€tvxx */ $"7A7C 8083 878B 897A 6B65 7083 8780 8185" /* z|€ƒ‡‹‰zkepƒ‡€�… */ $"7E76 787E 7E80 817E 767A 8080 7C74 7180" /* ~vx~~€�~vz€€|tq€ */ $"9490 837C 7471 7278 7E81 8785 7C74 767E" /* ”�ƒ|tqrx~�‡…|tv~ */ $"8183 7C72 7A87 877C 6F71 7880 8789 8985" /* �ƒ|rz‡‡|oqx€‡‰‰… */ $"7C6D 6B71 7685 9085 767A 8585 7C72 747C" /* |mkqv…�…vz……|rt| */ $"8185 8380 7C72 7176 7A83 9094 836B 6774" /* �…ƒ€|rqvzƒ�”ƒkgt */ $"7C7C 7C7C 8089 8B81 7C78 7274 7A7C 8087" /* ||||€‰‹�|xrtz|€‡ */ $"897C 6B6B 7887 8F89 7C7A 7E7A 7476 787C" /* ‰|kkx‡�‰|z~ztvx| */ $"8085 8581 8183 7C6D 6D78 878E 8374 737A" /* €……��ƒ|mmx‡Žƒtsz */ $"7C7E 8385 8180 807A 7173 7C7C 7A7A 818C" /* |~ƒ…�€€zqs||zz�Œ */ $"8E80 716D 747A 8185 837C 787C 7A74 7E85" /* Ž€qmtz�…ƒ|x|zt~… */ $"8783 7E7A 7E7E 766B 6D7C 878C 8E85 7873" /* ‡ƒ~z~~vkm|‡ŒŽ…xs */ $"7374 7A80 8185 837A 747A 8080 7878 8385" /* stz€�…ƒztz€€xxƒ… */ $"8581 786F 6D74 8189 8B85 8380 746D 7481" /* …�xomt�‰‹…ƒ€tmt� */ $"807A 7E7E 7E81 817C 7674 7A83 8781 7875" /* €z~~~��|vtzƒ‡�xu */ $"7575 7681 8A8A 837E 7873 787C 7C7A 7A7C" /* uuv�ŠŠƒ~xsx||zz| */ $"8087 8578 7578 7E81 8587 817A 736D 757E" /* €‡…xux~�…‡�zsmu~ */ $"878A 8980 7876 7E7E 7171 7A81 8385 8580" /* ‡Š‰€xv~~qqz�ƒ……€ */ $"7675 757A 8387 8983 766A 6D80 8380 8081" /* vuuzƒ‡‰ƒvjm€ƒ€€� */ $"8383 807A 7571 7578 8087 8989 8378 6C71" /* ƒƒ€zuqux€‡‰‰ƒxlq */ $"8189 857E 7878 7A7C 7A78 8083 8185 857E" /* �‰…~xxz|zx€ƒ�……~ */ $"7C7A 756D 7585 908C 7E73 757A 7E7E 7E80" /* |zumu…�Œ~suz~~~€ */ $"7E7C 7E7A 767A 8181 7C7C 878A 8175 6A6E" /* ~|~zvz��||‡Š�ujn */ $"7C85 8787 837A 787C 7875 7C83 837C 7A7E" /* |…‡‡ƒzx|xu|ƒƒ|z~ */ $"8181 7871 7887 8E8A 8177 6E6F 777C 8083" /* ��xqx‡ŽŠ�wnow|€ƒ */ $"8A88 8078 777A 817C 7378 858A 837C 756F" /* Šˆ€xwz�|sx…Šƒ|uo */ $"7580 8585 8180 7C77 6F6F 7E88 857C 7C83" /* u€……�€|woo~ˆ…||ƒ */ $"8580 7A75 6F77 8388 8580 7C78 7A78 7885" /* …€zuowƒˆ…€|xzxx… */ $"8E85 7873 777C 8081 7E7A 8085 8580 7973" /* Ž…xsw|€�~z€……€ys */ $"7579 7C7E 8388 8175 7077 8087 8881 7A79" /* uy|~ƒˆ�upw€‡ˆ�zy */ $"797A 7C7A 777A 8587 8180 807A 706E 7781" /* yz|zwz…‡�€€zpnw� */ $"8A8A 837C 7573 7A81 817C 7E83 8179 797C" /* ŠŠƒ|usz��|~ƒ�yy| */ $"7975 7A81 878A 877E 756E 6E7A 8788 8180" /* yuz�‡Š‡~unnz‡ˆ�€ */ $"817E 7A7C 7C7C 7C7C 7C80 817E 7977 7579" /* �~z||||||€�~ywuy */ $"818C 8C80 7573 757A 7E80 8181 807C 7E80" /* �ŒŒ€usuz~€��€|~€ */ $"7C79 7C7C 777C 8785 7972 737C 8587 8783" /* |y||w|‡…yrs|…‡‡ƒ */ $"7C75 7379 7C7C 8085 837C 7C81 8077 7375" /* |usy||€…ƒ||�€wsu */ $"7E86 8883 7A75 7375 8085 8383 837E 7372" /* ~†ˆƒzusu€…ƒƒƒ~sr */ $"777A 7C7A 7A81 8A8A 8075 7273 7983 8683" /* wz|zz�ŠŠ€ursyƒ†ƒ */ $"807E 7A75 757E 8586 8179 7A81 8179 7577" /* €~zuu~…†�yz��yuw */ $"7980 8C8A 817A 7977 7575 7E86 887E 7375" /* y€ŒŠ�zywuu~†ˆ~su */ $"7E81 817E 7C79 7E85 8379 7379 7C80 8385" /* ~��~|y~…ƒysy|€ƒ… */ $"8686 7A6D 6E7A 8385 837C 777A 8181 7E7A" /* ††zmnzƒ…ƒ|wz��~z */ $"7C80 8381 7C7C 7E79 6E72 818D 8C85 7A70" /* |€ƒ�||~ynr��Œ…zp */ $"7279 7E80 7E7E 8185 8179 7A81 7C75 7981" /* ry~€~~�…�yz�|uy� */ $"8886 8074 6D72 7C88 8A83 7E7C 7E7A 7477" /* ˆ†€tmr|ˆŠƒ~|~ztw */ $"7E80 7C7C 8183 8580 7770 7580 8686 8075" /* ~€||�ƒ…€wpu€††€u */ $"747A 7E7C 8186 8681 7A79 7C80 7E79 797C" /* tz~|�††�zy|€~yy| */ $"8186 8680 7472 7C83 8180 817E 7974 797E" /* �††€tr|ƒ�€�~yty~ */ $"8385 8180 7E7A 7C80 796F 7481 8686 8580" /* ƒ…�€~z|€yot�††…€ */ $"7A77 7579 8084 8480 7C77 767C 8181 7C7C" /* zwuy€„„€|wv|��|| */ $"8386 837C 7672 767C 8184 8986 7E7B 7776" /* ƒ†ƒ|vrv|�„‰†~{wv */ $"7B81 837E 797C 8081 7E77 777B 8083 8483" /* {�ƒ~y|€�~ww{€ƒ„ƒ */ $"7B72 7677 7B80 888B 8177 777B 8080 7B79" /* {rvw{€ˆ‹�ww{€€{y */ $"7B7C 8083 8179 777C 8080 8183 8179 7271" /* {|€ƒ�yw|€€�ƒ�yrq */ $"7984 8884 807B 797B 7E7E 7977 7C80 8080" /* y„ˆ„€{y{~~yw|€€€ */ $"8180 7C7B 767C 898B 8379 7271 7680 8481" /* �€|{v|‰‹ƒyrqv€„� */ $"8080 8181 7C77 797B 7976 7E86 8782 7974" /* €€��|wy{yv~†‡‚yt */ $"7377 8588 8079 7779 7B79 797C 8282 7E7E" /* sw…ˆ€ywy{yy|‚‚~~ */ $"8280 7C77 7371 7C87 8882 7B76 7B7E 807E" /* ‚€|wsq|‡ˆ‚{v{~€~ */ $"7E80 7E79 767B 7E80 7E7C 7B80 8785 7E74" /* ~€~yv{~€~|{€‡…~t */ $"6F76 8083 807C 8080 7977 7B80 8280 7C79" /* ov€ƒ€|€€yw{€‚€|y */ $"797C 8080 7976 7E87 8A80 7979 7774 777E" /* y|€€yv~‡Š€yywtw~ */ $"8283 8380 7977 7C80 807C 777C 8383 7B76" /* ‚ƒƒ€yw|€€|w|ƒƒ{v */ $"7778 7E80 8385 8380 7871 7379 8083 827C" /* wx~€ƒ…ƒ€xqsy€ƒ‚| */ $"7C82 837E 7676 7980 8080 807E 7B76 767C" /* |‚ƒ~vvy€€€€~{vv| */ $"8085 8880 7671 7980 807C 7980 8282 8080" /* €…ˆ€vqy€€|y€‚‚€€ */ $"7E79 7679 7E80 8283 7E74 727C 8586 827E" /* ~yvy~€‚ƒ~tr|…†‚~ */ $"7979 7B7B 7B7C 7C7C 8082 8080 8079 7474" /* yy{{{|||€‚€€€ytt */ $"7B82 8682 7975 787C 8083 8380 7C7C 7C7B" /* {‚†‚yux|€ƒƒ€|||{ */ $"7979 7C7B 7B80 8589 8376 7275 7980 8586" /* yy|{{€…‰ƒvruy€…† */ $"8079 7B7C 7E7E 8082 807C 7B7E 807C 7776" /* €y{|~~€‚€|{~€|wv */ $"787E 8588 867C 7476 797B 7E80 8080 7E7B" /* x~…ˆ†|tvy{~€€€~{ */ $"7C80 807C 7B7B 7C80 8280 7874 777E 8586" /* |€€|{{|€‚€xtw~…† */ $"8280 7E7B 7779 7E80 807C 7B7C 7E80 827C" /* ‚€~{wy~€€|{|~€‚| */ $"797B 8083 8279 7779 7B79 7E85 8682 7E79" /* y{€ƒ‚ywy{y~…†‚~y */ $"7777 7C80 7E7B 7980 8582 7B77 797E 8080" /* ww|€~{y€…‚{wy~€€ */ $"8280 7C79 7776 7983 8685 8079 7B7E 7E79" /* ‚€|ywvyƒ†…€y{~~y */ $"7379 8082 8582 807E 7B79 797E 8283 807B" /* sy€‚…‚€~{yy~‚ƒ€{ */ $"7477 7E85 807A 7E82 8280 7C7A 7A7A 7A7C" /* tw~…€z~‚‚€|zzzz| */ $"8285 8382 7B74 7680 8580 7A79 7A7C 807E" /* ‚…ƒ‚{tv€…€zyz|€~ */ $"7E80 8080 8080 807E 7B77 7479 8389 857C" /* ~€€€€€€~{wtyƒ‰…| */ $"7977 7C80 807E 7E7E 7B7A 7E7E 7C80 807B" /* yw|€€~~~{z~~|€€{ */ $"7C83 8582 7970 727B 8284 8382 807A 7A7C" /* |ƒ…‚ypr{‚„ƒ‚€zz| */ $"7B7C 807E 7B79 8083 827B 7777 8085 8380" /* {|€~{y€ƒ‚{ww€…ƒ€ */ $"7C77 7479 7C7E 8284 827E 7B7D 8080 7D78" /* |wty|~‚„‚~{}€€}x */ $"787E 8383 807E 7B7B 7D80 8280 807C 7877" /* x~ƒƒ€~{{}€‚€€|xw */ $"7B7E 8384 7E7B 8080 807E 7C79 797D 8082" /* {~ƒ„~{€€€~|yy}€‚ */ $"807D 7C7C 7D7E 8085 837B 7779 7C7E 8080" /* €}||}~€…ƒ{wy|~€€ */ $"807D 8082 807C 7978 7B7D 7E80 8480 7C79" /* €}€‚€|yx{}~€„€|y */ $"7B7D 8083 827D 7B7C 7D7E 7E7B 7C80 8383" /* {}€ƒ‚}{|}~~{|€ƒƒ */ $"8280 7D79 7779 7D80 8483 7E7B 7C7D 8082" /* ‚€}ywy}€„ƒ~{|}€‚ */ $"7C79 7D80 7E7C 7D7C 7B7D 8082 8383 807B" /* |y}€~|}|{}€‚ƒƒ€{ */ $"7977 7B83 837E 7B7D 8080 7E80 7E7C 7D7E" /* yw{ƒƒ~{}€€~€~|}~ */ $"7E7E 807E 7C7B 7C80 8786 7E77 777B 7E80" /* ~~€~|{|€‡†~ww{~€ */ $"807D 7E80 7E7E 7E7E 7D7C 7B7B 7D82 827D" /* €}~€~~~~}|{{}‚‚} */ $"7577 7D82 8582 7E7D 7C7A 7A7C 7E7E 8080" /* uw}‚…‚~}|zz|~~€€ */ $"7D7D 8285 7E77 777B 8183 817D 7B7A 7B7E" /* }}‚…~ww{�ƒ�}{z{~ */ $"8081 8181 8079 787E 8180 7A79 7D82 8582" /* €���€yx~�€zy}‚…‚ */ $"7D7A 797B 7E80 807E 807D 797B 8083 8380" /* }zy{~€€~€}y{€ƒƒ€ */ $"7979 7D80 807B 7A7C 7E80 8280 7E7D 7C7A" /* yy}€€{z|~€‚€~}|z */ $"7A7D 8182 8079 777E 8381 8080 7E7D 8080" /* z}�‚€yw~ƒ�€€~}€€ */ $"7C7A 7C7D 7E7E 8083 8380 7977 7B80 8080" /* |z|}~~€ƒƒ€yw{€€€ */ $"7E7C 7D80 807E 7B7E 8080 7E7E 7E7E 7C78" /* ~|}€€~{~€€~~~~|x */ $"787E 8283 827E 7A7B 7D7D 7D7D 7D7E 8080" /* x~‚ƒ‚~z{}}}}}~€€ */ $"807E 8080 7C7A 7E81 817E 7B7A 7A7E 8282" /* €~€€|z~��~{zz~‚‚ */ $"807E 7C7E 807C 7B7E 7E7B 7C80 8181 7E7C" /* €~|~€|{~~{|€��~| */ $"7B7B 8081 817E 7A79 7C7E 8080 8080 7E7E" /* {{€��~zy|~€€€€~~ */ $"7E7E 7E7E 7C7A 7C80 8282 807A 797C 8081" /* ~~~~|z|€‚‚€zy|€� */ $"8180 7C7C 7C7C 7E80 8180 7E7E 7E7E 807E" /* �€||||~€�€~~~~€~ */ $"7A77 7A81 8482 807E 7A7C 7C7E 8080 7E7E" /* zwz�„‚€~z||~€€~~ */ $"7C7C 7C81 817E 7A7E 8182 817E 7979 7B7E" /* |||��~z~�‚�~yy{~ */ $"8182 8180 7E7C 7C7C 8081 7E7A 7B7E 8082" /* �‚�€~|||€�~z{~€‚ */ $"807B 7C7E 8081 807E 7C7B 7C7C 7E82 8381" /* €{|~€�€~|{||~‚ƒ� */ $"7E7A 7B80 817E 7C7C 7E7E 8080 7E7C 7C80" /* ~z{€�~||~~€€~||€ */ $"7E7E 8081 7E7A 777A 8083 8280 7E7E 7E7E" /* ~~€�~zwz€ƒ‚€~~~~ */ $"7E7C 7A7E 807E 7E80 8080 7C7A 7C80 8382" /* ~|z~€~~€€€|z|€ƒ‚ */ $"7E7B 7A7D 7E80 7E7E 8081 807E 7E7E 7E7D" /* ~{z}~€~~€�€~~~~} */ $"7C7B 8083 827D 7C7C 7E80 807E 7D7C 7E7E" /* |{€ƒ‚}||~€€~}|~~ */ $"7E7C 7D80 807E 7D80 8280 7C7A 7A7D 8182" /* ~|}€€~}€‚€|zz}�‚ */ $"807C 7C7E 8080 7E7E 7E80 7C7B 7E80 7E7E" /* €||~€€~~~€|{~€~~ */ $"7E7D 8082 827E 7A7A 7C7E 8080 7E7E 7E7D" /* ~}€‚‚~zz|~€€~~~} */ $"7C7E 8080 7E7D 7C7E 8080 7E7C 7C7C 8184" /* |~€€~}|~€€~|||�„ */ $"827E 7C7C 7A7C 7E80 8180 7E7D 7E80 8080" /* ‚~||z|~€�€~}~€€€ */ $"7D7B 7B80 8281 7E7C 7C7C 7E81 8281 807D" /* }{{€‚�~|||~�‚�€} */ $"7B7C 7E80 8080 7C7C 8082 817E 7D7C 7C7E" /* {|~€€€||€‚�~}||~ */ $"8080 807E 7C7C 7D80 8182 807C 7A7C 7E80" /* €€€~||}€�‚€|z|~€ */ $"7E7E 7D7D 8080 8080 7E7C 7C7E 8080 8080" /* ~~}}€€€€~||~€€€€ */ $"7D7A 7C80 8181 807D 7C7D 7D7E 7E7D 7D7E" /* }z|€��€}|}}~~}}~ */ $"8181 8080 807D 7A7C 8081 8180 7C7C 7D7E" /* ��€€€}z|€��€||}~ */ $"8080 7E7E 7E80 7E7C 7D7D 7D7D 7E80 8282" /* €€~~~€~|}}}}~€‚‚ */ $"807C 7C7D 7F80 807F 7E7E 8080 7E7E 7F7F" /* €||}.€€.~~€€~~.. */ $"7F7E 7E80 807E" /* .~~€€~ */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Droplet.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Droplet.r new file mode 100644 index 0000000..afbba8c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Droplet.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 1D00 0000 0744 726F 706C" /* ...........Dropl */ $"6574" /* et */ }; data $8024 (0x1D) { $"0000 1200 E882 0000 EE56 8080 8080 8080" /* .....‚...V€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"7E7E 7E7E 7E7E 7E7F 7E7E 7E7E 7E7E 7E7F" /* ~~~~~~~.~~~~~~~. */ $"7F7F 7F80 8081 8182 8281 8181 8282 8282" /* ...€€��‚‚���‚‚‚‚ */ $"8383 8282 8281 8180 8080 8080 8080 8080" /* ƒƒ‚‚‚��€€€€€€€€€ */ $"8182 8282 8282 8281 8182 8180 8080 8080" /* �‚‚‚‚‚‚��‚�€€€€€ */ $"8182 8282 8383 8484 8484 8382 8282 8282" /* �‚‚‚ƒƒ„„„„ƒ‚‚‚‚‚ */ $"8383 8485 8686 8787 8888 8887 8786 8583" /* ƒƒ„…††‡‡ˆˆˆ‡‡†…ƒ */ $"8281 8180 7F7F 7F7E 7E7E 7F80 8081 8282" /* ‚��€...~~~.€€�‚‚ */ $"8283 8484 8483 8382 8281 8080 7F7E 7D7D" /* ‚ƒ„„„ƒƒ‚‚�€€.~}} */ $"7C7C 7B7B 7C7C 7C7C 7C7B 7A7A 7A7B 7A7A" /* ||{{|||||{zzz{zz */ $"7B7B 7B7C 7C7C 7D7D 7D7D 7D7C 7C7B 7979" /* {{{|||}}}}}||{yy */ $"7878 7776 7676 7575 7575 7575 7676 7676" /* xxwvvvuuuuuuvvvv */ $"7676 7676 7777 7878 7878 7878 7777 7778" /* vvvvwwxxxxxxwwwx */ $"7777 7777 7776 7676 7676 7676 7778 797A" /* wwwwwvvvvvvvwxyz */ $"7B7C 7C7D 7E7E 7F80 7F7E 7E7D 7D7D 7D7D" /* {||}~~.€.~~}}}}} */ $"7D7C 7C7C 7C7C 7C7C 7D7D 7D7E 7F7F 7F7F" /* }|||||||}}}~.... */ $"7F80 8080 8080 807F 7F80 8081 8181 8182" /* .€€€€€€..€€����‚ */ $"8282 8283 8483 8384 8585 8587 898B 8A8A" /* ‚‚‚ƒ„ƒƒ„………‡‰‹ŠŠ */ $"8B8C 8C8B 8C8B 8988 8887 8583 8383 8080" /* ‹ŒŒ‹Œ‹‰ˆˆ‡…ƒƒƒ€€ */ $"8080 8081 8284 8687 8888 8B8D 8C8D 8E8D" /* €€€�‚„†‡ˆˆ‹�Œ�Ž� */ $"8B8B 8A89 8888 8786 8684 8485 8484 8585" /* ‹‹Š‰ˆˆ‡††„„…„„…… */ $"8585 8686 8686 8585 8685 8585 8686 8686" /* ……††††……†………†††† */ $"8686 8686 8584 8483 8282 8383 8383 8484" /* ††††…„„ƒ‚‚ƒƒƒƒ„„ */ $"8384 8485 8585 8584 8484 8383 8383 8282" /* ƒ„„…………„„„ƒƒƒƒ‚‚ */ $"8282 8283 8383 8383 8382 8383 8484 8585" /* ‚‚‚ƒƒƒƒƒƒ‚ƒƒ„„…… */ $"8484 8482 8488 8584 8686 837F 7E82 837F" /* „„„‚„ˆ…„††ƒ.~‚ƒ. */ $"7D7D 7B7A 7977 7574 7470 6968 6E6C 6262" /* }}{zywuttpihnlbb */ $"6665 6462 6366 635F 6060 6062 6059 595F" /* fedbcfc_```b`YY_ */ $"605E 5A59 5F60 5A58 544F 4E4D 4841 3836" /* `^ZY_`ZXTONMHA86 */ $"352E 2C2C 2B29 282A 3033 353A 4045 494E" /* 5.,,+)(*035:@EIN */ $"555C 6369 6F77 7E84 8B92 979B 9FA3 A6A8" /* U\ciow~„‹’—›Ÿ£¦¨ */ $"A8A8 A8A6 A5A3 9E98 938F 8A84 7F7A 736D" /* ¨¨¨¦¥£ž˜“�Š„.zsm */ $"6863 5F5C 5956 5353 5556 5657 5A5D 6167" /* hc_\YVSSUVVWZ]ag */ $"6C70 777F 8489 8F96 9A9E A2A6 A9AC AEB0" /* lpw.„‰�–šž¢¦©¬®° */ $"B1B2 B2B2 B2B1 B1B0 AEAD ACA9 A7A5 A3A0" /* ±²²²²±±°®­¬©§¥£  */ $"9E9D 9A97 9593 9190 9090 8F8F 9192 9396" /* ž�š—•“‘�����‘’“– */ $"979A 9DA1 A5A8 ADB0 B4B8 BCC0 C2C4 C5C6" /* —š�¡¥¨­°´¸¼ÀÂÄÅÆ */ $"C8C9 CBCB CBCA C9C9 C9C9 C7C5 C4C3 C0BE" /* ÈÉËËËÊÉÉÉÉÇÅÄÃÀ¾ */ $"BCBA B7B5 B3B0 AFAD ACAD ADAD ADAF B0B0" /* ¼º·µ³°¯­¬­­­­¯°° */ $"B1B3 B5B6 B8BB BCBE C0C2 C5C7 C9CB CDCD" /* ±³µ¶¸»¼¾ÀÂÅÇÉËÍÍ */ $"CDCF D0D0 D0D0 CFCC CAC8 C7C6 C4C2 BFBD" /* ÍÏÐÐÐÐÏÌÊÈÇÆÄ¿½ */ $"BBB8 B7B7 B5B3 B1B0 AEAC ABAA AAAA AAAA" /* »¸··µ³±°®¬«ªªªªª */ $"ABAC ADAD B0B3 B5B8 BBBE C0C3 C6C8 CACC" /* «¬­­°³µ¸»¾ÀÃÆÈÊÌ */ $"CDCE CECE CECD CDCB C9C7 C5C2 BFBD BAB7" /* ÍÎÎÎÎÍÍËÉÇÅ¿½º· */ $"B4B1 AEAC A9A7 A5A3 A1A0 9E9E 9D9C 9B9B" /* ´±®¬©§¥£¡ žž�œ›› */ $"9B9B 9C9C 9C9C 9D9E 9E9F A0A0 A1A1 A2A2" /* ››œœœœ�žžŸ  ¡¡¢¢ */ $"A3A3 A2A2 A2A1 9F9E 9D9C 9A99 9895 928F" /* ££¢¢¢¡Ÿž�œš™˜•’� */ $"8C8A 8784 817E 7B78 7674 7270 6E6D 6C6C" /* ŒŠ‡„�~{xvtrpnmll */ $"6C6C 6C6D 6E6E 6F71 7374 7677 7879 7B7D" /* lllmnnoqstvwxy{} */ $"7E7F 8081 8180 8080 7F7E 7D7B 7977 7472" /* ~.€��€€€.~}{ywtr */ $"706D 6B6A 6866 6462 605F 5D5C 5A59 5756" /* pmkjhfdb`_]\ZYWV */ $"5655 5555 5657 5859 5B5C 5D5F 6163 6567" /* VUUUVWXY[\]_aceg */ $"686A 6B6C 6D6D 6E6F 7070 7070 6F6E 6C6B" /* hjklmmnopppponlk */ $"6A67 6461 5E5B 5754 514D 4A47 4442 403E" /* jgda^[WTQMJGDB@> */ $"3D3C 3B3B 3C3C 3D3E 3F41 4345 4749 4B4D" /* =<;;<<=>?ACEGIKM */ $"4F51 5354 5556 5757 5757 5857 5756 5554" /* OQSTUVWWWWXWWVUT */ $"5351 4F4D 4B4A 4745 4341 3F3D 3B39 3836" /* SQOMKJGECA?=;986 */ $"3534 3332 3232 3232 3333 3436 383A 3C3F" /* 5432222233468:ADGJMPRUXZ\_abc */ $"6465 6666 6563 6260 5E5B 5957 5350 4D4B" /* deffecb`^[YWSPMK */ $"4845 423F 3C3A 3837 3534 3332 3233 3435" /* HEB?<:8754322345 */ $"373A 3C40 4447 4B4F 5356 5A5E 6164 676A" /* 7:<@DGKOSVZ^adgj */ $"6C6E 6F70 7172 7271 706F 6D6C 6A69 6764" /* lnopqrrqpomljigd */ $"615F 5C59 5654 514F 4C49 4846 4443 4343" /* a_\YVTQOLIHFDCCC */ $"4343 4444 4546 484B 4E51 5458 5B5F 6367" /* CCDDEFHKNQTX[_cg */ $"6B6F 7376 797B 7D7F 8081 8282 8280 7F7E" /* kosvy{}.€�‚‚‚€.~ */ $"7C7A 7774 706D 6A66 635F 5D5A 5856 5452" /* |zwtpmjfc_]ZXVTR */ $"5251 5151 5252 5355 5658 5B5D 6063 676A" /* RQQQRRSUVX[]`cgj */ $"6F73 787C 8084 888B 8E91 9294 9696 9696" /* osx|€„ˆ‹Ž‘’”–––– */ $"9694 9391 8F8C 8986 827F 7B78 7470 6D6A" /* –”“‘�Œ‰†‚.{xtpmj */ $"6865 6361 6060 5F60 6162 6466 686B 6E71" /* heca``_`abdfhknq */ $"7477 7B7E 8286 8A8E 9397 9B9E A0A3 A5A7" /* tw{~‚†ŠŽ“—›ž £¥§ */ $"A8A9 A8A7 A6A5 A4A2 A09E 9B98 9592 8F8C" /* ¨©¨§¦¥¤¢ ž›˜•’�Œ */ $"8986 8380 7D7A 7876 7675 7474 7576 777A" /* ‰†ƒ€}zxvvuttuvwz */ $"7C7F 8184 888A 8D92 979B 9FA3 A7AA ADB0" /* |.�„ˆŠ�’—›Ÿ£§ª­° */ $"B3B5 B6B7 B7B6 B4B3 B1B0 ADAA A6A1 9D99" /* ³µ¶··¶´³±°­ª¦¡�™ */ $"9490 8C89 8582 7E7C 7977 7777 7776 7676" /* ”�Œ‰…‚~|ywwwwvvv */ $"7879 7C7F 8285 888B 8F93 969B 9FA3 A6A9" /* xy|.‚…ˆ‹�“–›Ÿ£¦© */ $"ACAF B0B2 B3B4 B4B4 B4B4 B4B2 B0AE ABA8" /* ¬¯°²³´´´´´´²°®«¨ */ $"A4A0 9C98 938F 8B87 8380 7D7A 7877 7676" /* ¤ œ˜“�‹‡ƒ€}zxwvv */ $"7677 797A 7C7F 8184 888C 9094 989C A0A3" /* vwyz|.�„ˆŒ�”˜œ £ */ $"A7A9 ACAF B1B2 B3B3 B4B3 B3B2 B1AF ADAB" /* §©¬¯±²³³´³³²±¯­« */ $"A9A5 A29F 9B97 938F 8B87 8481 7E7B 7876" /* ©¥¢Ÿ›—“�‹‡„�~{xv */ $"7473 7373 7475 7679 7B7E 8084 888B 8F93" /* tssstuvy{~€„ˆ‹�“ */ $"969A 9EA2 A5A8 ABAE AFB1 B2B3 B3B2 B2B0" /* –šž¢¥¨«®¯±²³³²²° */ $"ADAB A8A6 A29F 9B98 9490 8C89 8682 7F7C" /* ­«¨¦¢Ÿ›˜”�Œ‰†‚.| */ $"7A77 7574 7475 7577 7A7C 7E81 8487 8B8F" /* zwuttuuwz|~�„‡‹� */ $"9498 9B9E A2A6 A9AC AFB2 B4B6 B7B7 B6B6" /* ”˜›ž¢¦©¬¯²´¶··¶¶ */ $"B5B4 B2B0 ADAA A7A4 A09D 9997 938F 8C89" /* µ´²°­ª§¤ �™—“�Œ‰ */ $"8684 8381 8080 807F 8081 8283 8486 888B" /* †„ƒ�€€€.€�‚ƒ„†ˆ‹ */ $"8E91 9699 9CA0 A3A6 AAAD B1B4 B6B7 B8B7" /* Ž‘–™œ £¦ª­±´¶·¸· */ $"B7B7 B6B5 B4B2 AFAD AAA7 A3A0 9D9A 9591" /* ··¶µ´²¯­ª§£ �š•‘ */ $"8D8A 8784 8381 807E 7E7E 7E7E 8081 8385" /* �Ї„ƒ�€~~~~~€�ƒ… */ $"8789 8C8F 9296 999D A0A2 A4A7 AAAC AEAF" /* ‡‰Œ�’–™� ¢¤§ª¬®¯ */ $"AFB0 B0B0 AFAD ACAA A8A6 A3A0 9C99 9592" /* ¯°°°¯­¬ª¨¦£ œ™•’ */ $"8F8B 8885 827F 7E7D 7B7A 7A7B 7B7C 7E80" /* �‹ˆ…‚.~}{zz{{|~€ */ $"8284 888B 8E91 9497 9B9E A0A3 A5A7 A9AB" /* ‚„ˆ‹Ž‘”—›ž £¥§©« */ $"ACAD AEAE ADAC ABA9 A7A5 A39F 9D9A 9794" /* ¬­®®­¬«©§¥£Ÿ�š—” */ $"918E 8B87 8482 7F7D 7B79 7978 7777 7879" /* ‘Ž‹‡„‚.}{yyxwwxy */ $"7B7D 7F81 8487 898C 8F93 9699 9C9E A0A2" /* {}.�„‡‰Œ�“–™œž ¢ */ $"A4A5 A5A5 A5A4 A3A2 A09E 9C9A 9895 928F" /* ¤¥¥¥¥¤£¢ žœš˜•’� */ $"8C88 8481 7E7B 7876 7573 7171 7171 7173" /* Œˆ„�~{xvusqqqqqs */ $"7475 7779 7C7E 8185 888C 8F93 9699 9C9E" /* tuwy|~�…ˆŒ�“–™œž */ $"A1A3 A5A6 A7A8 A8A8 A7A6 A5A3 A19E 9B98" /* ¡£¥¦§¨¨¨§¦¥£¡ž›˜ */ $"9490 8D89 8582 7F7B 7876 7573 7271 7272" /* ”��‰…‚.{xvusrqrr */ $"7274 7678 7B7D 8084 878A 8E92 9698 9B9D" /* rtvx{}€„‡ŠŽ’–˜›� */ $"9FA0 A2A2 A2A2 A2A1 9F9D 9B99 9592 8F8B" /* Ÿ ¢¢¢¢¢¡Ÿ�›™•’�‹ */ $"8682 7E7B 7875 726F 6C6A 6968 6767 6768" /* †‚~{xuroljihgggh */ $"696B 6D6F 7275 787C 8083 868A 8E90 9395" /* ikmorux|€ƒ†ŠŽ�“• */ $"9798 9999 9998 9694 928F 8C89 8682 7D79" /* —˜™™™˜–”’�Œ‰†‚}y */ $"7571 6D69 6664 615E 5C5B 5A5A 5A5C 5E5F" /* uqmifda^\[ZZZ\^_ */ $"6266 6A6D 7074 787C 7F83 8689 8C8E 9192" /* bfjmptx|.ƒ†‰ŒŽ‘’ */ $"9394 9494 9291 8E8B 8783 7F7B 7671 6D68" /* “”””’‘Ž‹‡ƒ.{vqmh */ $"6460 5D5A 5755 5453 5354 5558 5B5E 6266" /* d`]ZWUTSSTUX[^bf */ $"6A6F 747A 7F84 898D 9195 989B 9C9D 9E9E" /* jotz.„‰�‘•˜›œ�žž */ $"9D9B 9997 9490 8D88 837D 7874 706B 6763" /* �›™—”��ˆƒ}xtpkgc */ $"605C 5A59 5959 5A5D 6063 676C 7278 7E85" /* `\ZYYYZ]`cglrx~… */ $"8C92 989E A4A9 ADB1 B4B6 B6B6 B6B4 B1AE" /* Œ’˜ž¤©­±´¶¶¶¶´±® */ $"AAA5 9F97 9088 8079 736D 6761 5D5B 5959" /* ª¥Ÿ—�ˆ€ysmga][YY */ $"595B 5D60 6469 6E74 7B82 8A92 9AA2 A9B0" /* Y[]`dint{‚В𢩰 */ $"B7BC C0C3 C6C7 C6C4 C2BF BBB6 B0A9 A199" /* ·¼ÀÃÆÇÆÄ¿»¶°©¡™ */ $"9087 7F76 6E65 5E58 524F 4D4B 4B4D 5054" /* �‡.vne^XROMKKMPT */ $"5960 676F 7880 8A94 9EA6 B0B8 BFC5 CACD" /* Y`gox€Š”ž¦°¸¿ÅÊÍ */ $"CFD0 CFCC C8C2 BBB3 AAA0 968B 8176 6C62" /* ÏÐÏÌÈ»³ª –‹�vlb */ $"5850 4944 403E 3D3D 4043 484F 5760 6A74" /* XPID@>==@CHOW`jt */ $"7F89 939E A8B2 BAC2 C8CD D0D3 D4D2 CFCA" /* .‰“ž¨²ºÂÈÍÐÓÔÒÏÊ */ $"C4BB B1A6 9C90 8478 6D61 574D 453F 3A37" /* Ä»±¦œ�„xmaWME?:7 */ $"3535 373A 4047 505A 6571 7E8A 97A4 B1BC" /* 557:@GPZeq~Š—¤±¼ */ $"C7D0 D8DE E2E5 E5E3 DFDA D3C9 BEB2 A496" /* ÇÐØ.......Óɾ²¤– */ $"887A 6C5F 5348 3F37 312C 2B2B 2E31 373F" /* ˆzl_SH?71,++.17? */ $"4852 5E6B 7988 97A5 B2BF CCD6 DFE5 EAEC" /* HR^kyˆ—¥²¿ÌÖ.... */ $"EBE9 E4DD D3C7 BBAD 9D8D 7D6D 5D4E 4034" /* ....ÓÇ»­��}m]N@4 */ $"2921 1B17 1617 1B21 2934 404F 5E6D 7D8E" /* )!.....!)4@O^m}Ž */ $"9DAD BBC9 D6E0 E8EE F1F1 EFEA E2D7 CABB" /* �­»ÉÖ........×Ê» */ $"AA98 8674 6352 4132 2419 1009 0605 0609" /* ª˜†tcRA2$..Æ...Æ */ $"0F18 2330 3F50 6174 8698 AABB CAD7 E2EB" /* ..#0?Pat†˜ª»Ê×.. */ $"F1F4 F4F1 EAE1 D5C6 B6A4 907B 6652 3F2D" /* ......ÕÆ¶¤�{fR?- */ $"1C0E 0201 0101 0101 0101 0B19 293B 4F63" /* ............);Oc */ $"778C A1B4 C6D5 E3EE F6FC FEFC F7EE E2D3" /* wŒ¡´ÆÕ.........Ó */ $"C2AF 9A84 6E57 412D 1A0A 0101 0101 0101" /* ¯š„nWA-........ */ $"0101 0312 2438 4E64 7B92 A9BF D3E5 F5FF" /* ....$8Nd{’©¿Ó... */ $"FFFF FFFF FFFF F3E3 D0BA A38B 7259 422C" /* ........к£‹rYB, */ $"1706 0101 0101 0101 0101 0314 273C 536B" /* ............'Xt�ªÄ..... */ $"FFFF FFFF FFFF EED8 BFA3 876A 4D32 1801" /* .......Ø¿£‡jM2.. */ $"0101 0101 0101 0101 0101 061E 3855 728F" /* ............8Ur� */ $"ACC7 E1F9 FFFF FFFF FFFF FFFF FFF7 DEC3" /* ¬Ç.............à */ $"A687 6849 2C11 0101 0101 0101 0101 0101" /* ¦‡hI,........... */ $"0101 1A37 5575 95B4 D2ED FFFF FFFF FFFF" /* ...7Uu•´Ò....... */ $"FFFF FFFF F5DB BD9E 7D5B 3A1C 0101 0101" /* ......½ž}[:..... */ $"0101 0101 0101 0101 0E2C 4C6D 8EAF CEEB" /* .........,LmޝÎ. */ $"FFFF FFFF FFFF FFFF FFFF FCE0 C2A1 7F5D" /* ............¡.] */ $"3C1C 0101 0101 0101 0101 0101 0101 1433" /* <..............3 */ $"5577 9ABD DEFC FFFF FFFF FFFF FFFF FFFF" /* Uwš½............ */ $"FFE4 C3A1 7D59 3717 0101 0101 0101 0101" /* ..á}Y7......... */ $"0101 0103 2244 688D B1D4 F5FF FFFF FFFF" /* ...."Dh�±Ô...... */ $"FFFF FFFF FFFF F1CF AB85 5F3B 1901 0101" /* .......Ï«…_;.... */ $"0101 0101 0101 0101 0120 4368 8EB4 D8F9" /* ......... ChŽ´Ø. */ $"FFFF FFFF FFFF FFFF FFFF FFEC C8A2 7B55" /* ............È¢{U */ $"2F0C 0101 0101 0101 0101 0101 0103 254A" /* /.............%J */ $"7097 BEE2 FFFF FFFF FFFF FFFF FFFF FFF7" /* p—¾............. */ $"D4AD 855C 3510 0101 0101 0101 0101 0101" /* Ô­…\5........... */ $"0101 1F46 6E97 C0E6 FFFF FFFF FFFF FFFF" /* ...Fn—À......... */ $"FFFF FFED C79E 744A 2101 0101 0101 0101" /* ....ÇžtJ!....... */ $"0101 0101 0105 2C55 80AB D3F9 FFFF FFFF" /* ......,U€«Ó..... */ $"FFFF FFFF FFFF FAD4 AA7E 5227 0101 0101" /* .......Ôª~R'.... */ $"0101 0101 0101 0101 0124 4F7C A8D3 FBFF" /* .........$O|¨Ó.. */ $"FFFF FFFF FFFF FFFF FFF8 CFA3 7547 1B01" /* ..........Ï£uG.. */ $"0101 0101 0101 0101 0101 010B 3664 94C1" /* ............6d”Á */ $"EDFF FFFF FFFF FFFF FFFF FFFF E1B4 8556" /* .............´…V */ $"2701 0101 0101 0101 0101 0101 0111 3F6F" /* '.............?o */ $"A0CF FAFF FFFF FFFF FFFF FFFF FFFF D9AB" /*  Ï.............« */ $"7B4B 1C01 0101 0101 0101 0101 0101 0A37" /* {K.............7 */ $"6798 C8F6 FFFF FFFF FFFF FFFF FFFF FFE7" /* g˜È............. */ $"B988 5729 0101 0101 0101 0101 0101 011A" /* ¹ˆW)............ */ $"4878 A9D9 FFFF FFFF FFFF FFFF FFFF FFFF" /* Hx©............. */ $"D4A4 7343 1601 0101 0101 0101 0101 011C" /* Ô¤sC............ */ $"4978 A9D8 FFFF FFFF FFFF FFFF FFFF FFF6" /* Ix©Ø............ */ $"C897 6536 0A01 0101 0101 0101 0101 0C38" /* È—e6...........8 */ $"689A CBFA FFFF FFFF FFFF FFFF FFFF FFDD" /* hšË............. */ $"AA77 4516 0101 0101 0101 0101 0106 3263" /* ªwE...........2c */ $"96C9 FBFF FFFF FFFF FFFF FFFF FFFF D9A6" /* –É.............¦ */ $"7240 1101 0101 0101 0101 0101 1643 74A6" /* r@...........Ct¦ */ $"D8FF FFFF FFFF FFFF FFFF FFFF E5B4 814F" /* Ø............´�O */ $"2101 0101 0101 0101 0101 113C 6C9D CDF9" /* !..........*....* */ $"3D53 6E8C A8C3 DCF0 FFFF FFFF F8E8 D4BB" /* =SnŒ¨Ã........Ô» */ $"A186 6C56 4335 2E2E 333D 4D62 788F A7BC" /* ¡†lVC5..3=Mbx�§¼ */ $"CFDE E8EC EAE3 D6C5 B29C 856F 5C4C 413B" /* Ï.....ÖŲœ…o\LA; */ $"3A3F 4958 6B7F 94A9 BCCC D7DF E1DD D4C7" /* :?IXk.”©¼Ì×...ÔÇ */ $"B5A1 8B76 6250 4239 3536 3D47 5769 7E93" /* µ¡‹vbPB956=GWi~“ */ $"A6B8 C6CF D4D4 CFC5 B6A5 927E 6B5A 4C43" /* ¦¸ÆÏÔÔÏŶ¥’~kZLC */ $"3F3F 444C 5A69 7A8B 9BA9 B3BA BDBB B4AA" /* ??DLZiz‹›©³º½»´ª */ $"9D8E 7E6D 5F52 4843 4244 4B56 6372 8190" /* �Ž~m_RHCBDKVcr�� */ $"9CA6 AEB1 AFAA A195 8778 6A5C 5048 4341" /* œ¦®±¯ª¡•‡xj\PHCA */ $"444A 535E 6A76 828C 9499 9B99 948C 8277" /* DJS^jv‚Œ”™›™”Œ‚w */ $"6D62 5952 4E4D 4E53 5A63 6D78 8189 8F92" /* mbYRNMNSZcmx�‰�’ */ $"918F 8980 756B 5F54 4C46 4243 474C 555F" /* ‘�‰€uk_TLFBCGLU_ */ $"6974 7E86 8B8E 8F8B 867F 766D 645B 5450" /* it~†‹Ž�‹†.vmd[TP */ $"4E4E 5055 5A5F 666B 7072 7373 706D 6863" /* NNPUZ_fkprsspmhc */ $"5E59 5654 5456 5A5F 666C 7177 7B7D 7D7B" /* ^YVTTVZ_flqw{}}{ */ $"7872 6B64 5D57 524F 4E4F 5258 5F66 6D74" /* xrkd]WRONORX_fmt */ $"7B7E 8080 7E7B 7771 6C67 6360 5F60 6367" /* {~€€~{wqlgc`_`cg */ $"6B6F 7478 7A7C 7C7B 7874 706B 6764 6362" /* kotxz||{xtpkgdcb */ $"6366 6A6E 7175 797C 7D7D 7C79 7773 716E" /* cfjnquy|}}|ywsqn */ $"6D6D 6E70 7276 797D 8082 8281 7F7C 7874" /* mmnprvy}€‚‚�.|xt */ $"716E 6C6C 6D70 7377 7B7F 8385 8686 8582" /* qnllmpsw{.ƒ…††…‚ */ $"7F7C 7977 7676 7779 7C80 8285 8889 8988" /* .|ywvvwy|€‚…ˆ‰‰ˆ */ $"8683 807D 7A79 797B 7D7F 8387 8B8E 9091" /* †ƒ€}zyy{}.ƒ‡‹Ž�‘ */ $"918F 8D8B 8987 8686 8789 8B8D 8F90 9191" /* ‘��‹‰‡††‡‰‹���‘‘ */ $"908F 8D8C 8988 8889 8A8D 9093 9698 999A" /* ���Œ‰ˆˆ‰Š��“–˜™š */ $"9997 9491 8D89 8786 8688 8B8E 9296 9A9C" /* ™—”‘�‰‡††ˆ‹Ž’–šœ */ $"9D9C 9B99 9693 908D 8B8A 8B8C 8E8F 9192" /* �œ›™–“��‹Š‹ŒŽ�‘’ */ $"9190 9090 8F8E 8F90 9192 9496 9798 9796" /* ‘����Ž��‘’”–—˜—– */ $"9491 8E8B 8886 8586 8789 8B8E 9193 9494" /* ”‘Ž‹ˆ†…†‡‰‹Ž‘“”” */ $"9494 9392 908F 8E8E 8E8F 8F8F 8E8D 8C8A" /* ””“’��ŽŽŽ���Ž�ŒŠ */ $"8887 8685 8586 8889 8C8E 8F91 9292 9393" /* ˆ‡†……†ˆ‰ŒŽ�‘’’““ */ $"9291 9190 8F8E 8D8C 8B8A 8988 8787 8787" /* ’‘‘��Ž�Œ‹Š‰ˆ‡‡‡‡ */ $"8788 8888 8888 8989 8989 8A8A 8B8C 8C8C" /* ‡ˆˆˆˆˆ‰‰‰‰ŠŠ‹ŒŒŒ */ $"8D8E 8D8C 8B89 8684 8688 8787 8684 8486" /* �Ž�Œ‹‰†„†ˆ‡‡†„„† */ $"8789 8A8A 8A8A 8A8A 8B8B 8B8B 8A8A 8988" /* ‡‰ŠŠŠŠŠŠ‹‹‹‹ŠŠ‰ˆ */ $"8887 8584 8382 8282 8180 8081 8282 8383" /* ˆ‡…„ƒ‚‚‚�€€�‚‚ƒƒ */ $"8384 8586 8787 8888 8888 8787 8788 8787" /* ƒ„…†‡‡ˆˆˆˆ‡‡‡ˆ‡‡ */ $"8686 8585 8586 8686 8787 8787 8687 8788" /* ††………†††‡‡‡‡†‡‡ˆ */ $"8888 8888 8888 8888 8888 8889 8888 8887" /* ˆˆˆˆˆˆˆˆˆˆˆ‰ˆˆˆ‡ */ $"8786 8585 8483 8383 8284 8583 8384 8282" /* ‡†……„ƒƒƒ‚„…ƒƒ„‚‚ */ $"8383 8484 8484 8483 8384 8485 8584 8484" /* ƒƒ„„„„„ƒƒ„„……„„„ */ $"8383 8483 8282 8180 7F7F 7E7E 7D7C 7C7C" /* ƒƒ„ƒ‚‚�€..~~}||| */ $"7C7C 7C7D 7E7E 7D7E 7E7E 7F80 8080 8080" /* |||}~~}~~~.€€€€€ */ $"807F 7F80 7F7E 7E7D 7C7C 7B7B 7A7A 7979" /* €..€.~~}||{{zzyy */ $"7979 7A7A 7B7C 7D7D 7E7E 7E7D 7D7C 7C7C" /* yyzz{|}}~~~}}||| */ $"7B7B 7A79 7878 7777 7776 7675 7676 7677" /* {{zyxxwwwvvuvvvw */ $"7878 7878 797A 7B7B 7A7A 7A79 7878 7776" /* xxxxyz{{zzzyxxwv */ $"7574 7372 7170 7070 6F6F 706F 6E6E 6E6F" /* utsrqpppooponnno */ $"6F6F 7070 7070 7071 7271 7172 7170 7070" /* oopppppqrqqrqppp */ $"706F 6E6D 6C6C 6B6B 6B6A 6A6A 6A6B 6A6B" /* ponmllkkkjjjjkjk */ $"6B6B 6C6C 6C6D 6E6F 6F70 7070 706F 6E6E" /* kklllmnoopppponn */ $"6D6C 6B6B 6A69 6968 6868 6869 696A 6A6A" /* mlkkjiihhhhiijjj */ $"6A6B 6B6B 6C6C 6C6C 6D6D 6C6C 6C6C 6C6C" /* jkkkllllmmllllll */ $"6C6C 6B6B 6B6B 6B6A 6B6B 6B6C 6C6C 6C6D" /* llkkkkkjkkkllllm */ $"6D6D 6E6E 6F70 7171 7171 7272 7272 7272" /* mmnnopqqqqrrrrrr */ $"7171 7272 7271 7272 7373 7373 7374 7575" /* qqrrrqrrssssstuu */ $"7677 7777 7878 7879 7878 7878 7777 7778" /* vwwwxxxyxxxxwwwx */ $"7877 7777 7777 7777 7878 7878 7979 7879" /* xwwwwwwwxxxxyyxy */ $"7A7A 7B7C 7D7D 7E7E 7F7F 7F7F 7E7F 7F7E" /* zz{|}}~~....~..~ */ $"7D7D 7C7C 7C7C 7C7C 7C7C 7B7B 7B7A 7B7C" /* }}||||||||{{{z{| */ $"7B7C 7C7C 7D7D 7E7E 7E7F 7F80 7F7F 7F7F" /* {|||}}~~~..€.... */ $"7F7F 8080 7F7F 7F80 8080 8080 807F 8080" /* ..€€...€€€€€€.€€ */ $"8181 8283 8484 8484 8585 8585 8686 8686" /* ��‚ƒ„„„„…………†††† */ $"8686 8686 8686 8685 8484 8383 8383 8282" /* †††††††…„„ƒƒƒƒ‚‚ */ $"8282 8383 8384 8383 8383 8484 8382 8282" /* ‚‚ƒƒƒ„ƒƒƒƒ„„ƒ‚‚‚ */ $"8281 8181 8080 8080 8080 8080 8080 8080" /* ‚���€€€€€€€€€€€€ */ $"8080 807F 7F7F 7E7E 7E7D 7D7D 7D7C 7C7C" /* €€€...~~~}}}}||| */ $"7C7C 7C7C 7D7D 7C7C 7C7B 7B7C 7C7C 7B7C" /* ||||}}|||{{|||{| */ $"7C7C 7D7D 7E7E 7E7D 7D7E 7E7D 7C7C 7D7D" /* ||}}~~~}}~~}||}} */ $"7C7C 7C7C 7B7B 7C7C 7C7C 7D7E 7E7E 7F80" /* ||||{{||||}~~~.€ */ $"8181 8282 8283 8383 8282 8181 8180 7F7F" /* ��‚‚‚ƒƒƒ‚‚���€.. */ $"7E7E 7D7D 7D7D 7D7D 7E7E 7E7F 8080 7F80" /* ~~}}}}}}~~~.€€.€ */ $"8081 8181 8181 8180 8080 8180 8080 8080" /* €������€€€�€€€€€ */ $"8080 8081 8181 8181 8081 8181 8181 8281" /* €€€�����€�����‚� */ $"8181 8080 8080 8080 8080 8081 8181 8182" /* ��€€€€€€€€€����‚ */ $"8282 8282 8283 8484 8383 8383 8383 8281" /* ‚‚‚‚‚ƒ„„ƒƒƒƒƒƒ‚� */ $"8181 8180 8080 8080 8080 8081 8283 8383" /* ���€€€€€€€€�‚ƒƒƒ */ $"8384 8485 8585 8585 8584 8383 8383 8281" /* ƒ„„………………„ƒƒƒƒ‚� */ $"8180 7F7F 807F 7F81 8180 8081 8182 8382" /* �€..€..��€€��‚ƒ‚ */ $"8283 8382 8281 8181 8181 8080 807F 7F7F" /* ‚ƒƒ‚‚�����€€€... */ $"7F7E 7E7E 7E7E 7E7E 7F7F 7F80 8181 8181" /* .~~~~~~~...€���� */ $"8181 8181 8181 8181 8181 8080 8181 8180" /* ����������€€���€ */ $"8081 8282 8282 8383 8383 8383 8484 8485" /* €�‚‚‚‚ƒƒƒƒƒƒ„„„… */ $"8586 8686 8686 8685 8585 8584 8585 8586" /* …††††††…………„………† */ $"8687 8687 8787 8787 8888 8888 8989 8A8A" /* †‡†‡‡‡‡‡ˆˆˆˆ‰‰ŠŠ */ $"8B8B 8C8B 8B8C 8C8B 8B8B 8C8C 8C8C 8C8C" /* ‹‹Œ‹‹ŒŒ‹‹‹ŒŒŒŒŒŒ */ $"8C8D 8D8E 8E8E 8F8E 8E8F 8F8F 8F8F 8F8E" /* Œ��ŽŽŽ�ŽŽ������Ž */ $"8E8E 8E8E 8D8D 8D8C 8C8B 8B8B 8C8B 8B8C" /* ŽŽŽŽ���ŒŒ‹‹‹Œ‹‹Œ */ $"8C8C 8B8A 8A8A 8A89 8989" /* ŒŒ‹ŠŠŠŠ‰‰‰ */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Eastern.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Eastern.r new file mode 100644 index 0000000..9f4ff3f --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Eastern.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 1F00 0000 0745 6173 7465" /* ...........Easte */ $"726E" /* rn */ }; data $8024 (0x1F) { $"0000 2D00 E88E 0000 772B 8080 8080 8080" /* ..-..Ž..w+€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"7F7E 8089 7872 7D7A 8285 7E7E 8385 7D7B" /* .~€‰xr}z‚…~~ƒ…}{ */ $"8383 7C75 7D82 7878 8288 7F7C 8888 7F79" /* ƒƒ|u}‚xx‚ˆ.|ˆˆ.y */ $"8483 7774 7982 7A79 8184 7F7E 8989 807C" /* „ƒwty‚zy�„.~‰‰€| */ $"8183 7876 7B7C 7777 8384 7F7F 898B 7F7D" /* �ƒxv{|wwƒ„..‰‹.} */ $"8281 7875 7E7C 7576 8185 7D80 888B 817E" /* ‚�xu~|uv�…}€ˆ‹�~ */ $"8581 7875 7C7B 7377 8084 7C80 8A89 827E" /* …�xu|{sw€„|€Š‰‚~ */ $"8581 7777 7C7B 7378 8183 7E80 8B89 8080" /* …�ww|{sx�ƒ~€‹‰€€ */ $"8480 7576 7C7A 7377 8382 7E82 8B89 7F80" /* „€uv|zswƒ‚~‚‹‰.€ */ $"857F 7475 7C77 7379 8483 7E85 8C89 8081" /* ….tu|wsy„ƒ~…Œ‰€� */ $"857D 7474 7B77 727A 8484 7F86 8E89 8081" /* …}tt{wrz„„.†Ž‰€� */ $"857C 7275 7A76 717A 8483 7F87 9088 8083" /* …|ruzvqz„ƒ.‡�ˆ€ƒ */ $"857B 7175 7974 707C 857F 7886 8F8B 8389" /* …{quytp|….x†�‹ƒ‰ */ $"837B 7474 7B75 7177 8180 7D87 918C 7F81" /* ƒ{tt{uqw�€}‡‘Œ.� */ $"847E 7778 8074 6C78 7E80 808A 8C87 8384" /* „~wx€tlx~€€ŠŒ‡ƒ„ */ $"867F 7B7B 7974 737C 7E7F 7F86 8A85 8585" /* †.{{yts|~..†Š……… */ $"857E 797B 7874 747D 827D 7E85 8A84 8286" /* …~y{xtt}‚}~…Š„‚† */ $"847C 777C 7B74 757C 837D 7F86 8985 8185" /* „|w|{tu|ƒ}.†‰…�… */ $"827A 767B 7C74 757E 837E 7F88 8A84 8085" /* ‚zv{|tu~ƒ~.ˆŠ„€… */ $"8379 767B 7B73 747F 827E 7F89 8A82 8085" /* ƒyv{{st.‚~.‰Š‚€… */ $"8379 767C 7B73 747F 827C 7E88 8A82 8186" /* ƒyv|{st.‚|~ˆŠ‚�† */ $"8379 767D 7B73 747F 827C 7E89 8B81 8087" /* ƒyv}{st.‚|~‰‹�€‡ */ $"8379 777D 7C72 7581 837B 7E8A 8980 7F86" /* ƒyw}|ru�ƒ{~Љ€.† */ $"8377 777E 7C73 7682 827B 7E8A 897E 7F85" /* ƒww~|sv‚‚{~Љ~.… */ $"8277 767E 7C74 7783 837C 8089 887E 7C8C" /* ‚wv~|twƒƒ|€‰ˆ~|Œ */ $"9072 5C75 776D 798C 8F7B 7F8C 9189 7D80" /* �r\uwmyŒ�{.Œ‘‰}€ */ $"797B 7E82 7363 7586 8873 7688 908B 8081" /* y{~‚scu†ˆsvˆ�‹€� */ $"7C82 8786 756B 808E 8870 7280 8581 787B" /* |‚‡†uk€Žˆpr€…�x{ */ $"7579 7F80 7773 8997 927C 818D 8D82 7576" /* uy.€ws‰—’|���‚uv */ $"6F71 7273 6B6A 828E 8C7A 8699 9B8F 8183" /* oqrskj‚ŽŒz†™›��ƒ */ $"7C7C 7A74 6A65 7B82 796B 798F 8E85 7C86" /* ||ztje{‚yky�Ž…|† */ $"8688 8982 7975 888B 7D6E 7989 8073 6C77" /* †ˆ‰‚yuˆ‹}ny‰€slw */ $"7A7C 7E7A 787D 9296 8A7E 8897 8C79 7178" /* z|~zx}’–Š~ˆ—Œyqx */ $"7470 6E6A 6971 878B 817D 91A0 9586 8088" /* tpnjiq‡‹�}‘ •†€ˆ */ $"827A 746D 696D 7D7B 706F 8494 877E 808E" /* ‚ztmim}{po„”‡~€Ž */ $"8C86 837B 7A7E 897F 7070 8088 766C 727F" /* Œ†ƒ{z~‰.pp€ˆvlr. */ $"807B 7C7F 8687 8E92 867E 8B99 7C64 6D7A" /* €{|.†‡Ž’†~‹™|dmz */ $"766B 6A6B 7482 8C87 8191 A19A 867D 8084" /* vkjkt‚Œ‡�‘¡š†}€„ */ $"8472 5A5D 6C78 7E74 6F80 9D9F 877F 8A97" /* „rZ]lx~to€�Ÿ‡.Š— */ $"8F81 7471 767D 7C6B 6574 8C88 726F 8193" /* ��tqv}|ketŒˆro�“ */ $"8D81 7C82 898F 8E7D 7781 9083 6865 7682" /* ��|‚‰�Ž}w��ƒhev‚ */ $"7568 6976 848D 8F85 8798 A595 7A77 8588" /* uhiv„��…‡˜¥•zw…ˆ */ $"715F 5E67 7276 766F 7991 A296 828B 9C9C" /* q_^grvvoy‘¢–‚‹œœ */ $"8372 7378 7B76 6C61 6A80 897A 6C7C 9294" /* ƒrsx{vlaj€‰zl|’” */ $"837A 848F 9188 8077 7D8C 8A73 606E 807C" /* ƒz„�‘ˆ€w}ŒŠs`n€| */ $"6763 7482 8A86 8485 93A3 9D84 7582 8D7D" /* gct‚І„…“£�„u‚�} */ $"6159 6972 716D 6E76 8A9E 9986 8298 A38D" /* aYirqmnvŠž™†‚˜£� */ $"726D 797A 7266 636B 7B89 8071 7792 9F8B" /* rmyzrfck{‰€qw’Ÿ‹ */ $"767B 9093 8477 747B 8487 7766 6B83 8972" /* v{�“„wt{„‡wfkƒ‰r */ $"6371 8D91 857E 8492 9A9A 8775 798A 8667" /* cq�‘…~„’šš‡uyІg */ $"5463 7B79 6A6A 798D 999D 8E85 92A3 9976" /* Tc{yjjy�™�Ž…’£™v */ $"6673 8174 5E5C 6879 8080 7778 8FA3 9B7E" /* fs�t^\hy€€wx�£›~ */ $"798E 9C89 716F 7A82 7E74 6767 7987 7C63" /* yŽœ‰qoz‚~tggy‡|c */ $"6988 998B 7982 959E 968B 7E7B 8688 7254" /* iˆ™‹y‚•ž–‹~{†ˆrT */ $"5873 7C68 5C71 8A97 9591 8E94 A4A3 8A6D" /* Xs|h\qŠ—•‘Ž”¤£Šm */ $"7285 7F60 5061 757A 7371 7786 9C9E 8C7B" /* r….`Pauzsqw†œžŒ{ */ $"8AA1 9879 6A7C 8881 6F67 6B73 817C 6A62" /* Š¡˜yj|ˆ�ogks�|jb */ $"7B97 9179 7692 A39A 8881 8588 8B7B 6156" /* {—‘yv’£šˆ�…ˆ‹{aV */ $"6B7F 6F57 5E83 9690 868B 99A1 A492 7970" /* k.oW^ƒ–�†‹™¡¤’yp */ $"828A 6D50 5575 8071 6874 8995 9A8F 8184" /* ‚ŠmPUu€qht‰•š��„ */ $"9AA1 8268 6F8B 8A6F 606A 7C7F 7C70 6976" /* š¡‚ho‹Šo`j|.|piv */ $"9098 7F70 83A4 A083 7884 9089 7B69 5F68" /* �˜.pƒ¤ ƒx„�‰{i_h */ $"7A7B 5F57 7598 9680 8197 A7A0 9181 787E" /* z{_Wu˜–€�—§ ‘�x~ */ $"867A 584E 6883 7861 6986 9B96 8E88 8B96" /* †zXNhƒxai†›–Žˆ‹– */ $"9D90 7069 808F 795A 607A 8678 6D6F 7989" /* ��pi€�yZ`z†xmoy‰ */ $"938B 767B 98A7 8E72 7C92 9279 6866 6C75" /* “‹v{˜§Žr|’’yhflu */ $"766B 5A68 8B9A 8777 8EA9 A990 8282 8484" /* vkZh‹š‡wŽ©©�‚‚„„ */ $"7966 535E 787E 675C 7A9A 9C88 8591 9A9B" /* yfS^x~g\zšœˆ…‘š› */ $"8F7E 6E76 8982 6456 7189 8169 697E 8A8D" /* �~nv‰‚dVq‰�ii~Š� */ $"877F 7B8B 9F97 7A71 8B9A 8567 6574 7A73" /* ‡.{‹Ÿ—zq‹š…getzs */ $"6964 677D 938D 797D 9FAF 987D 7F8B 968C" /* idg}“�y}Ÿ¯˜}.‹–Œ */ $"3D55 5275 8D6D 607E 9596 938A 7F86 9F8F" /* =URu�m`~•–“Š.†Ÿ� */ $"6576 9180 7B8C 7157 839B 6944 6A97 8076" /* ev‘€{ŒqWƒ›iDj—€v */ $"8F87 83AA B487 6D84 9477 605C 5A70 8877" /* �‡ƒª´‡m„”w`\Zpˆw */ $"5F7F 9E90 888E 7F75 94A3 7159 8DA4 7A72" /* _.ž�ˆŽ.u”£qY�¤zr */ $"857A 6B7D 7D57 5179 8A78 7F92 95AB B795" /* …zk}}WQyŠx.’•«·• */ $"7A86 8D6C 595E 544F 7B8F 6A6A A9B8 8C82" /* z†�lY^TO{�jj©¸Œ‚ */ $"9184 7381 805D 6392 967E 7F88 8487 825B" /* ‘„s�€]c’–~.ˆ„‡‚[ */ $"4D6C 7866 6E8F 9497 BEBE 897F A08F 5141" /* Mlxfn�”—¾¾‰. �QA */ $"5A55 5071 7C6F 8BB8 B193 9191 8683 785B" /* ZUPq|o‹¸±“‘‘†ƒx[ */ $"5981 8D6F 7994 877C 9084 5256 867E 566C" /* Y��oy”‡|�„RV†~Vl */ $"9D9B 96B1 A887 8D99 7850 4E58 5664 7167" /* �›–±¨‡�™xPNXVdqg */ $"7BAD B685 8EA1 9977 797A 5560 9181 6C84" /* {­¶…Ž¡™wyzU`‘�l„ */ $"8D85 867D 6561 717E 6668 848E B4B7 9D89" /* �…†}eaq~fh„Ž´·�‰ */ $"999E 6153 684E 3A61 8267 6BB3 C497 9EAD" /* ™žaShN:a‚gk³Ä—ž­ */ $"8A80 8A67 4463 8574 6C8E 957E 99A8 6750" /* Š€ŠgDc…tlŽ•~™¨gP */ $"8082 5259 8C8D 80AE C794 89B1 995A 545B" /* €‚RYŒ�€®Ç”‰±™ZT[ */ $"4447 6566 5E8E BEAB A2BA A985 938D 4D3E" /* DGef^޾«¢º©…“�M> */ $"737C 5461 948C 7DA0 9F68 6791 825B 6588" /* s|Ta”Œ} Ÿhg‘‚[eˆ */ $"878F A89A 869D A376 5D63 5346 6271 5967" /* ‡�¨š†�£v]cSFbqYg */ $"ABBB 939A B69F 838C 7C4D 517E 7859 6A8C" /* «»“š¶ŸƒŒ|MQ~xYjŒ */ $"8E8B 8F7A 6A81 8C70 637F 918E A4A9 8684" /* Ž‹�zj�Œpc.‘ޤ©†„ */ $"A693 5346 625A 4861 756B 85C2 BE95 9BB1" /* ¦“SFbZHauk…¾•›± */ $"9D7C 6F5C 4960 7A64 5881 9D91 9192 756C" /* �|o\I`zdX��‘‘’ul */ $"8E89 5452 8D9E 8596 A891 8EA6 8B48 446A" /* މTR�ž…–¨‘ަ‹HDj */ $"5A5D 693A 4D92 B2B0 ABC3 BB93 7F90 5B39" /* Z]i:M’²°«Ã»“.�[9 */ $"5D89 5548 7199 828C 8270 7CBC 9446 57C7" /* ]‰UHq™‚Œ‚p|¼”FWÇ */ $"BE77 71A4 A19F 8548 246C 863B 2575 9579" /* ¾wq¤¡Ÿ…H$l†;%u•y */ $"9ECB B4AE DBB5 6F73 8F46 265E 6D21 429B" /* žË´®.µos�F&^m!B› */ $"A976 969F 94AC D279 4893 D06F 447D 9A6A" /* ©v–Ÿ”¬ÒyH“ÐoD}šj */ $"7369 3849 A67F 2C63 CEB1 84B7 CF90 93B4" /* si8I¦.,cα„·Ï�“´ */ $"763D 6162 1C3C 8E70 3999 E1A8 82B7 A37F" /* v=ab.<Žp9™.¨‚·£. */ $"988D 293D A497 2755 B9AC 7796 8964 88AF" /* ˜�)=¤—'U¹¬w–‰dˆ¯ */ $"5029 85AC 5C66 B3A5 71A0 AE69 6294 6D3E" /* P)…¬\f³¥q ®ib”m> */ $"80A0 5252 C2C2 6369 A785 6679 5C2F 7FBF" /* € RRÂÂci§…fy\/.¿ */ $"7646 B5E9 A685 A483 677C 630C 2A7E 6935" /* vFµ.¦…¤ƒg|c.*~i5 */ $"87C9 A69C DCCE A0A7 9657 5C6D 3505 498B" /* ‡É¦œ.Π§–W\m5.I‹ */ $"6745 87AF 9A9D B195 95C9 BA70 7BA2 7552" /* gE‡¯š�±••ɺp{¢uR */ $"4041 2E43 5954 4D9B BEA2 A6F0 E8B2 A2B6" /* @A.CYTM›¾¢¦..²¢¶ */ $"824E 3A32 1A2D 3E33 4CA5 CCA8 A8DD EEBF" /* ‚N:2.->3L¥Ì¨¨..¿ */ $"997F 7570 6935 2E59 7E59 5074 9B8D 8B92" /* ™.upi5.Y~YPt›�‹’ */ $"9F9C A99D 9297 A989 6460 745A 3636 5A6D" /* Ÿœ©�’—©‰d`tZ66Zm */ $"6E78 97BE D3C7 ADAA AF96 5A3C 3A3E 3139" /* nx—¾ÓÇ­ª¯–Z<:>19 */ $"4B71 95B9 B3B5 D2DF A679 7A7B 4828 3751" /* Kq•¹³µÒ.¦yz{H(7Q */ $"515D 7086 A2C3 B39A A5B9 9A79 716E 6365" /* Q]p†¢Ã³š¥¹šyqnce */ $"5541 5279 6C4E 6FA8 A18B ABD1 BDA7 A69A" /* UARylNo¨¡‹«Ñ½§¦š */ $"7969 532C 213D 3F32 4D8B B5C4 CBD2 E3EF" /* yiS,!=?2M‹µÄËÒ.. */ $"CE82 606F 5717 0929 3A3E 5F7D 93B4 D9C9" /* ΂`oW.Æ):>_}“´.É */ $"BAC7 CFA8 8B82 7C5B 4636 404A 4429 477F" /* ºÇϨ‹‚|[F6@JD)G. */ $"9A87 9FD2 EBE1 D7C2 AE9C 803F 0D10 1E15" /* š‡ŸÒ..×®œ€?Â... */ $"0E2F 6CAB C0C9 E4FF FACE A79E 6F38 1B22" /* ./l«ÀÉ...Χžo8." */ $"181E 304C 669E BBB6 ADD0 DBBC 9489 8482" /* ..0Lfž»¶­Ð.¼”‰„‚ */ $"6940 355F 6D40 3468 8A7A 84A2 ACB3 CFBD" /* i@5_m@4hŠz„¢¬³Ï½ */ $"999E AC73 3E44 552F 223E 607B 9EA1 A7D5" /* ™ž¬s>DU/">`{ž¡§Õ */ $"F7C0 8998 A262 3239 3C37 4F5E 4F79 C4C1" /* .À‰˜¢b29<7O^OyÄÁ */ $"8EA4 D4BF 8989 8A73 665E 3F48 7063 2F53" /* Ž¤Ô¿‰‰Šsf^?Hpc/S */ $"9B98 7094 C2C3 BFC9 A38D A896 3310 444C" /* ›˜p”Âÿɣ�¨–3.DL */ $"1215 5279 94BB CAD1 F5FA BE8C 9F83 2D0D" /* ..Ry”»ÊÑ..¾ŒŸƒ- */ $"2927 172F 536A A4D2 B8A5 E1F9 B474 8D99" /* )'./Sj¤Ò¸¥..´t�™ */ $"6E48 3D37 526C 4E2A 60A2 9174 9AC2 BFBC" /* nH=7RlN*`¢‘tšÂ¿¼ */ $"C3AF A2A7 8349 475A 3206 2C69 6962 8BBE" /* ƒIGZ2.,iib‹¾ */ $"DEE6 CCAA B7CA 9139 2C54 552F 2440 709B" /* ..̪·Ê‘9,TU/$@p› */ $"9D84 95CC D29E 89A0 9C7A 6A6C 645E 564E" /* �„•ÌÒž‰ œzjld^VN */ $"5671 705C 8393 AB91 99BF C7C1 9254 6188" /* Vqp\ƒ“«‘™¿ÇÁ’Taˆ */ $"590F 1648 788B 7688 D2EC CAB4 9885 866A" /* Y..Hx‹vˆÒ.Ê´˜…†j */ $"2D33 5545 4977 8B8F A2A4 A8BF A876 7E9E" /* -3UEIw‹�¢¤¨¿¨v~ž */ $"8C68 5154 7D87 543D 6489 9585 6582 CEC9" /* ŒhQT}‡T=d‰•…e‚ÎÉ */ $"8885 A4A0 8F6E 4B57 6C50 3E57 686A 7D8F" /* ˆ…¤ �nKWlP>Whj}� */ $"A4BA B0A7 C1C7 9D77 6359 664C 0C15 6988" /* ¤º°§ÁÇ�wcYfL..iˆ */ $"6B71 9BCD E5C7 9597 AA98 6C44 466D 704B" /* kq›Í.Ç•—ª˜lDFmpK */ $"4D6E 7474 7B75 7FA1 9D92 BFD2 A18B A397" /* Mntt{u.¡�’¿Ò¡‹£— */ $"6436 2531 474C 4858 91D7 E4AE A5D8 D082" /* d6%1GLHX‘×.®¥ØÐ‚ */ $"584F 4958 5A32 4292 A27A 88A7 9C89 8E8B" /* XOIXZ2B’¢zˆ§œ‰Ž‹ */ $"7E7C 8683 7C8C 9469 5285 934D 3C7B 907F" /* ~|†ƒ|Œ”iR…“M<{�. */ $"8787 86B7 C882 6194 9869 4759 646E 736D" /* ‡‡†·È‚a”˜iGYdnsm */ $"5E7E B9B0 7689 BE9B 7187 9163 4B53 584B" /* ^~¹°v‰¾›q‡‘cKSXK */ $"6C7E 698D CAB4 7BAA CA94 6564 4D55 786A" /* l~i�Ê´{ªÊ”edMUxj */ $"4155 9DAF 7163 A3AC 7481 A27B 82BB 965D" /* AU�¯qc£¬t�¢{‚»–] */ $"8F9C 4532 6C5C 3258 8287 A5C9 BCAD D0CE" /* �œE2l\2X‚‡¥É¼­ÐÎ */ $"7A45 717A 2A14 5667 5F93 A579 9DDE A85E" /* zEqz*.Vg_“¥y�.¨^ */ $"8AB3 7A5E 8285 7286 8A5F 5C87 723A 5A9B" /* гz^‚…r†Š_\‡r:Z› */ $"7E5D 9CC4 9D9F C49B 779D 8D35 347F 6D2A" /* ~]œÄ�ŸÄ›w��54.m* */ $"4688 867E A5A7 93B9 D18C 69A2 9E49 3F6B" /* Fˆ†~¥§“¹ÑŒi¢žI?k */ $"5844 717A 5F8D C29A 75AE C77B 598C 8F58" /* XDqz_�šu®Ç{YŒ�X */ $"5D81 6C69 9B8B 537B B27A 4B83 A07C 839E" /* ]�li›‹S{²zKƒ |ƒž */ $"8786 A98E 4B58 8F6E 3358 9688 7BA9 B291" /* ‡†©ŽKX�n3X–ˆ{©²‘ */ $"A6B3 6B4D 8576 293D 837C 6E97 A397 ADAF" /* ¦³kM…v)=ƒ|n—£—­¯ */ $"7C67 8F8E 5047 8391 6870 937E 7594 9046" /* |g�ŽPGƒ‘hp“~u”�F */ $"53A7 6753 AEC4 898F B293 7778 6941 4A5E" /* S§gS®Ä‰�²“wxiAJ^ */ $"5545 6798 9CA2 B9BB A6C5 B461 5D9A 6E0C" /* UEg˜œ¢¹»¦Å´a]šn. */ $"2872 673E 6996 A2AB ACAC B6C8 9E6B 6983" /* (rg>i–¢«¬¬¶Èžkiƒ */ $"6637 4863 5C5D 8E85 6B99 C38E 6BA8 AF82" /* f7Hc\]Ž…k™ÃŽk¨¯‚ */ $"778F 8583 7B56 4F75 8044 4183 AC85 73B0" /* w�…ƒ{VOu€DAƒ¬…s° */ $"C9A0 8B98 7A83 5E41 2D6F 906A 8597 9C9C" /* É ‹˜zƒ^A-o�j…—œœ */ $"9285 6F59 968F 3A76 AF94 7D6B 8EAB 7562" /* ’…oY–�:v¯”}kŽ«ub */ $"836B 8784 426A A872 5D8E AAA8 8897 A36D" /* ƒk‡„Bj¨r]Žª¨ˆ—£m */ $"7183 4037 7477 7B76 91CB B289 9179 7A8B" /* qƒ@7tw{v‘˲‰‘yz‹ */ $"3C33 8E96 6764 91AA 7F67 9384 85A2 7F7B" /* <3Ž–gd‘ª.g“„…¢.{ */ $"A48C 665B 5573 604F 8187 84B9 AC70 8DAF" /* ¤Œf[Us`O�‡„¹¬p�¯ */ $"9750 5BA2 996B 7374 7079 411D 6293 898E" /* —P[¢™kstpyA.b“‰Ž */ $"B4E1 E197 A0B0 6238 341E 3358 6A7C 81B6" /* ´..— °b84.3Xj|�¶ */ $"BE8E ACBA 8AA0 9C5A 637A 785A 3959 856B" /* ¾Ž¬ºŠ œZczxZ9Y…k */ $"5F81 91BA B786 7FA0 A672 4684 B463 538B" /* _�‘º·†. ¦rF„´cS‹ */ $"846D 6B58 637E 7C85 90B2 C19C 8B92 715E" /* „mkXc~|…�²Áœ‹’q^ */ $"674E 4866 9BA9 6D77 C2A7 556A 7B83 8663" /* gNHf›©mw§Uj{ƒ†c */ $"6499 A388 607B B278 4C88 8C88 8068 7C65" /* d™£ˆ`{²xLˆŒˆ€h|e */ $"6B8B 6466 A8A0 918B A9A5 8373 5333 6B6F" /* k‹df¨ ‘‹©¥ƒsS3ko */ $"405C AECF 9E93 B9B8 8559 4B58 5F5A 6264" /* @\®Ïž“¹¸…YKX_Zbd */ $"8BAE 9588 AFA2 788F 9066 6E8F 7047 5F89" /* ‹®•ˆ¯¢x��fn�pG_‰ */ $"704F 72A0 AA94 829C BAA1 705E 769B 6730" /* pOr ª”‚œº¡p^v›g0 */ $"6698 6450 7C7E 708E B09C 9BBF B991 7E6A" /* f˜dP|~pްœ›¿¹‘~j */ $"5450 312D 5179 8C89 95D6 DC82 74AB 9E4E" /* TP1-QyŒ‰•Ö.‚t«žN */ $"4676 7A6B 675E 6499 895D 7EAA 9F97 9C8E" /* Fvzkg^d™‰]~ªŸ—œŽ */ $"7F6E 7363 3E57 9A95 6F97 C3A9 7676 6D59" /* .nsc>Wš•o—évvmY */ $"604F 468B B77C 82C6 C383 6074 866B 5169" /* `OF‹·|‚ÆÃƒ`t†kQi */ $"7279 8986 7270 9398 7C7C 9286 9B9C 555C" /* ry‰†rp“˜||’†›œU\ */ $"A286 415E 908F 6E6C 9294 786C 8494 9485" /* ¢†A^��nl’”xl„””… */ $"848F 9A89 4E4E 765D 477E 8981 BFD7 A17F" /* „�š‰NNv]G~‰�¿×¡. */ $"9795 5E2B 4971 4861 5C92 CCB4 9392 A2A1" /* —•^+IqHa\’Ì´“’¢¡ */ $"7862 947F 435C 7142 5584 7277 B5D4 ABA1" /* xb”.C\qBU„rwµÔ«¡ */ $"C4AA 6956 4E3B 4960 6D5C 72D2 D970 6FBF" /* ĪiVN;I`m\rÒ.po¿ */ $"A156 5E7F 797C 8E85 7983 896F 676F 7075" /* ¡V^.y|Ž…yƒ‰ogopu */ $"7883 9885 7FA7 9277 9E91 687A 8F71 4544" /* xƒ˜….§’wž‘hz�qED */ $"748A 6958 90D6 B981 93AA 7C57 5C4B 5271" /* tŠiX�Ö¹�“ª|W\KRq */ $"808A 9298 B3A1 7276 795F 5F70 6F70 969F" /* €Š’˜³¡rvy__pop–Ÿ */ $"707C B382 4E86 B38F 6373 9E87 4548 6B60" /* p|³‚N†³�csž‡EHk` */ $"6791 9395 C9D7 A279 8576 433F 4B3D 5D97" /* g‘“•É×¢y…vC?K=]— */ $"9D94 9BBE CA87 6597 8C48 4D7B 744C 537C" /* �”›¾Ê‡e—ŒHM{tLS| */ $"8E88 8593 B5C0 9E88 8470 6657 313F 6A6F" /* Žˆ…“µÀžˆ„pfW1?jo */ $"849E 95A1 BDB8 9275 7490 6B40 6480 6536" /* „ž•¡½¸’ut�k@d€e6 */ $"5BA0 8264 ACD5 AB90 A78A 716A 6134 2870" /* [ ‚d¬Õ«�§Šqja4(p */ $"837B 93B3 B38C 9293 514D 967E 3778 DDAB" /* ƒ{“³³Œ’“QM–~7x.« */ $"698D A170 494A 5D5E 6F9F 9184 C1BF 877C" /* i�¡pIJ]^oŸ‘„Á¿‡| */ $"8D7E 465A 9563 457F 9075 7395 A58D 8BB0" /* �~FZ•cE.�us•¥�‹° */ $"AD6B 5285 7E37 2C64 938E 8BAE BFB9 AD80" /* ­kR…~7,d“Ž‹®¿¹­€ */ $"6659 4D4B 344C 9287 7BC0 D49C 8DB7 9E53" /* fYMK4L’‡{ÀÔœ�·žS */ $"5885 4C0F 4F8D 5E44 A1E7 C19F CFD6 856A" /* X…L.O�^D¡.ÁŸÏÖ…j */ $"6112 094D 4831 76DB E5B8 D5EC 9A5B 6450" /* a.ÆMH1v..¸Õ.š[dP */ $"191C 607F 627E CAB9 87A0 AA84 7376 7F82" /* ..`.b~ʹ‡ ª„sv.‚ */ $"6E66 6B6E 796B 5775 A2AF 8C78 ADB9 6A51" /* nfknykWu¢¯Œx­¹jQ */ $"7B7B 5865 9196 7080 B484 3C6A 9961 4C93" /* {{Xe‘–p€´„B™°€„ */ $"B8A5 7596 A765 5693 8D45 417D 7E57 7FA5" /* ¸¥u–§eV“�EA}~W.¥ */ $"859B CBA3 6D74 8F7B 3D44 8D9F 1E6B ABB4" /* …›Ë£mt�{=D�Ÿ.k«´ */ $"71A5 916C 885F 7287 68BA 8F75 B56D 6D46" /* q¥‘lˆ_r‡hº�uµmmF */ $"268B 6E5D CBA5 A9C9 A08B 3653 A73B 42A8" /* &‹n]Ë¥©É ‹6S§;B¨ */ $"A4A1 5C63 982D 479D 75A5 DBE5 D48B 985F" /* ¤¡\c˜-G�u¥..Ô‹˜_ */ $"031C 2F24 5D90 E8EF C2EB B05C 614F 4822" /* ../$]�..Â.°\aOH" */ $"43C0 8657 9B89 9288 6DAC 9AA0 C46C 5859" /* CÀ†W›‰’ˆm¬š ÄlXY */ $"3844 1F60 C89B C4FC CF9D 6557 4D08 2C6C" /* 8D.`È›Ä.Ï�eWM.,l */ $"6B8F A7C7 B06B A9AE 5667 8E9F 8760 7E56" /* k�§Ç°k©®VgŽŸ‡`~V */ $"3D77 4444 98B4 D6A8 9ADC 8036 5E4C 444B" /* =wDD˜´Ö¨š.€6^LDK */ $"7FBB 8093 CC7E 6874 646D 537C B688 829A" /* .»€“Ì~htdmS|¶ˆ‚š */ $"968A 6575 7152 938D 4862 869A 7B5E B2C3" /* –ŠeuqR“�Hb†š{^²Ã */ $"99A1 8C83 582A 623D 2494 A1A0 CAC9 A888" /* ™¡ŒƒX*b=$”¡ Êɨˆ */ $"7596 4E4B 5E52 816C 6796 4D84 CE74 71A9" /* u–NK^R�lg–M„Îtq© */ $"D6C3 5F70 722B 6424 577D 60C6 C97A DF8F" /* ÖÃ_pr+d$W}`ÆÉz.� */ $"7B8C 3374 702E CB74 67C6 508D 7F32 B580" /* {Œ3tp.ËtgÆP�.2µ€ */ $"77DD 889C 6C46 A72A 23A9 77B4 C99B DD93" /* w.ˆœlF§*#©w´É›.“ */ $"7874 0B46 6C4C 9683 BFDF 6CAC 9229 7670" /* xt.FlL–ƒ¿.l¬’)vp */ $"7594 72C9 A854 8E4F 3B63 3097 BD84 CCBF" /* u”rɨTŽO;c0—½„Ì¿ */ $"A69E 374E 624D 7F6E 8AC9 9D97 6E3D 7A57" /* ¦ž7NbM.nŠÉ�—n=zW */ $"4286 A0AE A8B8 BF5C 5F87 4843 6A8A 9A68" /* B† ®¨¸¿\_‡HCjŠšh */ $"83AA 5E5B 8183 9BA2 B6B4 8DA8 6D08 2E63" /* ƒª^[�ƒ›¢¶´�¨m..c */ $"3C41 85D7 E5BD CFC3 7559 513C 2C37 7993" /* ,Z^di‘É“•.¢  */ $"7A6D 4C16 1134 636B 86DB FADB BEAE 722F" /* zmL..4ck†...¾®r/ */ $"3D2D 0344 A59D 9DC9 F1B9 7BA5 5A12 6B6C" /* =-.D¥��É.¹{¥Z.kl */ $"2845 97B2 6782 E9AA 7BBB AA72 5960 4A1F" /* (E—²g‚.ª{»ªrY`J. */ $"5C75 4A94 E2C8 AFB4 AB69 4F67 2118 7E99" /* \uJ”.ȯ´«iOg!.~™ */ $"838D C2DD 958D 8439 7078 2B57 8C93 7478" /* ƒ�Â.•�„9px+WŒ“tx */ $"D79A 55C3 A853 7374 5936 62A3 6268 D0B8" /* ךUèSstY6b£bhи */ $"8FB4 A15E 4685 4507 7BB5 616E D1E3 9183" /* �´¡^F…E.{µanÑ.‘ƒ */ $"C387 416E 4C1D 8588 5A4A A7BD 56AE DC71" /* ÇAnL.…ˆZJ§½V®.q */ $"6ABC 8A40 51A1 6E38 A6B1 4FAC A72E 429A" /* j¼Š@Q¡n8¦±O¬§.Bš */ $"710F 85FE 9D75 F0DC 654B 6432 0256 7E1D" /* q.….�u..eKd2.V~. */ $"8FF7 AE8C DBE7 604F CE6D 0D8C 9512 38A6" /* �.®Œ..`OÎmÂŒ•.8¦ */ $"994B 94F7 B38C C680 4659 3C13 1F95 D185" /* ™K”.³ŒÆ€FY<..•Ñ… */ $"C1FF C584 8F50 0D12 362F 3CB9 D4A6 E7F0" /* Á.Å„�PÂ.6/<¹Ô¦.. */ $"A486 936B 1630 752F 1E8D A985 92DB F293" /* ¤†“k.0u/.�©…’..“ */ $"98C4 4232 6012 0C5A A3A3 88ED F393 9CA5" /* ˜ÄB2`..Z££ˆ..“œ¥ */ $"360E 1737 2C3A C4D9 A9EA F3B1 846D 550F" /* 6..7,:Ä.©..±„mU. */ $"2154 134E C9AD ACE4 FCD1 7EA1 6704 3C33" /* !T.NÉ­¬..Ñ~¡g.<3 */ $"0138 92B0 98C4 FFD8 85E8 970D 2137 1001" /* .8’°˜Ä.Ø….—Â!7.. */ $"56C2 5F8A FCE4 9DD1 C95A 2B76 4B01 57AD" /* VÂ_Š..�ÑÉZ+vK.W­ */ $"6B69 C6ED 917C BC65 2E6B 4F3E 729C A79B" /* kiÆ.‘|¼e.kO>rœ§› */ $"D8E7 818F 9D30 294B 2316 63AC 9190 F1EF" /* Ø.���0)K#.c¬‘�.. */ $"9EBE C851 2C6C 4603 36AA 8151 B9F6 9C85" /* ž¾ÈQ,lF.6ª�Q¹.œ… */ $"D995 356F 833F 3B8D A55F 8ADB 9766 968E" /* .•5oƒ?;�¥_Š.—f–Ž */ $"5443 6766 5180 B2A7 98B9 D59F 5E5D 5C53" /* TCgfQ€²§˜¹ÕŸ^]\S */ $"3A2A 6F93 89B9 C0AF AB94 915B 3C75 5848" /* :*o“‰¹À¯«”‘[EyU›Ô¼×Ö. + */ $"4437 032C 426D AEB7 D6C2 ABB2 6F6D 7243" /* D7.,Bm®·Ö«²omrC */ $"7C85 6689 7A85 7949 8C8B 6199 8881 8E71" /* |…f‰z…yIŒ‹a™ˆ�Žq */ $"8363 75D0 877D DDAC 6E57 4B35 043C 7144" /* ƒcuЇ}.¬nWK5.j */ $"9886 92AD A187 8C8D 5E52 7E6E 4F6F 785D" /* ˜†’­¡‡Œ�^R~nOox] */ $"6386 8D82 B4E8 BEA9 C08E 5038 1705 2A5E" /* c†�‚´.¾©ÀŽP8..*^ */ $"6275 D5F8 BFAC CDB3 6956 7456 3459 6142" /* buÕ.¿¬Í³iVtV4YaB */ $"598D 8F81 B5DF AC9C B177 4147 4F44 4892" /* Y���µ.¬œ±wAGODH’ */ $"C59A 9CC3 A05F 3548 6248 65A1 B1CC C49B" /* ÅšœÃ _5HbHe¡±ÌÄ› */ $"947F 614B 3D5A 6465 7C7B 8895 90A8 ABA6" /* ”.aK=Zde|{ˆ•�¨«¦ */ $"B4A2 8E68 3B3F 2E1C 3E77 BDBB B4F5 E586" /* ´¢Žh;?..>w½»´..† */ $"695D 4927 296E 7385 CCAA 8398 9070 4568" /* i]I')ns…̪ƒ˜�pEh */ $"9D64 70BA 8A5D 819E 754F A4C0 6C7A 996C" /* �dpºŠ]�žuO¤Àlz™l */ $"4338 5B60 66B1 B5B6 EBC3 8669 5D58 172A" /* C8[`f±µ¶.Æi]X.* */ $"7D68 83B2 93A0 9D83 816E 8E89 71B3 8F4F" /* }hƒ²“ �ƒ�nމq³�O */ $"8985 4A3C 70A4 6062 C596 608B 977B 6CAE" /* ‰…J–È¢™Å´Ra‹vk-^Ê */ $"8669 EAD3 5971 AB6E 1757 9541 4DA4 8164" /* †i.ÓYq«n.W•AM¤�d */ $"95B3 9492 D4B2 6EA0 8625 2B4D 3D2D 76C6" /* •³”’Ô²n †%+M=-vÆ */ $"9BAE F6B9 8091 6B3E 4974 6344 AEC8 4E67" /* ›®.¹€‘k>ItcD®ÈNg */ $"B67A 3A6D B57B 5DCD B955 83A5 6043 859C" /* ¶z:mµ{]͹Uƒ¥`C…œ */ $"4F71 BD68 438B 8652 65C0 BA71 B0D3 7353" /* Oq½hC‹†ReÀºq°ÓsS */ $"5F51 4348 7780 91D2 AB80 A886 4E56 6B6D" /* _QCHw€‘Ò«€¨†NVkm */ $"608F B37F 8DAE 7667 8074 5D6A 9471 4D97" /* `�³.�®vg€t]j”qM— */ $"9D56 79C4 B171 92CF 7633 6B5D 2E4D 7884" /* �Vyıq’Ïv3k].Mx„ */ $"88C0 D691 99B5 714E 6068 5950 8693 6486" /* ˆÀÖ‘™µqN`hYP†“d† */ $"A689 7F86 9790 7478 7675 785D 72A3 917E" /* ¦‰.†—�txvux]r£‘~ */ $"959D 815C 5D58 486A 8484 ADD1 C9A9 9595" /* •��\]XHj„„­ÑÉ©•• */ $"5F29 474A 2B4E 8A9B 84A1 DDB7 8DB1 AA86" /* _)GJ+NŠ›„¡.·�±ª† */ $"6D57 563E 2D42 496F A2AC C0D1 D1B9 7864" /* mWV>-BIo¢¬ÀÑѹxd */ $"653B 3754 728D 91A3 AD88 7371 6C60 5283" /* e;7Tr�‘£­ˆsql`Rƒ */ $"A889 92AA 9C89 6E6E 776A 7472 6B82 7060" /* ¨‰’ªœ‰nnwjtrk‚p` */ $"6D6E 909B 8EBA C1A1 916F 5E48 2F4E 5D6C" /* mn�›ŽºÁ¡‘o^H/N]l */ $"9AAC BEAB 889C 7F4C 5A6B 777A 84A2 918D" /* 𬾫ˆœ.LZkwz„¢‘� */ $"9165 6C81 6C6E 6F87 9063 748F 7A85 91A0" /* ‘el�lno‡�ct�z…‘  */ $"AA90 9D8A 5059 4E39 575E 7EAE B1B5 ADAE" /* ª��ŠPYN9W^~®±µ­® */ $"A96B 5D6F 5A5C 616B 8177 7F82 7591 9589" /* ©k]oZ\ak�w.‚u‘•‰ */ $"959B A086 7189 6A56 7766 5D75 7F83 6C79" /* •› †q‰jVwf]u.ƒly */ $"9C89 8EA5 A0AE A280 735B 5247 314E 737E" /* œ‰Ž¥ ®¢€s[RG1Ns~ */ $"94AB BCBA A99D 887A 7461 5E66 625F 6472" /* ”«¼º©�ˆzta^fb_dr */ $"747B 9B9C 93A4 A796 7A68 736D 5E6C 8297" /* t{›œ“¤§–zhsm^l‚— */ $"9885 807A 695D 525B 768B 9BAA B7B5 A48C" /* ˜…€zi]R[v‹›ª·µ¤Œ */ $"756A 554D 615C 5976 827C 7E94 AA96 96B6" /* ujUMa\Yv‚|~”ª––¶ */ $"A48B 8267 554E 4F51 578C AE97 9DAF 9A75" /* ¤‹‚gUNOQWŒ®—�¯šu */ $"6364 585A 8592 93B1 B69C 7F75 643D 4B62" /* cdXZ…’“±¶œ.ud=Kb */ $"4C67 9696 97A9 BFAB 869F 9E69 665E 4549" /* Lg––—©¿«†Ÿžif^EI */ $"4D56 5B7C BCB0 A2CF C294 8272 5739 4F67" /* MV[|¼°¢Ï”‚rW9Og */ $"4C6C A292 8C9F 9F84 7A97 8260 8A91 6B72" /* Ll¢’ŒŸŸ„z—‚`Š‘kr */ $"8A81 5D69 9271 648E 8277 8D8F 8380 A5A8" /* Š�]i’qdŽ‚w��ƒ€¥¨ */ $"7180 9B6F 5B63 5B52 5A7A 807B A7B5 A2AD" /* q€›o[c[RZz€{§µ¢­ */ $"A68C 817E 6A4B 5464 4A55 8383 7C99 B5A6" /* ¦Œ�~jKTdJUƒƒ|™µ¦ */ $"96A5 9271 817D 5459 8286 6068 937D 6483" /* –¥’q�}TY‚†`h“}dƒ */ $"816A 819F 9688 A1AB 867E 8767 566B 6856" /* �j�Ÿ–ˆ¡«†~‡gVkhV */ $"6581 7E78 8F9A 8C8E 9892 8D8E 7A70 8780" /* e�~x�šŒŽ˜’�Žzp‡€ */ $"565E 8B80 5B73 8E70 6691 8765 90B7 978E" /* V^‹€[sŽpf‘‡e�·—Ž */ $"B4AA 7673 7941 285B 623E 65AD A793 C4DA" /* ´ªvsyA([b>e­§“Ä. */ $"A18A A082 4E55 5836 4A78 655F 9CB9 9B9E" /* ¡Š ‚NUX6Jxe_œ¹›ž */ $"B9A2 818E 814C 5375 5E51 7C8F 7B8F B08D" /* ¹¢�Ž�LSu^Q|�{�°� */ $"6897 9F52 5B9E 8155 8AB3 7E6A 9E88 5070" /* h—ŸR[ž�Uг~jžˆPp */ $"814C 5699 9668 99D6 9D7A AA97 5053 784C" /* �LV™–h™Ö�zª—PSxL */ $"236C 9462 7FC0 B09D B7B4 7C73 9158 2A64" /* #l”b.À°�·´|s‘X*d */ $"6C41 639A 9783 A7C0 877E A26E 4D7E 875E" /* lAcš—ƒ§À‡~¢nM~‡^ */ $"69AA A067 91A0 535A 8863 3D70 A97B 71C6" /* iª g‘ SZˆc=p©{qÆ */ $"B782 A9B3 795C 8279 223E 874A 3D93 A889" /* ·‚©³y\‚y">‡J=“¨‰ */ $"98D6 C07F ACA9 4D59 7E55 395C 8869 62A4" /* ˜ÖÀ.¬©MY~U9\ˆib¤ */ $"8F6B A2A6 787D A7A2 687F A467 5F88 6751" /* �k¢¦x}§¢h.¤g_ˆgQ */ $"7084 6457 9B96 639E B789 92AE 9D68 6E92" /* p„dW›–cž·‰’®�hn’ */ $"472A 7F73 4675 ADA2 7AA8 C36E 76AA 6A4B" /* G*.sFu­¢z¨ÃnvªjK */ $"7D90 6456 988F 5585 9B6A 7298 946A 79AE" /* }�dV˜�U…›jr˜”jy® */ $"8162 968F 6D73 7F72 5C78 7F51 7AA5 808A" /* �b–�ms.r\x.Qz¥€Š */ $"ADA8 9385 8D6A 476C 5A39 6C8B 8087 A9BB" /* ­¨“…�jGlZ9l‹€‡©» */ $"8D8C B278 5484 804C 518C 854F 7CA8 7D7B" /* �Œ²xT„€LQŒ…O|¨}{ */ $"9C8F 737A 916C 5992 926F 8BA9 9975 7988" /* œ�sz‘lY’’o‹©™uyˆ */ $"5340 6959 507C 97A0 A3B8 BFA1 9C8B 6368" /* S@iYP|— £¸¿¡œ‹ch */ $"5E38 405A 6564 769E A5A6 BCB0 9C9A 8D68" /* ^8@Zedvž¥¦¼°œš�h */ $"4A63 6A42 5C8E 8178 92A2 7F68 9184 5B80" /* JcjB\Ž�x’¢.h‘„[€ */ $"9B8D 8A95 A086 717C 6150 6761 566A 8A96" /* ›�Š• †q|aPgaVjŠ– */ $"8397 BBA8 9599 907D 6556 4E4D 5559 7496" /* ƒ—»¨•™�}eVNMUYt– */ $"93A3 BDAD 9586 816F 4C5C 7161 7087 8B8D" /* “£½­•†�oL\qap‡‹� */ $"8C94 8370 8F87 5B75 927D 6677 937F 7391" /* Œ”ƒp�‡[u’}fw“.s‘ */ $"8C7B 8281 7466 6E79 6F7C 9092 9A99 9485" /* Œ{‚�tfnyo|�’š™”… */ $"7073 624E 6670 7686 8599 A591 8786 9182" /* psbNfpv†…™¥‘‡†‘‚ */ $"5C75 8B67 6378 786E 6F88 8677 939C 8383" /* \u‹gcxxnoˆ†w“œƒƒ */ $"918C 797E 9175 6C87 7458 6172 6756 7E9F" /* ‘Œy~‘ul‡tXargV~Ÿ */ $"8F9E B5AF A88E 7C73 5B58 4B43 666F 7289" /* �žµ¯¨Ž|s[XKCfor‰ */ $"909E A19C 9F8D 8B8F 6F6E 7761 6175 7A6C" /* �ž¡œŸ�‹�onwaauzl */ $"7399 8665 8390 746B 87A0 8988 A997 8184" /* s™†eƒ�tk‡ ‰ˆ©—�„ */ $"6E59 545F 604B 749E 8493 B3A6 9995 9681" /* nYT_`Ktž„“³¦™•–� */ $"626F 6A4E 5D63 6A80 8290 9EA5 A488 8589" /* bojN]cj€‚�ž¥¤ˆ…‰ */ $"6456 636D 6F73 9198 8DA3 916B 7B7D 6153" /* dVcmos‘˜�£‘k{}aS */ $"6F8F 757B AC96 8098 9478 6374 7D57 5E7C" /* o�u{¬–€˜”xct}W^| */ $"6F7A 9393 969F AB91 7486 7342 4D64 6264" /* oz““–Ÿ«‘t†sBMdbd */ $"7F9F A0A6 AF91 8D8F 6B5D 646A 6564 8785" /* .Ÿ ¦¯‘��k]djed‡… */ $"6B90 9F7B 788B 9177 7293 7F6F 9587 6E86" /* k�Ÿ{x‹‘wr“.o•‡n† */ $"9374 5E7C 824D 5688 7E71 92B0 A79D AE9A" /* “t^|‚MVˆ~q’°§�®š */ $"7279 6D47 455A 615D 7999 8792 BEA6 8897" /* rymGEZa]y™‡’¾¦ˆ— */ $"9C81 676E 6D56 676E 5876 947F 7B9B A47D" /* œ�gnmVgnXv”.{›¤} */ $"719D 9064 7D97 7F71 8988 606A 8564 577D" /* q��d}—.q‰ˆ`j…dW} */ $"8577 8BA8 917D A6A0 676C 8977 5964 8075" /* …w‹¨‘}¦ gl‰wYd€u */ $"6C87 867D 918E 7D87 917C 677D 8C6C 6E92" /* l‡†}‘Ž}‡‘|g}Œln’ */ $"8878 8C8C 6E6C 7D6E 5F76 837E 93A8 9381" /* ˆxŒŒnl}n_vƒ~“¨“� */ $"9C9B 6151 7972 4D5D 8887 7A9A AB8E 909F" /* œ›aQyrM]ˆ‡zš«Ž�Ÿ */ $"8170 7B6D 575C 746F 6484 9D8F 93A2 9B85" /* �p{mW\tod„��“¢›… */ $"7C82 755B 6276 7778 7B7F 9193 7972 8385" /* |‚u[bvwx{.‘“yrƒ… */ $"7175 8B8A 8591 9385 7F7D 6D64 6B65 5C6C" /* qu‹Š…‘“….}mdke\l */ $"8085 8295 B1A1 92A8 9B6E 6671 613D 446F" /* €…‚•±¡’¨›nfqa=Do */ $"7370 8CA1 A8A9 A299 867D 7B62 566B 7368" /* spŒ¡¨©¢™†}{bVksh */ $"738F 8B7B 8B97 8070 7D82 716E 8189 8489" /* s�‹{‹—€p}‚qn�‰„‰ */ $"9497 8678 7A71 655D 5668 7F7D 889D A6A4" /* ”—†xzqe]Vh.}ˆ�¦¤ */ $"9D92 8074 755F 526B 7165 7A94 8A7C 94A3" /* �’€tu_Rkqez”Š|”£ */ $"8375 8F8D 6868 8A7A 5D7D 9278 758F 8B70" /* ƒu��hhŠz]}’xu�‹p */ $"7E8D 6362 918A 6E85 A394 7986 8C65 6076" /* ~�cb‘Šn…£”y†Œe`v */ $"6C60 758E 8B8A 9992 888F 846F 767F 6861" /* l`uދЙ’ˆ�„ov.ha */ $"7B79 637B 9181 849C 9888 8F94 6E5E 8073" /* {yc{‘�„œ˜ˆ�”n^€s */ $"516C 8F7D 6F93 A071 72A1 825E 86A0 8074" /* Ql�}o“ qr¡‚^† €t */ $"998F 6271 805B 5379 806A 81AB 9684 A4A3" /* ™�bq€[Sy€j�«–„¤£ */ $"8077 8378 5C67 7158 6581 787E 969A 9497" /* €wƒx\gqXe�x~–š”— */ $"9C82 7085 7555 6C82 7876 8D92 7C80 8D70" /* œ‚p…uUl‚xv�’|€�p */ $"6480 7E68 7B9E 8F7A 9DA2 7573 8A75 5666" /* d€~h{ž�z�¢usŠuVf */ $"7E62 5B89 8F7B 8FA5 9B8D 918F 6F6B 7961" /* ~b[‰�{�¥›�‘�okya */ $"5673 8076 7C93 9481 888E 7B78 8079 737E" /* Vs€v|“”�ˆŽ{x€ys~ */ $"837B 7E87 807B 8280 7474 7D75 697B 8A82" /* ƒ{~‡€{‚€tt}ui{Š‚ */ $"8998 9790 8D83 6D60 695F 506D 8A86 8FA8" /* ‰˜—��ƒm`i_PmІ�¨ */ $"AD99 8C8D 7B60 6269 5B5F 7782 8089 9999" /* ­™Œ�{`bi[_w‚€‰™™ */ $"9096 927E 7C7E 6559 6971 6B71 8C99 8F91" /* �–’~|~eYiqkqŒ™�‘ */ $"9889 7975 7169 717F 8083 8E90 837A 7B70" /* ˜‰yuqiq.€ƒŽ�ƒz{p */ $"6573 7470 8390 8B89 8B90 857D 8178 747F" /* estpƒ�‹‰‹�…}�xt. */ $"7365 6E79 776C 7E97 8C89 9993 8180 7D6C" /* senywl~—Œ‰™“�€}l */ $"6877 756D 808B 807B 8483 7276 8478 788F" /* hwum€‹€{„ƒrv„xx� */ $"9385 808B 8C73 7178 6A71 776A 7384 8880" /* “…€‹Œsqxjqwjs„ˆ€ */ $"8499 9583 8E8A 7675 7168 666F 7A75 7F92" /* „™•ƒŽŠvuqhfozu.’ */ $"8B85 8B89 7B77 8279 6B84 8D78 7885 8576" /* ‹…‹‰{w‚yk„�xx……v */ $"727B 7375 8475 748E 9085 838E 947B 747D" /* r{su„utŽ�…ƒŽ”{t} */ $"6B62 6B6C 707C 8B94 929C 9986 8378 6367" /* kbklp|‹”’œ™†ƒxcg */ $"6F67 657E 9185 8192 9289 807C 7A78 7D73" /* oge~‘…�’’‰€|zx}s */ $"677B 8373 7688 8E82 8193 806C 7E77 6673" /* g{ƒsvˆŽ‚�“€l~wfs */ $"8184 8590 978B 8380 6A65 6C67 6374 8E93" /* �„…�—‹ƒ€jelgctŽ“ */ $"8A95 9E94 847C 7572 7168 606F 8073 778F" /* Š•ž”„|urqh`o€sw� */ $"908A 949A 8979 8078 5F65 7572 7887 8F8F" /* �Š”š‰y€x_eurx‡�� */ $"8E90 7C6A 7974 5A69 8B8E 808F A695 8182" /* Ž�|jytZi‹Ž€�¦•�‚ */ $"7768 6A68 6268 7C80 8090 9793 9597 8B7B" /* whjhbh|€€�—“•—‹{ */ $"7A7A 645B 6B6E 6C7C 868C 959A 8B80 8D87" /* zzd[knl|†Œ•š‹€�‡ */ $"6368 8478 6779 8980 7C88 8476 8087 7671" /* ch„xgy‰€|ˆ„v€‡vq */ $"8586 757D 8D80 798B 896F 7388 7862 7688" /* …†u}�€y‹‰osˆxbvˆ */ $"7C7C 8A8E 8D89 8077 7C7D 6865 7D80 767E" /* ||ŠŽ�‰€w|}he}€v~ */ $"8C8A 8187 8979 7B84 766C 7E80 717C 897B" /* ŒŠ�‡‰y{„vl~€q|‰{ */ $"7991 8D6E 7791 7B61 768C 7C77 8F93 8485" /* y‘�nw‘{avŒ|w�“„… */ $"8672 6876 6E5D 7290 8480 9A9D 8782 8978" /* †rhvn]r�„€š�‡‚‰x */ $"6774 7769 6F80 7F80 8580 818C 8978 798A" /* gtwio€.€…€�Œ‰xyŠ */ $"846C 7487 7E73 8087 7F81 8474 6C7E 7763" /* „lt‡~s€‡.�„tl~wc */ $"7793 8781 9DA0 827F 8973 5563 7565 6281" /* w“‡�� ‚.‰sUcueb� */ $"9389 8E9B 938A 8D81 6C73 7E67 5B76 8072" /* “‰Ž›“Š��ls~g[v€r */ $"7B90 928E 8F8D 817C 766B 6974 7677 8891" /* {�’Ž���|vkitvwˆ‘ */ $"898A 9387 6C6E 7C6C 5E76 867F 8795 8E8A" /* ‰Š“‡ln|l^v†.‡•ŽŠ */ $"9487 6D71 8068 5770 8474 7796 9C8C 8E97" /* ”‡mq€hWp„tw–œŒŽ— */ $"856F 7473 5F62 7779 7B8B 918D 9193 8073" /* …ots_bwy{‹‘�‘“€s */ $"7E7B 6869 7A7E 797E 848C 8C84 8080 8277" /* ~{hiz~y~„ŒŒ„€€‚w */ $"6C74 7F75 7589 8E82 8992 8070 7977 6668" /* lt.uu‰Ž‚‰’€pywfh */ $"7A7A 7C8E 9189 9094 826F 7A82 6C5F 7882" /* zz|Ž‘‰�”‚oz‚l_x‚ */ $"7170 8389 8085 8E88 8589 8077 7A78 6F73" /* qpƒ‰€…Žˆ…‰€wzxos */ $"7A7A 7E83 8580 7C80 7F77 7780 8888 8587" /* zz~ƒ…€|€.ww€ˆˆ…‡ */ $"8E88 7569 6F76 6865 7E8B 8087 9490 8888" /* Žˆuiovhe~‹€‡”�ˆˆ */ $"8479 767A 746D 747A 7778 8286 8185 9087" /* „yvztmtzwx‚†�…�‡ */ $"7780 8773 697D 877D 7C88 8D84 7977 7774" /* w€‡si}‡}|ˆ�„ywwt */ $"7272 7884 8B8B 898C 8D80 7577 746C 7279" /* rrx„‹‹‰Œ�€uwtlry */ $"787D 8289 8C85 8489 867A 7278 7C6F 6D7B" /* x}‚‰Œ…„‰†zrx|om{ */ $"8481 8088 9089 807D 7972 7374 7279 8985" /* „�€ˆ�‰€}yrstry‰… */ $"808C 8E80 7980 796A 717D 7572 828E 8A84" /* €ŒŽ€y€yjq}ur‚ŽŠ„ */ $"8E93 8379 7B6F 696C 6869 7C8D 898B 9EA0" /* Ž“ƒy{oilhi|�‰‹ž  */ $"8A82 8174 6764 6769 717D 8287 8E8F 8E8B" /* Š‚�tgdgiq}‚‡Ž�Ž‹ */ $"8980 777F 7967 7280 7972 808E 847F 8980" /* ‰€w.ygr€yr€Ž„.‰€ */ $"757B 766D 7987 8680 8F9B 8778 8077 6464" /* u{vmy‡†€�›‡x€wdd */ $"7270 6F87 9487 8C99 8E80 8080 7171 7B70" /* rpo‡”‡Œ™Ž€€€qq{p */ $"6A7D 8074 798A 8F81 8590 837B 7E73 7177" /* j}€tyŠ��…�ƒ{~sqw */ $"7B78 798D 8D7A 8488 7370 7A79 707C 8E85" /* {xy��z„ˆspzyp|Ž… */ $"7E8E 8F7E 797E 7970 787C 727B 8980 7884" /* ~Ž�~y~ypx|r{‰€x„ */ $"8E81 798B 8774 797D 7272 7C7F 7880 9087" /* Ž�y‹‡ty}rr|.x€�‡ */ $"7D87 8275 7679 7877 8189 7F80 8C80 7478" /* }‡‚uvyxw�‰.€Œ€tx */ $"7A75 757F 807E 8C8E 8081 8A82 7273 7D71" /* zuu.€~ŒŽ€�Š‚rs}q */ $"6B79 7979 828E 8D87 9094 7E79 7E71 6A6D" /* kyyy‚Ž�‡�”~y~qjm */ $"7374 7787 8880 8C91 807B 8382 7776 807D" /* stw‡ˆ€Œ‘€{ƒ‚wv€} */ $"7780 8075 7982 7F75 7C84 7B79 8182 8087" /* w€€uy‚.u|„{y�‚€‡ */ $"8C84 818B 806D 7375 6867 7680 7F88 9992" /* Œ„�‹€msuhgv€.ˆ™’ */ $"8892 8974 7279 7368 7280 787C 8B84 7C8A" /* ˆ’‰tryshr€x|‹„|Š */ $"8F7D 7887 816D 727F 7573 868A 808A 9481" /* �}x‡�mr.us†Š€Š”� */ $"747D 7762 677B 7A77 8E9A 8B8C 9582 6D75" /* t}wbg{zwŽš‹Œ•‚mu */ $"7867 667B 7E76 8790 8084 9587 7381 8B75" /* xgf{~v‡�€„•‡s�‹u */ $"6A7B 7C6B 7688 7D7D 928F 7E83 8975 6A7C" /* j{|kvˆ}}’�~ƒ‰uj| */ $"7D6C 7C90 8079 8F8B 7073 8778 6880 8C7C" /* }l|�€y�‹ps‡xh€Œ| */ $"8092 8475 8787 6A6D 8479 6779 8A79 7892" /* €’„u‡‡jm„ygyŠyx’ */ $"8E7B 8C95 7E75 8179 626A 7B6E 6D89 8C80" /* Ž{Œ•~u�ybj{nm‰Œ€ */ $"8D99 877B 8986 6D6F 7F74 6F80 7E73 818C" /* �™‡{‰†mo.to€~s�Œ */ $"7B77 8C88 737B 897D 7587 8974 7B8E 7B6D" /* {wŒˆs{‰}u‡‰t{Ž{m */ $"7E7F 6B70 8580 748E 977F 8192 806C 7882" /* ~.kp…€tŽ—.�’€lx‚ */ $"6F6A 8185 7781 8B7E 7987 8373 7B87 7B74" /* oj�…w�‹~y‡ƒs{‡{t */ $"8081 7880 877F 7E89 8376 7C7C 6D70 7D7A" /* €�x€‡.~‰ƒv||mp}z */ $"798A 9386 8693 866E 767B 6B69 7B80 7785" /* yŠ“††“†nv{ki{€w… */ $"9281 7B8E 8871 7A88 7B6F 7E81 7376 857E" /* ’�{Žˆqzˆ{o~�sv…~ */ $"7785 8C82 8086 8076 7779 7479 8481 8088" /* w…Œ‚€†€vwyty„�€ˆ */ $"877D 7A7D 7372 7E7D 7C8B 9083 818C 806A" /* ‡}z}sr~}|‹�ƒ�Œ€j */ $"717B 6C6B 8082 7B86 968B 8090 8F77 7780" /* q{lk€‚{†–‹€��ww€ */ $"7064 7077 6A73 8E8B 8193 9B8A 8085 7D6C" /* pdpwjsŽ‹�“›Š€…}l */ $"6E72 6E75 8180 808A 8D80 7F87 7E73 7E80" /* nrnu�€€Š�€.‡~s~€ */ $"757A 8780 7786 8A77 7987 786E 8081 6F75" /* uz‡€w†Šwy‡xn€�ou */ $"8E88 7586 9580 7686 816F 7582 756F 8586" /* Žˆu†•€v†�ou‚uo…† */ $"757F 8F80 7385 8973 7586 7E72 8087 7A7B" /* u.�€s…‰su†~r€‡z{ */ $"8A85 7880 8071 757D 7473 868D 8085 978A" /* Š…x€€qu}ts†�€…—Š */ $"7580 7F6A 6A79 756F 8590 8084 9688 7582" /* u€.jjyuo…�€„–ˆu‚ */ $"8871 6D81 7C6A 788A 7974 8C90 7C82 9080" /* ˆqm�|jxŠytŒ�|‚�€ */ $"7481 7B68 7385 7A71 8891 7C7B 8A7F 717E" /* t�{hs…zqˆ‘|{Š.q~ */ $"8278 7D8A 857A 8484 6F71 7F73 6D81 8C80" /* ‚x}Š…z„„oq.sm�Œ€ */ $"8395 8C79 8489 7571 7D78 6D7A 8072 788C" /* ƒ•Œy„‰uq}xmz€rxŒ */ $"8679 8897 847A 8983 6C71 7D71 6C80 877A" /* †yˆ—„z‰ƒlq}ql€‡z */ $"8393 8479 8583 7175 827B 7384 8A7B 7C8B" /* ƒ“„y…ƒqu‚{s„Š{|‹ */ $"8476 7C80 7676 7F79 7584 897C 7F8F 8978" /* „v|€vv.yu„‰|.�‰x */ $"8085 7371 7C78 717C 8680 808B 867A 8082" /* €…sq|xq|†€€‹†z€‚ */ $"7573 807E 7580 8C80 7A89 8978 7680 776F" /* us€~u€Œ€z‰‰xv€wo */ $"797B 7681 8D88 848D 8E7C 777D 7269 7179" /* y{v��ˆ„�Ž|w}riqy */ $"777B 898E 868B 8F82 7B7F 7770 7478 7376" /* w{‰Ž†‹�‚{.wptxsv */ $"8483 7B85 8F86 8185 857C 7877 7171 787A" /* „ƒ{…�†�……|xwqqxz */ $"7980 8B89 8289 8879 7880 7A73 7B85 7F7B" /* y€‹‰‚‰ˆyx€zs{….{ */ $"8582 777A 7B79 7B7E 8182 868B 817E 8582" /* …‚wz{y{~�‚†‹�~…‚ */ $"7674 7B7B 7378 7E7A 7D84 8484 898A 8482" /* vt{{sx~z}„„„‰Š„‚ */ $"8178 7276 7471 7780 8584 898F 857D 807A" /* �xrvtqw€…„‰�…}€z */ $"7372 767A 7B85 867F 878D 7F77 7D7D 7574" /* srvz{…†.‡�.w}}ut */ $"7D7C 7780 8580 8085 8880 7E82 7B77 7C7A" /* }|w€…€€…ˆ€~‚{w|z */ $"767B 827E 7B87 867A 7F85 7F7A 7C80 7F7F" /* v{‚~{‡†z.….z|€.. */ $"817C 7B83 7F76 7A80 7B78 8084 7B80 8C83" /* �|{ƒ.vz€{x€„{€Œƒ */ $"7A84 8576 737D 776E 7B83 7B80 8E88 8088" /* z„…vs}wn{ƒ{€Žˆ€ˆ */ $"8B77 717E 7B6D 7180 7D7A 868B 8085 9183" /* ‹wq~{mq€}z†‹€…‘ƒ */ $"7980 8073 727A 7471 8185 7D85 8F88 8083" /* y€€srztq�…}…�ˆ€ƒ */ $"8074 747B 7776 8284 7E84 8D7E 7280 806E" /* €tt{wv‚„~„�~r€€n */ $"7384 817B 898E 7D7E 8C80 6D78 8073 7181" /* s„�{‰Ž}~Œ€mx€sq� */ $"8076 838E 807B 8D8A 777A 8477 6B7A 7F73" /* €vƒŽ€{�Šwz„wkz.s */ $"7B8A 8581 8D8A 7979 8074 6B77 7D7A 828D" /* {Š…��Šyy€tkw}z‚� */ $"8583 8D89 7677 7F75 6F7A 7C73 7D8B 807B" /* …ƒ�‰vw.uoz|s}‹€{ */ $"8D8E 7B7F 8A7C 6E7B 806E 7184 8077 8790" /* �Ž{.Š|n{€nq„€w‡� */ $"807C 8B84 7277 8077 7583 8278 838D 8075" /* €|‹„rw€wuƒ‚xƒ�€u */ $"8283 7576 807C 7A84 867E 8188 7F79 7F7A" /* ‚ƒuv€|z„†~�ˆ.y.z */ $"7478 807A 7A87 8880 848B 7E75 7D7D 7072" /* tx€zz‡ˆ€„‹~u}}pr */ $"7D7B 7A86 8780 858E 8276 8082 7372 7D7A" /* }{z†‡€…Ž‚v€‚sr}z */ $"747F 8780 7E8A 897D 8083 7975 7C7C 767B" /* t.‡€~Љ}€ƒyu||v{ */ $"8680 7D87 8479 7A80 7C75 7A82 8081 8480" /* †€}‡„yz€|uz‚€�„€ */ $"8182 7D78 797E 7B79 8080 7D80 8480 7C80" /* �‚}xy~{y€€}€„€|€ */ $"837C 7B7F 7B7B 7D7B 7C80 8382 8087 857A" /* ƒ|{.{{}{|€ƒ‚€‡…z */ $"787C 7772 737D 8080 888C 8788 877F 7775" /* x|wrs}€€ˆŒ‡ˆ‡.wu */ $"7671 7179 7C80 8588 8785 8786 7C78 7B78" /* vqqy|€…ˆ‡…‡†|x{x */ $"7574 7A7D 7C82 8584 8783 807E 7B78 7575" /* utz}|‚…„‡ƒ€~{xuu */ $"7C7F 8083 8789 8680 807B 7575 7677 797E" /* |.€ƒ‡‰†€€{uuvwy~ */ $"8386 8484 8784 7C78 7B79 7678 7C7F 8183" /* ƒ†„„‡„|x{yvx|.�ƒ */ $"8483 8382 7C7B 7978 7877 7B80 8083 8786" /* „ƒƒ‚|{yxxw{€€ƒ‡† */ $"8483 807B 7878 7674 777B 8083 8387 8887" /* „ƒ€{xxvtw{€ƒƒ‡ˆ‡ */ $"8380 7B78 7776 7377 7D81 8384 8889 8380" /* ƒ€{xwvsw}�ƒ„ˆ‰ƒ€ */ $"807B 7575 7878 7980 8383 8787 8180 807C" /* €{uuxxy€ƒƒ‡‡�€€| */ $"7779 7A78 7B80 807E 8284 807E 807F 7C7C" /* wyzx{€€~‚„€~€.|| */ $"7D7A 7C83 817C 8086 7E78 7F7B 7579 7E7B" /* }z|ƒ�|€†~x.{uy~{ */ $"7D87 8782 8688 7E78 7C79 7175 7E7C 7985" /* }‡‡‚†ˆ~x|yqu~|y… */ $"8A80 8087 8378 7C80 787A 807C 7B84 847B" /* Š€€‡ƒx|€xz€|{„„{ */ $"7D86 7F76 7D80 7678 8180 7B83 8A82 8089" /* }†.v}€vx�€{ƒŠ‚€‰ */ $"8377 7C7E 7071 7F7C 7583 8E83 7E8D 8978" /* ƒw|~pq.|uƒŽƒ~�‰x */ $"7880 7872 7D7F 7780 8B81 7A87 8776 7783" /* x€xr}.w€‹�z‡‡vwƒ */ $"7971 7F83 7A7F 8B87 8086 8678 777C 716E" /* yq.ƒz.‹‡€††xw|qn */ $"7C7E 7781 918A 808B 8E79 747D 756B 757D" /* |~w�‘Š€‹Žyt}uku} */ $"757C 8E8A 808B 907C 7783 7869 7582 7574" /* u|ŽŠ€‹�|wƒxiu‚ut */ $"8A8D 8085 9083 7880 7C6E 747E 7776 878A" /* Š�€…�ƒx€|nt~wv‡Š */ $"7C83 8E83 7680 8074 757F 7B79 8487 7F83" /* |ƒŽƒv€€tu.{y„‡.ƒ */ $"8A80 7880 7C6F 7581 7874 868D 8083 9086" /* Š€x€|ou�xt†�€ƒ�† */ $"7980 7F70 707C 7671 828A 7F80 9089 787F" /* y€.pp|vq‚Š.€�‰x. */ $"8676 717F 7E75 7C87 827C 8686 7B7D 8076" /* †vq.~u|‡‚|††{}€v */ $"767F 7C77 7F89 8380 8989 7D7D 8076 7278" /* v.|w.‰ƒ€‰‰}}€vrx */ $"7773 7D86 8080 8D8A 7D80 8679 727E 8073" /* ws}†€€�Š}€†yr~€s */ $"7986 8079 8286 7B7B 847D 7883 857B 7C87" /* y†€y‚†{{„}xƒ…{|‡ */ $"8378 7E86 7975 7E7C 767B 8180 8086 8681" /* ƒx~†yu~|v{�€€††� */ $"8383 7C79 7C77 7279 807B 7E89 8882 8486" /* ƒƒ|y|wry€{~‰ˆ‚„† */ $"7E79 7C78 727A 7E79 7C88 8680 8589 8079" /* ~y|xrz~y|ˆ†€…‰€y */ $"807C 7276 7E7A 7982 8780 8287 8079 7C7B" /* €|rv~zy‚‡€‚‡€y|{ */ $"7576 7F7D 7B84 8883 8184 817A 7978 7576" /* uv.}{„ˆƒ�„�zyxuv */ $"7979 7E85 8585 8788 827C 7C79 7274 7977" /* yy~………‡ˆ‚||yrtyw */ $"7981 8583 8588 827E 807B 7277 7E7A 7982" /* y�…ƒ…ˆ‚~€{rw~zy‚ */ $"8882 8085 8279 797A 7673 7A7D 7D82 8887" /* ˆ‚€…‚yyzvsz}}‚ˆ‡ */ $"8688 857E 7B79 7270 7576 767D 8486 8788" /* †ˆ…~{yrpuvv}„†‡ˆ */ $"8985 827D 7676 7874 737B 8080 8086 8580" /* ‰…‚}vvxts{€€€†…€ */ $"8181 7A79 7D7B 797D 8180 8084 827E 7F80" /* ��zy}{y}�€€„‚~.€ */ $"7A76 7B7D 777A 8284 8183 8683 807D 7A77" /* zv{}wz‚„�ƒ†ƒ€}zw */ $"7878 777C 8082 8285 8681 8080 7C77 797A" /* xxw|€‚‚…†�€€|wyz */ $"7A7B 8080 8083 8380 8080 7C79 7D7D 777A" /* z{€€€ƒƒ€€€|y}}wz */ $"8180 7D80 8380 7E80 7D79 7C7F 7B7C 8182" /* �€}€ƒ€~€}y|.{|�‚ */ $"8080 8380 7A7D 7D77 787D 7E7D 8084 8281" /* €€ƒ€z}}wx}~}€„‚� */ $"8280 807F 7C79 7A7D 7A7A 8082 8080 8181" /* ‚€€.|yz}zz€‚€€�� */ $"7F7E 7D7B 7C80 7E7E 8282 8081 817D 777A" /* .~}{|€~~‚‚€��}wz */ $"7B76 7780 807F 8388 8782 8482 7D7A 7A75" /* {vw€€.ƒˆ‡‚„‚}zzu */ $"7478 7A79 7E85 8684 8787 827F 7D7A 7678" /* txzy~…†„‡‡‚.}zvx */ $"7A79 7B80 8283 8483 807E 7D7A 787B 7E7D" /* zy{€‚ƒ„ƒ€~}zx{~} */ $"7F83 8482 8281 7E7B 7B78 777A 7D7A 7E85" /* .ƒ„‚‚�~{{xwz}z~… */ $"8581 8586 807C 7D7A 7475 7B7A 7A81 8685" /* …�…†€|}ztu{zz�†… */ $"8486 827D 7D7A 7575 7B7B 7A80 8684 8385" /* „†‚}}zuu{{z€†„ƒ… */ $"847E 7C7B 7878 7A7A 7A80 8282 8285 8380" /* „~|{xxzzz€‚‚‚…ƒ€ */ $"807D 7877 7A7A 797E 8381 8385 8480 807F" /* €}xwzzy~ƒ�ƒ…„€€. */ $"7876 7B7B 767C 8483 8084 8781 8080 7D78" /* xv{{v|„ƒ€„‡�€€}x */ $"797B 7879 8080 7F81 8481 8081 807B 7C80" /* y{xy€€.�„�€�€{|€ */ $"7B7B 8081 7F7F 8080 7D7D 7C7A 7D80 7D7E" /* {{€�..€€}}|z}€}~ */ $"8484 8081 8480 7B7D 7C77 787D 7B7B 8184" /* „„€�„€{}|wx}{{�„ */ $"8081 8683 7D80 8078 787F 7C78 7D83 807D" /* €�†ƒ}€€xx.|x}ƒ€} */ $"8282 7D7D 807C 7B80 807C 8084 807D 8080" /* ‚‚}}€|{€€|€„€}€€ */ $"7A7A 7F7C 787F 817D 8083 8180 8181 7C7C" /* zz.|x.�}€ƒ�€��|| */ $"807A 787E 807A 7D85 827D 8183 7D7B 7F7B" /* €zx~€z}…‚}�ƒ}{.{ */ $"767C 817C 7D85 837E 8183 7C78 7E7D 757B" /* v|�|}…ƒ~�ƒ|x~}u{ */ $"817D 7D83 8580 8084 8079 7D7D 7679 807D" /* �}}ƒ…€€„€y}}vy€} */ $"7B83 8781 8085 817B 7B7C 7676 7D7D 7B83" /* {ƒ‡�€…�{{|vv}}{ƒ */ $"8682 8286 827B 7D7F 7676 7E7D 7980 8581" /* †‚‚†‚{}.vv~}y€…� */ $"8083 837B 7D80 7A79 8080 7A80 8681 7C82" /* €ƒƒ{}€zy€€z€†�|‚ */ $"837A 7A7E 7A77 7D81 7D80 8785 8083 847D" /* ƒzz~zw}�}€‡…€ƒ„} */ $"7A7D 7A74 7A7F 7B7C 8485 8183 8681 7D80" /* z}ztz.{|„…�ƒ†�}€ */ $"7D77 7A7D 797A 8182 7F81 8581 7D80 7D77" /* }wz}yz�‚.�…�}€}w */ $"7B80 7B7A 8183 7E81 8480 7B80 7F78 7A81" /* {€{z�ƒ~�„€{€.xz� */ $"7C78 8184 7E80 8583 7D7F 817A 7A7F 7C79" /* |x�„~€…ƒ}.�zz.|y */ $"7D82 807D 8383 7D7F 817B 7A7F 7F7B 7E82" /* }‚€}ƒƒ}.�{z..{~‚ */ $"817F 8181 7D7D 7E7B 7B80 7F7B 8083 807D" /* �.��}}~{{€.{€ƒ€} */ $"8281 7B7D 807B 7A80 807B 8084 807D 8282" /* ‚�{}€{z€€{€„€}‚‚ */ $"7B7D 817B 787E 817B 7D83 837E 8083 7F7B" /* {}�{x~�{}ƒƒ~€ƒ.{ */ $"7E7D 7A7D 807D 7D81 817D 8081 7E7C 7F7D" /* ~}z}€}}��}€�~|.} */ $"7C7F 807D 7F81 807E 807E 7B7C 7F7B 7A80" /* |.€}.�€~€~{|.{z€ */ $"827D 7F84 847F 8082 7D7A 7D7B 777B 807D" /* ‚}.„„.€‚}z}{w{€} */ $"7D83 8480 8183 807C 7E7E 7A7A 7F7E 7C80" /* }ƒ„€�ƒ€|~~zz.~|€ */ $"8381 8081 807E 7E7C 7A7C 807E 7E82 8381" /* ƒ�€�€~~|z|€~~‚ƒ� */ $"8181 7F7C 7E7C 797C 7F7C 7E82 8280 8184" /* ��.|~|y|.|~‚‚€�„ */ $"807C 8080 797A 807F 7B80 8481 8082 817C" /* €|€€yz€.{€„�€‚�| */ $"7E7E 7A79 7F80 7C80 8482 8082 827E 7C7E" /* ~~zy.€|€„‚€‚‚~|~ */ $"7B79 7C7E 7D80 8281 8183 817D 7F80 7B79" /* {y|~}€‚��ƒ�}.€{y */ $"7E7E 7B7E 8281 8083 827E 8081 7C79 7E7E" /* ~~{~‚�€ƒ‚~€�|y~~ */ $"797C 8381 7E83 8580 7D82 7F79 7C80 7B7B" /* y|ƒ�~ƒ…€}‚.y|€{{ */ $"8081 7E81 8380 7E82 807A 7C81 7C7B 8081" /* €�~�ƒ€~‚€z|�|{€� */ $"7E7E 8180 7E80 7F7C 7E80 7D7C 8181 7D80" /* ~~�€~€.|~€}|��}€ */ $"827E 7C80 807A 7B80 7E7B 8082 7F80 8380" /* ‚~|€€z{€~{€‚.€ƒ€ */ $"7D81 817A 7B81 807A 7F84 807D 8181 7D7D" /* }��z{�€z.„€}��}} */ $"807D 7B80 807D 8083 807E 8181 7B7D 817D" /* €}{€€}€ƒ€~��{}�} */ $"7A7E 817D 7E82 817E 8080 7D7E 807D 7B80" /* z~�}~‚�~€€}~€}{€ */ $"817D 7E82 817D 8081 7D7C 807E 7B7E 817E" /* �}~‚�}€�}|€~{~�~ */ $"7E83 817E 8182 7D7C 807E 797D 827F 7D81" /* ~ƒ�~�‚}|€~y}‚.}� */ $"8380 7F81 7F7C 7E7E 7B7D 817F 7D81 8380" /* ƒ€.�.|~~{}�.}�ƒ€ */ $"7F81 807C 7D7E 7C7C 7F80 7E81 8281 8181" /* .�€|}~||.€~�‚��� */ $"807D 7E7E 7A7B 807E 7C80 8381 8082 817D" /* €}~~z{€~|€ƒ�€‚�} */ $"7E7E 7C7B 7F7F 7D80 8380 7E82 817C 7D80" /* ~~|{..}€ƒ€~‚�|}€ */ $"7D7B 7E80 7E7E 8282 8081 817E 7D7E 7C7A" /* }{~€~~‚‚€��~}~|z */ $"7D80 7D7E 8282 8081 8280 7E7E 7D7C 7D7E" /* }€}~‚‚€�‚€~~}|}~ */ $"7D7E 8180 8082 827F 7E80 7E7B 7D80 7D7D" /* }~�€€‚‚.~€~{}€}} */ $"8181 8081 8280 7E80 7E7C 7D80 7D7C 8081" /* ��€�‚€~€~|}€}|€� */ $"7E7F 8281 7E80 807D 7D80 7E7D 7F80 7F7F" /* ~.‚�~€€}}€~}.€.. */ $"8180 7E80 807D 7D80 7F7D 8081 8080 8080" /* �€~€€}}€.}€�€€€€ */ $"7E7F 7F7D 7D80 7E7D 8081 7F7F 8180 7D7F" /* ~..}}€~}€�..�€}. */ $"807D 7D80 807D 8081 807E 8080 7D7E 807D" /* €}}€€}€�€~€€}~€} */ $"7C80 807E 7E81 817E 8080 7E7D 7E7E 7D7E" /* |€€~~��~€€~}~~}~ */ $"807E 7F80 8080 8080 7E7E 807E 7D7E 807E" /* €~.€€€€€~~€~}~€~ */ $"7F80 807F 8080 7D7E 807E 7D80 817E 7F82" /* .€€.€€}~€~}€�~.‚ */ $"817E 8080 7D7D 7E7E 7C7E 807F 7E81 8180" /* �~€€}}~~|~€.~��€ */ $"8080 7E7D 7E7E 7C7D 8080 7E80 8180 8080" /* €€~}~~|}€€~€�€€€ */ $"7F7D 7E7D 7C7D 807F 7F81 8180 8080 7F7D" /* .}~}|}€..��€€€.} */ $"7E7D 7C7D 7F7E 7E81 8180 8081 807D 7E7F" /* ~}|}.~~��€€�€}~. */ $"7C7C 807F 7D80 8280 8081 807E 7E7E 7D7C" /* ||€.}€‚€€�€~~~}| */ $"7E7F 7D7F 8181 8081 817F 7E7E 7D7C 7D7E" /* ~.}.��€��.~~}|}~ */ $"7E7E 8080 8081 8080 7F7F 7D7D 7E7E 7D7F" /* ~~€€€�€€..}}~~}. */ $"8080 8080 807F 7F80 7D7D 7E7F 7D7E 8080" /* €€€€€..€}}~.}~€€ */ $"8080 817F 7F80 7E7D 7D7F 7D7D 8080 8080" /* €€�..€~}}.}}€€€€ */ $"8180 7F80 807E 7E7F 7E7E 7F80 8080 8080" /* �€.€€~~.~~.€€€€€ */ $"7F7F 7E7E 7E7F 7F7F 8080 8080 807F 7F7E" /* ..~~~...€€€€€..~ */ $"7E7E 7E7F 7E7E 8080 8080 8080 7F7F 7F7E" /* ~~~.~~€€€€€€...~ */ $"7E7F 7E7E 8080 8080 8080 7F7E 7F7E 7E7F" /* ~.~~€€€€€€.~.~~. */ $"807F 7F80 8080 7F7F 7F7E 7E7E 7E7F 8080" /* €..€€€...~~~~.€€ */ $"8080 8080 7F7F 7F7E 7E7F 7E7E 7F80 8080" /* €€€€...~~.~~.€€€ */ $"8080 7F7F 7F7F 7E7E 7E7F 8080 8080 8080" /* €€....~~~.€€€€€€ */ $"807F 7F7E 7E7E 7E7E 7F80 8080 8080 807F" /* €..~~~~~.€€€€€€. */ $"7F7E 7D7E 7E7E 7F80 8080 8180 807F 7F7E" /* .~}~~~.€€€�€€..~ */ $"7E7E 7E7E 7F80 8080 8081 8080 807F 7E7E" /* ~~~~.€€€€�€€€.~~ */ $"7E7E 7E7F 8080 8081 8080 8080 7E7E 7E7E" /* ~~~.€€€�€€€€~~~~ */ $"7E7F 7F7F 8081 8080 8080" /* ~...€�€€€€ */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Frog.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Frog.r new file mode 100644 index 0000000..636eaea --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Frog.r @@ -0,0 +1 @@ +#include "TypesIIGS.r" resource rSoundSample (0x4, "Frog") { 0, 20, 0x82E8, 0, 22254, $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 7F80 8080 8080" $"7F7F 7F7F 8080 8080 807F 7F7F 7F80 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 7F7F 7F80 8080 8080" $"8080 7F7F 8080 8080 807F 7F7F 7F80 8082" $"8282 807E 7C7B 7C7E 8183 8383 817E 7D7D" $"7F82 8586 8480 7B78 7779 7E82 8687 8582" $"7E7B 7A7C 8085 8889 857F 7975 7579 8087" $"8A89 847D 7876 787D 8489 8A88 837D 7978" $"7B7F 8385 8481 7D7A 797B 7F82 8483 807E" $"7D7E 8184 8685 817C 7978 7B7F 8487 8683" $"7E79 7678 7C82 878A 8985 7E79 7778 7D82" $"8788 8682 7C79 7879 7E82 8585 8481 7E7D" $"7C7D 7F80 8282 8181 8080 8080 7F7E 7C7C" $"7D7F 8283 8381 7E7C 7B7C 7E81 8486 8583" $"7F7B 7A7A 7D80 8384 8381 7F7D 7D7D 7F81" $"8283 8280 7F7E 7F80 8080 807F 7E7E 7F80" $"8181 8180 7F7D 7D7F 8082 8382 817F 7E7D" $"7E7F 8182 8281 7F7E 7E7E 7F80 8181 8180" $"7F7E 7E7F 8183 8484 817C 7979 7D84 898A" $"867E 7772 737A 848D 918E 857B 7370 737D" $"8993 958E 8172 696A 7382 9299 9588 786C" $"6A71 7E8C 9594 8B80 7775 787F 8585 817A" $"7575 7B83 8B8D 8980 7671 747D 8A94 9790" $"8374 6866 6D7B 8C98 9A91 8272 6867 707E" $"8F9A 9A90 8071 696B 7583 8F94 9187 7C73" $"7174 7B82 8687 8481 7F7F 8284 8481 7B77" $"777B 838A 8E8D 867B 716C 6E78 8592 9793" $"8779 6F6B 6F7A 8791 9590 8578 706E 747E" $"888D 8C87 807A 7777 7B80 8384 8280 7F80" $"8385 8582 7D79 7879 7E83 8788 8681 7B76" $"7579 8087 8B8A 857E 7A79 7B7F 8283 827F" $"7E7E 7E80 8181 7F7D 7C7E 8185 8887 837C" $"7674 777D 868B 8C87 7E77 7477 7E87 8D8C" $"857B 7472 757E 878C 8A83 7A77 7C84 8C8D" $"877C 716B 6D77 8591 9590 8476 6E6E 7683" $"9299 978B 7B6B 6365 7182 929A 978A 7A6D" $"6A71 7E8C 9595 8D80 746E 6F76 7F86 8886" $"827F 7E7F 8182 817E 7A77 787E 878F 918C" $"8175 6D6C 737F 8D95 958B 7D6F 686A 7483" $"939B 988C 7D6F 6A6D 7783 8D91 8D85 7B75" $"7377 7E83 8484 8383 8485 8480 7C77 7373" $"7780 8B93 938C 8175 6D6D 747F 8C93 938A" $"7D71 6A6C 7583 8F94 9189 7F77 7374 7A81" $"8586 837F 7D7D 7F81 8281 7D7A 797B 8087" $"8B8B 857C 7573 767D 878E 8E89 7F75 6F6F" $"7580 8A8F 8D85 7B74 747A 838B 8D89 8077" $"7273 7A84 8B8B 857C 7473 7982 8C90 8C82" $"766E 6E76 838F 928D 8177 7376 7E85 8885" $"7E76 7172 7883 8D92 9087 7A6F 6F78 8795" $"988F 7F6D 6162 6D7D 919E 9D90 7E6C 6469" $"7688 999E 9789 7768 6267 7282 9197 9287" $"7971 7177 8088 8B88 8480 7E7F 8080 7D78" $"7473 7781 8C93 938A 7D6F 6869 7382 939D" $"9B8F 7E6D 6467 7182 929A 988C 7C6D 6669" $"7484 9298 958B 7F74 6F70 757D 8387 8888" $"8785 827E 7975 7376 7C85 8D91 8F85 796E" $"6A6D 7786 9399 968B 7D70 696B 7582 8E94" $"9086 7A70 6E72 7B85 8C8F 8C86 7F7A 787A" $"7D80 8180 7E7D 7E80 8283 8380 7D7A 7A7C" $"8186 8988 847E 7875 777C 8288 8B8A 857D" $"7673 747A 8289 8C89 837C 7776 787F 878B" $"8B86 7E76 7376 808A 8E8A 8074 6E6F 7683" $"8F94 9186 7B73 7073 7C89 9497 9082 7166" $"646C 7A8C 989A 9183 746C 6C73 7E8A 9498" $"958C 7F70 6664 6A77 8592 9793 8879 6E6B" $"707B 8994 9996 8D7F 7168 666C 7785 9095" $"938A 7E74 6D6D 727C 8792 9694 8B7E 726A" $"6A70 7A87 9195 9289 7C70 696A 717E 8C96" $"9892 8779 6D68 6B75 828F 9797 8F82 756A" $"676C 7684 9198 978D 7F72 6969 707C 8A94" $"9692 877A 706B 6D75 818D 9291 8A7F 756F" $"6F74 7C86 8C8E 8C86 807A 7675 777B 8186" $"8988 8580 7B78 7777 7A7E 8488 8A89 837C" $"7775 777C 8288 8A89 847E 7874 7478 7E85" $"898A 8782 7D79 787A 7E82 8484 8485 8888" $"827A 716C 6E77 838E 9391 877B 726E 7079" $"8896 9C97 8976 655E 6471 8497 A09B 8D7B" $"6B62 6671 8397 A29F 9281 6D5D 5D68 788D" $"9FA1 9786 7263 6069 788C 9DA3 9C8F 7E6A" $"5E5E 6878 8C9D A198 8875 6560 6674 8698" $"A29E 9282 6F61 5F67 7689 9AA0 9A8D 7C6B" $"6162 6B7A 8D9C A19A 8D7B 6A61 636D 7C8E" $"9B9D 9687 7667 6166 7283 959F 9D92 8270" $"6362 6A78 8998 9D98 8B7B 6C65 6770 7F8F" $"9999 9082 7369 676D 7886 9297 948B 7F74" $"6E6D 727C 858C 8E8B 847C 7572 7379 7F86" $"8A8B 8883 7D78 7575 797F 8488 8785 807D" $"7A7A 7A7C 7E80 8283 8280 7D7C 7B7D 7E80" $"8080 8084 898B 887F 746B 6A71 7C88 9191" $"8A7F 7570 7077 8493 9C98 8B79 675D 616E" $"8094 9F9C 907E 6D63 6470 8398 A29D 8E7B" $"675B 606E 8095 A29E 907E 6B60 626D 7E93" $"A2A2 9585 715F 5C65 7588 9CA2 9A8A 7664" $"5E66 7487 99A2 9E92 8270 615D 6573 8598" $"A09C 8E7B 6A60 626D 7C8E 9EA2 9A8C 7A68" $"5E61 6D7D 909E 9F95 8673 645E 6674 8699" $"A29D 907F 6B5F 606A 7A8D 9DA0 9788 7565" $"6067 7587 989F 9A8D 7C6A 6062 6D7D 909C" $"9D95 8676 6A65 6974 8391 9794 8B7E 7168" $"6970 7D8B 9495 8F84 7971 6D70 7781 8A8E" $"8D87 7E77 7373 787E 8386 8684 817F 7C79" $"787A 7E82 8585 827E 7E81 8585 8079 716F" $"737B 868D 8D88 7E77 7374 7984 9198 968A" $"7968 5F63 6F80 939D 9A8D 7C6B 6367 7589" $"9CA2 9887 7361 5C66 768A 9DA1 9787 7465" $"6068 778B 9EA3 9888 7361 5C66 7589 9CA2" $"9887 7463 5F68 778A 9CA4 9C8D 7B67 5C60" $"6D7E 93A1 9F92 806D 6163 6E7F 909C 9E97" $"8A7A 6B62 636C 7B8C 9A9D 9587 7668 6367" $"7181 939F A096 8673 645F 6573 8698 A09C" $"8E7C 6A5F 626D 7E92 A1A2 9786 7362 5D65" $"7487 9AA2 9C8E 7C68 5E62 6F80 94A2 A094" $"836F 605E 6877 8A9D A39A 8A77 665F 6573" $"8597 9F9A 8D7C 6B62 646F 8092 9C9B 8F7F" $"6F67 6870 7C8A 9496 9186 796F 6A6E 7783" $"8C8F 8E8B 8781 786F 696B 7482 9098 968B" $"7B6D 676B 7585 96A0 9D8F 7D69 5C5E 6A7B" $"90A1 A295 826D 6063 7083 99A4 9D8D 7964" $"5A62 7184 9AA4 9C8B 7865 5E67 768A 9FA5" $"9987 725E 5B67 778C A0A3 9583 6E5E 606D" $"7E95 A5A2 9381 6B5B 5D6A 7C92 A3A1 917E" $"685C 6270 8298 A5A0 9180 6B5D 5E6B 7B91" $"A1A0 9381 6D5F 5F6A 7A8E 9EA1 988A 7869" $"6367 7282 9198 958A 7C6F 6868 6E79 8591" $"9898 9185 786D 696C 7581 8C92 9189 7E73" $"6C6C 727E 8B94 9691 8779 6E68 6B74 828E" $"9492 8A7F 756F 6E75 7F8A 9291 8A7F 746F" $"6F74 7C86 8E91 8D83 7971 6F74 7E89 9090" $"8A80 7771 7174 7C85 8D90 8B81 7670 6F75" $"7F89 8F8F 8A83 7D7A 7977 7778 7C83 8889" $"8781 7973 7276 7E88 9198 978F 7F6E 6160" $"6A7A 8E9E 9F93 806D 6163 6F80 96A5 A192" $"7F69 5B5F 6D80 97A5 9F8F 7C66 5C63 7184" $"9BA7 9F8E 7A64 5961 7184 9CA7 9D8C 7862" $"5A65 7488 9FA7 9D8C 7963 5961 7082 9AA6" $"9E8E 7A64 5A63 7286 9DA6 9E8E 7B65 5A61" $"6F81 97A4 9E8F 7C68 5C61 6E7F 94A1 9F93" $"8371 6563 6B79 8A96 9892 8577 6B67 6B74" $"808D 9595 9085 7970 6C6F 757F 898F 8F88" $"7F76 7272 767E 888E 8F8B 8279 726F 7177" $"7F88 8D8D 877E 7875 767B 8389 8C8A 837A" $"7370 7379 8087 8B8A 867F 7975 767B 8288" $"8B89 837C 7774 7578 7D83 888A 8882 7C76" $"7577 7C83 888A 8884 7E79 7574 777D 858B" $"8C88 8179 7473 767D 858B 8C89 827A 7473" $"767C 848A 8C8A 847C 7673 747A 8287 8987" $"8584 837F 7972 6F73 7C88 9193 8C7F 726C" $"6F79 8792 9792 8577 6C6A 6F79 858F 928E" $"857A 706D 7078 8490 9693 897D 736E 6F77" $"838C 8F8B 8278 706F 737C 8790 938E 8378" $"7170 757E 888E 8E89 7F76 7070 7882 8B8E" $"8B84 7B75 7375 7C85 8C8D 8981 7974 7377" $"7E86 8B8C 8881 7974 7376 7C84 8B8D 8B83" $"7A73 7074 7C86 8E90 8C84 7B73 7072 7983" $"8B8D 8A83 7A74 7375 7C85 8B8E 8C85 7C75" $"7274 7A83 8A8C 8881 7974 7377 7F87 8D8E" $"8A82 7974 7377 7E85 8A8A 8680 7974 7479" $"8187 8B8A 8580 7A77 777A 7F83 8686 837F" $"7B79 797C 7F83 8585 8380 7E7B 7B7C 7F81" $"8383 817F 7D7C 7C7D 7F82 8383 827F 7D7C" $"7D7F 8081 8180 807F 7E7D 7D7E 8081 8180" $"8080 8080 807F 7F7F 7F7F 7F7E 7E7E 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 7F7F 7E7E" $"7E7F 8080 7F7E 7D7E 7F80 8181 817F 7E7D" $"7D7F 8082 8282 807E 7D7D 7D7D 7E7E 8081" $"8282 807E 7D7D 7E7F 8182 8281 807F 7D7C" $"7C7E 8083 8382 7F7D 7B7C 7D7F 8283 8382" $"807E 7C7C 7D7F 8183 8381 7F7D 7C7C 7D7E" $"8182 8382 807E 7C7C 7D7F 8183 8482 807E" $"7C7B 7C7D 8082 8383 817E 7C7B 7C7E 8184" $"8584 817E 7C7B 7B7E 8083 8483 817E 7C7A" $"7B7D 8184 8585 827F 7C7B 7B7D 8083 8484" $"827F 7C7A 7A7C 8083 8585 827F 7C7B 7C7E" $"8183 8482 807E 7C7C 7D7F 8182 8382 807E" $"7D7D 7E80 8182 8281 807E 7D7E 7E80 8181" $"8181 807F 7E7E 7E7F 8081 8282 8180 7F7E" $"7E7E 8081 8181 8180 7F7E 7E7F 8081 8180" $"807F 7F7F 8080 8080 8080 7F7F 7F7F 8080" $"8080 807F 7F7F 7F80 8181 8180 7F7E 7E7E" $"7F80 8181 8180 807F 7E7E 7F80 8181 8181" $"807F 7E7E 7E80 8182 8281 807F 7E7E 7F7F" $"8081 8181 807F 7E7E 7F80 8182 8281 807F" $"7E7E 7F80 8081 8080 7F7F 7E7E 7F80 8181" $"8181 807F 7F7F 7F7F 8080 8080 8080 7F7F" $"7F80 8080 8081 8180 807F 7F7F 7F7F 7F80" $"8080 807F 7F7F 8080 8181 8180 807F 7F7F" $"7F7F 8080 8080 7F7F 7F7F 8080 8080 8080" $"8080 807F 7F7F 8080 8080 8080 7F7F 7F80" $"8080 8181 8080 8080 8080 7F7F 7F80 8080" $"8080 807F 8080 8080 8181 8180 807F 7F7F" $"8080 8181 8080 807F 7F80 8081 8181 8180" $"7F7F 7F7F 8080 8181 807F 7F7F 7F80 8182" $"8281 807F 7E7E 7F80 8081 8181 807F 7E7E" $"7E80 8182 8282 807F 7E7E 7E80 8182 8281" $"807F 7E7D 7E7F 8182 8382 817F 7E7D 7D7F" $"8182 8382 807E 7D7D 7E7F 8183 8382 817F" $"7D7D 7E7F 8182 8282 807F 7E7E 7E7F 8182" $"8282 8180 7E7E 7E7F 8081 8282 8180 7F7E" $"7E7F 8081 8282 8180 7F7E 7E7F 8081 8181" $"8180 7F7E 7E7F 8081 8181 807F 7F7E 7F7F" $"8081 8181 807F 7E7E 7E7F 8081 8181 807F" $"7E7E 7F7F 8081 8180 807F 7F7F 7F80 8081" $"8180 807F 7F7F 7F7F 8080 8080 807F 7F7F" $"7F80 8080 8080 8080 7F7F 7F7F 8080 8080" $"807F 8080 8080 8080 8080 8080 7F7F 8080" $"8080 7F7F 7F7F 7F7F 8080 8080 807F 7F7F" $"7F80 8080 8080 7F7F 7E7E 7F7F 8080 8080" $"807F 7F7F 7F80 8081 8080 7F7F 7E7E 7F7F" $"8080 8080 7F7F 7F7F 7F80 8080 807F 7F7E" $"7E7F 7F80 8080 7F7F 7F7F 7F80 8080 8080" $"807F 7F7F 7F7F 7F80 807F 7F7F 7F7F 7F7F" $"8080 8080 807F 7F7E 7F7F 8080 807F 7F7F" $"7E7F 7F80 8081 8080 7F7F 7E7E 7F80 8080" $"8080 7F7F 7F7F 7F7F 8080 8080 7F7E 7E7E" $"7F7F 8080 8080 7F7F 7F7F 7F7F 8080 8080" $"807F 7F7F 7F7E 7F7F 7F80 8080 807F 7F7F" $"7E7F 7F80 8081 8080 7F7E 7E7E 7F7F 8081" $"8180 7F7E 7E7E 7E7F 8081 8180 7F7E 7E7D" $"7E7F 8080 8181 807F 7E7E 7E7F 7F80 8181" $"807F 7E7E 7D7E 7F80 8081 8080 7F7E 7E7E" $"7F7F 8080 8080 7F7E 7E7D 7E7E 7F80 8080" $"807F 7F7E 7E7F 7F80 8080 807F 7E7E 7E7E" $"7E7F 8080 8080 7F7F 7E7E 7F7F 8080 8080" $"7F7F 7E7E 7E7F 7F80 807F 7F7F 7E7F 7F7F" $"8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7E7C 7A7D 868F 9189" $"7A6B 6569 7688 979A 9181 6F66 6975 879A" $"A197 8773 605D 6776 8C9F A195 836D 6167" $"778C 9F9F 907E 685C 6270 839A A49B 8A75" $"6261 6E81 98A4 9A89 7460 5C68 7A90 A4A1" $"917E 675C 6473 869D A79D 8B76 6058 6374" $"89A0 A79B 8A74 5F5D 6B7C 93A6 A595 836E" $"5B59 6777 8EA3 A697 846E 5C5E 6D7F 96A6" $"A192 8069 5B61 7083 9AA5 9C8C 7964 5B64" $"7387 9CA4 9A89 7565 646F 8093 9C98 8B7A" $"6A62 6671 8292 9893 887C 7474 7A83 8A8C" $"877F 7670 7075 7D85 8A89 857F 7B7A 7C80" $"8487 8884 7C74 7072 7A84 8B8C 8983 7C77" $"7577 7E86 8C8B 847B 726F 7277 808C 9698" $"8F7E 6B60 6371 8498 9F96 8571 6463 6C7B" $"8E9F A297 8571 5E5B 6778 8EA2 A294 816B" $"5E63 7489 9FA4 9583 6D5B 5D6C 7E96 A59E" $"8D79 635E 6C7F 96A4 9B89 7560 5B68 7A90" $"A3A1 907C 675E 687B 91A3 9F8E 7A64 5A64" $"768B A1A4 9582 6C5D 6373 889E A495 826C" $"5B5D 6C7E 95A6 A393 816B 5E65 778C A0A1" $"907D 685A 5E6E 8097 A7A2 917F 6A5C 6375" $"899E A394 816E 5C5D 6D7F 95A6 A18F 7F6B" $"5C61 7285 9BA4 9885 735F 5B69 7A8E A3A5" $"9685 715E 5D6D 7E94 A59F 8D7B 665A 6374" $"879E A69A 8875 605B 6879 8EA3 A595 836E" $"5C5F 6E80 97A5 9D8B 7862 5A65 768A A1A7" $"9987 725E 5D6B 7C93 A49F 8E7B 655A 6474" $"879E A79C 8A75 605B 687A 90A4 A190 7D66" $"5B64 7589 A0A6 9785 6F5C 5D6D 8097 A69E" $"8C78 625B 687A 91A4 A18F 7C66 5962 7388" $"9FA7 9A88 7460 5D6C 7E96 A49A 8874 5F5B" $"6979 90A3 A090 7D66 5D68 7A90 A19D 8C79" $"635B 6777 8CA0 A090 7C69 616C 7F92 9B93" $"826F 6465 7284 9397 8E80 736E 7583 8F92" $"8A7C 6E66 6974 8493 9790 8072 6B70 7D8D" $"9795 8877 6862 6876 8897 9A91 8170 686C" $"7A8C 9898 8C7A 6961 6572 8596 9C96 8674" $"6969 7486 979B 917E 6B60 626F 8296 9F99" $"8A77 6865 6E80 949E 9887 7261 5E69 7A90" $"A0A0 927F 6B60 6575 8B9E A092 7E69 5C61" $"6F82 98A4 9E8D 7965 5F68 798E 9E9E 8F7C" $"695F 6371 8397 A29D 8E7A 6961 6775 8796" $"9A93 8574 6865 6C7B 8D9B 9C93 8474 6967" $"6C79 8895 988F 7F6F 6769 7484 939A 978D" $"7E70 6869 7282 9096 9082 746C 6E76 838E" $"9391 897D 736D 6F77 838C 8E89 8077 7476" $"7C84 898B 8982 7B75 7478 7F85 8786 827C" $"7A7A 7D81 8587 8682 7E79 787A 7E82 8484" $"837F 7D7C 7C7F 8183 8483 817E 7C7C 7D7E" $"7F7F 8081 8384 8380 7D7B 7C7D 8083 8485" $"8380 7C78 777A 8087 8C8B 847C 7674 777D" $"858B 8D89 8077 7171 7782 8C91 8E84 7972" $"7075 7E88 8F90 897F 746F 7078 848D 908C" $"8379 7271 767E 888E 8E87 7D74 7073 7C86" $"8C8C 877F 7875 757A 8188 8B89 827A 7474" $"7A81 8789 8580 7B79 797C 8185 8786 817B" $"7777 7B81 8686 847F 7B79 7A7D 8185 8785" $"817B 7777 7B81 8586 837F 7B79 7A7D 8286" $"8785 807A 7777 7B81 8687 847F 7B78 797C" $"8185 8785 807B 7878 7B80 8484 827F 7D7C" $"7C7E 8081 8282 807E 7C7C 7E80 8180 7E7D" $"7E80 8283 827F 7D7C 7B7D 7F81 8383 817D" $"7979 7B81 8688 8782 7C78 7778 7D82 8788" $"8580 7A77 777C 8287 8986 817C 7877 797D" $"8286 8785 807C 7979 7C80 8485 8582 7F7B" $"797A 7D80 8384 8482 807E 7D7D 7D7F 8082" $"8382 807E 7C7B 7C7E 8183 8483 817F 7D7C" $"7C7E 8082 8483 817E 7B7B 7C7F 8285 8583" $"807C 7B7B 7D80 8485 8481 7D7B 7B7C 8083" $"8585 8380 7D7B 7B7E 8183 8483 817E 7D7D" $"7E80 8283 8281 7F7E 7E7E 8080 8181 8080" $"7F80 8081 8180 807F 7F80 8181 8180 7F7E" $"7E7F 8182 8382 817F 7E7D 7E7F 8182 8382" $"807E 7D7D 7F82 8484 8280 7E7D 7E7F 8082" $"8282 807F 7E7E 7F80 8282 8180 7F7F 7F80" $"8081 8181 807F 7F7F 8081 8180 7F7F 7F80" $"8181 8181 8080 7F7E 7F7F 8182 8281 7F7E" $"7E7F 8082 8382 8180 7E7D 7D7E 8183 8382" $"807E 7D7D 7F81 8383 8381 7F7D 7D7E 8082" $"8383 817F 7E7D 7E7F 8183 8382 807E 7D7D" $"7F81 8383 8180 7E7D 7E7F 8182 8382 807E" $"7D7D 7F81 8383 8280 7E7D 7D7F 8082 8382" $"807E 7D7D 7E81 8383 8281 7F7E 7D7E 8081" $"8282 8180 7E7E 7E7F 8182 8281 807F 7F7F" $"8080 8080 8080 7F7F 7F80 8080 8080 7F7F" $"8081 8181 807F 7F7F 7F80 8081 8180 7F7D" $"7D7E 7F81 8383 8280 7E7C 7D7E 8082 8382" $"807E 7C7B 7D80 8384 8482 7F7C 7B7C 7E81" $"8383 827F 7D7B 7B7D 8083 8483 817E 7D7C" $"7D7F 8182 8281 7F7D 7D7D 7E80 8182 8280" $"7F7E 7E7E 7F80 8181 8180 7F7E 7E7E 7F80" $"8081 8180 7F7F 7E7E 7F80 8181 8181 7F7E" $"7D7D 7E7F 8081 8281 807E 7D7E 7F80 8182" $"8281 7F7E 7D7D 7E80 8182 8180 7F7E 7D7E" $"7F81 8282 8180 7F7E 7D7E 7F80 8181 807F" $"7E7E 7E7F 8081 8282 8180 7E7E 7E7E 7F80" $"8180 807F 7E7E 7E7F 8081 8181 807F 7E7E" $"7E7F 7F80 8181 807F 7E7E 7E7F 8081 8181" $"807F 7E7E 7E7F 8081 8180 7F7E 7E7E 7F80" $"8181 8180 7F7E 7E7E 7F80 8181 807F 7E7E" $"7E7F 8181 8180 7F7F 7E7F 00" }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Guitar.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Guitar.r new file mode 100644 index 0000000..630963c --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Guitar.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 2600 0000 0647 7569 7461" /* ......&....Guita */ $"72" /* r */ }; data $8024 (0x26) { $"0000 4700 E88E 0000 772B 8080 8080 8080" /* ..G..Ž..w+€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"7C7B 7B7B 7875 7475 7474 7B81 807E 8284" /* |{{{xututt{�€~‚„ */ $"828A 969B A6AE AEA9 9B8C 8481 8485 7E78" /* ‚Š–›¦®®©›Œ„�„…~x */ $"787A 7975 6E67 615E 5954 5255 585C 646C" /* xzyunga^YTRUX\dl */ $"6F69 615C 5C5F 6060 626E 7B82 8789 898D" /* oia\\_``bn{‚‡‰‰� */ $"9498 9997 9493 98A4 B0B7 AFA2 A0A9 A69C" /* ”˜™—”“˜¤°·¯¢ ©¦œ */ $"978E 8686 7E71 6A69 7281 8881 7268 6A75" /* —ކ†~qjir�ˆ�rhju */ $"7F7B 747D 8890 9AA2 A6AF B6B9 B19F 8A7E" /* .{t}ˆ�𢦝¶¹±ŸŠ~ */ $"7D87 9398 9490 9393 8C7D 6D63 6165 696A" /* }‡“˜”�““Œ}mcaeij */ $"6864 6061 6669 6459 4F4D 4F51 5150 555F" /* hd`afidYOMOQQPU_ */ $"6565 5F54 4F54 5C61 615E 5A5F 6D7C 8684" /* ee_TOT\aa^Z_m|†„ */ $"7A7D 8C92 8E8F 8A84 8580 756D 6D79 8E9F" /* z}Œ’Ž�Š„…€ummyŽŸ */ $"A194 857F 8796 9790 949E A6B2 BCC0 C5CA" /* ¡”….‡–—�”ž¦²¼ÀÅÊ */ $"CFCF C3AF 9E97 9DA9 B1AD A5A1 9D94 8676" /* ÏÏïž—�©±­¥¡�”†v */ $"6860 5E60 6468 655E 5759 5F5F 5850 5054" /* h`^`dhe^WY__XPPT */ $"5A5C 5A5B 6167 6B6A 625B 5D66 6F75 7571" /* Z\Z[agkjb[]fouuq */ $"727C 8A95 9383 7E8B 9290 9089 8282 7E73" /* r|Š•“ƒ~‹’��‰‚‚~s */ $"665E 6274 8991 8977 696A 787B 7576 7D83" /* f^bt‰‘‰wijx{uv}ƒ */ $"8E99 A1A7 ADB6 BDB8 A894 8687 94A0 A09A" /* Ž™¡§­¶½¸¨”†‡”  š */ $"9491 8D84 786E 6665 6970 7574 706A 6A72" /* ”‘�„xnfeiputpjjr */ $"7770 6663 666D 7372 7073 777C 7C76 6D68" /* wpfcfmsrpsw||vmh */ $"6E76 7D7D 7875 7A86 9497 877E 868C 8E90" /* nv}}xuz†”—‡~†ŒŽ� */ $"8B87 8785 7B6E 6461 6D81 908F 806F 6C79" /* ‹‡‡…{ndam���€oly */ $"817C 7C80 8792 9DA5 ABB1 BAC4 C3B6 A28F" /* �||€‡’�¥«±ºÄö¢� */ $"8990 9B9F 9A93 8F8B 8275 675C 5755 585C" /* ‰�›Ÿš“�‹‚ug\WUX\ */ $"5D59 5450 575F 5B53 4E4C 5258 5B5C 6066" /* ]YTPW_[SNLRX[\`f */ $"6D71 7067 6064 6D75 7976 7377 8395 A096" /* mqpg`dmuyvswƒ• – */ $"8C90 969B 9E9A 9696 9691 8577 7076 899B" /* Œ�–›žš–––‘…wpv‰› */ $"9F94 7F76 8088 8584 858A 939C A5AB B1BA" /* Ÿ”.v€ˆ…„…Š“œ¥«±º */ $"C6CB C4B2 9D91 939D A5A3 9C98 948D 8275" /* ÆËIJ�‘“�¥£œ˜”�‚u */ $"6960 5A5B 5F60 5E58 5356 5F61 5B54 5052" /* i`Z[_`^XSV_a[TPR */ $"575B 5B5B 6066 6C6E 6860 5C60 686D 6D69" /* W[[[`flnh`\`hmmi */ $"676A 7A8A 8A81 7F82 878B 8B88 8788 8781" /* gjzŠŠ�.‚‡‹‹ˆ‡ˆ‡� */ $"766A 656E 808E 9184 7473 797D 7D7D 7E84" /* vjen€Ž‘„tsy}}}~„ */ $"8C95 9DA3 AAB6 C1C6 BFAF 9E96 99A2 A7A6" /* Œ•�£ª¶ÁÆ¿¯ž–™¢§¦ */ $"A3A0 9C95 8B7F 756C 686A 6B6B 6761 5E64" /* £ œ•‹.ulhjkkga^d */ $"6968 635E 5C5F 6366 6667 6C72 7877 7069" /* ihc^\_cffglrxwpi */ $"686D 7476 746F 6D76 868B 8681 8083 888A" /* hmtvtomv†‹†�€ƒˆŠ */ $"8884 8485 8279 6C63 6674 8690 8978 7276" /* ˆ„„…‚ylcft†�‰xrv */ $"797B 7C7C 8086 8E95 9BA1 AAB6 BDBB AE9C" /* y{||€†Ž•›¡ª¶½»®œ */ $"8F8D 949B 9D9B 9794 8E85 7B72 6861 6263" /* ��”›�›—”Ž…{rhabc */ $"6463 5D58 5B62 6460 5B57 585D 6163 6568" /* dc]X[bd`[WX]aceh */ $"6F76 7A75 6E6C 6F77 7D7D 7974 7B8B 9593" /* ovzunlow}}yt{‹•“ */ $"8E8B 8C91 9493 908F 8F8D 877A 6D6B 7486" /* Ž‹Œ‘”“����‡zmkt† */ $"9594 847B 7A7D 7F80 8082 878D 949B A0A7" /* •”„{z}.€€‚‡�”› § */ $"B2BB BEB6 A796 8E91 969A 9C9A 9692 8B81" /* ²»¾¶§–Ž‘–šœš–’‹� */ $"786F 6663 6365 6562 5C5A 5E62 615C 5855" /* xofcceeb\Z^ba\XU */ $"575A 5D5E 6064 6A70 706C 6665 6A70 7474" /* WZ]^`djpplfejptt */ $"6F6E 7882 8888 8584 868A 8B8A 8888 8886" /* onx‚ˆˆ…„†Š‹Šˆˆˆ† */ $"7F73 6A6A 7485 8F8C 847E 7E80 8384 8689" /* .sjjt…�Œ„~~€ƒ„†‰ */ $"8F95 9CA3 A8B2 BDC5 C5BC AD9F 9A9C A0A3" /* �•œ£¨²½Åż­Ÿšœ £ */ $"A3A0 9C96 8E86 7C71 6A68 696A 6863 5E5F" /* £ œ–ކ|qjhijhc^_ */ $"6364 625D 5959 5B5D 5E5F 6066 6D6F 6C67" /* cdb]YY[]^_`fmolg */ $"6365 6B71 736F 6B72 7C84 8785 8284 888A" /* cekqsokr|„‡…‚„ˆŠ */ $"8988 8787 8681 766B 6569 7987 8781 7976" /* ‰ˆ‡‡†�vkeiy‡‡�yv */ $"7678 7A7B 7D82 888F 959B A3AE B9BD B9AD" /* vxz{}‚ˆ�•›£®¹½¹­ */ $"9E95 9497 9C9E 9D9A 968F 887F 746C 696A" /* ž•”—œž�š–�ˆ.tlij */ $"6B6B 6763 6266 6A6A 6763 6263 6568 696A" /* kkgcbfjjgcbcehij */ $"6E75 7979 746E 6D71 797F 7772 7479 8185" /* nuyytnmqy.wrty�… */ $"7E79 777B 898B 8A8D 91A4 B0B6 A98A 7177" /* ~yw{‰‹Š�‘¤°¶©Šqw */ $"8A89 7E79 7064 5953 4C49 515D 707E 7672" /* Љ~ypdYSLIQ]p~vr */ $"7D8A 93A4 B0AB A2A1 ADB3 B2B0 BBCE CDB3" /* }Š“¤°«¢¡­³²°»Îͳ */ $"ACA6 8E7A 6D66 514C 5A67 5746 4F5F 5558" /* ¬¦ŽzmfQLZgWFO_UX */ $"6B7C 8C99 A5A0 846F 768A 8C82 8681 6D59" /* k|Œ™¥ „ovŠŒ‚†�mY */ $"5559 5E60 626B 6E5C 4E52 5756 606C 6B5B" /* UY^`bkn\NRWV`lk[ */ $"5155 5346 4663 878E 808D 928D 8684 7A6B" /* QUSFFc‡Ž€�’�†„zk */ $"7398 B7AF 9CA8 C6CA D8E9 F4F5 F4F9 F5DA" /* s˜·¯œ¨ÆÊØ....... */ $"C0C3 D6D3 C2B5 9B74 5548 4A51 4A3B 393C" /* ÀÃÖÓµ›tUHJQJ;9< */ $"302C 3438 3337 4144 3835 4456 5B5D 7084" /* 0,4837AD85DV[]p„ */ $"7B65 7984 8374 6D61 5157 7A95 8467 6C7E" /* {ey„ƒtmaQWz•„gl~ */ $"787E 8BA1 AFB9 C4BB 9575 80A2 ACA1 9988" /* x~‹¡¯¹Ä»•u€¢¬¡™ˆ */ $"7262 616D 7875 717D 897E 7D8E A2AA AFB3" /* rbamxuq}‰~}Ž¢ª¯³ */ $"A88F 818B 9795 93A2 B6A7 9198 9388 7975" /* ¨��‹—•“¢¶§‘˜“ˆyu */ $"654F 4962 7869 515B 675E 6371 8796 A2B3" /* eOIbxiQ[g^cq‡–¢³ */ $"B69E 8588 9A97 8780 7561 4E43 474F 504E" /* ¶ž…ˆš—‡€uaNCGOPN */ $"585E 4F4A 535E 6066 7175 6961 6768 5E60" /* X^OJS^`fquiagh^` */ $"7EA3 9E94 9C9F 9A95 9689 7373 95B0 A48B" /* ~£ž”œŸš•–‰ss•°¤‹ */ $"9BAB B2BE CDD9 DCE0 EEED D1B4 B5C6 C3B5" /* ›«²¾Í.....Ñ´µÆÃµ */ $"A992 7154 4546 483F 3339 3D31 2C32 3937" /* ©’qTEFH?39=1,297 */ $"3A45 4B3E 3742 5052 5364 7E74 6A73 807F" /* :EK>7BPRSd~tjs€. */ $"7A7B 715E 5C79 968F 7379 8485 8793 A4B2" /* z{q^\y–�sy„…‡“¤² */ $"BFD1 D2B6 9592 A9B6 B4AD A18C 786C 6C6F" /* ¿ÑÒ¶•’©¶´­¡Œxllo */ $"6D66 707B 7774 7D8E 98A0 A8A8 9583 838C" /* mfp{wt}Ž˜ ¨¨•ƒƒŒ */ $"8B84 8FA6 9F91 8E8E 8377 746B 5446 556F" /* ‹„�¦Ÿ‘ŽŽƒwtkTFUo */ $"6B54 555B 5B59 6270 7C88 9CA9 9C83 7D8B" /* kTU[[Ybp|ˆœ©œƒ}‹ */ $"8F89 827B 6D5C 4D4D 5253 4F57 6059 5257" /* �‰‚{m\MMRSOW`YRW */ $"6164 6976 7F77 6D6E 716A 6377 9597 9193" /* adiv.wmnqjcw•—‘“ */ $"9894 9091 8A74 6C82 A4A3 9196 A5B1 BAC5" /* ˜”�‘Štl‚¤£‘–¥±ºÅ */ $"CED1 D5E3 E9D8 BCB2 BDC2 BCB0 9E83 6856" /* ÎÑÕ..ؼ²½Â¼°žƒhV */ $"5456 4F41 4447 4038 3A3F 3E3F 4A52 483F" /* TVOADG@8:?>?JRH? */ $"4858 5D58 6A7D 7870 7680 7F7B 7B74 615B" /* HX]Xj}xpv€.{{ta[ */ $"7193 8F7D 7E85 888B 96A4 B1BE D0D3 BC9A" /* q“�}~…ˆ‹–¤±¾ÐÓ¼š */ $"8F9C A9AA A497 8572 6362 6561 5B62 6B68" /* �œ©ª¤—…rcbea[bkh */ $"646A 7984 8B96 9B8D 7E7D 8688 818D 9FA0" /* djy„‹–›�~}†ˆ��Ÿ  */ $"9794 938A 807E 7862 5056 6F73 655F 6162" /* —”“Š€~xbPVose_ab */ $"6269 7480 8BA0 B2B0 9B8E 9196 9592 8C81" /* bit€‹ ²°›Ž‘–•’Œ� */ $"7060 5C61 625E 636B 6861 6266 696A 737D" /* p`\ab^ckhabfijs} */ $"796C 6668 655C 677E 8784 8387 8683 8481" /* ylfhe\g~‡„ƒ‡†ƒ„� */ $"7061 6C8B 948C 8B97 A3AD B6BF C4C8 D6E3" /* pal‹”Œ‹—£­¶¿ÄÈÖ. */ $"DFC7 B7B6 BBBA B1A0 8A70 5C55 5550 463F" /* .Ç·¶»º± Šp\UUPF? */ $"4341 3C38 3632 2E32 3F46 454E 6469 6470" /* CA<862.2?FENdidp */ $"8392 969A A7AD A4A0 9984 7483 9DA1 9A93" /* ƒ’–š§­¤ ™„tƒ�¡š“ */ $"8989 898A 9B9A A0AD AC94 7768 6C6B 5748" /* ‰‰‰Š›š ­¬”whlkWH */ $"4A40 2015 2A56 7167 5459 646A 7A93 ABC7" /* J@ .*VqgTYdjz“«Ç */ $"D8D5 C5AE A5B9 C4BC CBEC F6E8 E0D0 CDBE" /* ØÕÅ®¥¹Ä¼Ë....Ð; */ $"A386 6542 3D52 5B51 3313 0207 040C 1935" /* £†eB=R[Q3......5 */ $"6EA1 976D 5556 667C 828C 9389 8082 8178" /* n¡—mUVf|‚Œ“‰€‚�x */ $"7B85 8D95 A5AF BBB5 B7CE D0B2 9180 807A" /* {…�•¥¯»µ·Îв‘€€z */ $"7583 8F7A 4F46 4239 3231 3749 4641 4949" /* uƒ�zOFB9217IFAII */ $"414B 5C69 8195 A4B0 B8BF CFD4 BEAB BDDF" /* AK\i�•¤°¸¿ÏÔ¾«½. */ $"F9F7 DCD3 CDB1 9282 7870 717B 7C6E 4D3B" /* ...Óͱ’‚xpq{|nM; */ $"3329 2B34 323D 5A6D 6A5C 4E51 5B5A 6779" /* 3)+42=Zmj\NQ[Zgy */ $"7C7C 837E 6856 5A65 7285 9AB2 A89F B2C9" /* ||ƒ~hVZer…š²¨Ÿ²É */ $"C7BB B9C1 C4B9 B1B3 AA99 8E7A 6250 3F3F" /* Ç»¹Áű³ª™ŽzbP?? */ $"5F74 716C 685D 5C64 7083 8E95 A1A1 8A7D" /* _tqlh]\dpƒŽ•¡¡Š} */ $"878A 7373 89AC B7A3 98A0 A291 7957 3C3C" /* ‡Šss‰¬·£˜ ¢‘yW<< */ $"566C 6E51 3B32 2827 313A 568A B3BF B49D" /* VlnQ;2('1:Vг¿´� */ $"8E91 97A1 ACA9 9E9A 968F 868A 867F 7B86" /* Ž‘—¡¬©žš–�†Š†.{† */ $"A2AB 9A97 ADB8 A985 6B63 6463 7174 6250" /* ¢«š—­¸©…kcdcqtbP */ $"453A 332B 2B43 5552 5563 6B6E 7177 8DA4" /* E:3++CURUcknqw�¤ */ $"B2C2 D4D9 DAEB F9E9 D2C5 D8F8 F7DE CDC3" /* ²ÂÔ.....ÒÅØ...Íà */ $"AF97 826A 5A57 6168 5539 2818 0A09 0606" /* ¯—‚jZWahU9(..Æ.. */ $"142D 4348 3C37 3E3F 4150 6064 6C7B 8169" /* .-CH<7>?AP`dl{�i */ $"5A61 767F 7E90 AAB2 AFBC D1DC DAD9 D8D2" /* Zav.~�ª²¯¼Ñ...ØÒ */ $"C1BB BCB3 A596 8069 5236 3246 5860 6564" /* Á»¼³¥–€iR62FX`ed */ $"605D 5B64 757F 8996 A092 8589 8A87 838C" /* `][du.‰– ’…‰Š‡ƒŒ */ $"A5BA B7B0 AFB3 B2A7 8B6D 626D 848A 7966" /* ¥º·°¯³²§‹mbm„Šyf */ $"574A 4745 404F 769E B3AE 9888 817D 848B" /* WJGE@Ovž³®˜ˆ�}„‹ */ $"877A 767A 7269 6366 6960 5F74 8483 818F" /* ‡zvzricfi`_t„ƒ�� */ $"9D9C 8772 675B 5B6D 7973 6758 4E45 3A34" /* �œ‡rg[[mysgXNE:4 */ $"404B 5262 747D 8281 8393 A3AD B6C8 D3DC" /* @KRbt}‚�ƒ“£­¶ÈÓ. */ $"E8E9 E1CE BBC2 D8DE D1C0 B4A6 9B8A 7662" /* ...Î»ÂØ.ÑÀ´¦›Švb */ $"575E 665B 4B3A 281E 1D16 1017 2C47 5553" /* W^f[K:(.....,GUS */ $"555C 5A5C 6B77 777E 9196 8A79 7E90 9691" /* U\Z\kww~‘–Šy~�–‘ */ $"9CAF B8B8 C1CE D8DA D9D8 C8B3 ADAD A79E" /* œ¯¸¸ÁÎØ..ØÈ³­­§ž */ $"8B74 5E43 261D 2634 4451 5557 5451 5868" /* ‹t^C&.&4DQUWTQXh */ $"7379 868C 8886 8787 8786 8E9F AFB3 AFAC" /* sy†Œˆ†‡‡‡†ŽŸ¯³¯¬ */ $"AFB5 AD94 796D 7383 867B 6C5C 504D 463E" /* ¯µ­”ymsƒ†{l\PMF> */ $"4560 8195 9080 7874 7172 7872 6462 686D" /* E`�•�€xtqrxrdbhm */ $"6965 6B70 6969 7A8C 9195 A2AF AFA1 948A" /* iekpiizŒ‘•¢¯¯¡”Š */ $"7B79 8793 9084 7569 5D4E 4342 4349 5A69" /* {y‡“�„ui]NCBCIZi */ $"7376 7270 7A8A 929B AAB8 C7D1 D3CD BDAF" /* svrpzŠ’›ª¸ÇÑÓͽ¯ */ $"B6CA D2C9 BDB2 AAA2 9788 766B 6F73 6C60" /* ¶ÊÒɽ²ª¢—ˆvkosl` */ $"5140 3832 281E 1F2E 4551 4F53 5652 525D" /* Q@82(...EQOSVRR] */ $"6665 6E7C 8074 676C 7B7E 7E8A 9DA6 ABB6" /* fen|€tgl{~~Š�¦«¶ */ $"C4CF D2D6 D6C8 B9B4 B3AF A695 816B 4F35" /* ÄÏÒÖÖȹ´³¯¦•�kO5 */ $"2F36 4452 5B5F 605C 5A62 7079 828F 918D" /* /6DR[_`\Zbpy‚�‘� */ $"8A8B 8C8B 8B95 A7B5 B5B3 B3B7 B9AD 947B" /* Š‹Œ‹‹•§µµ³³·¹­”{ */ $"6F79 8685 7969 5950 4B42 3E4B 6888 988F" /* oy†…yiYPKB>Khˆ˜� */ $"8179 7371 787B 7168 6A6E 6E68 676E 6D69" /* �ysqx{qhjnnhgnmi */ $"7186 9395 9CAA B4AD 9C91 8479 7F8D 918B" /* q†“•œª´­œ‘„y.�‘‹ */ $"7D70 6456 4743 4445 4D5D 6A73 736E 707E" /* }pdVGCDEM]jssnp~ */ $"8A92 9FAD BAC7 D0D1 C7B6 AFBC CDD0 C7BA" /* Š’Ÿ­ºÇÐÑǶ¯¼ÍÐǺ */ $"AFA7 9F93 8271 6B70 716A 5F50 423A 3329" /* ¯§Ÿ“‚qkpqj_PB:3) */ $"2125 374A 5151 5556 5255 6166 6872 7D7E" /* !%7JQQUVRUafhr}~ */ $"726A 707B 7D81 909E A4AA B6C2 C9CC CECD" /* rjp{}��ž¤ª¶ÂÉÌÎÍ */ $"C2B8 B5B2 ACA2 927F 694E 3A38 404C 585E" /* ¸µ²¬¢’.iN:8@LX^ */ $"6161 5D5E 6873 7A84 8F90 8B88 898A 898A" /* aa]^hsz„��‹ˆ‰Š‰Š */ $"95A6 AFB0 AFB0 B3B3 A58E 7870 7983 8076" /* •¦¯°¯°³³¥Žxpyƒ€v */ $"6758 5049 403F 4E6B 8894 8D82 7872 7379" /* gXPI@?Nkˆ”�‚xrsy */ $"7A72 6D6F 6F6A 6464 6764 616C 7F8A 8F9B" /* zrmoojddgdal.Š�› */ $"B7D4 C4B5 A993 869C B6AF 987B 5A49 341C" /* ·Ôĵ©“†œ¶¯˜{ZI4. */ $"0D1B 2F3B 4D57 5E67 654E 413B 4E67 6E8E" /* Â./;MW^geNA;NgnŽ */ $"B5CC CBCE C3D3 F9FD FAFF FFFF FFF8 DAC6" /* µÌËÎÃÓ.........Æ */ $"AD8C 7887 9C88 5E3D 494D 330A 0102 1108" /* ­Œx‡œˆ^=IM3..... */ $"0115 2D1D 1936 3746 5E56 5075 9FAD 9F8C" /* ..-..67F^VPuŸ­ŸŒ */ $"8CA8 A682 7099 CCD1 C1C1 D1D2 C5A8 8F72" /* Œ¨¦‚p™ÌÑÁÁÑÒŨ�r */ $"654A 3949 533A 3654 6279 816C 6D9B CDDF" /* eJ9IS:6Tby�lm›Í. */ $"CEB3 AEBA A678 596E 867F 758A A8A7 927D" /* γ®º¦xYn†.uЍ§’} */ $"7566 6141 2B45 6969 6D73 636A 694E 4C77" /* ufaA+EiimscjiNLw */ $"ACCE DDDE D1C6 A87C 6C89 A197 7B81 989A" /* ¬Î..ÑÆ¨|l‰¡—{�˜š */ $"7E66 5E52 5546 4E80 A293 9AAA A2A2 9677" /* ~f^RUFN€¢“šª¢¢–w */ $"6F98 C9DB CFAE 8A74 521E 051F 3431 273D" /* o˜É.Ï®ŠtR...41'= */ $"5F69 5449 4947 5451 5D8D B5B1 BBC1 B0AF" /* _iTIIGTQ]�µ±»Á°¯ */ $"B3B1 C5F0 FFFF FFF5 DEC3 9562 5976 816A" /* ³±Å......ÕbYv�j */ $"443E 4B46 220E 0302 140F 0E32 4B36 3B44" /* D>KF"......2K6;D */ $"424D 514E 6695 B8C5 C5B9 B6B7 AA8D 90B5" /* BMQNf•¸Åʶ·ª��µ */ $"D3D4 C0C7 E0E1 C3B7 A58F 876B 5F75 744B" /* ÓÔÀÇ..÷¥�‡k_utK */ $"454A 4C5B 584C 5F90 B8C9 C8B4 B0B0 986A" /* EJL[XL_�¸ÉÈ´°°˜j */ $"5F74 8579 616F 929E 867D 6F65 6653 495F" /* _t…yao’ž†}oefSI_ */ $"675D 6C6A 5D58 442A 3563 8EAA B8BD C8C2" /* g]lj]XD*5cŽª¸½È */ $"9F6D 6074 8D8B 7373 837F 675D 4B41 3E31" /* Ÿm`t�‹ssƒ.g]KA>1 */ $"4079 958A 9091 9299 8565 6994 C1DB D7BA" /* @y•Š�‘’™…ei”Á.׺ */ $"A491 6E3F 313F 5252 4A59 7476 625C 5355" /* ¤‘n?1?RRJYtvb\SU */ $"5B58 6CA4 C0C1 CECA C0C0 B3A8 C0F0 FFFF" /* [Xl¤ÀÁÎÊÀÀ³¨À... */ $"FFF6 E0CA A370 6576 8375 5B51 5240 1F0F" /* ...Ê£pevƒu[QR@.. */ $"0201 0103 0D32 443F 433D 3B49 4C45 5784" /* ....Â2D?C=;ILEW„ */ $"A7BA BBAD A5A4 9B88 8BA2 BAC2 BDC0 D2CE" /* §º»­¥¤›ˆ‹¢ºÂ½ÀÒÎ */ $"B4A8 998D 836F 6275 755A 4C3E 3A4B 5043" /* ´¨™�ƒobuuZL>:KPC */ $"4B71 95AF B7AC A5A5 9774 6D7B 8883 757B" /* Kq•¯·¬¥¥—tm{ˆƒu{ */ $"99A0 948D 8382 8175 7286 8277 837F 7472" /* ™ ”�ƒ‚�ur†‚wƒ.tr */ $"5F44 4667 849B A3A6 B3B7 986C 6570 7B78" /* _DFg„›£¦³·˜lep{x */ $"7075 8374 6158 4844 4035 4370 868D 968F" /* puƒtaXHD@5Cp†�–� */ $"94A2 9479 80A2 C0D7 D5C6 B7A0 734A 444B" /* ”¢”y€¢À×ÕÆ· sJDK */ $"524D 4B5C 7169 5E55 484C 4F4D 6796 A6B0" /* RMK\qi^UHLOMg–¦° */ $"BAB3 B5B7 A296 B9ED FFFF FEF0 DDC3 926B" /* º³µ·¢–¹......Ã’k */ $"6979 8172 6261 5D3E 2411 0101 0106 294B" /* iy�rba]>$.....)K */ $"4A4C 4D41 4954 4B4E 77AB C8CC B8AB A89E" /* JLMAITKNw«È̸«¨ž */ $"8079 92AA B3AF B6C9 CFBA AB9D 918D 7F72" /* €y’ª³¯¶ÉϺ«�‘�.r */ $"8391 7F6F 5537 3843 3F44 6893 ADB3 A59F" /* ƒ‘.oU78C?Dh“­³¥Ÿ */ $"9D91 756E 7F8B 897C 7885 8C86 8784 7E7F" /* �‘un.‹‰|x…Œ†‡„~. */ $"7A79 919F 8D81 7A74 7C7A 6152 6685 9798" /* zy‘Ÿ��zt|zaRf…—˜ */ $"8B8B 979A 7F6F 767D 786E 7181 816D 6156" /* ‹‹—š.ov}xnq��maV */ $"4D48 3E3B 5972 7A8A 8E88 929A 8E8B A3BF" /* MH>;YrzŠŽˆ’šŽ‹£¿ */ $"D1D2 C4BC B396 6551 575A 4F45 4D62 655A" /* ÑÒļ³–eQWZOEMbeZ */ $"5850 4944 414C 728C 96A5 A6A5 B0AE 999C" /* XPIDALrŒ–¥¦¥°®™œ */ $"C4F2 FFFF FCEE DEBA 897A 7F83 7C72 7278" /* Ä......º‰z.ƒ|rrx */ $"6343 2F18 0901 010B 384D 4D50 453D 4645" /* cC/.Æ...8MMPE=FE */ $"3E53 87B5 D0C9 B1A4 9B82 6875 93A6 A5A3" /* >S‡µÐɱ¤›‚hu“¦¥£ */ $"B4C9 BFAD A395 8F89 7C83 9C96 877B 5C43" /* ´É¿­£•�‰|ƒœ–‡{\C */ $"3C35 3453 83A8 BBAF 9D98 9377 6274 8E96" /* <54Sƒ¨»¯�˜“wbtŽ– */ $"887F 888F 7D75 7B7B 7D78 7389 A9A6 9887" /* ˆ.ˆ�}u{{}xs‰©¦˜‡ */ $"6E6C 776D 5F6C 889B 9F8A 7774 786B 6677" /* nlwm_lˆ›ŸŠwtxkfw */ $"8480 6D65 757F 6E62 594F 4B42 3B53 6F70" /* „€meu.nbYOKB;Sop */ $"7982 7F88 9089 8DAB CDE0 E0CA B9B2 A37E" /* y‚.ˆ�‰�«Í..ʹ²£~ */ $"6668 6E64 4E44 525B 4F4A 4949 4940 3C58" /* fhndNDR[OJIII@9Uhky”‚ss�|t */ $"9AC0 B8AE BDCB CAB4 A191 94AD A587 673D" /* šÀ¸®½ËÊ´¡‘”­¥‡g= */ $"240D 0112 3C58 6250 4135 253F 6278 96BA" /* $Â.... */ $"0A12 374B 5C7B 8379 6B6E 7367 79A3 B8B6" /* ..7K\{ƒyknsgy£¸¶ */ $"BDCA D2C9 BBA9 9EB2 BEB5 A58E 7B64 3C2B" /* ½ÊÒÉ»©ž²¾µ¥Ž{d<+ */ $"3754 6D6A 6256 3F3B 4A45 455E 6B66 5D64" /* 7TmjbV?;JEE^kf]d */ $"6E67 7BA6 BDBE CADF EDE8 DED0 C7DA DFCF" /* ng{¦½¾Ê....ÐÇ..Ï */ $"BA9E 8C77 584F 5E77 897D 6B5B 4748 5A55" /* ºžŒwXO^w‰}k[GHZU */ $"505C 5847 3637 3C36 5080 9492 9AA9 B3AB" /* P\XG67<6P€”’𩳫 */ $"A090 869B A598 8060 4834 1B1F 3C63 8487" /*  �†›¥˜€`H4.._hrxoml^X */ $"739C BBC5 B7A5 9B89 6657 677D 8884 8999" /* sœ»Å·¥›‰fWg}ˆ„‰™ */ $"9F8F 8477 6963 5B57 6F84 7C79 7160 5B58" /* Ÿ�„wic[Wo„|yq`[X */ $"4D50 729A B8C1 B5AA A394 756A 7A8D 9490" /* MPrš¸Áµª£”ujz�”� */ $"95A8 AE9F 978D 8483 8081 99AB A39D 907E" /* •¨®Ÿ—�„ƒ€�™«£��~ */ $"7873 6361 7A98 ABAA 9481 7764 463E 4F5F" /* xscaz˜«ª”�wdF>O_ */ $"6056 5662 6152 4C47 4649 4649 6374 7377" /* `VVbaRLGFIFIctsw */ $"7877 7F82 7B86 ABCF E5E9 DDD4 CEB9 9689" /* xw.‚{†«Ï...Ôι–‰ */ $"9195 8875 6F76 6F5E 564E 4A48 4147 6777" /* ‘•ˆuovo^VNJHAGgw */ $"777B 7773 7978 6E79 9BBA D1D5 CAC2 BBA5" /* w{wsyxny›ºÑÕÊ»¥ */ $"8A8A 99A2 9586 878F 826D 6050 4539 2A2F" /* ŠŠ™¢•†‡�‚m`PE9*. */ $"4C59 5E69 6868 6E65 5966 8BAC C2BF B1A5" /* LY^ihhneYf‹¬Â¿±¥ */ $"987C 6163 7381 8180 8D9C 9488 8479 6F64" /* ˜|acs��€�œ”ˆ„yod */ $"5A67 8284 7E77 665B 5748 3E54 7E9F B1AC" /* Zg‚„~wf[WH>T~Ÿ±¬ */ $"A19A 8F76 656E 828F 8D8B 98A6 9E94 908A" /* ¡š�ven‚��‹˜¦ž”�Š */ $"8986 8397 B1B1 ADA6 9388 816E 6478 99AF" /* ‰†ƒ—±±­¦“ˆ�ndx™¯ */ $"B3A2 8C7B 6645 3746 5961 5A56 5F64 554A" /* ³¢Œ{fE7FYaZV_dUJ */ $"4543 4542 435C 7677 7876 6F74 7C78 7C9B" /* ECEBC\vwxvot|x|› */ $"C3DF E8DE D1CA BDA3 939A A09A 897C 7D78" /* Ã...Ñʽ£“š š‰|}x */ $"6557 4F4B 4944 4156 6D70 7272 6C70 756D" /* eWOKIDAVmprrlpum */ $"6C86 AAC4 CCC4 BBB5 A88F 8592 A0A1 948A" /* l†ªÄÌÄ»µ¨�…’ ¡”Š */ $"8C87 756A 5F55 4B3C 3445 5659 5F63 636B" /* Œ‡uj_UK<4EVY_cck */ $"6D63 637E A0B9 BFB3 A8A0 8B6D 646E 7A7B" /* mcc~ ¹¿³¨ ‹mdnz{ */ $"767B 8A8E 837C 7670 6B61 6177 8785 857A" /* v{ŠŽƒ|vpkaaw‡……z */ $"6E6B 6151 5371 96B1 B5AB A39C 876C 6A7B" /* nkaQSq–±µ«£œ‡lj{ */ $"898A 8487 9391 8885 8280 7E77 7C96 A3A5" /* ‰Š„‡“‘ˆ…‚€~w|–£¥ */ $"A69E 948F 816F 7390 AFC0 BBA7 9682 6143" /* ¦ž”��os�¯À»§–‚aC */ $"4253 6160 5A5F 685D 4C42 3A3B 3B39 4765" /* BSa`Z_h]LB:;;9Ge */ $"7170 6E64 636D 6E6F 86AF D3E8 E3D6 CFC5" /* qpndcmno†¯Ó..ÖÏÅ */ $"AD98 9CAB AD9F 8E8A 8671 5C52 4A48 423A" /* ­˜œ«­ŸŽŠ†q\RJHB: */ $"4862 6B6D 6E68 6A6E 6762 77A1 C3D3 CCC0" /* Hbkmnhjngbw¡ÃÓÌÀ */ $"BAAE 9484 90A5 AEA5 9B9B 9680 6D62 5853" /* º®”„�¥®¥››–€mbXS */ $"483C 4452 514E 4F50 5A65 6260 7595 AFB8" /* H=>Hbv{}ulop */ $"6C76 97BE D9E0 D5C9 BFAD 9491 9EAC AA9B" /* lv—¾..ÕÉ¿­”‘ž¬ª› */ $"918F 8169 584D 4A47 4145 5A68 6B70 6C68" /* ‘��iXMJGAEZhkplh */ $"6E6E 676F 8DAF C8C9 BCB3 AB98 807D 8C9D" /* nngo�¯Èɼ³«˜€}Œ� */ $"A19D 9DA1 9680 6F62 5B55 4C50 6063 5E5A" /* ¡��¡–€ob[ULP`c^Z */ $"5252 5E64 6574 93B2 C2BD ABA2 9A83 6A67" /* RR^det“²Â½«¢šƒjg */ $"727A 746B 6F7A 7870 6B68 6A68 626A 7C83" /* rztkozxpkhjhbj|ƒ */ $"8585 7B75 776D 6169 839F B1AD A39E 957E" /* ……{uwmaiƒŸ±­£ž•~ */ $"696C 7B85 837F 868F 887B 7371 7576 7582" /* il{…ƒ.†�ˆ{squvu‚ */ $"98A0 A2A1 9896 978E 8388 9EB4 BEB6 A69A" /* ˜ ¢¡˜–—Žƒˆž´¾¶¦š */ $"8B6E 514C 555B 5957 6068 6053 4740 3D38" /* ‹nQLU[YW`h`SG@=8 */ $"3646 606D 7273 6C69 6B68 6980 A4C7 DBD9" /* 6F`mrslikhi€¤Ç.. */ $"D0C9 BDA3 9298 A9B0 A9A1 A09B 8770 5C4C" /* Ðɽ£’˜©°©¡ ›‡p\L */ $"453E 3A4A 5D63 6462 5C5D 605D 627A 9BB8" /* E>:J]cdb\]`]bz›¸ */ $"C5C0 B4AE A28C 818B 9BA3 A0A1 A9A9 9985" /* ÅÀ´®¢Œ�‹›£ ¡©©™… */ $"7468 6057 515B 6665 5F54 4A4B 4F4F 5A77" /* th`WQ[fe_TJKOOZw */ $"97B1 B9B0 A39B 8C73 676E 797A 7474 7D80" /* —±¹°£›Œsgnyztt}€ */ $"7971 6C6C 6C6A 6D81 8D8E 8D85 7D7C 766C" /* yqllljm��Ž�…}|vl */ $"6D80 95A5 A79E 9591 826C 6671 7D7E 797C" /* m€•¥§ž•‘‚lfq}~y| */ $"8788 8178 716F 6F6C 758B 999E A19E 9999" /* ‡ˆ�xqoolu‹™ž¡ž™™ */ $"9387 899C B1BF BDAD 9F91 785C 4F54 5A58" /* “‡‰œ±¿½­Ÿ‘x\OTZX */ $"555C 6765 5D53 4A45 403D 475E 6C73 7873" /* U\ge]SJE@=G^lsxs */ $"7071 6A64 7393 B3C6 C9C2 BBB2 9C86 828D" /* pqjds“³ÆÉ»²œ†‚� */ $"9798 9498 9A90 8170 5F53 4842 4C60 6B72" /* —˜”˜š��p_SHBL`kr */ $"7673 7172 6F6C 7C9A B8CB CDC3 B8A9 927F" /* vsqrol|š¸ËÍø©’. */ $"7C86 8F90 8F93 9790 8476 685E 544E 5460" /* |†���“—�„vh^TNT` */ $"6464 5F54 4E4F 4F53 688A ABBD BDB3 A799" /* dd_TNOOShŠ«½½³§™ */ $"8473 7176 7975 7276 7873 6C65 6161 5F61" /* „sqvyurvxsleaa_a */ $"7082 8B8E 8A80 7C7A 736F 7B91 A6AE A69A" /* p‚‹ŽŠ€|zso{‘¦®¦š */ $"9389 7669 6B75 7B7B 7B7F 8380 7A73 6D6B" /* “‰viku{{{.ƒ€zsmk */ $"6A6C 7D90 9BA3 A29D 9D9D 9694 A1B9 CCD0" /* jl}�›£¢���–”¡¹ÌÐ */ $"C3B2 A490 7360 5E61 5F58 555C 5F5B 5247" /* ò¤�s`^a_XU\_[RG */ $"403D 3839 4755 5E63 6360 6365 6064 7A9B" /* @=89GU^cc`ce`dz› */ $"B8C4 C2BE BBAF 998E 929B 9E9D A0A7 A397" /* ¸Ä¾»¯™Ž’›ž� §£— */ $"8776 675A 4D4A 5863 696C 665F 5F5C 565E" /* ‡vgZMJXcilf__\V^ */ $"799B B7BF B8AF A594 7F7B 8591 9494 99A0" /* y›·¿¸¯¥”.{…‘””™  */ $"9D97 8F84 7C73 696A 7577 746E 6258 554E" /* �—�„|sijuwtnbXUN */ $"4752 6E8E A6AE A79E 9581 6C67 6E73 706D" /* GRnަ®§ž•�lgnspm */ $"7277 726C 6763 6262 6471 8793 9A9B 928B" /* rwrlgcbbdq‡“š›’‹ */ $"8880 777D 91A7 B3AE 9D8D 7F6E 5F5D 666D" /* ˆ€w}‘§³®��.n_]fm */ $"6D6D 7175 726F 6E6C 6B69 6874 8693 9DA4" /* mmquronlkiht†“�¤ */ $"A5A5 A7A3 9DA5 B9CB D5CF C2B4 A287 6E61" /* ¥¥§£�¥¹ËÕÏ´¢‡na */ $"605D 554F 5459 554F 463F 3A36 3744 545D" /* `]UOTYUOF?:67DT] */ $"6366 6463 6564 6575 90AB BEC1 BDB7 AD9C" /* cfdcedeu�«¾Á½·­œ */ $"9193 9B9E 9B9A A0A3 9B8F 8377 6A5D 5459" /* ‘“›ž›š £›�ƒwj]TY */ $"6267 6C6D 6966 645E 5F70 8BA7 B8BA B4AD" /* bglmifd^_p‹§¸º´­ */ $"9E88 7A7C 8489 8B8F 9799 9289 8078 7067" /* žˆz|„‰‹�—™’‰€xpg */ $"6670 7878 746C 605A 534B 4D63 819B AAAA" /* fpxxtl`ZSKMc�›ªª */ $"A59E 907C 7276 7D7D 7977 7977 6E66 5E5B" /* ¥ž�|rv}}ywywnf^[ */ $"5A58 5F72 8086 8D8E 8986 8077 798D A3B4" /* ZX_r€†�މ†€wy�£´ */ $"B7AC 9D8D 7965 6068 7375 7376 7B79 726B" /* ·¬��ye`hsusv{yrk */ $"6564 6360 677A 878D 9294 9496 9795 9CB2" /* edc`gz‡�’””–—•œ² */ $"CAD8 D7CA BDAF 9881 7573 7169 605E 5F5B" /* ÊØ×ʽ¯˜�usqi`^_[ */ $"5650 4B47 413B 3F4D 575D 6062 6161 5E5A" /* VPKGA;?MW]`baa^Z */ $"6378 91A6 AEAE ADA7 9A8C 8B93 9A9B 999F" /* cx‘¦®®­§šŒ‹“š›™Ÿ */ $"A6A5 9D93 877D 7267 656C 7071 6F6B 6A69" /* ¦¥�“‡}rgelpqokji */ $"6461 6B81 97A7 ACAA A69E 8B7B 787C 7E7E" /* dak�—§¬ª¦ž‹{x|~~ */ $"7F87 8F8E 8880 7A75 6D67 6C77 7D7D 7972" /* .‡�Žˆ€zumglw}}yr */ $"6B62 5651 5D76 90A4 ABAA A69C 8779 797E" /* kbVQ]v�¤«ª¦œ‡yy~ */ $"807F 7E81 8076 6C62 5C58 5455 6374 7D83" /* €.~�€vlb\XTUct}ƒ */ $"8382 8280 7977 869B ACB5 B1A6 9A88 7163" /* ƒ‚‚€yw†›¬µ±¦šˆqc */ $"656E 7272 757C 7E79 736C 6764 6265 7482" /* enrru|~yslgdbet‚ */ $"898E 8F8F 9292 8D91 A4BF D2D9 D3C5 B5A1" /* ‰Ž��’’�‘¤¿Ò.Óŵ¡ */ $"897A 7777 7268 6362 5B52 4C47 4543 4042" /* ‰zwwrhcb[RLGEC@B */ $"4F5A 5F63 6260 6363 5F63 7890 A2AB ABA9" /* OZ_cb`cc_cx�¢««© */ $"A59A 8B87 8D93 9592 969B 9B98 9289 7F75" /* ¥š‹‡�“•’–››˜’‰.u */ $"6C69 7174 7473 6F6A 6A67 6267 7B93 A4AA" /* liqttsojjgbg{“¤ª */ $"A7A2 9C8E 7E7A 7E81 807E 848B 8B88 847F" /* §¢œŽ~z~�€~„‹‹ˆ„. */ $"7973 6E71 7A80 8281 7B74 6F66 5B5B 6C83" /* ysnqz€‚�{tof[[lƒ */ $"969F A19F 9A8C 7D76 797B 7C7C 8082 7B72" /* –Ÿ¡ŸšŒ}vy{||€‚{r */ $"6960 5954 535C 6B75 7C81 807F 817E 7B82" /* i`YTS\ku|�€.�~{‚ */ $"96AB B8BA B2A7 9984 7069 6B6D 6E6F 7476" /* –«¸º²§™„pikmnotv */ $"7470 6B65 5E59 5964 747E 8588 8787 8887" /* tpke^YYdt~…ˆ‡‡ˆ‡ */ $"8794 ADC5 D4D7 CEC1 B099 8783 8481 7A73" /* ‡”­ÅÔ×ÎÁ°™‡ƒ„�zs */ $"6F67 5B50 4944 413F 414C 575B 5E60 5F5F" /* og[PIDA?ALW[^`__ */ $"6263 6572 889C A8AA A6A2 9C91 898C 9295" /* bcerˆœ¨ª¦¢œ‘‰Œ’• */ $"969A 9F9F 9B96 8F86 7B70 6B70 7573 716D" /* –šŸŸ›–�†{pkpusqm */ $"6660 5F5C 5F6E 869A A4A3 9D96 8D7F 7A80" /* f`_\_n†š¤£�–�.z€ */ $"8687 8687 8B8D 8C8B 8884 7E77 757C 807F" /* †‡†‡‹�Œ‹ˆ„~wu|€. */ $"7E7B 7670 6A61 5D64 7485 9194 9492 8A7C" /* ~{vpja]dt…‘””’Š| */ $"7274 7879 7A7F 8586 8076 6C62 5A55 5B6A" /* rtxyz.…†€vlbZU[j */ $"757B 807F 7C7A 7876 7D8F A4B4 B9B2 A69A" /* u{€.|zxv}�¤´¹²¦š */ $"8A77 6D6D 6E6E 6D70 7475 7471 6D68 625D" /* Šwmmnnmptutqmhb] */ $"616D 7880 878A 8A8A 8988 8D9E B4C7 D1D0" /* amx€‡ŠŠŠ‰ˆ�ž´ÇÑÐ */ $"C8BB A891 8482 8280 7C79 746A 5E51 4741" /* È»¨‘„‚‚€|ytj^QGA */ $"3F3E 4653 5B5D 5E5D 5C5D 5F62 6C7F 93A1" /* ?>FS[]^]\]_bl.“¡ */ $"A5A0 9891 8982 838A 8F8F 8E92 9697 9693" /* ¥ ˜‘‰‚ƒŠ��Ž’–—–“ */ $"8F89 7F76 767B 7C7B 7873 6E6A 6563 6D80" /* �‰.vv{|{xsnjecm€ */ $"94A2 A6A3 9C92 8478 767C 7F7F 7F82 8483" /* ”¢¦£œ’„xv|...‚„ƒ */ $"807D 7B7A 7674 7A80 8180 7E79 7673 6D69" /* €}{zvtz€�€~yvsmi */ $"6F7B 868E 9292 908D 857D 7C7F 7E7B 7A7E" /* o{†Ž’’��…}|.~{z~ */ $"8282 7E76 6D62 5752 5A65 6D74 7979 7977" /* ‚‚~vmbWRZemtyyyw */ $"7375 8398 AAB5 B8B1 A697 8677 7473 7170" /* suƒ˜ªµ¸±¦—†wtsqp */ $"7276 7775 716C 6662 5E5D 6770 777C 7F81" /* rvwuqlfb^]gpw|.� */ $"8384 8388 99AF C2CE D2CF C6B7 A595 8E8B" /* ƒ„ƒˆ™¯ÂÎÒÏÆ·¥•Ž‹ */ $"8782 817F 786D 6154 483E 383B 4752 585A" /* ‡‚�.xmaTH>8;GRXZ */ $"5956 5452 5159 6F88 9BA3 A29C 9286 7C7B" /* YVTRQYoˆ›£¢œ’†|{ */ $"828A 8E90 9396 9695 9390 8B86 8181 8485" /* ‚ŠŽ�“––•“�‹†��„… */ $"837F 7973 6D67 6366 7689 99A1 A29E 9589" /* ƒ.ysmgcfv‰™¡¢ž•‰ */ $"7D78 7A7D 7F81 8384 8481 7E7A 7673 7275" /* }xz}.�ƒ„„�~zvsru */ $"7D82 8381 7D78 736C 676A 7683 8D90 8E8A" /* }‚ƒ�}xslgjvƒ��ŽŠ */ $"867F 797A 7F81 8080 8386 8685 827B 7166" /* †.yz.�€€ƒ††…‚{qf */ $"5D5D 646B 7277 7878 7774 7177 889B A9AE" /* ]]dkrwxxwtqwˆ›©® */ $"ACA6 9C8D 7E76 7472 6E70 7678 7775 716C" /* ¬¦œ�~vtrnpvxwuql */ $"6762 5F65 6F76 7B7F 8082 8383 838D A1B6" /* gb_eov{.€‚ƒƒƒ�¡¶ */ $"C4C9 C9C3 B8AA 9B93 8F89 8380 817E 756C" /* ÄÉÉøª›“�‰ƒ€�~ul */ $"6255 483D 3840 4B54 595D 5D5B 5855 5664" /* bUH=8@KTY]][XUVd */ $"7D93 A2A6 A49D 9181 7879 7F84 868C 9393" /* }“¢¦¤�‘�xy.„†Œ““ */ $"908C 8986 827E 7F86 8C8B 8883 7C75 6E68" /* �Œ‰†‚~.†Œ‹ˆƒ|unh */ $"6A76 8899 A3A5 A39C 8F81 787A 7E7D 7B7F" /* jvˆ™£¥£œ��xz~}{. */ $"8382 7C78 7572 6F6B 6E76 7E83 8482 7E78" /* ƒ‚|xuroknv~ƒ„‚~x */ $"716A 6B75 8491 9694 8E86 7D75 747A 8183" /* qjku„‘–”ކ}utz�ƒ */ $"8286 8987 8480 7D77 6F65 6164 686B 6E70" /* ‚†‰‡„€}woeadhknp */ $"7273 716F 737E 8E9E A7A9 A69E 9488 7D7A" /* rsqos~Žž§©¦ž”ˆ}z */ $"7773 7073 7778 7775 716B 645E 6069 6F74" /* wspswxwuqkd^`iot */ $"787B 7C7C 7B7B 8395 AABB C5C6 C2BB B1A6" /* x{||{{ƒ•ª»ÅÆÂ»±¦ */ $"9C98 9690 8986 8580 7A72 675B 4E44 4247" /* œ˜–�‰†…€zrg[NDBG */ $"4D52 575A 5A58 5352 5969 7E91 9CA1 9F96" /* MRWZZXSRYi~‘œ¡Ÿ– */ $"8B7F 7778 7C80 858D 9495 938E 8884 8182" /* ‹.wx|€…�”•“Žˆ„�‚ */ $"8991 9494 8F87 7E74 6D6A 6F7C 8C97 9D9C" /* ‰‘””�‡~tmjo|Œ—�œ */ $"968C 8279 7676 7777 777A 7D7D 7B77 7472" /* –Œ‚yvvwwwz}}{wtr */ $"6F6E 757D 858A 8D8B 8883 7B75 7883 909A" /* onu}…Š�‹ˆƒ{uxƒ�š */ $"9B95 8A7C 6F68 676D 7277 7D80 807C 7772" /* ›•Š|ohgmrw}€€|wr */ $"6E6B 6764 676B 6D6E 6F70 7273 757A 8697" /* nkgdgkmnoprsuz†— */ $"A7B0 B1AE A89F 948B 847F 7973 6F6F 7070" /* §°±®¨Ÿ”‹„.ysoopp */ $"716E 6862 5C5A 6169 6F74 777A 7A78 7679" /* qnhb\Zaiotwzzxvy */ $"879E B3C2 C9CA C4BA AEA5 A09F 9B94 8E89" /* ‡ž³ÂÉÊĺ®¥ Ÿ›”މ */ $"827B 7368 5D52 4A44 4548 4C4F 5254 5453" /* ‚{sh]RJDEHLORTTS */ $"5157 6375 8591 999C 9B94 8C86 827F 7F80" /* QWcu…‘™œ›”Œ†‚..€ */ $"858C 9192 8F89 8079 767A 838C 9393 8E87" /* …Œ‘’�‰€yvzƒŒ““އ */ $"7D73 6A6B 7584 929B 9D9A 9287 7D79 797B" /* }sjku„’›�š’‡}yy{ */ $"7D7F 8182 817E 7A76 726F 6D71 777E 8486" /* }.�‚�~zvromqw~„† */ $"8686 847E 7979 828D 9599 968F 8375 6A66" /* ††„~yy‚�•™–�ƒujf */ $"686A 6F75 7D81 8180 7D77 706B 6A6F 7476" /* hjou}��€}wpkjotv */ $"7574 7170 6F6F 707A 8C9D A8AC ABA6 9C92" /* utqpoopzŒ�¨¬«¦œ’ */ $"8A85 837F 7A76 7370 6B6A 6A68 6562 6164" /* Š…ƒ.zvspkjjhebad */ $"696E 7377 797A 7A78 7881 91A3 B1BA BFBD" /* inswyzzxx�‘£±º¿½ */ $"B4AA A2A0 9F9D 9894 918C 837B 746A 5E53" /* ´ª¢ Ÿ�˜”‘Œƒ{tj^S */ $"4E4F 5153 5558 595A 5959 5B63 7281 8C91" /* NOQSUXYZYY[cr�Œ‘ */ $"9291 8A82 7E7E 7C79 787C 8286 8787 8782" /* ’‘Š‚~~|yx|‚†‡‡‡‚ */ $"7B74 757D 858C 9194 928C 847B 777C 8895" /* {tu}…Œ‘”’Œ„{w|ˆ• */ $"9FA1 9E97 8B7F 7878 7776 797D 7F7F 7D7A" /* Ÿ¡ž—‹.xxwvy}..}z */ $"7772 6C68 6B73 7A7F 8486 8583 807D 7E84" /* wrlhksz.„†…ƒ€}~„ */ $"8E97 9C9B 948B 7E70 6966 6667 6B73 797D" /* Ž—œ›”‹~piffgksy} */ $"7D7B 7872 6C68 6C73 7879 7876 736F 6E6F" /* }{xrlhlsxyxvsono */ $"7682 92A1 AAAC A79F 958C 8888 8683 807D" /* v‚’¡ª¬§Ÿ•Œˆˆ†ƒ€} */ $"7972 6C69 6765 6362 666B 6E70 7275 7776" /* yrligecbfknpruwv */ $"7678 7D89 97A4 ADB2 B2B0 AAA3 A09F 9E9B" /* vx}‰—¤­²²°ª£ Ÿž› */ $"9795 918B 837B 7268 5E57 5455 5656 5657" /* —•‘‹ƒ{rh^WTUVVVW */ $"5959 585A 626D 7985 8C8E 8D89 837D 7C7C" /* YYXZbmy…ŒŽ�‰ƒ}|| */ $"7C7C 7C7E 8182 8384 8381 7C7A 7C81 878C" /* |||~�‚ƒ„ƒ�|z|�‡Œ */ $"9194 9592 8A84 848A 929A 9D9C 978E 837A" /* ‘”•’Š„„Š’š�œ—Žƒz */ $"7674 7372 7579 7B7B 7A77 736D 6868 6F78" /* vtsruy{{zwsmhhox */ $"7E82 8586 8786 8383 8B96 9FA3 A39D 9385" /* ~‚…†‡†ƒƒ‹–Ÿ££�“… */ $"776C 6663 6162 666D 7172 7372 706B 6667" /* wlfcabfmqrsrpkfg */ $"6C73 7676 7573 716D 6A6E 7A8A 9AA5 ADAD" /* lsvvusqmjnzŠš¥­­ */ $"A79E 948E 8C8B 8987 8684 7E75 6E6A 6660" /* §ž”ŽŒ‹‰‡†„~unjf` */ $"5E62 686E 7070 7070 6F6E 6F75 828F 9BA4" /* ^bhnpppponou‚�›¤ */ $"A9AB A9A6 A4A4 A5A4 A2A2 A19F 9A93 8B83" /* ©«©¦¤¤¥¤¢¢¡Ÿš“‹ƒ */ $"7A6E 6562 605E 5B58 5656 5654 555A 6571" /* zneb`^[XVVVTUZeq */ $"7B82 8686 8179 7474 7576 787A 7D7F 8080" /* {‚††�yttuvxz}.€€ */ $"8182 817E 7D7F 8285 888B 8E90 908D 8B8C" /* �‚�~}.‚…ˆ‹Ž���‹Œ */ $"9197 9B9C 9B97 8F86 7D78 7570 6D6E 7275" /* ‘—›œ›—�†}xupmnru */ $"7879 7877 736C 6A6D 737A 7F82 8586 8583" /* xyxwsljmsz.‚…†…ƒ */ $"8287 919D A5A8 A69F 9384 766D 6864 6266" /* ‚‡‘�¥¨¦Ÿ“„vmhdbf */ $"6A6E 6F6F 7070 6D6B 6B70 757A 7C7B 7A78" /* jnooppmkkpuz|{zx */ $"736F 6E75 8291 9DA3 A5A2 9B92 8B88 8683" /* sonu‚‘�£¥¢›’‹ˆ†ƒ */ $"8081 8280 7B74 6D65 5D58 5A62 6C74 7776" /* €�‚€{tme]XZbltwv */ $"7574 7170 757F 8F9E A7AB ABA7 A19B 989B" /* utqpu.�ž§««§¡›˜› */ $"9E9E 9E9F 9F9A 928A 837C 736A 6664 6260" /* žžžŸŸš’Šƒ|sjfdb` */ $"5B56 5455 5556 5C65 737F 878A 8A87 817B" /* [VTUUV\es.‡ŠŠ‡�{ */ $"7778 7877 7678 7B7C 7B7A 7B7B 7775 777B" /* wxxwvx{|{z{{wuw{ */ $"8083 8586 8688 8889 8C93 9DA4 A5A3 A099" /* €ƒ…††ˆˆ‰Œ“�¤¥£ ™ */ $"9087 8281 7E79 7475 7676 7573 7373 706C" /* �‡‚�~ytuvvussspl */ $"6D6F 7275 787A 7D7F 8080 8289 949D A2A4" /* moruxz}.€€‚‰”�¢¤ */ $"A29A 8F83 7974 6F69 6669 6E71 7171 7271" /* ¢š�ƒytoifinqqqrq */ $"6E6B 6E74 7A7E 7F7E 7C77 7270 727A 8993" /* nkntz~.~|wrprz‰“ */ $"989B 9B96 8F87 8484 827F 7E7F 817E 7972" /* ˜››–�‡„„‚.~.�~yr */ $"6C64 5D5A 5F66 6E73 7577 7775 7274 7A87" /* ld]Z_fnsuwwurtz‡ */ $"96A1 A6A9 A8A2 9A95 9598 9A9B 9DA0 A09D" /* –¡¦©¨¢š••˜š›�  � */ $"958D 857C 736E 6D6D 6C68 615C 5853 5156" /* •�…|snmmlha\XSQV */ $"5F6D 7B84 8888 857F 7773 7477 7776 7679" /* _m{„ˆˆ….wstwwvvy */ $"7A79 7775 7574 7274 7A81 8586 8686 8786" /* zywuutrtz�…†††‡† */ $"868A 929C A4A8 A6A1 9A91 8881 7E7E 7C79" /* †Š’œ¤¨¦¡š‘ˆ�~~|y */ $"7878 7774 716F 6E6D 6B6D 7175 787A 7B7D" /* xxwtqonmkmquxz{} */ $"7F7F 8085 8C96 9FA4 A5A3 9D93 887E 7873" /* ..€…Œ–Ÿ¤¥£�“ˆ~xs */ $"6C65 6264 6667 6767 6867 6669 6E75 7B7E" /* lebdfggghgfinu{~ */ $"7F80 7E7A 7778 7F89 949B 9F9F 9C95 8F8A" /* .€~zwx.‰”›ŸŸœ•�Š */ $"8988 8583 8384 837F 7871 6A62 5A59 5D63" /* ‰ˆ…ƒƒ„ƒ.xqjbZY]c */ $"6A6D 6E70 706E 6E73 7C89 969F A3A4 A09A" /* jmnppnns|‰–Ÿ£¤ š */ $"9594 9699 9B9C A0A3 A39F 9992 897F 7774" /* •”–™›œ ££Ÿ™’‰.wt */ $"7474 716B 645E 5750 4E55 6271 7E83 8583" /* ttqkd^WPNUbq~ƒ…ƒ */ $"7E77 7270 7173 7476 7879 7A78 7573 706E" /* ~wrpqstvxyzxuspn */ $"7076 7D83 8685 8383 8281 848E 99A4 ABAC" /* pv}ƒ†…ƒƒ‚�„Ž™¤«¬ */ $"A8A2 998E 8682 8281 7E7C 7B7A 7976 716E" /* ¨¢™Ž†‚‚�~|{zyvqn */ $"6C69 6A6F 7478 7A7A 7A7A 7A79 7C85 919D" /* lijotxzzzzzy|…‘� */ $"A5A6 A5A0 978B 827D 7974 6E6A 6866 6564" /* ¥¦¥ —‹‚}ytnjhfed */ $"6262 6362 656C 7378 7C7D 7D7E 7D7A 7B80" /* bbcbelsx|}}~}z{€ */ $"8892 989A 9B99 938D 8886 8583 8081 8383" /* ˆ’˜š›™“�ˆ†…ƒ€�ƒƒ */ $"817D 7770 6860 5C5E 6268 6C6F 7273 7270" /* �}wph`\^bhlorsrp */ $"727A 8794 9FA3 A4A1 9B93 8F8E 9194 979A" /* rz‡”Ÿ£¤¡›“�Ž‘”—š */ $"9D9E 9D9A 9690 877E 7979 7978 746F 6963" /* �ž�š–�‡~yyyxtoic */ $"5B55 565E 6B79 8286 8683 7B74 706F 6F70" /* [UV^ky‚††ƒ{tpoop */ $"7173 7677 7673 6F6B 6766 6B73 7A80 8384" /* qsvwvsokgfksz€ƒ„ */ $"8381 7E7E 8693 A0AB B1B1 ABA2 968C 8887" /* ƒ�~~†“ «±±«¢–Œˆ‡ */ $"8683 8181 7F7C 7772 6E6A 6663 666C 7175" /* †ƒ��.|wrnjfcflqu */ $"7776 7675 7476 7E8A 97A2 A9AA A69E 938B" /* wvvutv~Š—¢©ª¦ž“‹ */ $"8683 7E79 7573 706B 6764 6261 5F60 666D" /* †ƒ~yuspkgdba_`fm */ $"7376 7878 797A 797A 7F87 8F95 999B 9994" /* svxxyzyz.‡�•™›™” */ $"8E8A 8988 8784 8586 8685 827E 7A72 6A64" /* ŽŠ‰ˆ‡„…††…‚~zrjd */ $"6465 6668 6A6C 6E6E 6C6C 737E 8993 999C" /* defhjlnnlls~‰“™œ */ $"9B95 8E8B 8A8B 8E92 969A 9C9C 9B9A 9791" /* ›•ދЋޒ–šœœ›š—‘ */ $"8984 8281 7F7C 7873 6D65 5D59 5C63 6D76" /* ‰„‚�.|xsme]Y\cmv */ $"7D81 8079 706B 6A6A 6A6C 7075 7878 7673" /* }�€ypkjjjlpuxxvs */ $"706C 696B 727A 8085 8788 8784 8083 8D98" /* plikrz€…‡ˆ‡„€ƒ�˜ */ $"A3AC B0AE A79A 8D86 8382 807E 7F80 7E7A" /* £¬°®§š�†ƒ‚€~.€~z */ $"7571 6E6A 6667 6C71 767A 7B7B 7A79 787C" /* uqnjfglqvz{{zyx| */ $"8692 9DA6 A9A8 A196 8C86 827D 7774 7270" /* †’�¦©¨¡–Œ†‚}wtrp */ $"6B65 5F5C 5B59 595E 6770 7578 797A 7B7C" /* ke_\[YY^gpuxyz{| */ $"7D83 8C95 9B9D 9E9C 978F 8886 8786 8381" /* }ƒŒ•›�žœ—�ˆ†‡†ƒ� */ $"8182 807D 7976 716A 6665 6667 6867 686C" /* �‚€}yvqjfefghghl */ $"6E6E 7077 818C 949A 9D9E 9B93 8E8D 8E8E" /* nnpw�Œ”š�ž›“Ž�ŽŽ */ $"8E91 9599 9A97 9592 8E89 8684 8382 7E79" /* Ž‘•™š—•’މ†„ƒ‚~y */ $"7571 6B63 5F62 686E 7379 7E80 7E77 7170" /* uqkc_bhnsy~€~wqp */ $"706F 6E71 767B 7C7A 7774 6F6A 686C 7277" /* ponqv{|zwtojhlrw */ $"7B7C 7C7D 7B78 7981 8D98 A2A9 ACA9 A094" /* {||}{xy��˜¢©¬© ” */ $"8B87 8684 8283 8687 847F 7A77 726C 6A6E" /* ‹‡†„‚ƒ†‡„.zwrljn */ $"7377 7877 7776 7471 727B 8894 9CA1 A29F" /* swxwwvtqr{ˆ”œ¡¢Ÿ */ $"978D 8683 817D 7978 7876 7068 625F 5B5A" /* —�†ƒ�}yxxvphb_[Z */ $"5D66 6F76 797A 7B7B 7A79 7D87 939B 9E9D" /* ]fovyz{{zy}‡“›ž� */ $"9A95 8C84 8181 8280 7F7F 8181 7E7B 7976" /* š•Œ„��‚€..��~{yv */ $"716B 696C 6F6F 6D6B 6C6D 6D6E 737E 8991" /* qkiloomklmmns~‰‘ */ $"9597 9896 8F88 8687 8887 888C 9195 9593" /* •—˜–�ˆ†‡ˆ‡ˆŒ‘••“ */ $"9291 8D8A 8A8C 8D8B 8680 7C77 706A 6A6F" /* ’‘�ŠŠŒ�‹†€|wpjjo */ $"7579 7A7B 7C7A 746F 6E6E 6C69 696C 7173" /* uyz{|ztonnliilqs */ $"7372 706E 6966 686E 7479 7C7E 8080 7F7D" /* srpnifhnty|~€€.} */ $"828D 98A1 A7AB ABA7 9E93 8D89 8480 8082" /* ‚�˜¡§««§ž“�‰„€€‚ */ $"8381 7D78 736E 6864 666C 7274 7474 7574" /* ƒ�}xsnhdflrtttut */ $"7475 7D89 959D A3A7 A6A1 9991 8E8C 8883" /* tu}‰•�£§¦¡™‘ŽŒˆƒ */ $"7F7D 7B75 6E66 5F58 5252 5760 676B 6E70" /* .}{unf_XRRW`gknp */ $"7272 7174 7E8B 979F A2A1 9C94 8B86 8688" /* rrqt~‹—Ÿ¢¡œ”‹††ˆ */ $"8887 888A 8986 817C 7974 6F6C 6D6F 6F6D" /* ˆ‡ˆŠ‰†�|ytolmoom */ $"6966 6563 6368 7380 8B91 9494 928C 8683" /* ifecchs€‹‘””’Œ†ƒ */ $"8486 8787 8A8E 9294 9493 9290 8D8E 9193" /* „†‡‡ŠŽ’””“’��Ž‘“ */ $"9390 8A84 7F78 706E 7276 7A7B 7A78 746F" /* “�Š„.xpnrvz{zxto */ $"6A68 696A 6968 696C 6F70 7070 706E 6A6B" /* jhijihiloppppnjk */ $"6F74 787B 7C7E 807F 7F82 8A93 9CA2 A5A7" /* otx{|~€..‚Š“œ¢¥§ */ $"A59F 9790 8C87 827E 8081 817F 7B77 736E" /* ¥Ÿ—�Œ‡‚~€��.{wsn */ $"696A 6E72 7577 7676 7675 7478 828E 989E" /* ijnruwvvvutx‚Ž˜ž */ $"A1A2 9F99 928D 8B88 8481 7F7C 7873 6C66" /* ¡¢Ÿ™’�‹ˆ„�.|xslf */ $"6059 5456 5C63 696E 7175 7776 777D 8894" /* `YTV\cinquwvw}ˆ” */ $"9DA2 A4A2 9B90 8783 8281 8081 8485 837F" /* �¢¤¢›�‡ƒ‚�€�„…ƒ. */ $"7874 716C 6A6C 6F71 716E 6A68 6664 6770" /* xtqljloqqnjhfdgp */ $"7D8A 9398 9A98 928B 8686 8786 8486 888A" /* }Š“˜š˜’‹††‡†„†ˆŠ */ $"8B8B 8B8B 8B88 8689 8D90 908D 8984 7E77" /* ‹‹‹‹‹ˆ†‰����‰„~w */ $"7375 7B80 8383 817D 766E 6A6B 6D6D 6B6D" /* su{€ƒƒ�}vnjkmmkm */ $"6F70 706F 6D6C 6B69 696D 7275 7777 7779" /* oppomlkiimruwwwy */ $"7A7A 7E87 9098 9EA1 A2A1 9E99 9593 908A" /* zz~‡�˜ž¡¢¡ž™•“�Š */ $"8482 8282 817E 7B78 736D 6A6C 7073 7676" /* „‚‚‚�~{xsmjlpsvv */ $"7676 7472 747B 8691 999D 9F9D 9992 8E8B" /* vvtrt{†‘™�Ÿ�™’Ž‹ */ $"8A87 8484 8380 7A73 6C65 5E57 5659 5E63" /* Ї„„ƒ€zsle^WVY^c */ $"6769 6C70 7274 7982 8D97 9DA1 A19E 968E" /* gilprty‚�—�¡¡ž–Ž */ $"8785 8482 8083 8686 8480 7C77 726E 6E71" /* ‡…„‚€ƒ††„€|wrnnq */ $"7475 7572 6F6C 6764 6873 808C 9397 9792" /* tuurolgdhs€Œ“——’ */ $"8A83 8081 8282 8285 8788 8785 8586 8686" /* Šƒ€�‚‚‚…‡ˆ‡……††† */ $"898E 9294 9492 8E89 827D 7C80 8588 8785" /* ‰Ž’””’މ‚}|€…ˆ‡… */ $"8179 7069 6768 6868 696B 6D6E 6C6A 6867" /* �ypighhhikmnljhg */ $"6564 686E 7377 7978 7879 797B 828C 979E" /* edhnswyxxyy{‚Œ—ž */ $"A1A2 A09C 9692 9191 8E89 8583 8280 7D7A" /* ¡¢ œ–’‘‘މ…ƒ‚€}z */ $"7774 706C 6D70 7374 7576 7776 7576 7C85" /* wtplmpstuvwvuv|… */ $"8F97 9C9F 9F9A 948F 8E8D 8B88 8788 8783" /* �—œŸŸš”�Ž�‹ˆ‡ˆ‡ƒ */ $"7B72 6A63 5B56 575B 5F62 6466 696B 6C72" /* {rjc[VW[_bdfiklr */ $"7C88 939A 9E9F 9F99 908A 8786 8381 8285" /* |ˆ“šžŸŸ™�Ї†ƒ�‚… */ $"8685 827E 7A75 706D 6F72 7575 7472 6F6A" /* †…‚~zupmoruutroj */ $"6666 6D77 828C 9295 948D 8580 8081 8080" /* ffmw‚Œ’•”�…€€�€€ */ $"8488 8987 8583 8282 8386 8B91 9495 9391" /* „ˆ‰‡…ƒ‚‚ƒ†‹‘”•“‘ */ $"8E88 8282 8589 8C8C 8A86 7F75 6C67 6768" /* Žˆ‚‚…‰ŒŒŠ†.ulggh */ $"6768 6B6E 6F6D 6A69 6766 6567 6D72 7679" /* ghknomjigfegmrvy */ $"7A7A 7A78 777D 8791 999E A09F 9A93 8E8B" /* zzzxw}‡‘™ž Ÿš“Ž‹ */ $"8C8C 8B88 8785 817C 7977 7471 6E70 7476" /* ŒŒ‹ˆ‡…�|ywtqnptv */ $"7777 7777 7877 777C 858E 9599 9C9C 9892" /* wwwwxww|…Ž•™œœ˜’ */ $"8D8B 8B8B 8987 8787 847F 7871 6A62 5C5A" /* �‹‹‹‰‡‡‡„.xqjb\Z */ $"5C5D 5F61 6466 6769 6C76 828E 979D A1A1" /* \]_adfgilv‚Ž—�¡¡ */ $"9C95 8F8B 8886 8382 8485 8481 7E7B 7671" /* œ•�‹ˆ†ƒ‚„…„�~{vq */ $"6D6E 7275 7676 7471 6E6A 686D 7681 898F" /* mnruvvtqnjhmv�‰� */ $"9394 918A 8582 8180 8081 8385 8582 7F7C" /* “”‘Š…‚�€€�ƒ……‚.| */ $"7A79 7B82 898E 9091 908E 8B87 8588 8D92" /* zy{‚‰Ž�‘�Ž‹‡…ˆ�’ */ $"9493 9089 7F74 6D69 6969 696B 6E70 6F6C" /* ”“�‰.tmiiiiknpol */ $"6965 6362 6368 6F73 7475 7576 7573 7680" /* iecbchostuuvusv€ */ $"8C96 9C9E 9E9C 968F 8C8C 8D8D 8C8C 8C8A" /* Œ–œžžœ–�ŒŒ��ŒŒŒŠ */ $"8580 7B77 7371 7073 7678 7776 7573 7272" /* …€{wsqpsvxwvusrr */ $"757E 878F 9497 9897 928C 8A8B 8C8C 8C8C" /* u~‡�”—˜—’ŒŠ‹ŒŒŒŒ */ $"8C8B 8782 7C75 6E68 6362 6362 6161 6162" /* Œ‹‡‚|unhcbcbaaab */ $"6364 6A75 818B 9296 9897 918C 8988 8785" /* cdju�‹’–˜—‘Œ‰ˆ‡… */ $"8384 8787 8583 807C 7875 7477 7B7D 7C7B" /* ƒ„‡‡…ƒ€|xutw{}|{ */ $"7976 716E 6F75 7C83 888B 8C8A 8580 7E7E" /* yvqnou|ƒˆ‹ŒŠ…€~~ */ $"7D7B 7B7E 8181 807F 7D7A 7878 7C84 8C90" /* }{{~��€.}zxx|„Œ� */ $"9395 9694 908D 8E94 999B 9A97 9187 7B70" /* “•–”��Ž”™›š—‘‡{p */ $"6966 6463 6468 6A6A 6765 625F 5C5C 6269" /* ifdcdhjjgeb_\\bi */ $"6F73 7576 7676 7678 808C 969D A1A3 A09A" /* osuvvvvx€Œ–�¡£ š */ $"938E 8C8C 8B8A 8B8C 8B87 827C 7672 6E6C" /* “ŽŒŒ‹Š‹Œ‹‡‚|vrnl */ $"6F73 7677 7877 7673 7273 7B86 9096 9A9C" /* osvwxwvsrs{†�–šœ */ $"9993 8D89 8889 8A8A 8B8C 8B87 817B 7670" /* ™“�‰ˆ‰ŠŠ‹Œ‹‡�{vp */ $"6964 6363 6260 5E5E 5E5F 6166 717D 8991" /* idccb`^^^_afq}‰‘ */ $"979A 9A96 9290 8F8E 8B89 8888 8785 827E" /* —šš–’��Ž‹‰ˆˆ‡…‚~ */ $"7B76 7270 7174 7676 7574 726F 6C6C 727A" /* {vrpqtvvutrollrz */ $"8186 8A8C 8B88 8482 8384 8484 8586 8684" /* �†ŠŒ‹ˆ„‚ƒ„„„…††„ */ $"817F 7D7A 7878 7D83 878A 8C8D 8D8C 8A8C" /* �.}zxx}ƒ‡ŠŒ��ŒŠŒ */ $"9196 9A9B 9995 8E84 7972 6E6B 6868 6B6E" /* ‘–š›™•Ž„yrnkhhkn */ $"706E 6B68 6562 6062 676D 7173 7474 7371" /* pnkheb`bgmqsttsq */ $"7277 818B 9399 9C9B 9790 8986 8788 8889" /* rw�‹“™œ›—�‰†‡ˆˆ‰ */ $"8B8C 8B87 827C 7874 7273 767A 7B7B 7A79" /* ‹Œ‹‡‚|xtrsvz{{zy */ $"7674 7478 818A 9195 9796 918A 8583 8484" /* vttx�Š‘•—–‘Š…ƒ„„ */ $"8486 898B 8985 807C 7772 6F6D 6D6D 6B68" /* „†‰‹‰…€|wrommmkh */ $"6664 6262 656D 7983 8C92 9696 948F 8B8A" /* fdbbemyƒŒ’––”�‹Š */ $"8A89 8785 8585 827E 7B78 7572 7274 7678" /* Љ‡………‚~{xurrtvx */ $"7979 7979 7674 7478 7E84 8789 8A89 8581" /* yyyyvttx~„‡‰Š‰…� */ $"7E7D 7F7F 7E7E 7F80 7F7C 7976 7372 7376" /* ~}..~~.€.|yvsrsv */ $"7C81 8689 8C8E 8E8F 9297 9EA2 A4A3 A099" /* |�†‰ŒŽŽ�’—ž¢¤£ ™ */ $"9085 7C75 706B 6867 696A 6A67 6562 5F5C" /* �…|upkhgijjgeb_\ */ $"5D61 656A 6D6F 7172 7273 7780 8A92 999D" /* ]aejmoqrrsw€Š’™� */ $"9F9D 9993 8E8B 8A89 888A 8B8B 8984 7E79" /* Ÿ�™“ދЉˆŠ‹‹‰„~y */ $"726F 6F72 7576 7777 7674 7271 757D 868E" /* rooruvwwvtrqu}†Ž */ $"9397 9895 908C 8888 8888 888A 8C8C 8A85" /* “—˜•�ŒˆˆˆˆˆŠŒŒŠ… */ $"807A 7571 7070 6F6D 6965 625F 5C5E 646E" /* €zuqppomieb_\^dn */ $"7981 888D 9090 8D8A 8A8A 8B8B 8B8C 8B89" /* y�ˆ����ŠŠŠ‹‹‹Œ‹‰ */ $"8682 7E7A 7776 7779 7B7B 7A79 7875 7373" /* †‚~zwvwy{{zyxuss */ $"777D 8286 8787 8582 7E7B 7B7C 7D7E 7F80" /* w}‚†‡‡…‚~{{|}~.€ */ $"8181 7F7D 7A77 7474 767A 7F82 8588 8A8A" /* ��.}zwttvz.‚…ˆŠŠ */ $"8B8E 939B A1A4 A4A2 9D95 8A82 7B76 706C" /* ‹Ž“›¡¤¤¢�•Š‚{vpl */ $"6969 6A69 6867 6562 6060 6367 6C6F 7071" /* iijihgeb``cglopq */ $"7271 7174 7B84 8D93 9698 9793 8E8A 8887" /* rqqt{„�“–˜—“ŽŠˆ‡ */ $"8484 8587 8887 8582 7D77 7371 7478 7B7D" /* „„…‡ˆ‡…‚}wsqtx{} */ $"7E7E 7D7A 7879 7F86 8D92 9595 938E 8885" /* ~~}zxy.†�’••“Žˆ… */ $"8383 8282 8486 8786 8481 7C77 7372 7374" /* ƒƒ‚‚„†‡†„�|wsrst */ $"7471 6E6B 6763 6164 6D77 7F85 8A8D 8D8A" /* tqnkgcadmw.…Š��Š */ $"8887 8788 8889 898A 8884 807D 7874 7374" /* ˆ‡‡ˆˆ‰‰Šˆ„€}xtst */ $"7679 7B7B 7A79 7876 7679 7F86 8A8C 8C8A" /* vy{{zyxvvy.†ŠŒŒŠ */ $"8680 7C7C 7C7D 7E7F 8081 807F 7C79 7673" /* †€|||}~.€�€.|yvs */ $"7172 7579 7C7F 8285 8687 898F 97A0 A6A8" /* qruy|.‚…†‡‰�— ¦¨ */ $"A7A4 9C93 8B84 7F7A 7571 6E6C 6A67 6563" /* §¤œ“‹„.zuqnljgec */ $"615F 5E60 6467 6A6B 6D6F 7070 7277 7F88" /* a_^`dgjkmopprw.ˆ */ $"9094 9797 9490 8C8A 8988 8685 8687 8685" /* �”——”�ŒŠ‰ˆ†…†‡†… */ $"837F 7A75 7271 7477 7A7B 7C7B 7876 767B" /* ƒ.zurqtwz{|{xvv{ */ $"828B 9295 9695 908A 8685 8586 8688 898A" /* ‚‹’•–•�І……††ˆ‰Š */ $"8987 8480 7C78 7675 7676 7571 6D69 6461" /* ‰‡„€|xvuvvuqmida */ $"6166 6E76 7D81 8486 8481 8182 8485 8789" /* afnv}�„†„��‚„…‡‰ */ $"8C8D 8B88 847F 7A78 7779 7C7F 7F7E 7D7A" /* Œ�‹ˆ„.zxwy|..~}z */ $"7775 777D 8389 8C8C 8983 7C76 7375 7779" /* wuw}ƒ‰ŒŒ‰ƒ|vsuwy */ $"7B7D 7F80 7E7C 7B78 7675 7577 7A7D 7F80" /* {}.€~|{xvuuwz}.€ */ $"8285 8789 8E96 9EA4 A7A8 A6A1 9990 8982" /* ‚…‡‰Ž–ž¤§¨¦¡™�‰‚ */ $"7D78 7471 6F6C 6965 6360 5E5E 6063 676A" /* }xtqoliec`^^`cgj */ $"6C6D 6E6F 7072 777F 878E 9396 9693 8F8B" /* lmnoprw.‡Ž“––“�‹ */ $"8988 8887 8584 8483 8280 7E7B 7875 7474" /* ‰ˆˆ‡…„„ƒ‚€~{xutt */ $"7577 797B 7C7B 7A7A 7D82 898F 9396 9591" /* uwy{|{zz}‚‰�“–•‘ */ $"8C86 8382 8182 8485 8686 8482 807C 7876" /* Œ†ƒ‚�‚„…††„‚€|xv */ $"7677 7878 7673 706C 6867 696E 767C 8082" /* vwxxvsplhginv|€‚ */ $"8280 7E7D 7E7F 8082 8587 8888 8683 807C" /* ‚€~}~.€‚…‡ˆˆ†ƒ€| */ $"7877 787A 7D7E 7F7E 7D7A 7879 7E84 8B90" /* xwxz}~.~}zxy~„‹� */ $"918F 8B83 7C76 7474 7577 797B 7C7C 7A77" /* ‘�‹ƒ|vttuwy{||zw */ $"7472 7172 7577 7A7B 7C7D 7E80 8389 919A" /* trqruwz{|}~€ƒ‰‘š */ $"A2A7 A9A9 A6A0 9891 8C86 807C 7874 706B" /* ¢§©©¦ ˜‘Œ†€|xtpk */ $"6662 5E5B 5A5B 5D61 6567 696A 6A6C 6E73" /* fb^[Z[]aegijjlns */ $"7A81 898F 9294 9390 8C8A 8A89 8989 8887" /* z�‰�’”“�ŒŠŠ‰‰‰ˆ‡ */ $"8684 8280 7D7B 7978 7878 7878 7878 797A" /* †„‚€}{yxxxxxxxyz */ $"7B7D 8187 8C8F 9190 8D89 8582 8080 8080" /* {}�‡Œ�‘��‰…‚€€€€ */ $"8384 8584 8381 7F7B 7A7A 7B7C 7C7B 7875" /* ƒ„…„ƒ�.{zz{||{xu */ $"726E 6B6C 6F75 7B7F 8081 807D 7A79 7B7D" /* rnklou{.€�€}zy{} */ $"7F81 8485 8685 8481 7E7A 7979 7A7C 7D7E" /* .�„…†…„�~zyyz|}~ */ $"7E7D 7B79 787B 8087 8C8F 8F8D 8881 7B76" /* ~}{yx{€‡Œ���ˆ�{v */ $"7574 7678 7B7D 7E7D 7B78 7573 7476 787B" /* utvx{}~}{xustvx{ */ $"7E7F 7E7D 7D7E 8189 929B A1A5 A6A3 9E98" /* ~.~}}~�‰’›¡¥¦£ž˜ */ $"918D 8984 807E 7A76 716B 6662 5F5E 5F61" /* ‘�‰„€~zvqkfb_^_a */ $"6467 696B 6C6C 6C6E 7278 8087 8D90 9190" /* dgiklllnrx€‡��‘� */ $"8D89 8685 8484 8485 8584 8280 7F7C 7977" /* �‰†…„„„……„‚€.|yw */ $"787A 7B7B 7A7A 7979 797A 7E82 898E 9293" /* xz{{zzyyyz~‚‰Ž’“ */ $"928F 8B87 8381 807F 7F80 8080 8180 7F7D" /* ’�‹‡ƒ�€..€€€�€.} */ $"7B7A 7B7D 7E7E 7E7E 7C78 7472 7173 777B" /* {z{}~~~~|xtrqsw{ */ $"7E80 807F 7C79 7777 787A 7D80 8082 8281" /* ~€€.|ywwxz}€€‚‚� */ $"807D 7978 787A 7C7D 7E7F 7E7D 7B7C 7E82" /* €}yxxz|}~.~}{|~‚ */ $"888D 9091 908C 8680 7B77 7574 7577 797B" /* ˆ��‘�Œ†€{wutuwy{ */ $"7B7A 7875 7270 7275 787B 7C7D 7C7B 7B7E" /* {zxurprux{|}|{{~ */ $"838C 969E A3A6 A5A1 9D96 928E 8A86 8380" /* ƒŒ–ž£¦¥¡�–’ŽŠ†ƒ€ */ $"7C77 716A 6461 5D5D 5F61 6466 6768 696A" /* |wqjda]]_adfghij */ $"6B6E 757D 858B 9091 918F 8C89 8787 8686" /* knu}…‹�‘‘�Œ‰‡‡†† */ $"8787 8685 8280 7D79 7675 7779 7A7A 7977" /* ‡‡†…‚€}yvuwyzzyw */ $"7574 7478 7E85 8B8F 9191 8F8B 8784 8282" /* uttx~…‹�‘‘�‹‡„‚‚ */ $"8181 8181 8281 8080 7F7D 7B7C 7D7E 7F7F" /* ����‚�€€.}{|}~.. */ $"7E7D 7B78 7574 7678 7B7D 7E7E 7C79 7775" /* ~}{xutvx{}~~|ywu */ $"7475 7678 7C7F 8183 8281 807E 7B7A 7B7D" /* tuvx|.�ƒ‚�€~{z{} */ $"8080 8080 7F7D 7C7E 8288 8C8F 908F 8B86" /* €€€€.}|~‚ˆŒ���‹† */ $"807D 7976 7372 7375 7778 7878 7774 7272" /* €}yvsrsuwxxxwtrr */ $"7476 797B 7C7D 7C7C 7C80 868F 969C A0A2" /* tvy{|}|||€†�–œ ¢ */ $"A19D 9794 908D 8A88 8582 7E79 726B 6661" /* ¡�—”��Šˆ…‚~yrkfa */ $"5D5E 6164 6768 6969 6969 6B70 7880 888C" /* ]^adghiiiikpx€ˆŒ */ $"8E8E 8C89 8686 8685 8585 8687 8684 817F" /* ŽŽŒ‰†††………†‡†„�. */ $"7C78 7778 7A7C 7D7D 7B79 7776 787D 838B" /* |xwxz|}}{ywvx}ƒ‹ */ $"9193 9391 8D87 8381 8080 8080 8080 7F7E" /* ‘““‘�‡ƒ�€€€€€€.~ */ $"7C7C 7B7A 7A7C 7E80 807F 7E7D 7C7A 7A7B" /* ||{zz|~€€.~}|zz{ */ $"7E80 8180 7F7C 7975 7372 7373 7476 787B" /* ~€�€.|yusrsstvx{ */ $"7D7E 7E7D 7C7A 7A7B 7C7E 8080 8080 7F7F" /* }~~}|zz{|~€€€€.. */ $"8085 8A8F 9393 9290 8B86 817F 7C78 7574" /* €…Š�““’�‹†�.|xut */ $"7474 7475 7474 7372 7272 7375 7778 797A" /* tttuttsrrrsuwxyz */ $"7A7A 7D82 8992 989E A1A1 9E9B 9794 9390" /* zz}‚‰’˜ž¡¡ž›—”“� */ $"8E8C 8985 807A 736C 6762 5F5F 6163 6565" /* ŽŒ‰…€zslgb__acee */ $"6665 6567 6B71 7A81 878B 8C8B 8886 8484" /* feegkqz�‡‹Œ‹ˆ†„„ */ $"8686 8687 8887 8684 817F 7B79 7879 7B7C" /* †††‡ˆ‡†„�.{yxy{| */ $"7D7C 7B78 7675 787E 858C 9193 928F 8A85" /* }|{xvux~…Œ‘“’�Š… */ $"8282 8282 8383 8381 807E 7C7A 7979 7B7D" /* ‚‚‚‚ƒƒƒ�€~|zyy{} */ $"7F80 7F7E 7D7B 7A79 7C80 8283 8280 7D78" /* .€.~}{zy|€‚ƒ‚€}x */ $"7472 7171 7273 7577 797B 7D7D 7E7D 7B7B" /* trqqrsuwy{}}~}{{ */ $"7D7E 7F80 8080 7F7E 7D7E 8187 8D90 9191" /* }~.€€€.~}~�‡��‘‘ */ $"8F8B 8681 7F7D 7B79 7775 7474 7373 7374" /* �‹†�.}{ywuttssst */ $"7474 7778 7878 797A 7A7A 7A7C 8085 8C90" /* ttwxxxyzzzz|€…Œ� */ $"9599 9A9A 9896 9492 908F 8D8C 8985 807B" /* •™šš˜–”’���Œ‰…€{ */ $"7570 6966 6566 6767 6869 6867 676A 6F76" /* upifefgghihggjov */ $"7E83 8789 8885 8280 8081 8183 8485 8483" /* ~ƒ‡‰ˆ…‚€€��ƒ„…„ƒ */ $"8280 7D7A 7878 797B 7C7D 7D7E 7D7B 797B" /* ‚€}zxxy{|}}~}{y{ */ $"7F85 8C90 9393 918D 8783 8180 8080 8180" /* .…Œ�““‘�‡ƒ�€€€�€ */ $"807E 7B79 7775 7476 797C 7E7F 7F7F 7D7B" /* €~{ywutvy|~...}{ */ $"7B7E 8287 8B8B 8985 807A 7572 7272 7374" /* {~‚‡‹‹‰…€zurrrst */ $"7575 7677 7878 7878 787A 7C7D 7E7E 7E7E" /* uuvwxxxxxz|}~~~~ */ $"7D7C 7D80 868C 9093 9391 8F8A 8583 817F" /* }|}€†Œ�““‘�Š…ƒ�. */ $"7D7C 7977 7472 7170 7070 7172 7477 7878" /* }|ywtrqpppqrtwxx */ $"7777 7777 797E 838A 8F92 9596 9695 9595" /* wwwwy~ƒŠ�’•––••• */ $"9594 9392 908E 8B86 817B 7570 6B67 6665" /* •”“’�Ž‹†�{upkgfe */ $"6565 6666 6767 686C 7279 7F83 8686 8583" /* eeffgghlry.ƒ††…ƒ */ $"8180 8082 8486 8889 8886 8481 7F7C 7A7A" /* �€€‚„†ˆ‰ˆ†„�.|zz */ $"7B7C 7D7C 7B7A 7978 787C 8087 8C8F 8F8F" /* {|}|{zyxx|€‡Œ��� */ $"8B87 8482 8180 8182 8282 8180 7D7B 7877" /* ‹‡„‚�€�‚‚‚�€}{xw */ $"787A 7C7E 8080 807F 7D7C 7D80 8589 8B8B" /* xz|~€€€.}|}€…‰‹‹ */ $"8983 7D75 716F 6F6F 7174 7474 7474 7474" /* ‰ƒ}uqoooqttttttt */ $"7577 797C 7F80 8180 7F7E 7D7E 8085 8B90" /* uwy|.€�€.~}~€…‹� */ $"9394 928E 8985 8280 807E 7C7B 7875 7371" /* “”’މ…‚€€~|{xusq */ $"6F6E 6E6F 7174 7779 7A7B 7A7A 7A7B 7E83" /* onnoqtwyz{zzz{~ƒ */ $"8A8E 9294 9493 9190 9091 9192 9291 8E8B" /* ŠŽ’””“‘��‘‘’’‘Ž‹ */ $"8884 807A 7471 6D6A 6868 6666 6666 6768" /* ˆ„€ztqmjhhffffgh */ $"6C72 777D 8082 8382 8080 8080 8080 8183" /* lrw}€‚ƒ‚€€€€€€�ƒ */ $"8485 8483 817F 7D7B 7B7B 7B7C 7D7C 7C7B" /* „…„ƒ�.}{{{{|}||{ */ $"7A7B 7E82 878B 8E90 908D 8A86 8482 8180" /* z{~‚‡‹Ž���І„‚�€ */ $"8081 8080 7F7C 7A77 7575 7779 7B7D 7E7F" /* €�€€.|zwuuwy{}~. */ $"7F7E 7E7E 8186 8B8E 908F 8B85 7F78 7472" /* .~~~�†‹Ž��‹….xtr */ $"7171 7274 7474 7372 7171 7274 777A 7D7E" /* qqrtttsrqqrtwz}~ */ $"7F7E 7D7B 7B7E 8288 8E92 9595 928D 8985" /* .~}{{~‚ˆŽ’••’�‰… */ $"8382 8180 807E 7B77 7470 6E6C 6C6E 7174" /* ƒ‚�€€~{wtpnllnqt */ $"7677 7878 7776 777A 7F85 8B8E 9192 908E" /* vwxxwvwz.…‹Ž‘’�Ž */ $"8C8C 8E90 9193 9494 918E 8A85 807C 7774" /* ŒŒŽ�‘“””‘ŽŠ…€|wt */ $"7370 6D6A 6866 6564 6569 6E75 797D 8080" /* spmjhfedeinuy}€€ */ $"7F7D 7C7C 7D7E 7E80 8182 8384 8382 8180" /* .}||}~~€�‚ƒ„ƒ‚�€ */ $"7E7E 7F7E 7E7E 7E7D 7B79 797C 8085 898B" /* ~~.~~~~}{yy|€…‰‹ */ $"8C8C 8B89 8684 8281 8080 8181 8080 7E7C" /* ŒŒ‹‰†„‚�€€��€€~| */ $"7977 7779 7B7D 7E7F 8080 7F7E 7F81 8589" /* ywwy{}~.€€.~.�…‰ */ $"8B8D 8E8C 8881 7C77 7471 6F70 7172 7271" /* ‹�ŽŒˆ�|wtqopqrrq */ $"7070 6F70 7276 7A7E 8080 8180 807E 7F81" /* ppoprvz~€€�€€~.� */ $"878C 9193 9392 8E89 8683 8180 8080 7F7D" /* ‡Œ‘““’މ†ƒ�€€€.} */ $"7A76 726E 6C6B 6C6F 7376 7778 797A 7979" /* zvrnlklosvwxyzyy */ $"7B80 858A 8E91 9190 8D89 8989 8A8B 8D90" /* {€…ŠŽ‘‘��‰‰‰Š‹�� */ $"9190 8D8A 8782 7F7B 7876 7572 6F6C 6A68" /* ‘��Ї‚.{xvuroljh */ $"6667 6A6E 757B 8081 8280 7E7C 7B7B 7C7D" /* fgjnu{€�‚€~|{{|} */ $"7E7F 8080 807F 7E7D 7C7C 7C7E 7F7E 7D7C" /* ~.€€€.~}|||~.~}| */ $"7B7A 7979 7C80 8689 8C8D 8D8C 8988 8786" /* {zyy|€†‰Œ��Œ‰ˆ‡† */ $"8584 8383 8280 7F7D 7B78 7675 7677 797B" /* …„ƒƒ‚€.}{xvuvwy{ */ $"7C7C 7C7C 7C7D 8084 898C 8F90 8F8B 8782" /* |||||}€„‰Œ���‹‡‚ */ $"7E7A 7675 7474 7473 7270 6F6D 6C6C 6F73" /* ~zvutttsrpomllos */ $"777A 7C7D 7E7E 7D7E 8085 8B90 9393 9391" /* wz|}~~}~€…‹�“““‘ */ $"8D89 8785 8382 8282 817F 7C77 736E 6B6A" /* �‰‡…ƒ‚‚‚�.|wsnkj */ $"6B6D 7174 7576 7676 7676 7A80 878B 8E90" /* kmqtuvvvvvz€‡‹Ž� */ $"8F8C 8987 8788 898B 8E91 9190 8E8B 8885" /* �Œ‰‡‡ˆ‰‹Ž‘‘�Ž‹ˆ… */ $"817F 7D7C 7977 736F 6B67 6767 6B70 767A" /* �.}|ywsokgggkpvz */ $"7D7E 7E7B 7978 7879 7A7B 7D7F 807F 7E7E" /* }~~{yxxyz{}.€.~~ */ $"7E7D 7D7D 7F81 8282 807F 7E7C 7B7C 8084" /* ~}}}.�‚‚€.~|{|€„ */ $"888C 8D8C 8987 8483 8384 8383 8382 817F" /* ˆŒ�Œ‰‡„ƒƒ„ƒƒƒ‚�. */ $"7D7B 7977 7777 7779 7A7B 7C7D 7E7E 7E80" /* }{ywwwwyz{|}~~~€ */ $"8488 8C8F 908F 8C88 8480 7D7A 7774 7373" /* „ˆŒ���Œˆ„€}zwtss */ $"7271 706F 6D6C 6C6D 7074 777A 7C7D 7E7E" /* rqpomllmptwz|}~~ */ $"7E81 868B 9092 9392 908E 8A88 8584 8281" /* ~�†‹�’“’�ŽŠˆ…„‚� */ $"8180 807D 7A77 726E 6C6B 6D6F 7174 7677" /* �€€}zwrnlkmoqtvw */ $"7777 787B 8086 8A8E 9090 8E8A 8886 8586" /* wwx{€†ŠŽ��ŽŠˆ†…† */ $"8789 8C8F 8F8E 8B88 8581 807F 7F7E 7B78" /* ‡‰Œ��Ž‹ˆ…�€..~{x */ $"7570 6D69 686B 7076 7A7E 7F7F 7C79 7777" /* upmihkpvz~..|yww */ $"7778 7A7B 7D7E 7D7C 7B7A 7A79 797B 7E80" /* wxz{}~}|{zzyy{~€ */ $"8180 807F 7D7B 7C7F 8388 8B8D 8D8B 8884" /* �€€.}{|.ƒˆ‹��‹ˆ„ */ $"8282 8283 8485 8584 817F 7B79 7776 7677" /* ‚‚‚ƒ„……„�.{ywvvw */ $"7879 7A7A 7A7A 7B7C 7E82 888D 9090 908E" /* xyzzzz{|~‚ˆ����Ž */ $"8A87 8381 7F7C 7977 7674 7272 706F 6D6C" /* Їƒ�.|ywvtrrpoml */ $"6C6E 7274 7679 7A7B 7C7D 8084 898E 9092" /* lnrtvyz{|}€„‰Ž�’ */ $"9290 8E8A 8887 8684 8282 8180 7F7C 7976" /* ’�ŽŠˆ‡†„‚‚�€.|yv */ $"726F 6D6D 6E6F 7172 7374 7577 797E 8488" /* rommnoqrstuwy~„ˆ */ $"8C8E 8F8E 8B87 8685 8585 8788 8B8C 8D8C" /* ŒŽ�Ž‹‡†………‡ˆ‹Œ�Œ */ $"8A87 8582 8181 8180 7D7A 7772 6E6B 6C6F" /* Ї…‚���€}zwrnklo */ $"7378 7B7D 7E7C 7977 7676 7778 797B 7D7E" /* sx{}~|ywvvwxy{}~ */ $"7D7B 7A79 7979 7B7E 8081 8181 807F 7D7C" /* }{zyyy{~€���€.}| */ $"7F82 878A 8D8D 8B88 8480 8080 8081 8384" /* .‚‡Š��‹ˆ„€€€€�ƒ„ */ $"8482 807E 7B79 7877 7879 7B7B 7B7B 7B7B" /* „‚€~{yxwxy{{{{{{ */ $"7B7D 8187 8C8F 9191 8F8C 8784 8180 7D7B" /* {}�‡Œ�‘‘�Œ‡„�€}{ */ $"7978 7572 706E 6D6B 6B6B 6D70 7274 7678" /* yxurpnmkkkmprtvx */ $"7A7B 7C7E 8388 8E90 9393 928F 8C88 8787" /* z{|~ƒˆŽ�““’�Œˆ‡‡ */ $"8583 8281 807E 7B79 7875 7270 7070 7070" /* …ƒ‚�€~{yxurppppp */ $"7172 7374 7678 7D82 878A 8D8E 8E8B 8887" /* qrstvx}‚‡Š�ŽŽ‹ˆ‡ */ $"8585 8484 8587 8788 8887 8784 8281 8282" /* ……„„…‡‡ˆˆ‡‡„‚�‚‚ */ $"8281 7F7C 7975 7271 7275 797B 7D7E 7D7A" /* ‚�.|yurqruy{}~}z */ $"7877 7777 7778 797B 7C7B 7A79 7876 7677" /* xwwwwxy{|{zyxvvw */ $"7A7D 7F80 8080 807F 7E7F 8287 8B8E 8E8E" /* z}.€€€€.~.‚‡‹ŽŽŽ */ $"8B87 8381 8080 8081 8384 8481 7F7C 7978" /* ‹‡ƒ�€€€�ƒ„„�.|yx */ $"7676 7879 7A7A 7979 7979 7A7D 8288 8E90" /* vvxyzzyyyyz}‚ˆŽ� */ $"9291 8F8B 8785 8382 807E 7D7A 7873 706D" /* ’‘�‹‡…ƒ‚€~}zxspm */ $"6C6A 6A6C 6D70 7273 7375 7677 797E 8389" /* ljjlmprssuvwy~ƒ‰ */ $"8D90 9191 8F8C 8988 8887 8686 8584 817F" /* ��‘‘�Œ‰ˆˆ‡††…„�. */ $"7C79 7775 7373 7372 7170 7172 7273 7579" /* |ywusssrqpqrrsuy */ $"7F84 888B 8C8B 8987 8685 8584 8484 8686" /* .„ˆ‹Œ‹‰‡†……„„„†† */ $"8786 8686 8685 8484 8586 8583 807E 7A77" /* ‡††††…„„…†…ƒ€~zw */ $"7474 7679 7B7C 7C7B 7976 7474 7475 7577" /* ttvy{||{yvtttuuw */ $"7979 7A79 7978 7776 7779 7C7F 8081 8181" /* yyzyyxwvwy|.€��� */ $"8080 8082 868A 8C8D 8D8B 8784 807F 7E7E" /* €€€‚†ŠŒ��‹‡„€.~~ */ $"7E80 8182 8180 7D7B 7977 7779 7A7B 7C7B" /* ~€�‚�€}{ywwyz{|{ */ $"7A7A 7979 7C80 868C 8F91 918F 8C88 8684" /* zzyy|€†Œ�‘‘�Œˆ†„ */ $"8281 807F 7D7A 7773 6F6C 6A6A 6B6D 6F71" /* ‚�€.}zwsoljjkmoq */ $"7273 7374 7678 7C82 888C 9092 9290 8C8A" /* rsstvx|‚ˆŒ�’’�ŒŠ */ $"8887 8786 8686 8583 807D 7A77 7573 7373" /* ˆ‡‡†††…ƒ€}zwusss */ $"7373 7270 7070 7073 777C 8287 8A8C 8C8A" /* ssrppppsw|‚‡ŠŒŒŠ */ $"8685 8585 8585 8585 8686 8584 8484 8384" /* †…………………††…„„„ƒ„ */ $"8485 8685 8482 807E 7B79 797A 7C7D 7E7D" /* „…†…„‚€~{yyz|}~} */ $"7C79 7775 7373 7373 7576 7879 7877 7675" /* |ywussssuvxyxwvu */ $"7575 7679 7C7E 7F80 8080 8080 8386 8B8D" /* uuvy|~.€€€€€ƒ†‹� */ $"8E8E 8C8A 8683 8180 7F7F 7F80 8081 807F" /* ŽŽŒŠ†ƒ�€...€€�€. */ $"7D7B 7978 7879 7A7A 7A7A 7A79 797A 7E83" /* }{yxxyzzzzzyyz~ƒ */ $"878B 8E90 8F8D 8A86 8584 8381 8180 7F7C" /* ‡‹Ž���І…„ƒ��€.| */ $"7975 706D 6B6B 6D6F 7071 7272 7273 7478" /* yupmkkmopqrrrstx */ $"7D83 898C 8F90 8E8B 8988 8786 8686 8686" /* }ƒ‰Œ��Ž‹‰ˆ‡††††† */ $"8684 817E 7A78 7675 7576 7675 7371 706F" /* †„�~zxvuuvvusqpo */ $"7073 787E 8386 898A 8885 8382 8282 8283" /* psx~ƒ†‰Šˆ…ƒ‚‚‚‚ƒ */ $"8485 8483 8282 8182 8284 8587 8786 8584" /* „…„ƒ‚‚�‚‚„…‡‡†…„ */ $"8280 7E7E 7F80 8180 7F7D 7A78 7575 7474" /* ‚€~~.€�€.}zxuutt */ $"7474 7575 7676 7675 7574 7475 777A 7C7D" /* ttuuvvvuuttuwz|} */ $"7E7F 8080 8082 868A 8D8E 8F8E 8B88 8583" /* ~.€€€‚†Š�Ž�Ž‹ˆ…ƒ */ $"8180 807F 7F80 8080 7F7D 7C7A 7979 7A7A" /* �€€..€€€.}|zyyzz */ $"7B7B 7B7B 7A7A 7A7C 8185 898B 8D8E 8C8A" /* {{{{zzz|�…‰‹�ŽŒŠ */ $"8785 8584 8281 8080 7E7B 7774 6F6C 6A6B" /* ‡……„‚�€€~{wtoljk */ $"6D6F 7071 7172 7273 757A 8086 8B8E 8F8F" /* mopqqrrsuz€†‹Ž�� */ $"8C8A 8888 8887 8686 8686 8583 807D 7A78" /* ŒŠˆˆˆ‡††††…ƒ€}zx */ $"7676 7777 7675 7472 706F 7175 7B81 8588" /* vvwwvutrpoqu{�…ˆ */ $"8989 8784 8282 8282 8283 8483 8281 8080" /* ‰‰‡„‚‚‚‚‚ƒ„ƒ‚�€€ */ $"7F7F 8083 8587 8685 8583 8180 8081 8384" /* ..€ƒ…‡†……ƒ�€€�ƒ„ */ $"8483 807E 7B77 7676 7675 7575 7676 7676" /* „ƒ€~{wvvvuuuvvvv */ $"7574 7473 7476 787A 7B7B 7D7E 7E7E 8084" /* uttstvxz{{}~~~€„ */ $"888B 8D8E 8D8B 8884 8383 8280 8080 8080" /* ˆ‹�Ž�‹ˆ„ƒƒ‚€€€€€ */ $"7F7E 7D7C 7B7B 7B7B 7C7C 7C7C 7B7B 7B7B" /* .~}|{{{{||||{{{{ */ $"7C80 8487 898B 8B8A 8987 8585 8483 8282" /* |€„‡‰‹‹Š‰‡……„ƒ‚‚ */ $"8180 7E7B 7875 716E 6C6D 6E70 7171 7171" /* �€~{xuqnlmnpqqqq */ $"7172 767B 8186 8A8C 8D8C 8987 8686 8686" /* qrv{�†ŠŒ�Œ‰‡†††† */ $"8686 8786 8482 807D 7B79 7979 7A79 7876" /* ††‡†„‚€}{yyyzyxv */ $"7573 7171 7378 7D81 8486 8685 8381 8080" /* usqqsx}�„††…ƒ�€€ */ $"8181 8182 8382 8180 7F7E 7E7F 8184 8688" /* ���‚ƒ‚�€.~~.�„†ˆ */ $"8887 8684 8383 8486 8888 8684 807B 7775" /* ˆ‡†„ƒƒ„†ˆˆ†„€{wu */ $"7474 7373 7374 7474 7372 7272 7273 7577" /* ttssstttsrrrrsuw */ $"797A 7B7B 7D7E 7F80 8489 8C8E 8E8E 8C89" /* yz{{}~.€„‰ŒŽŽŽŒ‰ */ $"8583 8281 8080 8080 7F7E 7D7B 7B7B 7B7B" /* …ƒ‚�€€€€.~}{{{{{ */ $"7B7C 7D7C 7B7B 7B7B 7B7C 8084 8789 8A8B" /* {|}|{{{{{|€„‡‰Š‹ */ $"8A89 8685 8584 8483 8382 8180 7D7A 7775" /* Љ†……„„ƒƒ‚�€}zwu */ $"7170 6F6F 7070 7070 7171 7174 797E 8387" /* qpooppppqqqty~ƒ‡ */ $"898B 8B89 8786 8686 8686 8686 8684 8381" /* ‰‹‹‰‡††††††††„ƒ� */ $"7F7C 7B7A 7A7B 7B7A 7877 7674 7274 767B" /* .|{zz{{zxwvtrtv{ */ $"8082 8485 8483 8180 8080 8080 8181 8180" /* €‚„…„ƒ�€€€€€���€ */ $"807E 7C7C 7C7E 8083 8586 8786 8584 8485" /* €~|||~€ƒ…†‡†…„„… */ $"888A 8C8B 8885 817C 7876 7574 7474 7474" /* ˆŠŒ‹ˆ…�|xvuttttt */ $"7473 7371 7171 7173 7477 7879 797A 7B7C" /* tssqqqqstwxyyz{| */ $"7E81 868A 8D8E 8E8D 8B88 8584 8382 8180" /* ~�†Š�ŽŽ�‹ˆ…„ƒ‚�€ */ $"8080 7F7D 7B7B 7B7A 7A7B 7C7D 7D7C 7B7B" /* €€.}{{{zz{|}}|{{ */ $"7B7B 7B7E 8286 8888 8988 8886 8484 8484" /* {{{~‚†ˆˆ‰ˆˆ†„„„„ */ $"8484 8483 8280 7D7B 7876 7473 7272 7170" /* „„„ƒ‚€}{xvtsrrqp */ $"7070 7071 7376 7B80 8386 8888 8786 8585" /* pppqsv{€ƒ†ˆˆ‡†…… */ $"8585 8585 8686 8584 8280 7F7D 7B7B 7B7B" /* …………††…„‚€.}{{{{ */ $"7B7A 7877 7675 7577 7A7D 8082 8382 8180" /* {zxwvuuwz}€‚ƒ‚�€ */ $"8080 8080 8080 8081 8080 7E7D 7B7B 7C7E" /* €€€€€€€�€€~}{{|~ */ $"8083 8485 8686 8585 8688 8B8D 8D8C 8985" /* €ƒ„…††……†ˆ‹��Œ‰… */ $"807B 7776 7574 7474 7474 7373 7171 7070" /* €{wvutttttssqqpp */ $"7273 7577 7878 797A 7B7C 8084 888C 8D8E" /* rsuwxxyz{|€„ˆŒ�Ž */ $"8D8C 8885 8483 8281 8080 807F 7D7B 7A79" /* �Œˆ…„ƒ‚�€€€.}{zy */ $"7979 7B7C 7E7F 7E7D 7C7B 7B7C 7E82 8688" /* yy{|~.~}|{{|~‚†ˆ */ $"8989 8888 8584 8383 8483 8383 8281 807D" /* ‰‰ˆˆ…„ƒƒ„ƒƒƒ‚�€} */ $"7B79 7776 7474 7473 7171 7171 7173 767A" /* {ywvtttsqqqqqsvz */ $"7E81 8386 8787 8685 8585 8584 8485 8584" /* ~�ƒ†‡‡†…………„„……„ */ $"8382 807E 7D7C 7C7C 7C7C 7B79 7878 7777" /* ƒ‚€~}|||||{yxxww */ $"787C 7E80 8182 8281 8080 8080 8080 8081" /* x|~€�‚‚�€€€€€€€� */ $"8180 807F 7D7C 7B7B 7C7D 8080 8183 8384" /* �€€.}|{{|}€€�ƒƒ„ */ $"8485 878B 8D8E 8E8C 8985 807C 7978 7776" /* „…‡‹�ŽŽŒ‰…€|yxwv */ $"7676 7675 7472 7170 7071 7374 7677 7878" /* vvvutrqppqstvwxx */ $"7878 797C 8085 898B 8C8C 8B89 8684 8383" /* xxy|€…‰‹ŒŒ‹‰†„ƒƒ */ $"8281 8180 807F 7C7B 7A79 797A 7C7D 7E7F" /* ‚��€€.|{zyyz|}~. */ $"7E7D 7C7C 7C7D 8084 8788 8988 8785 8382" /* ~}|||}€„‡ˆ‰ˆ‡…ƒ‚ */ $"8283 8383 8383 8381 7F7D 7C7A 7878 7877" /* ‚ƒƒƒƒƒƒ�.}|zxxxw */ $"7674 7371 7171 7274 787C 8081 8283 8382" /* vtsqqqrtx|€�‚ƒƒ‚ */ $"8282 8383 8484 8484 8584 8381 807F 7E7E" /* ‚‚ƒƒ„„„„…„ƒ�€.~~ */ $"7E7E 7E7D 7C7B 7A78 787A 7C7F 8081 8180" /* ~~~}|{zxxz|.€��€ */ $"807E 7D7D 7D7E 7F7F 8080 807F 7D7C 7C7B" /* €~}}}~..€€€.}||{ */ $"7B7C 7D7F 8080 8183 8385 8789 8C8F 908F" /* {|}.€€�ƒƒ…‡‰Œ��� */ $"8F8C 8884 807D 7A78 7674 7474 7473 7170" /* �Œˆ„€}zxvttttsqp */ $"6F6F 6F70 7274 7677 7878 7879 7C80 8488" /* oooprtvwxxxy|€„ˆ */ $"8B8D 8E8D 8B88 8685 8483 8281 8180 7F7C" /* ‹�Ž�‹ˆ†…„ƒ‚��€.| */ $"7A78 7878 7878 7B7C 7D7E 7D7D 7C7C 7E80" /* zxxxxx{|}~}}||~€ */ $"8387 898A 8988 8684 8383 8383 8383 8383" /* ƒ‡‰Š‰ˆ†„ƒƒƒƒƒƒƒƒ */ $"8280 7E7C 7A78 7878 7878 7675 7371 7171" /* ‚€~|zxxxxxvusqqq */ $"7376 7B7E 8081 8281 8180 8182 8384 8484" /* sv{~€�‚��€�‚ƒ„„„ */ $"8585 8483 8280 807F 7E7F 7F7F 7E7C 7C7A" /* ……„ƒ‚€€.~...~||z */ $"7979 7A7C 7F80 8181 807F 7D7C 7C7C 7D7E" /* yyz|.€��€.}|||}~ */ $"7F7F 8080 7F7E 7C7C 7B7B 7B7C 7D7E 7F80" /* ..€€.~||{{{|}~.€ */ $"8081 8283 878A 8E90 9190 8E8A 8784 817E" /* €�‚ƒ‡ŠŽ�‘�ŽŠ‡„�~ */ $"7C79 7876 7575 7473 7171 6F6F 7071 7475" /* |yxvuutsqqoopqtu */ $"7576 7677 7879 7C81 8589 8B8C 8B8A 8786" /* uvvwxy|�…‰‹Œ‹Š‡† */ $"8483 8282 8281 8080 7F7C 7B79 7878 787A" /* „ƒ‚‚‚�€€.|{yxxxz */ $"7C7C 7D7E 7E7E 7E7E 8082 8587 8888 8785" /* ||}~~~~~€‚…‡ˆˆ‡… */ $"8280 8080 8080 8081 8281 807F 7D7C 7A79" /* ‚€€€€€€�‚�€.}|zy */ $"7979 7978 7876 7472 7273 767A 7E80 8080" /* yyyxxvtrrsvz~€€€ */ $"807F 7E7E 7F80 8182 8282 8282 8180 8080" /* €.~~.€�‚‚‚‚‚�€€€ */ $"7F7F 7F80 807F 7E7D 7C7C 7B7C 7E80 8282" /* ...€€.~}||{|~€‚‚ */ $"8281 807E 7C7B 7C7C 7C7D 7E7F 7F7E 7D7C" /* ‚�€~|{|||}~..~}| */ $"7B7B 7A7A 7B7C 7D7D 7E7E 7F80 8184 888C" /* {{zz{|}}~~.€�„ˆŒ */ $"8F90 908F 8D89 8683 8280 7D7B 7978 7675" /* �����‰†ƒ‚€}{yxvu */ $"7372 7170 6F6F 7172 7374 7575 7676 787A" /* srqpooqrstuuvvxz */ $"7E81 8587 8889 8888 8685 8483 8282 8281" /* ~�…‡ˆ‰ˆˆ†…„ƒ‚‚‚� */ $"8080 7D7C 7978 7878 797B 7C7C 7C7C 7D7D" /* €€}|yxxxy{||||}} */ $"7E80 8285 8788 8887 8583 8280 8080 8080" /* ~€‚…‡ˆˆ‡…ƒ‚€€€€€ */ $"8181 8281 807F 7C7C 7A7A 7A7B 7A79 7876" /* ��‚�€.||zzz{zyxv */ $"7573 7375 797C 7E80 8080 7F7C 7C7C 7E80" /* ussuy|~€€€.|||~€ */ $"8081 8282 8282 8180 8080 8080 8080 8080" /* €�‚‚‚‚�€€€€€€€€€ */ $"7E7D 7C7C 7C7E 8082 8382 8280 7E7C 7A7A" /* ~}|||~€‚ƒ‚‚€~|zz */ $"7A7B 7C7C 7D7D 7E7D 7C7B 7B7B 7B7C 7C7D" /* z{||}}~}|{{{{||} */ $"7E7E 7E7E 7F80 8285 8A8E 8F8F 8F8D 8B88" /* ~~~~.€‚…ŠŽ����‹ˆ */ $"8584 8280 7E7C 7978 7674 7271 7171 7171" /* …„‚€~|yxvtrqqqqq */ $"7273 7474 7576 7678 797D 8083 8586 8787" /* rsttuvvxy}€ƒ…†‡‡ */ $"8685 8484 8383 8282 8180 807F 7C7A 7978" /* †…„„ƒƒ‚‚�€€.|zyx */ $"7879 797A 7B7C 7C7C 7D7E 8082 8587 8888" /* xyyz{|||}~€‚…‡ˆˆ */ $"8786 8482 8180 8080 8080 8080 8080 7F7D" /* ‡†„‚�€€€€€€€€€.} */ $"7C7B 7B7B 7C7C 7B7A 7977 7676 7679 7C7E" /* |{{{||{zywvvvy|~ */ $"8080 807F 7D7C 7B7C 7D7E 8080 8182 8180" /* €€€.}|{|}~€€�‚�€ */ $"807F 7F7F 7F80 8080 8080 7F7D 7D7D 7F80" /* €....€€€€€.}}}.€ */ $"8284 8483 8280 7D7B 7A7A 7B7B 7C7C 7D7C" /* ‚„„ƒ‚€}{zz{{||}| */ $"7C7C 7B7A 7A7A 7A7C 7C7D 7D7C 7C7D 7E80" /* ||{zzzz||}}||}~€ */ $"8286 8A8D 8E8D 8D8B 8988 8685 8381 807D" /* ‚†Š�Ž��‹‰ˆ†…ƒ�€} */ $"7B79 7774 7472 7272 7273 7474 7474 7474" /* {ywttrrrrstttttt */ $"7678 7B7F 8284 8586 8685 8584 8484 8483" /* vx{.‚„…††……„„„„ƒ */ $"8382 8281 807E 7D7B 7A79 7979 7A7A 7B7B" /* ƒ‚‚�€~}{zyyyzz{{ */ $"7B7C 7D7F 8084 8688 8887 8584 8281 8080" /* {|}.€„†ˆˆ‡…„‚�€€ */ $"8080 8080 8080 807F 7E7D 7D7D 7D7D 7D7D" /* €€€€€€€.~}}}}}}} */ $"7C7A 7978 7878 7A7B 7D7F 807F 7D7D 7B7A" /* |zyxxxz{}.€.}}{z */ $"7A7A 7C7D 7E80 8080 8080 7F7F 7F7F 8080" /* zz|}~€€€€€....€€ */ $"8080 8080 7F7E 7E80 8083 8586 8583 8180" /* €€€€.~~€€ƒ…†…ƒ�€ */ $"7D7B 7A7A 7A7B 7C7C 7C7C 7B7A 7A7A 7A7A" /* }{zzz{||||{zzzzz */ $"7B7C 7D7D 7D7D 7D7D 7E80 8387 8A8C 8D8D" /* {|}}}}}}~€ƒ‡ŠŒ�� */ $"8B8A 8887 8585 8482 807E 7C7A 7775 7372" /* ‹Šˆ‡……„‚€~|zwusr */ $"7272 7374 7575 7575 7576 777A 7D80 8284" /* rrstuuuuuvwz}€‚„ */ $"8585 8483 8383 8384 8483 8382 8180 807D" /* ……„ƒƒƒƒ„„ƒƒ‚�€€} */ $"7C7B 7A7A 7A7A 7A7A 7A7A 7B7C 7E80 8385" /* |{zzzzzzzz{|~€ƒ… */ $"8888 8887 8583 8280 8080 8080 8080 8080" /* ˆˆˆ‡…ƒ‚€€€€€€€€€ */ $"7F7D 7D7D 7D7D 7D7D 7D7D 7B7A 7978 797A" /* .}}}}}}}}}{zyxyz */ $"7C7D 7E7F 7E7D 7D7B 7A7A 7A7A 7B7C 7D7E" /* |}~.~}}{zzzz{|}~ */ $"7F80 7F7F 7E7E 7F80 8081 8180 8080 8080" /* .€..~~.€€��€€€€€ */ $"8081 8285 8585 8582 807E 7C7A 7A7A 7A7A" /* €�‚…………‚€~|zzzzz */ $"7B7B 7B7A 7A7A 7A7A 7A7B 7C7D 7D7D 7D7D" /* {{{zzzzzz{|}}}}} */ $"7D7D 8081 8588 8A8B 8B8A 8988 8787 8685" /* }}€�…ˆŠ‹‹Š‰ˆ‡‡†… */ $"8482 8180 7D7A 7875 7473 7373 7475 7575" /* „‚�€}zxutssstuuu */ $"7575 7577 797B 7F81 8283 8382 8181 8181" /* uuuwy{.�‚ƒƒ‚���� */ $"8283 8383 8281 8080 7E7D 7B7B 7B7B 7B7A" /* ‚ƒƒƒ‚�€€~}{{{{{z */ $"7A7A 7A7A 7B7D 8081 8586 8787 8685 8482" /* zzzz{}€�…†‡‡†…„‚ */ $"8181 8180 8080 8080 7F7D 7D7D 7D7D 7D7D" /* ���€€€€€.}}}}}}} */ $"7E7D 7D7C 7B7A 7A7A 7B7D 7F80 807F 7E7D" /* ~}}|{zzz{}.€€.~} */ $"7B7A 7A7A 7A7A 7B7C 7D7D 7E7E 7D7D 7D7E" /* {zzzzz{|}}~~}}}~ */ $"7F80 8081 8080 8080 8080 8184 8586 8685" /* .€€�€€€€€€�„…††… */ $"8481 807E 7D7B 7B7A 7A7A 7A7B 7A7A 7979" /* „�€~}{{zzzz{zzyy */ $"7979 7A7B 7C7D 7D7C 7C7C 7C7E 8083 8688" /* yyz{|}}||||~€ƒ†ˆ */ $"8989 8989 8786 8686 8585 8484 8180 7D7A" /* ‰‰‰‰‡†††……„„�€}z */ $"7875 7575 7575 7575 7575 7575 7578 7A7D" /* xuuuuuuuuuuuuxz} */ $"8081 8282 8181 8080 8081 8182 8383 8281" /* €�‚‚��€€€��‚ƒƒ‚� */ $"8080 7E7D 7D7C 7C7D 7C7B 7A7A 7A7A 7B7E" /* €€~}}||}|{zzzz{~ */ $"8084 8586 8686 8584 8281 8180 8080 8080" /* €„…†††…„‚��€€€€€ */ $"7F7E 7D7D 7C7C 7D7D 7D7E 7F7E 7D7D 7C7C" /* .~}}||}}}~.~}}|| */ $"7C7D 7F80 8080 807F 7D7B 7B7A 7A7A 7B7B" /* |}.€€€€.}{{zzz{{ */ $"7B7B 7B7B 7B7C 7C7C 7D7D 7F80 8080 8080" /* {{{{{|||}}.€€€€€ */ $"8080 8182 8485 8686 8584 8381 807E 7D7C" /* €€�‚„…††…„ƒ�€~}| */ $"7B7B 7B7B 7B7B 7A79 7979 797A 7B7B 7C7D" /* {{{{{{zyyyyz{{|} */ $"7C7C 7C7C 7D80 8184 8587 8888 8786 8685" /* ||||}€�„…‡ˆˆ‡††… */ $"8585 8585 8484 8180 7D7B 7976 7676 7676" /* …………„„�€}{yvvvvv */ $"7676 7575 7575 7679 7B7F 8181 8181 8080" /* vvuuuuvy{.����€€ */ $"8080 8081 8181 8282 8181 807E 7D7D 7D7D" /* €€€���‚‚��€~}}}} */ $"7D7D 7C7B 7B7A 7A7B 7C80 8184 8687 8785" /* }}|{{zz{|€�„†‡‡… */ $"8484 8281 8181 8180 8080 7F7E 7D7B 7B7B" /* „„‚����€€€.~}{{{ */ $"7C7D 7E7F 7E7E 7D7C 7C7C 7D7F 8081 8181" /* |}~.~~}|||}.€��� */ $"807D 7C7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B" /* €}|{{{{{{{{{{{{{ */ $"7B7C 7D7E 7F80 8080 8080 8080 8184 8585" /* {|}~.€€€€€€€�„…… */ $"8685 8583 8180 807E 7D7D 7C7C 7B7B 7B7A" /* †……ƒ�€€~}}||{{{z */ $"7979 7979 7B7B 7C7C 7D7D 7C7C 7C7D 7F81" /* yyyy{{||}}|||}.� */ $"8384 8586 8585 8584 8485 8585 8483 8383" /* ƒ„…†………„„………„ƒƒƒ */ $"8180 7E7C 7A79 7877 7777 7777 7676 7677" /* �€~|zyxwwwwwvvvw */ $"797B 7D80 8181 8180 807E 7E7F 8080 8081" /* y{}€���€€~~.€€€� */ $"8181 8080 7F7D 7D7D 7D7D 7D7D 7D7C 7B7B" /* ��€€.}}}}}}}}|{{ */ $"7B7C 7E80 8385 8686 8584 8383 8181 8181" /* {|~€ƒ…††…„ƒƒ���� */ $"8080 807F 7E7D 7C7C 7C7C 7C7D 7E7F 7F7E" /* €€€.~}|||||}~..~ */ $"7D7D 7D7E 8081 8383 8381 807D 7C7B 7A7A" /* }}}~€�ƒƒƒ�€}|{zz */ $"7A7B 7B7B 7A7A 7A79 797A 7B7C 7D7D 7F80" /* z{{{zzzyyz{|}}.€ */ $"8080 8080 8081 8385 8787 8787 8583 8180" /* €€€€€�ƒ…‡‡‡‡…ƒ�€ */ $"807F 7E7D 7C7C 7B7A 7979 7878 7879 7A7B" /* €.~}||{zyyxxxyz{ */ $"7C7C 7C7C 7C7C 7D7E 8082 8385 8585 8584" /* ||||||}~€‚ƒ…………„ */ $"8383 8485 8585 8584 8383 8180 7E7C 7C79" /* ƒƒ„…………„ƒƒ�€~||y */ $"7979 7878 7877 7676 7778 797C 7E80 8080" /* yyxxxwvvwxy|~€€€ */ $"807F 7E7E 7E7F 8080 8081 8180 8080 7F7D" /* €.~~~.€€€��€€€.} */ $"7D7D 7D7E 7E7D 7C7C 7C7B 7C7C 7F81 8384" /* }}}~~}|||{||.�ƒ„ */ $"8585 8483 8382 8181 8181 8180 8080 7E7D" /* ……„ƒƒ‚�����€€€~} */ $"7C7C 7C7C 7D7D 7E7F 7E7E 7D7D 7D7F 8082" /* ||||}}~.~~}}}.€‚ */ $"8383 8280 7F7D 7C7A 7A7A 7A7B 7B7A 7A79" /* ƒƒ‚€.}|zzzz{{zzy */ $"7979 7979 7B7C 7D7E 7F80 8080 8080 8183" /* yyyy{|}~.€€€€€�ƒ */ $"8586 8787 8685 8383 8180 807F 7E7D 7D7C" /* …†‡‡†…ƒƒ�€€.~}}| */ $"7B7A 7A79 7979 7A7A 7B7C 7C7C 7C7C 7C7D" /* {zzyyyzz{||||||} */ $"7D80 8183 8485 8584 8383 8383 8383 8484" /* }€�ƒ„……„ƒƒƒƒƒƒ„„ */ $"8383 8382 8180 7D7D 7C7B 7A7A 7979 7878" /* ƒƒƒ‚�€}}|{zzyyxx */ $"7778 797A 7C7D 8080 8080 7F7E 7E7E 7E7E" /* wxyz|}€€€€.~~~~~ */ $"7F80 8080 8080 807F 7D7D 7D7D 7D7E 7D7D" /* .€€€€€€.}}}}}~}} */ $"7D7C 7C7C 7D7E 8082 8384 8484 8383 8282" /* }|||}~€‚ƒ„„„ƒƒ‚‚ */ $"8281 8181 8180 807F 7D7D 7C7C 7C7C 7D7D" /* ‚����€€.}}||||}} */ $"7D7E 7E7D 7D7D 7F80 8182 8382 8281 807D" /* }~~}}}.€�‚ƒ‚‚�€} */ $"7C7C 7B7B 7B7B 7B7A 7A7A 7979 797A 7A7C" /* ||{{{{{zzzyyyzz| */ $"7D7D 7E7F 7F7F 7F80 8183 8586 8786 8584" /* }}~....€�ƒ…†‡†…„ */ $"8382 8180 8080 7F7E 7D7D 7C7A 7A79 7979" /* ƒ‚�€€€.~}}|zzyyy */ $"7A7A 7B7C 7C7C 7C7C 7C7D 7F80 8283 8484" /* zz{||||||}.€‚ƒ„„ */ $"8382 8282 8282 8282 8384 8382 8282 8080" /* ƒ‚‚‚‚‚‚‚ƒ„ƒ‚‚‚€€ */ $"7F7D 7D7C 7C7A 7A79 7878 7879 7A7B 7D7E" /* .}}||zzyxxxyz{}~ */ $"7F80 7F7E 7D7D 7D7D 7D7E 7E7F 8080 8080" /* .€.~}}}}}~~.€€€€ */ $"7F7E 7E7E 7E7E 7F7E 7E7D 7D7D 7D7D 7E80" /* .~~~~~.~~}}}}}~€ */ $"8182 8282 8282 8282 8181 8181 8181 8080" /* �‚‚‚‚‚‚‚������€€ */ $"807E 7D7C 7C7C 7C7D 7D7D 7E7E 7E7E 7E80" /* €~}||||}}}~~~~~€ */ $"8082 8384 8483 8280 7F7D 7C7C 7B7A 7A7A" /* €‚ƒ„„ƒ‚€.}||{zzz */ $"7A7A 7A79 7878 7979 7B7C 7D7D 7E7E 7E7F" /* zzzyxxyy{|}}~~~. */ $"8081 8284 8687 8787 8584 8282 8180 8080" /* €�‚„†‡‡‡…„‚‚�€€€ */ $"7F7E 7D7C 7B7B 7979 7979 7A7B 7B7C 7C7C" /* .~}|{{yyyyz{{||| */ $"7C7C 7D7E 8081 8284 8483 8282 8181 8181" /* ||}~€�‚„„ƒ‚‚���� */ $"8282 8383 8382 8281 8080 7F7E 7D7D 7C7B" /* ‚‚ƒƒƒ‚‚�€€.~}}|{ */ $"7B79 7878 797A 7B7D 7D7E 7E7E 7D7D 7D7D" /* {yxxyz{}}~~~}}}} */ $"7D7D 7D7E 7E7E 7E7F 7E7E 7E7E 7E7E 7F7F" /* }}}~~~~.~~~~~~.. */ $"7E7E 7E7D 7D7D 7D7E 8081 8282 8282 8282" /* ~~~}}}}~€�‚‚‚‚‚‚ */ $"8181 8181 8281 8181 8080 7F7D 7D7C 7C7C" /* ����‚���€€.}}||| */ $"7D7D 7D7D 7D7D 7D7D 7F80 8182 8384 8382" /* }}}}}}}}.€�‚ƒ„ƒ‚ */ $"8180 7F7D 7D7C 7C7B 7B7B 7B7B 7A79 7979" /* �€.}}||{{{{{zyyy */ $"797A 7B7C 7D7D 7D7D 7E7F 8081 8385 8686" /* yz{|}}}}~.€�ƒ…†† */ $"8685 8483 8281 8180 8080 807E 7D7C 7B7A" /* †…„ƒ‚��€€€€~}|{z */ $"7979 7979 7B7B 7B7C 7C7C 7C7D 7D80 8182" /* yyyy{{{||||}}€�‚ */ $"8484 8382 8281 8181 8181 8182 8282 8282" /* „„ƒ‚‚������‚‚‚‚‚ */ $"8281 8080 807F 7E7D 7D7C 7B79 7979 7A7B" /* ‚�€€€.~}}|{yyyz{ */ $"7C7D 7E7E 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" /* |}~~}}}}}}}}}}}} */ $"7D7D 7D7D 7D7D 7E7F 8080 7F7E 7D7D 7D7D" /* }}}}}}~.€€.~}}}} */ $"7F80 8181 8282 8181 8181 8181 8181 8181" /* .€��‚‚���������� */ $"8181 8080 7F7D 7D7D 7D7D 7E7E 7E7E 7E7E" /* ��€€.}}}}}~~~~~~ */ $"7E7F 8081 8283 8383 8281 8180 7F7E 7E7D" /* ~.€�‚ƒƒƒ‚��€.~~} */ $"7C7C 7C7B 7B7A 7A79 7979 7A7A 7B7C 7C7D" /* |||{{zzyyyzz{||} */ $"7D7E 7E80 8081 8384 8585 8584 8383 8181" /* }~~€€�ƒ„………„ƒƒ�� */ $"8080 8080 807F 7E7D 7C7A 7A7A 7A7A 7A7B" /* €€€€€.~}|zzzzzz{ */ $"7C7C 7C7C 7C7D 7F80 8183 8383 8281 8180" /* |||||}.€�ƒƒƒ‚��€ */ $"8080 8080 8181 8181 8181 8080 8080 8080" /* €€€€������€€€€€€ */ $"7F7E 7E7D 7C7A 7A7A 7C7D 7E7E 7F7E 7E7D" /* .~~}|zzz|}~~.~~} */ $"7D7D 7D7D 7D7E 7E7E 7E7E 7E7E 7D7D 7E7E" /* }}}}}~~~~~~~}}~~ */ $"7F80 8080 7F7E 7E7E 7E7F 8080 8181 8181" /* .€€€.~~~~.€€���� */ $"8080 8080 8080 8080 8181 8080 8080 7E7E" /* €€€€€€€€��€€€€~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E80 8081 8383" /* ~~~~~~~~~~~€€�ƒƒ */ $"8383 8181 8080 7F7E 7E7D 7D7C 7C7B 7A7A" /* ƒƒ��€€.~~}}||{zz */ $"7A79 7979 7A7A 7A7B 7C7C 7D7E 7E80 8183" /* zyyyzzz{||}~~€�ƒ */ $"8485 8585 8484 8383 8181 8180 8080 807F" /* „………„„ƒƒ���€€€€. */ $"7E7D 7C7B 7B7B 7B7B 7B7B 7C7C 7C7C 7D7E" /* ~}|{{{{{{{||||}~ */ $"8080 8182 8382 8181 8080 8080 8080 8081" /* €€�‚ƒ‚��€€€€€€€� */ $"8181 8180 8080 8080 8080 807F 7E7D 7C7C" /* ���€€€€€€€€.~}|| */ $"7C7C 7D7E 7E7F 7E7E 7E7D 7D7D 7D7D 7D7D" /* ||}~~.~~~}}}}}}} */ $"7E7E 7E7E 7D7D 7D7D 7D7E 7E7F 8080 7F7E" /* ~~~~}}}}}~~.€€.~ */ $"7E7E 7F80 8081 8181 8180 8080 8080 8080" /* ~~.€€����€€€€€€€ */ $"8080 8080 8080 807F 7E7E 7E7E 7E7E 7E7E" /* €€€€€€€.~~~~~~~~ */ $"7E7D 7D7E 7F80 8183 8383 8383 8180 8080" /* ~}}~.€�ƒƒƒƒƒ�€€€ */ $"7F7E 7E7D 7D7C 7C7B 7B7A 7A7A 7A7A 7B7B" /* .~~}}||{{zzzzz{{ */ $"7B7B 7C7C 7C7D 7F80 8183 8484 8484 8483" /* {{|||}.€�ƒ„„„„„ƒ */ $"8382 8181 8180 8080 807E 7E7D 7C7B 7B7B" /* ƒ‚���€€€€~~}|{{{ */ $"7B7B 7B7B 7C7C 7C7C 7D7F 8081 8182 8281" /* {{{{||||}.€��‚‚� */ $"8181 8080 8080 8080 8080 8080 8080 8080" /* ��€€€€€€€€€€€€€€ */ $"8080 8080 8080 7F7E 7D7D 7D7D 7E7E 7F7F" /* €€€€€€.~}}}}~~.. */ $"7E7E 7D7D 7D7D 7D7D 7D7D 7E7E 7D7D 7D7D" /* ~~}}}}}}}}~~}}}} */ $"7D7D 7D7E 7E7F 8080 7F7E 7E7F 8080 8181" /* }}}~~.€€.~~.€€�� */ $"8281 8180 8080 7F80 8080 8080 8080 8080" /* ‚��€€€.€€€€€€€€€ */ $"7F7E 7E7E 7E7E 7E7E 7E7E 7D7D 7D7E 8080" /* .~~~~~~~~~}}}~€€ */ $"8182 8282 8281 8180 8080 7F7E 7E7E 7D7D" /* �‚‚‚‚��€€€.~~~}} */ $"7C7B 7B7A 7A7A 7A7A 7B7B 7B7B 7B7C 7D7E" /* |{{zzzzz{{{{{|}~ */ $"8080 8081 8282 8281 8181 8180 8080 8080" /* €€€�‚‚‚����€€€€€ */ $"8080 807E 7E7D 7C7C 7C7B 7B7B 7B7B 7B7B" /* €€€~~}|||{{{{{{{ */ $"7C7D 7E80 8080 8080 8080 8080 8080" /* |}~€€€€€€€€€€€ */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Lore.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Lore.r new file mode 100644 index 0000000..97f6595 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Lore.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 2900 0000 044C 6F72 65" /* ......)....Lore */ }; data $8024 (0x29) { $"0000 6700 E88E 0000 772B 8080 8080 8080" /* ..g..Ž..w+€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7C7E 7C7C 7C7E 7E7E 7C7E 7E7E 7E7E 7E7E" /* |~|||~~~|~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E80 807E 7E7E 7E7E" /* ~~~~~~~~~€€~~~~~ */ $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~~~~~~~~~~~~~ */ $"7E7E 7C7C 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~||~~~~~~~~~~~~ */ $"7E7E 7E7E 8080 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~~~~€€~~~~~~~~~~ */ $"7E7E 7E7E 7E7C 7C7C 7E7E 7E7E 7E7E 7E7E" /* ~~~~~|||~~~~~~~~ */ $"7E80 807E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" /* ~€€~~~~~~~~~~~~~ */ $"7E7E 7E7C 7C7E 7E7E 7E7E 7C7C 7E7E 7E7E" /* ~~~||~~~~~||~~~~ */ $"7E7C 7C7E 7E7E 7E7E 7E7C 7C7E 7E7E 7E7E" /* ~||~~~~~~||~~~~~ */ $"7E7E 7E7E 8080 7E7E 7E7E 7E80 807E 7E7E" /* ~~~~€€~~~~~€€~~~ */ $"7E7E 7E7E 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C" /* ~~~~|||||||||||| */ $"7E80 807E 7E7E 7E80 8080 807E 7E7E 7E7E" /* ~€€~~~~€€€€~~~~~ */ $"7E7C 7C7C 7C7C 7E7E 7E7E 7C7C 7E7E 8080" /* ~|||||~~~~||~~€€ */ $"7E7E 7E80 8080 807E 7E7C 7C7E 7E7E 7E7C" /* ~~~€€€€~~||~~~~| */ $"7E7E 7E7E 7E7E 7E7E 7E7E 8080 7E7E 7E7E" /* ~~~~~~~~~~€€~~~~ */ $"7E7E 7E7E 7E7C 7C7C 7E7E 7E7E 7E7E 7E7E" /* ~~~~~|||~~~~~~~~ */ $"7E7E 8080 807E 8080 807E 7C7C 7C7E 7C7C" /* ~~€€€~€€€~|||~|| */ $"7E7E 7C7C 7C7C 7E7C 7C7C 7E80 7E7E 8080" /* ~~||||~|||~€~~€€ */ $"807E 7C7C 7E7E 7C7C 7E80 7E7C 7C7C 7E7C" /* €~||~~||~€~|||~| */ $"7A7C 7E80 7C7C 7E7E 7E7C 7C7E 7E7E 7A7C" /* z|~€||~~~||~~~z| */ $"7E7E 7E7C 7C7E 807E 7C7E 7E80 7E7C 7E80" /* ~~~||~€~|~~€~|~€ */ $"807E 7E7E 7E7E 7C7C 7E80 7E7C 7C7E 7E7E" /* €~~~~~||~€~||~~~ */ $"7C7C 7E80 7E7C 7E7E 807E 7C7C 7E7E 7C7C" /* ||~€~|~~€~||~~|| */ $"7C7E 807E 7C7E 807E 7C7C 7E80 7E7C 7E7E" /* |~€~|~€~||~€~|~~ */ $"807E 7E7E 7E7E 7C7C 7C7E 7E7C 7C7E 7E7E" /* €~~~~~|||~~||~~~ */ $"7E7E 7E80 807E 7E7E 8080 7E7C 7E7E 7C7C" /* ~~~€€~~~€€~|~~|| */ $"7C7C 7E7C 7C7C 7E7E 807E 7E80 807E 7E7E" /* ||~|||~~€~~€€~~~ */ $"8080 807E 807E 7E7C 7C7C 7C7C 7A7A 7C7C" /* €€€~€~~|||||zz|| */ $"7C7C 7C7E 7E7E 7E7E 8080 8080 8080 7E7E" /* |||~~~~~€€€€€€~~ */ $"7E7E 7E7C 7C7E 7E7E 7C7C 7C7C 7C7E 7E7E" /* ~~~||~~~|||||~~~ */ $"7E7E 8080 8080 8080 807E 7E7E 7E7E 7C7C" /* ~~€€€€€€€~~~~~|| */ $"7C7C 7C7C 7C7C 7C7C 7C7E 7E80 807E 7E7C" /* |||||||||~~€€~~| */ $"7C7C 7C7C 7E7E 8080 8082 8080 7E7C 7A7A" /* ||||~~€€€‚€€~|zz */ $"7A7C 7C7C 7C7C 7E80 8080 7C7C 7E7E 7E7E" /* z|||||~€€€||~~~~ */ $"7C7C 7E7E 7E7E 7C7E 7E80 8080 8080 807E" /* ||~~~~|~~€€€€€€~ */ $"7C7A 7A7C 7C7C 7C7C 7C7C 7C7C 7C7E 7C7C" /* |zz||||||||||~|| */ $"7C7C 7C7E 807E 8080 8080 807E 7E7E 807E" /* |||~€~€€€€€~~~€~ */ $"7C7C 7E80 8080 8080 8080 7E7E 8080 7E7C" /* ||~€€€€€€€~~€€~| */ $"7C7E 7C78 7878 7878 7A7A 7A7A 7A7C 7C7C" /* |~|xxxxxzzzzz||| */ $"7C7C 7E80 8082 8284 8482 8080 8082 8280" /* ||~€€‚‚„„‚€€€‚‚€ */ $"8082 807E 7C7A 7878 7878 787A 7C7E 7E7E" /* €‚€~|zxxxxxz|~~~ */ $"807E 7C7C 7C7C 7C7E 8080 8080 7E7C 7C7C" /* €~|||||~€€€€~||| */ $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C" /* |||||||||||||||| */ $"7C7E 8080 8080 8080 8282 8284 8484 8484" /* |~€€€€€€‚‚‚„„„„„ */ $"8484 8280 7C7A 7876 7272 7272 7274 7474" /* „„‚€|zxvrrrrrttt */ $"7678 787A 7A7C 7E80 8286 888A 8A88 8886" /* vxxzz|~€‚†ˆŠŠˆˆ† */ $"8484 8484 8282 8080 7E7C 7A78 7876 7676" /* „„„„‚‚€€~|zxxvvv */ $"787A 7C7E 7E7C 7A7A 7A7A 7C7E 8080 8282" /* xz|~~|zzzz|~€€‚‚ */ $"807E 7C7C 7C7C 7C7C 7C7C 7E7E 7C7C 7C7C" /* €~||||||||~~|||| */ $"7C7C 7C7E 8082 8280 8282 8282 8484 8684" /* |||~€‚‚€‚‚‚‚„„†„ */ $"8484 8482 807E 7C7C 7A78 7676 7474 7474" /* „„„‚€~||zxvvtttt */ $"7474 7476 7678 7A7A 7C7C 7E80 8284 8486" /* tttvvxzz||~€‚„„† */ $"8686 8684 8482 8282 8282 807E 7C7C 7C7C" /* †††„„‚‚‚‚‚€~|||| */ $"7C7C 7C7C 7C7C 7C7C 7C7A 7A7A 7A7A 7A7A" /* |||||||||zzzzzzz */ $"7A7A 7A7A 7A7A 7C7C 7C7E 7E80 8082 8080" /* zzzzzz|||~~€€‚€€ */ $"8280 8080 8080 7E7C 7C7C 7E7C 7C7C 7C7E" /* ‚€€€€€~|||~||||~ */ $"7E80 8082 8284 8282 8484 8280 7E7E 7C7A" /* ~€€‚‚„‚‚„„‚€~~|z */ $"7878 7878 7676 7676 7676 7676 787A 7C7E" /* xxxxvvvvvvvvxz|~ */ $"8082 8284 8484 8484 8484 8484 8282 8080" /* €‚‚„„„„„„„„„‚‚€€ */ $"807E 7C7C 7C7C 7C7C 7C7C 7C7A 7A7A 7C7C" /* €~|||||||||zzz|| */ $"7A7A 7C7C 7E7E 8080 8080 8080 8080 8080" /* zz||~~€€€€€€€€€€ */ $"7E7C 7A7A 7878 7878 7878 7A7C 7A7A 7A7A" /* ~|zzxxxxxxz|zzzz */ $"7C7C 7E80 8284 8688 8A8C 8C8C 8A88 8886" /* ||~€‚„†ˆŠŒŒŒŠˆˆ† */ $"827E 7C7A 7674 7270 7070 6E6E 6E70 7072" /* ‚~|zvtrpppnnnppr */ $"747A 7E80 8486 8888 8888 8888 8686 8686" /* tz~€„†ˆˆˆˆˆˆ†††† */ $"8484 8280 7E7C 7C7A 7A7A 7C7C 7C7A 7A7C" /* „„‚€~||zzz|||zz| */ $"7C7C 7C7C 7C7C 7C7E 8080 7E7E 7E7E 7E7E" /* |||||||~€€~~~~~~ */ $"7E7C 7C7A 7878 7878 7878 7878 7A7A 7C7C" /* ~||zxxxxxxxxzz|| */ $"7C7C 7C7C 7E80 8284 8486 8688 8A8A 8886" /* ||||~€‚„„††ˆŠŠˆ† */ $"8484 8482 807E 7C7A 7A78 7876 7674 7474" /* „„„‚€~|zzxxvvttt */ $"7476 7878 7878 7A7C 7C7C 7C7E 7C7C 7E7E" /* tvxxxxz||||~||~~ */ $"8080 8080 8082 8282 8282 8080 8282 8486" /* €€€€€‚‚‚‚‚€€‚‚„† */ $"8482 8280 8080 7E7E 7C7C 7C7A 7A78 7876" /* „‚‚€€€~~|||zzxxv */ $"7476 7674 7474 7476 787A 7A7C 7E80 8080" /* tvvttttvxzz|~€€€ */ $"8282 8484 8486 8686 8482 8280 8080 8080" /* ‚‚„„„†††„‚‚€€€€€ */ $"8080 7E7E 7E7C 7C7C 7C7A 7A7C 7C7A 7A7A" /* €€~~~||||zz||zzz */ $"7A7A 7C7E 7C7C 7C7C 7C7C 7E7E 7C7E 7E7E" /* zz|~||||||~~|~~~ */ $"7E7E 7E7E 7E7C 7C7C 7C7C 7E80 8080 8080" /* ~~~~~|||||~€€€€€ */ $"8082 8282 8280 8080 8080 807E 7C7A 7878" /* €‚‚‚‚€€€€€€~|zxx */ $"7878 7A7C 7C7A 7876 7678 787A 7C7C 7C7C" /* xxz||zxvvxxz|||| */ $"7C7E 7E7E 7E7E 8082 8484 8484 8484 8280" /* |~~~~~€‚„„„„„„‚€ */ $"8080 7E7E 8080 7E7C 7C7C 7C7C 7A7A 7C7C" /* €€~~€€~|||||zz|| */ $"7C7E 7E7C 7C7C 7C7C 7C7C 7C7C 7E7E 7E7C" /* |~~|||||||||~~~| */ $"7C7C 7C7C 7E80 8080 8080 807E 7C7C 7C7E" /* ||||~€€€€€€~|||~ */ $"7E7E 7E7E 7E7E 7C7C 7C7C 7A7C 7E80 8080" /* ~~~~~~||||z|~€€€ */ $"807E 7C7C 7C7C 7C7C 7E7E 7E7E 7E7C 7C7E" /* €~||||||~~~~~||~ */ $"7C7C 7C7C 7E7E 7E7C 7C7C 7C7E 8080 7E7C" /* ||||~~~||||~€€~| */ $"7E7E 8080 8080 8282 807E 7E7C 7A7A 7A7C" /* ~~€€€€‚‚€~~|zzz| */ $"7E7C 7C7A 7A7C 7A7A 7A7A 7A7C 7C7E 8082" /* ~||zz|zzzzz||~€‚ */ $"8482 807E 7E80 8080 807E 7E7E 7E7C 7C7C" /* „‚€~~€€€€~~~~||| */ $"7A7A 7A7A 7E7E 7C7A 7A7C 7C7C 7C7C 7C7C" /* zzzz~~|zz||||||| */ $"7E80 8080 8080 8080 8080 8080 8080 8080" /* ~€€€€€€€€€€€€€€€ */ $"807E 7C7C 7A7A 7A7A 7A7C 7C7C 7C7E 8080" /* €~||zzzzz||||~€€ */ $"807E 7C7C 7C7E 8284 8482 7E7C 7A76 7676" /* €~|||~‚„„‚~|zvvv */ $"787A 7E80 807E 7876 767A 7C7C 7E80 8282" /* xz~€€~xvvz||~€‚‚ */ $"8080 807E 7C7E 8284 8484 8482 807C 7C7C" /* €€€~|~‚„„„„‚€||| */ $"7C7A 7A7A 7C7E 7C7C 7A78 7878 787A 7E7E" /* |zzz|~||zxxxxz~~ */ $"7C7C 7C7C 7E7C 7E80 8284 8484 8480 7A78" /* ||||~|~€‚„„„„€zx */ $"787C 8082 8482 807E 7C7A 7A7A 7A7C 8082" /* x|€‚„‚€~|zzzz|€‚ */ $"8482 807C 7C7C 7C7C 7E7E 7E7E 8080 807E" /* „‚€|||||~~~~€€€~ */ $"7C7A 7878 7A7E 8080 7E7C 7A78 7878 787A" /* |zxxz~€€~|zxxxxz */ $"7C7C 7C7C 7E7E 7E7E 7E82 8282 8080 7E80" /* ||||~~~~~‚‚‚€€~€ */ $"8080 7E80 8080 807E 7C7C 7876 787C 8082" /* €€~€€€€~||xvx|€‚ */ $"807C 7C7A 7878 787A 7C7E 7E7E 8082 8282" /* €||zxxxz|~~~€‚‚‚ */ $"807C 7878 7C80 8282 807E 7C7C 7C7A 7674" /* €|xx|€‚‚€~|||zvt */ $"767A 8084 8280 7A76 787C 8286 8886 8282" /* vz€„‚€zvx|‚†ˆ†‚‚ */ $"8080 807E 7C7C 7C7E 8080 807C 7672 7476" /* €€€~|||~€€€|vrtv */ $"787A 7C7E 7E7C 7E80 8280 7E7E 7E7C 7C7E" /* xz|~~|~€‚€~~~||~ */ $"848A 8882 7C7C 7C7C 7C7E 7E7E 7C7A 7C7E" /* „Šˆ‚|||||~~~|z|~ */ $"7C74 747A 8080 8080 7E7A 7878 7C82 8480" /* |ttz€€€€~zxx|‚„€ */ $"7E80 8080 7C7C 7E80 8280 7E7E 7E7A 7878" /* ~€€€||~€‚€~~~zxx */ $"7876 7476 7C82 8686 8480 807C 7C7E 8080" /* xvtv|‚††„€€||~€€ */ $"7E7E 7C7C 7C7A 7A7A 7A7C 7E7E 7E80 807C" /* ~~|||zzzz|~~~€€| */ $"7876 7676 767A 7C80 8280 7C7C 7C7C 7C82" /* xvvvvz|€‚€|||||‚ */ $"8484 8280 8080 8284 8484 807E 7C7E 807E" /* „„‚€€€‚„„„€~|~€~ */ $"7C7A 7A78 7878 787A 7E80 807E 7C78 7878" /* |zzxxxxz~€€~|xxx */ $"7A7C 7C7E 7E7C 7C7C 7C7C 7C7E 8284 8280" /* z||~~||||||~‚„‚€ */ $"7C7C 7C7C 7E7E 7E7E 7E80 8284 8482 7E7C" /* ||||~~~~~€‚„„‚~| */ $"7C7C 7E7E 8080 8282 8080 8080 807E 7C7C" /* ||~~€€‚‚€€€€€~|| */ $"7C7A 7878 7674 7474 7678 7A7E 8082 8280" /* |zxxvtttvxz~€‚‚€ */ $"807E 807C 7E80 8284 8482 8282 8482 8280" /* €~€|~€‚„„‚‚‚„‚‚€ */ $"8282 7A78 787E 8080 7E7A 7A76 787E 8082" /* ‚‚zxx~€€~zzvx~€‚ */ $"7C7A 7A7A 7E7A 7C7A 7C7E 7C80 807E 7E7C" /* |zzz~z|z|~|€€~~| */ $"7E80 827C 7674 7076 7A7C 8080 8080 8284" /* ~€‚|vtpvz|€€€€‚„ */ $"8480 7E7E 7C80 8482 8282 827E 7A7C 7C7C" /* „€~~|€„‚‚‚‚~z||| */ $"7E80 807E 7E7C 7674 7474 787E 8082 8280" /* ~€€~~|vtttx~€‚‚€ */ $"7C7A 7A7A 7A7A 7C7E 8082 8484 807A 787C" /* |zzzzz|~€‚„„€zx| */ $"8086 8886 827C 7472 7274 7A7E 8284 8480" /* €†ˆ†‚|trrtz~‚„„€ */ $"7C7A 787A 7C7E 8082 8280 7C78 7878 787E" /* |zxz|~€‚‚€|xxxx~ */ $"8284 8484 827E 7E7A 7474 747A 8086 8684" /* ‚„„„‚~~ztttz€††„ */ $"827E 7E7E 7E7C 7A7A 7A7E 8082 8280 7E78" /* ‚~~~~|zzz~€‚‚€~x */ $"787A 7E82 8688 8680 7A74 7072 7476 7A7C" /* xz~‚†ˆ†€ztprtvz| */ $"7E80 8080 7E7C 7C7C 7E80 8080 8082 8486" /* ~€€€~|||~€€€€‚„† */ $"8480 7C7A 7E82 888A 8882 7C78 7676 787C" /* „€|z~‚ˆŠˆ‚|xvvx| */ $"7E80 8280 7E78 7674 7478 7A7C 7E7E 7C7C" /* ~€‚€~xvttxz|~~|| */ $"7C7C 7C7C 7E80 8284 807E 7C78 7676 787C" /* ||||~€‚„€~|xvvx| */ $"8082 827E 7E7E 8082 8484 827E 7C7C 8082" /* €‚‚~~~€‚„„‚~||€‚ */ $"8484 807E 7A78 787C 8284 8482 7C74 706C" /* „„€~zxx|‚„„‚|tpl */ $"7078 7E80 8080 7E7C 7C7C 7E80 7E7A 787A" /* px~€€€~|||~€~zxz */ $"7E82 8688 8680 7A78 7A7E 8286 8886 827E" /* ~‚†ˆ†€zxz~‚†ˆ†‚~ */ $"7A78 7A7A 7C7E 8284 8482 7E7A 7876 7476" /* zxzz|~‚„„‚~zxvtv */ $"787C 7C7C 7A7A 787A 7E80 8284 827E 7C7C" /* x|||zzxz~€‚„‚~|| */ $"7A7C 8082 8484 807C 7E80 8286 8886 807A" /* z|€‚„„€|~€‚†ˆ†€z */ $"7876 767A 7E7E 7C7C 7A7A 7C7C 8086 8682" /* xvvz~~||zz||€††‚ */ $"7E7A 7674 787C 7E7E 7E7E 7E7C 7E80 807E" /* ~zvtx|~~~~~|~€€~ */ $"7C7A 7C7C 7C7E 807C 7678 7A78 7C80 8686" /* |z|||~€|vxzx|€†† */ $"8484 8280 8286 8884 7E7A 7A78 787C 7C78" /* „„‚€‚†ˆ„~zzxx||x */ $"706E 6C6A 6C78 8288 8686 8680 7E84 8A88" /* pnljlx‚ˆ†††€~„Šˆ */ $"8482 7C76 7476 7A7A 787C 7C7A 787C 8284" /* „‚|vtvzzx||zx|‚„ */ $"8688 8886 8280 7C78 7476 787A 7E82 8482" /* †ˆˆ†‚€|xtvxz~‚„‚ */ $"7E78 7270 747C 8284 8482 807A 7474 7E88" /* ~xrpt|‚„„‚€ztt~ˆ */ $"8A84 7E7A 7674 7478 7E80 807E 7A78 787E" /* Š„~zvttx~€€~zxx~ */ $"8286 8888 8480 7C7C 7C7E 8284 827C 7A7C" /* ‚†ˆˆ„€|||~‚„‚|z| */ $"7A78 787C 7E7E 7A78 787A 7E82 8282 8484" /* zxx|~~zxxz~‚‚‚„„ */ $"7E7A 7676 7674 767C 8082 807C 7676 7C82" /* ~zvvvtv|€‚€|vv|‚ */ $"888E 908E 8A82 7C7C 7C7E 807E 7874 7270" /* ˆŽ�ŽŠ‚|||~€~xtrp */ $"7278 7E80 807A 7270 7278 828A 8E8E 8A82" /* rx~€€zrprx‚ŠŽŽŠ‚ */ $"7C7A 7C82 8686 827C 7470 7070 7076 787A" /* |z|‚††‚|tppppvxz */ $"7A78 7A7E 8282 8688 8A8C 8882 7E7C 7C7E" /* zxz~‚‚†ˆŠŒˆ‚~||~ */ $"7E80 8484 7C76 7270 7074 787E 8080 7E7A" /* ~€„„|vrpptx~€€~z */ $"7674 7A84 8A8A 847A 706E 727C 888E 8C88" /* vtz„ŠŠ„zpnr|ˆŽŒˆ */ $"7C72 7072 7A86 8E90 8C84 7C76 7676 7878" /* |rprz†Ž�Œ„|vvvxx */ $"7A7C 7A78 7676 7A7E 7E7C 7C7C 8082 8888" /* z|zxvvz~~|||€‚ˆˆ */ $"8A8C 8480 7A76 7872 7678 727C 787A 8076" /* ŠŒ„€zvxrvxr|xz€v */ $"7A7C 7A82 7E82 8C84 8880 7A82 7E82 867A" /* z|z‚~‚Œ„ˆ€z‚~‚†z */ $"7C74 6E76 7480 8886 867C 7876 6C78 7C7C" /* |tnvt€ˆ††|xvlx|| */ $"908E 8284 7E72 7A7E 767A 8474 7280 7274" /* �Ž‚„~rz~vz„tr€rt */ $"8C7C 7888 7870 8682 7C92 9480 8C8C 727E" /* Œ|xˆxp†‚|’”€ŒŒr~ */ $"826A 7880 6E7C 8876 7880 706A 7C74 708A" /* ‚jx€n|ˆvx€pj|tpŠ */ $"867E 9080 707E 7876 8486 7E80 7E70 7682" /* †~�€p~xv„†~€~pv‚ */ $"7A84 8E7C 7A7C 7074 7E80 8088 867A 7A7A" /* z„Ž|z|pt~€€ˆ†zzz */ $"727A 827C 7E7E 787C 8082 848E 887E 867E" /* rz‚|~~x|€‚„Žˆ~†~ */ $"6C82 8474 8A94 727E 8662 687A 5A62 7C68" /* l‚„tŠ”r~†bhzZb|h */ $"6E90 7E78 9A86 7096 8676 A298 7E9A 8A6E" /* n�~xš†p–†v¢˜~šŠn */ $"8C84 7082 7E64 6C70 606E 867A 7E8A 7270" /* Œ„p‚~dlp`n†z~Šrp */ $"8074 7892 8A8C 988A 7C80 7E78 8086 7C7C" /* €tx’ŠŒ˜Š|€~x€†|| */ $"7C6E 6E74 727A 8078 7478 7674 7E88 848C" /* |nntrz€xtxvt~ˆ„Œ */ $"9284 7C86 7472 8074 7480 8A7C 8E8A 7482" /* ’„|†tr€tt€Š|ŽŠt‚ */ $"8278 768C 787E 8C72 7878 746A 7C72 6C7A" /* ‚xvŒx~Œrxxtj|rlz */ $"7072 7280 7A8E 968C 9086 7C78 827C 8692" /* prr€zŽ–Œ�†|x‚|†’ */ $"8882 8076 6876 7870 747A 706C 7278 7C7C" /* ˆ‚€vhvxptzplrx|| */ $"8690 867E 8A8A 7C8C 9C88 7C90 8466 707A" /* †�†~ŠŠ|Œœˆ|�„fpz */ $"6064 7E76 667A 8676 7C8A 8472 8690 8886" /* `d~vfz†v|Š„r†�ˆ† */ $"9694 7C80 8474 6882 7E62 6C72 6264 8A88" /* –”|€„th‚~blrbdŠˆ */ $"8290 9078 7080 7A7E 8E9A 887E 827A 7074" /* ‚��xp€z~Žšˆ~‚zpt */ $"7C72 7278 766E 7682 8088 8C88 7E7C 7A76" /* |rrxvnv‚€ˆŒˆ~|zv */ $"8088 8888 8E84 7C7A 766E 7076 7472 787E" /* €ˆˆˆŽ„|zvnpvtrx~ */ $"7E7E 8284 7A78 8684 7E8A 9476 6E7E 7860" /* ~~‚„zx†„~Š”vn~x` */ $"768E 746E 8482 607E 9E90 84A4 9E6C 7086" /* vŽtn„‚`~ž�„¤žlp† */ $"7264 9094 6C6A 8268 5A7C 806A 7E94 7666" /* rd�”lj‚hZ|€j~”vf */ $"828C 7E8A 9686 7C88 7E6E 8498 8882 9286" /* ‚Œ~Š–†|ˆ~n„˜ˆ‚’† */ $"6E70 7868 626E 6C5E 7288 7E82 9894 7A7C" /* npxhbnl^rˆ~‚˜”z| */ $"867C 8492 8E7A 7A76 686E 7E82 7A80 8076" /* †|„’Žzzvhn~‚z€€v */ $"707E 8A86 9698 8A72 7472 6A7C 8C90 8284" /* p~І–˜Šrtrj|Œ�‚„ */ $"7668 6876 7C76 7876 7268 707C 8290 9896" /* vhhv|vxvrhp|‚�˜– */ $"8888 8A7E 8286 887E 7C7A 7674 7070 6A6C" /* ˆˆŠ~‚†ˆ~|zvtppjl */ $"6C6A 6A74 7E7C 8280 7C78 828A 8E9C A29A" /* ljjt~|‚€|x‚ŠŽœ¢š */ $"8E8C 8078 7A80 7A72 7266 5C66 767C 868C" /* ŽŒ€xz€zrrf\fv|†Œ */ $"8A7C 7470 707A 868A 7C72 6E64 6270 7E82" /* Š|tppz†Š|rndbp~‚ */ $"8E94 8E8C 9294 929A 9C92 807A 726C 7078" /* Ž”ŽŒ’”’šœ’€zrlpx */ $"7A72 746E 5E58 5E5E 5A68 6E6C 768A 929A" /* zrtn^X^^ZhnlvŠ’š */ $"ACAE A49E 9E94 9092 9286 7C76 6A66 7074" /* ¬®¤žž”�’’†|vjfpt */ $"6864 6A62 5A64 7476 828A 8078 7A76 7078" /* hdjbZdtv‚Š€xzvpx */ $"8890 9498 8A84 888C 9090 908C 8478 706C" /* ˆ�”˜Š„ˆŒ���Œ„xpl */ $"7082 8C86 7874 6A62 6A72 6C6A 726E 6A6E" /* p‚Œ†xtjbjrljrnjn */ $"7278 8694 9294 9AA0 9C96 9694 9088 7E74" /* rx†”’”š œ––”�ˆ~t */ $"727A 7E76 6E66 5852 5E66 6460 6062 6C78" /* rz~vnfXR^fd``blx */ $"828C 9EAC A69A 908E 9294 9692 9296 8E74" /* ‚Œž¬¦š�Ž’”–’’–Žt */ $"6460 6672 7670 6462 6260 6874 7E8A 8878" /* d`frvpdbb`ht~Šˆx */ $"6664 6E82 949A 9696 928E 8C86 8084 8882" /* fdn‚”š––’ŽŒ†€„ˆ‚ */ $"7C7A 7876 7E80 7E7C 7670 6C6E 6A6A 686C" /* |zxv~€~|vplnjjhl */ $"726A 6A78 888C 8A84 828C 9A96 9094 948E" /* rjjxˆŒŠ„‚Œš–�””Ž */ $"8478 6E72 7C8A 8C80 7266 5E60 6868 6C76" /* „xnr|ŠŒ€rf^`hhlv */ $"7872 6E76 7C96 A0A2 A094 9680 827E 7E90" /* xrnv|– ¢ ”–€‚~~� */ $"8090 726C 6C5E 7662 7670 6482 667A 6E72" /* €�rll^vbvpd‚fznr */ $"8876 9678 8086 7C9A 7C96 8A86 9C82 9A78" /* ˆv–x€†|š|–Іœ‚šx */ $"8086 6C84 6C80 8080 906A 7C68 6872 6280" /* €†l„l€€€�j|hhrb€ */ $"727E 7E72 765C 8084 8E96 8290 8C96 8480" /* r~~rv\€„Ž–‚�Œ–„€ */ $"9E94 9280 707A 646A 6076 8C70 6A54 6C78" /* ž”’€pzdj`vŒpjTlx */ $"5C62 668A 8C74 7C7C ACA6 868E 96B6 907C" /* \bfŠŒt||¬¦†Ž–¶�| */ $"8288 9C6E 6C76 8286 545E 6C76 623C 6074" /* ‚ˆœnlv‚†T^lvb<`t */ $"826C 5A80 929A 7672 9EA8 A68C 98B2 A48E" /* ‚lZ€’švrž¨¦Œ˜²¤Ž */ $"6678 9490 7E56 6468 6462 6286 8A72 6058" /* fx”�~Vdhdbb†Šr`X */ $"7476 7474 8CB4 A482 6666 8698 A69A 8C78" /* tvttŒ´¤‚ff†˜¦šŒx */ $"6468 728C 9C92 8068 6A72 7E84 7C86 7E78" /* dhrŒœ’€hjr~„|†~x */ $"6056 6674 807C 7678 7676 748E B2B2 A286" /* `Vft€|vxvvt޲²¢† */ $"848A 8E86 7E94 9688 6C58 6064 747A 826E" /* „ŠŽ†~”–ˆlX`dtz‚n */ $"5652 525A 7082 9896 8464 7284 908C 92BC" /* VRRZp‚˜–„dr„�Œ’¼ */ $"B29A 6062 8690 9874 8888 6C5A 3A8A A28E" /* ²š`b†�˜tˆˆlZ:Š¢Ž */ $"644C 8C82 864E 5AA8 9894 5C7E 9A7E 8258" /* dLŒ‚†NZ¨˜”\~š~‚X */ $"9E9E 7856 4A9E 8A94 8084 B288 7058 94AA" /* žžxVJžŠ”€„²ˆpX”ª */ $"8C82 4E64 4E38 3C4E 8672 6254 6A96 98B6" /* Œ‚NdN8NXVXPZlvŠšš */ $"A09E 8C82 786E 707A 8A90 867E 7872 7A78" /*  žŒ‚xnpzŠ�†~xrzx */ $"7C8E 9292 928A 888A 8488 8C7E 725E 5252" /* |Ž’’’ŠˆŠ„ˆŒ~r^RR */ $"5260 666C 787C 7E84 8A90 8E92 9A9A 9E96" /* R`flx|~„Š�Ž’ššž– */ $"8C8C 8C8A 806C 6E6E 707C 7A70 665C 585E" /* ŒŒŒŠ€lnnp|zpf\X^ */ $"6A80 868A 8E88 827C 8086 908E 8676 6864" /* j€†ŠŽˆ‚|€†�ކvhd */ $"6678 889E A8A2 988A 8282 7E74 727C 8684" /* fxˆž¨¢˜Š‚‚~tr|†„ */ $"6C56 5862 7270 625E 687A 8C82 909C ACB4" /* lVXbrpb^hzŒ‚�œ¬´ */ $"A286 7E76 766C 6460 6674 867E 7474 746E" /* ¢†~vvld`ft†~tttn */ $"6464 8296 A29E 9090 989A 8268 687A 8884" /* dd‚–¢ž��˜š‚hhzˆ„ */ $"6446 486E 96A6 9480 6A76 8A9C 948A 7C82" /* dFHn–¦”€jvŠœ”Š|‚ */ $"9096 825C 3834 5282 907C 5A58 74A2 BAAE" /* �–‚\84R‚�|ZXt¢º® */ $"8C7C 8AA6 B6AE 8C6C 6478 8E8C 6C40 2A3C" /* Œ|Ц¶®ŒldxŽŒl@*< */ $"6080 806A 626E 96B0 AE8E 7270 90B0 BCA2" /* `€€jbn–°®Žrp�°¼¢ */ $"8274 7472 6E5C 4C44 5A74 8A8C 8076 84A2" /* ‚ttrn\LDZtŠŒ€v„¢ */ $"BAB4 946C 585C 7284 807A 6E72 7A82 7E6A" /* º´”lX\r„€znrz‚~j */ $"6268 86A6 AC9A 847E 8494 988A 6E62 626E" /* bh†¦¬š„~„”˜Šnbbn */ $"7472 5E56 687E 7876 7C74 6C82 A098 929A" /* tr^Vh~xv|tl‚ ˜’š */ $"846E 86A0 8468 7A86 88AA B28C 6C76 7668" /* „n† „hz†ˆª²Œlvvh */ $"7A82 6250 6A86 827E 7664 5A74 8A7A 6A64" /* z‚bPj†‚~vdZtŠzjd */ $"5A68 90B6 B09C 968E 848E 8C78 6A6E 8A86" /* Zh�¶°œ–Ž„ŽŒxjnІ */ $"928A 7262 5C70 686E 605E 5876 888E 908C" /* ’Šrb\phn`^XvˆŽ�Œ */ $"9896 9C88 806C 6A7C 9698 8884 727A 8494" /* ˜–œˆ€lj|–˜ˆ„rz„” */ $"7A76 7E84 9296 9A74 6052 5658 6464 5250" /* zv~„’–št`RVXddRP */ $"5270 7E92 9084 8292 AAAA 9E84 8492 AEB4" /* Rp~’�„‚’ªªž„„’®´ */ $"9E80 6262 646E 6458 5868 848E 867A 7680" /* ž€bbdndXXh„ކzv€ */ $"8C98 9488 8074 7E80 8C82 7870 666A 6464" /* Œ˜”ˆ€t~€Œ‚xpfjdd */ $"5C60 6074 92A2 A28E 8476 8A8E 8A7A 747A" /* \``t’¢¢Ž„vŠŽŠztz */ $"808A 7C76 6464 6A78 7A6E 7272 8CA2 ACA0" /* €Š|vddjxznrrŒ¢¬  */ $"9898 9692 8678 6A72 7076 7A76 6E5E 5854" /* ˜˜–’†xjrpvzvn^XT */ $"626C 787A 848E 929A 8A84 7C74 8084 8278" /* blxz„Ž’šŠ„|t€„‚x */ $"6C6C 7280 867E 787C 7E86 867C 7E84 909A" /* llr€†~x|~††|~„�š */ $"9A8C 8072 767A 7E80 767E 8084 8A80 766A" /* šŒ€rvz~€v~€„Š€vj */ $"6C66 6666 5E62 6874 7E90 9698 9286 7E7C" /* lfff^bht~�–˜’†~| */ $"827A 8080 8A94 968A 7476 6A78 7E80 8688" /* ‚z€€Š”–Štvjx~€†ˆ */ $"9A90 8276 7686 9692 7C60 5E6A 7488 7C70" /* š�‚vv†–’|`^jtˆ|p */ $"5E60 7680 8A7A 6A56 607A 94A2 9882 6A72" /* ^`v€ŠzjV`z”¢˜‚jr */ $"8EAA BAAC 8E7A 7C84 8686 7660 544E 5862" /* Žªº¬Žz|„††v`TNXb */ $"727A 7876 7C90 9CA0 9A8C 7C78 8490 A0A6" /* rzxv|�œ šŒ|x„� ¦ */ $"947E 645E 5C5E 5E54 5456 6E7C 8C92 8C82" /* ”~d^\^^TTVn|Œ’Œ‚ */ $"7A84 8892 9282 746A 6872 8490 8672 665E" /* z„ˆ’’‚tjhr„�†rf^ */ $"728A A0AC ACA2 9694 929C 9888 7668 6C70" /* rŠ ¬¬¢–”’œ˜ˆvhlp */ $"766A 5246 343A 5064 6C6A 6C6E 849C A8B2" /* vjRF4:Pdljln„œ¨² */ $"AEA0 9082 8694 9C8E 7A72 7076 7A72 605C" /* ® �‚†”œŽzrpvzr`\ */ $"6266 7084 94A0 9A8E 8488 989E 9882 6E68" /* bfp„” šŽ„ˆ˜ž˜‚nh */ $"6A70 726E 6A74 7874 7880 8C88 8276 7C96" /* jprnjtxtx€Œˆ‚v|– */ $"9E8E 7060 606C 7672 727A 7A72 6A74 8494" /* žŽp``lvrrzzrjt„” */ $"8C78 7274 8A9C 9E98 908A 8892 9286 827A" /* ŒxrtŠœž˜�Šˆ’’†‚z */ $"7A7C 8480 8284 7462 5654 626E 6E68 6C74" /* z|„€‚„tbVTbnnhlt */ $"8898 9084 8082 7E7C 7E84 8A90 8070 7280" /* ˆ˜�„€‚~|~„Š�€pr€ */ $"8A86 7868 626C 7882 8A92 8C86 8286 8C8C" /* Іxhblx‚Š’Œ†‚†ŒŒ */ $"8A80 7E80 8080 7C74 685A 5A64 6E72 726E" /* Š€~€€€|thZZdnrrn */ $"707A 8690 9490 8678 7A88 969E 948A 847E" /* pz†�”�†xzˆ–ž”Š„~ */ $"7874 6868 625C 5A68 7888 98A0 9C98 9298" /* xthhb\Zhxˆ˜ œ˜’˜ */ $"9C9C 8C7A 6E70 7062 5C58 585A 5666 6E7C" /* œœŒznppb\XXZVfn| */ $"847E 808A A0A6 A69E 908E 8C8C 847C 7468" /* „~€Š ¦¦ž�ŽŒŒ„|th */ $"6464 707C 7876 706E 6A6A 7480 94A0 A09E" /* ddp|xvpnjjt€”  ž */ $"9A9C 948A 7672 7478 8284 8272 6048 464A" /* šœ”Švrtx‚„‚r`HFJ */ $"5E6C 7C80 889A A2A2 9E90 786A 6E6C 7476" /* ^l|€ˆš¢¢ž�xjnltv */ $"7C8A 9496 8C7E 7062 5A58 6C90 B0C2 CAC6" /* |Š”–Œ~pbZXl�°ÂÊÆ */ $"AC8E 725A 585A 5E60 6870 7272 6A64 5C5C" /* ¬ŽrZXZ^`hprrjd\\ */ $"646C 7C86 8A8A 8A94 A0A2 9888 7668 6E76" /* dl|†ŠŠŠ” ¢˜ˆvhnv */ $"7A80 8892 9296 8A7E 6656 4848 5670 8E9E" /* z€ˆ’’–Š~fVHHVpŽž */ $"AAAC AC9A 8E82 7A78 7470 747A 8082 7E70" /* ª¬¬šŽ‚zxtptz€‚~p */ $"5E4E 4240 5262 7C9C B2BC BAA8 9484 7066" /* ^NB@Rb|œ²¼º¨”„pf */ $"6C78 7E80 8280 8A90 8672 6058 5864 748A" /* lx~€‚€Š�†r`XXdtŠ */ $"969A 9892 8C8A 847C 7470 7478 8080 7A74" /* –š˜’ŒŠ„|tptx€€zt */ $"7468 6062 666A 7880 8696 A0AA AAA4 9A90" /* th`bfjx€†– ªª¤š� */ $"7E78 7872 6866 6A70 787E 7460 5650 4E66" /* ~xxrhfjpx~t`VPNf */ $"889A A6AE B4B8 B29E 826C 5E5A 5C6C 868A" /* ˆš¦®´¸²ž‚l^Z\l†Š */ $"7E74 7060 504C 566A 8092 9CAE B6AC 967E" /* ~tp`PLVj€’œ®¶¬–~ */ $"7468 5C5E 6E84 9492 908C 9092 7E66 646C" /* th\^n„”’�Œ�’~fdl */ $"7680 8A94 A69E 887A 828A 7C68 5C66 7062" /* v€Š”¦žˆz‚Š|h\fpb */ $"565E 727A 5E4A 5C76 8070 7EA8 B4B0 9EA2" /* V^rz^J\v€p~¨´°ž¢ */ $"AEA6 8668 6E7E 7C6E 7080 8C84 7472 7C72" /* ®¦†hn~|np€Œ„tr|r */ $"5A4C 6694 9C96 909C 9C88 7668 726C 584C" /* ZLf”œ–�œœˆvhrlXL */ $"6894 A89C 8C88 7660 4842 586E 7A8A 98A4" /* h”¨œŒˆv`HBXnzŠ˜¤ */ $"A28E 7660 6070 7874 7C92 968E 8080 8674" /* ¢Žv``pxt|’–Ž€€†t */ $"6256 5C82 929A A4B4 BCA6 9490 9086 7862" /* bV\‚’𤴼¦”��†xb */ $"5E6A 6E6E 6460 5A48 3C44 5668 727E 8894" /* ^jnnd`ZHzJvjz¢„Ð */ $"96A8 9276 8C4C 8442 6A8A 4892 4E70 725E" /* –¨’vŒL„BjŠH’Npr^ */ $"8E56 A288 78A4 80AE 888E 7862 8E54 7C68" /* ŽV¢ˆx¤€®ˆŽxbŽT|h */ $"7092 6A98 6284 7A4E 8C62 9E9A 98AE 8CBE" /* p’j˜b„zNŒbžš˜®Œ¾ */ $"869E 926A 8C6A 8466 7C78 4C6E 3850 4C50" /* †ž’jŒj„f|xLn8PLP */ $"5E4E 8662 8686 86AE 9CB6 9CB8 AC92 A87E" /* ^N†b†††®œ¶œ¸¬’¨~ */ $"9678 786E 6080 5472 625C 7264 8464 827E" /* –xxn`€Trb\rd„d‚~ */ $"7A9C 8AAE 969E 8E6E 8664 8478 7282 6478" /* zœŠ®–žŽn†d„xr‚dx */ $"5E6A 726C 8C7A 8E94 9296 8494 8282 7E6E" /* ^jrlŒzŽ”’–„”‚‚~n */ $"7C70 7262 646A 626C 6264 6A6C 7880 A0AE" /* |prbdjblbdjlx€ ® */ $"B8BE B6BA AC9C 8A7A 7A6E 7274 6A6A 5E4C" /* ¸¾¶º¬œŠzznrtjj^L */ $"3E4A 4E52 6068 7E86 8E92 9AA4 9AA0 9C94" /* >JNR`h~†Ž’š¤š œ” */ $"8C78 7270 7A7C 8284 7C7E 746E 6C76 7E76" /* Œxrpz|‚„|~tnlv~v */ $"8488 8688 8280 8490 8A80 766E 6464 6E78" /* „ˆ†ˆ‚€„�Š€vnddnx */ $"827C 7270 6A6E 747E 8692 9A90 8E92 928E" /* ‚|rpjnt~†’š�Ž’’Ž */ $"8C84 7C78 6E66 6C74 746E 6C60 5C5A 6074" /* Œ„|xnflttnl`\Z`t */ $"828E 989C A2A0 A49E 9C9A 887A 6E70 747C" /* ‚Ž˜œ¢ ¤žœšˆznpt| */ $"7E78 725C 524C 4654 647C 8890 8E82 888E" /* ~xr\RLFTd|ˆ�Ž‚ˆŽ */ $"9C9A 9498 7C74 6E68 6A8A 9E90 806C 5A5E" /* œš”˜|tnhjŠž�€lZ^ */ $"5A66 7C94 B6C8 B496 826C 606E 7480 9A94" /* Zf|”¶È´–‚l`nt€š” */ $"8262 4A38 425E 647E 909A 927C 6A5E 7494" /* ‚bJ8B^d~�š’|j^t” */ $"B6C2 BCB0 8E6A 4E4C 6686 AAA8 8E66 402E" /* ¶Â¼°ŽjNLf†ª¨Žf@. */ $"2840 6EA0 C0C8 B490 7C7C 8298 AABC B098" /* (@n ÀÈ´�||‚˜ª¼°˜ */ $"7854 4444 5260 7684 6A5E 5A4E 4E6A 8490" /* xTDDR`v„j^ZNNj„� */ $"AAB8 AEA2 9688 7874 747E 888E 8070 6662" /* ª¸®¢–ˆxtt~ˆŽ€pfb */ $"5E60 6A7A 8C84 807E 8898 A2A8 A6AA 8E66" /* ^`jzŒ„€~ˆ˜¢¨¦ªŽf */ $"525A 6C6A 7A76 847A 6650 4E60 7088 98B0" /* RZljzv„zfPN`pˆ˜° */ $"B29E 7E7C 767A 8A92 8076 685A 5C6A 7070" /* ²ž~|vzŠ’€vhZ\jpp */ $"7476 7272 6E66 7082 A0AC ACA0 8C90 9296" /* tvrrnfp‚ ¬¬ Œ�’– */ $"8680 7C72 7C80 8470 5A4A 4654 7288 8484" /* †€|r|€„pZJFTrˆ„„ */ $"8480 7C82 7C80 9AB0 BA9C 8466 5662 7072" /* „€|‚|€š°ºœ„fVbpr */ $"7A8A 6862 6C62 6872 6C80 BABE B2B2 8E74" /* zŠhblbhrl€º¾²²Žt */ $"8C92 8290 804A 5066 6060 6252 5A72 7E8E" /* Œ’‚�€JPf``bRZr~Ž */ $"9684 7A7A 7A86 B0BC A0A6 AC84 5E72 685C" /* –„zzz†°¼ ¦¬„^rh\ */ $"869A 7A64 6A54 3C62 848A 8CAA 9C88 767E" /* †šzdjT^lb\‚`l */ $"7C7E 986E A49C 90A2 A48E 7A80 787A 728E" /* |~˜n¤œ�¢¤Žz€xzrŽ */ $"666C 7658 5838 4E5C 768C A08C 8486 7C9A" /* flvXX8N\vŒ Œ„†|š */ $"98C0 C2B0 B090 6858 5250 6882 987E 766C" /* ˜À°°�hXRPh‚˜~vl */ $"3842 5C6A 7E98 A08C 807E 7672 8498 9296" /* 8B\j~˜ Œ€~vr„˜’– */ $"9682 6C60 7672 7282 8680 8892 7064 6A7C" /* –‚l`vrr‚†€ˆ’pdj| */ $"7C90 A89E 9E88 7864 5C72 7C72 787C 685E" /* |�¨žžˆxd\r|rx|h^ */ $"5664 5E7C 9EA4 A89E 8E6C 6E7A 8A98 A8A4" /* Vd^|ž¤¨žŽlnzŠ˜¨¤ */ $"8474 5A5E 6276 8678 6862 5A54 6274 868E" /* „tZ^bv†xhbZTbt†Ž */ $"9C9C 8C90 9292 949C 9A94 9288 725A 5C66" /* œœŒ�’’”œš”’ˆrZ\f */ $"7276 726E 6C6E 726E 6E74 7C80 949E 9690" /* rvrnlnrnnt|€”ž–� */ $"7E6C 585C 6C8A ACA8 9674 5C54 5464 789E" /* ~lX\lЬ¨–t\TTdxž */ $"B6AC 906E 606A 8494 A4B8 AA8A 6642 4856" /* ¶¬�n`j„”¤¸ªŠfBHV */ $"7880 8286 6E6C 5858 6672 9898 A69C 888E" /* x€‚†nlXXfr˜˜¦œˆŽ */ $"7E8C 827C 807A 8E80 8478 645E 3C4E 587C" /* ~Œ‚|€zŽ€„xd^BV`bj”º¬†lˆœ¦ */ $"9896 A2A8 AC92 7266 6C7E 7876 5C56 7282" /* ˜–¢¨¬’rfl~xv\Vr‚ */ $"865C 5268 8A94 726A 8AB6 B27E 4A5E 8488" /* †\RhŠ”rjж²~J^„ˆ */ $"7E70 8A9A 8A5A 2E56 8EB0 A882 6C6A 808A" /* ~pŠšŠZ.Vް¨‚lj€Š */ $"94A2 A8A4 7C66 5E64 7478 7C6E 6C6E 646A" /* ”¢¨¤|f^dtx|nlndj */ $"6A66 6686 B6BA A07E 7480 827C 7C9C B298" /* jff†¶º ~t€‚||œ²˜ */ $"6044 688A 8864 4442 5C7E 8A8C 9A9A 8874" /* `DhŠˆdDB\~ŠŒššˆt */ $"707E 8E9E A09C 8064 728C 8C78 7266 6A82" /* p~Žž œ€drŒŒxrfj‚ */ $"7856 5888 966C 606C 747A 7E86 8EB6 D098" /* xVXˆ–l`ltz~†Ž¶Ð˜ */ $"5C54 646C 88A6 A492 826E 5054 6E76 7478" /* \Tdlˆ¦¤’‚nPTnvtx */ $"7A74 7686 9496 8A7E 787E 8684 746C 8496" /* ztv†”–Š~x~†„tl„– */ $"8A76 7676 7064 6070 96A8 987C 7888 9684" /* Švvvpd`p–¨˜|xˆ–„ */ $"8074 7E70 7876 7A8A 6654 365A 5876 928A" /* €t~pxvzŠfT6ZXv’Š */ $"A68E 8E58 86B6 D2B4 829E A4B2 5A4A 569E" /* ¦ŽŽX†¶Ò´‚ž¤²ZJVž */ $"AC5C 2644 A074 2616 94CE 9A38 2AA2 D09C" /* ¬\&D t&.”Κ8*¢Ðœ */ $"2668 ECFF 6A01 58DA F65A 1670 F0D0 2E08" /* &h..j.X..Z.p.Ð.. */ $"76F2 9C0A 0CB2 FFAC 1822 BEE6 6001 32D8" /* v.œ..².¬."¾.`.2Ø */ $"F066 086E E6C8 2601 88FF CC2E 24B2 FFA8" /* .f.n.È&.ˆ.Ì.$².¨ */ $"1E36 C6FF 8C01 20AE DC6A 166C C6B4 1E01" /* .6Æ.Œ. ®.j.lÆ´.. */ $"4ED0 C044 3898 ECA6 3E3E ACE6 963C 5CC8" /* NÐÀD8˜.¦>>¬.–<\È */ $"D27A 2C62 BAB6 562C 62B0 B250 3678 B478" /* Òz,bº¶V,b°²P6x´x */ $"3E66 A4BA 803E 2886 D082 4A9C ECA2 403A" /* >f¤º€>(†Ð‚Jœ.¢@: */ $"5A88 A8A0 7882 BC8C 1014 92D6 A482 A2B2" /* Zˆ¨ x‚¼Œ..’Ö¤‚¢² */ $"8A44 1E42 82BE BC78 5688 8424 0C78 D4B6" /* ŠD.B‚¾¼xVˆ„$.xÔ¶ */ $"9496 806E 7A64 4482 EAE0 826C 8A72 322A" /* ”–€nzdD‚..‚lŠr2* */ $"5C84 A4AE 8E62 6C7C 502C 66D4 ECB8 8672" /* \„¤®Žbl|P,fÔ.¸†r */ $"6A52 404A 88D6 E69E 403A 564A 3A6A BED2" /* jR@JˆÖ.ž@:VJ:j¾Ò */ $"A674 4834 5484 889E E2EE 9A44 3C54 6070" /* ¦tH4T„ˆž..šDrŒ°..Š0. */ $"4072 9CAE B6BC A86C 2C20 5EA4 ACAA B4B2" /* @rœ®¶¼¨l, ^¤¬ª´² */ $"7E48 363E 72A4 B29C 929C 8250 344E 7A92" /* ~H6>r¤²œ’œ‚P4Nz’ */ $"989C 987C 4C24 205E A6C4 C8B4 A68A 5A4C" /* ˜œ˜|L$ ^¦ÄÈ´¦ŠZL */ $"6CA4 C0B8 AA84 6A58 3230 6AA4 B296 7460" /* l¤À¸ª„jX20j¤²–t` */ $"4E3A 3E56 88BA C29E 705E 5858 7498 CCD8" /* N:>VˆºÂžp^XXt˜ÌØ */ $"B288 5E5A 6466 7088 AAA2 8062 5A66 6A6A" /* ²ˆ^Zdfpˆª¢€bZfjj */ $"809E A28A 6444 4666 7670 809E AA94 7868" /* €ž¢ŠdDFfvp€žª”xh */ $"6A84 7E7A 9EBE AA7C 6860 9090 8272 90AC" /* j„~zž¾ª|h`��‚r�¬ */ $"AA8A 5250 5866 627E 827C 603E 506C 9292" /* ªŠRPXfb~‚|`>Pl’’ */ $"8492 A298 7872 789C AEA4 9892 9474 483C" /* „’¢˜xrxœ®¤˜’”tH< */ $"769C 8470 7E94 8276 3E30 7084 7A70 A4A8" /* vœ„p~”‚v>0p„zp¤¨ */ $"A6AE 725C 7E8C 6C6C C2B6 5A62 746C 98B0" /* ¦®r\~Œll¶Zbtl˜° */ $"9C80 7A86 6240 4A90 A076 7EA4 8214 1856" /* œ€z†b@J� v~¤‚..V */ $"7490 BABA 9C82 7028 247C BE8E 90F0 E670" /* t�ººœ‚p($|¾Ž�..p */ $"2A3A 76A0 AE9C 86A8 B246 0120 96C6 8654" /* *:v ®œ†¨²F. –ƆT */ $"A8D6 9214 0E68 B8DE 9070 9CB2 7006 0C82" /* ¨Ö’..h¸.�pœ²p..‚ */ $"B89E 9290 A492 2201 5EC0 B486 80A6 A65E" /* ¸ž’�¤’".^À´†€¦¦^ */ $"1C2A 8EDE C484 9EC2 800A 0172 C6B2 848C" /* .*Ž.Ä„žÂ€..rƲ„Œ */ $"A09C 6E34 3686 D0B2 6E80 AA6E 2830 6CA0" /*  œn46†Ð²n€ªn(0l  */ $"AC9C 7A7E 8874 4644 9CCC A480 8082 684A" /* ¬œz~ˆtFDœÌ¤€€‚hJ */ $"4A6C A0BA AE84 7C8E 6A44 2E62 969C 967E" /* Jl º®„|ŽjD.b–œ–~ */ $"6A5E 686C 74A2 B6AE 947C 7868 687E 92AC" /* j^hlt¢¶®”|xhh~’¬ */ $"BAB0 7A5A 504C 5052 86B2 AC8E 6644 2E3A" /* º°zZPLPR†²¬ŽfD.: */ $"4A64 A0D0 B67A 7086 9490 888C 9CA0 9076" /* Jd Ð¶zp†”�ˆŒœ �v */ $"687C 846C 749C B094 6450 5C6E 7C7C 848E" /* h|„ltœ°”dP\n||„Ž */ $"825C 3646 6E78 6A6C 8EAE A67E 7880 8482" /* ‚\6FnxjlŽ®¦~x€„‚ */ $"7484 B2C2 9E70 7288 908A 8896 9278 523C" /* t„²Âžprˆ�Šˆ–’xR< */ $"5066 6C66 7694 8C70 626A 7480 847E 9AB8" /* Pflfv”Œpbjt€„~š¸ */ $"B490 7078 7E78 748C A4A2 8460 4C6A 8676" /* ´�px~xtŒ¤¢„`Lj†v */ $"686E 746C 5C54 6276 7278 86A0 B2A0 7A60" /* hntl\Tbvrx† ² z` */ $"606C 8298 AAB4 A88A 746C 7A80 8C92 8C8C" /* `l‚˜ª´¨Štlz€Œ’ŒŒ */ $"7E70 6A5E 5C5C 626A 7C7E 7464 5862 728A" /* ~pj^\\bj|~tdXbrŠ */ $"989E 907C 6C68 7888 929C A2A2 A29A 8270" /* ˜ž�|lhxˆ’œ¢¢¢š‚p */ $"7072 7074 7E76 7270 6864 6672 808C 8E8C" /* prpt~vrphdfr€ŒŽŒ */ $"826C 6870 7C8A 9C96 8684 7874 6C76 7C88" /* ‚lhp|Šœ–†„xtlv|ˆ */ $"9292 9676 685A 5668 7A98 868E 7866 786A" /* ’’–vhZVhz˜†Žxfxj */ $"8C88 8C9A 828C 6E6C 787A 868C 9894 967E" /* ŒˆŒš‚Œnlxz†Œ˜”–~ */ $"6476 687E 8084 9080 7660 5A64 6E8C 9096" /* dvh~€„�€v`ZdnŒ�– */ $"9086 8668 6C62 6478 7C94 8880 7C74 787C" /* �††hlbdx|”ˆ€|tx| */ $"9096 9A96 8476 6666 686C 7E86 8A82 7A78" /* �–š–„vffhl~†Š‚zx */ $"727C 8288 8E92 8E7E 7872 6E6C 7C8A 9090" /* r|‚ˆŽ’Ž~xrnl|Š�� */ $"7A72 666A 7472 848A 806E 6466 6A68 748E" /* zrfjtr„Š€ndfjhtŽ */ $"A8A6 8A8A 8A7C 7466 7692 9884 7278 7E76" /* ¨¦ŠŠŠ|tfv’˜„rx~v */ $"667A 9EAA 967E 7472 606A 4662 7476 7A62" /* fzžª–~tr`jFbtvzb */ $"8872 8C66 72A8 92AC 7694 7E7A 9256 9C88" /* ˆrŒfr¨’¬v”~z’Vœˆ */ $"A496 72A0 6A88 5868 9878 A65C 6460 5070" /* ¤–r jˆXh˜x¦\d`Pp */ $"4690 949A A06C 966C 7472 6AA0 8AA2 7868" /* F�”š l–ltrj Š¢xh */ $"8862 8A78 909C 8296 687A 7060 7860 847C" /* ˆbŠx�œ‚–hzp`x`„| */ $"7C84 647C 647E 887A A080 9678 7874 628C" /* |„d|d~ˆz €–xxtbŒ */ $"6C94 90A6 A68C 927A 8880 8882 7670 6252" /* l”�¦¦Œ’zˆ€ˆ‚vpbR */ $"5060 7C80 8A84 7070 626E 667C 8A84 8C74" /* P`|€Š„ppbnf|Š„Œt */ $"8A72 8476 6A8C 84A8 989E 9884 866C 8078" /* Šr„vjŒ„¨˜ž˜„†l€x */ $"7C84 767E 7A80 7A74 827E 8482 7278 6064" /* |„v~z€zt‚~„‚rx`d */ $"6064 7670 887A 7E7E 7C84 7C90 9896 8C76" /* `dvpˆz~~|„|�˜–Œv */ $"7474 868C 7676 7C7E 8874 7E78 7C70 6C7C" /* tt†Œvv|~ˆt~x|pl| */ $"7E78 6E6C 6878 8886 8288 947E 7C78 8282" /* ~xnlhxˆ†‚ˆ”~|x‚‚ */ $"8688 8084 887C 7674 888A 8688 8C8E 846C" /* †ˆ€„ˆ|vtˆŠ†ˆŒŽ„l */ $"685A 6A70 7278 828C 806C 6E7C 8684 807A" /* hZjprx‚Œ€ln|†„€z */ $"6E6C 6C70 8296 A49A 8C88 7878 808E 9094" /* nllp‚–¤šŒˆxx€Ž�” */ $"9286 8074 7262 5052 606E 787A 766E 8084" /* ’†€trbPR`nxzvn€„ */ $"8A86 707A 6678 829A A490 9A92 9C9A 928A" /* Іpzfx‚š¤�š’œš’Š */ $"6A70 6872 7876 8882 7A70 767C 6878 7E8C" /* jphrxvˆ‚zpv|hx~Œ */ $"8A78 6858 7476 7674 6E72 5A6C 8496 8C7E" /* ŠxhXtvvtnrZl„–Œ~ */ $"9CAC A08A 8494 8E7C 7C8E 8E72 6E64 5C60" /* œ¬ Š„”Ž||ŽŽrnd\` */ $"727E 706E 868A 7258 788E 8278 9AAA 927C" /* r~pn†ŠrXxŽ‚xšª’| */ $"8A92 7C66 7286 827A 8470 6C68 7E8C 888E" /* Š’|fr†‚z„plh~ŒˆŽ */ $"9096 806C 747E 745C 6672 767C 7470 747E" /* �–€lt~t\frv|tpt~ */ $"8A8A 7C74 7678 707A 8EA2 A69A 9C8A 7E78" /* ŠŠ|tvxpzŽ¢¦šœŠ~x */ $"7C82 8086 8076 7478 7462 5660 6870 6C6A" /* |‚€†€vtxtbV`hplj */ $"7480 8484 8E8C 8C92 8882 8080 867E 787C" /* t€„„ŽŒŒ’ˆ‚€€†~x| */ $"888E 848E 9484 7872 685E 646C 7A90 8C80" /* ˆŽ„Ž”„xrh^dlz�Œ€ */ $"7A78 7A84 8068 6678 7676 8480 8088 766E" /* zxz„€hfxvv„€€ˆvn */ $"707A 7E84 9094 A2A0 8678 7082 8488 8C84" /* pz~„�”¢ †xp‚„ˆŒ„ */ $"8A68 646A 727C 6E5E 4E5A 6E88 969A 8E7E" /* Šhdjr|n^NZnˆ–šŽ~ */ $"7470 8698 948E 8482 8492 968A 785A 4C62" /* tp†˜”Ž„‚„’–ŠxZLb */ $"809C 9A84 6C62 6876 96A2 967E 6E6E 747C" /* €œš„lbhv–¢–~nnt| */ $"7864 6870 7A7E 7E8E 846E 6068 7C84 969E" /* xdhpz~~Ž„n`h|„–ž */ $"A6AE 9E82 7086 989C 8864 5A58 5C68 7A86" /* ¦®ž‚p†˜œˆdZX\hz† */ $"7A66 4A4A 7084 8684 8A96 9898 8886 8876" /* zfJJp„†„Š–˜˜ˆ†ˆv */ $"6C70 929C 8C88 8488 7664 585C 8288 8A8A" /* lp’œŒˆ„ˆvdX\‚ˆŠŠ */ $"8284 7E7A 7684 8A78 6E5E 6A6C 6274 7C7C" /* ‚„~zv„Šxn^jlbt|| */ $"7070 8482 8A86 7A82 94AA A4A8 A88E 705C" /* pp„‚Іz‚”ª¤¨¨Žp\ */ $"6E92 A48C 6852 3C48 6A98 A88E 7042 487C" /* n’¤ŒhR */ $"6674 9C84 6A70 405C 5070 8E90 AC86 968A" /* ftœ„jp@\PpŽ�¬†–Š */ $"8894 86AE 9A9C 8466 6242 7476 96A6 9092" /* ˆ”†®šœ„fbBtv–¦�’ */ $"5C64 5C6A 9482 9872 7264 4E6A 6898 9892" /* \d\j”‚˜rrdNjh˜˜’ */ $"9276 8E74 7E7A 6C86 6C74 6E7A 9896 B096" /* ’vŽt~zl†ltnz˜–°– */ $"9494 8290 768E 8878 6630 3E40 6C86 8086" /* ””‚�vŽˆxf0>@l†€† */ $"5E5A 485A 90A0 C4A4 9482 6E7C 7EB6 BEB8" /* ^ZHZ� Ä¤”‚n|~¶¾¸ */ $"A072 6858 646A 7AA0 927A 483E 505A 707A" /*  rhXdjz ’zH>PZpz */ $"A0BC C09A 6058 667E 7E74 725C 4E40 527C" /*  ¼Àš`Xf~~tr\N@R| */ $"9CA8 968E 9494 9494 9E96 8470 6874 7E7A" /* œ¨–Ž””””ž–„pht~z */ $"727A 8486 7464 7A9A A482 604A 464C 5274" /* rz„†tdzš¤‚`JFLRt */ $"9CC0 BE96 7A6E 808C 8C96 9C8E 6440 4466" /* œÀ¾–zn€ŒŒ–œŽd@Df */ $"96A0 927C 6864 5C70 8494 9C8A 8070 6C60" /* – ’|hd\p„”œŠ€pl` */ $"6482 94AC A498 8C6E 665C 7280 8072 5052" /* d‚”¬¤˜Œnf\r€€rPR */ $"6086 A6BE D2C4 AA80 6468 7276 7660 4A44" /* `†¦¾ÒĪ€dhrvv`JD */ $"5272 8CA0 987A 604C 5A78 A0B6 B096 7468" /* RrŒ ˜z`LZx ¶°–th */ $"6872 8288 9488 8A8A 889A 9292 7E64 5C40" /* hr‚ˆ”ˆŠŠˆš’’~d\@ */ $"4648 6EA6 B4BC A090 7660 5E64 8E98 845E" /* FHn¦´¼ �v`^dŽ˜„^ */ $"3246 6286 888E A282 7252 507E A4BE AA9C" /* 2Fb†ˆŽ¢‚rRP~¤¾ªœ */ $"9486 7A68 809E AAA8 8878 6466 6E6C 7E6A" /* ”†zh€žª¨ˆxdfnl~j */ $"543A 2E42 5882 A2C0 D0BC A280 7C72 646A" /* T:.BX‚¢Àм¢€|rdj */ $"626C 7280 9298 A894 7A56 425A 6E8E A0A8" /* blr€’˜¨”zVBZnŽ ¨ */ $"A486 7256 5C6E 7884 8486 8084 807A 8680" /* ¤†rV\nx„„†€„€z†€ */ $"745C 4A4A 527A A6D4 F2E6 CA98 725C 505A" /* t\JJRz¦Ô..ʘr\PZ */ $"727E 7862 4C44 4C54 6478 8888 7066 6A7E" /* r~xbLDLTdxˆˆpfj~ */ $"9492 8E84 7E80 7C96 B8C4 BC96 7A68 6A76" /* ”’Ž„~€|–¸Ä¼–zhjv */ $"7A7E 7468 463C 406C 98AA B6A8 9676 645E" /* z~thF<@l˜ª¶¨–vd^ */ $"6270 6E68 6466 6272 7C88 A49A 8C86 7486" /* bpnhdfbr|ˆ¤šŒ†t† */ $"9290 ACBE BCB6 906A 4A3E 526A 8CAE AA94" /* ’�¬¾¼¶�jJ>RjŒ®ª” */ $"723E 2E2E 5066 6A7A 667E 9AAC D2DC C298" /* r>..Pfjzf~š¬Ò.˜ */ $"6E3E 4A68 769A A098 886A 6058 7C8A 7C7A" /* n>Jhvš ˜ˆj`X|Š|z */ $"645C 6472 8CAA AA88 685C 6282 9CA4 A69C" /* d\drŒªªˆh\b‚œ¤¦œ */ $"8E62 4C56 7490 8A8A 7064 5442 789C C0EA" /* ŽbLVt�ŠŠpdTBxœÀ. */ $"C8B8 9852 4628 4484 7E84 744E 5E3C 487E" /* ȸ˜RF(D„~„tN^À */ $"822A 966C 1E92 9E5A A8BC 6A92 A25A 7AAE" /* ‚*–l.’žZ¨¼j’¢Zz® */ $"7E84 AE7C 76A2 685C 8C6A 64AA 9C7C 9272" /* ~„®|v¢h\Œjdªœ|’r */ $"3458 725A 80BA 908A 9C5A 4470 5E44 7080" /* 4XrZ€º�ŠœZDp^Dp€ */ $"6E96 AA82 8498 7066 847C 7294 948C A2B0" /* n–ª‚„˜pf„|r””Œ¢° */ $"A8A8 9A6A 504E 4E60 8484 7A8E 8A6E 6256" /* ¨¨šjPNN`„„zŽŠnbV */ $"4842 5A70 7CB6 C2A4 987E 667A 8678 8482" /* HBZp|¶Â¤˜~fz†x„‚ */ $"7682 887C 8A9C 8874 7A5C 5A82 7A7E 9A92" /* v‚ˆ|Šœˆtz\Z‚z~š’ */ $"7C8C 7656 7078 6880 967C 7282 6058 7E84" /* |ŒvVpxh€–|r‚`X~„ */ $"849A 947A 7E88 8CA6 B2A0 9494 847A 7250" /* „š”z~ˆŒ¦² ””„zrP */ $"505C 5046 5868 768C 7E62 6672 707E 94A0" /* P\PFXhvŒ~bfrp~”  */ $"A8AE 989A A896 908C 867E 7E6E 687C 7E7E" /* ¨®˜š¨–�Œ†~~nh|~~ */ $"868A 8682 6A46 587C 888C 8878 7266 544A" /* †Š†‚jFX|ˆŒˆxrfTJ */ $"647C 7E7C 707A 868C 8686 9A9E 8872 6E7E" /* d|~|pz†Œ††šžˆrn~ */ $"8E98 A2A8 B4AE 8A6C 6C7A 7062 5658 605C" /* Ž˜¢¨´®ŠllzpbVX`\ */ $"6268 849A 8C78 6060 727C 8494 ACA4 8876" /* bh„šŒx``r|„”¬¤ˆv */ $"7478 7C7C 6E72 7A76 7A7A 8496 8866 5872" /* tx||nrzvzz„–ˆfXr */ $"7E72 7488 A4B0 966C 5E70 7678 7884 9680" /* ~rtˆ¤°–l^pvxx„–€ */ $"6C68 8094 8A7E 6A6E 6C6A 7C9C B6AE 9A76" /* lh€”Š~jnlj|œ¶®šv */ $"625E 5E60 6C96 906E 5C5E 7688 8C84 8472" /* b^^`l–�n\^vˆŒ„„r */ $"585A 606A 96C2 BAC0 DAB8 8676 6258 5C6E" /* XZ`j–ºÀ.¸†vbX\n */ $"5654 666E 8274 7CA0 A47C 6496 9A7C 7066" /* VTfn‚t| ¤|d–š|pf */ $"787E 7E6A 6270 7A84 7266 7E8A 8876 8686" /* x~~jbpz„rf~Šˆv†† */ $"6A4A 4066 8C90 A0BA D4DC E0CC B0A2 9274" /* jJ@fŒ� ºÔ..̰¢’t */ $"6C7E 6A44 1801 0224 4648 464E 586E 92CC" /* l~jD...$FHFNXn’Ì */ $"FFFF E4BA A690 9094 8064 442C 1A3C 7894" /* ...º¦��”€dD,.Vz */ $"AADC D29A 8492 BAEC F8E0 BA94 624C 5A58" /* ª.Òš„’º...º”bLZX */ $"5640 1C0C 2254 687C 6860 829E CCF2 FED4" /* V@.."Th|h`‚žÌ..Ô */ $"9464 527E BCC6 AC80 4C28 222E 4060 6248" /* ”dR~¼Æ¬€L(".@`bH */ $"3E50 7EAE C6BC C2DC E2D0 B692 6A56 382E" /* >P~®Æ¼Â..ж’jV8. */ $"426A 7468 4C34 3C56 7C8E 9C8C 8292 AABA" /* BjthL4”® */ $"A474 7A80 8280 829A A6A6 8C90 BED4 DABA" /* ¤tz€‚€‚š¦¦Œ�¾Ô.º */ $"8254 2604 0106 2230 628E CCEA C8B6 7086" /* ‚T&..."0bŽÌ.ȶp† */ $"746C 8A84 CEC4 C0B0 A0D8 BAA4 3C01 0101" /* tlŠ„ÎÄÀ° Øº¤<... */ $"0101 1A64 92E0 D8FF FAD8 BE5E 5040 5A8C" /* ...d’.Ø..ؾ^P@ZŒ */ $"8CA6 8482 8288 9C74 6444 343C 2842 528E" /* Œ¦„‚‚ˆœtdD4<(BRŽ */ $"CAD2 E6E0 E8CE A680 4C48 3A40 4A38 3C2C" /* ÊÒ...Φ€LH:@J8<, */ $"4664 8AB0 A6A2 806C 5A4C 82AC EEFA E8DA" /* Fdа¦¢€lZL‚¬.... */ $"B2C6 9C62 2C08 2218 2616 2248 5C8E 86A4" /* ²Æœb,.".&."H\ކ¤ */ $"BEC2 C094 8C82 9CBA CEE4 D2CC AA74 4C1C" /* ¾ÂÀ”Œ‚œºÎ.Ò̪tL. */ $"0A0A 181E 264E 5668 90B2 B4D4 E0CE B474" /* ....&NVh�²´Ô.δt */ $"363E 5E86 A2B6 BAB0 8444 1824 3268 8C8E" /* 6>^†¢¶º°„D.$2hŒŽ */ $"9A92 8AA0 BEBE DADA D0BC 9C74 5A46 403A" /* š’Š ¾¾..мœtZF@: */ $"3016 1426 3248 6E76 86A8 A6AA 9CAE BCC4" /* 0..&2Hnv†¨¦ªœ®¼Ä */ $"BEAE 9A82 9488 8874 6C50 4236 345E 769A" /* ¾®š‚”ˆˆtlPB64^vš */ $"8878 4A42 4C64 ACCA ECE6 EEC4 AA9C 766C" /* ˆxJBLd¬Ê...Īœvl */ $"5042 0A01 0101 2C6C 9CB8 D0DC D2BC BAA4" /* PB....,lœ¸Ð.Ò¼º¤ */ $"8284 7E68 6474 6A66 7C82 7284 A07C 4432" /* ‚„~hdtjf|‚r„ |D2 */ $"4C5E 705E 4660 B0CA 94B0 F6FE CEB4 A698" /* L^p^F`°Ê”°..δ¦˜ */ $"9A68 0C01 1C10 0226 82A0 989A A29A 8A84" /* šh.....&‚ ˜š¢šŠ„ */ $"5E8A C0C2 9090 C6AA 8458 504A 5246 2648" /* ^ŠÀÂ��ƪ„XPJRF&H */ $"7484 86AA C6BA 947A 7282 7E76 96BE DACC" /* t„†ªÆº”zr‚~v–¾.Ì */ $"B2B0 B898 460E 0101 060E 2646 7A9A BAA6" /* ²°¸˜F.....&Fzšº¦ */ $"AAD6 E0CE B69C 828E 804E 6094 7060 787E" /* ªÖ.ζœ‚Ž€N`”p`x~ */ $"5E6E 8038 5490 8A4A 78AC 666C B6DE A4D0" /* ^n€8T�ŠJx¬fl¶.¤Ð */ $"E088 82AA 6601 4054 1418 626E 5EB0 A670" /* .ˆ‚ªf.@T..bn^°¦p */ $"66B2 907A C8CA B6BE FFBC 8880 3A0A 0434" /* f²�zÈʶ¾.¼ˆ€:..4 */ $"0101 3458 90C2 DEB8 CEBE 8050 1644 9AB0" /* ..4X�Â.¸Î¾€P.Dš° */ $"B2E2 DEEA FFF6 7876 5A01 0101 0101 5A74" /* ².....xvZ.....Zt */ $"7AC4 DAEA D2BA 945C 2E1E 6C68 78C0 B890" /* zÄ..Òº”\..lhxÀ¸� */ $"CEFF 943A 3C04 0130 805C 74CA BAA8 F0FF" /* Î.”:<..0€\tʺ¨.. */ $"F6E2 BE6A 0601 1E01 1E58 6268 8C8E 8892" /* ..¾j.....XbhŒŽˆ’ */ $"964E 246E 9494 948A 96A0 C8E2 E0FA E684" /* –N$n”””Š– È....„ */ $"0C01 1822 3652 6058 90B0 9CA0 8A58 3E68" /* ..."6R`X�°œ ŠX>h */ $"BCE0 CEB6 A892 9EBC AA94 9674 1801 0116" /* ¼.ζ¨’ž¼ª”–t.... */ $"3282 9A8A 88AC B6A6 BAB0 6E48 7696 8896" /* 2‚šŠˆ¬¶¦º°nHv–ˆ– */ $"8668 4C5A 7E7E 9C9C 541A 3060 8298 AAA2" /* †hLZ~~œœT.0`‚˜ª¢ */ $"9AC0 CECC D0CE 9A76 828A 8676 6A34 1C26" /* šÀÎÌÐΚv‚Іvj4.& */ $"2446 7290 6E42 3A44 66A0 C8B6 B4CA C0AE" /* $Fr�nB:Df È¶´ÊÀ® */ $"9E9C 7638 3040 6888 7A5A 5A88 9680 769C" /* žœv80@hˆzZZˆ–€vœ */ $"A266 4258 B2EA D6B6 B8E0 C068 3052 763A" /* ¢fBX².Ö¶¸.Àh0Rv: */ $"0101 3684 8862 6AB8 D47C 4284 D8B0 422A" /* ..6„ˆbj¸Ô|B„ذB* */ $"7EDC E080 4280 D482 142E 90A4 560E 2892" /* ~..€B€Ô‚..�¤V.(’ */ $"E89E 346C EAFF AE66 72A4 BC8E 5056 724E" /* .ž4l..®fr¤¼ŽPVrN */ $"2048 9EA2 4004 3AB4 E886 0E0E 86F6 FFDA" /* Hž¢@.:´.†..†... */ $"B4AC AC7E 6A8C 9446 0101 4AC0 C85A 0146" /* ´¬¬~jŒ”F..JÀÈZ.F */ $"CAF4 A044 3A6A 847A 7AB2 E8D0 90A6 FCFC" /* Ê. D:j„zz².Ð�¦.. */ $"7C01 086A A264 0101 6CCC B47A 808E 886A" /* |..j¢d..lÌ´z€Žˆj */ $"669E B874 1424 B2FF D866 4274 A48C 4044" /* fž¸t.$².ØfBt¤Œ@D */ $"828C 5E48 80BA BC90 82CC FADA 7A4A 7490" /* ‚Œ^H€º¼�‚Ì..zJt� */ $"6816 0C48 7C82 7074 7C6A 3E3E 749A 7648" /* h..H|‚pt|j>>tšvH */ $"4888 DAFF E6AC 9AA0 8E7C 786C 3A20 365E" /* Hˆ...¬š Ž|xl: 6^ */ $"9CB8 965C 588C A292 6246 486E 96A8 B6C0" /* œ¸–\XŒ¢’bFHn–¨¶À */ $"B8B0 A49C 845C 3826 405A 604C 4A6E A4C8" /* ¸°¤œ„\8&@Z`LJn¤È */ $"BA9E 867A 889C A48C 6452 4C68 9296 6430" /* ºž†zˆœ¤ŒdRLh’–d0 */ $"3862 8892 7856 4A6E 889A B8BE B4B4 D0E4" /* 8bˆ’xVJnˆš¸¾´´Ð. */ $"CCA4 624A 627A 7258 544E 5A6A 6C6E 5E52" /* ̤bJbzrXTNZjln^R */ $"4C5A 848A 786A 88B2 CED0 A472 5860 6C6E" /* LZ„Šxjˆ²ÎФrX`ln */ $"685A 444A 8CBE BE88 565C 92CC C27E 4850" /* hZDJŒ¾¾ˆV\’ÌÂ~HP */ $"84B4 BAAE 987A 747C 826C 3E18 2660 9296" /* „´º®˜zt|‚l>.&`’– */ $"7864 7896 B4B4 A08E 7A7E 9AA0 8A6A 4C5A" /* xdx–´´ Žz~š ŠjLZ */ $"8AAE 945E 383A 6688 8070 686C 7EA6 AC9E" /* Š®”^8:fˆ€phl~¦¬ž */ $"8486 A0B6 C49E 6840 4A7A 8E84 6C64 646C" /* „† ¶Äžh@JzŽ„lddl */ $"7268 6A5E 606C 86AC A8A8 968A 9EB2 B090" /* rhj^`l†¬¨¨–Šž²°� */ $"6A54 4646 4A48 4E66 8C9E A098 846E 6488" /* jTFFJHNfŒž ˜„ndˆ */ $"9C9C 8E82 868A 988C 8892 9C94 7254 4044" /* œœŽ‚†Š˜Œˆ’œ”rT@D */ $"4A4E 6676 8A8C 7864 808A 8A8E 9C9C 9084" /* JNfvŠŒxd€ŠŠŽœœ�„ */ $"7C76 706C 6E78 9292 7E64 5868 7078 747A" /* |vplnx’’~dXhpxtz */ $"94A6 B2A2 B2A4 887C 7A88 8478 4E2C 3A54" /* ”¦²¢²¤ˆ|zˆ„xN,:T */ $"6870 8082 7068 5A62 7886 8C8C A4BC B29E" /* hp€‚phZbx†ŒŒ¤¼²ž */ $"888E 8A8A 7A6A 6A6C 7268 5E5A 6276 8E9C" /* ˆŽŠŠzjjlrh^ZbvŽœ */ $"886C 5656 7CA0 BCB6 988C 868A 7E74 604A" /* ˆlVV| ¼¶˜Œ†Š~t`J */ $"5464 8292 927C 585E 7A9A 9E8A 7874 94A2" /* Td‚’’|X^zšžŠxt”¢ */ $"A49E 827A 7280 8A7C 6046 4650 6E74 6660" /* ¤ž‚zr€Š|`FFPntf` */ $"6280 807E 8CA4 C6CC BCB0 9686 7872 7474" /* b€€~Œ¤ÆÌ¼°–†xrtt */ $"7662 627E 968E 6E54 4452 6674 7470 7E86" /* vbb~–ŽnTDRfttp~† */ $"9ABE C8B4 7A66 7072 6C66 6C6A 7C80 7C92" /* š¾È´zfprlflj|€|’ */ $"A28C 706C 5A5C 7684 9EB4 A08A 8C8E 8C90" /* ¢ŒplZ\v„ž´ ŠŒŽŒ� */ $"7A72 6862 646E 6260 6C5E 5044 586C 7270" /* zrhbdnb`l^PDXlrp */ $"829C C4F4 F6EC D2B0 9A86 8278 5A22 0101" /* ‚œÄ...Ò°š†‚xZ".. */ $"011C 3E46 6090 C4DC EEF8 F2DE B686 5E42" /* ..>F`�Ä.....¶†^B */ $"1601 011E 4264 7E9A CCD6 D4BE A8C6 D0AA" /* ....Bd~šÌÖÔ¾¨ÆÐª */ $"684E 4848 5244 464C 4A50 5E82 A0C0 C2BE" /* hNHHRDFLJP^‚ À¾ */ $"CCC4 A46C 422C 2A2A 1E26 4A8A ACCE EEFA" /* ÌĤlB,**.&JЬÎ.. */ $"F8D4 B4AA AE90 5826 0C12 1416 1E3C 565C" /* .Ô´ª®�X&.....h’¦ Žž¸ÊÊ´® */ $"A88E 603A 262C 3E46 5A54 545C 6C98 D2FA" /* ¨Ž`:&,>FZTT\l˜Ò. */ $"FAEE D29E 6C50 4448 504A 4A50 444A 5C60" /* ..ÒžlPDHPJJPDJ\` */ $"84B8 D2D4 C8A0 6C68 685E 687C 8068 5242" /* „¸ÒÔÈ lhh^h|€hRB */ $"526E 84A6 C2CA BCA0 7664 6C62 4A44 5A7C" /* Rn„¦Âʼ vdlbJDZ| */ $"8672 5E72 96A6 B8DA F2EA B874 3C44 5638" /* †r^r–¦¸...¸tFn�¶ */ $"AE92 7C5E 4A36 526E 787E 6E7E 9096 887C" /* ®’|^J6Rnx~n~�–ˆ| */ $"96B2 D6DE C6A4 7858 3E3E 5E6A 6E72 6854" /* –²Ö.ƤxX>>^jnrhT */ $"5866 6284 CAE8 CCB6 9254 404C 5266 98A4" /* Xfb„Ê.̶’T@LRf˜¤ */ $"7C54 462E 3E5E 88BA DEDC BE90 8496 9892" /* |TF.>^ˆº..¾�„–˜’ */ $"887C 643C 2A0E 183C 5A82 ACCE D4B6 9678" /* ˆ|d<*..H\Œ¤¦ */ $"8E74 8692 A28C 8C9A 9076 280C 0C3E 5266" /* Žt†’¢ŒŒš�v(..>Rf */ $"A6C6 DEC6 967E 8EA4 8882 98A4 8C5E 4650" /* ¦Æ.Æ–~ޤˆ‚˜¤Œ^FP */ $"6A78 80A2 C0C8 A662 4A54 6662 6884 8268" /* jx€¢ÀȦbJTfbh„‚h */ $"3222 407A 9EA8 AAA2 8E6C 5E6E 90A2 9C9C" /* 2"@zž¨ª¢Žl^n�¢œœ */ $"9C92 7856 4856 7692 A0AA B09C 7C60 6C8E" /* œ’xVHVv’ ª°œ|`lŽ */ $"9C8A 828A 7E5A 3224 3C6C 8C90 9AB4 B27E" /* œŠ‚Š~Z2$.(Lh| */ $"726A 82A4 C4B2 9276 7EA4 C2D8 AE6E 2601" /* rj‚¤Ä²’v~¤ÂØ®n&. */ $"0126 98B8 BAA6 6E64 84A2 AEC8 B272 625C" /* .&˜¸º¦nd„¢®È²rb\ */ $"5470 5E1E 2E62 7EA8 D0B8 9072 584E A0F4" /* Tp^..b~¨Ð¸�rXN . */ $"D4C4 863E 4C5E 6876 9696 8272 5E52 6E72" /* ÔĆ>L^hv––‚r^Rnr */ $"5C72 868E 9268 383A 3E52 6498 B48E A06E" /* \r†Ž’h8:>Rd˜´Ž n */ $"5C94 A2BC D4DE C296 6C56 525C 5E50 7080" /* \”¢¼Ô.–lVR\^Pp€ */ $"7C92 6C68 8886 8A92 A496 8876 3C46 6056" /* |’lhˆ†Š’¤–ˆvflZ”dŽ€„žv²”ž f */ $"926E 8684 7482 4462 4C54 7076 A48E 9284" /* ’n†„t‚DbLTpv¤Ž’„ */ $"5C76 7A8E 747C BA92 9892 9EA0 8A88 4E4C" /* \vzŽt|º’˜’ž ŠˆNL */ $"7C5E 4A42 7486 5288 92B8 A88C 8668 B290" /* |^JBt†Rˆ’¸¨Œ†h²� */ $"5E5C 88A4 6C76 9484 6C44 4660 88AE 6C72" /* ^\ˆ¤lv”„lDF`ˆ®lr */ $"9AA8 885E AAB0 A47C 647A 6C86 6C66 98A0" /* š¨ˆ^ª°¤|dzl†lf˜  */ $"6C34 5074 5A48 445C 8A90 9882 A0AC 8E8A" /* l4PtZHD\Š�˜‚ ¬ŽŠ */ $"8CCE BE94 787C 907C 6E52 4A6A 685A 6488" /* ŒÎ¾”x|�|nRJjhZdˆ */ $"9A66 5E68 8098 9496 8296 9070 6A86 B8AE" /* šf^h€˜”–‚–�pj†¸® */ $"987A 6050 4240 4E6C 988E 727E 92A0 726E" /* ˜z`PB@Nl˜Žr~’ rn */ $"6C98 AE8E 8278 A096 7E84 8E92 6030 2848" /* l˜®Ž‚x –~„Ž’`0(H */ $"7870 7494 A498 5E68 90AA 847A 8EB0 B07C" /* xpt”¤˜^h�ª„zް°| */ $"7C92 AE80 424A 7290 5840 7C80 8C46 568E" /* |’®€BJr�X@|€ŒFVŽ */ $"ACB0 627C 9C84 6648 A0C0 AC76 4498 927A" /* ¬°b|œ„fH À¬vD˜’z */ $"5252 9498 8664 7890 5E50 5E9C BCA0 786C" /* RR”˜†dx�^P^œ¼ xl */ $"8A72 6672 88A2 7E60 5A6E 7E66 6886 B0A8" /* Šrfrˆ¢~`Zn~fh†°¨ */ $"8270 86AC AA7C 7684 A294 7C78 7484 4E34" /* ‚p†¬ª|v„¢”|xt„N4 */ $"3E66 8E62 626A 88A8 7C80 8AAA AC80 8C88" /* >fŽbbjˆ¨|€Šª¬€Œˆ */ $"A89A 8292 92A6 6A50 5054 7044 4850 7882" /* ¨š‚’’¦jPPTpDHPx‚ */ $"787A 7280 847A A6C0 BC8C 707C 86A4 8878" /* xzr€„z¦À¼Œp|†¤ˆx */ $"827A 7054 7688 9278 5260 7682 5A54 7898" /* ‚zpTvˆ’xR`v‚ZTx˜ */ $"A280 7A8C 9C8E 6A68 7C7E 7666 7A94 9674" /* ¢€zŒœŽjh|~vfz”–t */ $"5E7A 888A 7E7E 9EB0 AA7C 6462 605A 5282" /* ^zˆŠ~~ž°ª|db`ZR‚ */ $"B2A4 8056 545E 5E4A 3C6E 9EB4 B0A4 B2A4" /* ²¤€VT^^J8H\ */ $"5C70 86AA A892 808E A288 7272 7A76 7874" /* \p†ª¨’€Ž¢ˆrrzvxt */ $"748E A694 7070 8088 6C60 6C7C 827A 7878" /* tަ”pp€ˆl`l|‚zxx */ $"8E8A 6C62 7480 7C7A 7A86 927C 625E 6E72" /* ŽŠlbt€|zz†’|b^nr */ $"6A66 647E 8886 8292 AEB4 A89E ACAE 947C" /* jfd~ˆ†‚’®´¨ž¬®”| */ $"727A 8676 5440 4C5A 4848 5A74 888E 8E84" /* rz†vT@LZHHZtˆŽŽ„ */ $"888E 8476 788A 847E 8696 8E84 7E6E 6E74" /* ˆŽ„vxŠ„~†–Ž„~nnt */ $"7A7C 7C88 929A A0A4 A69C 9084 6C6A 7678" /* z||ˆ’𠤦œ�„ljvx */ $"6860 686A 7272 6256 5850 404C 5C74 9098" /* h`hjrrbVXP@L\t�˜ */ $"929C ACB0 ACB8 AAA2 9E8C 92A0 9C8C 7C6E" /* ’œ¬°¬¸ª¢žŒ’ œŒ|n */ $"6A6A 6056 5856 4E58 6872 8892 848A 9688" /* jj`VXVNXhrˆ’„Š–ˆ */ $"7872 7480 8C86 6E72 7A72 726A 6A78 8A94" /* xrt€Œ†nrzrrjjxŠ” */ $"98A2 9482 7A76 8A9A 968A 827C 6E72 6A68" /* ˜¢”‚zvŠš–Š‚|nrjh */ $"6E66 6256 585E 6A6E 7286 9294 989A 9696" /* nfbVX^jnr†’”˜š–– */ $"928C 9CAE AEB0 AC90 745A 4A44 4E48 2E2E" /* ’Œœ®®°¬�tZJDNH.. */ $"3E5E 7072 7A8A A2A4 A498 8C80 6258 668E" /* >^przŠ¢¤¤˜Œ€bXfŽ */ $"A09A 8E82 8E8E 8080 8C98 8E8C 8A86 9294" /*  šŽ‚ŽŽ€€Œ˜ŽŒŠ†’” */ $"8A82 8C90 7A6C 645C 524A 4C54 666A 645E" /* Š‚Œ�zld\RJLTfjd^ */ $"5E6A 6C78 8696 A692 7E86 9EB4 BEB8 AEB0" /* ^jlx†–¦’~†ž´¾¸®° */ $"AC98 826C 5E48 3636 5272 8082 808A 9A9C" /* ¬˜‚l^H66Rr€‚€Ššœ */ $"9080 7C7E 6C5A 5E78 9696 949A A290 705A" /* �€|~lZ^x––”š¢�pZ */ $"4A5E 706C 688C B6B6 9A92 9090 846E 5658" /* J^plhŒ¶¶š’��„nVX */ $"5E52 4254 86A4 9E8A 786E 625C 5C6E 92A2" /* ^RBT†¤žŠxnb\\n’¢ */ $"A6A6 A6AA ACA0 9E98 8E72 6066 7272 665A" /* ¦¦¦ª¬ ž˜Žr`frrfZ */ $"6A82 8068 6252 585A 545A 78AA ACA0 9692" /* j‚€hbRXZTZxª¬ –’ */ $"A098 7A66 6876 7C76 6C68 706A 5E6C 8EB6" /*  ˜zfhv|vlhpj^l޶ */ $"C4AA 908C 888C 9086 7E70 6E64 6E86 8A84" /* Ī�ŒˆŒ�†~pndn†Š„ */ $"7862 4E44 3E42 5464 768E AEB4 AE9A 7A7A" /* xbND>BTdvŽ®´®šzz */ $"868C 929E 9690 908C 8482 887C 6456 505A" /* †Œ’ž–��Œ„‚ˆ|dVPZ */ $"6872 726C 7286 8E94 9A98 8876 6252 546C" /* hrrlr†Ž”š˜ˆvbRTl */ $"8492 887E 787C 8888 8C8C 928C 8686 8698" /* „’ˆ~x|ˆˆŒŒ’Œ†††˜ */ $"A492 7468 6662 6256 5662 6A70 7066 5C58" /* ¤’thfbbVVbjppf\X */ $"5252 7A9E B0BE C8B6 A094 8894 A094 7676" /* RRzž°¾È¶ ”ˆ” ”vv */ $"929C 9C8C 7864 503E 3244 586E 6C62 7C8A" /* ’œœŒxdP>2DXnlb|Š */ $"8C88 8E86 7A7C 6A66 7478 7A82 9CA8 A898" /* ŒˆŽ†z|jftxz‚œ¨¨˜ */ $"888C 9092 8A8C 9AA8 A286 7C82 7E6E 5E5E" /* ˆŒ�’ŠŒš¨¢†|‚~n^^ */ $"564C 3A34 5C86 887E 747A 8682 7878 8A90" /* VL:4\†ˆ~tz†‚xxŠ� */ $"848A 94AC AA8C 7474 766E 7C86 92A2 9270" /* „Š”¬ªŒttvn|†’¢’p */ $"5A64 6862 686C 706A 6A82 949C 8C70 5C5C" /* Zdhbhlpjj‚”œŒp\\ */ $"788E A2B0 B0A8 A096 7C66 584C 5056 6488" /* xŽ¢°°¨ –|fXLPVdˆ */ $"A4AA A092 8274 6856 6076 7868 5C5A 7284" /* ¤ª ’‚thV`vxh\Zr„ */ $"7E78 6860 646C 7EA4 BCA6 9498 9EA8 B09A" /* ~xh`dl~¤¼¦”˜ž¨°š */ $"8284 7C62 6A76 7E7C 6654 5E7E 766A 726E" /* ‚„|bjv~|fT^~vjrn */ $"7C86 8070 7886 8472 5852 667C 889C A69C" /* |†€px†„rXRf|ˆœ¦œ */ $"A096 8080 8A6C 5A62 708A A4AA A29E 9068" /*  –€€ŠlZbpФª¢ž�h */ $"6268 787C 6A5E 6A8C 8A80 7C78 725C 4242" /* bhx|j^jŒŠ€|xr\BB */ $"6E9E A6A2 9A98 9888 7680 8A76 646A 7C9E" /* nž¦¢š˜˜ˆv€Švdj|ž */ $"AA92 747A 8880 7E7A 7684 7E66 6676 7E72" /* ª’tzˆ€~zv„~ffv~r */ $"6458 6884 8882 8E9C 9690 7E6C 7A80 7060" /* dXh„ˆ‚Žœ–�~lz€p` */ $"7A8A 7E7A 829E AAA2 8A7A 7E82 7256 5C72" /* zŠ~z‚žª¢Šz~‚rV\r */ $"6A56 4A66 7A74 685C 7894 988C 98B2 B6AA" /* jVJfzth\x”˜Œ˜²¶ª */ $"8C72 706E 665E 748E 9090 8898 A698 8068" /* Œrpnf^tŽ��ˆ˜¦˜€h */ $"665E 564E 5E86 9488 767C 766A 5E44 5282" /* f^VN^†”ˆv|vj^DR‚ */ $"9692 8E98 9A90 7C6C 7E8E 8A7A 7280 90A0" /* –’Ž˜š�|l~ŽŠzr€�  */ $"968E 9480 6450 5C7A 908E 7C7A 7A6A 5A58" /* –Ž”€dP\z�Ž|zzjZX */ $"6068 6852 5882 9EAA A6A0 9C9A 8A76 7E8C" /* `hhRX‚žª¦ œšŠv~Œ */ $"8A7C 727A 929C 8474 706E 6864 6676 9092" /* Š|rz’œ„tpnhdfv�’ */ $"7870 8278 5E54 5460 7878 667A A6BA AA9C" /* xp‚x^TT`xxfz¦ºªœ */ $"A0A6 9C7E 6858 6274 8094 BED0 965E 4448" /*  ¦œ~hXbt€”¾Ð–^DH */ $"6476 7476 846E 4C42 5266 7E78 6E8C 9894" /* dvtv„nLBRf~xnŒ˜” */ $"868E A6BA B6A4 987E 8274 5644 608A 9090" /* †Ž¦º¶¤˜~‚tVD`Š�� */ $"8080 746A 6068 8EA4 9668 6684 9670 4850" /* €€tj`hޤ–hf„–pHP */ $"7688 6C74 8EAE 9A62 4C80 C8BE 7468 9094" /* vˆltŽ®šbL€È¾th�” */ $"5836 6AB8 D49C 6066 8884 3A2E 74B8 B06A" /* X6j¸Ôœ`fˆ„:.t¸°j */ $"6098 AE68 1E42 88A4 7654 7EBA C072 6096" /* `˜®h.Bˆ¤vT~ºÀr`– */ $"C8B8 6042 6A9E 8042 568C B290 5C76 A6A4" /* ȸ`Bjž€BVŒ²�\v¦¤ */ $"5634 68A6 C68A 5C70 8A64 2436 68A6 9068" /* V4h¦ÆŠ\pŠd$6h¦�h */ $"66A0 B676 5E72 BEC4 8460 64A6 9268 607E" /* f ¶v^r¾Ä„`d¦’h`~ */ $"C4A6 7866 788C 564A 588C AA6C 5058 92A0" /* ĦxfxŒVJXŒªlPX’  */ $"6450 5280 8668 829A C8A4 7070 76AE 8A70" /* dPR€†h‚šÈ¤ppv®Šp */ $"727E 945E 5664 9EC0 947E 6670 644C 5E76" /* r~”^VdžÀ”~fpdL^v */ $"A6A6 8272 667A 5A3A 466E A696 908A 8A9C" /* ¦¦‚rfzZ:Fn¦–�ŠŠœ */ $"90A2 ACBC 9E64 626C 908A 6C60 6688 8684" /* �¢¬¼ždbl�Šl`fˆ†„ */ $"888C 8866 585C 6472 6E6C 6C72 6C64 7290" /* ˆŒˆfX\drnllrldr� */ $"ACAE 967E 6A76 7C8A 9CA0 9684 7A70 7274" /* ¬®–~jv|Šœ –„zprt */ $"7072 88A6 AE9A 7852 5266 7882 7870 564A" /* prˆ¦®šxRRfx‚xpVJ */ $"4A52 6E7C 928C 929A 9292 9CAC A4A0 9474" /* JRn|’Œ’š’’œ¬¤ ”t */ $"7472 787E 827C 6A80 8886 7C66 5040 5060" /* trx~‚|j€ˆ†|fP@P` */ $"6C84 8E90 867A 6E72 8282 868E 8E8A 8480" /* l„Ž�†znr‚‚†ŽŽŠ„€ */ $"7888 9CA0 A6A6 9672 5042 4868 828C 949C" /* xˆœ ¦¦–rPBHh‚Œ”œ */ $"9482 6E68 7882 7A66 564A 5060 7A9E B0A8" /* ”‚nhx‚zfVJP`zž°¨ */ $"928E 807E 827A 8290 9C98 9A98 8C7E 7468" /* ’Ž€~‚z‚�œ˜š˜Œ~th */ $"5456 5658 667A 807E 8482 8290 948E 866E" /* TVVXfz€~„‚‚�”ކn */ $"5E5C 6A6E 7E8C 90A2 A292 7E76 6E6C 848E" /* ^\jn~Œ�¢¢’~vnl„Ž */ $"9488 7674 7A8E 9092 8C7C 7866 646E 747C" /* ”ˆvtzŽ�’Œ|xfdnt| */ $"7682 786C 6852 627E 8E8A 8490 8080 8084" /* v‚xlhRb~ŽŠ„�€€€„ */ $"888C 9688 9CAA A28C 7664 5054 545A 7488" /* ˆŒ–ˆœª¢ŒvdPTTZtˆ */ $"807A 767C 7870 7284 9E96 8876 6466 6C7A" /* €zv|xpr„ž–ˆvdflz */ $"82A0 9E86 6E5E 6870 86A0 B0AC 9078 5C68" /* ‚ ž†n^hp† °¬�x\h */ $"8280 7674 8486 8474 5A64 6E6E 7688 8C78" /* ‚€vt„†„tZdnnvˆŒx */ $"6852 5A72 7C88 8A8E 9C96 8A82 8C8C 828E" /* hRZr|ˆŠŽœ–Š‚ŒŒ‚Ž */ $"9EA8 A68E 6A54 585E 6474 7E86 867E 6A76" /* ž¨¦ŽjTX^dt~††~jv */ $"8C8A 9A98 8C78 6856 4C64 6470 868C 9288" /* ŒŠš˜ŒxhVLddp†Œ’ˆ */ $"745A 7092 A6B4 AA8C 7064 5E6A 8896 9494" /* tZp’¦´ªŒpd^jˆ–”” */ $"8480 8070 5E54 6472 8276 6A78 7E72 6268" /* „€€p^Tdr‚vjx~rbh */ $"789C AE96 8E8E 9490 7C88 96A8 A072 6672" /* xœ®–ŽŽ”�|ˆ–¨ rfr */ $"7260 4A4C 6478 807C 7E86 7A66 6680 A8AC" /* r`JLdx€|~†zff€¨¬ */ $"866A 5C5C 6672 7C90 A892 6E74 7684 A29C" /* †j\\fr|�¨’ntv„¢œ */ $"94AA A88A 7E76 6872 6E5C 6E8E 7E70 6A52" /* ”ª¨Š~vhrn\nŽ~pjR */ $"6686 7674 9894 7A7A 6A5A 7C8C 6C74 8E94" /* f†vt˜”zzjZ|ŒltŽ” */ $"9C96 8E96 907C 7A88 8A92 8C5A 4A62 5862" /* œ–Ž–�|zˆŠ’ŒZJbXb */ $"868C 7876 7464 7C8E 96A6 AC9C 9286 6C64" /* †Œxvtd|Ž–¦¬œ’†ld */ $"6662 666A 6E7A 867E 7278 8092 B4BA A690" /* fbfjnz†~rx€’´º¦� */ $"7C5A 586C 7276 7466 506C 8484 8A84 7686" /* |ZXlrvtfPl„„Š„v† */ $"908E 948E 6456 5E52 78AA 9C92 A08C 7696" /* �Ž”ŽdV^Rxªœ’ Œv– */ $"8A6E A29A 6674 7054 6A72 5C6E 7E78 847C" /* Šn¢šftpTjr\n~x„| */ $"6266 7266 84B4 A09A 9858 3C5E 6268 8C8E" /* bfrf„´ š˜X<^bhŒŽ */ $"88A6 9E90 9A9E 9286 806C 7E8E 625E 6A64" /* ˆ¦ž�šž’†€l~Žb^jd */ $"6C80 8284 988C 6A66 6462 7884 7884 8A6A" /* l€‚„˜Œjfdbx„x„Šj */ $"6472 7286 9090 98A4 A07E 786A 748E 8E90" /* drr†��˜¤ ~xjtŽŽ� */ $"9A92 624C 5866 8696 8A7C 8482 6660 6C80" /* š’bLXf†–Š|„‚f`l€ */ $"9890 8484 8672 5656 5E80 A09C 9A98 9688" /* ˜�„„†rVV^€ œš˜–ˆ */ $"8282 8296 968A 7A78 6E5C 5A4C 5866 6874" /* ‚‚‚––Šzxn\ZLXfht */ $"767E 7878 7C8C A2A6 A292 786A 6868 6A80" /* v~xx|Œ¢¦¢’xjhhj€ */ $"989E A098 8A86 8488 848E 9C92 805E 4A42" /* ˜ž ˜Š†„ˆ„Žœ’€^JB */ $"4C58 6A80 8C90 806E 6472 8284 8892 9282" /* LXj€Œ�€ndr‚„ˆ’’‚ */ $"7668 6472 8084 8894 9488 827E 8486 8A98" /* vhdr€„ˆ””ˆ‚~„†Š˜ */ $"9890 8066 5856 6468 7076 7680 7C72 7484" /* ˜�€fXVdhpvv€|rt„ */ $"96A0 A49E 8E78 5A4A 5462 8092 9088 8A8C" /* – ¤žŽxZJTb€’�ˆŠŒ */ $"7E7C 7A84 9698 9288 7C66 5A5E 6276 8278" /* ~|z„–˜’ˆ|fZ^bv‚x */ $"7470 7278 8082 828E 9292 9688 766C 6E76" /* tprx€‚‚Ž’’–ˆvlnv */ $"808A 8284 8680 766E 828E 9A96 7E74 685E" /* €Š‚„†€vn‚Žš–~th^ */ $"5A5E 7484 8E82 7C88 7C70 6C70 848E 9284" /* Z^t„Ž‚|ˆ|plp„Ž’„ */ $"7C76 6464 6E86 A29C 8A7E 8080 7A82 88A0" /* |vddn†¢œŠ~€€z‚ˆ  */ $"A28E 8478 7E70 6056 566C 6C70 7E84 8876" /* ¢Ž„x~p`VVllp~„ˆv */ $"7072 8492 8E80 686C 7E88 98A4 A294 8274" /* pr„’Ž€hl~ˆ˜¤¢”‚t */ $"6A74 6E6E 7482 A0AE A27E 6862 565C 768A" /* jtnnt‚ ®¢~hbV\vŠ */ $"9694 7260 6880 807C 807E 8678 6866 7886" /* –”r`h€€|€~†xhfx† */ $"7A74 7288 8E82 8C92 9C9A 928A 8894 7850" /* ztrˆŽ‚Œ’œš’Šˆ”xP */ $"485A 6466 7076 7A80 8084 909A 8A6A 647A" /* HZdfpvz€€„�šŠjdz */ $"8A88 8086 8488 8C8E 98A8 9E6C 545E 6E80" /* Šˆ€†„ˆŒŽ˜¨žlT^n€ */ $"868E 8E8C 7852 4C58 6C74 7A7C 7E84 8086" /* †ŽŽŒxRLXltz|~„€† */ $"8A80 7262 626C 7A74 6C72 8692 9AB0 A89C" /* Š€rbblztlr†’š°¨œ */ $"8C80 8AA2 B29E 8678 6C64 5C52 4446 5458" /* Œ€Š¢²ž†xld\RDFTX */ $"6E88 8274 7072 7C82 888A A0A8 9C8C 8276" /* nˆ‚tpr|‚ˆŠ ¨œŒ‚v */ $"7876 768C 9480 6A74 8A94 988A 7474 6C58" /* xvvŒ”€jtŠ”˜ŠttlX */ $"4E5C 6C74 7A8C A4AE 9E7E 7472 7C7E 6C6E" /* N\ltzŒ¤®ž~tr|~ln */ $"787C 7482 8C94 948C 8688 886C 6078 94A0" /* x|t‚Œ””Œ†ˆˆl`x”  */ $"9C88 7A84 7862 4C48 464E 5462 829A 9E96" /* œˆz„xbLHFNTb‚šž– */ $"989C A4A0 9496 9482 7260 5C66 7282 8EA2" /* ˜œ¤ ”–”‚r`\fr‚Ž¢ */ $"A48C 786C 7078 7660 5460 6A6C 6E7C 96B2" /* ¤Œxlpxv`T`jln|–² */ $"B09E 8268 5A4E 5066 827A 7678 829E A898" /* °ž‚hZNPf‚zvx‚ž¨˜ */ $"827E 7A70 7482 8C92 9494 A6BA AC78 4E38" /* ‚~zpt‚Œ’””¦º¬xN8 */ $"3A52 5A54 666E 7A8C A0AA AC9A 787E 7872" /* :RZTfnzŒ ª¬šx~xr */ $"7C7C 7474 7C6A 6E86 8E8C 8C7C 7476 7C7E" /* ||tt|jn†ŽŒŒ|tv|~ */ $"807E 7478 746C 7684 8A88 887C 808C 8672" /* €~txtlv„Šˆˆ|€Œ†r */ $"686C 7E9A 947A 6C60 5A64 7076 869C 9EA2" /* hl~š”zl`Zdpv†œž¢ */ $"AEAA A8AA A088 7862 463C 3634 4A5E 6C7C" /* ®ª¨ª ˆxbF<64J^l| */ $"8482 8AA2 A096 9078 7A86 8E8E 8E8C 868A" /* „‚Š¢ –�xz†ŽŽŽŒ†Š */ $"827C 807C 7A78 808C 9A98 887E 8076 6860" /* ‚|€|zx€Œš˜ˆ~€vh` */ $"5646 4852 688E A292 8084 8C90 8E7E 747A" /* VFHRhŽ¢’€„Œ�Ž~tz */ $"7C72 6866 6E7E 8084 8C94 9EA0 A298 9086" /* |rhfn~€„Œ”ž ¢˜�† */ $"746E 6C6C 686A 6C6A 7A7A 8284 7C7A 6E7C" /* tnllhjljzz‚„|zn| */ $"909A 9882 7A7E 8484 6856 4E50 5E68 7C8A" /* �š˜‚z~„„hVNP^h|Š */ $"9496 9CAA A4A0 9080 7C70 6458 5656 5462" /* ”–œª¤ �€|pdXVVTb */ $"7680 8884 7C80 8A86 807A 7E88 929C A29E" /* v€ˆ„|€Š†€z~ˆ’œ¢ž */ $"9082 8082 8C90 8680 867A 6862 646E 7A76" /* �‚€‚Œ�†€†zhbdnzv */ $"6454 524E 4E58 5C76 8A9C ACB4 AEAC A692" /* dTRNNX\vŠœ¬´®¬¦’ */ $"7E76 7270 7272 7070 7476 7E8A 8E9A 9690" /* ~vrprrpptv~ŠŽš–� */ $"887A 6C70 8898 9E92 7C76 7260 4E44 5066" /* ˆzlpˆ˜ž’|vr`NDPf */ $"787E 7C84 8A88 8496 A4A0 927C 6856 5C66" /* x~|„Šˆ„–¤ ’|hV\f */ $"7492 A0A8 A4A0 9474 5A58 6068 6864 6678" /* t’ ¨¤ ”tZX`hhdfx */ $"8278 747E 9294 969A 968E 7270 7A78 7678" /* ‚xt~’”–š–Žrpzxvx */ $"8086 8A7C 6A6E 7876 6C76 929A 9070 6272" /* €†Š|jnxvlv’š�pbr */ $"828C 7C78 7460 5652 6274 868E 9AAC AA96" /* ‚Œ|xt`VRbt†Žš¬ª– */ $"8686 9092 8A84 807E 7A76 7070 8086 827C" /* ††�’Š„€~zvpp€†‚| */ $"7472 747A 6A62 7886 827A 7C8C 9486 605A" /* trtzjbx†‚z|Œ”†`Z */ $"6874 7070 7E8E 927A 7088 9C98 7E70 8896" /* htpp~Ž’zpˆœ˜~pˆ– */ $"8062 6CA0 BEAA 8274 8484 765E 7C8E 7E54" /* €bl ¾ª‚t„„v^|Ž~T */ $"3448 6A74 5650 7EA8 AC88 7690 AC96 7880" /* 4HjtVP~¨¬ˆv�¬–x€ */ $"9CAA 9464 5C86 9060 4460 7C88 7260 84A6" /* œª”d\†�`D`|ˆr`„¦ */ $"A078 6678 988A 5A5C 7C82 6E5E 6CA6 CCAA" /*  xfx˜ŠZ\|‚n^l¦Ìª */ $"807C 8890 8266 7292 8254 4C64 8298 827C" /* €|ˆ�‚fr’‚TLd‚˜‚| */ $"96AA 8E5A 4660 8478 6676 8888 6848 4672" /* –ªŽZF`„xfvˆˆhHFr */ $"8E7A 729C B8AE 8E7E 9ECA BA84 6470 8670" /* Žzrœ¸®Ž~žÊº„dp†p */ $"5058 707E 5848 72A2 BE96 626C 9C96 6656" /* PXp~XHr¢¾–blœ–fV */ $"6C80 6C54 4E74 A28E 7484 A8B0 8260 7A98" /* l€lTNt¢Žt„¨°‚`z˜ */ $"987C 728A 9C94 6854 7AA0 927E 828C 8C68" /* ˜|rŠœ”hTz ’~‚ŒŒh */ $"4E5A 8296 7256 5E68 6E64 6684 9C96 888E" /* NZ‚–rV^hndf„œ–ˆŽ */ $"AABC AA8E 828A 8066 5A5E 6C66 584E 6C8A" /* ª¼ªŽ‚Š€fZ^lfXNlŠ */ $"867C 7A8C 988E 7674 8E94 8E84 8A90 8262" /* †|zŒ˜ŽvtޔބŠ�‚b */ $"4C5C 767C 7E88 928E 7C6A 708C 9E92 8076" /* L\v|~ˆ’Ž|jpŒž’€v */ $"7476 7C86 949A 8A70 6C72 7472 6862 686E" /* tv|†”šŠplrtrhbhn */ $"6A6A 6A74 7474 8296 A09A 9C98 908E 948A" /* jjjttt‚– šœ˜�ޔР*/ $"888A 7E80 7E7A 6860 6462 605C 6470 8890" /* ˆŠ~€~zh`db`\dpˆ� */ $"8A7A 767A 828A 8E8A 7660 4C54 728A 8E8E" /* Šzvz‚ŠŽŠv`LTrŠŽŽ */ $"969E A09A 928E 9088 766A 6A6A 6670 7EA0" /* –ž š’Ž�ˆvjjjfp~  */ $"AA96 7870 786A 5C58 5E72 827A 6E6E 686A" /* ª–xpxj\X^r‚znnhj */ $"7A8A 9698 8C86 98B6 B098 7462 6C78 7C7E" /* zŠ–˜Œ†˜¶°˜tblx|~ */ $"7260 585A 5E74 8884 828E A0A4 9C82 7484" /* r`XZ^tˆ„‚Ž ¤œ‚t„ */ $"8A86 7462 6060 6A76 9094 9292 867C 706C" /* Іtb``jv�”’’†|pl */ $"687A 9C9E 9280 6C68 6E72 6C68 6C6C 787E" /* hzœž’€lhnrlhllx~ */ $"8286 8884 8082 7C7A 7876 7678 8288 8684" /* ‚†ˆ„€‚|zxvvx‚ˆ†„ */ $"94AC AEAA 9A86 7870 6458 6062 5A54 5468" /* ”¬®ªš†xpdX`bZTTh */ $"7A80 8288 989A 8C76 728E 9C94 847A 7A6A" /* z€‚ˆ˜šŒvrŽœ”„zzj */ $"5C58 667A 807A 747E 8C8C 7C78 8C9A 948C" /* \Xfz€zt~ŒŒ|xŒš”Œ */ $"8A8A 8274 6266 7E82 7E84 888E 8C86 706C" /* ŠŠ‚tbf~‚~„ˆŽŒ†pl */ $"7266 5A62 747C 8288 8688 9496 8E8C 8E82" /* rfZbt|‚ˆ†ˆ”–ŽŒŽ‚ */ $"7270 747C 8086 7A6A 665A 5A68 7E86 868C" /* rpt|€†zjfZZh~††Œ */ $"8884 8888 9094 9896 887E 726E 6C70 706E" /* ˆ„ˆˆ�”˜–ˆ~rnlppn */ $"7E86 8C84 8488 8C8E 7E86 8A7E 6E62 6262" /* ~†Œ„„ˆŒŽ~†Š~nbbb */ $"605A 5E72 8288 8C92 A090 7E66 7084 887A" /* `Z^r‚ˆŒ’ �~fp„ˆz */ $"5C62 728A 8E86 8C92 9E92 9094 9C9A 7E82" /* \brŠŽ†Œ’ž’�”œš~‚ */ $"7C74 644A 4E52 6E6C 6E90 96A2 9294 9486" /* |tdJNRnln�–¢’””† */ $"8E76 7E7C 7058 3C5E 687C 7E72 8080 989C" /* Žv~|pX<^h|~r€€˜œ */ $"9EA0 8484 747E 8886 8878 827A 7A76 6A6E" /* ž „„t~ˆ†ˆx‚zzvjn */ $"7684 887E 7E7A 848C 8688 766E 5E58 6868" /* v„ˆ~~z„Œ†ˆvn^Xhh */ $"7E7A 889A A6A2 9294 8A90 8A78 6250 422C" /* ~zˆš¦¢’”Š�ŠxbPB, */ $"445E 788E 9898 9CA0 9294 928A 8086 8C8A" /* D^xŽ˜˜œ ’”’Š€†ŒŠ */ $"8C86 7874 7464 5858 7884 888E 9090 909E" /* Œ†xttdXXx„ˆŽ���ž */ $"847E 8070 5E58 6860 5E64 6C84 9296 9284" /* „~€p^Xh`^dl„’–’„ */ $"807E 7878 8488 6450 566C 808E A4A6 B0B0" /* €~xx„ˆdPVl€Ž¤¦°° */ $"9E8C 8286 7C76 7078 7864 5860 6C72 786A" /* žŒ‚†|vpxxdX`lrxj */ $"6272 8A8E 969A 8884 8886 8088 7E68 6666" /* brŠŽ–šˆ„ˆ†€ˆ~hff */ $"606A 787C 8494 A4A2 9888 7C76 686C 747A" /* `jx|„”¤¢˜ˆ|vhltz */ $"7E84 7A74 8488 8886 8278 7064 6082 AAA8" /* ~„zt„ˆˆ†‚xpd`‚ª¨ */ $"9A8E 7258 6466 5C74 9084 708E A6A4 967E" /* šŽrXdf\t�„pަ¤–~ */ $"6C6E 746A 6260 6A70 6462 7890 8C88 8CA2" /* lntjb`jpdbx�ŒˆŒ¢ */ $"AA9E 9080 887E 745E 5E78 7A6E 667A 8888" /* ªž�€ˆ~t^^xznfzˆˆ */ $"8E8C 9A94 846C 6C84 887C 645C 606C 766E" /* ŽŒš”„ll„ˆ|d\`lvn */ $"7A92 8678 7A7E 8280 8072 88A0 927A 686E" /* z’†xz~‚€€rˆ ’zhn */ $"6872 7C8C A0A6 AEA0 989E 9476 5E5E 5248" /* hr|Œ ¦® ˜ž”v^^RH */ $"4E5A 6A86 8876 7082 8C90 968C 9088 807A" /* NZj†ˆvp‚Œ�–Œ�ˆ€z */ $"7682 7870 6664 6E6E 6A72 7E8A 9090 8A88" /* v‚xpfdnnjr~Š��Šˆ */ $"867A 7C8C 9890 847A 6866 6868 748A 9288" /* †z|Œ˜�„zhfhhtŠ’ˆ */ $"7E80 8A8C 8482 8478 6C68 626C 827A 6872" /* ~€ŠŒ„‚„xlhbl‚zhr */ $"8E96 9898 8C8C 8476 686E 7A76 6A5A 5E6C" /* Ž–˜˜ŒŒ„vhnzvjZ^l */ $"6E6C 6A7C 98A8 A8A4 A69C 8A82 7E84 887E" /* nlj|˜¨¨¤¦œŠ‚~„ˆ~ */ $"5E4C 5658 647E 96AC A08C 7674 7E7C 7C76" /* ^LVXd~–¬ Œvt~||v */ $"7C82 7060 5E6C 747C 847C 848C 8C7E 7E84" /* |‚p`^lt|„|„ŒŒ~~„ */ $"8280 8084 8080 7C72 7480 8880 7E82 8C88" /* ‚€€„€€|rt€ˆ€~‚Œˆ */ $"8682 8892 928E 8486 7E62 4840 5262 7C82" /* †‚ˆ’’Ž„†~bH@Rb|‚ */ $"8EA4 A28C 7272 8490 927C 686A 6660 6072" /* ޤ¢Œrr„�’|hjf``r */ $"8C94 927E 8086 8680 7C8C 98A0 8C74 766E" /* Œ”’~€††€|Œ˜ Œtvn */ $"6260 6C7E 8482 707A 9896 8474 7E86 8676" /* b`l~„‚pz˜–„t~††v */ $"6278 8A7A 625C 788C 908A 8A9A 907C 6868" /* bxŠzb\xŒ�ŠŠš�|hh */ $"868E 7456 585A 5266 728E A8A4 908A 9C8C" /* †ŽtVXZRfrލ¤�ŠœŒ */ $"7876 7690 9C90 7E78 8074 6E6A 7488 7A6A" /* xvv�œ�~x€tnjtˆzj */ $"6472 7E88 8A80 8A88 7870 6C76 7A76 7474" /* dr~ˆŠ€Šˆxplvzvtt */ $"888C 8686 8886 746A 6880 9696 887A 7C7A" /* ˆŒ††ˆ†tjh€––ˆz|z */ $"726E 7E9A 9C88 7E78 7E84 8480 848C 765C" /* rn~šœˆ~x~„„€„Œv\ */ $"525C 6664 6C7C 92A0 9280 7A82 827C 8A94" /* R\fdl|’ ’€z‚‚|Š” */ $"9278 5C52 5C76 8488 8688 9090 9298 948C" /* ’x\R\v„ˆ†ˆ��’˜”Œ */ $"7C62 5E70 7E7A 726C 7484 9490 8E96 8872" /* |b^p~zrlt„”�Ž–ˆr */ $"6260 7288 8478 7680 8478 6E6E 808E 8284" /* b`rˆ„xv€„xnn€Ž‚„ */ $"9492 8A7E 6E6C 7E80 6E6E 7260 5054 7096" /* ”’Š~nl~€nnr`PTp– */ $"B2AA 8C7E 8084 8688 9098 8A76 7484 887E" /* ²ªŒ~€„†ˆ�˜Švt„ˆ~ */ $"6456 667C 847E 7A78 7A7A 7680 8C86 7A70" /* dVf|„~zxzzv€Œ†zp */ $"7076 7A76 6C72 7C7E 787A 7C7C 8282 8E9C" /* pvzvlr|~xz||‚‚Žœ */ $"A896 7E70 6460 6270 8CA0 A292 8682 8084" /* ¨–~pd`bpŒ ¢’†‚€„ */ $"7A6A 6664 5E56 5C6A 7680 8A9A 9C96 9084" /* zjfd^V\jv€Ššœ–�„ */ $"7E80 8C8C 8884 7E72 6C6C 6A6C 7070 7476" /* ~€ŒŒˆ„~rlljlpptv */ $"8692 9698 9286 7A74 7272 7678 7476 767E" /* †’–˜’†ztrrvxtvv~ */ $"8A98 A292 826E 686A 7078 7C7C 787A 7A78" /* Š˜¢’‚nhjpx||xzzx */ $"867E 828A 9298 8E8A 706E 6E6C 7468 766C" /* †~‚Š’˜ŽŠpnnlthvl */ $"686C 7694 929E 9080 867C 7E74 7C84 7E8C" /* hlv”’ž�€†|~t|„~Œ */ $"848A 847C 806A 746C 6C74 748C 828C 8278" /* „Š„|€jtllttŒ‚Œ‚x */ $"8478 7C78 7C80 7C84 726C 6C6E 7E7E 8C86" /* „x|x|€|„rlln~~Œ† */ $"7A74 687C 8496 9C88 7A66 6E70 7E8A 827E" /* zth|„–œˆzfnp~Š‚~ */ $"7A84 8E8C 8872 787E 7E82 706E 6E72 7676" /* z„ŽŒˆrx~~‚pnnrvv */ $"8882 7E7A 727C 888C 888C 9284 7E76 6C6E" /* ˆ‚~zr|ˆŒˆŒ’„~vln */ $"7276 727C 7E80 8E9A 9A8C 7662 646C 7678" /* rvr|~€ŽššŒvbdlvx */ $"746C 727A 808C 8E8C 8072 7478 7878 8086" /* tlrz€ŒŽŒ€rtxxx€† */ $"8E9A 8E84 7E74 7678 8086 8E8C 8488 8278" /* ŽšŽ„~tvx€†ŽŒ„ˆ‚x */ $"706C 6E70 7066 5A66 727C 8E90 887E 787A" /* plnppfZfr|Ž�ˆ~xz */ $"8698 9686 807C 808E 948C 867C 6E6C 7272" /* †˜–†€|€Ž”Œ†|nlrr */ $"7878 7474 7C7A 767C 8088 847A 7064 6C6E" /* xxtt|zv|€ˆ„zpdln */ $"727A 808C 9294 928C 8C86 8084 8A90 7E68" /* rz€Œ’”’ŒŒ†€„Š�~h */ $"5E62 6E82 8E8A 8682 807A 7A84 7E78 7068" /* ^bn‚ŽŠ†‚€zz„~xph */ $"7276 7E7E 7E82 807E 7874 7882 8A88 8A8C" /* rv~~~‚€~xtx‚ŠˆŠŒ */ $"9090 8686 807E 726C 6E6A 787C 7E84 8476" /* ��††€~rlnjx|~„„v */ $"6462 686C 7A7E 7E82 888A 8890 8E8A 8E88" /* dbhlz~~‚ˆŠˆ�ŽŠŽˆ */ $"867C 7A72 7278 8090 887C 7670 707A 7C74" /* †|zrrx€�ˆ|vppz|t */ $"7470 686E 7680 8C92 8C86 8484 8282 8280" /* tphnv€Œ’Œ†„„‚‚‚€ */ $"7870 7076 787A 848E 9898 8C78 7272 7072" /* xppvxz„Ž˜˜Œxrrpr */ $"7A78 7872 686A 7486 8682 7C7A 7A72 7274" /* zxxrhjt††‚|zzrrt */ $"7678 7C82 848C 8A84 888A 8880 7E8C 9696" /* vx|‚„ŒŠ„ˆŠˆ€~Œ–– */ $"8E82 706A 6C6A 6A7A 8276 7276 7476 868C" /* Ž‚pjljjz‚vrvtv†Œ */ $"9692 9284 7672 6E76 7480 7E74 7270 6E68" /* –’’„vrnvt€~trpnh */ $"787E 8698 9284 7672 707A 9498 8E86 7A7E" /* x~†˜’„vrpz”˜Ž†z~ */ $"8486 7470 7874 7874 7C7E 7A78 7280 8C92" /* „†tpxtxt|~zxr€Œ’ */ $"907E 7670 6C68 7282 8C92 9090 8C78 6666" /* �~vplhr‚Œ’��Œxff */ $"7072 6C72 707A 8072 6C82 A2AE A48A 7A74" /* prlrpz€rl‚¢®¤Šzt */ $"6458 6688 9A92 7A62 6676 6C68 7692 A8A0" /* dXfˆš’zbfvlhv’¨  */ $"8E88 8E8A 7A7C 8496 8E74 6468 7C78 7270" /* ŽˆŽŠz|„–Žtdh|xrp */ $"7E8C 7C64 5A68 7476 7672 808A 8078 7E88" /* ~Œ|dZhtvvr€Š€x~ˆ */ $"8C8C 9498 A49C 846A 5E66 6A76 8490 9484" /* ŒŒ”˜¤œ„j^fjv„�”„ */ $"7872 7274 7474 7682 887A 6A6A 7A84 949A" /* xrrtttv‚ˆzjjz„”š */ $"8C84 7460 565E 7684 9294 9496 928A 807C" /* Œ„t`V^v„’””–’Š€| */ $"7C86 8070 686A 6C6E 767C 8484 7E6E 6C70" /* |†€phjlnv|„„~nlp */ $"7278 8290 969E 9A90 8672 6A66 768C 908C" /* rx‚�–žš�†rjfvŒ�Œ */ $"8A8A 7C6E 6A68 7280 8E7A 6C6C 6A6A 7280" /* ŠŠ|njhr€Žzlljjr€ */ $"808A 9A98 887E 7670 747C 8686 8074 6866" /* €Šš˜ˆ~vpt|††€thf */ $"7086 8E8E 8A86 8482 887E 7A7C 7C7E 828C" /* p†ŽŽŠ†„‚ˆ~z||~‚Œ */ $"8076 7072 767C 7C78 7674 7A70 787C 847E" /* €vprv||xvtzpx|„~ */ $"7C86 8280 727A 7C88 8E8C 8E9C 9E7A 665E" /* |†‚€rz|ˆŽŒŽœžzf^ */ $"646A 7A74 7480 807E 788C 8E94 8E8A 8C82" /* djztt€€~xŒŽ”ŽŠŒ‚ */ $"887A 7872 7876 7278 6866 626E 7A86 8680" /* ˆzxrxvrxhfbnz††€ */ $"888C 867C 8286 9088 8276 7074 706E 6478" /* ˆŒ†|‚†�ˆ‚vptpndx */ $"7C84 8C88 8E82 7C76 767E 8084 8082 7E76" /* |„ŒˆŽ‚|vv~€„€‚~v */ $"767C 8888 8A8A 8C90 806A 6064 7C86 7E78" /* v|ˆˆŠŠŒ�€j`d|†~x */ $"767C 7874 7680 9492 847A 787A 7E7E 7A7A" /* v|xtv€”’„zxz~~zz */ $"7A70 605E 6C72 747A 8496 A29C 908E 908A" /* zp`^lrtz„–¢œ�Ž�Š */ $"8282 888E 806E 6E76 7A6C 6264 7686 7E78" /* ‚‚ˆŽ€nnvzlbdv†~x */ $"7278 7E78 7078 807A 7C7E 828A 887A 7686" /* rx~xpx€z|~‚Šˆzv† */ $"9090 8874 707A 8284 8C8C 7E6A 6A78 8080" /* ��ˆtpz‚„ŒŒ~jjx€€ */ $"7E7C 828C 8A7A 747C 8684 786E 6668 6468" /* ~|‚ŒŠzt|†„xnfhdh */ $"7078 8484 8490 9EA2 9A8C 8280 847E 7878" /* px„„„�ž¢šŒ‚€„~xx */ $"7672 7676 767E 7674 767A 7C7C 7C78 7E80" /* vrvvv~vtvz|||x~€ */ $"8076 787E 7C84 8282 8082 8A8E 9086 726A" /* €vx~|„‚‚€‚ŠŽ�†rj */ $"6A78 868C 8678 7066 6E7C 8492 9690 8686" /* jx†Œ†xpfn|„’–�†† */ $"7C70 7266 5C5E 5A64 7484 888C 908C 9292" /* |prf\^Zdt„ˆŒ�Œ’’ */ $"8E8E 908E 888A 8084 8A80 7068 6A6C 706E" /* ŽŽ�ŽˆŠ€„Š€phjlpn */ $"686A 767C 8082 8684 7C74 7884 827A 726E" /* hjv|€‚†„|tx„‚zrn */ $"707C 868E 9698 8C84 827C 767A 7670 787E" /* p|†Ž–˜Œ„‚|vzvpx~ */ $"7A78 7670 7078 8A8E 8C80 767E 8284 8084" /* zxvppxŠŽŒ€v~‚„€„ */ $"8278 6C5C 5C6A 7680 848C 969C 9A9C A29A" /* ‚xl\\jv€„Œ–œšœ¢š */ $"8A7A 7470 6A6A 5E5C 5E64 6A72 8A94 8880" /* Šztpjj^\^djrŠ”ˆ€ */ $"848A 8482 7C78 8084 827E 868E 8078 7C8C" /* „Š„‚|x€„‚~†Ž€x|Œ */ $"9692 8A78 7A7E 7272 747E 817A 6C62 6C74" /* –’Šxz~rrt~�zlblt */ $"7678 7880 8081 8F97 998D 8074 6872 7270" /* vxx€€��—™�€thrrp */ $"6C6E 7678 8B99 9B93 8D91 8B8D 8576 6C60" /* lnvx‹™›“�‘‹�…vl` */ $"6670 7C81 7266 5E6A 7A7C 8180 8381 8083" /* fp|�rf^jz|�€ƒ�€ƒ */ $"8997 8B85 8078 7268 686C 7E8B 8587 898F" /* ‰—‹…€xrhhl~‹…‡‰� */ $"8D81 7E78 6E64 6676 8083 7C6E 7485 8F85" /* ��~xndfv€ƒ|nt…�… */ $"8383 7E78 747C 857E 6E64 7081 857A 707E" /* ƒƒ~xt|…~ndp�…zp~ */ $"8F91 8D85 8B8D 8376 7480 7E78 747A 7C70" /* �‘�…‹�ƒvt€~xtz|p */ $"625C 6A7A 7C7E 8389 8D8F 938D 8B81 7674" /* b\jz|~ƒ‰��“�‹�vt */ $"747C 7872 7281 8D87 8376 6C6C 787A 7C81" /* t|xrr��‡ƒvllxz|� */ $"7A80 8B8F 8781 786E 6E70 767E 807E 7C81" /* z€‹�‡�xnnpv~€~|� */ $"8585 7E6E 727E 7E76 767C 7C83 8989 9399" /* ……~nr~~vv||ƒ‰‰“™ */ $"9589 8781 7066 626E 8087 7A68 6C76 7C7A" /* •‰‡�pfbn€‡zhlv|z */ $"7881 7A74 7278 8389 8778 7480 8180 8085" /* x�ztrxƒ‰‡xt€�€€… */ $"8985 8587 918F 857E 7678 7268 6476 8985" /* ‰……‡‘�…~vxrhdv‰… */ $"786C 6C70 706E 7687 9797 9591 8B7A 645C" /* xllppnv‡——•‘‹zd\ */ $"6278 7E78 7883 8B85 8589 9395 8776 747E" /* bx~xxƒ‹……‰“•‡vt~ */ $"8378 6E76 7E78 6A68 6872 7A74 7881 8F83" /* ƒxnv~xjhhrztx��ƒ */ $"7E81 8785 7870 7487 9389 807C 8183 8085" /* ~�‡…xpt‡“‰€|�ƒ€… */ $"8F8F 7E6C 6C74 817A 686A 7A81 7E76 7076" /* ��~llt�zhjz�~vpv */ $"7C76 7487 9D97 8178 7E80 786E 6A76 8581" /* |vt‡�—�x~€xnjv…� */ $"7878 8B99 8D81 7876 7270 7881 8987 7670" /* xx‹™��xvrpx�‰‡vp */ $"767C 7258 5260 7685 8F9B A3A5 8B7A 7E81" /* v|rXR`v…�›£¥‹z~� */ $"806C 6872 818D 7876 7A80 857C 7E83 8B7E" /* €lhr��xvz€…|~ƒ‹~ */ $"6C76 7A85 857C 7E7C 806A 626A 7280 7C7C" /* lvz……|~|€jbjr€|| */ $"8393 998B 877C 7A78 6E72 7E8B 8174 767E" /* ƒ“™‹‡|zxnr~‹�tv~ */ $"8D8D 8380 8081 7E78 7878 7866 666A 7076" /* ��ƒ€€�~xxxxffjpv */ $"6E72 7C93 9D93 958D 8778 7072 7489 8B8B" /* nr|“�“•�‡xprt‰‹‹ */ $"938F 836C 646C 7A7E 747A 808B 8D81 817E" /* “�ƒldlz~tz€‹���~ */ $"7C66 5D64 6C76 706E 8097 978D 8D8F 8D87" /* |f]dlvpn€——����‡ */ $"7466 6C72 7072 7E81 7C76 7885 9591 8781" /* tflrpr~�|vx…•‘‡� */ $"7E81 8178 747A 7872 7274 7674 7274 8091" /* ~��xtzxrrtvtrt€‘ */ $"938D 7C76 7A76 6E74 7C80 878D 817E 817C" /* “�|vzvnt|€‡��~�| */ $"7680 8785 7C7A 7A83 8983 766A 6868 707A" /* v€‡…|zzƒ‰ƒvjhhpz */ $"8380 7A78 7C89 8B85 7674 7C81 878B 8D8D" /* ƒ€zx|‰‹…vt|�‡‹�� */ $"8D89 7E70 6E68 6268 7889 9595 8780 7A72" /* �‰~pnhbhx‰••‡€zr */ $"6C64 6A72 7A76 7270 7487 9DA2 9989 7C6C" /* ldjrzvrpt‡�¢™‰|l */ $"6E76 7C7E 7A74 7481 8989 8076 7A7E 7E7E" /* nv|~ztt�‰‰€vz~~~ */ $"8389 8783 837E 817A 6662 6E70 6E72 7689" /* ƒ‰‡ƒƒ~�zfbnpnrv‰ */ $"9795 8981 8383 7A76 7885 857C 7E83 806E" /* —•‰�ƒƒzvx……|~ƒ€n */ $"5B57 6889 9B97 8D8D 8578 7078 8583 7A70" /* [Wh‰›—��…xpx…ƒzp */ $"666E 7C7C 7C81 8D85 7876 7481 898D 8B8F" /* fn|||��…xvt�‰�‹� */ $"8D80 7A76 786C 6266 7487 8B81 787A 8078" /* �€zvxlbft‡‹�xz€x */ $"7074 767C 7466 7081 897E 8087 97A4 9D89" /* ptv|tfp�‰~€‡—¤�‰ */ $"8183 7E78 7A7C 7E7A 706A 6661 626A 7E93" /* �ƒ~xz|~zpjfabj~“ */ $"9F91 8385 837C 7C7E 7C7C 7666 6874 787A" /* Ÿ‘ƒ…ƒ||~||vfhtxz */ $"8183 8B8D 7C70 7C85 898B 837E 8081 7876" /* �ƒ‹�|p|…‰‹ƒ~€�xv */ $"7E76 7678 7883 8D87 7A76 7472 7676 7881" /* ~vvxxƒ�‡zvtrvvx� */ $"817E 7E7C 7C83 8781 8783 7870 6E74 7A85" /* �~~||ƒ‡�‡ƒxpntz… */ $"807E 8178 766E 6C72 7A83 8595 9B8D 877C" /* €~�xvnlrzƒ…•›�‡| */ $"7883 8B87 7A7A 6861 6468 767E 8076 7A80" /* xƒ‹‡zzhadhv~€vz€ */ $"818D 8B89 8983 7C76 7874 787C 7276 8083" /* ��‹‰‰ƒ|vxtx|rv€ƒ */ $"878B 8778 6E69 6974 7E89 8783 7E7C 807A" /* ‡‹‡xniit~‰‡ƒ~|€z */ $"8180 7E7E 8081 8389 8381 878B 8981 786B" /* �€~~€�ƒ‰ƒ�‡‹‰�xk */ $"6163 6976 8D94 938B 837E 7674 6C70 7272" /* aciv�”“‹ƒ~vtlprr */ $"706E 747C 837A 7272 7880 898F 9391 8F89" /* pnt|ƒzrrx€‰�“‘�‰ */ $"898B 8580 7672 7278 7C80 817C 7672 747A" /* ‰‹…€vrrx|€�|vrtz */ $"7A74 6E78 8581 7C7A 7878 7876 7889 938F" /* ztnx…�|zxxxvx‰“� */ $"8983 8180 7E76 727A 706B 696C 7883 8B89" /* ‰ƒ�€~vrzpkilxƒ‹‰ */ $"8F8F 8583 7A7A 7472 7078 8787 8372 6C74" /* ��…ƒzztrpx‡‡ƒrlt */ $"7A78 727C 7C81 8B8B 919C 9C8D 7C74 6C6C" /* zxr||�‹‹‘œœ�|tll */ $"6E69 6B6C 7680 878B 8381 766E 6C70 7E85" /* niklv€‡‹ƒ�vnlp~… */ $"8F8B 8180 8081 7C74 7476 8185 8D89 8383" /* �‹�€€�|ttv�…�‰ƒƒ */ $"7674 767E 7C76 807E 8387 8380 7C7A 7072" /* vtv~|v€~ƒ‡ƒ€|zpr */ $"7A7C 8580 7A80 817A 6E6E 6E70 7672 7E8D" /* z|…€z€�znnnpvr~� */ $"9693 8787 8985 766C 7278 7E7C 7880 8583" /* –“‡‡‰…vlrx~|x€…ƒ */ $"787C 8580 7A6B 6B76 8081 818F 9896 8F83" /* x|…€zkkv€���˜–�ƒ */ $"7C72 6C65 6574 7E80 7C83 8987 7E74 6E74" /* |rleet~€|ƒ‰‡~tnt */ $"7C7A 787E 8583 7C7A 8183 817C 7878 7C7C" /* |zx~…ƒ|z�ƒ�|xx|| */ $"767A 8080 7E78 7A7E 8385 898D 8D8B 817E" /* vz€€~xz~ƒ…‰��‹�~ */ $"7A78 7A72 767E 8180 786B 6769 6C70 767C" /* zxzrv~�€xkgilpv| */ $"8187 8381 8385 8381 807E 807C 726C 6E78" /* �‡ƒ�ƒ…ƒ�€~€|rlnx */ $"808B 9698 9385 7A6C 6B69 707C 8185 8789" /* €‹–˜“…zlkip|�…‡‰ */ $"8789 8178 7A78 706C 6C6C 727C 8387 8B89" /* ‡‰�xzxplllr|ƒ‡‹‰ */ $"8174 696E 7A80 8D96 8F81 7E74 6971 7A7A" /* �tinz€�–��~tiqzz */ $"838D 8980 7C76 7276 7A7E 8387 8985 7C78" /* ƒ�‰€|vrvz~ƒ‡‰…|x */ $"8080 7C80 7E76 7671 717A 8787 8389 8583" /* €€|€~vvqqz‡‡ƒ‰…ƒ */ $"7C78 6F6B 7172 7C80 8484 7C74 787C 7C7C" /* |xokqr|€„„|tx||| */ $"7878 7C82 7C7C 8691 9591 8E7E 786D 5E65" /* xx|‚||†‘•‘Ž~xm^e */ $"7688 8888 8888 806F 6265 747E 807E 8284" /* vˆˆˆˆˆ€obet~€~‚„ */ $"8074 727C 8284 7E74 787E 7C78 808A 8E86" /* €tr|‚„~tx~|x€ŠŽ† */ $"7E78 7C78 7169 7180 8A82 7A80 8886 8284" /* ~x|xqiq€Š‚z€ˆ†‚„ */ $"8F9B 917E 6F6F 6B60 5A62 7888 827A 7E84" /* �›‘~ook`Zbxˆ‚z~„ */ $"807A 7684 918E 7871 7276 716D 788C 9588" /* €zv„‘ŽxqrvqmxŒ•ˆ */ $"786F 767C 7676 8093 938E 8682 8476 6562" /* xov|vv€““ކ‚„veb */ $"6B76 7476 7C86 8F88 8284 8880 7267 6574" /* kvtv|†�ˆ‚„ˆ€rget */ $"8084 8E99 978A 8076 7276 716D 767C 807E" /* €„Ž™—Š€vrvqmv|€~ */ $"786F 6F69 6372 828E 8A80 7874 807E 8086" /* xooicr‚ŽŠ€xt€~€† */ $"8C8E 827E 7A80 8880 7C78 787C 7672 7480" /* ŒŽ‚~z€ˆ€|xx|vrt€ */ $"8482 8682 807C 746F 7282 8286 8074 6D67" /* „‚†‚€|tor‚‚†€tmg */ $"6B71 808A 807A 7472 787E 8486 8E93 8E8E" /* kq€Š€ztrx~„†Ž“ŽŽ */ $"8A88 7E74 7274 7E86 8A82 7E74 6562 676D" /* Šˆ~trt~†Š‚~tebgm */ $"717A 8080 8288 8686 8484 8284 8480 7871" /* qz€€‚ˆ††„„‚„„€xq */ $"7172 7C86 8C8A 786D 6A71 8086 8A8A 867C" /* qr|†ŒŠxmjq€†ŠŠ†| */ $"716F 7880 807E 8082 807E 7876 7678 767C" /* qox€€~€‚€~xvvxv| */ $"8882 786D 6D78 8288 8282 8C8C 8280 8082" /* ˆ‚xmmx‚ˆ‚‚ŒŒ‚€€‚ */ $"7A6F 6B71 7874 6F6B 7171 6D6F 8098 988C" /* zokqxtokqqmo€˜˜Œ */ $"8080 888C 8E8C 8C88 7666 6878 8680 7674" /* €€ˆŒŽŒŒˆvfhx†€vt */ $"7C7E 746F 6D7A 8080 8288 8A7C 7171 7C88" /* |~tomz€€‚ˆŠ|qq|ˆ */ $"847C 7C7E 7C72 6D71 7C82 7C7C 8084 8480" /* „||~|rmq|‚||€„„€ */ $"8686 8A80 787E 848C 8278 7A7C 807E 7A7A" /* ††Š€x~„Œ‚xz|€~zz */ $"7266 5C60 707C 8480 888F 908C 8080 8082" /* rf\`p|„€ˆ��Œ€€€‚ */ $"8080 8682 786E 6871 7A7C 7878 7C78 7A7C" /* €€†‚xnhqz|xx|xz| */ $"848F 928D 8080 7C7A 7C7E 8884 7E73 6E7A" /* „�’�€€|z|~ˆ„~snz */ $"7C78 706C 717A 807E 7E82 8480 8088 8F92" /* |xplqz€~~‚„€€ˆ�’ */ $"8B7E 7878 7A73 6C6E 6E73 7174 7A7C 7A78" /* ‹~xxzslnnsqtz|zx */ $"7880 8A8B 8A8D 8F88 807C 7C88 8F82 7370" /* x€Š‹Š��ˆ€||ˆ�‚sp */ $"7378 7E7C 7A7A 7167 6A74 8082 8080 8082" /* sx~|zzqgjt€‚€€€‚ */ $"8080 8482 8080 8086 887E 6A68 6C72 7474" /* €€„‚€€€†ˆ~jhlrtt */ $"8086 8886 8286 8888 7E74 7C80 807A 8084" /* €†ˆ†‚†ˆˆ~t|€€z€„ */ $"807C 7272 7C7C 7469 6C74 7C80 808A 8B86" /* €|rr||tilt|€€Š‹† */ $"8484 8A8B 8678 7278 7672 6E6E 7476 7A7A" /* „„Š‹†xrxvrnntvzz */ $"8082 7E76 747C 868A 8A88 8C8A 8480 7878" /* €‚~vt|†ŠŠˆŒŠ„€xx */ $"7874 7278 7C78 7478 7E88 8074 747C 8286" /* xtrx|xtx~ˆ€tt|‚† */ $"8682 8484 7C7A 7C80 807C 7E7E 7E78 7474" /* †‚„„|z|€€|~~~xtt */ $"747E 7A76 7A7C 7A7A 8084 8480 7A7C 8282" /* t~zvz|zz€„„€z|‚‚ */ $"8282 8080 8689 8480 7674 767C 7E78 7A76" /* ‚‚€€†‰„€vtv|~xzv */ $"7876 7880 8080 7E82 8486 8075 7070 6C6B" /* xvx€€€~‚„†€upplk */ $"7280 8688 8280 807E 7A76 7E84 8686 8080" /* r€†ˆ‚€€~zv~„††€€ */ $"8484 8080 8484 807C 7874 706C 6C72 7A80" /* „„€€„„€|xtpllrz€ */ $"7E78 7E84 8889 8988 8280 7E76 787C 7C75" /* ~x~„ˆ‰‰ˆ‚€~vx||u */ $"7478 7C76 706C 7078 8286 8688 8982 7C7C" /* tx|vplpx‚††ˆ‰‚|| */ $"7575 7E7C 8289 867A 7276 7C80 8080 8482" /* uu~|‚‰†zrv|€€€„‚ */ $"807E 7C80 807C 767E 8682 7C76 7478 7E78" /* €~|€€|v~†‚|vtx~x */ $"7275 7C80 7C7A 7E80 807C 8080 7E78 7578" /* ru|€|z~€€|€€~xux */ $"828A 8882 8482 7E75 7478 7E84 8482 8480" /* ‚Šˆ‚„‚~utx~„„‚„€ */ $"786C 6A70 787C 7880 8484 7E78 7C7C 8484" /* xljpx|x€„„~x||„„ */ $"807C 7876 6F77 8288 887C 787C 7E7E 7878" /* €|xvow‚ˆˆ|x|~~xx */ $"7E82 8884 8882 7C70 707C 848A 847E 7C7E" /* ~‚ˆ„ˆ‚|pp|„Š„~|~ */ $"8077 7678 7E7E 7A78 787A 7672 7A8A 908C" /* €wvx~~zxxzvrzŠ�Œ */ $"7E77 7678 7270 7784 8880 7C7E 7C7A 797E" /* ~wvxrpw„ˆ€|~|zy~ */ $"8890 8876 7279 7977 7679 8288 8079 7E80" /* ˆ�ˆvryywvy‚ˆ€y~€ */ $"8280 7C80 847E 716E 7680 8680 7E86 847A" /* ‚€|€„~qnv€†€~†„z */ $"6E6E 7680 8784 878A 8477 6C6E 7174 7271" /* nnv€‡„‡Š„wlnqtrq */ $"7E87 8882 7977 7980 8284 8782 7972 7980" /* ~‡ˆ‚ywy€‚„‡‚yry€ */ $"878A 8688 8A84 796E 6C6F 797A 7980 807E" /* ‡Š†ˆŠ„ynloyzy€€~ */ $"7777 7C80 847C 7C7E 807C 777E 868C 8A82" /* ww|€„||~€|w~†ŒŠ‚ */ $"766E 6C6E 6F7A 8082 8082 8486 8679 7679" /* vnlnoz€‚€‚„††yvy */ $"8087 8682 7E80 7C76 797A 807E 7979 7C80" /* €‡†‚~€|vyz€~yy|€ */ $"7974 747E 8884 7C7A 8080 7A7C 8087 8880" /* ytt~ˆ„|z€€z|€‡ˆ€ */ $"7974 7A79 777E 878A 7E73 7173 777A 7A7E" /* ytzyw~‡Š~sqswzz~ */ $"8284 8084 888A 8780 7E7C 7C74 6D6E 7177" /* ‚„€„ˆŠ‡€~||tmnqw */ $"7C82 8786 7C76 7473 797E 7E80 8486 8484" /* |‚‡†|vtsy~~€„†„„ */ $"8280 7976 7676 7779 7C7C 7E7C 7A7E 8487" /* ‚€yvvvwy||~|z~„‡ */ $"8784 7E79 797C 8086 8887 8077 7676 777A" /* ‡„~yy|€†ˆ‡€wvvwz */ $"7C7C 7C7C 7C79 7373 7479 8082 807E 8082" /* |||||yssty€‚€~€‚ */ $"8486 8787 8480 7971 7374 747A 8080 8080" /* „†‡‡„€yqsttz€€€€ */ $"7A79 8084 8080 8080 8486 827C 7671 7176" /* zy€„€€€€„†‚|vqqv */ $"797C 7A79 7779 8084 8A82 7E7C 7C82 8480" /* y|zywy€„Š‚~||‚„€ */ $"777C 8080 807E 7673 7371 757C 8080 8080" /* w|€€€~vssqu|€€€€ */ $"7C7A 7980 8887 8480 7C77 7E84 8487 857E" /* |zy€ˆ‡„€|w~„„‡…~ */ $"7675 767A 7E76 6F75 7C80 7975 7577 7A7E" /* vuvz~vou|€yuuwz~ */ $"8087 8A8D 8B87 8580 7771 7175 7576 7677" /* €‡Š�‹‡…€wqquuvvw */ $"8084 807C 8080 8087 8887 8480 7C80 8A86" /* €„€|€€€‡ˆ‡„€|€Š† */ $"7A6D 656A 737C 8080 7E7E 7C7C 8080 7C7C" /* zmejs|€€~~||€€|| */ $"7E80 8282 8080 8484 8480 7C78 757B 8080" /* ~€‚‚€€„„„€|xu{€€ */ $"7E78 7C80 8280 7B78 787E 807C 7E7E 7C7C" /* ~x|€‚€{xx~€|~~|| */ $"8489 857E 7571 787B 7975 7579 7578 7B80" /* „‰…~uqx{yuuyux{€ */ $"8485 8682 8688 8680 8082 8079 716C 6F79" /* „…†‚†ˆ†€€‚€yqloy */ $"7C7E 8082 8280 8080 8480 7976 7C84 8580" /* |~€‚‚€€€„€yv|„…€ */ $"797B 807C 7B73 7175 767C 848E 8982 7B75" /* y{€|{squv|„މ‚{u */ $"797B 7B7B 7B80 7E80 8084 8682 7C76 7371" /* y{{{{€~€€„†‚|vsq */ $"6D71 767C 807E 7E7C 8082 807E 7C80 828B" /* mqv|€~~|€‚€~|€‚‹ */ $"8F89 8680 7B7C 7C78 7373 7171 757B 7E7B" /* �‰†€{||xssqqu{~{ */ $"787B 8085 8885 7E7E 7C79 7C80 827E 7973" /* x{€…ˆ…~~|y|€‚~ys */ $"7378 7C80 888D 8D82 7B79 7C79 7877 787B" /* sx|€ˆ��‚{y|yxwx{ */ $"7978 7986 8984 7E7E 8584 796E 6F77 7C7E" /* yxy†‰„~~…„ynow|~ */ $"7E82 8580 7878 7E84 8582 868D 9186 7B75" /* ~‚…€xx~„…‚†�‘†{u */ $"7571 6A68 6E78 7C7C 7E80 8684 7C80 8889" /* uqjhnx||~€†„|€ˆ‰ */ $"7C75 7780 8989 8584 8279 6F73 8086 827C" /* |uw€‰‰…„‚yos€†‚| */ $"7B80 8880 7371 777B 7878 7E80 7C75 757E" /* {€ˆ€sqw{xx~€|uu~ */ $"8687 8080 8586 7C78 7E7E 8075 6C74 7C7C" /* †‡€€…†|x~~€ult|| */ $"7980 8285 867E 838F 8B7E 7470 7580 807B" /* y€‚…†~ƒ�‹~tpu€€{ */ $"807C 7574 757B 8083 7B7C 8682 807C 7C7E" /* €|utu{€ƒ{|†‚€||~ */ $"827E 7574 7472 7278 828B 8C87 8686 827B" /* ‚~uttrrx‚‹Œ‡††‚{ */ $"7272 787C 807E 7C7B 7B77 797E 7C78 7479" /* rrx|€~|{{wy~|xty */ $"858D 8F87 807E 7B79 7475 7874 7475 7E86" /* …��‡€~{ytuxttu~† */ $"8B89 8386 807B 777A 8083 807E 807C 7A75" /* ‹‰ƒ†€{wz€ƒ€~€|zu */ $"737B 8280 807E 7C7E 7A73 7783 8683 807B" /* s{‚€€~|~zswƒ†ƒ€{ */ $"7A80 807B 8282 7775 777E 8580 7E80 8687" /* z€€{‚‚wuw~…€~€†‡ */ $"857C 7A7B 7570 717A 7E80 7E7B 8587 807B" /* …|z{upqz~€~{…‡€{ */ $"7B7E 7C7C 7775 7C7E 7C7C 8387 8683 7C7B" /* {~||wu|~||ƒ‡†ƒ|{ */ $"7A77 777B 8991 8D80 7370 7071 757B 807C" /* zww{‰‘�€sppqu{€| */ $"7A78 7E86 8785 807E 7E7A 7877 8086 8787" /* zx~†‡…€~~zxw€†‡‡ */ $"8380 7C78 7575 7A7B 7875 7A7C 7C7C 7A78" /* ƒ€|xuuz{xuz|||zx */ $"7E80 807C 8083 868B 8987 8078 7375 7A7A" /* ~€€|€ƒ†‹‰‡€xsuzz */ $"7776 7980 8080 8282 827C 7777 7A80 8286" /* wvy€€€‚‚‚|wwz€‚† */ $"8786 8076 7676 7C7C 7A7A 777A 7B7E 8080" /* ‡†€vvv||zzwz{~€€ */ $"7B77 7A80 8280 7B80 8387 8A82 7C7A 7B7B" /* {wz€‚€{€ƒ‡Š‚|z{{ */ $"7B82 8080 7E7A 7A7B 7B75 7677 777C 7E80" /* {‚€€~zz{{uvww|~€ */ $"8286 8683 8080 7C7B 7A79 7976 777A 7C83" /* ‚††ƒ€€|{zyyvwz|ƒ */ $"8785 807C 7B7B 7E80 8083 8686 807A 726E" /* ‡…€|{{~€€ƒ††€zrn */ $"7272 777C 807E 7B82 8387 8780 7A7B 807B" /* rrw|€~{‚ƒ‡‡€z{€{ */ $"7B7E 8286 8682 807E 7C77 767A 7C7E 7779" /* {~‚††‚€~|wvz|~wy */ $"7B80 807B 7B7B 807E 7A80 8080 807E 8285" /* {€€{{{€~z€€€€~‚… */ $"837E 7B80 8280 7975 777A 7B75 777D 8080" /* ƒ~{€‚€yuwz{uw}€€ */ $"7E82 8589 827A 8080 7B74 6E72 7A7E 7A77" /* ~‚…‰‚z€€{tnrz~zw */ $"7D80 8685 8589 8A85 7D7E 8085 8680 8082" /* }€†……‰Š…}~€…†€€‚ */ $"8276 7070 717B 7D7B 7E80 807A 7979 7979" /* ‚vppq{}{~€€zyyyy */ $"7475 8086 8683 8689 8E8A 807B 7B7B 7672" /* tu€††ƒ†‰ŽŠ€{{{vr */ $"7579 7D7B 7B7D 8080 7A77 7A82 807D 7E80" /* uy}{{}€€zwz‚€}~€ */ $"8280 7976 7B7E 7E80 8387 837A 757A 8080" /* ‚€yv{~~€ƒ‡ƒzuz€€ */ $"7D7D 7D7E 7B79 7D85 867E 7777 7B7D 7979" /* }}}~{y}…†~ww{}yy */ $"7D80 7D7B 8085 8780 797A 7E80 7B7B 7E80" /* }€}{€…‡€yz~€{{~€ */ $"807D 8287 8780 7774 767A 7A79 7D80 7B77" /* €}‚‡‡€wtvzzy}€{w */ $"7A80 8180 7B7A 8187 8884 8483 807A 7679" /* z€�€{z�‡ˆ„„ƒ€zvy */ $"7A79 746F 7279 7E80 8183 817E 7D7E 8081" /* zytory~€�ƒ�~}~€� */ $"817D 7A7B 7D7D 7D80 7E7B 7E81 8487 8781" /* �}z{}}}€~{~�„‡‡� */ $"7A77 777B 7D7B 7672 757A 7E80 8384 817D" /* zww{}{vruz~€ƒ„�} */ $"7B7A 7B7D 7B79 7D80 8080 8080 7D7A 7979" /* {z{}{y}€€€€€}zyy */ $"8086 8482 8282 8080 7E7E 7B75 7270 7580" /* €†„‚‚‚€€~~{urpu€ */ $"817D 7A7E 8080 8281 8080 8080 8289 8680" /* �}z~€€‚�€€€€‚‰†€ */ $"7A76 7878 787B 7E7E 7D7A 797D 807B 7A7D" /* zvxxx{~~}zy}€{z} */ $"7D7A 7878 787D 8080 8184 8887 8380 7E80" /* }zxxx}€€�„ˆ‡ƒ€~€ */ $"8080 807E 7B78 7576 7879 7A7D 8080 8383" /* €€€~{xuvxyz}€€ƒƒ */ $"8380 7A75 7479 7A79 797B 7D80 8284 8683" /* ƒ€zutyzyy{}€‚„†ƒ */ $"7E79 797B 7A79 8086 8782 7D7B 7A7E 7A76" /* ~yy{zy€†‡‚}{z~zv */ $"797E 8080 8081 8280 7A76 797B 7B78 7678" /* y~€€€�‚€zvy{{xvx */ $"7D80 8188 8884 817D 8080 8079 7070 7178" /* }€�ˆˆ„�}€€€yppqx */ $"7B7E 8080 807B 7D80 8186 8080 7E7D 8181" /* {~€€€{}€�†€€~}�� */ $"837D 7D7D 767B 7D80 7D7B 7B76 7D80 7B7E" /* ƒ}}}v{}€}{{v}€{~ */ $"7E7E 7D7E 8080 8278 7476 7B83 8282 8282" /* ~~}~€€‚xtv{ƒ‚‚‚‚ */ $"817B 7E7D 7D7B 7476 7B7E 7B79 8081 817D" /* �{~}}{tv{~{y€��} */ $"797E 8284 8281 8281 807B 7B7B 7975 7076" /* y~‚„‚�‚�€{{{yupv */ $"7B82 8482 8083 8380 7E7D 7B79 7976 7879" /* {‚„‚€ƒƒ€~}{yyvxy */ $"7876 7B80 8687 8380 7B7D 7E7E 8083 8481" /* xv{€†‡ƒ€{}~~€ƒ„� */ $"8080 7E7D 7B79 797D 7B78 777E 8382 807B" /* €€~}{yy}{xw~ƒ‚€{ */ $"7B7D 7D7B 777B 7D7D 7E84 8583 807B 7E81" /* {}}{w{}}~„…ƒ€{~� */ $"8280 7B7B 7D7D 7977 7777 777B 8184 8480" /* ‚€{{}}ywwww{�„„€ */ $"7978 7E80 7E7D 8083 8481 7E7B 7B7B 7B7B" /* yx~€~}€ƒ„�~{{{{{ */ $"7B7B 797B 8083 8483 7E79 7B7E 7D7D 8080" /* {{y{€ƒ„ƒ~y{~}}€€ */ $"8080 7B7B 7D7D 7977 7B80 7E79 797B 7D7E" /* €€{{}}yw{€~yy{}~ */ $"7B7B 8082 8180 8084 8585 8182 8280 7977" /* {{€‚�€€„……�‚‚€yw */ $"7979 7772 767B 8082 8080 807E 7E7D 8282" /* yywrv{€‚€€€~~}‚‚ */ $"7E7E 7B7E 7B7B 7D80 7E79 797B 7D7E 7D80" /* ~~{~{{}€~yy{}~}€ */ $"8386 807D 7E80 7E79 7B7E 8180 7B79 797E" /* ƒ†€}~€~y{~�€{yy~ */ $"7B7B 8080 807B 7D81 8383 807E 7D7D 7B79" /* {{€€€{}�ƒƒ€~}}{y */ $"7D80 807B 797E 8084 8280 7E79 7978 7B7D" /* }€€{y~€„‚€~yyx{} */ $"7B79 787B 7B7D 8080 8182 8383 8485 807B" /* {yx{{}€€�‚ƒƒ„…€{ */ $"7979 7B7B 7B78 7979 7B7D 8081 8280 7E7B" /* yy{{{xyy{}€�‚€~{ */ $"7B79 8083 8382 7E7B 7D7D 7B7B 7A78 787A" /* {y€ƒƒ‚~{}}{{zxxz */ $"7D82 8180 7E7E 8080 807D 7B7C 7C7E 8080" /* }‚�€~~€€€}{||~€€ */ $"8080 8080 807D 7B7A 797A 7C7D 8282 807E" /* €€€€€}{zyz|}‚‚€~ */ $"7B7C 7B7D 7C7E 807D 7C7B 7E80 8080 7E7E" /* {|{}|~€}|{~€€€~~ */ $"7E7D 7D7E 8080 7D80 8080 7D7D 7B7E 8282" /* ~}}~€€}€€€}}{~‚‚ */ $"8080 7D7C 7B79 797D 8080 7E7E 8082 807C" /* €€}|{yy}€€~~€‚€| */ $"7B7B 797B 7B80 8585 827D 7D7E 7C79 797E" /* {{y{{€……‚}}~|yy~ */ $"7E7B 7B7B 7E82 827D 7E80 7E7C 7B7C 8080" /* ~{{{~‚‚}~€~|{|€€ */ $"8080 8282 807D 7C7E 8080 7C7B 7B79 797C" /* €€‚‚€}|~€€|{{yy| */ $"8084 8480 7C7B 7B7B 7E7C 7B7D 7D7B 7B7B" /* €„„€|{{{~|{}}{{{ */ $"7B7E 8280 7C80 8080 8080 807E 7D7D 8080" /* {~‚€|€€€€€€~}}€€ */ $"807E 7B7B 7C7D 7978 7B7E 8082 8082 8280" /* €~{{|}yx{~€‚€‚‚€ */ $"797B 807C 7B77 757B 8082 8284 8582 7D78" /* y{€|{wu{€‚‚„…‚}x */ $"777C 7E7C 7C7E 8080 7C7C 8082 807C 7B7C" /* w|~||~€€||€‚€|{| */ $"8080 7C7C 7E80 807E 7E80 7D79 797D 8080" /* €€||~€€~~€}yy}€€ */ $"7E7D 7E80 8080 8080 807C 7B79 7D80 7E7C" /* ~}~€€€€€€|{y}€~| */ $"7C80 807E 7D80 807D 7C7B 7C80 8080 7D7C" /* |€€~}€€}|{|€€€}| */ $"7B7A 7B7D 8080 807E 7C7E 8080 8080 8282" /* {z{}€€€~|~€€€€‚‚ */ $"8180 8080 7C7A 787A 7C7D 7C7A 7C80 8080" /* �€€€|zxz|}|z|€€€ */ $"807E 7C7C 7C7D 8083 8382 807E 7D7C 7C7C" /* €~|||}€ƒƒ‚€~}||| */ $"7D7C 7B7B 7B7E 8082 807C 7C7C 7E82 8380" /* }|{{{~€‚€|||~‚ƒ€ */ $"7E7C 7C7E 807E 7D80 8080 7E7C 7B7A 7B7D" /* ~||~€~}€€€~|{z{} */ $"807E 7E7C 797B 7E80 8080 807D 7C7C 7C80" /* €~~|y{~€€€€}|||€ */ $"8080 807E 7A79 797C 8082 807C 7A7C 8081" /* €€€~zyy|€‚€|z|€� */ $"8182 8281 8080 7E7D 7D7B 7A7C 7C7A 7A7B" /* �‚‚�€€~}}{z||zz{ */ $"7C80 807E 7E80 8080 8181 8080 7D7C 7B7A" /* |€€~~€€€��€€}|{z */ $"787A 7D80 807D 7A7A 7C80 8183 827E 7A7A" /* xz}€€}zz|€�ƒ‚~zz */ $"7D83 8683 8280 7D7D 7D7D 7E7E 7D7C 7D7B" /* }ƒ†ƒ‚€}}}}~~}|}{ */ $"7A7A 7A7D 8080 7D7C 7D7D 7D80 8181 807E" /* zzz}€€}|}}}€��€~ */ $"7D7D 7E7C 7D7D 807E 7D7D 7D7E 8080 7E7D" /* }}~|}}€~}}}~€€~} */ $"7D7D 7E82 8584 8180 7D7C 7D7B 7979 7977" /* }}~‚…„�€}|}{yyyw */ $"797A 7C80 8284 8381 807D 7D80 8082 8281" /* yz|€‚„ƒ�€}}€€‚‚� */ $"7D7C 7C7C 7D7E 807E 7D7B 7878 7A7C 8081" /* }|||}~€~}{xxz|€� */ $"8280 807D 8081 8281 807D 7D7D 8080 8180" /* ‚€€}€�‚�€}}}€€�€ */ $"7D7C 7B7B 7B7A 7B7C 7D7E 8182 8182 8080" /* }|{{{z{|}~�‚�‚€€ */ $"807D 7A79 7979 7B7C 7D7E 807E 7D80 8182" /* €}zyyy{|}~€~}€�‚ */ $"8280 7E7E 7D7D 8081 8484 807C 7B7B 7B7C" /* ‚€~~}}€�„„€|{{{| */ $"7D7C 7B7B 7A7B 7D80 807E 7D7C 7C7C 7D80" /* }|{{z{}€€~}|||}€ */ $"8283 8280 7E7E 7D7B 7B7B 7D7D 7C7A 7B7C" /* ‚ƒ‚€~~}{{{}}|z{| */ $"7C7D 8080 8180 8080 8282 8282 8080 7D7B" /* |}€€�€€€‚‚‚‚€€}{ */ $"7C80 817D 7A79 797B 7B7D 8080 8080 8080" /* |€�}zyy{{}€€€€€€ */ $"8081 807D 7D7B 7979 7B7E 8181 8080 7D7D" /* €�€}}{yy{~��€€}} */ $"7D7D 7E80 807D 8080 8080 8082 8281 807C" /* }}~€€}€€€€€‚‚�€| */ $"7B7B 7B7D 8080 807D 7D7D 7D80 807D 7C7B" /* {{{}€€€}}}}€€}|{ */ $"7C7E 8282 8280 807E 7B7B 7B7C 7C7B 7B7B" /* |~‚‚‚€€~{{{||{{{ */ $"7B7D 7D7D 8082 8280 8080 8181 8080 8180" /* {}}}€‚‚€€€��€€�€ */ $"7C79 7A7B 7E80 8080 807E 7B7C 7D80 7E7C" /* |yz{~€€€€~{|}€~| */ $"7D7D 7D7C 7D80 8080 7D7B 7B7E 7D7C 7E80" /* }}}|}€€€}{{~}|~€ */ $"807E 7E7E 8080 7E7C 7E7E 807E 7E80 8180" /* €~~~€€~|~~€~~€�€ */ $"7E7E 7E7E 7E7E 7E80 7E7A 7A7B 7E80 8180" /* ~~~~~~~€~zz{~€�€ */ $"8182 807E 7E7E 8080 7E7E 7E7E 7B7A 7C7E" /* �‚€~~~€€~~~~{z|~ */ $"8080 7D7E 8080 7E7E 7E80 807E 7E7E 807E" /* €€}~€€~~~€€~~~€~ */ $"7E80 8080 807E 7E80 807E 7E7E 7E7E 7E7E" /* ~€€€€~~€€~~~~~~~ */ $"7E7E 7D7B 7C7D 8081 8080 807E 7C7B 7A7D" /* ~~}{|}€�€€€~|{z} */ $"8081 807E 7D7D 7E80 8081 8180 807E 8080" /* €�€~}}~€€��€€~€€ */ $"8080 8080 807E 7D7A 7B7C 7D7E 8082 807E" /* €€€€€~}z{|}~€‚€~ */ $"7D7E 7E80 807E 7E7E 7C7B 7B7D 7E7E 7D7E" /* }~~€€~~~|{{}~~}~ */ $"8081 8080 7E7E 7E7D 7E81 8281 807D 7E80" /* €�€€~~~}~�‚�€}~€ */ $"7E7D 7E80 7E7E 7E80 8080 807E 8081 807C" /* ~}~€~~~€€€€~€�€| */ $"7A7C 7D7E 7E80 8281 807C 7C80 807E 7D7E" /* z|}~~€‚�€||€€~}~ */ $"7E7D 7B7A 7C80 807E 7E80 8180 7C7D 8080" /* ~}{z|€€~~€�€|}€€ */ $"7E7E 7E80 807E 7C7D 8080 8080 8080 807E" /* ~~~€€~|}€€€€€€€~ */ $"7E80 807E 7E7E 8081 7E7C 7C7D 7C7D 7C7E" /* ~€€~~~€�~||}|}|~ */ $"8080 7C7B 7E80 807E 7D7D 7D7C 7B7C 8082" /* €€|{~€€~}}}|{|€‚ */ $"8280 8080 7E7E 7D7D 7E80 8080 8181 807E" /* ‚€€€~~}}~€€€��€~ */ $"7D7D 7E7E 7D7B 7D7E 7E7E 8080 807D 7B7B" /* }}~~}{}~~~€€€}{{ */ $"7E80 807E 7E80 8282 8281 8180 7E7B 7D7E" /* ~€€~~€‚‚‚��€~{}~ */ $"7E7D 7C7C 7C7D 7D7E 8080 8180 7E80 8080" /* ~}|||}}~€€�€~€€€ */ $"7E80 8081 8080 8080 807E 7E80 807E 7D7A" /* ~€€�€€€€€~~€€~}z */ $"7B7C 7E7E 7E80 7E7E 7D7D 7E80 7E7E 7E80" /* {|~~~€~~}}~€~~~€ */ $"8080 7E80 807E 7E7D 7E7E 8080 7E80 8081" /* €€~€€~~}~~€€~€€� */ $"8182 8281 7E7C 7B7B 7C7E 7E7E 7E80 7E7D" /* �‚‚�~|{{|~~~~€~} */ $"7D7D 7D7D 7D7E 8080 8080 8182 8281 7E7E" /* }}}}}~€€€€�‚‚�~~ */ $"7D7B 797B 7D80 8180 8080 807E 7E7E 8080" /* }{y{}€�€€€€~~~€€ */ $"7D7C 7E80 807E 7E7E 7E80 8080 8180 7E7C" /* }|~€€~~~~€€€�€~| */ $"7D7E 7D7C 7C7C 7E7E 7E7E 8080 7E7E 8080" /* }~}|||~~~~€€~~€€ */ $"807E 7E7E 8080 7E7E 7E7E 7D7B 7C7E 8081" /* €~~~€€~~~~}{|~€� */ $"8181 8181 8080 8182 807D 7B7C 7C7D 7D7E" /* ����€€�‚€}{||}}~ */ $"7E80 7E7D 7D80 807E 7D7E 8080 8080 8181" /* ~€~}}€€~}~€€€€�� */ $"807D 7D7E 7D7C 7C7C 7E81 8080 8080 7E7D" /* €}}~}|||~�€€€€~} */ $"7E80 8180 7D7D 8081 8180 7E7E 7D7D 7E80" /* ~€�€}}€��€~~}}~€ */ $"8181 807D 7C7C 7D7D 7D7D 7E80 8081 8282" /* ��€}||}}}}~€€�‚‚ */ $"817F 7E7E 7E7D 7D7D 7D7D 7D7E 7E7E 7E7D" /* �.~~~}}}}}}~~~~} */ $"7D7F 8080 8081 8181 8180 8181 807D 7C7B" /* }.€€€����€��€}|{ */ $"7C7D 7E7F 7F7E 7D7D 7E7F 807F 7D7C 7D80" /* |}~..~}}~.€.}|}€ */ $"8181 8181 8180 7E7D 7D7D 7D7D 7E80 807F" /* �����€~}}}}}~€€. */ $"7E7E 8080 7E7D 7F80 807E 7E80 8181 8080" /* ~~€€~}.€€~~€��€€ */ $"7F7E 7D7D 7D7E 7D7B 7B7C 7E80 8181 8182" /* .~}}}~}{{|~€���‚ */ $"8180 8080 7F7D 7C7C 7D7E 7E7E 8080 807F" /* �€€€.}||}~~~€€€. */ $"7E80 8080 8080 8081 807F 8080 8080 8080" /* ~€€€€€€�€.€€€€€€ */ $"7F7D 7C7C 7D80 8080 8080 7F7D 7E7E 7E7D" /* .}||}€€€€€.}~~~} */ $"7D7C 7E81 8182 8282 817F 7D7C 7C7C 7D7C" /* }|~��‚‚‚�.}|||}| */ $"7D7E 8080 8181 8080 8080 8080 8080 7F80" /* }~€€��€€€€€€€€.€ */ $"807F 7E7D 7C7C 7E7E 7E7F 7F7E 7E7E 7F80" /* €.~}||~~~..~~~.€ */ $"8080 8080 7F7F 7E7F 8080 807E 7E7E 7E7E" /* €€€€..~.€€€~~~~~ */ $"7E7E 7E7D 7C7D 7F80 8080 8080 8080 8080" /* ~~~}|}.€€€€€€€€€ */ $"8080 807F 7F7F 7F7F 7E7F 7E7E 7D7C 7E7F" /* €€€.....~.~~}|~. */ $"7E7D 7E80 8081 8080 8080 7F7D 7E7E 7C7C" /* ~}~€€�€€€€.}~~|| */ $"7C7D 7F80 807F 8080 8080 8081 8080 807F" /* |}.€€.€€€€€�€€€. */ $"7F80 807F 7F7F 7D7C 7C7E 7F80 807E 7E7F" /* .€€...}||~.€€~~. */ $"807F 7E7F 807F 7E7F 8080 8080 7F7F 8080" /* €.~.€.~.€€€€..€€ */ $"7E7E 7E7E 7E7D 7E7E 807F 7E7E 8081 8081" /* ~~~~~}~~€.~~€�€� */ $"8180 807E 7E7E 8080 7D7C 7D7F 8080 807F" /* �€€~~~€€}|}.€€€. */ $"7E7D 7D7E 8080 7F7E 7E7E 7F7F 8080 7F7E" /* ~}}~€€.~~~..€€.~ */ $"7C7D 7E80 8080 7F7F 8080 8080 8080 807F" /* |}~€€€..€€€€€€€. */ $"8080 807E 7E7E 7E7E 7F7F 7F7E 7D7E 7F80" /* €€€~~~~~...~}~.€ */ $"8080 7E7E 7E7E 7F80 8080 807F 8080 807F" /* €€~~~~.€€€€.€€€. */ $"7F7F 7E7D 7D7E 7E7E 7E7E 7E7F 8080 8080" /* ..~}}~~~~~~.€€€€ */ $"8080 8080 8080 7F7E 7E7D 7D7D 7F80 8080" /* €€€€€€.~~}}}.€€€ */ $"8080 8080 7E7D 7E7E 7F7F 8080 807F 7F7F" /* €€€€~}~~..€€€... */ $"807F 7D7D 7D7D 7E7E 8080 8080 8080 807F" /* €.}}}}~~€€€€€€€. */ $"7F7F 8080 807F 7F80 8080 7F7F 8080 7F7F" /* ..€€€..€€€..€€.. */ $"7E7E 7E7D 7D7F 8080 7F7F 7F80 8080 7F80" /* ~~~}}.€€...€€€.€ */ $"8080 7F80 807F 7E7E 7E7F 807F 7F7F 7E7E" /* €€.€€.~~~.€...~~ */ $"7E7E 8080 8080 7F7F 8080 7E7E 7E7D 7D7E" /* ~~€€€€..€€~~~}}~ */ $"8080 8080 8080 8080 7E7D 7D7D 7E7F 8080" /* €€€€€€€€~}}}~.€€ */ $"8180 807F 7F7E 7E7E 7E7E 7E7F 8080 807F" /* �€€..~~~~~~.€€€. */ $"7E7F 8080 8080 807F 7E7E 7E80 8080 7F7E" /* ~.€€€€€.~~~€€€.~ */ $"7E7E 7F80 8080 807F 7E7E 7F80 8080 8080" /* ~~.€€€€.~~.€€€€€ */ $"807F 7E7E 7E7E 7E7F 8080 8080 7F80 8080" /* €.~~~~~.€€€€.€€€ */ $"7F7F 7E7E 7E7E 7E80 8080 8080 807F 7E7E" /* ..~~~~~€€€€€€.~~ */ $"7E7E 7E7F 8081 8180 807E 7E7E 7E7F 7F7F" /* ~~~.€��€€~~~~... */ $"7E7E 8080 8080 807F 7E7E 7D7E 7E7E 7F80" /* ~~€€€€€.~~}~~~.€ */ $"8181 807F 7E7F 807F 8080 807F 7F7E 7F7F" /* ��€.~.€.€€€..~.. */ $"7F7E 7F7F 7F7E 7E7F 8080 7F7F 7F80 8080" /* .~...~~.€€...€€€ */ $"8080 7F7E 7E7F 7F7F 7E7E 7E80 807F 8080" /* €€.~~...~~~€€.€€ */ $"8080 7F7E 7E7E 7E7E 8080 8080 7F7E 7F7F" /* €€.~~~~~€€€€.~.. */ $"7E7E 7F80 807F 7E7F 8080 8080 7F7E 7D7D" /* ~~.€€.~.€€€€.~}} */ $"7E7F 8080 8080 8080 7F7E 7E7E 7E7E 7E80" /* ~.€€€€€€.~~~~~~€ */ $"807F 7F7F 8080 7F7E 7E7F 7F7F 7F7E 7F80" /* €...€€.~~....~.€ */ $"7F7F 807F 7F7E 7E7E 8080 8080 8080 7F7E" /* ..€..~~~€€€€€€.~ */ $"7E7E 7F80 8080 7F7E 7E7E 7E7F 7F7E 7E7F" /* ~~.€€€.~~~~..~~. */ $"7F80 8080 8080 8080 7F7F 7F7F 7F7F 8080" /* .€€€€€€€......€€ */ $"7F7E 7E7E 7E7E 7F7F 8080 8080 8080 8080" /* .~~~~~..€€€€€€€€ */ $"7F7F 7F7E 7F7F 8080 807F 7F7F 8080 7F7F" /* ...~..€€€...€€.. */ $"7F7E 7F7F 8080 807F 7F7F 7F7F 7F7F 8080" /* .~..€€€.......€€ */ $"807F 7F7F 8080 807F 7F7F 7F80 8080 8080" /* €...€€€....€€€€€ */ $"7F7F 7F7F 7E7E 7E7F 8080 807F 7F7F 7F7F" /* ....~~~.€€€..... */ $"7F7F 7F7E 7F80 8080 8080 8080 7F7F 7F7F" /* ...~.€€€€€€€.... */ $"8080 7F7F 7F7F 7F7F 7F7F 7F7E 7E7F 8080" /* €€.........~~.€€ */ $"8080 8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F" /* €€€€€........... */ $"7F80 807F 7E7F 7F80 8080 8080 7F7F 7F7F" /* .€€.~..€€€€€.... */ $"7F7F 7F7F 7F7F 7F7F 7F80 8080 8080 8080" /* .........€€€€€€€ */ $"807F 7F7F 7F7F 7F7F 7F7F 7F80 8080 7F7F" /* €..........€€€.. */ $"7E7E 7F7F 7F80 8080 8080 8080 8080 8080" /* ~~...€€€€€€€€€€€ */ $"8080 8080 7F7F 7F7E 7F7F 7F7F 7F7F 7F7F" /* €€€€...~........ */ $"7F80 8080 8080 807F 8080 7F7F 7F7F 8080" /* .€€€€€€.€€....€€ */ $"7F7F 807F 7F7F 7F7F 7F7F 7F80 8080 807F" /* ..€........€€€€. */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 807F 8080" /* ...........€€.€€ */ $"8080 8080 8080 8080 8080 7F7F 7F7F 807F" /* €€€€€€€€€€....€. */ $"7F7F 7F7F 7F7E 7F7F 807F 8080 8080 807F" /* .....~..€.€€€€€. */ $"7F80 7F80 8080 807F 7F7F 7F7F 7F80 7F7F" /* .€.€€€€......€.. */ $"7F7F 7F80 807F 7F7F 7F7F 8080 7F7F 7F7F" /* ...€€.....€€.... */ $"8080 8080 8080 7F7F 7F7F 7F7F 7F7F 8080" /* €€€€€€........€€ */ $"8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" /* €€€............. */ $"7F7F 7F7F 7F80 8080 8080 8080 7F7F 7F7F" /* .....€€€€€€€.... */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080 8080" /* ...........€€€€€ */ $"8080 7F7F 8080 807F 7F7F 7F7F 7F7F 7F7F" /* €€..€€€......... */ $"7F7F 7F7F 7F7F 7F7F 8080 8080 8080 7F7F" /* ........€€€€€€.. */ $"7F7F 807F 7F7F 8080 8080 8080 7F7F 7F7F" /* ..€...€€€€€€.... */ $"7F7F 7F7F 8080 8080 7F7F 7F7F 7F7F 7F80" /* ....€€€€.......€ */ $"7F7F 7F80 807F 7F7F 8080 807F 7F7F 7F7F" /* ...€€...€€€..... */ $"8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" /* €€€€............ */ $"8080 8080 8080 807F 7F7F 8080 8080 807F" /* €€€€€€€...€€€€€. */ $"7F7F 7F7F 807F 7F7F 7F7F 7F7F 7F80 807F" /* ....€........€€. */ $"7F7F 7F80 7F7F 8080 8080 7F7F 7F7F 7F7F" /* ...€..€€€€...... */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 807F 7F80" /* ...........€€..€ */ $"7F7F 7F7F 7F7F 7F7F 7F80 8080 8080 8080" /* .........€€€€€€€ */ $"7F7F 7F7F 7F7F 8080 807F 7F7F 7F7F 7F7F" /* ......€€€....... */ $"8080 7F7F 7F7F 7F7F 7F7F 7F80 7F7F 7F7F" /* €€.........€.... */ $"7F7F 8080 8080 7F7F 7F7F 7F7F 7F80 807F" /* ..€€€€.......€€. */ $"7F80 807F 7F7F 7F80 807F 7F80 8080 8080" /* .€€....€€..€€€€€ */ $"807F 7F7F 7F7F 7F7F 7F80 8080 7F7F 7F7F" /* €........€€€.... */ $"7F80 8080 8080 7F7F 7F7F 7F7F 8080 807F" /* .€€€€€......€€€. */ $"7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080 7F7F" /* ..........€€€€.. */ $"7F7F 7F7F 7F80 8080 8080 807F 7F7F 7F7F" /* .....€€€€€€..... */ $"7F7F 8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F" /* ..€€€........... */ $"7F80 8080 8080 807F 7F7F 7F7F 8080 8080" /* .€€€€€€.....€€€€ */ $"8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080" /* €€...........€€€ */ $"7F7F 7F7F 8080 8080 8080 8080 7F7F 7F7F" /* ....€€€€€€€€.... */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80" /* ...............€ */ $"8080 7F7F 8080 807F 8080 7F7F 7F7F 7F80" /* €€..€€€.€€.....€ */ $"7F7F 7F7F 7F7F 7F7F 807F 7F7F 8080 807F" /* ........€...€€€. */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 7F7F 8080" /* ...........€..€€ */ $"8080 8080 807F 7F7F 7F7F 7F7F 7F7F 8080" /* €€€€€.........€€ */ $"807F 8080 7F7F 7F7F 7F80 8080 8080 7F7F" /* €.€€.....€€€€€.. */ $"7F7F 7F7F 7F7F 7F7F 7F80 807F 7F7F 7F7F" /* .........€€..... */ $"7F7F 7F7F 7F7F 7F80 807F 7F7F 7F7F 7F7F" /* .......€€....... */ $"7F7F 7F7F 8080 807F 7F7F 7F80 8080 8080" /* ....€€€....€€€€€ */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" /* ................ */ $"8080 8080 8080 8080 7F7F 7F7F 7F7F 7F7F" /* €€€€€€€€........ */ $"7F7F 7F80 8080 807F 7F7F 7F7F 7F7F 8080" /* ...€€€€.......€€ */ $"8080 7F7F 7F80 807F 7F7F 7F7F 7F80 7F80" /* €€...€€......€.€ */ $"807F 7F7F 7F7F 8080 8080 8080 807F 807F" /* €.....€€€€€€€.€. */ $"7F7F 7F7F 7F80 807F 7F7F 7F7F 8080 8080" /* .....€€.....€€€€ */ $"8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" /* €€€€............ */ $"7F7F 7F7F 7F7F 8080 8080 8080 7F7F 7F7F" /* ......€€€€€€.... */ $"8080 807F 7F7F 7F80 807F 7F7F 7F7F 7F7F" /* €€€....€€....... */ $"8080 8080 8080 8080 7F7F 7F7F 7F7F 7F80" /* €€€€€€€€.......€ */ $"8080 8080 8080 807F 7F7F 7F7F 7F7F 7F7F" /* €€€€€€€......... */ $"7F7F 807F 7F7F 7F7F 8080 807F 7F7F 7F80" /* ..€.....€€€....€ */ $"8080 807F 7F7F 7F7F 7F7F 7F80 7F7F 7F7F" /* €€€........€.... */ $"7F7F 7F7F 807F 7F7F 7F80 8080 8080 807F" /* ....€....€€€€€€. */ $"7F7F 7F7F 7F80 8080 7F7F 7F7F 807F 7F7F" /* .....€€€....€... */ $"7F7F 7F7F 7F7F 8080 8080 807F 7F7F 7F7F" /* ......€€€€€..... */ $"7F80 8080 7F7F 7F7F 7F7F 7F80 8080 807F" /* .€€€.......€€€€. */ $"7F7F 7F7F 7F7F 807F 7F7F 7F80 7F7F 7F7F" /* ......€....€.... */ $"7F7F 7F7F 8080 8080 8080 7F7F 7F7F 7F7F" /* ....€€€€€€...... */ $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80" /* ...............€ */ $"807F 7F80 8080 807F 7F7F 8080 7F7F 807F" /* €..€€€€...€€..€. */ $"7F7F 7F7F 7F7F 7F80 8080 7F7F 7F7F 7F7F" /* .......€€€...... */ $"7F7F 7F7F 7F7F 7F80 8080 8080 7F7F 7F7F" /* .......€€€€€.... */ $"8080 807F 7F7F 7F7F 7F7F 7F7F 7F80 8080" /* €€€..........€€€ */ $"807F 7F7F 7F7F 8080 7F7F 7F7F 8080 8080" /* €.....€€....€€€€ */ $"8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" /* €€.............. */ $"7F80 8080 807F 7F7F 7F80 8080 807F 7F7F" /* .€€€€....€€€€... */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080" /* €€€€€€€€€€ */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Makefile b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Makefile new file mode 100644 index 0000000..df44a76 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Makefile @@ -0,0 +1 @@ +All ÄÄ Sounds Sounds ÄÄ Ahh ¶ Chirp ¶ Clavichord ¶ DoorBell ¶ Droplet ¶ Eastern ¶ Frog ¶ Guitar ¶ Lore ¶ PipeOrgan ¶ Quack ¶ SimpleBeep ¶ Sosumi ¶ Swish ¶ Trumpets ¶ Whip ¶ Whoosh . Ä .r RezIIGS {Default}.r -o {Default} -t $70D80003 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/PipeOrgan.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/PipeOrgan.r new file mode 100644 index 0000000..a9d0e0f --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/PipeOrgan.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 3000 0000 0950 6970 654F" /* ......0...ÆPipeO */ $"7267 616E" /* rgan */ }; data $8024 (0x30) { $"0000 4200 E88E 0000 772B 8080 8080 8080" /* ..B..Ž..w+€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"7C7A 7678 838A 8684 8484 8483 7F81 817D" /* |zvxƒŠ†„„„„ƒ.��} */ $"7D81 7E7C 8181 7F81 8180 7E74 7181 8D86" /* }�~|��.��€~tq��† */ $"7D7B 7A7C 7D79 7C82 7D7B 827F 787B 7C74" /* }{z|}y|‚}{‚.x{|t */ $"7475 7474 6C67 7E9A 998E 8C8B 8B8C 8481" /* tuttlg~š™ŽŒ‹‹Œ„� */ $"8780 7882 8279 8087 8181 8583 8073 6273" /* ‡€x‚‚y€‡��…ƒ€sbs */ $"9695 8079 7776 7C77 7581 8177 8084 7675" /* –•€ywv|wu��w€„vu */ $"7C72 6B6F 6D6C 6656 699E AF9D 9594 9295" /* |rkomlfViž¯�•”’• */ $"8D81 8988 777C 877B 7A89 8681 8685 8177" /* ��‰ˆw|‡{z‰†�†…�w */ $"5A5B 8CA4 8D7B 7672 7979 727D 8679 7A87" /* Z[Œ¤�{vryyr}†yz‡ */ $"7A6F 7671 6465 6562 5E4E 518C BFB8 A7A3" /* zovqdeeb^NQŒ¿¸§£ */ $"9C9C 998A 868C 7D76 8380 7683 887C 8188" /* œœ™Š†Œ}vƒ€vƒˆ|�ˆ */ $"8071 594E 78A9 A287 7E77 757C 7A78 8382" /* €qYNx©¢‡~wu|zxƒ‚ */ $"7980 7C6C 6F70 5B54 6468 5B4D 4D77 B8CD" /* y€|lop[Tdh[MMw¸Í */ $"B9B0 AA9D 9C9A 8984 877B 777B 7477 8577" /* ¹°ª�œš‰„‡{w{tw…w */ $"677A 8976 5D4F 5D91 B29E 8884 7877 867F" /* gz‰v]O]‘²žˆ„xw†. */ $"7685 8373 746E 646C 6244 5170 6755 5662" /* v…ƒstndlbDQpgUVb */ $"95D4 D7BE B8A8 99A5 9B7E 868D 746F 766E" /* •Ô×¾¸¨™¥›~†�tovn */ $"787C 5C5D 837F 5F57 506A ACBE 9E90 8673" /* x|\]ƒ._WPj¬¾ž�†s */ $"8790 7379 8F72 676D 615D 6645 3662 7258" /* ‡�sy�rgma]fE6brX */ $"5B5D 72C7 F5DE C8BC 9DA5 B08A 7D96 7A68" /* []rÇ..ȼ�¥°Š}–zh */ $"726C 6978 6144 6A83 6458 4E4A 97CE BFA1" /* rlixaDjƒdXNJ—ο¡ */ $"9378 7F96 806D 8A78 6166 5C56 5F50 2B47" /* “x.–€mŠxaf\V_P+G */ $"7166 5C5C 59AA F1FB E0C9 ACA3 B4A4 8090" /* qf\\Yª...ɬ£´¤€� */ $"886E 6F68 6971 6D45 4D75 745A 4E38 72BC" /* ˆnohiqmEMutZN8r¼ */ $"D7BB 9B84 768D 9270 7980 6467 5957 585C" /* ×»›„v�’py€dgYWX\ */ $"382F 556B 5C5B 477A D6FD F9D9 BEA3 AFB7" /* 8/Uk\[GzÖ...¾£¯· */ $"9089 9172 786A 6868 755C 4255 6E5B 5936" /* �‰‘rxjhhu\BUn[Y6 */ $"459D DDDD B196 7786 9A7F 7388 676F 6158" /* E�..±–w†š.sˆgoaX */ $"4D5A 4E2C 3553 4D62 4E47 B0F6 FFF5 D4AA" /* MZN,5SMbNG°...Ôª */ $"B0C1 A686 9D77 7178 675B 676C 4646 5651" /* °Á¦†�wqxg[glFFVQ */ $"6458 216F CAF6 DBAD 817F 9C91 718C 7656" /* dX!oÊ..­�.œ‘qŒvV */ $"725B 484A 5232 2E33 3C5C 7238 64D9 FFFF" /* r[HJR2.3<\r8d... */ $"F3C2 AAC9 BA93 9D93 5A7B 6D5A 5A60 5249" /* .ªɺ“�“Z{mZZ`RI */ $"4441 5E7E 422A 9BE4 FFDA 9A74 9B96 8083" /* DA^~B*›...št›–€ƒ */ $"8950 6368 4B46 3D3A 2D2C 1C44 7764 2C9C" /* ‰PchKF=:-,.Dwd,œ */ $"EBFF FFE8 B2CD C5AF A29D 6B5E 7D57 5C4C" /* ....²Íů¢�k^}W\L */ $"5249 5329 517A 7C24 62B4 F4FA C482 8E98" /* RIS)Qz|$b´..Ä‚Ž˜ */ $"888E 806C 4076 4B4F 3631 2B3E 0A2E 6283" /* ˆŽ€l@vKO61+>..bƒ */ $"475A BFF5 FFFE D0C2 D2B0 BF97 8C4A 7A5E" /* GZ¿...ÐÂÒ°¿—ŒJz^ */ $"5E4F 4044 6230 356C 8766 3687 C3FF F2AC" /* ^O@Db05l‡f6‡Ã..¬ */ $"80A1 81A4 7F7B 445D 5F4E 4C25 283D 2A0E" /* €¡�¤.{D]_NL%(=*. */ $"4F69 8442 8BC5 FCFF F7C2 D5B7 C8B1 8E6C" /* Oi„B‹Å...ÂշȱŽl */ $"5477 526A 3B3F 4E58 1A58 6790 4F59 8ADE" /* TwRj;?NX.Xg�OYŠ. */ $"FFE3 9A90 9292 A670 723F 6D49 5E33 242C" /* ..š�’’¦pr?mI^3$, */ $"420D 2A48 7B78 5C9D D7FF FFEE C5CD B6D9" /* BÂ*H{x\�×...ÅͶ. */ $"908B 566B 5F5F 5638 435B 3B2E 5468 8955" /* �‹Vk__V8C[;.Th‰U */ $"7898 F4FE D491 9187 B286 7156 5860 4753" /* x˜..Ô‘‘‡²†qVX`GS */ $"2726 372F 0E33 4081 7090 A7F1 FFFF E3C8" /* '&7/.3@�p�§....È */ $"BBD8 BF89 705F 764C 6447 3E4D 5730 4642" /* »Ø¿‰p_vLdG>MW0FB */ $"7074 7F7D B8FE F8C0 8C81 9DAC 7660 4E72" /* pt.}¸..ÀŒ��¬v`Nr */ $"474F 4427 2F39 1D28 254B 7589 A2BB FCFF" /* GOD'/9.(%Ku‰¢».. */ $"FFDB BBC4 DEA8 7D5F 7563 5159 4545 5148" /* ..»Ä.¨}_ucQYEEQH */ $"4A3D 4A6B 7B92 85CB FDEE B57E 83B0 9170" /* J=Jk{’…Ë..µ~ƒ°‘p */ $"515E 6B48 4444 2B32 2832 2828 4E76 A0AB" /* Q^kHDD+2(2((Nv « */ $"D3FC FFFD CAB3 E2BF A169 6478 5D43 5943" /* Ó...ʳ.¿¡idx]CYC */ $"503D 565A 3353 6B8A 9B9C C9FE E9A5 69A8" /* P=VZ3SkŠ›œÉ..¥i¨ */ $"998A 5E52 6168 3D3D 3E3D 1B2C 5213 3A50" /* ™Š^Rah==>=.,R.:P */ $"80B1 C8CF FAFF F1A8 D4D6 AD92 6758 7D5A" /* €±ÈÏ...¨ÔÖ­’gX}Z */ $"2E59 563D 3882 374E 5471 91BE 97D2 FFEE" /* .YV=8‚7NTq‘¾—Ò.. */ $"7187 B079 8C59 3E6C 7318 4749 3B0B 6133" /* q‡°yŒY>ls.GI;.a3 */ $"2741 5C79 DCCD C7FF FFCD AFEE A3BB 8350" /* 'A\y.ÍÇ..ͯ.£»ƒP */ $"5898 2D3A 5E67 1569 7332 5F5D 60B5 D080" /* X˜-:^g.is2_]`µÐ€ */ $"E9FF C65E B77E 8881 5031 9056 1350 6116" /* ..Æ^·~ˆ�P1�V.Pa. */ $"2A74 1441 4851 91F5 AFDB FFF9 ACD9 D393" /* *t.AHQ‘.¯...¬.Ó“ */ $"BB7F 3579 8B16 4A76 4A17 994B 4268 5B5F" /* ».5y‹.JvJ.™KBh[_ */ $"E2B5 88EF FC8F 7FBF 5A8F 8634 44A0 2D25" /* .µˆ..�.¿Z�†4D -% */ $"6459 045A 580D 4D53 3DBD EEA2 ECFF EAAD" /* dY.ZXÂMS=½.¢...­ */ $"F6A9 98BE 692C 9D62 105E 851B 4C9D 2E54" /* .©˜¾i,�b.^….L�.T */ $"7641 82F0 9496 F5E9 6CB0 9A4E 9D7F 1672" /* vA‚.”–..l°šN�..r */ $"8A15 3580 3814 7E34 1462 4145 E8D6 A6F1" /* Š.5€8.~4.bAE.Ö¦. */ $"FFCA CEEF 86A4 C240 49A4 3A1C 7E70 1182" /* .ÊÎ.†¤Â@I¤:.~p.‚ */ $"7D25 6B75 2EB7 E084 ABFC BA73 C771 53AB" /* }%ku.·.„«.ºsÇqS« */ $"6119 9861 1152 8313 3D76 1623 6B1E 6DF9" /* a.˜a.Rƒ.=v.#k.m. */ $"CEBC F9F8 BCF0 D67B B6B7 2377 8528 3098" /* μ..¼.Ö{¶·#w…(0˜ */ $"4427 A35E 2A8A 603A E2B8 73BE FA94 A0B7" /* D'£^*Š`:.¸s¾.” · */ $"5058 B738 3996 4816 7467 0868 5609 4068" /* PX·89–H.tg.hVÆ@h */ $"11A4 E6AC B5FE D4B8 FFD3 83E0 9B2B A572" /* .¤.¬µ.Ô¸.Óƒ.›+¥r */ $"2750 A41C 558F 4B38 9B33 71F1 B586 E1E4" /* 'P¤.U�K8›3q.µ†.. */ $"76BF 7F28 83D1 266A 772F 1A90 3B17 754D" /* v¿.(ƒÑ&jw/.�;.uM */ $"0C63 592F E2D9 B4CF FCAF D2DB 7B56 B632" /* .cY/..´Ï.¯Ò.{V¶2 */ $"3FBA 823F 8D91 2297 9039 4FA2 2CA4 DDBE" /* ?º‚?�‘"—�9O¢,¤.¾ */ $"96EE B19C DB85 41AE 921A 7532 0E56 BD23" /* –.±œ.…A®’.u2.V½# */ $"4269 3212 8836 54F0 F8C4 E3F2 B8EF B666" /* Bi2.ˆ6T..Ä..¸.¶f */ $"74AE 1750 5121 0B5B 1F3D CAA4 3F93 9E47" /* t®.PQ!.[.=ʤ?“žG */ $"E4E7 B49D EF92 B5BA 8049 B963 5290 573E" /* ..´�.’µº€I¹cR�W> */ $"7D71 0D50 300C 49BE 339F F9F3 B3EF C9B5" /* }qÂP0.I¾3Ÿ..³.ɵ */ $"F7CB 649D AB30 662C 282F 650D 5466 3008" /* .Ëd�«0f,(/eÂTf0. */ $"642C 66FC FFC3 CEE7 87CA AD55 47C9 4D69" /* d,f..ÃÎ.‡Ê­UGÉMi */ $"5F65 477C 4246 875B 3978 761F B4BC BECC" /* _eG|BF‡[9xv.´¼¾Ì */ $"FCAC D3F0 AF3F BD83 4A83 7463 6E81 306A" /* .¬Ó.¯?½ƒJƒtcn�0j */ $"3B21 1A5F 1F9D B499 70A5 7289 F4C7 5C9E" /* ;!._.�´™p¥r‰.Ç\ž */ $"CF36 7055 453E 9044 656C 6521 6048 81E3" /* Ï6pUE>�Dele!`H�. */ $"D9F9 F5CD 6DC2 9853 62D6 5B76 8869 379A" /* ...Ím˜SbÖ[vˆi7š */ $"745A A4A2 635C 9157 A262 847F 8862 A48C" /* tZ¤¢c\‘W¢b„.ˆb¤Œ */ $"430F 744C 52AE 9170 A0B4 2275 733C 1386" /* C.tLR®‘p ´"us<.† */ $"73A5 B5D6 C0B2 8BB0 D8C1 A596 8F25 671E" /* s¥µÖÀ²‹°ØÁ¥–�%g. */ $"2060 BA5A 7EBA 8029 A09D 90D5 E8DE B4B8" /* `ºZ~º€) ��Õ..´¸ */ $"687E 2E33 1559 566B 3916 2F69 2F4D C6B9" /* h~.3.YVk9./i/Mƹ */ $"5C8E D166 C0B1 B497 D9A7 A8AE 9E4F 4861" /* \ŽÑfÀ±´—.§¨®žOHa */ $"7573 6E93 8B65 1D77 4321 3ECC 92B4 ECC9" /* usn“‹e.wC!>Ì’´.É */ $"A9DF A782 CADB 8A58 9959 3901 3131 4A3A" /* ©.§‚Ê.ŠX™Y9.11J: */ $"5A5A 241E 635E 86F4 F9CE F2E7 71C3 A56D" /* ZZ$.c^†..Î..qÃ¥m */ $"1CA8 A565 4E65 602D 4870 8A96 797A 7A64" /* .¨¥eNe`-HpŠ–yzzd */ $"A455 6CA2 EF77 A9F7 A555 91AF 607E B79B" /* ¤Ul¢.w©.¥U‘¯`~·› */ $"6F77 4523 0937 0D54 6F90 6858 A0AD 6480" /* owE#Æ7ÂTo�hX ­d€ */ $"F3E0 7ABE E56A 714F 552D AB93 6070 8048" /* ..z¾.jqOU-«“`p€H */ $"127C AEA2 B2C8 C66C 53A6 5436 51DB 739E" /* .|®¢²ÈÆlS¦T6Q.sž */ $"CF8B 7E91 A34D 9AE4 8C50 7D84 290F 7364" /* Ï‹~‘£Mš.ŒP}„).sd */ $"8461 9C6E 4062 6B51 63DF A98D DDCA 6664" /* „aœn@bkQc.©�.Êfd */ $"7A57 17AE BF85 6EA7 7B28 6E92 B0AD 9D8E" /* zW.®¿…n§{(n’°­�Ž */ $"4F5A 8022 2B85 DC6C A6DA A372 80BF 75B4" /* OZ€"+….l¦.£r€¿u´ */ $"F8C8 8887 7D0F 0D47 326F 598E 352A 7865" /* .Ȉ‡}.ÂG2oYŽ5*xe */ $"4461 EDB9 94CD CB98 6B88 6750 C1AF 7863" /* Da.¹”͢kˆgPÁ¯xc */ $"9F42 0E68 88A1 93BB 994C 5B74 352A 8DD1" /* ŸB.hˆ¡“»™L[t5*�Ñ */ $"8CC3 DBBB 9BA1 B56F BDF4 A35B 7D6E 0607" /* ŒÃ.»›¡µo½.£[}n.. */ $"3B46 6B5B 883C 3C6B 5551 83F3 BBC1 E8C4" /* ;Fk[ˆ<CÀÍ—ÇØ¶{—™ */ $"71B2 D99D 5D83 5201 0C3A 436B 778A 4457" /* q².�]ƒR..:CkwŠDW */ $"7D5B 488F F2B6 BFD3 B489 6174 4060 B599" /* }[H�.¶¿Ó´‰at@`µ™ */ $"6259 961A 216B 82B4 AADA 846D 7869 3C3F" /* bY–.!k‚´ª.„mxiQÆ®�š; */ $"5E5F 5C22 50A3 B7E7 9D65 090D 6F99 D4A9" /* ^_\"P£·.�eÆÂo™Ô© */ $"A17C 6946 4343 2E9F 9BA0 AF88 3E2D 4623" /* ¡|iFCC.Ÿ› ¯ˆ>-F# */ $"5A8A 8C89 90C3 D0C8 DEF6 F0F1 C5A1 8E5C" /* ZŠŒ‰�ÃÐÈ....Å¡Ž\ */ $"3A01 033A 996C 678C 5688 7D50 0E47 A2E1" /* :..:™lgŒVˆ}P.G¢. */ $"F9CE B45C 6578 63AF 7E81 3A42 4D2E 2909" /* .δ\exc¯~�:BM.)Æ */ $"7579 97C1 5F2C 183D 6ACB FDFF FFF9 F5A6" /* uy—Á_,.=jË.....¦ */ $"8DB2 9B99 7D7A 6147 1C02 1223 689B 4A78" /* �²›™}zaG...#h›Jx */ $"6471 C5C0 A875 CACA C0D5 978F 393C 685C" /* dqÅÀ¨uÊÊÀÕ—�9/.HO!..Qg×.... */ $"CD92 A8DF B4E8 8078 4A49 6F1B 7690 977F" /* Í’¨.´.€xJIo.v�—. */ $"4040 0921 50A8 E2A6 F1B9 A28F 7763 5993" /* @@Æ!P¨.¦.¹¢�wcY“ */ $"6CA9 BB6E 2E03 6668 5E76 2C30 0D7F A3C9" /* l©»n..fh^v,0Â.£É */ $"D2AF F3CE E6E5 92B0 6638 255E 8041 8C85" /* Ò¯.Î..’°f8%^€AŒ… */ $"AA61 6383 3B70 88B0 C4AF AE62 9555 616E" /* ªacƒ;pˆ°Ä¯®b•Uan */ $"6BCC 4775 7164 2A0F 7B84 BE9F 502B 0171" /* kÌGuqd*.{„¾ŸP+.q */ $"89CF FDE6 E4C3 E483 8E7E 5F4D 3588 812C" /* ‰Ï...Ã.ƒŽ~_M5ˆ�, */ $"302D 7265 8989 789E 71AA 8CCC E0A5 E3CA" /* 0-re‰‰xžqªŒÌ.¥.Ê */ $"8771 6272 1644 2A50 411B 7B5E A673 592C" /* ‡qbr.D*PA.{^¦sY, */ $"1E51 8CF1 FFFC D6B4 F4B2 B8B9 8E57 1E58" /* .QŒ...Ö´.²¸¹ŽW.X */ $"193D 100D 5389 B79A 6868 3568 8CC3 F0DE" /* .=.ÂS‰·šhh5hŒÃ.. */ $"E6CC BA5B 8891 5E5A 785B 553A 1124 815E" /* .̺[ˆ‘^Zx[U:.$�^ */ $"5C3D 3A51 45BA B0F4 E7DE FBFF EEC8 B670" /* \=:QEº°......ȶp */ $"1E5C 4242 4B0E 1D67 9666 6F44 423E 99AF" /* .\BBK..g–foDB>™¯ */ $"DCF0 C2AA AC8A 8199 935E 5481 3762 472F" /* ..ª¬Š�™“^T�7bG/ */ $"76A4 7354 3529 1A6B 82A6 F7F3 F6EF F1BA" /* v¤sT5).k‚¦.....º */ $"BE98 5E34 7D55 4142 0A36 919E 806F 5E44" /* ¾˜^4}UAB.6‘ž€o^D */ $"659D 7DD2 D5B2 9CA8 8D9C 9865 305A 7343" /* e�}ÒÕ²œ¨�œ˜e0ZsC */ $"714F 5087 A465 5243 3B42 937A B2FC EBE3" /* qOP‡¤eRC;B“z²... */ $"CBC0 B8BF 8C43 3F77 263C 2C22 60BB A481" /* ËÀ¸¿ŒC?w&<,"`»¤� */ $"6B52 567F 9C7D DFE2 B48B 8386 9F76 4529" /* kRV.œ}..´‹ƒ†ŸvE) */ $"865C 586A 4363 879D 6457 4741 5B99 62BC" /* †\XjCc‡�dWGA[™b¼ */ $"FDFF D2CA BDD0 A560 2E43 5C18 3C30 4A78" /* ..ÒʽХ`.C\.<0Jx */ $"B496 755A 6065 BD75 84EF E7AB 6B93 9B9D" /* ´–uZ`e½u„..«k“›� */ $"6434 3385 4C51 615F 6BA2 9273 4032 4672" /* d43…LQa_k¢’s@2Fr */ $"804F D9FF F6B3 BEC9 C89B 5E24 6D47 203F" /* €O...³¾ÉÈ›^$mG ? */ $"3A5B 78B3 9066 4872 87AB 5693 F2E8 947B" /* :[x³�fHr‡«V“..”{ */ $"8DA7 9056 2F52 9249 6A5F 7275 A798 4F23" /* �§�V/R’Ij_ru§˜O# */ $"3D51 845D 6CEC FFE9 A0BA D1CD 814B 2871" /* =Q„]l... ºÑÍ�K(q */ $"3F2F 4550 6797 BA88 4F5B 8187 9050 AFEA" /* ?/EPg—ºˆO[�‡�P¯. */ $"E27F 6B96 A77A 522F 6D84 576E 657A 84B3" /* ..k–§zR/m„Wnez„³ */ $"873B 1C56 5577 517D F0FF D795 BBDC B070" /* ‡;.VUwQ}..ו».°p */ $"3A2E 693D 483E 5F78 AAB9 7647 7B89 8E77" /* :.i=H>_xª¹vG{‰Žw */ $"5ABC EFCE 656B A39F 6451 3274 816C 666E" /* Z¼.Îek£ŸdQ2t�lfn */ $"8B97 AE75 202F 5D5A 6A4C 9CF2 FDBC 8DCA" /* ‹—®u /]ZjLœ..¼�Ê */ $"D293 6A2F 3668 4F40 426F 84AC B162 4A8C" /* Ò“j/6hO@Bo„¬±bJŒ */ $"8A84 6872 C7F5 B758 78A9 8467 4334 7E8B" /* Š„hrÇ.·Xx©„gC4~‹ */ $"6E60 8195 9BAC 5D12 4C60 5955 5DAD F6F5" /* n`�•›¬].L`YU]­.. */ $"A692 D5BC 855E 2346 6C54 3754 7E92 B6A5" /* ¦’Õ¼…^#FlT7T~’¶¥ */ $"4666 9584 7269 84CA EA9B 5188 A473 6B38" /* Ff•„ri„Ê.›Qˆ¤sk8 */ $"4789 9868 6B8E 9AA1 A938 1E5F 5C4F 546F" /* G‰˜hkŽš¡©8._\OTo */ $"B5FA E895 9BDC 9F88 4D25 4F7F 4A3B 6387" /* µ..•›.ŸˆM%O.J;c‡ */ $"9ABF 853E 8491 7B67 7784 DCDA 804E A288" /* š¿…>„‘{gw„..€N¢ˆ */ $"7862 3254 9F96 607E 94A1 A492 153C 6055" /* xb2TŸ–`~”¡¤’.<`U */ $"4269 6DCA FED1 89B4 C892 8737 2C5C 8B37" /* BimÊ.щ´È’‡7,\‹7 */ $"4B71 92A2 C256 5591 866C 7177 90E8 BF6E" /* Kq’¢ÂVU‘†lqw�.¿n */ $"5DA7 7483 5134 60BD 7D66 899B A5AB 6316" /* ]§tƒQ4`½}f‰›¥«c. */ $"5855 4D44 7574 E0F5 BC86 CAA4 9B77 2533" /* XUMDut..¼†Ê¤›w%3 */ $"7F76 335D 78A3 A9A9 4176 8C79 6287 67A8" /* .v3]x£©©AvŒyb‡g¨ */ $"DFA4 6079 8D7A 8938 4181 C26A 798C A8A1" /* .¤`y�z‰8A�ÂjyŒ¨¡ */ $"A934 355D 4946 616A 8BF4 E3B0 91C5 95A6" /* ©45]IFaj‹..°‘Å•¦ */ $"5423 439A 5141 6585 A4B5 7D4E 8C77 776B" /* T#CšQAe…¤µ}NŒwwk */ $"8362 C3CA 9257 8C72 8D70 294D AAA7 698A" /* ƒbÃÊ’WŒr�p)Mª§iŠ */ $"8FB0 A290 2552 4E4C 4A7A 5CAF F5D5 A1A8" /* �°¢�%RNLJz\¯.Õ¡¨ */ $"AB9D 9F33 2D5F 973B 566B 99A3 BB5A 6B88" /* «�Ÿ3-_—;Vk™£»Zkˆ */ $"7171 7E6A 73CD B181 5985 6897 4D2E 63C4" /* qq~jsͱ�Y…h—M.cÄ */ $"8277 8A96 AAAE 6731 6043 525A 7862 D1E9" /* ‚wŠ–ª®g1`CRZxbÑ. */ $"CC99 BA93 AD7E 253C 8574 4468 73A4 B0A5" /* Ì™º“­~%<…tDhs¤°¥ */ $"4C85 7D78 778B 5595 C7A3 6F6E 6C78 8D33" /* L…}xw‹U•Ç£onlx�3 */ $"3B7F B46E 8682 9EA7 A93B 4654 3B4F 7163" /* ;.´n†‚ž§©;FT;Oqc */ $"82E3 DCBE A0B4 90B4 5B28 5197 5656 657F" /* ‚..¾ ´�´[(Q—VVe. */ $"ABBF 7E60 9372 7C81 7B51 AEBE 9E6C 7E5E" /* «¿~`“r|�{Q®¾žl~^ */ $"927A 2F50 A299 7689 82A4 A385 2A58 403D" /* ’z/P¢™v‰‚¤£…*X@= */ $"5878 509D DCCB ACAD 9FA2 AA3C 316B 924C" /* XxP�.ˬ­Ÿ¢ª<1k’L */ $"6267 93AF BA63 7A88 6D85 9265 6BBB B08F" /* bg“¯ºczˆm…’ek»°� */ $"696F 5A9E 5F3A 71BA 8686 8F95 A7A7 6036" /* ioZž_:qº††�•§§`6 */ $"5730 4660 6851 B6D4 C7A3 B08A AF83 203B" /* W0F`hQ¶ÔÇ£°Š¯ƒ ; */ $"877B 5469 6F9C B3AB 5B8B 7878 8F96 5687" /* ‡{Tioœ³«[‹xx�–V‡ */ $"BAAA 8374 6374 953F 4385 AA6E 8E92 A7AB" /* ºªƒtct•?C…ªnŽ’§« */ $"A843 4D57 3956 7258 67C3 D1BC 9BA4 88B5" /* ¨CMW9VrXgÃѼ›¤ˆµ */ $"5F25 5091 5D57 606E 9BC1 916C 936F 829A" /* _%P‘]W`n›Á‘l“o‚š */ $"8E54 9BB5 A275 7C5A 877C 3559 A199 788F" /* ŽT›µ¢u|Z‡|5Y¡™x� */ $"8FA5 A584 2859 4C49 6678 4683 D2D3 B0A5" /* �¥¥„(YLIfxFƒÒÓ°¥ */ $"9495 AA48 2F62 8852 6261 82A3 C072 7780" /* ”•ªH/bˆRba‚£Àrw€ */ $"6389 A77A 68A9 B094 767D 5B97 643B 6BB6" /* c‰§zh©°”v}[—d;k¶ */ $"8E83 8A96 A9AD 6730 553E 4F64 5F3B 9FDA" /* ŽƒŠ–©­g0U>Od_;Ÿ. */ $"DAAD AD82 A89B 3B3A 7776 515F 6B8D A7AD" /* .­­‚¨›;:wvQ_k�§­ */ $"5E84 7573 92A5 6575 A2A3 867F 7071 934A" /* ^„us’¥eu¢£†.pq“J */ $"3F85 C187 8C8D A8AE B54E 3C4B 3856 6D53" /* ?…Á‡Œ�¨®µNQEK */ $"6684 4D61 B0DA BB9E 8B86 AE64 394F 8255" /* f„Ma°.»ž‹†®d9O‚U */ $"606E 969F BA70 748A 788B 9D84 568C B09D" /* `n–ŸºptŠx‹�„VŒ°� */ $"6A73 538A 6136 52B3 A783 738B A8BA 8F40" /* jsSŠa6R³§ƒs‹¨º�@ */ $"4D38 5677 8D4B 7EC3 E8B7 B182 9B97 4932" /* M8Vw�K~Ã.·±‚›—I2 */ $"5B7D 494E 6D95 98A4 608A 8A96 9BAD 6F6B" /* [}INm•˜¤`ŠŠ–›­ok */ $"9FBC 946A 635F 8E4F 355B BA8F 7C7B A0A2" /* Ÿ¼”jc_ŽO5[º�|{ ¢ */ $"B86A 4435 315B 7F80 4C84 C7E4 B7B8 8BBC" /* ¸jD51[.€L„Ç.·¸‹¼ */ $"8B52 468A 7447 496F 8A96 8B53 7676 9492" /* ‹RFŠtGIoŠ–‹Svv”’ */ $"A25A 79B2 CF87 7054 858A 4A41 77BA 837E" /* ¢Zy²Ï‡pT…ŠJAwºƒ~ */ $"85A3 9DAA 4E48 3244 5887 6450 86CC D2B0" /* …£�ªNH2DX‡dP†ÌÒ° */ $"AF98 B26D 575E A76F 575B 8B98 B377 6168" /* ¯˜²mW^§oW[‹˜³wah */ $"718C 908D 3D6B AABB 6A64 4E92 7D58 4A95" /* qŒ��=kª»jdN’}XJ• */ $"AA92 8594 A8A5 9846 4C33 555D 8A4C 60A3" /* ª’…”¨¥˜FL3U]ŠL`£ */ $"DCB7 B29A A694 5B4D 68A9 6251 589D A9C1" /* .·²š¦”[Mh©bQX�©Á */ $"747A 7595 A0B0 784C 71A8 9A5D 563E 7956" /* tzu• °xLq¨š]V>yV */ $"4D41 A094 8D8A A9A6 AD77 5443 4262 6A85" /* MA ”�Š©¦­wTCBbj… */ $"4A7A B2E1 ACB4 8BB3 8E5A 3979 905A 3B56" /* Jz².¬´‹³ŽZ9y�Z;V */ $"94AD B76A 7776 B6AF C97C 7094 C59C 7243" /* ”­·jwv¶¯É|p”ÅœrC */ $"5162 4334 47A3 7472 73AB 9CA6 5654 4B64" /* QbC4G£trs«œ¦VTKd */ $"6478 745E 81C4 DDAE AC8E B97B 5833 927F" /* dxt^�Ä.®¬Ž¹{X3’. */ $"5D41 668B AE8A 6260 77AA ACCA 7376 9ADA" /* ]Af‹®Šb`wª¬Êsvš. */ $"9E84 4F7A 7056 386E 9872 5A6D A29D 8F2F" /* ž„OzpV8n˜rZm¢��/ */ $"423E 6F58 8562 6A9C E1D6 AF96 A7AB 7750" /* B>oX…bjœ.Ö¯–§«wP */ $"43A1 7457 3777 8DB2 6F6E 6C86 94AB A366" /* C¡tW7w�²onl†”«£f */ $"6396 C08D 7D51 7E61 6448 A3AD 8D6F 93B4" /* c–À�}Q~adH£­�o“´ */ $"AC6A 3333 4163 597C 3E5D 93E9 C3B3 8DBD" /* ¬j33AcY|>]“.ó�½ */ $"B481 4A5E 9F7C 474A 8A9A A65F 6E62 958D" /* ´�J^Ÿ|GJŠš¦_nb•� */ $"BC8B 696C 98A0 7853 5165 4845 4BB9 A582" /* ¼‹il˜ xSQeHEK¹¥‚ */ $"6DBE CBCD 7157 4D63 6D69 693E 5699 DAB5" /* m¾ËÍqWMcmii>V™.µ */ $"9972 B192 7B40 8498 7B52 6A99 A493 6E72" /* ™r±’{@„˜{Rj™¤“nr */ $"7BA1 98BD 7B64 66AA 8E7B 3C61 5933 274E" /* {¡˜½{dfªŽ{.u ŽXb¬º˜QHJ€|¤ */ $"725C 85E4 E7D3 8CA5 A685 5545 896F 462F" /* r\…..ÓŒ¥¦…UE‰oF/ */ $"7D97 9252 6575 AFA0 B19F 7B77 9CAD 8763" /* }—’Reu¯ ±Ÿ{wœ­‡c */ $"5267 4A3B 2891 A07C 4C86 B5C7 7756 4453" /* RgJ;(‘ |L†µÇwVDS */ $"7571 925E 4E7A D4DF C990 A8A5 9E61 88A1" /* uq’^NzÔ.É�¨¥žaˆ¡ */ $"824D 528C 9A7B 4B5B 69A5 8DA2 7D5E 6BA7" /* ‚MRŒš{K[i¥�¢}^k§ */ $"A781 485C 6E56 333C A6A9 775A 98C1 BE66" /* §�H\nV3<¦©wZ˜Á¾f */ $"5045 7877 8284 5C56 84CD CAAB 8C94 837C" /* PExw‚„\V„ÍÊ«Œ”ƒ| */ $"5EA1 AA71 537E B3BF 7B62 708C A686 986C" /* ^¡ªqS~³¿{bpŒ¦†˜l */ $"4E59 9692 6333 4656 5631 54AA 9F7D 75AA" /* NY–’c3FVV1TªŸ}uª */ $"C7AA 6951 5683 7587 794E 5CA1 DACA 9E92" /* ǪiQVƒu‡yN\¡.Êž’ */ $"957A 6956 A99B 4F3E 7CC1 BA79 5B81 BDBC" /* •ziV©›O>|Áºy[�½¼ */ $"A4A8 7361 6B97 824E 3339 383E 265E A274" /* ¤¨sak—‚N398>&^¢t */ $"6D89 C0C2 945F 6379 896D 8E7B 4E66 A7DB" /* m‰À”_cy‰mŽ{Nf§. */ $"B999 8687 856E 6EB8 8B4E 4585 B4A3 6749" /* ¹™†‡…nn¸‹NE…´£gI */ $"7BB6 B2A8 AE5F 6F90 B48F 5C49 463E 3929" /* {¶²¨®_o�´�\IF>9) */ $"779A 5B58 86C0 A677 3E67 948A 6993 6C5F" /* wš[X†À¦w>g”Ši“l_ */ $"85B4 CEB5 A282 797F 737E BD65 4962 A9B1" /* …´Îµ¢‚y.s~½eIb©± */ $"8E5A 5387 A994 AB95 4460 87AC 876E 3D4E" /* ŽZS‡©”«•D`‡¬‡n=N */ $"5A5D 52AA 9C60 6C9C B88F 6334 5588 7660" /* Z]Rªœ`lœ¸�c4Uˆv` */ $"8A44 6F9A C9C6 BE9E 898B 8471 A1B4 4A45" /* ŠDošÉƾž‰‹„q¡´JE */ $"77B5 967E 4061 A1BD 85AD 7747 627A 927E" /* wµ–~@a¡½…­wGbz’~ */ $"6026 304E 5C75 C775 7898 D1BA 9A67 476E" /* `&0N\uÇux˜ÑºšgGn */ $"8E5D 667A 325C 91BE B3BA 828C 949D 7EC4" /* Ž]fz2\‘¾³º‚Œ”�~Ä */ $"9451 6A8D AD8B 723B 62B6 AD81 A950 5375" /* ”Qj�­‹r;b¶­�©PSu */ $"9479 7C50 1D26 4857 8EAE 4D6B 9ECB B199" /* ”y|P.&HWŽ®MkžË±™ */ $"5A61 97AA 628D 7746 7598 ABB0 B86B 6089" /* Za—ªb�wFu˜«°¸k`‰ */ $"928C BD61 5F8A B19A 8967 4E8A BB9D 8B9A" /* ’Œ½a_бš‰gNŠ»�‹š */ $"3A52 8285 777A 3C16 386A 5AA4 8445 79A2" /* :R‚…wz<.8jZ¤„Ey¢ */ $"B59D 8740 579A 9779 9869 679F B5AE D4C0" /* µ�‡@Wš—y˜igŸµ®ÔÀ */ $"6E61 928B A3A7 3C55 929C 8A75 5560 A5C9" /* na’‹£§]¸¢”wdC.­€xbK */ $"759B 93C8 DA97 538F BCD0 BC8A 63A8 AB8B" /* u›“È.—S�¼Ð¼Šc¨«‹ */ $"8877 4F5A B89F 8E65 485C 855F 707E 6F1B" /* ˆwOZ¸ŸŽeH\…_p~o. */ $"2C74 8684 6348 80BE 8B85 6750 3994 9F86" /* ,t†„cH€¾‹…gP9”Ÿ† */ $"5A54 669F 9A98 CACB 7F48 A1BC C98A 5C65" /* ZTfŸš˜ÊË.H¡¼ÉŠ\e */ $"AF96 948A 895D 8ACA B285 5B57 6D82 4D81" /* ¯–”Љ]ŠÊ²…[Wm‚M� */ $"7C58 0943 7E9E 7859 68A7 AB7B 726B 4F50" /* |XÆC~žxYh§«{rkOP */ $"AB9F 7C39 506F AA81 A5C6 BF71 64AE CCAF" /* «Ÿ|9Poª�¥Æ¿qd®Ì¯ */ $"645D 7DAC 7A82 736B 49A0 C7BE 7661 7589" /* d]}¬z‚skI Ç¾vau‰ */ $"7661 8381 450F 5B8D A552 5677 B78D 857C" /* vaƒ�E.[�¥RVw·�…| */ $"735B 6EB2 9D64 3665 91AA 82A6 B6A6 517E" /* s[n²�d6e‘ª‚¦¶¦Q~ */ $"AED4 8654 7A9B 9872 7C6A 625C B3BD 9C42" /* ®Ô†Tz›˜r|jb\³½œB */ $"4A6A 8E65 738F 823C 277A AB8F 3F68 96AC" /* JjŽes�‚<'z«�?h–¬ */ $"8183 6D69 5392 ADA9 5A3D 86A7 A184 B0BB" /* �ƒmiS’­©Z=†§¡„°» */ $"9962 96C7 B95D 5884 A178 7770 6468 7AB2" /* ™b–ǹ]X„¡xwpdhz² */ $"B87F 2553 7C7C 5869 7B5B 2147 90B7 774C" /* ¸.%S||Xi{[!G�·wL */ $"8BAB A385 7F60 6466 95B3 9535 3D93 AE8F" /* ‹«£….`df•³•5=“®� */ $"A2C4 B691 7AB1 C5A3 5279 A09A 7A6A 6762" /* ¢Ä¶‘z±Å£Ry šzjgb */ $"6986 AFB5 5B1F 7085 6555 7462 4930 5E93" /* i†¯µ[.p…eUtbI0^“ */ $"9453 4595 AC9C 8779 6A73 78AD B77C 1F58" /* ”SE•¬œ‡yjsx­·|.X */ $"A69B 98AC B194 908E BBCB 9457 93AF 946E" /* ¦›˜¬±”�Ž»Ë”W“¯”n */ $"6A69 7376 99BE 9440 277F 7063 686C 524E" /* jisv™¾”@'.pchlRN */ $"4062 8F7E 3A5A ACA0 8972 695B 7185 C3AE" /* @b�~:Z¬ ‰ri[q…î */ $"6629 78A5 A2A6 A499 9598 98C6 B674 52B7" /* f)x¥¢¦¤™•˜˜Æ¶tR· */ $"AC90 7C78 6F7B 84A7 B17C 323C 7E6B 685D" /* ¬�|xo{„§±|2<~kh] */ $"5944 5541 808F 6D38 85AF 8682 6A60 5D7A" /* YDUA€�m8…¯†‚j`]z */ $"90B3 9045 2287 9CB4 AB9F 949E 97B7 C597" /* �³�E"‡œ´«Ÿ”ž—·Å— */ $"6576 CCA0 917C 6E6B 9390 C4B2 722D 5378" /* evÌ ‘|nk“�IJr-Sx */ $"6D6C 504F 4446 567F 6D54 42A3 9594 836C" /* mlPODFV.mTB£•”ƒl */ $"6275 7A9D B273 3B31 8D95 A998 8785 989A" /* buz�²s;1�•©˜‡…˜š */ $"D0AA 8763 9DC2 A899 6C78 7F9E A9CD 9D5D" /* Ъ‡c�¨™lx.ž©Í�] */ $"2970 7282 744E 464D 4975 7B53 5557 A590" /* )pr‚tNFMIu{SUW¥� */ $"8A6D 6365 7B76 B99E 6C2F 4E86 95B5 8180" /* Šmce{v¹žl/N†•µ�€ */ $"7F91 A5BF 8B72 68AD B3B0 8B6D 7793 98C9" /* .‘¥¿‹rh­³°‹mw“˜É */ $"C67F 5933 7875 8E6E 414D 585E 9972 5A55" /* Æ.Y3xuŽnAMX^™rZU */ $"81A0 978C 5564 6A6C 89AF 815D 2F59 7BB0" /* � —ŒUdjl‰¯�]/Y{° */ $"B382 7B8E 88BC AD69 6F73 AAA1 9E75 5C85" /* ³‚{Žˆ¼­iosª¡žu\… */ $"8B9C DDA8 7A47 4869 8996 5246 545E 829C" /* ‹œ.¨zGHi‰–RFT^‚œ */ $"645B 6F9B A5AC 8B59 6C7F 67AB A261 522B" /* d[o›¥¬‹Yl.g«¢aR+ */ $"5281 B6A1 7285 859A D396 7070 909D A397" /* R�¶¡r……šÓ–pp��£— */ $"5060 8679 A7CB 8863 413D 639B 8D4A 4661" /* P`†y§ËˆcA=c›�JFa */ $"5FA7 8D4E 6B82 AAB2 B07D 558B 7B7E C891" /* _§�Nk‚ª²°}U‹{~È‘ */ $"6647 394D 9ABC 7A6C 827B B2C6 7D71 8193" /* fG9Mš¼zl‚{²Æ}q�“ */ $"A7B3 9057 6F92 6EC2 B365 562E 2B62 9C6E" /* §³�Wo’n³eV.+bœn */ $"2E51 4A6B B573 5C72 9EAD C4AC 6568 9878" /* .QJkµs\rž­Ä¬eh˜x */ $"A1C4 7F60 4C34 60BD B976 7491 74D3 AD5D" /* ¡Ä.`L4`½¹vt‘tÓ­] */ $"7183 94A7 AC7E 508C 7E88 D9A3 7246 3124" /* qƒ”§¬~PŒ~ˆ.£rF1$ */ $"7B92 4728 4E36 7FA6 5556 8394 AFC7 A063" /* {’G(N6.¦UVƒ”¯Ç c */ $"78A7 72C8 B170 5B47 3D7B C9AD 6B91 7F93" /* x§rȱp[G={É­k‘.“ */ $"E998 6B78 978E B79C 5651 906A 9DD0 9061" /* .˜kx—Ž·œVQ�j�Ð�a */ $"4421 3B95 9643 3056 2DA1 843D 5481 91B1" /* D!;•–C0V-¡„=T�‘± */ $"BF84 5597 8483 D6A2 7052 5341 A2CB 976C" /* ¿„U—„ƒÖ¢pRSA¢Ë—l */ $"A17C B3E2 846B 8D95 A1BF 9551 6A98 5CC4" /* ¡|³.„k�•¡¿•Qj˜\Ä */ $"AF6D 4A36 184B A084 3049 3F4A B479 4357" /* ¯mJ6.K „0I?J´yCW */ $"948B BFA7 6254 9C6A 9BCF 8662 5338 52BA" /* ”‹¿§bTœj›Ï†bS8Rº */ $"D18C 7EAF 78E3 C975 6CA1 A0A8 BE83 4D8B" /* ÑŒ~¯x.Éul¡ ¨¾ƒM‹ */ $"7E76 D7A5 6B47 3511 708E 5E1F 4E27 68B5" /* ~v×¥kG5.pŽ^.N'hµ */ $"6043 6E93 98C4 A955 679D 59BC AC6B 4945" /* `Cn“˜Ä©Ug�Y¼¬kIE */ $"2A68 C6BB 7C93 8B8D F1B9 7580 BA9F C2B1" /* *hÆ»|“‹�.¹u€ºŸÂ± */ $"6E53 A872 95DD 9463 4822 2986 974F 3151" /* nS¨r•.”cH")†—O1Q */ $"1F9A 8A43 3A7C 8CA0 C790 5186 8469 D1A9" /* .šŠC:|Œ Ç�Q†„iÑ© */ $"5F43 4027 87B7 9C63 966C ACF0 9573 8AA9" /* _C@'‡·œc–l¬.•sŠ© */ $"A2C7 AB65 73B1 6AC6 CB81 534D 2245 9C8F" /* ¢Ç«es±jÆË�SM"Eœ� */ $"4148 3939 B27D 4551 8F8B B9A9 724A 9569" /* AH99²}EQ�‹¹©rJ•i */ $"86DA 8F57 4332 3AA3 CA89 7497 61D1 C474" /* †.�WC2:£Ê‰t—aÑÄt */ $"5D91 98A8 BC90 5D86 8F71 DCBC 7856 4A25" /* ]‘˜¨¼�]†�q.¼xVJ% */ $"6798 7834 5E2B 65B8 6B46 678E 97C0 A66A" /* g˜x4^+e¸kFgŽ—À¦j */ $"679E 61B4 BC77 4440 2F59 B7C3 7D89 8177" /* gža´¼wD@/Y·Ã}‰�w */ $"EBBA 6C6F 9E92 B19A 6C46 8F6C 88DC A26B" /* .ºlož’±šlF�lˆ.¢k */ $"4836 2D78 A169 465E 298E 9C52 427E 90AC" /* H6-x¡iF^)ŽœRB~�¬ */ $"C09A 6081 8664 CDB2 6E46 463A 77B7 AF6F" /* Àš`�†dͲnFF:w·¯o */ $"9677 A1F1 A56B 7E9C A0B7 995E 6195 54A8" /* –w¡.¥k~œ ·™^a•T¨ */ $"BE79 493E 283C 869C 574C 4832 A190 4F54" /* ¾yI>(<†œWLH2¡�OT */ $"8D9A B6A9 805C 976A 85DC 9C5F 4337 3C8F" /* �š¶©€\—j….œ_C7<� */ $"C5A2 7EA3 76C7 DE8A 618B ABB5 B392 5B78" /* Å¢~£vÇ.Ša‹«µ³’[x */ $"7E60 CBB3 6F4E 3E21 4F7D 763B 522E 4BAC" /* ~`˳oN>!O}v;R.K¬ */ $"7A47 5B92 A0AD A97F 739D 60AA C57D 5341" /* zG[’ ­©.s�`ªÅ}SA */ $"325A A4C1 928C 8774 E5D0 7D6D A4B6 B4A0" /* 2Z¤Á’Œ‡t.Ð}m¤¶´  */ $"7C4E 8672 87DB A56B 4732 3366 886F 4A55" /* |N†r‡.¥kG23fˆoJU */ $"1A6E 924C 3566 97A2 A9A3 727F 8961 BEBE" /* .n’L5f—¢©£r.‰a¾¾ */ $"7E52 453E 6C9F B289 9673 99F2 B073 73A1" /* ~RE>lŸ²‰–s™.°ss¡ */ $"B1AD A173 6197 69A5 CD89 503C 3C48 748F" /* ±­¡sa—i¥Í‰P<o¯ */ $"A69D 756A 866B CDA6 8B50 4743 545B B093" /* ¦�uj†kͦ‹PGCT[°“ */ $"9D6B 88DC BE8C 5E87 BAD0 A58D 5E9D 73C4" /* �kˆ.¾Œ^‡ºÐ¥�^�sÄ */ $"BE9D 7059 484F 487F 855F 4E1D 867D 662F" /* ¾�pYHOH.…_N.†}f/ */ $"4C85 C098 9754 8A71 94C5 9B7D 4E46 4060" /* L…À˜—TŠq”Å›}NF@` */ $"79B9 92A4 60AC C1AE 6A5E 82CC B6A5 6967" /* y¹’¤`¬Á®j^‚̶¥ig */ $"8D7D D9AD 9B6B 6445 5E4B 8E6A 7632 4585" /* �}.­›kdE^KŽjv2E… */ $"7D58 2A52 97C1 9B87 5397 75BB A491 665C" /* }X*R—Á›‡S—u»¤‘f\ */ $"3253 5B98 AA9F 9063 C7B7 A960 6B93 D9A4" /* 2S[˜ªŸ�cÇ·©`k“.¤ */ $"9747 7B79 A7BE A389 664D 4061 5D91 6C7B" /* —G{y§¾£‰fM@a]‘l{ */ $"2772 7477 443C 56B6 B6A7 6962 8E8A C792" /* 'rtwD`eˆg */ $"6556 4953 6F3E 4981 B7A3 6C60 80BA B67F" /* eVISo>I�·£l`€º¶. */ $"7495 5949 2656 76A5 9D8B 8581 809C 886D" /* t•YI&Vv¥�‹…�€œˆm */ $"A1C0 CF96 7C77 B9CB BA99 AF74 4F2F 4268" /* ¡ÀÏ–|w¹Ëº™¯tO/Bh */ $"7A81 6465 5449 4C63 3D76 92BB A07A 6593" /* z�deTILc=v’» ze“ */ $"B9AB 7E85 7E58 4424 5379 AC98 9882 827B" /* ¹«~…~XD$Sy¬˜˜‚‚{ */ $"9A6D 7B96 AFBD 917A 8CC5 C9AB 98A6 695B" /* šm{–¯½‘zŒÅÉ«˜¦i[ */ $"2748 768E 6E5B 5258 4B56 4F54 8C91 AD8D" /* 'HvŽn[RXKVOTŒ‘­� */ $"7873 AEC1 B28A 9766 5C33 2164 92A3 998F" /* xs®Á²Š—f\3!d’£™� */ $"8475 7289 74A3 9CAA B195 7394 AFBD A1A2" /* „ur‰t£œª±•s”¯½¡¢ */ $"8E6E 581B 4683 8D6F 5F56 5F4F 583D 6B88" /* ŽnX.Fƒ�o_V_OX=kˆ */ $"8AA6 956F 8BAD C1A5 8888 686B 3132 87AA" /* Ц•o‹­Á¥ˆˆhk12‡ª */ $"968F 8088 7172 7290 B38F 92AB 898A A0B6" /* –�€ˆqrr�³�’«‰Š ¶ */ $"BEA2 9E72 6935 0A54 9983 7253 6053 4848" /* ¾¢žri5.T™ƒrS`SHH */ $"548F 8C7F B394 718A 9DC7 A491 7276 6222" /* T�Œ.³”qŠ�Ǥ‘rvb" */ $"36A0 A09C 8991 9778 6E6B A6B0 7C97 AB82" /* 6  œ‰‘—xnk¦°|—«‚ */ $"A194 C0A8 9C86 7B6D 270C 7A93 745B 3D62" /* ¡”À¨œ†{m'.z“t[=b */ $"4747 4079 9D7D 70BB 838E 88B0 CAAD 8769" /* GG@y�}p»ƒŽˆ°Ê­‡i */ $"704A 185F B593 A575 A382 7159 87C3 B479" /* pJ._µ“¥u£‚qY‡Ã´y */ $"BBA3 8C97 92C7 A494 7387 5717 1795 7984" /* »£Œ—’Ǥ”s‡W..•y„ */ $"4A51 6649 3344 8892 5C81 B785 A17A C3B3" /* JQfI3Dˆ’\�·…¡zó */ $"A970 796F 3D18 96A3 9587 6DB0 8667 5EAD" /* ©pyo=.–£•‡m°†g^­ */ $"C9A2 72CA 90AC 8FB6 D3B2 8074 7A42 093D" /* É¢rÊ�¬�¶Ó²€tzBÆ= */ $"8C72 802E 674F 3D24 6F9D 8F51 A49A 9486" /* Œr€.gO=$o��Q¤š”† */ $"77C7 B095 7486 5B29 22AF 8EA8 6A89 B085" /* wǰ•t†[)"¯Ž¨j‰°… */ $"4F70 B7BF 8798 BF9E B67F D5C1 A971 8B73" /* Op·¿‡˜¿ž¶.ÕÁ©q‹s */ $"3E0C 6A78 7B5C 3071 4925 318B 9875 51A8" /* >.jx{\0qI%1‹˜uQ¨ */ $"8BB3 75A1 C9AE 7E7A 7344 1150 A49A A354" /* ‹³u¡É®~zsD.P¤š£T */ $"A499 734D 95BC B57D B49F AD95 87DF C498" /* ¤™sM•¼µ}´Ÿ­•‡.Ę */ $"818D 5D2C 1579 6A8C 3E5B 7845 194C 8F91" /* ��],.yjŒ>[xE.L�‘ */ $"5F70 9299 B066 B8B9 9C7C 936A 4518 778E" /* _p’™°f¸¹œ|“jE.wŽ */ $"A77A 5AA9 8B60 67AD B5A1 84B1 9DC4 7DA8" /* §zZ©‹`g­µ¡„±�Ä}¨ */ $"E0B7 8386 7148 1B3C 6F7E 7F2C 7265 3122" /* .·ƒ†qH.=+NŽX(sR,PamŽ…f */ $"8DB8 7991 D39D 9395 6546 4F3E 4FA2 A75D" /* �¸y‘Ó�“•eFO>O¢§] */ $"96A1 6B7F 9D9C B3C0 8A95 D2AD 88D2 B897" /* –¡k.�œ³ÀŠ•Ò­ˆÒ¸— */ $"A67B 4742 332B 6696 4548 7D40 3F5C 5E6C" /* ¦{GB3+f–EH}@?\^l */ $"9670 5D9D A66D ADC6 969E 8D55 4A52 3960" /* –p]�¦m­Æ–ž�UJR9` */ $"AD8A 61AA 8971 9297 97C1 B080 A4D4 939D" /* ­Šaª‰q’——Á°€¤Ô“� */ $"DDA6 A3A2 6C41 4A28 2C7C 7F35 5F68 3D53" /* .¦£¢lAJ(,|.5_h=S */ $"665E 859C 646D AD92 6DC4 A68D 9C74 4551" /* f^…œdm­’mĦ�œtEQ */ $"4D3A 79B3 7377 AD7A 8097 92A0 CD9C 82B8" /* M:y³sw­z€—’ Íœ‚¸ */ $"C383 BDCC 9CA8 9352 424E 2143 8E6F 3775" /* ý̜¨“RBN!CŽo7u */ $"513F 5E5E 6394 8E64 84B7 7F91 CD97 9C95" /* Q?^^c”Žd„·.‘Í—œ• */ $"6239 5831 3788 9F61 8EA0 758F 9B90 B2CC" /* b9X17ˆŸaŽ u�›�²Ì */ $"9390 C5B0 8BD8 B1A0 A57B 434D 3D20 548B" /* “�Ű‹Ø± ¥{CM= T‹ */ $"4E46 7940 5167 646D A37D 6795 AA78 AFBF" /* NFy@Qgdm£}g•ªx¯¿ */ $"99A2 8F53 4A57 2F50 978F 5BA1 7A71 8E8E" /* ™¢�SJW/P—�[¡zqŽŽ */ $"8EBF C08F 9ECA 9CA5 DBA9 A79D 6C40 5428" /* Ž¿À�žÊœ¥.©§�l@T( */ $"2A61 7E3C 5F65 3D58 6359 79A2 7475 A8A3" /* *a~<_e=XcYy¢tu¨£ */ $"7FCA AC9B 9F7C 4A54 4938 61A4 7B75 A573" /* .ʬ›Ÿ|JTI8a¤{u¥s */ $"8696 9291 C8A0 86A3 BC8D BFD0 A5A8 9359" /* †–’‘È †£¼�¿Ð¥¨“Y */ $"4A4E 2A37 7271 3872 4744 575D 598C 9270" /* JN*7rq8rGDW]YŒ’p */ $"7CA8 8A93 D1A1 A69E 724A 5D3C 3F71 A069" /* |¨Š“Ñ¡¦žrJ]QŽmŒ–wŽ›š¦¿ */ $"B0A6 ACBF 97DF BBAA 9C85 544E 3E36 3567" /* °¦¬¿—.»ªœ…TN>65g */ $"5B47 753E 515E 6B66 8980 8376 9E83 B5CA" /* [Gu>Q^kf‰€ƒvžƒµÊ */ $"A49C 8962 4D51 3D49 648F 63A0 7A74 8A9A" /* ¤œ‰bMQ=Id�c ztŠš */ $"99AF B6B3 9AB1 A7A6 E3B2 B29A 8154 5636" /* ™¯¶³š±§¦.²²š�TV6 */ $"3D3D 704B 6165 3B51 6164 6C8B 8686 85A5" /* ==pKae;Qadl‹††…¥ */ $"83CB B09D 8E78 5850 4648 4476 7C74 A771" /* ƒË°�ŽxXPFHDv|t§q */ $"8490 A195 B6A9 A992 B59A BFDB AFA5 8D6D" /* „�¡•¶©©’µš¿.¯¥�m */ $"514C 3D42 4E77 497B 4F45 5867 6678 8589" /* QL=BNwI{OEXgfx…‰ */ $"7993 9190 D5A8 A48C 7C51 513B 4643 7D71" /* y“‘�Õ¨¤Œ|QQ;FC}q */ $"8C9A 7387 959A A1B5 ABA6 99B6 8ED9 BEA6" /* Œšs‡•𡵫¦™¶Ž.¾¦ */ $"9680 6351 4745 375A 6352 7B47 555F 736C" /* –€cQGE7ZcR{GU_sl */ $"887E 8E7A 9B86 ABCD A09B 8468 4E4C 444B" /* ˆ~Žz›†«Í ›„hNLDK */ $"558E 6BA3 8178 8696 A1AA B0B2 9BA5 A29F" /* UŽk£�x†–¡ª°²›¥¢Ÿ */ $"E0B0 A78C 7951 5236 3E2F 6355 6274 4755" /* .°§ŒyQR6>/cUbtGU */ $"616F 7483 8A90 84A8 85CF B7A5 947A 614F" /* aotƒŠ�„¨…Ï·¥”zaO */ $"4744 3F64 7A71 A57B 848F A9A0 B4A7 B591" /* GD?dzq¥{„�© ´§µ‘ */ $"AE9D B7DB ADA2 8269 534B 3B39 3867 4178" /* ®�·.­¢‚iSK;98gAx */ $"5344 4F64 7077 8891 818F 9B94 D5B4 AC8E" /* SDOdpwˆ‘��›”Õ´¬Ž */ $"7E5A 5C3E 4E3F 7471 859E 6F84 909E A1B1" /* ~Z\>N?tq…žo„�ž¡± */ $"B2AE 9BBD 94D6 C4AF 927A 6652 483F 3044" /* ²®›½”Öį’zfRH?0D */ $"5B4E 7A49 4D55 6A65 8378 8E74 9A8F A8D7" /* [NzIMUjeƒxŽtš�¨× */ $"AAA1 8371 5955 4D4E 4C85 6CA4 8680 8897" /* ª¡ƒqYUMNL…l¤†€ˆ— */ $"A2A9 B0AF 9FA1 A99B DFBB AC8F 7E58 593C" /* ¢©°¯Ÿ¡©›.»¬�~XY< */ $"4324 5553 5C73 4350 5467 7080 8289 799F" /* C$US\sCPTgp€‚‰yŸ */ $"80C8 B9A7 8F7B 6558 564D 435B 8073 AA87" /* €È¹§�{eXVMC[€sª‡ */ $"8A8F A5A2 B8A6 BB93 AFA0 B3DB ACA5 806C" /* Š�¥¢¸¦»“¯ ³.¬¥€l */ $"5353 403C 3268 4678 5D4D 4C5E 6973 7F87" /* SS@<2hFx]ML^is.‡ */ $"7B7E 978C D0AF A786 7658 6341 4E36 6E74" /* {~—ŒÐ¯§†vXcAN6nt */ $"86AD 818F 94A5 A4B8 B5B3 95BB 97D2 C5B5" /* †­��”¥¤¸µ³•»—Òŵ */ $"947C 6358 4B3D 313A 5B48 7D54 5559 6C65" /* ”|cXK=1:[H}TUYle */ $"867D 906C 938C 9ECC A79C 786A 565A 4549" /* †}�l“ŒžÌ§œxjVZEI */ $"3B7A 69A1 8F88 8C9D A1AF BEBA A6A1 B59D" /* ;zi¡�ˆŒ�¡¯¾º¦¡µ� */ $"DEC0 B08B 7B57 5F3D 4520 4E51 5973 4B5A" /* .À°‹{W_=E NQYsKZ */ $"5664 6687 848A 76A2 84C2 BFAC 8C7A 5D58" /* Vdf‡„Šv¢„¿¬Œz]X */ $"5246 3746 796B A587 928E A09B BCB0 BB95" /* RF7Fyk¥‡’Ž ›¼°»• */ $"B1A7 B7E3 BBA9 8671 5660 4238 2360 456F" /* ±§·.»©†qV`B8#`Eo */ $"5F5B 5560 6273 8487 7D79 9686 CEB5 A988" /* _[U`bs„‡}y–†Îµ©ˆ */ $"7856 6749 4A2C 646C 7B9F 8892 8D9F 9CBF" /* xVgIJ,dl{Ÿˆ’�Ÿœ¿ */ $"B3B6 92B7 9ACF CCB9 9780 6463 5A42 2B38" /* ³¶’·šÏ̹—€dcZB+8 */ $"5F48 7C5C 5F55 695C 837E 906E 8C8C 9BCA" /* _H|\_Ui\ƒ~�nŒŒ›Ê */ $"AE9D 7669 5663 4642 3877 6698 9793 919B" /* ®�viVcFB8wf˜—“‘› */ $"94A6 B7B7 A497 B19A DCC6 B488 795E 6746" /* ”¦··¤—±š.Æ´ˆy^gF */ $"3C21 4C52 5D7A 6162 5F67 6689 8187 6B94" /* 9Mrƒqwmˆpf‚ */ $"8C8E 5270 BCC9 9672 5A80 634E 3740 5058" /* ŒŽRp¼É–rZ€cN7@PX */ $"80AC A19D A7B0 B38C A3B4 BB80 78BF E7BF" /* €¬¡�§°³Œ£´»€x¿.¿ */ $"9468 8376 553B 2B46 3952 847B 6772 7888" /* ”hƒvU;+F9R„{grxˆ */ $"6268 8995 7455 84D0 BC8F 6569 7D5B 4033" /* bh‰•tU„м�ei}[@3 */ $"4A4F 5DA1 B29A A4AB BE99 8DA6 B6A7 787E" /* JO]¡²š¤«¾™�¦¶§x~ */ $"D8DC B385 718C 7149 3A39 3C38 6293 6870" /* Ø.³…qŒqI:9<8b“hp */ $"798B 775E 6987 8766 4DA2 CEAA 7E5D 7E70" /* y‹w^i‡‡fM¢Îª~]~p */ $"553E 4345 556E BA9E 99AA B9B7 9A8E AEB4" /* U>CEUnºž™ª¹·šŽ®´ */ $"976A 8FEB C5A4 7486 7E66 4743 3440 4286" /* —j�.Ťt†~fGC4@B† */ $"866A 767F 896C 5B6B 947A 5D53 C4B8 956E" /* †jv.‰l[k”z]Sĸ•n */ $"6E6F 694A 4A3A 4D5B 8AC2 95A6 AACB AB93" /* noiJJ:M[ŠÂ•¦ªË«“ */ $"86B8 A18B 63C2 E0B7 9580 7E73 6044 412C" /* †¸¡‹cÂ.·•€~s`DA, */ $"4D48 9F78 6F76 9682 6B51 8982 6C49 74CA" /* MHŸxov–‚kQ‰‚lItÊ */ $"9A92 6A78 6368 3F4E 325A 57AF B995 A3C5" /* š’jxch?N2ZW¯¹•£Å */ $"C4A3 8898 B986 8571 DBBF AD8A 8875 7D50" /* Ä£ˆ˜¹†…q.¿­Šˆu}P */ $"5535 383E 69A6 6171 849E 7267 5C95 696C" /* U58>i¦aq„žrg\•il */ $"4C9F B899 8073 6565 5245 522F 5E6A CE9B" /* LŸ¸™€seeRER/^jΛ */ $"97B1 D3AF A284 B09A 8B75 94DB AEA6 8B8D" /* —±Ó¯¢„°š‹u”.®¦‹� */ $"6F6F 455F 203F 4597 8F64 7A9C 8773 5F6B" /* ooE_ ?E—�dzœ‡s_k */ $"885D 6658 BEA0 927D 7F5D 6847 6436 3757" /* ˆ]fX¾ ’}.]hGd67W */ $"8EC6 89A5 C1CB A59D 7FB7 8286 70BD CBA4" /* ŽÆ‰¥ÁË¥�.·‚†p½Ë¤ */ $"9F9E 7872 5E5A 511A 4757 A66D 6A86 9B7E" /* Ÿžxr^ZQ.GW¦mj†›~ */ $"7A55 896F 5A5A 82BC 878B 8C71 5A65 4D6C" /* zU‰oZZ‚¼‡‹ŒqZeMl */ $"2747 65B7 B492 ADCD B4A5 8596 A76F 7B86" /* 'Ge·´’­Í´¥…–§o{† */ $"D2A8 A0AA 946D 7753 7038 2644 779D 6071" /* Ò¨ ª”mwSp8&Dw�`q */ $"9B90 776B 588F 5155 66A8 A384 938E 6065" /* ›�wkX�QUf¨£„“Ž`e */ $"5460 5E28 4E81 CE9E 99C6 CAAC A681 B084" /* T`^(N�Ξ™ÆÊ¬¦�°„ */ $"657A A1C5 95A3 AF81 716C 5874 2726 5297" /* ez¡Å•£¯�qlXt'&R— */ $"855E 879E 7D76 5B70 7943 587A B087 819E" /* …^‡ž}v[pyCXz°‡�ž */ $"7D60 644E 7A4A 275E A3C5 90AB DAB9 B09E" /* }`dNzJ'^£Å�«.¹°ž */ $"8BAD 6D61 8AC0 B391 AEA7 746F 5A6F 641A" /* ‹­maŠÀ³‘®§toZod. */ $"2E6D 9E6D 679F 8A79 7454 8360 375D 93A6" /* .mžmgŸŠytTƒ`7]“¦ */ $"7388 A76B 6056 587A 372C 78BD B295 C9D5" /* sˆ§k`VXz7,x½²•ÉÕ */ $"B1B1 8C9F 9C5B 64A5 CA98 8FC2 9274 6F59" /* ±±ŒŸœ[d¥Ê˜�Â’toY */ $"814B 113D 8393 5E79 A57A 7D66 6183 4830" /* �K.=ƒ“^y¥z}faƒH0 */ $"74AB 8F6E 9E95 5E5E 496C 6E2B 3A91 C49E" /* t«�nž•^^Iln+:‘Äž */ $"9FE0 C0B5 AA8B B186 4B7A BEBE 87A5 C480" /* Ÿ.Àµª‹±†Kz¾¾‡¥Ä€ */ $"7A63 6480 380E 5798 805C 9494 7176 5771" /* zcd€8.W˜€\””qvWq */ $"722E 3B91 AE7A 75B0 7963 5A49 7F5E 1C4E" /* r.;‘®zu°ycZI.^.N */ $"A8BC 8FBA E6AF B599 93AC 6C45 97CE AC87" /* ¨¼�º.¯µ™“¬lE—ά‡ */ $"C2B3 7F7C 5A78 7A25 1B74 9A69 68AA 7B75" /* ³.|Zxz%.tšihª{u */ $"7156 7D5C 1850 A2A1 6589 AB66 694C 5784" /* qV}\.P¢¡e‰«fiLW„ */ $"4917 71B8 A892 DAD1 A8B0 8B9E A253 53B4" /* I.q¸¨’.Ѩ°‹ž¢SS´ */ $"C790 8FCF 9785 735C 8B6C 153F 8D87 5B8A" /* Ç��Ï—…s\‹l.?�‡[Š */ $"AA6E 7E63 6082 461D 7BAE 8461 A190 6569" /* ªn~c`‚F.{®„a¡�ei */ $"486B 8233 3597 AC89 A1E6 B2AB A183 AB8F" /* Hk‚35—¬‰¡.²«¡ƒ«� */ $"4078 C5AF 78A5 BF81 8662 618E 511A 6A8E" /* @xůx¥¿�†baŽQ.jŽ */ $"6A64 AE9C 757F 5A71 832E 379F A166 70A9" /* jd®œu.Zqƒ.7Ÿ¡fp© */ $"7772 684D 8277 2A61 A48F 75BD D9A0 AC8C" /* wrhM‚w*a¤�u½. ¬Œ */ $"87B3 7242 A3C5 8E78 B8A0 7B80 556A 8D38" /* ‡³rB£ÅŽx¸ {€Uj�8 */ $"3886 7650 79BB 8780 765B 8778 266A AC84" /* 8†vPy»‡€v[‡x&j¬„ */ $"568E 9D6B 7E62 598D 6438 9098 707A D0C1" /* VŽ�k~bY�d8�˜pzÐÁ */ $"9EA6 838F AB59 68C4 A979 89B8 8280 7754" /* ž¦ƒ�«YhÄ©y‰¸‚€wT */ $"7676 2C5E 8660 4D97 AF7E 886F 6384 5934" /* vv,^†`M—¯~ˆoc„Y4 */ $"909A 7166 9E8C 7382 636B 9150 569A 856D" /* �šqfžŒs‚ck‘PVš…m */ $"8FCA A5A5 A285 9592 5990 BB9A 799B A47B" /* �Ê¥¥¢…•’Y�»šy›¤{ */ $"846D 5F81 6238 7273 5C61 9B94 7D88 6E65" /* „m_�b8rs\a›”}ˆne */ $"7E4B 5892 846E 7295 7B7C 7D6D 8289 5979" /* ~KX’„nr•{|}m‚‰Yy */ $"907B 749E B29C A89C 8496 8470 A6A5 8E7E" /* �{tž²œ¨œ„–„p¦¥Ž~ */ $"968E 787E 6F6A 7D55 5572 615C 6E90 8686" /* –Žx~oj}UUra\n�†† */ $"886D 7073 5673 8779 6978 8274 7B81 7A8E" /* ˆmpsVs‡yix‚t{�zŽ */ $"8371 8981 7B7F 99A6 9FA7 9587 997B 859D" /* ƒq‰�{.™¦Ÿ§•‡™{…� */ $"9788 7E88 7D76 7E6E 747A 6064 6462 606F" /* —ˆ~ˆ}v~ntz`ddb`o */ $"8384 8481 6C7A 6F65 797C 7B72 777A 7180" /* ƒ„„�lzoey|{rwzq€ */ $"807B 9681 7E7D 7D80 839E A8A2 A692 9599" /* €{–�~}}€ƒž¨¢¦’•™ */ $"8790 9190 8580 7C73 737B 6A7B 7464 655E" /* ‡�‘�…€|ss{j{tde^ */ $"5E5E 7489 8084 7D6E 7967 7176 7778 7378" /* ^^t‰€„}nygqvwxsx */ $"7975 8480 8B90 7F83 7C79 7B8A 9FA4 A1A8" /* yu„€‹�.ƒ|y{ŠŸ¤¡¨ */ $"9598 9090 988F 8E85 7D81 7275 7772 7A62" /* •˜��˜�Ž…}�ruwrzb */ $"675F 595E 6375 8681 8C7E 7672 6E7A 7679" /* g_Y^cu†�Œ~vrnzvy */ $"776B 7277 7284 8493 8786 8176 7E85 879F" /* wkrwr„„“‡†�v~…‡Ÿ */ $"9FA4 A293 988B 948D 8F90 8078 7F6D 7976" /* Ÿ¤¢“˜‹”���€x.myv */ $"7B77 6E69 5759 6060 7182 7E87 767D 7378" /* {wniWY``q‚~‡v}sx */ $"7878 7E78 6B7A 737D 8988 9288 8A77 767D" /* xx~xkzs}‰ˆ’ˆŠwv} */ $"7F8A A59D A49A 9B98 9192 898E 8A79 7675" /* .Š¥�¤š›˜‘’‰ŽŠyvu */ $"6C7D 757F 7571 5F55 595E 627F 8081 8178" /* l}u.uq_UY^b.€��x */ $"7D6F 7972 767B 736E 7A73 8687 9193 8D88" /* }oyrv{snzs†‡‘“�ˆ */ $"7A7A 7B7E 93A2 9BA5 989E 9093 8E88 8C86" /* zz{~“¢›¥˜ž�“ŽˆŒ† */ $"7679 7073 7978 806E 6D5D 585A 5F6C 8379" /* vypsyx€nm]XZ_lƒy */ $"857B 7E7A 757B 747A 7970 7077 7487 8797" /* …{~zu{tzyppwt‡‡— */ $"8C8C 877B 767E 86A0 A1A4 A298 9B8A 928C" /* ŒŒ‡{v~† ¡¤¢˜›Š’Œ */ $"8C89 7F73 7A6A 7575 7F76 6B6C 5B55 5B61" /* Œ‰.szjuu.vkl[U[a */ $"7281 7E87 7B84 7276 7777 7778 6D78 757B" /* r�~‡{„rvwwwxmxu{ */ $"898E 9686 8E80 777A 8089 A29D A79B A297" /* ‰Ž–†Ž€wz€‰¢�§›¢— */ $"8F96 8F8C 8778 7274 6A79 7480 6F6F 6455" /* �–�Œ‡xrtjyt€oodU */ $"555E 607B 7F81 8280 826F 7977 787A 776C" /* U^`{.�‚€‚oywxzwl */ $"766E 8284 9493 8C8C 7C78 7B7F 90A2 9DA4" /* vn‚„”“ŒŒ|x{.�¢�¤ */ $"9CA4 9192 928E 8988 7577 7074 7776 7E6A" /* œ¤‘’’މˆuwptwv~j */ $"6D5E 5554 5B66 7F7A 847D 857C 747C 7778" /* m^UT[f.z„}…|t|wx */ $"7C72 6D75 7586 879B 8D8C 8579 737E 839B" /* |rmuu†‡›�Œ…ys~ƒ› */ $"9FA1 A29D A08D 958F 8B8B 8272 776D 7772" /* Ÿ¡¢� �•�‹‹‚rwmwr */ $"8178 6D6E 5E52 555D 6B7E 7C85 7C86 7677" /* �xmn^RU]k~|…|†vw */ $"7976 797C 6D76 747C 868F 9987 8F83 7778" /* yvy|mvt|†�™‡�ƒwx */ $"8287 9D9A A499 A39A 9095 8E8C 8A7B 7374" /* ‚‡�𤙣š�•ŽŒŠ{st */ $"6B77 7581 706F 6957 505D 5E78 7F83 807D" /* kwu�poiWP]^x.ƒ€} */ $"836E 7977 7779 766D 7670 8285 9792 8D90" /* ƒnywwyvmvp‚…—’�� */ $"7F75 7D80 8CA0 9DA4 9BA7 9090 928A 888A" /* .u}€Œ �¤›§��’ŠˆŠ */ $"7777 6E73 7778 7E6B 7060 5456 5C62 7D7B" /* wwnswx~kp`TV\b}{ */ $"857C 887D 7680 7875 7C70 6A73 7385 8498" /* …|ˆ}v€xu|pjss…„˜ */ $"8D8E 897A 7882 809B 9FA4 A2A0 A18C 978E" /* �މzx‚€›Ÿ¤¢ ¡Œ—Ž */ $"898D 866F 746A 7570 807A 6F6D 5C53 5A59" /* ‰�†otjup€zom\SZY */ $"697D 7B86 7C86 767B 7A74 7980 6A75 747D" /* i}{†|†v{zty€jut} */ $"828B 9787 9182 777A 8084 9E9D A89E A69C" /* ‚‹—‡‘‚wz€„ž�¨ž¦œ */ $"9697 8C8B 9079 6F75 6B77 7283 6F6F 6653" /* –—Œ‹�youkwrƒoofS */ $"535F 5A74 7B83 827E 8374 7D74 757D 7768" /* S_Zt{ƒ‚~ƒt}tu}wh */ $"786F 8082 9692 9091 7E76 817B 88A1 9EA7" /* xo€‚–’�‘~v�{ˆ¡ž§ */ $"9AA6 9697 938C 8F8E 737A 7072 7578 7D6C" /* 𦖗“Œ�Žszprux}l */ $"725C 535A 5D59 7978 837A 847C 777C 7576" /* r\SZ]Yyxƒz„|w|uv */ $"806E 6C76 7084 8397 8D92 8777 7B86 7A98" /* €nlvp„ƒ—�’‡w{†z˜ */ $"A1A5 A29F A190 9B8F 8A90 8671 7B6D 7872" /* ¡¥¢Ÿ¡�›�Š�†q{mxr */ $"807A 746E 5A55 6054 627D 7984 7A84 7279" /* €ztnZU`Tb}y„z„ry */ $"766E 787F 6673 727B 828A 978D 927F 7881" /* vnx.fsr{‚Š—�’.x� */ $"817D 9E9B A79F A49B 989C 8C8A 947A 727A" /* �}ž›§Ÿ¤›˜œŒŠ”zrz */ $"6E78 7284 7675 6857 5A64 5672 7B82 817C" /* nxr„vuhWZdVr{‚�| */ $"7D71 7E70 6E7D 7661 756D 7C7D 9293 908F" /* }q~pn}vaum|}’“�� */ $"7C78 877D 869E 9EA9 9CA3 949B 9488 8F92" /* |x‡}†žž©œ£”›”ˆ�’ */ $"727A 7673 7479 8172 7760 5361 6159 787B" /* rzvsty�rw`SaaYx{ */ $"887D 807A 777D 7072 7F69 6676 6F7D 8195" /* ˆ}€zw}pr.ifvo}�• */ $"8D93 8674 7D8A 798F 9EA5 A39E A091 9C8F" /* �“†t}Šy�ž¥£ž ‘œ� */ $"8893 876F 7D71 7673 807E 7874 5957 685A" /* ˆ“‡o}qvs€~xtYWhZ */ $"5E7B 7E85 7A81 747C 7A6E 777D 646E 7476" /* ^{~…z�t|znw}dntv */ $"7C85 958D 937C 7486 8479 969E A69F A199" /* |…•�“|t†„y–ž¦Ÿ¡™ */ $"959C 8C8A 947D 6F7C 7274 7482 7B79 6A55" /* •œŒŠ”}o|rtt‚{yjU */ $"6169 586A 7E82 827C 7B71 7F74 6D7B 7463" /* aiXj~‚‚|{q.tm{tc */ $"7475 787C 8D95 918E 7778 8A7D 7F9A 9FA4" /* tux|�•‘ŽwxŠ}.šŸ¤ */ $"9E9D 9299 9787 8F8F 7476 7B74 7279 8379" /* ž�’™—‡��tv{tryƒy */ $"7862 5568 645B 727D 8480 7D76 757E 7171" /* xbUhd[r}„€}vu~qq */ $"7C6B 6677 7577 8193 9594 8874 818A 7D88" /* |kfwuw�“•”ˆt�Š}ˆ */ $"9CA2 A29D 9890 9A90 8791 8271 7A78 7173" /* œ¢¢�˜�š�‡‘‚qzxqs */ $"7E82 7A73 5C5C 6C61 6075 8082 8079 7277" /* ~‚zs\\la`u€‚€yrw */ $"796E 7675 666D 7876 7A87 9595 9480 7589" /* ynvufmxvz‡••”€u‰ */ $"8681 8E9E A2A3 9C95 9299 8E8A 8D79 737A" /* †�Žž¢£œ•’™ŽŠ�ysz */ $"746F 777E 827B 6C58 6569 6267 7982 837F" /* tow~‚{lXeibgy‚ƒ. */ $"7471 7876 6E77 6B67 6F76 757F 8B98 988F" /* tqxvnwkgovu.‹˜˜� */ $"7B7E 8B84 8692 9FA1 A396 9394 988B 8E83" /* {~‹„†’Ÿ¡£–“”˜‹Žƒ */ $"7777 7974 7179 7E82 7663 5969 6565 6C7B" /* wwytqy~‚vcYieel{ */ $"8186 7971 7279 7473 7466 6C71 7875 848D" /* �†yqrytstflqxu„� */ $"9A95 8879 8588 878B 96A1 A5A1 9293 9595" /* š•ˆy…ˆ‡‹–¡¥¡’“•• */ $"8B8C 7B79 7879 7175 7982 8071 5F60 6965" /* ‹Œ{yxyquy‚€q_`ie */ $"6A6D 7B81 8373 7073 7871 756A 676D 7376" /* jm{�ƒspsxqujgmsv */ $"7C89 919C 9283 7B89 868B 8C98 A1A7 9991" /* |‰‘œ’ƒ{‰†‹Œ˜¡§™‘ */ $"9297 928F 8778 7C78 7771 787A 857E 6C5B" /* ’—’�‡x|xwqxz…~l[ */ $"6667 696A 727C 857E 6E71 7374 7072 646B" /* fgijr|…~nqstprdk */ $"6F74 7681 8896 9A8F 7D82 8B88 8D8D 99A3" /* otv�ˆ–š�}‚‹ˆ��™£ */ $"A493 9093 968F 8F7F 797B 7A76 777A 7E86" /* ¤“�“–��.y{zvwz~† */ $"7B66 5D6A 686D 6D74 7E85 766D 6F76 7072" /* {f]jhmmt~…vmovpr */ $"6C63 6C70 7379 838C 9A9A 8B7B 888A 8B8D" /* lclpsyƒŒšš‹{ˆŠ‹� */ $"919B A79E 8F8E 9492 8D8B 7979 7B78 7579" /* ‘›§ž�Ž”’�‹yy{xuy */ $"7981 847A 6166 6D6B 6E6F 7582 8171 6C71" /* y�„zafmknou‚�qlq */ $"746E 7266 636E 7374 7F84 9099 9881 7D8C" /* tnrfcnst.„�™˜�}Œ */ $"8B8D 9092 9FA5 978D 8E98 8D90 8577 787C" /* ‹��’Ÿ¥—�Ž˜��…wx| */ $"7378 777B 8184 705E 6A6D 6C70 757A 887B" /* sxw{�„p^jmlpuzˆ{ */ $"6F69 766E 6E6F 6565 7271 7980 8794 9B96" /* oivnnoeerqy€‡”›– */ $"7B85 8D8C 8B92 90A5 A094 8994 938B 8D81" /* {…�Œ‹’�¥ ”‰”“‹�� */ $"757A 7C75 7C76 7F7F 8263 616C 6F6C 7370" /* uz|u|v..‚calolsp */ $"8083 766B 6E79 6A71 6C64 6575 707F 808E" /* €ƒvknyjqldeup.€Ž */ $"959F 8C7C 888F 8C8F 9297 A799 9188 9A8A" /* •ŸŒ|ˆ�Œ�’—§™‘ˆšŠ */ $"8C8A 7E73 7F76 7977 7A7F 837E 6066 6F6F" /* ŒŠ~s.vywz.ƒ~`foo */ $"6974 7085 7A74 6675 6F6A 6F6A 616D 7676" /* itp…ztfuojojamvv */ $"8282 9394 A181 7F8C 9388 938E A09D 968D" /* ‚‚“”¡�.Œ“ˆ“Ž �–� */ $"8E99 898E 887B 7480 737D 747F 7D89 715E" /* Ž™‰Žˆ{t€s}t.}‰q^ */ $"6974 6C6E 7479 8275 7163 7668 6D6D 6A60" /* itlnty‚uqcvhmmj` */ $"7372 7F7F 8994 9D9C 7F86 9290 8895 90A2" /* sr..‰”�œ.†’�ˆ•�¢ */ $"9797 8695 8F88 8986 767A 7E7B 7B75 817D" /* ——†•�ˆ‰†vz~{{u�} */ $"8665 636E 7568 7570 7E79 7669 6A75 666B" /* †ecnuhup~yvijufk */ $"6C65 6074 7482 7C92 93A2 8F81 8A96 8C90" /* le`tt‚|’“¢��Š–Œ� */ $"9599 A096 9286 9988 8889 8570 7E7A 7E73" /* •™ –’†™ˆˆ‰…p~z~s */ $"7B80 837F 6467 7272 6874 7381 7475 6472" /* {€ƒ.dgrrhts�tudr */ $"6C66 6A6F 5F68 777B 7E81 9493 A087 838D" /* lfjo_hw{~�”“ ‡ƒ� */ $"9989 9393 9F98 978E 8F95 888A 8A7D 7181" /* ™‰““Ÿ˜—Ž�•ˆŠŠ}q� */ $"7C7D 7282 7D85 7462 6878 6D6D 757B 7B72" /* |}r‚}…tbhxmmu{{r */ $"7166 7266 686B 6C5D 6F76 7F7A 8B94 9B9B" /* qfrfhkl]ov.z‹”›› */ $"8485 9392 8693 979E 9299 8B92 8E89 898B" /* „…“’†“—ž’™‹’މ‰‹ */ $"7778 8180 7975 817E 846A 646E 7867 7075" /* wx�€yu�~„jdnxgpu */ $"7D72 766E 6A70 6769 6D66 5E72 7A81 7A90" /* }rvnjpgimf^rz�z� */ $"959E 9184 8997 8B8B 959A 9792 9588 938B" /* •ž‘„‰—‹‹•š—’•ˆ“‹ */ $"8A8B 8873 7C82 8372 7C83 837E 6967 7271" /* Š‹ˆs|‚ƒr|ƒƒ~igrq */ $"6672 777B 6F77 6A6C 6B67 696F 6164 7881" /* frw{owjlkgioadx� */ $"7B7E 9496 9B8B 878D 9688 8D94 9B90 9591" /* {~”–›‹‡�–ˆ�”›�•‘ */ $"8B91 898A 8B80 7180 8680 7183 8382 7769" /* ‹‘‰Š‹€q€†€qƒƒ‚wi */ $"6A76 6E69 757C 756F 7669 6D67 6A6C 6B5C" /* jvniu|uovimgjlk\ */ $"687B 8076 8797 9999 8987 9192 868F 9898" /* h{€v‡—™™‰‡‘’†�˜˜ */ $"8B97 8F8B 8A8A 8B8A 7A75 8588 7A74 8683" /* ‹—�‹ŠŠ‹Šzu…ˆzt†ƒ */ $"8271 6A6F 766B 6C79 7E6F 7576 6A6C 686C" /* ‚qjovkly~ouvjlhl */ $"6C65 5C6E 7E7F 758D 9798 9186 8A93 8D87" /* le\n~.u�—˜‘†Š“�‡ */ $"939B 928D 978C 8B88 8B8A 8575 7788 8974" /* “›’�—Œ‹ˆ‹Š…uwˆ‰t */ $"7A88 847E 6D6C 7171 6970 7D7B 6F78 736A" /* zˆ„~mlqqip}{oxsj */ $"696A 6E6D 6260 7584 7A79 9197 968B 888D" /* ijnmb`u„zy‘—–‹ˆ� */ $"9089 8795 9A8C 9095 8B8A 878C 8C7F 747C" /* �‰‡•šŒ�•‹Š‡ŒŒ.t| */ $"8C84 717F 8781 766C 6D72 6F6A 7580 7770" /* Œ„q.‡�vlmroju€wp */ $"7872 6B69 6D72 695F 657C 8577 8095 9894" /* xrkimri_e|…w€•˜” */ $"8989 8E8C 8789 9896 8990 9287 8487 8F89" /* ‰‰ŽŒ‡‰˜–‰�’‡„‡�‰ */ $"7A75 848E 7D74 8288 7F72 6C71 706C 6A79" /* zu„Ž}t‚ˆ.rlqpljy */ $"7F71 737B 716A 6972 7364 616C 8482 7786" /* .qs{qjirsdal„‚w† */ $"9896 8F87 8D8F 8885 8E9A 8E88 9190 8483" /* ˜–�‡��ˆ…ŽšŽˆ‘�„ƒ */ $"8990 8175 7588 8B77 7787 887B 6E70 756D" /* ‰��uuˆ‹ww‡ˆ{npum */ $"6C6F 807B 6F76 7B6E 686B 7672 6363 7689" /* lo€{ov{nhkvrccv‰ */ $"7E79 8C9D 948A 8791 8A85 8393 9889 8A93" /* ~yŒ�”Ї‘Š…ƒ“˜‰Š“ */ $"8D82 808A 8E79 7378 8F86 747A 8B83 756B" /* �‚€ŠŽysx�†tz‹ƒuk */ $"7475 6B6B 7483 7772 797D 6D68 6D7B 6C61" /* tukktƒwry}mhm{la */ $"6580 8B7A 7F93 9D90 8689 9286 8584 9993" /* e€‹z.“��†‰’†…„™“ */ $"888B 9488 7F7F 8E8A 7371 7E90 7E74 7D8C" /* ˆ‹”ˆ..ŽŠsq~�~t}Œ */ $"7E71 6978 706B 6879 8274 747B 7B6B 6874" /* ~qixpkhy‚tt{{kht */ $"7E67 656B 8885 7B82 9899 8D83 8D92 8485" /* ~gekˆ…{‚˜™�ƒ�’„… */ $"8A9B 8F88 8C94 847E 8192 8172 7285 8D7A" /* Š›�ˆŒ”„~�’�rr…�z */ $"7580 8A7A 6B6B 7A6B 6B6A 7E7C 7374 7D75" /* u€Šzkkzkkj~|st}u */ $"6A69 7B7B 6569 758C 837E 879D 9688 8093" /* ji{{eiuŒƒ~‡�–ˆ€“ */ $"8C84 838F 998C 8B8E 9182 7D85 9379 7474" /* Œ„ƒ�™Œ‹Ž‘‚}…“ytt */ $"8B87 7774 8586 7566 7178 676B 6E80 7975" /* ‹‡wt…†ufqxgkn€yu */ $"747E 7169 6A81 7465 697E 8E81 818D 9E92" /* t~qij�tei~Ž���ž’ */ $"8384 9886 8584 9493 8B89 8F8C 7F7A 8B90" /* ƒ„˜†…„”“‹‰�Œ.z‹� */ $"7473 7B8F 8177 778A 816F 6277 7167 6974" /* ts{��wwŠ�obwqgit */ $"8076 7575 7D6F 666E 866D 676E 8889 8080" /* €vuu}ofn†mgnˆ‰€€ */ $"939B 8E7D 8A97 8286 8898 8F8C 8892 887C" /* “›Ž}Š—‚†ˆ˜�Œˆ’ˆ| */ $"7893 8772 7584 8D7D 787A 8B7E 6A65 7E6C" /* x“‡ru„�}xz‹~je~l */ $"6A6C 7C7A 7472 7879 6C62 7783 666A 768D" /* jl|ztrxylbwƒfjv� */ $"8481 8197 9788 7892 8F81 8690 978C 8C89" /* „��——ˆx’��†�—ŒŒ‰ */ $"9285 797D 997E 7479 8C87 7B75 7F89 7A64" /* ’…y}™~tyŒ‡{u.‰zd */ $"6F7F 696E 7480 7675 727B 7568 6280 7A65" /* o.int€vur{uhb€ze */ $"6E80 8B80 8083 9892 7F7A 9787 8388 958F" /* n€‹€€ƒ˜’.z—‡ƒˆ•� */ $"8988 8C8E 8175 8696 7776 808F 807A 7685" /* ‰ˆŒŽ�u†–wv€�€zv… */ $"8674 6279 7A6A 727C 7F72 7573 7C71 6468" /* †tbyzjr|.rus|qdh */ $"8774 6B75 8987 7E7E 8896 8C78 8194 8084" /* ‡tku‰‡~~ˆ–Œx�”€„ */ $"8D95 8988 8790 8C7D 748E 8D74 7985 8A7B" /* �•‰ˆ‡�Œ}tŽ�ty…Š{ */ $"7778 8881 6E67 8175 6F76 8079 7272 767B" /* wxˆ�ng�uov€yrrv{ */ $"6E63 7287 6F6F 7C8B 837F 8090 9486 7688" /* ncr‡oo|‹ƒ.€�”†vˆ */ $"8D7E 878F 9186 8687 9188 7879 9485 777D" /* �~‡�‘††‡‘ˆxy”…w} */ $"8884 7975 7C88 7E6B 7182 7174 7A7F 7571" /* ˆ„yu|ˆ~kq‚qtz.uq */ $"707B 786B 647C 826F 7682 8981 7D80 928F" /* p{xkd|‚ov‚‰�}€’� */ $"7F79 8E87 828A 908B 8382 8A90 8476 8193" /* .yއ‚Š�‹ƒ‚Š�„v�“ */ $"7F7B 8187 7F77 7482 8679 6B79 7F72 7A7F" /* .{�‡.wt‚†yky.rz. */ $"7E73 6F71 7C74 6769 847C 737A 8586 7F7B" /* ~soq|tgi„|sz…†.{ */ $"8492 8A7A 7E8F 8184 8B8E 8681 818E 8D7E" /* „’Šz~��„‹Ž†��Ž�~ */ $"7589 8F7B 7D83 867C 7576 8683 736D 817B" /* u‰�{}ƒ†|uv†ƒsm�{ */ $"757D 817B 716E 767D 7165 7187 7675 7D86" /* u}�{qnv}qeq‡vu}† */ $"847E 7C8C 9083 7785 8B7E 868D 8D83 7E82" /* „~|Œ�ƒw…‹~†��ƒ~‚ */ $"8F87 7877 9087 7A7E 8482 7873 7C87 7E6F" /* �‡xw�‡z~„‚xs|‡~o */ $"7484 7578 8081 7870 6F7D 7C6E 667B 8474" /* t„ux€�xpo}|nf{„t */ $"7983 8781 7C80 908C 7E7A 8D85 8089 8F89" /* yƒ‡�|€�Œ~z�…€‰�‰ */ $"7F7C 878F 8275 8092 7F7B 8185 7F76 7282" /* .|‡�‚u€’.{�….vr‚ */ $"8478 6E7C 8073 7B83 8074 6D71 8077 696C" /* „xn|€s{ƒ€tmq€wil */ $"847E 767D 8686 807B 8691 887B 818F 7F82" /* „~v}††€{†‘ˆ{��.‚ */ $"8B8F 857D 7C8D 8B7D 7589 8D7C 7E83 847B" /* ‹�…}|�‹}u‰�|~ƒ„{ */ $"7476 847F 7371 847B 767E 847C 706A 767E" /* tv„.sq„{v~„|pjv~ */ $"7266 7386 7879 8188 847E 7B8D 8E82 7A89" /* rfs†xy�ˆ„~{�Ž‚z‰ */ $"8A7E 868F 8D81 7A7F 8F86 7879 9087 7E7F" /* Š~†���z.�†xy�‡~. */ $"8681 7971 7C84 7A6F 7884 7678 8184 786E" /* †�yq|„zox„vx�„xn */ $"6B7D 796C 667C 8177 7B85 8981 7B80 9088" /* k}ylf|�w{…‰�{€�ˆ */ $"7E7D 8E84 8188 9289 7E78 878D 8075 808F" /* ~}Ž„�ˆ’‰~x‡�€u€� */ $"807D 8287 7E76 7384 8077 7080 8076 7A85" /* €}‚‡~vs„€wp€€vz… */ $"8273 6A70 7F74 6A6D 827D 797E 8985 7F7A" /* ‚sjp.tjm‚}y~‰….z */ $"898E 847C 838D 8083 8C91 847A 7A8D 887C" /* ‰Ž„|ƒ�€ƒŒ‘„zz�ˆ| */ $"7688 897F 7D85 8378 7278 857B 7476 857C" /* vˆ‰.}…ƒxrx…{tv…| */ $"797D 877C 6F68 787B 7169 7583 7B7B 828A" /* y}‡|ohx{qiuƒ{{‚Š */ $"827D 7E8F 8981 7C8B 8881 8490 8D7E 7780" /* ‚}~�‰�|‹ˆ�„��~w€ */ $"8D83 7B7B 8D84 7F7F 877D 7471 8081 7972" /* �ƒ{{�„..‡}tq€�yr */ $"7C84 797A 8287 766B 6A7C 766E 697C 7F7B" /* |„yz‚‡vkj|vni|.{ */ $"7C88 877E 7B84 8F85 7F80 8E84 8286 9287" /* |ˆ‡~{„�….€Ž„‚†’‡ */ $"7B76 878A 8278 818B 8280 8387 7973 7583" /* {v‡Š‚x�‹‚€ƒ‡ysuƒ */ $"7D78 7281 807A 7B87 8272 6870 7A74 6C6D" /* }xr�€z{‡‚rhpztlm */ $"7F7C 7D7F 8A84 7E7D 8B8B 857C 848A 8282" /* .|}.Š„~}‹‹…|„Š‚‚ */ $"8A90 8379 7B89 867F 7886 8582 8087 8378" /* Š�ƒy{‰†.x†…‚€‡ƒx */ $"737C 837D 7677 837D 7B7F 887D 6F69 7677" /* s|ƒ}vwƒ}{.ˆ}oivw */ $"7269 737B 7B7D 8489 827D 818D 8882 7C87" /* ris{{}„‰‚}��ˆ‚|‡ */ $"8583 838E 8B7F 7680 8985 7C7D 8683 8282" /* …ƒƒŽ‹.v€‰…|}†ƒ‚‚ */ $"877E 7674 8180 7C74 7D81 7E7D 8486 7A6C" /* ‡~vt�€|t}�~}„†zl */ $"6D77 7670 6A76 787D 7F87 8680 7B87 8C88" /* mwvpjvx}.‡†€{‡Œˆ */ $"7E80 8783 8286 8D87 7B77 8386 847A 8084" /* ~€‡ƒ‚†�‡{wƒ†„z€„ */ $"8382 8584 7C73 7982 817A 7781 8080 8086" /* ƒ‚…„|sy‚�zw�€€€† */ $"8276 6A72 7676 6E6F 777B 7D82 8784 7C7D" /* ‚vjrvvnow{}‚‡„|} */ $"888A 857C 8384 8383 8A8A 8476 7A83 8780" /* ˆŠ…|ƒ„ƒƒŠŠ„vzƒ‡€ */ $"7B82 8383 8286 8279 737D 8181 787C 8283" /* {‚ƒƒ‚†‚ys}��x|‚ƒ */ $"8084 8681 726D 7377 756C 7378 7D7E 8686" /* €„†�rmswulsx}~†† */ $"837A 8287 8980 7D82 8481 848A 877E 757D" /* ƒz‚‡‰€}‚„�„Ї~u} */ $"8186 7C7D 8083 8186 8580 7679 7F81 8078" /* �†|}€ƒ�†…€vy.�€x */ $"7E81 8281 8885 7E6F 7474 7973 7074 7B7C" /* ~�‚�ˆ…~ottyspt{| */ $"8287 8480 7E86 8688 7E7F 8083 7F87 8884" /* ‚‡„€~††ˆ~.€ƒ.‡ˆ„ */ $"787A 7C81 827B 7C7F 8181 8781 7D76 7E7C" /* xz|�‚{|.��‡�}v~| */ $"827D 7B7D 827F 8488 8379 7376 747A 7272" /* ‚}{}‚.„ˆƒysvtzrr */ $"747C 7C87 8583 7E86 8587 8780 8082 8181" /* t||‡…ƒ~†…‡‡€€‚�� */ $"8A85 8077 7D79 827F 7C7A 817F 8486 7E79" /* Š…€w}y‚.|z�.„†~y */ $"7A7E 7A82 7C7C 7D82 7F89 8580 7477 7275" /* z~z‚||}‚.‰…€twru */ $"7973 7277 7C80 8A83 8280 8982 8885 827F" /* ysrw|€Šƒ‚€‰‚ˆ…‚. */ $"847E 8588 817A 7A7B 7884 7E7C 7B81 7E89" /* „~…ˆ�zz{x„~|{�~‰ */ $"827C 7780 7A7B 817D 7C80 8081 8C82 7C75" /* ‚|w€z{�}|€€�Œ‚|u */ $"796F 7978 7571 7A79 8488 8180 8688 818B" /* yoyxuqzy„ˆ�€†ˆ�‹ */ $"8482 8082 7E89 857E 787D 767A 837E 7A7D" /* „‚€‚~‰…~x}vzƒ~z} */ $"7F81 897D 7A7A 8076 7E80 7E7B 817D 868A" /* .�‰}zz€v~€~{�}†Š */ $"807A 7A75 707C 7874 737A 7B89 8581 828B" /* €zzup|xtsz{‰…�‚‹ */ $"8383 8A86 8182 8080 8A80 7C7B 7E74 7F83" /* ƒƒŠ†�‚€€Š€|{~t.ƒ */ $"7F79 7E7D 8486 7A78 807D 7580 7F7E 7C80" /* .y~}„†zx€}u€.~|€ */ $"7D89 857D 797C 7172 7D79 7376 7A7F 8B82" /* }‰…}y|qr}ysvz.‹‚ */ $"8087 8C81 878B 8680 827D 8488 7D7A 7F7A" /* €‡Œ�‡‹†€‚}„ˆ}z.z */ $"7483 837D 7A7F 7D88 8279 7B82 7876 817F" /* tƒƒ}z.}ˆ‚y{‚xv�. */ $"7B7E 7D7E 8A81 7B7A 796E 767D 7772 7879" /* {~}~Š�{zynv}wrxy */ $"8389 8082 8B89 7F8A 8A84 8081 7C87 857C" /* ƒ‰€‚‹‰.ŠŠ„€�|‡…| */ $"7C7E 7677 8582 7B7C 7E80 8A7E 7A7F 8175" /* |~vw…‚{|~€Š~z.�u */ $"7A82 7F7C 7E7C 8188 7D7A 7B76 6C79 7B75" /* z‚.|~|�ˆ}z{vly{u */ $"7378 7B88 867F 868D 8580 8B89 8381 7F7E" /* sx{ˆ†.†�…€‹‰ƒ�.~ */ $"8981 7C7E 7E73 7B86 807A 7C7E 8388 7A7C" /* ‰�|~~s{†€z|~ƒˆz| */ $"827F 747E 827F 7C7F 7C87 867B 7C7C 716D" /* ‚.t~‚.|.|‡†{||qm */ $"7C7A 7473 7A7D 8A81 8189 8D81 838C 8881" /* |ztsz}Š��‰��ƒŒˆ� */ $"807E 8188 7D7D 7F7B 7180 847F 787E 7E87" /* €~�ˆ}}.{q€„.x~~‡ */ $"8379 7E83 7B74 8182 7E7C 7F7D 8980 7C7D" /* ƒy~ƒ{t�‚~|.}‰€|} */ $"7B6D 727E 7972 767B 8089 7F84 8A8A 7D87" /* {mr~yrv{€‰.„ŠŠ}‡ */ $"8B86 7E82 7F84 857C 7E7F 7772 8483 7C78" /* ‹†~‚.„…|~.wr„ƒ|x */ $"807E 877D 7A7F 8377 7883 817A 7D7F 7E86" /* €~‡}z.ƒwxƒ�z}.~† */ $"7C7E 7D78 6B78 7E78 717B 7D84 867F 868B" /* |~}xkx~xq{}„†.†‹ */ $"867D 8A89 837E 847E 867F 7F80 7F74 7886" /* †}Љƒ~„~†..€.tx† */ $"8279 7A81 8086 7A7E 8081 737C 827F 7780" /* ‚yz�€†z~€�s|‚.w€ */ $"7E81 817B 7D7B 746C 7C7D 7772 7F7E 8782" /* ~��{}{tl|}wr.~‡‚ */ $"8388 8D82 818A 877F 8084 7F86 7E82 7F7E" /* ƒˆ�‚�Ї.€„.†~‚.~ */ $"727E 8581 7680 8283 827C 7F81 7E74 8081" /* r~…�v€‚ƒ‚|.�~t€� */ $"7D77 837C 817D 7D7B 7A70 717D 7B73 7681" /* }wƒ|�}}{zpq}{sv� */ $"8088 8187 888B 7F85 8886 7C85 8381 8380" /* €ˆ�‡ˆ‹.…ˆ†|…ƒ�ƒ€ */ $"817F 7B74 8182 7E76 8380 837E 7F7F 827A" /* �.{t�‚~vƒ€ƒ~..‚z */ $"7880 7F79 7B82 7B80 7B7E 7878 6C75 7B7A" /* x€.y{‚{€{~xxlu{z */ $"707D 8081 8483 8687 877E 8685 827C 8880" /* p}€�„ƒ†‡‡~†…‚|ˆ€ */ $"8280 8380 8078 7882 8179 7A84 7F82 7D80" /* ‚€ƒ€€xx‚�yz„.‚}€ */ $"7E81 777C 7F7F 7680 807B 7D7C 7B76 746C" /* ~�w|..v€€{}|{vtl */ $"797A 7971 8280 8381 8684 8983 8085 847E" /* yzyq‚€ƒ�†„‰ƒ€…„~ */ $"8088 8082 7F85 7E80 767D 8081 7680 8380" /* €ˆ€‚.…~€v}€�v€ƒ€ */ $"807F 807F 8077 7F7E 7D75 847D 7C79 7F78" /* €.€.€w.~}u„}|y.x */ $"7871 7179 7A75 7785 8084 8189 8388 8083" /* xqqyzuw…€„�‰ƒˆ€ƒ */ $"8284 7B85 8680 8081 837E 7E77 807F 7F77" /* ‚„{…†€€�ƒ~~w€..w */ $"8681 807D 827F 807D 7A7E 7D7A 7B84 7B7C" /* †�€}‚.€}z~}z{„{| */ $"787F 7577 6F76 777B 737F 8582 8283 8784" /* x.uwovw{s.…‚‚ƒ‡„ */ $"867F 8380 827C 8882 817F 8580 7E7A 7B80" /* †.ƒ€‚|ˆ‚�.…€~z{€ */ $"7E7B 7B87 8081 7D84 7E81 7B7D 7B7E 7880" /* ~{{‡€�}„~�{}{~x€ */ $"817B 7A7A 7D74 7470 7976 7A74 8383 8380" /* �{zz}ttpyvztƒƒƒ€ */ $"8785 8582 8081 7F80 8089 8080 7E87 7E7E" /* ‡……‚€�.€€‰€€~‡~~ */ $"787E 7D7E 7980 8681 7F7F 847F 807B 7F79" /* x~}~y€†�..„.€{.y */ $"7D79 837F 7B77 7D7A 7572 7379 7778 7986" /* }yƒ.{w}zursywxy† */ $"8284 8089 8385 8082 7F80 7E84 8780 8080" /* ‚„€‰ƒ…€‚.€~„‡€€€ */ $"857D 7C79 807C 7D7A 8483 807E 8181 807E" /* …}|y€|}z„ƒ€~��€~ */ $"7C7D 787B 7D84 7D7B 777E 7874 7176 7777" /* |}x{}„}{w~xtqvww */ $"7880 8683 8381 8883 8380 827D 7F80 8784" /* x€†ƒƒ�ˆƒƒ€‚}.€‡„ */ $"807F 8283 7D7A 7B80 7B7C 7F85 8180 7D81" /* €.‚ƒ}z{€{|.…�€}� */ $"807E 7C7D 7B78 7C81 827C 7979 7E75 7272" /* €~|}{x|�‚|yy~urr */ $"7775 767B 8385 8381 8387 8281 8080 7B7F" /* wuv{ƒ…ƒ�ƒ‡‚�€€{. */ $"8388 8280 8085 827B 7A7E 7F7B 7E82 8681" /* ƒˆ‚€€…‚{z~.{~‚†� */ $"807E 817F 7D7C 7D79 787F 8380 7A79 7A7C" /* €~�.}|}yx.ƒ€zyz| */ $"7471 7377 7577 7F84 8483 8284 8580 8080" /* tqswuw.„„ƒ‚„…€€€ */ $"7F79 8085 8680 8081 8580 7A7B 7F7E 7B80" /* .y€…†€€�…€z{.~{€ */ $"8485 8180 8082 7E7D 7C7D 787B 8183 7F7A" /* „…�€€‚~}|}x{�ƒ.z */ $"7B7C 7A72 7274 7775 7A81 8682 8383 8583" /* {|zrrtwuz�†‚ƒƒ…ƒ */ $"8080 7F7C 7A82 8684 7E80 8184 7E7B 7C7F" /* €€.|z‚†„~€�„~{|. */ $"7C7D 8386 8380 8080 817D 7E7C 7C77 7E82" /* |}ƒ†ƒ€€€�}~||w~‚ */ $"837B 7A7A 7B77 7273 7577 757E 8385 8084" /* ƒ{zz{wrsuwu~ƒ…€„ */ $"8386 8180 807E 7A7C 8586 827E 8282 837C" /* ƒ†�€€~z|…†‚~‚‚ƒ| */ $"7D7D 7F7A 8084 8680 8080 8080 7C7E 7B7A" /* }}.z€„†€€€€€|~{z */ $"7880 8381 797B 7A7B 7573 7376 7578 8084" /* x€ƒ�y{z{ussvux€„ */ $"8480 8483 8480 817E 7E79 8085 8780 8082" /* „€„ƒ„€�~~y€…‡€€‚ */ $"8480 7C7E 7D7E 7B82 8586 7F81 8082 7D7D" /* „€|~}~{‚…†.�€‚}} */ $"7D7B 797A 8283 8078 7C7B 7972 7572 7674" /* }{yz‚ƒ€x|{yrurvt */ $"7B80 8681 8184 8481 7F80 7C7B 7982 8586" /* {€†��„„�.€|{y‚…† */ $"7E81 8385 7E7E 7E7D 7D7E 8486 857F 8281" /* ~�ƒ…~~~}}~„†….‚� */ $"807B 807B 7B78 7F82 837C 7A7C 7C77 7375" /* €{€{{x.‚ƒ|z||wsu */ $"7376 767F 8186 8084 8485 7E80 7F7B 797C" /* svv.�†€„„…~€.{y| */ $"8386 847E 8384 827B 807B 7E7B 8183 8681" /* ƒ†„~ƒ„‚{€{~{�ƒ†� */ $"8083 827E 7C7F 7979 7980 8283 797C 7C7C" /* €ƒ‚~|.yyy€‚ƒy||| */ $"7374 7575 757A 8084 8580 8584 827D 817C" /* stuuuz€„…€…„‚}�| */ $"7B79 8083 8680 8084 8580 7C7F 7B7D 7D83" /* {y€ƒ†€€„…€|.{}}ƒ */ $"8486 8082 8281 7A7E 7C7A 797C 8183 807A" /* „†€‚‚�z~|zy|�ƒ€z */ $"7D7C 7972 7672 7576 7D80 8582 8385 8480" /* }|yrvruv}€…‚ƒ…„€ */ $"7E80 7A7A 7A81 8386 8083 8484 7C7F 7D7C" /* ~€zzz�ƒ†€ƒ„„|.}| */ $"7C80 8384 8480 8381 7F7B 807B 7B7A 8081" /* |€ƒ„„€ƒ�.{€{{z€� */ $"837D 7B7D 7C76 7476 7376 787F 8185 8084" /* ƒ}{}|vtvsvx.�…€„ */ $"8483 7C80 7D7B 7A7E 8284 847F 8384 827C" /* „ƒ|€}{z~‚„„.ƒ„‚| */ $"807B 7E7E 8382 8682 8282 817C 7C7F 7B7B" /* €{~~ƒ‚†‚‚‚�||.{{ */ $"7C81 8183 7B7D 7C7B 7376 7474 767B 7F82" /* |��ƒ{}|{svttv{.‚ */ $"8481 8483 807B 807B 7B7A 8081 8481 8083" /* „�„ƒ€{€{{z€�„�€ƒ */ $"847F 7D7F 7C7F 8084 8286 8183 8180 7B7F" /* „.}.|.€„‚†�ƒ�€{. */ $"7D7B 7B7F 8183 827C 7E7C 7A73 7773 7778" /* }{{.�ƒ‚|~|zswswx */ $"7E7F 8482 8383 827E 7C7F 7A7A 7B81 8084" /* ~.„‚ƒƒ‚~|.zz{�€„ */ $"7F82 8283 7C7F 7D7D 7E81 8383 8481 8280" /* .‚‚ƒ|.}}~�ƒƒ„�‚€ */ $"7F7A 807C 7C7C 8282 8480 7D7D 7C78 7476" /* .z€|||‚‚„€}}|xtv */ $"7478 7A80 8085 8284 8282 7B7E 7C7A 797D" /* txz€€…‚„‚‚{~|zy} */ $"8081 837F 8181 817B 807C 7E7E 8381 8482" /* €�ƒ.���{€|~~ƒ�„‚ */ $"8180 807C 7C7F 7C7D 7D83 8184 7E7E 7C7C" /* �€€||.|}}ƒ�„~~|| */ $"7577 7577 787D 8081 8582 8381 807B 807A" /* uwuwx}€�…‚ƒ�€{€z */ $"7B79 807F 8380 8080 827F 7C7F 7C7F 7F83" /* {y€.ƒ€€€‚.|.|..ƒ */ $"8084 8082 7F80 7A7E 7E7C 7C80 8382 837D" /* €„€‚.€z~~||€ƒ‚ƒ} */ $"7E7C 7C75 7975 7879 807F 8383 8383 827E" /* ~||uyuxy€.ƒƒƒƒ‚~ */ $"7C80 7A7B 7A80 7F83 7F81 7F82 7C7F 7D7D" /* |€z{z€.ƒ.�.‚|.}} */ $"7D80 8180 8380 817E 807A 817C 7E7C 8380" /* }€�€ƒ€�~€z�|~|ƒ€ */ $"8380 7E7C 7C79 7679 7679 7A81 7E85 8285" /* ƒ€~||yvyvyz�~…‚… */ $"8082 7C7F 7E7B 797C 8080 837E 817F 817A" /* €‚|.~{y|€€ƒ~�.�z */ $"807C 7E7C 827E 8180 8180 7F7D 7C81 7D7E" /* €|~|‚~�€�€.}|�}~ */ $"7C83 8084 7D80 7B7E 7779 7979 797E 8180" /* |ƒ€„}€{~wyyyy~�€ */ $"8483 8680 827B 817C 7C78 807D 817F 8080" /* „ƒ†€‚{�||x€}�.€€ */ $"807F 7C80 7C7E 7C83 7C82 7D82 7D80 7A7F" /* €.|€|~|ƒ|‚}‚}€z. */ $"807F 7D80 8381 837E 807B 7E77 7C78 7C7A" /* €.}€ƒ�ƒ~€{~w|x|z */ $"8280 8383 8483 8280 7D81 7C7C 7980 7D82" /* ‚€ƒƒ„ƒ‚€}�||y€}‚ */ $"7D82 7D81 7C7F 7D7D 7D7F 807D 817E 827D" /* }‚}�|.}}}.€}�~‚} */ $"807A 827D 807B 8280 8380 807E 7D7C 787D" /* €z‚}€{‚€ƒ€€~}|x} */ $"797D 7B83 7F85 8187 8283 7D80 7F7D 7A7C" /* y}{ƒ.…�‡‚ƒ}€.}z| */ $"7F7E 807D 827E 807A 807C 7E7A 807D 807E" /* .~€}‚~€z€|~z€}€~ */ $"8080 7E7D 7C81 7D7F 7B82 8083 7D81 7D7E" /* €€~}|�}.{‚€ƒ}�}~ */ $"797C 7A7B 7B7E 8281 8482 8782 827C 827D" /* y|z{{~‚�„‚‡‚‚|‚} */ $"7D78 7E7D 807D 8080 807E 7C80 7C7E 7A80" /* }x~}€}€€€~|€|~z€ */ $"7C80 7C82 7E80 7B80 807F 7D7E 8281 827D" /* |€|‚~€{€€.}~‚�‚} */ $"817D 7E78 7D7A 7D7A 8180 8382 8585 8380" /* �}~x}z}z�€ƒ‚……ƒ€ */ $"7E81 7D7D 787F 7D81 7C82 8081 7C7F 7D7D" /* ~�}}x.}�|‚€�|.}} */ $"7B7D 7E7D 7E7D 827E 7E7A 817E 807B 8180" /* {}~}~}‚~~z�~€{�€ */ $"827F 7F80 7F7B 7A7D 7A7D 7C82 8084 8187" /* ‚..€.{z}z}|‚€„�‡ */ $"8483 7D81 807D 7A7B 7E7F 7F7D 8280 807B" /* „ƒ}�€}z{~..}‚€€{ */ $"807C 7E7A 7F7D 7E7C 7F80 7F7B 7C81 7F7F" /* €|~z.}~|.€.{|�.. */ $"7D82 8182 7D80 7E7F 787B 7B7D 7C7F 8182" /* }‚�‚}€~.x{{}|.�‚ */ $"8282 8683 817D 827F 7D79 7D7E 807D 7E80" /* ‚‚†ƒ�}‚.}y}~€}~€ */ $"817D 7D7F 7D7D 7C7F 7D7D 7B80 7E7D 7A7F" /* �}}.}}|.}}{€~}z. */ $"8080 7C7F 8282 807D 7F7F 7C79 7C7B 7D7C" /* €€|.‚‚€}..|y|{}| */ $"8181 8281 8484 837E 7F82 807B 7B7E 807F" /* ��‚�„„ƒ~.‚€{{~€. */ $"7C80 8080 7D7F 7F7F 7C7E 7E7D 7B7D 807F" /* |€€€}...|~~}{}€. */ $"7C7B 8081 7F7C 8082 817D 7E7E 7E7A 7B7C" /* |{€�.|€‚�}~~~z{| */ $"7D7B 7E81 8281 8285 8582 7E81 827F 797C" /* }{~�‚�‚……‚~�‚.y| */ $"7E80 7D7D 8082 7F7E 8080 7D7C 7E7E 7C7B" /* ~€}}€‚.~€€}|~~|{ */ $"7F80 7F7B 7D81 817C 7D80 827F 7D7E 7F7D" /* .€.{}��|}€‚.}~.} */ $"7A7B 7D7D 7B7F 8182 8084 8585 8080 8282" /* z{}}{.�‚€„……€€‚‚ */ $"7D7A 7D80 7E7C 7F81 827E 7F80 807C 7D7E" /* }z}€~|.�‚~.€€|}~ */ $"7E7B 7D80 807D 7B80 8280 7B7F 8181 7D7D" /* ~{}€€}{€‚€{.��}} */ $"7E7F 7B7B 7B7D 7B7C 8081 8080 8485 847F" /* ~.{{{}{|€�€€„…„. */ $"8081 817B 7B7E 807D 7E80 8180 7F80 817F" /* €��{{~€}~€�€.€�. */ $"7C7F 7F7D 7A7E 8080 7C7D 8082 7E7C 8081" /* |..}z~€€|}€‚~|€� */ $"7F7C 7E7E 7E7A 7B7C 7D7A 7D80 817F 8184" /* .|~~~z{|}z}€�.�„ */ $"8481 7F81 827F 7A7C 7F7F 7C7F 8081 8080" /* „�.�‚.z|..|.€�€€ */ $"8081 7E7E 807F 7C7C 7F80 7E7C 7E81 817C" /* €�~~€.||.€~|~��| */ $"7E80 817D 7D7E 7E7C 7B7C 7D7C 7A7E 8080" /* ~€�}}~~|{|}|z~€€ */ $"7F83 8483 8080 8181 7C7A 7D7E 7D7D 7F80" /* .ƒ„ƒ€€��|z}~}}.€ */ $"8180 8081 817D 7E80 7E7B 7E80 807E 7D80" /* �€€��}~€~{~€€~}€ */ $"8280 7C7E 807F 7C7E 7E7E 7C7B 7C7E 7B7B" /* ‚€|~€.|~~~|{|~{{ */ $"8080 7E80 8383 8380 8081 807B 7B7E 7E7C" /* €€~€ƒƒƒ€€�€{{~~| */ $"7E80 8181 8081 8180 7D80 807C 7B7E 8080" /* ~€��€��€}€€|{~€€ */ $"7E7E 8082 7E7C 8080 7D7D 7E7D 7C7C 7B7C" /* ~~€‚~|€€}}~}||{| */ $"7C7B 7D81 7F7E 8184 8381 8081 817E 7B7D" /* |{}�.~�„ƒ�€��~{} */ $"7F7C 7C80 8081 8180 8181 7F7E 817E 7B7D" /* .||€€��€��.~�~{} */ $"8080 7F7E 7E81 817D 7E81 7E7C 7D7E 7C7C" /* €€.~~��}~�~|}~|| */ $"7B7C 7D7C 7B7E 807D 7E82 8382 817F 8181" /* {|}|{~€}~‚ƒ‚�.�� */ $"7D7B 7F7E 7C7E 8080 8181 8081 817E 7E81" /* }{.~|~€€��€��~~� */ $"7D7C 7E81 7F80 7E80 8180 7C7F 807C 7D7E" /* }|~�.€~€�€|.€|}~ */ $"7E7C 7C7B 7C7C 7B7B 807E 7D80 8382 8280" /* ~||{||{{€~}€ƒ‚‚€ */ $"8081 807C 7C7F 7C7C 7E81 8082 8081 8180" /* €�€||.||~�€‚€��€ */ $"7E81 807C 7D80 8180 807E 8181 7F7C 817E" /* ~�€|}€�€€~��.|�~ */ $"7C7D 7E7D 7D7C 7B7D 7C7B 7D80 7D7E 8082" /* |}~}}|{}|{}€}~€‚ */ $"8181 7F80 807E 7B7E 7E7C 7E7F 8180 8180" /* ��.€€~{~~|~.�€�€ */ $"8281 807E 817E 7D7E 8080 807F 7E81 807E" /* ‚�€~�~}~€€€.~�€~ */ $"7E81 7D7D 7D7F 7D7E 7B7D 7D7D 7B7F 7F7D" /* ~�}}}.}~{}}}{..} */ $"7F81 8281 817E 817F 7E7B 807D 7D7D 8080" /* .�‚��~�.~{€}}}€€ */ $"8181 8082 807F 7F81 7D7E 7E81 7F80 7E80" /* ��€‚€..�}~~�.€~€ */ $"8180 7D80 807D 7D7D 7E7D 7E7B 7D7C 7D7C" /* �€}€€}}}~}~{}|}| */ $"817E 7E7F 8282 8180 7F81 7E7D 7C80 7C7D" /* �~~.‚‚�€.�~}|€|} */ $"7D81 7F81 8081 8180 7E80 817D 7E7F 817E" /* }�.�€��€~€�}~.�~ */ $"807E 8180 7F7D 817E 7D7D 7E7E 7D7D 7B7E" /* €~�€.}�~}}~~}}{~ */ $"7B7D 7D81 7D7E 7F83 8081 7E80 807E 7C7D" /* {}}�}~.ƒ€�~€€~|} */ $"7F7C 7E7E 817F 827F 8280 807E 827F 7D7E" /* .|~~�.‚.‚€€~‚.}~ */ $"8081 7F7F 7E82 7E7E 7D81 7D7D 7C80 7D7E" /* €�..~‚~~}�}}|€}~ */ $"7C7D 7D7C 7D7E 807D 7F80 8380 817E 817E" /* |}}|}~€}.€ƒ€�~�~ */ $"7E7C 7F7D 7D7D 8081 8081 8082 7E80 7E82" /* ~|.}}}€�€�€‚~€~‚ */ $"7D7E 7D82 7F80 7E80 817E 7E7E 807C 7E7C" /* }~}‚.€~€�~~~€|~| */ $"807D 7E7C 7F7C 7D7C 807E 7E7F 8183 8080" /* €}~|.|}|€~~.�ƒ€€ */ $"7F82 7D7E 7B80 7C7E 7D81 8081 8081 817E" /* .‚}~{€|~}�€�€��~ */ $"7F7F 817C 7E7E 837E 807D 827E 7F7D 807E" /* ..�|~~ƒ~€}‚~.}€~ */ $"7D7D 7E80 7D7E 7D7F 7B7E 7C82 7D80 7E83" /* }}~€}~}.{~|‚}€~ƒ */ $"8181 7F81 807D 7D7D 807C 7E7D 827E 817F" /* ��.�€}}}€|~}‚~�. */ $"827E 7F7E 817E 7D7E 8081 7E7F 7E82 7D7F" /* ‚~.~�~}~€�~.~‚}. */ $"7C81 7D7F 7D80 7E7E 7D7E 7E7C 7D7E 817D" /* |�}.}€~~}~~|}~�} */ $"807F 8480 817E 827D 7D7C 7E7D 7D7E 7F81" /* €.„€�~‚}}|~}}~.� */ $"7F81 7F82 7D80 7E81 7D7E 7D81 807F 7E80" /* .�.‚}€~�}~}�€.~€ */ $"807D 7E7E 807D 7F7C 817C 7F7D 807C 7D7D" /* €}~~€}.|�|.}€|}} */ $"807E 7E80 8183 8080 7E82 7C7E 7C80 7C7E" /* €~~€�ƒ€€~‚|~|€|~ */ $"7D81 8080 8081 807D 7F7F 807D 7F7D 827E" /* }�€€€�€}..€}.}‚~ */ $"807D 817E 7E7D 7F7E 7E7E 7E" /* €}�~~}.~~~~ */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Quack.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Quack.r new file mode 100644 index 0000000..f1a65e4 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Quack.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 1A00 0000 0551 7561 636B" /* ...........Quack */ }; data $8024 (0x1A) { $"0000 0800 E88E 0000 772B 8080 8080 8080" /* .....Ž..w+€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"7B7A 7A7A 7B7B 7C7D 7E7E 8082 8384 8586" /* {zzz{{|}~~€‚ƒ„…† */ $"8789 8A8B 8C8B 8781 7973 6E6B 6B6C 6F73" /* ‡‰Š‹Œ‹‡�ysnkklos */ $"7577 7776 736B 6562 6160 6268 6E73 787D" /* uwwvskeba`bhnsx} */ $"8184 8582 7F7C 7978 7879 7E85 8B8F 9394" /* �„…‚.|yxxy~…‹�“” */ $"9492 8E8A 8581 8081 8388 8C93 9AA0 A5AA" /* ”’ŽŠ…�€�ƒˆŒ“š ¥ª */ $"AAA9 A290 7A62 5657 5D6E 8190 9EA3 A59F" /* ª©¢�zbVW]n��ž£¥Ÿ */ $"8E78 6053 4F52 6172 818C 9397 948D 8274" /* Žx`SORar�Œ“—”�‚t */ $"6A63 6266 6F75 7879 7670 6A65 6163 676A" /* jcbfouxyvpjeacgj */ $"6D6F 6F6C 6A66 6464 656B 727A 848B 8F95" /* mooljfddekrz„‹�• */ $"9795 9491 8F8F 939D A7B4 C6D0 DCDB CBA0" /* —•”‘��“�§´ÆÐ..Ë  */ $"6940 373F 668F B5C1 BFB7 A07D 552E 2324" /* i@7?f�µÁ¿· }U.#$ */ $"416C 97B0 B1AC 9B8A 7E74 7074 808F A0A4" /* Al—°±¬›Š~tpt€� ¤ */ $"9D90 8072 7178 8189 8B8A 806F 5C46 3531" /* ��€rqx�‰‹Š€o\F51 */ $"3446 5B69 7270 685A 504E 4E5A 6979 878E" /* 4F[irphZPNNZiy‡Ž */ $"9393 908D 8D91 98A4 B4CB DDEC F3E4 B76C" /* ““���‘˜¤´Ë....·l */ $"2B19 3069 A8DA DEC3 9A74 553C 3138 4A6A" /* +.0i¨..ÚtU<18Jj */ $"8E9E 9A7E 6A68 738D A3B2 B1A9 9484 726D" /* Žžš~jhs�£²±©”„rm */ $"6E81 9CB1 B7B0 967A 6055 4F4C 4F56 5855" /* n�œ±·°–z`UOLOVXU */ $"524A 4543 474C 5357 5A5D 5E5B 5F64 6E7D" /* RJECGLSWZ]^[_dn} */ $"8D9D A5A9 B1B4 BCC4 D7F0 F0C5 7E3D 2140" /* ��¥©±´¼Ä×..Å~=!@ */ $"77B7 D0CF A57B 685A 483E 4558 656D 685C" /* w·ÐÏ¥{hZH>EXemh\ */ $"5463 86A7 B4B2 9F87 706B 7286 95A8 B2B1" /* Tc†§´²Ÿ‡pkr†•¨²± */ $"A294 8D8A 8C8B 816F 5E53 4C4C 4D4F 5558" /* ¢”�ŠŒ‹�o^SLLMOUX */ $"5854 524E 4F55 5B5E 646F 7C80 8186 909D" /* XTRNOU[^do|€�†�� */ $"B5CD DEE9 F0E7 BF69 132E 73BA E7EE B078" /* µÍ....¿i..sº..°x */ $"5363 7884 7C72 5F3E 2D2C 476E 9ABC B18A" /* Scx„|r_>-,Gnš¼±Š */ $"6D67 7489 9B9D 998D 8382 8690 A8B7 B492" /* mgt‰›�™�ƒ‚†�¨·´’ */ $"715A 5C69 7570 5E4F 474B 545B 6061 574B" /* qZ\iup^OGKT[`aWK */ $"4F5F 727F 8782 7C81 95B7 D2E6 F2EC BA62" /* O_r.‡‚|�•·Ò...ºb */ $"1E31 83DD F7D9 854B 5A8C B2A3 8C6F 441A" /* .1ƒ...…KZŒ²£ŒoD. */ $"1735 5C92 AB9E 6B49 5A82 A2A7 9177 6565" /* .5\’«žkIZ‚¢§‘wee */ $"7B91 A1AA B3A1 7D55 5B80 9A9C 7E59 4748" /* {‘¡ª³¡}U[€šœ~YGH */ $"596B 6E61 5958 5351 6076 8386 807F 8EA9" /* YknaYXSQ`vƒ†€.Ž© */ $"D4E6 EBE5 CB90 3A1E 6ED2 F3E5 9F52 4783" /* Ô...Ë�:.nÒ..ŸRGƒ */ $"C8CB 9059 3624 2B54 8998 937A 5647 6D9F" /* ÈË�Y6$+T‰˜“zVGmŸ */ $"B198 7065 708B 989E 948C 8E8E 8684 9294" /* ±˜pep‹˜ž”ŒŽŽ†„’” */ $"856C 504F 5D71 796D 615A 5964 6C72 7679" /* …lPO]qymaZYdlrvy */ $"7674 7F99 C0CC DCED D793 3931 7FDF EAC8" /* vt.™ÀÌ..ד91...È */ $"7E53 6EB0 D3A7 6C48 3A40 5B87 8F75 5A42" /* ~Sn°Ó§lH:@[‡�uZB */ $"3E63 A4B9 8F5A 4961 879D 9E8C 7570 7A87" /* >c¤¹�ZIa‡�žŒupz‡ */ $"90A1 A78D 624A 5376 8B7B 5241 475B 707B" /* �¡§�bJSv‹{RAG[p{ */ $"736B 6D75 7E8B A4C6 D9DC C28A 2F23 81F2" /* skmu~‹¤Æ..Š/#�. */ $"DF9B 5D4A 65B7 E7BE 6637 474D 577D 9578" /* .›]Je·.¾f7GMW}•x */ $"4D38 4570 A5B1 8043 2957 8F9C 8A7A 6C67" /* M8Ep¥±€C)W�œŠzlg */ $"7384 8B90 9388 7468 6470 7871 615A 5D64" /* s„‹�“ˆthdpxqaZ]d */ $"6971 7576 7E8D 979C B1C9 D5CA 8F37 228C" /* iquv~�—œ±ÉÕÊ�7"Œ */ $"E4DF 9A5B 5177 B2D2 BE7A 4542 596A 89A0" /* ..š[Qw²Ò¾zEBYj‰  */ $"7F59 4958 8FAF A166 3C46 739D 9B77 5D6A" /* .YIX�¯¡fg©¯.Z */ $"5F83 A6A4 927D 6F6E 7C7F 8382 7264 798E" /* _ƒ¦¤’}on|.ƒ‚rdyŽ */ $"8981 7E74 727E 8787 7D70 6D7E 8984 7F7B" /* ‰�~tr~‡‡}pm~‰„.{ */ $"7782 8E8C 7F72 7780 786C 6C80 826C 5F7B" /* w‚ŽŒ.rw€xll€‚l_{ */ $"8F83 7879 7E81 8894 9796 9A8A 6665 A7B9" /* �ƒxy~�ˆ”—–šŠfe§¹ */ $"8459 6B9F AA9B 8480 747B 8A85 787A 7A72" /* „YkŸª›„€t{Š…xzzr */ $"7681 8582 7B74 7981 8180 7E77 747F 8B87" /* v�…‚{ty��€~wt.‹‡ */ $"7F7B 7E8A 8B83 7C78 7275 8084 7869 646A" /* .{~Š‹ƒ|xru€„xidj */ $"7B86 7A68 6372 8387 7F78 7475 8399 9F98" /* {†zhcrƒ‡.xtuƒ™Ÿ˜ */ $"9183 686B A9B9 8969 7298 A596 8680 777A" /* ‘ƒhk©¹‰ir˜¥–†€wz */ $"8988 7C76 736A 7384 887C 797E 7F81 8080" /* ‰ˆ|vsjs„ˆ|y~.�€€ */ $"8580 7679 8587 8784 8487 8884 7D7B 7D7E" /* …€vy…‡‡„„‡ˆ„}{}~ */ $"7A77 7274 756F 6A76 7D77 6E71 7574 7680" /* zwrtuojv}wnqutv€ */ $"7D71 7080 8B86 8389 8D92 9B88 647A ADAA" /* }qp€‹†ƒ‰�’›ˆdz­ª */ $"7E63 7893 978A 837C 7779 807D 7571 6D6B" /* ~cx“—Šƒ|wy€}uqmk */ $"7881 7D79 7979 7E86 827A 7A79 7B7F 8282" /* x�}yyy~†‚zzy{.‚‚ */ $"827F 818A 8B83 7B79 7F84 8075 6F71 797D" /* ‚.�Š‹ƒ{y.„€uoqy} */ $"7974 6C6F 7B7F 7667 6B77 7B77 797A 7876" /* ytlo{.vgkw{wyzxv */ $"7D84 8079 7983 8B8B 8B90 948B 736A 849C" /* }„€yyƒ‹‹‹�”‹sj„œ */ $"8269 647B 8E89 7A78 7878 7B79 7577 7570" /* ‚id{މzxxx{yuwup */ $"747F 7F7B 7E82 8184 8281 8380 7A7C 8487" /* t..{~‚�„‚�ƒ€z|„‡ */ $"8280 8288 8A87 8382 8384 8380 7A78 7E7C" /* ‚€‚ˆŠ‡ƒ‚ƒ„ƒ€zx~| */ $"7572 7278 807E 7972 7077 7E7A 7275 7674" /* urrx€~yrpw~zruvt */ $"787D 7D7B 7A7D 8180 7E82 8683 8385 888E" /* x}}{z}�€~‚†ƒƒ…ˆŽ */ $"958A 7165 8297 896E 6E80 8F8A 8078 7980" /* •Šqe‚—‰nn€�Š€xy€ */ $"8983 7775 7A7B 7D83 8079 8085 8084 8782" /* ‰ƒwuz{}ƒ€y€…€„‡‚ */ $"7D80 8180 8280 7E81 8585 8584 807F 7E7E" /* }€�€‚€~�………„€.~~ */ $"807F 7872 767C 7C79 7676 7A7E 7E79 757C" /* €.xrv||yvvz~~yu| */ $"8080 7C7D 7E7C 7F83 837F 7C80 8481 7B7A" /* €€|}~|.ƒƒ.|€„�{z */ $"7E80 817E 7978 7F80 7D7B 7A7A 7C7D 7D7C" /* ~€�~yx.€}{zz|}}| */ $"7B7B 7E81 807F 8387 898C 8F89 7872 889A" /* {{~�€.ƒ‡‰Œ�‰xrˆš */ $"8471 7785 8B8B 8079 7E83 867E 7474 7C7A" /* „qw…‹‹€y~ƒ†~tt|z */ $"797D 7976 7F84 7F7F 807C 8084 7D7B 8182" /* y}yv.„..€|€„}{�‚ */ $"8082 8181 8382 8182 8281 8180 7C7C 8080" /* €‚��ƒ‚�‚‚��€||€€ */ $"7C7C 7E7F 7E7F 807F 7E80 817D 7C81 837F" /* ||~.~.€.~€�}|�ƒ. */ $"7E80" /* ~€ */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/SimpleBeep.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/SimpleBeep.r new file mode 100644 index 0000000..4bcddf2 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/SimpleBeep.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 3C00 0000 0A53 696D 706C" /* ......<....Simpl */ $"6542 6565 70" /* eBeep */ }; data $8024 (0x3C) { $"0000 0800 0000 0000 0000 8080 8080 8080" /* ..........€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"013C C3C0 B8AC 9C8A 7765 5448 3F3C 3E45" /* .<ÃÀ¸¬œŠweTH?<>E */ $"5161 7285 98A8 B6BF C3C1 BBB0 A18F 7C6A" /* Qar…˜¨¶¿ÃÁ»°¡�|j */ $"594B 413D 3D43 4E5C 6D81 94A5 B4BE C4C4" /* YKA==CN\m�”¥´¾ÄÄ */ $"BFB5 A694 816E 5C4D 423B 3B3F 4957 687B" /* ¿µ¦”�n\MB;;?IWh{ */ $"8FA1 B1BC C3C5 C1B9 AB9A 8673 5F4F 423A" /* �¡±¼ÃÅÁ¹«š†s_OB: */ $"383B 4451 6376 8A9D AEBB C4C7 C4BC AF9F" /* 8;DQcvŠ�®»ÄÇļ¯Ÿ */ $"8C78 6453 453C 3838 3F4C 5D70 8599 ABBA" /* ŒxdSE<88?L]p…™«º */ $"C4C9 C8C1 B5A5 917D 6856 473C 3737 3D49" /* ÄÉÈÁµ¥‘}hVG<77=I */ $"596C 8195 A7B7 C2C8 C8C3 B8A9 9681 6D59" /* Yl�•§·ÂÈÈø©–�mY */ $"483C 3535 3944 5466 7B90 A4B5 C1C9 CBC7" /* H<559DTf{�¤µÁÉËÇ */ $"BDAE 9B87 725E 4C3F 3634 383F 4E60 758B" /* ½®›‡r^L?648?N`u‹ */ $"A0B2 C0CA CDCA C1B3 A28D 7762 4F40 3632" /*  ²ÀÊÍÊÁ³¢�wbO@62 */ $"343C 495B 7085 9AAE BDC7 CDCE C6B9 A893" /* 4/&$* */ $"3648 5E78 91A9 BFCF D8DB D6CB BAA3 8B71" /* 6H^x‘©¿ÏØ.Ö˺£‹q */ $"5943 3328 2428 3343 5871 8BA4 BBCD D8DD" /* YC3($(3CXq‹¤»ÍØ. */ $"DAD0 C0AA 9277 5E47 3528 2224 2D3D 516A" /* .ÐÀª’w^G5("$-=Qj */ $"849E B5C8 D5DC DBD5 C6B2 997E 644C 3829" /* „žµÈÕ..ÕÆ²™~dL8) */ $"2121 2937 4A63 7D98 B0C5 D4DD DED8 CBB7" /* !!)7Jc}˜°ÅÔ..ØË· */ $"A086 6B52 3C2C 231E 2431 445C 7691 ABC1" /*  †kR<,#.$1D\v‘«Á */ $"D3DE E1DC D1BE A78D 7157 402E 221E 222D" /* Ó...Ѿ§�qW@."."- */ $"3E55 6F8A A5BC D1DD E3E0 D6C5 AE94 785D" /* >UoŠ¥¼Ñ...ÖÅ®”x] */ $"4431 231C 1E27 384E 6783 9FB8 CCDB E2E1" /* D1#..'8NgƒŸ¸Ì... */ $"D9CA B59B 8064 4A35 261E 1D22 3146 607C" /* .ʵ›€dJ5&.."1F`| */ $"98B3 C9DA E3E5 DED0 BCA3 876B 5039 271D" /* ˜³É....м£‡kP9'. */ $"1A20 2D41 5874 91AC C3D6 E1E7 E3D6 C3AB" /* . -AXt‘¬ÃÖ...Öë */ $"8F72 563D 291D 181C 273A 516D 89A6 BFD3" /* �rV=)...':Qm‰¦¿Ó */ $"E1E7 E4DA C8B0 9578 5C42 2C1E 1618 2233" /* ....Ȱ•x\B,..."3 */ $"4B66 84A1 BBD1 E0E8 E7DF CEB8 9C80 6347" /* Kf„¡»Ñ....θœ€cG */ $"3120 1817 1F2E 445E 7B99 B5CC DDE7 E9E3" /* 1 ....D^{™µÌ.... */ $"D5C0 A587 6A4D 3422 1714 1A28 3D56 7492" /* ÕÀ¥‡jM4"...(=Vt’ */ $"AFC7 DBE6 EBE6 D9C6 AC90 7154 3A26 1912" /* ¯Ç.....Ƭ�qT:&.. */ $"1622 364F 6C8A A8C3 D8E7 EDEA DFCD B498" /* ."6OlŠ¨ÃØ....Í´˜ */ $"795B 402A 1A13 141E 3048 6482 A0BD D4E5" /* y[@*....0Hd‚ ½Ô. */ $"EEEE E4D4 BCA0 8162 452D 1C12 1119 2940" /* ...Ô¼ �bE-....)@ */ $"5C7A 99B7 CFE2 ECEF E8D9 C3A8 896A 4D33" /* \z™·Ï.....è‰jM3 */ $"1F14 1014 2237 5371 91B0 CADF ECF1 ECDF" /* ...."7Sq‘°Ê..... */ $"CAB0 9171 5337 2214 0E12 1E31 4C69 89A8" /* ʰ‘qS7"....1Li‰¨ */ $"C4DA E9F3 F0E5 D2B9 9A7A 5A3D 2615 0D0E" /* Ä.....Ò¹šzZ=&.Â. */ $"182A 4361 81A1 BED7 E8F2 F2E9 D7C0 A282" /* .*Ca�¡¾×....×À¢‚ */ $"6345 2A17 0C0B 1323 3B58 7899 B8D2 E6F2" /* cE*....#;Xx™¸Ò.. */ $"F5EE DEC7 AB8B 6A4B 301B 0E0A 101E 3450" /* ...Ç«‹jK0.....4P */ $"7091 B0CC E1F0 F5F2 E5CF B494 7252 341D" /* p‘°Ì.....Ï´”rR4. */ $"0E08 0C18 2D49 688A ABC8 DFEF F7F4 E9D5" /* ....-IhŠ«È.....Õ */ $"BB9B 7A59 3B23 1207 0813 2640 5F81 A3C1" /* »›zY;#....&@_�£Á */ $"DBED F8F8 EEDC C3A4 8261 4227 1408 070F" /* ......ä‚aB'.... */ $"2039 5778 9ABA D7EB F8FB F4E3 CBAD 8B69" /* 9Wxšº×.....Ë­‹i */ $"482C 1608 040A 1930 4E6F 92B3 D0E6 F6FB" /* H,.....0No’³Ð... */ $"F6E8 D2B6 9572 5033 1B0B 0405 1228 4466" /* ..Ò¶•rP3.....(Df */ $"88AB CAE3 F4FD FBEF D9BE 9E7B 593A 210E" /* ˆ«Ê......¾ž{Y:!. */ $"0506 1023 3E5E 80A1 C1DC EFF7 F8EF DDC4" /* ...#>^€¡Á......Ä */ $"A684 6243 2814 0806 0F1F 3756 7798 B9D4" /* ¦„bC(.....7Vw˜¹Ô */ $"E9F6 F9F2 E1CA AD8D 6B4B 301A 0D08 0D1C" /* .....Ê­�kK0.Â.Â. */ $"324E 6E8F AFCC E3F1 F7F3 E6D0 B595 7454" /* 2Nn�¯Ì.....е•tT */ $"3821 110A 0D19 2D47 6687 A7C4 DCEC F4F3" /* 8!..Â.-Gf‡§Ä.... */ $"E8D5 BB9D 7D5C 3F28 160D 0D17 2941 5E7E" /* .Õ»�}\?(.ÂÂ.)A^~ */ $"9EBC D5E7 F1F2 EAD9 C2A5 8565 462D 1A11" /* ž¼Õ.....Â¥…eF-.. */ $"0E16 253B 5776 96B3 CEE1 EDF1 EBDD C8AC" /* ..%;Wv–³Î.....Ȭ */ $"8E6E 5036 2215 1015 2337 516F 8EAC C7DC" /* ŽnP6"...#7QoެÇ. */ $"E9EF EBDF CBB1 9475 563B 2718 1215 2032" /* ....˱”uV;'... 2 */ $"4B67 86A4 BFD5 E5EC EBE1 CFB7 9B7D 5F42" /* Kg†¤¿Õ....Ï·›}_B */ $"2C1C 1315 1E2F 4560 7E9C B8CF E0E9 EAE2" /* ,..../E`~œ¸Ï.... */ $"D3BD A285 674A 3321 1714 1B29 4059 7694" /* Ó½¢…gJ3!...)@Yv” */ $"B0C8 DBE5 E9E4 D6C3 A98D 6F53 3A27 1A16" /* °È....Öé�oS:'.. */ $"1A27 3A53 6F8D A8C1 D5E2 E7E3 D9C7 AF94" /* .':So�¨ÁÕ....ǯ” */ $"775A 412D 1F18 1B25 374D 6884 A0BA CEDD" /* wZA-...%7Mh„ ºÎ. */ $"E4E3 DACA B59B 7E62 4933 241B 1B23 3247" /* ...ʵ›~bI3$..#2G */ $"617D 99B2 C8D8 E1E2 DCCE B9A1 866A 5039" /* a}™²ÈØ...ι¡†jP9 */ $"291F 1C22 2F43 5B76 91AC C1D3 DEE1 DCD1" /* ).."/C[v‘¬ÁÓ...Ñ */ $"BEA7 8D71 5740 2E22 1E22 2D3E 556F 8AA5" /* ¾§�qW@."."->UoŠ¥ */ $"BCCF DBDF DDD3 C2AD 9379 5F47 3427 2022" /* ¼Ï...Ó­“y_G4' " */ $"2B3B 5068 839E B6C9 D7DE DDD6 C5B1 9980" /* +;Phƒž¶É×..Öű™€ */ $"664E 3A2B 2423 2A38 4B62 7C96 AFC3 D2D9" /* fN:+$#*8Kb|–¯ÃÒ. */ $"DBD4 C8B6 9F86 6D54 4030 2624 2935 475C" /* .ÔȶŸ†mT@0&$)5G\ */ $"758F A8BD CED8 DBD6 CAB9 A38B 725A 4535" /* u�¨½ÎØ.Öʹ£‹rZE5 */ $"2A26 2A34 4458 7089 A2B7 C9D4 D9D7 CEBE" /* *&*4DXp‰¢·ÉÔ.×ξ */ $"AA91 7961 4B3A 2E28 2A32 4054 6A83 9BB1" /* ª‘yaK:.(*2@Tjƒ›± */ $"C3D0 D6D5 CFC1 AE98 8067 5240 322C 2B31" /* ÃÐÖÕÏÁ®˜€gR@2,+1 */ $"3E4F 657C 94AB BDCB D3D5 CFC3 B39D 866E" /* >Oe|”«½ËÓÕÏó�†n */ $"5744 352E 2C31 3B4C 5F76 8EA4 B7C6 D0D3" /* WD5.,1;L_vޤ·ÆÐÓ */ $"D0C5 B6A2 8C74 5E4A 3A30 2C2F 3A48 5B71" /* ÐŶ¢Œt^J:0,/:H[q */ $"879E B1C1 CCD1 CFC7 B9A7 917A 6450 3F36" /* ‡ž±ÁÌÑÏǹ§‘zdP?6 */ $"3131 3945 576C 8197 ACBC C8CE CEC7 BCAB" /* 119EWl�—¬¼ÈÎÎǼ« */ $"9781 6A56 4538 3131 3843 5367 7C91 A6B7" /* —�jVE8118CSg|‘¦· */ $"C4CB CDC8 BEAE 9C86 705C 4A3C 3532 3640" /* ÄËÍȾ®œ†p\J<526@ */ $"4E62 768B A0B1 BFC8 CBC8 BFB1 A08B 7662" /* Nbv‹ ±¿ÈËÈ¿± ‹vb */ $"4F41 3834 363E 4B5D 7186 9AAC BAC4 C9C7" /* OA846>K]q†š¬ºÄÉÇ */ $"C0B4 A490 7C68 5546 3C37 373E 4959 6C81" /* À´¤�|hUF<77>IYl� */ $"95A7 B7C0 C6C6 C1B6 A795 816E 5B4B 4039" /* •§·ÀÆÆÁ¶§•�n[K@9 */ $"393D 4756 677B 8FA1 B1BC C3C5 C1B7 AA99" /* 9=GVg{�¡±¼ÃÅÁ·ª™ */ $"8672 604F 433C 3A3D 4653 6477 8A9D ACB8" /* †r`OC<:=FSdwŠ�¬¸ */ $"C0C3 C0B8 AC9C 8A77 6554 483F 3C3E 4551" /* ÀÃÀ¸¬œŠweTH?<>EQ */ $"6172 8598 A8B6 BFC1 BFB9 AEA0 8E7C 6A5A" /* ar…˜¨¶¿Á¿¹® Ž|jZ */ $"4C43 3F3F 454F 5D6E 8193 A3B1 BBC0 C0BB" /* LC??EO]n�“£±»ÀÀ» */ $"B0A3 9381 705F 5147 4141 454E 5B6A 7C8E" /* °£“�p_QGAAEN[j|Ž */ $"9EAD B7BE BFBC B3A7 9785 7464 564B 4442" /* ž­·¾¿¼³§—…tdVKDB */ $"454C 5867 7789 99A8 B3BB BDBB B2A7 9A8A" /* ELXgw‰™¨³»½»²§šŠ */ $"7969 5A4F 4744 454B 5663 7384 94A3 AFB7" /* yiZOGDEKVcs„”£¯· */ $"BBBA B4AB 9E8E 7D6D 5F53 4A46 474B 5461" /* »º´«žŽ}m_SJFGKTa */ $"7080 8F9E ABB4 B8B9 B5AC A092 8271 6457" /* p€�ž«´¸¹µ¬ ’‚qdW */ $"4E49 484C 535E 6C7C 8B9A A6B0 B6B7 B4AD" /* NIHLS^l|‹š¦°¶·´­ */ $"A295 8676 675A 504C 4A4C 535C 6977 8795" /* ¢•†vgZPLJLS\iw‡• */ $"A2AC B3B5 B3AD A498 897A 6C5F 544D 4A4B" /* ¢¬³µ³­¤˜‰zl_TMJK */ $"525B 6774 8391 9EA8 AFB3 B2AD A59A 8D7E" /* R[gtƒ‘ž¨¯³²­¥š�~ */ $"7063 5850 4C4C 5159 6371 7F8D 9AA4 ACB0" /* pcXPLLQYcq.�𤬰 */ $"B1AD A69C 9082 7467 5C53 4F4E 535A 636F" /* ±­¦œ�‚tg\SONSZco */ $"7C89 96A1 A9AE AFAD A79D 9285 776B 6057" /* |‰–¡©®¯­§�’…wk`W */ $"5250 5258 606C 7986 929D A6AB ADAC A79E" /* RPRX`ly†’�¦«­¬§ž */ $"9488 7B6F 635A 5452 5358 5F6A 7582 8E99" /* ”ˆ{ocZTRSX_ju‚Ž™ */ $"A2A8 ABAA A69F 968B 7E72 675E 5854 5458" /* ¢¨«ª¦Ÿ–‹~rg^XTTX */ $"5F68 737F 8B97 A0A5 A9A9 A6A0 978D 8176" /* _hs.‹— ¥©©¦ —��v */ $"6B62 5B57 5658 5E66 707C 8893 9CA4 A8A9" /* kb[WVX^fp|ˆ“œ¤¨© */ $"A5A0 998F 8579 6F65 5E59 5859 5E65 6F79" /* ¥ ™�…yoe^YXY^eoy */ $"858F 999F A3A5 A4A0 9A91 877C 7269 615C" /* …�™Ÿ£¥¤ š‘‡|ria\ */ $"5A5B 5E64 6D77 818C 959D A2A5 A3A0 9A92" /* Z[^dmw�Œ•�¢¥£ š’ */ $"897F 756C 655F 5C5C 5F64 6C75 7F89 929A" /* ‰.ule_\\_dlu.‰’š */ $"9FA3 A3A1 9C93 8B82 786F 6862 5F5E 6064" /* Ÿ££¡œ“‹‚xohb_^`d */ $"6B73 7C86 8F96 9CA0 A1A0 9C95 8D84 7B72" /* ks|†�–œ ¡ œ•�„{r */ $"6B65 6160 6165 6A72 7A83 8C93 9A9E 9F9F" /* kea`aejrzƒŒ“šžŸŸ */ $"9B96 8F86 7D75 6D68 6462 6265 6A71 7881" /* ›–�†}umhdbbejqx� */ $"8990 969B 9D9D 9A96 8F87 8078 716B 6664" /* ‰�–›��š–�‡€xqkfd */ $"6466 6A70 777F 878E 9498 9B9B 9995 9089" /* dfjpw.‡Ž”˜››™•�‰ */ $"8179 736D 6966 6667 6B70 767D 848B 9196" /* �ysmiffgkpv}„‹‘– */ $"9899 9895 908A 837C 756F 6A69 6869 6B70" /* ˜™˜•�Šƒ|uojihikp */ $"757B 8289 8E93 9697 9794 908B 847E 7771" /* u{‚‰Ž“–——”�‹„~wq */ $"6D69 6868 6C70 757A 8086 8C90 9495 9593" /* mihhlpuz€†Œ�”••“ */ $"908B 8680 7974 6F6C 6A6A 6B6F 7379 7F84" /* �‹†€ytoljjkosy.„ */ $"8A8E 91" /* ŠŽ‘ */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Sosumi.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Sosumi.r new file mode 100644 index 0000000..4bce757 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Sosumi.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 3100 0000 0653 6F73 756D" /* ......1....Sosum */ $"69" /* i */ }; data $8024 (0x31) { $"0000 1A00 E882 0000 EE56 8080 8080 8080" /* .....‚...V€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"7E7F 8081 8180 7F7F 7E7E 7F80 8387 8B90" /* ~.€��€..~~.€ƒ‡‹� */ $"969B A1A7 ACB1 B6BB BFBC A380 6F69 6968" /* –›¡§¬±¶»¿¼£€oiih */ $"6664 6260 6060 6366 6A70 757B 8187 8D92" /* fdb```cfjpu{�‡�’ */ $"979C A0A5 AAAF B2AC 9273 6564 686C 6F71" /* —œ ¥ª¯²¬’sedhloq */ $"7375 787B 7E82 868A 8D91 9497 999B 9C9D" /* sux{~‚†Š�‘”—™›œ� */ $"9FA0 A2A4 A398 7A5B 4D4D 5258 5D62 676C" /* Ÿ ¢¤£˜z[MMRX]bgl */ $"7177 7D84 8A91 969C A0A4 A7A9 ABAC ADAD" /* qw}„Š‘–œ ¤§©«¬­­ */ $"ADAD A898 7858 4946 4A4F 5357 5C5F 6266" /* ­­¨˜xXIFJOSW\_bf */ $"6B72 7A82 8A92 989E A2A6 A9AB ACAE AFAF" /* krz‚Š’˜ž¢¦©«¬®¯¯ */ $"A999 7B5E 504F 545B 6268 6F76 7D85 8E97" /* ©™{^POT[bhov}…Ž— */ $"9FA8 B0B7 BCBE BBB3 A9A3 A2A3 A3A1 9884" /* Ÿ¨°·¼¾»³©£¢££¡˜„ */ $"664A 3B3B 434E 5A66 727F 8C9B A9AC 9683" /* fJ;;CNZfr.Œ›©¬–ƒ */ $"8085 8C92 979B 9FA5 ABB2 B9BD BBAF 987E" /* €…Œ’—›Ÿ¥«²¹½»¯˜~ */ $"6D63 5E5E 636B 6B57 413D 4552 5F6B 7783" /* mc^^ckkWA=ER_kwƒ */ $"8F9B A7B1 BBC4 CBD0 D3D2 CBBA A189 7A6F" /* �›§±»ÄËÐÓÒ˺¡‰zo */ $"563A 3136 414D 5A66 727E 888F 9499 9FA7" /* V:16AMZfr~ˆ�”™Ÿ§ */ $"B0B8 BFC4 C8C9 CAC5 B489 4E21 0D0B 131E" /* °¸¿ÄÈÉÊÅ´‰N!Â... */ $"2B39 4757 6879 8B9C ADBC CAD6 E1E9 F0F6" /* +9GWhy‹œ­¼ÊÖ.... */ $"F9F4 DDB7 9680 6C55 3A22 1410 1621 2E3C" /* ...·–€lU:"...!.< */ $"4B5A 6877 8593 A0AD B9C3 C6BC A38D 878C" /* KZhw…“ ­¹ÃƼ£�‡Œ */ $"949D A2A3 9F95 8677 6E6D 7176 7C82 878A" /* ”�¢£Ÿ•†wnmqv|‚‡Š */ $"8C8C 8C88 7D65 4F49 5262 7486 97A7 B2B1" /* ŒŒŒˆ}eOIRbt†—§²± */ $"A59C 958E 8275 6C69 6C74 7D87 8D8A 7B68" /* ¥œ•Ž‚ulilt}‡�Š{h */ $"6167 7685 8C88 878F 9BA7 B2B9 BEC1 C2C0" /* agv…Œˆ‡�›§²¹¾ÁÂÀ */ $"BAAE 9D8B 7C6E 5F48 2B11 0101 010F 253D" /* º®�‹|n_H+.....%= */ $"566F 89A2 BBD2 E7F9 FFFF FFFF FFFF F6C7" /* Vo‰¢»Ò.........Ç */ $"8748 1801 0101 0105 1221 3448 5E74 8A9F" /* ‡H.......!4H^tŠŸ */ $"B2C4 D1D8 D3C9 C2C0 BAAC 9276 6052 4943" /* ²ÄÑØÓÉÂÀº¬’v`RIC */ $"4144 4C58 6676 8695 9FA0 9C9A 9FA8 B1B8" /* ADLXfv†•Ÿ œšŸ¨±¸ */ $"BAB7 AA96 8072 6E70 7476 746E 6559 4836" /* º·ª–€rnptvtneYH6 */ $"2C2E 394A 5D71 8496 A6B4 BDBD B5A8 9E9D" /* ,.9J]q„–¦´½½µ¨ž� */ $"A3AB B1AF A599 918C 8882 796F 6762 6366" /* £«±¯¥™‘Œˆ‚yogbcf */ $"6D74 797B 766A 5A4A 3D34 2F34 4155 6B82" /* mty{vjZJ=4/4AUk‚ */ $"98AE C1D2 DFE8 EBE9 E1D5 C6B6 A48A 673E" /* ˜®ÁÒ.....ÕÆ¶¤Šg> */ $"1B07 0207 1220 3144 596F 879E B5CB DEED" /* ..... 1DYo‡žµË.. */ $"F8FD F8E9 D0B1 9170 5034 1F11 0A0B 1629" /* ....б‘pP4.....) */ $"4058 7088 9FB4 C6D3 D8D7 D3D1 D2D1 CDC3" /* @XpˆŸ´ÆÓØ×ÓÑÒÑÍà */ $"AF94 7456 3F2E 2624 272F 3945 5056 5754" /* ¯”tV?.&$'/9EPVWT */ $"5259 697F 97AD C0CE D6D7 D1C5 B9AF A7A1" /* RYi.—­ÀÎÖ×ÑŹ¯§¡ */ $"9A8F 7F6A 5546 4041 4954 6270 7F8E 9DA9" /* š�.jUF@AITbp.Ž�© */ $"B2B4 AD9C 8772 6459 514B 4748 4E56 5F67" /* ²´­œ‡rdYQKGHNV_g */ $"6F76 7F88 939F ACB8 C1C7 C8C1 B29A 7F67" /* ov.ˆ“Ÿ¬¸ÁÇÈÁ²š.g */ $"5956 5B64 6F78 8084 898F 969C A0A1 9D96" /* YV[dox€„‰�–œ ¡�– */ $"8C7E 6C56 402B 1A0F 0B10 1D30 4964 819F" /* Œ~lV@+.....0Id�Ÿ */ $"BCD7 F0FF FFFF FFFF FFF0 D0AD 8B69 492A" /* ¼×........Э‹iI* */ $"0F01 0101 0101 0A1E 344B 6276 8896 A1AC" /* ........4Kbvˆ–¡¬ */ $"B9C7 D6E3 ECEF EBE0 CEB7 9D84 6E5B 4B3F" /* ¹ÇÖ.....η�„n[K? */ $"3630 2D2C 2F36 4354 687D 91A4 B6C4 CED2" /* 60-,/6CTh}‘¤¶ÄÎÒ */ $"D1C9 BCAA 9884 705B 4736 2A26 2831 3E4F" /* Ñɼª˜„p[G6*&(1>O */ $"6071 8192 A2B3 C1CD D3D3 CBBD A892 7C6C" /* `q�’¢³ÁÍÓÓ˽¨’|l */ $"615C 5B5C 5F62 6569 6E74 7C84 8C94 9B9E" /* a\[\_beint|„Œ”›ž */ $"9C94 8572 5C48 3830 3139 485B 7086 9CAF" /* œ”…r\H8019H[p†œ¯ */ $"C0CD D5D9 D7D0 C3B2 9E8A 7766 574A 3F37" /* ÀÍÕ.×ÐòžŠwfWJ?7 */ $"3437 3E4B 5B6D 7E8F 9CA7 ACAE ACA7 A098" /* 47>K[m~�œ§¬®¬§ ˜ */ $"918A 8279 6F63 574C 443F 3F45 4F5C 6B7B" /* ‘Š‚yocWLD??EO\k{ */ $"8995 9FA8 B2BD C8D3 DCE2 E3DE D3C1 AA8E" /* ‰•Ÿ¨²½ÈÓ....ÓÁªŽ */ $"7052 361E 0A01 0101 0101 0114 2E4C 6C8E" /* pR6..........LlŽ */ $"AFCF EBFF FFFF FFFF FFFF E6C5 A07B 583A" /* ¯Ï.........Å {X: */ $"2211 0704 0812 2133 485E 7388 9AA8 B1B5" /* ".....!3H^sˆš¨±µ */ $"B1A8 9A8A 7C70 6968 6A6F 767E 868F 979F" /* ±¨šŠ|pihjov~†�—Ÿ */ $"A6AC AFAF ACA4 9A8D 7F70 6358 4F49 4648" /* ¦¬¯¯¬¤š�.pcXOIFH */ $"4D56 626F 7D8A 969F A4A5 A39D 9489 8078" /* MVbo}Š–Ÿ¤¥£�”‰€x */ $"726E 6B68 6663 605F 6165 6D77 8390 9BA5" /* rnkhfc`_aemwƒ�›¥ */ $"ABAF AFAE ACA9 A6A1 9C94 8B80 7467 5A4F" /* «¯¯®¬©¦¡œ”‹€tgZO */ $"453E 3A39 3B3F 454C 5561 6F80 92A4 B6C6" /* E>:9;?ELUao€’¤¶Æ */ $"D4DE E3E2 DCCF BCA5 8B6F 533B 2618 1010" /* Ô....ϼ¥‹oS;&... */ $"1826 3A51 6B87 A2BC D3E5 F3F9 F8EF DEC5" /* .&:Qk‡¢¼Ó......Å */ $"A582 5E3C 1F0A 0101 0104 1328 405B 7793" /* ¥‚^<.......(@[w“ */ $"AEC5 D9E7 F0F2 EEE4 D6C5 B3A2 9081 7468" /* ®Å......Öų¢��th */ $"5F57 524D 4A49 494A 4C4F 5153 5558 5C61" /* _WRMJIIJLOQSUX\a */ $"676E 757D 848D 96A0 AAB5 BEC6 CBCC CAC3" /* gnu}„�– ªµ¾ÆËÌÊà */ $"B9AC 9E90 8276 6C63 5B55 4F4A 4643 4243" /* ¹¬ž�‚vlc[UOJFCBC */ $"464B 5159 6169 7179 838C 97A2 ACB5 BCC1" /* FKQYaiqyƒŒ—¢¬µ¼Á */ $"C3C2 BEB7 AC9F 8F7E 6D5D 4E42 3A37 3940" /* þ·¬Ÿ�~m]NB:79@ */ $"4D5D 7084 98AA BAC5 CCCE CAC0 B09B 8267" /* M]p„˜ªºÅÌÎÊÀ°›‚g */ $"4C33 1F11 0B0D 1626 3C56 728F ABC6 DDF0" /* L3...Â.&:778=EP^n€’¥¶ÅÐ */ $"D8DB DAD4 CABE AF9E 8C79 685A 4D44 403F" /* Ø..Ôʾ¯žŒyhZMD@? */ $"4249 525D 6975 8089 9094 9593 8E88 8079" /* BIR]iu€‰�”•“Žˆ€y */ $"736F 6D6F 7379 828B 959E A6AC B0B0 AEA8" /* somosy‚‹•ž¦¬°°®¨ */ $"9F93 8474 6352 453B 3535 3A45 5467 7B91" /* Ÿ“„tcRE;55:ETg{‘ */ $"A7BA CBD7 DEDF DACF BEA8 9075 5B43 2E1E" /* §ºË×...Ͼ¨�u[C.. */ $"130E 1018 2638 4E67 819A B1C6 D7E3 EAED" /* ....&8Ng�š±Æ×... */ $"EAE3 D8CB BAA8 9581 6E5C 4D40 362F 2B2B" /* ..ØËº¨•�n\M@6/++ */ $"2E32 3A42 4D5A 6876 8695 A4B1 BCC4 C8C9" /* .2:BMZhv†•¤±¼ÄÈÉ */ $"C6C0 B6AB 9D8F 8072 665B 5450 5053 5A64" /* ÆÀ¶«��€rf[TPPSZd */ $"707D 8B97 A2AA AFAF ACA4 998B 7C6B 5B4C" /* p}‹—¢ª¯¯¬¤™‹|k[L */ $"4038 3435 3B45 5363 768A 9DAF BECA D1D4" /* @845;EScvŠ�¯¾ÊÑÔ */ $"D1CA BFB1 A190 8072 665E 5A59 5B5F 656C" /* ÑÊ¿±¡�€rf^ZY[_el */ $"737A 7F82 8381 7D77 6F66 5E56 504D 4E53" /* sz.‚ƒ�}wof^VPMNS */ $"5B67 7687 9AAC BECE D9E1 E4E2 DACD BDA9" /* [gv‡š¬¾Î.....ͽ© */ $"947D 6752 4132 2720 1E20 2732 3F50 6174" /* ”}gRA2' . '2?Pat */ $"8696 A5B2 BCC4 C8CA C9C6 BFB6 AC9F 9082" /* †–¥²¼ÄÈÊÉÆ¿¶¬Ÿ�‚ */ $"7365 584D 453F 3C3C 3F46 505C 6B7C 8EA0" /* seXME?<�u~§Ó—¿”ac */ $"6670 A170 BC5F 8B96 5E57 8580 9AD6 868F" /* fp¡p¼_‹–^W…€šÖ†� */ $"6F5D 645E 7EA5 97CC AF85 5C62 2E9A 67AF" /* o]d^~¥—̯…\b.šg¯ */ $"BC98 AD9D 6985 6B79 9982 8AA2 7586 7572" /* ¼˜­�i…ky™‚Š¢u†ur */ $"A283 A086 7B67 7F6B 6389 999F 9C73 9372" /* ¢ƒ †{g.kc‰™Ÿœs“r */ $"5D4C 7E57 8879 9790 8C64 776F 937B 8B99" /* ]L~Wˆy—�Œdwo“{‹™ */ $"7A92 88A8 9582 9D9B 9CAB 9893 7E6D 6178" /* z’ˆ¨•‚�›œ«˜“~max */ $"627B 7290 9393 AA91 949B 8173 7962 6A6C" /* b{r�““ª‘”›�sybjl */ $"7278 81A1 9EAC B289 8C77 6663 5E79 5792" /* rx�¡ž¬²‰Œwfc^yW’ */ $"938A B9B2 B19C 9982 6B7B 5A5E 6E66 76B0" /* “й²±œ™‚k{Z^nfv° */ $"9E9C 9CAA 7E7B 7C51 6E67 7271 8D7F 92B2" /* žœœª~{|Qngrq�.’² */ $"8E8E 996B 686A 8264 9286 A09E 8E8E 9097" /* ŽŽ™khj‚d’† žŽŽ�— */ $"7A83 816A 6686 6F6A 997D AB88 A47A 828B" /* zƒ�jf†oj™}«ˆ¤z‚‹ */ $"5D7B 545E 678E 7A85 969D 9989 8654 653D" /* ]{T^gŽz…–�™‰†Te= */ $"5D46 7C57 8ABE 95B6 A88F 797B 5E3D 5E55" /* ]F|Wо•¶¨�y{^=^U */ $"7181 A69E BFAD 8A70 8062 5178 406F 768A" /* q�¦ž¿­Šp€bQx@ovŠ */ $"8D95 9E6A 9575 6978 8065 7E7E 6377 8376" /* �•žj•uix€e~~cwƒv */ $"838B 877E 8074 826C 946A A2A9 9BA9 8A87" /* ƒ‹‡~€t‚l”j¢©›©Š‡ */ $"6B7B 5463 6964 7377 A5A0 C2AD A28A 8654" /* k{Tcidsw¥ Â­¢Š†T */ $"5854 5658 5F7B 8395 B9A3 AFAF 7D71 634C" /* XTVX_{ƒ•¹£¯¯}qcL */ $"6C67 7180 9D8F 93A2 9D89 917E 6962 4D6D" /* lgq€��“¢�‰‘~ibMm */ $"728C 8C8A AE94 9D7E 796E 6874 3D78 6B88" /* rŒŒŠ®”�~ynht=xkˆ */ $"8B84 9181 9293 6A73 6E87 606A 934C 6F80" /* ‹„‘�’“jsn‡`j“Lo€ */ $"5F8C 7B60 8683 6F78 675E 7D75 6A82 948A" /* _Œ{`†ƒoxg^}uj‚”Š */ $"7FB9 66AC 8563 8865 5244 7E54 8F70 64A8" /* .¹f¬…cˆeRD~T�pd¨ */ $"7879 92BC 96A9 8C8F 986F 7958 623F 5855" /* xy’¼–©Œ�˜oyXb?XU */ $"8B66 B574 89BC 7CA6 8FA4 9689 8B9C 7967" /* ‹fµt‰¼|¦�¤–‰‹œyg */ $"6C69 6E4C 6076 A171 938D B16A 7A9C 8D9A" /* linL`v¡q“�±jzœ�š */ $"6486 8488 668A 946D 7769 8584 8486 7C9C" /* d†„ˆfŠ”mwi…„„†|œ */ $"8E63 958B 9483 7283 A843 858D 7182 5369" /* Žc•‹”ƒrƒ¨C…�q‚Si */ $"9868 6E87 9F7C 8A8B 7DC3 8584 90A0 436B" /* ˜hn‡Ÿ|Š‹}Ã…„� Ck */ $"7E4A 9032 6280 884E A9A9 7CBF 68AF A0AF" /* ~J�2b€ˆN©©|¿h¯ ¯ */ $"5FAF 6D65 6834 7545 7031 8C97 69BD A1B8" /* _¯meh4uEp1Œ—i½¡¸ */ $"89A6 6B96 8240 8251 7060 4C71 6D8D 5BA6" /* ‰¦k–‚@‚Qp`Lqm�[¦ */ $"A797 8F9C 9888 7260 757E 4388 7289 5984" /* §—�œ˜ˆr`u~Cˆr‰Y„ */ $"8570 8C45 6D6B 7E5D 939A 6996 2994 4D92" /* …pŒEmk~]“ši–)”M’ */ $"509F BC3F 87CB 5164 9E44 8B54 6070 954F" /* PŸ¼?‡ËQdžD‹T`p•O */ $"668E 9081 8386 618B 926F 9479 66AB 66CB" /* fŽ��ƒ†a‹’o”yf«fË */ $"8486 9A91 5C90 389D 5685 5DA5 6FA2 8F9B" /* „†š‘\�8�V…]¥o¢�› */ $"AC78 73A3 6D84 65A9 5093 A38C 9486 897E" /* ¬xs£m„e©P“£Œ”†‰~ */ $"8969 7A92 556B 926F 949A 76B7 9EA6 7BB3" /* ‰iz’Uk’o”šv·ž¦{³ */ $"7078 A36C 6C8D 8B5B AC6E 59A2 8741 9A5D" /* px£ll�‹[¬nY¢‡Aš] */ $"7581 538A 9864 84B2 8E6D AC87 826B 7E89" /* u�SŠ˜d„²Žm¬‡‚k~‰ */ $"7971 6D92 7B75 8276 7079 6F97 6A74 7F8A" /* yqm’{u‚vpyo—jt.Š */ $"8776 7E7D 7E7B 9881 6286 666D 6E3C 735D" /* ‡v~}~{˜�b†fmn´ */ $"8947 836D B53F 8758 A487 6591 B84E A752" /* ‰Gƒmµ?‡X¤‡e‘¸N§R */ $"CA5B 92A4 53B8 5554 BC8F 7284 AA92 6988" /* Ê[’¤S¸UT¼�r„ª’iˆ */ $"A296 7230 C96A 7E4E AB6A 8751 9A68 A82A" /* ¢–r0Éj~N«j‡Qšh¨* */ $"CF58 8C46 A5A6 4B99 72A8 7964 6ACA 44AA" /* ÏXŒF¥¦K™r¨ydjÊDª */ $"5ABA 9063 8767 945B 7B52 826A 4496 4E82" /* Zº�c‡g”[{R‚jD–N‚ */ $"5A8B 7DAD 667C 99DB 2CA3 9C93 9976 63CD" /* Z‹}­f|™.,£œ“™vcÍ */ $"575C 7EA2 1D75 8E78 3C84 5B98 4D5E 80A5" /* W\~¢.uŽx<„[˜M^€¥ */ $"556E 53CA 6254 AB7D 9D96 3CC2 6761 86AF" /* UnSÊbT«}�–<Âga†¯ */ $"703B 71A7 614F 3A9F 7C68 396C B881 8A47" /* p;q§aO:Ÿ|h9l¸�ŠG */ $"B1A4 67A5 27BA CF8D 9948 78CB 526A 6FB1" /* ±¤g¥'ºÏ�™HxËRjo± */ $"78A0 4E81 B975 3975 B55C C158 3E8F 8B77" /* x N�¹u9uµ\ÁX>�‹w */ $"4B8B 706C 4F8B 814C 99A5 2CD6 9FA8 718D" /* K‹plO‹�L™¥,ÖŸ¨q� */ $"89A6 8DD5 3EAD 888A 882D C77D 74BA 6D74" /* ‰¦�Õ>­ˆŠˆ-Ç}tºmt */ $"C455 8B4F 818E 918A 2CAD 643E 9232 BD55" /* ÄU‹O�Ž‘Š,­d>’2½U */ $"6984 5581 7B94 8250 ACD1 4A99 769D E754" /* i„U�{”‚P¬ÑJ™v�.T */ $"C878 81B2 686B 73B3 6780 AA5F 9F4A 56A1" /* Èx�²hks³g€ª_ŸJV¡ */ $"5576 AC55 7B72 5A82 5981 53B7 7432 BE82" /* Uv¬U{rZ‚Y�S·t2¾‚ */ $"5BD8 7869 DB58 C14D CC6D A0C1 64BD 507F" /* [Øxi.XÁMÌm Ád½P. */ $"923B 7597 5E60 778A 4C91 5878 959A 509D" /* ’;u—^`wŠL‘Xx•šP� */ $"708A 8983 813F 8D88 579D 7F5C A477 8B80" /* pЉƒ�?�ˆW�.\¤w‹€ */ $"8A80 70A1 53B1 7944 A277 6093 6784 26B3" /* Š€p¡S±yD¢w`“g„&³ */ $"858C 6F4F 8CAC 6A80 6294 B96D 9897 AA8B" /* …ŒoOŒ¬j€b”¹m˜—ª‹ */ $"4D97 7CA7 6178 65A9 AB71 6BAE 60AA 994B" /* M—|§axe©«qk®`ª™K */ $"8EB6 6B8F 48AC 7882 14AF 793F 8F53 50A2" /* ޶k�H¬x‚.¯y?�SP¢ */ $"6F58 A48C 7D7B AF82 A4A9 7C69 BAA2 A264" /* oX¤Œ}{¯‚¤©|iº¢¢d */ $"7C93 AB8C B339 A66A 8D45 BF74 6A99 6864" /* |“«Œ³9¦j�E¿tj™hd */ $"7AAE 1EAE 5F86 796A 4FB0 8571 6598 BA89" /* z®.®_†yjO°…qe˜º‰ */ $"6094 CB9E 59B4 7172 A643 66BE 5476 7D6A" /* `”ËžY´qr¦Cf¾Tv}j */ $"6E93 3056 AF85 7D7B 4CAD AB57 76B7 687B" /* n“0V¯…}{L­«Wv·h{ */ $"A360 C08F 736F 9BAE 6968 9C4A 8B6D 8881" /* £`À�so›®ihœJ‹mˆ� */ $"489A 5D77 676F 6288 686A 5C9B 626B 9560" /* Hš]wgobˆhj\›bk•` */ $"9CA3 8F80 9C5C BA70 4EB7 AD57 A64B A275" /* œ£�€œ\ºpN·­W¦K¢u */ $"5D87 5D82 6750 8664 9261 4B8E 7781 3185" /* ]‡]‚gP†d’aKŽw�1… */ $"4DAD 9856 759D 6A9E 888F 92B9 4F9B A892" /* M­˜Vu�jžˆ�’¹O›¨’ */ $"7168 77AB 6085 523A 7E98 6C59 5B80 5A58" /* qhw«`…R:~˜lY[€ZX */ $"7B69 C159 7D4E C394 4896 88BC 7E70 B75C" /* {iÁY}NÔH–ˆ¼~p·\ */ $"BC85 8188 DC89 63A3 6A76 C53E 73B6 5767" /* ¼…�ˆ.‰c£jvÅ>s¶Wg */ $"567E 8776 4A88 6A8C 5360 6BBC 7E84 AFA1" /* V~‡vJˆjŒS`k¼~„¯¡ */ $"8F7C B079 A5DB 4B87 838A 5F88 3E90 4BA6" /* �|°y¥.K‡ƒŠ_ˆ>�K¦ */ $"7468 4FAB 36C9 7572 9754 63A9 7995 7649" /* thO«6Éur—Tc©y•vI */ $"9ADC 5F62 73B5 8CC4 6AB6 6492 61B1 7ACA" /* š._bsµŒÄj¶d’a±zÊ */ $"594C 7E8A 543B 697D 6A9D 2994 6761 945E" /* YL~ŠT;i}j�)”ga”^ */ $"D39B 3BC2 4CD4 9D7E 82B2 A675 84A1 76AD" /* Ó›;ÂLÔ�~‚²¦u„¡v­ */ $"718C A19B 5E38 8E79 B351 4D55 9F22 5F55" /* qŒ¡›^8Žy³QMUŸ"_U */ $"5AAD 1E93 5D79 A924 71D7 5DC8 82B3 ACA7" /* Z­.“]y©$q×]È‚³¬§ */ $"8AAB D07D 8E79 81BD 4C6B 7196 6E3E 9D37" /* Š«Ð}Žy�½Lkq–n>�7 */ $"5499 4268 8428 5E59 2C88 5E33 C44B 71A8" /* T™Bh„(^Y,ˆ^3ÄKq¨ */ $"809A 77DC 98AC A9B2 AA64 ED6D A3AB 6776" /* €šw.˜¬©²ªd.m£«gv */ $"927B 664F 9240 813C 836B 8377 6A5F 926E" /* ’{fO’@�<ƒkƒwj_’n */ $"8427 947D 836A 6AC7 2DB2 B278 88AC 7190" /* „'”}ƒjjÇ-²²xˆ¬q� */ $"BBA0 9789 9278 B767 7872 8270 9C49 7C87" /* » —‰’x·gxr‚pœI|‡ */ $"7862 D95D 83C2 75AC 9C80 7A65 8883 5F69" /* xb.]ƒÂu¬œ€zeˆƒ_i */ $"4FAB 584A B865 4490 8E88 B63C 9BA5 7070" /* O«XJ¸eD�Žˆ¶<›¥pp */ $"6AA8 866F 7A6F A6B9 2998 C985 9997 8EA9" /* j¨†ozo¦¹)˜É…™—Ž© */ $"A546 9E88 8020 8B8F 5139 8930 7651 618F" /* ¥Fžˆ€ ‹�Q9‰0vQa� */ $"5B83 9370 9095 8C42 8EBD 8F63 C53E AEC1" /* [ƒ“p�•ŒB޽�cÅ>®Á */ $"45A0 9785 A192 A299 54AA 7392 576A 4958" /* E —…¡’¢™Tªs’WjIX */ $"AB20 4C72 5B4A 3CAA 9368 66A1 BE5A A95D" /* « Lr[J<ª“hf¡¾Z©] */ $"9AB7 8E71 A37E 6B7C A376 815A 9B77 8571" /* š·Žq£~k|£v�Z›w…q */ $"5FAF 4565 7A7F 5D4B 4DAE 771C 6F92 6072" /* _¯Eez.]KM®w.o’`r */ $"7ABF 8D70 73DF 6F76 A761 C199 41B6 5B63" /* z¿�ps.ov§aÁ™A¶[c */ $"867C 739A 3390 9686 6384 AD49 A35E AC56" /* †|sš3�–†c„­I£^¬V */ $"8571 96A3 7653 77BF 8066 BE71 9E97 8194" /* …q–£vSw¿€f¾qž—�” */ $"4AB8 717F 6B76 6370 754C 9752 8F71 4EAB" /* J¸q.kvcpuL—R�qN« */ $"8B59 9CB4 688A AF66 B997 72A1 987A 6B84" /* ‹Yœ´hНf¹—r¡˜zk„ */ $"8DAE 628C B748 A86D 887D 894E 9D3F 7974" /* �®bŒ·H¨mˆ}‰N�?yt */ $"4099 358B 64A7 616F 9DB0 8A8E 73AD 6ACF" /* @™5‹d§ao�°ŠŽs­jÏ */ $"56A3 8F7A 6180 7057 8D51 8F7F 6A8E 6378" /* V£�za€pW�Q�.jŽcx */ $"BD84 7873 76C8 4489 8B55 B23F 6EB1 714A" /* ½„xsvÈD‰‹U²?n±qJ */ $"AA92 6362 8384 5C7C 5CA1 5B4E 867B 807B" /* ª’cbƒ„\|\¡[N†{€{ */ $"7489 9C8B 75AA A778 AACB 61C2 4BA3 8874" /* t‰œ‹uª§xªËaÂK£ˆt */ $"5567 8949 7747 AD45 7F76 6899 5E81 7979" /* Ug‰IwG­E.vh™^�yy */ $"9B7D 7765 A087 A28B 7DA9 AC76 80A1 9483" /* ›}we ‡¢‹}©¬v€¡”ƒ */ $"6BB3 7791 596A AE5B 526E 894D 796A 9C79" /* k³w‘Yj®[Rn‰Myjœy */ $"6C8F 9691 62A3 6599 8477 816F B54F A490" /* l�–‘b£e™„w�oµO¤� */ $"6695 8B71 AC4E 9A98 5E9D 8859 8A63 8F75" /* f•‹q¬Nš˜^�ˆYŠc�u */ $"746C 965A B16B 9770 70E4 7E5E 8993 8B6A" /* tl–Z±k—pp.~^‰“‹j */ $"7165 9D3A 6C7E 9A4A 8D59 9C9D 40A3 6DA4" /* qe�:l~šJ�Yœ�@£m¤ */ $"817C B757 73A3 867C 8F4E D562 8D99 7D8C" /* �|·Ws£†|�NÕb�™}Œ */ $"8F94 A146 8E77 6F53 855E 7056 6669 9241" /* �”¡FŽwoS…^pVfi’A */ $"867A 8B83 875A B78D 74B7 9567 8975 CC71" /* †z‹ƒ‡Z·�t·•g‰uÌq */ $"7E68 B899 317B A76F 6B7A 808C 2E65 7F72" /* ~h¸™1{§okz€Œ.e.r */ $"5363 598F 6E47 8D83 8D6A 7F9C 70A2 8994" /* ScY�nG�ƒ�j.œp¢‰” */ $"957C 719B 8A78 9951 9D6C 7676 7A85 7085" /* •|q›Šx™Q�lvvz…p… */ $"8193 388D 637A 7D2C 8070 637B 5691 6B89" /* �“8�cz},€pc{V‘k‰ */ $"7EAA 6A88 93AA 7778 A6A3 9B49 B4A8 48A8" /* ~ªjˆ“ªwx¦£›I´¨H¨ */ $"61C1 508F 7A97 9567 6A78 6E85 486A 884D" /* aÁP�z—•gjxn…HjˆM */ $"8058 7980 5598 9780 8487 85AE 62AF 69A5" /* €Xy€U˜—€„‡…®b¯i¥ */ $"7B8F 83AB 6D7A 9D80 8F76 7B9A 9E47 A765" /* {�ƒ«mz�€�v{šžG§e */ $"8F61 6695 6871 5D73 7367 5EA6 6C89 8493" /* �af•hq]ssg^¦l‰„“ */ $"A356 9C87 A45A 9A7D AB66 8D6B B682 776C" /* £Vœ‡¤Zš}«f�k¶‚wl */ $"9A86 7D76 5DC6 2796 668C 6F67 4EA4 595D" /* š†}v]Æ'–fŒogN¤Y] */ $"9671 A366 B794 887D 8A9C 8B82 60B2 668B" /* –q£f·”ˆ}Šœ‹‚`²f‹ */ $"52A2 7B6E 69AB 7260 9168 A155 7C85 9943" /* R¢{ni«r`‘h¡U|…™C */ $"A17C 903F A46A 8B73 6EA2 8D85 758C 69B5" /* ¡|�?¤j‹sn¢�…uŒiµ */ $"53B1 6B89 7881 51AA 7353 B45A C14C 7E9A" /* S±k‰x�QªsS´ZÁL~š */ $"808F 7864 899C 4ABA 556D 936E 837B 9373" /* €�xd‰œJºUm“nƒ{“s */ $"9F61 9876 918C 7D8F 837C 6B86 8060 965F" /* Ÿa˜v‘Œ}�ƒ|k†€`–_ */ $"9581 8977 7C6C A94F AB55 AD76 6E9B 539F" /* •�‰w|l©O«U­vn›SŸ */ $"7591 786F 9695 4F98 A06E 7B70 997E 7176" /* u‘xo–•O˜ n{p™~qv */ $"7C85 8D56 A48C 7792 7F85 6C73 9E88 6F73" /* |…�V¤Œw’.…lsžˆos */ $"73A0 408F 746D 7C74 8752 7599 7390 6393" /* s @�tm|t‡Ru™s�c“ */ $"9D7E 7C8A 8D6E 9878 8076 8F91 6385 7B66" /* �~|Š�n˜x€v�‘c…{f */ $"8F4D A95E 727E 5E79 5B8C 6A75 8499 5593" /* �M©^r~^y[Œju„™U“ */ $"73AD 7A88 64A7 7496 3DB5 6483 4F93 7967" /* s­zˆd§t–=µdƒO“yg */ $"7876 7165 7573 8E50 9671 7B76 837E 9175" /* xvqeusŽP–q{vƒ~‘u */ $"9B77 9E70 788B 9289 699F 9086 66A4 599D" /* ›wžpx‹’‰iŸ�†f¤Y� */ $"6D73 8776 52A6 5A6C 676A A444 865B 9E57" /* ms‡vR¦Zlgj¤D†[žW */ $"7593 766F 999D A660 A08D C364 A38F D063" /* u“vo™�¦` �Ãd£�Ðc */ $"8879 AF59 7593 5E63 7C69 5D7E 469F 5F78" /* ˆy¯Yu“^c|i]~FŸ_x */ $"8D7C 6895 72A9 71A4 7D96 AA76 709E AC72" /* �|h•r©q¤}–ªvpž¬r */ $"7F8C 7F85 7F72 6A7A 6C84 775C A673 7D6C" /* .Œ.….rjzl„w\¦s}l */ $"9D87 908A 9980 8384 8282 9A69 7C90 7183" /* �‡�Š™€ƒ„‚‚ši|�qƒ */ $"6B79 9568 7772 9A66 9573 8A64 997F 9671" /* ky•hwršf•sŠd™.–q */ $"6EA0 7D6D 8171 B856 9584 6B7E 8686 6871" /* n }m�q¸V•„k~††hq */ $"8790 5564 A168 7978 9A72 7773 9983 5F91" /* ‡�Ud¡hyxšrws™ƒ_‘ */ $"7F89 667A A14F 8E80 7F69 8DA6 9465 71A2" /* .‰fz¡OŽ€.i�¦”eq¢ */ $"8F4A 8F73 956B 5985 737B 7577 8D7F 7185" /* �J�s•kY…s{uw�.q… */ $"9065 A37B 856D 8090 6C76 829F 6669 9989" /* �e£{…m€�lv‚Ÿfi™‰ */ $"7F71 A267 8B75 9179 759C 7572 6F8E A366" /* .q¢g‹u‘yuœuroŽ£f */ $"947E 9782 7291 8097 717F 5A71 6C79 796C" /* ”~—‚r‘€—q.Zqlyyl */ $"7480 6D86 729C 6294 7E6C 9586 8676 8B9A" /* t€m†rœb”~l•††v‹š */ $"587A A296 4E94 768D 5C76 A267 8291 646A" /* Xz¢–N”v�\v¢g‚‘dj */ $"7888 7E6C 788A 6A6D 6DAC 6C7E 6890 6E6E" /* xˆ~lxŠjmm¬l~h�nn */ $"7999 6388 7190 71A0 739A 757B 967A 7894" /* y™cˆq�q sšu{–zx” */ $"8797 6067 9874 7A75 8373 745E 8874 867C" /* ‡—`g˜tzuƒst^ˆt†| */ $"738C 6793 6D93 6E7D 8D5E A280 6EA8 6496" /* sŒg“m“n}�^¢€n¨d– */ $"7596 8965 9A8F 6A73 8E7F 777C 8373 748C" /* u–‰eš�jsŽ.w|ƒstŒ */ $"6A68 9386 607C 55A3 666D 8991 7269 A17F" /* jh“†`|U£fm‰‘ri¡. */ $"897B 9E90 5BAA 9364 8A8B 9350 76A4 7451" /* ‰{ž�[ª“dŠ‹“Pv¤tQ */ $"719D 6346 9C97 5D7D 8489 579C 888F 7396" /* q�cFœ—]}„‰Wœˆ�s– */ $"966A 95A6 8B82 84A7 8C7A 739E 8368 866E" /* –j•¦‹‚„§Œzsžƒh†n */ $"716E 926B 5589 8672 8A5B AA82 6490 6BA1" /* qn’kU‰†rŠ[ª‚d�k¡ */ $"7F94 8874 9294 AA62 A095 857C 7696 7969" /* .”ˆt’”ªb •…|v–yi */ $"9D5E 698A 6F73 7E5B 9167 8A77 7575 A668" /* �^iŠos~[‘gŠwuu¦h */ $"797C 9C93 718F 8C74 A875 9F79 818D 6C72" /* y|œ“q�Œt¨uŸy��lr */ $"6F8E 5B8A 6A70 717F 807F 42A3 896B 6892" /* oŽ[Šjpq.€.B£‰kh’ */ $"866B 907D 658B 8793 448C 8E84 736A AF5E" /* †k�}e‹‡“DŒŽ„sj¯^ */ $"8B72 896E 877E 9072 6C98 9267 7C89 8273" /* ‹r‰n‡~�rl˜’g|‰‚s */ $"877D 845B A262 836B 7B97 4D91 797F 8983" /* ‡}„[¢bƒk{—M‘y.‰ƒ */ $"9767 948B 9175 70A6 7579 6C99 6E6D 818A" /* —g”‹‘up¦uyl™nm�Š */ $"6297 7A86 6787 8C67 8976 7C6C 8287 6F79" /* b—z†g‡Œg‰v|l‚‡oy */ $"7B8D 7384 7A8C 897B 6C89 8F78 7677 887D" /* {�s„zŒ‰{l‰�xvwˆ} */ $"8573 8B80 7976 8C73 8C7F 6C87 6298 6083" /* …s‹€yvŒsŒ.l‡b˜`ƒ */ $"787F 7D8F 935F A885 747D 986A 8478 845D" /* x.}�“_¨…t}˜j„x„] */ $"8481 856F 8497 6397 7D81 7794 7D7C 7A86" /* „�…o„—c—}�w”}|z† */ $"8F71 7984 777E 7E7F 7C71 807D 796C 8185" /* �qy„w~~.|q€}yl�… */ $"6C79 7F78 887F 7871 987C 8C64 A578 7873" /* ly.xˆ.xq˜|Œd¥xxs */ $"858B 678D 6A79 768C 757B 689A 6B70 A75F" /* …‹g�jyvŒu{hškp§_ */ $"757E 8056 7F8D 815C 9D7D 8594 8581 799C" /* u~€V.��\�}…”…�yœ */ $"915C 8DA6 718C 6CA4 678C 7E8D 5D8B 856E" /* ‘\�¦qŒl¤gŒ~�]‹…n */ $"6695 7F6D 678D 6B8B 7F81 7185 9E8F 8B89" /* f•.mg�k‹.�q…ž�‹‰ */ $"A571 938A 8591 8D7E 7280 8394 6B73 6C98" /* ¥q“Š…‘�~r€ƒ”ksl˜ */ $"6984 6A99 638D 6791 7788 885B 8F83 8986" /* i„j™c�g‘wˆˆ[�ƒ‰† */ $"8093 7480 888A 8073 8B81 7972 8A95 6383" /* €“t€ˆŠ€s‹�yrŠ•cƒ */ $"8291 738E 6F8B 7C75 816C 7C75 7E6F 827D" /* ‚‘sŽo‹|u�l|u~o‚} */ $"877F 857F 8081 8574 729F 6C78 7598 6E8E" /* ‡.….€�…trŸlxu˜nŽ */ $"7D80 7896 8F61 927E 856B 8178 7772 6F76" /* }€x–�a’~…k�xwrov */ $"7A86 7778 6497 746F 7A7B 8175 8885 8885" /* z†wxd—toz{�uˆ…ˆ… */ $"8D83 7C95 8288 7476 818B 6D68 8173 8751" /* �ƒ|•‚ˆtv�‹mh�s‡Q */ $"876C 9468 7679 9971 6694 7778 886B 8787" /* ‡l”hvy™qf”wxˆk‡‡ */ $"8692 619E 7691 6B9C 6B88 7E8D 7683 8C79" /* †’ažv‘kœkˆ~�vƒŒy */ $"727B 967C 727A 7779 7271 737C 6284 6F73" /* r{–|rzwyrqs|b„os */ $"808C 8676 9F8A 8B9C 8193 7C8F 837C 838B" /* €Œ†vŸŠ‹œ�“|�ƒ|ƒ‹ */ $"6783 7D6E 7778 7960 7C74 6C85 6E89 6979" /* gƒ}nwxy`|tl…n‰iy */ $"8F81 9786 8A93 838D 937C 8C81 6D83 7A92" /* ��—†Š“ƒ�“|Œ�mƒz’ */ $"548E 6672 8B70 8768 797B 7C7C 8379 7974" /* TŽfr‹p‡hy{||ƒyyt */ $"7E7C 8280 7F7B 8788 886C 9B6D 7784 8079" /* ~|‚€.{‡ˆˆl›mw„€y */ $"7285 778A 6D99 678E 857B 8486 8284 788D" /* r…wŠm™gŽ…{„†‚„x� */ $"6A86 7D7B 817E 8175 7A83 7375 8261 886A" /* j†}{�~�uzƒsu‚aˆj */ $"8277 6D8E 877E 908D 8897 7D97 7F91 7B86" /* ‚wmއ~��ˆ—}—.‘{† */ $"797F 8373 5E82 7E76 6194 6F80 738B 7F88" /* y.ƒs^‚~va”o€s‹.ˆ */ $"7F7D 869E 9188 888C 9879 9485 7E7C 7D6A" /* .}†ž‘ˆˆŒ˜y”…~|}j */ $"877E 686E 8184 7A77 896C 8D83 8771 A57D" /* ‡~hn�„zw‰l�ƒ‡q¥} */ $"728C 8C87 8582 8F75 9879 9079 867B 6F7F" /* rŒŒ‡…‚�u˜y�y†{o. */ $"8180 6E77 8571 8489 748A 7C7F 828E 727C" /* �€nw…q„‰tŠ|.‚Žr| */ $"7A7B 7A89 8F6A 748E 7980 808D 6683 7B81" /* z{z‰�jtŽy€€�fƒ{� */ $"778D 7366 8A94 6B8F 787D 7F8C 7472 8464" /* w�sfŠ”k�x}.Œtr„d */ $"717E 7670 7278 7A6D 9C6D 8685 8A79 8B91" /* q~vprxzmœm†…Šy‹‘ */ $"8275 8786 7976 8C74 8179 8275 7872 7B69" /* ‚u‡†yvŒt�y‚uxr{i */ $"8768 7E7F 7A7B 8D7A 9096 8886 8B95 7B84" /* ‡h~.z{�z�–ˆ†‹•{„ */ $"8880 6F82 6B7D 7771 766F 7388 687C 847D" /* ˆ€o‚k}wqvosˆh|„} */ $"6F98 7784 7D8E 7F8E 8492 7796 707F 8380" /* o˜w„}Ž.Ž„’w–p.ƒ€ */ $"697D 766E 7276 7D6A 8B7E 757C 947C 8085" /* i}vnrv}j‹~u|”|€… */ $"9375 8B82 8B74 8B79 7A88 816C 7A7D 7F6E" /* “u‹‚‹t‹yzˆ�lz}.n */ $"7F6C 727D 747F 9774 957D 928F 8684 8882" /* .lr}t.—t•}’�†„ˆ‚ */ $"877E 7789 7772 7E7C 786C 7677 7878 7E76" /* ‡~w‰wr~|xlvwxx~v */ $"8962 8A80 7483 9069 877A 8F72 8D7B 8172" /* ‰bŠ€tƒ�i‡z�r�{�r */ $"8A78 7D8C 738B 7A8F 7580 8582 7984 826C" /* Šx}Œs‹z�u€…‚y„‚l */ $"7974 826C 8574 6E87 7B7F 888C 7C92 7C86" /* yt‚l…tn‡{.ˆŒ|’|† */ $"8B86 7F82 9682 6C93 777A 778D 737A 847C" /* ‹†.‚–‚l“wzw�sz„| */ $"6C92 8567 8785 7F82 8088 8283 847C 928D" /* l’…g‡….‚€ˆ‚ƒ„|’� */ $"7096 858A 7583 7D7D 7E8A 6880 8267 7998" /* p–…Šuƒ}}~Šh€‚gy˜ */ $"6683 7C7D 7A92 836D 8D95 6D8B 8C7F 7A89" /* fƒ|}z’ƒm�•m‹Œ.z‰ */ $"8290 7C79 7983 7883 6E82 6587 737D 817B" /* ‚�|yyƒxƒn‚e‡s}�{ */ $"7871 798E 747B 837F 7F90 7186 7E82 7185" /* xqyŽt{ƒ..�q†~‚q… */ $"7B7E 7985 7591 8273 7F77 7A84 7392 747E" /* {~y…u‘‚s.wz„s’t~ */ $"7A6F 8786 6B7B 8B77 7A86 7A66 8480 697F" /* zo‡†k{‹wz†zf„€i. */ $"9369 7C8B 8F77 7A88 7985 8774 8787 7275" /* “i|‹�wzˆy…‡t‡‡ru */ $"957A 7C75 7D78 7282 6A78 956D 768C 8176" /* •z|u}xr‚jx•mvŒ�v */ $"8F7A 8B88 826D 8E85 7183 8C83 7C7A 8A79" /* �z‹ˆ‚mŽ…qƒŒƒ|zŠy */ $"7A80 6B7F 747A 6F86 7386 7E81 8292 768A" /* z€k.tzo†s†~�‚’vŠ */ $"9675 828E 7884 8675 7B83 7D6E 8A79 747E" /* –u‚Žx„†u{ƒ}nŠyt~ */ $"717A 8374 8084 8E7B 7E83 9173 9A80 8A81" /* qzƒt€„Ž{~ƒ‘sš€Š� */ $"7F7B 8187 667F 7F76 7781 687C 8471 7784" /* .{�‡f..vw�h|„qw„ */ $"7C7A 7A96 7885 8880 8A86 8285 897E 8686" /* |zz–x…ˆ€Š†‚…‰~†† */ $"728A 776F 7879 7977 866E 8D7C 748C 8289" /* rŠwoxyyw†n�|tŒ‚‰ */ $"7890 8684 8570 8B7C 7D7E 7C7E 7480 7F80" /* x�†„…p‹|}~|~t€.€ */ $"7C84 7C87 8B7F 8B91 8879 9485 6B86 7875" /* |„|‡‹.‹‘ˆy”…k†xu */ $"7478 7C6B 8B69 817A 8B6E 8984 8485 927D" /* tx|k‹i�z‹n‰„„…’} */ $"8690 8084 9D76 7E83 816D 7E73 697B 6677" /* †�€„�v~ƒ�m~si{fw */ $"8376 7086 8C7C 7893 8086 808D 8083 7E78" /* ƒvp†Œ|x“€†€�€ƒ~x */ $"7F89 7D74 8579 7C76 787B 7674 7B7A 8680" /* .‰}t…y|vx{vt{z†€ */ $"8577 9082 8780 8187 7183 7C82 6976 7779" /* …w�‚‡€�‡qƒ|‚ivwy */ $"7676 6D7D 7677 7C7E 6E84 7D85 8686 828E" /* vvm}vw|~n„}…††‚Ž */ $"8888 8576 8281 746F 816A 6E7A 7472 6888" /* ˆˆ…v‚�to�jnztrhˆ */ $"707D 857E 8189 7A86 8B7A 9089 8881 8B83" /* p}…~�‰z†‹z�‰ˆ�‹ƒ */ $"7C83 747C 7773 7D7A 6975 7E77 7485 778B" /* |ƒt|ws}ziu~wt…w‹ */ $"7C8C 758C 7F81 8A86 8283 8A83 8B7F 8C7B" /* |ŒuŒ.�І‚ƒŠƒ‹.Œ{ */ $"7E7B 7B77 7977 7482 797B 8584 7B82 7F91" /* ~{{wywt‚y{…„{‚.‘ */ $"757D 8980 7A87 7D7F 8285 898A 7686 837A" /* u}‰€z‡}.‚…‰Šv†ƒz */ $"867B 7D7C 7F7F 887A 7C7E 8679 847A 7089" /* †{}|..ˆz|~†y„zp‰ */ $"7A78 7E84 817C 8D7E 8B7F 797E 8F78 7E84" /* zx~„�|�~‹.y~�x~„ */ $"797F 7D81 8084 6E88 8475 827A 757B 827B" /* y.}�€„nˆ„u‚zu{‚{ */ $"7F7D 847F 8B8A 7C84 7D8B 7E7F 7C73 8077" /* .}„.‹Š|„}‹~.|s€w */ $"857C 757D 7785 7973 8377 807E 867F 7F90" /* …|u}w…ysƒw€~†..� */ $"8C7F 9386 8B7A 888D 6B8A 6D7D 7A7D 6D87" /* Œ.“†‹zˆ�kŠm}z}m‡ */ $"756E 7D7D 747C 7E6E 906F 8287 8381 898D" /* un}}t|~n�o‚‡ƒ�‰� */ $"8088 807F 8486 707A 8574 7A82 7578 7F7B" /* €ˆ€.„†pz…tz‚ux.{ */ $"7A87 717B 827E 7C7E 8880 8482 817C 897C" /* z‡q{‚~|~ˆ€„‚�|‰| */ $"7882 826C 8076 7A7A 7E79 7C7C 7889 717E" /* x‚‚l€vzz~y||x‰q~ */ $"8377 8284 837D 897B 8284 7C7B 8278 7D7D" /* ƒw‚„ƒ}‰{‚„|{‚x}} */ $"797A 857D 7987 7E84 7B83 7D73 896D 7C7A" /* yz…}y‡~„{ƒ}s‰m|z */ $"7B77 8576 7984 7981 8879 8081 8686 7F87" /* {w…vy„y�ˆy€�††.‡ */ $"8384 8181 7F7D 8277 7381 727B 7A80 7E79" /* ƒ„��.}‚ws�r{z€~y */ $"8883 887B 8986 7D87 7F84 7F7E 8083 7979" /* ˆƒˆ{‰†}‡.„.~€ƒyy */ $"877E 6A89 7777 826F 867C 8479 878B 7986" /* ‡~j‰ww‚o†|„y‡‹y† */ $"8582 7586 7C7F 7F77 7B82 7580 7E7C 777E" /* …‚u†|..w{‚u€~|w~ */ $"7F7A 8176 8486 7987 8683 848C 7485 8072" /* .z�v„†y‡†ƒ„Œt…€r */ $"7F85 6781 7B7C 7D7C 7E80 7E72 887C 7B7C" /* .…g�{|}|~€~rˆ|{| */ $"7B87 807B 8684 7B84 7E7A 7286 7A78 7E77" /* {‡€{†„{„~zr†zx~w */ $"7B80 7F7D 8A73 8780 7B82 7F79 837A 837D" /* {€.}Šs‡€{‚.yƒzƒ} */ $"7F81 837B 8576 7E80 7A7A 7B7C 7F78 8881" /* .�ƒ{…v~€zz{|.xˆ� */ $"7A7D 8679 8083 8179 877A 8580 8080 8583" /* z}†y€ƒ�y‡z…€€€…ƒ */ $"7987 787E 7E7A 7F74 837D 8081 8074 7D85" /* y‡x~~z.tƒ}€�€t}… */ $"7780 7B79 8773 8A7E 8180 8A80 8282 8087" /* w€{y‡sŠ~�€Š€‚‚€‡ */ $"7B80 807C 8479 7A83 7476 7C83 6C81 7C77" /* {€€|„yzƒtv|ƒl�|w */ $"8180 7F82 7F7F 897F 8087 7780 7B71 8379" /* �€.‚..‰.€‡w€{qƒy */ $"7B7F 8175 8077 8080 737F 877A 7E84 8770" /* {.�u€w€€s.‡z~„‡p */ $"8B7D 7E85 7780 8272 7286 7575 8576 7D7C" /* ‹}~…w€‚rr†uu…v}| */ $"7C7C 8079 7F81 7C89 837B 8C7A 7F87 7B72" /* ||€y.�|‰ƒ{Œz.‡{r */ $"8C75 797F 787C 837D 8280 7F87 877F 7A87" /* Œuy.x|ƒ}‚€.‡‡.z‡ */ $"7980 837F 7A83 7C80 7A7E 787B 8082 7985" /* y€ƒ.zƒ|€z~x{€‚y… */ $"8580 8480 8081 8381 8079 797B 8078 7A84" /* …€„€€�ƒ�€yy{€xz„ */ $"7781 8281 7985 7B88 7E86 8282 8384 7D88" /* w�‚�y…{ˆ~†‚‚ƒ„}ˆ */ $"7A7C 8580 7580 7D7B 827A 7E80 797A 8A76" /* z|…€u€}{‚z~€yzŠv */ $"7585 7B7B 7F7D 827D 7F82 7C80 8176 827D" /* u…{{.}‚}.‚|€�v‚} */ $"7A7D 7E7B 7A81 7B83 7B84 8082 7A7D 8779" /* z}~{z�{ƒ{„€‚z}‡y */ $"8282 807B 887C 7A7D 7C79 7B80 7E7B 8478" /* ‚‚€{ˆ|z}|y{€~{„x */ $"817C 8081 7F80 807A 7B7E 7F7C 7A85 797E" /* �|€�.€€z{~.|z…y~ */ $"837B 847A 817E 827E 8080 7E80 7E84 797E" /* ƒ{„z�~‚~€€~€~„y~ */ $"807B 797C 7F80 787F 827F 7C86 797E 7884" /* €{y|.€x.‚.|†y~x„ */ $"7D7E 8281 7E80 7F7C 8778 7888 747C 7F78" /* }~‚�~€.|‡xxˆt|.x */ $"7C7A 7A83 7F76 867C 7880 817B 8380 8084" /* |zzƒ.v†|x€�{ƒ€€„ */ $"7C81 8078 7F7D 7880 7D76 837A 7D84 7D7F" /* |�€x.}x€}vƒz}„}. */ $"8875 817F 7980 806F 877B 7783 7F79 8678" /* ˆu�.y€€o‡{wƒ.y†x */ $"7D85 7B83 817D 857E 8080 7E7A 8679 7D7E" /* }…{ƒ�}…~€€~z†y}~ */ $"7D80 7882 857E 8287 7C7C 887A 817D 8180" /* }€x‚…~‚‡||ˆz�}�€ */ $"7C80 807C 807F 7E80 7A85 7D7E 817E 7F83" /* |€€|€.~€z…}~�~.ƒ */ $"7C83 7F80 7F81 7F7D 8180 7A80 817F 7C80" /* |ƒ.€.�.}�€z€�.|€ */ $"7E7F 7A7F 7C7D 807E 7E7D 8283 7E80 8082" /* ~.z.|}€~~}‚ƒ~€€‚ */ $"8081 797F 7E7F 7D82 7A7D 827E 7C7C 8280" /* €�y.~.}‚z}‚~||‚€ */ $"7780 8079 817C 827B 7F82 7D7A 8280 7C80" /* w€€y�|‚{.‚}z‚€|€ */ $"827A 857B 7C81 7F7B 847B 827D 807F 807C" /* ‚z…{|�.{„{‚}€.€| */ $"847D 7E81 7F7D 7D7C 7D7B 7F7C 7D7E 7D7B" /* „}~�.}}|}{.|}~}{ */ $"7F80 7C80 857A 8283 7D7B 817E 7F7D 827F" /* .€|€…z‚ƒ}{�~.}‚. */ $"7D80 827C 7F84 7E82 7D80 7D7E 7E7A 827C" /* }€‚|.„~‚}€}~~z‚| */ $"7C81 7D7B 807F 807E 8283 7B84 807E 8080" /* |�}{€.€~‚ƒ{„€~€€ */ $"8280 7E80 7C7B 7D7C 7E7E 7C84 807B 7E85" /* ‚€~€|{}|~~|„€{~… */ $"7D80 837E 7D7F 7D7A 7980 7D79 7D7E 7D7D" /* }€ƒ~}.}zy€}y}~}} */ $"7E80 7F81 7F81 7D82 7D7E 7E7A 807F 7A7C" /* ~€.�.�}‚}~~z€.z| */ $"807A 7C7E 7E80 8181 817F 8282 8080 8180" /* €z|~~€���.‚‚€€�€ */ $"7E80 7C7C 8079 7B7E 797C 7F7C 7F7B 8180" /* ~€||€y{~y|.|.{�€ */ $"8183 827F 877A 8182 7883 807C 7F77 807C" /* �ƒ‚.‡z�‚xƒ€|.w€| */ $"7980 8278 8580 7B80 8380 837E 817D 7D81" /* y€‚x…€{€ƒ€ƒ~�}}� */ $"7C7D 7F7E 817F 7C81 7E7D 7E7E 807E 7E81" /* |}.~�.|�~}~~€~~� */ $"7E7C 857F 7C84 807B 837E 817D 8082 7E81" /* ~|….|„€{ƒ~�}€‚~� */ $"7C7E 7D80 7B7F 7980 7D7F 7E7E 8081 807C" /* |~}€{.y€}.~~€�€| */ $"847C 7F81 7A7C 7D7C 827B 807F 7B83 7B80" /* „|.�z|}|‚{€.{ƒ{€ */ $"7E80 8180 7E7E 7E81 807E 807F 807D 7D7D" /* ~€�€~~~�€~€.€}}} */ $"847E 817F 7E7E 817D 7E7C 7F81 7B7E 7E7E" /* „~�.~~�}~|.�{~~~ */ $"8081 7B83 7E84 7D80 8082 7F81 8081 7E81" /* €�{ƒ~„}€€‚.�€�~� */ $"7E7C 7D7E 807B 827C 7E81 807E 7F81 847B" /* ~|}~€{‚|~�€~.�„{ */ $"8280 7E81 7F7D 7F7F 7C7F 777D 7D7D 807E" /* ‚€~�.}..|.w}}}€~ */ $"7E82 7E82 7E7F 827F 7E7D 7E7D 7B80 7D7E" /* ~‚~‚~.‚.~}~}{€}~ */ $"807B 7F7D 807E 827F 817E 817E 807F 7D80" /* €{.}€~‚.�~�~€.}€ */ $"7D7D 7D7C 7E7E 7C80 7D80 817D 7E81 7B82" /* }}}|~~|€}€�}~�{‚ */ $"7E7D 827F 7D81 7C81 7D7E 847B 8080 7C7E" /* ~}‚.}�|�}~„{€€|~ */ $"807D 817D 807E 7D81 7D7D 837D 8181 7C82" /* €}�}€~}�}}ƒ}��|‚ */ $"7E7D 817E 817E 7B82 7A81 7F7E 7F81 807E" /* ~}�~�~{‚z�.~.�€~ */ $"807E 817E 8082 817D 847E 7F7E 8180 7C80" /* €~�~€‚�}„~.~�€|€ */ $"7E7C 7E7F 7D7E 8181 7C80 8180 7D83 7F81" /* ~|~.}~��|€�€}ƒ.� */ $"7E81 7E7F 7E7E 7F7D 807F 7D80 807E 7E7E" /* ~�~.~~.}€.}€€~~~ */ $"827D 7E81 7C7C 817E 7E81 807F 7E80 7F80" /* ‚}~�||�~~�€.~€.€ */ $"8080 8081 7E81 7C80 7E7F 7D7E 7F7C 7F80" /* €€€�~�|€~.}~.|.€ */ $"7C80 7F7F 7F80 807D 817F 7E80 7F7E 7F7F" /* |€...€€}�.~€.~.. */ $"7F7E 807E 7E80 7F7F 817F 8080 7E7E 7E7E" /* .~€~~€..�.€€~~~~ */ $"7E7D 7E7D 7C7E 7E80 807E 827F 8083 7E81" /* ~}~}|~~€€~‚.€ƒ~� */ $"8080 807E 817C 7D7E 7B7D 7F7E 7F7F 7F80" /* €€€~�|}~{}.~...€ */ $"7F80 8081 807E 817D 7F7E 7D7F 7D7D 7D7E" /* .€€�€~�}.~}.}}}~ */ $"807C 8081 8080 8081 7E80 7D7F 7F7E 7D7C" /* €|€�€€€�~€}..~}| */ $"7E7E 7D7D 7E80 7C80 7E81 7F82 827E 8380" /* ~~}}~€|€~�.‚‚~ƒ€ */ $"7D80 7D7E 7F7E 7D7F 7E81 7E80 807F 807F" /* }€}~.~}.~�~€€.€. */ $"817F 7E81 7E7E 8080 7E7D 817E 7D82 807E" /* �.~�~~€€~}�~}‚€~ */ $"8182 7F7F 8180 7E80 807B 807E 7D7E 7F80" /* �‚..�€~€€{€~}~.€ */ $"7E7F 7F81 7F81 827F 8281 807E 7F81 7C7F" /* ~..�.�‚.‚�€~.�|. */ $"7F7C 7E7F 7F7E 8180 8080 8081 7F81 807E" /* .|~..~�€€€€�.�€~ */ $"807F 807C 7D7F 7C7E 7E7D 807F 817E 8082" /* €.€|}.|~~}€.�~€‚ */ $"7E80 807F 807E 7F7E 7F7F 7D7F 7D7F 7F7D" /* ~€€.€~.~..}.}..} */ $"817E 7F80 7F7F 8180 7F80 7F7D 807E 7D7F" /* �~.€..�€.€.}€~}. */ $"7F7E 7E7F 7E80 807E 8081 7F80 7F7E 807E" /* .~~.~€€~€�.€.~€~ */ $"7F7D 7F7F 7E7F 7E80 807D 817E 8080 7E80" /* .}..~.~€€}�~€€~€ */ $"7F80 7E7E 817C 807F 7E7F 807F 8080 807E" /* .€~~�|€.~.€.€€€~ */ $"817F 7D80 7E7F 7E7D 807E 7E80 7F7F 817F" /* �.}€~.~}€~~€..�. */ $"7F80 817D 8080 7E7F 807D 7F7F 7D7E 7E7E" /* .€�}€€~.€}..}~~~ */ $"7E7F 807F 7F80 807F 7F80 7F80 7F7F 7F80" /* ~.€..€€..€.€...€ */ $"7F7F 7F7F 7F7F 807E 7F81 7D80 807F 807F" /* ......€~.�}€€.€. */ $"7F7F 807F 7E80 7F7F 807E 7F7F 8080 7F80" /* ..€.~€..€~..€€.€ */ $"8080 7F7F 807E 807F 7E7F 807F 7F80 7E80" /* €€..€~€.~.€..€~€ */ $"7F7F 7F80 807F 7F7F 807F 7F80 7F7E 7F7F" /* ...€€...€..€.~.. */ $"7E80 807E 7F80 7F80 807F 7F80 807F 807E" /* ~€€~.€.€€..€€.€~ */ $"807F 7E7F 7E80 7D7F 7F7E" /* €.~.~€}..~ */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Trumpets.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Trumpets.r new file mode 100644 index 0000000..ecf9b46 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Trumpets.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 4300 0000 0854 7275 6D70" /* ......C....Trump */ $"6574 73" /* ets */ }; data $8024 (0x43) { $"0000 3600 E88E 0000 772B 8080 8080 8080" /* ..6..Ž..w+€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 7F7E 7E7D 7D7D 7D7D 7D7E 7E7F 8081" /* €€.~~}}}}}}~~.€� */ $"8283 8384 8382 8180 7D79 797A 7A7A 7B7C" /* ‚ƒƒ„ƒ‚�€}yyzzz{| */ $"7C7C 8083 8381 8183 8483 817F 7D78 7477" /* ||€ƒƒ��ƒ„ƒ�.}xtw */ $"7778 797A 7A7A 7D86 8A89 8887 8685 8481" /* wxyzzz}†Š‰ˆ‡†…„� */ $"7B76 7075 7678 7A78 7477 7A80 8C8E 8C8D" /* {vpuvxzxtwz€ŒŽŒ� */ $"8B89 8987 7D77 7272 7071 7378 7975 797E" /* ‹‰‰‡}wrrpqsxyuy~ */ $"8991 8E89 837F 858B 8579 7980 7A71 7074" /* ‰‘މƒ.…‹…yy€zqpt */ $"7E7B 757D 8394 9A90 7E6F 727C 807D 8886" /* ~{u}ƒ”š�~or|€}ˆ† */ $"877F 746D 737F 7873 7C8C A4A7 916F 5B61" /* ‡.tms.xs|Œ¤§‘o[a */ $"6E80 7D89 8380 7E74 6C73 8176 7386 A9C9" /* n€}‰ƒ€~tls�vs†©É */ $"A767 585B 5E6B 837A 8682 7F83 756D 7B88" /* §gX[^kƒz†‚.ƒum{ˆ */ $"7880 A4AC B798 6E65 6564 7C85 7689 777F" /* x€¤¬·˜need|…v‰w. */ $"776B 6B82 8868 6892 ABB4 8C64 676F 8997" /* wkk‚ˆhh’«´Œdgo‰— */ $"7B8B 8687 8677 6D71 876E 5174 8C94 9875" /* {‹†‡†wmq‡nQtŒ”˜u */ $"5B65 7990 777E 8A85 948C 8A80 8C8B 6573" /* [ey�w~Š…”ŒŠ€Œ‹es */ $"8C9B 9F82 585E 7280 7682 827B 857C 8786" /* Œ›Ÿ‚X^r€v‚‚{…|‡† */ $"7F7A 4F56 7B95 A383 5E68 8699 94AC 988F" /* .zOV{•£ƒ^h†™”¬˜� */ $"8A81 8499 998A 4F46 6B94 9A6A 3B4E 7B7D" /* Š�„™™ŠOFk”šj;N{} */ $"89A4 8A83 8486 8E95 A7A8 724F 6F9D AD7B" /* ‰¤Šƒ„†Ž•§¨rOo�­{ */ $"3E46 8178 88AB 9385 7C71 727D 8692 7350" /* >F�xˆ«“…|qr}†’sP */ $"6392 AE93 5451 7789 8AA8 A692 8374 7181" /* c’®“TQw‰Š¨¦’ƒtq� */ $"8A93 7E59 6B85 9BAA 6A40 516E 7B9B A48F" /* Š“~Yk…›ªj@Qn{›¤� */ $"887E 7B85 9BA0 9260 6C72 7E93 7E50 6173" /* ˆ~{…› ’`lr~“~Pas */ $"7298 A694 8F86 706A 8286 8250 5A67 708D" /* r˜¦”�†pj‚†‚PZgp� */ $"9469 7395 8E9E AB9F 9389 6253 7988 8C61" /* ”is•Žž«Ÿ“‰bSyˆŒa */ $"576B 788D 9067 4968 7385 9198 959A 7562" /* Wkx��gIhs…‘˜•šub */ $"7EA1 A783 686A 7995 8960 3055 899E 9593" /* ~¡§ƒhjy•‰`0U‰ž•“ */ $"9DA7 8671 6786 926D 5B5C 6C9C 8B63 3D4D" /* �§†qg†’m[\lœ‹c=M */ $"9BBF B197 9C9C 8072 5C7E A681 5A6A 6FA1" /* ›¿±—œœ€r\~¦�Zjo¡ */ $"A66C 5049 76A6 A47C 7B84 7874 6169 A59E" /* ¦lPIv¦¤|{„xtai¥ž */ $"5F6F 6F90 A469 4A5D 689C BE98 8089 9595" /* _oo�¤iJ]hœ¾˜€‰•• */ $"8C6E 919C 4D49 5979 9977 435E 6D89 C9B4" /* Œn‘œMIYy™wC^m‰É´ */ $"8475 7E7C 8361 769A 6357 6C8B B7B3 794B" /* „u~|ƒavšcWl‹·³yK */ $"787B B1AC 7864 7573 8370 71A3 8561 6471" /* x{±¬xdusƒpq£…adq */ $"9AA6 8137 3D76 B2C9 9D78 8B94 988C 7293" /* š¦�7=v²É�x‹”˜Œr“ */ $"814D 5871 96A4 8446 3560 C1E1 A05F 5777" /* �MXq–¤„F5`Á. _Ww */ $"7E86 6E7C 8458 5376 BACF B66A 443D 80DE" /* ~†n|„XSvºÏ¶jD=€. */ $"B46D 4763 697A 7484 8E66 4748 91B6 B16E" /* ´mGcizt„ŽfGH‘¶±n */ $"3E3A 5ECB CA87 6790 A5A9 877A 7660 594C" /* >:^Ëʇg�¥©‡zv`YL */ $"83AE A477 5459 709B BF7F 3758 929D 786B" /* ƒ®¤wTYp›¿.7X’�xk */ $"7E6C 7060 9BDC D4A2 6F5B 6292 A4A3 4A34" /* ~lp`›.Ô¢o[b’¤£J4 */ $"7D9A 8A70 7D6C 6950 64A5 BE9B 6450 51A1" /* }šŠp}liPd¥¾›dPQ¡ */ $"B18A 7862 9BB0 9571 706B 7D73 698E A594" /* ±Šxb›°•qpk}siŽ¥” */ $"745F 4D89 D286 3B42 82AB 9462 6056 7579" /* t_M‰Ò†;B‚«”b`Vuy */ $"77B6 C5A4 7F66 5179 D2B9 4324 6991 9068" /* w¶Å¤.fQyÒ¹C$i‘�h */ $"594A 7295 6F82 ADA0 7E5C 4D6F C8CC 7043" /* YJr•o‚­ ~\MoÈÌpC */ $"88BB B986 604E 6C92 7F7D 9D91 7055 4957" /* ˆ»¹†`Nl’.}�‘pUIW */ $"B8D7 8219 4D99 A27A 5F4C 6490 93B2 C6BC" /* ¸×‚.M™¢z_Ld�“²Æ¼ */ $"926F 5960 B2D1 9733 3185 A48A 6544 4D83" /* ’oY`²Ñ—31…¤ŠeDMƒ */ $"7572 8686 766C 5A58 9CD8 B76E 4F9F CCA2" /* ur††vlZXœØ·nOŸÌ¢ */ $"5E4E 5789 8B89 9398 6F62 565E 99D5 B05A" /* ^NW‰‹‰“˜obV^™Õ°Z */ $"0D54 AEA5 7E71 4B69 8098 A1A8 9D83 5743" /* ÂT®¥~qKi€˜¡¨�ƒWC */ $"7DD8 E08E 2647 AA92 6364 5172 787B 7B7F" /* }Ø.Ž&Gª’cdQrx{{. */ $"7A7B 6B6C 94D2 DA99 4E49 C3C5 8371 4361" /* z{kl”Ò.™NIÃŃqCa */ $"8C9B 7C72 716B 504D 76CA CF8E 402D 92AB" /* Œ›|rqkPMvÊÏŽ@-’« */ $"838D 6462 7D92 8B95 9296 7B56 61C1 EFBB" /* ƒ�db}’‹•’–{VaÁ.» */ $"5017 6CAE 736C 5F5B 6368 6B78 665A 6C6B" /* P.l®sl_[chkxfZlk */ $"7ECD E7A2 6148 78E7 B683 5841 669A 8C72" /* ~Í.¢aHx.¶ƒXAfšŒr */ $"675F 6E61 56B6 F9C1 5228 34A5 AA7A 7D7B" /* g_naV¶.ÁR(4¥ªz}{ */ $"7769 7181 8378 9091 5C93 DABA 6741 3893" /* wiq�ƒx�‘\“.ºgA8“ */ $"CC74 5C5C 748C 9569 473C 5E83 78B8 FCCF" /* Ìt\\tŒ•iG<^ƒx¸.Ï */ $"6C4B 4693 F1A6 6B54 5C63 726A 5F4F 5C7B" /* lKF“.¦kT\crj_O\{ */ $"719A F5E0 824F 293F B59D 7575 817C 837B" /* qš..‚O)?µ�uu�|ƒ{ */ $"6A67 7595 888B D6CB 6F41 3C4F BDAA 655F" /* jgu•ˆ‹ÖËoAX€ƒr_N_в§ºÑ */ $"9539 3658 5BA3 C66E 6F8A 7D7D 8163 4351" /* •96X[£ÆnoŠ}}�cCQ */ $"7983 ADDB B365 5775 84B6 DC7A 5570 6851" /* yƒ­.³eWu„¶.zUphQ */ $"4940 3E68 A1A8 C6F2 BB71 7494 7B75 A56E" /* I@>h¡¨Æ.»qt”{u¥n */ $"5176 6857 5E58 6280 ABA0 A2D3 AD4E 2E4F" /* QvhW^Xb€« ¢Ó­N.O */ $"606B BEA8 7188 7A6C 7974 5D59 717C 99E4" /* `k¾¨qˆzlyt]Yq|™. */ $"C860 4976 9083 BDB2 5658 6555 4F47 4463" /* È`Iv�ƒ½²VXeUOGDc */ $"8A9A A5E8 D871 5E8D 9166 869C 626F 8761" /* Šš¥.Øq^�‘f†œbo‡a */ $"545B 6680 9C9D 8AB1 BA5B 3569 7860 82B4" /* T[f€œ�бº[5ix`‚´ */ $"8473 8E72 7073 746F 6F78 7DBE E482 416E" /* „sŽrpstoox}¾.‚An */ $"8A7F 99BB 7E4F 7160 5A62 6769 768D 8BBA" /* Š.™»~Oq`Zbgiv�‹º */ $"DD89 5582 9778 7499 8261 8B80 6860 6F78" /* .‰U‚—xt™‚a‹€h`ox */ $"828F 7B93 BD77 3259 7A6A 77AB 956A 7C78" /* ‚�{“½w2Yzjw«•j|x */ $"7485 8C76 6773 759D D6A8 5964 867C 83AD" /* t…Œvgsu�Ö¨Yd†|ƒ­ */ $"935B 626F 6268 7369 6A83 8397 BA93 516E" /* “[bobhsijƒƒ—º“Qn */ $"9F85 6C90 9379 829B 877D 7C6F 6F81 7982" /* Ÿ…l�“y‚›‡}|oo�y‚ */ $"A792 4F4F 786D 6899 A180 6B7A 6A7D 9888" /* §’OOxmh™¡€kzj}˜ˆ */ $"6666 7088 B9B7 7E6C 8676 6C98 A17E 647D" /* ffpˆ¹·~l†vl˜¡~d} */ $"6B68 7C78 636E 818D AB99 6260 8D8D 6979" /* kh|xcn��«™b`��iy */ $"8D83 7E9C 9082 8974 5D6F 7E80 9C99 6B56" /* �ƒ~œ�‚‰t]o~€œ™kV */ $"6E74 617C 9A8B 797A 7070 8F91 6B5F 6E85" /* nta|š‹yzpp�‘k_n… */ $"ADB5 9078 8780 6880 9C80 767B 786A 7A7D" /* ­µ�x‡€h€œ€v{xjz} */ $"6365 7483 9F99 7261 7D8A 7C71 8A84 9199" /* cetƒŸ™ra}Š|qŠ„‘™ */ $"9686 9089 6466 797F 9397 7E68 7171 6968" /* –†�‰dfy.“—~hqqih */ $"897F 857F 7268 8090 7866 697B A2AE 957F" /* ‰.….rh€�xfi{¢®•. */ $"8480 7372 9588 8283 7E73 7C80 6862 6E7B" /* „€sr•ˆ‚ƒ~s|€hbn{ */ $"9194 7A68 707C 7D74 827D 8B9B 9285 8D91" /* ‘”zhp|}t‚}‹›’…�‘ */ $"7160 7182 8E8F 7F76 7576 6E6C 837F 7E8B" /* q`q‚Ž�.vuvnlƒ.~‹ */ $"7D6B 7887 7B6C 6B77 95A1 9386 8285 7972" /* }kx‡{lkw•¡“†‚…yr */ $"898A 818B 8376 8084 7364 6D78 8688 7971" /* ‰Š�‹ƒv€„sdmx†ˆyq */ $"6F7B 7A77 8282 889E 9A85 8A91 8069 6E7E" /* o{zw‚‚ˆžš…Š‘€in~ */ $"8E8B 7C79 7879 7169 7C7F 7782 8370 7482" /* Ž‹|yxyqi|.w‚ƒpt‚ */ $"7E70 7076 8E9B 928A 8585 7F70 828B 868D" /* ~ppvŽ›’Š…….p‚‹†� */ $"8B7A 7A83 7867 6B74 8183 7874 7377 7C72" /* ‹zzƒxgkt�ƒxtsw|r */ $"8080 8097 9F8D 838E 8571 6E78 898D 827B" /* €€€—Ÿ�ƒŽ…qnx‰�‚{ */ $"7A7B 7A6A 7880 7781 857B 717F 7F75 7476" /* z{zjx€w�…{q..utv */ $"8391 918C 8884 8374 7984 818B 8D84 7682" /* ƒ‘‘Œˆ„ƒty„�‹�„v‚ */ $"7F71 6F72 7B7F 7B77 7878 7C75 7B84 7E8B" /* .qor{.{wxx|u{„~‹ */ $"9591 8588 867A 7576 8088 857E 7D7B 7C72" /* •‘…ˆ†zuv€ˆ…~}{|r */ $"747D 767C 7F7B 797B 7E78 797A 7E86 8B88" /* t}v|.{y{~xyz~†‹ˆ */ $"8785 857E 7C80 8089 8B82 817E 7E74 7274" /* ‡……~|€€‰‹‚�~~trt */ $"7879 7876 7A7A 7C7A 7C7F 7E87 8E89 8E89" /* xyxvzz|z|.~‡Ž‰Ž‰ */ $"867F 7C7A 7E83 8380 7F7C 7D77 7576 777D" /* †.|z~ƒƒ€.|}wuvw} */ $"7B75 7F80 7D7A 7B7D 7F84 8787 8A86 8481" /* {u.€}z{}.„‡‡Š†„� */ $"807D 7A86 877E 8384 7D78 7575 7878 7676" /* €}z†‡~ƒ„}xuuxxvv */ $"7B7C 7D7D 7D7E 7A86 8A85 8A8F 8480 7E7C" /* {|}}}~z†Š…Š�„€~| */ $"7D81 8382 817D 7B7B 7878 7379 7A76 7A85" /* }�ƒ‚�}{{xxsyzvz… */ $"7E7B 7B7B 7D82 8688 8987 8182 8280 7A80" /* ~{{{}‚†ˆ‰‡�‚‚€z€ */ $"8582 8187 7F78 7676 7779 787A 7D7C 7A7E" /* …‚�‡.xvvwyxz}|z~ */ $"7D7E 7C7F 8686 878F 897F 807F 7B7D 8183" /* }~|.††‡�‰.€.{}�ƒ */ $"837F 797A 797A 7978 7878 7A83 847B 7B7C" /* ƒ.yzyzyxxxzƒ„{{| */ $"7C7F 8386 8886 8080 8281 7F7D 7D81 8083" /* |.ƒ†ˆ†€€‚�.}}�€ƒ */ $"857B 7879 7878 787A 7D7E 7B7D 7F7E 7F80" /* …{xyxxxz}~{}.~.€ */ $"7F82 8486 8B82 8081 7E7C 7E81 8381 7C7A" /* .‚„†‹‚€�~|~�ƒ�|z */ $"7C7B 7A7B 7677 7A7D 8380 7D7C 7C7C 8083" /* |{z{vwz}ƒ€}|||€ƒ */ $"8587 8480 8383 8280 7D7E 8180 8280 7A7A" /* …‡„€ƒƒ‚€}~�€‚€zz */ $"7A78 7778 7C7F 7F7C 7E7E 7E80 7F7E 8385" /* zxwx|..|~~~€.~ƒ… */ $"8786 8181 807C 7D7F 8283 807A 7B7B 7C7C" /* ‡†��€|}.‚ƒ€z{{|| */ $"7875 797D 8083 7E7C 7C7C 7E81 8587 8680" /* xuy}€ƒ~|||~�…‡†€ */ $"8181 8180 7D7B 7E81 7F81 7C7A 7B79 7879" /* ���€}{~�.�|z{yxy */ $"7C80 827D 7D7E 7F81 807F 8083 8387 8380" /* |€‚}}~.�€.€ƒƒ‡ƒ€ */ $"807D 7C7E 8082 807A 797A 7D7D 7A77 787E" /* €}|~€‚€zyz}}zwx~ */ $"8083 817C 7E7E 7F81 8486 8581 8080 8281" /* €ƒ�|~~.�„†…�€€‚� */ $"7F7D 7C7F 8080 7F7A 7B7B 7A7A 7D80 817E" /* .}|.€€.z{{zz}€�~ */ $"7B7B 7F80 807F 7E81 8385 857F 7F7E 7D7D" /* {{.€€.~�ƒ……..~}} */ $"7F82 827E 7A7A 7F7F 7D7A 797B 7F81 827D" /* .‚‚~zz..}zy{.�‚} */ $"7C7D 7E7F 8184 8482 7E7E 8181 7F7D 7B7B" /* |}~.�„„‚~~��.}{{ */ $"7F80 817F 7D7B 7A7B 7C80 817F 7C7C 7F81" /* .€�.}{z{|€�.||.� */ $"8180 7E7E 8183 8583 807E 7C7D 7E80 817F" /* �€~~�ƒ…ƒ€~|}~€�. */ $"7B7A 7D7F 7E7C 7A7A 7D80 8180 7F7F 7E7E" /* {z}.~|zz}€�€..~~ */ $"8083 8583 807D 7F82 817F 7C7A 7C7F 807F" /* €ƒ…ƒ€}.‚�.|z|.€. */ $"7E7D 7A7A 7B7F 8181 7D7A 7C80 8182 807D" /* ~}zz{.��}z|€�‚€} */ $"7E83 8483 8080 7E7C 7C7E 8182 7F7A 7C7F" /* ~ƒ„ƒ€€~||~�‚.z|. */ $"7E7F 7D7A 7A7E 8181 7E7E 7D7E 7E80 8384" /* ~.}zz~��~~}~~€ƒ„ */ $"827C 7C80 8081 7F7B 7A7E 8181 7F7D 7B7B" /* ‚||€€�.{z~��.}{{ */ $"7B7E 8182 817C 7A7F 8183 827E 7C7F 8283" /* {~�‚�|z.�ƒ‚~|.‚ƒ */ $"8180 7D7C 7C7D 7F81 807B 7A7D 7E7F 7E7C" /* �€}||}.�€{z}~.~| */ $"7B7E 8081 807F 7F7E 7F81 8282 827F 7D7F" /* {~€�€..~.�‚‚‚.}. */ $"8080 7F7C 797C 8080 7F7E 7C7B 7C7E 8182" /* €€.|y|€€.~|{|~�‚ */ $"817E 7B7E 8082 827F 7B7D 8183 8180 7F7C" /* �~{~€‚‚.{}�ƒ�€.| */ $"7B7D 7F81 817E 7C7D 7E7F 807E 7B7B 7E80" /* {}.��~|}~.€~{{~€ */ $"807F 807F 7E80 8182 8380 7E80 7F7F 817E" /* €.€.~€�‚ƒ€~€..�~ */ $"7B7B 7E81 807E 7C7B 7B7D 7F80 807E 7C7E" /* {{~�€~|{{}.€€~|~ */ $"8081 8381 7D7C 7F82 8381 7F7D 7B7C 7E7F" /* €�ƒ�}|.‚ƒ�.}{|~. */ $"8180 7C7D 7D7D 807F 7C7C 7D7F 8080 807F" /* �€|}}}€.||}.€€€. */ $"7E7F 8181 8282 7E7F 7F7F 8180 7B79 7C80" /* ~.��‚‚~...�€{y|€ */ $"817F 7D7B 7B7C 7F81 807E 7B7C 7E81 8484" /* �.}{{|.�€~{|~�„„ */ $"7F7B 7E81 8382 807E 7B7B 7D7F 807F 7D7C" /* .{~�ƒ‚€~{{}.€.}| */ $"7C7D 8182 7E7A 7B7F 817F 7F7F 7E7E 8182" /* |}�‚~z{.�...~~�‚ */ $"8281 7F7F 7F7F 8181 7E7A 7B7F 8280 7D7C" /* ‚�....��~z{.‚€}| */ $"7B7B 7E81 817F 7C7C 7D7F 8284 817D 7B7F" /* {{~��.||}.‚„�}{. */ $"8383 817F 7C7B 7D7F 8080 7E7C 7C7C 7E81" /* ƒƒ�.|{}.€€~|||~� */ $"807D 7C7E 8080 7F80 7E7E 7F81 8181 807F" /* €}|~€€.€~~.���€. */ $"7F7F 8082 807C 7A7C 8081 7E7D 7B7A 7C80" /* ..€‚€|z|€�~}{z|€ */ $"8182 807D 7D7D 8085 847F 7C7D 8082 8180" /* �‚€}}}€…„.|}€‚�€ */ $"7E7A 7A7C 7F80 807E 7C7A 7D82 8380 7E80" /* ~zz|.€€~|z}‚ƒ€~€ */ $"8282 8282 8281 8182 8281 7F7E 7D7B 7A7E" /* ‚‚‚‚‚��‚‚�.~}{z~ */ $"7E7A 787A 7D7E 7D7C 7D7C 7D7F 8283 8282" /* ~zxz}~}|}|}.‚ƒ‚‚ */ $"817F 8084 8582 7D7A 7C7D 7C7C 7A77 7778" /* �.€„…‚}z|}||zwwx */ $"7A7C 7D7D 7C7A 7B80 8484 8383 8586 8585" /* z|}}|z{€„„ƒƒ…†…… */ $"8583 8281 817F 7D7B 7A78 777A 7B79 7776" /* …ƒ‚��.}{zxwz{ywv */ $"787A 7A7A 7B7C 7E83 8789 8A89 8987 8688" /* xzzz{|~ƒ‡‰Š‰‰‡†ˆ */ $"8987 827E 7C7C 7B79 7876 7373 7578 797A" /* ‰‡‚~||{yxvssuxyz */ $"7A78 777C 8185 8687 8889 8785 8584 8382" /* zxw|�…†‡ˆ‰‡……„ƒ‚ */ $"8382 8080 807E 7C7C 7C7B 7877 7A7C 7C7A" /* ƒ‚€€€~|||{xwz||z */ $"7877 777C 8287 8988 8682 7E81 8383 817F" /* xww|‚‡‰ˆ†‚~�ƒƒ�. */ $"8183 8483 817E 7673 7273 7576 7675 737A" /* �ƒ„ƒ�~vsrsuvvusz */ $"8389 8C8F 9294 928C 827A 706F 7174 7778" /* ƒ‰Œ�’”’Œ‚zpoqtwx */ $"7777 787C 8589 8580 7E7F 807F 7A74 7073" /* wwx|…‰…€~.€.ztps */ $"7981 898F 8F89 817F 8389 8782 7D7B 7E85" /* y�‰��‰�.ƒ‰‡‚}{~… */ $"857E 7877 776F 6B6B 7275 6F71 7987 9394" /* …~xwwokkruoqy‡“” */ $"8E88 868C 8D89 8886 8280 7772 737B 7C76" /* Žˆ†Œ�‰ˆ†‚€wrs{|v */ $"7A82 9096 8C76 625E 6776 7B7B 7D7B 7E7E" /* z‚�–Œvb^gv{{}{~~ */ $"7C7F 8885 7F83 95AC A982 6967 6A71 8081" /* |.ˆ….ƒ•¬©‚igjq€� */ $"7F81 7A7D 776E 717B 7975 838F 9793 796D" /* .�z}wnq{yuƒ�—“ym */ $"7074 818D 878A 8885 857A 737B 8477 6575" /* pt��‡Šˆ……zs{„weu */ $"8D9D 9579 7179 8895 8883 8581 847E 7573" /* ��•yqyˆ•ˆƒ…�„~us */ $"7D77 5C61 7786 928B 7778 8393 8D83 8883" /* }w\aw†’‹wxƒ“�ƒˆƒ */ $"8887 827D 8083 6A60 6E7F 8F8D 756B 7580" /* ˆ‡‚}€ƒj`n.��uku€ */ $"8085 8B88 8C87 8687 8484 7264 7185 948E" /* €…‹ˆŒ‡†‡„„rdq…”Ž */ $"7169 7781 8188 8B87 928F 8685 8176 6050" /* qiw��ˆ‹‡’�†…�v`P */ $"6688 9E94 776C 7F8A 8798 9A90 918E 847D" /* fˆž”wl.Ї˜š�‘Ž„} */ $"7F7C 6A4E 4E74 9D9B 796A 6B66 637A 8787" /* .|jNNt�›yjkfcz‡‡ */ $"888A 938B 868E 826D 7287 A0A0 7B67 7376" /* ˆŠ“‹†Ž‚mr‡  {gsv */ $"6E78 7F81 8F90 989D 8670 604E 5A70 818E" /* nx.���˜�†p`NZp�Ž */ $"8876 7882 8491 9B91 948B 8494 9988 785D" /* ˆvx‚„‘›‘”‹„”™ˆx] */ $"576D 8189 897D 7672 6569 7B77 7D84 818E" /* Wm�‰‰}vrei{w}„�Ž */ $"9E9A 927C 6E79 8486 867E 747E 7A6D 7578" /* žš’|ny„††~t~zmux */ $"7B87 8380 8986 7764 5D6E 7D7D 7F83 707B" /* {‡ƒ€‰†wd]n}}.ƒp{ */ $"8B8A 8887 838A 8C8A 9096 866B 5D68 797B" /* ‹Šˆ‡ƒŠŒŠ�–†k]hy{ */ $"7674 5758 6F74 7377 7A81 8991 969B 9B87" /* vtWXotswz�‰‘–››‡ */ $"7B88 8E93 8A7D 686A 8C93 7F6A 6C7D 8687" /* {ˆŽ“Š}hjŒ“.jl}†‡ */ $"817E 7D5F 496A 818D 8875 6C70 8EA9 A885" /* �~}_Ij��ˆulpŽ©¨… */ $"717A 8992 8F8A 9A85 5058 748D 8D6C 5965" /* qz‰’�Šš…PXt��lYe */ $"6370 8474 6274 909B 9C88 949D 7170 8390" /* cp„tbt�›œˆ”�qpƒ� */ $"8F7E 5E74 7A7F 9B86 5E64 8794 9779 6D6C" /* �~^tz.›†^d‡”—yml */ $"4752 7A9C A7A4 7159 7885 B2B5 8568 7C8A" /* GRzœ§¤qYx…²µ…h|Š */ $"A59B 8679 504B 6388 A2AC 813E 4160 8093" /* ¥›†yPKcˆ¢¬�>A`€“ */ $"806B 8696 AA9E 8283 6A6C 8EA7 A8A7 8F70" /* €k†–ªž‚ƒjlާ¨§�p */ $"5B5D 8693 7857 6A83 9995 6E5D 4346 6B9B" /* []†“xWjƒ™•n]CFk› */ $"B6B9 A075 5940 7DC0 A979 6C7C 96AC 9675" /* ¶¹ uY@}À©yl|–¬–u */ $"4742 5F81 A3A5 9777 562C 3793 926C 6C93" /* GB_�£¥—wV,7“’ll“ */ $"B5BD 906B 545A 8294 B4B5 9A85 7B61 3C64" /* µ½�kTZ‚”´µš…{a"d.Õ_ */ $"5695 9D8B 5F73 7739 3348 D0F7 A45E 6561" /* V•�‹_sw93HÐ.¤^ea */ $"4860 B6B2 4C65 8ABE EF7D 384E 6361 6C99" /* H`¶²Leо.}8Ncal™ */ $"C586 4A49 4B98 D79E 5373 97A2 7A79 6F42" /* ņJIK˜×žSs—¢zyoB */ $"4760 AAFB C978 7D68 5C49 67B1 8246 7DA6" /* G`ª.Éx}h\Ig±‚F}¦ */ $"DBA7 4E49 4751 6784 C5AA 7351 578E DD85" /* .§NIGQg„ŪsQWŽ.… */ $"7579 8595 745D 766F 4A55 85E2 D578 945D" /* uy…•t]voJU….Õx”] */ $"4D4D 7690 7B6A 7099 C9C0 4462 524E 6286" /* MMv�{jp™ÉÀDbRNb† */ $"AB9C 9E6A 476D DEB1 6174 5F78 7366 5C72" /* «œžjGm.±at_xsf\r */ $"8156 61C7 EF80 986C 4549 78A6 7D7C 8B79" /* �VaÇ.€˜lEIx¦}|‹y */ $"ABDB 6851 7351 4061 B0A6 8684 4252 C2E8" /* «.hQsQ@a°¦†„BRÂ. */ $"7D76 6D69 626F 7362 7F94 5E96 F3B2 8B6C" /* }vmibosb.”^–.²‹l */ $"373E 73BA 9864 7881 88C0 9F57 5D4D 4957" /* 7>sº˜dx�ˆÀŸW]MIW */ $"A3B5 8082 664F A8F3 B88F 394A 6779 7A6F" /* £µ€‚fO¨.¸�9Jgyzo */ $"6E89 5B90 D4C4 886F 3422 63CF BD96 675C" /* n‰[�ÔĈo4"cϽ–g\ */ $"94C0 A07D 613C 1D53 B1BA 7E7D 734D 8CE8" /* ”À }a<.S±º~}sMŒ. */ $"DBA9 5A0C 4793 987C 677E 6A70 CCD8 916F" /* .©Z.G“˜|g~jpÌØ‘o */ $"3311 54CE DEAE 9453 67B4 A5A5 723A 0F28" /* 3.TÎ.®”Sg´¥¥r:.( */ $"9CC9 877B 8055 72D2 E3BD 7E1F 1B7A 9CA3" /* œÉ‡{€UrÒ.½~..zœ£ */ $"7676 6663 A4C4 A673 5720 27B5 E8AF A578" /* vvfc¤Ä¦sW 'µ.¯¥x */ $"499C 97A3 8649 140A 73C8 9C6B 956B 58AC" /* Iœ—£†I..sÈœk•kX¬ */ $"F5C9 9452 085E A898 897E 694D 7CA7 B972" /* .É”R.^¨˜‰~iM|§¹r */ $"5E32 0F8F F3C1 AAA8 4E75 A68F 9376 3501" /* ^2.�.Áª¨Nu¦�“v5. */ $"42A9 B278 8F8C 5C8E EBD4 9B76 1D24 B693" /* B©²x�Œ\Ž.Ô›v.$¶“ */ $"7D91 8546 6B8A AA8B 6F4A 0B6E F4CF A6B7" /* }‘…FkŠª‹oJ.n.Ϧ· */ $"8158 B389 7D7B 5C06 168D A68E 82A0 6C7C" /* �X³‰}{\..�¦Ž‚ l| */ $"DCDF A791 420C 97A2 707B A35B 5781 8590" /* ..§‘B.—¢p{£[W�…� */ $"706A 1C43 E7E4 A5A7 A55F A190 7069 7F15" /* pj.C..¥§¥_¡�pi.. */ $"096C 9891 7C99 8B80 C7DE B494 6C0E 5DB7" /* Æl˜‘|™‹€Ç.´”l.]· */ $"826C 9C70 4775 7591 7671 412B BEF1 C1A6" /* ‚lœpGuu‘vqA+¾.Á¦ */ $"B78B 7993 795B 7336 0147 8E93 898E AA8E" /* ·‹y“y[s6.GŽ“‰ŽªŽ */ $"B4D3 C495 8341 279A 956B 7E85 5763 6B83" /* ´ÓÄ•ƒA'š•k~…Wckƒ */ $"785F 5A38 94EC D5AB AFBE 747D 8C6D 5943" /* x_Z8”.Õ«¯¾t}ŒmYC */ $"0618 7186 9782 B3A1 A5CA D696 806A 3263" /* ..q†—‚³¡¥ÊÖ–€j2c */ $"9778 6878 7251 5E7C 8D5E 6652 74D8 DFB6" /* —xhxrQ^|�^fRtØ.¶ */ $"A0CC 906A 8882 4037 130E 5280 9B83 A6AB" /*  Ì�jˆ‚@7..R€›ƒ¦« */ $"96C2 ECAD 7A76 5543 9191 706B 7259 5472" /* –Â.­zvUC‘‘pkrYTr */ $"995F 585D 6ABA E6CC ABC0 A961 769C 4526" /* ™_X]jº.Ì«À©avœE& */ $"1724 366E 9FA5 9DA6 A7B7 EBBE 7169 733C" /* .$6nŸ¥�¦§·.¾qis< */ $"6991 7563 5A6E 575F 9F7D 5852 70A0 DFD7" /* i‘ucZnW_Ÿ}XRp .× */ $"BEB3 B479 57A3 5E19 0531 324D 87C2 A788" /* ¾³´yW£^..12M‡Â§ˆ */ $"A7B1 E5DD 8368 7452 4081 8D68 4567 734A" /* §±..ƒhtR@��hEgsJ */ $"9492 5F43 7399 D7DA C6B1 A598 4A8F 881C" /* ”’_Cs™×.Ʊ¥˜J�ˆ. */ $"0125 4B41 77D0 B57D 97BC DCED 8D67 666A" /* .%KAwе}—¼..�gfj */ $"3B6E 9F75 4148 8150 8DB0 6E3C 5D95 CEDD" /* ;nŸuAH�P�°n<]•Î. */ $"CDB9 9E9B 6076 922D 0110 503F 69C7 C185" /* ͹ž›`v’-..P?iÇÁ… */ $"82C0 E0F3 A068 5C65 4162 917F 413C 7C67" /* ‚À.. h\eAb‘.A<|g */ $"7CAC 813F 4587 C5DE C3B9 A68F 6D77 9957" /* |¬�?E‡Å.ù¦�mw™W */ $"0305 3A4A 67A9 CA99 75AE E4F5 B270 5F5C" /* ..:Jg©Ê™u®..²p_\ */ $"465D 8988 483F 617A 8BAA 9B50 3277 C1E3" /* F]‰ˆH?az‹ª›P2wÁ. */ $"BBB2 AF8D 7279 9175 1101 2650 769D BCAB" /* »²¯�ry‘u..&Pv�¼« */ $"7298 DFF8 C080 5E4E 4B56 8482 5E41 526B" /* r˜..À€^NKV„‚^ARk */ $"9DA2 A55C 2B5E B8E2 B9A4 B58D 7677 9C7C" /* �¢¥\+^¸.¹¤µ�vwœ| */ $"3301 1641 7597 A3B4 7F8B D2FA C192 5C44" /* 3..Au—£´.‹Ò.Á’\D */ $"474D 8071 6D49 5464 9FB6 AD74 2D4A A7D9" /* GM€qmITdŸ¶­t-J§. */ $"BA9B B793 7B67 AB75 5C07 1135 6C95 9CA9" /* º›·“{g«u\..5l•œ© */ $"887E C3F6 D4A9 6A40 5445 796D 7164 5263" /* ˆ~Ã.Ô©j@TEymqdRc */ $"8AC2 AE88 2C3B 97CC BD99 A390 8863 A685" /* ŠÂ®ˆ,;—̽™£�ˆc¦… */ $"7028 0831 5992 A2A1 9179 B9EC E6AE 7830" /* p(.1Y’¢¡‘y¹..®x0 */ $"553E 686B 647F 555F 75C4 B99E 3933 82BB" /* U>hkd.U_uĹž93‚» */ $"B8A3 9592 8E6F 9891 6A56 0B2E 427E 9B96" /* ¸£•’Žo˜‘jV..B~›– */ $"8577 AAE2 F2BC 8F36 503F 5E65 5C88 715F" /* …wª..¼�6P?^e\ˆq_ */ $"6EB4 C8B2 502D 6CA7 ADA4 8D86 8A7A 8E9F" /* n´È²P-l§­¤�†ŠzŽŸ */ $"6C7F 2C1F 326F 9AA7 7A7B 94D6 EAC7 A24E" /* l.,.2oš§z{”Ö.Ç¢N */ $"464E 4F6A 5776 985A 6AA5 C8C4 7324 5392" /* FNOjWv˜Zj¥ÈÄs$S’ */ $"A5A1 8E7A 8282 849F 6C85 6722 2259 90AB" /* ¥¡Žz‚‚„Ÿl…g""Y�« */ $"7D71 83CA E9CC B06C 354A 4862 5071 AA6F" /* }qƒÊ.̰l5JHbPqªo */ $"5A90 C0C0 9629 3F7A A19B 9074 8186 94A2" /* Z�ÀÀ–)?z¡›�t�†”¢ */ $"6C93 943C 1847 87A2 8569 6CB5 E2CA B08C" /* l“”<.G‡¢…ilµ.ʰŒ */ $"3C45 4665 456A AA96 568D C5BE BD4E 2461" /* \Ò.ž�_/`}La£ */ $"8D9E B1B4 7ABD 9118 126B B977 7063 5F9C" /* �ž±´z½‘..k¹wpc_œ */ $"D479 7DBF 8163 7271 5B87 883C 4AA9 F1A6" /* Ôy}¿�crq[‡ˆ~¯_..q½¶Ž ¥y */ $"4660 A378 738D 9490 8B98 9A85 3D32 6DB4" /* F`£xs�”�‹˜š…=2m´ */ $"9D4F 406E 8F98 948A CDDF 8841 5AAC 7620" /* �O@n�˜”ŠÍ.ˆAZ¬v */ $"0653 B3BF 9794 B18A 534C 9B8C 6E7E 9597" /* .S³¿—”±ŠSL›Œn~•— */ $"898E 9895 572E 569A B459 3F53 909A 9882" /* ‰Ž˜•W.Vš´Y?S�š˜‚ */ $"B6E4 AB54 469D 8D38 063C A9C8 A58A B294" /* ¶.«TF��8.<©È¥Š²” */ $"6541 8797 6670 89A3 8E86 8E97 723D 4986" /* eA‡—fp‰£Ž†Ž—r=I† */ $"BE71 4B42 859C 9F87 9BDD C86E 357C 964C" /* ¾qKB…œŸ‡›.Èn5|–L */ $"0E20 93C5 AE8A A9A5 793E 75A2 6C67 79A7" /* . “ŮЩ¥y>u¢lgy§ */ $"9885 8995 8252 416D B48A 523B 6798 AA91" /* ˜…‰•‚RAm´ŠR;g˜ª‘ */ $"89C0 D896 3960 9364 210C 75C0 B594 9FAF" /* ‰ÀØ–9`“d!.uÀµ”Ÿ¯ */ $"9045 629D 7760 6D9C A186 7C90 8B6A 4859" /* �Eb�w`mœ¡†|�‹jHY */ $"9BA2 6143 4F8D AF9F 83AB DABB 4D4B 8575" /* ›¢aCO�¯Ÿƒ«.»MK…u */ $"3409 57B7 BC99 98A7 A253 5296 885C 668B" /* 4ÆW·¼™˜§¢SR–ˆ\f‹ */ $"AB90 7688 957B 5D48 80A4 7B49 4676 AEAD" /* «�vˆ•{]H€¤{IFv®­ */ $"809C C7D4 6939 6E7C 4914 3B9E BE9A A0A9" /* €œÇÔi9n|I.;ž¾š © */ $"AD6E 4485 9460 5980 A69A 7A7A 9E82 7445" /* ­nD…”`Y€¦šzzž‚tE */ $"679A 9150 4260 A2C1 8890 B5DD 9536 547D" /* gš‘PB`¢Áˆ�µ.•6T} */ $"5A24 2E7E BF9D 9FAB A78D 4775 986D 5177" /* Z$.~¿�Ÿ«§�Gu˜mQw */ $"9CA2 816C 9D8C 8453 5184 A361 3F53 91CB" /* œ¢�l�Œ„SQ„£a?S‘Ë */ $"9387 A7D2 BA46 407C 6835 2F62 B5A0 9DB6" /* “‡§ÒºF@|h5/bµ �¶ */ $"9F97 5C5F 8E78 4C68 94A3 8C6A 9399 8F65" /* Ÿ—\_ŽxLh”£Œj“™�e */ $"4268 A77E 404A 80C9 A083 9CC3 C760 286E" /* Bh§~@J€É ƒœÃÇ`(n */ $"7344 374D 9EA6 97BC A299 7859 838C 5358" /* sD7Mž¦—¼¢™xYƒŒSX */ $"8E9C 9570 8C9A 986E 444B 9C94 4241 77C4" /* Žœ•pŒš˜nDKœ”BAwÄ */ $"AF89 92B5 CA85 2860 804F 3F4B 85A9 99BF" /* ¯‰’µÊ…(`€O?K…©™¿ */ $"A591 8565 6C8D 5D49 819A 9778 8B94 A17B" /* ¥‘…el�]I�š—x‹”¡{ */ $"5241 8BA7 5832 6EB9 B594 8EA6 C098 3548" /* RA‹§X2n¹µ”ަÀ˜5H */ $"8456 404C 71A1 99BB B187 8B7B 6289 6D46" /* „V@Lq¡™»±‡‹{b‰mF */ $"6F9A 967C 9391 9D86 523A 71A9 6E2C 64B2" /* oš–|“‘�†R:q©n,d² */ $"B69B 919C B2A5 4D39 8768 3D4F 6391 9FBD" /* ¶›‘œ²¥M9‡h=Oc‘Ÿ½ */ $"BB86 8B88 6278 7D48 5993 9A7F 9995 9490" /* »†‹ˆbx}HY“š.™•”� */ $"5C3D 64A7 872D 58AD B49D 9897 A4AA 6237" /* \=d§‡-X­´�˜—¤ªb7 */ $"797A 3F4F 6184 9DB7 BE8C 8392 6B6A 8556" /* yz?Oa„�·¾Œƒ’kj…V */ $"4B87 9C7F 989E 8B92 673C 5B98 9744 48A7" /* K‡œ.˜ž‹’g<[˜—DH§ */ $"B19B 9D94 96A6 743F 688B 4549 6072 96B3" /* ±›�”–¦t?h‹EI`r–³ */ $"BF99 8099 715E 8066 467A 9F86 8FA8 878D" /* ¿™€™q^€fFzŸ†�¨‡� */ $"743E 5587 9C59 409B B198 A097 8C9F 824C" /* t>U‡œY@›±˜ —ŒŸ‚L */ $"588D 5644 5D6D 8FAD BBA0 819F 825E 7976" /* X�VD]m�­» �Ÿ‚^yv */ $"4465 978E 8EA7 8D8C 7D4A 5078 966E 428D" /* De—ŽŽ§�Œ}JPx–nB� */ $"B597 9C9B 8797 8B5B 5786 6C45 5767 84A8" /* µ—œ›‡—‹[W†lEWg„¨ */ $"ADA7 8C92 8E5C 6E7F 4C54 8B93 8EA0 9489" /* ­§Œ’Ž\n.LT‹“Ž ”‰ */ $"8055 4C71 8E7F 4F74 B596 A09B 878C 8868" /* €ULqŽ.Otµ– ›‡Œˆh */ $"5476 7C4E 5164 7CA5 A3A4 9B8B 9965 7088" /* Tv|NQd|¥£¤›‹™epˆ */ $"5D4A 7B94 919F 9391 8257 4E67 8684 6065" /* ]J{”‘Ÿ“‘‚WNg†„`e */ $"AE99 A299 8D87 8574 5B77 8360 505C 789E" /* ®™¢™�‡…t[wƒ`P\xž */ $"A39D AD88 976A 6588 6D4B 6991 90A2 8997" /* £�­ˆ—jeˆmKi‘�¢‰— */ $"8A60 545E 8288 765F 9D9C 9E9C 918E 7D77" /* Š`T^‚ˆv_�œžœ‘Ž}w */ $"596F 8368 5655 7093 9F8F B491 917A 628E" /* YoƒhVUp“Ÿ�´‘‘zbŽ */ $"7853 5785 8EA1 8996 9667 5455 7786 7868" /* xSW…Ž¡‰––gTUw†xh */ $"899D 9B9F 8F94 7D7A 656B 886E 6353 6289" /* ‰�›Ÿ�”}zekˆncSb‰ */ $"9D8D B09F 8D80 5F8A 825C 5574 8AA0 8C8C" /* ��°Ÿ�€_Š‚\UtŠ ŒŒ */ $"9D76 5857 708D 7B70 7892 98A2 9198 8176" /* �vXWp�{px’˜¢‘˜�v */ $"6764 8771 665D 587D 998E AAA4 8D85 6684" /* gd‡qf]X}™Žª¤�…f„ */ $"8D61 5A62 7E9C 9488 9B88 5F51 638A 8073" /* �aZb~œ”ˆ›ˆ_QcŠ€s */ $"7485 93A3 9598 8774 6A6A 897A 6168 5566" /* t…“£•˜‡tjj‰zahUf */ $"9192 A8A5 9781 6781 946B 5D59 6C97 9D89" /* ‘’¨¥—�g�”k]Yl—�‰ */ $"9692 704C 6288 8B6E 7A77 86A5 A09E 8B77" /* –’pLbˆ‹nzw†¥ ž‹w */ $"616A 8780 626C 6159 8396 A4A2 9E86 6883" /* aj‡€blaYƒ–¤¢ž†hƒ */ $"967A 605B 5885 A594 9396 8151 5A80 8C6E" /* –z`[X…¥”“–�QZ€Œn */ $"7C75 779E A69C 927B 5F63 8988 6B68 6D56" /* |uwž¦œ’{_c‰ˆkhmV */ $"6F99 A2A1 A38C 667E 9382 625B 4F71 A39B" /* o™¢¡£Œf~“‚b[Oq£› */ $"8E97 8C61 517F 8D71 7577 6B92 AEA1 997F" /* Ž—ŒaQ.�quwk’®¡™. */ $"5D5B 888D 7165 715F 5B94 A29A A893 6B7C" /* ][ˆ�qeq_[”¢š¨“k| */ $"988D 6C5B 4D5B 94A9 9099 9072 4F77 8C74" /* ˜�l[M[”©�™�rOwŒt */ $"787E 6683 AFA2 9B87 615A 7E95 7B67 6C69" /* x~fƒ¯¢›‡aZ~•{gli */ $"5787 A296 A899 6B74 9594 755A 5054 82A9" /* W‡¢–¨™kt•”uZPT‚© */ $"9494 917E 606E 8976 767E 6473 A1A8 A08F" /* ””‘~`n‰vv~ds¡¨ � */ $"685A 6F8F 836C 616C 6279 9591 A5A9 7B72" /* hZo�ƒlalby•‘¥©{r */ $"8598 8666 504E 6F9F A092 877B 6D69 7E76" /* …˜†fPNoŸ ’‡{mi~v */ $"7B80 726E 8CA2 AA99 7C5E 6789 9276 595C" /* {€rnŒ¢ª™|^g‰’vY\ */ $"6B7C 8893 9EA9 8972 728E 8C75 5754 638A" /* k|ˆ“ž©‰rrŽŒuWTcŠ */ $"A49B 827D 7879 7A7B 7E7D 7573 7B93 B09A" /* ¤›‚}xyz{~}us{“°š */ $"886A 5F75 9282 604D 6D83 778F 98A4 9F7D" /* ˆj_u’‚`Mmƒw�˜¤Ÿ} */ $"6E84 9784 5D55 6277 9EA6 7E77 797C 707A" /* n„—„]Ubwž¦~wy|pz */ $"7C7E 7682 727C AFA2 8F7A 5C6B 8F8F 6A45" /* |~v‚r|¯¢�z\k��jE */ $"6589 718E 9A97 A389 6B73 958D 6E58 6667" /* e‰qŽš—£‰ks•�nXfg */ $"8FA9 8777 8181 707A 807D 6F82 7571 A8A9" /* �©‡w��pz€}o‚uq¨© */ $"8D84 6162 868D 7358 638E 6D7E 9995 A594" /* �„ab†�sXcŽm~™•¥” */ $"6E72 9693 6F4C 5F64 87A1 8880 9288 6E72" /* nr–“oL_d‡¡ˆ€’ˆnr */ $"807E 7A7C 7471 9BAE 8E7F 655F 8894 7061" /* €~z|tq›®Ž.e_ˆ”pa */ $"688A 7271 8D93 A39E 6F6D 939B 7954 4D5A" /* hŠrq�“£žom“›yTMZ */ $"8798 8780 9B9B 726C 7F78 817F 6B72 8EA9" /* ‡˜‡€››rl.x�.krŽ© */ $"9681 6755 7C99 7364 7989 7C6D 7A90 A3AB" /* –�gU|™sdy‰|mz�£« */ $"7B67 8DA2 7B60 4849 8299 887D 9CAA 8166" /* {g�¢{`HI‚™ˆ}œª�f */ $"7972 8390 626B 85A0 9F83 6F5B 6FA4 8457" /* yrƒ�bk… Ÿƒo[o¤„W */ $"7F85 8276 6983 9FB7 8B5E 77A7 896B 4B38" /* .…‚viƒŸ·‹^w§‰kK8 */ $"729B 8A75 94B2 986A 7673 759E 6C5A 7C91" /* r›Šu”²˜jvsužlZ|‘ */ $"A391 7259 5D97 9D57 768B 7F7D 6772 96B5" /* £‘rY]—�Wv‹.}gr–µ */ $"A466 65A4 9974 602F 5899 8F75 88AD A56F" /* ¤fe¤™t`/X™�uˆ­¥o */ $"6E7E 6E98 8353 7288 9E9A 8369 5985 AE67" /* n~n˜ƒSrˆžšƒiY…®g */ $"5E8A 7F84 7468 8BAE B672 548E AD79 693C" /* ^Š.„th‹®¶rTŽ­yi< */ $"4688 9274 7BA5 B286 7383 6B85 9852 607B" /* Fˆ’t{¥²†sƒk…˜R`{ */ $"97A3 8B6E 5A6F AB84 4E84 7F85 8160 73A4" /* —£‹nZo«„N„.…�`s¤ */ $"C489 5577 B28B 7342 3678 977B 7098 B295" /* ĉUw²‹sB6x—{p˜²• */ $"7380 7274 A564 5775 889D 9D79 5C65 9F9F" /* s€rt¥dWuˆ��y\eŸŸ */ $"4D73 8188 8665 6494 C4A1 5966 AA96 7857" /* Ms�ˆ†ed”Ä¡Yfª–xW */ $"3362 9182 6E8C B5A8 7E7E 7C68 9D79 5268" /* 3b‘‚nŒµ¨~~|h�yRh */ $"829A 9C85 6459 8CAC 6264 7F89 8C71 5E7F" /* ‚šœ…dYŒ¬bd.‰Œq^. */ $"BDBE 6858 97A7 805D 3552 8289 717C AFB1" /* ½¾hX—§€]5R‚‰q|¯± */ $"8883 805E 9090 5C5D 728D 9F90 7056 7AB1" /* ˆƒ€^��\]r�Ÿ�pVz± */ $"7A59 7486 8F7A 5E69 A8CF 8050 87A3 896E" /* zYt†�z^i¨Ï€P‡£‰n */ $"4347 6E8A 7D73 A2B8 9488 875F 7E9A 6E55" /* CGnŠ}s¢¸”ˆ‡_~šnU */ $"6A83 9496 845A 63AA 9160 6987 9681 655E" /* jƒ”–„Zcª‘`i‡–�e^ */ $"90D3 A252 7CA4 906F 504B 5981 8772 91B9" /* �Ó¢R|¤�oPKY�‡r‘¹ */ $"9E89 9267 6E95 8655 5B78 9395 8F6E 549E" /* ž‰’gn•†U[x“•�nTž */ $"A66C 5C81 9585 6E5B 76C3 BD60 6896 947B" /* ¦l\�•…n[vý`h–”{ */ $"5B55 4A70 8F74 80B0 AB8C 9B70 5F85 9862" /* [UJp�t€°«Œ›p_…˜b */ $"536D 8593 9780 4F84 B27B 5774 9585 755D" /* Sm…“—€O„²{Wt•…u] */ $"5FAF CF7E 5F93 927B 6267 485B 927D 78A2" /* _¯Ï~_“’{bgH[’}x¢ */ $"B091 9F80 5873 9E79 4E63 7C88 9792 5B6E" /* °‘Ÿ€XsžyNc|ˆ—’[n */ $"B78F 5A66 9588 7D6A 5893 CB97 5C84 9480" /* ·�Zf•ˆ}jX“Ë—\„”€ */ $"646F 5249 8585 7496 B098 9A91 6361 9390" /* doRI……t–°˜š‘ca“� */ $"5256 7081 969A 6A5F AAA3 665B 8E8B 796E" /* RVp�–šj_ª£f[Ž‹yn */ $"597C C0B0 6F79 8E83 6672 6143 768B 778B" /* Y|À°oyŽƒfraCv‹w‹ */ $"A69C 9797 7257 83A0 6750 6776 90A3 7B61" /* ¦œ——rWƒ gPgv�£{a */ $"9AAF 7A53 7F91 7A71 5C68 AEB6 8372 888A" /* š¯zS.‘zq\h®¶ƒrˆŠ */ $"6570 724B 678A 808A A2A0 9B9A 855B 699A" /* eprKgЀТ ›š…[iš */ $"814E 5D6D 85A2 8565 88AB 9454 6F94 7F73" /* �N]m…¢…eˆ«”To”.s */ $"6462 9CB9 9975 7E8E 6C65 775D 597C 8385" /* dbœ¹™u~Žlew]Y|ƒ… */ $"9B9D 9592 906C 5688 9859 5362 7CA2 9374" /* ›�•’�lVˆ˜YSb|¢“t */ $"7E9F A962 5F92 866B 6661 89AE A37C 748D" /* ~Ÿ©b_’†kfa‰®£|t� */ $"755C 7375 5B6D 838A 9A9F 978E 9282 4F70" /* u\su[mƒŠšŸ—Ž’‚Op */ $"9E73 4F5B 719A 997E 7A90 B37A 5586 926C" /* žsO[qš™~z�³zU†’l */ $"6666 7CA7 A588 6E8C 8258 6785 685E 7B8D" /* ff|§¥ˆnŒ‚Xg…h^{� */ $"9CA3 9486 969A 585A 928D 4D4F 668F A18E" /* œ£”†–šXZ’�MOf�¡Ž */ $"7781 B291 5572 9872 626B 749D A68E 6A87" /* w�²‘Ur˜rbkt�¦Žj‡ */ $"8C5E 5C8B 8056 6D8A 99A6 9377 8DAD 684D" /* Œ^\‹€VmŠ™¦“w�­hM */ $"779D 5D47 5C7F A29F 7B76 ADA3 6363 9681" /* w�]G\.¢Ÿ{v­£cc–� */ $"5E6C 7393 A88F 6B82 935E 527F 975E 5D84" /* ^ls“¨�k‚“^R.—^]„ */ $"9AAB 996D 84BC 7E4F 6499 7843 5675 9BB0" /* š«™m„¼~Od™xCVu›° */ $"816E A6AD 715D 818C 606D 7785 AB8B 6878" /* �n¦­q]�Œ`mw…«‹hx */ $"9964 5374 A071 537B 9CAE A569 75C1 9550" /* ™dSt qS{œ®¥iuÁ•P */ $"5B80 8F47 4867 8DB9 8D65 96B3 8064 6C8D" /* [€�GHg�¹�e–³€dl� */ $"6C69 7B7E AD94 6870 9C6C 516C 998E 546A" /* li{~­”hpœlQl™ŽTj */ $"99AC A665 60B7 AB57 5D68 9560 4060 85BB" /* ™¬¦e`·«W]h•`@`…» */ $"A16A 8CB8 8C70 607D 806C 7D7E A299 6666" /* ¡jŒ¸Œp`}€l}~¢™ff */ $"9477 4F6D 879C 655C 95B3 A86E 59AD C264" /* ”wOm‡œe\•³¨nY­Âd */ $"5F60 847C 3C54 7EB2 AB6F 7AB2 987B 605F" /* _`„|Od–Œ‡�‰… £Šj */ $"5975 7C98 B48D 5846 5171 9880 787C 857E" /* Yu|˜´�XFQq˜€x|…~ */ $"8BAC 9878 6873 81A1 A589 4A3A 4E60 969B" /* ‹¬˜xhs�¡¥‰J:N`–› */ $"828D 8A82 9DA8 8C72 5871 788C B69A 5842" /* ‚�Š‚�¨ŒrXqxŒ¶šXB */ $"4766 A18C 7979 8683 86A8 A681 6C74 7A9F" /* Gf¡Œyy†ƒ†¨¦�ltzŸ */ $"AD94 5133 4857 8DA4 8185 8A81 93AC 947E" /* ­”Q3HW�¤�…Š�“¬”~ */ $"5B73 7B84 B1AA 603F 415B A19E 7C74 8188" /* [s{„±ª`?A[¡ž|t�ˆ */ $"7E9A A781 6A70 7293 B0A0 602F 4555 84AC" /* ~š§�jpr“° `/EU„¬ */ $"897E 8781 8CAC 9E85 5F71 7C7A A5AE 673C" /* ‰~‡�Œ¬ž…_q|z¥®g< */ $"3A51 97AD 8674 7B8F 8091 AA8C 6F70 6D89" /* :Q—­†t{�€‘ªŒopm‰ */ $"AFA8 6D2E 4055 7AAD 937A 8380 84A4 A991" /* ¯¨m.@Uz­“zƒ€„¤©‘ */ $"686C 7D75 98B0 743E 3648 8CB7 9879 738E" /* hl}u˜°t>6HŒ·˜ysŽ */ $"8283 A494 7473 6F7D A8B2 8235 3751 71A3" /* ‚ƒ¤”tso}¨²‚57Qq£ */ $"9D7C 7E7F 8099 AD9B 7169 8076 89A8 8446" /* �|~.€™­›qi€v‰¨„F */ $"3340 7FB6 AC81 708B 877A 9897 756F 6E74" /* 3@.¶¬�p‹‡z˜—uont */ $"9CB2 9046 344D 6E97 A681 777E 7F8F AEA8" /* œ²�F4Mn—¦�w~.�®¨ */ $"7C6B 8075 7D99 8A51 323A 72AC BF8E 7184" /* |k€u}™ŠQ2:r¬¿Žq„ */ $"8C7E 8E98 7C6F 736E 8CB0 9E5B 3547 6D8C" /* Œ~Ž˜|osnŒ°ž[5GmŒ */ $"AA91 7378 7F88 A7B3 876F 7E7B 7889 8E64" /* ª‘sx.ˆ§³‡o~{x‰Žd */ $"3235 669E CAA7 767B 8980 8294 866A 7472" /* 25fžÊ§v{‰€‚”†jtr */ $"82A6 AA72 3E3E 6882 A09F 756E 7D83 9EB9" /* ‚¦ªr>>h‚ Ÿun}ƒž¹ */ $"9571 777B 7678 8776 3C33 5E92 C8C3 7F75" /* •qw{vx‡v<3^’ÈÃ.u */ $"8586 7C89 8A69 6B71 7595 AE86 503A 6280" /* …†|‰Šikqu•®†P:b€ */ $"94AC 7F67 7982 96B9 A97B 767C 7469 7A7F" /* ”¬.gy‚–¹©{v|tiz. */ $"4A30 5486 BBDB 9473 7B87 7E80 8D70 6A78" /* J0T†».”s{‡~€�pjx */ $"7383 AB9E 643D 567C 89AF 8F65 6E7E 8EB1" /* sƒ«žd=V|‰¯�en~ޱ */ $"B682 767D 7860 6A81 5E38 4A7A ACE6 B474" /* ¶‚v}x`j�^8Jz¬.´t */ $"7284 8176 8673 6775 7272 9BAB 784C 4D75" /* r„�v†sgurr›«xLMu */ $"81A7 9D69 677B 8CA5 BE94 757A 795C 5975" /* �§�ig{Œ¥¾”uzy\Yu */ $"694E 426F 9AE2 D87F 6B7D 8977 7B74 6B74" /* iNBoš.Ø.k}‰w{tkt */ $"7666 86B1 8C5F 486B 7D9E AA73 676E 8C9C" /* vf†±Œ_Hk}žªsgnŒœ */ $"BDA6 7C7E 7D5E 4F68 6B63 4363 8AD3 F196" /* ½¦|~}^OhkcCcŠÓ.– */ $"696E 857D 726C 6B7C 7969 70AE A076 4E5D" /* in…}rlk|yip® vN] */ $"7995 AC7C 6A62 8594 B5B0 847B 7B63 4A58" /* y•¬|jb…”µ°„{{cJX */ $"6374 5657 7EBE F9B9 6D62 7C87 7363 647D" /* ctVW~¾.¹mb|‡scd} */ $"786F 5E9D AA8C 5C50 6E8F AA89 6F61 7B94" /* xo^�ªŒ\Pn�ª‰oa{” */ $"ACB8 967D 7668 4B4C 5877 6F53 73A8 F6DA" /* ¬¸–}vhKLXwoSs¨.. */ $"7F58 6B89 7B5C 5E7F 7E76 5884 AEA2 704B" /* .Xk‰{\^.~vX„®¢pK */ $"638A A796 7765 6D8F A4B3 A485 736F 5344" /* cЧ–wem�¤³¤…soSD */ $"4A71 845F 6594 E7F2 9D55 5682 8359 557B" /* Jq„_e”..�UV‚ƒYU{ */ $"877E 5E6E A4B2 8A51 587F 9F9A 7E69 6682" /* ‡~^n¤²ŠQX.Ÿš~if‚ */ $"9DAB AE92 6C6B 583F 3C63 9078 6284 D2FA" /* �«®’lkX?ptU\ */ $"7796 955F 5D8D B69B 6560 7B8B 9E85 7179" /* w–•_]�¶›e`{‹ž…qy */ $"7486 ADBA 8C5B 6761 3328 5EAA B58A 7DC2" /* t†­ºŒ[ga3(^ªµŠ} */ $"FAC4 5033 5B6B 5A5D 7192 A46F 5881 A5A7" /* .ÄP3[kZ]q’¤oX�¥§ */ $"7862 7782 9890 767C 7674 A5C0 935A 6065" /* xbw‚˜�v|vt¥À“Z`e */ $"3F1F 46A1 C4A3 7BAA F4D1 6437 4A65 5D62" /* ?.F¡Ä£{ª.Ñd7Je]b */ $"6F86 A582 5874 91A3 8F6E 777F 8E94 7B80" /* o†¥‚Xt‘£�nw.Ž”{€ */ $"7767 97C8 9C60 5B65 4F1F 318D CDBC 8A93" /* wg—Èœ`[eO.1�Í¼Š“ */ $"E4DA 743F 3A5C 6163 7384 A291 6069 8393" /* ..t?:\acs„¢‘`iƒ“ */ $"9B7D 7C7D 7F94 8783 7A63 85C6 A465 5A60" /* ›}|}.”‡ƒzc…ƤeZ` */ $"5F2A 2177 CCCF A189 CBDB 8648 324E 6162" /* _*!wÌÏ¡‰Ë.†H2Nab */ $"7585 9C99 6E65 797E 9C8D 8282 788A 9489" /* u…œ™ney~œ�‚‚xŠ”‰ */ $"7D63 74BD AF6D 5557 6639 155D C1DE BC8D" /* }ct½¯mUWf9.]Á.¼� */ $"B3D6 9553 3342 6563 778C 9796 7A61 6F6D" /* ³Ö•S3BecwŒ—–zaom */ $"9098 918D 707B 9C8C 8166 71AF B279 584E" /* �˜‘�p{œŒ�fq¯²yXN */ $"6B4F 1849 B0E3 D59C 98C5 A15E 3036 6666" /* kO.I°.Õœ˜Å¡^06ff */ $"718F 9899 876A 6A62 8196 9B9C 746D 9B98" /* q�˜™‡jjb�–›œtm›˜ */ $"866B 6D9B B183 5A42 6661 2136 98DE EAB4" /* †km›±ƒZBfa!6˜..´ */ $"8EB2 A36C 3230 6469 6F93 9B97 8B70 635D" /* ޲£l20dio“›—‹pc] */ $"708F A0A7 7C67 929B 8978 7389 A78D 673D" /* p� §|g’›‰xs‰§�g= */ $"5A6D 322F 80D1 F8CB 8B98 A57A 352E 656E" /* Zm2/€Ñ.Ë‹˜¥z5.en */ $"6C8E 9F9B 907D 5E58 6384 9EAF 8B65 87A2" /* lŽŸ›�}^Xc„ž¯‹e‡¢ */ $"8E80 7B7C 9593 6F3F 4D73 4832 6CC1 F9E2" /* Ž€{|•“o?MsH2lÁ.. */ $"9C81 9680 3F26 5D71 6E8A 9FA0 9486 5C53" /* œ�–€?&]qnŠŸ ”†\S */ $"5D78 94AE 9D6F 7A99 9A8B 8777 8094 7643" /* ]x”®�oz™š‹‡w€”vC */ $"3D6E 5B3E 5FAD F0EE AE75 8A84 5029 5673" /* =n[>_­..®uŠ„P)Vs */ $"7286 9DA4 958C 604C 5D6F 87A5 AB7F 7991" /* r†�¤•Œ`L]o‡¥«.y‘ */ $"9C8E 9079 698E 8051 3A61 6B4C 579C E2F4" /* œŽ�yiŽ€Q:akLWœ.. */ $"C878 7884 602D 4873 7686 98A4 9B8F 6B47" /* Èxx„`-Hsv†˜¤›�kG */ $"596B 7E95 AF92 7A84 9F99 9581 5F82 8459" /* Yk~•¯’z„Ÿ™•�_‚„Y */ $"3953 755F 5B8E CEEA D887 6C7A 6540 416B" /* 9Su_[ŽÎ.؇lze@Ak */ $"7684 93A0 9C91 7349 5669 7585 ACA7 8584" /* v„“ œ‘sIViu…¬§…„ */ $"949F 9985 5871 8566 3F47 7269 6081 BBDD" /* ”Ÿ™…Xq…f?Gri`�». */ $"E09A 6774 6A4D 4165 7985 98A0 9D93 784F" /* .šgtjMAey…˜ �“xO */ $"5065 7278 A3B2 8F85 8DA2 9C88 5D62 7F71" /* Perx£²�…�¢œˆ]b.q */ $"4645 6A78 6D7D ADCC DFAD 706A 685E 4755" /* FEjxm}­Ì.­pjh^GU */ $"737F 969F 9B97 7C59 555D 716D 94B2 9E8B" /* s.–Ÿ›—|YU]qm”²ž‹ */ $"89A1 A788 5D5A 767B 5040 5E77 7979 A0BC" /* ‰¡§ˆ]Zv{P@^wyy ¼ */ $"D6B8 7F6A 6664 5553 697B 93A7 9B92 7B5D" /* Ö¸.jfdUSi{“§›’{] */ $"5B59 6E6B 86AC A58E 8B9F AB8D 6559 677E" /* [Ynk†¬¥Ž‹Ÿ«�eYg~ */ $"5F44 5872 827E 9BB3 C6BA 8C6B 6269 6351" /* _DXr‚~›³ÆºŒkbicQ */ $"5E7A 8BA8 A394 7F64 6557 6670 7BA0 AB97" /* ^z‹¨£”.deWfp{ «— */ $"8BA0 B18E 605A 6278 6A4A 536A 8981 92B5" /* ‹ ±Ž`ZbxjJSj‰�’µ */ $"BAB6 9975 6066 6F5C 5072 87A3 AD93 7863" /* º¶™u`fo\Pr‡£­“xc */ $"6961 5B72 768E A69D 8CA1 B79A 625C 6173" /* ia[rvަ�Œ¡·šb\as */ $"7354 4A5E 8789 8CB3 B2A7 9C7D 6569 7568" /* sTJ^‡‰Œ³²§œ}eiuh */ $"4B6C 8398 B69F 7662 6E6A 5A6D 7580 A0A1" /* Klƒ˜¶ŸvbnjZmu€ ¡ */ $"8DA1 BEA2 5E5B 646E 7563 4C54 848C 87B3" /* �¡¾¢^[dnucLT„Œ‡³ */ $"B49B 9986 6B68 7775 4760 8493 B2AC 775A" /* ´›™†khwuG`„“²¬wZ */ $"6F72 5E68 7974 92A3 909D C1B1 6755 656E" /* or^hyt’£��Á±gUen */ $"726B 4D47 7E94 88AB B893 8D8B 726C 787E" /* rkMG~”ˆ«¸“�‹rlx~ */ $"5254 7E8D AEBB 8151 6878 6762 766E 80A0" /* RT~�®»�Qhxgbvn€  */ $"949B C5BB 7450 666E 7374 5A3D 6C92 89A4" /* ”›Å»tPfnstZ=l’‰¤ */ $"BB95 8287 7772 7D85 5A4D 7A8B A6BF 9356" /* »•‚‡wr}…ZMz‹¦¿“V */ $"5B78 7267 766B 6F93 9595 C3C6 8450 5F6F" /* [xrgvko“••ÃÆ„P_o */ $"7774 6440 5F93 919E BD99 7A7F 7B76 7F88" /* wtd@_“‘ž½™z.{v.ˆ */ $"674A 6B86 99BF A25C 5071 7C6F 6F6E 6487" /* gJk†™¿¢\Pq|oond‡ */ $"9A91 BDD1 975A 556C 7C79 6D40 4983 9598" /* š‘½Ñ—ZUl|ym@Iƒ•˜ */ $"B7A5 7673 7778 848B 7152 6386 93BC B86D" /* ·¥vswx„‹qRc†“¼¸m */ $"4860 807F 6C6D 5A72 918E AFD9 AC6A 5363" /* H`€.lmZr‘ޝ.¬jSc */ $"7D7F 734D 4271 9B99 B0B2 786A 6D77 8C8D" /* }.sMBq›™°²xjmwŒ� */ $"7B5A 597C 8EAF C484 4B54 7B90 716C 5B65" /* {ZY|ޝĄKT{�ql[e */ $"8990 A1D5 C077 5454 7A89 7757 3D5C 95A0" /* ‰�¡ÕÀwTTz‰wW=\•  */ $"A4BB 8765 6871 8C91 8266 596E 8CA1 C69E" /* ¤»‡ehqŒ‘‚fYnŒ¡Æž */ $"4E48 6698 8165 5C58 7693 98C7 DA90 624B" /* NHf˜�e\Xv“˜Ç.�bK */ $"6F8F 7F62 4349 86AA 9FB6 975E 5E66 8D96" /* o�.bCI†ªŸ¶—^^f�– */ $"8370 5E5F 8897 C0BD 6245 5796 9465 5A55" /* ƒp^_ˆ—À½bEW–”eZU */ $"6389 9CB6 DEA8 6A49 608E 8A67 4F41 6BAC" /* c‰œ¶.¨jI`ŽŠgOAk¬ */ $"A2AC AD66 575C 879F 8678 6A54 7E97 B1CB" /* ¢¬­fW\‡Ÿ†xjT~—±Ë */ $"7C44 4987 A473 5456 5479 9CA7 D8C9 7C4C" /* |DI‡¤sTVTyœ§ØÉ|L */ $"5187 966D 5542 56A2 ADA4 B377 4E56 819E" /* Q‡–mUBV¢­¤³wNV�ž */ $"8D7C 7952 6892 A5CF 9F49 3D76 A586 4C55" /* �|yRh’¥ÏŸI=v¥†LU */ $"4E66 9CA5 C7DF 9653 497C 9A7E 5D4C 428A" /* Nfœ¥Ç.–SI|š~]LBŠ */ $"B2A3 B18D 4A49 799C 957B 825C 578C 9FC6" /* ²£±�JIyœ•{‚\WŒŸÆ */ $"BE63 3667 A49A 564B 4E51 8DA5 B7E4 B75B" /* ¾c6g¤šVKNQ�¥·.·[ */ $"4070 918A 6259 426E B0AC A99E 533B 7997" /* @p‘ŠbYBn°¬©žS;y— */ $"9584 866B 4676 A0BA CC84 3255 9A9F 6B3F" /* •„†kFv ºÌ„2UšŸk? */ $"4F45 7DAB ABD8 DA72 3A64 8C92 6E5F 4450" /* OE}««Ø.r:dŒ’n_DP */ $"9DB7 A8A0 682F 709C 8C88 897F 4A5B 9CB4" /* �·¨ h/pœŒˆ‰.J[œ´ */ $"CEAD 3E40 8FA2 7E3D 433F 64A4 AEC6 E995" /* έ>@�¢~=C?d¤®Æ.• */ $"3F58 868E 7F6A 5343 81BF B19C 7A2D 609D" /* ?X†Ž.jSC�¿±œz-`� */ $"8B88 8982 5343 8AB3 C5C8 5E36 7CA3 8C50" /* ‹ˆ‰‚SCгÅÈ^6|£ŒP */ $"383F 5899 B1BA E7B5 4D4B 7C89 8177 583B" /* 8?X™±º.µMK|‰�wX; */ $"61B0 BE9F 843A 509B 937E 9288 653E 73B2" /* a°¾Ÿ„:P›“~’ˆe>s² */ $"BFD3 8534 639C 9561 3331 4988 B3B4 D7D0" /* ¿Ó…4cœ•a31Iˆ³´×Ð */ $"6C4A 6B89 7F87 6840 4A9C C6A8 864A 478E" /* lJk‰.‡h@JœÆ¨†JGŽ */ $"A07C 888A 6D45 59A2 BCD4 AD4A 4E8A 9E6D" /*  |ˆŠmEY¢¼Ô­JNŠžm */ $"3F25 4278 AEB5 C7D1 8B57 5B83 7C8C 7B47" /* ?%Bx®µÇÑ‹W[ƒ|Œ{G */ $"3E7E C1B7 8C56 487D A384 7C8E 6E54 4D8C" /* >~Á·ŒVH}£„|ŽnTMŒ */ $"B5D0 C56A 4871 9F7A 4D1F 356D A9B6 BED2" /* µÐÅjHqŸzM.5m©¶¾Ò */ $"A56D 5075 7C85 8E51 3A63 B1BD 985F 4F6F" /* ¥mPu|…ŽQ:c±½˜_Oo */ $"9F96 7087 7360 4D76 AACD D891 4E54 9288" /* Ÿ–p‡s`MvªÍØ‘NT’ˆ */ $"5825 2363 9EBC B2C3 B28C 5662 7D81 9962" /* X%#cž¼²Ã²ŒVb}�™b */ $"3E50 98BE A56C 5769 91A3 7775 7165 5E64" /* >P˜¾¥lWi‘£wuqe^d */ $"99BD DFB1 6745 7994 662F 1556 95BC AFB8" /* ™½.±gEy”f/.V•¼¯¸ */ $"B59F 6752 747C 977A 464D 7EB8 AB7D 5D6A" /* µŸgRt|—zFM~¸«}]j */ $"82A3 8366 6E61 6C5F 88AD DFCD 8340 5B92" /* ‚£ƒfnal_ˆ­.̓@[’ */ $"773B 1647 91BA B3A5 B5B1 814E 677C 8E87" /* w;.G‘º³¥µ±�Ng|އ */ $"5049 61A8 B38D 676B 779D 9463 5F62 7A6A" /* PIa¨³�gkw�”c_bzj */ $"79A1 D1E0 A64F 417E 8A49 1632 85AF B89E" /* y¡Ñ.¦OA~ŠI.2…¯¸ž */ $"A8B4 9B57 5878 8890 6656 578D B79C 7470" /* ¨´›WXxˆ�fVW�·œtp */ $"7290 9B6D 5154 787B 6C8F BEE4 C567 3163" /* r�›mQTx{l�¾.Åg1c */ $"925F 202B 7DAD B6A0 9BB2 AC69 4F6E 818C" /* ’_ +}­¶ ›²¬iOn�Œ */ $"715D 526F B2AA 8079 7183 9A77 4C49 778D" /* q]Ro²ª€yqƒšwLIw� */ $"7183 B3DD DC88 2E45 8C74 2A22 6FA8 B0A5" /* qƒ³..ˆ.EŒt*"o¨°¥ */ $"94A3 B981 4E66 7B89 7B70 5958 9BB7 8981" /* ”£¹�Nf{‰{pYX›·‰� */ $"7878 9482 4F39 6797 7E78 A6D0 E2AC 402B" /* xx”‚O9g—~x¦Ð.¬@+ */ $"7785 4221 61A3 ABA5 9591 B598 5560 7483" /* w…B!a£«¥•‘µ˜U`tƒ */ $"7C78 6753 81BE 9A87 8171 8789 5934 5498" /* |xgS�¾š‡�q‡‰Y4T˜ */ $"9176 96C1 DDC4 591C 5F89 5825 539B AAA4" /* ‘v–Á.ÄY._‰X%S›ª¤ */ $"9B89 ABA7 635E 717B 807B 7455 65B2 A88E" /* ›‰«§c^q{€{tUe²¨Ž */ $"8A73 778B 6135 408A A180 8DB7 DAD3 7A1D" /* Šsw‹a5@Š¡€�·.Óz. */ $"4382 6C36 4893 AB9D 9D84 9AAA 755C 7274" /* C‚l6H“«��„šªu\rt */ $"7F78 7C64 549E B29C 8F75 6C86 6E3F 3575" /* .x|dTž²œ�ul†n?5u */ $"AB91 89A7 CDD7 922E 2D72 784D 4383 AB9A" /* «‘‰§Í×’.-rxMCƒ«š */ $"9C87 93A3 815E 7170 7D78 7E77 5684 B3AB" /* œ‡“£�^qp}x~wV„³« */ $"9C7A 667A 7548 315A A6A4 8B9C BFDB A242" /* œzfzuH1Z¦¤‹œ¿.¢B */ $"225B 7C63 4877 AB9F 9787 909E 8766 7375" /* "[|cHw«Ÿ—‡�ž‡fsu */ $"7876 7781 616B A5B5 AE7F 636E 7554 3546" /* xvw�ak¥µ®.cnuT5F */ $"98B4 9998 B1D9 B259 2547 7675 5569 A3A4" /* ˜´™˜±.²Y%GvuUi£¤ */ $"8F86 8C97 856A 7079 7773 7287 7364 90B7" /* �†Œ—…jpywsr‡sd�· */ $"C18C 6262 6E5F 3F36 80B8 A89A A3CC B969" /* ÁŒbbn_?6€¸¨š£Ì¹i */ $"2937 6880 6664 9AA9 8F81 8C98 8670 6C80" /* )7h€fdš©��Œ˜†pl€ */ $"7C71 6681 7D69 7BB1 D29E 6756 6565 4D2F" /* |qf�}i{±ÒžgVeeM/ */ $"68B4 B7A3 99C1 BF7D 322D 5B84 7861 8DA7" /* h´·£™Á¿}2-[„xa�§ */ $"9679 8995 8771 6882 8774 5E7C 8774 709D" /* –y‰•‡qh‚‡t^|‡tp� */ $"D7B2 734C 5A66 5A31 4FA3 BEB0 99B3 BC90" /* ײsLZfZ1O£¾°™³¼� */ $"4225 4D81 8C6A 83A2 9C79 7F94 8876 647D" /* B%M�Œjƒ¢œy.”ˆvd} */ $"8F79 576E 877C 6F8A D5C7 864D 4A65 6541" /* �yWn‡|oŠÕdžMJeeA */ $"418F C1BC 9DA5 B49A 5621 427A 9877 7896" /* A�Á¼�¥´šV!Bz˜wx– */ $"9A7D 7490 8A7C 6878 9888 5F62 8482 747B" /* š}t�Š|hx˜ˆ_b„‚t{ */ $"C4D1 9A58 3F61 6A51 3C75 B6C1 A59D A79D" /* ÄÑšX?ajQ;oš•u€ */ $"908A 727C 8B84 6D6E 919A 7451 6A84 827C" /* �Šr|‹„mn‘štQj„‚| */ $"9DC4 B375 4552 6F6B 5455 8DBA B49F 938E" /* �ijuERokTU�º´Ÿ“Ž */ $"7F50 3E6A 959D 7D76 8989 7775 8685 7270" /* .P>j•�}v‰‰wu†…rp */ $"8A9D 845A 5F7E 8482 93B6 B47F 5151 6D72" /* Š�„Z_~„‚“¶´.QQmr */ $"6056 79AC B4A0 918C 7E5D 4765 909E 846D" /* `Vy¬´ ‘Œ~]Ge�ž„m */ $"7F8A 8077 8288 746E 8397 8C65 5871 8589" /* .Š€w‚ˆtnƒ—ŒeXq…‰ */ $"91AA B587 5C53 6776 675A 6B9C B5A6 928C" /* ‘ªµ‡\SgvgZkœµ¦’Œ */ $"7E64 5061 899C 8E70 7689 8478 7D88 7772" /* ~dPa‰œŽpv‰„x}ˆwr */ $"8494 916F 5B66 7F8A 90A0 B38E 655B 6574" /* „”‘o[f.Š� ³Že[et */ $"6961 678D B1AC 948C 8269 5A63 7F96 9177" /* iag�±¬”Œ‚iZc.–‘w */ $"6E83 897B 7882 7774 8792 9077 6563 788D" /* nƒ‰{x‚wt‡’�wecx� */ $"9198 AB94 6C63 6972 6D61 657D A7B0 9489" /* ‘˜«”lcirmae}§°”‰ */ $"816D 626B 7C8F 8E7F 6C7A 8C81 797E 7976" /* �mbk|�Ž.lzŒ�y~yv */ $"8894 8B7A 6861 6E89 9494 A096 7569 6F70" /* ˆ”‹zhan‰”” –uiop */ $"6E65 6674 99B1 9A8A 8171 6671 7E89 8B83" /* neft™±šŠ�qfq~‰‹ƒ */ $"7073 8A85 7777 7675 8597 8D7E 6F66 6A84" /* psŠ…wwvu…—�~ofj„ */ $"9592 9894 7B6E 7776 6C66 6771 8CA9 9C8A" /* •’˜”{nwvlfgqŒ©œŠ */ $"8173 6975 8387 8683 7572 8589 7976 7475" /* �siuƒ‡†ƒur…‰yvtu */ $"8295 8F7D 726B 6A7E 9394 9290 7E71 797E" /* ‚•�}rkj~“”’�~qy~ */ $"7068 6870 849E 9D89 8076 6D74 858B 8481" /* phhp„ž�‰€vmt…‹„� */ $"7872 808B 7E76 7575 7F91 937F 746D 6B79" /* xr€‹~vuu.‘“.tmky */ $"8C95 8F8D 8173 7781 7668 686E 8096 9D8D" /* Œ•���sw�vhhn€–�� */ $"8179 7174 838D 837F 7A74 7C87 8273 7374" /* �yqtƒ�ƒ.zt|‡‚sst */ $"7D8D 9584 756F 6F79 8692 8D89 8579 7882" /* }�•„uooy†’�‰…yx‚ */ $"7D6B 686D 7E8E 978E 807A 7676 808C 857C" /* }khm~Ž—Ž€zvv€Œ…| */ $"7A78 7B82 8477 7175 7D89 9389 7770 727A" /* zx{‚„wqu}‰“‰wprz */ $"818D 8D85 847D 7A81 8071 686C 7B88 918E" /* ���…„}z�€qhl{ˆ‘Ž */ $"8079 7A7B 7F8B 887C 7A7B 7D81 837A 7176" /* €yz{.‹ˆ|z{}�ƒzqv */ $"7C87 8F8B 7B72 747B 7C87 8C83 8180 7D83" /* |‡�‹{rt{|‡Œƒ�€}ƒ */ $"8476 6A6B 7984 8A8D 837A 7C7D 7E88 8A7E" /* „vjky„Š�ƒz|}~ˆŠ~ */ $"787A 7E7F 837D 7172 7B83 8B8B 8074 757D" /* xz~.ƒ}qr{ƒ‹‹€tu} */ $"7C84 8C84 7F80 7E82 867D 6F6B 7783 868B" /* |„Œ„.€~‚†}okwƒ†‹ */ $"857A 7B7F 7D85 8B80 7879 7F7D 8280 7673" /* …z{.}…‹€xy.}‚€vs */ $"7B81 888C 8577 747C 7C7F 8A85 7D80 807E" /* {�ˆŒ…wt||.Š…}€€~ */ $"8380 746D 747F 8289 887D 7B81 7E82 8A84" /* ƒ€tmt.‚‰ˆ}{�~‚Š„ */ $"797A 7F7C 7F81 7873 797F 8289 8A7C 767B" /* yz.|.�xsy.‚‰Š|v{ */ $"7C7E 8785 7D7E 817D 7F82 7A71 747B 7F87" /* |~‡…}~�}.‚zqt{.‡ */ $"8A81 7B7E 7F80 8787 7B78 7D7C 7C7F 7C76" /* Š�{~.€‡‡{x}||.|v */ $"787E 8086 8B83 777A 7C7F 8585 7F7C 807F" /* x~€†‹ƒwz|.…….|€. */ $"7D80 7E76 7679 7E83 8683 7C7C 8080 8385" /* }€~vvy~ƒ†ƒ||€€ƒ… */ $"7F79 7C7C 7D7F 7D78 787D 8082 8786 7C7A" /* .y||}.}xx}€‚‡†|z */ $"7B7F 8182 807C 7D80 7D80 8179 7779 7B80" /* {.�‚€|}€}€�ywy{€ */ $"8384 7F7B 7F81 8284 827B 7B7C 7D7F 807C" /* ƒ„.{.�‚„‚{{|}.€| */ $"797B 7E7F 8386 7F7B 7C7F 8181 817F 7C7E" /* y{~.ƒ†.{|.���.|~ */ $"7E7E 837E 7979 7B7F 8283 817C 7D80 8182" /* ~~ƒ~yy{.‚ƒ�|}€�‚ */ $"837E 7A7B 7D7E 7F7E 7C7B 7D7F 8186 827B" /* ƒ~z{}~.~|{}.�†‚{ */ $"7B7F 8181 8180 7C7D 7E7D 8080 7C7A 7B7E" /* {.���€|}~}€€|z{~ */ $"8183 827D 7C80 8181 8380 7B7B 7D7D 7F7F" /* �ƒ‚}|€��ƒ€{{}}.. */ $"7D7D 7D7E 8084 847D 7A7E 8081 817F 7D7C" /* }}}~€„„}z~€��.}| */ $"7E7D 7F81 7E7C 7C7C 8083 837F 7C7E 8081" /* ~}.�~|||€ƒƒ.|~€� */ $"8281 7D7B 7D7E 7F80 7F7E 7D7D 7F82 8580" /* ‚�}{}~.€.~}}.‚…€ */ $"7B7D 7F80 8180 7E7D 7E7E 7E81 807D 7D7D" /* {}.€�€~}~~~�€}}} */ $"7F82 8380 7D7D 8080 8181 7E7C 7D7E 7E7F" /* .‚ƒ€}}€€��~|}~~. */ $"7F7F 7E7D 7F81 8381 7D7D 7F80 8180 7F7E" /* ..~}.�ƒ�}}.€�€.~ */ $"7E7F 7F80 807E 7E7D 7E80 8180 7F7E 7F80" /* ~..€€~~}~€�€.~.€ */ $"8081" /* €� */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Whip.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Whip.r new file mode 100644 index 0000000..4ffc5a6 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Whip.r @@ -0,0 +1 @@ +data $8014 (0x18024) { $"0100 0100 0000 4700 0000 0457 6869 70" /* ......G....Whip */ }; data $8024 (0x47) { $"0000 0900 E88E 0000 772B 8080 8080 8080" /* ..Æ..Ž..w+€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"8080 8080 8080 8080 8080 8080 8080 8080" /* €€€€€€€€€€€€€€€€ */ $"7E80 827E 7F85 817F 7B83 8180 7F7D 7C82" /* ~€‚~.…�.{ƒ�€.}|‚ */ $"7E7A 7D7C 807C 7E80 7F7F 8082 807F 8182" /* ~z}|€|~€..€‚€.�‚ */ $"8180 807F 7D7A 7F80 7C7D 7D7B 7F7B 7979" /* �€€.}z.€|}}{.{yy */ $"7C79 787C 7A78 777E 7F78 7A82 817B 7D7E" /* |yx|zxw~.xz‚�{}~ */ $"807E 8282 7D80 7F83 8185 8282 8384 7D7E" /* €~‚‚}€.ƒ�…‚‚ƒ„}~ */ $"8384 8181 8483 8280 8385 7F81 8185 8082" /* ƒ„��„ƒ‚€ƒ….��…€‚ */ $"817F 8287 807E 7F80 8480 7E82 8081 8581" /* �.‚‡€~.€„€~‚€�…� */ $"8286 8380 8484 8280 837C 7E7E 8082 7A7B" /* ‚†ƒ€„„‚€ƒ|~~€‚z{ */ $"7A7A 787A 7674 8078 7B79 7882 7F7A 7E83" /* zzxzvt€x{yx‚.z~ƒ */ $"7F7E 8183 8782 827F 827D 7E82 7A79 777B" /* .~�ƒ‡‚‚.‚}~‚zyw{ */ $"7D74 777A 7E7A 7C80 7C81 8187 8383 7F7D" /* }twz~z|€|��‡ƒƒ.} */ $"8679 7879 777F 7D77 7B81 8280 7F7D 8281" /* †yxyw.}w{�‚€.}‚� */ $"7D82 807F 8288 8A85 8181 817B 7E7F 7A79" /* }‚€.‚ˆŠ…���{~.zy */ $"7C74 726F 7276 7B76 6D7A 7A7C 7D7C 7E81" /* |trorv{vmzz|}|~� */ $"8282 8583 8284 8989 8483 8884 7D79 7D72" /* ‚‚…ƒ‚„‰‰„ƒˆ„}y}r */ $"757B 7076 777D 7279 877F 7B7F 8782 7D8C" /* u{pvw}ry‡.{.‡‚}Œ */ $"8F89 888A 8A7C 7E81 827D 8282 8087 8986" /* �‰ˆŠŠ|~�‚}‚‚€‡‰† */ $"8482 8D7F 7E84 8079 7B7B 7767 7178 6D66" /* „‚�.~„€y{{wgqxmf */ $"7274 7268 6C75 7C7A 7C80 8289 8A91 8B93" /* rtrhlu|z|€‚‰Š‘‹“ */ $"8B86 948A 8489 8982 868D 8478 7E82 7876" /* ‹†”Š„‰‰‚†�„x~‚xv */ $"7F86 7882 7E81 7880 8180 7C6C 6C6C 6C63" /* .†x‚~�x€�€|llllc */ $"5E70 766B 7D87 8C87 9BA2 9D9C 9D95 9BA1" /* ^pvk}‡Œ‡›¢�œ�•›¡ */ $"9B8F 887A 867A 6F72 686A 646F 7C6B 778B" /* ›�ˆz†zorhjdo|kw‹ */ $"7964 6D72 706E 6D73 7B73 777E 817F 8189" /* ydmrpnms{sw~�.�‰ */ $"7C7C 888E 8C98 8A89 746D 7D56 5E5C 6263" /* ||ˆŽŒ˜Š‰tm}V^\bc */ $"6688 898C 9298 9597 9E86 8B8F 7F72 7E7A" /* fˆ‰Œ’˜•—ž†‹�.r~z */ $"6A76 848D 7B7A 9394 8D8C 908D 9092 7554" /* jv„�{z“”�Œ���’uT */ $"7E7E 575B 6564 5A67 7470 7F9E A0A3 A4BD" /* ~~W[edZgtp.ž £¤½ */ $"C39D AA96 888D 8D76 6063 6C66 4765 4F34" /* Ã�ª–ˆ��v`clfGeO4 */ $"446A 8990 808D 7285 AABF A079 9884 887E" /* Dj‰�€�r…ª¿ y˜„ˆ~ */ $"5E6E 5B5C 6D6E 7A82 92BC E7D3 C6CA C3AE" /* ^n[\mnz‚’¼.ÓÆÊî */ $"826D 7649 0B0B 192D 172E 301B 4A7D A68C" /* ‚mvI...-..0.J}¦Œ */ $"7CCF F8F1 E4B4 BA99 6681 5E4F 5554 4459" /* |Ï...´º™f�^OUTDY */ $"5F4B 5E74 98C1 C3C8 A2C8 B8A4 A2C2 AE94" /* _K^t˜ÁÃȢȸ¤¢Â®” */ $"8173 846C 676A 6585 8D66 4926 1F24 2145" /* �s„lgje…�fI&.$!E */ $"3D37 5F9D 9BB5 E0C8 D1EF E69C 88A7 886F" /* =7_�›µ.ÈÑ..œˆ§ˆo */ $"8779 4B48 5941 3B51 97A1 875F 576A 909A" /* ‡yKHYA;Q—¡‡_Wj�š */ $"6672 A495 8896 B4B4 A9A6 995D 4A45 2554" /* fr¤•ˆ–´´©¦™]JE%T */ $"7825 3878 7462 78BA 868B A5A1 8D80 A3C7" /* x%8xtbxº†‹¥¡�€£Ç */ $"B18F CBAC A4B0 B0AD 9381 5131 112B 4348" /* ±�ˬ¤°°­“�Q1.+CH */ $"4A4C 92AC 7A79 98BE 9567 8694 6024 3545" /* JL’¬zy˜¾•g†”`$5E */ $"3D46 8982 B8E6 ECF8 E1B8 9692 583F 2A01" /* =F‰‚¸....¸–’X?*. */ $"020F 3255 8480 C1FD FFF4 CEF7 CB3E 3C53" /* ..2U„€Á...Î.Ë>-B.$7l°Ã.ÓÀ.lYF */ $"1A3B 404C 7882 8280 D9DC FDB7 A190 5F53" /* .;@Lx‚‚€...·¡�_S */ $"1E6E 357B 4D64 3A70 613A 4A46 7DCB A8DD" /* .n5{Md:pa:JF}˨. */ $"D9D3 DB8B 5942 2433 3735 699D D3E6 D0C8" /* .Ó.‹YB$375i�Ó.ÐÈ */ $"E3A2 4F21 1F43 5334 513D 94B3 A7CE A6DA" /* .¢O!.CS4Q=”³§Î¦. */ $"E9CF A74E 9849 897F 6165 9A56 518E 7A61" /* .ϧN˜I‰.aešVQŽza */ $"5E46 3D72 867D B7F4 CA95 9C8F 7A71 5659" /* ^F=r†}·.Ê•œ�zqVY */ $"5483 7963 86A9 CFB7 8A4E 659A 3A49 124C" /* Tƒyc†©Ï·ŠNeš:I.L */ $"7394 9CA6 8F7A AA94 6E46 5389 6D76 988D" /* s”œ¦�zª”nFS‰mv˜� */ $"BC93 5B7B A48C 708D 7882 8053 B48E 6F73" /* ¼“[{¤Œp�x‚€S´Žos */ $"507D 494A 92AB A0A3 B9D6 EDD6 A197 975E" /* P}IJ’« £¹Ö.Ö¡——^ */ $"423A 2330 3354 798C A6A4 A988 825D 7968" /* B:#03TyŒ¦¤©ˆ‚]yh */ $"4365 535E 7A79 8891 BD8F 8F87 879E 7279" /* CeS^zyˆ‘½��‡‡žry */ $"875D 6943 5559 8273 8299 ABB5 A8CA AD9E" /* ‡]iCUY‚s‚™«µ¨Ê­ž */ $"8A95 834B 3B54 7248 4A60 62A4 AEA6 6F9D" /* Š•ƒK;TrHJ`b¤®¦o� */ $"A68C 6684 7372 5D73 8A5F 7EC9 836D 7791" /* ¦Œf„sr]sŠ_~Ƀmw‘ */ $"816C 8290 736F 8667 4F45 545C 5B84 A9B3" /* �l‚�so†gOET\[„©³ */ $"BAB9 D4B3 B695 6755 462E 3454 4E5A 7895" /* º¹Ô³¶•gUF.4TNZx• */ $"C9B6 A7C0 A478 8686 7269 5598 6D76 B79F" /* ɶ§À¤x††riU˜mv·Ÿ */ $"9696 958B 5F64 5D32 3F65 5C72 8D98 99BB" /* ––•‹_d]2?e\r�˜™» */ $"CCA7 8893 905C 7757 5E48 6D73 566C 797B" /* ̧ˆ“�\wW^HmsVly{ */ $"9D9B 7EA8 9B80 918F 7591 7373 685F 7264" /* �›~¨›€‘�u‘ssh_rd */ $"6A7E 8B94 778A 9D8A 6A76 837B 967C 868D" /* j~‹”wŠ�Šjvƒ{–|†� */ $"847B 666D 7260 707F 8389 9CAE B5B6 B1A5" /* „{fmr`p.ƒ‰œ®µ¶±¥ */ $"866B 4E3D 3D40 3F4A 5D63 7B97 C1B6 A3AA" /* †kN==@?J]c{—Á¶£ª */ $"9B8E 8D72 7059 5E67 6677 7172 7381 9797" /* ›Ž�rpY^gfwqrs�—— */ $"98A6 9587 999A 726E 6E6C 8A81 7778 929B" /* ˜¦•‡™šrnnlŠ�wx’› */ $"9596 918A 916A 5D50 6459 6066 7885 9298" /* •–‘Š‘j]PdY`fx…’˜ */ $"9E8A 9D8C 7578 5E57 4846 5875 7067 6A8C" /* žŠ�Œux^WHFXupgjŒ */ $"9088 928F 8B8F 7D8C 8F7C 5466 6D6B 6578" /* �ˆ’�‹�}Œ�|Tfmkex */ $"7D8A 8EA0 949F 9790 8A8D 7E78 7583 797F" /* }ŠŽ ”Ÿ—�Š�~xuƒy. */ $"958D 8778 7E84 7680 7F93 9C9E 9A97 A086" /* •�‡x~„v€.“œžš— † */ $"857F 787F 7A70 6A78 9087 867C 7790 836B" /* ….x.zpjx�‡†|w�ƒk */ $"5D73 807B 7484 9295 9D8E 918D 7674 5663" /* ]s€{t„’•�Ž‘�vtVc */ $"6E6B 635D 7881 827E 9599 8470 7881 6F73" /* nkc]x�‚~•™„px�os */ $"6C66 7465 6974 7D85 878A 7F84 816D 6C74" /* lfteit}…‡Š.„�mlt */ $"7761 7380 737D 8977 7288 9292 8F8F 8E89" /* was€s}‰wrˆ’’��މ */ $"8B79 6E69 7267 6C79 7C83 8D93 A29B 959A" /* ‹ynirgly|ƒ�“¢›•š */ $"8184 7C7B 7B7A 808D 8D8F 8B90 8687 8D90" /* �„|{{z€���‹�†‡�� */ $"8995 908D 9689 7269 716C 6667 7586 867D" /* ‰•��–‰riqlfgu††} */ $"8689 8785 847B 7E75 5E64 6365 6A73 848F" /* †‰‡…„{~u^dcejs„� */ $"8687 8B83 7A7A 7765 5A73 6E62 6C7F 8788" /* †‡‹ƒzzweZsnbl.‡ˆ */ $"7E7F 8883 748D 877A 888D 8C78 7179 7C86" /* ~.ˆƒt�‡zˆ�Œxqy|† */ $"7776 7E7F 7C8F 8180 8087 8990 7A78 8987" /* wv~.|��€€‡‰�zx‰‡ */ $"8E80 838A 948E 888D 8387 8879 7E80 7C69" /* Ž€ƒŠ”Žˆ�ƒ‡ˆy~€|i */ $"6A7E 6B63 718B 816E 7794 827E 908F 9184" /* j~kcq‹�nw”‚~��‘„ */ $"7F82 8167 686F 706C 6B7F 8A7C 828D 927D" /* .‚�ghoplk.Š|‚�’} */ $"7D7E 7B6F 737C 767F 767D 838B 837B 7F8D" /* }~{os|v.v}ƒ‹ƒ{.� */ $"837B 878B 767B 8272 7281 7977 8089 827F" /* ƒ{‡‹v{‚rr�yw€‰‚. */ $"8789 8385 7E81 7670 7173 7A7B 817A 8A94" /* ‡‰ƒ…~�vpqsz{�zŠ” */ $"877D 888F 8681 8579 747A 7C75 737F 7D88" /* ‡}ˆ�†�…ytz|us.}ˆ */ $"8D84 8489 7E7C 7E81 7E79 7C7D 7781 817F" /* �„„‰~|~�~y|}w��. */ $"7B7E 8080 7F83 807D 7E81 7975 7575 7273" /* {~€€.ƒ€}~�yuuurs */ $"7478 7C82 8186 857C 7A7D 8079 7B7E 7E7B" /* tx|‚�†…|z}€y{~~{ */ $"848A 807E 8285 807B 8184 8076 8188 8284" /* „Š€~‚…€{�„€v�ˆ‚„ */ $"8781 8888 847F 8486 7D7C 7F7A 7D80 817C" /* ‡�ˆˆ„.„†}|.z}€�| */ $"7985 867A 7B7D 8382 7E84 817A 7578 7C7C" /* y…†z{}ƒ‚~„�zux|| */ $"797A 7D75 7C83 7E7B 7E81 8683 887F 7C7E" /* yz}u|ƒ~{~�†ƒˆ.|~ */ $"797C 7777 7980 837D 7F82 7D7D 7D7E 7F7D" /* y|wwy€ƒ}.‚}}}~.} */ $"7D7E 817F 817C 8085 7D7B 7F80 7E7D 8285" /* }~�.�|€…}{.€~}‚… */ $"898D 8B8B 8584 7D78 7373 787D 7E80 8587" /* ‰�‹‹…„}xssx}~€…‡ */ $"867F 8384 7E79 7C7C 7674 7A7B 7D7B 7B77" /* †.ƒ„~y||vtz{}{{w */ $"7B7E 7D78 7B80 8382 7E81 8382 7D80 8281" /* {~}x{€ƒ‚~�ƒ‚}€‚� */ $"7B7B 827B 7B7A 8180 7F7E 817B 7A7E 817F" /* {{‚{{z�€.~�{z~�. */ $"7D81 8182 8484 7F83 807B 7A7C 7D7A 7D81" /* }��‚„„.ƒ€{z|}z}� */ $"8180 8183 7D80 8784 7D7B 8281 7E80 7C7A" /* �€�ƒ}€‡„}{‚�~€|z */ $"7979 787A 7F7E 7C82 8384 8581 7D82 817C" /* yyxz.~|‚ƒ„…�}‚�| */ $"7B81 7F7E 7F80 8384 8180 8081 7B7C 7C7D" /* {�.~.€ƒ„�€€�{||} */ $"7B7C 7D7F 7B7C 7F7F 7C7B 7B81 7F7C 807F" /* {|}.{|..|{{�.|€. */ $"7D7F 7F7F 7D7B 7A7A 7C7B 7E81 8082 8084" /* }...}{zz|{~�€‚€„ */ $"8581 8180 7F7E 7A7B 7E7F 7C7D 807F 807F" /* …��€.~z{~.|}€.€. */ $"7C7E 807F 7B7E 8282 8283 827F 7E7E 8181" /* |~€.{~‚‚‚ƒ‚.~~�� */ $"7E7F 8181 7F80 7E7B 7A7C 7978 7A7C 7B7D" /* ~.��.€~{z|yxz|{} */ $"8487 8385 8482 807F 7D7C 7B7E 7C7B 7F7F" /* „‡ƒ…„‚€.}|{~|{.. */ $"7D7D 8083 807F 8080 7E80 8281 7F7F 807F" /* }}€ƒ€.€€~€‚�..€. */ $"7B7C 7B7C 7D7A 7C80 7E7D 7F7F 807E 7F80" /* {|{|}z|€~}..€~.€ */ $"7D7E 8080 8080 8182 817F 7E7F 7E7E 7E7E" /* }~€€€€�‚�.~.~~~~ */ $"7E7E 7E81 7E7F 7F7E 807E 7E7D 7C7E 7F7E" /* ~~~�~..~€~~}|~.~ */ $"8080 7E7C 817F 7D7D 7D7A 7C80 7E7C 7F81" /* €€~|�.}}}z|€~|.� */ $"8080 8281 7F80 807F 7E7E 7C7F 8080 7F7E" /* €€‚�.€€.~~|.€€.~ */ $"7F7F 7E7E 7F81 807E 7E7F" /* ..~~.�€~~. */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Whoosh.r b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Whoosh.r new file mode 100644 index 0000000..f40bd16 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/Sounds/Whoosh.r @@ -0,0 +1 @@ +#ifdef MacStyle #include "SysTypes.r" #else #Include "TypesIIGS.r" #endif #ifdef MacStyle resource 'snd ' (6157, "Whoosh", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 5164, 0x2B7745D1, 5162, 5163, 0x0, 0x3C, #else resource rSoundSample (1, "Whoosh") { 0, 21, 0x8EE8, 0, 11127, #endif $"8686 8686 8686 8686 8585 8585 8583 8383" $"8383 8282 8281 8080 8080 8080 8080 8181" $"8282 8281 8281 8181 8182 8383 8485 8484" $"8484 8383 8281 807F 7E7E 7D7D 7D7D 7D7E" $"7E7F 7E7E 7D7D 7C7B 7B7C 7D7E 7F81 8283" $"8485 8584 8383 8280 7F7E 7E7E 7E7D 7D7D" $"7D7C 7C7B 7A7A 7978 7878 7979 7C7D 7F80" $"8183 8382 8281 8280 8080 8181 8182 8283" $"8484 8485 8484 8585 8484 8484 8484 8484" $"8484 8585 8585 8585 8584 8482 8281 807F" $"7E7D 7B7B 7B7B 7B7C 7E80 8183 8586 8888" $"8988 8785 8280 7E7D 7B7A 7A7A 7A7A 7B7C" $"7D7E 7E7F 7F7F 8081 8283 8383 8484 8383" $"8281 8180 7E7D 7C7B 7979 7979 7979 7979" $"797A 7B7D 8082 8587 898A 8B8B 8B8A 8987" $"8685 8483 8280 7F80 807F 8081 8283 8385" $"8586 8686 8585 8482 8180 7E7C 7A79 7775" $"7576 7778 7B7E 8285 898C 8E91 9293 9290" $"8D89 8580 7C78 7673 7272 7273 7577 787A" $"7C7E 7F82 8485 8687 8788 8887 8786 8686" $"8583 817F 7D7B 7978 7674 7474 7474 7678" $"7B7F 8385 898B 8B8B 8988 8584 8280 7F7F" $"7F80 8082 8384 8688 898A 8A8A 8989 8785" $"8382 807E 7C7B 7A79 7979 7979 7A7B 7D7F" $"8081 8384 8686 8788 8989 8988 8784 817E" $"7A77 7470 6E6C 6B6B 6C6F 7277 7E84 898E" $"9294 9594 9391 8E8A 8785 827F 7E7B 7A7A" $"7A7B 7D7E 8184 8689 8C8D 8D8D 8D8C 8985" $"8381 7F7D 7B79 7878 7778 7979 7B7D 8082" $"8386 898B 8C8E 8D8C 8986 827E 7975 716D" $"6B6A 6A6D 7074 7A80 8589 8C8E 8F8F 8D8C" $"8A87 8481 7E7C 7B7B 7A7B 7D7E 8082 8283" $"8383 8485 8687 8787 8787 8585 8382 8180" $"7E7C 7B79 7877 7779 7A7D 7F81 8588 8C90" $"9394 9593 8F8A 847E 7770 6B68 6666 686B" $"7076 7D83 888B 8D8F 8F8C 8A86 827E 7976" $"7474 7476 7A7D 8084 8585 8481 807E 7E7E" $"7F7F 8081 8384 8586 8787 8685 8381 7D7A" $"7775 7474 7476 787B 8085 8C90 9496 9694" $"908A 857E 7772 6D69 6767 676A 6E74 7B84" $"8B91 9698 9896 928C 857E 7872 6D6A 696A" $"6C70 7479 7E83 8689 8A8A 8A88 8582 7F7D" $"7D80 8488 8D91 9392 8F8A 837D 746D 6762" $"5F5C 5C5D 6268 7380 8E9B A7AF B0AC A499" $"8A7D 7165 5D58 5658 5C63 6A74 7D84 8A8F" $"9091 8F8C 8883 7E7B 7A7B 7E81 868A 8C8C" $"8A87 8380 7A76 726E 6B69 6767 686A 6F76" $"7D86 8F96 9A9B 9994 8D85 7D74 6D67 6361" $"6165 6971 7A84 8E96 9C9F 9E9A 9289 7E75" $"6D69 6869 6D73 797E 8387 898C 8C8A 8783" $"7F7A 7672 6F6B 6B6A 6B70 767D 8388 8C8D" $"8D8B 8783 7E7A 7773 7272 7377 7C82 898F" $"9396 948F 8980 7770 6A67 696F 777D 858B" $"8F92 9494 918C 8680 7873 6F6E 7176 7E87" $"9098 9D9F 9C97 8D83 776D 6765 6870 7781" $"8A91 979D A09E 9B93 8B7F 7770 6D6D 7177" $"7E85 8C92 979A 9A97 9189 8179 7574 777B" $"8187 8C91 9597 9898 938D 857D 7672 7072" $"7579 7E84 8991 979B 9D9C 9791 8984 807E" $"7F80 8387 898A 8A8D 8E8D 8C89 8581 7C7A" $"7978 797B 8085 8C92 9698 9692 8B84 7F7C" $"7B7C 7C7E 8182 8384 8788 8787 8684 8381" $"8080 7F7E 7D7F 8287 8C90 9190 8C85 7F7B" $"7877 7878 797A 7B7D 8083 8484 827F 7E80" $"8285 8889 8884 7E79 7573 7477 7A7D 7F80" $"8182 8383 8383 8487 8889 8785 827F 7A75" $"7170 6F72 7578 7B7C 7E7F 8181 8181 8182" $"8283 827E 7A76 7576 797F 868C 908E 8982" $"7B76 7272 757B 8491 9CA6 ABAA A193 826F" $"5E54 525B 6977 858F 9597 9694 908B 857F" $"7975 767A 7E84 888A 8A87 8484 8485 8888" $"8684 8181 8286 8A8D 8C86 7C72 6D6E 7580" $"8C93 9595 9390 8C87 817B 7979 7D83 888B" $"8E8E 8B83 7C75 7273 7478 7E85 8A8C 8C88" $"827D 7774 7477 7F8A 959A 9892 897E 736C" $"6B6E 757D 8589 8C8A 8681 7C7C 8185 8787" $"8684 827E 7975 7272 7273 7576 7878 7877" $"7775 7780 8C98 9F9C 8F7E 6B5E 5960 7184" $"939D 9D95 8878 6C67 6970 7B86 9197 9B9B" $"9992 8A7F 7368 6262 6C7A 8992 9492 8B84" $"796E 6768 6F78 8088 8C8C 8A87 8786 8582" $"807C 7A7A 7775 7376 7A7F 878E 908C 8174" $"6761 636D 7B88 9093 979B 9F9E 988D 8074" $"6E6F 747B 828A 908F 877C 726D 6D71 7882" $"8C91 928E 8781 7E7A 7776 7881 8E98 9B98" $"9086 7B70 6A6B 727D 878C 8B89 837E 7977" $"7A82 898C 8A86 807C 7772 7071 7986 939A" $"9A96 8C7D 6C5F 5C61 6F80 9099 9E99 8F82" $"7772 7579 7C7D 7C7C 7D7D 7B7A 7A7D 8083" $"8584 827C 7469 605B 5E6C 8094 A1A4 9C8D" $"7A6B 6469 757E 8487 8784 7F77 7474 777A" $"7C7E 7D7B 7670 6963 5D5E 6A80 96A7 AA9F" $"8B72 5F56 5E72 8592 9998 8F7F 6C60 5F65" $"727F 8A8F 8D87 817E 7E7E 7F80 7F80 8083" $"888F 9190 8F8B 857A 6B61 626A 7783 8C8D" $"8980 7B79 7B80 8386 8788 857F 7875 7677" $"787A 7B7A 7878 7D84 8C8F 8C80 6C58 4E57" $"7191 ACB4 AA93 765F 5459 6B82 959E 9A8D" $"7C6C 6468 727F 888D 8D89 827B 797C 8387" $"857F 7A77 7A83 8C8D 8884 827D 7263 5C63" $"7384 9298 9489 7B6F 6B71 7C88 9194 9591" $"877A 726F 6E6E 7377 7877 7881 8F9D A5A4" $"9577 5743 4862 8AAE BDB5 9A79 6053 5465" $"7D95 A098 8979 6E6B 737F 898D 8B87 827C" $"7677 7F8B 918D 8075 6C6C 767F 817E 7E82" $"837B 6C65 6975 838F 9595 9087 7C75 757A" $"828A 9096 968E 8277 6F69 676D 7881 8586" $"8687 8786 847F 7267 6165 7387 9A9D 907A" $"665F 626C 7C8A 9390 8377 7579 828C 9290" $"8881 7E7A 7774 7173 7E86 8579 7070 7985" $"8B84 7A75 7B82 867F 7876 797F 888F 9394" $"9088 807B 7979 7E87 9198 978F 7F6E 615C" $"667C 909B 988C 7A6A 605F 676F 7982 8483" $"8484 7C6A 5954 5F73 8592 958D 7E6F 6A76" $"8797 A09C 8D7C 726F 7076 7D7C 7776 7571" $"6867 7383 9197 8F83 7A79 7B7B 7771 7076" $"7F8B 9190 8578 7177 838C 908E 8780 7E80" $"7F79 7166 616A 767E 7977 8192 A0A4 9682" $"716E 7A8C 958E 827A 7A83 8B8E 8A83 7E7E" $"8180 7873 767D 868E 8F82 6A5B 5F73 8B9D" $"A096 846E 626A 7D90 9892 8475 6D72 859F" $"ADA0 7F60 5564 84A2 A899 7F6B 6A78 8C96" $"907D 685D 6071 8794 9487 7563 5A5F 6B78" $"8083 7E73 6B6F 7E8E 958B 7767 6A7B 8E94" $"8A78 6964 6975 8288 8277 7380 95A2 9C8A" $"7B75 7677 7982 8B8C 857A 7779 7C7E 8287" $"8C8F 8A7D 7473 7A8C 9D9C 8766 515B 7B98" $"A49B 8368 565B 7793 9C90 7D6F 6F79 838F" $"9EA7 9A77 5851 6797 CADC C48D 5038 5086" $"B3BE A775 4C44 6192 B3B6 976D 4F51 708D" $"9385 715C 4E4F 6991 B0AF 8B59 3842 70A0" $"B09B 795D 576A 889C 9D8D 7C76 7F91 9A8D" $"7B74 7A7E 7366 6F87 948E 7B6E 6969 707D" $"8D98 9E99 8A77 6B6C 85A1 A897 7457 5A7A" $"969E 9275 584D 5C80 9DA2 8F79 6A6B 757D" $"848A 8F8E 7F6D 6267 85B1 CDC4 9551 2838" $"72AD C3AF 7A4B 3F5C 92B8 BCA0 7E69 718F" $"A091 735C 5A65 6E77 8692 9182 6D6B 7888" $"9496 8E84 8081 858A 8881 8286 847E 7470" $"7888 918A 7C69 5954 5E77 909A 8C72 5E62" $"788B 989C 988B 7668 6A7B 9ABE CCBA 8B4F" $"344B 82B4 C8B8 7F44 3257 9FD3 D8B0 805F" $"648B A293 6B47 3C4D 6988 9C9C 8D75 616A" $"87A5 B4AA 8C72 6870 8497 988A 7A70 6E75" $"808C 8F8A 8074 6F6E 6C66 5F5F 718A 917D" $"5F55 6580 9DAF A688 6A5F 657A 94AD B19B" $"7353 4F69 8CA3 ACA9 8B5D 4765 A4D5 D8AF" $"8876 7887 8A79 6C6E 716A 6168 829F A283" $"615F 7A9D ACA1 938A 7961 5E79 989B 8062" $"5E78 98A6 9B86 7976 7779 7E80 7766 6278" $"9398 7D5A 4D60 89AB A47E 5E57 657D 8E93" $"8D79 5D57 6B86 938A 8897 9A7B 6378 A5CE" $"D0AC 908A 8882 7260 6D96 A688 5847 67A1" $"B590 6255 6D93 9E93 96A0 8B5A 435F 90A2" $"845E 5C7E A3A6 8D79 7C8C 8C7D 7987 9493" $"867F 8EA1 9A73 4E4D 6A82 7D66 5A65 7D8F" $"8B81 858B 765D 6483 A1A6 9B9B 957E 7472" $"707B 949F 834E 4071 B0BB 8F67 5D6F 8C98" $"9086 8784 7166 738E 9E91 7D71 7688 9AA5" $"9785 8991 9291 979C 8765 6187 B0B3 8041" $"2D50 8192 7F62 5966 828F 877A 7667 5A62" $"707C 7C86 9D9A 766B 767F 858F 967E 4439" $"7BBF BE8C 6B69 7889 938B 7368 798D 9790" $"8C92 99A0 8A68 5C7C AFAC 8881 95A8 A298" $"9B7D 4B41 6591 A88D 5537 58A1 C7B2 7C57" $"5172 9EA6 8863 526C 9BAF B898 654D 6391" $"A078 4537 588F A38A 7074 878D 7A62 5961" $"7A99 AB9D 7D70 798E 9EA0 9472 4951 86A6" $"926E 6D87 9891 8377 685C 6988 9C8D 767B" $"8DA1 9B7D 6972 94A4 9685 8297 A696 785A" $"617D 7C6E 7C8A 673E 579D C1A3 6547 4E78" $"A198 745A 5377 ABB4 B28A 5857 8ECF C368" $"222D 67A3 AA82 6975 899A 9472 5451 78A4" $"AE9B 8A7B 7C96 AFAD 9066 4E69 908D 6650" $"6FA4 B99C 7667 6054 5C81 9A86 676C 8198" $"9E8B 7A73 7E94 9684 778C A595 664A 709E" $"8759 6186 744D 639E B790 554B 688B 977B" $"6D77 7B84 98A1 AF97 5F4F 88D1 C060 2D55" $"8995 8973 7785 7E78 817E 6B5F 7899 9485" $"8C86 7989 9E9B 8065 6682 9176 555D 90A7" $"8C76 7A84 7B61 608C A990 676E 909A 886F" $"7492 9D85 7382 A6B3 906F 5555 91CB 9F47" $"449A AB6F 5A7D A287 4C55 92AA 7D44 65AB" $"BB8E 6370 A6B0 6C41 7DD0 B652 4095 BD86" $"5C5B 8299 7851 678C 8F79 7888 796E 8E90" $"7579 8A88 7062 7C9B 915F 496F AB9E 625A" $"7F98 8D74 7190 9F8F 747A 9493 7759 67A4" $"B37C 6185 B8AE 7061 7982 828A 8985 7D82" $"8882 7C7B 7C79 889F 9D7E 7288 947E 6068" $"9EB7 835A 80D4 DE7D 4956 73A6 D3AB 534D" $"B1D2 8645 538F 966C 72A0 A16B 4C7A A59C" $"715D 7490 8E78 85AD A27C 575D 98C6 AA62" $"4D93 BE95 5753 91AA 7B67 95AF 753F 70AD" $"B27A 404C 8FAA 7145 80C2 AC57 4788 B1A6" $"7C58 5B8B B08F 6886 C4C0 7C68 9296 919E" $"7F58 71AE AE57 2B61 938D 686C A0B4 8444" $"4F96 C292 473F 7DB0 9558 619B A572 568A" $"B69F 655C 8EA1 7854 75A0 A6A0 856B 7890" $"A59E 6F5F 8491 713F 4E89 947C 6D76 94A8" $"9868 4B70 ADB2 7442 5BA5 BA70 416F 9C8C" $"648B BA99 505E B8B4 4F27 7AB0 9692 8967" $"6087 B3AA 735F 8184 6043 6997 967B 6B75" $"8B9B 8F76 6E71 8ABC A856 479A BF76 3E65" $"8D80 717F 8885 7279 9F8D 4B3E 85B1 937D" $"7B71 5E76 A8A5 7A6E 7E6C 4356 AAB2 8575" $"757A 7578 7D90 9F78 5DB9 DE72 3A8B BB7B" $"415C 7C74 7D72 5671 9895 7A5E 576A 8EA4" $"936F 6C84 776E 8B95 8780 7D71 5671 BDA5" $"5C6E 998E 654F 7C98 7A85 8773 7F89 866A" $"5384 B780 3864 AB96 6E7F 8883 7C6A 7A98" $"9276 669C B87E 3771 B18E 7E8F 7A6A 81A6" $"A47F 6871 7F76 6F7A 788B 8F72 7491 8F81" $"8C9A 6B54 CBEA 522F B1BB 4B4F A59A 5D8A" $"AE6A 4B93 BB69 3C67 856D 689F 9F73 6C8F" $"8D69 7A99 7556 7981 7496 A19B 8475 7F6D" $"628D 7364 AD9E 627F 7A71 8E82 707F 8660" $"709A 7B72 9D96 7074 8B6F 6292 AA66 73B9" $"B869 6697 9075 8190 9181 8492 836A 6C90" $"9D89 6552 7E9A 817C 9D91 8889 8668 59C4" $"DB35 34D5 B01C 62ED B745 96E9 7C26 8EDE" $"571D 78A0 5232 A3C3 7A5D A4A3 506B AC6C" $"3B85 A779 7695 BE94 6377 6A64 9461 5AB9" $"A462 8878 6391 9774 6981 7074 927A 7498" $"946F 7699 7157 96B2 6370 BBB8 7367 8B91" $"7775 9097 7E80 967E 6278 9589 7776 7582" $"868B 8B76 6B91 8272 7C72 A1AE 4057 D9A2" $"376B ABA0 8E8E 9E97 5C75 B877 4D95 A55C" $"5398 8D63 81A8 835C 7486 696B 849B 9864" $"68BB 9A4A 656C 739F 6B57 A693 6F96 8D66" $"95BE 8B5D 8290 7379 8C85 8C8E 6D7A 9B6D" $"5999 B564 60B1 BD8B 5B7D 9E6E 6095 9974" $"87A2 7254 839E 6A61 9294 7B7B 9790 4F4C" $"9478 5F90 9078 7851 7CD8 9256 7467 88D6" $"8553 AE93 608D 9282 AD9D 6881 9159 51A4" $"A354 628B 6263 A283 779B 5D5B B792 4967" $"6C84 BD88 5998 866B 929D 82A4 AC7C 818C" $"6253 97A5 6B7A 855B 6C9D 777C AD6E 4994" $"9249 5C6F 80A3 8A61 8175 7796 A07E 94B2" $"9583 828A 8177 928E 848B 8B7B 607C 927B" $"9285 659F B977 5D99 844D 8DA3 6C6F 9E84" $"6A80 6D8D 9173 7061 6B8E 774F 94B9 6E69" $"906F 8995 8D85 7F9B 938A 7E77 8170 93AB" $"9983 6985 816F 7B7B 9182 5C7E C88C 3A95" $"A751 7D9D 7671 A9A1 735F 5C9F 7B78 9632" $"46D2 9331 A7CE 5272 9F67 9594 7A87 6F86" $"8D8C 736A 8F71 89B4 9C7F 688A 8973 7575" $"9085 6077 C790 3A8E 9E52 8699 7077 978C" $"806F 5B9A 9967 7F65 4E8D 9567 9197 6E93" $"8571 9078 868A 5C8D 9C84 876F 7576 8091" $"9A96 5286 9E7C 776A 7777 7C75 978F 6780" $"7E65 8A7C 7690 776B 9086 5F94 BD53 60A4" $"5C43 97A0 7A60 89B3 6C7B 865C 948D 5294" $"B17F 8D7B 5A72 876F 86A4 4E72 9D7F 797E" $"8556 7A9B 555D AA9B 7976 7780 8A9A 8269" $"8787 619A AC70 8989 6182 8968 93B0 4768" $"8F79 8D6F 6061 8C95 577A BA94 788B 644E" $"A7B6 7D76 7981 7599 A965 6B98 7A8C 956E" $"94AC 5C47 6777 906A 6E7F 7FA0 707B A994" $"94A0 5543 B29F 5D83 6E86 8E9A 9F65 7195" $"8D8C 847F 8C98 7C2E 5283 8366 7D95 6FA7" $"8A78 9495 AFB4 4539 B986 3F8D 668C A39C" $"956A 8889 9786 6293 7E77 9E2B 68A4 5D67" $"8582 5D95 9161 829D 999B 6967 B482 5371" $"889E 699D 9E7D 9D9C A66B 5CA5 6E6F A729" $"7FBC 4970 8A6B 5382 964A 6FA5 8182 8C94" $"AC7F 6D55 ADB1 2197 AE99 B0C7 A038 8BA7" $"4E95 6F4B A0AC 8A8D 825F 967F 6783 797B" $"8361 A59B 4A77 9385 6576 7975 7684 6492" $"9E74 9E9C 6065 AF9A 547A 949C 99B1 A453" $"949A 4C95 7927 94B5 7187 735A 8574 8470" $"7F90 548D CE7D 5A84 8F94 8172 599D 805F" $"47A1 B054 8FB4 5677 AC87 8561 7E9D 8AA0" $"9761 A08D 4793 7B25 91B5 6676 7169 7C6D" $"8A76 838B 5A80 C987 6181 7684 8A99 5683" $"9F3F 7699 7385 9079 8187 9890 6E84 87A4" $"9286 A27C 987E 5C8D 784B 75AD 7165 8077" $"746E 7D89 7F7C 7360 B991 7281 5172 8EBF" $"5768 BC20 A791 36B7 923A AC95 859D 4AA8" $"99A5 9F75 B08B 7D80 8685 6C81 62A0 9973" $"946E 8284 439C 7665 9A65 8B79 9E97 6180" $"6577 8B97 7B82 9F79 60A5 985E 926E 568E" $"7E82 4358 7A6C 9783 647E A99F 6E5C 946A" $"7CBC 5880 A251 987A 5EA4 8260 8079 9579" $"6AA0 82BE 86A1 9C7A 787C 9665 9B88 72A6" $"A368 997C 7B92 4C9B 6B68 8363 A171 9D99" $"6685 7668 8BA5 738C 8477 7C9D 9B80 9D4B" $"55AF 848A 3357 6555 A17D 6592 8DA4 6F45" $"D267 64AE 6098 8486 8962 8691 7383 565F" $"A459 8991 6ECE 6EC2 886E 6F7B AB4B BD8F" $"88AB A65C 9094 7497 549C 7265 6781 A069" $"A191 8873 956C 84B6 7588 6977 897C 8372" $"A76C 4E9C 739C 5E68 7055 976D 6F8C 7C90" $"6475 B965 63A3 7E80 8894 707B 8494 8674" $"7863 7779 835F 7BA1 83AF 8876 7C77 9562" $"AB83 80AB 9762 888C 6F88 6D8D 8E6B 6A96" $"886B 9493 A16E 9964 85C8 7B87 5471 8B65" $"6662 A396 508A 64AA 8F7E 8059 875C 8083" $"667A 58AC 9A64 6396 9C66 8AA0 5693 8297" $"9863 9C68 4C96 7F3C 8074 919A 8F81 886B" $"7C78 8477 6997 7289 8D69 6881 926D A08D" $"7494 6F89 8683 9C75 5677 856D 897B 8A80" $"8285 7D6F 728C 847A 6EA1 7E74 846F 6F71" $"8B75 B179 9094 5B7A 73A1 9C81 6350 92B3" $"8689 7168 728A 6868 6B96 7C8C 758F 7379" $"8471 777A 947A 9380 7A99 717B 7894 8F85" $"6A5B 92B4 8184 6467 728D 656E 7194 7B96" $"7B80 6F7E 8374 7E84 9B7F 7288 649E 877C" $"7F85 8184 6B79 9594 7F72 5F78 8581 7580" $"9279 8E86 7F79 8482 7879 7D91 7D7B 8070" $"9387 7C7E 8383 8A73 7886 8D7B 776B 7D81" $"887C 878A 7A87 897F 8187 817B 7678 867C" $"8478 7D88 877C 7E81 858D 777B 7D83 797B" $"7C80 7E81 7F85 837B 8283 8081 8380 7C7A" $"7D83 7D81 7B7E 8483 7E7F 8082 877B 7D7D" $"807B 7D82 807D 7E80 827E 7C7F 7F81 8180" $"7F7E 7E81 807E 7F7E 7F7F 7F7F 7F7F 7F80" $"7E7F 7F7F 7E7E 807F 7E7F 7F80 7F7E 7F7F" $"8080 807F 7F7F 8080 7F80 7F80 8080 8080" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F80 8080 7F7F 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8000" #ifdef MacStyle } #endif }; #ifdef MacStyle resource 'snd ' (5748, "hsoohW", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 5143, 0x2B7745D1, 5141, 5142, 0x0, 0x3C, #else resource rSoundSample (2, "hsoohW") { 0, 21, 0x8EE8, 0, 11127, #endif $"8080 8080 807F 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 7F80 807F 8080 8080" $"8080 8080 8080 8080 7F80 8080 8080 8080" $"8080 8080 7F7F 8080 807F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080" $"807F 807F 8080 7F7F 7F80 8080 7F7F 7E7F" $"807F 7F7E 7F80 7E7E 7F7F 7F7E 807F 7F7F" $"7F7F 7F7F 7E7F 7E80 817E 7E7F 8081 817F" $"7F7C 7E82 807E 7D80 827D 7B80 7D7D 7B87" $"8280 7F7E 8384 7E7B 817D 837D 7A7C 8083" $"8180 8382 7B83 857F 817E 807C 7B79 837D" $"7B77 8D85 817E 7C87 887D 7884 7C86 7876" $"7B81 8781 7F89 877A 8A87 7C88 817D 6B77" $"7B8D 8678 738A 8383 7E7C 8793 7080 7B7D" $"917D 7978 8284 797F 868E 7992 8075 8185" $"785F 727F 9495 796B 8481 857F 7C87 9E64" $"8872 7F9B 847E 7483 7E6F 807B 967B 9471" $"6E65 8D72 6764 8481 B492 5B6A 858F 9478" $"7B71 997A 8093 7A94 7A77 7184 7973 8F75" $"8C7C 966B 6868 8A72 6871 8986 B392 5063" $"819C A173 7A5B 9490 79B1 758B 716F 6F84" $"747E A16E 7A84 8C72 6F7D 8582 808A 7B89" $"6D85 7756 759C 8386 896F 9474 8DA0 6D92" $"8168 698D 8972 9769 7784 787C 6B88 818F" $"9A91 7480 3C7F 964C 689C 6398 9782 9356" $"A08A 669C 9663 649A AC58 7A66 8380 5C87" $"5980 7E8F AA64 8A50 96A3 6266 658B 7154" $"877B C885 6499 6EA1 9394 6B88 966A 6B8E" $"8D6D 886F 8C88 6297 AB80 83AB 6295 777C" $"7688 AF83 A17B 5F83 7977 6378 7486 9484" $"7B70 9488 807E A363 65B9 7564 907C 8C6F" $"6D97 5570 685E 9C73 9C4E 6CA7 7283 7C89" $"7769 8875 B684 6C95 7388 91A1 69A0 8167" $"6572 9C54 9774 9490 5CA6 AB88 8FBD 4BAB" $"7B6F 6E88 C26E CE6E 9189 59A4 5F56 8373" $"9186 6289 8684 9860 AE64 67D2 456F A48D" $"9265 7DA1 5565 5733 8A84 AF55 4B9D 809B" $"9D7C 7784 8C73 A58B 6876 8566 999D 71A1" $"6383 686B 9B4C 927B 7C99 68A3 A672 889B" $"6596 7C78 7A9C A186 BE82 A06A 7995 7980" $"6082 A45E 7A98 51A2 8058 BC7C 6A94 5C6E" $"9FA9 7E64 8397 6C7A 5843 827E 8E56 6E92" $"5E98 A560 799F 827B 978B 7765 8061 979E" $"798B 659A 6576 9C43 8482 6E94 7399 A062" $"816C 8586 807D 8BB0 759F A599 A84A 9D85" $"95AC 3A92 B736 91A7 20BC 6857 BF8E 7251" $"8172 91B9 6073 7C7F 897D 6E74 7780 6571" $"AD75 4B78 8D5C 7E98 7CA2 8692 A487 846E" $"9098 8781 7990 8573 9976 3F9F 8356 998A" $"8476 8161 87C9 805A 8B83 768A 6D7C 6971" $"7666 B591 257B 9347 8DA0 6197 A08A 9D7E" $"6185 87AC 7756 B48F 54B0 A147 5F80 9D59" $"7281 948F 845A 7DCE 8D54 907F 7084 7485" $"5A73 8771 B594 2779 954C 9A94 53A4 B199" $"9C94 7A54 9AAF 6560 9C9E 749E 9264 8476" $"7579 7665 8593 774A 9BA5 6183 7B79 8367" $"7F96 5F82 8D8A ACA0 4B6F 954E A78B 38A0" $"C7B0 99AE 9721 B1AD 556D 7FAC 948C 8281" $"A56F 4A96 8253 6B8A 7049 BC7F 29A7 6F6E" $"A55C 6BA6 9C9D 7D9E 9D69 9E88 7153 82B4" $"6769 9B99 9D82 6191 955D 8285 675D A468" $"2B9E 777E 9362 8697 8988 6A95 9CA3 8C66" $"8D3F 86B9 3945 B4AF 9594 788A A76F 957D" $"6683 8352 2E7C 988C 7F84 8C8D 9571 659F" $"9A8E 866E 835D 9FB2 4355 A094 94A9 7B70" $"A07F 7F6E 6A90 7767 475C AC94 6E95 8C7A" $"986B 65A9 9975 8179 767D B6A7 4E64 8B78" $"94BA 7A57 958C 6160 6F8D 798F 6847 B093" $"6889 8261 8989 70AC 9A61 8787 6982 9A8A" $"8077 7679 9BAA 5D55 9B7A 5685 7E79 7F9D" $"724E A486 6F87 725A 7B8D 7FB1 9452 8D94" $"5C86 7B6C B389 607A A097 435C A460 53BD" $"945F 8690 6B77 9076 7C8A 657E 8067 8F97" $"757C 7777 6A77 7C9E 8652 969A 9180 7675" $"6F87 849C 8D5C 8A86 7890 7185 936E 9791" $"6795 8D4E 657F 6799 9A5B 6F80 8C97 7770" $"9986 529E 8E3A 90C7 7760 8590 7575 7389" $"8A68 7F9C B489 718F 6A73 8C8D 866F 877A" $"9495 679F 7252 CEA7 3193 D246 3296 787B" $"9F5C 5F73 A1A9 7176 9D7D 51A7 953A 8CC8" $"7E5C 8291 7B7B 6F81 8569 8399 AB93 7081" $"777E 8A93 9B7F 858D 9589 6F90 696E B994" $"4F77 8E6B 6170 7391 8D6D 806A 849E 6F6C" $"A38D 4D84 995D 77B9 9F65 8592 7B92 7C60" $"7B8B 8B84 8E92 7781 8A82 8395 B294 7EA0" $"9677 7581 618A A380 6F5C 4992 9449 6EAD" $"7C77 9D6C 5B85 7A6B A597 5362 8C81 7CAC" $"A482 9D92 6B86 9859 88BD 846C 6749 92B7" $"5B5D 9B77 83A2 6362 8B62 54A3 A451 5991" $"8168 9DAD 8292 8D60 93AE 5385 D688 6774" $"5692 D87C 5178 7890 905F 7894 4C4F 9097" $"7B7B 9492 616A 9E83 5472 A287 7499 9560" $"6E9E 7D5B 8BBD B160 64B5 9959 6D9B 7A6D" $"8E8C 858C 7973 9082 5D8B BE95 668D 966F" $"93A6 576B 9F73 6C65 4A9A BB68 6498 9B84" $"6B69 8674 5C83 A881 638D 9853 5CA5 954D" $"77B8 755C 979E 8E8E A0AB 6B37 A2D9 5740" $"AEA1 727C 7282 916B 768B 8B86 8275 7677" $"8995 7862 7E96 807E 9790 7577 918B 6773" $"B8BB 7063 B296 5771 9976 6F94 9874 7A92" $"7470 8169 7497 9163 7888 62A4 B95A 6194" $"646A 7763 94BE 9576 79A7 853B 6CAC 6B50" $"A3A4 5D7A C3A3 3252 A078 1D57 DE8E 267C" $"E996 45B7 ED62 1CB0 D534 35DB C459 6886" $"8988 919D 7C81 9A7E 5265 899D 906C 6A83" $"9284 8191 9081 7590 9766 69B8 B973 66AA" $"9262 6F8B 7470 969D 727B 9A70 6086 7F70" $"828E 717A 7F62 9EAD 6473 8D62 6D7F 7584" $"9BA1 9674 8179 5675 997A 698D 8F6C 739F" $"9F68 6D85 673C 69BB 934B 6AAE 8A5D 9AA5" $"4F4B BBB1 2F52 EACB 546B 9A8C 818F 9174" $"728F 8B78 7A6F 767F 7168 7FA4 A681 6A7A" $"8F7E 8EB1 7137 7EB8 9C66 7692 987A 6A7C" $"8388 7F6E 96AB 6438 80B7 8453 6A86 897F" $"7387 857A 987C 4F65 8E99 6E5C A5BD 7156" $"717D 8087 958B 6E77 846C 6F93 A48E 6A57" $"5E7A 9598 7156 727D 747C 5C41 7BBB 8B3A" $"72DE B95D 789F 907D 7875 7A75 7585 B2AA" $"5643 6C7E 6E7A A5A8 765E 717B 7D93 B185" $"3E4B 8D9F 7972 8588 7F71 808D 653E 76BF" $"9A47 56A8 BC8A 716E 768F 9B8B 756B 7B96" $"9769 4360 8481 5F73 AAB3 8760 6789 9296" $"B07A 274F B4B8 5E50 99BA 8B64 8C9C 6F41" $"70BA A55B 4274 B2AD 704B 6898 A894 766D" $"7C94 894E 3F71 9184 5F6F 9EA5 9078 6B85" $"A0A6 A075 5478 A18E 5C65 9FB6 8A56 72A5" $"9B61 5895 B07D 3F47 92C2 964F 4484 B4A0" $"6C68 8D93 612B 57AE AE71 587F 9E91 9692" $"687C C0C4 8668 8FB0 8B5B 587C A6B1 8847" $"57AC C280 4571 AA8F 4C40 7AB2 AD70 3F75" $"AF95 677B AA91 5357 95BE 934D 62AA C698" $"5D57 7CA2 AD85 788E 9074 5D71 9CA5 7A4C" $"6BA1 A072 6C96 8F53 4586 D2B1 4D53 ABD3" $"A673 5649 7DDE D480 5A83 B79E 6860 7E94" $"8872 7E9D 9F88 797C 7B7C 8288 827D 8589" $"8A82 8279 6170 AEB8 8561 7CB3 A467 5977" $"9394 7A74 8F9F 9071 748D 987F 5A62 9EAB" $"6F49 5F91 9B7C 6270 888A 7975 908E 6E79" $"8878 798F 8C67 5178 9982 5B5C 86BD 9540" $"52B6 D07D 416C B0A6 7063 8EBB AB65 447D" $"AA92 554C 87A2 7D5A 6FAB 9A44 479F CB91" $"5555 6F90 B3A6 8273 859D 9274 6F88 9A90" $"6E67 90A9 8C60 617B 847A 768C A790 5D55" $"7691 8266 6580 9B9E 8979 868C 8594 9978" $"5F6B 7E81 787E 8577 7389 9589 552D 60C0" $"D188 4F5F 97AF A198 847B 776D 7B97 8B68" $"4B55 90B7 9E63 4D74 8661 5987 9E70 4A66" $"95A5 8C77 8496 947E 737A 8B9E 9881 6C67" $"869A 815C 5460 6776 9CB9 A46F 5066 8D90" $"694E 6690 ADAF 967C 7B8A 9BAE A478 5154" $"7294 9A89 7569 82AA A367 2D22 68C3 CF8E" $"5758 8AB2 B4AB 7753 5A74 98A1 784E 4765" $"A3C1 9D57 3E67 8A7C 6E7C 7D61 5A78 96A6" $"9782 8596 A494 7269 7D9B A18D 7B76 8D9C" $"8869 5C68 7783 9198 876D 6E92 A686 5149" $"7294 A09E 8E79 707D 9DAB 997A 6159 627A" $"8D87 7470 8AA3 8F58 3745 78A0 9163 4D65" $"98B8 AF9B 6C52 6388 A69E 7251 577C B2C7" $"A158 3755 8DA8 9165 414B 7D9B 98A2 A895" $"8188 ACAF 7C5C 688A A099 928C 9097 8D79" $"6873 8B93 8978 696B 8CBE BF7B 3944 7E96" $"8F85 7F76 6B76 9A9D 867C 7C70 625A 6776" $"7A87 8F82 6659 627F 9281 502D 4180 B3B0" $"8761 6587 9C97 9192 9189 8597 A59A 8876" $"717D 919E 8E73 6671 8487 8690 988C 6F5D" $"678F BBB0 7140 4E83 9F94 7B70 7274 7E95" $"9B9B A6A1 8364 5D76 8B85 818B 8F7D 655A" $"667D 826A 4D4E 739A A18E 7F86 9394 8779" $"7D8C 8C7C 798D A6A3 7E5C 5E84 A290 5F43" $"5A8B A096 939E 936D 5562 90B5 A167 4758" $"88A6 966D 6072 8288 8A90 ACD0 CEA5 7863" $"7B9A 9788 8A93 866B 575D 798D 938E 7D65" $"575E 7EA4 AB89 604D 5A7D 9893 7862 6677" $"807E 7977 7679 869B A698 785E 6280 9B98" $"795E 6179 8A93 A1AC 9D7A 5F61 83A2 9F82" $"6861 6A71 6E6C 798A 8778 7688 AFD8 D5A4" $"6547 5D8B A9AC A38C 694F 5373 9BB1 AD94" $"7A65 5F6A 88A6 AF9D 8065 555F 7D91 8A71" $"5F5F 666C 6E6F 7480 8A8F 8C80 756E 707A" $"8A98 9784 7068 728C AAB4 A587 6A61 758D" $"9C9C 8869 4D3C 476B 93A2 8B64 5F80 B0D8" $"D39F 5732 447F B8C8 B482 4B34 4F8B BACC" $"BE9A 7B6A 6876 8B98 9C98 8B78 625E 728C" $"9A90 775E 5459 697C 8A91 8878 7074 7E84" $"8682 8188 8A85 8180 848E 9694 8878 6B6D" $"8291 9286 776E 655A 5C73 91A0 8F71 697E" $"A0BC B892 5C3F 4B7A AFC3 AD72 3828 5195" $"C4CD B185 6762 6D7F 8E8F 8A84 7D75 6B6A" $"798F A29D 805C 4D58 7592 9E96 7A5A 5774" $"97A8 A185 6C6B 778A 999E 988D 7D70 6969" $"6E7B 8E94 876F 6673 7E7A 747B 8D9A 917F" $"767C 8D9D 9C88 6A57 5D79 9BB0 A070 4238" $"598B AFB0 9169 4F4E 5C71 8593 8D70 514F" $"6D97 B6B3 9261 444C 75A7 BEB3 8650 3850" $"8DC4 DCCA 9767 5158 779A A79E 8F83 796F" $"6F7D 909C 9377 5B56 6883 9BA4 987B 5B51" $"6687 9C9D 8C7A 7374 7D8A 8F8C 8782 7E7C" $"7977 7A85 8C8B 8279 7776 757B 8A9C A295" $"8073 7782 8882 7569 6469 788A 948E 7B6A" $"6777 8B95 8E7E 6F6B 737E 8380 786B 5F5A" $"6375 8794 9487 7160 5D68 7D90 968C 786A" $"6B7F 99A8 A284 6455 607F A0AD 9F85 726D" $"7584 9298 907D 6A62 6E84 96A0 9D8B 735F" $"5B6A 828F 8E86 7D76 7378 8081 7E7E 838A" $"8E8B 837A 7A82 8E95 8C7A 6E71 8296 A4A0" $"9281 7779 7E76 6A61 6671 797F 807E 8087" $"8E90 8C83 7771 7885 9091 8B7F 7670 7177" $"7B7B 797A 838F 9791 8373 6768 7175 7677" $"7C7D 7670 6F72 7C8D 9CA0 9787 766A 6F7E" $"8D95 9285 735F 5459 6A7C 8484 8384 8279" $"6F67 5F60 6A7A 8C98 9B90 7C66 5C61 6E7F" $"8F97 9891 877E 7979 7B80 8890 9493 8F88" $"7F79 7678 7F86 827B 757A 848B 8579 7070" $"7985 867E 7371 7477 7A7E 8188 9092 8C82" $"7975 7783 9093 8A7C 6C62 5F66 7A90 9D9A" $"8773 6561 6772 7F84 8687 8786 8685 8178" $"6D67 696F 7782 8E96 9690 8A82 7A75 757C" $"8790 9595 8F83 7569 656C 7B83 827E 7E81" $"7F76 6C6C 7580 8D91 8B7F 7776 7C82 878B" $"8D89 7F73 6B6E 7989 98A0 957D 6554 5360" $"799A B5BD AE8A 6248 4357 7795 A4A5 9D8F" $"8178 7778 7773 6E6E 6F72 7A87 9195 9491" $"887C 716B 6F7B 8994 9892 8473 635C 6372" $"7D82 8488 8D8C 837A 777A 7F85 8783 7C79" $"7B82 898D 8D88 7F72 6864 6C7C 8D9A 9E95" $"826B 5954 5F76 93AA B4AC 9171 574E 586C" $"808C 8F8C 847D 7878 7A7B 7A78 7776 7578" $"7F85 8887 8683 807B 797B 8089 8D8C 8377" $"6A62 616B 7A85 8B8F 9091 8F88 8380 807F" $"807F 7E7E 7E81 878D 8F8A 7F72 655F 606C" $"7F8F 9899 9285 725E 565F 728B 9FAA A796" $"806A 5E5D 6369 7076 7B7D 7E7C 7A77 7474" $"777F 8487 8784 7E75 6964 6B7A 8D9C A4A1" $"9480 6C5E 5B60 6974 7C82 8485 8380 7D7A" $"7A7B 7D7D 7C7C 7D7C 7975 7277 828F 999E" $"9990 806F 615C 5F6C 7D8C 969A 9A93 8679" $"7170 7277 7C80 868A 8C89 827A 7779 7E83" $"898B 8C87 7D72 6B6A 707B 8690 989B 988E" $"8178 7677 7A7E 8187 8E92 918C 8278 716D" $"6D72 7C87 8F90 8A82 7B74 6F6E 7480 8D98" $"9E9F 9B97 9390 887B 6D63 6167 7481 8C90" $"8E87 7F7A 7673 7577 7A7A 7C80 8285 8687" $"878A 8C8C 8880 786F 6867 6E79 848B 9294" $"9289 7A6C 6262 6873 7F8A 9299 9B9B 9791" $"867B 7069 676C 7888 959D 9D93 8471 6059" $"5E6B 7E8F 9C9F 988C 8077 7577 7778 7878" $"7675 7372 7272 7579 7E82 8486 8787 8581" $"7C7C 8186 8A8C 8985 7D75 6E6B 6C73 7E89" $"9298 9A95 8A7F 7774 7477 7D82 888C 8C8A" $"857E 7874 7372 757C 838B 8E8E 8B88 837D" $"7979 7B81 878C 9093 9595 938C 8075 6E6D" $"727C 868C 8D8A 8682 8181 8486 8888 8584" $"8484 878A 8A88 847E 7A76 7579 7F85 8B90" $"9496 9795 8F85 7769 5B52 545E 6F82 93A1" $"AAAB A69C 9184 7B75 7272 767B 8289 8E90" $"8C86 7F79 7675 767A 7E82 8382 8281 8181" $"8181 7F7E 7C7B 7875 726F 7071 757A 7F82" $"8587 8988 8784 8383 8383 8281 807F 7D7A" $"7774 7375 797E 8488 8988 8582 807E 7F82" $"8484 8380 7D7B 7A79 7878 7778 7B7F 858C" $"9091 908C 8782 7F7D 7E7F 8080 8183 8486" $"8787 8887 8483 8281 7E7C 7C7B 7C7F 848B" $"9296 9896 928C 8580 7B79 7879 7A7C 8185" $"898C 8D8E 8D8A 8A89 8783 807F 7E80 8489" $"9197 9C9D 9B97 9189 847E 7975 7270 7276" $"7D85 8D93 9898 9795 918C 8781 7B77 7475" $"7981 8991 979A 9A97 928C 857E 7771 6D6D" $"7077 7F8B 939B 9EA0 9D97 918A 8177 7068" $"6567 6D77 838D 979C 9F9D 9890 877E 7671" $"6E6F 7378 8086 8C91 9494 928F 8B85 7D77" $"6F69 676A 7077 8089 8F94 9693 8F89 827C" $"7773 7272 7377 7A7E 8387 8B8D 8D8C 8883" $"7D76 706B 6A6B 6B6F 7276 7A7F 8387 8A8C" $"8C89 8783 7E79 736D 6968 696D 757E 8992" $"9A9E 9F9C 968E 847A 7169 6561 6163 676D" $"747D 858D 9499 9B9A 968F 867D 766F 6A68" $"6767 696B 6E72 767A 8083 878A 8C8C 8A86" $"817E 7B7A 7B7E 8388 8C8F 9190 8F8A 847D" $"746A 635C 5856 585D 6571 7D8A 99A4 ACB0" $"AFA7 9B8E 8073 6862 5D5C 5C5F 6267 6D74" $"7D83 8A8F 9293 918D 8884 807D 7D7F 8285" $"888A 8A8A 8986 837E 7974 706C 6A69 6A6D" $"7278 7E85 8C92 9698 9896 918B 847B 746E" $"6A67 6767 696D 7277 7E85 8A90 9496 9694" $"908C 8580 7B78 7674 7474 7577 7A7D 8183" $"8586 8787 8685 8483 8180 7F7F 7E7E 7E80" $"8184 8585 8480 7D7A 7674 7474 7679 7E82" $"868A 8C8F 8F8D 8B88 837D 7670 6B68 6666" $"686B 7077 7E84 8A8F 9395 9493 908C 8885" $"817F 7D7A 7977 7778 797B 7C7E 8081 8283" $"8585 8787 8787 8786 8584 8383 8382 8280" $"7E7D 7B7A 7B7B 7C7E 8184 878A 8C8D 8F8F" $"8E8C 8985 807A 7470 6D6A 6A6B 6D71 7579" $"7E82 8689 8C8D 8E8C 8B89 8683 8280 7D7B" $"7979 7877 7878 797B 7D7F 8183 8589 8C8D" $"8D8D 8D8C 8986 8481 7E7D 7B7A 7A7A 7B7E" $"7F82 8587 8A8E 9193 9495 9492 8E89 847E" $"7772 6F6C 6B6B 6C6E 7074 777A 7E81 8487" $"8889 8989 8887 8686 8483 8180 7F7D 7B7A" $"7979 7979 797A 7B7C 7E80 8283 8587 8989" $"8A8A 8A89 8886 8483 8280 807F 7F7F 8082" $"8485 8889 8B8B 8B89 8583 7F7B 7876 7474" $"7474 7476 7879 7B7D 7F81 8385 8686 8687" $"8788 8887 8786 8584 827F 7E7C 7A78 7775" $"7372 7272 7376 787C 8085 898D 9092 9392" $"918E 8C89 8582 7E7B 7877 7675 7577 797A" $"7C7E 8081 8284 8585 8686 8685 8583 8382" $"8180 7F80 807F 8082 8384 8586 8789 8A8B" $"8B8B 8A89 8785 8280 7D7B 7A79 7979 7979" $"7979 7979 7B7C 7D7E 8081 8182 8383 8484" $"8383 8382 8180 7F7F 7F7E 7E7D 7C7B 7A7A" $"7A7A 7A7B 7D7E 8082 8587 8889 8888 8685" $"8381 807E 7C7B 7B7B 7B7B 7D7E 7F80 8182" $"8284 8485 8585 8585 8585 8484 8484 8484" $"8484 8484 8585 8484 8584 8484 8382 8281" $"8181 8080 8082 8182 8283 8381 807F 7D7C" $"7979 7878 7879 7A7A 7B7C 7C7D 7D7D 7D7E" $"7E7E 7E7F 8082 8383 8485 8584 8382 817F" $"7E7D 7C7B 7B7C 7D7D 7E7E 7F7E 7E7D 7D7D" $"7D7D 7E7E 7F80 8182 8383 8484 8484 8584" $"8383 8281 8181 8182 8182 8282 8181 8080" $"8080 8080 8080 00" #ifdef MacStyle } #endif }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/makefile new file mode 100644 index 0000000..761b27e --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/makefile @@ -0,0 +1 @@ + CDEV = SOUND {CDEV} Ä {CDEV}.Load ReqProc.Load {CDEV}.r reziigs {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" if {AutoDuplicate} == 1 DuplicateIIGS -y -mac Sound : End {CDEV}.Load Ä {CDEV}.aii.obj {CDEV}Data.aii.obj linkiigs -x -lseg sound {CDEV}.aii.obj {CDEV}Data.aii.obj -o {CDEV}.Load ReqProc.Load Ä ReqProc.aii.obj makefile linkiigs -x -lseg:$1000 MyReqProc ReqProc.aii.obj -o ReqProc.Load {CDEV}.aii.obj Ä {CDEV}Data.aii {CDEV}.aii Makefile ::dp.h ::commonmacros.h asmiigs {CDEV}.aii {CDEV}Data.aii.obj Ä {CDEV}Data.aii Makefile ::dp.h ::commonmacros.h asmiigs {CDEV}Data.aii ReqProc.aii.obj Ä ReqProc.aii asmiigs ReqProc.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/sound.aii b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/sound.aii new file mode 100644 index 0000000..f97b658 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/SoundCDEV/sound.aii @@ -0,0 +1 @@ +; Note--are duplicated in reqproc. Fix this. ; MapEventToName, FindNamedEntry, ComputeNameHash ; DoWeNeedThisSound ;************************************************************************ ; ; Sound Control Panel for System 6.0 ; ; Michael V. Stein 02/24/90 ; David A. Lyons 1991-92 ; ; © Copyright Apple Computer, 1990-1992 ; All Rights Reserved ; ; ; 20-Jan-91 DAL ; Changed stack clean-up code to remove the correct number ; of bytes (10, not 9). This bug was masked by the Pascal ; Control Panel NDA, which accidentally tolerated stack ; imbalance. ; ; 21-Mar-91 DAL ; Added a _GetPort during CreateCDEV so it wouldn't get ; the wrong value for the check-box control handle since ; the window isn't the front window yet. Changed the ; check-box value check to always examine the check box, ; not the control that was hit (which was sometimes the ; static text control). ; ; 23-Jun-91 DAL ; Semi-major rewrite to match my coding style and implement ; Jim Merritt's new design. New layout, additional controls ; for configuring SysBeep2 sounds and recording sounds. ; ; 1-Jul-91 DAL, 2.0b7 ; Commented out stuff on Recording. ; ; 20..21-Oct-91 DAL, 2.0b8 ; Lots of work. ; Start by using the rTaggedStrings(1) resource to build ; the Event pop-up. ; ; 28..29-Oct-91 DAL, 2.0b9 ; Fixed double-bonk bugs--scroll bar action procedures don't ; beep on part-code zero. ; Optimized a bunch of GetCtlHandleFromID calls into a subroutine. ; Build the Sounds pop-up & make this sucker work! ; ; 30-Oct-91 DAL ; Hooks into BELLVECTOR to remap System Beep. ; Pop-ups are type 2 (type 1 was working poorly since they are not ; near the top of the screen and can be long). ; Saves and loads Sound.Settings from *:System:Sounds. ; ; 30-Oct-91 DAL (for 2.0b10 for d56) ; Made ChainBellVector a global so I can really use it. ; Fixed FindNamedEntry to return pointer to unassigned entry ; if you have no sounds. ; "Standard Beep" now plays when selected from Sound menu. ; Pitch scroll bar makes standard beep instead of system beep. ; ; 5-Nov-91 DAL (2.0b11 for d57) ; Added support for asynchronous sounds. Passes srqHelloWorld ; to our request proc. ; ; 9-Nov-91 DAL ; Make direct-page handle load high in bank 0. ; Copy and Cut put current sound (and its name) onto the clipboard. ; Return plays the current sound. ; ; 18-Nov-91 DAL (2.0b13 for d58) ; At boot time, allocates a big temp handle around loading sounds, ; so we can't accidentally cram RAM full of sounds. ; ; 19-Nov-91 DAL (2.0b14 for d59) ; Coded the DoWeNeedThisSound routine. ; CheckForDuplicate does not consider a not-loaded sound to be a dup. ; Forces sounds to be unlocked and not-purgeable when loaded. ; ; 24-Nov-91 DAL ; The Sounds menu is now in alphabetical order. ; ; 24-Jan-92 DAL ; Don't mark the settings file dirty just for popping up the ; Sounds menu (added curSoundValue). ; Other changes in ReqProc.aii. ; ;************************************************************************ ; ; FUTURE ENHANCEMENTS ; ; Core Features ; Play sounds even if the Sound Tools are in use, by saving and ; restoring the state of the sound chip. Play sounds even ; under P8, where no bank 0 space is available. ; Check for a minimum amount of stack space available; don't play ; sounds if it's not safe. ; ; Human Interface ; Make arrow keys adjust the scroll bars ; left/right=volume, command-left/right=pitch ; Make space bar play the system beep. ; ;************************************************************************ debugSymbols equ 0 blanks off include '::commonmacros.h' include 'all.macros' include 'e16.resources' include 'e16.locator' include 'e16.desk' include 'e16.event' import SoundAbout MachineCDEV equ 1 ;called when rebuilding cdev.data to see if cdev should be included BootCDEV equ 2 ;boot time init call or install call - no params ShutDownCDEV equ 3 ;reserved for future use InitCDEV equ 4 ;called when being shown - data1 equ windowPtr CloseCDEV equ 5 ;called when being removed - data1 equ windowPtr EventsCDEV equ 6 ;called when an event - data1 equ ptr to event record CreateCDEV equ 7 ;called so that CDEV can create its controls inline - data1 equ window AboutCDEV equ 8 ;called so that CDEV can create its about text inline - no params RectCDEV equ 9 ;called so that CDEV can dynamically compute its rectangle HitCDEV equ 10 ;called when ctl is "hit" - data1 equ Hdl to Ctl hit, data2 equ Ctl Id RunCDEV equ 11 ;caled when da run is called EditCDEV equ 12 ;called when SystemEdit is called reserved2 equ 13 ;reserved for future use reserved3 equ 14 ;reserved for future use NeverUsed1 equ 15 ;this will never be used NeverUsed2 equ 16 ;this will never be used wantMachine equ 1 wantBoot equ 2 wantShutDown equ 4 wantInit equ 8 wantClose equ 16 wantEvents equ 32 wantCreate equ 64 wantAbout equ 128 wantRect equ 256 wantHit equ 512 wantRun equ 1024 wantEdit equ 2048 updateSSfromBRAM equ 16384 ; ; Sound equates ; maxpitch equ 14 ;maximum value of pitch maxvol equ 14 ;maximum value of volume ; ; Control IDs ; volumeControlID equ 1 ;volume scroll bar pitchControlID equ 2 ;pitch scroll bar visualControlID equ 5 ;visual indication of sounds eventControlID equ 9 ;Event pop-up menu soundControlID equ $A ;Sound pop-up menu ; ; Communication with the Sound Request Procedure ; srqSetSoundGlobals equ $8000 ;set data from dataIn srqGetSoundGlobals equ $8001 ;return info at dataIn ;;;srqPlaySoundHandle equ $8002 ;test--play dataIn=rSoundSample handle srqMakeStdBeep equ $8003 ;play a standard beep srqHelloWorld equ $8100 ;initialize self ;srqGetrSoundSample equ $0004 ;srqSynchronize equ $0005 ;wait for sounds to finish ;--------------------------------------------------------------------- ; ; configHandle ; ; configHandle records mappings for all the sounds in the ; user's active set ; ; The format is exactly like an rTaggedStrings resource, mapping ; from events into strings. ; ; +000: Count ; +002: TagWord1 ; +004: PString1 ; +xxx: TagWord2 ; +yyy: PString2 ; +zzz: ... ; ; The strings are the names of Sound resources. ; There are a few special strings: ; "0" = silence ; "*" = standard beep ; ;--------------------------------------------------------------------- ; ; data structure for soundsHandle ; ; soundsHandle records mappings for all the sounds appearing ; in the Sound pop-up ; ; IMPORTANT! The soundsHandle is locked while the Sound pop-up menu ; exists. The menu items are pointers into this handle. ; ;--------------------------------------------------------------------- oVersion equ 0 ;zero oEntryOffset equ 2 ;offset to the entry list oEntryCount equ 4 ;number of entries following HEADERSIZE equ 6 ; ; Each entry: ; oNextEntry equ 0 ;offset to next entry (from here) oNameHash equ 2 ;quick check against name oMenuItem equ 4 ;menu item number in Sounds pop-up oPathOffset equ 6 ;offset from entry to pathname (WString) (or zero) oNameOffset equ 8 ;offset from entry to resname (PString) (or zero) oSoundData equ 10 ;long sound data (for ex, handle to sound sample) ENTRYSIZE equ 14 ;(not including strings!) ; ; Values for Binding field (these match the menu item ; numbers for the first 3 items in the Sound pop-up). ; itemNotAssigned equ 1 itemSilence equ 2 itemStandardBeep equ 3 ; ; stack equates for special action procedures: ; handleid equ 4+1 ;offset of handleid on stack part equ handleid+4 ;offset to part on stack ; ; battery parameter values. ; aug_param equ $5e ;bit 0 set means no closed captioning pitch_param equ $1f ;battery parameter to set pitch volume_param equ $1e ;battery parameter to set volume ************************************************************************* * * Sound Control Panel -- MAIN CDEV ENTRY POINT * * At this point, the stack contains: * * 14..17,s LONG Result Space * 12..13,s WORD Message * 08..11,s LONG Data1 * 04..07,s LONG Data2 * 01..03,s RTL * ************************************************************************* SoundCP procname export phb ;save calling data bank phk plb phd tsc tcd oldD equ 1 oldB equ oldD+2 rtlAddr equ oldB+1 data2 equ rtlAddr+3 data1 equ data2+4 message equ data1+4 result equ message+2 lda $777777 ;JML to old BellVector value ************************************************************************* configIsDirty dc.w 0 endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/Time.pii b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/Time.pii new file mode 100644 index 0000000..dfffbfb --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/Time.pii @@ -0,0 +1 @@ +This file is no longer used. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/Time.r b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/Time.r new file mode 100644 index 0000000..e78b78a --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/Time.r @@ -0,0 +1 @@ +/*******************************************************************/ /* /* Time.r /* /* Copyright (C) 1988-1992 /* Apple Computer, Inc. /* All Rights Reserved /* /* This file contains the source of the resources needed to build the /* Time CDEV. /* /*******************************************************************/ #include "typesiigs.r" resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"FFFFFFFFFFC00003FFFFFFFFFFFF" $"FFFFFFFC000BBBB0003FFFFFFFFF" $"FFFFFF00BBBB33BBBB00FFFFFFFF" $"FFFFF0BBBBBB33BBBBBB0FFFFFFF" $"FFFF0BBBBBBBBBBBBB0BB0FFFFFF" $"FFFC0BBBBB00BBBBB0BBB03FFFFF" $"FFF0BBBBBB00BBBB0BBBBB0FFFFF" $"FFC0BBBBBBB00BB0BBBBBB03FFFF" $"FF0BBBBBBBB00B0BBBBBBBB0FFFF" $"FF0B33BBBBBB00BBBBBB33B0FFFF" $"FF0B33BBBBBB00BBBBBB33B0FFFF" $"FF0BBBBBBBBBBBBBBBBBBBB0FFFF" $"FFC0BBBBBBBBBBBBBBBBBB03FFFF" $"FFF0BBBBBBBBBBBBBBBBBB0FFFFF" $"FFFCBBBBBBBBBBBBBBBBB03FFFFF" $"FFFF0BBBBBBBBBBBBBBBB0FFFFFF" $"FFFFF0BBBBBB33BBBBBB0FFFFFFF" $"FFFFFF00BBBB33BBBB00FFFFFFFF" $"FFFFFFFC000BBBB0003FFFFFFFFF" $"FFFFFFFFFFC00003FFFFFFFFFFFF", $"0000000000FFFFFF000000000000" $"0000000FFFFFFFFFFFF000000000" $"000000FFFFFFFFFFFFFF00000000" $"00000FFFFFFFFFFFFFFFF0000000" $"0000FFFFFFFFFFFFFFFFFF000000" $"000FFFFFFFFFFFFFFFFFFFF00000" $"000FFFFFFFFFFFFFFFFFFFF00000" $"00FFFFFFFFFFFFFFFFFFFFFF0000" $"00FFFFFFFFFFFFFFFFFFFFFF0000" $"00FFFFFFFFFFFFFFFFFFFFFF0000" $"00FFFFFFFFFFFFFFFFFFFFFF0000" $"00FFFFFFFFFFFFFFFFFFFFFF0000" $"00FFFFFFFFFFFFFFFFFFFFFF0000" $"000FFFFFFFFFFFFFFFFFFFF00000" $"000FFFFFFFFFFFFFFFFFFFF00000" $"0000FFFFFFFFFFFFFFFFFF000000" $"00000FFFFFFFFFFFFFFFF0000000" $"000000FFFFFFFFFFFFFF00000000" $"0000000FFFFFFFFFFFF000000000" $"0000000000FFFFFF000000000000"; }; read rCDEVCode (1,Convert) "TIME.Load"; resource rCDEVFlags (1) { wantHit+wantInit+wantCreate+wantAbout+wantRun+wantEvents+updateSSfromBRAM, /* CDEV Flags */ 1, /* Enabled */ 1, /* Version */ 1, /* Machine */ 4, /* System */ {0,0,150,200}, /* DataRect */ "Time", /* Name */ "Michael Stein", /* Author */ "v2.0"; /* VersStr */ }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/TimeData.aii b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/TimeData.aii new file mode 100644 index 0000000..d9005cb --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/TimeData.aii @@ -0,0 +1 @@ +;;; timedata - data records and strings used by time CDEV. ; ; Michael V. Stein 03/30/90. ; ; © Apple, 1990. blanks off ;; equates. moontop equ 50 top of moon text daytop equ 40 top of day of year text fam1top equ daytop+29 top of family 1 radio buttons fam2left equ 112 family 2 left indent fam3top equ fam1top+45 top of family 3 radio buttons leftedge equ 5 leftedge for controls radio1ID equ 10 radio4ID equ radio1ID+3 ID of 4th radio control radio6ID equ radio4ID+2 ID of 6th radio control checkID equ radio6ID+2 ID of checkbox RightEdge equ 195 rspace equ 12 spacing between radio buttons ;; include files. include 'e16.control' include 'm16.util' ;; main program. timedata proc ;; exported addresses. export about export check1 export ctllist export dayctl export daylen export dctl export radio1 export radio2 export radio3 export radio4 export radio5 export radio6 export radio7 export tctl ;; imported addresses. import cdsa import time_date_defproc ctllist dc.l radio1 dc.l radio2 dc.l radio3 dc.l radio4 dc.l radio5 dc.l radio6 dc.l radio7 dc.l check1 dc.l line1 dc.l line2 dc.l 0 ; control for setting the date. dctl dc.w 6 dc.l 2 ID dc.w 20,50,0,0 rect dc.l time_date_defproc dc.w ctlInvis+2 flags - date control dc.w fctlcanbetarget+$400 dc.l 0 refcon ; control for setting the time. tctl dc.w 6 dc.l 3 ID dc.w 5,50,0,0 rect dc.l time_date_defproc dc.w ctlInvis+1 flags dc.w fctlcanbetarget+$400 dc.l 0 refcon ; control for the about box. About dc.w 8 dc.L 1 dc.w 38,5,138,280 dc.L $81000000 dc.w $0000 dc.w $1000 dc.L 0 dc.L AboutText dc.w AboutTextL string asis AboutText dc.b 'The Time Control Panel allows you to set the clock and change the display ' dc.b 'formats for date and time in your machine.' dc.b ' The radio buttons can be used ' dc.b 'to manually adjust the clock to compensate for daylight ' ; dc.b 'savings time. Check the Auto daylight savings checkbox ' ; dc.b 'only if your area follows US daylight savings time.' dc.b 'savings time. Set the checkbox ' dc.b 'to have the clock automatically adjust for daylight ' dc.b 'savings time in the future (April and October).' AboutTextL equ *-AboutText ; day of year control. dayctl dc.w 8 PCount dc.l 5 ID dc.w daytop rectangle dc.w leftedge dc.w daytop+18 dc.w rightedge dc.l stattextcontrol dc.w 1 flag (pascal strings) dc.w FctlProcRefNotPtr more flags dc.l 0 refcon dc.l cdsa constructed in time.aii daylen dc.w 30 ; date format radio button mm/dd/yy. radio1 dc.w 8 Pcount dc.l radio1ID ID dc.w fam1top dc.w leftedge dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio1T ptr to title dc.w 0 initial value radio1t str 'MM/DD/YY' ; date format radio button dd/mm/yy. radio2 dc.w 8 Pcount dc.l radio1ID+1 ID dc.w fam1top+rspace dc.w leftedge dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio2T ptr to title dc.w 0 initial value radio2t str 'DD/MM/YY' ; date format for radio button yy/mm/dd. radio3 dc.w 8 Pcount dc.l radio1ID+2 ID dc.w fam1top+rspace*2 dc.w leftedge dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 1 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio3T ptr to title dc.w 0 initial value radio3t str 'YY/MM/DD' ; hour format radio button am/pm. radio4 dc.w 8 Pcount dc.l radio4id ID dc.w fam1top dc.w leftedge+fam2left dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 2 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio4T ptr to title dc.w 0 initial value radio4t str 'AM/PM' ; hour format radio button 24 hour. radio5 dc.w 8 Pcount dc.l radio4ID+1 ID dc.w fam1top+rspace dc.w leftedge+fam2left dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 2 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio5T ptr to title dc.w 0 initial value radio5t str '24 Hour' ; standard time radio button. radio6 dc.w 8 Pcount dc.l radio6ID ID dc.w fam3top dc.w leftedge dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 3 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio6T ptr to title dc.w 0 initial value radio6t str 'Standard Time' ; daylight time radio button. radio7 dc.w 8 Pcount dc.l radio6ID+1 ID dc.w fam3top+rspace dc.w leftedge dc.w 0 bottom y - let system figure it out dc.w 0 right x - let system figure it out dc.l radiocontrol dc.w 3 family 1 dc.w FctlProcRefNotPtr dc.l 0 ref con dc.l radio7t ptr to title dc.w 0 initial value radio7t str 'Daylight Time' ; checkbox for auto-daylight savings. check1 dc.w 8 PCount dc.L checkID ID dc.w fam3top+rspace*2 dc.w leftedge dc.w 0 dc.w 0 dc.L checkcontrol dc.w 0 flag dc.w $1000 moreflags dc.L 0 refcon dc.L check1t ptr to title dc.w 0 initial value check1t str 'Auto daylight savings' ; dividing line. line1 dc.w 8 Pcount dc.l 18 ID dc.w fam1top-14 dc.w leftedge dc.w fam1top-14+10 dc.w rightedge dc.l stattextcontrol dc.w 1 flag pascal string dc.w fctlProcRefNotPtr more flags dc.l 0 refcon dc.l line2t dc.w 23 line2 dc.w 8 Pcount dc.l 19 ID dc.w fam3top-14 dc.w leftedge dc.w fam3top-14+10 dc.w rightedge dc.l stattextcontrol dc.w 1 flag pascal string dc.w fctlProcRefNotPtr more flags dc.l 0 refcon dc.l line2t dc.w 23 line2t dc.b '_______________________' endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/makefile b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/makefile new file mode 100644 index 0000000..dfc8ae7 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/makefile @@ -0,0 +1 @@ + CDEV = TIME {CDEV} Ä {CDEV}.Load ¶ {CDEV}.r reziigs {CDEV}.r -o {CDEV} -t "C7 " -c "pdos" if {dup} # test whether we should duplicateiigs duplicateiigs -m -y {CDEV} {CDEV} end {CDEV}.Load Ä ¶ time.aii.obj ¶ timedata.aii.obj ¶ time.date.ctl.obj linkiigs -x -lseg time ¶ time.aii.obj ¶ timedata.aii.obj ¶ time.date.ctl.obj ¶ -o {CDEV}.Load {CDEV}Data.aii.obj Ä ¶ {CDEV}Data.aii Makefile asmiigs {CDEV}Data.aii time.date.ctl.obj Ä time.date.ctl td.ctl.tables asmiigs time.date.ctl -define seconds=1 -define table3=1 {CDEV}.aii.obj Ä {CDEV}.aii Makefile ¶ ::cdev.h ::commonmacros.h ::dp.h asmiigs {CDEV}.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/td.ctl.tables b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/td.ctl.tables new file mode 100644 index 0000000..0420426 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/td.ctl.tables @@ -0,0 +1 @@ +********************************************************************************** * * * Format tables for the time/date input control for auto-selection. * * * * Copyright Apple Computer Inc. 1989 ALL RIGHTS RESERVED * * * * * ********************************************************************************** ******* REVISION HISTORY: **************************************************** * * September 5, 1989 Monte Benaresh * * Created this file. * ********************************************************************************** export format1 format1 PROC table_start ************************************************************* * equates for the format of the display string * ************************************************************* ; the display string is Pascal style and looks like this ("_" indicates space character): ; ; AUG_29_1989__10:20:43_AM ; | | | | | | | ; | | | | | | am_pm_offset (if selected at run time) ; | | | | | | ; | | | | | second_offset (if selected at assembly time) ; | | | | | ; | | | | minute_offset ; | | | | ; | | | hour_offset ; | | | ; | | year_offset ; | | ; | day_offset ; | ; | ; month_offset ; equates for these offsets into a Pascal string: month_offset equ 1 month_end equ month_offset + 3 day_offset equ month_end + 1 day_end equ day_offset + 2 year_offset equ day_end + 1 year_end equ year_offset + 4 hour_offset equ year_end + 2 hour_end equ hour_offset + 2 minute_offset equ hour_end + 1 minute_end equ minute_offset + 2 if seconds = 1 then second_offset equ minute_end + 1 ;include seconds field second_end equ second_offset + 2 else second_end equ minute_end ;exclude seconds field endif am_pm_offset equ second_end + 1 am_pm_end equ am_pm_offset + 2 string_size dc.w am_pm_end ;this doesn't include the length byte part_left ;table of left character positions by part code ;must subtract 1 because they are byte positionsÉ ;Éin a Pascal string dc.w month_offset-1 dc.w day_offset-1 dc.w year_offset-1 dc.w hour_offset-1 dc.w minute_offset-1 if seconds = 1 then dc.w second_offset-1 ;insert entry if seconds requested endif dc.w am_pm_offset-1 part_right ;table of right character positions by part code dc.w month_end-1 dc.w day_end-1 dc.w year_end-1 dc.w hour_end-1 dc.w minute_end-1 if seconds = 1 then dc.w second_end-1 ;insert entry if seconds requested endif dc.w am_pm_end-1 part_next ;table of each part's right neighbor dc.w part_day ;month dc.w part_year ;day dc.w part_hour ;year dc.w part_minute ;hour if seconds = 1 then ;include seconds dc.w part_second ;minute dc.w part_am_pm ;second else ;exclude seconds dc.w part_am_pm ;minute endif dc.w 0 ;am/pm field has no right neighbor part_prev ;table of each part's left neighbor dc.w 0 ;month has no left neighbor dc.w part_month ;day dc.w part_day ;year dc.w part_year ;hour dc.w part_hour ;minute if seconds = 1 then dc.w part_minute ;seconds dc.w part_second ;am/pm else dc.w part_minute ;am/pm endif first_field dc.w part_month last_field dc.w part_am_pm table_end export table_length:equ table_length equ table_end - table_start ENDP export format2 format2 PROC ; import table_length table_start2 ************************************************************* * equates for the format of the display string * ************************************************************* ; the display string is Pascal style and looks like this ("_" indicates space character): ; ; 29_AUG_1989__10:20:43_AM ; | | | | | | | ; | | | | | | am_pm_offset ; | | | | | | ; | | | | | second_offset ; | | | | | ; | | | | minute_offset ; | | | | ; | | | hour_offset ; | | | ; | | year_offset ; | | ; | month_offset ; | ; | ; day_offset ; equates for these offsets into a Pascal string: day_offset equ 1 day_end equ day_offset + 2 month_offset equ day_end + 1 month_end equ month_offset + 3 year_offset equ month_end + 1 year_end equ year_offset + 4 hour_offset equ year_end + 2 hour_end equ hour_offset + 2 minute_offset equ hour_end + 1 minute_end equ minute_offset + 2 if seconds = 1 then second_offset equ minute_end + 1 ;include seconds field second_end equ second_offset + 2 else second_end equ minute_end ;exclude seconds field endif am_pm_offset equ second_end + 1 am_pm_end equ am_pm_offset + 2 string_size dc.w am_pm_end ;this doesn't include the length byte part_left ;table of left character positions by part code ;must subtract 1 because they are byte positionsÉ ;Éin a Pascal string dc.w month_offset-1 dc.w day_offset-1 dc.w year_offset-1 dc.w hour_offset-1 dc.w minute_offset-1 if seconds = 1 then dc.w second_offset-1 ;insert entry if seconds requested endif dc.w am_pm_offset-1 part_right ;table of right character positions by part code dc.w month_end-1 dc.w day_end-1 dc.w year_end-1 dc.w hour_end-1 dc.w minute_end-1 if seconds = 1 then dc.w second_end-1 ;insert entry if seconds requested endif dc.w am_pm_end-1 part_next ;table of each part's right neighbor dc.w part_year ;month dc.w part_month ;day dc.w part_hour ;year dc.w part_minute ;hour if seconds = 1 then ;include seconds dc.w part_second ;minute dc.w part_am_pm ;second else ;exclude seconds dc.w part_am_pm ;minute endif dc.w 0 ;am/pm field has no right neighbor part_prev ;table of each part's left neighbor dc.w part_day ;month dc.w 0 ;day has no left neighbor dc.w part_month ;year dc.w part_year ;hour dc.w part_hour ;minute if seconds = 1 then dc.w part_minute ;seconds dc.w part_second ;am/pm else dc.w part_minute ;am/pm endif first_field dc.w part_day last_field dc.w part_am_pm table_end2 table_length2 equ table_end2 - table_start2 if (table_length2 = table_length) goto .ok aerror '### ERROR: Time/date control format tables not of equal length' .ok anop ENDP if table3 = 1 then ;assemble last table only ifÉ ;Éoption is set export format3 format3 PROC ; import table_length table_start3 ************************************************************* * equates for the format of the display string * ************************************************************* ; the display string is Pascal style and looks like this ("_" indicates space character): ; ; 1989_AUG_29__10:20:43_AM ; | | | | | | | ; | | | | | | am_pm_offset ; | | | | | | ; | | | | | second_offset ; | | | | | ; | | | | minute_offset ; | | | | ; | | | hour_offset ; | | | ; | | month_offset ; | | ; | day_offset ; | ; | ; year_offset ; equates for these offsets into a Pascal string: year_offset equ 1 year_end equ year_offset + 4 month_offset equ year_end + 1 month_end equ month_offset + 3 day_offset equ month_end + 1 day_end equ day_offset + 2 hour_offset equ day_end + 2 hour_end equ hour_offset + 2 minute_offset equ hour_end + 1 minute_end equ minute_offset + 2 if seconds = 1 then second_offset equ minute_end + 1 ;include seconds field second_end equ second_offset + 2 else second_end equ minute_end ;exclude seconds field endif am_pm_offset equ second_end + 1 am_pm_end equ am_pm_offset + 2 string_size dc.w am_pm_end ;this doesn't include the length byte part_left ;table of left character positions by part code ;must subtract 1 because they are byte positionsÉ ;Éin a Pascal string dc.w month_offset-1 dc.w day_offset-1 dc.w year_offset-1 dc.w hour_offset-1 dc.w minute_offset-1 if seconds = 1 then dc.w second_offset-1 ;insert entry if seconds requested endif dc.w am_pm_offset-1 part_right ;table of right character positions by part code dc.w month_end-1 dc.w day_end-1 dc.w year_end-1 dc.w hour_end-1 dc.w minute_end-1 if seconds = 1 then dc.w second_end-1 ;insert entry if seconds requested endif dc.w am_pm_end-1 part_next ;table of each part's right neighbor dc.w part_day ;month dc.w part_hour ;day dc.w part_month ;year dc.w part_minute ;hour if seconds = 1 then ;include seconds dc.w part_second ;minute dc.w part_am_pm ;second else ;exclude seconds dc.w part_am_pm ;minute endif dc.w 0 ;am/pm field has no right neighbor part_prev ;table of each part's left neighbor dc.w part_year ;month dc.w part_month ;day dc.w 0 ;year has no left neighbor dc.w part_day ;hour dc.w part_hour ;minute if seconds = 1 then dc.w part_minute ;seconds dc.w part_second ;am/pm else dc.w part_minute ;am/pm endif first_field dc.w part_year last_field dc.w part_am_pm table_end3 table_length3 equ table_end3 - table_start3 if (table_length3 = table_length) goto .ok aerror '### ERROR: Time/date control format tables not of equal length' .ok anop ENDP endif ;from option controlled by "table3" \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/time.aii b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/time.aii new file mode 100644 index 0000000..ca2d73a --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/time.aii @@ -0,0 +1 @@ +;;; time - time CDEV. ; ; Michael V. Stein 03/30/90. ; ; © Apple, 1990. blanks off ;; equates. aug_param equ $5e bit 0 set means no closed captioning ;bit 1 set means standard time ; clear if daylight savings time ;bit 2 set means not to have auto daylight savings ; clear means to have auto daylight savings ;bit 3 and 4 are the amount of menublink to have radio1ID equ 10 radio4ID equ radio1ID+3 ID of 4th radio control radio6ID equ radio4ID+2 ID of 6th radio control checkID equ radio6ID+2 ID of checkbox ; time/date control info TDCtlRec RECORD 0 ;record for the Time/Date control ctlNext ds.l 1 ctlOwner ds.l 1 ctlRect ds.w 4 ctlFlag ds.b 1 ctlHilite ds.b 1 ctlValue ds.w 1 ctlProc ds.l 1 ctlAction ds.l 1 ctlData ds.l 1 ctlRefCon ds.l 1 ctlColor ds.l 1 ctlReserved ds.b 16 ctlID ds.l 1 ctlMoreFlags ds.w 1 ;bit 0 = 1 --> 24 hour format ;bit 1 = 1 --> control currently dimmed ctlVersion ds.w 1 ;control-specific fields dateRec ds.b 8 ;GS/OS time/date record cwidth ds.w 1 ;width of each character in the string arrowPos ds.w 1 ;pixel position of arrows relative to control rect currPart ds.w 1 ;currently active part (string field) formatRef ds.w 1 ;pointer to format table drawFlag ds.w 1 ;flag to tell us not to draw twice when we get shown ctlSize ctlKey1 equ ctlReserved ctlKey2 equ ctlKey1+1 ctlKeyMods equ ctlKey2+1 ctlKeyModsCareBits equ ctlKeyMods+2 ctlJust equ ctlReserved ENDR ;; include files. include '::cdev.h' include '::commonmacros.h' include '::dp.h' include 'e16.control' include 'e16.event' include 'm16.control' include 'm16.event' include 'm16.intmath' include 'm16.menu' include 'm16.misctool' include 'm16.quickdraw' include 'm16.util2' include 'm16.window' ;; main program. main proc ;; imported addresses. import about import ctllist import dayctl import daylen import dctl import tctl ;; exported addresses. export cdsa time phb save calling data bank phk plb set our data bank ; make room on stack for direct page. tsc sec sbc #dpsize make room on stack for new direct page tcs phd save the current direct page tcd new direct page lda message cmp #12 bcs time1 if message defintely not handled asl a times 2 into word table tax move into index reg jsr (t_cdev-2,x) call the handler of this message time1 pld restore direct page tsc clc adc #dpsize tcs reset the stack lda 1,s Bump the stack up to prepare sta 11,s to take off the 3 parameters lda 3,s sta 13,s pla get rid of message space pla get rid of data1 space pla pla get rid of data2 space pla lda #$0 return 0 to caller sta 5,s sta 7,s plb rtl t_cdev dc.w cccE handle machine message - ignored dc.w cccE handle boot message - ignored dc.w cccE reserved - ignored dc.w icc init cdev controls dc.w ctc close the cdev dc.w hem handle event message dc.w ccc create cdev controls dc.w ham handle about message dc.w cccE handle rectangle message - ignored dc.w hhm handle hit message dc.w rtc handle run message ;; ccc - create cdev controls. ; ; entry (ctllist..) = pointers to most of the controls. ; [data1] = window pointer. ; (dayctl..) = day of year control template. ; (dctl..) = date control template. ; (tctl..) = time control template. ; ; exit controls are created. ccc jsr cds create day of year string pha pha space for result pushl data1 window ptr pushw #0 next item is a ptr pushl #dayctl _NewControl2 pulll dayhdl handle to day of year control pha pha space for result pushl data1 window ptr pushw #0 next item is a ptr pushl #dctl _NewControl2 pulll dhdl handle to date control pha pha space for result pushl data1 window ptr pushw #0 next item is a ptr pushl #tctl _NewControl2 pulll thdl handle to time control pha space for result pha pushl data1 window pointer pushw #3 next item is a ptr to a list of template pointers pushl #ctllist _NewControl2 pla pla don't care about result cccE rts ;; ctc - close the cdev. ; ; entry none. ; ; exit updates the time and date and exits. ctc jmp utd update time and date and return ;; ham - handle about message. ; ; entry [data1] = window pointer. ; (about..) = template for about screen. ; ; exit The About control is created. ham pha space for result pha pushl data1 window pointer pushw #0 next item is a ptr to a template pushl #about _NewControl2 pla pla don't care about result rts ;; hem - handle event message. ; ; entry [dhdl] = handle to date control. ; [data1] = ptr to event record. ; (readyF) = 0 if the controls are initialized. ; [wptr] = window pointer. ; ; exit if the user types something and there is a target control ; the control is given the event, everything us updated and ; the event is turned into a null event. We process it here ; since TaskmasterDA is way too slow to use for something that ; occurs as often as a human typing a key. hem0 rts hem lda readyF bne hem0 if controls not initialized yet ldy #owhat lda [data1],y get what type of event occurred cmp #keyDownEvt beq hem1 if user typed something cmp #autoKeyEvt bne hem0 if not an auto key event then return hem1 ldy #omessage lda [data1],y sta eventrec+2 pha space for result pushw #$ffff send to target only pushl wptr window ptr pushl #eventrec _SendEventtoCtl pla get result from stack pha pha _FindTargetCtl pla low word plx high word cmp dhdl bne hem4 if not date handle cpx dhdl+2 bne hem4 if not date handle jsr udy update day of year hem2 ;jsr sdc set daylight controls jsr udo update date only bra hem5 hem4 jsr utd update time and date hem5 jsr sdc set daylight controls lda #nullEvt ldy #owhat sta [data1],y remove the event hem6 rts ;; hhm - handle hit message. ; ; entry [data1] = handle to control that was hit. ; [data2] = id of control that was hit. ; ; exit battery parameter locations are updated. hhm lda data2 id of control cmp #radio1ID bcs hhm1 if radio control jmp hhm12 hhm1 pha jsr utd update time and date lda thdl ldx thdl+2 jsr dts disable target status lda dhdl ldx dhdl+2 jsr dts disable target status pla cmp #radio4ID bcs hhm2 if not first family of radio buttons sbc #radio1ID-1 (c) clear ldx #$34 battery paramater for date format jmp udf update display formats hhm2 cmp #radio6ID bcs hhm3 if not the time format sbc #radio4ID-1 (c) clear ldx #$35 parameter for ampm/military format jmp udf update display format and return hhm3 cmp #checkID bcs hhm7 if the auto daylight checkbox cmp format beq hhm6 if the same as before sta format ldx #aug_param jsr rbp read battery parameter sta w1 save for now ldy #2 assume standard time lda data2 cmp #radio6ID beq hhm4 if set to standard time ldy #$0 flag that it is daylight time hhm4 sty w2 lda w1 and #%11111101 reset to daylight time ora w2 set daylight/standard time as appropriate ldx #aug_param jsr wbp write battery parameter and return lda #3600 ldx #^3600 ldy w2 beq hhm5 if selected daylight time lda #-3600 ldx #^-3600 hhm5 jsr ats adjust the time by seconds lda thdl ldx thdl+2 jsr itd init time and date lda dhdl ldx dhdl+2 jsr itd init time and date pushl thdl _DrawoneCtl hhm6 rts hhm7 ldx #aug_param jsr rbp read battery param sta w1 save for now pha space for result pushl data1 handle of checkbox control _GetCtlValue ldy #0 assume auto daylight savings plx bne hhm8 if auto daylight savings ldy #4 hhm8 sty w2 lda w1 and #%11111011 reset to auto daylight savings ora w2 set auto daylight / manual daylight as appropriate ldx #aug_param jsr wbp write battery parameter lda w2 bne hhm10 if not auto daylight savings lda format ;get current standard/daylight setting pha ;save for after call jsr sdc set daylight controls pla ;get old format cmp format ;new format different? beq @no_fmt_change @changed ;adjust hour based on change lda #3600 ldx #^3600 ldy format ;what is new format? cpy #radio6ID+1 ;daylight time? beq @daylight if selected daylight time lda #-3600 ldx #^-3600 @daylight jsr ats adjust the time by seconds @no_fmt_change ; ;bcc hhm10 if ok ; ;cpx #radio6id ; ;beq hhm9 if switching from daylight to standard time ; ;jmp sah spring ahead an hour and return ; ;hhm9 ;jmp fbh fall back an hour and return hhm10 jmp urc update radio controls and return hhm12 cmp #5 bne hhm13 if not the days left lda thdl ldx thdl+2 jsr dts disable target status lda dhdl ldx dhdl+2 jsr dts disable target status lda dispF eor #1 sta dispF lda #$ffff jsr cdsE create day string - always pushw daylen pushl dayhdl _SetCtlValue pushl dayhdl _DrawOneCtl rts hhm13 cmp #2 bne hhm15 if not date control jsr udo update date only hhm14 jsr udy update day of year bra hhm16 hhm15 jsr utd update time and date hhm16 pha pushl checkhdl _GetCtlValue pla ; beq hhm17 if not auto daylight jmp sdc set daylight controls nd return hhm17 rts ;; icc - init cdev controls. ; ; entry [data1] = window pointer. ; ; exit [checkhdl] = handle of Auto Daylight savings checkbox control. ; [radio6hdl] = handle to control for standard time button. ; [radio7hdl] = handle to control for daylight time button. ; (readyF) = 0. ; [wptr] = window pointer. ; controls are intialized to the battery settings. icc lda data1 save window pointer for later sta wptr lda data1+2 sta wptr+2 ldx #$35 parameter for ampm/24 hour format jsr rbp read battery parameter clc adc #radio4ID tax id of control to set lda #1 value to set the radio button jsr scv set control value ldx #$34 battery parameter for date format jsr rbp read battery parameter clc adc #radio1ID tax lda #1 value to set the radio button jsr scv set control value pha pha space for result pushl data1 window ptr pushl #radio6ID ID of control _GetCtlHandleFromID pulll radio6hdl pha pha space for result pushl data1 window ptr pushl #radio6ID+1 ID of control _GetCtlHandleFromID pulll radio7hdl pha space for getctlhandle call pha space for getctlhandle call pushl data1 window pointer pushl #checkid id of control _GetCtlHandleFromID pulll checkhdl lda thdl ldx thdl+2 jsr itd init time and date lda dhdl ldx dhdl+2 jsr itd set time and date ldx #aug_param jsr rbp read battery parameter and #$4 bne icc1 if not auto daylight time lda #1 ldx #checkID checkbox ID jsr scv set control value jsr sdcE set daylight controls - forced jsr urc update radio controls (dim them) bra icc3 finish things up icc1 ldx #aug_param jsr rbp read battery parameter ldx #radio6ID assume standard time and #$2 bne icc2 if standard time inx set daylight time icc2 lda #1 jsr scv set control value icc3 stz readyF pha pushl radio6hdl _GetCtlValue ldx #radio6id assume standard time pla bne icc4 if standard time is set inx daylight time is set icc4 stx format icc_setrect ;set rect to erase when switching hour display lda thdl ldx thdl+2 jsr dah dereference a handle ldy #TDCtlRec.ctlRect+6 ;start at last point in rect ldx #6 @rect_loop lda [l2],y ;access ctl record clc adc erase_offsets,x ;signed add to get our rect to erase sta erase_rect,x dey dey dex dex bpl @rect_loop rts erase_offsets ;offsets to modify ctl rect to get rectÉ ;Éwe erase when switching hour format dc.w 0,75,0,25 ;; rtc - run the cdev. ; ; entry [wptr] = window pointer. ; ; exit if the controls aren't being editted and they have ; changed, then they are updated and redisplayed. rtc0 rts rtc pha pha _FrontWindow pla plx cmp wptr bne rtc0 if not front window cpx wptr+2 bne rtc0 if not front window pha pha _FindTargetCtl pla low word plx high word sta l4 stx l4+2 cmp thdl bne rtc1 if not time handle cpx thdl+2 beq rtc2 if time handle rtc1 lda thdl ldx thdl+2 jsr itd init time and date lda oldsec cmp newsec beq rtc5 if hasn't changed yet pushl thdl _DrawOneCtl rtc2 lda l4 cmp dhdl bne rtc3 if not date handle lda l4+2 cmp dhdl+2 bne rtc3 if date handle isn't the target handle jsr udo update date only bra rtc4 rtc3 lda dhdl ldx dhdl+2 jsr itd init time and date lda oldday cmp newday beq rtc5 if hasn't changed yet pushl dhdl _DrawOneCtl rtc4 jsr udy update day of year bcs rtc5 if nothing changed jmp sdc set daylight controls and return rtc5 rts rtca dc.w 0 counter for when to draw ; teriary routines used by the message handling routines. ;; ats - adjust the time by seconds. ; ; entry [a,x] = # of seconds to adjust the time. ; ; exit clock is adjusted. ats sta l1 save change for now stx l1+2 pha space for result pha space for result pushw #6 get current time based on seconds pushl #0 pushl #buff buffer to use ldx #$3703 jsl $e10000 convert seconds ; adjust the seconds. lda 1,s clc adc l1 sta 1,s lda 1+2,s adc l1+2 sta 1+2,s plx lo word of seconds ply hi word of seconds pha space for result pha space for result pushw #7 set current time based on seconds phy hi word of seconds phx lo word of seconds pushl #buff buffer to use pushw #$e1e1 kludge for misc tools bug plb kludge for misc tools bug plb kludge for misc tools bug ldx #$3703 jsl $e10000 convert seconds phk kludge for misc tools bug plb kludge for misc tools bug pla plx rts buff ds.b 10 ;; cds - create day string. ; ; cds creates the string like 'Day 103 of this year. ; 262 days left in this year. ; ; entry (leapF) = 1 if leap year. ; ; exit (cdsa..) = string of days left in year. ; (daylen) = length of string. cds lda leapF cdsE sta cdsg jsr cdy compute day of year cmp cday sta cday bne cds1 if has definetly changed ldx leapF cpx cdsg bne cds1 if year changed to or from a leap year sec bra cds1a cds1 clc cds1a php save status for later pha int to convert pushl #cdsf dest string pushw #3 3 chars long pushw #0 unsigned _Int2Dec ldx #0 txy lda cday cmp #100 bcs cds2 if three digit # inx cmp #10 bcs cds2 if two digit # inx cds2 shortmx cds3 lda cdsf,x sta cdsa+4,y iny inx cpx #3 bcc cds3 if more to copy ldx #0 cds4 lda cdsb,x sta cdsa+4,y copy over ' of year',$d iny inx cpx #cdsbL bcc cds4 if more to copy sty w3 save offset for now longmx lda leapF clc adc #365 sta w1 length of year sec sbc cday ldx dispF beq cds5 if till end of year sbc #6 (c) set bcs cds5 if not last week of year adc w1 (c) clear, adjust for the last week cds5 sta w2 save for now pha int to convert pushl #cdsf dest string pushw #3 3 chars long pushw #0 unsigned _Int2Dec ldx #0 lda w2 cmp #100 bcs cds6 if three digit # inx cmp #10 bcs cds6 if two digit # inx cds6 ldy w3 restore offset shortmx cds7 lda cdsf,x sta cdsa+4,y save digit iny inx cpx #3 bcc cds7 if more to copy longmx lda #'d ' sta cdsa+4,y iny iny lda #'ya' sta cdsa+4,y add 'ay' iny iny ldx w2 dex beq cds8 if only 1 day left lda #' s' sta cdsa+4,y iny cds8 shortmx ldx dispF beq cds10 if till end of year ldx #0 cds9 lda cdsd,x sta cdsa+4,y iny inx cpx #cdsdL bcc cds9 if more to copy bra cds11 cds10 lda cdsc,x sta cdsa+4,y iny inx cpx #cdscL bcc cds10 if more to copy cds11 tya adc #4-1 (c) set sta daylen length of string longmx plp rts ; data used here. cdsa dc.b 'Day ' ds.b 75 hold rest of text item cdsb dc.b ' of this year.',$d cdsbL equ *-cdsb length of string cdsc dc.b ' left in this year.' cdscL equ *-cdsc length of string cdsd dc.b ' ''til Christmas.' cdsdL equ *-cdsd length of string cdsf ds.b 5 hold string cdsg ds.b 2 used to hold the old leap year flag ;; cdy - compute day of year. ; ; entry clock is set to time. ; ; exit (a) = day of year. ; (leapF) = 0 if not leap year. ; = 1 if leap year. cdy pha pha pha pha space for result _ReadTimeHex stz leapF assume not leap year lda 4,s get year and hour and #$ff remove hour cmp #100 beq cdy1 if the year 2000, then not leapyear and #3 bne cdy1 if not leap year inc leapF flag that it is a leap year cdy1 lda 6,s get month and filler and #$ff remove filler sta w1 ending month stz w2 current day count ldx #0 cdy2 cpx w1 bcs cdy4 if done lda cdymonth,x get days in this month and #$ff only low byte is significant clc adc w2 cpx #1 bne cdy3 if not adding in february clc adc leapF add in the effects of leap year cdy3 sta w2 current day count inx bra cdy2 process next month cdy4 lda 5,s get day of month and month and #$ff remove month adc w2 (c) set plx clear off stack plx plx plx rts cdymonth dc.b 31,28,31,30,31,30,31,31,30,31,30,31 ;; dah - dereference a handle. ; ; entry [a,x] = handle. ; ; exit [l2] = derefenced handle. dah sta l1 stx l1+2 lda [l1] sta l2 low word of ptr ldy #2 lda [l1],y sta l2+2 hi word of ptr rts ;; dts - disable target status. ; ; entry [a,x] = hqandle to control. ; ; exit control is no longer the target. dts sta l4 stx l4+2 jsr dah dreference a handle ldy #TDCtlRec.ctlMoreFlags lda [l2],y and #$7fff control is no longer target sta [l2],y pha pha pushl l4 control handle pushw #ctlChangeTarget pha pha _CallCtlDefProc pla pla rts ;; fbh - fall back an hour. ; ; entry none. ; ; exit clock is moved back an hour. fbh lda #-3600 ldx #^-3600 jmp ats adjust the time be seconds and return ;; gds - get daylight status. ; ; entry clock is set up to the time. ; ; exit (c) set if standard time. gds pha space for result pha space for result pha space for result pha space for result _ReadTimeHex lda 6,s get month and filler and #$ff remove filler cmp #3 bcc gds2a if not at least april, then it is standard time cmp #3 bne gds3 if not april ; see if past the first sunday in april. lda 5,s and #$ff get day of month cmp #6+1 bcs gds9 if definetly past the first sunday of the month tax stx w1 save for now lda 8,s get day of week and #$ff remove extra garbage gds1 cmp #1 beq gds2 if found the first sunday of the month dea dex bpl gds1 if more to check in the month bra gds8 if definetly standard time gds2 cpx w1 bne gds9 if past the first sunday of april ; today is the first sunday of april. lda 3,s get hour and year and #$ff remove year cmp #2 bcs gds9 if in daylight savings gds2a bra gds8 if standard time gds3 cmp #9 bcc gds9 if defintely daylight savings bne gds8 if defintely standard time lda 5,s and #$ff get day of month in low bye cmp #30-6 bcc gds9 if definetly in daylight savings tax stx w1 lda 8,s get day of week and #$ff remove extra garbage gds4 cmp #1 beq gds7 if found the last sunday of the month ina cmp #8 bcc gds5 if haven't wrapped lda #1 reset to sunday gds5 inx cpx #30+1 bcc gds4 if more to check in the month bra gds8 if defintely standard time gds7 cpx w1 bne gds9 if before the last sunday of the month ; today is the last sunday of october. lda 3,s get hour and year and #$ff remove year cmp #2 bra gds10 (c) set if standard time gds8 sec flag standard time skip1 skip the next instruction gds9 clc flag daylight savings time gds10 plx clear off stack plx plx plx rts ;; rbp - read battery parameter. ; ; entry (x) = parameter to read. ; ; exit (a) = value of parameter. rbp pha space for result phx parameter to read _ReadBparam pla get value rts ;; scv - set control value. ; ; entry (a) = value to set. ; (x) = id of control. ; ; exit none. scv pha value to set pha space for result pha pushl wptr window pointer pushw #0 phx id of control _GetCtlHandleFromID _SetCtlValue value to set was already on stack rts ;; sdc - set daylight controls. ; ; entry none ; ; exit if clock is in different time than controls then the radio ; buttons are reset. ;; alternate entrypoint: sdcE. ; ; forces the control to be set sdc clc skip1 sdcE sec ror sdca pha space for result pushl radio6hdl _GetCtlValue jsr gds get daylight status ldx #radio6id id of standard time control stx format pla bcs sdc1 if standard time inx stx format id of selected radio control ldy sdca bmi sdc2 if forced setting tay beq sdc3 if set correctly bra sdc2 ; standard time. sdc1 ldy sdca bmi sdc2 if forced setting tay bne sdc3 if set correctly sdc2 lda #1 phx save for now jsr scv set control value jsr urc update radio control sec plx id of control that is correct rts sdc3 clc rts sdca dc.w 0 ;; sah - spring ahead an hour. ; ; entry none. ; ; exit clock is moved ahead an hour. sah lda #3600 ldx #^3600 jmp ats adjust the time be seconds ;; itd - init time and date. ; ; entry [a,x] = handle to control. ; ; exit (oldsec) = old seconds. ; (newsec) = new seconds of control. ; (oldday) = old day of year of control. ; (newday) = new day of year of control. ; controls date and time fields are updated. itd jsr dah derefeence a handle pha pha pha pha _ReadTimeHex ldy #TDCtlRec.daterec lda [l2],y sta oldsec old seconds pla sta newsec new seconds sta [l2],y store seconds and minute in control iny iny pla sta [l2],y store hour and year iny iny lda [l2],y sta oldday pla sta newday sta [l2],y store day of month and month iny iny pla sta [l2],y store filler and day of week rts ;; urc - update radio controls. ; ; entry [checkhdl] = handle of checkbox control. ; [radio6hdl] = handle to standard time button. ; [radio7hdl] = handle to daylight time button. ; ; exit if the checkbox is set, the radio buttons are dimmed. urc pha pushl checkhdl _GetCtlValue ldx #inactivehilite pla bne urc1 if set ldx #nohilite urc1 phx phx what to set the radio controls to pushl radio6hdl _HiliteControl pushl radio7hdl _HiliteControl pushl radio6hdl _DrawOneCtl pushl radio7hdl _DrawOneCtl rts ;; udf - update display formats. ; ; entry [dhdl] = handle to day of year control. ; [thdl] = handle to time of day control. ; ; exit controls are reinitialized and redrawn. udf jsr wbp write battery parameter pha pha pushl dhdl control handle pushw #3 init control pushl #dctl _CallCtlDefProc pla pla pha pha pushl thdl control handle pushw #3 init control pushl #tctl _CallCtlDefProc pla pla lda thdl ldx thdl+2 jsr itd init time and date lda dhdl ldx dhdl+2 jsr itd set time and date ;pushl #udfa ;_EraseRect pushl #erase_rect _EraseRect pushl thdl _DrawOneCtl pushl dhdl _DrawOneCtl rts ;udfa dc.w 5,160+65,5+10,160+65+100 ;udfa dc.w 5,240,18,290 erase_rect ds.w 4 ;kludge rect to erase to clean ;things up -- set in icc ;; udo - update date only. ; ; entry [dhdl] = handle to day of year control. ; ; exit the date is updated in the real-time clock. udo lda dhdl ldx dhdl+2 jsr dah dereference a handle ldy #TDCtlRec.daterec+4 lda [l2],y get month and date sta w2 save for now dey dey lda [l2],y get year in hi byte and #$ff00 cmp #$400 bcs uto1 lda #$400 uto1 sta w1 save for now uto2 pha pha pha pha space for result _ReadTimeHex lda 3,s get year and hour and #$ff strip off year ora w1 add in correct year sta w3 save for now lda 1,s plx plx plx plx ldx w2 phx ldx w3 phx pha _WriteTimeHex rts ;; udy - update day of year. ; ; entry none. ; ; exit day of year string is updated. udy jsr cds create day of year string bcs udy1 if nothing changed pushw daylen pushl dayhdl _SetCtlValue pushl dayhdl _DrawOneCtl clc udy1 rts ;; utd - update time and date. ; ; entry [dhdl] = handle to day of year control. ; [thdl] = handle to time of day control. ; ; exit The system clock is updated based on the settings of the ; 2 controls. utd lda dhdl ldx dhdl+2 jsr dah dereference a handle lda utdnday sta utdoday lda utdnyear sta utdoyear ldy #TDCtlRec.daterec+4 lda [l2],y get month and date sta utdnday pha dey dey lda [l2],y get year in hi byte sta utdnyear and #$ff00 cmp #$400 bcs utd1 lda #$400 utd1 sta w1 save for now lda thdl ldx thdl+2 jsr dah dereference a handle ldy #TDCtlRec.daterec+2 lda [l2],y and #$ff leave hour in low byte ora w1 add in year pha dey dey lda [l2],y get minute and second pha _WriteTimeHex rts ; data used here. utdoyear ds.b 2 utdnyear ds.b 2 utdoday ds.b 2 utdnday ds.b 2 ;; wbp - write battery parameter. ; ; entry (a) = value of parameter to set. ; (x) = battery parameter to set. ; ; exit battery parameter is set. wbp pha new value phx parameter to set _WriteBparam rts ; data used here. cday dc.w $ffff current day of year dispF ds.b 2 = 0 to display till end of year info dayhdl ds.b 4 handle to day of year control dhdl ds.b 4 handle to date control checkhdl ds.b 4 handle to auto daylight checkbox eventrec dc.w keydownevt ds.b $30 format dc.w $ffff id of control leapF dc.w $ffff = 0 if not leap year, else = 1 newday ds.b 2 day of month from clock newsec ds.b 2 seconds value from clock oldday ds.b 2 day of month value displayed oldsec ds.b 2 seconds value currently displayed radio6hdl ds.b 4 handle to sixth radio button radio7hdl ds.b 4 handle to seventh radio button readyF dc.w $ffff flag not ready for events yet thdl ds.b 4 handle to time of day control wptr ds.b 4 window ptr endp end \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/time.date.ctl b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/time.date.ctl new file mode 100644 index 0000000..8da31e0 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/TimeCDEV/time.date.ctl @@ -0,0 +1 @@ +********************************************************************************** * * * ArchiverGS * * -- a general-purpose backup utility for the Apple][GS * * * * Custom time/date input control for auto-selection. * * * * Copyright Apple Computer Inc. 1989 ALL RIGHTS RESERVED * * * * * ********************************************************************************** ******* REVISION HISTORY: **************************************************** * * August 26, 1989 Monte Benaresh * * Created this file. * ********************************************************************************** machine M65816 jump PROC ;first bytes of this code image must be the entry point import time_date_defproc jmp time_date_defproc ENDP ;----------------------------------------------------------- ; ; New action messages supported by some controls ; ctlHandleEvent equ 13 ;Send the event record to control ctlChangeActivity equ 14 ;The activity bit in MoreFlags just changed. ctlChangeBounds equ 15 ctlWindChangeSize equ 16 ctlHandleTab equ 17 ctlNotifyMultiPart equ 18 ;Called if set and when HideControl is called ctlWinStateChange equ 19 ;Called if window state changes. MaxMessages equ 19 ;----------------------------------------------------------- ; ; Extended task record def ; NewTaskRecord RECORD 0 taskWhat ds.W 1 ; Word - WmTaskRec - taskMessage ds.L 1 ; Long - WmTaskRec - taskWhen ds.L 1 ; Long - WmTaskRec - taskWhere ds.L 1 ; Point - WmTaskRec - taskModifiers ds.W 1 ; Word - WmTaskRec - taskData ds.L 1 ; Long - WmTaskRec - TaskMaster return value. taskMask ds.L 1 ; Long - WmTaskRec - TaskMaster feature mask. taskLastClick ds.L 1 taskClickCount ds.W 1 taskData2 ds.L 1 taskData3 ds.L 1 taskData4 ds.L 1 ENDR nullEvt EQU $0000 ; Event Code - mouseDownEvt EQU $0001 ; Event Code - mouseUpEvt EQU $0002 ; Event Code - keyDownEvt EQU $0003 ; Event Code - autoKeyEvt EQU $0005 ; Event Code - updateEvt EQU $0006 ; Event Code - activateEvt EQU $0008 ; Event Code - switchEvt EQU $0009 ; Event Code - deskAccEvt EQU $000A ; Event Code - driverEvt EQU $000B ; Event Code - app1Evt EQU $000C ; Event Code - app2Evt EQU $000D ; Event Code - app3Evt EQU $000E ; Event Code - app4Evt EQU $000F ; Event Code - gsos_date RECORD 0 ;GS/OSª time and date format seconds ds.b 1 minutes ds.b 1 hour ds.b 1 year ds.b 1 day ds.b 1 month ds.b 1 null ds.b 1 weekday ds.b 1 ENDR ************************************************************* * special fudge equates * ************************************************************* arrow_height equ 4 ;height of each arrow pixels arrow_width equ 20 ;width of arrows in pixels icon_width equ 5 ;byte width of arrow icons rect_height equ arrow_height*2 + 5 ;height of control rectangle string_v_pos equ 2 ;vertical adjustment for string position string_h_pos equ 3 ;horizontal adjustment for string position TDCtlRec RECORD 0 ;record for the Time/Date control ctlNext ds.l 1 ctlOwner ds.l 1 ctlRect ds.w 4 ctlFlag ds.b 1 ctlHilite ds.b 1 ctlValue ds.w 1 ctlProc ds.l 1 ctlAction ds.l 1 ctlData ds.l 1 ctlRefCon ds.l 1 ctlColor ds.l 1 ctlReserved ds.b 16 ctlID ds.l 1 ctlMoreFlags ds.w 1 ;bit 0 = 1 --> 24 hour format ;bit 1 = 1 --> control currently dimmed ctlVersion ds.w 1 ;control-specific fields dateRec ds.b 8 ;GS/OS time/date record cwidth ds.w 1 ;width of each character in the string arrowPos ds.w 1 ;pixel position of arrows relative to control rect currPart ds.w 1 ;currently active part (string field) formatRef ds.w 1 ;pointer to format table drawFlag ds.w 1 ;flag to tell us not to draw twice when we get shown ctlSize ctlKey1 equ ctlReserved ctlKey2 equ ctlKey1+1 ctlKeyMods equ ctlKey2+1 ctlKeyModsCareBits equ ctlKeyMods+2 ctlJust equ ctlReserved ENDR ************************************************************* * part codes for the control * ************************************************************* ;values in the range 32-127 are available for application use part_month equ 32 part_1st equ part_month part_day equ 33 part_year equ 34 part_hour equ 35 part_minute equ 36 if seconds = 1 then part_second equ 37 ;include seconds part_am_pm equ 38 part_up equ 39 ;up arrow part_down equ 40 ;down arrow else part_am_pm equ 37 ;exclude seconds part_up equ 38 ;up arrow part_down equ 39 ;down arrow endif part_last_str equ part_am_pm ;highest part number of string field ;indexes into tables for each part month_index equ 0 day_index equ 2 year_index equ 4 hour_index equ 6 minute_index equ 8 if seconds = 1 then second_index equ 10 ;include seconds am_pm_index equ 12 else am_pm_index equ 10 ;exclude seconds endif ;other random equates tabChar equ $09 ;TAB character up_arrow_key equ 11 dn_arrow_key equ 10 l_arrow_key equ 8 ;left arrow r_arrow_key equ 21 ;right arrow repeat_delay equ 25 ;ticks before auto-repeat when tracking repeat_period equ 6 ;ticks between auto-repeat when tracking string_buf_size equ 28 ;size of the string buffer dp RECORD 1 ;offsets on direct page if seconds = 1 then field_count equ 7 else field_count equ 6 endif ;direct-page for private use: ctl_ptr ds.l 1 ;dereferenced control handle table_ptr ds.w 1 ;short ptr to format table format_table ;copy of format table string_size ds.w 1 part_left ds.w field_count part_right ds.w field_count part_next ds.w field_count part_prev ds.w field_count first_field ds.w 1 last_field ds.w 1 dp_size equ *-1 ;pushed parameters: old_dp ds.w 1 ;caller's direct page old_db ds.b 1 ;caller's DBR return_addr ds.b 3 move_start ;start of stuff to skip over when fixing stack theControlHandle ds.l 1 ctlParam ds.l 1 ctlMessage ds.w 1 move_end ;end of stuff to skip over when fixing stack result ds.l 1 move_dist equ move_end-move_start ;distance to move parametersÉ ;Éwhen fixing stack ENDR ;global storage for the control hour_flag ds.w 1 ;space for flag in high bit to indicate 24-hour format long_field_flag dc.w 0 ;flag to tell set_field_rect whether it shouldÉ ;Éinclude white space at end of a string fieldÉ ;Éwhen figuring the rectangle bounds. default isÉ ;É$0000 = do NOT include white space temp_rect ds.b 16 ;space for temporary RECT structure for use with PtInRect mouse_pos ds.w 2 ;this space used for point returned by GetMouse old_port ds.l 1 ;Graph Port on entry, to be restored on exit old_pen_state ds.b 50 ;Pen State record on entry, restored on exit dim_pen_mask dcb.w 4,$55AA ;used to dim control export time_date_defproc time_date_defproc PROC ;defproc for the time/date control import div_ten import calc_c_coord import pt_in_rect import set_field_rect import invert_part import draw_arrow_icon import build_string import change_value import format1 import format2 if table3 = 1 then import format3 endif import table_length import draw_frame import hide_frame import roll_field import set_up_table import set_up_table2 import hide_arrows import set_arrow_rect phb ;save data bank phk ;set up our bank register plb ;brk $41 phd ;save old direct page tsc sec sbc #dp.dp_size ;make room for direct page tcs tcd set_up ldx >16 ;buffer for current pen state pea old_pen_state ldx #$2B04 ;GetPenState jsl $E10000 ;save current pen in this GrafPort ;set up our pen ldx #$3604 ;PenNormal jsl $E10000 pea $0002 ;new pen width pea $0001 ;new pen height ldx #$2C04 ;SetPenSize jsl $E10000 ldx >16 pea temp_rect ldx #$5504 ;EraseRect jsl $E10000 ;erase rect enclosing that part @no_erase ;now would be a good time to draw the string jsr build_string ;compile the display string ldy #TDCtlRec.ctlRect + 2 ;point to left edge of control's rectangle lda [dp.ctl_ptr],y ;get x coordinate clc adc #string_h_pos ;adjust to make room for frame pha dey dey ;back to top edge lda [dp.ctl_ptr],y ;get y coordinate clc adc #8+string_v_pos ;add ascent for Shaston font + adjustment pha ldx #$3A04 ;MoveTo jsl $E10000 pha ;space for result ldx #$9904 ;GetFontFlags jsl $E10000 ;leave old FontFlags on stack pea $0002 ;select numeric spacing for DrawString ldx #$9804 ;SetFontFlags jsl $E10000 pea string_buf>>16 pea string_buf ldx #$A504 ;DrawString jsl $E10000 ;draw the string ;previous FontFlags word is still on stack ldx #$9804 ;SetFontFlags jsl $E10000 ldy #TDCtlRec.currPart lda [dp.ctl_ptr],y ;is any part hilighted? pha ;save on STACK ;beq @no_part ;removed 1/14/91 to keep frame permanent jsr draw_frame ;if active part, draw frame @no_part pla ;restore part code ldx >16 ;now draw arrows ldx #arrows jsr draw_arrow_icon ;draw this arrow icon bra @done @inactive ldy #TDCtlRec.ctlMoreFlags lda [dp.ctl_ptr],y ;get MoreFlags ora #$0002 ;set flag to tell draw routine that imageÉ ;Éis in inactive state sta [dp.ctl_ptr],y jsr hide_arrows ;get rid of arrows pea dim_pen_mask>>16 ;set to dimming pattern for inactive pea dim_pen_mask ldx #$3204 ;SetPenMask jsl $E10000 pea $8000 ;pen mode notCopy, draw in white ldx #$2E04 ;SetPenMode jsl $E10000 lda >16 ldx #arrows jsr draw_arrow_icon ;draw this arrow icon @draw_frame ;put box around control when active ;jsr draw_frame ;removed 1/14/91 since frame now permanent brl done @hide_arrows jsr hide_arrows ldy #TDCtlRec.ctlMoreFlags lda [dp.ctl_ptr],y ;get MoreFlags and #$0002 ;are we in a dimmed state? bne @no_invert ;if dimmed, don't try to invert ldy #TDCtlRec.currPart lda [dp.ctl_ptr],y ;what part is currently hilighted? beq @no_part ;should never be taken jsr invert_part @no_invert ldy #TDCtlRec.currPart lda #0 sta [dp.ctl_ptr],y ;set current part to null @hide_frame ;jsr hide_frame ;removed 1/14/91 to keep frame permanent @no_part brl done handleEvent ldy #TDCtlRec.ctlFlag lda [dp.ctl_ptr],y ;get flags and #$0080 ;is it invisible? bne @dont_handle @visible ldy #NewTaskRecord.taskWhat lda [dp.ctlParam],y ;what event is it? cmp #keyDownEvt beq @key cmp #autoKeyEvt beq @key @dont_handle stz >16 ;set up icon reference sta icon_ref+2 lda #arrows_up sta icon_ref bra @loop ;ready to enter the track loop @down lda temp_rect+4 ;get bottom edge sec sbc #arrow_height+string_v_pos+1 sta temp_rect ;set top edge lda #arrows_down>>16 ;set up icon reference sta icon_ref+2 lda #arrows_down sta icon_ref @loop pha ;space for result pea 0 ;read mouse button ldx #$0F06 ;WaitMouseUp jsl $E10000 pla ;boolean result bne @still_down brl @done @still_down ;mouse button still down pea mouse_pos>>16 pea mouse_pos ldx #$0C06 ;GetMouse jsl $E10000 ;where is mouse? ;now test with PtInRect jsr pt_in_rect ;call PtInRect bne @in brl @out @in lda #$8000 ;use high bit as flag tsb drawn_flag ;I always wanted to use this instruction beq @first_down ;bit was clear, first mouse down pha pha ;space for result ldx #$2503 ;GetTick jsl $E10000 pla ;get low word sta now_tick pla sta now_tick+2 lda timeout_tick+2 ;when do we time out? cmp now_tick+2 ;are we past that time? bcc @timeout ;high word past it lda timeout_tick cmp now_tick ;low words bcc @timeout bra @loop ;we haven't timed out yet @first_down ;draw the arrows in hilighted state ldx icon_ref ldy icon_ref+2 jsr draw_arrow_icon pha pha ;space for result ldx #$2503 ;GetTick jsl $E10000 pla ;low word clc adc #repeat_delay ;set delay before auto-repeat sta timeout_tick ;this is tick count at next timeout pla ;high word adc #0 sta timeout_tick+2 bra @change_value ;first down changes value @timeout lda now_tick clc adc #repeat_period ;set delay between auto-repeats sta timeout_tick lda now_tick+2 adc #0 sta timeout_tick+2 @change_value ;change control value ;brk $4C lda >16 ldx #arrows jsr draw_arrow_icon brl @loop ;re-enter track loop @done ;draw the arrows in inactive state ldy #arrows>>16 ldx #arrows jsr draw_arrow_icon bra done stateChange ;owner window has changed state lda dp.ctlParam ;which way is state changing? bne @activate ;just invalidate our rect @deactivate ldy #TDCtlRec.ctlMoreFlags lda [dp.ctl_ptr],y ;get MoreFlags ora #$0002 ;set flag to tell draw routine that imageÉ ;Éis in inactive state sta [dp.ctl_ptr],y @activate ;invalidate ctl rect to ensure it's in update rgn lda dp.ctl_ptr clc adc #TDCtlRec.ctlRect tax lda dp.ctl_ptr+2 adc #0 pha phx ldx #$3A0E ;InvalRect jsl $E10000 @done bra done not_implemented stz >16 ;restore pen in this port pea old_pen_state ldx #$2A04 ;SetPenState jsl $E10000 lda old_port+2 ;now restore old GrafPort pha lda old_port pha ldx #$1B04 ;SetPort jsl $E10000 done_no_rec ;exit point for RecSize WITH dp lda >16 ;this is the point of interest pea mouse_pos ;Éof the point passed to us on the stack pea temp_rect>>16 pea temp_rect ldx #$4F04 ;PtInRect jsl $E10000 pla ;get boolean result rts ENDP export invert_part invert_part PROC ;invert rectangle belonging to a part ;enter with part in accumulator sec sbc #part_1st ;get relative part number asl a ;word offset pha ;save for below tax lda >16 pea temp_rect ldx #$5604 ;InvertRect jsl $E10000 ;this should invert the part rts ENDP export draw_arrow_icon draw_arrow_icon PROC ;draw one of the various arrow icons import LocInfoRec ;enter with icon refernce in X (low) and Y (high) phy ;high word of icon reference phx ;low word " " " pea LocInfoRec>>16 pea |LocInfoRec ldy #TDCtlRec.arrowPos lda [dp.ctl_ptr],y ;get position of arrows ldy #TDCtlRec.ctlRect+2 ;point to left edge clc adc [dp.ctl_ptr],y ;add left edge pha ldy #TDCtlRec.ctlRect lda [dp.ctl_ptr],y ;get top edge clc adc #string_v_pos pha lda #0 ;pen mode = modeCopy pha ldx #$D604 ;PPToPort jsl $E10000 ;draw the icon rts ENDP export build_string build_string PROC ;build the display string import string_buf import hex_to_ascii import month_table ldx include whiteÉ ; Éspace ; = 1 --> don't include sec sbc #part_1st ;get relative part number asl a ;use as word offset pha ;save for below tax ;index lda 1 then ;no support for year-month-day? stz dp.part_next+year_index ;indicate that year has no right neighbor endif ;this was already done in code generatedÉ ;Éfor year-month-day ; set new last field if table3 = 1 then ;do we need year-month-day? lda dp.part_prev+hour_index ;what is the last field now? else lda #part_year ;we know last field if there is noÉ ;Éyear-month-day format endif sta dp.last_field bra done ;setup is done @time_only ; adjust character positions now that date is gone ;figure out how much to adjust by lda dp.part_left+hour_index ;offset in characters eor #$FFFF ;complement so we can add, but is ONE LESS tay ;keep in register ;field positions by # of chars in date portion sec ;use carry set b/c complement is off by 1!! adc dp.string_size ;subtract hour offset sta dp.string_size ldx #(part_am_pm-part_year)*2 ;index across word for each time field in loop @time_loop ;adjust string positions of time fields ;enter with complement-1 of adjustment in Y tya ;restore complement of hour position -1 sec ;use carry set b/c complement is off by one!! adc dp.part_right+hour_index-2,x ;subtract hour offset sta dp.part_right+hour_index-2,x ;put back tya ;restore complement of hour position -1 sec ;use carry set b/c complement is off by one!! adc dp.part_left+hour_index-2,x ;subtract hour offset sta dp.part_left+hour_index-2,x ;put back dex dex ;pull index back a word bne @time_loop ; terminate left neighbor link list stz dp.part_prev+hour_index ;hour has no left neighbor lda #part_hour sta dp.first_field lda #part_am_pm sta dp.last_field @both ;now patch table if 24-hour format ldy #TDCtlRec.ctlMoreFlags lda [dp.ctl_ptr],y and #$0001 ;24-hour format? beq @12 ;branch if 12-hour format @24 ;patch-out AM/PM field in table lda dp.string_size dec a dec a dec a ;account for space and 2 characters sta dp.string_size if seconds = 1 then stz dp.part_next+second_index ;indicate that seconds field has no right neighbor else stz dp.part_next+minute_index ;indicate that minutes field has no right neighbor endif dec dp.last_field ;bump down to minutes @12 done rts ENDP export hide_arrows hide_arrows PROC ;erase rect where arrows are drawn import set_arrow_rect ;first set up rectangle that contains arrows jsr set_arrow_rect ;set temp_rect to rect enclosing both arrows pea temp_rect>>16 pea temp_rect ldx #$5504 ;EraseRect jsl $E10000 ;erase the arrows rts ENDP set_arrow_rect PROC ;set temp_rect to rect enclosing both arrows import arrows ldy #TDCtlRec.ctlRect ;point to top edge of control rect lda [dp.ctl_ptr],y inc a ;move 1 pixel from frame sta temp_rect ;set top edge ldy #TDCtlRec.ctlRect+4 ;point to bottom edge of control rect lda [dp.ctl_ptr],y dec a ;move 1 pixel from frame sta temp_rect+4 ;set bottom edge ldy #TDCtlRec.arrowPos lda [dp.ctl_ptr],y ;get arrow position ldy #TDCtlRec.ctlRect+2 ;point to left edge clc adc [dp.ctl_ptr],y ;add left edge sta temp_rect+2 lda #arrow_width bit arrows-1 ;test SCB bmi @640 @320 lsr a ;divide by 2 for 320 mode @640 clc adc temp_rect+2 ;add to left edge sta temp_rect+6 ;set right edge rts ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/cdev.h b/IIGS.601.SRC/A.U.G/CtlPanel/cdev.h new file mode 100644 index 0000000..ff603fa --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/cdev.h @@ -0,0 +1 @@ +;;; cdev.h - standard equates for cdevs. ; ; Michael V. Stein 01/08/90. ; ; Copyright Apple, 1990. MachineCDEV equ 1 ;called when rebuilding cdev.data to see if cdev should be included BootCDEV equ 2 ;boot time init call or install call - no params ShutDownCDEV equ 3 ;reserved for future use InitCDEV equ 4 ;called when being shown - data1 equ windowPtr CloseCDEV equ 5 ;called when being removed - data1 equ windowPtr EventsCDEV equ 6 ;called when an event - data1 equ ptr to event record CreateCDEV equ 7 ;called so that CDEV can create its controls inline - data1 equ window AboutCDEV equ 8 ;called so that CDEV can create its about text inline - no params RectCDEV equ 9 ;called so that CDEV can dynamically compute its rectangle HitCDEV equ 10 ;called when ctl is "hit" - data1 equ Hdl to Ctl hit, data2 equ Ctl Id RunCDEV equ 11 ;caled when da run is called reserved1 equ 12 ;reserved for future use reserved2 equ 13 ;reserved for future use reserved3 equ 14 ;reserved for future use NeverUsed1 equ 15 ;this will never be used NeverUsed2 equ 16 ;this will never be used wantMachine equ 1 wantBoot equ 2 wantShutDown equ 4 wantInit equ 8 wantClose equ 16 wantEvents equ 32 wantCreate equ 64 wantAbout equ 128 wantRect equ 256 wantHit equ 512 wantRun equ 1024 wantReserved1 equ 2048 wantReserved2 equ 4096 wantReserved3 equ 8192 updateSSfromBRAM equ 16384 CanBeUnActive equ 32768 CDEV_ResType equ $8018 FLAG_ResType equ $8019 TwoRect_ResType equ $801A rCodeResource equ $8017 CDEV_FileType equ $C7 CDEV_AuxType equ 0 CDEVDATA_FileType equ $00 CDEVDATA_AuxType equ $00 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/commonmacros.h b/IIGS.601.SRC/A.U.G/CtlPanel/commonmacros.h new file mode 100644 index 0000000..48625c7 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/commonmacros.h @@ -0,0 +1 @@ +;............................................................... ; ; Push 2 bytes onto stack ; ; pushw loc -- pushes bytes onto stack from 'loc' ; pushw loc,x -- pushes bytes onto stack from 'loc,x' ; pushw #n -- pushes constant #n onto stack ; pushw -- pushes bytes onto stack (from A) ;............................................................... MACRO pushw &addr,® IF &addr[1:1]='#' AND &SETTING('LONGA')='ON' THEN pea |&addr[2:255] ELSE IF &addr­'' THEN IF ®­'' THEN lda &addr,® ELSE lda &addr ENDIF ENDIF pha ENDIF MEND ;............................................................ ; ; Pull long (4 bytes) from stack ; ; pulllong address - pull off stack to address ; pulllong addr1,addr2 - pull off stack into 2 places ; pulllong [zeropage],offset - pull off stack and store indirectly ; pulllong - pull off stack and leave in A ;............................................................... MACRO pulll &addr1,&addr2 IF &addr1='' THEN IF &addr2­'' THEN AERROR 'Illegal 2nd parameter' ENDIF pullw pullw ELSEIF &addr2='' THEN pullw &addr1 pullw &addr1+2 ELSEIF &addr1[1:1]='[' THEN ldy #&addr2 pullw &addr1,y ldy #&addr2+2 pullw &addr1,y ELSE pullw &addr1 sta &addr2 pullw &addr1+2 sta &addr2+2 ENDIF MEND ;............................................................... ; ; Pull 2 bytes from stack ; ; pullw loc -- pulls bytes off stack and stores in 'loc' ; pullw loc,x -- pulls bytes off stack and stores in 'loc,x' ; pullw -- pulls bytes off stack and leaves in A ;............................................................... MACRO pullw &addr,® pla IF &addr­'' THEN IF ®­'' THEN sta &addr,® ELSE sta &addr ENDIF ELSEIF ®­'' THEN AERROR 'Illegal 2nd parameter' ENDIF MEND ;............................................................ ; ; Push long (4 bytes) onto stack ; ; pushl address - push contents of address ; pushl address,x - push contents of address,x ; pushl const,s - push contents of stack+const ; pushl #address/const - push address or constant ; pushl [zeropage],offset - push using indirect address ;............................................................... MACRO pushl &addr,&offset IF &addr[1:1]='#' THEN pea &addr[2:255]>>16 pea |&addr[2:255] ELSEIF &addr[1:1]='[' THEN ldy #&offset+2 pushw &addr,y ldy #&offset pushw &addr,y ELSEIF &offset='s' THEN pushw &addr,s pushw &addr,s ELSEIF &offset='' THEN pushw &addr+2 pushw &addr ELSE pushw &addr+2,&offset pushw &addr,&offset ENDIF MEND ; skip1 - skip the next byte MACRO skip1 dc.b $24 ENDM ; skip2 - skip the next 2 bytes. MACRO skip2 dc.b $2c ENDM \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/CtlPanel/dp.h b/IIGS.601.SRC/A.U.G/CtlPanel/dp.h new file mode 100644 index 0000000..92160a1 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/CtlPanel/dp.h @@ -0,0 +1 @@ +;;; dp - some standard direct page equates for cdevs. ; ; Michael V. Stein 01/12/90. ; ; © Copyright Apple, 1990. blanks off ;; direct page definitions. l1 equ 1 4 byte direct page equates l2 equ l1+4 l3 equ l2+4 l4 equ l3+4 l5 equ l4+4 w1 equ l5+4 2 byte direct page equates w2 equ w1+2 w3 equ w2+2 w4 equ w3+2 w5 equ w4+2 w6 equ w5+2 dpsize equ w6+2-1 size of additional stack needed for direct page data2 equ w6+2+1+3 get past data bank and rtl address data1 equ data2+4 message equ data1+4 stkoff equ dpsize+2 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/EasyAccess/EasyAccess.aii b/IIGS.601.SRC/A.U.G/EasyAccess/EasyAccess.aii new file mode 100644 index 0000000..e628c16 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/EasyAccess/EasyAccess.aii @@ -0,0 +1 @@ +*===============================================* * * * File: EasyAccess.aii * * Project: Easy Access for the IIGS * * Author: Don J. Brady * * Build file: EasyAccess.Make * * * * Copyright © Apple Computer, Inc. 1989,1990 * * All rights reserved. * *-----------------------------------------------* * Modification History: * * 11/07/89 DJB - File created today * * * 12/5/90 JLM - Bug fixed today with recognition of early ROM 01 machines * * 6-Jun-91 Dave Lyons * Added a single XBA instruction when pushing * the parmeters to FakeMouse. This was making * modifiers not work on keyboard-mouse clicks. * * * *===============================================* STRING ASIS PRINT NOPAGE PRINT NOGEN PRINT OFF INCLUDE 'M16.Memory' ; toolbox macros INCLUDE 'M16.Quickdraw' INCLUDE 'M16.Event' INCLUDE 'M16.Menu' INCLUDE 'M16.Locator' INCLUDE 'M16.MiscTool' INCLUDE 'M16.ADB' INCLUDE 'M16.IntMath' INCLUDE 'E16.ADB' ; toolbox equates INCLUDE 'EasyAccess.equ' PRINT ON picDV equ 8 picDH equ 20 picX equ 640-picDH-4 picY equ 2 *===============================================* Start PROC IMPORT Install brl Install ENDP *===============================================* * Data used by Easy Access * *===============================================* GlobalData PROC ;--- general data: ENTRY UserID UserID ds.W 1 ENTRY ADBVersion ADBVersion ds.W 1 ENTRY Temp Temp ds.B 8 ENTRY ModsToFree ModsToFree dc.W 0 ENTRY NewImage NewImage dc.L 0 ENTRY LastTick LastTick dc.L 0 ;--- data for MouseKeys: ENTRY MouseKeysOn MouseKeysOn dc.W 0 ENTRY MKMultOn MKMultOn dc.W 0 ENTRY MouseDirection MouseDirection dc.W 0 ENTRY PixelsPerPress PixelsPerPress dc.W 0 ENTRY ButtonState ButtonState dc.W 0 ENTRY ClampAddr ClampAddr ds.L 1 ENTRY MKLastTick MKLastTick ds.L 1 ENTRY MKDelayPassed MKDelayPassed ds.W 1 ENTRY MKAccelPassed MKAccelPassed ds.W 1 ENTRY MKDelayTicks MKDelayTicks ds.W 1 ENTRY MKAccelTicks MKAccelTicks ds.W 1 ENTRY SubPixTotal SubPixTotal ds.W 1 ENTRY SubPixDelta SubPixDelta ds.W 1 ENTRY SubPixMax SubPixMax ds.W 1 ENTRY SubPixAccel SubPixAccel ds.W 1 ENTRY MKDelayData ; ticks to wait MKDelayData dc.W 15 ; 0.25 sec dc.W 30 ; 0.50 sec dc.W 45 ; 0.75 sec dc.W 60 ; 1.00 sec dc.W 75 ; 1.25 sec ENTRY MKAccelData ; ticks until max speed MKAccelData dc.W 360 ; 6.0 sec dc.W 270 ; 4.5 sec dc.W 180 ; 3.0 sec dc.W 90 ; 1.5 sec dc.W 0 ; 0.0 sec ENTRY MKSpeedData MKSpeedData ; 1/256th pixels per tick (sub pixels) dc.W 8*256/60 ; 8 pixels/sec dc.W 11*256/60 ; 11 " dc.W 15*256/60 ; 15 " dc.W 20*256/60 ; 20 " dc.W 24*256/60 ; 24 " dc.W 30*256/60 ; 30 " dc.W 40*256/60 ; 40 " dc.W 60*256/60 ; 60 " dc.W 120*256/60 ; 120 " dc.W 180*256/60 ; 180 " ;--- data for sticky keys: ENTRY TempY TempY dc.W 0 ENTRY TempX TempX dc.W 0 ENTRY LastKey LastKey dc.W 0 ENTRY KeyCount KeyCount dc.W 0 ENTRY Flag Flag dc.W 0 ENTRY SBits SBits dc.W 0 ENTRY LBits LBits dc.W 0 ENTRY ADBData ADBData dc.W 0 ;--- ROM 03 sticky keys data: ENTRY LastLockState LastLockState dc.W 0 ENTRY LastStuckState LastStuckState dc.W 0 ENTRY LastBits LastBits dc.W 0 ENTRY LastState LastState dc.W 0 ENTRY PicLocInfo ENTRY PicImage ENTRY PicRect PicLocInfo DC.W $80 ; port SCB PicImage DC.L $0000 ; image ptr DC.W 5 ; image width (bytes) PicRect DC.W 0,0,picDV,picDH ; bounds rect ENTRY PicPt PicPt dc.W picY,picX ENTRY OnImage OnImage dc.B $00,$00,$00,$00,$00 dc.B $00,$00,$00,$00,$00 dc.B $00,$00,$00,$00,$00 dc.B $00,$00,$00,$00,$00 dc.B $0F,$F0,$00,$00,$FF dc.B $00,$F0,$00,$00,$F0 dc.B $00,$F0,$00,$00,$F0 dc.B $00,$FF,$FF,$FF,$F0 ENTRY StickImage StickImage dc.B $00,$00,$0F,$00,$00 dc.B $00,$00,$0F,$00,$00 dc.B $00,$0F,$FF,$FF,$00 dc.B $00,$00,$FF,$F0,$00 dc.B $0F,$F0,$0F,$00,$FF dc.B $00,$F0,$00,$00,$F0 dc.B $00,$F0,$00,$00,$F0 dc.B $00,$FF,$FF,$FF,$F0 ENTRY LockImage LockImage dc.B $00,$00,$0F,$00,$00 dc.B $00,$00,$0F,$00,$00 dc.B $00,$0F,$FF,$FF,$00 dc.B $00,$00,$FF,$F0,$00 dc.B $0F,$F0,$0F,$00,$FF dc.B $00,$FF,$FF,$FF,$F0 dc.B $00,$FF,$FF,$FF,$F0 dc.B $00,$FF,$FF,$FF,$F0 ENTRY NumToBitMask NumToBitMask dc.W %00000001 ; 0, control dc.W %00000010 ; 1, apple dc.W %00000100 ; 2, shift dc.W %00001000 ; 3, caps lock dc.W %00010000 ; 4, option ;--- vectors to patch: ENTRY GetNextEventVec GetNextEventVec dc.B $5C ; jml $bbAAAA dc.L 0 ENTRY DrawMenuBarVec DrawMenuBarVec dc.B $5C ; jml $bbAAAA dc.L 0 ENTRY BRSVec BRSVec dc.B $5C ; jml $bbAAAA dc.L 0 ENDP *===============================================* * * * Patch into ADB keyboard * * * *===============================================* Install PROC LONGA ON LONGI ON IMPORT NewTSFuncPtr IMPORT MyGetNextEvent IMPORT MyDrawMenuBar IMPORT PatchKeyboard IMPORT GetKeyModBits IMPORT CheckMKeyParams phb ; use local addressing phk plb jsr GetKeyModBits and #kmOption ; if option key down beq ok brl exit ; don't install patch ok pha ; space for userID (word) _MMStartUp pla sta UserID ; used for memory allocations stz MouseKeysOn ;--- Check which version of ADB micro: pea 1 ; number of data bytes pea Temp>>16 ; pointer to data pea Temp pea readVersionNum ; command _ReadKeyMicroData lda Temp sta ADBVersion ; 12/5/90 Mensch ; OOops Don had a bug here where he was testing for a certain key micro version ; what he should have done was level test to insure that the key micro is earlier ; than rom 03 ; was: ; cmp #adbVerROM01 ; bne @skip ; cmp #adbVerROM03 bge @skip ; only need completion routine if ROM 01 ;--- Move keyboard to new address: jsr PatchKeyboard ;--- Get data for MouseKeys: pha ; space for address (long) pha pea mouseClamps _GetAddr ; get address of mouse clamps pla sta ClampAddr pla sta ClampAddr+2 jsr CheckMKeyParams ; get MouseKeys parameters from BRAM ;--- Install toolbox patches: @skip pha ; space for result (long) pha pea GetNextEvent pea MyGetNextEvent>>16 pea MyGetNextEvent-1 jsl NewTSFuncPtr ; patch out _GetNextEvent pla plx inc a bne @set1 inx @set1 sta GetNextEventVec+1 stx GetNextEventVec+3 pha ; space for result (long) pha pea DrawMenuBar pea MyDrawMenuBar>>16 pea MyDrawMenuBar-1 jsl NewTSFuncPtr ; patch out _DrawMenuBar pla plx inc a bne @set2 inx @set2 sta DrawMenuBarVec+1 stx DrawMenuBarVec+3 _SetDefaultTPT ; permanently install these patches! exit plb rtl ENDP *===============================================* PatchKeyboard PROC LONGA ON LONGI ON IMPORT KBCompletion IMPORT SendADBInfo IMPORT KMSTATUSTask ;--- disable keymicro autopoll ldx #1 ; bytes to send ldy #setModes ; command = disable keyboard autopoll lda #%00000001 ; data (bit 0 = ADB keyboard autopoll) jsr SendADBInfo ;--- install our SRQ routine: pea KBCompletion>>16 pea KBCompletion pea $02 ; register 0 and ADB address of 2 _SRQPoll ; add device to SRQ list ;--- now patch BSR vector: pha pha pea BRAMSetupVec _GetVector pla sta >BRSVec+1 pla sta >BRSVec+3 pea BRAMSetupVec pea _Patch>>16 pea _Patch _SetVector ; insall VBL task to fix bug: pea KMSTATUSTask>>16 pea KMSTATUSTask _SetHeartBeat ; install our vbl task rts ;----------------------------------------------- ; ; We must patch the ToSetBRAM routine since ; it is 'bad' and makes an ADB abort ($01) call. ; Since the abort call reenables autopoll, this ; causes our keyboard "patch" to be undone. This ; patch will fix the problem by disabling autopoll ; again after the ToSetBRAM routine is finished. ; ;----------------------------------------------- _Patch LONGA OFF LONGI OFF jsl BRSVec ; first call real routine php ; save carry, M and X flags rep #$30 ; force 16-bit registers LONGA ON LONGI ON ; disable auto poll again: ldx #1 ; bytes to send ldy #setModes ; command = disable keyboard autopoll lda #%00000001 ; data (bit 0 = ADB keyboard autopoll) jsr SendADBInfo plp ; resore carry, M and X flags rtl ENDP *===============================================* * Our Keyboard SRQ Completion Routine * * * * This routine is called everytime the keyboard * * has data to process (i.e. keystrokes). * * * * In: stack = rtlAddr1 (3 bytes) * * rtlAddr2 (3 bytes) * * dataPtr (4 bytes) * * * * Out: dataPtr removed from stack * * carry flag is clear * *===============================================* KBCompletion PROC dataBank SET 1 ; stack offsets dirPage SET dataBank+1 rtlAddr1 SET dirPage+2 rtlAddr2 SET rtlAddr1+3 dataPtr SET rtlAddr2+3 LONGA OFF ; completion uses 8-bit mode LONGI OFF IMPORT StickyKeys IMPORT MouseKeys IMPORT PostKey IMPORT FreeModifiers IMPORT TestForReset phb phd phk plb tsc ; make a stack frame tcd lda [$FF8000 ; debug trigger tay ; save copy of A in Y and #kcMask cmp #kcReset beq reset ; reset key is special case tya and #$FF00 xba tax ; X <-- key code #2 tya and #$00FF ; A <-- key code #1 bra process reset tya ; note: reset key code is 2 bytes ldx #nullKey process phx ; save 2nd key stroke jsr TestForReset jsr StickyKeys jsr MouseKeys ; must be checked last plx ; get 2nd key stroke pha ; save 1st key result txa jsr StickyKeys jsr MouseKeys plx ; get back 1st key result pha ; save 2nd key result txa jsr PostKey ; post the 1st key pla jsr PostKey ; post the 2nd key jsr FreeModifiers ; release latched modifier keys sep #$30 LONGA OFF LONGI OFF exit pld plb clc rtl ENDP *===============================================* * Post a key to the ADB micro * * * * This routine will post a key to the ADB micro * * controller via the ADB toolset. The 'key' * * then appears at the hardware loaction $C000 * * (or at $C025 if its a modifier key) as if it * * came stright from the keyboard. * * * * In: a-reg has raw key code * * Out: none * * * * trashes Temp * *===============================================* PostKey PROC LONGA ON LONGI ON IMPORT SendADBInfo IMPORT GetKeyModBits cmp #nullKey ; null key code? beq skip ; yes, so skip cmp #$00E0 ; is keycode ³ E0 ? bcs skip ; yes, so throw it away cmp #kcFirstMod ; is it a mod key down code? bcc ok cmp #kcLastMod+1 bcs ok tax ; save key code sec sbc #kcFirstMod ; convert to table index asl a tay jsr GetKeyModBits and BitMasks,y bne skip ; already down, so skip txa ; restore key code ok ldx #1 ; bytes to send ldy #keyCode ; command = send key code jsr SendADBInfo ; post key code to key micro skip rts BitMasks DC.W kmControl DC.W kmApple DC.W kmShift DC.W kmCapsLock DC.W kmOption ENDP *===============================================* * Send data to ADB micro * * * * In: a-reg has ADB data * * x-reg has data count (0,1,or 2) * * y-reg has ADB command * * * * Out: none * * * * trashes Temp * *===============================================* SendADBInfo PROC LONGA ON LONGI ON sta >Temp ; use Temp as buffer phx ; bytes to send pea Temp>>16 ; ptr to data pea Temp phy ; command _SendInfo rts ENDP *===============================================* * Release some modifier keys * *===============================================* FreeModifiers PROC lda ModsToFree beq exit ldx #4*2 @loop and NumToBitMask,x beq @next txa lsr a clc adc #kcFirstMod+kcKeyUp phx jsr PostKey ; post modifier up plx @next lda ModsToFree dex dex bpl @loop stz ModsToFree exit rts ENDP *===============================================* * * * IN: a-reg has ADB key code * * * * OUT: a-reg has ADB key code * * * * NOTE This routine will not return if the * * control-reset sequence has occured! * *===============================================* TestForReset PROC LONGA ON LONGI ON IMPORT GetKeyModBits IMPORT SendADBInfo tay ; save key code in Y and #kcMask cmp #kcRESET ; is this the reset key? bne skip ; no, so skip tya and #kcKeyUp ; is it a reset up bne null ; yes, so we don't care jsr GetKeyModBits tax and #kmControl ; is control key down? bne reset ; yes, so good bye! null ldy #nullKey ; throw reset key away bra skip reset ldx #0 ; bytes to send ldy #resetSys ; command = reset lda #0 ; data jsr SendADBInfo ; will not return brk $db ; should never get here! skip tya ; restore key code rts ENDP *===============================================* * StickyKeys: latch modifier keys * * * * IN: a-reg has raw key data * * * * OUT: a-reg has raw key data * * * *===============================================* StickyKeys PROC LONGA ON LONGI ON IMPORT SetOnImage IMPORT SetOffImage IMPORT SetStickImage IMPORT SetLockImage sBit equ $80 mBit equ $40 mMask equ $1F sta ADBData cmp #nullKey ; not a valid if null key bne @OK brl @Done @OK cmp #$0080 ; is it a down key (bit 7 clear)? bcc @KeyDown ; yes and #$007F tax ; x <-- raw key code less high bit brl @keyUp ; no, skip recording keystroke @KeyDown tax cpx LastKey ; same as last key typed bne @NotSame lda >EMXPos ; get mouse coordinates cmp TempX ; same as before? bne @NotSame lda >EMYPos cmp TempY beq @Same ; key was same and mouse has not moved @NotSame stx LastKey ; save the keystroke lda #1 sta KeyCount ; count is 1 lda >EMXPos ; save the mouse position sta TempX lda >EMYPos sta TempY bra @KeyUp @Same ldy KeyCount ; get the count iny ; increment it cpy #5 ; have we seen five yet? bcc @NotYet stz KeyCount ; clear the count cpx #kcSHIFT ; was it the shift key? bne @NotYet ; no lda #sBit eor Flag ; invert SBit sta Flag and #sBit beq @StickyOff ; skip if we just turned it off bra @Show @StickyOff stz Flag ; clear the flags lda SBits ora LBits tsb ModsToFree ; to be released later... stz SBits stz LBits jsr SetOffImage ; no bitmap for no icon bra @Done @NotYet sty KeyCount @KeyUp lda Flag and #sBit ; are sticky keys on? beq @Done ; if not, skip cpx #kcFirstMod ; is it a modifier key? bcc @RealKey ; no, skip cpx #kcLastMod+1 ; is it a modifier? bcc @Modifier ; yes, skip @RealKey lda Flag and #mBit ; is a modifier down? beq @continue ; no, so contiue @2KeyExit lda Flag ; get which modifier and #mMask trb SBits ; remember which modifier was down bra @StickyOff @Continue ldy ADBData ; is it a key up? cpy #$80 bcc @Done ; skip if not ; It is an up-stroke on a non-modifier key. ; Release all unlocked sticky keys. lda LBits eor SBits ; turn off the ones that are locked tsb ModsToFree ; release any stuck modifier keys lda LBits sta SBits ; if, locked then its also sticky @Show lda LBits ; skip if there are locked mods bne @Done jsr SetOnImage @Done lda ADBData rts @Modifier cpx #kcCAPSLOCK ; caps lock? beq @Done ; yes, so we're done txa sec sbc #kcFirstMod asl a ; y <-- index to bit mask tay ldx NumToBitMask,y ; x <-- NumToBitMask(key) ldy ADBData ; is it a key down? cpy #$80 bcs @ModUp ; no, skip lda #mBit tsb Flag ; set the modifier down bit ; *** omit for compatibility with ROM 03 version *** ; bne @2KeyExit ; if already set before, turn off sticky keys lda Flag ; mask out the modifier number and #Å(mMask) sta Flag txa tsb Flag ; replace it with the current one and LBits ; is it locked? bne @Unlock ; yes, unlock it txa and SBits ; is it sticky? bne @lock ; yes, lock it ; it's neither sticky or locked, make it sticky txa tsb SBits ; stick lda NewImage cmp #LockImage beq @Done jsr SetStickImage bra @Done @Unlock txa trb LBits ; unlock trb SBits ; unstick tsb ModsToFree ; release it later bra @show @Lock txa tsb LBits ; lock lda #nullKey sta ADBData ; discard the keystroke jsr SetLockImage bra @done @ModUp lda #mBit trb Flag ; clear "modifier down flag" txa and SBits ; if it's locked it's sticky beq @done ; skip if not lda #nullKey sta ADBData ; discard the keystroke bra @done ENDP *===============================================* * _GetNextEvent Patch Routine * * * *===============================================* MyGetNextEvent PROC LONGA ON LONGI ON IMPORT ShowState IMPORT CheckADBMicro IMPORT CheckMKeyParams phb phk ; local addressing plb pha ; save registers phx phy ;--- should we monitor ? pha pha _GetTick pla plx tax sec sbc LastTick cmp #30 ; 1/2 second bcc skip stx LastTick lda ADBVersion cmp #adbNewVersion ; is this new micro ? bcc @old jsr CheckADBMicro ; monitor ADB micro if new bra skip @old lda MouseKeysOn beq skip jsr CheckMKeyParams skip lda NewImage cmp PicImage beq @exit pea 0 _MenuStatus ; is Menu manager started? pla beq @exit ; no so skip jsr ShowState ; undraw current image lda NewImage sta PicImage lda NewImage+2 sta PicImage+2 jsr ShowState ; draw new image @exit ply ; restore registers plx pla plb jmp GetNextEventVec ; go to REAL GetNextEvent ENDP *===============================================* * _*BootInit Patch Routine * * * *===============================================* MyBootInit PROC LONGA ON LONGI ON rtl ; just return ENDP *===============================================* * _DrawMenuBar Patch Routine * * * *===============================================* MyDrawMenuBar PROC LONGA ON LONGI ON IMPORT ShowState jsl DrawMenuBarVec ; go visit DrawMenuBar() pha ; save A-reg jsr ShowState ; draw new image pla ; restore A-reg cmp #1 ; adjust carry based on a-reg rtl ENDP *===============================================* * * * In: none * * Out: none * *===============================================* ShowState PROC LONGA ON LONGI ON lda >PicImage ; an image to draw? ora >PicImage+2 beq @skip pha pha _GetPort pha pha _GetMenuMgrPort _SetPort lda #picX ; 640 mode values sta >PicPt+2 lda #picDH sta >PicRect+6 pha _GetMasterSCB ; 640 or 320 mode? pla and #$00FF sta >PicLocInfo and #$0080 ; is it 640 ? bne @pp ; yes lda #picX/2 ; 320 mode values sta >PicPt+2 lda #picDH/2 sta >PicRect+6 @pp pea PicLocInfo>>16 pea PicLocInfo pea PicRect>>16 pea PicRect lda >PicPt+2 pha lda >PicPt pha pea 2 ; 2 = modeXOR _PPToPort _SetPort @skip rts ENDP *===============================================* * * * Input: *** Stack *** * * result - LONG * * trapNum - WORD * * newFuncPtr - LONG * * rtlAddr - 3 BYTES * * sp ---> * * * * Output: *** Stack *** * * result - LONG * * rtlAddr - 3 BYTES * * sp ---> * *===============================================* NewTSFuncPtr PROC IMPORT MyBootInit firstLocal set 1 ; local variables tsNum set firstLocal tsFunc set tsNum+2 tsPtr set tsFunc+2 fptPtr set tsPtr+4 tblSize set fptPtr+4 handle set tblSize+4 lastLocal set handle+4 rtlAddr set lastLocal ; input parameters (reverse order) lastParam set rtlAddr+3 newFuncPtr set lastParam trapNum set newFuncPtr+4 firstParam set trapNum+2 oldFuncPtr set firstParam ; result localSize set lastLocal-firstLocal paramSize set firstParam-lastParam tsc ; make a stack frame sec sbc #localSize tcs phd ; save current dp tcd ; begin lda $E10000 ; is the tool even loaded? pla bne @ok pei >16 sta [>16 ; location of result pea Temp pea Temp>>16 ; ptr to address of byte to read pea Temp+2 pea readMicroMem ; command _ReadKeyMicroMemory lda Temp and #$00FF rts ENDP *===============================================* * * * In: none * * Out: none * *===============================================* SetOnImage PROC lda #OnImage sta >NewImage lda #OnImage>>16 sta >NewImage+2 rts ENDP *===============================================* * * * In: none * * Out: none * *===============================================* SetOffImage PROC lda #0 sta >NewImage sta >NewImage+2 rts ENDP *===============================================* * * * In: none * * Out: none * *===============================================* SetStickImage PROC lda #StickImage sta >NewImage lda #StickImage>>16 sta >NewImage+2 rts ENDP *===============================================* * * * In: none * * Out: none * *===============================================* SetLockImage PROC lda #LockImage sta >NewImage lda #LockImage>>16 sta >NewImage+2 rts ENDP *===============================================* * MouseKeys: control mouse from keypad * * * * IN: a-reg = ADB key code * * * * OUT: a-reg = ADB key code * *===============================================* MouseKeys PROC LONGA ON LONGI ON IMPORT MouseVBLTask IMPORT GetKeyModBits IMPORT KeypadFilter ldy ADBVersion ; 12/5/90 Mensch ; same change as above goes here! ; another Don ooops cpy #adbVerROM03 ; only need MouseKeys for ROM 01 bge skip ldy MouseKeysOn ; is mousekeys active bne active ; yes cmp #kcPAD_CLEAR ; is it the clear key down? bne skip ; no jsr GetKeyModBits and #kmMask cmp #kmShift+kmApple ; are Apple & Shift down? beq turnOn ; yes lda #kcPAD_CLEAR ; no, so skip bra skip ;--- turn on mouse keys: turnOn lda #1 sta MouseKeysOn stz MKLastTick stz MKLastTick+2 stz MKMultOn stz ButtonState ; turn off button lda #1 sta PixelsPerPress ; set default pixel increment pea MouseVBLTask>>16 pea MouseVBLTask _SetHeartBeat ; install our vbl task bra null active cmp #kcPAD_CLEAR ; is the clear key down? beq turnOff ; yes jsr KeypadFilter ; handle keypad keys bra skip ;--- turn off mouse keys: turnOff pea MouseVBLTask>>16 pea MouseVBLTask _DelHeartBeat ; remove our vbl task stz MouseKeysOn null lda #nullKey ; eat the key skip rts ENDP *===============================================* * * * IN: A = ADB key code * * * * OUT: A = ADB key code * * * *===============================================* KeypadFilter PROC LONGA ON LONGI ON IMPORT UpdateMouse IMPORT BumpMouse sta Temp tay and #kcMask tax ; x <-- keycode minus key up bit tya and #kcKeyUp tay ; y = 0 if down key, ­ 0 if up key cpx #kcPAD_PERIOD ; is it '.'? beq period bcc skip cpx #kcPAD_9+1 ; is it ² 9? bcs skip cpx #kcPAD_0 ; is it ³ 0? bcs number cpx #kcPAD_MULTIPLY ; is it '*'? beq mult skip lda Temp brl exit ;--- process keypad '*' key: mult tya ; was it key down (y=0)? bne eatKey ; no lda MKMultOn ; is this the second '*'? bne multOff ; yes, so reset pixel increment inc a sta MKMultOn ; just set the flag bra eatKey multOff stz MKMultOn lda #1 sta PixelsPerPress bra eatKey ;--- process keypad button keys (0, 5, '.'): period tya ; was it key down (y=0)? bne eatKey ; no bra mbUp zero tya ; was it key down (y=0)? bne eatKey ; no bra mbDown button tyx ; was it a key down (y=0)? bne mbUp ; no mbDown lda #mbNewButton0 ; set button 0 tsb ButtonState bra send mbUp lda #mbNewButton0 ; clear button 0 trb ButtonState send lda >EMXPos ; get global mouse position tax lda >EMYPos tay lda #newButton ; button state has changed jsr UpdateMouse eatKey brl null ;--- process keypad keys (1-9): number lda MKMultOn ; are we looking for a pixel multiplier? beq number2 ; no tya ; is it a key down? bne eatKey ; no, so eat key up txa cmp #kcPAD_8 ; adjust for non-sequential keycodes bcc @sub dec a @sub sec sbc #kcPAD_0 ; convert to an integer bne @set lda #10 ; 0 maps to 10 @set sta PixelsPerPress ; our new pixel increment stz MKMultOn bra null number2 cpx #kcPAD_0 ; is it keypad 0 (lock button)? beq zero cpx #kcPAD_5 ; is it keypad 5 (mouse button)? beq button ; yes stz MouseDirection ; clear direction bits tya ; is it a key down? bne null ; no, so eat key up cpx #kcPAD_4 ; keypad 4 bcc vPlus ; must be 1-3 beq hMinus cpx #kcPAD_6 ; keypad 6 beq hPlus vMinus ; 7, 8, & 9 lda #mdVMinus tsb MouseDirection cpx #kcPAD_8 ; keypad 8 beq movement bcs hPlus hMinus ; 1, 4, & 7 lda #mdHMinus tsb MouseDirection bra movement vPlus ; 1, 2, & 3 lda #mdVPlus tsb MouseDirection cpx #kcPAD_2 ; keypad 2 bcc hMinus beq movement hPlus ; 3,6, & 9 lda #mdHPlus tsb MouseDirection movement lda >TickCnt sta MKLastTick ; start timing delay stz MKDelayPassed stz MKAccelPassed stz SubPixTotal stz SubPixDelta lda PixelsPerPress ; pixels count jsr BumpMouse null lda #nullKey exit rts ENDP *===============================================* * Update system mouse status * * * * IN: X = mouse x position (unclamped) * * Y = mouse y position (unclamped) * * A = change flag * * uses ButtonState * * * * OUT: none * * * *===============================================* UpdateMouse PROC LONGA ON LONGI ON IMPORT GetKeyModBits pha ; put changed flag on stack jsr ClampXY jsr GetKeyModBits *** added 6-Jun-91 DAL xba *** end of 6-Jun-91 DAL pha ; mod keys (bits 0-7) phx ; clamped x position phy ; clamped y position lda ButtonState pha ; button status (bits 8-15) _FakeMouse lda ButtonState ; update button state and #mbNewButton0 beq @clr @set lda #mbOldButton0 tsb ButtonState bra exit @clr lda #mbOldButton0 trb ButtonState exit rts ;------------------------------------------------ ; In: x, y reg ; ; Out: x, y reg ;------------------------------------------------ ClampXY clamp set 1 ; direct page offsets (local variables) xVal set clamp+4 yVal set xVal+2 phd ; save direct page phy ; copy x & y to stack frame phx lda ClampAddr+2 ; copy clamp addr to stack frame pha lda ClampAddr pha tsc ; make a stack frame tcd ldx #0 jsr ClampIt ; clamp X ldx #2 jsr ClampIt ; clamp Y pla ; remove clamp addr pla plx ; get results ply pld ; restore direct page rts ;------------------------------------------------ ClampIt txy lda [KEYMODREG rep #$20 and #$00FF rts ENDP *===============================================* * * * In: a-reg has number of pixels to bump * * Out: none * *===============================================* BumpMouse PROC LONGA ON LONGI ON IMPORT UpdateMouse sta Temp lda >EMYPos tay lda >EMXPos tax vPlus lda MouseDirection and #mdVPlus beq vMinus tya clc adc Temp tay ; y := y + delta bra hplus vMinus lda MouseDirection and #mdVMinus beq hPlus tya sec sbc Temp tay ; y := y - delta hPlus lda MouseDirection and #mdHPlus beq hMinus txa clc adc Temp tax ; x := x + delta bra movement hMinus lda MouseDirection and #mdHMinus beq movement txa sec sbc Temp tax ; x := x - delta movement lda #newPosition jsr UpdateMouse done rts ENDP *===============================================* * * * In: none * * Out: none * *===============================================* CheckMouse PROC LONGA ON LONGI ON IMPORT BumpMouse lda MouseDirection ; any movement keys down? beq exit ; no ;--- check delay-to-start time: lda MKDelayPassed ; has the delay period passed? bne accelerate ; yes lda >TickCnt ; check timer sec sbc MKLastTick cmp MKDelayTicks ; has min delay elasped? bcc exit ; no, so skip inc MKDelayPassed ; yes, so ok to move mouse lda >TickCnt sta MKLastTick ; start timing acceleration bra exit ;--- check acceleration time: accelerate lda MKAccelPassed ; has the accelaration period passed? bne speed ; yes lda MKAccelTicks ; is acceleration = 0 beq passed ; yes lda >TickCnt ; check timer sec sbc MKLastTick cmp MKAccelTicks ; has acceleration period elasped? bcs passed ; yes lda >TickCnt ; check timer and #$0007 ; every 8 ticks increase speed bne speed lda SubPixDelta clc adc SubPixAccel cmp SubPixMax bcs passed sta SubPixDelta bcc speed ; no, so skip passed inc MKAccelPassed ; yes, so set max speed lda SubPixMax sta SubPixDelta ;--- check speed (pixels): speed lda SubPixTotal clc adc SubPixDelta sta SubPixTotal cmp #256 ; is SubPixTotal ³ 1 pixel bcc exit ; no, too small tax ; save a copy and #$00FF sta SubPixTotal ; keep remainder txa and #$FF00 xba ; convert to pixels bump jsr BumpMouse exit rts ENDP *===============================================* * VBL task to monitor MouseKeys mouse movement. * * * * IN: none * * OUT: none * *===============================================* MouseVBLTask PROC LONGA OFF LONGI OFF IMPORT CheckMouse taskTicks set 1 ; 60 ticks = 1 second *----------------------------------------------- TaskHeader dc.L 0 ; task pointer TaskCount dc.W taskTicks ; tick count dc.W $A55A ; signature *----------------------------------------------- phk plb lda MouseKeysOn ; is mousekeys active beq exit ; no rep #$30 LONGA ON LONGI ON jsr CheckMouse sep #$30 LONGA OFF LONGI OFF exit lda #taskTicks sta TaskCount ; reset our task counter rtl ENDP *=======================================================================* * VBL task to monitor KMSTATUS. * * The purpose of this task is to fix a bug in the key micro/system. * * When the ADB mouse is moved, the ADB glue sets the "mouse register full" * flag (bit 7) of KMSTATUS ($C027). This normally causes an interrupt, * which when processed, will read MOUSEDATA ($C024) and cause the "mouse * register full" flag to be reset (cleared). * * When mouse interrupts are disabled (bit 6 of KMSTATUS clear) the * "mouse register full" flag is ignored, MOUSEDATA in never read, and * therefore the "mouse register full" flag remains on. The ADB micro won't * update KMSTATUS unless the old status changes, so when bit 7 is set, SRQ * interrupts can't happen (until someone reads MOUSEDATA). * * Since our ADB completion routine depends on SRQ interrupts, the system * will "hang" if the mouse is moved while mouse interrupts are disabled. * This task will read MOUSEDATA if the mouse register is full but mouse * interrupts are disabled to prevent the system from "hanging". *=======================================================================* KMSTATUSTask PROC LONGA OFF LONGI OFF taskTicks set 30 ; 30 ticks = about 1/2 second *----------------------------------------------- TaskHeader dc.L 0 ; task pointer TaskCount dc.W taskTicks ; tick count dc.W $A55A ; signature *----------------------------------------------- sta >$FFDBAB ; debug trigger lda >KMSTATUS ; test if mouse data available bpl exit ; no, so skip and #$7F ; is mouse interrupt enabled (bit 6)? cmp #$40 bcs exit ; yes, so skip ; read MOUSEDATA to reset KMSTATUS: ror a ; set 'c'=0, if data ok bit1=0 ror a ; i.e. data not contaminated lda >MOUSEDATA ; read in mouse data register tax bcs exit ; c=1 if data is contaminated lda >KMSTATUS ; verify Y hardware has X data ready and #$02 ; bit1=1, Y pos data available beq exit lda >MOUSEDATA ; read in Y position data tay exit lda #taskTicks sta >TaskCount ; reset our task counter rtl ENDP *----------------------------------------------- END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/EasyAccess/EasyAccess.equ b/IIGS.601.SRC/A.U.G/EasyAccess/EasyAccess.equ new file mode 100644 index 0000000..5c6428d --- /dev/null +++ b/IIGS.601.SRC/A.U.G/EasyAccess/EasyAccess.equ @@ -0,0 +1 @@ +*===============================================* * * * File: EasyAccess.equ * * Project: Easy Access for the IIGS * * Author: Don J. Brady * * Build file: EasyAccess.Make * * * * Copyright © Apple Computer, Inc. 1990 * * All rights reserved. * *-----------------------------------------------* * Modification History: * * 02/09/90 DJB - File created today * * * *===============================================* STRING ASIS ;--- key codes for ADB keyboard: kcRESET equ $7F7F ; reset is special case kcCONTROL equ $36 kcAPPLE equ $37 kcSHIFT equ $38 kcCAPSLOCK equ $39 kcOPTION equ $3A kcPAD_PERIOD equ $41 kcPAD_MULTIPLY equ $43 kcPAD_PLUS equ $45 kcPAD_CLEAR equ $47 kcPAD_DIVIDE equ $4B kcPAD_ENTER equ $4C kcPAD_MINUS equ $4E kcPAD_EQUAL equ $51 kcPAD_0 equ $52 kcPAD_1 equ $53 kcPAD_2 equ $54 kcPAD_3 equ $55 kcPAD_4 equ $56 kcPAD_5 equ $57 kcPAD_6 equ $58 kcPAD_7 equ $59 kcPAD_8 equ $5B kcPAD_9 equ $5C kcMask equ $7F7F kcKeyUp equ $0080 ; bit 7 set if key up kcFirstMod equ kcCONTROL kcLastMod equ kcOPTION nullKey equ $FF ;--- mod key bits for KEYMODREG: kmApple equ %10000000 kmOption equ %01000000 kmKeypad equ %00010000 kmRepeat equ %00001000 kmCapsLock equ %00000100 kmControl equ %00000010 kmShift equ %00000001 kmMask equ kmApple+kmOption+kmControl+kmShift ;--- IIGS system globals: EMXPos equ $E100E9 ; global X position EMYPos equ $E100EB ; global Y position EMBStat equ $E100E7 ; global mouse button status TickCnt equ $E100DC ; global tick count ;--- IIGS hardware registers: KBD equ $E1C000 KBDSTRB equ $E1C010 MOUSEDATA equ $E1C024 KEYMODREG equ $E1C025 DATAREG equ $E1C026 KMSTATUS equ $E1C027 SPEAKER equ $E1C030 ; hardware speaker CYAREG equ $E1C036 ;--- ADB version numbers: adbVerROM01 equ $05 adbVerROM03 equ $06 adbNewVersion equ $06 ; 10-speed (ROM 03) version ;--- ADB micro controler RAM equates: ; (NOTE: these are valid for ADB version $06 only!) mcMicroStatus equ $12 mcStickyBits equ $11 mcStickyKeysOn equ %00010000 ; microStatus bits mcMouseKeysOn equ %00001000 mcLockedApple equ %10000000 ; sticky bits mcLockedOption equ %01000000 mcLockedControl equ %00100000 mcLockedShift equ %00010000 mcStuckApple equ %00001000 mcStuckOption equ %00000100 mcStuckControl equ %00000010 mcStuckShift equ %00000001 mcStuckMask equ %00001111 mcLockMask equ %11110000 ;--- MouseKeys constants: mbNewButton0 equ $8000 mbOldButton0 equ $4000 mbNewButton1 equ $1000 mbOldButton1 equ $0100 newButton equ %00000100 newPosition equ %00000010 mdVPlus equ %000000001 ; used by MouseDirection mdVMinus equ %000000010 mdHPlus equ %000000100 mdHMinus equ %000001000 ;--- BRAM parameter offsets: bpMKeysDelay equ $55 bpMKeysAccel equ $56 bpMKeysSpeed equ $57 ;--- toolbox routine numbers: EMStatus equ $0606 GetNextEvent equ $0A06 DrawMenuBar equ $2A0F mouseClamps equ $000C ; GetAddr Param Ref No - Point RECORD 0 ; QuickDrawII point record ;----------------------------------------------- v ds.W 1 h ds.W 1 ;----------------------------------------------- ENDR BRAMSetupVec equ $25 ; for patching $E10094 vector \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/EasyAccess/EasyAccess.make b/IIGS.601.SRC/A.U.G/EasyAccess/EasyAccess.make new file mode 100644 index 0000000..b96de42 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/EasyAccess/EasyAccess.make @@ -0,0 +1 @@ +#===============================================# # File: EasyAccess.make # # Project: Easy Access for IIGS # # Author: Don J. Brady # # # # Copyright © Apple Computer, Inc. 1989,1991 # # All rights reserved. # # # #===============================================# PROJECT = EasyAccess CODE = EasyAccess.obj AOPTIONS = LOPTIONS = -t $B6 {PROJECT} ÄÄ {PROJECT}.make {CODE} LinkIIGS {LOPTIONS} {CODE} -o {PROJECT} # generic rule to build object files from source files. .obj Ä .aii AsmIIGS {AOPTIONS} -o {Default}.obj {Default}.aii \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/EasyAccess/ReleaseNotes b/IIGS.601.SRC/A.U.G/EasyAccess/ReleaseNotes new file mode 100644 index 0000000..34e03dd --- /dev/null +++ b/IIGS.601.SRC/A.U.G/EasyAccess/ReleaseNotes @@ -0,0 +1 @@ +EasyAccess GS 1.0 Release 1.0d5 ¥ Fixed a ROM01 compatibility. It didn't used to recognize early ROM01 machines -------------------------------------------------------------- This is the final candidate. Release 1.0d4 -------------------------------------------------------------- Bug Fixes: ¥ BRC #74897: Sticky keys will no longer turn off with two modifiers. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Finder/About.aii b/IIGS.601.SRC/A.U.G/Finder/About.aii new file mode 100644 index 0000000..9b5ba70 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Finder/About.aii @@ -0,0 +1 @@ + seg 'ABOUT' ; about.aii ; ; Copyright 1991-93 by Apple Computer, Inc. ; All Rights Reserved ;..................................................................... LONGA ON LONGI ON STRING PASCAL PRINT OFF PRINT NOGEN PRINT NOSYM INCLUDE 'ALL.MACROS' INCLUDE 'E16.CONTROL' INCLUDE 'E16.WINDOW' INCLUDE 'PASCAL.macros' INCLUDE 'special.macros' PRINT ON AboutWindow PROC EXPORT IMPORT lastAboutTime IMPORT aboutWindowPtr IMPORT aboutBlk IMPORT ArrowCursor IMPORT CloseThisWindow ;in Util.aii - 27-Jan-93 JCM handlePtr equ 1 phb phk plb _WaitCursor phd pha pha tsc tcd pha pha _TickCount pla sta >lastAboutTime pla pha pha pushlong #0 ;titlePtr pushlong #aboutBlk ;refCon is ptr to our window info block pushlong #aboutDraw+$80000000 ;content draw proc (background) pushlong #0 ;window defproc pea 2 ;refIsResource pushlong #1 ;window resource we want pea $800e ;rWindParam1 _NewWindow2 pulllong >aboutWindowPtr bcc @ok ; ; close the window only if something bad happened and we actually have a window pointer ; because something could have happened when we went to add controls (but didn't ; get created because we couldn't find the disk or the resource) ; lda >aboutWindowPtr ora >aboutWindowPtr+2 beq @leave lda >aboutWindowPtr+2 tax lda >aboutWindowPtr jsl CloseThisWindow lda #0 sta >aboutWindowPtr sta >aboutWindowPtr+2 @leave jsl ArrowCursor pla pla pld plb rtl ; ; we were able to create the window (and get all the controls attached to it) ; @ok pha pha _TotalMem pulllong totalMem ldx #9 ;divide by 1024 tLoop lsr totalMem+2 ror totalMem dex bpl tLoop lda totalMem pha pushlong #$80000000+totalMemStr+1 pea 5 ;5 chars available pea 0 ;unsigned _Int2Dec pha pha _RealFreeMem pulllong realFreeMem ldx #9 ;divide by 1024 rLoop lsr realFreeMem+2 ror realFreeMem dex bpl rLoop lda realFreeMem pha pushlong #$80000000+realFreeMemStr+1 pea 5 ;5 chars available pea 0 ;unsigned _Int2Dec jsl calcMemoryUsed ;go calculate the amount of memory people are ;using. ldx #9 ;divide everyone by 1024 fLoop lsr finderMem+2 ror finderMem lsr systemMem+2 ror systemMem lsr daMem+2 ror daMem lsr setupMem+2 ror setupMem dex bpl fLoop lda realFreeMem sta realFreeMemBefore lda finderMem sta finderMemBefore lda systemMem sta systemMemBefore lda daMem sta daMemBefore lda setupMem sta setupMemBefore lda finderMem pha pushlong #$80000000+finderMemStr+1 pea 5 ;5 chars available pea 0 ;unsigned _Int2Dec lda systemMem pha pushlong #$80000000+systemMemStr+1 pea 5 ;5 chars available pea 0 ;unsigned _Int2Dec lda daMem pha pushlong #$80000000+daMemStr+1 pea 5 ;5 chars available pea 0 ;unsigned _Int2Dec lda setupMem pha pushlong #$80000000+setupMemStr+1 pea 5 ;5 chars available pea 0 ;unsigned _Int2Dec pha pha pea $8029 ;rVersion pushlong #1 ;ID=1 _LoadResource pulllong finderVersionHandle pea $8029 ;detach it so we can manage it pushlong #1 _DetachResource lda finderVersionHandle sta handlePtr lda finderVersionHandle+2 sta handlePtr+2 lda [handlePtr] ;deref it tax ldy #2 lda [handlePtr],y stx handlePtr stx finderVersionPtr sta handlePtr+2 sta finderVersionPtr+2 pea 0 ldy #2 lda [handlePtr],y pha lda [handlePtr] pha pushlong #finderVersion _VersionString pha ;get the current resource file (Finder) _GetCurResourceFile pea 1 ;use the stuff from sys.resources _SetCurResourceFile pha pha pea $8029 ;rVersion pushlong #1 ;ID=1 _LoadResource pulllong systemVersionHandle pea $8029 ;detach it so we can manage it pushlong #1 _DetachResource lda systemVersionHandle sta handlePtr lda systemVersionHandle+2 sta handlePtr+2 ldy #4 ;lock the handle down! lda [handlePtr],y ora #$8000 sta [handlePtr],y lda [handlePtr] ;deref it tax ldy #2 lda [handlePtr],y stx handlePtr stx systemVersionPtr sta handlePtr+2 sta systemVersionPtr+2 pea 0 ;flags ldy #2 lda [handlePtr],y ;the actual version string pha lda [handlePtr] pha pushlong #systemVersion ;where to put it _VersionString _SetCurResourceFile ;reset the current resource file to the Finder jsl ArrowCursor pla pla pld plb rtl totalMem dc.L 0 realFreeMem dc.L 0 finderMem dc.L 0 systemMem dc.L 0 daMem dc.L 0 setupMem dc.L 0 EXPORT realFreeMemBefore realFreeMemBefore dc.w 0 EXPORT finderMemBefore finderMemBefore dc.w 0 EXPORT systemMemBefore systemMemBefore dc.w 0 EXPORT daMemBefore daMemBefore dc.w 0 EXPORT setupMemBefore setupMemBefore dc.w 0 totalMemStr str ' K' realFreeMemStr str ' K' findermemStr str ' K' systemMemStr str ' K' daMemStr str ' K' setupMemStr str ' K' EXPORT finderVersionHandle finderVersionHandle dc.L 0 finderVersionPtr dc.L 0 EXPORT systemVersionHandle systemVersionHandle dc.L 0 systemVersionPtr dc.L 0 finderVersion ds 10 systemVersion ds 10 ; see if anything changed from the last time we called this routine to update the ; about window -- if anything did, inval the rect for the K used ;................................................................ EXPORT doAboutRecalc doAboutRecalc phb phk plb lda >aboutWindowPtr+1 bne @1 brl doneRecalc2 @1 jsl calcMemoryUsed ;don't do this too often pha pha _GetPort pushlong >aboutWindowPtr _SetPort pha pha _RealFreeMem pulllong realFreeMem ldx #9 ;divide everyone by 1024 cLoop lsr realFreeMem+2 ror realFreeMem lsr finderMem+2 ror finderMem lsr systemMem+2 ror systemMem lsr daMem+2 ror daMem lsr setupMem+2 ror setupMem dex bpl cLoop lda realFreeMem cmp realFreeMemBefore beq checkFMem sta realFreeMemBefore lda realFreeMem pha pushlong #$80000000+realFreeMemStr+1 pea 5 ;5 chars available pea 0 ;unsigned _Int2Dec pushlong #realFreeMemRect _InvalRect checkFMem lda finderMem cmp finderMemBefore beq checkSMem sta finderMemBefore lda finderMem pha pushlong #$80000000+finderMemStr+1 pea 5 ;5 chars available pea 0 ;unsigned _Int2Dec pushlong #finderMemRect _InvalRect checkSMem lda systemMem cmp systemMemBefore beq checkDMem sta systemMemBefore lda systemMem pha pushlong #$80000000+systemMemStr+1 pea 5 ;5 chars available pea 0 ;unsigned _Int2Dec pushlong #systemMemRect _InvalRect checkDMem lda daMem cmp daMemBefore beq checkSetupMem sta daMemBefore lda daMem pha pushlong #$80000000+daMemStr+1 pea 5 ;5 chars available pea 0 ;unsigned _Int2Dec pushlong #daMemRect _InvalRect checkSetupMem lda setupMem cmp setupMemBefore beq doneRecalc sta setupMemBefore lda setupMem pha pushlong #$80000000+setupMemStr+1 pea 5 ;5 chars available pea 0 ;unsigned _Int2Dec pushlong #setupMemRect _InvalRect doneRecalc _SetPort doneRecalc2 plb rtl realFreeMemRect dc.w 28,435-76,38,485-76 finderMemRect dc.w 44,145,54,195 systemMemRect dc.w 55,145,65,195 daMemRect dc.w 44,435-76,54,485-76 setupMemRect dc.w 55,435-76,65,485-76 ; calculate the amount of memory that the Finder, System, DAs, and Setup files are using ; by walking the handle list and finding who owns what and how big of a block they own. ; ; inputs: none ; ; outputs: finderMem is filled ; systemMem is filled ; daMem is filled ; setupMem is filled ; ; assumptions: $e1600 always points to the handle list ; we are able to disable interrupts while walking the list so no one ; disturbs the handle list behind our back ; handlePtr is defined above as 1 ;................................................................ EXPORT calcMemoryUsed calcMemoryUsed phb phk plb pha _MMStartUp pla sta theFinderID php ;disable interrupts while walking the sei ;handle list phd pha pha tsc tcd stz finderMem stz finderMem+2 stz systemMem stz systemMem+2 stz daMem stz daMem+2 stz setupMem stz setupMem+2 lda >$e11600 sta handlePtr lda >$e11600+2 sta handlePtr+2 look ldy #4 lda [handlePtr],y bmi includeLocked ;if it's locked, include it and #%0000001100000000 ;check the purgable bits in attrib word bne nextHandle ;if it's the least bit purgable, don't include it includeLocked ldy #6 lda [handlePtr],y beq nextHandle ;never, ever add ID's of just zero tax ;keep the ID handy for a sec eor theFinderID and #$F0FF ;Finder memory is "application", and beq addApp ;other $1xxx memory is not counted! txa ;get the ID back and #$f000 xba lsr a lsr a lsr a tax jmp (addr,x) theFinderID dc.w 0 addr dc.W addSystem ;0=memory manager's unmanaged areas dc.W nextHandle ;1=application, other than the Finder dc.W nextHandle ;2=control program dc.W addSystem ;3=GSOS dc.W addSystem ;4=Toolsets dc.W addDA ;5=Desk Accessories dc.W addSystem ;6=runtime libraries dc.W addSystem ;7=system loader dc.W addSystem ;8=firmware dc.W addSystem ;9=tool locator dc.W addSetup ;A=setup files dc.W nextHandle ;B=undefined dc.W nextHandle ;C=undefined dc.W nextHandle ;D=undefined dc.W nextHandle ;E=undefined dc.W nextHandle ;F=undefined ; ; find the next handle (if there is one) ; nextHandle ldy #16 lda [handlePtr],y tax bne notDoneYet iny iny lda [handlePtr],y beq doneCalc stx handlePtr sta handlePtr+2 bra look notDoneYet iny iny lda [handlePtr],y stx handlePtr sta handlePtr+2 bra look addApp ldy #8 lda [handlePtr],y clc adc finderMem sta finderMem iny iny lda [handlePtr],y adc finderMem+2 sta finderMem+2 bra nextHandle addSystem ldy #8 lda [handlePtr],y clc adc systemMem sta systemMem iny iny lda [handlePtr],y adc systemMem+2 sta systemMem+2 bra nextHandle addDA ldy #8 lda [handlePtr],y clc adc daMem sta daMem iny iny lda [handlePtr],y adc daMem+2 sta daMem+2 bra nextHandle addSetup ldy #8 lda [handlePtr],y clc adc setupMem sta setupMem iny iny lda [handlePtr],y adc setupMem+2 sta setupMem+2 bra nextHandle doneCalc lda #<$15000 ;manually compensate for those memory manager clc ;blocks which are included in the language card adc systemMem ;areas and elsewhere (see: 0ink in niftylist) sta systemMem lda #^$15000 adc systemMem+2 sta systemMem+2 pla pla pld plp ;re-enable interrupts plb rtl ; Draw the about box with all the memory figures ;................................................................................... aboutDraw phb phk plb phd pha pha tsc tcd pushlong #memRect ;erase what memory stuff might have been there _EraseRect pushlong >aboutWindowPtr _DrawControls lda systemVersionPtr sta handlePtr lda systemVersionPtr+2 sta handlePtr+2 pea 120 pea 24 _MoveTo ldy #6 ;add the length of the first string to lda [handlePtr],y ;where our handle ptr points to and #$00ff ;so we can find the second string clc adc handlePtr tax lda handlePtr+2 adc #0 tay txa ;now, add 6 to the address to compensate for clc ;the international word and version long adc #7 ;but add 7 to compensate for the length byte of the tax ;first string tya adc #0 pha phx _DrawString ;draw Copyright string from Finder pea 120 ;print 'System Software' in the box pea 13 ;(just in case someone in international decides _MoveTo ;to call it Systeme or something) lda systemVersionPtr clc adc #6 tax lda systemVersionPtr+2 adc #0 pha phx _DrawString pea 4 ;move over 4 pixels (Dave says it's one space pea 0 ;in Shaston 8) _Move pushlong #systemVersion _DrawString pha pushlong #totalMemStr _StringWidth lda #195 sec sbc 1,s sta 1,s ;we avoid pulling and pushing pea 38 _MoveTo pushlong #totalMemStr _DrawString pha pushlong #realFreeMemStr _StringWidth lda #485-76 sec sbc 1,s sta 1,s ;we avoid pulling and pushing pea 38 _MoveTo pushlong #realFreeMemStr _DrawString pha pushlong #finderMemStr _StringWidth lda #195 sec sbc 1,s sta 1,s ;we avoid pulling and pushing pea 53 _MoveTo pushlong #finderMemStr _DrawString pha pushlong #daMemStr _StringWidth lda #485-76 sec sbc 1,s sta 1,s pea 53 _MoveTo pushlong #daMemStr _DrawString pha pushlong #systemMemStr _StringWidth lda #195 sec sbc 1,s sta 1,s ;we avoid pulling and pushing (DAL) pea 64 _MoveTo pushlong #systemMemStr _DrawString pha pushlong #setupMemStr _StringWidth lda #485-76 sec sbc 1,s sta 1,s ;we avoid pulling and pushing pea 64 _MoveTo pushlong #setupMemStr _DrawString pla pla pld plb rtl memRect dc.w 26,140,66,490 Export UnloadSegs UnloadSegs pha _MMStartup lda #0 pha pha _UnloadSegNum rtl ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Finder/DP.equ b/IIGS.601.SRC/A.U.G/Finder/DP.equ new file mode 100644 index 0000000..03bd9cb --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Finder/DP.equ @@ -0,0 +1 @@ + blanks off ;============================================== ; Direct page offsets; ;============================================== curWind equ 0 ;Current icon port (window) wind equ curWind+4 ;Window work pointer. windBlk equ wind+4 ;Pointer to window info block. icHand equ windBlk+4 ;General ICONOBJ handle. ic equ icHand+4 ;icHand dereferenced. icBlkHand equ ic+4 ;General ICONBLK handle. icBlk equ icBlkHand+4 ;(icBlkHand) or pointer to ICONDATA record. icon equ icBlk+4 ;Pointer to an ICON record. dRect equ icon+4 ;Work RECT. irect1 equ dRect+8 ;Icon's enclosing RECT. irect2 equ irect1+8 ;Icon title's enclosing RECT. \ these MUST be temp equ irect2+8 ;Work pointer. / contiguous! tempRgn equ temp+4 ;Handle of work region. deskPort equ tempRgn+4 ;Address of Window Manager's port deskic equ deskPort+4 ;Handle of first ICONOBJ on desktop deskID equ deskic+4 ;Desktop ID, NoWindID. deskView equ deskID+2 ;Desktop view, large icons. deskBlank equ deskView+2 ;Handle of icon that desktop opened from. TaskRec equ deskBlank+4 ;Task Master record. what equ TaskRec message equ what+2 when equ message+4 yrat equ when+4 ;General y coordinate holder. xrat equ yrat+2 ;General x coordinate holder. modifiers equ xrat+2 TaskData equ modifiers+2 TaskMask equ TaskData+4 TaskLastClick equ TaskMask+4 TaskClickCount equ TaskLastClick+4 TaskData2 equ TaskClickCount+2 TaskData3 equ TaskData2+4 TaskData4 equ TaskData3+4 TaskLastClickPt equ TaskData4+4 devNumber equ TaskLastClickPt+4 filetype equ devNumber+2 TrashWind equ filetype+2 ;Window pointer for Trash can. ;;;ClipWind equ TrashWind+4 ;Window pointer for clipboard. (removed 19-Aug-92 DAL) lastClick equ TrashWind+4 ;Time of last button down on an icon. rectHand equ lastClick+4 ;Handle of RECT list. rectPtr equ rectHand+4 ;Pointer to RECT list. rectRgn equ rectPtr+4 ;Handle of region containing all RECTs. lineAddrs equ rectRgn+4 ;Address of scan line address table. mask1 equ lineAddrs+4 ;Variables used by icon drag draw rects. mask2 equ mask1+2 mask3 equ mask2+2 line1 equ mask3+2 yoffset equ line1+2 ;Window's offset to global coordinates. xoffset equ yoffset+2 ;Window's offset to global coordinates. yoffset2 equ xoffset+2 ;Window's offset to global coordinates. xoffset2 equ yoffset2+2 ;Window's offset to global coordinates. MyID equ xoffset2+2 ;ID number to use for memory allocation. direction equ MyID+2 ;WalkOfLife's direction. drawCount equ direction+2 IconTrack equ drawCount+2 windTrack equ IconTrack+4 posFile equ windTrack+4 ;Handle of window position information. copyFile equ posFile+4 ;TRUE to duplicate icons, FALSE to move. LErename equ copyFile+2 ;Handle of line edit field for rename. work equ LErename+4 ;*** WARNING *** Some routines use scratch ;*** space following $FF THEN WRITE 'EndOfDP = ' WRITELN EndOfDP AERROR 'WARNING... Direct page variable overflow!' ENDIF ; --- Offsets to other tools' direct pages -------------------------------- Misc_zp equ 0 Misc_zp, 1 zero pages. COPY_zp equ Misc_zp+$0100 Copy tool. Total_zp equ COPY_zp+$0100 Total number of zero pages needed. \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Finder/Data.equ b/IIGS.601.SRC/A.U.G/Finder/Data.equ new file mode 100644 index 0000000..d8109a1 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Finder/Data.equ @@ -0,0 +1 @@ + IMPORT LastParamTime IMPORT LastScrapTime IMPORT LastPatternTime IMPORT LastNetTime IMPORT OriginalStack IMPORT FindersICBlkN IMPORT devnum_list IMPORT devnum_num IMPORT C1_FileNameBuf IMPORT C1_FileName IMPORT C1_PathName IMPORT C1_PathNameBuf IMPORT deviceName IMPORT cMenuRects IMPORT cMenuPats IMPORT screen2 IMPORT DragPatt IMPORT stripes IMPORT GSicons IMPORT defaultName IMPORT prefer IMPORT deskPat IMPORT deskPic IMPORT clip_param IMPORT clip_color IMPORT clip_end IMPORT clipBlk IMPORT clipTitle IMPORT info_param IMPORT infoTPtr IMPORT infoBlkPtr IMPORT infowRect IMPORT info_end IMPORT infoBlk IMPORT infoTitle IMPORT infoName IMPORT endInfoBlk IMPORT verify_param IMPORT verifyTPtr IMPORT verifyBlkPtr IMPORT verifyInfoRef IMPORT verifyInfoProc IMPORT verifyGutsProc IMPORT verifywRect IMPORT verify_end IMPORT verifyBlk IMPORT verifyData IMPORT verifyTitle IMPORT verifyName IMPORT endVerifyBlk IMPORT validateBlk IMPORT validateData IMPORT validateTitle IMPORT validateName IMPORT endValidateBlk IMPORT StartZeroRAM IMPORT infoWindCount IMPORT verWindCount IMPORT badDes IMPORT wrap IMPORT cancelEmpty IMPORT abortFind IMPORT myWindCount IMPORT saveMenuID IMPORT srcView IMPORT SourceView ; rdl 4/24/90 --removed-- to allow launching docs of multiple apps (also see icons2.aii) ; IMPORT typeFlag ; rdl 4/24/90 end IMPORT SaveOffFlag IMPORT spotCount IMPORT spotHashOn IMPORT spotHash IMPORT dupIcon IMPORT menuDimFlag IMPORT drawRequest IMPORT dragDeltay IMPORT dragDeltax IMPORT NoDOSerr IMPORT IsRAMDisk ;added 05/26/88 DJB IMPORT flopCount IMPORT IDflag IMPORT tempSaved IMPORT Printing IMPORT maxLength IMPORT curCursor IMPORT addFlag IMPORT intoIcon IMPORT doubleSpeed IMPORT auxtype IMPORT AccessPriv ;added 12/06/88 DJB IMPORT AccessDefault ;added 12/06/88 DJB IMPORT NetworkBit ;added 12/07/88 DJB IMPORT onlyDisk IMPORT appName IMPORT appIcon IMPORT appOffset IMPORT iconSelected IMPORT NoRealMatch IMPORT defaultChg IMPORT functionKey IMPORT shiftKeyStatus IMPORT zoomWithoutInfo IMPORT zoomWithInfo IMPORT LEwind IMPORT LEicon IMPORT nameHit IMPORT desRect IMPORT viewRect IMPORT createIcon IMPORT posFlag IMPORT C1_VolName IMPORT myDpage IMPORT eventRec IMPORT port IMPORT ticonobj IMPORT smallRect IMPORT ExtCopy IMPORT windowID IMPORT deskState IMPORT lastState IMPORT lastClickY IMPORT lastClickX IMPORT startSaveBlk IMPORT C1_TempPath IMPORT C1_TempPathBuf IMPORT lastName IMPORT endSaveBlk IMPORT quoteName IMPORT OpenFlag IMPORT pathIndex IMPORT saveHand IMPORT deltay IMPORT deltax IMPORT deltay2 IMPORT deltax2 IMPORT DeleteFlag IMPORT EndZeroRAM IMPORT StartInitRAM IMPORT EndInitRAM IMPORT StartDynamRAM ; ckDelFlag no longer in use (artifact of having had a Remove menu item in distant past) ; removed 2/15/90 rdl ; IMPORT ckDelFlag IMPORT quit_list IMPORT quit_flags IMPORT quit_path IMPORT screen IMPORT resolution IMPORT SrcMode IMPORT SrcImage IMPORT SrcWidth IMPORT SrcRect IMPORT C1_QuitName IMPORT c1_DevNameBuf IMPORT c1_DeviceName IMPORT wind_param IMPORT wind_size IMPORT wind_frame IMPORT wind_title IMPORT wind_ref IMPORT wind_full IMPORT wind_color IMPORT wind_voff IMPORT wind_hoff IMPORT wind_datah IMPORT wind_dataw IMPORT wind_max_h IMPORT wind_max_w IMPORT wind_vscrl IMPORT wind_hscrl IMPORT wind_vpage IMPORT wind_hpage IMPORT wind_infot IMPORT wind_infoH IMPORT wind_def IMPORT wind_info IMPORT wind_draw IMPORT bigRect IMPORT wind_pos IMPORT wind_plane IMPORT wind_rec IMPORT wind_end IMPORT TrashBlk IMPORT TrashIc IMPORT TrashNum IMPORT TrashTitle IMPORT nextWindPos IMPORT EndDynamRAM IMPORT errorTable IMPORT LoadDataErr IMPORT LoadToolsErr IMPORT NotEnoughMem IMPORT badIconFile IMPORT debugTable IMPORT TableErr IMPORT dirFullErr IMPORT handErr1 IMPORT handErr2 IMPORT handErr3 IMPORT titleY IMPORT titleX IMPORT titles IMPORT kStrg IMPORT aStrg IMPORT sStrg IMPORT wStrg IMPORT cday IMPORT mday IMPORT lStrg IMPORT deviceKinds IMPORT days IMPORT monthNames IMPORT typeNames IMPORT fileSysNames IMPORT pixelMask1 IMPORT pixelMask2 IMPORT pixelMask3 IMPORT table1 IMPORT strings IMPORT boldTitle IMPORT boldTable IMPORT startX IMPORT stringsLen IMPORT notDiskFlag IMPORT colormenu IMPORT LastScrapCount IMPORT DevStatusTbl IMPORT gdn_params \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Finder/EasyMount/DES.aii b/IIGS.601.SRC/A.U.G/Finder/EasyMount/DES.aii new file mode 100644 index 0000000..deb7ea5 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Finder/EasyMount/DES.aii @@ -0,0 +1 @@ +************************************************** * * * des - data encryption standard. This routine is called with * low byte of the parameter list in the X reg and the high * byte of the parameter list in the Y reg. * * * written by 07-03-86 * david su * * modified : 01-27-87 06:00 (tde) * 5-29-87: Converted source to MacToGS (rbh) * * (c) 1987 paramis corporation * (c) 1987 Apple Computer Inc * all rights reserved * * Parameter List: * Pointer pointer <-- * Encription Key pointer <-- ;This is an eight byte padded password * Result pointer --> ;Eight Bytes * * Rick Hoiberg 5/29/87 * * modified : 08-23-88 (srk) * converted to MPW IIGS (MAX) assembler * ********************************************************** MACHINE M65816 include 'm16.debug' DESdata Record saveZp0 dc.b 0,0,0,0,0,0,0,0 tab64l dc.b 0,64,128,192,0,64,128,192 tab64h dc.b 0,0,0,0,1,1,1,1 ************************************************** * * des data area * ************************************************** iniptbl dc.b 7,15,23,31,39,47,55,63 dc.b 5,13,21,29,37,45,53,61 dc.b 3,11,19,27,35,43,51,59 dc.b 1,9,17,25,33,41,49,57 dc.b 8,16,24,32,40,48,56,64 dc.b 6,14,22,30,38,46,54,62 dc.b 4,12,20,28,36,44,52,60 dc.b 2,10,18,26,34,42,50,58 invptbl dc.b 25,57,17,49,9,41,1,33 dc.b 26,58,18,50,10,42,2,34 dc.b 27,59,19,51,11,43,3,35 dc.b 28,60,20,52,12,44,4,36 dc.b 29,61,21,53,13,45,5,37 dc.b 30,62,22,54,14,46,6,38 dc.b 31,63,23,55,15,47,7,39 dc.b 32,64,24,56,16,48,8,40 etbl dc.b 1,32,31,30,29,28 dc.b 29,28,27,26,25,24 dc.b 25,24,23,22,21,20 dc.b 21,20,19,18,17,16 dc.b 17,16,15,14,13,12 dc.b 13,12,11,10,9,8 dc.b 9,8,7,6,5,4 dc.b 5,4,3,2,1,32 pc1tbl dc.b 8,16,24,32,40,48,56 dc.b 64,7,15,23,31,39,47 dc.b 55,63,6,14,22,30,38 dc.b 46,54,62,5,13,21,29 dc.b 2,10,18,26,34,42,50 dc.b 58,3,11,19,27,35,43 dc.b 51,59,4,12,20,28,36 dc.b 44,52,60,37,45,53,61 ;convert from des algorithm ;base 56 pc2tbl dc.b 43,40,46,33,56,52,54,29 dc.b 42,51,36,47,34,38,45,53 dc.b 31,49,41,50,30,37,44,55 dc.b 16,5,26,20,10,2,27,17 dc.b 6,12,24,9,13,8,18,1 dc.b 23,4,11,15,7,21,28,25 ptbl dc.b 17,26,13,12,4,21,5,16 dc.b 32,18,10,7,28,15,2,23 dc.b 31,25,9,19,1,6,30,24 dc.b 14,20,3,27,11,22,29,8 s1 dc.b 14,4,13,1,2,15,11,8 dc.b 3,10,6,12,5,9,0,7 dc.b 0,15,7,4,14,2,13,1 dc.b 10,6,12,11,9,5,3,8 dc.b 4,1,14,8,13,6,2,11 dc.b 15,12,9,7,3,10,5,0 dc.b 15,12,8,2,4,9,1,7 dc.b 5,11,3,14,10,0,6,13 s2 dc.b 15,1,8,14,6,11,3,4 dc.b 9,7,2,13,12,0,5,10 dc.b 3,13,4,7,15,2,8,14 dc.b 12,0,1,10,6,9,11,5 dc.b 0,14,7,11,10,4,13,1 dc.b 5,8,12,6,9,3,2,15 dc.b 13,8,10,1,3,15,4,2 dc.b 11,6,7,12,0,5,14,9 s3 dc.b 10,0,9,14,6,3,15,5 dc.b 1,13,12,7,11,4,2,8 dc.b 13,7,0,9,3,4,6,10 dc.b 2,8,5,14,12,11,15,1 dc.b 13,6,4,9,8,15,3,0 dc.b 11,1,2,12,5,10,14,7 dc.b 1,10,13,0,6,9,8,7 dc.b 4,15,14,3,11,5,2,12 s4 dc.b 7,13,14,3,0,6,9,10 dc.b 1,2,8,5,11,12,4,15 dc.b 13,8,11,5,6,15,0,3 dc.b 4,7,2,12,1,10,14,9 dc.b 10,6,9,0,12,11,7,13 dc.b 15,1,3,14,5,2,8,4 dc.b 3,15,0,6,10,1,13,8 dc.b 9,4,5,11,12,7,2,14 s5 dc.b 2,12,4,1,7,10,11,6 dc.b 8,5,3,15,13,0,14,9 dc.b 14,11,2,12,4,7,13,1 dc.b 5,0,15,10,3,9,8,6 dc.b 4,2,1,11,10,13,7,8 dc.b 15,9,12,5,6,3,0,14 dc.b 11,8,12,7,1,14,2,13 dc.b 6,15,0,9,10,4,5,3 s6 dc.b 12,1,10,15,9,2,6,8 dc.b 0,13,3,4,14,7,5,11 dc.b 10,15,4,2,7,12,9,5 dc.b 6,1,13,14,0,11,3,8 dc.b 9,14,15,5,2,8,12,3 dc.b 7,0,4,10,1,13,11,6 dc.b 4,3,2,12,9,5,15,10 dc.b 11,14,1,7,6,0,8,13 s7 dc.b 4,11,2,14,15,0,8,13 dc.b 3,12,9,7,5,10,6,1 dc.b 13,0,11,7,4,9,1,10 dc.b 14,3,5,12,2,15,8,6 dc.b 1,4,11,13,12,3,7,14 dc.b 10,15,6,8,0,5,9,2 dc.b 6,11,13,8,1,4,10,7 dc.b 9,5,0,15,14,2,3,12 s8 dc.b 13,2,8,4,6,15,11,1 dc.b 10,9,3,14,5,0,12,7 dc.b 1,15,13,8,10,3,7,4 dc.b 12,5,6,11,0,14,9,2 dc.b 7,11,4,1,9,12,14,2 dc.b 0,6,10,13,15,3,5,8 dc.b 2,1,14,7,4,10,8,13 dc.b 15,12,9,0,3,5,6,11 des_msk dc.b 1 dc.b 2 dc.b 4 dc.b 8 dc.b 16 dc.b 32 dc.b 64 dc.b 128 key ds.b 8 random ds.b 8 des_work1 dc.b 0 des_work2 dc.b 0 des_work3 dc.b 0 des_work4 dc.b 0 des_work5 dc.b 0 des_work6 dc.b 0 des_work7 dc.b 0 des_work8 dc.b 0 des_count dc.b 0 remainder dc.b 0 key_x dc.b 0 des_x dc.b 0 des_x1 dc.b 0 des_x2 dc.b 0 des_y dc.b 0 des_k dc.b 0 des_temp dc.b 0 des_temp1 ds.b 4 des_temp2 ds.b 4 des_l1 ds.b 4 des_r1 ds.b 4 des_cd ds.b 7 k1 ds.b 6 k2 ds.b 6 k3 ds.b 6 k4 ds.b 6 k5 ds.b 6 k6 ds.b 6 k7 ds.b 6 k8 ds.b 6 k9 ds.b 6 k10 ds.b 6 k11 ds.b 6 k12 ds.b 6 k13 ds.b 6 k14 ds.b 6 k15 ds.b 6 k16 ds.b 6 rotat_left dc.b 1,1,2,2,2,2,2,2 dc.b 1,2,2,2,2,2,2,1 EndR ;--------------------------------------------------------------------------------------------------- EXPORT DES DES PROCname with DESdata Zp0 equ $00 Zp1 equ $04 * * * save four bytes of Zero page * phb ;save current data bank phk plb ;data bank = program bank pei Zp0 ;save on stack pei Zp0+2 pei Zp1 pei Zp1+2 * * save parameter list location * stx Zp0 ;save parameter list pointer sty Zp0+2 * * save key in our work area * lda [Zp0] ;save key sta Zp1 ldy #$02 lda [Zp0],y sta Zp1+2 ldx #3 ldy #$06 ;move all eight bytes of key des1 lda [Zp1],y sta key,y dey dey dex bpl des1 * * save password in our work area * ldy #$04 lda [Zp0],y sta Zp1 iny iny lda [Zp0],y sta Zp1+2 ldx #3 ldy #$06 ;move all eight bytes of key des2 lda [Zp1],y sta random,y dey dey dex bpl des2 * * initialize the count * ldx #0 des4 stz des_count,x inx inx cpx #32 bne des4 ; save our zero page values here - for some reason they are getting trashed ; when we do the encoding routines..... lda Zp0 sta saveZp0 lda Zp0+2 sta saveZp0+2 sep #$30 LONGA OFF LONGI OFF jsr keysched jsr encode * * save result * Rep #$30 LONGA ON LONGI ON ; restore Zp0 here - why is it getting trashed in our encoding routines above? lda saveZp0 sta Zp0 lda saveZp0+2 sta Zp0+2 ldy #$08 lda [Zp0],y sta Zp1 iny iny lda [Zp0],y sta Zp1+2 ldx #3 ldy #$06 ;move all eight bytes of key des3 lda des_work1,y sta [Zp1],y dey dey dex bpl des3 * * restore Zero page * pla sta Zp1+2 pla sta Zp1 pla sta Zp0+2 pla sta Zp0 plb ;restore data bank rtl ************************************************** * * keysched : key schedule * * this module takes 64 bits key and generates * the sixteen 48-bit keys k(1),k(2),...,k(16) * * entry : none * * exit : none * * ************************************************** keysched sep #$30 LONGA OFF LONGI OFF ldx #0 key1 stx des_x lda pc1tbl,x sta remainder lda #8 sta des_count key2 dec des_count sec lda remainder sbc #08 sta remainder beq key22 ;= 0 ? bcs key2 ;> 0 ? key22 clc lda remainder adc #8 sta remainder ldx remainder bne key24 ;x = 0 ? ldx #8 ;set to 8, if yes key24 dex lda des_msk,x ldy des_count clc and key,y beq key3 sec key3 ldx #$07 key4 rol des_work1,x php dex bmi key5 plp bra key4 key5 plp ldx des_x inx cpx #56 bne key1 * * divide pc1 result into c0/d0 * ldx #0 key6 lda des_work2,x sta des_cd,x inx cpx #7 bne key6 * * rotate c and d left by rotate(n) times * key9 ldx #0 keya stx des_x ;save # of times ldy #0 keyb clc lda des_cd ;save left most bit(cn) rol a php lda des_msk+3 ;save left most bit(dn) clc and des_cd+3 beq keyb0 sec keyb0 ldx #6 keyc rol des_cd,x dex bpl keyc lda des_cd+3 and #%11101111 ;clear right most bit(cn) sta des_cd+3 lda #0 plp ;restore left most bit(cn) ror a ;move left most bit(cn) ror a ;to right most bit(cn) ror a ror a ora des_cd+3 sta des_cd+3 ldx des_x iny lda rotat_left,x sta des_temp cpy des_temp bne keyb * * permutation 2 * ldy #0 keye sty des_y lda pc2tbl,y sta remainder lda #7 ;7 bytes toal for cn+dn sta des_count keyf dec des_count sec lda remainder sbc #08 sta remainder beq keyf0 ;= 0 ? bcs keyf ;> 0 ? keyf0 clc lda remainder adc #8 sta remainder ldx remainder bne keyf2 ;x = 0 ? ldx #8 ;set to 8, if yes keyf2 dex lda des_msk,x ldy des_count clc and des_cd,y beq key0 sec key0 ldx #7 key01 rol des_work1,x php dex bmi key02 plp bra key01 key02 plp ldy des_y iny cpy #48 bne keye * * move result of perm 2 to k(n) * ldx #0 key03 lda des_work3,x ldy des_k sta k1,y inc des_k inx cpx #6 bne key03 ldx des_x inx cpx #16 beq key04 jmp keya key04 rts ************************************************** * * encode - encryption module * * entry : random1,...,random8 * * exit : des_work1,...,des_work8 * * ************************************************** encode sep #$30 LONGA OFF LONGI OFF stZ des_y ;init des_y ldx #0 ecd1 stx des_x lda iniptbl,x sta remainder lda #8 sta des_count ecd2 dec des_count sec lda remainder sbc #08 sta remainder beq ecd22 ;= 0 ? bcs ecd2 ;> 0 ? ecd22 clc lda remainder adc #8 sta remainder ldx remainder bne ecd24 ;x = 0 ? ldx #8 ;set x to 8, if yes ecd24 dex lda des_msk,x ldy des_count clc and random,y beq ecd3 sec ecd3 ldx #7 ecd4 rol des_work1,x php dex bmi ecd5 plp bra ecd4 ecd5 plp ldx des_x inx cpx #64 bne ecd1 * * move result of init perm to left/right block * move 8 times - first 4 bytes = des_l1 * - second 4 bytes = des_r1 * ldx #0 ecd6 lda des_work1,x sta des_l1,x inx cpx #08 bne ecd6 * * perform rn = ln eor f(rn,kn) * transform right 32 bits into 48 bits * stz key_x ;initiaiZe k(n) pointer ldx #0 ecd60 stx des_x1 ;save counter ldx #0 ecd65 lda des_r1,x ;save rn origin to temp sta des_temp1,x inx cpx #4 bne ecd65 ldx #0 ecd7 stx des_x lda etbl,x ;perform e function sta remainder lda #4 ;4 bytes only sta des_count ecd8 dec des_count sec lda remainder sbc #08 sta remainder beq ecd82 ;= 0 ? bcs ecd8 ;> 0 ? ecd82 clc lda remainder adc #8 sta remainder ldx remainder bne ecd84 ;x = 0 ? ldx #8 ;set x to 8, if yes ecd84 dex lda des_msk,x ldy des_count clc and des_r1,y beq ecd9 sec ecd9 ldx #5 ecda rol des_work3,x php dex bmi ecdb0 plp bra ecda ecdb0 plp ldx des_x inx cpx #48 beq ecdb1 jmp ecd7 * * eor with k(48 bits) * ecdb1 ldy #0 ecdb ldx key_x ;get current k(n) pointer lda k1,x eor des_work3,y sta des_work3,y inx stx key_x ;save pointer for k(n) blocks iny cpy #6 bne ecdb * * transform 48 bits into 32 bits s(b1),...,s(bn) * ldx #0 ecdc jsr saddr stx des_temp lda des_work3 ;des_work will shift 6 times and #%10000100 ;bit 7/2 are row #'s bpl ecdd and #%01111111 ;strip out high bit ora #%00001000 ;save high bit to bit 3 ecdd lsr a lsr a tax ;save row # lda des_work3 and #%01111000 ;bit 6-3 are column #'s lsr a lsr a lsr a ;column # in acc now ecde cpx #0 beq ecdf clc adc #16 ;find s tbl pointer dex ;decrement row # bra ecde ecdf tay lda s1,y asl a ;shift result to high byte asl a asl a asl a * * move result to des_r1 * ldy #4 ecd10 rol a ldx #3 ecd11 rol des_temp2,x php dex bmi ecd110 plp bra ecd11 ecd110 plp dey bne ecd10 * * shift des_work left 6 more times * ldy #6 ecd12 ldx #5 ecd13 rol des_work3,x dex bpl ecd13 dey bne ecd12 * * 8 times already? * ldx des_temp inx cpx #8 beq ptbl0 jmp ecdc ;do next s tbl * * perform 32 bits permutation * use ptbl * ptbl0 ldx #0 ptbl1 stx des_x2 lda ptbl,x sta remainder lda #4 sta des_count ptbl2 dec des_count sec lda remainder sbc #08 sta remainder beq ptbl22 ;= 0 ? bcs ptbl2 ;> 0 ? ptbl22 clc lda remainder adc #8 sta remainder ldx remainder bne ptbl24 ;x = 0 ? ldx #8 ;set to 8, if yes ptbl24 dex lda des_msk,x ldy des_count clc and des_temp2,y beq ptbl3 sec ptbl3 ldx #3 ptbl4 rol des_r1,x php dex bmi ptbl5 plp bra ptbl4 ptbl5 plp ldx des_x2 inx cpx #32 bne ptbl1 * * exclusive or with left block * perform function = ln eor f(rn,kn) * ldx #0 ecd112 lda des_r1,x ;load rn eor des_l1,x ;eor with ln sta des_r1,x ;save result to rn inx cpx #4 bne ecd112 ldx #0 ecd115 lda des_temp1,x ;move rn origin to ln sta des_l1,x inx cpx #4 bne ecd115 * * 16 times already? * ldx des_x1 inx cpx #16 beq ecd140 jmp ecd60 ;yes, go back * * perform inverse permutation * ecd140 jsr swap ;swap left and right halves ldx #0 ecd14 stx des_x lda invptbl,x sta remainder lda #8 sta des_count ecd15 dec des_count sec lda remainder sbc #08 sta remainder beq ecd152 ;= 0 ? bcs ecd15 ;> 0 ? ecd152 clc lda remainder adc #8 sta remainder ldx remainder bne ecd154 ;x = 0 ? ldx #8 ;set x to 8, if yes ecd154 dex lda des_msk,x ldy des_count clc and des_l1,y beq ecd16 sec ecd16 ldx #7 ecd17 rol des_work1,x php dex bmi ecd18 plp bra ecd17 ecd18 plp ldx des_x inx cpx #64 bne ecd14 rts ;end of des modules swap ;switch des_l1 and des_r1 ldx #3 swap1 lda des_l1,x pha lda des_r1,x sta des_l1,x pla sta des_r1,x dex bpl swap1 rts * * increment s table pointer * * x = s# (0-7) * saddr clc lda #s1 adc tab64l,x sta ecdf+2 lda #>s1 adc tab64h,x sta ecdf+3 rts ENDP END \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount b/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount new file mode 100644 index 0000000..2e536d4 Binary files /dev/null and b/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount differ diff --git a/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount.aii b/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount.aii new file mode 100644 index 0000000..5f56ad7 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount.aii @@ -0,0 +1 @@ +****************************************************************************** * * EasyMount.aii * by Dave Lyons 7-Jun-91 * * Copyright 1991-1993 Apple Computer, Inc * All Rights Reserved * * Core code borrowed from "init.aii" in the QuickMount/Choose project, * originally by TGH (Tim Harrington) 04/06/88. * ****************************************************************************** * * 7..10-Jun-91 DAL 1.0d1 * Pretty much works. You can double-click on existing QuickMount documents * to mount servers. * You can select one or more mounted servers and choose "Create Server Alias..." * from the Finder's Extras menu. * Holding down Option while double-clicking or Opening a QuickMount document * forces the "Connect as" dialog up even if the password is okay or the * document is set for Guest access. * * 10..11-Jun-91 DAL --> 1.0d2 * Improved the Connect As dialog--comes up right for Guest access, etc. * Fixed User ID fed to AcceptRequests (was garbage). * Changed AcceptRequests string to "Apple~EasyMount~". * * 23-Jun-91 DAL --> 1.0d3 * Changed UAM error message at Mark Day's suggestion. * Added AlertWindow errors for "This icon isn't a server" and "You must * first select one or more server icons." * Now accepts request $8000 (srqMountServer) to mount a server volume. * * 14-Jul-91 DAL --> 1.0d4 * Now informs the Finder that the directory changed when you create a * new alias file. * Now enables and disables the Extras menu item as appropriate (when the * selection changes). * * 30-Jul-91 DAL --> 1.0d5 * Extras menu item is now initially disabled. * * 5-Aug-91 DAL * Check for AppleShare FST presence; if it ain't there, set the "unload * me" flag on the stack, so the system will unload me. * * 19-Aug-91 DAL --> 1.0d6 * Andy added a dc.w 0 to the add-to-extras result buffer, to go with * Finder 6.0d46. I moved it by one line to be in the right place.' * * 4-Sep-91 DAL --> 1.0d7 * Turned on flag bit in menu item, so the Finder knows it's our first * item (this creates a dividing line above our item if we are not * the first thing in the Extras menu). * * 24-Oct-91 MSD --> 1.0d8 * ¥ I noticed TryMount was doing asynchronous NBP lookup. I can't figure * out why (the code waits until it completes anyway), so I simplified it * by making the lookup synchronous. * ¥ If volume didn't get mounted, you no longer get logged off if you were * already logged on. * ¥ The user volume in the FIMountVol flags is now set correctly. If the * volume couldn't be found in the FPGetSrvrInfo reply, the user volume * flag will not be set. * ¥ When asked for a password, the Guest radio button is now dimmed if * guests do not have access to the server. * 29-Oct-91 MSD (still 1.0d8) * ¥ When you open a document with the Option key down, and you're already * logged on, you shouldn't get the Connect As dialog (it's not worth * fixing the dialog to show who you've logged on as). * * 31-Oct-91 MSD --> 1.0d9 * ¥ Changed the error messages so they are each a template and allow string * substitution (it used to use one error template and subtitute the body * of the message.) Changed the text of the server not found message to * include the name of the volume. * 1-Nov-91 MSD * ¥ TestUserVolume wasn't advancing its pointer to the next volume name * properly, so it wouldn't identify a user volume that wasn't the first * volume returned in the list. * ¥ Changed structure of dialog/mount loop so it can try first without displaying * an error. Then it falls into the loop where it displays a message for * any error (including bad password). * ¥ The indices used to access the error tables in ReportMountError were off * by two bytes (which meant the unknown error case never worked right). * * 3-Nov-91 DAL * Changed several exclamation marks to periods in error messages...they were * getting on my nerves. * When a volume is successfully mounted, and on error $0A11 (volume already * mounted), we now try asking the Finder to open the window (or bring it to * the front), unless the Control key is down. This is done with a kludgey * Run Queue task for the moment, since I have to let the Finder finish * mounting the server before I can successfully ask the Finder to open its * window. * * 8-Nov-91 MSD --> 1.0d10 * ¥ After a volume is mounted, it now calls the AppleShare FST's FST_Specific * call Get_User_Path to force FIUserPrefix to be set. * * 18-Nov-91 DAL --> 1.0d11 * ¥ To open windows faster, force a ScanDevices and kill the 2-second delay. * * 24-Nov-91 DAL --> 1.0d12 * ¥ Use finderSaysIdle to know when it's safe to open the window for a volume * we mounted. * * 25-Nov-91 DAL * ¥ Under pre-6.0, init now asks to be unloaded. * ¥ On finderSaysBeforeOpen, we now check whether this is an Open or * a Print. We only respond to Open. * * 8-Jan-92 DAL * ¥ Accept systemSaysEjectingDev to kill the need-to-open-window flag. * * 28-Jan-92 DAL 1.0d15 * ¥ Make theUserName buffer longer (avoid putting a garbage byte into the * data files). * * NOTE: EasyMount does not support 32-character user names; max is 31. * ****************************************************************************** * * 24-Feb-92 DAL, 1.1d1 for 6.0.1 * * Changed tellFinderXXX calls to set the SendRequest stopAfterOne bit. This * is slightly more efficient. * * 25-Feb-92 DAL * * On handling a redundant finderSaysGoodbye call, we take no action. * We now accept srqGoAway. * * 04-Mar-92 DMA * * Adding support for opening folders, documents, and applications on any * device. * * 13-Mar-92 DAL --> 1.1d2 * * Minor stuff on top of Darin's stuff: Changed "Create Alias..." to * "Make Alias..." and cleaned up a couple of comments. Added a note * at handleEjectingDev that this will need to be fixed up. * * 17-Mar-92 DMA --> 1.1d3 * * Fix so offline volumes will be mounted and displayed before attempting * to open windows, apps, or documents from them. Old style EasyMount * documents now correctly open the server volume window. * * 25-Mar-92 DAL * * Updated messages to say "disk" instead of "volume", and not to use * "mount." * * 15-Jul-92 DAL --> 1.1d7 for 6.0.1d7 * * Crunched code by using OpenResourceFileByID, HiliteCtlByID, SetCtlValueByID. * * 17-Jul-92 DAL --> 1.1d8 for 6.0.1d8 * * Turned on mwUpdateAll bit in DoModalWindow call. * Changed "server is shutting down, so you can't log on" to say that it might * be starting up, instead. * * 12-Aug-92 DAL --> 1.1d9 for 6.0.1d9 * * EasyMount loads even if network is not available, since it's useful for * local networks now. * * 25-Aug-92 DAL --> 1.1d10 for 6.0.1d10 * * Changed the AppleTalk-busy message to suggest closing network control panels. * * 15-Sep-92 DAL --> 1.1d11 for 6.0.1d11 * * Fixed bad-password message to match the AppleShare control panel. * * 17-Sep-92 DAL * * Added check for zero volumes in TestUserVolume. * * 26-Jan-93 JCM --> 1.1d13 for 6.0.1d13 * * ¥ Fixed "Save" from the connect-as dialog to not destroy EasyMount 1.0 documents. * Now, we never re-write the alias pathaname, since there never was a mechanism to * change an aliases target after it was created. This puts to rest the parameter out * of range error many reported. * * ¥ Made srqMountServer work properly with the new 1.1 file format that includes the * alias pathname at the end. In the process, I re-worked most of the file read code * to actually report errors properly if any occurred. Previously, errors would have * been detected after a few GS/OS calls, but the error code would not be passed back * up the calling chain. * * 2-Mar-93 JCM --> 1.1d14 for 6.0.1.d14 * * ¥ Made this thing work in 320 mode. I moved the controls around a bit and hid the * window when it's initially created. * * ¥ Removed some dead code from TryMount which was around from when we didn't use the * linked-list and had a single pathname buffer to mount. * * ¥ Made the "don't open windows when control key is down" feature work again. * * 16-Mar-93 JCM * * ¥ Added Dave's two new calls, UseColorTable and RestoreColorTable, to the password * dialog. This makes our icon look cool, even in 320-mode, since we ask for the * standard 640-mode color table. * * ¥ Fixed the password dialog to not ask Finder to open a window when you clicked * "Cancel". I moved the calls to AddToPathList from ParseFile to MountByData. * Before, we would always ask the window to be opened, even if the user cancelled * the mount, or we got an error. * * ¥ If you ever went through the password dialog with an 8-character password, but * made no changes to it, it would be truncated to 7 chars and you then couldn't * connect since it would now be wrong. * * 18-Mar-93 JCM * * ¥ Fixed the "don't open windows when control key is down" feature work again, for the * second time. I fixed it to read the modifiers that Finder fed us, but I masked for * the control key with the hardware modifiers bit mask, not the event control key mask. * I now do it the right way. * * 19-Mar-93 JCM * * ¥ One more fix to the "don't open windows when control key is down" feature. We were * calling AddToPath list regardless of the state of the control key. In the case where * you had previously mounted a server volume but let the window open, we would add that * disposed handle to the path list. Finder doesn't like that too much, and neither do I. * * 23-Mar-93 DAL * * Added 4 lines in the request procedure to make it reentrant. Maybe I'm just being * paranoid, or maybe not. (The pitfall avoided is an interrupt-time SendRequest * coming through and making our original dispatch use the wrong request code.) * * 23-Mar-93 JCM/DAL * * ¥ Fixed two of Dave's four lines to be in the right place. He was pulling and saving * a value after the data bank had been restored, which resulted in it being put into * the wrong bank most of the time. * * ¥ Now calling GetNextEvent right after we show the password window so we can eat any * possible system window deactivates. This allows us to safely nest UseColorTable and * RestoreColorTable without worrying about the screen being restored by someone else. * * 25-Mar-93 SS * * ¥ Added menu key equivalents 'Mm'. * * 25-Mar-93 JCM * * ¥ Made local aliases work again. We were never telling Finder to open them if the * document had a pcount of 1. Whoops. * * ¥ Now we only allow aliases to be made for disks, folders, and applications. * * 2-Apr-93 JCM * * ¥ Fixed srvNameBuff and zoneNameBuf to be large enough to hold 31-char GS/OS strings. * They were large enough to hold 32-char PStrings, but that's not what the FST returns. * ****************************************************************************** * * ============ * Things to do * ============ * * Investigate extending the EasyMount document format to locate specific * folders (or files?) on a server. (Or even locally?) * * Should not allow password to be left lying around in memory. * * Should encrypt passwords at least a little (in files). * * When you click on Registered User and there's no name, it should default * to the ATINIT name. * * Should prompt for volume password if it isn't recorded. * ****************************************************************************** print push,off include 'all.macros' include 'e16.finder' include 'e16.gsos' include 'e16.locator' include 'e16.quickdraw' print pop RamDispatch equ $E11014 True equ $8000 False equ $0000 ******************************************************************************* * * SendRequest codes that we accept (other than finderSays codes, in E16.Finder, * and system-wide calls, in E16.Locator) * ******************************************************************************* srqMountServer equ $8000 ******************************************************************************* * * Structure of the finderSaysBeforeOpen parm block * ******************************************************************************* opCount equ 0 oPathname equ opCount+2 oSmallRect equ oPathname+4 oFiletype equ oSmallRect+4 oAuxtype equ oFiletype+2 oModifiers equ oAuxtype+4 ;for Finder 6.0d39 oReserved equ oModifiers+2 oPrintFlag equ oReserved+4 ;for Finder 6.0d59 ******************************************************************************* * * Filetype information we care about * ******************************************************************************* QuickMountFileType equ $00E2 QuickMountAuxtype equ $ffff ****************************************************************************** ****************************************************************************** EasyMount procname import DES Case off sta >myMemID pha _QDVersion pla and #$0fff cmp #$0307 bcc @unload ;25-Nov-91 DAL ;;; jsr CheckForAppleShare ;;; bcc @HaveAppleShare bra @StayLoaded @unload lda #1 ;set the "unload me" flag sta 4,s rtl ;;;@HaveAppleShare @StayLoaded pushlong #myReqProcName lda >myMemID pha ;memory ID pushlong #myReqProc _AcceptRequests bcc @ok _SysBeep @ok rtl myReqProcName str 'Apple~EasyMount~' myMemID dc.w 0 ;************************************************************** ;* ;* CheckForAppleShare -- return CLC if the AppleShare FST is here ;* ;************************************************************** ;CheckForAppleShare pushlong #fstSpecificParms ; pea $2033 ;FSTSpecific ; jsl $e100b0 ; bcc @ok ; cmp #$53 ; beq @ok ; sec ; rts ;@ok clc ; rts ; ;fstSpecificParms dc.w 2 ;pCount = 2 ; dc.w $000D ;FST ID = AppleShare ; dc.w 0 ;illegal FST-specific code ************************************************************** * * myReqProc -- look for finderSaysBeforeOpen with a * QuickMount document * ************************************************************** myReqProc name oldDPage equ 1 RTL1 equ oldDPage+2 DataOut equ RTL1+3 DataIn equ DataOut+4 Request equ DataIn+4 Result equ Request+2 phd tsc tcd phb phk plb *** added 23-Mar-93 DAL to make the request proc reentrant (paranoia?) lda requestTable pha *** end 23-Mar-93 lda 0=window pointer iconsHandle dc.l 0 ;StringHandle of selected icons GetSelectedIcons name stz iconsHandle+1 pea tellFinderGetSelectedIcons pea sendToName+stopAfterOne ;24-Feb-92 DAL pushlong #nameOfFinder pea 0 pea 0 ;dataIn = reserved pushlong #getIconsBuffer _SendRequest rts DispIconsHndl name php lda iconsHandle+1 beq @noHandle pushlong iconsHandle _DisposeHandle @noHandle plp rts ******************************************************************************* * * MakeTheAliases * * For each server, use SFPutFile to ask the user where to put a QuickMount * document to mount it, and create the document. * * Input: String handle on stack * * Format of string handle is: * +000 WORD number of strings * +002 WSTR first string * +xxx WSTR second string * ... * * Output: none (parameter is stripped) * ******************************************************************************* MakeTheAliases name phd pha ;numStrings pha pha ;ptr tsc tcd @ptr equ 1 @numStrings equ @ptr+4 @oldD equ @numStrings+2 @rts equ @oldD+2 @handle equ @rts+2 pei <@handle+2 pei <@handle _HLock ldy #2 lda [<@handle],y sta <@ptr+2 lda [<@handle] sta <@ptr lda [<@ptr] sta <@numStrings beq @oopsNoIcons lda #2 jsr @addToPtr @repeat jsr @MakeOneAlias bcs @done lda [<@ptr] ;bump ptr by length+2 inc a inc a jsr @addtoPtr dec <@numStrings bne @repeat @done pla pla ;ptr pla ;numStrings pld plx pla pla phx rts @addToPtr clc adc <@ptr sta <@ptr bcc @1 inc <@ptr+2 @1 rts @oopsNoIcons pea $400C ;operation failed _SysBeep2 pha ;space for button pea $0020 pea 0 pea 0 ;no substitutions pushlong #noIconsMessage _AlertWindow pla ;button # (ignore) bra @done ******************************************************************************* * * @makeOneAlias -- make a QuickMount document * * Input: <@ptr is a WString pathname of a mounted server volume * * Output: CLC = Created an alias file where the user wanted * SEC = stop (error or cancel) * ******************************************************************************* @makeOneAlias ldy <@ptr+2 lda <@ptr clc adc #2 bcc @3 iny @3 sty FullPathPtr+2 ;Save ptr to the pathname sta FullPathPtr *** Added - 25-Mar-93 JCM - Only allow aliases for disks, folders, and apps. ldy <@ptr+2 lda <@ptr jsr GetFileInfo ;see if we can deal with this type bcs @badType jsr ValidateType bcc @typeOk @badType pha ;space for AlertWindow result pea $0021 ;flags (cool button layout + substitute pStrings) lda #0 pha pha ;no sub strings pea ErrNope>>16 ;push high word of error message pointer pea ErrNope ;push low word of message pointer _AlertWindow ;show the alert pla ;ignore the button pressed clc rts @typeOk *** End - 25-Mar-93 JCM lda <@ptr+2 ldy <@ptr jsr GetServerInfo lda #2 ;Flag it as a server bcc @IsAServer dec a ;Unless we find out its not @IsAServer sta AliasPCount lda [<@ptr] ;Get the path length sta AliasPathSize sta FullPathLen ;And save it ; Copy the name for standard file. If it's a pathname with colons, just ; copy the filename. @continue stz defaultName ;Clear length word sep #$30 ;of destination longa off longi off ldy FullPathLen ;Get length of string beq @ZeroLength @BackupLoop lda [<@ptr],y ;Is the char a colon? cmp #':' beq @FarEnough ;Yes, start copying dey ;Backup a char bne @BackupLoop ;If not beginning, go again iny ;Up past length word @FarEnough ldx #0 ;X contains length of new string @CopyLoop iny ;Forward one char lda [<@ptr],y ;Copy the char sta defaultName+2,x inx cpy FullPathLen ;Have we hit the end? blt @CopyLoop beq @CopyLoop stx defaultName ;Store length @ZeroLength rep #$30 ;Back to long mode longa on longi on pea 120 ;x pea 30 ;y pea 0 pushlong #sfPrompt pea 0 pushlong #defaultName pushlong #newReplyRec _SFPutFile2 bcs @ouch lda rrGood beq @cancel jsr WriteNewAliasFile php pha pushlong rrNameRef _DisposeHandle pushlong rrPathRef _DisposeHandle pla plp bcs @ouch @exit rts @ouch jsr ShowErrorWindow @cancel sec rts noIconsMessage dc.b '32/First select one or more icons./^#1',0 ShowErrorWindow name pha php pha ;space for ErrorWindow result ldx #0 phx ;subType phx phx ;subArray pha ;error _ErrorWindow pla ;button number (ignore) plp pla rts sfPrompt str 'Create alias as:' defaultName ds.b 36 newReplyRec rrGood dc.w 0 rrFileType dc.w 0 rrAuxType dc.l 0 dc.w 3 ;name is new handle rrNameRef dc.l 0 dc.w 3 ;path is new handle rrPathRef dc.l 0 ******************************************************************************* * * GetServerInfo * * Input: AY = pathname of server volume * * Output: ReadBuffer is filled in (UserName, VolumeName, EntityName) * SEC = error * ******************************************************************************* GetServerInfo name phd pha phy ;keep path on stack (@volname) tsc tcd @volname equ 1 jsr ZeroReadBuffer ; copy @volname (WString) into VolumeName (PString). Only copies until the ; the first colon (exclusive) and omits any leading colon. ldy #2 ;Skip first colon if there is one sep #$30 longa off longi off stz VolumeName lda [<@volname],y cmp #':' beq @SkipLeadingColon sta VolumeName+1 ;Not a colon, keep it inc VolumeName @SkipLeadingColon iny @CopyVolLoop tya ;Have we reached the end? dec a dec a cmp [<@volname] beq @DoneWithCopy lda [<@volname],y cmp #':' ;Leave if we hit another colon beq @DoneWithCopy tyx ;Save the character in the ldy VolumeName ;appropriate place in the new iny ;string. sta VolumeName,y sty VolumeName txy iny bra @copyVolLoop @DoneWithCopy rep #$30 longa on longi on * * Get Server name and zone name * lda <@volName+2 ldy <@volName sta serverPath+2 sty serverPath sta devNumPath+2 sty devNumPath pushlong #GetSrvrNameParms pea $2033 ;FSTSpecific jsl $e100b0 bcs @ouch * * copy server name, 'AFPServer', zone name into EntityName * lda theServerName xba sta theServerName lda theZoneName xba sta theZoneName ldx #0 ;bumped along by AppendVolPString ldy #^theServerName+1 lda #theServerName+1 jsr AppendVolPString lda #CAFPName ldy #^CAFPName jsr AppendVolPString ldy #^theZoneName+1 lda #theZoneName+1 jsr AppendVolPString *** get user name & stuff it into UserName pushlong #GetDevNumParms pea $2020 ;GetDevNumber jsl $e100b0 bcs @ouch lda theDevNumber sta userDevNumber pushlong #UserInfoParms pea $2033 ;FSTSpecific jsl $e100b0 bcs @ouch lda theUserName xba sta theUserName pushlong #theUserName+1 pushlong #UserName pushlong #32 _BlockMove clc bra @exit @ouch sec and #$00ff @exit plx plx pld rts GetSrvrNameParms dc.w 5 ;pcount dc.w $000D ;AppleShare FST dc.w $000D ;GetSrvrName serverPath dc.l 0 dc.l srvNameBuff dc.l zoneNameBuff *** Fixed - 2-Apr-93 JCM - Allow 32-char names. ;srvNameBuff dc.w 34 ;theServerName ds.b 32 ; ;zoneNameBuff dc.w 34 ;theZoneName ds.b 32 srvNameBuff dc.w 36 theServerName ds.b 34 zoneNameBuff dc.w 36 theZoneName ds.b 34 *** End - 2-Apr-93 JCM GetDevNumParms dc.w 2 ;pcount devNumPath dc.l 0 theDevNumber dc.w 0 UserInfoParms dc.w 4 ;pcount dc.w $000D ;AppleShare FST dc.w $0006 ;User Info userDevNumber dc.w 0 dc.l userNameBuff ;userNameBuff dc.w 34 ;theUserName ds.b 32 *** 28-Jan-92 DAL userNameBuff dc.w 36 theUserName ds.b 34 *** end 28-Jan-92 * * AppendVolPString * * Input: YA = pointer to pstring * X = offset into EntityName structure * * Output: Stored string, advanced X * AppendVolPString name phd phy pha tsc tcd sep #$30 longa off longi off ldy #0 @char lda [1],y sta EntityName,x inx iny tya cmp [1] bcc @char beq @char rep #$30 longa on longi on ply ply pld rts ******************************************************************************* * * WriteNewAliasFile * * Input: contents of ReadBuffer must be valid * rrPathRef -- handle to new alias file pathname * ******************************************************************************* WriteNewAliasFile NAME ;entry used by Standard File new-alias creation code pushlong rrPathRef _HLock lda rrPathRef ldx rrPathRef+2 jsr DerefPathname ;XA = rrPathRef^+2 (it's a result buffer!) jsr SavePathPtrs ;save pointers to destination alias file pathname bra WriteAliasCommon ******************************************************************************* * * RewriteAliasFile - Used when "Save" is clicked in the server password dialog. * * Input: contents of ReadBuffer must be valid * X (high)/ Acc (low) contain pointer to destination alias file pathname. * ******************************************************************************* RewriteAliasFile NAME jsr SavePathPtrs ;save pointers to destination alias file pathname stz FullPathPtr+1 ;flag to not write the original file path at the end WriteAliasCommon NAME lda #3 ;read/write sta OpenAccess @openFile _OpenGS OpenBlock bcc @writeFile ;the file already exists, just rewrite the header cmp #fileNotFound bne @err _CreateGS CreateBlock bcc @openFile bra @err @writeFile lda OpenRef sta ReadRef sta CloseRef sta FullPathRef _WriteGS ReadBlock ;write the standard header lda FullPathPtr+1 ;are we re-writing a file? (changing pwd/user) beq @isExistingFile ; yup, no need to write the path _WriteGS FullPathBlock @isExistingFile php pha _CloseGS CloseBlock pla plp @err rts DestroyBlock dc.w 1 ;pcount destroyPath dc.l 0 CreateBlock dc.w 4 ;pcount createPath dc.l 0 dc.w $00C3 ;unlocked dc.w QuickMountFileType dc.l QuickMountAuxtype DerefPathname NAME phd phx pha tsc tcd ldy #2 lda [1],y tax lda [1] clc adc #2 bcc @1 inx @1 ply ply pld rts SavePathPtrs NAME stx destroyPath+2 sta destroyPath stx createPath+2 sta createPath stx fileNamePtr+2 ;for Open sta fileNamePtr rts ******************************************************************************* * * GetStandardFile -- if StdFile is not here, get it and start it up * ******************************************************************************* sfToolNumber equ $0017 GetStandardFile name stz weStartedSF pea 0 _SFStatus pla bne @done pea sfToolNumber pea 0 ;minimum version _LoadOneTool bcs @oops inc weStartedSF pha pha ;space for NewHandle pea $0000 ;size high pea $0100 ;size low lda myMemID pha pea $C015 ;attributes = fixed bank, etc. ldx #0 phx phx ;loc=0 _NewHandle plx ply bcs @oops stx sfHandle sty sfHandle+2 phd phy phx tsc tcd lda [1] sta sfDirPage plx ply pld lda myMemID pha lda sfDirPage pha _SFStartUp rts @oops sec rts @done clc rts ******************************************************************************* * * KillStandardFile -- if we got StdFile ourselves, shut it back down * ******************************************************************************* KillStandardFile name lda weStartedSF beq @done _SFShutDown pea sfToolNumber _UnloadOneTool pushlong sfHandle _DisposeHandle stz weStartedSF @done rts weStartedSF dc.w 0 sfHandle dc.l 0 sfDirPage dc.w 0 ******************************************************************************* ******************************************************************************* * * handleMountServer * * dataIn points to: * +000: data size (including this data word) * +002: image of Server alias document (QM document) * * dataOut points to: * +000: receive count * +002: error code * ******************************************************************************* handleMountServer NAME jsr ZeroReadBuffer lda >16 ;Push src address pea volumeName+1 clc adc #7 bcc @5 inx @5 phx ;Push dest address pha lda volumeName ;Push length including length byte and #$00ff pea 0 pha _BlockMove ; lda #0 ;Clear linked list field ; sta [RamDispatch lda LookupBlock+2 ; get result bcs @exit lda LookupCount ; get number of servers found and #$00FF ; just a byte dea ; if 1, leave 0 in A beq @exit ; one found, return carry clear sec ; no server found lda #$0400 ; fake no server found error @exit rts ; return with carry set if error ; ; 29-Oct-91 MSD: Added TestLoggedOn so that if the Option key is down, we can ; decide not to show the dialog box if we're already logged on. Returns with ; carry set if we're already logged on to the server. ; TestLoggedOn name lda LUpNet sta LoginNet lda LUpNodeSocket sta LoginNodeSocket stz CmdBLen ; don't actually log on, just test it ldx #Login2Block ldy #^Login2Block jsl >RamDispatch @exit rts ; return carry set if logged on ; End 29-Oct-91 ****************************************************************************** * * TryMount * * Calls TryMount2 and handles volume-already-mounted by asking the Finder * to open the window. * * (If the Control key is down, we don't try.) * ****************************************************************************** TryMount name jsr TryMount2 bcc @openIt cmp #$0a11 ;volume already mounted? beq @openIt sec rts @openIt *** added 18-Nov-91 DAL -- force Finder to schedule mounting this volume pha _ScanDevices ;force Finder's notify proc to see this insert pla *** end 18-Nov-91 DAL stz TryMountError clc rts openWindowOut dc.w 0 ;receive count dc.w 0 ;finder result dc.l 0 ;window pointer handleFinderIdle name * If our linked list of pathnames to open is nil, then we have nothing pending to open. lda PathListHandle+1 ;is the list empty? bne @HandleAction ; nope, open up one more brl @NoAction ; yup, just exit ; Save system prefs for restore after GetFileInfo @HandleAction _GetSysPrefsGS SavePrefBlock ;Set System prefs temporarily to make sure we prompt for offline volumes. _SetSysPrefsGS MyPrefBlock jsr ExtractPathPtr ;Set up ptr and handle to pathname lda PathPtr ldy PathPtr+2 jsr GetFileInfo pha ;Restore preferences _SetSysPrefsGS SavePrefBlock pla ;Restore error code from GetFileInfo beq @NoError cmp #$40 ;If bad path syntax, assume it's beq @DoOpenWindow ;something we want to openWindow on brl @CleanUpPending ;Other errors, exit. ;A volume was requested that was offline. @NoError *** Added - 25-Mar-93 JCM - If it's a folder or disk, open the window, if it's an app, launch it. *** Otherwise, we ignore it. jsr ValidateType bcs @NoAction cmp #$0f beq @DoOpenWindow bra @DoOpenApp ;must be an application ; ldy MyFileInfoType ;Is it a folder? ; cpy #$0f ; beq @DoOpenWindow ; ; cpy #$ff ;Try application ; beq @DoOpenApp ; ; cpy #$b3 ; beq @DoOpenApp ; ; cpy #$b5 ; beq @DoOpenApp ; ; bra @DoOpenDoc ;Default to document *** End - 25-Mar-93 JCM @NoAction clc rts @DoOpenApp lda PathPtr ;Set up pathname to launch ldy PathPtr+2 sta LaunchPathPtr sty LaunchPathPtr+2 stz LaunchBlock pea tellFinderLaunchThis pea sendToName+stopAfterOne pushlong #nameOfFinder pushlong #LaunchBlock bra @FinishSendReq ;@DoOpenDoc bra @CleanUpPending ;Need to add this! - 25-Mar-93 JCM - removed for now @DoOpenWindow pea tellFinderOpenWindow pea sendToName+stopAfterOne pushlong #nameOfFinder pushlong PathPtr @FinishSendReq pushlong #openWindowOut _SendRequest @CleanUpPending jsr disposePathHandle @Done sec rts *** Added - 25-Mar-93 JCM GetFileInfo sta FileInfoPathPtr sty FileInfoPathPtr+2 _GetFileInfoGS FileInfoBlock rts ValidateType lda MyFileInfoType ;Is it a folder? cmp #$0f beq @typeOk cmp #$ff ;Try application beq @typeOk cmp #$b3 beq @typeOk cmp #$b5 beq @typeOk @typeBad sec rts @typeOk clc rts *** End - 25-Mar-93 JCM TempEvent ds.b 16 LaunchBlock dc.w 0 LaunchPathPtr ds.l 1 FileInfoBlock dc.w 3 FileInfoPathPtr ds.l 1 ds.w 1 MyFileInfoType ds.w 1 SavePrefBlock dc.w 1 dc.w 0 MyPrefBlock dc.w 1 ;Allow volume mount dialog dc.w %1000000000000000 *** added 8-Jan-92 DAL -- If our device gets ejected, don't try to open it *** (This is important in case we mount something that turns out to be a *** duplicate-named volume. We can't necessarily tell in advance.) *** handleEjectingDev lda PathListHandle+1 bne @pending @reject clc ;reject event, nothing pending rts @pending sec ;accept the systemSaysEjectingDev event rts *** end 8-Jan-92 ****************************************************************************** * * TryMount2 * * Inputs: EntityName, VolumeName, UserName, Password, VPassword * * Outputs: network error code in A and TryMountError (SEC if error) * ****************************************************************************** ; 24-Oct-91 MSD: Changed the lookup to be synchronous, removed the checking for ; the call to complete and the NBPKill call. TryMount2 name stz TryMountError ; assume no error lda LUpNet sta LoginNet lda LUpNodeSocket sta LoginNodeSocket lda UserName ;is there a user name? and #$00ff beq doGuest ;no, login as guest lda #CmdBuffer ;set pointer to correct login block sta CmdBufferPtr lda #^CmdBuffer sta CmdBufferPtr+2 sep #$30 longa off longi off ldx UserName UNLoop lda UserName,x sta CmdUser,x dex bpl UNLoop rep #$30 longa on longi on lda UserName and #$00FF sec adc #CmdBaseLen sta CmdBLen bra skipGuest doGuest lda #GuestLogin sta CmdBufferPtr lda #^GuestLogin sta CmdBufferPtr+2 lda #GuestLoginLen sta CmdBLen skipGuest lda EntityName ;initialize zone name pointer in command and #$00ff ;block to point to zone name within inc a ;entity name. tay sec adc EntityName,y and #$00ff clc adc #EntityName sta LoginZone lda #^EntityName sta LoginZone+2 ldx #Login2Block ldy #^Login2Block jsl >RamDispatch sep #$30 lda LoginSession sta LoginCSession sta MountSession sta LogoutSession sta SPCmdSession ; Added 24-Oct-91 MSD rep #$30 bcc L2 lda LoginResult cmp #$0A04 ; login continue (want password) beq L3 cmp #$0A13 ; already logged on beq L2 BadExit sec sta TryMountError rts L3 lda RplyID sta Cmd2ID *** DES needs <0..<7 on direct page phd pha pha pha pha tsc inc a tcd ldx #DESBlock ldy #^DESBlock jsl DES pla pla pla pla pld *** unfutz direct page ldx #LoginCBlock ldy #^LoginCBlock jsl >RamDispatch lda LoginCBlock+2 bcs BadExit L2 jsr TestUserVolume ; see if User Volume bit should be set bcs @logoff ; couldn't find volume name! ldx #MountVolBlock ldy #^MountVolBlock jsl >RamDispatch bcc @L2 lda MountVolBlock+2 sta TryMountError cmp #$0A11 ; was volume already mounted? beq @L2 ;The carry will be set! ; ; 24-Oct-91 MSD: We couldn't mount the volume. If we were already ; logged on, don't bother logging off. ; @logoff ldx LoginResult cpx #$0A13 ; FILogin2 get already logged in error? beq @L2 ; Yes, don't log off (note: carry will be set!) ; End 24-Oct-91 MSD pha ; save error code ldx #LogoutBlock ldy #^LogoutBlock jsl >RamDispatch pla ; recover error code sec @L2 rts ; ; 24-Oct-91 MSD: Do an SPGetStatus to see if the server supports guest access ; (the "No User Authent" string will be in the list of UAMs). Set allowsGuest ; to a non-zero value if guests are allowed. ; GetStatus name ; Make a stack frame for local variables. They are: ; 1,s Pointer into reply buffer ; 5,s Count of UAM strings phd pha pha pha tsc tcd stz allowsGuest ; assume no guest access ; Copy pointer to ASP reply buffer to direct page lda SPGetStatus+$E sta <1 lda SPGetStatus+$10 sta <3 lda LUpNet ; copy server's address sta SPGetStatus+8 lda LUpNodeSocket sta SPGetStatus+10 @retry ldx #RamDispatch ; get info from server lda SPGetStatus+2 bcc @gotstat cmp #$0702 ; is ASP busy? beq @retry ; yes, so try call again sec ; return error bra @exit @gotstat ldy #4 lda [1],y ; get offset to count of UAM's xba ; put in 65816 order tay lda [1],y ; get count of number of UAM's and #$00FF ; just a byte sta <5 ; save count tya ; get offset to UAM count byte sec ; add one for count byte adc <1 ; point to first UAM string sta <1 ; For each UAM string, compare it to the Guest UAM @loop pha ; result of compare pea $0000 ; flags (reserved) pei <3 ; push pointer to this UAM string pei <1 pushlong #GuestUAM ; point to the Guest UAM string _CompareStrings pla beq @match ; equal, so set flag lda [1] ; get string length and #$00FF ; just a byte sec ; add one for length byte adc <1 sta <1 ; point to next UAM string dec <5 ; more to check? bne @loop beq @noerr ; no, so leave it alone @match inc allowsGuest ; set the flag @noerr clc ; no error @exit ply ; clean up stack ply ply pld rts ; End 24-Oct-91 MSD ; ; 24-Oct-91 MSD: Do an FPGetSrvrParms and find the volume in the list to see ; if it is a user volume (i.e., the hasConfigInfo bit is set); we'll also know ; if the volume has a volume password (as if anybody cares). If for any reason ; we can't find the volume, leave the user volume bit clear. ; TestUserVolume name ; ; Make a stack frame for some local variables. They are: ; 1,s Pointer into reply buffer ; 5,s Number of volumes left to check ; phd pha ; create room for some direct page variables pha pha tsc tcd ; make local stack frame lda MountVolFlags and #$FFFE ; clear user volume bit by default sta MountVolFlags ; Copy pointer to ASP reply buffer to direct page lda SPCommand+$11 sta <1 lda SPCommand+$13 sta <3 ; Attempt the FPGetSrvrParms (retry if ASP is busy) @retry ldx #RamDispatch bcc @gotparms lda SPCommand+2 ; get result cmp #$0702 ; is ASP busy (too many calls)? beq @retry ; if so, keep trying bne @errexit ; some other error, give up @gotparms ; Now see if we can find a matching volume in the list. ldy #4 ; offset to number of volumes in reply lda [1],y ; get number of volumes and #$00FF ; just a byte sta <5 ; save for loop beq @noVolumes ;added 17-Sep-92 DAL clc lda <1 adc #6 ; point to first volume's length byte sta <1 ; For each volume, compare it to given volume name @loop pha ; result of compare pea $0000 ; flags (reserved) pei <3 ; push pointer to volume in list pei <1 pushlong #VolumeName _CompareStrings pla bne @next @match dec <1 ; point to flags before length byte lda [1] ; get flags and #$0001 ; get only hasConfigInfo flag ora MountVolFlags ; put into MountVolFlags (same bit) sta MountVolFlags clc ; no error bra @exit ; done! @next lda [1] ; get length of volume name and #$00FF ; just one byte sec ; add 1 for length byte adc <1 ; point to flags for next volume ina ; point to string length for next volume sta <1 dec <5 ; any more volumes to check? bne @loop @noVolumes lda #$0A06 ; volume not found! @errexit sec ; error @exit ply ; clean up stack frame ply ply pld rts AllocSPReply pha pha ; room for result (handle) pushlong #SPReplyLen lda myMemID pha pea $C010 ; locked, fixed, no cross bank boundary pha ; starting location ignored pha _NewHandle ; allocate ASP's buffer plx ply bcs @exit stx SPReplyHandle sty SPReplyHandle+2 phd phy phx tsc tcd ldy #2 lda [1],y ; deref handle sta SPCommand+$13 ; save for SPCommand sta SPGetStatus+$10 ; save for SPGetStatus tax ; save for return in X lda [1] sta SPCommand+$11 sta SPGetStatus+$E ply ; remove handle from stack ply pld clc ; pointer in A,X (A low) @exit rts FreeSPReply pushlong SPReplyHandle _DisposeHandle rts ; End 24-Oct-91 MSD ****************************************************************************** ****************************************************************************** ReportMountError name lda TryMountError beq @quiet pha ; error code pushlong #errNum+1 ; pointer to string pea $0004 ; length to convert to _Int2Hex ; build a hex string for *1 _InitCursor pha ;space for AlertWindow result pea $0021 ;flags (cool button layout + substitute pStrings) pushlong #subArray pea Err1>>16 ; push high word of error message pointer lda TryMountError ldx #(ETable-ATKerrors)-2 ;index of last error number in table @lookup cmp ATKerrors,x beq @L0 ;found it! dex dex bpl @lookup ldx #(ETable-ATKErrors) ;use default string @L0 lda ETable,x pha ; push low word of message pointer _AlertWindow ; show the alert pla ; ignore the button pressed @quiet rts subArray dc.l VolumeName ; for Err1 dc.l errNum ; for generic error errNum dc.b 4,'0000' ; four-digit hex number ****************************************************************************** EndP End \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount.make b/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount.make new file mode 100644 index 0000000..58cd372 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount.make @@ -0,0 +1 @@ +# File: EasyMount.make # Target: EasyMount # Created: Tuesday, March 12, 1991 4:28:41 AM EasyMount ÄÄ EasyMount.DataFork EasyMount.RezFork delete -i EasyMount duplicate -y -d EasyMount.DataFork EasyMount duplicate -y -r EasyMount.RezFork EasyMount if {AutoDuplicate} == 1 DuplicateIIGS -y -mac EasyMount : End EasyMount.RezFork ÄÄ EasyMount.rii reziigs EasyMount.rii -o EasyMount.RezFork EasyMount.DataFork ÄÄ EasyMount.aii.obj DES.aii.obj linkiigs -t $B6 EasyMount.aii.obj DES.aii.obj -o EasyMount.DataFork .aii.obj Ä .aii asmiigs {Default}.aii -o {Default}.aii.obj -d DebugSymbols=0 \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount.rii b/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount.rii new file mode 100644 index 0000000..0048b22 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Finder/EasyMount/EasyMount.rii @@ -0,0 +1 @@ +/************************************************************* * * EasyMount resources * * Copyright 1991-1993 Apple Computer, Inc. * All Rights Reserved * ************************************************************* * * REVISION HISTORY * * 9-Jun-91 Dave Lyons * Created file (using Genesys 1.2.4). * * 5-Feb-92 DAL 1.0 on System 6.0 * Version 1.0. * *------------------------------------------------------------ * * 24-Feb-92 DAL * Version 1.1d1 for 6.1 * * 13-Mar-92 DAL * Version 1.1d2. * * 25-Mar-92 DAL * Version 1.1d3. * * 15-Jul-92 DAL * Version 1.1d7. * * 17-Jul-92 DAL * Version 1.1d8. * * 12-Aug-92 DAL * Version 1.1d9. * * 25-Aug-92 DAL * Version 1.1d10. * * 15-Sep-92 DAL * Version 1.1d11. * * 26-Jan-93 JCM * Version 1.1d13. * * 2-Mar-93 JCM * Version 1.1d14. Changed window and controls to work in 320 mode. * * 1-Apr-93 SS * Version 1.1 (release) * *************************************************************/ #include "typesiigs.r" // --- type $8003 defines #define CTLLST_00000E02 $00000E02 // --- type $8004 defines #define CTLTMP_00000001 $00000001 #define CTLTMP_00000002 $00000002 #define CTLTMP_00000003 $00000003 #define CTLTMP_00000004 $00000004 #define CTLTMP_00000005 $00000005 #define CTLTMP_00000006 $00000006 #define CTLTMP_00000007 $00000007 #define CTLTMP_00000008 $00000008 #define CTLTMP_00000009 $00000009 #define CTLTMP_0000000A $0000000A #define CTLTMP_0000000B $0000000B // --- type $8006 defines #define PSTR_00000001 $00000001 #define PSTR_00000002 $00000002 #define PSTR_00000003 $00000003 #define PSTR_00000004 $00000004 #define PSTR_00000005 $00000005 // --- type $800B defines #define LETXTBOX_00000001 $00000001 #define LETXTBOX_00000002 $00000002 #define LETXTBOX_00000003 $00000003 // --- type $800E defines #define WPARAM1_00000001 $00000001 resource rVersion(1) { { 1, 1, 0, release, $00 }, verUS, "EasyMount", "Copyright 1991-93 Apple Computer, Inc." }; resource rComment(1) { "by Dave ÒMr TangentÓ Lyons\n" "and Jim ÒWhoops!Ó Murphy\n" }; /* resource rComment(1) { "by Dave ÒMr TangentÓ Lyons\n\n" "ÒAfter using EasyMount for a little while, IÕve decided that itÕs " "really cool.Ó\n" " ÑAndy Nicholas" "\n\n" "ÒFor the school environment, EasyMount is the hottest thing since " "safe sex.\n" " ÑRon Lichty" }; */ resource rComment(2) { "To use EasyMount, put it in the System.Setup folder " "inside your System folder. The next time you start your system, " "you will be able to double-click on EasyMount alias documents, " "and ÒMake AliasÉÓ will appear in the FinderÕs Extras menu." }; resource rIcon (1) { 0x8000, /* Kind */ 20, /* Height */ 28, /* Width */ $"FFFFFFFFFFFF0FFF000000FFFFFF" $"FFFFFFFFFFF0a0FF0FFFF00FFFFF" $"FFFF000FFF0aaa0F0FDDD000FFFF" $"FFF0eee000000aa00FDDFFF0FFFF" $"FFF0eeeeeeee0aaa0FDDDDF0FFFF" $"FFF0eeeeeeee0aaaa0FFFFF0FFFF" $"FFF0eeeeeeee0aaa0FDDDFF0FFFF" $"FFF0eeeeeeee00a00FFFFFF0FFFF" $"FFF0000000000F0F00000000FFFF" $"FCCCCCCCCCCCCCCCCCCCCCCCCCFF" $"FFCCCCCCCCCCCCCCCCCCCCCCCFFF" $"FFFFFFF0F0F0F0FF0F0FFFFFFFFF" $"FFFFFFFF0F0F0F0F0F0FFFFFFFFF" $"FFFFFFFFF0F0FFF00F0FFFFFFFFF" $"FFFFFFFFFF00FFFFFF0FFFFFFFFF" $"FFFFFFFFFFFF0FFFFF0FFFFFFFFF" $"FFFFFFFFFFF000000000FFFFFFFF" $"FFFFFFFFFFF0DDDDDDD0FFFFFFFF" $"FFFFFFFFFFF0D0DDDDD0FFFFFFFF" $"FFFFFFFFFFF0DDDDDDD0FFFFFFFF", $"000000000000F000FFFFFF000000" $"00000000000FFF00FFFFFFF00000" $"0000FFF000FFFFF0FFFFFFFF0000" $"000FFFFFFFFFFFFFFFFFFFFF0000" $"000FFFFFFFFFFFFFFFFFFFFF0000" $"000FFFFFFFFFFFFFFFFFFFFF0000" $"000FFFFFFFFFFFFFFFFFFFFF0000" $"000FFFFFFFFFFFFFFFFFFFFF0000" $"000FFFFFFFFFFFFFFFFFFFFF0000" $"0FFFFFFFFFFFFFFFFFFFFFFFFF00" $"00FFFFFFFFFFFFFFFFFFFFFFF000" $"0000000FFFFFFFFFFFF000000000" $"00000000FFFFFFFFFFF000000000" $"000000000FFFFFFFFFF000000000" $"0000000000FFFFFFFFF000000000" $"000000000000FFFFFFF000000000" $"00000000000FFFFFFFFF00000000" $"00000000000FFFFFFFFF00000000" $"00000000000FFFFFFFFF00000000" $"00000000000FFFFFFFFF00000000"; }; // --- Control List Definitions resource rControlList (CTLLST_00000E02, $0000) { { CTLTMP_00000001, // control 1 CTLTMP_00000002, // control 2 CTLTMP_00000003, // control 3 CTLTMP_00000004, // control 4 CTLTMP_00000005, // control 5 CTLTMP_00000007, // control 7 CTLTMP_00000006, // control 6 CTLTMP_00000008, // control 8 CTLTMP_00000009, // control 9 CTLTMP_0000000A, // control 10 CTLTMP_0000000B, // control 11 }; }; // Save button = 1 resource rControlTemplate (CTLTMP_00000001, $0000) { $00000001, // ID {108,12,121,98}, // rect simpleButtonControl {{ $0000, // flag $3002, // moreFlags $00000000, // refCon PSTR_00000001, // titleRef 0, // colorTableRef {"S","s",$0100,$3900} // key equivalents }}; }; resource rPString (PSTR_00000001, $0000) { "Save" }; // Cancel button = 2 resource rControlTemplate (CTLTMP_00000002, $0000) { $00000002, // ID {108,106,121,192}, // rect simpleButtonControl {{ $0000, // flag $3002, // moreFlags $00000000, // refCon PSTR_00000002, // titleRef 0, // colorTableRef {"\$1B", "\$1B",$0000,$0000} // key equivalents }}; }; resource rPString (PSTR_00000002, $0000) { "Cancel" }; // Connect button = 3 resource rControlTemplate (CTLTMP_00000003, $0000) { $00000003, // ID {108,204,121,290}, // rect simpleButtonControl {{ $0001, // flag $3002, // moreFlags $00000000, // refCon PSTR_00000003, // titleRef 0, // colorTableRef {"\$0D", "\$0D",$0000,$0000} // key equivalents }}; }; resource rPString (PSTR_00000003, $0000) { "Connect" }; // Registered user radio button resource rControlTemplate (CTLTMP_00000004, $0000) { $00000004, // ID {51,84,60,222}, // rect radioControl {{ $0001, // flag $3002, // moreFlags $00000000, // refCon PSTR_00000004, // titleRef $0000, // initialValue 0, // colorTableRef {"R","r",$0100,$3900} // key equivalents }}; }; resource rPString (PSTR_00000004, $0000) { "Registered User" }; // Guest radio button resource rControlTemplate (CTLTMP_00000005, $0000) { $00000005, // ID {40,84,49,152}, // rect radioControl {{ $0001, // flag $3002, // moreFlags $00000000, // refCon PSTR_00000005, // titleRef $0000, // initialValue 0, // colorTableRef {"G","g",$0100,$3900} // key equivalents }}; }; resource rPString (PSTR_00000005, $0000) { "Guest" }; resource rControlTemplate (CTLTMP_00000008, $0000) { $00000008, // ID {2,2,29,60}, // rect iconButtonControl {{ $000E, // flag $1020, // moreFlags $00000000, // refCon 1, // iconRef 0, // titleRef 0, // colorTableRef $0000 // displayMode }}; }; resource rControlTemplate (CTLTMP_00000009, $0000) { $00000009, // ID {7,64,35,295}, // rect statTextControl {{ $0003, // flag (substitute pstring) $1002, // moreFlags $00000000, // refCon LETXTBOX_00000001, // textRef 0, // textSize $0000 // just }}; }; resource rTextForLETextBox2 (LETXTBOX_00000001, $0000) { "Connect to the file server Ò*0Ó as:" }; // NAME stuff resource rControlTemplate (CTLTMP_0000000B, $0000) { $0000000B, // ID {69,42,79,81}, // rect statTextControl {{ $0004, // flag (fast) $1002, // moreFlags $00000000, // refCon LETXTBOX_00000003, // textRef 0, // textSize $0000 // just }}; }; resource rTextForLETextBox2 (LETXTBOX_00000003, $0000) { "Name:" }; resource rControlTemplate (CTLTMP_00000007, $0000) { $00000007, // ID {68,84,81,292}, // rect editLineControl {{ $0000, // flag $7002, // moreFlags $00000000, // refCon $001F, // maxSize 0 // defaultRef }}; }; // PASSWORD stuff resource rControlTemplate (CTLTMP_0000000A, $0000) { $0000000A, // ID {86,12,96,81}, // rect statTextControl {{ $0004, // flag (fast) $1002, // moreFlags $00000000, // refCon LETXTBOX_00000002, // textRef 0, // textSize $0000 // just }}; }; resource rTextForLETextBox2 (LETXTBOX_00000002, $0000) { "Password:" }; resource rControlTemplate (CTLTMP_00000006, $0000) { $00000006, // ID {84,84,97,176}, // rect editLineControl {{ $0000, // flag $7002, // moreFlags $00000000, // refCon $8008, // maxSize 0 // defaultRef }}; }; // --- Window Templates // "Connect to Blah as" window (Guest/Registered/Name/Password) resource rWindParam1 (WPARAM1_00000001, $0000) { $2080, // plFrame (frame bits) NIL, // plTitle (no Title) $00000000, // plRefCon { 0, 0, 0, 0}, // plZoomRect NIL, // plColorTable (standard colors) {$0000, $0000}, // plYOrigin, plXOrigin {$0000, $0000}, // plDataHeight, plDataWidth {$0000, $0000}, // plMaxHeight, plMaxWidth {$0000, $0000}, // plVerScroll, plHorScroll {$0000, $0000}, // plVerPage, plHorPage $00000000, // plInfoText (info RefCon) $0000, // plInfoHeight {34,168,162,472}, // plPosition infront, // plPlane CTLLST_00000E02, // plControlList $0009 // plInDesc }; \ No newline at end of file diff --git a/IIGS.601.SRC/A.U.G/Finder/File.aii b/IIGS.601.SRC/A.U.G/Finder/File.aii new file mode 100644 index 0000000..e615891 --- /dev/null +++ b/IIGS.601.SRC/A.U.G/Finder/File.aii @@ -0,0 +1 @@ +******************************************************** * * Apple IIGS Finder * File & disk copy routines * * Copyright Apple Computer, Inc. 1986-1993 * All Rights Reserved * * Written by Cheryl Ewy * Modified for GS/OS by Don Brady * Modified for Finder 6.0 by Andy Nicholas * Modified for 6.0.1 mostly by Dave Lyons, 1992-1993 * * Modification History for Version 1.2: * ------------------------------------- * 05/17/88 DJB - Added session_call calls to "DeleteFiles" * - Added session_call calls to "DoFileCopy" * 07/25/88 DJB - Added GetCreateDate() and other create * date stuff for disk copy. * 07/27/88 DJB _ Added check to DoCopyFiles to skip feedback * dialog when duplicating files. * 07/27/88 JAM - Addressed BRC #34406 by increasing the * slop cushion in GetBuffer from 3K to 24K. * 08/03/88 DJB - Added GetDstFileSys() and CheckDstName() routines. * 08/06/88 DJB - Made calls to SaveDevStats() routine. * 08/06/88 DJB - Turn off Sessioning when dialog boxes are up * 08/06/88 DJB - Changed the pcount in the create call to 5 (was 4) * 08/12/88 DJB - Added TranslatedName to replace illegal use of FileName variable * 08/14/88 DJB - Added RestartSession and checked for memory * errors inside the write loop. ******************************************************** * * For 6.0.1 -- most changes marked with "DAL" <-- he lies - there are more "JCM"s now :-) * * 12-Jun-92 DAL -- Uses DisposeHandleGlue * * 19-Jun-92 DAL -- changed lots of pushlong #0 to * lda #0...pha pha, especially when * several were clustered together * * 27-Jan-93 JCM - Changed all _CloseWindow macros to make jsl's * to new common close window functions that I've * added to Util.aii. * * 1-Feb-93 JCM - Made IsFileMagic actually walk its match table without getting out of sync with the * records on a failed partial match (filetype matched/auxType didn't). By removing lots * of INXs on Dave's suggestion (boy, was I dumb), all is now well and Printer drivers can * now properly route. * * 20-Mar-93 JCM - Fixed IsFileMagic to restore C1_DstPathname to *:System if the file isn't routable and * we're in the process of copying files. This stops non-routable files from following the * last file we routed into their folder. * * 24-Mar-93 JCM - Guess what? The server copy code doesn't work! It's too late to re-write it (as I * fear needs to happen), so we're disabling it for 6.0.1. * * 24-Mar-93 JCM - Fixed the option-copy case where you dragged a file from the desktop back to the window * it really belongs to. Before we would try to copy the file over itself, which isn't a * very pretty sight. * * 24-Mar-93 JCM - Fixed DoMagicRouting and IsFileMagic to better communicate to each other why files * could not be routed, if that's the case. We can now differentiate between the states * of "we aren't routing at all" and "this file isn't routable". * * 25-Mar-93 JCM - We no longer attempt to route Media Control drivers. This allows us to take the easy way * out and always assume that the folder we're routing to will exist. * * 25-Mar-93 JCM - Fixed CompareVols to be insensitive in its comparison. * * 26-Mar-93 JCM - Soon after we start duping the d15 disks, I find that my CompareVols fix is broken. * Now it _really_ works if the volumes are different or you're holding down the option key. * * 1-Apr-93 JCM - Awww, what the heck. Let's route Media Control drivers anyway. Someone can always * rename any destination folder, so these really aren't so special. * ******************************************************** PRINT OFF STRING ASIS BLANKS OFF MACHINE M65816 LONGA on LONGI on INCLUDE 'all.macros' INCLUDE 'special.macros' INCLUDE 'Finder.equ' INCLUDE 'Resource.equ' INCLUDE 'Strings.equ' include 'dp.equ' PRINT ON import DisposeHandleGlue ; ; equates for FSTs ; PRODOS_FST equ $01 DOS33_FST equ $02 PASCAL_FST equ $04 HFS_FST equ $06 MSDOS_FST equ $0A APPLESHARE_FST equ $0D ;------------------------------------------ ; ; Equates for File Copy module ; ;------------------------------------------ MaxIcons equ 800 ;maximum # of icons which can be copied SFISize equ 116 ;size of SET_FILE_INFO param block sizeOfSizeInfo equ 10 ;new equates for extended file copies dataFork equ $4000 resourceFork equ $8000 *--------------------------------------------------------------- * Zero Page *--------------------------------------------------------------- ZStart equ 0 ProgID equ ZStart Error equ ProgID+2 NumFiles equ Error+2 NumFolders equ NumFiles+4 NumCats equ NumFolders+2 NumItems equ NumCats+2 CatIndex equ NumItems+4 CatHndl equ CatIndex+2 CatPtr equ CatHndl+4 BufHndl equ CatPtr+4 BufPtr equ BufHndl+4 BufSize equ BufPtr+4 SoFarFlag equ BufSize+4 DataForkYet equ SoFarFlag+2 DataReadSize equ DataForkYet+4 RsrcForkYet equ DataReadSize+4 RsrcReadSize equ RsrcForkYet+4 CatalogEOF equ RsrcReadSize TotalEOF equ CatalogEOF+4 IconListHndl equ TotalEOF+4 IconHndl equ IconListHndl+4 IconPtr equ IconHndl+4 INamePtr equ IconPtr+4 SrcPathLen equ INamePtr+4 DstPathLen equ SrcPathLen+2 PathNamePtr equ DstPathLen+2 FileNamePtr equ PathNamePtr+4 OtherPtr equ FileNamePtr+4 RWPtr equ OtherPtr+4 segmentCount equ RWPtr+4 DstFileSysID equ segmentCount+2 SrcFileSysID equ DstFileSysID+2 SkipBadNames equ SrcFileSysID+2 NamesWereXLated equ SkipBadNames+2 DestDeviceNumber equ NamesWereXLated+2 Disk2Sub equ DestDeviceNumber+2 DeleteFlag equ Disk2Sub+2 ReadDuplicate equ DeleteFlag+2 WriteDuplicate equ ReadDuplicate+2 WhichMsg equ WriteDuplicate+2 DelAllDups equ WhichMsg+2 NumParams equ DelAllDups+2 IsExtended equ NumParams+2 NewNamePtr equ IsExtended+2 segmentBlocks equ NewNamePtr+4 localTemp equ segmentBlocks+2 MaxFileSize equ localTemp+4 OurFileSize equ MaxFileSize+4 CallBackStructPtr equ OurFileSize+4 ZEnd equ CallBackStructPtr+4 IF ZEnd>$FF THEN WRITE 'ZEnd = ' WRITELN ZEnd WRITELN 'WARNING... Direct page variable overflow!' AERROR 'File.aii extended its local DP too far' ENDIF ;----------------------------------------------- ; ; Equates for New Block Copy ; added 4/19/89 DJB ; ;----------------------------------------------- segmentSize equ 36864 ; size of each segment (bytes) maxSegments equ 200 ;200 36k segments maximum (8 MB of ram used, max) ;----------------------------------------------- ; ; Imported addresses ; ;----------------------------------------------- IMPORT EndCall IMPORT ErrOut IMPORT MiscEntry IMPORT oEndCall IMPORT PathAddName IMPORT PToWString IMPORT WStringCopy IMPORT SaveDevStats ;in drives.aii ;----------------------------------------------- ; ; Forward addresses and entries ; ;----------------------------------------------- ENTRY RestartSession ENTRY MakeFileName ENTRY AddDstSlash ENTRY AddSrcSlash ENTRY AllocateMem ENTRY CatalogSrc ENTRY DrawMsg ENTRY DrawThermo ENTRY ChangePath ENTRY CheckDstName ENTRY NameErr ENTRY CheckKey ENTRY CloseFile ENTRY CopyDisk ENTRY CopyFiles ENTRY CreateFile ENTRY DeleteFiles ENTRY DerefIcon ENTRY DestroyFile ENTRY DoFileCopy ENTRY DupFiles ENTRY EraseDisk ENTRY FileStartUp ENTRY GetBuffer ENTRY GetDevInfo ENTRY GetDevNum ENTRY GetDstFileSys ENTRY GetFileInfo ENTRY GetFileInfo2 ENTRY GetFileInfo3 ENTRY GetMark ENTRY GetNextCat ENTRY GetNextFile ENTRY GetNextIcon ENTRY GetSelIcon ENTRY GetVolInfo ENTRY GetVolSizes ENTRY RebuildVCR ENTRY LockIcon ENTRY MakeDstName ENTRY MakeINamePtr ENTRY MakePathName ENTRY MakeSrcName ENTRY OpenFile ENTRY OpenResource ENTRY ProDosCall ENTRY ProDosErr ENTRY ReadBlocks ENTRY ReadDataFile ENTRY ReadRsrcFile ENTRY SetFileInfo ENTRY SetMark ENTRY StdEnd ENTRY UnLockIcon ENTRY WriteBlocks ENTRY WriteDataFile ENTRY WriteRsrcFile **************************************************************** * * FILE ROUTINES - CALL TABLE * **************************************************************** FileRoutines PROC DC.L FileStartUp DC.L CopyFiles DC.L CopyDisk DC.L DeleteFiles DC.L DupFiles ENDP **************************************************************** * * FILE ROUTINES - DATA DECLARATIONS * **************************************************************** FRData PROC *--------------------------------------------------------------- * Data *--------------------------------------------------------------- ENTRY ZeroPage ZeroPage DS.B 2 ;zero page assigned to File Routines ENTRY CP_Trustme CP_Trustme DC.W 3 ;parameter block for CHANGE_PATH call with Trustme flag ENTRY CP_TOldPtr CP_TOldPtr DC.L 0 ;ptr to original pathname ENTRY CP_TNewPtr CP_TNewPtr DC.L 0 ;ptr to new pathname ENTRY CP_TrustmeFlag CP_TrustmeFlag DC.W $8000 ENTRY OE_Params OE_Params DC.W 4 ;paramater block for extend OPEN call ENTRY OE_Ref OE_Ref DC.W 0 ;reference number ENTRY OE_NamePtr OE_NamePtr DC.L 0 ;ptr to pathname ENTRY OE_ReqAccess OE_ReqAccess DC.W 0 ;request access ENTRY OE_Resource OE_Resource DC.W 1 ;resource number (use resource fork) ENTRY C_Params C_Params DC.W 1 ;parameter block for CLOSE call ENTRY C_Ref C_Ref DC.W 0 ;reference number ENTRY RW_Params RW_Params DC.W 4 ;parameter block for READ/WRITE calls ENTRY RW_Ref RW_Ref DC.W 0 ;reference number ENTRY RW_BufPtr RW_BufPtr DC.L 0 ;ptr to data buffer ENTRY RW_Size RW_Size DC.L 0 ;number of bytes to read or write ENTRY RW_Actual RW_Actual DC.L 0 ;number of bytes actually read/written ENTRY RWE_Params RWE_Params DC.W 4 ;parameter block for extend READ/WRITE ENTRY RWE_Ref RWE_Ref DC.W 0 ;reference number ENTRY RWE_BufPtr RWE_BufPtr DC.L 0 ;ptr to data buffer ENTRY RWE_Size RWE_Size DC.L 0 ;number of bytes to read or write ENTRY RWE_Actual RWE_Actual DC.L 0 ;number of bytes actually read/written ENTRY CP_Params CP_Params DC.W 2 ;parameter block for CHANGE_PATH call ENTRY CP_OldPtr CP_OldPtr DC.L 0 ;ptr to original pathname ENTRY CP_NewPtr CP_NewPtr DC.L 0 ;ptr to new pathname ENTRY GM_Params GM_Params DC.W 2 ;parameter block for GET_MARK ENTRY GM_Ref GM_Ref DC.W 0 ;reference number ENTRY GM_Position GM_Position DC.L 0 ;position in file ENTRY SM_Params SM_Params DC.W 3 ;parameter block for SET_MARK ENTRY SM_Ref SM_Ref DC.W 0 ;reference number ENTRY SM_Base SM_Base DC.W 0 ENTRY SM_Displace SM_Displace DC.L 0 ;position in file ENTRY E_Params E_Params DC.W 4 ;parameter block for ERASE_DISK call ENTRY E_DevName E_DevName DC.L C1_DeviceName ;ptr to device name ENTRY E_VolName E_VolName DC.L 0 ;ptr to volume name ENTRY E_FileSys E_FileSys DC.W 0 ;file system ID ENTRY E_ReqFileSys E_ReqFileSys DC.W 0 ;requested file system ID ENTRY V_Params V_Params DC.W 5 ;parameter block for VOLUME call ENTRY V_DevName V_DevName DC.L C1_DeviceName ;ptr to device name ENTRY V_VolName V_VolName DC.L FileNameBuff ;ptr to volume name - unused ENTRY V_Blocks V_Blocks DC.L 0 ;total blocks - unused ENTRY V_Free V_Free DC.L 0 ;free blocks - unused ENTRY V_FileSys V_FileSys DC.W 0 ;file system ID ENTRY RWB_Params RWB_Params DC.W 6 ;param block for D_READ/D_WRITE calls ENTRY RWB_DevNum RWB_DevNum DC.W 0 ;device number ENTRY RWB_BufPtr RWB_BufPtr DC.L 0 ;ptr to data buffer ENTRY RWB_Count RWB_Count DC.L 512 ;bytes to read ENTRY RWB_BlockNum RWB_BlockNum DC.L 0 ;block number to be read or written ENTRY RWB_BlockSize RWB_BlockSize DC.L 512 ;the size, in bytes, of a block ENTRY RWB_Actual RWB_Actual DC.L 0 ;bytes actually transfered ENTRY GDN_Params GDN_Params DC.W 2 ;parameter block for GET_DEV_NUM call ENTRY GDN_Name GDN_Name DC.L 0 ;ptr to volume name ENTRY GDN_DevNum GDN_DevNum DC.W 0 ;device number ENTRY DI_Params DI_Params DC.W 2 ;parameter block for D_INFO call ENTRY DI_DevNum DI_DevNum DC.W 0 ;device number ENTRY DI_DevName DI_DevName DC.L C1_DevNameBuf ;ptr to device name (class 1 output) ENTRY D_Params D_Params DC.W 1 ;parameter block for DESTROY call ENTRY D_Name D_Name DC.L 0 ;ptr to file's pathname ENTRY FlushParms FlushParms dc.w 1 dc.w 0 ;flush everything ENTRY FI_Params FI_Params DC.W 12 ;parameter block for GET_FILE_INFO calls ENTRY FI_Name FI_Name DC.L 0 ;ptr to pathname ENTRY FI_Access FI_Access DC.W 0 ;access ENTRY FI_FType FI_FType DC.W 0 ;file type ENTRY FI_AType FI_AType DC.L 0 ;aux type ENTRY FI_SType FI_SType DC.W 0 ;storage type ENTRY FI_CDate FI_CDate DC.L 0,0 ;create date ENTRY FI_MDate FI_MDate DC.L 0,0 ;modify date ENTRY FI_OptionListPtr FI_OptionListPtr dc.L FI_OptionList ;option list support 11/21/90, by andy ENTRY FI_EOF FI_EOF DC.L 0 ENTRY FI_Blocks FI_Blocks DC.L 0 ENTRY FI_ResourceEOF FI_ResourceEOF DC.L 0 ENTRY FI_ResourceBlocks FI_ResourceBlocks DC.L 0 ENTRY FI_OptionList FI_OptionList dc.W 64 ;fixing BRC #77946 ds.b 62 ENTRY O_Params O_Params DC.W 0 ;paramater block for OPEN call (filled) ENTRY O_Ref O_Ref DC.W 0 ;reference number ENTRY O_NamePtr O_NamePtr DC.L 0 ;ptr to pathname ENTRY O_ReqAccess O_ReqAccess DC.W 0 ;request access ENTRY O_Resource O_Resource DC.W 0 ;resource number ENTRY O_Access O_Access DC.W 0 ;file access ENTRY O_FileType O_FileType DC.W 0 ;file type ENTRY O_AuxType O_AuxType DC.L 0 ;aux type ENTRY O_StoreType O_StoreType DC.W 0 ;storage type ENTRY O_CreateDate O_CreateDate DC.L 0,0 ;creation date ENTRY O_ModDate O_ModDate DC.L 0,0 ;modification date ENTRY O_OptionList O_OptionList DC.L 0 ;option list ptr ENTRY O_DataEOF O_DataEOF DC.L 0 ;data fork EOF ENTRY O_Blocks O_Blocks DC.L 0 ;blocks used ENTRY O_RsrcEOF O_RsrcEOF DC.L 0 ;resource fork EOF ENTRY session_call session_call DC.W 0 ;parameter block for SESSION calls ENTRY session_list session_list DC.W 0 ;parameter block for SESSION_STATUS call (filled) ENTRY session_stat session_stat DC.W 0 ENTRY C1_DevNameBuf C1_DevNameBuf DC.W 0 ;space for device name ENTRY C1_DeviceName C1_DeviceName DS.B 34 ;space for device name ENTRY FileNameBuff FileNameBuff DC.W 0 ;length of buffer (filled in later) ENTRY FileName FileName DS.B MaxFileName+2 ;space for local filename ENTRY TranslatedName TranslatedName DS.B MaxFileName+3 ;space for Translated filename+1 ENTRY AbortFlag AbortFlag DC.W 0 ;added 06/09/88 DJB EXPORT C1_SrcPathName ENTRY C1_SrcPathName C1_SrcPathName DS.B MaxPathLen+MaxFileName+2 ;added 06/28/88 DJB EXPORT C1_DstPathName ENTRY C1_DstPathName C1_DstPathName DS.B MaxPathLen+MaxFileName+2 ;added 06/28/88 DJB ENTRY C1_IconName ;added 06/28/88 DJB C1_IconName DS.B MaxFileName+2 ; ; last source and destination device numbers used by block copy ; ENTRY Source_DevNum Source_DevNum dc.w 0 ENTRY Dest_DevNum Dest_DevNum dc.w 0 EXPORT copyWindowPtr copyWindowPtr dc.L 0 ENTRY ourPort ourPort dc.L 0 ; ; parameter list for FSTSpecific file copy for AppleShare FST ; ENTRY CopyFileParms CopyFileParms dc.w 4 dc.w $000d ;AppleShare dc.w 7 ;copyFiles dc.L c1_SrcPathname ;srcPtr dc.L c1_DstPathname ;destPtr ENDP **************************************************************** * * FileEntry * **************************************************************** EXPORT FileEntry FileEntry PROC ;NOTE - this is self-modifying code! ;X contains the number of the routine to execute dex ;decrement routine # txa ;create index into table of addresses asl a asl a tax lda >FileRoutines,x ;get address of routine sta >Adrs+1 ;and store after the JSL lda >FileRoutines+1,x sta >Adrs+2 lda >ZeroPage ;load A with zero page assigned to us Adrs jsl Adrs ;execute the routine rtl ;return to calling routine ENDP **************************************************************** * * FileStartUp * **************************************************************** FileStartUp PROC ZP equ 9 ;input params ID equ ZP+2 phd lda ZP,s ;get zero page assigned to us sta >ZeroPage ;and save tcd ldx #ZEnd ZPLoop stz C1_Filename+2,x inx cpx C1_DstPathname blt @loop @gotRoot rep #$20 LONGA ON lda C1_DstPathname dec a sta >c1_filename lda #rasDragReadOnly jsl doAlertwindow sec rts ENDP **************************************************************** * * CopyFiles * **************************************************************** CopyFiles PROCNAME IMPORT SaveCursor IMPORT RestoreCursor IMPORT ArrowCursor IMPORT WatchCursor IMPORT finderTaskRecord IMPORT doAlertWindow import WindowGlobalON import WindowGlobalOFF import FileCopyOpen import FileCopyClose import DrawCopyControls import DrawNumItems import StrAlloc import ChangePathFixPath import c1_pathname import c1_temppath import FinderDPage IMPORT CloseFileWindow ;in util.aii - 27-Jan-93 JCM import WStrCompare ;24-Mar-93 JCM OptionKey equ 10 ; WARNING: clones of OptionKey and DstPtr equ OptionKey+2 ; DstPtr are now used in StdEnd SrcPtr equ DstPtr+4 IcHndl equ SrcPtr+4 ;input parameters ParamSize equ 14 ;# of bytes of input params SrcVolLen equ ZEnd ;zero page temps DstVolLen equ SrcVolLen+2 RetAdrs equ DstVolLen+2 IF RetAdrs+4>$FF THEN WRITE 'RedAdrs = ' WRITELN RetAdrs WRITELN 'WARNING... Direct page variable overflow!' AERROR 'CopyFiles extended its local DP too far' ENDIF phd tcd phb phk plb lda #ParamSize ;# of bytes of input params sta FinderDPage ;only look to disallow the move if the option key tax ; is down lda >modifiers,x and #$0800 beq @diffVols pha lda SrcPtr+4,s ;get ptr to source (window) pathname pha lda SrcPtr+4,s pha lda DstPtr+8,s ;get ptr to dest (window) pathname pha lda DstPtr+8,s pha jsl WStrCompare pla beq @diffVols stz diffVolumes ;so indicate dec finderTaskRecord ; pha ;push the task record's ptr ; lda #0 ; pha ; pha ;update proc ; pea $8000 ; pha ;eventHook ; pha ; pha ;beep proc ; pea $c010 ;flags ; _DoModalWindow ; ; pla ; plx ; cmp #2 ; blt @loop ; ; dec a ; dec a ; asl a ; tax ; lda returns,x ; pha ; ; jsl RestoreCursor ; ; jsl CloseFileWindow ; ; pla ; asl a ;button ID returned in A ; bmi PUDone ;'Cancel' selected ; ror a ;restore hi bit of button ID ; sta FinderDPage tax lda >modifiers,x and #$0800 bne CVReturn *** end 17-Aug-92 sep #$20 LONGA OFF ldx #0 ;determine length of source volume name CVSrcLoop inx lda C1_SrcPathName+2,x cmp #SEPARATOR ;GS/OS separator character bne CVSrcLoop stx magicToDo @exitCountIcons clc ;indicate no error *** end - 18-Jan-93 JCM rts ; ; augh, say we can only copy 1000 icons at a time ; TooManyIcons lda #rasTooMany jsl doAlertWindow sec rts ;--------------------------------------------------------------- ; GetCatalogs ;--------------------------------------------------------------- GetCatalogs pla ;get return address sta magicToDo ;is the dest the System folder? beq exitIsFileMagic ; nope, don't touch this one ldy #icFType ;index to the source file's type within the current IconObj lda [magicToDo ;is the dest the System folder? beq exitIsFileMagic ; nope, don't touch this one ; Now that we know the dest is the System folder, let's see if this file should be dumped somewhere within it. magicCommon stx typeOfMagic ;tells if we're copying or just counting magic files ldx #endMagicTypes-magicTypesTable ;start with the last item in the table @checkThisType lda magicTypesTable,x ;snag a file type from the table cmp magicFileType bne @checkNextMagicType ; nupe, see if we have more to do ; Ok, we've matched the fileType, now let's see if the auxType is one that we'll accept. ;move to the auxType AND mask lda magicAuxType and magicTypesTable+2,x cmp magicTypesTable+4,x ;do we want this one (move to the auxType compare bits)? bne @checkNextMagicType ; no way dude, run like hell ; Ok, this file is indeed one we can specially place. Return to the caller a pointer to a string which ; represents the folder (or nested folders) in which this file should be placed. lda magicTypesTable+6,x ;get the low word of the folder string ptr ldy magicTypesTable+8,x ;and the high word of the pointer clc rts @checkNextMagicType txa sec sbc #magicRecSize ;index to the previous record tax bpl @checkThisType * Since the file we were just handed isn't routable, we need to see if we're actually in the process * of copying files. If we are, then we need to restore the destination pathname to be simply the * system folder. We don't want this file to be copied to the same place the last file was routed. lda typeOfMagic ;are we just counting files? bpl exitIsFileMagic ; yup, no need to restore the pathname jsr SetC1_DstToSystemFolder ;restore pathname to ":System" ( is fully expanded) lda #$FFFF ;load a negative val to signal that caller should continue exitIsFileMagic sec rts typeOfMagic dc.w 0 ;are we counting magic files ($0000) or copying them ($8000)? numMagicFiles dc.w 0 ;number of files to route as discovered by CountIcons magicFileType dc.w 0 magicAuxType dc.w 0 ;%%% I probably should do all four bytes... ; %%% Temp locals - move to a data seg later? ; %%% Write an init function that clears the count words to zero before we start. *** Note--table is searched end-to-beginning, so put the more generic entries earlier in the table. magicTypesTable dc.w $C7 ;Control Panel dc.w $0000 ;auxType AND mask dc.w $0000 ;auxType compare bits dc.l CDevsFolderStr ;folder to drop these files into dc.w $0000 ;number of files we just copied of this type magicRecEnd dc.w $B8 ;New desk accessory dc.w $0000 dc.w $0000 dc.l DAFolderStr dc.w $0000 dc.w $B9 ;Classic desk accessory dc.w $0000 dc.w $0000 dc.l DAFolderStr dc.w $0000 dc.w $BB ;Driver dc.w $0000 dc.w $0000 dc.l DriversFolderStr dc.w $0000 dc.w $BB dc.w $7F00 ;AND mask dc.w $0400 ;Media Ctl drivers have $04xx or $84xx dc.l MediaCtlFolderStr dc.w $0000 dc.w $BC ;Finder extension dc.w $7FFF dc.w $0001 dc.l FEFolderStr dc.w $0000 dc.w $C8 ;Font dc.w $8000 ;bit 15 = do not route font (1-Feb-93 DAL) dc.w $0000 dc.l FontsFolderStr dc.w $0000 dc.w $BD ;File System Translator dc.w $0000 dc.w $0000 dc.l FSTsFolderStr dc.w $0000 dc.w $D8 ;Sound resource file dc.w $FFFF dc.w $0003 dc.l SoundsFolderStr dc.w $0000 dc.w $B6 ;Permanent initialization file dc.w $0000 dc.w $0000 dc.l SetupFolderStr dc.w $0000 dc.w $B7 ;Temporary initialization file dc.w $0000 dc.w $0000 dc.l SetupFolderStr dc.w $0000 endMagicTypes dc.w $BA ;Tool dc.w $0000 dc.w $0000 dc.l ToolsFolderStr dc.w $0000 magicRecSize equ magicRecEnd-magicTypesTable ;length of each individual record string GSOS CDevsFolderStr dc.b 'CDevs' DAFolderStr dc.b 'Desk.Accs' DriversFolderStr dc.b 'Drivers' MediaCtlFolderStr dc.b 'Drivers:Media.Control' FEFolderStr dc.b 'FinderExtras' FontsFolderStr dc.b 'Fonts' FSTsFolderStr dc.b 'FSTs' SoundsFolderStr dc.b 'Sounds' SetupFolderStr dc.b 'System.Setup' ToolsFolderStr dc.b 'Tools' *** end 18-Jan-93 JCM ENDP **************************************************************** * * CopyDisk * **************************************************************** CopyDisk PROC IMPORT saveCursor IMPORT restoreCursor IMPORT arrowCursor IMPORT watchCursor IMPORT PathGetName IMPORT c1_dest IMPORT c1_source IMPORT doAlertCopy IMPORT finderTaskRecord IMPORT CopyUpdate IMPORT DrawCopyControls IMPORT lastThermo IMPORT WindowGlobalON IMPORT WindowGlobalOFF IMPORT isFormattable IMPORT isReadOnly IMPORT WStrCompare IMPORT EjectDisk IMPORT doAlertWindow IMPORT OOMDumped IMPORT FileCopyOpen IMPORT FileCopyClose IMPORT strAlloc IMPORT DrawCopyControls import drawNumItems Preference equ 10 OptionKey equ Preference+2 DstHndl equ OptionKey+2 SrcHndl equ DstHndl+4 ;input parameters ParamSize equ 12 ;# of bytes of input params SrcSize equ ZEnd ;zero page temps SrcUsed equ SrcSize+4 AdjSrcUsed equ SrcUsed+4 DstSize equ AdjSrcUsed+4 DstFree equ DstSize+4 SameFlag equ DstFree+4 SaveLength equ SameFlag+2 segmentIndex equ SaveLength+4 startBlock equ segmentIndex+4 handleListHandle equ startBlock+4 handleListPtr equ handleListHandle+4 pointerListHandle equ handleListPtr+4 pointerListPtr equ pointerListHandle+4 endBlocks equ pointerListPtr+4 currentSegment equ endBlocks+4 NextContiguous equ currentSegment+2 MaxContiguous equ NextContiguous+4 ContiguousSoFar equ MaxContiguous+4 lastTick equ ContiguousSoFar+4 NumBlocksToRW equ LastTick+2 IF NumBlocksToRW+4>$FF THEN WRITE 'NumBlocksToRW = ' WRITELN NumBlocksToRW WRITELN 'WARNING... Direct page variable overflow!' AERROR 'CopyDisk extended its local DP too far' ENDIF NumBlocks equ NumFiles ;so message routines will work phd tcd phb phk plb lda #ParamSize sta c1_source xba sta >c1_source pushlong #c1_dest pushZLong c1_dest xba sta >c1_dest brl CopyOptions ;yes - so put up copy options dialog NoOption lda >16 sta GDN_Name+2 jsr GetDevNum ;find the destination disk (not yet possibly munged) bcs @goQuit jsr EraseDst ;erase destination disk bcc @erased @goQuit brl doQuit ;got error @erased lda GDN_DevNum jsr RebuildVCR ;rebuild the vcr for the destination disk @noErase lda >16 sta >16 sta >16 sta >16 sta >16 sta GDN_Name+2 sta >16 sta >16 sta GDN_Name+2 sta >16 sta finderTaskRecord pha ;push the task record's ptr lda #0 pha pha ;update proc pea $8000 pha ;eventHook pha pha ;beep proc pea $c010 ;flags _DoModalWindow pla plx cmp #8 bge @chose cmp #5 blt @loop sec sbc #4 tax pha pha pushlong diskWindowPtr pea 0 phx _GetCtlHandleFromID pha lda 3,s ;move the handle to be at the proper point for sta 1,s ;_SetCtlValue lda 5,s sta 3,s lda #1 sta 5,s _SetCtlValue bra @loop @chose bne @notQuit jsl RestoreCursor jsl CloseDiskWindow brl doQuit @notQuit pha pushlong diskWindowPtr pea 0 _FindRadioButton jsl RestoreCursor jsl CloseDiskWindow pla asl a tax jmp (WhichCopy,x) ;jump into correct routine EXPORT diskWindowPtr diskWindowPtr dc.L 0 WhichCopy dc.W CreateFolder ;button 0 dc.W ReplaceFiles ;button 1 dc.W AddFiles ;button 2 ;--------------------------------------------------------------- ; EraseDst ;--------------------------------------------------------------- EraseDst lda GDN_DevNum sta DI_DevNum jsr GetDevInfo ;convert device # into device name bcs @done ;got error jsr EraseDisk ;erase the dest disk @done rts ; ; get the Destination disk's device number (they might have moved it) ; ; 10/29/91 NOTE: God, I hate to do this, but the HFS FST won't find the name of the disk if ; I kill anything after 32K, but leave the first 32k intact, get_dev_num won't work, ; but Volume will, so I have to manually step through all the devices until I find one ; which matches the volume name I want in GDN_Name ; ; 10/29/91 LATER: Sheesh, Mark seems to have fixed the HFS FST. Yay. ; getDestDevNum lda #C1_DstPathName sta GDN_Name ; set up ptr to dst disk name lda #C1_DstPathName>>16 sta GDN_Name+2 jsr GetDevNum ;get device # of dst disk ; lda #1 ;@vcrLoop pha ; sta GDN_DevNum ; jsr RebuildVCR ;do a DInfo followed by a Volume call ; bcc @gotOne ; cmp #$11 ; beq @done ; bne @next ; ;@gotOne pha ; pushlong #Filename ;if the disk in the drive is the same as what ; pushlong GDN_Name ;used to be there, we're OK ; jsl WStrCompare ; pla ; bne @matched ; ;@next pla ; inc a ; bra @vcrLoop ; ;@matched clc ;@done plx rts ; ; There's no FST (source or dest) which supports erasing. Wonderful, so blow away the first ; 32k on the disk ourselves... ; KillDisk lda GDN_DevNum sta RWB_DevNum stz RWB_BlockNum stz RWB_BlockNum+2 lda #4*512 ;write 2k sta RWB_Count ; convert to bytes to read (*512) sta >16 sta RWB_Count+2 sta >16 ;parameter block ldy #D_WRITE+C1 ;call # jsr ProDosCall ;make the call ; ; remove any evidence of this being an ISO 9660 disk from block 64 ; lda #64 sta RWB_BlockNum lda #RWB_Params ;get ptr to READ/WRITE BLOCK ldx #RWB_Params>>16 ;parameter block ldy #D_WRITE+C1 ;call # jsr ProDosCall ;make the call ; ; remove anybody's ID bytes on track 17 of a DOS 3.3 disk ; lda #17*8 sta RWB_BlockNum lda #RWB_Params ;get ptr to READ/WRITE BLOCK ldx #RWB_Params>>16 ;parameter block ldy #D_WRITE+C1 ;call # jsr ProDosCall ;make the call ; ; remove anybody's ID bytes on track 17*2 of a UniDOS 3.3 disk ; lda #17*16 sta RWB_BlockNum lda #RWB_Params ;get ptr to READ/WRITE BLOCK ldx #RWB_Params>>16 ;parameter block ldy #D_WRITE+C1 ;call # jsr ProDosCall ;make the call pushlong eraseHandle jsl DisposeHandleGlue @ack sec rts ;--------------------------------------------------------------- ; CheckRoom ;--------------------------------------------------------------- ; JAM 5/17/89 (Fixing BRC #49143) ; Before calling the CheckRoom entry point, first push a word ; on the stack, which is non-zero if you are trying to decide ; whether or not to BLOCK-COPY, zero if you are trying to decide ; whether or not to FILE copy. CALLER must pop the flag upon return ; from CheckRoom! CheckRoom lda #C1_DstPathName ldx #C1_DstPathName>>16 jsr GetVolSizes ;get sizes for dest disk bcs CRRet ;got error lda GDN_DevNum sta Dest_DevNum lda V_Free ;get # of free blocks on dst disk sta >16 sta CP_TNewPtr+2 lda #C1_DeviceName sta CP_TOldPtr lda #C1_DeviceName>>16 sta CP_TOldPtr+2 lda #CP_Trustme ; get ptr to CHANGE_PATH param block ldx #CP_Trustme>>16 ldy #CHANGE_PATH+C1 ; call # jsr ProDosCall ; make the call @bogus rts ; ; try erasing first with the destination FST, then with the source FST, then with the ; ProDOS FST, and finally with the HFS FST, otherwise, give up, return carry set ; findEraseFST ldy >16 sta >16 sta OOMDumped ; did the OOM dump? bne @scram ; if it dumped, give 32k back! The system needs it! pha ; space for result pha _RealFreeMem ; Get amount of RAM left (excluding OOM Queue) pla cmp #$4000 pla sbc #$0000 bcs memOK ; RealFreeMem ³ $4000 (16K + 24K for Finder's OOM Queue) @scram dec >16 bne @notDOS33 cmp #(143360/1024) ;140K blt @goMemError ;if we have less than 140K, too bad, they need more memory @notDOS33 lda MenschTemp and #$7FFF sta >MenschTemp lda CallFlag,s bmi @emptying ldy #icFtype ;and only let them do it if it's a folder in the trash lda [>16 beq @emptying txa and #icMakeChanges bne @emptying lda #rasNoPrivs jsl doAlertWindow sec brl Quit2 @emptying jsr MakeSrcName ;make pathname for selected icon bcs Quit2a ;name too long ldx #0 ;don't save filecount in first cat entry jsr CatalogSrc ;get catalog for icon bcc cat_ok cpy #$4E sec bne Quit2a lda CallFlag,s ; Is CallFlag here because CatalogSrc bne Quit2a ; did not put a handle (+4) on the stack. lda #rasNoPrivs jsl doAlertWindow sec Quit2a brl Quit2 ;got error in Catalog routine cat_ok lda CallFlag+4,s ;if called to 'Empty Trash', then don't bmi DeleteIt ;put up dialog for locked files txa ;any locked files in catalog? beq DeleteIt ;no - so it's OK to delete pushlong #C1_Filename ;put the end of pathnameptr onto c1_filename pushZLong MenschTemp ; else save the error for later bra NextFile ; do the next one in the list DoDelete pea -1 ; flag for destroy jsr DestroyFile ;delete the file bcc NextFile cmp #$50 ; is it a file busy error? bne doQuit ; if not, come to a rude end ora #$8000 sta >MenschTemp ; else save the error for later NextFile jsr GetNextFile bcc FileLoop ;loop until done with all files in cat ; ; Now, test to see if this icon should be flagged as deleted lda >MenschTemp bpl SetBit bra NextIcon ; end Mensch 5/18/89 (BRC #48301) SetBit ldy #icFlag lda [MenschTemp bpl @LikeNormal bra OneWasBusy @LikeNormal ; end Mensch 5/18/89 (BRC #48301) stz fileSysID sta fstID sta C1_Source xba sta >C1_Source lda #10 jsr duplicateDialog asl a ;button ID returned in A bcc DupIt ;'OK' selected so retry with new name bmi @goQuit0a ;'Cancel' was selected brl NextIcon ;'Skip File' selected so skip this icon @goQuit0a brl Quit0a ; ; before we duplicate anything, checkout the name the user gave us (never trust them for a ; second while they're out of your sight). ; DupIt PushLong #FileName ;create ptr to duplicate's name PushLong #C1_Source jsl PToWString _JudgeNameGS JudgeParms bcs @wayBogus lda JudgeParms+$10 beq GoodName @wayBogus pushlong #filename ;move bad name to c1_dest pushlong #c1_dest jsl PToWString pushlong #c1_source ;move good name into filename pushlong #filename jsl WToPString lda >c1_source ;*3 -- make pstr xba sta >c1_source lda >c1_dest ;*4 -- make pstr xba sta >c1_dest lda fstID ;*6 -- create fst name string asl a asl a tax lda >fstNames,x sta >CustomPtr2 lda >fstNames+2,x sta >CustomPtr2+2 lda JudgeParms+$06 ;move fst syntax pointer to *5 sta >CustomPtr lda JudgeParms+$08 sta >CustomPtr+2 lda #$0c ;diaBadName jsr duplicateDialog rtDialog asl a ;button ID returned in A bcc DupIt ;'OK' selected so retry with new name bmi Quit0a ;'Cancel' was selected brl NextIcon ;'Skip File' selected so skip this icon ; ; if we get here we're pretty sure we got a good name ; GoodName PushLong #FileName ;create ptr to duplicate's name PushLong #C1_IconName jsl PToWString lda #Filename sta >16 sta >16 sta C1_Dest xba sta >C1_Dest jsr JudgeIName ;result into 'Filename' lda #$0b ;diaNameUsed jsr duplicateDialog bra rtDialog Cont jsr FileCopyOpen bcs @goDoQuit jsr DrawCopyControls lda #1 ;start counting upwards from 1 ldy #0 jsr DrawNumItems pea 15 pea 30 _MoveTo pushlong #strAlloc _DrawString ldx #1 ;store filecount in first cat entry jsr CatalogSrc ;get catalog for icon being duplicated bcc @catalogOK cpy #$4e bne @goDoQuit lda #rasNoPrivs jsl doAlertWindow @goDoQuit sec brl QuitClose ;Catalog routine got an error @catalogOK sta fileSysID sta c1_source tax inx lda >c1_source,x and #$00FF ora #$3200 ;add a '2' onto the end of the name sta >c1_source,x txa sta >c1_source _JudgeNameGS JudgeParms ;use whatever it returns pushlong #c1_source pushZLong finderTaskRecord pha ;push the task record's ptr lda #0 pha pha ;update proc pea $8000 pha ;eventHook pha pha ;beep proc pea $c010 ;flags _DoModalWindow pla plx cmp #5 blt @loop sec sbc #5 asl a tax jmp (@addrs,x) @addrs dc.w @cancel ;id = 5 dc.w @ok ;6 dc.w @skip ;7 @close jsl restoreCursor jsl CloseDupWindow rts @cancel jsr @close lda #$FFFF rts @ok pushlong dupWindowPtr ;if so, then get the text they typed pushlong #4 pushlong #Filename _GetLETextByID jsr @close lda #1 rts @skip jsr @close lda #$8000 rts ; ; locals ; EXPORT dupWindowPtr dupWindowPtr dc.L 0 JudgeParms dc.w 6 fstID dc.w 0 ;fileSysID nameType dc.w 0 ;nameType dc.L 0 ;syntax dc.w 0 dc.L C1_SourceBuf ;keep this big so it has a lot of workspace (DAL) dc.w 0 ENDP **************************************************************** * * FileCopyOpen -- open the file copy window, set port to it * carry set if the window couldn't be opened * **************************************************************** FileCopyOpen PROC IMPORT WindowGlobalON IMPORT WindowGlobalOFF IMPORT CopyUpdate IMPORT CloseCopyWindow ;in util.aii - 27-Jan-93 JCM jsl WindowGlobalON pha pha lda #0 pha pha ;titlePtr pha pha ;refCon is ptr to our window info block pushlong #CopyUpdate+$C0000000 ;content draw proc pha pha ;window defproc pea 2 ;refIsResource pha pea $D ;window resource we want pea $800e ;rWindParam1 _NewWindow2 jsl WindowGlobalOFF pulllong copyWindowPtr bcc @openOK ; ; close the window only if something bad happened and we actually have a window pointer ; because something could have happened when we went to add controls (but didn't ; get created because we couldn't find the disk or the resource) ; lda copyWindowPtr+1 beq @leave jsl CloseCopyWindow stz copyWindowPtr+1 @leave sec rts @openOK pha pha _GetPort pulllong ourPort pushlong copyWindowPtr _SetPort ;;; clc ;27-Jan-93 JCM - redundant - SetPort always returns w/clc rts ENDP **************************************************************** * * FileCopyClose -- close the file copy window (or not if it wasn't open) * **************************************************************** FileCopyClose PROC IMPORT CopyWindowPtr IMPORT CloseCopyWindow ;in util.aii - 27-Jan-93 JCM lda copyWindowPtr+1 beq @noClose pushlong ourPort _SetPort jsl CloseCopyWindow stz copyWindowPtr+1 @noClose rts ENDP **************************************************************** * * DoFileCopy * **************************************************************** DoFileCopy PROCNAME IMPORT DrawNumItems IMPORT CopyUpdate IMPORT ThermoMax IMPORT DrawCopyControls IMPORT PathGetName IMPORT PathAddName IMPORT PathSubName IMPORT strgCopying IMPORT c1_filename IMPORT DupFile IMPORT AddSlash IMPORT RemoveName IMPORT RemoveSlash IMPORT IncCatPtr IMPORT MakeDestinationName IMPORT lastThermo IMPORT WindowGlobalON IMPORT WindowGlobalOFF import doAlertWindow import IsReadOnly IMPORT DoMagicRouting BytesLeft equ ZEnd ;zero page temps MoreToRead equ BytesLeft+4 MoreToWrite equ MoreToRead+2 SavedCatHndl equ MoreToWrite+2 SavedCatPtr equ SavedCatHndl+4 SavedCatIndex equ SavedCatPtr+4 DataReadMark equ SavedCatIndex+2 RsrcReadMark equ DataReadMark+4 DataWriteMark equ RsrcReadMark+4 RsrcWriteMark equ DataWriteMark+4 FilesInCat equ RsrcWriteMark+4 RetAdrs equ FilesInCat+2 OrigSrcLen equ RetAdrs+2 OrigDstLen equ OrigSrcLen+2 DoServerCopy equ OrigDstLen+2 LastWriteType equ DoServerCopy+2 IF LastWriteType+2>$FF THEN WRITE 'LastWriteType = ' WRITELN LastWriteType WRITELN 'WARNING... Direct page variable overflow!' AERROR 'DoFileCopy extended its local DP too far' ENDIF pla ;get return address sta >16 sta O_NamePtr+2 sta OE_NamePtr+2 sta >16 sta >16 sta >16 sta >16 sta >16 sta >16 ;to the buffer... just in case sta FI_OptionListPtr+2 ;andy, 11/21/90 ; ; Determine if the file we're writing is extended ; stz ;------------------------------------------------------------------------------- ENTRY GetNextCat GetNextCat NAME lda 0,x ;get requested handle from stack sta 2,x sta