From c71e249a4e8756d7638fc6b29ed06ab9ee127188 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 3 Jun 2026 16:13:21 +0300 Subject: [PATCH] Add full compiler toolchain, libc, examples and reference docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First substantive commit: the entire Sprinter C compiler tree on top of the bare README+gitignore initial commit. What's in here: bin/sprinter-cc — driver script invoking SDCC + linker + mkexe libc/ — Sprinter-specific libc layer over ESTEX/BIOS (conio, gfx, io, mem, stdio + headers) runtime/ — crt0 variants (default/small/banked/minimal) + heap + bank trampolines toolchain/ — mkexe (SprintEXE packer, C + tests) examples/ — 30 demo programs (gfx, file I/O, env, time, …) lib/Makefile — builds the libc archive (sprinter.lib) docs/ — converted Sprinter manuals + asm reference samples third_party/ — solid-c reference compiler dump + sdcc setup script release_docs/ — packaging / release notes gitignore overhaul: • Drop dangerous blanket patterns: *.asm (would hide docs/samples/*.asm) and *.exe (case-insensitive match was hiding third_party/solid-c/*.EXE on macOS APFS). Replaced with examples/*/*.{asm,exe,…} and lib/*.lib. • Restore tracking of toolchain/mkexe/tests/{one,big}.bin — those are INPUT fixtures, not build outputs. • Collapse the duplicated SDCC/C/Sdcc sections into one section per concern (build outputs / vendored / OS-junk). • Add .sprinter-cc-*/, build/ (catches lib/build/ too), .claude/. Co-Authored-By: Claude Opus 4.7 --- .gitignore | 123 +- LICENSE | 41 + Makefile | 88 + README.md | 221 +- RELEASE_NOTES.md | 147 + bin/sprinter-cc | 347 + docs/TODO.md | 399 + docs/converted/ARHITECT.txt | 219 + docs/converted/Architecture.txt | 52 + docs/converted/BIOS_v3.txt | 357 + docs/converted/DiskSyscalls.txt | 421 + docs/converted/Estex.txt | 17 + docs/converted/Estex_opisanie.txt | 69 + docs/converted/Forum.txt | 1059 +++ docs/converted/IvanMak.txt | 2515 ++++++ docs/converted/Parinov.txt | 1059 +++ docs/converted/ProgrammerManual.txt | 2661 +++++++ docs/converted/Sprint2K.txt | 38 + docs/converted/accel_r.txt | 97 + docs/converted/bios.txt | 244 + docs/converted/bugs.txt | 72 + docs/im2_isr_design.md | 204 + docs/memory management | 67 + docs/part2/BIOS functions.a80 | 1387 ++++ docs/part2/DSS 1.60 rst 10.txt | 1459 ++++ docs/part2/SprinterGraphics programming.txt | 279 + docs/part2/accelerator_doc.txt | 278 + docs/part2/bios_doc.txt | 1226 +++ docs/part2/cursor.cur | Bin 0 -> 256 bytes docs/part2/fido-sp2k.txt | 4695 +++++++++++ docs/part2/fido-sp97.txt | 759 ++ docs/part2/forum.txt | 2524 ++++++ docs/part2/howto_program_the_Z80-CTC.pdf | Bin 0 -> 1557904 bytes docs/part2/sprinter.h | 132 + docs/part2/баги биоса и дос (utf8).txt | 72 + docs/part2/графика.txt | 33 + docs/reference/ARHITECT.TXT | 635 ++ docs/reference/Estex описание.doc | Bin 0 -> 37888 bytes docs/reference/Estex.doc | Bin 0 -> 33792 bytes docs/reference/Programmer manual.rtf | 7028 +++++++++++++++++ docs/reference/README.md | 34 + docs/reference/SPRINT2K/SPRN2K01.TXT | 39 + docs/reference/SPRINT2K/SPRN2K02.TXT | 75 + docs/reference/SPRINT2K/SPRN2K03.TXT | 49 + docs/reference/SPRINT2K/SPRN2K04.TXT | 32 + docs/reference/SPRINT2K/SPRN2K05.TXT | 86 + docs/reference/SPRINT2K/SPRN2K06.TXT | 26 + docs/reference/SPRINT2K/SPRN2K07.TXT | 29 + docs/reference/SPRINT2K/SPRN2K08.TXT | 104 + docs/reference/SPRINT2K/SPRN2K09.TXT | 132 + docs/reference/SPRINT2K/SPRN2K10.TXT | 77 + docs/reference/SPRINT2K/SPRN2K11.TXT | 32 + docs/reference/SPRINT2K/SPRN2K12.TXT | 29 + docs/reference/SPRINT2K/SPRN2K13.TXT | 47 + docs/reference/SPRINT2K/SPRN2K14.TXT | 57 + docs/reference/SPRINT2K/SPRN2K15.TXT | 32 + docs/reference/SPRINT2K/SPRN2K16.TXT | 34 + docs/reference/SPRINT2K/SPRN2K17.TXT | 35 + docs/reference/SPRINT2K/SPRN2K18.TXT | 30 + docs/reference/SPRINT2K/SPRN2K19.TXT | 155 + docs/reference/SPRINT2K/SPRN2K20.TXT | 55 + docs/reference/SPRINT2K/SPRN2K21.TXT | 50 + docs/reference/SPRINT2K/SPRN2K22.TXT | 110 + docs/reference/SPRINT2K/SPRN2K23.TXT | 31 + docs/reference/SPRINT2K/SPRN2K24.TXT | 40 + docs/reference/SPRINT2K/SPRN2K25.TXT | 85 + docs/reference/SPRINT2K/SPRN2K26.TXT | 57 + docs/reference/SPRINT2K/SPRN2K27.TXT | 38 + docs/reference/SPRINT2K/SPRN2K28.TXT | 26 + docs/reference/SPRINT2K/SPRN2K29.TXT | 31 + docs/reference/SPRINT2K/SPRN2K30.TXT | 31 + docs/reference/SPRINT2K/SPRN2K31.TXT | 47 + docs/reference/SPRINT2K/SPRN2K32.TXT | 46 + docs/reference/SPRINT2K/SPRN2K33.TXT | 36 + docs/reference/SPRINT2K/SPRN2K34.TXT | 97 + docs/reference/SPRINT2K/SPRN2K35.TXT | 31 + docs/reference/SPRINT2K/SPRN2K36.TXT | 40 + docs/reference/SPRINT2K/SPRN2K37.TXT | 28 + docs/reference/SPRINT2K/SPRN2K38.TXT | 38 + docs/reference/SPRINT2K/SPRN2K39.TXT | 29 + docs/reference/SPRINT2K/SPRN2K40.TXT | 23 + docs/reference/SPRINT2K/SPRN2K41.TXT | 44 + docs/reference/SPRINT2K/SPRN2K42.TXT | 28 + docs/reference/SPRINT2K/SPRN2K43.TXT | 21 + docs/reference/SPRINT2K/SPRN2K44.TXT | 115 + docs/reference/SPRINT2K/SPRN2K45.TXT | 37 + docs/reference/SPRINT2K/SPRN2K46.TXT | 32 + docs/reference/SPRINT2K/SPRN2K47.TXT | 45 + docs/reference/SPRINT2K/SPRN2K48.TXT | 65 + docs/reference/SPRINT2K/SPRN2K49.TXT | 44 + docs/reference/SPRINT2K/SPRN2K50.TXT | 30 + docs/reference/SPRINT2K/SPRN2K51.TXT | 33 + docs/reference/SPRINT2K/SPRN2K52.TXT | 28 + docs/reference/SPRINT2K/SPRN2K53.TXT | 134 + docs/reference/SPRINT2K/SPRN2K54.TXT | 63 + docs/reference/SPRINT2K/SPRN2K55.TXT | 104 + docs/reference/SPRINT2K/sprn2k56.txt | 28 + docs/reference/SPRINT2K/sprn2k57.txt | 56 + docs/reference/SPRINT2K/sprn2k58.txt | 34 + docs/reference/SPRINT2K/sprn2k59.txt | 147 + docs/reference/SPRINT2K/sprn2k60.txt | 185 + docs/reference/SPRINT2K/sprn2k61.txt | 35 + docs/reference/SPRINT2K/sprn2k62.txt | 144 + docs/reference/SPRINT2K/sprn2k63.txt | 27 + docs/reference/SPRINT2K/sprn2k64.txt | 35 + docs/reference/SPRINT2K/sprn2k65.txt | 122 + docs/reference/SPRINT2K/sprn2k66.txt | 36 + docs/reference/SPRINT2K/sprn2k67.txt | 100 + docs/reference/SPRINT2K/sprn2k68.txt | 23 + docs/reference/SPRINT2K/sprn2k69.txt | 34 + docs/reference/SPRINT2K/sprn2k70.txt | 28 + docs/reference/SPRINT2K/sprn2k71.txt | 105 + docs/reference/SPRINT2K/sprn2k72.txt | 34 + docs/reference/SPRINT2K/sprn2k73.txt | 18 + docs/reference/SPRINT2K/sprn2k74s.txt | 24 + docs/reference/SPRINT2K/sprn2k75vga.txt | 21 + docs/reference/SPRINT2K/sprn2k76.txt | 84 + docs/reference/SPRINT2K/sprn2k77.txt | 22 + docs/reference/SPRINT2K/sprn2k78svga.txt | 20 + docs/reference/SPRINT2K/sprn2k79.txt | 38 + docs/reference/SPRINT2K/sprn2k80.txt | 28 + docs/reference/SPRINT2K/sprn2k81.txt | 56 + docs/reference/SPRINT2K/sprn2k82.txt | 319 + docs/reference/Sprint2K.doc | Bin 0 -> 34816 bytes docs/reference/accel_r.txt | 97 + docs/reference/bios.doc | Bin 0 -> 133120 bytes .../Архитектура компьютера Sprinter.doc | Bin 0 -> 70656 bytes ...рограммирование_Спринтера_Денис_Паринов.doc | Bin 0 -> 166912 bytes ...уководство_по_программированию_Иван_Мак.pdf | Bin 0 -> 299499 bytes .../Системные_вызовы_дисковой_подсистемы.doc | Bin 0 -> 153600 bytes docs/reference/Форум.doc | Bin 0 -> 166912 bytes docs/reference/Функции BIOS v3.doc | Bin 0 -> 109056 bytes docs/reference/баги биоса и дос (utf8).txt | 72 + docs/samples/256color/256color.z80 | 515 ++ docs/samples/INTMOUSE.ASM | 921 +++ docs/samples/SIO_CTC_KEY.asm | 308 + docs/samples/Stars/STARS1.ASM | 226 + docs/samples/aprint/font.raw | Bin 0 -> 6888 bytes docs/samples/aprint/main.z80 | 194 + docs/samples/aprint/make.bat | 1 + docs/samples/aprint/print.z80 | 180 + docs/samples/aprint/readme.eng | 79 + docs/samples/aprint/readme.rus | 82 + docs/samples/dec32.asm | 89 + docs/samples/delayms.asm | 295 + docs/samples/edit_sor/6X8.FNT | Bin 0 -> 2040 bytes docs/samples/edit_sor/EDITOR.A80 | 1456 ++++ docs/samples/edit_sor/GRAPHIC.A80 | 521 ++ docs/samples/edit_sor/README.TXT | 19 + docs/samples/edit_sor/SETSCR.A80 | 134 + docs/samples/edit_sor/WINDOW.A80 | 550 ++ docs/samples/edit_sor/ed.txt | 1 + docs/samples/flames/flames.z80 | 447 ++ docs/samples/fn_load/fn_load.z80 | 156 + docs/samples/game01/GAME_00.ACX | Bin 0 -> 65536 bytes docs/samples/game01/PAGE_0.BIN | Bin 0 -> 16384 bytes docs/samples/game01/RELOAD.ASZ | 822 ++ docs/samples/game01/SPRINT00.ASZ | 591 ++ docs/samples/im2_example/example.asm | 169 + docs/samples/im2_example/im2_handler.asm | 113 + docs/samples/plasma2/plasma2.asm | 212 + docs/samples/sprinterIntLib.asm | 217 + docs/samples/sprinterKeybLib.asm | 140 + docs/samples/Пример для CBL.asm | 170 + docs/solid_c_compatibility.md | 135 + examples/argv/Makefile | 5 + examples/argv/argv.c | 22 + examples/assrtest/Makefile | 3 + examples/assrtest/assrtest.c | 43 + examples/attrprob/Makefile | 5 + examples/attrprob/attrprob.c | 79 + examples/banked/Makefile | 11 + examples/banked/bank1.c | 17 + examples/banked/bank2.c | 18 + examples/banked/banked.c | 47 + examples/bankedbg/Makefile | 12 + examples/bankedbg/bank1.c | 17 + examples/bankedbg/bank2.c | 18 + examples/bankedbg/bankedbg.c | 58 + examples/banklocl/Makefile | 12 + examples/banklocl/bank1.c | 85 + examples/banklocl/banklocl.c | 87 + examples/cat/Makefile | 6 + examples/cat/cat.c | 31 + examples/cat/test.txt | 13 + examples/conio/Makefile | 5 + examples/conio/conio.c | 128 + examples/conio/prob | 31 + examples/conio2/Makefile | 5 + examples/conio2/conio2.c | 63 + examples/errno/Makefile | 5 + examples/errno/errno.c | 50 + examples/example.mk | 76 + examples/filetest/Makefile | 3 + examples/filetest/filetest.c | 74 + examples/gfx_d16/Makefile | 5 + examples/gfx_d16/gfx_d16.c | 116 + examples/gfx_dbuf/Makefile | 3 + examples/gfx_dbuf/gfx_dbuf.c | 120 + examples/gfx_demo/Makefile | 3 + examples/gfx_demo/gfx_demo.c | 100 + examples/gfx_mous/Makefile | 3 + examples/gfx_mous/gfx_mous.c | 169 + examples/gfx_text/Makefile | 5 + examples/gfx_text/gfx_text.c | 113 + examples/hello/Makefile | 5 + examples/hello/hello.c | 65 + examples/ls/Makefile | 5 + examples/ls/ls.c | 96 + examples/malloc/Makefile | 5 + examples/malloc/malloc.c | 63 + examples/mem_test/Makefile | 5 + examples/mem_test/mem_test.c | 87 + examples/mouse/Makefile | 5 + examples/mouse/mouse.c | 80 + examples/openenv/Makefile | 5 + examples/openenv/openenv.c | 148 + examples/ptime/Makefile | 3 + examples/ptime/ptime.c | 44 + examples/rt_test/Makefile | 5 + examples/rt_test/rt_test.c | 63 + examples/seek/Makefile | 6 + examples/seek/big.txt | 400 + examples/seek/gen_bigfile.py | 35 + examples/seek/seek.c | 66 + examples/stattest/Makefile | 3 + examples/stattest/stattest.c | 89 + examples/stdlib/Makefile | 3 + examples/stdlib/stdlib.c | 63 + examples/stest2/Makefile | 3 + examples/stest2/stest2.c | 43 + examples/strtest/Makefile | 5 + examples/strtest/strtest.c | 53 + examples/timedir/Makefile | 5 + examples/timedir/timedir.c | 108 + lib/Makefile | 80 + libc/gfx/gfx_16.c | 106 + libc/gfx/gfx_256.c | 118 + libc/gfx/gfx_core.c | 178 + libc/gfx/gfx_font.c | 63 + libc/gfx/gfx_raw_16.c | 186 + libc/gfx/gfx_raw_256.c | 175 + libc/gfx/gfx_raw_common.c | 44 + libc/gfx/gfx_text_16.c | 124 + libc/gfx/gfx_text_256.c | 90 + libc/include/conio.h | 154 + libc/include/dir.h | 51 + libc/include/errno.h | 62 + libc/include/fcntl.h | 31 + libc/include/gfx.h | 148 + libc/include/mouse.h | 113 + libc/include/sprinter.h | 156 + libc/include/sprinter_compat.h | 106 + libc/include/sprinter_exit.h | 15 + libc/include/sprinter_mem.h | 37 + libc/include/stdio.h | 102 + libc/include/sys/stat.h | 42 + libc/include/time.h | 70 + libc/include/unistd.h | 39 + libc/io/_errno_set.c | 40 + libc/io/atexit.c | 57 + libc/io/conio.c | 629 ++ libc/io/cprintf.c | 28 + libc/io/dir.c | 68 + libc/io/env.c | 93 + libc/io/errno.c | 77 + libc/io/fsdir.c | 88 + libc/io/lseek.c | 71 + libc/io/mouse.c | 305 + libc/io/open.c | 158 + libc/io/posix_time.c | 143 + libc/io/read.c | 67 + libc/io/sleep.c | 30 + libc/io/solid_compat.c | 29 + libc/io/stat.c | 190 + libc/io/time.c | 93 + libc/io/unlink.c | 24 + libc/io/videomode_raw.c | 46 + libc/mem/bank_io.c | 51 + libc/mem/mem_alloc.c | 99 + libc/stdio/file.c | 267 + libc/stdio/getchar.c | 29 + libc/stdio/print_hex.c | 15 + libc/stdio/putchar.c | 42 + libc/stdio/puts.c | 69 + libc/stdio/solid_helpers.c | 61 + release_docs/en/README.md | 14 + release_docs/en/examples.md | 76 + release_docs/en/getting_started.md | 61 + release_docs/en/headers.md | 50 + release_docs/en/memory_modes.md | 49 + release_docs/en/sprinter_cc.md | 82 + release_docs/ru/README.md | 15 + release_docs/ru/examples.md | 75 + release_docs/ru/getting_started.md | 62 + release_docs/ru/headers.md | 50 + release_docs/ru/memory_modes.md | 51 + release_docs/ru/platform_reference.md | 374 + release_docs/ru/sprinter_cc.md | 82 + runtime/bank.s | 70 + runtime/crt0.s | 358 + runtime/crt0_banked.s | 459 ++ runtime/crt0_minimal.s | 110 + runtime/crt0_small.s | 395 + runtime/heap.s | 48 + runtime/heap_top.s | 22 + third_party/sdcc | 1 + third_party/setup-sdcc.sh | 79 + third_party/solid-c/AS.EXE | Bin 0 -> 11938 bytes third_party/solid-c/CC1.EXE | Bin 0 -> 19398 bytes third_party/solid-c/CC2.EXE | Bin 0 -> 26055 bytes third_party/solid-c/CLIB.IRL | Bin 0 -> 19707 bytes third_party/solid-c/DOC/BUGS.! | 22 + third_party/solid-c/DOC/CC.RUS | 968 +++ third_party/solid-c/DOC/CLIB.RUS | 2570 ++++++ third_party/solid-c/DOC/DEVEL-1.RUS | 121 + third_party/solid-c/DOC/DEVEL-2.RUS | 228 + third_party/solid-c/DOC/IRL.RUS | 80 + third_party/solid-c/DOC/LD.RUS | 138 + third_party/solid-c/DOC/M80.RUS | 1217 +++ third_party/solid-c/DOC/M80.TXT | 1731 ++++ third_party/solid-c/DOC/OL.RUS | 30 + third_party/solid-c/DOC/README.RUS | 155 + third_party/solid-c/DOC/REL.RUS | 137 + third_party/solid-c/DOC/REL.TXT | 129 + third_party/solid-c/EXAMPLES/ATEXIT.C | 28 + third_party/solid-c/EXAMPLES/BIN2C.C | 98 + third_party/solid-c/EXAMPLES/CLOSE.C | 10 + third_party/solid-c/EXAMPLES/CPRINTF.C | 6 + third_party/solid-c/EXAMPLES/CPUTS.C | 8 + third_party/solid-c/EXAMPLES/CREAT.C | 12 + third_party/solid-c/EXAMPLES/FCLOSE.C | 10 + third_party/solid-c/EXAMPLES/FDOPEN.C | 21 + third_party/solid-c/EXAMPLES/FEOF.C | 28 + third_party/solid-c/EXAMPLES/FERROR.C | 22 + third_party/solid-c/EXAMPLES/FFIRST.C | 16 + third_party/solid-c/EXAMPLES/FGETPOS.C | 20 + third_party/solid-c/EXAMPLES/FNEXT.C | 16 + third_party/solid-c/EXAMPLES/FOPEN.C | 14 + third_party/solid-c/EXAMPLES/FPRINTF.C | 11 + third_party/solid-c/EXAMPLES/FREOPEN.C | 21 + third_party/solid-c/EXAMPLES/FSEEK.C | 17 + third_party/solid-c/EXAMPLES/FSETPOS.C | 20 + third_party/solid-c/EXAMPLES/FTELL.C | 18 + third_party/solid-c/EXAMPLES/HELLO.BAT | 7 + third_party/solid-c/EXAMPLES/HELLO.C | 9 + third_party/solid-c/EXAMPLES/INTDOS.C | 15 + third_party/solid-c/EXAMPLES/LSEEK.C | 19 + third_party/solid-c/EXAMPLES/LTELL.C | 20 + third_party/solid-c/EXAMPLES/LZH3.C | 601 ++ third_party/solid-c/EXAMPLES/MSSTAT.C | 19 + third_party/solid-c/EXAMPLES/MS_GSEN.C | 20 + third_party/solid-c/EXAMPLES/MS_SSEN.C | 16 + third_party/solid-c/EXAMPLES/OPEN.C | 12 + third_party/solid-c/EXAMPLES/PRINTF.C | 8 + third_party/solid-c/EXAMPLES/README | 1 + third_party/solid-c/EXAMPLES/SEEK.C | 15 + third_party/solid-c/EXAMPLES/SORT2.BAT | 7 + third_party/solid-c/EXAMPLES/SORT2.C | 393 + third_party/solid-c/EXAMPLES/SPRINTF.C | 9 + third_party/solid-c/EXAMPLES/TELL.C | 16 + third_party/solid-c/FILE_ID.DIZ | 1 + third_party/solid-c/INCLUDE/CONIO.H | 25 + third_party/solid-c/INCLUDE/CTYPE.H | 23 + third_party/solid-c/INCLUDE/DIRECT.H | 18 + third_party/solid-c/INCLUDE/DOS.H | 100 + third_party/solid-c/INCLUDE/ERRNO.H | 63 + third_party/solid-c/INCLUDE/IO.H | 51 + third_party/solid-c/INCLUDE/MALLOC.H | 19 + third_party/solid-c/INCLUDE/MEM.H | 19 + third_party/solid-c/INCLUDE/MOUSE.H | 112 + third_party/solid-c/INCLUDE/SETJMP.H | 22 + third_party/solid-c/INCLUDE/STAT.H | 15 + third_party/solid-c/INCLUDE/STDARG.H | 13 + third_party/solid-c/INCLUDE/STDIO.H | 117 + third_party/solid-c/INCLUDE/STDLIB.H | 51 + third_party/solid-c/INCLUDE/STRING.H | 33 + third_party/solid-c/INCLUDE/TYPES.H | 51 + third_party/solid-c/LD.EXE | Bin 0 -> 8074 bytes third_party/solid-c/OL.EXE | Bin 0 -> 6067 bytes third_party/solid-c/SRC/CLIB/CONIO.ASM | 452 ++ third_party/solid-c/SRC/CLIB/CTYPE.ASM | 357 + third_party/solid-c/SRC/CLIB/DOS.ASM | 618 ++ third_party/solid-c/SRC/CLIB/IO.ASM | 1174 +++ third_party/solid-c/SRC/CLIB/MALLOC1.ASM | 660 ++ third_party/solid-c/SRC/CLIB/MEM.ASM | 156 + third_party/solid-c/SRC/CLIB/MOUSE.ASM | 566 ++ third_party/solid-c/SRC/CLIB/STARTUP.ASM | 68 + third_party/solid-c/SRC/CLIB/STDIO.ASM | 1671 ++++ third_party/solid-c/SRC/CLIB/STDLIB.ASM | 1485 ++++ third_party/solid-c/SRC/CLIB/STREAM.ASM | 947 +++ third_party/solid-c/SRC/CLIB/STRING.ASM | 554 ++ third_party/solid-c/WHATSNEW.RUS | 23 + toolchain/check_banks.py | 92 + toolchain/make_release.sh | 108 + toolchain/mkexe/Makefile | 15 + toolchain/mkexe/mkexe.c | 485 ++ toolchain/mkexe/run-tests.sh | 125 + toolchain/mkexe/tests/bad.ihx | 2 + toolchain/mkexe/tests/banked.ihx | 4 + toolchain/mkexe/tests/big.bin | 1 + toolchain/mkexe/tests/hello.ihx | 2 + toolchain/mkexe/tests/one.bin | 1 + toolchain/sprinter-cc | 166 + 404 files changed, 75155 insertions(+), 58 deletions(-) create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 RELEASE_NOTES.md create mode 100755 bin/sprinter-cc create mode 100644 docs/TODO.md create mode 100644 docs/converted/ARHITECT.txt create mode 100644 docs/converted/Architecture.txt create mode 100644 docs/converted/BIOS_v3.txt create mode 100644 docs/converted/DiskSyscalls.txt create mode 100644 docs/converted/Estex.txt create mode 100644 docs/converted/Estex_opisanie.txt create mode 100644 docs/converted/Forum.txt create mode 100644 docs/converted/IvanMak.txt create mode 100644 docs/converted/Parinov.txt create mode 100644 docs/converted/ProgrammerManual.txt create mode 100644 docs/converted/Sprint2K.txt create mode 100644 docs/converted/accel_r.txt create mode 100644 docs/converted/bios.txt create mode 100644 docs/converted/bugs.txt create mode 100644 docs/im2_isr_design.md create mode 100644 docs/memory management create mode 100755 docs/part2/BIOS functions.a80 create mode 100644 docs/part2/DSS 1.60 rst 10.txt create mode 100644 docs/part2/SprinterGraphics programming.txt create mode 100644 docs/part2/accelerator_doc.txt create mode 100644 docs/part2/bios_doc.txt create mode 100755 docs/part2/cursor.cur create mode 100644 docs/part2/fido-sp2k.txt create mode 100644 docs/part2/fido-sp97.txt create mode 100644 docs/part2/forum.txt create mode 100755 docs/part2/howto_program_the_Z80-CTC.pdf create mode 100755 docs/part2/sprinter.h create mode 100755 docs/part2/баги биоса и дос (utf8).txt create mode 100755 docs/part2/графика.txt create mode 100644 docs/reference/ARHITECT.TXT create mode 100644 docs/reference/Estex описание.doc create mode 100644 docs/reference/Estex.doc create mode 100644 docs/reference/Programmer manual.rtf create mode 100644 docs/reference/README.md create mode 100644 docs/reference/SPRINT2K/SPRN2K01.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K02.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K03.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K04.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K05.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K06.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K07.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K08.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K09.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K10.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K11.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K12.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K13.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K14.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K15.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K16.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K17.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K18.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K19.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K20.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K21.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K22.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K23.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K24.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K25.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K26.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K27.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K28.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K29.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K30.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K31.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K32.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K33.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K34.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K35.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K36.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K37.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K38.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K39.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K40.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K41.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K42.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K43.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K44.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K45.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K46.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K47.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K48.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K49.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K50.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K51.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K52.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K53.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K54.TXT create mode 100644 docs/reference/SPRINT2K/SPRN2K55.TXT create mode 100644 docs/reference/SPRINT2K/sprn2k56.txt create mode 100644 docs/reference/SPRINT2K/sprn2k57.txt create mode 100644 docs/reference/SPRINT2K/sprn2k58.txt create mode 100644 docs/reference/SPRINT2K/sprn2k59.txt create mode 100644 docs/reference/SPRINT2K/sprn2k60.txt create mode 100644 docs/reference/SPRINT2K/sprn2k61.txt create mode 100644 docs/reference/SPRINT2K/sprn2k62.txt create mode 100644 docs/reference/SPRINT2K/sprn2k63.txt create mode 100644 docs/reference/SPRINT2K/sprn2k64.txt create mode 100644 docs/reference/SPRINT2K/sprn2k65.txt create mode 100644 docs/reference/SPRINT2K/sprn2k66.txt create mode 100644 docs/reference/SPRINT2K/sprn2k67.txt create mode 100644 docs/reference/SPRINT2K/sprn2k68.txt create mode 100644 docs/reference/SPRINT2K/sprn2k69.txt create mode 100644 docs/reference/SPRINT2K/sprn2k70.txt create mode 100644 docs/reference/SPRINT2K/sprn2k71.txt create mode 100644 docs/reference/SPRINT2K/sprn2k72.txt create mode 100644 docs/reference/SPRINT2K/sprn2k73.txt create mode 100644 docs/reference/SPRINT2K/sprn2k74s.txt create mode 100644 docs/reference/SPRINT2K/sprn2k75vga.txt create mode 100644 docs/reference/SPRINT2K/sprn2k76.txt create mode 100644 docs/reference/SPRINT2K/sprn2k77.txt create mode 100644 docs/reference/SPRINT2K/sprn2k78svga.txt create mode 100644 docs/reference/SPRINT2K/sprn2k79.txt create mode 100644 docs/reference/SPRINT2K/sprn2k80.txt create mode 100644 docs/reference/SPRINT2K/sprn2k81.txt create mode 100644 docs/reference/SPRINT2K/sprn2k82.txt create mode 100644 docs/reference/Sprint2K.doc create mode 100644 docs/reference/accel_r.txt create mode 100644 docs/reference/bios.doc create mode 100644 docs/reference/Архитектура компьютера Sprinter.doc create mode 100644 docs/reference/Программирование_Спринтера_Денис_Паринов.doc create mode 100644 docs/reference/Руководство_по_программированию_Иван_Мак.pdf create mode 100644 docs/reference/Системные_вызовы_дисковой_подсистемы.doc create mode 100644 docs/reference/Форум.doc create mode 100644 docs/reference/Функции BIOS v3.doc create mode 100644 docs/reference/баги биоса и дос (utf8).txt create mode 100644 docs/samples/256color/256color.z80 create mode 100755 docs/samples/INTMOUSE.ASM create mode 100755 docs/samples/SIO_CTC_KEY.asm create mode 100644 docs/samples/Stars/STARS1.ASM create mode 100644 docs/samples/aprint/font.raw create mode 100644 docs/samples/aprint/main.z80 create mode 100644 docs/samples/aprint/make.bat create mode 100644 docs/samples/aprint/print.z80 create mode 100644 docs/samples/aprint/readme.eng create mode 100644 docs/samples/aprint/readme.rus create mode 100644 docs/samples/dec32.asm create mode 100755 docs/samples/delayms.asm create mode 100644 docs/samples/edit_sor/6X8.FNT create mode 100644 docs/samples/edit_sor/EDITOR.A80 create mode 100644 docs/samples/edit_sor/GRAPHIC.A80 create mode 100644 docs/samples/edit_sor/README.TXT create mode 100644 docs/samples/edit_sor/SETSCR.A80 create mode 100644 docs/samples/edit_sor/WINDOW.A80 create mode 100644 docs/samples/edit_sor/ed.txt create mode 100644 docs/samples/flames/flames.z80 create mode 100644 docs/samples/fn_load/fn_load.z80 create mode 100644 docs/samples/game01/GAME_00.ACX create mode 100644 docs/samples/game01/PAGE_0.BIN create mode 100644 docs/samples/game01/RELOAD.ASZ create mode 100644 docs/samples/game01/SPRINT00.ASZ create mode 100644 docs/samples/im2_example/example.asm create mode 100644 docs/samples/im2_example/im2_handler.asm create mode 100644 docs/samples/plasma2/plasma2.asm create mode 100755 docs/samples/sprinterIntLib.asm create mode 100755 docs/samples/sprinterKeybLib.asm create mode 100755 docs/samples/Пример для CBL.asm create mode 100644 docs/solid_c_compatibility.md create mode 100644 examples/argv/Makefile create mode 100644 examples/argv/argv.c create mode 100644 examples/assrtest/Makefile create mode 100644 examples/assrtest/assrtest.c create mode 100644 examples/attrprob/Makefile create mode 100644 examples/attrprob/attrprob.c create mode 100644 examples/banked/Makefile create mode 100644 examples/banked/bank1.c create mode 100644 examples/banked/bank2.c create mode 100644 examples/banked/banked.c create mode 100644 examples/bankedbg/Makefile create mode 100644 examples/bankedbg/bank1.c create mode 100644 examples/bankedbg/bank2.c create mode 100644 examples/bankedbg/bankedbg.c create mode 100644 examples/banklocl/Makefile create mode 100644 examples/banklocl/bank1.c create mode 100644 examples/banklocl/banklocl.c create mode 100644 examples/cat/Makefile create mode 100644 examples/cat/cat.c create mode 100644 examples/cat/test.txt create mode 100644 examples/conio/Makefile create mode 100644 examples/conio/conio.c create mode 100644 examples/conio/prob create mode 100644 examples/conio2/Makefile create mode 100644 examples/conio2/conio2.c create mode 100644 examples/errno/Makefile create mode 100644 examples/errno/errno.c create mode 100644 examples/example.mk create mode 100644 examples/filetest/Makefile create mode 100644 examples/filetest/filetest.c create mode 100644 examples/gfx_d16/Makefile create mode 100644 examples/gfx_d16/gfx_d16.c create mode 100644 examples/gfx_dbuf/Makefile create mode 100644 examples/gfx_dbuf/gfx_dbuf.c create mode 100644 examples/gfx_demo/Makefile create mode 100644 examples/gfx_demo/gfx_demo.c create mode 100644 examples/gfx_mous/Makefile create mode 100644 examples/gfx_mous/gfx_mous.c create mode 100644 examples/gfx_text/Makefile create mode 100644 examples/gfx_text/gfx_text.c create mode 100644 examples/hello/Makefile create mode 100644 examples/hello/hello.c create mode 100644 examples/ls/Makefile create mode 100644 examples/ls/ls.c create mode 100644 examples/malloc/Makefile create mode 100644 examples/malloc/malloc.c create mode 100644 examples/mem_test/Makefile create mode 100644 examples/mem_test/mem_test.c create mode 100644 examples/mouse/Makefile create mode 100644 examples/mouse/mouse.c create mode 100644 examples/openenv/Makefile create mode 100644 examples/openenv/openenv.c create mode 100644 examples/ptime/Makefile create mode 100644 examples/ptime/ptime.c create mode 100644 examples/rt_test/Makefile create mode 100644 examples/rt_test/rt_test.c create mode 100644 examples/seek/Makefile create mode 100644 examples/seek/big.txt create mode 100644 examples/seek/gen_bigfile.py create mode 100644 examples/seek/seek.c create mode 100644 examples/stattest/Makefile create mode 100644 examples/stattest/stattest.c create mode 100644 examples/stdlib/Makefile create mode 100644 examples/stdlib/stdlib.c create mode 100644 examples/stest2/Makefile create mode 100644 examples/stest2/stest2.c create mode 100644 examples/strtest/Makefile create mode 100644 examples/strtest/strtest.c create mode 100644 examples/timedir/Makefile create mode 100644 examples/timedir/timedir.c create mode 100644 lib/Makefile create mode 100644 libc/gfx/gfx_16.c create mode 100644 libc/gfx/gfx_256.c create mode 100644 libc/gfx/gfx_core.c create mode 100644 libc/gfx/gfx_font.c create mode 100644 libc/gfx/gfx_raw_16.c create mode 100644 libc/gfx/gfx_raw_256.c create mode 100644 libc/gfx/gfx_raw_common.c create mode 100644 libc/gfx/gfx_text_16.c create mode 100644 libc/gfx/gfx_text_256.c create mode 100644 libc/include/conio.h create mode 100644 libc/include/dir.h create mode 100644 libc/include/errno.h create mode 100644 libc/include/fcntl.h create mode 100644 libc/include/gfx.h create mode 100644 libc/include/mouse.h create mode 100644 libc/include/sprinter.h create mode 100644 libc/include/sprinter_compat.h create mode 100644 libc/include/sprinter_exit.h create mode 100644 libc/include/sprinter_mem.h create mode 100644 libc/include/stdio.h create mode 100644 libc/include/sys/stat.h create mode 100644 libc/include/time.h create mode 100644 libc/include/unistd.h create mode 100644 libc/io/_errno_set.c create mode 100644 libc/io/atexit.c create mode 100644 libc/io/conio.c create mode 100644 libc/io/cprintf.c create mode 100644 libc/io/dir.c create mode 100644 libc/io/env.c create mode 100644 libc/io/errno.c create mode 100644 libc/io/fsdir.c create mode 100644 libc/io/lseek.c create mode 100644 libc/io/mouse.c create mode 100644 libc/io/open.c create mode 100644 libc/io/posix_time.c create mode 100644 libc/io/read.c create mode 100644 libc/io/sleep.c create mode 100644 libc/io/solid_compat.c create mode 100644 libc/io/stat.c create mode 100644 libc/io/time.c create mode 100644 libc/io/unlink.c create mode 100644 libc/io/videomode_raw.c create mode 100644 libc/mem/bank_io.c create mode 100644 libc/mem/mem_alloc.c create mode 100644 libc/stdio/file.c create mode 100644 libc/stdio/getchar.c create mode 100644 libc/stdio/print_hex.c create mode 100644 libc/stdio/putchar.c create mode 100644 libc/stdio/puts.c create mode 100644 libc/stdio/solid_helpers.c create mode 100644 release_docs/en/README.md create mode 100644 release_docs/en/examples.md create mode 100644 release_docs/en/getting_started.md create mode 100644 release_docs/en/headers.md create mode 100644 release_docs/en/memory_modes.md create mode 100644 release_docs/en/sprinter_cc.md create mode 100644 release_docs/ru/README.md create mode 100644 release_docs/ru/examples.md create mode 100644 release_docs/ru/getting_started.md create mode 100644 release_docs/ru/headers.md create mode 100644 release_docs/ru/memory_modes.md create mode 100644 release_docs/ru/platform_reference.md create mode 100644 release_docs/ru/sprinter_cc.md create mode 100644 runtime/bank.s create mode 100644 runtime/crt0.s create mode 100644 runtime/crt0_banked.s create mode 100644 runtime/crt0_minimal.s create mode 100644 runtime/crt0_small.s create mode 100644 runtime/heap.s create mode 100644 runtime/heap_top.s create mode 120000 third_party/sdcc create mode 100755 third_party/setup-sdcc.sh create mode 100644 third_party/solid-c/AS.EXE create mode 100644 third_party/solid-c/CC1.EXE create mode 100644 third_party/solid-c/CC2.EXE create mode 100644 third_party/solid-c/CLIB.IRL create mode 100644 third_party/solid-c/DOC/BUGS.! create mode 100644 third_party/solid-c/DOC/CC.RUS create mode 100644 third_party/solid-c/DOC/CLIB.RUS create mode 100644 third_party/solid-c/DOC/DEVEL-1.RUS create mode 100644 third_party/solid-c/DOC/DEVEL-2.RUS create mode 100644 third_party/solid-c/DOC/IRL.RUS create mode 100644 third_party/solid-c/DOC/LD.RUS create mode 100644 third_party/solid-c/DOC/M80.RUS create mode 100644 third_party/solid-c/DOC/M80.TXT create mode 100644 third_party/solid-c/DOC/OL.RUS create mode 100644 third_party/solid-c/DOC/README.RUS create mode 100644 third_party/solid-c/DOC/REL.RUS create mode 100644 third_party/solid-c/DOC/REL.TXT create mode 100644 third_party/solid-c/EXAMPLES/ATEXIT.C create mode 100644 third_party/solid-c/EXAMPLES/BIN2C.C create mode 100644 third_party/solid-c/EXAMPLES/CLOSE.C create mode 100644 third_party/solid-c/EXAMPLES/CPRINTF.C create mode 100644 third_party/solid-c/EXAMPLES/CPUTS.C create mode 100644 third_party/solid-c/EXAMPLES/CREAT.C create mode 100644 third_party/solid-c/EXAMPLES/FCLOSE.C create mode 100644 third_party/solid-c/EXAMPLES/FDOPEN.C create mode 100644 third_party/solid-c/EXAMPLES/FEOF.C create mode 100644 third_party/solid-c/EXAMPLES/FERROR.C create mode 100644 third_party/solid-c/EXAMPLES/FFIRST.C create mode 100644 third_party/solid-c/EXAMPLES/FGETPOS.C create mode 100644 third_party/solid-c/EXAMPLES/FNEXT.C create mode 100644 third_party/solid-c/EXAMPLES/FOPEN.C create mode 100644 third_party/solid-c/EXAMPLES/FPRINTF.C create mode 100644 third_party/solid-c/EXAMPLES/FREOPEN.C create mode 100644 third_party/solid-c/EXAMPLES/FSEEK.C create mode 100644 third_party/solid-c/EXAMPLES/FSETPOS.C create mode 100644 third_party/solid-c/EXAMPLES/FTELL.C create mode 100644 third_party/solid-c/EXAMPLES/HELLO.BAT create mode 100644 third_party/solid-c/EXAMPLES/HELLO.C create mode 100644 third_party/solid-c/EXAMPLES/INTDOS.C create mode 100644 third_party/solid-c/EXAMPLES/LSEEK.C create mode 100644 third_party/solid-c/EXAMPLES/LTELL.C create mode 100644 third_party/solid-c/EXAMPLES/LZH3.C create mode 100644 third_party/solid-c/EXAMPLES/MSSTAT.C create mode 100644 third_party/solid-c/EXAMPLES/MS_GSEN.C create mode 100644 third_party/solid-c/EXAMPLES/MS_SSEN.C create mode 100644 third_party/solid-c/EXAMPLES/OPEN.C create mode 100644 third_party/solid-c/EXAMPLES/PRINTF.C create mode 100644 third_party/solid-c/EXAMPLES/README create mode 100644 third_party/solid-c/EXAMPLES/SEEK.C create mode 100644 third_party/solid-c/EXAMPLES/SORT2.BAT create mode 100644 third_party/solid-c/EXAMPLES/SORT2.C create mode 100644 third_party/solid-c/EXAMPLES/SPRINTF.C create mode 100644 third_party/solid-c/EXAMPLES/TELL.C create mode 100644 third_party/solid-c/FILE_ID.DIZ create mode 100644 third_party/solid-c/INCLUDE/CONIO.H create mode 100644 third_party/solid-c/INCLUDE/CTYPE.H create mode 100644 third_party/solid-c/INCLUDE/DIRECT.H create mode 100644 third_party/solid-c/INCLUDE/DOS.H create mode 100644 third_party/solid-c/INCLUDE/ERRNO.H create mode 100644 third_party/solid-c/INCLUDE/IO.H create mode 100644 third_party/solid-c/INCLUDE/MALLOC.H create mode 100644 third_party/solid-c/INCLUDE/MEM.H create mode 100644 third_party/solid-c/INCLUDE/MOUSE.H create mode 100644 third_party/solid-c/INCLUDE/SETJMP.H create mode 100644 third_party/solid-c/INCLUDE/STAT.H create mode 100644 third_party/solid-c/INCLUDE/STDARG.H create mode 100644 third_party/solid-c/INCLUDE/STDIO.H create mode 100644 third_party/solid-c/INCLUDE/STDLIB.H create mode 100644 third_party/solid-c/INCLUDE/STRING.H create mode 100644 third_party/solid-c/INCLUDE/TYPES.H create mode 100644 third_party/solid-c/LD.EXE create mode 100644 third_party/solid-c/OL.EXE create mode 100644 third_party/solid-c/SRC/CLIB/CONIO.ASM create mode 100644 third_party/solid-c/SRC/CLIB/CTYPE.ASM create mode 100644 third_party/solid-c/SRC/CLIB/DOS.ASM create mode 100644 third_party/solid-c/SRC/CLIB/IO.ASM create mode 100644 third_party/solid-c/SRC/CLIB/MALLOC1.ASM create mode 100644 third_party/solid-c/SRC/CLIB/MEM.ASM create mode 100644 third_party/solid-c/SRC/CLIB/MOUSE.ASM create mode 100644 third_party/solid-c/SRC/CLIB/STARTUP.ASM create mode 100644 third_party/solid-c/SRC/CLIB/STDIO.ASM create mode 100644 third_party/solid-c/SRC/CLIB/STDLIB.ASM create mode 100644 third_party/solid-c/SRC/CLIB/STREAM.ASM create mode 100644 third_party/solid-c/SRC/CLIB/STRING.ASM create mode 100644 third_party/solid-c/WHATSNEW.RUS create mode 100755 toolchain/check_banks.py create mode 100755 toolchain/make_release.sh create mode 100644 toolchain/mkexe/Makefile create mode 100644 toolchain/mkexe/mkexe.c create mode 100755 toolchain/mkexe/run-tests.sh create mode 100644 toolchain/mkexe/tests/bad.ihx create mode 100644 toolchain/mkexe/tests/banked.ihx create mode 100644 toolchain/mkexe/tests/big.bin create mode 100644 toolchain/mkexe/tests/hello.ihx create mode 100644 toolchain/mkexe/tests/one.bin create mode 100755 toolchain/sprinter-cc diff --git a/.gitignore b/.gitignore index bd0aac9..4e0c72c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,64 +1,73 @@ -# ---> C -# Prerequisites -*.d +# =========================================================================== +# Build outputs +# =========================================================================== -# Object files +# `build/` directories anywhere in the tree +# (top-level build/, lib/build/, toolchain/*/build/, ...) +build/ + +# sprinter-cc per-example intermediate directory +.sprinter-cc-*/ + +# Per-example final/intermediate outputs landing alongside the source +examples/*/*.exe +examples/*/*.asm +examples/*/*.lst +examples/*/*.lk +examples/*/*.ihx +examples/*/*.noi +examples/*/*.sym +examples/*/*.map +examples/*/*.rel +examples/*/*.cdb +examples/*/*.mem +examples/*/*.rst + +# libc archive (built from libc/, see lib/Makefile) +lib/*.lib + +# Host-built mkexe binary + test outputs (input fixtures *.bin/*.ihx kept) +toolchain/mkexe/mkexe +toolchain/mkexe/tests/*.exe +toolchain/mkexe/tests/*.actual + +# Host-C build artifacts (mkexe and similar tools compiled with native cc) *.o -*.ko *.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files *.dSYM/ -*.su -*.idb -*.pdb -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf +# =========================================================================== +# Vendored / downloaded +# =========================================================================== -# ---> Sdcc -# SDCC stuff -*.lnk -*.lst -*.map -*.mem -*.rel -*.rst -*.sym +# SDCC: extracted source tree + download tarballs +# (only third_party/setup-sdcc.sh tracked) +third_party/sdcc/ +third_party/sdcc-*/ +third_party/*.tar.bz2 +third_party/*.tar.gz +# MAME emulator install — ~1 GB binary + ROMs + CHDs +mame/ + +# =========================================================================== +# OS / editor / AI assistant +# =========================================================================== + +# macOS +.DS_Store +._* + +# Editor swap / backup +*~ +*.swp +*.bak +*.orig +*.rej + +# IDEs +.vscode/ +.idea/ + +# Claude Code local settings (per-machine, not for the repo) +.claude/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..217ff75 --- /dev/null +++ b/LICENSE @@ -0,0 +1,41 @@ +MIT License + +Copyright (c) 2026 Sprinter C Compiler contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +================================================================================ + +Vendored third-party components are under their own licenses: + + third_party/sdcc/ — SDCC 4.5 under GPL v2 with linking exception. + See third_party/sdcc/COPYING.txt. + third_party/solid-c/ — Original Sprinter Solid C, used only as a reference + for compatibility. Licence not specified upstream; + treat as reference material, do not redistribute + original binaries. + mame/v306/ — MAME (https://www.mamedev.org), GPL v2+. + mame/v306/IMG/*.img *.chd *.iso — Sprinter ROM / DSS / sample disk images + from Peters Plus. Redistribution policy: see + Peters Plus documentation. + +Documentation in docs/converted/, docs/reference/, docs/samples/, and +docs/memory management/ contains material originally published by Peters Plus +team (Иван Мак, Дмитрий Паринов and others). Used here for cross-compilation +reference; original copyrights apply. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f123b3e --- /dev/null +++ b/Makefile @@ -0,0 +1,88 @@ +# Sprinter C Compiler — top-level Makefile +# +# make build host tools, libc archive, and all examples +# make tools build only host tools (mkexe) +# make lib build lib/sprinter.lib (libc archive used by sprinter-cc) +# make examples build all examples +# make floppy package every example + test files into mame/v306/IMG/mc.img +# make check run mkexe unit tests +# make clean remove all build artefacts +# make sdcc download/extract vendored SDCC +# +# Most heavy lifting is delegated to sub-Makefiles. + +EXAMPLES := hello banked bankedbg strtest cat seek malloc mem_test argv errno rt_test openenv ls conio attrprob timedir mouse banklocl stdlib assrtest ptime stattest filetest gfx_demo gfx_d16 gfx_text gfx_mous + +MAME_DIR := mame/v306 +FLOPPY_IMG := $(MAME_DIR)/IMG/mc.img +MAKE_DISK := $(MAME_DIR)/make_disk.py + +EXE_FILES := \ + examples/hello/hello.exe \ + examples/banked/banked.exe \ + examples/bankedbg/bankedbg.exe \ + examples/strtest/strtest.exe \ + examples/cat/cat.exe \ + examples/seek/seek.exe \ + examples/malloc/malloc.exe \ + examples/mem_test/mem_test.exe \ + examples/argv/argv.exe \ + examples/errno/errno.exe \ + examples/rt_test/rt_test.exe \ + examples/openenv/openenv.exe \ + examples/ls/ls.exe \ + examples/conio/conio.exe \ + examples/attrprob/attrprob.exe \ + examples/timedir/timedir.exe \ + examples/mouse/mouse.exe \ + examples/banklocl/banklocl.exe \ + examples/stdlib/stdlib.exe \ + examples/assrtest/assrtest.exe \ + examples/ptime/ptime.exe \ + examples/stattest/stattest.exe \ + examples/filetest/filetest.exe \ + examples/gfx_demo/gfx_demo.exe \ + examples/gfx_d16/gfx_d16.exe \ + examples/gfx_text/gfx_text.exe \ + examples/gfx_mous/gfx_mous.exe + +DATA_FILES := \ + examples/cat/test.txt \ + examples/seek/big.txt + +.PHONY: all tools lib examples check clean sdcc floppy $(EXAMPLES) + +all: tools lib examples + +tools: + $(MAKE) -C toolchain/mkexe + +lib: + $(MAKE) -C lib + +check: tools + $(MAKE) -C toolchain/mkexe check + +examples: $(EXAMPLES) + +$(EXAMPLES): tools lib + $(MAKE) -C examples/$@ + +# Generate big.txt if missing (gen_bigfile.py creates 100 KB marker file). +examples/seek/big.txt: + cd examples/seek && python3 gen_bigfile.py big.txt 102400 + +# Re-pack the MAME floppy image with every built example + needed data files. +floppy: examples examples/seek/big.txt + python3 $(MAKE_DISK) $(FLOPPY_IMG) $(EXE_FILES) $(DATA_FILES) + @echo + @echo "Floppy ready: $(FLOPPY_IMG)" + @echo "Run: cd $(MAME_DIR) && ./run_mame.sh" + +clean: + $(MAKE) -C toolchain/mkexe clean + $(MAKE) -C lib clean + @for e in $(EXAMPLES); do $(MAKE) -C examples/$$e clean; done + +sdcc: + bash third_party/setup-sdcc.sh diff --git a/README.md b/README.md index e199d74..97b7770 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,221 @@ -# Sprinter-SDCC +# Sprinter C Compiler — v1.0 +C toolchain for **Sprinter** — the Z80-based home computer by Peters Plus, running +ESTEX DSS. Host: macOS / Linux. Target: `.EXE` files in SprintEXE format. + +Built on top of **SDCC 4.5** (vendored in `third_party/sdcc/`). This repository adds +everything Sprinter-specific: crt0, linker integration, libc wrappers over ESTEX, +banked-call trampolines, graphics & accelerator API, mouse driver wrappers, and the +`mkexe` utility for producing SprintEXE images. + +## What you get + +* **`bin/sprinter-cc`** — one-line driver: `sprinter-cc -o foo.exe foo.c` +* **Memory modes**: `tiny`, `small`, `big`, `huge`, `manual` — see below. +* **stdio + conio**: printf, puts, putchar, getchar, fopen/fread/..., cprintf, cputs, putch, textcolor/textbackground/textattr, gotoxy, kbhit/getch. +* **Graphics**: 320×256×256 and 640×256×16 modes, accelerator-backed primitives (hline / vline / rect / fill_rect / line via Bresenham, plus clear), bitmap-font text in both modes via BIOS character generator. +* **File I/O**: POSIX (`open`/`read`/`write`/`close`/`lseek`/`unlink`/`creat`), FILE\* streams (`fopen`/`fgets`/`fwrite`/...), directory listing (`ffirst`/`fnext`), `chdir`/`getcwd`/`mkdir`/`rmdir`, `stat`/`fstat`. +* **Memory**: 32 KB heap (W2-resident), banking-aware page allocator (`mem_alloc_pages`/`bank_read`/`bank_write`), explicit memory modes for sub-16 KB programs. +* **Mouse**: full Sprinter driver wrapper (14 functions including custom cursor bitmaps). +* **Environment**: `getenv`/`putenv`/`sysenv` over ESTEX `$46`. +* **Time**: `getdatetime`/`setdatetime` + POSIX `time`/`localtime`/`mktime`/`asctime`/`ctime`. +* **Misc**: `errno`/`strerror`/`perror`, `atexit`, `setjmp`/`longjmp`, `sleep`, full argv parsing in crt0. + +## Quick start + +```sh +git clone sprinter-c +cd sprinter-c +make sdcc # one-time: fetch SDCC 4.5 binary (~25 MB) +make all # build mkexe + libsprinter.lib + 27 examples +make floppy # pack everything into mame/v306/IMG/mc.img +cd mame/v306 && ./run_mame.sh # boot Sprinter in MAME +``` + +Compile a single program: + +```sh +cat > hello.c < +int main(void) { puts("Hello, Sprinter!"); return 0; } +EOF + +bin/sprinter-cc -o hello.exe hello.c +``` + +That's it — `hello.exe` is now a valid SprintEXE you can `RUN HELLO` from the ESTEX shell. + +## Memory modes + +Sprinter's address space is four 16 KB windows (W0 / W1 / W2 / W3). DSS allocates +pages by program size — small programs get only one page. Pick a memory mode based +on what your program needs: + +| Mode | Code lives in | Banking | Use when | +|---|---|---|---| +| `tiny` (default) | W2 (0x8100+) | no | code+data < 14 KB | +| `small` | W1 (0x4100+) | no | code+data < 30 KB | +| `big` | W2 + W1 banks | yes (W1) | tiny + extra code modules | +| `huge` | W1 + W3 banks | yes (W3) | small + extra code modules | +| `manual` | user-specified | optional | special layouts | + +```sh +sprinter-cc --memory small -o big.exe bigprog.c +sprinter-cc --memory huge -o app.exe main.c --bank 1=engine.c --bank 2=ai.c +``` + +Banked functions are declared with `__banked`: + +```c +void engine_tick(int dt) __banked; // lives in BANK1, automatically swapped +``` + +## Examples (27 total) + +| Example | What it demonstrates | +|---|---| +| `hello` | Hello world with stdio + conio Turbo-C-style colors | +| `argv` | argv parsing in crt0 | +| `cat` | File I/O — read & print TEST.TXT | +| `seek` | 32-bit lseek over a 100 KB file | +| `ls` | Directory listing via ffirst/fnext | +| `filetest` | FILE\* streams (fopen/fread/...) | +| `stattest` | `stat`/`fstat` on files and directories | +| `errno` | errno / strerror / perror | +| `mem_test` | Page allocator + bank\_read/bank\_write | +| `malloc` | Heap stress test (200+ allocations) | +| `banked` | Banked code in W3 (huge mode) | +| `bankedbg` | Banked code in W1 (big mode) | +| `banklocl` | Bank-local static data and BSS | +| `mouse` | Mouse driver in text mode | +| `gfx_mous` | Mouse with custom bitmap cursor in graphics mode | +| `gfx_demo` | 320×256×256 lines / rects / accelerator | +| `gfx_d16` | 640×256×16 same primitives | +| `gfx_text` | Bitmap-font text on graphics screen | +| `timedir` | Date/time + directory listing | +| `ptime` | POSIX time API | +| `openenv` | open() flags + environment vars | +| `conio` | conio API smoke test | +| `attrprob` | Probe Sprinter text attribute byte layout | +| `strtest` | string.h test (from SDCC's z80.lib) | +| `stdlib` | stdlib.h test (qsort / rand / strtol / etc.) | +| `assrtest` | assert() | +| `rt_test` | Runtime helpers (sleep, setjmp, atexit) | + +## Headers + +Standard: +* `` — puts / printf / FILE\* + Sprinter-specific dec/hex helpers +* `` — atoi / atof / malloc / qsort / ... (from SDCC z80.lib) +* `` / `` / `` — from SDCC z80.lib +* `` — read / write / close / lseek / unlink +* `` — open / creat + O\_RDONLY / O\_CREAT / ... +* `` — errno + error names + strerror +* `` — stat / fstat +* `` / `` — from SDCC + +Sprinter-specific: +* `` — putch / cputs / cprintf, textcolor / textbackground / textattr, kbhit / getch, clrscr, gotoxy, wherex/y +* `` — gfx_init/done, palette, putpixel, hline/vline/rect/fill_rect/line, text — for both 320 and 640 modes (gfx_\*16 variants) +* `` — full 14-function driver wrapper + mouse_cursor_t with bitmap support +* `` — chdir / getcwd / mkdir / rmdir / ffirst / fnext / ffblk +* `` — getdatetime / setdatetime + POSIX time / localtime / etc. +* `` — raw ports, ESTEX/BIOS function numbers, env API +* `` — exit / \_exit / atexit +* `` — mem\_alloc\_pages / mem\_free\_block / bank\_read / bank\_write +* `` — Solid-C compatibility layer (aliases + BOOL/WORD/uint types) + +## Toolchain commands + +```sh +make all # build mkexe + lib + every example +make floppy # repack mame/v306/IMG/mc.img with all .exe files +make check # 17 mkexe unit-tests +make clean # remove all build artefacts +make sdcc # one-time: fetch SDCC 4.5 binary +``` + +### sprinter-cc options + +``` +sprinter-cc -o foo.exe foo.c [more.c ...] [options] + + --memory MODE tiny | small | big | huge | manual (default: tiny) + --memory-manual SPEC explicit placement (CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3) + --stack-size N bytes reserved for the stack (default ~1278) + --crt0=TYPE default | minimal | banked | small + --bank N=FILE.c compile FILE.c into bank N (repeatable, max 15) + --debug enable runtime diagnostics (defines DEBUG_RT) + -I PATH extra include path + -L 0xADDR / -E / -S override load / entry / stack addresses + -Wl FLAG pass FLAG to sdldz80 + --mkexe FLAG pass FLAG to mkexe (e.g. --mkexe -p --mkexe 0 for bank padding) + -v verbose +``` + +## Status + +What works in v1.0: +* Compile / link / pack to SprintEXE — verified on all 27 examples +* All five memory modes (tiny / small / big / huge / manual) +* Graphics (both modes) with accelerator +* Mouse (text + graphics cursor) +* File I/O, directories, environment, time +* All headers listed above + +Deferred to v2.0 (see `docs/TODO.md`): +* **IM2 interrupt handlers** — research complete (`docs/im2_isr_design.md`), + implementation scheduled for v2 +* **Turbo-C-style BGI graphics API** — `initgraph` / `setcolor` / `circle` / + `getimage` / `putimage` / etc. on top of our `gfx_*` primitives +* **Audio API** (AY-3-8910 + COVOX) — requires IM2 +* **ISA-8 slot drivers** — requires IM2 +* Remaining Solid-C compatibility gaps (Phase 2/3) — see `docs/solid_c_compatibility.md` + +## Documentation + +* `docs/TODO.md` — roadmap and open work items +* `docs/solid_c_compatibility.md` — gap analysis vs Solid-C 2004 +* `docs/im2_isr_design.md` — interrupt handler design (v2) +* `docs/converted/` — source documentation (ESTEX, BIOS, architecture) + converted to plain text for `grep` +* `docs/reference/`, `docs/samples/`, `docs/memory management/` — original + Russian docs and code samples from Peters Plus + +## Repository layout + +``` +bin/sprinter-cc one-line compiler driver (bash) +toolchain/mkexe/ host-side tool: .ihx -> .exe SprintEXE +toolchain/check_banks.py post-link bank size enforcer +runtime/ crt0 variants (default, minimal, small, banked) + bank trampolines, heap, heap_top +libc/include/ headers +libc/io|stdio|mem|gfx/ C and asm sources for libsprinter.lib +lib/ Makefile that archives libsprinter.lib via sdar +examples/ 27 example programs +mame/v306/ MAME binary + Sprinter ROM/HDD images + floppy script +third_party/sdcc/ vendored SDCC 4.5 (fetched via `make sdcc`) +third_party/solid-c/ reference: original Sprinter native C (for compat target) +docs/ documentation +``` + +## License + +This repository contains: +* Original code in `bin/`, `toolchain/`, `runtime/`, `libc/`, `lib/`, `examples/` — + MIT-licensed. +* `third_party/sdcc/` — SDCC 4.5 under GPLv2 with linking exception + (see `third_party/sdcc/COPYING.txt`) +* `third_party/solid-c/` — original Sprinter Solid C, used only as a reference + +## Credits + +* **Sprinter / Peters Plus** — Иван Мак, Дмитрий Паринов and the original team +* **SDCC** — for the underlying Z80 compiler +* **z88dk +pps** — Дмитрий M. for paving the way with the first Sprinter target +* **MAME** — for the Sprinter Sp2000 emulation + +--- + +For questions / patches: see CONTRIBUTING.md (TBD) or open an issue. diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md new file mode 100644 index 0000000..fef6601 --- /dev/null +++ b/RELEASE_NOTES.md @@ -0,0 +1,147 @@ +# Sprinter C Compiler — Release Notes + +## v1.0 (2026-06-01) + +First public release. Production-ready toolchain for writing C programs that +target Sprinter / ESTEX DSS. Built on top of vendored SDCC 4.5; this repository +adds everything Sprinter-specific. + +### Highlights + +* **One-line builds:** `sprinter-cc -o foo.exe foo.c` — pulls in crt0, libsprinter, + packs the resulting .ihx into a SprintEXE. +* **27 working examples** covering every API surface — used as regression tests + while the toolchain was developed. +* **Five memory modes** (`tiny / small / big / huge / manual`) handle programs + from a few KB up to 32 KB of code + arbitrarily many 16 KB banks. +* **Full Sprinter API coverage**: console, files & directories, environment, + date/time, mouse, graphics (both 320×256×256 and 640×256×16 modes including + the hardware accelerator), bitmap-font text, banking, paging. + +### Component versions + +* SDCC: 4.5.0 (vendored binary) +* SprintEXE format: as documented in `docs/converted/ProgrammerManual.txt` +* MAME: 0.283 with `sprinter` driver (vendored at `mame/v306/mame.arm`) +* DSS / ESTEX: 1.71.57 (matches `mame/v306/IMG/dss171u.img`) + +### What's included + +Toolchain: +* `bin/sprinter-cc` — Bash driver +* `toolchain/mkexe/mkexe` — host C utility, packs `.ihx` → `.exe` +* `toolchain/check_banks.py` — post-link bank size enforcement + +Runtime (`runtime/`): +* `crt0.s` — default startup for tiny / big modes, parses argv +* `crt0_minimal.s` — opt-out for very small programs (no argv) +* `crt0_small.s` — for small / huge modes, allocates W2 via ESTEX `$3A` +* `crt0_banked.s` — parameterised: handles W3 banks (huge) or W1 banks (big) + via assemble-time `BANK_W1` flag +* `bank.s` — `___sdcc_bcall_ehl` trampoline (banking-aware, + preserves uint8_t return value in A) +* `heap.s` + `heap_top.s` — 32 KB W2-resident heap, configurable upper bound + via `sprinter-cc --stack-size` + +Libraries (`libc/`): +* `libsprinter.lib` archives: io (open/read/lseek/close/unlink/stat/atexit/setjmp/ + errno/sleep/time/env/conio/fsdir/dir/mouse), stdio (putchar/puts/getchar/print_hex/ + file/cprintf/solid_helpers), mem (mem_alloc/bank_io), gfx (gfx_core/gfx_lines/ + gfx_16/gfx_text) + +Headers (`libc/include/`): +* Standard: `stdio.h`, `unistd.h`, `fcntl.h`, `errno.h`, `time.h`, `sys/stat.h` +* Sprinter-specific: `conio.h`, `gfx.h`, `mouse.h`, `dir.h`, `sprinter.h`, + `sprinter_exit.h`, `sprinter_mem.h` +* Compatibility: `sprinter_compat.h` — Solid-C aliases and types + +Examples (27 in `examples/`): +* I/O: hello, argv, cat, seek, ls, filetest, stattest, errno +* Memory & banking: mem_test, malloc, banked, bankedbg, banklocl +* Mouse: mouse, gfx_mous +* Graphics: gfx_demo, gfx_d16, gfx_text +* Misc: timedir, ptime, openenv, conio, attrprob, strtest, stdlib, assrtest, rt_test + +Documentation (`docs/`): +* `TODO.md` — roadmap, v2 plans +* `solid_c_compatibility.md` — Solid-C compatibility gap analysis +* `im2_isr_design.md` — interrupt design (v2) +* `converted/` — searchable plain-text copies of original Russian documentation + +### Notable design decisions + +* **DSS allocates pages by program size** — `< 16 KB` programs get only one + 16 KB page. Memory modes encode the four possible layouts. +* **One libsprinter.lib for all modes** — SDCC's linker drops unused .rel members, + so a `tiny` hello program only pulls in what it needs (~700 bytes overhead). +* **Banking trampoline ABI**: 1-byte saved page + 2-byte bjump return between + the bcall ret and the callee's stack arguments. `pop bc; out (c), b` on the + way back preserves A (a previous version clobbered A and silently lost + uint8_t return values). +* **Text I/O is Turbo-C-style split**: `puts/printf/putchar` (fast, via PCHARS) + ignore text attribute; `cputs/cprintf/putch` apply `g_text_attr`. Same + convention as Borland C 2.x — programs port over with minimal changes. +* **Graphics accelerator**: the `LD D,D / LD C,C / LD E,E / LD B,B` instruction + trick is wrapped in self-modifying-code primitives in `gfx_lines.c` (the block + length byte must literally follow `LD A,#imm`; we patch it at runtime). +* **Mouse cursor format** (verified empirically): 1 byte per pixel, `0xFF = + transparent`; the driver stores the bitmap in a dedicated video bank. +* **Video mode bitmaps**: BIOS font is **interleaved** — `byte[r*256 + c]`, + not `byte[c*8 + r]` as the obvious reading suggests. + +### Limitations / known issues + +* **No interrupt handlers in v1** — scheduled for v2. `examples/rt_test` uses + busy-wait sleep via ESTEX `$30` instead. +* **MAME's mouse driver stubs `$0E GET_SENSITIVE`** — returns 0 instead of the + current value. Workaround: always call `mouse_set_sensitivity(h, v)` with + known values at startup; don't trust `mouse_get_sensitivity_*()` reads. +* **MAME's mouse driver `$0B RETURN_CURSOR`** — writes the bitmap to the IX + buffer but does not update the H/L/D/E result registers, so + `mouse_get_cursor()` returns width/height/hot_x/hot_y as 0. +* **Several Solid-C functions not yet ported** — see + `docs/solid_c_compatibility.md` for the categorised list. +* **No fprintf / scanf family** — workaround: `sprintf(buf, ...) + fputs(buf, fp)`. +* **No double-buffering wrapper** — Sprinter hardware supports it (port `0xC9`), + the user-facing wrapper is part of the v2 BGI-style API. + +### Migration notes from pre-1.0 trees + +If you were tracking the project during development: +* All example directories were renamed to satisfy 8.3 filenames on the floppy: + `banked_big → bankedbg`, `seek_demo → seek`, `malloc_test → malloc`, + `time_dir_test → timedir`, `bank_local_data → banklocl`, + `gfx_demo16 → gfx_d16`, `gfx_text_demo → gfx_text`, + `gfx_mouse_test → gfx_mous`, etc. +* `puts` / `putchar` no longer apply `g_text_attr` (switched to fast PCHARS). + Programs that depended on coloured stdio must use `cputs` / `cprintf` / + `putch` instead, or call `textattr(...)` followed by clrscr. +* `runtime/bank.s` is no longer bundled in `sprinter.lib` — it's assembled + per-build by `sprinter-cc` with the right `BANK_W1` flag for the chosen + memory mode. + +### Acknowledgements + +* **Peters Plus** team (Иван Мак, Дмитрий Паринов) for designing Sprinter and + publishing the architecture / BIOS / DSS documentation that made this + toolchain possible. +* **Dmitry M.** for the z88dk `+pps` Sprinter target — first proof-of-concept + for cross-compiling C to SprintEXE; several conventions were borrowed. +* **The SDCC team** for the Z80 backend that does the heavy lifting. +* **The MAME team** for emulating the Sprinter Sp2000 well enough for + full toolchain regression testing without hardware. + +--- + +## v2.0 (planned) + +Scope: +1. IM2 interrupt handlers (`irq_install` / `irq_remove`) — design in + `docs/im2_isr_design.md` +2. Turbo-C-style BGI graphics API (`initgraph` / `setcolor` / `circle` / + `getimage` / `putimage` / `setviewport` / `setlinestyle` / ...) +3. Audio API (AY-3-8910 + COVOX, requires IM2) +4. ISA-8 slot drivers (sound, network — requires IM2) +5. Remaining Solid-C compatibility (Phase 2/3 in `docs/solid_c_compatibility.md`): + `ungetc`, `getdate/gettime/setdate/settime`, `absread/abswrite`, + `scanf` family, `fdopen` / `freopen` / `fclosall` diff --git a/bin/sprinter-cc b/bin/sprinter-cc new file mode 100755 index 0000000..4aa3f7e --- /dev/null +++ b/bin/sprinter-cc @@ -0,0 +1,347 @@ +#!/usr/bin/env bash +# +# sprinter-cc — wrapper around SDCC for building Sprinter .EXE files. +# +# Usage: +# sprinter-cc -o foo.exe foo.c [more.c ...] [options] +# +# Options: +# -o NAME output executable name (required) +# --crt0=TYPE crt0 variant: default | minimal | banked (default: default) +# --memory MODE memory layout: tiny | small | big | huge | manual +# tiny (default): CODE+DATA+stack in W2 (single page, ≤14 KB) +# small: CODE in W1, DATA+BSS continue into W2, heap spans +# remainder, stack in W2. crt0_small reads port +# 0xA2 to auto-detect whether DSS already mapped W2 +# (program > 16 KB) or whether we need to allocate +# it ourselves (program < 16 KB). Covers 0..30 KB. +# big: tiny + banked code in W1 [TODO] +# huge: small + banked code in W3 [TODO] +# manual: explicit via --memory-manual / --code-loc / --data-loc +# --memory-manual SPEC placement spec, only with --memory manual. +# SPEC = comma-separated KEY=VAL list: +# CODE=W1|W2 DATA=W1|W2|SAME BANKED=W1|W3 +# Example: --memory-manual CODE=W2,DATA=W2,BANKED=W3 +# -I PATH additional include path (repeatable) +# -L 0xADDR code load address (default: derived from --memory mode) +# -E 0xADDR entry address (default: same as -L) +# -S 0xADDR stack address (default: 0xBFFE) +# --stack-size N bytes reserved for the stack (default: ~1278, sets +# HEAP_TOP = stack_top + 1 - N to constrain heap growth) +# --code-loc 0xN override SDCC --code-loc (default: derived from --memory) +# --data-loc 0xN override SDCC --data-loc (default: derived from --memory) +# -Wl FLAG extra linker flag (repeatable) +# --bank N=FILE.c compile FILE.c as bank N; repeatable; pulls crt0_banked +# automatically and adds -Wl-b_BANKN=0x{N}C000 +# --mkexe FLAG extra mkexe flag (repeatable; e.g. --mkexe -p --mkexe 0) +# --debug enable runtime diagnostics — defines DEBUG_RT for both +# sdcc (-DDEBUG_RT) and the crt0 assembly (prepended +# `DEBUG_RT = 1`). Exposes runtime introspection symbols +# such as `_w2_self_allocated` (see ). +# -v verbose (echo every command) +# -h, --help show this help +# +# Example: +# sprinter-cc -o hello.exe hello.c +# sprinter-cc -o app.exe main.c --bank 1=engine.c +# sprinter-cc -o tiny.exe tiny.c --crt0=minimal + +set -eo pipefail + +# ------- Locate the toolchain ------------------------------------------------ +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +PROJ_ROOT="$( cd "$SCRIPT_DIR/.." && pwd )" + +SDCC_BIN="$PROJ_ROOT/third_party/sdcc/bin" +SDCC="$SDCC_BIN/sdcc" +SDASZ80="$SDCC_BIN/sdasz80" +MKEXE="$PROJ_ROOT/toolchain/mkexe/mkexe" +CHECK_BANKS="$PROJ_ROOT/toolchain/check_banks.py" + +RUNTIME="$PROJ_ROOT/runtime" +LIB_DIR="$PROJ_ROOT/lib" +INC_DIR="$PROJ_ROOT/libc/include" + +# ------- Defaults ------------------------------------------------------------ +OUT="" +CRT0_TYPE="default" +MEMORY_MODE="tiny" +MEMORY_MANUAL="" +# CODE_LOC / DATA_LOC are derived from MEMORY_MODE unless overridden via +# explicit --code-loc / --data-loc; capture user intent in USER_*. +USER_CODE_LOC="" +USER_DATA_LOC="" +LOAD_ADDR="" +ENTRY_ADDR="" +STACK_ADDR="0xBFFE" +STACK_SIZE="" # if set, used to compute HEAP_TOP = STACK_ADDR + 1 - STACK_SIZE +DEBUG_RT=0 # if 1, prepend `DEBUG_RT = 1` to crt0 + pass -DDEBUG_RT to sdcc +VERBOSE=0 +USER_INCS=() +SOURCES=() +LD_EXTRA=() +MKEXE_EXTRA=() +BANK_SPECS=() # entries like "1=engine.c" + +# ------- Parse args ---------------------------------------------------------- +usage() { + sed -n '3,28p' "$0" | sed 's/^# \{0,1\}//' + exit "${1:-0}" +} + +while [[ $# -gt 0 ]]; do + case "$1" in + -o) OUT="$2"; shift 2;; + --crt0=*) CRT0_TYPE="${1#*=}"; shift;; + -I) USER_INCS+=("-I" "$2"); shift 2;; + -L) LOAD_ADDR="$2"; shift 2;; + -E) ENTRY_ADDR="$2"; shift 2;; + -S) STACK_ADDR="$2"; shift 2;; + --code-loc) USER_CODE_LOC="$2"; shift 2;; + --data-loc) USER_DATA_LOC="$2"; shift 2;; + --memory) MEMORY_MODE="$2"; shift 2;; + --memory-manual) MEMORY_MANUAL="$2"; shift 2;; + --stack-size) STACK_SIZE="$2"; shift 2;; + -Wl) LD_EXTRA+=("$2"); shift 2;; + --bank) BANK_SPECS+=("$2"); shift 2;; + --mkexe) MKEXE_EXTRA+=("$2"); shift 2;; + --debug) DEBUG_RT=1; shift;; + -v) VERBOSE=1; shift;; + -h|--help) usage 0;; + -*) echo "sprinter-cc: unknown option: $1" >&2; usage 1;; + *) SOURCES+=("$1"); shift;; + esac +done + +[[ -z "$OUT" ]] && { echo "sprinter-cc: -o NAME is required" >&2; exit 1; } +[[ ${#SOURCES[@]} -eq 0 ]] && { echo "sprinter-cc: no input files" >&2; exit 1; } + +# ------- Resolve memory mode → CODE_LOC / DATA_LOC --------------------------- +# tiny : CODE in W2 (0x8100), DATA auto after code (= W2) +# small : CODE in W1 (0x4100), DATA in W2 (0x8000) — crt0 must alloc W2 +# big : tiny + banked code in W1 (--bank stays in HOME-style trampolines) +# huge : small + banked code in W3 — same as today's crt0_banked layout +# manual: parsed from --memory-manual SPEC +case "$MEMORY_MODE" in + tiny) + MODE_CODE_LOC="0x8100"; MODE_DATA_LOC="0" + ;; + small) + # CODE at 0x4100; DATA/BSS/HEAP chained auto by linker. Supports + # any size up to ~30 KB code+data combined. crt0_small reads port + # 0xA2 at startup to detect if DSS already mapped W2 (program > 16 + # KB) and skips SETWIN2 in that case; otherwise it allocates W2 + # itself via ESTEX $3D + $3A. + MODE_CODE_LOC="0x4100"; MODE_DATA_LOC="0" + ;; + big) + # tiny layout (CODE+DATA in W2) + banked code in W1. crt0_banked + # gets BANK_W1=1 prepended so its trampoline + bank loader use + # port 0xA2 (W1) and load address 0x4000. mkexe gets -B 0x4000. + MODE_CODE_LOC="0x8100"; MODE_DATA_LOC="0" + ;; + huge) + # small layout + banked code in W3. crt0_banked auto-detects W2 + # the same way crt0_small does, then loads banks from the .EXE. + MODE_CODE_LOC="0x4100"; MODE_DATA_LOC="0x8000" + ;; + manual) + # Defaults if SPEC omits a key. + MODE_CODE_LOC="0x4100" + MODE_DATA_LOC="0" + IFS=',' read -ra _parts <<< "$MEMORY_MANUAL" + for _p in "${_parts[@]}"; do + [[ -z "$_p" ]] && continue + _k="${_p%%=*}"; _v="${_p#*=}" + case "$_k=$_v" in + CODE=W1) MODE_CODE_LOC="0x4100";; + CODE=W2) MODE_CODE_LOC="0x8100";; + DATA=W1) MODE_DATA_LOC="0x4000";; + DATA=W2) MODE_DATA_LOC="0x8000";; + DATA=SAME) MODE_DATA_LOC="0";; + BANKED=W1|BANKED=W3) : ;; # recorded; banked window only matters for --bank trampolines + *) + echo "sprinter-cc: bad --memory-manual entry: $_p" >&2 + echo " valid: CODE=W1|W2, DATA=W1|W2|SAME, BANKED=W1|W3" >&2 + exit 1 + ;; + esac + done + ;; + *) + echo "sprinter-cc: unknown --memory mode: $MEMORY_MODE" >&2 + echo " valid: tiny | small | big | huge | manual" >&2 + exit 1 + ;; +esac + +# Explicit --code-loc / --data-loc win over the mode defaults. +CODE_LOC="${USER_CODE_LOC:-$MODE_CODE_LOC}" +DATA_LOC="${USER_DATA_LOC:-$MODE_DATA_LOC}" + +LOAD_ADDR="${LOAD_ADDR:-$CODE_LOC}" +ENTRY_ADDR="${ENTRY_ADDR:-$LOAD_ADDR}" + +[[ $VERBOSE -eq 1 ]] && echo " memory: mode=$MEMORY_MODE code=$CODE_LOC data=$DATA_LOC load=$LOAD_ADDR" + +# Pick crt0 source. Memory mode drives default crt0 selection; explicit +# --crt0=TYPE still wins (e.g. --crt0=minimal for tiny w/o argv). +case "$MEMORY_MODE" in + small|huge) DEFAULT_CRT0="small";; + *) DEFAULT_CRT0="default";; +esac +if [[ "$CRT0_TYPE" == "default" && "$DEFAULT_CRT0" != "default" ]]; then + CRT0_TYPE="$DEFAULT_CRT0" +fi + +case "$CRT0_TYPE" in + default) CRT0_SRC="$RUNTIME/crt0.s"; ;; + minimal) CRT0_SRC="$RUNTIME/crt0_minimal.s";; + small) CRT0_SRC="$RUNTIME/crt0_small.s"; ;; + banked) CRT0_SRC="$RUNTIME/crt0_banked.s"; ;; + *) echo "sprinter-cc: bad --crt0 type: $CRT0_TYPE" >&2; exit 1;; +esac + +# Banked builds always need crt0_banked, regardless of what the user asked. +if [[ ${#BANK_SPECS[@]} -gt 0 ]] && [[ "$CRT0_TYPE" != "banked" ]]; then + [[ $VERBOSE -eq 1 ]] && echo " --bank present → switching to crt0_banked" + CRT0_SRC="$RUNTIME/crt0_banked.s" +fi + +# ------- Build in a per-output workdir --------------------------------------- +WORK="$(dirname "$OUT")/.sprinter-cc-$(basename "$OUT" .exe)" +mkdir -p "$WORK" + +run() { + [[ $VERBOSE -eq 1 ]] && echo " $*" + "$@" +} + +# Decide whether the build needs the W1 banking window (BIG mode). This +# affects crt0_banked.s and bank.s — both honour `BANK_W1 = 1` prepended +# by us. HUGE / default (no BANK_W1) → banks live in W3 at port 0xE2. +BANK_W1=0 +[[ "$MEMORY_MODE" == "big" ]] && BANK_W1=1 + +# Helper: assemble a runtime .s with optional `DEBUG_RT = 1` and/or +# `BANK_W1 = 1` prepended. No-op prefix path keeps the original source +# (zero overhead for hot non-debug, non-banked builds). +asm_runtime() { + local src="$1" out="$2" + local prefix="" + [[ $DEBUG_RT -eq 1 ]] && prefix+="DEBUG_RT = 1"$'\n' + [[ $BANK_W1 -eq 1 ]] && prefix+="BANK_W1 = 1"$'\n' + if [[ -n "$prefix" ]]; then + local patched="$WORK/$(basename "$src" .s)_patched.s" + { printf "%s" "$prefix"; cat "$src"; } > "$patched" + run "$SDASZ80" -o "$out" "$patched" + else + run "$SDASZ80" -o "$out" "$src" + fi +} + +# 1. crt0 — patched with DEBUG_RT / BANK_W1 if requested. +CRT0_REL="$WORK/$(basename "$CRT0_SRC" .s).rel" +asm_runtime "$CRT0_SRC" "$CRT0_REL" + +# 1b. heap_top — either default from runtime/, or generate custom if user +# specified --stack-size. HEAP_TOP = stack_top + 1 - stack_size, e.g. +# --stack-size 2048 with default stack=0xBFFE → HEAP_TOP = 0xB7FF. +HEAP_TOP_REL="$WORK/heap_top.rel" +if [[ -n "$STACK_SIZE" ]]; then + # Resolve numeric values (accept hex 0xNNN or decimal). + _stack_top=$(( STACK_ADDR )) # bash auto-detects 0x prefix + _stack_sz=$(( STACK_SIZE )) + _heap_top=$(( _stack_top + 1 - _stack_sz )) + printf " .module sprinter_heap_top\n ___sdcc_heap_end = 0x%04X\n .globl ___sdcc_heap_end\n" \ + "$_heap_top" > "$WORK/heap_top.s" + HEAP_TOP_SRC="$WORK/heap_top.s" + [[ $VERBOSE -eq 1 ]] && echo " heap_top: custom HEAP_TOP=$(printf '0x%04X' $_heap_top) (stack reserve $_stack_sz bytes)" +else + HEAP_TOP_SRC="$RUNTIME/heap_top.s" +fi +run "$SDASZ80" -o "$HEAP_TOP_REL" "$HEAP_TOP_SRC" + +# 2. user sources → .rel (HOME) +USER_RELS=() +CC_FLAGS=(-mz80 --no-std-crt0 --std-c99 --opt-code-size -I "$INC_DIR" "${USER_INCS[@]}") +[[ $DEBUG_RT -eq 1 ]] && CC_FLAGS+=(-DDEBUG_RT) +for src in "${SOURCES[@]}"; do + rel="$WORK/$(basename "$src" .c).rel" + run "$SDCC" "${CC_FLAGS[@]}" -c -o "$rel" "$src" + USER_RELS+=("$rel") +done + +# 3. bank sources + trampoline (bank.s). In BIG mode banks live in W1 at +# low16 = 0x4000; in HUGE / default mode they live in W3 at low16 = 0xC000. +BANK_RELS=() +BANK_LD_FLAGS=() +if [[ ${#BANK_SPECS[@]} -gt 0 ]]; then + if [[ $BANK_W1 -eq 1 ]]; then + BANK_LOW16=0x4000 + else + BANK_LOW16=0xC000 + fi + # Trampoline — depends on BANK_W1 so we assemble it here, not from the lib. + BANK_TRAMP_REL="$WORK/bank_trampoline.rel" + asm_runtime "$RUNTIME/bank.s" "$BANK_TRAMP_REL" + BANK_RELS+=("$BANK_TRAMP_REL") + for spec in "${BANK_SPECS[@]}"; do + bank_n="${spec%%=*}" + bank_src="${spec#*=}" + rel="$WORK/bank${bank_n}_$(basename "$bank_src" .c).rel" + run "$SDCC" "${CC_FLAGS[@]}" \ + --codeseg "BANK${bank_n}" --constseg "BANK${bank_n}" --dataseg "BANK${bank_n}" \ + -c -o "$rel" "$bank_src" + BANK_RELS+=("$rel") + # Virtual address: bank_n in upper byte, BANK_LOW16 in low half. + addr=$(printf "0x%X" $(( (bank_n << 16) | BANK_LOW16 ))) + BANK_LD_FLAGS+=("-Wl-b_BANK${bank_n}=${addr}") + done +fi + +# 4. link → .ihx +IHX="$WORK/$(basename "$OUT" .exe).ihx" +LINK_FLAGS=(-mz80 --no-std-crt0 --std-c99 --opt-code-size + --code-loc "$CODE_LOC" --data-loc "$DATA_LOC") +LINK_FLAGS+=("${BANK_LD_FLAGS[@]}") +for f in "${LD_EXTRA[@]}"; do LINK_FLAGS+=("$f"); done +# libsprinter.lib via -l/-L (sdcc passes -lsprinter through to sdldz80). +# +# Filter benign "?ASlink-Warning-Definition ... found more than once" +# warnings. These come from intentional sprinter.lib overrides of the +# SDCC z80.lib defaults (puts, ___sdcc_heap, asctime/localtime, etc.). +# Linker picks the first found = our version, so behaviour is correct; +# the warning is just noise. In verbose mode show everything. +if [[ $VERBOSE -eq 1 ]]; then + run "$SDCC" "${LINK_FLAGS[@]}" -o "$IHX" \ + "$CRT0_REL" "$HEAP_TOP_REL" "${USER_RELS[@]}" "${BANK_RELS[@]}" \ + "-L$LIB_DIR" "-lsprinter" +else + # Drop the warning line + its two follow-up "Library:" lines. + run "$SDCC" "${LINK_FLAGS[@]}" -o "$IHX" \ + "$CRT0_REL" "$HEAP_TOP_REL" "${USER_RELS[@]}" "${BANK_RELS[@]}" \ + "-L$LIB_DIR" "-lsprinter" 2>&1 \ + | awk ' + /^\?ASlink-Warning-Definition of public symbol/ { skip = 3 } + skip > 0 { skip--; next } + { print } + ' +fi + +# Quick bank-size check (only meaningful if there are banks). +if [[ ${#BANK_SPECS[@]} -gt 0 ]] && [[ -f "${IHX%.ihx}.map" ]]; then + python3 "$CHECK_BANKS" "${IHX%.ihx}.map" || true +fi + +# 5. mkexe → .exe. In BIG mode tell mkexe banks live at 0x4000 (W1). +# IHX is the positional input — it must come last. Build the prefix +# (options + extras) first, then append the positional. +MK_PREFIX=() +[[ $VERBOSE -eq 1 ]] && MK_PREFIX+=(-v) +[[ $BANK_W1 -eq 1 ]] && MK_PREFIX+=(-B 0x4000) +MK_PREFIX+=("${MKEXE_EXTRA[@]}") +MK_PREFIX+=(-L "$LOAD_ADDR" -E "$ENTRY_ADDR" -S "$STACK_ADDR" -o "$OUT") +run "$MKEXE" "${MK_PREFIX[@]}" "$IHX" + +echo "sprinter-cc: wrote $OUT" diff --git a/docs/TODO.md b/docs/TODO.md new file mode 100644 index 0000000..991ac5f --- /dev/null +++ b/docs/TODO.md @@ -0,0 +1,399 @@ +# TODO / Roadmap + +Открытые задачи в порядке убывания приоритета. По мере появления реальных программ — приоритеты будут смещаться. + +## Этап 5 — malloc / free + banking-aware page allocator ✅ ГОТОВО + +- [x] SDCC's `malloc`/`free` + наш `runtime/heap.s` (полностью заменяет library heap.rel, 14000-байтный heap в окне 2) +- [x] `libc/mem/mem_alloc.c` — page allocator: `mem_alloc_pages`/`mem_free_block`/`mem_get_page`/`mem_info` через ESTEX `$3C/$3D/$3E` + BIOS `$C4` +- [x] `libc/mem/bank_io.c` — HOME-резидентные `bank_read`/`bank_write`/`bank_load_byte`/`bank_store_byte` со свопом W3 внутри +- [x] `examples/malloc_test/` — проверка SDCC's malloc (~210 64-байтных allocations через всю heap) +- [x] `examples/mem_test/` — проверка page allocator: 3 страницы, разные паттерны через bank_write, верификация через bank_read + +## Этап 6 — argv parsing + sprinter-cc wrapper ✅ ГОТОВО + +- [x] crt0 парсит ESTEX command-line из IX-prefix (inline asm в `runtime/crt0.s`) +- [x] Strip leading CP/M-style space (DSS quirk) +- [x] Передача `argc`/`argv` в main() через HL/DE (SDCC __sdcccall(1) ABI) +- [x] argv[0] = basename .EXE через ESTEX APPINFO ($47 subfn 2) +- [x] `runtime/crt0_minimal.s` — opt-out для очень маленьких программ +- [x] `runtime/crt0_banked.s` — теперь тоже парсит argv (parse_argv + get_progname скопированы из crt0.s; будет factored в argv.s когда возьмёмся за libsprinter.lib) +- [x] Bash-обёртка `bin/sprinter-cc`: `sprinter-cc -o foo.exe foo.c` одной строкой +- [x] Поддержка опций: `--memory`, `--memory-manual`, `--stack-size`, `--crt0=`, `--bank N=FILE.c`, `--debug`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` + +## Этап 8 — графика (320×256×256 + 640×256×16 + accel + bitmap font) ✅ ГОТОВО + +- [x] **8a** Graphics core: `gfx_init`/`gfx_done`/`gfx_clear`/`gfx_putpixel`/`gfx_pal_load`/`gfx_pal_set` (libc/gfx/gfx_core.c). Палитра через BIOS PIC_SET_PAL ($A4). Verified 320×256×256. +- [x] **8b** Линии/прямоугольники/fill через accelerator (libc/gfx/gfx_lines.c): `gfx_hline`/`gfx_vline` через accel Fill (LD C,C / LD E,E + SMC block-size), `gfx_rect`/`gfx_fill_rect` с heuristic выбором ориентации (h/v bursts count), `gfx_line` с Bresenham для диагоналей. `gfx_clear` тоже переписан на column-major accel (~4× быстрее). +- [x] **8c** 640×256×16 mode (libc/gfx/gfx_16.c): `gfx_*16` API, HIGH nibble = LEFT pixel (документация misleading), per-row RMW для vline (один байт = 2 горизонтальных пикселя). +- [x] **8d** Bitmap font + gfx_text (libc/gfx/gfx_text.c): шрифт через BIOS WIN_GET_ZG ($B8), interleaved layout `font[row*256+char]`, `gfx_text`/`gfx_putchar` для 320 mode, `gfx_text16`/`gfx_putchar16` для 640 mode с pair-table lookup. + +См. memory/sprinter_graphics.md, sprinter_accelerator.md, sprinter_graphics_16.md, sprinter_font_format.md. + +Открытые мелочи (не блокируют): +- [ ] Шрифт-quad для 640: per-cell палитра (mode 0x82 разрешает 1 из 4 палитр per 16×8 cell) — через прямой доступ к area-описания экрана 0x0300..0x039F + +## Auto-banking (см. `memory/banking_roadmap.md` для деталей) + +Phase 1 — file-level bin-packing — реализовывать когда проект перерастёт ~30 KB кода. + +- [ ] `toolchain/auto_bank.py`: + - Парсит размеры из `.rel`-файлов (или из .map после dry-run link'а) + - First-fit-decreasing bin-packing + - Уважает `#pragma codeseg BANKn` как manual override + - Перелинковывает с новыми `-Wl-b_BANKn=...` параметрами + - Печатает план распределения + +Phase 2-5: incremental rebalance, declarative `banks.toml`, function-level, call-graph-aware. Только если/когда понадобится. + +## Bank-local static data (mutable data в том же банке что и код) — ✅ ГОТОВО + +- [x] Пример `examples/bank_local_data/` — функция в BANK1 со своим writable BSS array + const table + malloc-тест +- [x] `mkexe -p 0` для нулевого padding банков (BSS-storage обнуляется при загрузке) +- [x] Канонический рецепт: `--codeseg BANK1 --constseg BANK1 --dataseg BANK1` для bank1.c + `-Wl-b_BANK1=0x1C000` для линковки. **`--dataseg BANK1` РАБОТАЕТ** — раньше казалось обратное из-за trampoline bug который маскировал результат. +- [x] **Критичный фикс trampoline'a в runtime/bank.s** — старый `pop af; out (n), a` клобберил A → все banked-функции возвращающие uint8_t тихо возвращали мусор. Новый `pop bc; out (c), b` сохраняет A. +- [x] **malloc из banked-функции работает прозрачно** — heap живёт в W2 (HOME), W2 никогда не свапается trampoline'ом, pointer валиден из любого контекста. См. memory/bank_local_data_pattern.md. +- [x] Документация в memory: `memory/bank_local_data_pattern.md` (полный рецепт + malloc + nuances), `memory/sdcc_banking.md` (trampoline fix) +- [ ] Опционально — расширить `check_banks.py` чтобы показывать разбивку size = code + const + bss per bank (cosmetic) + +Зачем: для модулей с большим private state (level loader, audio engine, scene data). Экономит W2 heap для динамики, а статика остаётся в бэке. + +## Подсказки из solid-c (нативный Sprinter C — `third_party/solid-c/`) + +После анализа solid-c'овской libc (см. `memory/solid_c_findings.md`) выявлены готовые паттерны для следующих недостающих функций. Приоритет от **высокого** к низкому: + +### High-priority gaps (легко портировать, большая польза) +- [x] **`errno` + `strerror`/`perror`** — табличка 32 ошибок (libc/io/errno.c) +- [x] **Расширенный `open()`** для O_CREAT/O_TRUNC/O_APPEND/O_EXCL state machine +- [x] **`atexit`** — 8-callback LIFO + `exit()` + `_exit()` (libc/io/atexit.c) +- [x] **`setjmp`/`longjmp`** — 6-байт jmp_buf={sp,ix,pc} (libc/io/setjmp.c) +- [x] **`sleep(seconds)`** — 50Hz halt-loop (libc/io/sleep.c) +- [x] **ESTEX ENV API** ($46, getenv/putenv) — libc/io/env.c. Учли doc-bug: реально A=0 это NOT FOUND + +### Medium-priority (нужно для shell-like утилит) +- [ ] **Mouse driver** — `rst $30h`, 17 функций. **Сначала тест что работает в MAME**. +- [x] **`ffirst`/`fnext` + ffblk_t struct** для directory listing — реализовано, demo: ls.exe +- [x] **`getdatetime`/`setdatetime`** через ESTEX $21/$22 — libc/io/time.c, demo: time_dir_test +- [x] **`chdir`/`getcwd`/`mkdir`/`rmdir`** — wrappers для ESTEX $1B-$1E — libc/io/fsdir.c +- [x] **conio: `kbhit`/`getch`/`getche`/`cputs`/`clrscr`/`gotoxy`** — реализовано +- [x] **conio extras**: `wherex`/`wherey` ($53), `wrchar`/`rdchar` ($58/$57), `textmode_get/set` ($50/$51), `clrscr_attr` ($56) + COLOR macros + +### Low-priority — ✅ FILE* stack ГОТОВО + +- [x] **Минимальный unbuffered FILE\*** — `libc/stdio/file.c` + `libc/include/stdio.h`. fopen/fclose/fputs/fgets/fread/fwrite/fseek/ftell/rewind/feof/ferror/clearerr/fflush + stdin/stdout/stderr как pseudo-streams. См. `memory/file_star_design.md` и `examples/filetest`. +- [ ] fprintf / fscanf — нужна printf-через-callback machinery. Пока пользователь может `sprintf(buf, ...) + fputs(buf, fp)`. +- [ ] Опциональный buffered mode (setvbuf, line/block buffering) — если когда-то понадобится. + +### POSIX time API — ✅ ГОТОВО +- [x] `libc/io/posix_time.c` — time/localtime/gmtime/mktime/asctime/ctime поверх getdatetime. SDCC's time.rel избегаем (нельзя override _RtcRead). См. `examples/ptime`. + +### sys/stat — ✅ ГОТОВО +- [x] `libc/io/stat.c` — POSIX stat/fstat. Гибрид open+fstat для файлов, ffirst+iter для папок (включая "."/".."). См. `examples/stattest` и `memory/estex_ffirst_dotdot.md`. + +### assert — ✅ ГОТОВО (используем SDCC's __assert через fallback include path) + +## libc/stdlib — ✅ не нужно делать (см. memory/sdcc_stdlib_works.md) + +Проверено через `examples/stdlib_test/`: SDCC z80.lib содержит работающие реализации: +- `atoi/atol/atof, strtol/strtoul, rand/srand, qsort/bsearch, abs/labs, div/ldiv` +- Полный `` (memchr/cmp/set/cpy, strcat/cmp/cpy/len/chr/spn/etc.) +- `` (toupper/tolower) +- `` (sinf/cosf/sqrtf/etc.) + +Линкер автоматически тянет из z80.lib когда нужно. **НЕ переписывать**. + +Наши Sprinter-specific обязательные модули остаются: atexit, env, errno, setjmp, putchar/puts/getchar, conio, fsdir, time, mouse, open/read/lseek/close. + +## Build-system: libsprinter.lib + sprinter-cc — ✅ ГОТОВО + +- [x] `lib/Makefile` — собирает каждый libc/*.c в `.rel`, архивирует через sdar в `lib/sprinter.lib` +- [x] Включает runtime/bank.s и runtime/heap.s (auto-pulled при __banked/malloc) +- [x] `bin/sprinter-cc` — bash-wrapper: `sprinter-cc -o foo.exe foo.c` одной строкой +- [x] Поддержка опций `--crt0=default|minimal|banked`, `--bank N=FILE.c`, `-I`, `-L`/`-E`/`-S`, `-Wl`, `--mkexe` +- [x] `examples/hello_sccc/` — демо: `hello.c` собирается за один shell-вызов, размер совпадает с ручным Makefile (925 байт) +- [x] Split `putchar.c` → `putchar.c` + `puts.c` для per-function granularity (puts override SDCC's z80.lib version) +- [x] Включён в `make all` (зависимость `lib` перед `examples`) + +Возможные улучшения (опционально): +- [ ] Мигрировать остальные examples на sprinter-cc вместо ручных Makefile (косметика) +- [ ] Дальнейшая декомпозиция libc/*.c per-function (но текущая granularity уже даёт нужный размер — линкер пакетует .rel целиком, и для большинства файлов это одна функция) + +## Этап 9 — memory modes для sprinter-cc + +DSS выделяет страницы памяти по размеру приложения: < 16 KB → одна страница, в остальные окна подключается «страница #FF» (read=0xFF, write игнорится). Из-за этого CODE-в-W1 + DATA-в-W2 для маленькой программы молча ломается. См. [memory/sprinter_memory_modes.md](../../.claude/projects/-Volumes-SAM8-Projects-DIY-Z80-Sprinter-C-Compiler/memory/sprinter_memory_modes.md). + +- [x] **`tiny`**: всё (CODE+DATA+стек) в W2. Default. Verified hello/argv/conio/malloc/file/etc. +- [x] **`--memory MODE` флаг в sprinter-cc**: parser + per-mode дефолты CODE_LOC/DATA_LOC, override через явные `--code-loc`/`--data-loc`. tiny работает; small/big/huge компилируются с warning'ом (runtime не готов). Реализовано 2026-05-30. +- [x] **`--memory-manual SPEC`**: парсит `CODE=W1|W2,DATA=W1|W2|SAME,BANKED=W1|W3`. Реализовано 2026-05-30. +- [x] **`small` runtime**: `runtime/crt0_small.s` использует ESTEX `$3D GETMEM` + `$3A SETWIN2` чтобы выделить и замапить W2-страницу ДО gsinit. **НЕ** BIOS `$C4` — стек на этом этапе в W1 (boot_stack в HOME), а BIOS требует стек в W2. После маппинга SP переключается на 0xBFFE, дальше стандартный flow. Реализовано 2026-05-30, verified hello.exe. +- [x] **`small` auto-detect для >16 KB программ**: `crt0_small.s` читает порт `0xC2` (текущая страница в W2 — не `0xA2`! это W1). Если 0xFF — выделяет page; иначе DSS уже сделала это (программа сама вылезла в W2). Один crt0 покрывает 0..30 KB. mkexe также разрешает HOME span W1+W2 (0x4000..0xBFFF). Verified hello: small (5 KB файл, SETWIN2 path) + 32 KB файл (auto-skip). Реализовано 2026-05-30. +- [x] **`big` runtime** (tiny + banked code в W1): параметризовали `crt0_banked.s` + `bank.s` через `.ifdef BANK_W1` — другой banking port (0xA2 vs 0xE2), другой load-addr (0x4000 vs 0xC000). sprinter-cc prepend'ит `BANK_W1 = 1` при `--memory big`, передаёт `mkexe -B 0x4000`. Пример `examples/banked_big/`. Реализовано 2026-05-30. +- [x] **`huge` runtime** (small + banked code в W3): merge W2-detect логики из `crt0_small.s` в `crt0_banked.s`. Существующий пример `examples/banked/` теперь использует MEMORY=huge. Реализовано 2026-05-30. +- [x] **`--debug` флаг**: prepend `DEBUG_RT = 1` в crt0 + `-DDEBUG_RT` в sdcc. Открывает symbol `_w2_self_allocated` (uint8_t) — runtime diagnostic кто аллоцировал W2. Реализовано 2026-05-30. + +### Дизайн-решения по libc и crt0 + +**Одна `sprinter.lib`** работает для всех memory mode — `.rel`-члены relocatable, SDLD делает dead-code elimination per-member (без графики не подтягивает `gfx_core.rel` и т.д.). Verified hello vs malloc_test через map-файлы. + +**`gfx.lib` отдельно — НЕ нужен**: dead-code elimination уже работает. + +**`libc_banked` (libc в bank вместо HOME)** — идея на потом, когда HOME (16 KB) забит user-кодом + libc в `huge` mode. Реализуется через `--codeseg BANK0` при компиляции libc; trade-off: trampoline ~30 циклов на каждый libc-вызов. Триггер: реальная программа упрётся в HOME budget. + +**HW-зависимые модули — `sprinter_home.lib` отдельно.** Часть libc физически не может быть забанкована в W3, потому что она РАБОТАЕТ с W3: +- `gfx_*` — пишет в видеопамять `0xC000+` после swap W3 на video page +- `bank_io` (mem_alloc_pages/bank_read/bank_write) — swap'ит W3 через `OUT (0xE2)` +- Будущие ISR — прерывание может прийти когда W3 на чём угодно + +В huge mode эти модули ДОЛЖНЫ остаться в HOME (W1). Когда будем делать `libc_banked`, **одновременно** выделяем `sprinter_home.lib` (HOME-only) из `sprinter.lib` (bankable). Финальная схема: +``` +sprinter_home.lib HOME-only: gfx, bank_io, ISR shims +sprinter.lib bankable: printf, malloc, string, conio, stdio, env, ... +sprinter_banked.lib тот же sprinter.lib но --codeseg BANK0 (для huge) +``` +Триггер: реализация `--memory huge` runtime. + +**crt0 — по одному на mode:** +- `crt0.s` — текущий, для **tiny/big**: SP=0xBFFE, парсит argv (W2-ресурс уже выделен DSS). +- `crt0_minimal.s` — текущий, для tiny без argv. +- `crt0_small.s` — **новый, step 3**: для **small/huge**, аллоцирует W2 через `mem_alloc_pages` ДО gsinit, маппит в порт `0xA2`, потом стандартный flow. +- `crt0_banked.s` — текущий, для **big**: trampoline-таблица для W3 банков, CODE в W2. +- `crt0_banked_small.s` — **новый**: huge = small (W2-alloc) + banked (W3 trampolines). + +sprinter-cc подбирает crt0 по `--memory` mode (сейчас `--crt0=` это override). +- [x] **Настраиваемый размер стека**: флаг `sprinter-cc --stack-size BYTES`. Wrapper генерирует `heap_top.s` с `___sdcc_heap_end = stack_top + 1 - stack_size`, отдельный .rel линкуется per-program. Default ≈1278 байт (heap_top=0xBB00) из `runtime/heap_top.s`. Реализовано 2026-05-30. + +Интерфейс: `sprinter-cc --memory [tiny|small|big|huge|manual] [--memory-manual SPEC] [--stack-size N] foo.c`. `--memory-manual` имеет смысл только с `--memory manual`. + +## Known issues / quirks + +- **ESTEX $46 ENV API**: ✅ работает. Док-ция в `DiskSyscalls.txt v1.6` ошибочно описывает return-status — A=0 это NOT FOUND, не FOUND. Зафиксировано в `memory/sprinter_platform.md`. + +## ОБЯЗАТЕЛЬНЫЕ ЗАДАЧИ ДЛЯ V2 (после релиза v1) + +### Turbo-C-style graphics API (BGI-like) — **MUST для v2** + +Расширить наш `gfx_*` API до уровня **Turbo-C ``** (BGI) для MS-DOS. +Программисты привыкшие к Turbo-C должны переносить графический код 1-в-1. + +**Что должно быть** (на основе Borland BGI): + +Setup/teardown: +- `initgraph()` / `closegraph()` — у нас сейчас `gfx_init`/`gfx_done`, добавить alias +- `getmaxx()` / `getmaxy()` — макрос на GFX_WIDTH-1 / GFX_HEIGHT-1 +- `cleardevice()` — alias to gfx_clear +- `getgraphmode()` / `setgraphmode()` — у нас get_videomode/set_videomode + +Color/palette: +- `setcolor(c)`, `getcolor()` — current draw color +- `setbkcolor(c)`, `getbkcolor()` — background color +- `setpalette(idx, c)` — палитра entry +- `getpalette(&info)` — read all palette + +Primitives (мы уже имеем эквиваленты — добавить BGI-имена как aliases): +- `putpixel(x, y, c)` — есть как gfx_putpixel +- `getpixel(x, y)` — нужно реализовать (RMW обратное — IN) +- `moveto(x, y)`, `lineto(x, y)`, `linerel(dx, dy)` — current point + line drawing +- `line(x1, y1, x2, y2)` — есть как gfx_line +- `rectangle(x1, y1, x2, y2)` — есть как gfx_rect (но другой API: x1,y1,x2,y2 vs x,y,w,h!) +- `bar(x1, y1, x2, y2)` — есть как gfx_fill_rect +- `bar3d(x1, y1, x2, y2, depth, topflag)` — новое: rect + 3d edges +- `circle(x, y, r)`, `arc(...)`, `ellipse(...)`, `pieslice(...)` — новые primitives +- `fillpoly()`, `drawpoly()` — полигоны +- `floodfill(x, y, border_color)` — заливка + +Text on graphics screen: +- `outtext(s)` / `outtextxy(x, y, s)` — есть как gfx_text (alias) +- `settextstyle(font, dir, size)` — multiple bitmap fonts +- `gettextsettings(&info)` +- `textwidth(s)` / `textheight(s)` — measure + +Image manipulation: +- `imagesize(x1, y1, x2, y2)` — bytes needed for getimage +- `getimage(x1, y1, x2, y2, buf)` — save rect to buffer +- `putimage(x, y, buf, op)` — paste back with COPY_PUT/XOR_PUT/AND_PUT/OR_PUT/NOT_PUT + +Clipping/viewport: +- `setviewport(x1, y1, x2, y2, clip)` — drawing clip rect +- `getviewsettings(&info)` +- `clearviewport()` +- `setactivepage(p)` / `setvisualpage(p)` — двойная буферизация (Sprinter имеет 2 screen) + +Line style: +- `setlinestyle(style, pattern, thickness)` — SOLID_LINE / DOTTED_LINE / etc. +- `getlinesettings(&info)` + +**Acceptance:** перенос типичной Turbo-C BGI программы (рисующей с использованием +moveto/lineto/circle/bar/setcolor) должен работать без существенных правок. + +**Notes:** +- BGI fonts (TRIPLEX/SANS_SERIF/GOTHIC) — у нас один BIOS font, остальные нужно + добавить (как bitmap data в lib) +- imagesize/getimage/putimage — самые востребованные для game/animation +- Active/visual page (двойная буферизация) — Sprinter поддерживает 2 graphics pages, + нужен API switching + +См. также `examples/` Turbo C 2.x BGIDEMO как reference что нужно. + +### IM2 Interrupt Handlers — **MUST для v2** + +User-задаваемые ISR через Z80 IM 2 mode. Нужны для: +- Timer ticks (50 Hz frame counter, плавная анимация) +- Music playback (AY, COVOX) +- Real-time games (input + game logic + render в interrupt-driven) +- Async keyboard / mouse handling + +**Status:** ОТЛОЖЕНО до v2. Полный research + design в `docs/im2_isr_design.md`. + +**Решение по архитектуре:** реализовать как отдельный memory mode `--memory im2` +(вместо того чтобы лезть во все существующие crt0). Detail'и в design-doc. + +**Резюме research'а** (полный текст в `docs/im2_isr_design.md`): +- Vector 0xFF — frame + keyboard + CBL. Disambiguation по портам 0x19 / 0xFE +- Mouse hardware-IRQ не приходит (на текущей плате) +- Vector table / ISR / stack ОБЯЗАНЫ быть в W2 (0x8000..0xBFFF) +- DSS имеет свой IM 2 handler — нужно chain'иться (иначе клавиатура / SYSTIME ломаются) + +### Прочие крупные пункты для v2 + +- [ ] **Audio API** — AY-3-8910 + COVOX через прерывания (требует IM2) +- [ ] **ISA-8 slot support** — ZX-Bus карты (sound, network, etc.) — требует IM2 + чтения portов + +## Прочие задачи (v1 backlog, не блокирующие) + +- [x] **#9: text I/O split (Turbo-C style)** — stdio (puts/printf/putchar) теперь fast no-attr через PCHARS/PUTCHAR. conio (cputs/cprintf/putch) применяет attr через textcolor/textbackground/textattr. KEEP_EXIST_ATTR → conio fallback на fast path. Verified в hello.exe. См. `memory/text_output_api_split.md`. Реализовано 2026-05-31. +- [x] **Mouse API полный** (резидентный driver, RST 30h) — все 14 функций обёрнуты (init/show/hide/refresh/read/goto/bounds/text_cursor/load_cursor/get_cursor/get/set_sensitivity/video_mode_changed). См. `memory/mouse_api.md`. Verified в MAME 2026-05-31. Sensitivity = divider (меньше = быстрее). +- [ ] Interrupt handlers — IM 2 vector table в HOME для user ISR'ов +- [ ] Поддержка `restore SP on EXIT` (паттерн из z88dk +pps) — проверить нужно ли +- [ ] CI: автоматически запускать MAME с `-aviwrite` для screenshot-сравнения, чтобы тесты примеров проходили без человека + +## Идеи на потом + +- Поддержка `` (есть в SDCC stdlib — нужно протестировать что наш crt0 совместим) +- `` через ESTEX SYSTIME (`$21`) и CMOS BIOS-функции +- ZX Spectrum-совместимый режим как отдельный target (для портирования спектрумовских программ) +- Поддержка ZX-Bus карт (sound, network, etc.) — нужны драйверы +- Profile-guided optimization tools (hot/cold detection) для крупных программ + +## Linker duplicate-symbol warnings (благоприятные, отфильтрованы) + +Когда мы сознательно overrides'им SDCC z80.lib функции собственной версией в `sprinter.lib`, `sdldz80` пишет `?ASlink-Warning-Definition of public symbol '...' found more than once`. Линкер берёт первое найденное определение (наше), поэтому поведение корректное — warning только noise. + +Текущие overrides: +- `_puts` — наша версия через PCHARS+\r\n vs SDCC posix puts +- `___sdcc_heap` — наш heap в W2 vs SDCC's стандартный +- `_asctime`, `_localtime` (и возможно другие из time) — наш `posix_time.c` через ESTEX SYSTIME vs SDCC's `time.rel` который зависит от `_RtcRead` + +**Текущее решение:** `bin/sprinter-cc` отфильтровывает warning-блок (warning + 2 follow-up `Library:` строки) из вывода `sdc + +c`. Через `-v` (verbose) всё показывается. Реализовано через awk-pipe. + +**Возможные улучшения:** +- Перейти на explicit `--nostdlib` + ручной список нужных модулей из z80.lib (string, math, stdlib без override'нутых) — убрать ИСТОЧНИК warning'ов, не маскировать +- Или: переименовать наши `_puts` → `_puts_sprinter` + alias через linker flag (не уверен что SDCC поддерживает) +- Или: оставить как сейчас (рабочее и benign) — приоритет низкий + +## TODO: проверить на реальном железе + +- [ ] **Port_Y banking trick** (`docs/part2/SprinterGraphics programming.txt`): + доку утверждает что после `OUT (0x89), Y` адреса 0xC000+0x400*N в окне W3 + маппятся на строки Y..Y+15 (одно программирование → 16 строк). + Empirical 2026-06-01 в MAME 0.283 этот trick **не работает** — пиксели + по адресам выше 0xC000+row_width уходят в невидимую область. Канонический + `docs/samples/plasma2.asm` тоже не использует banking, переустанавливает + Port_Y per row. + План: + 1. Получить доступ к реальному Sprinter + 2. Запустить тест dual-write (`_gfx_putpixel_raw` + второй write в `0xD000+x`) + 3. Если на железе видны двойные линии → бага MAME, открыть issue с + минимальным репро + 4. Если на железе тоже одна линия → документ неверный, удалить упоминание + из доки и просто оставить текущую реализацию (Port_Y per pixel) + 5. Если banking работает на железе → внедрить кэширование Port_Y в + `_gfx_putpixel_raw` (sentinel out-of-range, см. memory/gfx_port_y_banking.md) + + Связанный выигрыш для Bresenham (60-pixel диагональ) — около 8× меньше + OUT (0x89) операций, для `gfx_fill_rect 320x256` — 16× меньше. Не блокирует + release v1. + +## GFX: расширения по `docs/part2/accelerator_doc.txt` + +После прочтения детального accelerator doc выявлены незакрытые направления. +Сейчас в коде используется только горизонтальный/вертикальный Fill mode. + +### Quick wins для текущих primitives + +- [ ] **Заменить SMC на `LD A, (var)` для block-size**. Документ явно + разрешает `LD A, (HL)`, `LD A, (BC)`, `LD A, (DE)` (но не `LD A, r`). + Это уберёт SMC complexity в `gfx_lines.c:hfill_chunk/vfill_chunk` и + `gfx_16.c:g16_hfill_chunk`. Запрещено только register-to-register. +- [ ] **Кэширование block-size**. Документ показывает что accel запоминает + block size между bursts (см. `Horizontal_Line_Fill`: устанавливают + size + `LD B,B` отключение, потом включают Fill mode и используют + сохранённый size). Для `gfx_fill_rect` с 100 одинаковыми + строками — установить size 1 раз, а не 100. + +### Bank-prefix modes (port 0xE2 bits) + +Документ показывает три варианта банка видеостраницы помимо стандартного 0x50: + +| Bank byte | Effect | +|---|---| +| 0x50 | Normal write — пишется в shadow + видимый | +| 0x54 | "no copy in main shadow RAM" | +| 0x58 | **"FF is transparent"** — байт 0xFF при write оставляет background | +| 0x5C | both | + +Bank 0x58 объясняет почему mouse cursor рисуется с 0xFF-прозрачностью. +Это путь к **sprite-blending через accel block copy**: + +- [ ] **`gfx_set_bank_transparent(on)`** или флаг в `gfx_set_bank` для + выбора 0x50/0x58 при отрисовке sprite'ов +- [ ] Использовать в новом `gfx_blit()` чтобы по факту получать + transparent sprites через accel-копию + +### Block copy mode (sprite blit'ы) + +`LD L,L` (horizontal) и `LD A,A` (vertical) — режим копирования блока через +256-байтную accel memory. Это базис для blit'ов. + +- [ ] **`gfx_blit(src_data, x, y, w, h)`** — копирование sprite'а + (произвольный размер, через accel) +- [ ] **`gfx_blit_transparent(src, x, y, w, h)`** — с использованием bank 0x58 + +См. `Draw_Restangle_Data` в accelerator_doc.txt как референс. + +### AND / OR / XOR operations через accel + +Документ показывает что accel поддерживает логические операции с блоками +данных. Применения: +- XOR — инверсия области (выделение selection в UI) +- OR / AND — masking, alpha-style blending +- См. пример в accelerator_doc.txt: "256 bytes block coding via XOR" + +- [ ] **`gfx_xor_rect`** / **`gfx_or_rect`** / **`gfx_and_rect`** — + примитивы логических операций над прямоугольником +- [ ] **`gfx_invert_rect(x, y, w, h)`** — alias на xor с 0xFF + +### Bitmap fonts разных размеров + +Сейчас `gfx_text` / `gfx_putchar` хардкоженно работают с 8×8 шрифтом +(BIOS WIN_GET_ZG возвращает 256×8 байт). Для будущих UI / титульников +нужны: +- [ ] **`gfx_set_font_size(w, h)`** — переключить ширину/высоту glyph'а +- [ ] **`gfx_set_font_data(ptr, w, h, advance)`** — заменить указатель + на пользовательский шрифт + размеры +- [ ] Поддержка **proportional** (advance != w) шрифтов — добавить + array advance[256] на ширину каждого glyph'а +- [ ] **Big-font режимы**: 8×16, 16×16, 16×8 (для титульников) +- [ ] Возможно отдельный API `gfx_text_ex(x, y, str, font_id)` где + font_id выбирает один из загруженных шрифтов +- [ ] **Anti-alias 2-bit шрифты** (бит фон / бит граница / 2-бит alpha?) + — far future, для smooth UI + +## Финальный этап оптимизаций (не сейчас) + +- **`gfx_line` через accel для пологих диагоналей** — Bresenham для линии с |dy| << |dx| (или наоборот) выдаёт длинные runs одинакового Y (или X): пиксель, пиксель, пиксель, шаг Y, пиксель, пиксель... Каждый такой run — это готовый аргумент для `gfx_hline` (или `vline`). + План исследования: посчитать длину runs как функцию от наклона; решить минимальный run length, при котором выгоднее accel hline чем N×putpixel (overhead accel ~20µs, putpixel ~5µs — accel выгоднее при run ≥ 4-5 px); для крутых диагоналей (dx ≈ dy) оставить Bresenham, для пологих — run-length-based fill. + Сейчас `gfx_line` orthogonal cases уже через accel — оптимизировать только косые. + +- **`gfx_fill_rect` с одним W3-swap на всю операцию** — сейчас каждый внутренний `gfx_hline`/`gfx_vline` делает свой DI/save-W3/restore-W3/EI. Можно сделать internal `_fill_rect_inner` который держит W3 замапленным и DI весь цикл; ~20µs × количество строк/столбцов экономии. Применимо ко всем композитным примитивам. diff --git a/docs/converted/ARHITECT.txt b/docs/converted/ARHITECT.txt new file mode 100644 index 0000000..2328447 --- /dev/null +++ b/docs/converted/ARHITECT.txt @@ -0,0 +1,219 @@ + ▄▄▄▄▄▄ + ▄█░░░░░░ + █░░ █░░ + █░░▄▄▄█░░ + █░░░░░░░░ + █░░ █░░ + █░░ █░░ рхитектура компьютера Sprinter. + ▀░░ ▀░░ + + Введение. + + Данное описание предполагает наличие определенных знаний читателя, +а именно знание архитектуры компьютера ZX-Spectrum и их разновидностей, в +частности Pentagon-128 и Scorpion-256, а так же знание языка BASIC и +некоторое знакомство с языком ассемблера Z80. + Здесь я буду называть конфигурацией машины - конкретную реализацию +конкретной схемы в перепрограммируемой логической микросхеме (ППЛМ). +Это означает, что машина имеет множество конфигураций, каждая из которых +имеет свою схему. + Я так же использую понятие КЭШ-ОЗУ. Это не КЭШ в формальном +смысле, а быстрое ОЗУ, в котором процессор может работать на высокой +частоте без ожидания. КЭШ-ем это ОЗУ называется только по традиции, +подобно КЭШ-у на КР537РУ10 в компьютерах Pentagon-128. + + + Краткие данные компьютера Sprinter. + + Пpоцессоp . . . . . . . . . . . Z84C15 + Тактовая частота . . . . 21MHz/3.5MHz + ОЗУ . . . . . . . . . . . . . . 4096Kb + КЭШ ОЗУ . . . . . . . . . . . . . 64Kb + ПЗУ . . . . . . . . . . . . . . .128Kb + Видео-ОЗУ . . . . . . . . . 256Kb(512) + Контpоллеp дисков . . . . . Кp1818ВГ93 + Поддеpжка 1.44Mb фоpмата . . 3.5"диска + Контpоллеp винчестеpа . . . . . IDE/AT + Контpоллеp клавиатуpы . . . 101key/AT + Контpоллеp мыши . . . . . . . MS-Mouse + Два слота . . . . . . . стандаpт ISA-8 + Железная эмуляция AY-3-8910 стерео-OUT + COVOX . . . . . . . . . 8bit x 4chanel + Видео-pежимы: . . . Spectrum standart + GRAF 320x256x256,640x256x16, TXT 80x32 + Выход видео на TV или CGA монитоp, RGB + + + Техническая реализация. + + Ядром машины являются процессор Z84C15 и ППЛМ EPF10K10QC208. +Кроме них на плате присутствуют микросхемa ПЗУ, 72х-пиновый SIMM +на 4Mb, 256Kb видео-ОЗУ, 64Kb КЭШ-ОЗУ, схема контроллера дисковода на +БИС КР1818ВГ93, буферы для подключения джойстика, магнитофона, принтера, +клавиатуры, дисководов, винчестера, мыши, буферные микросхемы шины ISA-8 +и еще одна ППЛМ фирмы ALTERA - EPM7032LC44. Эта ППЛМ не меняет своей +конфигурации и предназначена для обеспечения синхронизации и начального +запуска компьютера. На плате так же предусмотрена возможность подключения +CMOS часов на основе микросхемы DALLAS. Кроме периферии и буферов имеются +микросхемы дешифрации, входы которых подключаются к процессору через ППЛМ. +Это позволяет легко менять адресацию устройств без какого либо изменения +разводки печатной платы. + + + Возможности архитектуры машины. + + Схема компьютеpа основана на большой пеpепpогpаммиpуемой логической +микpосхеме. Подключение периферийных устройств через ППЛМ позволяет получить +высокую гибкость машины по конфигурациям. + Пpогpаммиpование ППЛМ осуществляется непосpедственно в момент +включения, а так же пpи пеpезагpузке, что позволяет каpдинально менять +схему в ППЛМ непосpедственно во вpемя pаботы. Это сильно выделяет +архитектуру компьютера из ряда существующих компьютеров и поэтому многие +понятия, присущие обычным машинам, меняют свой смысл. Фактически компьютер +имеет изменяемую архитектуру, в которой возможны изменения во многих частях +схемы. Так, например, нельзя говорить о конкретных адресах портов +подключения периферии, так как они могут быть изменены в одну секунду +путем перепрограммирования ППЛМ и данных в ОЗУ, отвечающих за конфигурацию +портов. Конкретные адреса появляются только в конкретных конфигурациях, +например, такой как конфигурация ZX-Spectrum. + Перепрограммируемость схемы дает довольно большую свободу +фантазии программиста по конфигурации машины. Задумывая конкретную +работу программист может определить в какой конфигурации ее можно +сделать лучше, а, возможно, и придумать свою конфигурацию, которую +затем можно реализовать в ППЛМ и включить перед запуском этой программы. + + + Блочная схема компьютера Sprinter. + + ┌───────┐ ┌──────────────────────────────┐ ┌────────────>Sinc + │Принтер│ │ 2 ISA SLOTS │ │ ┌───────>R + ├───────┤ └───┬─┬─┬─┬─┬───────┬─┬─┬─┬─┬──┘ │ │ ┌─────>G + │ Мышь │ ┌───┴─┴─┴─┴─┴───────┴─┴─┴─┴─┴──┐ │ │ │ ┌───>B + └─┬─┬─┬─┘ │ Буферы и дешифраторы │ │ ┌─┴─┴─┴─┐ + │ │ │ └───┬──────────┬─┬──┬─┬────┬─┬─┘ │ │ ЦАП │ + │ │ │ │INT │ │ │ │ │ │ │ │ буфер │ + ┌──┴─┴─┴┬─┐ │ │ │ │ │ ┌┴─┴──────┴─┐└──┬─┬──┘ ┌────────┐ + │ Внутр │ ├────│──────────┘ └──│ │───┤ EPF10K10 ├───┘ └──────┤ видео │ + │ порты │ ├────│──────────DATA─│ │───┤ ├──V_DATA────┤ │ + ├───────┘ ├────│───┐ ┌─────────│ │───┤ ├────────────┤ ОЗУ │ + │ ├<───┘ │ │ │ │ │ │ │ │ + │ ├────────────────────┘ └───┤ ├────────────┤ │ + │ Z84C15 ├───────────────ADRESS─────┤ ├─V_ADRESS───┤ │ + │ ├────┐ ┌───────────────────┤ ├────────────┤ │ + │ │ │ │ │ │ │ │ │ │ + │ ├<───│ │─│ │──────────────>┤ ├──WE,CSi───>┤ │ + │ ├<───│ │─│ │────DIR───────>┤ │ └────────┘ + │ ├<───│ │─│ │──────────────>┤ ├───────> Audio OUTs + │ │ │ │ │ │ │ │ ┌────────┐ + │ │ ┌─┴─┴─┴─┴───────┐ │ ├────────────┤ MAIN │ + │ │ │ ПЗУ и КЭШ-ОЗУ ├<─ADR'─┤ ├──DATA──────┤ RAM │ + └─┬─┬─┬──┬┘ │ CS ├<─CS───┤ ├────────────┤ │ + │ │ │ │ └───────────────┘ │ │ │ SIMM │ + │ D │ │ ┌──────────────┐ │ ├────────────┤ │ + │ A │ │ │ EPM7032 ├───────>┤ ├──ADRESS────┤ │ + │ T │ └──>┤ Sinchro │ │ ├────────────┤ │ + │ A │ │ HDD_DIR ├<───────┤ │ │ │ + │ │ │ │ ФАПЧ ├<───────┤ ├─RAS,CAS,WE─┤ │ + │ │ │ └─┬─┬─┬─┬─┬────┘ │ │ └────────┘ + │ │ │ │ │ │ │ │ │ │ + ┌─┴─┴─┴────────┴─┴─┴─┴─┴───────┐ │ │ + │ Периферийные устройства ├<────┤ │ + │ FDD,HDD,KEMPSTON ├┤ │ + ┌────────┐ │ ┌────────┐ │ │ + │ TAPE ├<──┘ │Keyboard├─────────>┤ │ + │ in/out │ ├┬┬┬┬┬┬┬┬┤ │ │ + └────────┘ └┴┴┴┴┴┴┴┴┘ └───────────┘ + + Рисунок 1. + + + + Для простоты некоторые буферы и дешифраторы на схеме не указаны. +Количество Проводов в шинах так же условны. Часть сигналов управления +устройств с ППЛМ смультиплицированы с адресами SIMM-а. + + + Дальнейшее описание архитектуры является описанием конкретных +конфигураций и частей конфигураций. Но перед этим следует сказать несколько +слов о переключении самих конфигураций. + + Загрузка конфигураций. + + В момент включения компьютера, а так же после нажатия на RESET вся +информация, находившаяся в ППЛМ отвечающая за конкретную конфигурацию, +стирается. ППЛМ переходит в режим ожидания загрузки блока данных схемы. + В этот момент процессор полностью отключен от какой либо периферии. +В его адресное пространство памяти оказывается включена одна страница ПЗУ и +одна страница ОЗУ КЭШ-памяти. Любая запись в адресное пространство памяти +процессора в этот момент приводит к записи данных в ППЛМ и программа в +подключенной странице ПЗУ имеет только одну единственную цель - загрузить +в ППЛМ данные конфигурации. В этой же странице ПЗУ находятся данные +начальной конфигурации. (В данный момент это конфигурация Sprinter-1.) +Программа загрузки конфигурации проверяет флаг в КЭШ-памяти и, если он +установлен, загружает в ППЛМ данные из ОЗУ, если сброшен, то данные из +ПЗУ. На этом основано переконфигурирование схемы компьютера. + Для изменения схемы надо загрузить в последнюю страницу КЭШ-памяти +блок данных конфигурации со смещения #100 и выставить флаг, которым является +текстовая строка "FLEX_10K_LOADING", записанная по смещению #80 в этой же +странице КЭШ-а. После этого надо произвести полный сброс, который +осуществляется программно записью в специальную страницу памяти RESET_PAGE. +Программа в ПЗУ, запускаемая по сбросу находит флаг FLEX_10K_LOADING и +начинает загрузку данных в ППЛМ. При этом она одновременно затирает флаг, +что предотвращает повторную загрузку новой конфигурации при нажатии на +кнопку RESET и позволяет вернуться после "ручного" сброса в начальную +конфигурацию. Затирание флага так же избавляет от мучений в случае +подключения неправильной конфигурации во время экспериментов с программами. +Нажатие на RESET всегда вернет схему в начальную конфигурацию. + + Примечание: + Внутренняя информация блока данных ППЛМ является закрытой +информацией фирмы ALTERA. Кроме самих микросхем ППЛМ ALTERA поставляет +и программное обеспечение для разводки схем внутри ППЛМ. К сожалению, эта +программа не может работать на компьютере типа ZX-Spectrum и в ближайшем +обозримом будущем не предвидится ее версия для Sprinter-а. Поэтому +разработка новых конфигураций может производится только при наличии +достаточно мощной машины (все делалось на Pentium-166) и программы разводки +схем в ППЛМ, цена на которую составляет сотни долларов США. + В связи с этим, в данный момент Sprinter имеет несколько конкретных +конфигураций, две из которых записаны в ПЗУ, а остальные могут быть +подгружены с дискеты или винчестера. Постоянно ведется совершенствование +конкретных конфигураций и разработка новых. + + Конфигурация Sprinter-1. + + Включает в себя конфигурацию Spectrum-128/256, распределение памяти +до 4Mb, расширенный экран с режимами Spectrum, Text-80x32, Graf-320x256x256, +контроллер дисковода, контроллер IDE винчестера, контроллер клавиатуры AT, +подключенной как ZX-Keyboard, 8-bit COVOX. + Эта конфигурация максимально приближена к конфогурации ZX-Spectrum +и позволяет работать на обычных спектрумовских программах и постепенно +менять их под расширенные режимы экрана и памяти, а так же для работы с +новыми устройствами. + + Конфигурация Sprinter-2. + + Включает в себя конфигурацию Spectrum-128/256, распределение памяти +до 4Mb, расширенный экран с режимами Spectrum, Text-80x32, Graf-320x256x256, +контроллер дисковода, контроллер IDE винчестера, контроллер клавиатуры AT, +подключенной как ZX-Keyboard, Accelerator. + Конфигурация, как и Sprinter-1 приближена к спектрумовской, но +имеет более жесткие требования к программам по совместимости. Позволяет +использовать акселератор операций с основным и видео-ОЗУ. Акселератор +ускоряет операции пересылки блоков данных и заполнения ОЗУ одним байтом +до физического предела скорости основного ОЗУ. + В последней версии конфигурация Sprinter-2 не имеет Spectrum-овской +клавиатуры. Вместо нее из порта 0FEh считывается сканкод пришедший с +AT-клавиатуры. + + Конфигурация ZX-Spectrum-256/AY. + + Эта конфигурация максимально приближена к ZX-Spectrum-128/256 +и включает в себя схему музыкального сопроцессора AY-3-8910. В этой +конфигурации отсутствуют расширенные режимы экрана. + Вторая версия схемы AY включает в себя три генератора голосов, +генератор шума и регуляторы амплитуды. Генератор огибающей отсутствует. +Так же отсутствует возможность чтения из портов данных сопроцессора. + В третьей версии AY предполагается данные недостатки исключит \ No newline at end of file diff --git a/docs/converted/Architecture.txt b/docs/converted/Architecture.txt new file mode 100644 index 0000000..a3024d1 --- /dev/null +++ b/docs/converted/Architecture.txt @@ -0,0 +1,52 @@ +Архитектура компьютера Sprinter. + HYPERLINK "" \l "intro" Вступление.
 HYPERLINK "" \l "brief" Краткая характеристика компьютера Sprinter.
 HYPERLINK "" \l "realiz" Техническая реализация.
 HYPERLINK "" \l "loadconf" Загрузка конфигураций.
 HYPERLINK "" \l "config" Описание конфигураций модели Sprinter.
 HYPERLINK "" \l "allocate" Распределение основной памяти компьютера Sprinter.
 HYPERLINK "" \l "vaddress" Видео-область, графический и спектрумовский режимы адресации.
 HYPERLINK "" \l "vidalloc" Распределение видео ОЗУ.
 HYPERLINK "" \l "scrstruct" Структура экрана и его режимы.
 HYPERLINK "" \l "palette" Палитра.

Вступление

   Персональный компьютер Sprinter является универсальным компьютером на базе 8 битного процессора Z80 (Z84C1516PSC) фирмы Zilog. Основой компьютера является перепрограммируемая логическая матрица (ППЛМ) EP1K30QC208-3 фирмы ALTERA.
В настоящее время компьютер Sprinter использует плату Sp2000 в качестве материнской платы. Плата Sp2000 была разработана в конце 2000 года специально с возможностью обеспечения поддержки будущих моделей компьютера и имеет ряд конструктивных особенностей, использование которых нашло свое отражение в данном руководстве.

Вначале поясним основные понятия, которые вам будут встречаться.

Модель компьютера - набор конфигураций, зашитых в ПЗУ и определяющих возможности, доступные для пользователя. Современная модель компьютера Sprinter пока является единственной и носит тоже название.

Конфигурация компьютера - реализация конкретной схемы в перепрограммируемой логической микросхеме (ППЛМ). 

Основная конфигурация - конфигурация активная сразу после включения компьютера и содержащая в себе наиболее важные и часто используемые режимы работы данной модели компьютера.

Режим конфигурации - изменение характеристик работы компьютера в рамках конфигурации.

Быстрое ОЗУ - дополнительное ОЗУ, в котором процессор может работать на высокой частоте без тактов ожидания. 

Физический блок памяти - 16K блок основной памяти компьютера. Обозначается шестнадцатеричным числом -- #00..#FF

Логический блок памяти - 16K блок спектрумовской схемы распределения памяти. Обозначается десятичным числом - 0..15


Краткая характеристика компьютера Sprinter. +Процессор Z84C15 (21MHz/3.5MHz) +ОЗУ 4Mb +Быстрое ОЗУ 64Kb +ПЗУ 256Kb +ВидеоОЗУ 256Kb (512Kb) +Контроллер дисков Кp1818ВГ93 (аналог WD1793) +Поддержка дисководов: 3,5" диск (1.44Mb/720Kb) + 5,25" диск (720Kb) +Часы CMOS DALLAS +Контpоллеp винчестеpа IDE/AT +Контpоллеp клавиатуpы 101key/AT +Контpоллеp мыши MS Mouse +Два слота стандаpт ISA-8 +Аудио выход AY-3-8910 в ППЛМ, звуковой ЦАП (16 бит) +Видео выход Аналоговый CGA монитоp, RGB, ТВ со SCART. +Графические видеорежимы 320x256x256, 640x256x16, в стандарте Spectrum +Текстовые видеорежимы 80x32x16, 40х32х16 +
Техническая реализация.

   Ядром машины являются процессор Z84C15 и ППЛМ фирмы ALTERA - EP1K30QC208-3. Кроме них на плате присутствуют: микросхема ПЗУ, слот под 72-х-пиновый SIMM, видео ОЗУ, 64Kb Быстрого ОЗУ, схема контроллера дисковода на БИС КР1818ВГ93 (аналог WD1793), буферы для подключения джойстика, магнитофона, принтера, клавиатуры, дисководов, винчестера, мыши, буферные микросхемы шины ISA-8 и еще одна ППЛМ фирмы ALTERA -- EPM7064SLC100-10. Эта ППЛМ не меняет своей конфигурации и предназначена для обеспечения синхронизации и начального запуска компьютера. На плате так же предусмотрена возможность подключения CMOS часов - микросхемы DALLAS. 
   Кроме периферии и буферов имеются микросхемы дешифрации, входы которых подключаются к процессору через ППЛМ. Это позволяет легко менять адресацию устройств, без какого-либо изменения разводки печатной платы.

   Схема компьютера основана на большой перепрограммируемой логической микросхеме (ППЛМ). Подключение периферийных устройств через ППЛМ позволяет получить высокую гибкость машины по конфигурациям.

   Программирование (загрузка данных) ППЛМ осуществляется непосредственно в момент включения компьютера, а так же при перезагрузке, что позволяет кардинально менять схему в ППЛМ непосредственно во время работы. Это сильно выделяет архитектуру Sprinter-а из ряда существующих компьютеров, и многие понятия, присущие обычным машинам, меняют свой смысл. Фактически компьютер имеет гибкую архитектуру, в которой возможны изменения во многих частях схемы. Например, нельзя говорить о конкретных адресах портов подключения периферии, так как они могут быть изменены в одну секунду путем перепрограммирования ППЛМ и данных в ОЗУ, отвечающих за конфигурацию портов. Конкретные адреса появляются только в конкретных конфигурациях, например, в конфигурации ZX-Spectrum.

   Перепрограммируемость схемы дает большую свободу фантазии программиста по конфигурации машины. Задумывая конкретный проект, программист может определить в какой конфигурации его можно реализовать лучше, а, возможно, и придумать свою конфигурацию, которую затем можно реализовать в ППЛМ и включить перед запуском этой программы. + INCLUDEPICTURE \d "http://www.petersplus.ru/sprinter/pix/fig1.gif" \* MERGEFORMATINET 

рисунок 1. +Для упрощения схемы некоторые буферы и дешифраторы на схеме не указаны. Количество проводов в шинах так же условно.


Загрузка конфигураций.

   В момент включения компьютера, а так же после нажатия на RESET вся информация, находившаяся в ППЛМ и отвечающая за конкретную конфигурацию, стирается. ППЛМ переходит в режим ожидания загрузки блока данных схемы.

   В этот момент процессор полностью отключен от какой-либо периферии. В его адресное пространство памяти включено только ПЗУ и возможно подключение Быстрого ОЗУ. Любая запись в адресное пространство памяти процессора в этот момент приводит к записи данных в ППЛМ и программа в подключенной странице ПЗУ имеет только одну единственную цель - загрузить в ППЛМ данные конфигурации. В этой же странице ПЗУ находятся данные основной конфигурации. Программа загрузки конфигурации проверяет флаг в Быстром ОЗУ и, если он установлен, загружает в ППЛМ данные из Быстрого ОЗУ, если сброшен, то данные из ПЗУ. На этом основано переконфигурирование схемы компьютера.

   Для изменения схемы используется функция BIOS, которая загружает в Быстрое ОЗУ блок данных конфигурации и выставляет флаг в виде текстовой строки <>, после чего производится полный сброс, который осуществляется программно записью в специальную страницу памяти RESET_PAGE. Программа в ПЗУ, запускаемая по сбросу находит флаг <> и начинает загрузку данных в ППЛМ. Одновременно она затирает флаг, что предотвращает повторную загрузку новой конфигурации при нажатии на кнопку RESET и позволяет вернуться после "ручного" сброса в начальную конфигурацию. Затирание флага так же позволяет быстро вернуть схему в начальную конфигурацию в случае подключения неправильной конфигурации во время экспериментов с программами. 

   Внутренняя информация блока данных ППЛМ является закрытой информацией корпорации ALTERA. Кроме самих микросхем ППЛМ, эта корпорация поставляет и программное обеспечение для разводки схем внутри ППЛМ. К сожалению, разработка новых конфигураций может производится только при наличии компьютера, для которого создана программа разводки схем в ППЛМ -- MAX-Plus II. Версии программы для компьютера Sprinter не существует.

Описание конфигураций модели Sprinter.

   В современную модель компьютера Sprinter включено две конфигурации обеспечивающих все существующие возможности компьютера.

Конфигурация Sprinter.

   Эта конфигурация является основной для модели Sprinter. Включает в себя распределение памяти до 4Mb, графический экран с режимами разрешения 320х256 пикселей (256 цветов) и 640х256 пикселей (16 цветов). В обоих режимах доступна палитра в 16 млн. цветов. Также конфигурация включает в себя текстовые режимы 80х32 символов (16 цветов) и 40х32 символов (16 цветов). Кроме этого включены контроллер дисковода, контроллер IDE устройств, контроллер клавиатуры AT (построенный на внутреннем последовательном порте процессора), Акселератор, поддержка звукового ЦАПа в режиме 8 бит моно.
   Акселератор используется для операций с основным и видео ОЗУ, ускоряет операции пересылки блоков данных и заполнения ОЗУ одним байтом до физического предела скорости основного ОЗУ. Так же позволяет ускорить логическую обработку блоков данных по функциям AND, OR, XOR.

Конфигурация Spectrum.

   Данная конфигурация была создана для возможности использования программного обеспечения написанного для компьютера ZX Spectrum и некоторых его клонов.
   Конфигурация имеет возможность работать в нескольких режимах. Во всех режимах присутствует музыкальный сопроцессор AY-3-8910.

Режим Sprinter ZX.

   Данный режим является промежуточным, обеспечивающим доступ к возможностям Spectrum-а и к части возможностей Sprinter-а. Такое решение позволяет расширить возможности спектрумовских программ без существенного изменения кода. +Включен режим Scorpion 256 +Доступен звуковой ЦАП. +Доступен графический экран 320х256х256 и 640х256х16 +Доступен текстовый экран 80х32х16 +Доступны порты управления расширенной памятью (свыше 256Kb) +Акселератор не доступен +Режим ZX Spectrum.

   Данный режим обеспечивает 100% совместимость с оригинальной моделью ZX Spectrum.

Режим Pentagon 128.

   Режим самого популярного в России клона компьютера Spectrum с 128Kb. +Включена синхронизация экрана по стандарту Pentagon +Отключен доступ к портам управления расширенной памятью +Режим Scorpion 256.

   Режим одного из самых распространенных в России клона компьютера Spectrum с памятью 256Kb. +Включена синхронизация экрана по стандарту Scorpion +Отключен доступ к портам управления расширенной памятью +Режим Pentagon 512.

   Режим компьютера Pentagon с 512Kb. +Включена синхронизация экрана по стандарту Pentagon +Отключен доступ к портам управления расширенной памятью +Распределение основной памяти компьютера Sprinter.

   Структура распределения основной памяти компьютера Sprinter является двухуровневой.

   Основная память компьютера (4Mb) разделена на блоки по 16Kb, задаваемые однобайтовым номером. Адресное пространство процессора Z80 разделено на 4 окна с адресами #0000..#3FFF, #4000..#7FFF, #8000..#BFFF и #C000..#FFFF, которые для краткости принято называть окнами с номерами 0, 1, 2 и 3.

   Аналогичным образом на 16kb блоки разделено ПЗУ и Быстрое ОЗУ. Физический номер страницы ПЗУ имеет значения #E0..#EF, а Быстрого ОЗУ - #F0..#FF. Реально на данный момент для адресации Быстрого ОЗУ используются только 2 и 1 биты из этого номера. + INCLUDEPICTURE \d "http://www.petersplus.ru/sprinter/pix/fig2.gif" \* MERGEFORMATINET 

рисунок 2. +
   Схема распределения памяти позволяет подключить в адресное пространство процессора не только ОЗУ или ПЗУ, но и порты, и память ISA карт, вставляемых в слот. При подключении в адреса #C000..#FFFF через порт #1FFD расширенных страниц ОЗУ, на их место можно переадресовать слоты. Для этого надо просто записать в порт одной из этих страниц значение, соответствующее ISA-слоту, к которому необходимо произвести обращение. Это значение так же указывает, к чему ведется обращение, к портам или памяти слота (конкретные номера будут расписаны ниже).

   При подключении конфигурации Spectrum блоки памяти подключаются к логическим блокам спектрумовской схемы распределения памяти. 
   В каждом окне процессора располагается логический блок памяти согласно спектрумовскому распределению. В окно 0 подключено ПЗУ, в окно 1 - страница 5, в окно 2 -- страница 2, в окно 3 любая из страниц 0..7 для режима Pentagon-128, 0..15 для режима Scorpion-256 и 0..31 для режима Pentagon-512. Кроме этого, в режиме Scorpion-256 вместо ПЗУ может быть подключена логическая страница с номером 0.
   Каждый логический блок имеет свой собственный физический номер подключаемой в него страницы ОЗУ. Логические страницы с номерами 0, 2 и 5 имеют дублированные номера, один для жесткого подключения в окна 0, 1, 2 процессора, второй для подключения в окно 3. В режиме Спектрума номера физических страниц, выставленные в этих блоках, совпадают.
   В конфигурации Spectrum каждая страница ПЗУ или ОЗУ имеет свой порт, в котором указывается физический номер страницы. Всего таких портов страниц памяти 32 (в режиме Pentagon-512 добавляются еще 16 портов). 16 портов отвечают за номера страниц ОЗУ, подключаемые в третье окно процессора. Еще три порта отвечают за подключение страниц ОЗУ в окна 0..2. Восемь портов используются для подключения различных страниц ПЗУ. Один порт - для подключения страницы Быстрого ОЗУ вместо ПЗУ. И один порт - это порт системной страницы, подключаемой на место ПЗУ сразу после сброса машины по клавишам Ctrl+Alt+Del.
   Оставшиеся 3 порта страниц памяти остаются на данный момент в резерве. 

Видео-область, графический и спектрумовский режимы адресации.

   Запись в видео ОЗУ может осуществляться через два режима адресации видеопамяти.

   Первый режим адресации используется для вывода графики и текста в конфигурации Sprinter.
   Второй режим используется для задания знакогенераторов в текстовом режиме конфигурации Sprinter а также для вывода графики и текста в конфигурации Спектрума.
   Видео-область основного ОЗУ и видео-ОЗУ это два разных и физически отличающихся ОЗУ.
   Видео-область в основной памяти составляет 256Kb ОЗУ и соответствует страницам #50..#5F. При подключении этих страниц в любое окно процессора и при обращении к адресам этого окна мультиплексор адреса переключается в режим первого режима адресации. В этом режиме биты 3..0 номера страницы не влияют на адрес памяти, а определяют особый режим вывода, о котором будет сказано ниже. Адрес памяти в первом режиме адресации задается номером, засылаемым в RGADR (он же PORT_Y), о котором так же будет сказано ниже, и десятью младшими битами адреса процессора.
   Во втором режиме адресации видео-область основного ОЗУ располагается в адресах #4000..#5FFF и #C000..#DFFF для логических страниц 5 и 7. Любая физическая страница основного ОЗУ (кроме #50..#5F) подключенная к этим областям памяти процессора может стать видео-областью. В этом режиме нет привязки страницы основного ОЗУ к странице видео-ОЗУ. Последняя определяется через RGADR.

Распределение видео ОЗУ.

   Видео ОЗУ Спринтера является теневой памятью. Весь вывод в видео-ОЗУ производится параллельно с выводом в основное ОЗУ. При считывании из области видео данных считывается информация из видео области ОЗУ, а видео ОЗУ остается недоступным.
   Недоступность видео ОЗУ не является принципиальным ограничением. 

   Распределение видео-ОЗУ является частично жестким, частично программным.
   Жесткая часть распределения определяет где находится область описания режимов экрана и
данные палитры. Программное распределени определяет, где находятся данные для вывода в графических,
текстовых и спектрумовском режимах экрана, открываемых функциями BIOS.

   Современная модель компьютера Sprinter имеет в своем распоряжении 256К видео ОЗУ. Видео ОЗУ содержит в себе информацию, которую можно представить как видео экран размером 1024х256 байт. 
   Подобный видео экран разделен на несколько областей, границы которых принято обозначать порядковыми номерами байтов из первой линии длиной 1024 байта с #0000 по #03FF..
   Например, данные графической палитры находятся в видео ОЗУ с #03E0 по #03FF для первого цвета. Для последующих цветов в палитре нужно прибавлять 1024 для каждого цвета. + INCLUDEPICTURE \d "http://www.petersplus.ru/sprinter/pix/arch/vramarh.jpg" \* MERGEFORMATINET +  При использовании функций DOS данные графических экранов располагаются в интервале #0000..#02FF. + INCLUDEPICTURE \d "http://www.petersplus.ru/sprinter/pix/arch/vramsys.jpg" \* MERGEFORMATINET +
Первый графический экран - #0000..#013F 
Второй графический экран - #0140..#027F 
Знакогенераторы текстового режима - #02C0..#02FF
Область описания режимов экрана находятся в адресах - #0300..#039F.
Область #03A0..#03DF является зарезарвированной и не должна использоваться.
Данные графической палитры находятся с #03E0 по #03FF.

  При использовании функций BIOS данные графических и спектрумовских экранов располагаются в интервале #0000..#02FF. + INCLUDEPICTURE \d "http://www.petersplus.ru/sprinter/pix/arch/vramzx.jpg" \* MERGEFORMATINET +
Спектрумовский экран - #0000..#003F
Первый графический экран - #0040..#017F
Второй графический экран - #0180..#02BF
Знакогенераторы текстового режима - #02C0..#02FF
Область описания режимов экрана находятся в адресах #0300..#039F.
Область #03A0..#03DF является зарезарвированной и не должна использоваться.
Данные графической палитры находятся с #03E0 по #03FF. + INCLUDEPICTURE \d "http://www.petersplus.ru/sprinter/pix/arch/apxa.jpg" \* MERGEFORMATINET +Данные илюстрации демонстрируют различные структуры экрана + INCLUDEPICTURE \d "http://www.petersplus.ru/sprinter/pix/arch/apxb.jpg" \* MERGEFORMATINET + INCLUDEPICTURE \d "http://www.petersplus.ru/sprinter/pix/arch/apxc.jpg" \* MERGEFORMATINET +
  +
Структура экрана и его режимы.

   Видео система, схема которой записана в ППЛМ, позволяет управлять режимом вывода изображения. Управление осуществляется через запись данных в область описания режима экрана (#0300...#039F).
   Весь экран представляет собой набор из 56x39 (56x40) элементов, что соответствует телевизионному режиму 312 (320) полных линий на кадр.
   Видимая область составляет 40x32 элементов. Остальные элементы это бордюр, а также место обратного хода луча и синхроимпульсов.

  Любой из присутствующих на экране элементов может независимо содержать один из режимов вывода информации.

1. Текстовый режим 80 символов в строке, 32 строки, 16 цветов. Отличительной особенностью является возможность на одном экране иметь до 36 знакогенераторов, указываемых для каждого символа. 
2. Текстовый режим 40 символов в строке, 32 строки, 16 цветов. Используется только в конфигурации Spectrum.
3. Графический режим 320x256 точек, 256 цветов. Он же 8x8 точек 256 цветов на одно знакоместо. 
4. Графический режим 640x256 точек, 16 цветов. Он же 16x8 точек 16 цветов на одно знакоместо.

В данных режимах цвета выбираются из палитры 16 млн. цветов.


Палитра.

   На экран компьютера Sprinter могут одновременнно выводиться несколько окон 
с различными палитрами: четырьмя палитрами для графических окон и одной палитрой для текстовых окон.

   Палитра может включать любые 256 цветов из возможных 16 миллионов цветов.
Каждый цвет состоит из красного, зеленого и синего цветов различной интенсивности.
Информация о каждом цвете включает в себя три байта (и еще один байт зарезервирован и не используется сейчас).
Эти три байта считываются из области палитры в видео ОЗУ (#03E0..#03FE) и выводятся в три регистра с тремя ЦАП-ами на
выходе. Какие именно три байта выводить определяется схемой видео-системы. 
Номер линии соответствует номеру цвета для графического цветного режима или номеру атрибута для
текстового режима. 


   В графическом окне каждый пиксел может иметь один из 256 цветов одной из четырех палитр:

#03E0..#03E2 -- графичеcкая палитра 0
#03E4..#03E6 -- графичеcкая палитра 1
#03E8..#03EA -- графичеcкая палитра 2
#03EC..#03EE -- графичеcкая палитра 3

Примечание: в режиме экрана 640x256 пикселей каждый пиксел может иметь только 16 младших цветов из палитры.

   В текстовом окне каждое знакоместо может иметь четыре цвета:

#03F0..#03F2 -- текстовая палитра 0 -- цвет фона
#03F4..#03F6 -- текстовая палитра 1 -- цвет символа
#03F8..#03FA -- текстовая палитра 2 -- цвет мерцания фона
#03FC..#03FE -- текстовая палитра 3 -- цвет мерцания символа diff --git a/docs/converted/BIOS_v3.txt b/docs/converted/BIOS_v3.txt new file mode 100644 index 0000000..91fcdca --- /dev/null +++ b/docs/converted/BIOS_v3.txt @@ -0,0 +1,357 @@ +Функции BIOS v3.00 +Вызов функций BIOS осуществляется из ассемблерного кода.

    Номер функции задается в регистре C процессора. В остальные регистры, при необходимости, загружаются входные параметры функции. После исполнения функции происходит возврат в программу, из которой произошел вызов функции. Установленный флаг CF (CF=1) означает, что работа функции произошла с ошибкой. В некоторых регистрах передаются выходные параметры.

Ниже приведены таблицы входных и выходных параметров для каждой функции: + HYPERLINK "" \l "t01" Функции работы с памятью + HYPERLINK "" \l "t04" Функции управления 'железом' + HYPERLINK "" \l "t06" Функции управления окнами и режимами экрана + HYPERLINK "" \l "t07" Функции вывода текста на экран + HYPERLINK "" \l "t08" Графические функции + HYPERLINK "" \l "t11" Функции работы с жесткими дисками и дисководами +    При работе функций BIOS необходимо что бы стек находился в области 8000h..0BFFFh, так как часть функций использует переключение страниц PAGE1 и PAGE3.

Вызов функций BIOS возможен в различных конфигурациях компьютера Sprinter.

Конфигурация Spectrum: вызов функций BIOS осуществляется через 3D13h. При этом работают и все функции TR-DOS.

Конфигурации Sprinter: вызов функций BIOS осуществляется через RST 18h при подключенном системном ПЗУ.

Для постоянного подключения системного ПЗУ можно воспользоваться такой последовательностью команд: + + LD A,0 + OUT (07Ch),A +После ее исполнения в 0-м окне Z80 будет включено ПЗУ BIOSа и программа может вызывать функции BIOSа через RST 18h.

Отключение ПЗУ BIOSа из нулевого окна Z80 производится следующей последовательностью команд: + + LD A,0 + OUT (03Ch),A +При необходимости, функции BIOSа могут быть вызваны программой, находящейся в ОЗУ непосредственно в нулевом окне Z80. Для этого надо установить в адресе 0008h следующий код: + +ADDRESS_0008h: + PUSH AF + LD A,0 + OUT (7Ch),A + POP AF + RET +    После этого BIOS можно вызывать командой RST 8. (Функции TR-DOS, так же как и в случае RST 18 остаются недоступны.) Вызывая программы таким образом, через RST 8, следует помнить что адреса 3FFFh..0000h после входа в BIOS будут содержать код ПЗУ, поэтому, если фунция использует данные в ОЗУ, они должны находиться в других адресах.

    Оптимизация программы для RST 8 недопустима, так как в ПЗУ, для обратного переключения, стоит такая же программа, только порт 3Ch для отключения ПЗУ BIOSа.

    Вызов функций BIOS в exe-файлах, вызываемых с помощью операционной системы Estex, производится командой RST 8. Необходимая программа в адресе 0008h уже имеется в блоке кода ОС Estex.

 +Функции работы с памятью + +0C0h (192) EMM_FN0 Определение объемов ОЗУ + +Значение регистров на входе:
  C=0C0h +Значение регистров на выходе:
  HL - общий объем ОЗУ в страницах по 16k
  BC - объем свободного ОЗУ в страницах по 16k + +0C1h (193) EMM_FN1 Инициализация распределения памяти.
  Стирается вся информация о выделенных ранее блоках ОЗУ.
  Блоки с системной информацией и первые 256K ОЗУ объявляются занятыми. + +Значение регистров на входе:
  C=0C1h +Значение регистров на выходе:
  нет + +0C2h (194) EMM_FN2 Выделение блока ОЗУ + +Значение регистров на входе:
  C=0C2h
  B - число запрашиваемых страниц +Значение регистров на выходе:
  CF=0 - нормальное завершение - A - идентификатор блока
  CF=1 - ошибка - A=1 - не хватает памяти + +0C3h (195) EMM_FN3 Освободить блок ОЗУ + +Значение регистров на входе:
  C=0C3h 
  A - идентификатор блока +Значение регистров на выходе:
  CF=0 - нормальное завершение
  C - неправильный идентификатор
    идентификатор не всегда отслеживается правильно + +0C4h (196) EMM_FN4 Получить физический номер страницы из блока памяти + +Значение регистров на входе:
  C=0C4h
  A - идентификатор блока
  B - логическая номер страницы в блоке +Значение регистров на выходе:
  CF=0 - A - логический номер страницы
  CF=1 - ошибка:
      A=0 - блок не существует
      A=255 - запрашиваемый номер страницы слишком велик + +0C5h (197) EMM_FN5 Получить список физических страниц блока + +Значение регистров на входе:
  C=0C5h 
  A - идентификатор блока 
  HL - буфер 256 байт для размещения списка страниц +Значение регистров на выходе:
  CF=0 - нормальное завершение:
      B - число страниц в блоке
      HL - тот же адрес буфера, в буфере список физических страниц по порядку, заканчивающийся байтом 0FFh
  CF=1 - неверный идентификатор блока; старая информация в буфере может быть затерта + +0C6h (198) EMM_FN6 Получение адресов портов окон
 HYPERLINK "" \l "02" примечание по использованию + +Значение регистров на входе:
  C=0C6h 
  A - номер окна процессора - 0,1,2 или 3 +Значение регистров на выходе:
  CF=0 - нормальное завершение
      C - 8-битный адрес порта окна
      B - физический номер подключенной в окно страницы
  CF=1 - ошибка - неверный номер окна + +0C7h (199) EMM_FN7 Получить номер следующей страницы блока 
 HYPERLINK "" \l "03" примечание по использованию + +Значение регистров на входе:
  C=0C7h
  A - физическая страница +Значение регистров на выходе:
  CF=0 - нормальное завершение
      A - следуюшая физическая страница блока
      A=0FFh - индицирует конец блока
  CF=1 - ошибка - страница не принадлежит никакому блоку. фактически, это означает, что она свободна. + +09Eh (158) EMM_FN8 Слияние блоков + +Значение регистров на входе:
  A - идентификатор блока 1
  B - идентификатор блока 2 +Значение регистров на выходе:
  CF=0 - нормальное завершение
      A - идентификатор объединенного блока
  CF=1 - ошибка - неверный идентификатор блока + +09Dh (157) EMM_FN9 Разделение блока + +Значение регистров на входе:
  C=09Dh 
  A - идентификатор блока 
  B - новая длина блока +Значение регистров на выходе:
  CF=0 - нормальное завершение 
      A - идентификатор блока результата 
      B - идентификатор блока остатка 
  CF=1 - ошибка - неверный идентификатор блока + +Функции управления 'железом' + +0EFh (239) FN_VERSION Выдача информации о версии BIOSа и железа. + +Значение регистров на входе:
  C=0EFh 
  HL - буфер, куда будет помещена ASCII строка с несколькими полями, номером версии BIOS и названием модели компьютера. Конец строки отмечен двойным нулем. +Значение регистров на выходе:
  CF=0 - нормальное завершение 
      HL - тот же буфер с записанной строкой. 
      DE - версия BIOSа 
      BC - версия железа HYPERLINK "" \l "04" подробности ниже 
      A - количество полей в буфере (в данный момент - 2) 
          Первое поле - версия BIOS. 
          Второе - название модели компьютера. 
  CF=1 - ошибка - Очень старая версия, 
      не имеющая данной функции + +0F2h (242) FN_SICF=0 Установка синхронизации, очистка страницы режима экрана + +Значение регистров на входе:
  C=0F2h 
  A - режим синхронизации +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - неверный номер режима синхронизации + +0F5h (245) CMOS_TEST Проверить наличие CMOS 
 HYPERLINK "" \l "08" комментарий + +Значение регистров на входе:
  C=0F5h +Значение регистров на выходе:
  CF=0 - часы есть 
  CF=1 - часов нет + +0F6h (246) CMOS_RD Читать из регистра CMOS 
 HYPERLINK "" \l "08" комментарий + +Значение регистров на входе:
  C=0F6h 
  D - номер регистра CMOS +Значение регистров на выходе:
  A - считанные данные 
  CF=0 - часы есть 
  CF=1 - часов нет + +0F7h (247) CMOS_WR Писать в регистр CMOS 
 HYPERLINK "" \l "08" комментарий + +Значение регистров на входе:
  C=0F7h 
  D - номер регистра CMOS 
  A - записываемые данные +Значение регистров на выходе:
  CF=0 - часы есть 
  CF=1 - часов нет + +08Fh (143) FN_TURBO Функция управления турбо режимом. 
  HYPERLINK "" \l "09" комментарий + +Значение регистров на входе:
  C=08Fh 
  A - режим турбо: 2 - off, 3 - on 
  A - режим FDD: 12h - 720, 13h - 1.44 +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - неверный режим турбо + +Функции управления окнами и режимами экрана + +0B0h (176) WIN_OPEN Функция открытия окна. + +Значение регистров на входе:
  C=0B0h 
  IX - HYPERLINK "" \l "10" описатель окна 
  E - флаги окна: 
      бит 0 указывает какую страницу режима включать после исполнения функции;
      бит 4 указывает на какой странице режима открывать окно +Значение регистров на выходе:
  CF=0 - нормальное завершение: 
      A - HYPERLINK "" \l "17" идентификатор окна 
  CF=1 - ошибка слишком много окон + +0B1h (177) WIN_CLOSE закрытие окна + +Значение регистров на входе:
  C=0B1h 
  A - идентификатор окна +Значение регистров на выходе:
  CF=0 - успешное завершение 
  CF=1 - ошибка - неверный идентификатор 
      Окно с номером 0 никогда не закрывается и попытка закрытия приводит к ошибке + +0B2h (178) WIN_COPY_WIN Копирование данных текстового окна в память (запоминание окна) 
  При работе этой функции через RST 18h или RST 8, обязателен запрет прерываний, так как функция пользуется стеком для ускорения своей работы. + +Значение регистров на входе:
  C=0B2h 
  A - HYPERLINK "" \l "17" идентификатор глобального окна 
  H - размер окна в символах по вертикали 
  L - размер окна в символах по горизонтали 
  D - вертикальное положение окна в глобальном окне 
  E - горизонтальное положение окна в глобальном окне 
  IX - адрес буфера для запоминания данных 
      адрес буфера указывается для окна 0C000h если адрес указан с 8000h, номер страницы буфера не действителен ниже 8000h адрес указывать нельзя
  A' - страница буфера для данных окна 
      эта страница должна принадлежать программе +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка - неверный идентификатор окна + +0B3h (179) WIN_RESTORE_WIN Копирование из памяти в текстовое окно (восстановление окна) 
  При работе этой функции через RST 18h или RST 8, обязателен запрет прерываний, так как функция пользуется стеком для ускорения своей работы. + +Значение регистров на входе:
  C=0B2h 
  A - HYPERLINK "" \l "17" идентификатор глобального окна 
  H - размер окна в символах по вертикали 
  L - размер окна в символах по горизонтали 
  D - вертикальное положение окна в глобальном окне 
  E - горизонтальное положение окна в глобальном окне 
  IX - адрес буфера для запоминания данных 
      адрес буфера указывается для окна 0C000h если адрес указан с 8000h, номер страницы буфера не действителен ниже 8000h адрес указывать нельзя
  A' - страница буфера для данных окна 
      эта страница должна принадлежать программе +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка - неверный идентификатор окна + +0B4h (180) WIN_GET_SYM Взять символ с экрана + +Значение регистров на входе:
  C=0B4h 
  A - идентификатор окна 
  DE - положение символа в окне: 
      D - вертикаль, E - горизонталь +Значение регистров на выходе:
  CF=0 - нормальное завершение 
      L - символ, H - атрибут, 
      B - знакогенератор 
  CF=1 - ошибка неверный идентификатор окна + +0B5h (181) WIN_PUT_SYM Положить символ на экран + +Значение регистров на входе:
  C=0B5h 
  A - идентификатор окна 
  DE - положение символа в окне: 
      D - вертикаль, E - горизонталь 
  L - символ, H - атрибут символа 
  B - знакогенератор +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка неверный идентификатор окна + +0B6h (182) WIN_SET_ZG установка знакогенератора + +Значение регистров на входе:
  C=0B6h 
  A - системный номер знакогенератора 
  DE - указатель на 2Kb блок данных знакогенератора +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка (старая версия, нет функции) + +0B7h (183) WIN_MOVE_WIN Перемещение окна 
  При работе этой функции через RST 18h или RST 8, обязателен запрет прерываний, так как функция пользуется стеком для ускорения своей работы. + +Значение регистров на входе:
  C=0B7h 
  A - HYPERLINK "" \l "17" идентификатор глобального окна 
  H - размер HYPERLINK "" \l "15" локального окна по вертикали в символах 
  L - размер локального окна по горизонтали в символах 
  D - положение локального окна по вертикали в символах 
  E - положение локального окна по горизонтали в символах 
  IX - новое положение локального окна (подобно DE) +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка - неверный идентификатор окна + +0B8h (184) WIN_GET_ZG Получение знакогенератора + +Значение регистров на входе:
  C=0B8h 
  DE - адрес, куда будет загружено 2kb знакогенератора +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка (старая версия, нет функции) + +Функции вывода текста на экран + +081h (129) LP_PRINT_ALL Печать символов с атрибутом 
  На экран выводится строка из B одинаковых символов + +Значение регистров на входе:
  C=081h 
  A - символ 
  E - атрибут 
  B - число выводимых символов 
      регистры HL,IX - сохраняются +Значение регистров на выходе:
  CF=0 - всегда + +082h (131) LP_PRINT_SYM Вывод символов на экран без атрибута 
  На экран выводится строка из B одинаковых символов атрибут остается тот, который был на экране + +Значение регистров на входе:
  C=082h 
  A - символ 
  B - число выводимых символов 
      регистры HL,IX - сохраняются +Значение регистров на выходе:
  CF=0 - всегда + +083h (131) LP_PRINT_ATR печать атрибутов 
  На экран выводится строка из B одинаковых атрибутов. 
  Символы не меняются. + +Значение регистров на входе:
  C=083h 
  E - атрибут 
  B - число выводимых символов 
      регистры HL,IX - сохраняются +Значение регистров на выходе:
  CF=0 - всегда + +084h (132) LP_SET_PLACE Установка текущего знакоместа в окне 
  Позиция печати устанавливается в соответстии с регистром DE + +Значение регистров на входе:
  C=084h 
  E - положение символа по горизонтали 
  D - номер символа по вертикали 
      Превышение границ приводит не к ошибке, а к переустановке сначала, за вычетом полного размера окна +Значение регистров на выходе:
  CF=0 - всегда + +085h (133) LP_PRINT_LN Вывод строки символов на экран с текущего знакоместа + +Значение регистров на входе:
  C=085h 
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  E - атрибут, с которым будет выведена строка 
  B - длина выводимой строки +Значение регистров на выходе:
  CF=0 - всегда + +086h (134) LP_PRINT_LN2 Вывод строки символов на экран без атрибутов + +Значение регистров на входе:
  C=086h 
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  B - длина выводимой строки +Значение регистров на выходе:
  CF=0 - всегда + +087h (135) LP_PRINT_LN3 Вывод строки символов до разделителя 
  После разделителя выводятся пробелы, что бы вывести B символов + +Значение регистров на входе:
  C=087h 
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  E - атрибут, с которым будет выведена строка 
  B - длина выводимой строки 
  D - символ-разделитель, указывающий конец строки +Значение регистров на выходе:
  CF=0 - всегда + +088h (136) LP_PRINT_LN4 Вывод строки символов до разделителя, без атрибутов 
  символы из выводятся на экран, пока не встретится символ равный D, далее печатаются пробелы, как дополнение строки до B символов. Атрибуты не изменяются. + +Значение регистров на входе:
  C=088h 
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  B - длина выводимой строки 
  D - символ-разделитель, указывающий конец строки +Значение регистров на выходе:
  CF=0 - всегда + +089h (137) LP_CLS_WIN Очистка экрана 
  Выполнение произворится выводом пробелов с заданным атрибутом + +Значение регистров на входе:
  C=089h 
  DE положение HYPERLINK "" \l "15" локального окна 
  H - размер в символах локального окна по вертикали 
  L - размер в символах локального окна по горизонтали 
  B - атрибут очистки +Значение регистров на выходе:
  CF=0 - всегда + +08Ah (138) LP_SCROLL_UD Скроллинг части глобального окна вверх/вниз 
  Скроллируются полные строки глобального окна + +Значение регистров на входе:
  C=08Ah 
  B - тип скроллинга: 1 - вверх; 2 - вниз 
  D - начальная строка скроллинга 
  E - число скроллируемых строк +Значение регистров на выходе:
  CF=0 - всегда + +08Bh (139) LP_PRINT_LN5 Вывод строки символов на экран до разделителя 
  После разделителя вывод останавливается + +Значение регистров на входе:
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  E - атрибут, с которым будет выведена строка 
  B - максимальная длина выводимой строки 
  D - символ-разделитель, указывающий конец строки +Значение регистров на выходе:
  CF=0 - всегда + +08Ch (140) LP_PRINT_LN6 Вывод строки символов на экран до разделителя без атрибутов 
  После разделителя вывод останавливается. + +Значение регистров на входе:
  C=08Ch 
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  B - максимальная длина выводимой строки 
  D - символ-разделитель, указывающий конец строки +Значение регистров на выходе:
  CF=0 - всегда + +08Dh (141) LP_CLS_WIN2 Очистка экрана с указанием символа заполнения + +Значение регистров на входе:
  C=08Dh 
  DE положение HYPERLINK "" \l "15" локального окна 
  H - размер в символах локального окна по вертикали 
  L - размер в символах локального окна по горизонтали 
  B - атрибут очистки 
  A - символ очистки +Значение регистров на выходе:
  CF=0 - всегда + +08Eh (142) LP_GET_PLACE Получить текущее положение вывода на экран + +Значение регистров на входе:
  C=08Eh +Значение регистров на выходе:
  CF=0 - всегда 
  DE - координаты, в которых будет напечатан 
      следующий символ: 
      D - вертикаль, E - горизонталь + +Графические функции + +0A1h (161) PIC_POINT Установить точку + +Значение регистров на входе:
  C=0A1h 
  DE - координата по вертикали (пиксели) 
  HL - координата по горизонтали (пиксели) 
      Координаты считаются от верхнего левого угла экрана 
  A - идентификатор окна 
  B - цвет точки +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - неверный идентификатор окна + +0A4h (164) PIC_SET_PAL Установка палитры + +Значение регистров на входе:
  C=0A4h 
  HL - HYPERLINK "" \l "18" данные палитры 
  E - номер начального цвета 
  D - количество устанавливаемых цветов 
  B - маска при установке палитры. 
      Для нормального режима должнa быть 0FFh 
  A - 0..3 биты: 
        - значения 0..7 - номер палитры
        - значения 8..15 - зарезервированы 
      - 4..6 биты - зарезервированы (установить в 0) 
      - 7 бит: 
        - значение 0 - установить 
        - значение 1 - загрузить палитру в память +Значение регистров на выходе:
  CF=0 - всегда + +0A6h (166) SET_PAL_INIT Установка внутренней палитры + +Значение регистров на входе:
  C=0A6h 
  A - страница палитры 
  B - номер палитры: 
      B=1 - установка графической палитры 
      B=2 - установка спектрумовской палитры 
      B=3 - установка текстовой палитры CGA +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - неверный номер палитры + +Функции работы с жесткими дисками и дисководами + +50h,52h,53h (80,82,83) Зарезервированы + +Значение регистров на входе:
  нет +Значение регистров на выходе:
  нет + +51h (81) DRV_RESET Сброс контроллера и настройка на диск + +Значение регистров на входе:
  C=51h 
  A - номер и HYPERLINK "" \l "22" тип устройства
бит 7..4 - тип устройства:
  #0x - FDD
  #6x - RAM-DISK
  #8x - HDD
  #Cx - CD-ROM
бит 3..0 - номер устройства +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка, нет диска или нет устройства + +54h (84) DRV_VERIFY Проверка секторов 
  Проверка внутренняя на совпадение ECC + +Значение регистров на входе:
  C=54h 
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) 
  HL:IX - номер сектора (IX - младшая часть номера сектора)
  B - количество проверяемых секторов +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - проверка с ошибкой + +55h (85) DRV_READ Чтение с устройства + +Значение регистров на входе:
  C=55h 
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) 
  HL:IX - номер сектора (IX - младшая часть номера сектора) 
  B - количество секторов 
  DE - адрес буфера для данных +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка чтения 
  HL:IX - номер сектора + кол-во прочитанных секторов 
  DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) + +56h (86) DRV_WRITE Запись на устройства + +Значение регистров на входе:
  C=56h 
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) 
  HL:IX - номер сектора (IX - младшая часть номера сектора) 
  B - количество секторов 
  DE - адрес буфера данных для записи +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка записи 
  HL:IX - номер сектора + кол-во прочитанных секторов 
  DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) + +57h (87) DRV_DETECT Определение параметров устройства + +Значение регистров на входе:
  C=57h 
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) +Значение регистров на выходе:
  CF=0 - нормальное завершение 
      A - bit7=0 диск 720Кb 
              Bit7=1 диск 1.44Mb 
  CF=1 - нет устройства или нет носителя + +58h (88) DRV_GET_PAR Получить параметры носителя + +Значение регистров на входе:
  C=58h 
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) +Значение регистров на выходе:
  CF=0 - нормальное завершение 
      L - число секторов 
      H - число головок 
      DE - количество цилиндров 
          если HL=DE=0FFFFh - устройства нет 
      IX - размер сектора в байтах 
      B - доп. параметры для дискет: 
          бит7 - тип 1.44/720 
  CF=1 - нет устройства + +59h (89) DRV_SET_PAR Установить параметры носителя + +Значение регистров на входе:
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) 
  L - число секторов 
  H - число головок 
  DE - количество цилиндров 
  IX - размер сектора в байтах 
  B - доп. параметры для дискет 
      бит7 - тип 1.44/720 +Значение регистров на выходе:
  CF=0 - нормальное завершение + +5Ah (90) EXT_VERSION Номер версии дисковой спецификации. + +Значение регистров на входе:
  C=5Ah +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  D - версия
  E - модификация
  CF=1 - ошибка + +5Fh (95) DRV_LIST Список дисковых устройств + +Значение регистров на входе:
  C=5Fh
  IX - буфер для списка устройств +Значение регистров на выходе:
  CF=0 - нормальное завершение 
В буфере список дисков в формате:
IX+0 - размер заполненого буфера
IX+1 - кол-во устройств FDD
IX+2 - кол-во устройств HDD
IX+3 - кол-во устройств CD DRIVE
IX+4 - #00 - конец списка, иначе кол-во устройств нового типа + + +

Примечания и комментарии. 

Примечание по использованию функции получения адресов портов окон (0C6h). 

Cледует хотя бы один раз вызвать эти функции и сравнить адреса портов с теми, что используются в программе и, если они не совпадают, выдать соответствующее предупреждение. В данный момент эти порты таковы: PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h, PAGE3=0E2h 

Примечание по использованию функции EMM_FN7 (0C7h). 

Информация о распределении памяти хранится в виде RAM Allocation Table, похожей на дисковый FAT. Поэтому нахождение физического номера следующей страницы по предыдущему физическому номеру происходит значительно быстрее, чем поиск по увеличенному на единицу логическому номеру. 

Комментарий к функции FN_VERSION (0EFh). 

Значения регистра BC на выходе и соответствующая ему конфигурация + + BC=FFFF - Не определено + BC=FFFE - Конфигурация Spectrum, режим Sprinter ZX + BC=FFFD - Конфигурация Sprinter + BC=FFFC - Зарезервировано + BC=FFFB - Зарезервировано + BC=FFFA - Зарезервировано + BC=FFF9 - Зарезервировано +Иные значения BC - новые прошивки. 

Комментарий к функциям CMOS (0F5h-0F7h) 

Функции CMOS_RD, CMOS_WR, CMOS_TEST работают всегда. Если в машине нет микросхемы CMOS, то эмулируется ее память. Наличие микросхемы определяется функцией CMOS_TEST.

Комментарий к функции FN_TURBO (08Fh)

Переключение режима турбо может не произойти, если прошивка не поддерживает это переключение. При этом ошибки не происходит. Так же, переключение режима TURBO блокируется кнопкой "Turbo" в режиме Turbo-OFF 

Комментарий к функциям печати текста. 

Эти функции работают с текущим окном, которым всегда является последнее открытое окно. К графическому экрану функции печати текста не применимы.

Описатель окна. 

Для открытия окон используется 32-хбайтовый описатель окна (дескриптор), адрес которого указывается в регистре IX. + + IX - 32-хбайтовый описатель окна + (IX+0) - горизонтальный размер окна в знакоместах + (IX+1) - вертикальный размер в знакоместах + (IX+2) - положение окна по горизонтали на экране в знакоместах + (IX+3) - положение окна по вертикали на экране в знакоместах + (IX+4) - режим знакоместа + bit4=1 - text_mode bit4=0 - graf_mode + bit5=0 - 16, bit5=1 - 8 точек в знакоместе + graf_mode bit3..0 - не существенны + bit7..6 - номер палитры + text_mode bit7..6,3..0 - номер знакогенератора + исключение: bit7..6=B"11" - бордер + (IX+5) - дополнительный режим знакоместа + bit0=1 - указывает на включение спектрумовской + адресации экрана + (IX+6) - положение по X в поле графики (по знакоместам) + (IX+7) - положение по Y в поле графики (по знакоместам) + разъяснения о положении в поле графики - ниже + (IX+8..31) - зарезервировано (переменные окна) + в этих байтах должны быть нули +При открытии окна описатель копируется в системную страницу ОЗУ и программа может не сохранять его. Что бы описатель окна не потерялся, программа получает идентификатор окна. Он же идентификатор глобального окна. В функциях запоминания, восстановления, перемещения, а так же функциях стирания, скроллинга и т.п. идентификатор окна определяет область экрана, относительно которой производится работа с локальными окнами. Подразумеваются локальные окна в смысле "окно в окне". Идентификатор окна определяет глобальное окно, отнoсительно которого адресуются локальные. В части функций глобальное окно определяется по умолчанию, как последнее, с которым производились действия с явным указанием идентификатора.

В данный момент BIOS хранит только один описатель окна - последний, с которым была произведена функция открытия. Идентификатор окна выставляется в 0. В дальнейшем планитруется разработка функций со множеством окон, потому, во избежание неприятностей в будущем, при работе с окнами, программисту следует запоминать идентификатор окна и пользоваться этим значением при работе с ним. 

Типы стандартных окон: + + 0 - окно 32x24 в формате ZX Spectrum + 1 - текстовое окно 64x24 + 2 - текстовое окно 40x32 + 3 - текстовое окно 80x32 + 4 - окно в формате ZX Spectrum, HL - положение окна на экране в знакоместах + 5 - текстовое окно 64x24, HL - положение окна на экране в знакоместах + 6 - текстовое окно 40x32, HL - положение окна на экране в знакоместах + 7 - текстовое окно 80x32, HL - положение окна на экране в знакоместах + 8 - графическое окно 0, HL - положение окна на экране + 9 - графическое окно 1, HL - положение окна на экране +
Данные палитры должны представлять собой список приблизительно такого вида: + + DB blue1,green1,red1,0 + DB blue2,green2,red2,0 + ..................... + DB blueN,greenN,redN,0 +N - количество цветов. Значеное равное 0 соответствует 256-ти цветам. При записи в видео-ОЗУ все данные предварительно проходят функцию AND со значением регистра маски - B.

Страницы палитры 0..3 соответствуют графическим режимам. Для вывода в соответствующей палитре нужно задать соответствующее значение bit7..6 в байте HYPERLINK "" \l "19" режима знакоместа

Страницы 4..7 соответствуют текстовому режиму и спектрумовскому режиму. В странице 4 задается цвет PAPER для каждого атрибута. В странице 5 задается цвет INK для каждого атрибута. В странице 6 задается цвет PAPER, которым он будет моргать в режиме FLASH В странице 7 задается цвет INK, которым он будет моргать в режиме FLASH. Таким образом, для каждого из 256-ти атрибутов задается четыре цвета если цвета 4,5 совпадают с цветами 6,7 то режим FLASH оказывается отключенным. Для его включения в спектрумовском режиме надо поменять местами цвета 6 и 7. Если надо включить FLASH в режим IBM-CGA, следует установить цвета 6 и 7 одинаковыми и равными цвету 4. По сути режим FLASH всегда включен, и на экране постоянно меняются цвета PAPER с 4-го на 6-й, а цвета INK с 5 на 7-й. Если эти пары цветов для атрибута знакоместа устанавливаются одинаковыми, то FLASH в этом месте не виден.


Комментарий к функциям работы с устройствами хранения информации. 

В этих функциях в регистре A обычно задается номер и тип устройства: + + бит 0..3 - номер устройства + бит 4..7 - тип устройства: + 0 - дисковод + 6 - ram-disk + 8 - HDD + C - CD-ROM + остальные номера не используются +А так же задаются: старшая часть номера сектора в регисте HL, младшая часть номера сектора в регистре IX. diff --git a/docs/converted/DiskSyscalls.txt b/docs/converted/DiskSyscalls.txt new file mode 100644 index 0000000..58dfd5a --- /dev/null +++ b/docs/converted/DiskSyscalls.txt @@ -0,0 +1,421 @@ +Системные вызовы дисковой подсистемы (DSS) v1.6 +Системные вызовы + + +   Если программа выполняет не только некую математическую задачу на ассемблере, то в ней придется столкнуться с такими вещами, как получение ввода пользователя, выполнение вывода результатов и завершение своей работы. Для этого, необходимо обратиться к сервисам DSS. Фактически, программирование на языке ассемблера одинаково для любых систем, если не пользоваться их сервисами.
   Вызов функций DSS в системе Estex выполняется из ассемблера. Необходимые параметры указываются в различных регистрах, регистр C используется для указания номера функции.

Так, наша программа для Estex будет выглядеть наподобие: + + ORG #8100 ;адрес точки входа + + LD HL,MSG ;сообщение для вывода + LD C,5Ch ;номер системного вызова (PCHARS) + RST 10h ;вызов подсистемы + + LD C,41h ;номер системного вызова (EXIT) + RST 10h ;вызов подсистемы + +MSG db "Hello, world!",0Dh,0Ah ;наша стока + db 0 ;конец строки + +Следом за таблицей есть пояснение по двум новым функциям 0Ch и 0Dh. +Далее идет список категорий функций DSS для системы Estex + HYPERLINK "" \l "version" Функции идентификации системы + HYPERLINK "" \l "disk_io" Функции для работы с диском + HYPERLINK "" \l "file_io" Функции для работы с файлами + HYPERLINK "" \l "date_time" Функции для работы с датой и временем + HYPERLINK "" \l "memory" Функции управления памятью + HYPERLINK "" \l "keyboard" Функции ввода с клавиатуры + HYPERLINK "" \l "execute" Функции для исполнения программ + HYPERLINK "" \l "cmdline" Функции для работы со строками и командной строкой + HYPERLINK "" \l "var" Функции для работы с переменными + HYPERLINK "" \l "screen" Функции работы с экраном + HYPERLINK "" \l "printer" Функции для печати на принтере + HYPERLINK "" \l "tocversion" Функции идентификации системы
 + +00h (00) VERSION (Версия DSS) + +Входные значения:
C - 00h +Выходные значения:
D - номер версии
E - модификация + + HYPERLINK "" \l "tocdisk_io" Функции для работы с диском
 + +01h (01) CHDISK (Смена текущего диска) + +Входные значения:
A - номер диска (0-A,1-B...)
C - 01h +Выходные значения:
A - код ошибки, если CF=1
A - максимальный номер диска, если CF=0 + +02h (02) CURDISK (Номер текущего диска) + +Входные значения:
C - 02h +Выходные значения:
A - код ошибки, если CF=1
A - текущий номер диска (0-A,1-B...), если CF=0 + +03h (03) DSKINFO (Информация о диске) + +Входные значения:
A - номер диска (0-A,1-B...0FFh-текущий)
C - 03h +Выходные значения:
A - код ошибки, если CF=1
A - размер кластера в секторах, если CF=0
HL - общее кол-во кластеров
DE - свободных кластеров
BC - размер сектора в байтах + +09h (09) BOOTDSK (Номер системного диска) + +Входные значения:
C - 09h
B = 0 +Выходные значения:
A - код ошибки, если CF=1
A - номер системного диска (0-A,1-B...), если CF=0 + + HYPERLINK "" \l "tocfile_io" Функции для работы с файлами
 + +0Ah (10) CREATE (Создание файла) + +Входные значения:
HL - указатель на файловую спецификацию
A - атрибут файла
C - 0Ah +Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0 + +0Bh (11) CREATE NEW FILE (Создание нового файла) + +Входные значения:
HL - указатель на файловую спецификацию
A - атрибут файла
C - 0Bh +Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0 + +0Eh (14) DELETE (Удаление файла) + +Входные значения:
HL - указатель на файловую спецификацию
C - 0Eh +Выходные значения:
A - код ошибки, если CF=1 + +10h (16) RENAME (Переименование файла) + +Входные значения:
HL - указатель на старое имя файла
DE - указатель на новое имя файла
C - 10h +Выходные значения:
A - код ошибки, если CF=1 + +11h (17) OPEN (Открытие файла) + +Входные значения:
HL - указатель на файловую спецификацию
A - режим доступа
A=0 чтение/запись
A=1 чтение
A=2 запись
C - 11h +Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0 + +12h (18) CLOSE (Закрытие файла) + +Входные значения:
A - файловый манипулятор
C - 12h +Выходные значения:
A - код ошибки, если CF=1 + + +13h (19) READ (Чтение из файла) + +Входные значения:
A - файловый манипулятор
HL - адрес в памяти
DE - количество читаемых байт
C - 13h +Выходные значения:
A - код ошибки, если CF=1
DE - реальное количество прочитанных байт
если CF=0:
A = 0 прочитаны все байты
A = 0FFh прочитано меньшее число байт + +14h (20) WRITE (Запись в файл) + +Входные значения:
A - файловый манипулятор
HL - адрес в памяти
DE - количество записываемых байт
C - 14h +Выходные значения:
A - код ошибки, если CF=1
DE - реальное количество записанных байт + +15h (21) MOVE_FP (Перемещение указателя в файле) + +Входные значения:
A - файловый манипулятор
HL:IX - смещение указателя в файле
B - способ перемещения:
B=0 от начала файла
B=1 от текущего значения указателя
B=2 от конца файла
C - 15h +Выходные значения:
A - код ошибки + если CF=1
HL:IX - новое значение указателя + +16h (22) ATTRIB (Получение/изменение атрибута файла) + +Входные значения:
HL - указатель на файловую спецификацию
B - режим доступа
B = 0 получить атрибут
B = 1 установить атрибут
A - атрибут файла
C - 16h +Выходные значения:
A - код ошибки, если CF=1
A - атрибут файла, если CF=0 + +17h (23) GET_D_T (Информация о дате и времени файла) + +Входные значения:
A - файловый манипулятор
C - 17h +Выходные значения:
A - код ошибки, если CF=1
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды + +18h (24) PUT_D_T (Изменение даты и времени файла) + +Входные значения:
A - файловый манипулятор
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - 18h +Выходные значения:
A - код ошибки, если CF=1 + +19h (25) F_FIRST (Поиск первого совпадающего файла) + +Входные значения:
HL - указатель на файловую спецификацию
DE - рабочий буфер 44 байта, если B=0, иначе 256 байт
A - атрибуты, используемые при поиске
B = 0 - имя найденного файла в формате 11 байт "FilenameExt"
B = 1 - имя найденного файла в формате DOS "filename.ext",0
C - 19h +Выходные значения:
A - код ошибки, если CF=1 + +1Ah (26) F_NEXT (Поиск следующего совпадающего файла) + +Входные значения:
DE - указатель на рабочий буфер
C - 1Ah +Выходные значения:
A - код ошибки, если CF=1 + + + + +1Bh (27) MKDIR (Создание каталога) + +Входные значения:
HL - указатель на файловую спецификацию
C - 1Bh +Выходные значения:
A - код ошибки, если CF=1 + +1Ch (28) RMDIR (Устранение каталога) + +Входные значения:
HL - указатель на файловую спецификацию
C - 1Ch +Выходные значения:
A - код ошибки, если CF=1 + +1Dh (29) CHDIR (Смена текущего каталога) + +Входные значения:
HL - указатель на файловую спецификацию
C - 1Dh +Выходные значения:
A - код ошибки, если CF=1 + +1Eh (30) CURDIR (Информация о текущем каталоге) + +Входные значения:
HL - буфер в памяти 256 байт
C - 1Eh +Выходные значения:
A - код ошибки, если CF=1 + + HYPERLINK "" \l "tocdate_time" Функции для работы с датой и временем
 + +21h (33) SYSTIME (Текущая дата и время) + +Входные значения:
C - 21h +Выходные значения:
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - день недели + +22h (34) SETTIME (Установить текущую дату и время) + +Входные значения:
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - 22h +Выходные значения:
A - код ошибки, если CF=1 + + HYPERLINK "" \l "tocmemory" Функции управления памятью
 + +38h (56) SETWIN (Подключение страницы памяти) + +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
H - биты 6 и 7 задают номер окна, в которое будет подключена страница
C - 38h +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 + +39h (57) SETWIN1 (Подключение страницы памяти в первое окно) + +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 39h +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 + +3Ah (58) SETWIN2 (Подключение страницы памяти во второе окно) + +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 39h +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 + +3Bh (59) SETWIN3 (Подключение страницы памяти в третье окно) + +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 3Bh +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 + +3Ch (60) INFOMEM (Информация о памяти) + +Входные значения:
C - 3Ch +Выходные значения:
HL - общее количество страниц
BC - количество свободных страниц + +3Dh (61) GETMEM (Выделение блока памяти) + +Входные значения:
B - размер блока в страницах по 16 килобайт
C - 3Dh +Выходные значения:
A - код ошибки, если CF=1
A - идентификатор блока памяти, если CF=0 + +3Eh (62) FREEMEM (Освобождение блока памяти) + +Входные значения:
A - идентификатор блока памяти
C - 3Eh +Выходные значения:
A - код ошибки, если CF=1 + +3Fh (63) SETMEM (Изменение блока памяти) + +Входные значения:
A - идентификатор блока памяти
B - новый размер блока
C - 3Fh + +Выходные значения:
A - код ошибки, если CF=1 + + HYPERLINK "" \l "tockeyboard" Функции ввода с клавиатуры
 + +30h (48) WAITKEY (Ожидание символа с клавиатуры) + +Входные значения:
C - 30h +Выходные значения:
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +31h (49) SCANKEY (Опрос клавиатуры без ожидания) + +Входные значения:
C - 31hВыходные значения:
ZF = 1 - нет клавиш
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +32h (50) ECHOKEY (Ожидание символа с клавиатуры с печатью) + +Входные значения:
C - 32h +Выходные значения:
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +33h (51) CTRLKEY (Получить состояние клавиатуры) + +Входные значения:
C - 33h +Выходные значения:
A = 0 - нет символов в буфере
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +35h (53) K_CLEAR (Очистить буфер клавиатуры и выполнить функцию) + +Входные значения:
B - номер фун +ции 30h, 31h, 32h, 33h или 34h
C - 35h +Выходные значения:
В зависимости от указанной функции в регистре B. + +36h (54) K_SETUP (Управление настройками клавиатуры) + +Входные значения:
B - номер подфункции
C - 36h

B = 0, установить раскладку клавиатуры
A - номер раскладки +0 - normal
1 - shift
2 - caps lock
3 - caps lock + shift
4 - normal (альтернативная кл.)
5 - shift (альтернативная кл.)
6 - caps lock (альтернативная кл.)
7 - caps lock + shift (альтернативная кл.) +B = 1, получить состояние звуковых переменных
B = 2, установить звуковые переменные
A - значение переменной
bit0 - сигнал переполнения буфера клавиатуры
bit1 - сигнал переключения на альтернативную раскладку клавиатуры +Выходные значения:
В зависимости от указанной функции в регистре B. + +37h (55) TESTKEY (Опрос буфера клавиатуры) + +Входные значения:
C - 37h +Выходные значения:
ZF = 1 - нет символов в буфере
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt + + HYPERLINK "" \l "tocexecute" Функции для исполнения программ
 + +40h (64) EXEC (Выполнить файл) + +Входные значения:
HL - указатель на файловую спецификацию
B = 0 - загрузить и выполнить программу
C - 40h +Выходные значения:
A - код ошибки, если CF=1
A - код завершения, если CF=0 + +41h (65) EXIT (Завершение программы) + +Входные значения:
B - код завершения
C - 41h +Выходные значения:
A - код ошибки, если CF=1
A - код завершения, если CF=0 + +42h (66) WAIT (Получить код завершения программы) + +Входные значения:
C - 42h +Выходные значения:
A - код завершения + + HYPERLINK "" \l "toccmdline" Функции для работы со строками и командной строкой
 + +43h (67) GSWITCH (Выделить параметр командной строки) + +Входные значения:
HL - указатель командной строки
DE - буфер для выделяемого параметра
C - 43h +Выходные значения:
HL - указатель на следующий параметр командной строки
CF = 0 - конец строки не достигнут (есть другие параметры)
CF = 1 - конец строки (в буфер перенесён последний параметр или ноль) + +44h (68) DOSNAME (Преобразовать имя файла) + +Входные значения:
C - 44h
B = 0, преобразовать из 11 символьного формата в формат ДОС
HL - 11 символов имени файла
DE - буфер для имени в формате ДОС
B = 1, преобразовать из формата ДОС в 11 символьный формат
HL - имя файла в формате ДОС
DE - 11 символов имени файла +Выходные значения:
A - код ошибки, если CF=1 + +45h (69) EXCMDLN (Разбор командной строки) + +Входные значения:
HL - указатель командной строки
DE - указатель на буфер пользователя
C - 45h
B - номер подфункции: +0 - Разобрать строку;
1 - Выделить имя диска;
2 - Выделить директорию;
3 - Выделить имя файла;
4 - Выделить расширение файла;
5 - Выделить имя диска, путь к файлу, имя файла и расширение файла;
6 - Зарезервирована;
7 - Выделить параметр командной строки;
8 - Преобразовать из 11 символьного формата в формат ДОС;
9 - Преобразовать из формата ДОС в 11 символьный формат; + +Подфункция 0 - Разобрать строку: + +Входные значения:
HL - указатель командной строки
C - 45h
B = 0 - Разобрать строку +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла; + +Подфункция 1 - Выделить имя диска: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 13 байт)
C - 45h
B = 1 - Выделить имя диска +Выходные значения:
A - код ошибки, если CF=1
A - номер диска (0 - A, 1 - B, 2 - C и т.д.), если CF=0
буфер - имя диска "A:",0 + +Подфункция 2 - Выделить директорию: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 256 байт)
C - 45h
B = 2 - Выделить директорию +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - директория "DIR1\DIR2\DIR3\",0 + +Подфункция 3 - Выделить имя файла: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 13 байт)
C - 45h
B = 3 - Выделить имя файла +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - имя файла "FILE.EXT",0 + +Подфункция 4 - Выделить расширение файла: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 4 байт)
C - 45h
B = 4 - Выделить расширение файла +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - расширение "TXT",0 или "C ",0 + +Подфункция 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 8 байт)
DE+0 адрес буфера для имени диска (макс. 13 байт)
DE+2 адрес буфера для директории (макс. 256 байт)
DE+3 адрес буфера для имени файла (макс. 13 байт)
DE+4 адрес буфера для расширения файла (макс. 4 байта)
C - 45h
B = 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла; + +Подфункция 7 - Выделить параметр командной строки + +Входные значения:
HL - указатель командной строки
DE - буфер для выделяемого параметра
C - 45h
B = 7 - Выделить параметр командной строки +Выходные значения:
HL - указатель на следующий параметр командной строки
CF = 0 - конец строки не достигнут (есть другие параметры)
CF = 1 - конец строки (в буфер перенесён последний параметр или ноль) + +Подфункция 8 - Преобразовать из 11 символьного формата в формат ДОС + +Входные значения:
C - 45h
B = 8 - преобразовать из 11 символьного формата в формат ДОС
HL - 11 символов имени файла
DE - буфер для имени в формате ДОС +Выходные значения:
A - код ошибки, если CF=1 + +Подфункция 9 - Преобразовать из формата ДОС в 11 символьный формат + +Входные значения:
C - 45h
B = 9 - преобразовать из формата ДОС в 11 символьный формат
HL - имя файла в формате ДОС
DE - буфер для 11 символов имени файла +Выходные значения:
A - код ошибки, если CF=1 + + + + + + HYPERLINK "" \l "tocvar" Функции для работы с переменными
 + +46h (70) ENVIRON (Системное окружение) + +Входные значения:
B - номер подфункции
C - 46h
B=0 Получение системного окружения
HL - буфер
B=1 Получить переменную окружения
HL - имя переменной
DE - буфер для значения переменной
B=2 Установить/удалить переменную окружения
HL - имя переменной и значение, разделенные символом '=', (ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ) +Выходные значения:
A - состояние, если CF=0
A=0 - переменная обнаружена
A=0FFh - переменная не обнаружена
DE - указывает на конец буфера
A - код ошибки, если CF=1 + +47h (71) APPINFO (Получение информации приложения) + +Входные значения:
B - номер подфункции
C - 47h
HL - буфер данных
B=0 - получение параметров командной строки
B=1 - получение полного пути к каталогу программы
B=2 - получение полного пути и имени файла программы +Выходные значения::
A - код ошибки, если CF=1 + + HYPERLINK "" \l "tocscreen" Функции работы с экраном
 + +50h (80) SETVMOD (Выбор режима экрана) + +Входные значения:
A - режим экрана
   02h - текстовый 40x32x16 цветов
   03h - текстовый 80x32x16 цветов
   81h - графический 320x256x256 цветов
   82h - графический 640x256x16 цветов
B - страница экрана 0/1
C - 50h +Выходные значения:
A - код ошибки, если CF=1 + +51h (81) GETVMOD (Получить текущий режим экрана) + +Входные значения:
C - 51h +Выходные значения:
A - код ошибки, если CF=1
A - текущий режим экрана, если CF=0
B - страница экрана 0/1 + +52h (82) LOCATE (Установить позицию курсора) + +Входные значения:
D - строка курсора
E - столбец курсора
C - 52h +Выходные значения:
нет + +53h (83) CURSOR (Получить текущую позицию курсора) + +Входные значения:
C - 53h +Выходные значения:
D - строка курсора
E - столбец курсора + +54h (84) SELPAGE (Выбрать активную страницу экрана) + +Входные значения:
B - страница экрана 0/1
C - 54h +Выходные значения:
A - код ошибки, если CF=1 + +55h (85) SCROLL (Прокрутка окна) + +Входные значения:
D - строка левого верхнего угла окна
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B = 1 - прокрутка вверх
B = 2 - прокрутка вниз
A = 0 - очищать строку
C - 55h +Выходные значения:
нет + +56h (86) CLEAR (Очистка окна) + +Входные значения:
D - строка левого верхнего угла окна
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - атрибут заполнитель
A - символ заполнитель
C - 56h +Выходные значения:
нет + +57h (87) RDCHAR (Считать символ с экрана) + +Входные значения:
D - строка
E - столбец
C - 57h +Выходные значения:
A - символ
B - атрибут + +58h (88) WRCHAR (Напечатать символ на экране) + +Входные значения:
D - строка
E - столбец
A - символ
B - атрибут
C - 58h +Выходные значения:
нет + +59h (89) WINCOPY (Запомнить окно экрана) + +Входные значения:
D - строка
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - страница буфера
IX - адрес буфера
C - 59h +Выходные значения:
нет + +5Ah (90) WINREST (Восстановить окно экрана) + +Входные значения:
D - строка
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - страница буфера
IX - адрес буфера
C - 5Ah +Выходные значения:
нет + +5Bh (91) PUTCHAR (Напечатать символ в текущей позиции курсора) + +Входные значения:
A - символ
C - 5Bh +Выходные значения:
нет + +5Ch (92) PCHARS (Напечатать строку символов в текущей позиции курсора) + +Входные значения:
HL - указатель на начало строки символов
C - 5Ch +Выходные значения:
нет + + HYPERLINK "" \l "tocprinter" Функции для печати на принтере
 + +5Fh (95) PRINT (Вывод символа на принтер без ожидания) + +Входные значения:
A - символ
C - 5Fh +Выходные значения:
B - символ
CF = 1 - принтер не готов + + + + + + diff --git a/docs/converted/Estex.txt b/docs/converted/Estex.txt new file mode 100644 index 0000000..7a75a2d --- /dev/null +++ b/docs/converted/Estex.txt @@ -0,0 +1,17 @@ +Estex: Disk SubSystem (DSS) Programming Guide +Table of Contents + HYPERLINK "" \l "intro" 1. Introducing
 HYPERLINK "" \l "identify" 2. Identification of system functions
 HYPERLINK "" \l "diskfunc" 3. Disk devices functions
 + +1. Introducing +   This document contains the list of functions and concepts of interaction with a disk subsystem.
   DSS is a collection of very useful functions that reside in DSS itself, ready for use by any your programs. These functions are stored in library SYSTEM.DOS and allow management of files, memory allocation, loading and execution of the programs.

File specification

   The file specification is a string, containing a names of disk, directories separated by a symbol "\" and name of file. The names of disk drive and directories can be discard.
for example:

C:\TEXT\DOC\text.doc

A:file.txt

\TEXT\info.txt

   The DSS used chars with colon suffix as names of disk devices (A:, B:, C: etc.) The name of disk can be written down before filename for specified disk there it placed. For example: command DIR C:DATFILE searches for DATFILE in the current directory of disk C:.
   When disk name not specified DSS used current disk. At start DSS, the current disk is a disk whence was loaded DSS.
   The filenames consist of two parts. The first part contain 8 chars of file name. The second part is not necessary and contain 3 chars of file type (also known as extentsion). At the writing of filename, both parts are separated by char point.
For example: the names "NAME" and "NAME." is specified same file. In the name don't
allows symbols with codes less 32 and chars . " / \ [ ] : | < > + = ; ,
    As the subdirectories files too, their names are formed by same way. The name of root directory always "\". And each subdirectories contain two items with names "." and "..". The name "." specified a current directory and name ".." specified name of parent(uplevel) directory.
   Some console commands and DSS functions allow to use global symbols ? and * which can be used
for filename templates.
   The symbol ? means that any one char of filename. The symbol * means that it char can be
replaced by any symbols.

For example:
*.txt - means, all files with type "txt"
a??.* - means, files which contain three or less symbols and first symbol is "a"
dc*.exe - means, files with type "exe" and began "dc"

File attributes

   The each bit of byte attributes specified various attribute. And It can be changed by DSS function.

bit 0 - Read only
bit 1 - Hidden
bit 2 - System
bit 3 - Volume label
bit 4 - Directory
bit 5 - Archive
bit 6 - Reserved
bit 7 - Reserved

   Attribute "read only". When value is 1, file can be read, but can't be written or deleted.
   Attribute "hidden". When value is 1, DSS can't manipulate with this file.
   Attribute "system". Specified system file.
   Attribute "volume label". In old version of MSDOS used for specified volume laben, now it can be used for long filenames. And must be 0 for compatibles.
   Attribute "directory". When value is 1, means that this file is directory.
   Attribute "archive". This bite sets in 1 when DSS writing in this file. It can be used in backup utilities for detect changed files.

File handle

   When any file are opened, DSS build File Control Block in DSS working areas.
   The Handle (and assigned file) identified by number which returned DSS to program after file opening and used it in all further DSS calls. In other words, when file is opening, the program informsDSS his name and has taken back file handle. Which used in further file operations.
   All necessary information for working with file are placed in DSS working areas. +2. Identification of system functions +00h (00) VERSION (Version of DSS)

input:

C - 00h

output:

D - version number
E - modification

The function return version number of DSS. +3. Disk devices functions +01h (01) CHDISK (Change current disk)

input:

A - disk number (0-A,1-B...)
C - 01h

output:

A - error code, if CF=1
A - number of disks, if CF=0

The function changes current disk device.


02h (02) CURDISK (Current disk number)

input:

C - 02h

output:

A - current disk number (0-A,1-B...)

The function returns number of current disk device.


03h (03) DSKINFO (Disk information)

input:

A - disk number (0-A,1-B...0FFh-current)
C - 03h

output:

A - error code, if CF=1
A - sectors per cluster, if CF=0
HL - clusters per disk
DE - free clusters
BC - bytes per sector

The function returns information about disk device (capacity and free space).

for example: + LD C,03h ;Function DSKINFO + LD A,0FFh ;Information about current disk + RST 10h ;Execution of function + LD A,D ;There is a free + OR E ;space? + JR Z,NO_SPACE ;No, the disk is completely filled +09h (09) BOOTDSK (Number of boot disk)

input:

C - 09h
B = 0

output:

A - number of boot disk (0-A,1-B...)

The function returns number of boot disk device whence was loaded DSS. diff --git a/docs/converted/Estex_opisanie.txt b/docs/converted/Estex_opisanie.txt new file mode 100644 index 0000000..679b9ef --- /dev/null +++ b/docs/converted/Estex_opisanie.txt @@ -0,0 +1,69 @@ +Estex: Дисковая подсистема (DSS) – Обзор + HYPERLINK "" \l "intro" Введение + HYPERLINK "" \l "boot" Загрузка подсистемы + HYPERLINK "" \l "console" Системная консоль + HYPERLINK "" \l "fs" Файловая система +1. Введение +    Estex - операционная система компьютера Sprinter, включающая в себя различные модули. Данный документ описывает модуль дисковой подсистемы.
    В DSS используется та же самая файловая система, как и в MS-DOS FAT16 и полностью с ней совместима. +2. Загрузка подсистемы +    После включения питания или сброса компьютера, BIOS считывает первичный загрузчик с 1-го сектора загрузочного диска.
    Если загрузка происходит с HDD или дискеты, то сначала загрузочный сектор считывается в память и ему передается управление по загрузке модуля дисковой подсистемы SYSTEM.DOS.
    Затем выполняются следующие действия: +инициализация дисковой подсистемы и вывод сообщения "Starting DOS..." +загрузка системной консоли SYSTEM.EXE +выполнение команд указанных в файле SYSTEM.BAT +Обычно файл SYSTEM.BAT содержит путь к программе файловой навигации пользователя или другому часто используемому приложения. Например "c:\fn\fn.exe".

    Если во время загрузки вы хотите пропустить выполнение SYSTEM.BAT. То вам следует нажать клавишу "SHIFT", как только появиться сообщение "Starting DOS..." и удерживать пока не появится приглашение консоли ("C:\>"). +3. Системная консоль +    В DSS многие задачи могут быть выполнены через интерфейс командной строки называемой системной консолью. Основная задача консоли ввод команд и их исполнение. Также она имеет ряд функций, которые выполняют такие действия как управление файлами, перемещение по файловой структуре каталогов, редактирование командной строки и переменных среды.
    Системная консоль позволяет пользователю взаимодействовать с операционной системой. Для DOS системная консоль это SYSTEM.EXE. Если вы видите на экране приглашение командной строки (A:\> или C:\>), то это означает что SYSTEM.EXE загружен и активизирован. Когда вы вводите командную строку, командный процессор интерпретирует команду и выполняет необходимые действия.

    На сегодняшний день в консоли доступны следующие команды: +CD +Displays the name of or changes the current directory. +CHDIR +Displays the name of or changes the current directory. +CLS +Clears the screen. +DATE +Displays or sets the date. +DEL +Deletes one or more files. +DIR +Displays a list of files and subdirectories in a directory. +ECHO +Displays messages, or turns command echoing on or off. +ERASE +Deletes one or more files. +EXIT +Quits the SYSTEM.EXE program (command interpreter). +HELP +Provides Help information for console commands. +MD +Creates a directory. +MKDIR +Creates a directory. +PAUSE +Suspends processing of a batch file and displays a message. +RD +Removes a directory. +REM +Records comments (remarks) in batch files or SYSTEM.BAT. +REN +Renames a file or files. +RENAME +Renames a file or files. +RMDIR +Removes a directory. +TIME +Displays or sets the system time. +VER +Displays the System version. +4. Файловая система +    Сейчас, в качестве файловой системы Estex использует FAT12 и FAT16. С помощью файловой системы FAT (File Allocation Table) организуются данный на винчестере и дискетах.
    Для указания спецификации файла используется следующая форма:

[drive:][directory\]filename[.ext]

    Файловая спецификация - это строка символов содержащая наименования диска, директорий отделенных символом "\" и имя файла. Имена диска и директории могут быть опущены, если требуемый файл расположен в текущей директории.

например: + +C:\TEXT\DOC\text.doc + +A:file.txt + +\TEXT\info.txt +    В DSS в качестве имен дисковых устройств используются буквы с последующим символом двоеточия (A:, B:, C: и.т.д.) Имя диска может быть набрано перед именем файла для указания диска, на котором он расположен. Например: команда DIR C:TESTFILE ищет TESTFILE в текущей директории диска C:. Если имя диска не указанно используется текущий диск. После запуска DSS, текущим диском является диск, с которого была загружена DSS.
    Имена файлов состоят из двух частей. Первая часть может содержать 8 букв, цифр или следующие специальные символы: $ % ' – _ @ { } ~ ` ! # ( ). Вторая часть не является обязательной и содержит любую комбинацию из трех букв, цифр или специальных символов с предшествующей точкой (.). Например имена "NAME" и "NAME." указывают на одинаковый файл. В имени файла не допускаются символы с кодом меньше 32, а также символы . " / \ [ ] : | < > + = ; ,
    Поскольку директории также являются файлами их имена образуются по тем же правилам.
    Имя корневой директории всегда "\". И каждая поддиректория содержит два элемента с именами "." and "..". Имя "." указывает на текущую директория, а имя ".." указывает на родительную (на уровень выше) директорию.
    Некоторые команды и функции DSS позволяют использовать глобальные символы * и ? которые могут использоваться для задания шаблона имени файла.
    Символ ? означает любой один символ в имени файла. Символ * означает, что он может быть заменен на любое количество любых символов.

for example: + +*.txt - означает, все файлы с типом "txt" +a??.* - означает, файлы содержащие три и менее символов и первый символ "a" +dc*.exe - означает, файлы с типом "exe" и начинающиеся на "dc" +    В именах файлов не делается различий между заглавными и прописными символами. diff --git a/docs/converted/Forum.txt b/docs/converted/Forum.txt new file mode 100644 index 0000000..d434da9 --- /dev/null +++ b/docs/converted/Forum.txt @@ -0,0 +1,1059 @@ +Форум +“Программирование Спринтера» + + + +Оглавление: + TOC \o "1-3" \h \z HYPERLINK \l "_Toc65383363" Экран и палитра PAGEREF _Toc65383363 \h 2 + HYPERLINK \l "_Toc65383364" Шрифты PAGEREF _Toc65383364 \h 7 + HYPERLINK \l "_Toc65383365" Память PAGEREF _Toc65383365 \h 10 + HYPERLINK \l "_Toc65383366" Файлы PAGEREF _Toc65383366 \h 14 + HYPERLINK \l "_Toc65383367" Звук PAGEREF _Toc65383367 \h 16 + HYPERLINK \l "_Toc65383368" ISA-8 слоты PAGEREF _Toc65383368 \h 18 + HYPERLINK \l "_Toc65383369" Summary PAGEREF _Toc65383369 \h 18 + HYPERLINK \l "_Toc65383370" More information PAGEREF _Toc65383370 \h 18 + HYPERLINK \l "_Toc65383371" Акселератор компьютера Sprinter. PAGEREF _Toc65383371 \h 20 + HYPERLINK \l "_Toc65383372" Прерывания PAGEREF _Toc65383372 \h 22 + HYPERLINK \l "_Toc65383373" IDE контроллер PAGEREF _Toc65383373 \h 23 + HYPERLINK \l "_Toc65383374" FDD контроллер PAGEREF _Toc65383374 \h 24 + HYPERLINK \l "_Toc65383375" Клавиатура PAGEREF _Toc65383375 \h 25 + HYPERLINK \l "_Toc65383376" Коды ошибок DSS PAGEREF _Toc65383376 \h 27 + Экран и палитра + + Denis Parinov + (Sprinter Team) + 2002/10/02 00:57 + Re: Графические режимы [re: Shiru_Otaku] + + + + Функции для работы с экраном: + + Сейчас DOS поддерживает четыре режима экрана. + Два текстовых: + 40x32 символов c 16 цветами (режим 02h); + 80x32 символов c 16 цветами (режим 03h); + и два графических: + 320x256 точек с 256 цветами (режим 81h); + 640x256 точек с 16 цветами (режим 82h); + Основным режимом является текстовый режим 80x32 (03h), если вашапрограмма +работает в другом режиме, то вам следует перед переключением режимаполучить +номер текущего режима функцией 51h GETVMOD и сохранить его, а передзавершением +программы восстановить его. + + Например: + + LD C,51h ;получить режим экрана + RST 10h + LD C,A ;поместить номер режима экрана в регистр C + PUSH BC ;и сохранить на стеке (B - страница, C - режим) + . + . ;ваша программа + . + + POP BC ;взять со стека режим экрана + LD A,C ;поместить номер режима экрана в регистр A + LD C,50h ;установить режим экрана + RST 10h + LD C,41h ;завершить программу. + RST 10h + + DSS имеет функции вывода на текстовый экран символов и символьных строк.Для +графических режимов требуются собственные процедуры вывода на экран.Например, +при завершении программы вы можете выдать строку на текстовый экран: + + + LD HL,STRING ;указатель на строку символов + LD C,5Ch ;вывод строки символов + RST 10h + +STRING DB "Thank you for using my program..." ;текстовая строка + DB 13,10 ;символы возврата каретки и перевода строки + DB 0 ;символ конца строки + + Для вывода на графический экран, вам необходимо подключить видео память водно +из трех окон памяти 04000h-07FFFh, 08000h-0BFFFh, 0C000h-0FFFFh. Этоосуществля- +ется выводом значения 50h в соответствующий порт 0A2h, 0C2h или 0E2h в +зависимости от окна памяти. При подключении обратите внимание на то, чтобыстек +вашей программы не попадал в это адресное пространство. + + +Например, если вам нужно поставить точку на экране, то подпрограмма длярежима +81h будет выглядеть так: + +; HL - горизонтальная координата +; DE - вертикальная координата + + IN A,(0E2h) ;считать из порта номер страницы подключенной в + ;третье окно памяти + LD C,A ;запомнить в регистре C + LD A,50h ;страница видео памяти + OUT (0E2h),A ;подключение видео памяти + LD A,E ;поместить вертикальную координату в регистр A. + OUT (89h),A ;выдать в порт + LD DE,0C000h ;адрес начала третьего окна памяти + ADD HL,DE ;получить адрес точки (адрес начала окна + + ;горизонтальная координата) + LD A,255 ;цвет выводимой точки (от 0 до 255) + LD (HL),A ;вывод точки на экран + LD A,C ;вспомнить номер страницы памяти + OUT (0E2h) ;подключить страницу памяти вместо страницы видео + ;памяти + + Перед выводом точек следует установить необходимые цвета в палитре.Различные +режимы вывода на экран задаются номером видео страницы от 50h до 5Fh.Подробнее +о режимах вывода вы можете прочитать в описании архитектуры компьютера. + + 50h (80) SETVMOD (Выбор режима экрана) + +входные данные: + + A - режим экрана + 02h - текстовый 40x32x16 цветов + 03h - текстовый 80x32x16 цветов + 81h - графический 320x256x256 цветов + 82h - графический 640x256x16 цветов + B - страница экрана 0/1 + C - 50h + +выходные данные: + + A - код ошибки, если CF=1 + + Функция устанавливает режим экрана. Седьмой бит режима экрана установлен +для графических режимов и сброшен для текстовых. Существуют два текстовыхрежима +и два графических. + + + 51h (81) GETVMOD (Получить текущий режим экрана) + +входные данные: + + C - 51h + +выходные данные: + + A - текущий режим экрана + B - страница экрана 0/1 + + Функция возвращает текущий режим экрана и номер страницы экрана. + + + Anonymous + (Unregistered) + 2003/03/01 10:13 + + Здравствуйте. А как с палитрами??? Как загрузить произвольную + палитру (отдельный цвет). Желательно с исходником. + Почему системная палитра выглядит по разному в эмуляторе и реальном + Спринтере. + + Alex_Goryachev + (Sprinter Team) + 2003/03/01 12:51 + + Пример из исходников Антона Енина ( + http://www.petersplus.com/download/sources/aprint.zip ) + + +;[]=======================================================================[] +; palette from Flex Navigator +CustomPalette: + db 0x00, 0x00, 0x00, 0x00 ; Black 00 + db 0x00, 0x00, 0xFF, 0x00 ; B.Red 01 + db 0x00, 0x80, 0x00, 0x00 ; Green 02 + db 0x00, 0xFF, 0xFF, 0x00 ; B.Yellow 03 + db 0x80, 0x00, 0x00, 0x00 ; Blue 04 + db 0xFF, 0xFF, 0x00, 0x00 ; Invert bg 05 + db 0x80, 0x00, 0x00, 0x00 ; Invert fg 06 + db 0x80, 0x80, 0x80, 0x00 ; BlackGray 07 + db 0xC0, 0xC0, 0xC0, 0x00 ; HighGray 08 + db 0x80, 0x00, 0x00, 0x00 ; Panel 09 + db 0xFF, 0xFF, 0x00, 0x00 ; Files 0A + db 0x00, 0xFF, 0xFF, 0x00 ; Select Files 0B + db 0x00, 0xFF, 0xFF, 0x00 ; InvSel Files 0C + db 0xC0, 0xC0, 0xC0, 0x00 ; Reserved 0D + db 0xFF, 0xFF, 0xFF, 0x00 ; White 0E + db 0xFF, 0xFF, 0xFF, 0x00 ; White 0F + +;[]=======================================================================[] +;[]=======================================================================[] +; set requist video mode 640x256x16 +SetVideoMode: + ld c, 0x51 ; save previos vmode + rst 0x10 + ld (vmode + 1), a + ld a, b + ld (vscrn + 1), a + sub a + call CrearVideoRam + ld bc, 0x0050 ; set 640x256x16 + ld a, 0x82 + rst 0x10 + ld hl, CustomPalette + ld de, 0x1000 + ld bc, 0xFFA4 + sub a + rst 0x08 ; load palette + ret + +;[]=======================================================================[] + + + + Denis Parinov + (Sprinter Team) + 2003/03/02 02:47 + Re: Графические режимы [re: Anonymous] + + + + > Здравствуйте. А как с палитрами??? Как загрузить произвольную + палитру + (отдельный цвет). Желательно с исходником. + + +;Установить 5-й цвет "средне-зеленым" + LD HL,COLOUR + LD DE,#0105 + LD BC,#FFA4 + XOR A + RST #08 + +; B G R +COLOUR DB #00,#80,#00,#00 + + +;Изменить все 256 цветов в палитре + LD HL,COLOURS + LD DE,#0000 + LD BC,#FFA4 + XOR A + RST #08 + +;Параметры цвета +; B G R +COLOUR DB #00,#80,#00,#00 + +;Палитра +COLOURS DB #00,#00,#00,#00 ;Colour 0 + DB #00,#00,#80,#00 ;Colour 1 + DB #00,#80,#00,#00 ;Colour 2 + DB #00,#80,#80,#00 ;Colour 3 + ... + DB #FF,#FF,#FF,#00 ;Colour 255 + + +> I set A=0 in the SCROLL call, expecting this to clear the bottom line,
but this did not happen, so I had to add a CLEAR call as well. Is this a
bug, or did I misunderstand the documentation? 

Unfortunately, I can't check it on Sprinter now. But source code of the
SCROLL function looks good. I will check it as soon as possible. 

> For the cursor, I am just doing RDCHAR and then WRCHAR with all the
attribute bits inverted. This gives me a solid cursor block (if over a
space) or an inverted blinking character (if over a character). This is
fine, but I may like to try and improve the appearance, so it is always
solid or always flashing. Can you give me some information on what the
attribute values represent? 

We use standard CGA / VGA text colors by default. It can be changed in the
palette. +
Text attributes +
bit 7 - Blink symbol +bits 6,5,4 - Background color (8 colors) (0...7) RGB +bits 3,2,1,0 - Ink colors (16 colors) (0...15) IRGB +
Colors used for Background and Ink +
 0 0h 0000b - Black + 1 1h 0001b - Blue + 2 2h 0010b - Green + 3 3h 0011b - Cyan + 4 4h 0100b - Red + 5 5h 0101b - Magenta + 6 6h 0110b - Brown + 7 7h 0111b - White +
Colors used for Ink only +
 8 8h 1000b - Gray + 9 9h 1001b - Bright Blue +10 Ah 1010b - Bright Green +11 Bh 1011b - Bright Cyan +12 Ch 1100b - Bright Red +13 Dh 1101b - Bright Magenta +14 Eh 1110b - Yellow +15 Fh 1111b - Bright White + +Как я понял, сейчас есть проблема с выводом на экран. 
Попробую расписать схему видео-вывода на словах. 

Режим адресации. Задается номером страницы. 
Если номер 5Xh - адресация графическая. 
Если номер не 5Xh - адресация спектрумовская, и она включена все время, даже если в соседней странице включился номер 5Xh. 

Спектрумовская адресация, это доступ к видеопамяти на запись в адресах 4000h..5FFFh или в 4000h - 7FFFh, в зависимости от состояния порта PORT_Y (89h). 

Бит 6 = 1 - отключает вывод в спектрумовское окно памяти. 
Бит 7 = 1 - расширяет спектрумовское окно с 8Kb до 16Kb 

Бит 4..0 - пределяет 8kb банк спектрумовского режима. 
Эти банки располагаются "вертикально", т.е. такой банк соответствует 32-м последовательным точкам на графической линии и 256-ти линиям. 

Сначала я чаще всего использовал окно 4000h..7FFFh для работы с графикой, поэтому получилось так, что графическая адресация перекрывала спектрумовскую при включении в порт A2h значения 5Xh, а выше 8000h использовалось программой, потом, когда стали использовать для вывода на экран страницу 0C000h, получилось так, что в странице 4000h оставалась открыта видеопамять со спектрумовской адресацией, а порт 89h используется и там и там, но с разным назначением. 

Т.е. после открытия страницы 0C000h для графики остается открытой и спектрумовский способ адресации видеопамяти в странице 4000h..7FFFh... 
P.S. Надеюсь, что не запутал все окончательно... + Шрифты + Alex_Goryachev + (Sprinter Team) + 2002/05/28 11:44 + Re: Несколько наборов шрифтов одновременно [re: Shaos] + + Вот ответ, полученный от Ivan Mak. + + === Cut === + + Через Bios: + + IX - 32-хбайтовый описатель окна + (искать в описании, здесь только только самое важное) + ........ + (IX+4) - режим знакоместа + bit4=1 - text_mode + bit5=0 - 16, bit5=1 - 8 точек в знакоместе (80/40 символов) + bit7..6,3..0 - номер знакогенератора + исключение: bit7..6=B"11" - бордер + ....... + Он же (IX+4) - номер используемого знакогенератора в этом окне, он + же + регистр B в функциях B4,B5 + + Функция B0 открытие окна использует описатель, в котором указан + знакогенератор, открытый для всех символов данного окна. Он может + быть + перебит прямой записью в видео-память или фунцией B5, которая пишет + символ + со знакогенератором. При использовании функции B0 четвертый бит + регистра E + определяет, какая страница режима будет использоваться. Для работы с + двумя + страницами надо открывать окно два раза со значениями 0 и 1 в 4-м + бите рег.E + + ================================= + 0B4h (180) WIN_GET_SYM Взять символ с экрана + + Значение регистров на входе: + C=0B4h + A - идентификатор окна (д.б. 0) + DE - положение символа в окне: + D - вертикаль, E - горизонталь + Значение регистров на выходе: + NC - нормальное завершение + L - символ, H - атрибут, + B - знакогенератор + CF - ошибка неверный идентификатор окна + + + ================================= + 0B5h (181) WIN_PUT_SYM Положить символ на экран + + Значение регистров на входе: + C=0B5h + A - идентификатор окна + DE - положение символа в окне: + D - вертикаль, E - горизонталь + L - символ, H - атрибут символа + B - знакогенератор + Значение регистров на выходе: + NC - нормальное завершение + CF - ошибка неверный идентификатор окна + + ================================= + 0B6h (182) WIN_SET_ZG Установка знакогенератора + + Значение регистров на входе: + C=0B6h + A - системный номер знакогенератора + DE - указатель на 2Kb данных знакогенератора + Значение регистров на выходе: + NC - нормальное завершение + CF - ошибка (старая версия, нет функции) + + ================================= + 0B8h (184) WIN_GET_ZG Получение знакогенератора + + Значение регистров на входе: + C=0B8h + DE - адрес, куда будет загружено 2kb знакогенератора + Значение регистров на выходе: + NC - нормальное завершение + CF - ошибка (старая версия, нет функции) + + Функция копирует имеющийся знакогенератор из ПЗУ + ================================= + + Для работы напрямую, окна должны быть открыты биосом, + знакогенераторы установлены. + + Вывод символов осуществляется в графическом режиме адресации, через + страницу 50h. В порт 89h записывается номер символа, адрес в линии + определяет строку. В этот адрес записывается четыре байта, + определяющих + символ, атрибут и знакогенератор. + + Bytes: + byte0 - знакогенератор/режим то же, что в (IX+4) + byte1 - символ + byte2 - атрибут + byte3 - reserved (заполнить нулями) + + Port_Y - номер линии засылаемый в порт 89h + линия 1+S S=0..79 - номер символа в строке для экрана 0 + линия 128+S S=0..79 - номер символа в строке для экрана 1 + (S=0 - выводит символ слева) + + + Adress: в линии 768+N*4 - N - номер строки экрана 0..31. + Адрес одинаков для обоих экранов. + (N=0 выводит символ сверху) + + В режиме 40 символов, номера строк через один: 1,3,5...79 + + Экраны переключаются нулевым битом порта 0C9h + + === Cut === + + + --- + PETERS PLUS LTD + + +---------------------------------------------------------------- +Текстовый экран устроен на удивление просто: в области описания экрана в текстовом режиме на один символ отводится 4 байта (номер знакогенератора, код символа, атрибут и один неиспользуемый байт), причем надо обратить внимание на то, что в этом режиме экран "повернут на бок". Что-бы вывести символ на экран, надо в Port_Y (0x89) записать 128+номер символа в строке (от 0 до 79), затем к адресу начала экранной страницы прибавить 768 (для первого экрана), после чего мы получим адрес байта, в котором хранится номер знакогенератора для вывода символа (поменяйте его, если это необходимо), увеличиваем адрес на один и туда записываем уже код самого символа, а в следующий байт - атрибут этого символа. Что-бы перейти на следующую строку текстового экрана, надо прибавить к адресу начала экранной страницы число 4*номер строки. Используя акселератор (команду копирования вертикальной линии) можно очень быстро выводить текст строки на экран. 

Остается только добавить что прямой доступ к области описания экрана не рекомендован разработчиками, т.к. есть веротяность потери совместимости со следующими моделями, где символы могут описываться подругому. Но если вам необходима большая скорость вывода на экран в текстовом режиме и вы готовы после выпуска программы вносить в неё изменения для обеспечения совместимости со следующими моделями, либо выложить исходники программы, что-бы желающие могли их исправить при необходимости, то, мне кажется можно использовать прямой доступ. 

--- 
Mac Buster^Extreme Entertainment + + +Also use BIOS fn. 0B6h for set new font and 0B8h for get current font. 
Font format like first 2K bytes of spectrum screen. You can load font at the 4000h address in ZX mode and see it. 
for example, char "A" will placed in the memory as 

offset bytes 
0041h 00000000b 
0141h 00111100b 
0241h 01000010b 
0341h 01000010b 
0441h 01111110b 
0541h 01000010b 
0641h 01000010b 
0741h 00000000b + + Память + Denis Parinov + (Sprinter Team) + 2002/08/28 22:11 + Re: Манаджмент памяти [re: cr0acker] + + + + > В конфигурации спринтер + > по #0000..#3FFF, при работе ДСС находится сама ДСС с её Резетами, + тет + чтоб использывать когда сюда подставленна страница пользователся + резеты не доступны!. + + Это так в нижних 16K находится DSS / BIOS в остальных 48К + приложение, но с + определенными особенностями. Стек не должен быть выше #BFFF при + вызове DSS и ниже #8000 при вызове некоторых функций BIOS. +В следующих версиях DSS планируется снятие ряда ограничений на стек +и расположения данных при вызове ее функций. + + > Теперь адресса #4000..#7FFF,#8000..#BFFF,#C000..#FFFF, когда ДСС + передаёт управление эти прогораммам, какие банки там нахадятся по + умолчанию? + + В зависимости от адреса загрузки и размера приложения DSS выделяет + необходимое число страниц памяти. Так при размере меньше 16К будет + выделена + одна страница, при размере больше 16К - две, и т.д. В окна с + "неиспользуемым" адресном пространством будет подключатся +специальная страница #FF.Если приложению требуется памяти больше чем + зарезервировано в exe-файле, оно должно выделить себе дополнительный +блок памяти самостоятельно. + +> Теперь память можно челкать по портам #7FFD,1FFD или нет? 
> И если да, то как типа in #&7FFD,(номер страницы). + + Напрямую память можно счелкать через 4 порта памяти: + #82 - #0000-#3FFFF + #A2 - #4000-#7FFFF + #C2 - #8000-#BFFFF + #E2 - #C000-#FFFFF + + Записывая физический номер страницы в порт. Список номеров +физических страниц для выделенного блока памяти можно получить через +BIOS. + + > Также хотеловсь бы увидет пример по использывани фции 38х Setwin! + + SETWIN работает с логичискими страницами. + + + 38h (56) SETWIN (Подключение страницы памяти) + +входные данные: + + A - идентификатор блока памяти + B - номер страницы в блоке (0,1,2...) + H - биты 6 и 7 задают номер окна, в которое будет подключена страница + C - 38h + +выходные данные: + + A - номер страницы, если CF=0 + A - код ошибки, если CF=1 + + Функция вычисляет физический номер страницы в блоке памяти и подключаетеё +в окно адресного пространства в зависимости от значения регистра HL. Тоесть, +если HL указывает на адрес в пределах от 04000h до 07FFFh, то страница +подключается в первое окно, от 08000h до 0BFFFh - второе окно, от 0C000hдо +0FFFFh - третье. + На выходе в регистре A содержится физический номер страницы, которая + +была подключена до выполнения функции. + + + + Выделить блок памяти 32К и подключить его страницы в #8000 и #C000 + окна: + +; + LD C,#3D ;GETMEM + LD B,2 ;BLOCK 32K + RST #10 ;SYSTEM CALL + JR C,ERROR ;MEMORY ALLOCATION ERROR + + LD (MEMHND),A ;SAVE MEMORY HANDLE +; + LD HL,#8000 ;FRAME ADDRESS + LD C,#38 ;SETMEM + LD B,0 ;FIRST MEMORY PAGE + LD A,(MEMHND) ;MEMORY HANDLE + RST #10 ;SYSTEM CALL + JR C,ERROR ;MEMORY ALLOCATION ERROR +; + LD HL,#C000 ;FRAME ADDRESS + LD C,#38 ;SETMEM + LD B,1 ;SECOND MEMORY PAGE + LD A,(MEMHND) ;MEMORY HANDLE + RST #10 ;SYSTEM CALL + JR C,ERROR ;MEMORY ALLOCATION ERROR +; + + > Заранне спасибо + + + + Denis Parinov + (Sprinter Team) + 2002/08/31 00:43 + Re: Манаджмент памяти [re: cr0acker] + + + + > Во! Пасибо большое? А еслищёлкать портами то есть возможномть что + программа будет совместима с будущей версией ПЗУ/АЛТЕРЫ/ДСС/ПЛАТЫ? + + Да, в любом случае будет возможность запуска программ в той + конфигурации для которой она была написана. Что-то вроде режима + совместимости. Но если для программы не критично работа напрямую + через порты, лучше пользоваться SETWIN как более универсальный. + + >> Так при размере меньше 16К будет выделена одна >страница, при + размере больше 16К - две, и т.д. В окна с "неиспользуемым" адресном + пространством будет >подключатся специальная страница #FF. + + > Какие физические номера этих страниц к приме 1,2,3,,,256! + + Это можно узнать через функцию BIOS, эти номера будут разными в + зависимости от того сколько памяти было выделено другим приложениям. + + Denis Parinov + (Sprinter Team) + 2002/08/31 00:50 + Re: Манаджмент памяти [re: cr0acker] + + + + > Денис а такой вариант выделения памяти будет работать? + > START + > ORG #4000 + > NOP + > ORG #8000 + > NOP + > ORG #C000 + > nop + > Дальше нужный орг и прога! + + Да, если конечно будет записан код от #4000 до конца программы, а не + от последнего ORG, как это делают некоторые ассемблеры. + Еще одно замечание, для DSS1.xx exe-файлы могут начинаться с #4100, + но после запуска можно использовать память с #4000. + + + + + cr0acker + (enthusiast) + 2003/07/19 22:34 + Непонятки. [re: Denis Parinov] + + + + В документации по спринтеру, есть такая фраза: + #82 - PAGE0 - страница ОЗУ, подключаемая вместо ПЗУ через порт + #1FFD. + Что-бы это значило? + ld a, номер_подключаемой_страницы + out (#82),a + ld a, _что?_ + out (#1ffd),a + + + + Denis Parinov + (Sprinter Team) + 2003/07/20 00:39 + Re: Непонятки. [re: cr0acker] + + + + LD A,1 ;RAM #0000-#3FFF + LD BC,#1FFD + OUT (C),A +; + LD A,0 ;ROM #0000-#3FFF + + LD BC,#1FFD + OUT (C),A + +Fast-RAM включается подобно КЭШ-памяти в 'Пентагоне'. 
Включение/выключение происходит с помощью кода: +
 DI + IN A,(#FB) ; включить Fast-RAM - 16к в 0-е окно + ; (в адреса #0000..#3FFF) + ......... ; your programm + IN A,(#7B) ; выключить Fast-RAM + EI + +Если надо использовать прерывания, программа должна установить 
свой обработчик в адрес #0038 

Следует иметь в виду, что Fast-RAM может быть использована другими 
программами, т.е. при запуске некоего процесса через DSS содержание 
Fast-RAM может не сохраниться. 

Перед вызовом функций DSS и BIOS Fast-RAM надо отключать. + Файлы + Denis Parinov + (Sprinter Team) + 2002/06/26 12:58 + Re: Оргинизация памяти [re: cr0acker] + + + + > И ещё аопрос по функции 16h подскажите плз намера атрибутов в + частномти можно ли узнать размер файла этой функцией? + + Размер файла можно узнать с помощью функции 15h. + + + 15h (21) MOVE_FP (Перемещение указателя в файле) + +входные данные: + + A - файловый манипулятор +HL:IX - смещение указателя в файле + B - способ перемещения + B=0 от начала файла + B=1 от текущего значения указателя + B=2 от конца файла + C - 15h + +выходные данные: + + A - код ошибки, если CF=1 +HL:IX - новое значение указателя + + HL:IX интерпретируется как 32-битное число. Если число меньше 65536, +регистр HL содержит 0. Возможны следующие способы перемещения указателя: + + B=0 Смещение считается от начала файла, если HL:IX=0, указатель +устанавливается на начало файла. + + + B=1 Смещение считается от текущего значения указателя. + + B=2 Смещение считается от конца файла, если HL:IX=0, послеперемещения + HL:IX получится длина файла в байтах. + + + + Атрибуты файла: + + Каждый бит байта атрибутов задаёт определённый атрибут файла. + Атрибуты + файлов можно изменять специальной функцией ДОС. + + бит 0 - Только для чтения + бит 1 - Скрытый + бит 2 - Системный + бит 3 - Метка тома + бит 4 - Каталог + бит 5 - Архивный + бит 6 - Не используется + бит 7 - Не используется + + Атрибут "только для чтения". При значении 1 из файла можно читать, + но в + него нельзя писать и его нельзя стереть. + Атрибут "скрытый". При значении 1 файл невиден для обычных операций + ДОС. + Атрибут "системный". Указывает, что файл является системным. + Атрибут "метка тома". В старых версиях MSDOS использовался для + задания + метки диска. + Атрибут "каталог". При значении 1 идентифицирует файл как каталог, + подчинённый данному каталогу или элементы "." и "..". + Атрибут "архивный". Этот бит устанавливается при операциях записи в + файл. + Его могут использовать утилиты создающие архивные копии для + сохранения + изменённых файлов. + + + Звук + Ivan_Mak + (Sprinter Team) + 2002/09/13 04:28 + Re: Программирование звука [re: Shaos] + + + + Звук через COVOX-Blaster (COVOX с буферным ОЗУ) + + CBL=COVOX-Blaster + + Порт управления: 004Eh (16-bit port!!!, писать только через OUT + (c),reg) + + ; bit 7 - COVOX-Blaster on (если 0 то обычный режим COVOX) + ; bit 6 - STEREO-mode on + ; bit 5 - 16bit-mode on + ; bit 4 - Interrupt on - включение прерываний + + ; bits 3..0 - частота + ; + ; 0 16khz -- mono/stereo --- это старые режимы -- не использовать! + ; 1 22khz -- mono/stereo --- это старые режимы -- не использовать! + ; 2 reserved + ; 3 reserved + ; 4 reserved + ; 5 reserved + ; 6 reserved + ; 7 reserved + ; + ; 8 7.8125 KHz -- mono/stereo 8/16 bit + ; 9 10.9375 KHz -- mono/stereo 8/16 bit + ; A 15.625 KHz -- mono/stereo 8/16 bit + ; B 21.875 KHz -- mono/stereo 8/16 bit + ; C 31.25 KHz -- mono/stereo 8/16 bit + ; D 43.75 KHz -- mono/stereo 8/16 bit + ; E 54.6875 KHz -- mono/stereo 8/16 bit + ; F 109.375 KHz -- mono/stereo 8/16 bit + + Порт 0FEh - биты запроса прерываний от CBL + + bit 7 - запрос данных для CBL + bit 5 - синхронизация экрана (кадровый импульс, 4мс длиной, 20мс + период) + + + Запись данных в COVOX-Blaster производится с помощью акселератора, + записью в страницу ОЗУ 0FDh (просто записать блок 128/256 байт с + адреса 0C000h) + или через порт 4Fh командами OTIR блок записываемых данных по + запросу. Для 8 бит режима - 128 байт; для 16 бит - 256 байт + + + + Самый простой пример: + + +Test: + LD BC,04Eh + LD A,8Bh ; включить 8 бит 22khz mono + OUT (C),A ; - CBL - включен! + INC C + LD HL,Sample + OTIR ; загрузить все 256 байт + RET + +Sample: + DB 80h,81,82h,.... ; (256 отсчетов звука с нулем на уровне 80h) + + + + + + Должен пищать одну ноту (если в Sample записать синус, то должно + чисто звучать). + + + Запрос данных в бите 7 порта FE появляется для каждых 128 байт (256 +в режиме 16 бит). Его следует проверять, если его не оказалось, то + прерывание экранное, а не от CBL. + + При выставленных прерываниях от CBL, стоит использовать режим IM 2, + иначе, будет часто вызываться DOS-овая процедура прерываний и могут + появиться тормоза на высоких частотах. + + + В режиме 8 бит сэмплы должны иметь уровень нуля на 80h, + 16 бит сэмплы - уровень нуля - 0000h + Stereo-сэмплы - должны иметь чередующиеся отсчеты левого и правого + канала. + + +mono_8bit: + DB 80h,81h,7Fh.... + +mono_16bit: + DW 0,1000,-1000... + +stereo_8bit: + DB 80h,80h,81h,80h,7Fh,80h... ; здесь один канал играет, второй молчит + +stereo_16bit: + DW 0,0,1000,0,-1000,0... ; аналогично, один канал играет, второймолчит + + + + + (При тестировании 16 бит режима следует помнить, что звук с + амплитудой в единицы почти не слышен) + + P.S. Формат данных выбран так, что бы из WAV-файлов данные в CBL + пересылать простой операцией блочной пересылки. + + ISA-8 слоты +Summary +This article describe ISA-8 interaction. +More information +If you want to interaction with ISA devices, you have to make following steps:
1) send 10h value to port 1FFDh(system port);
2) send control byte to port 0E2h(third memory window port);
control byte:
D7...should be 1
D6...should be 1
D5...should be 0
D4...should be 1
D3...should be 0
D2...specify number of ISA slot
D1...specify access mode (0 - ISA memory, 1 - ISA ports)
D0...should be 0
The read/write signals are forming from read/write signals memory range 0C000h-0FFFFh.
And the address lines A13...A0 has taken from processor data-BUS. The other ISA-signals such as RESET, AEN, A19...A14 can be set in port 9FBDh. And default value is 00h.
port 9FBDh:
D7...RESET
D6...AEN
D5...A19
D4...A18
D3...A17
D2...A16
D1...A15
D0...A14 + +ISA_DIR EQU 9FBDh +SC_PORT EQU 1FFDh +PAGE3 EQU 0E2h + +SAVE_PAGE DB 0 ;variable for previous status of third memory port + +RESET_ISA: ; reset ISA device + LD C, ISA_DIR + LD A,0C0h + OUT (C),A + CALL Pause_10ms + LD A,0 + OUT (C),A + RET + +Pause_10ms: + LD HL,10000 +Loop: + DEC HL + LD A,H + XOR L + JR NZ,Loop + RET + +OPEN_ISA_PORTS: ; open access to ISA + LD BC,SC_PORT + LD A,10h + OUT (C),A + IN A,(PAGE3) ; read value from memory port + LD (SAVE_PAGE),A ; save previous status of memory port + LD A,0D2h ; control byte for (first (upper) ISA slot) + OUT (PAGE3), A ; opening ISA port address space + LD C,ISA_DIR + LD A,0 ; high ISA addresses RESET and AEN signals. + OUT (C),A + RET + +CLOSE_ISA_PORTS: ; close access to ISA + LD A,(SAVE_PAGE) + OUT (PAGE3),A ; restore value of memory port + LD BC,SC_PORT + LD A,0 + OUT (C),A ; + RET + +WRITE_ISA_PORT: + LD HL,ADRESS_PORT+0C000h ; ISA port address + 0C000h offset 3 +memory page + LD A,DATA_OUT ; data for writing + LD (HL),A ; write data to port which pointered HL + RET + +READ_ISA_PORT: + LD HL, ADRESS_PORT+0C000h ; ISA port address + 0C000h offset 3 +memory page + LD A,(HL) ; read data from port which pointered HL + RET +When you work with ISA, the access to third memory page are disabled. If you want to address ISA-memory more than 3FFFh, you should specify high bits in port 9FBDh. + + Акселератор компьютера Sprinter. + + Акселератор предназначен для ускорения операций по пересылке блоков данных в ОЗУ и видео-ОЗУ. + + Акселератор позволяет: + +- быстро заполнять горизонтальную или вертикальную линию длиной до 256 точек одним цветом (в режиме 640x256 - одинарную/двойную горизонтальную линию длиной до 512 точек) +- быстро копировать горизонтальную или вертикальную линию длиной до 256 точек (в режиме 640x256 - горизонтальную линию до 512 точек) +- проводить быстрые операции AND, OR, XOR с блоками памяти. + + Акселератор не может работать с блоками данных ПЗУ и Быстрого-ОЗУ. + + ОЗУ акселератора является частью внутреннего ОЗУ ППЛМ. +Операции по пересылке данных производятся путем записи блока данных в это +внутреннее ОЗУ, а затем копировании его в нужное место ОЗУ из ОЗУ акселератора. +Блок данных, записываемый в ОЗУ акселератора может иметь различную +длинну из диапазона 1..256 байт. + + После одной записи копирование может производиться несколько раз и, таким +образом, можно производить заполнение экрана текстурами. + + Для заполнения экрана одним цветом используется другой режим +акселератора. В нем вместо копируемого блока данных из внутреннего ОЗУ +производится запись данных с шины процессора, которые в этот момент не +изменяются. + + Управление акселератором производится непосредственно из программы. +Для этого изпользуются команды процессора, которые, фактически, являются +операциями типа NOP. + + LD B,B - выключить акселетарор. + LD D,D - включить акселератор в режим приема байта размера блока + далее следует команда типа LD A,dat, где dat и будет новым + размером блока. Если размер блока был установлен ранее, + его можно не устанавливать. + LD C,C - Операция Fill - заполнение одним байтом. Последующая + команда типа LD (HL),A приведет к заполнению указанного + ранее количества байт значением A + LD E,E - Операция Fill для графического экрана - заполнение + вертикальных линий. + LD H,H - rezerved + LD L,L - копирование блока. Последующая команда типа LD A,(HL) + приведет к заполнению ОЗУ акселератора данными из адреса (HL), + а команда типа LD (DE),A приведет к перезаписи данных из ОЗУ + акселератора в ОЗУ или видео-ОЗУ. + LD A,A - копирование блока для графического экрана подобна команде + LD L,L, но работает с вертикальными линиями экрана. + + Пример использования акселератора: + + ; Считаем, что экранная страница уже открыта по адресу #C000 + LD HL,#C040 ; адрес начала линии первого экрана + LD DE,#C180 ; адрес начала линии второго экрана + LD BC,#140 ; длина экрана по горизонтали + DI ; запретить прерывания для работы с акселератором + LD D,D ; включить акселератор на установку размера блока + LD A,0 ; установить размер блока - 256 байт + LD A,A ; установить акселератор на копирование + ; вертикальных линий. + LDIR ; копировать + LD B,B ; выключить акселератор + EI ; включить прерывания + + + + Эта часть программы произведет копирование всего содержимого первого экрана на другой. +Время исполения составляет примерно 26 милисекунд. + + Дополнительные функции акселератора (AND, OR, XOR) работают таким же образом. +Для выполнения логических функций используются команды XOR (HL); OR (HL); AND (HL). + + Пример кодирования блока в 256 байт. + + LD HL,ADRES_1 + LD DE,XOR_DAT + DI + LD D,D + LD A,0 ; число байт, которые надо закодировать + LD L,L + LD A,(DE) ; взять блок данных в ОЗУ акселератора + XOR (HL) ; произвести операцию XOR с данными акселератора + LD (HL),A ; запомнить в ОЗУ результат операции + LD B,B + EI + + +Скорость работы акселератора ограничивается только физической +скоростью работы основного ОЗУ. Определить примерное время работы команды с +акселератором можно по такой формуле: + +Время работы = время работы команды без акселератора + время работы +акселератора + +Время работы акселератора = число пересылаемых байт /7 микросекунд + +Во время работы акселератора необходимо отключать прерывания, так как в этот момент изменяется система команд процессора и программа на прерывании не сможет работать корректно. + Прерывания +Кадровые и клавиатурные прерывания приходят с вектором 0FFh, отличать по биту приема байта в порте клавиатуры, не пришел, значит экран. Возможно, конечно, совпадение но это исключительно редкий случай. 

От мыши прерывания не приходят. Сделать можно, но сейчас их нет. Кстати и различие от экранных прерываний можно (и, видимо, надо будет в новой версии) сделать пожестче через прошивку в ПЛМ. 

От ISA и других внутренных портов процессора прерывания приходят с другим вектором (настраивается в портах), поэтому в режиме IM 2 они легко различаются. + IDE контроллер +
Доступ к поpтам осуществляется пpи неактивном Beta-Disk интеpфейсе. 
Со схемой без поллитpы не pазобpаться, пpивожу поpты как есть: 

поpт pегистp накопителя 

---- блок командных регистров ---- 
xx50 0 (data) 
0051 1 (error/feature) 
0052 2 (sector count) 
0053 3 (sector number) 
0054 4 (cylinder low) 
0055 5 (cylinder high) 
4052 6 (device/head) 
4053 7 (status/command) 

---- блок управляющих регистров ---- 
4054 16 (alternate status/control) 
4055 17 ? 

Пpи записи в поpт нужно его адpес увеличить на 0x100. 

Пpи чтении pегистpа данных пpи a8=0 выpабатывается стpоб чтения и 
младшая часть (D0-D7) шины данных накопителя выдаётся на шину спектpума, 
а стаpшая сохpаняется в теневом pегистpе. Пpи a8=1 читается теневой 
pегистp (D8-D15). 

Пpи записи pегистpа данных когда a8=0 байт сохpаняется в теневом pегистpе 
и стpоб записи для накопителя не выpабатывается. Пpи записи pегистpа данных когда 
a8=1 выpабатывается стpоб записи для накопителя и байт с шины спектpума выдаётся на 
D8-D15 шины накопителя, на D0-D7 выдаётся содеpжимое теневого pегистpа. 

Контроллер имеет общий теневой регистр для записи и чтения. 
 +вот мои раскопки на эту тему от 13.10.2003: 
- регистр команд | регистр состояния 
4153h запись, 4053h чтение 
- регистр накопителя/головки 
4152h запись, 4052h чтение 
- регистр циллиндра (старший байт) 
0155h запись, 0255h чтение 
- регистр циллиндра (младший байт) 
0154h запись, 0254h чтение 
- регистр данных 
0150h запись, 0050h чтение + +Верна информация. 
С одним добавлением. Доступ открыт в режиме Sprinter-ZX, 
а в режимах Pentagon, Scorpion и т.п. - закрыт! + FDD контроллер +0Fh Command/Status register 
3Fh Track register 
5Fh Sector register 
FFh Drive Control register 

In Spectrum configuration the port 0Fh also mapped to 1Fh for TRDOS
compatibility. 
But I would recommend to you don't use direct port access for it. 
A Sprinter have BIOS functions for reading/writing any disk sectors. 

for example: 

At first, make reset disk and to set required parameters. +INIT_DISK + LD D,n ; drive number 0-FDD A, 1-FDD B, 80h-HDD C... + LD C,#51 ; reset disk + RST #08 ; BIOS call +; + LD D,n ; drive number + LD E,n ; sectors per track. + PUSH DE + LD A,D + LD C,#58 ; get disk parameters + RST #08 ; BIOS call + LD A,H + POP HL + PUSH HL + LD H,A + POP AF + LD IX,256 ; sector size + LD C,#59 ; set disk parameters + RST #08 ; BIOS call + RET +
And next to use BIOS fn. 055h for reading. +DRV_READ: ; reading from disk + LD A,drv_type ; bit 0..3 - drive number + ; bit 4..7 - drive type + ; 0 - FDD + ; 6 - ram-disk (reserved) + ; 8 - HDD + ; C - CD-ROM (reserved) + LD HL,sec_h ; sector number (high) + LD IX,sec_l ; sector number (low) + ; (HL:IX - 32bit sector number, like LBA) + LD B,n_sec ; sectors count + LD DE,bufer_adr ; memory address for reading + LD C,#55 ; + RST #08 ; CF=0 - read OK + ; CF=1 - read error + + Клавиатура +> How is it done ? 

It's possible by DSS function 36h (K_SETUP). Sprinter has two keyboard
layouts (standard and alternative) which can be switched by [CTRL] +
[SPACE]. Each layout includes four keyboard modes. You can reload all of
them. + LD HL,LAYOUT + LD A,0 ;LAYOUT FOR NORMAL MODE + LD BC,#0036 + RST #10 +Esc EQU #1B +Bcs EQU #08 +Tab EQU #09 +Cps EQU #00 +Spc EQU #20 +Ent EQU #0D +
;Normal mode (without CAPS and SHIFT not pressed) + DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,"q","w","e","r","t","y","u","i","o","p","[","]" + DB Cps,"a","s","d","f","g","h","j","k","l",";","'",Ent + DB #00,"z","x","c","v","b","n","m",#2C,".","/",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 +
;SHIFT mode (without CAPS and SHIFT are pressed) + DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs + DB Tab,"Q","W","E","R","T","Y","U","I","O","P","{","}" + DB Cps,"A","S","D","F","G","H","J","K","L",":",#22,Ent + DB #00,"Z","X","C","V","B","N","M","<",">","?",#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 +
;CAPS mode (with CAPS and SHIFT not pressed) + DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]" + DB Cps,"A","S","D","F","G","H","J","K","L",";","'",Ent + DB #00,"Z","X","C","V","B","N","M",#2C,".","/",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 +
;CAPS+SHIFT mode (with CAPS and SHIFT are pressed) + DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs + DB Tab,"q","w","e","r","t","y","u","i","o","p","{","}" + DB Cps,"a","s","d","f","g","h","j","k","l",":",#22,Ent + DB #00,"z","x","c","v","b","n","m","<",">","?",#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00
 DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +Прерывания от клавиатуры выставляют бит 0 в порте 19h, им и отличаются от прерываний экрана. Конечно, возможны случайные совпадения, когда прерывание от клавиатуры пришло одновременно с экранным, но это очень маловероятно. От других устройств прерывание может придти, но так же с некими признаками в портах (но это только в случае, если программа эти порты настроила и использует для себя) + Коды ошибок DSS +This is a list of DSS error numbers. 

00h (00) - Success 
01h (01) - Invalid function 
02h (02) - Invalid drive number 
03h (03) - File not found 
04h (04) - Path not found 
05h (05) - Invalid handle 
06h (06) - Too many open files 
07h (07) - File exist 
08h (08) - File read only 
09h (09) - Root overflow 
0Ah (10) - No free space 
0Bh (11) - Directory not empty 
0Ch (12) - Attempt to remove current directory 
0Dh (13) - Invalid media 
0Eh (14) - Invalid operation 
0Fh (15) - Directory exist 
10h (16) - Invalid filename 
11h (17) - Invalid EXE-file 
12h (18) - Not supported EXE-file 
13h (19) - Permission denied 
14h (20) - Not ready 
15h (21) - Seek error 
16h (22) - Sector not found 
17h (23) - CRC error 
18h (24) - Write protect 
19h (25) - Read error 
1Ah (26) - Write error 
1Bh (27) - Drive failure 
1Ch (28) - Unknown error : 28 
1Dh (29) - Unknown error : 29 
1Eh (30) - No free memory 
1Fh (31) - Invalid memory block 
20h (32) - Unknown error : 32 


--- 
PETERS PLUS LTD +PAGE + + +PAGE 27 + + + + diff --git a/docs/converted/IvanMak.txt b/docs/converted/IvanMak.txt new file mode 100644 index 0000000..a464871 --- /dev/null +++ b/docs/converted/IvanMak.txt @@ -0,0 +1,2515 @@ + +===== PAGE 1 ===== +Sprinter +Руководство по программированию Sp2000 +Ivan Mak +15 августа 2003 г. +Содержание +I Введение 4 +1 Архитектура компьютера 4 +1.1 Краткие данные платы Sp2000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 +1.2 Техническая реализация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 +1.3 Возможности машины . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 +1.4 Загрузка конфигураций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 +2 Краткое описание конфигураций 6 +2.1 Конфигурация Sprinter-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 +2.2 Конфигурация Sprinter-2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 +2.3 Конфигурация ZX-Spectrum+AY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 +2.4 Конфигурация Game-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 +2.5 Kонфигурация DooM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 +2.6 Конфигурация Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 +2.7 Особенности платы Sp2000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 +II Блоки конфигураций компьютера 7 +3 Основная Память 7 +3.1 Страницы, распределение памяти . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 +3.2 Видео-область, спектрумовский и графический режим адресации . . . . . . . . . . . . . . . . . 9 +4 Видео-память 9 +4.1 Спектрумовский режим адресации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 +4.2 Графический режим адресации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 +4.3 Подрежимы вывода графической адресации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 +4.4 Распределение Video-RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 +4.5 Структура экрана, режимы экрана . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 +4.6 Спектрумовский режим, он же текстовый . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 +4.7 Графический режим . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 +4.8 Палитра . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 +4.9 Процесс вывода на экран . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 +1 +===== PAGE 2 ===== +СОДЕРЖАНИЕ 2 +5 Звуковой выход 16 +5.1 AY-3-8910 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 +5.2 Бипер/Covox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 +5.3 COVOX-Blaster (CBL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 +5.4 Sprinter-Sound-Card (SSC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 +6 Акселератор операций с ОЗУ 19 +7 КЭШ-ОЗУ 21 +7.1 Загрузка новых прошивок в ПЛМ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 +8 ISA, порт A20 21 +9 Внутренние порты Z84C15 21 +9.1 Мышь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 +9.2 Принтер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 +9.3 Прерывания от ISA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 +9.4 AT-Клавиатура . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 +9.5 Таймеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 +10 Контроллер FDD 26 +10.1 720/1.44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 +11 Контроллер HDD 26 +12 CMOS 27 +12.1 Описание регистров CMOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 +13 Дешифрация ПЗУ/КЭШ/Контроллеры/и т.п. 27 +13.1 Схема распределения портов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 +13.2 Конкретные адреса портов, используемые в Sprinter-е . . . . . . . . . . . . . . . . . . . . . . . . 31 +14 Сброс. 32 +14.1 Старт машины . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 +14.2 Доступ к HDD через память. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 +III Прошивки ПЛМ 32 +15 Sprinter-1 33 +15.1 Режимы Spectrum-128/Scorpion-256/Pentagon-512 . . . . . . . . . . . . . . . . . . . . . . . . . . 33 +15.2 Доступ к функциям биоса и портам. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 +16 Sprinter-2 33 +16.1 Акселератор, блочные операции AND, OR, XOR . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 +17 Game-1 33 +17.1 Акселератор + Covox-Blaster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 +18 Doom 33 +18.1 Акселератор с растяжением линий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 +19 Video 33 +19.1 Режим экрана 160x128 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 +IV Программирование с использованием функций БИОС-а. 33 +===== PAGE 3 ===== +СОДЕРЖАНИЕ 3 +20 Функции биоса 34 +20.1 Работа с памятью . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 +20.2 Работа с блоками как с RAM-Disk-ами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 +20.3 Управление назначением на дисководы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 +20.4 Функции управления железом и определение версии . . . . . . . . . . . . . . . . . . . . . . . . 38 +20.5 Функции печати и управления режимом экрана . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 +20.6 Графические функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 +20.7 Работа с винчестером и дисками MS-DOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 +21 Дополнительные сведения по программированию 51 +21.1 Вывод на графический экран . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 +21.2 Особые режимы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 +21.3 Вывод палитр . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 +V Программирование в TR-DOS (дополнительные команды) 52 +22 Работа с HDD и RAM-Disk через TR-DOS 52 +22.1 /HDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 +22.2 /HDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 +22.3 /CAT, /DIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 +22.4 /LOAD, /SAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 +22.5 /FDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 +22.6 /RMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 +22.7 /CLEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 +22.8 Команды переключения конфигураций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 +22.9 Дополнительные сервисные команды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 +23 Дополнения TR-DOS 5.04Em 54 +24 Копирование файлов с TR-DOS дискет в RAM-Disk 55 +25 Сохранение содержимого RAM-Disk на винчестере 56 +VI Программирование в Sprinter-DOS 56 +===== PAGE 4 ===== +4 +Часть I +Введение +Данное описание предполагает наличие определенных знаний читателя, а именно знание архитектуры +компьютера ZX-Spectrum и их разновидностей, в частности Pentagon-128 и Scorpion-256, а так же знание +языка BASIC и некоторое знакомство с языком ассемблера Z80. В описании почти не приводятся сведения, +относящиеся к программированию на стандартном ZX-Spectrum. Подразумевается, что эти описания уже +имеются или читатель достаточно хорошо знаком с компьютером ZX-Spectrum, что бы знать основные +данные, необходимые для понимания излагаемой информации. +Большая часть описания относится к стандартной конфигурации компьютера Sprinter. Там же, где раз- +говор пойдет об иных конфигурациях, я буду это указывать. +1 Архитектура компьютера +Я буду называть конфигурацией машины – конкретную реализацию конкретной схемы в перепрограм- +мируемой логической микросхеме (ППЛМ). Это означает, что машина имеет множество конфигураций, +каждая из которых имеет свою схему. +Я так же использую понятие КЭШ-ОЗУ. Это не КЭШ в формальном смысле, а быстрое ОЗУ, в котором +процессор может работать на высокой частоте без тактов ожидания. КЭШ-ем это ОЗУ называется только +по традиции, подобно КЭШ-у на КР537РУ10 в компьютерах Pentagon-128. +1.1 Краткие данные платы Sp2000 +Пpоцессоp . . . . . . . . . . . Z84C15 Контpоллеp винчестеpа . . . . . IDE/AT +Тактовая частота . . . . 21MHz/3.5MHz Контpоллеp клавиатуpы . . . 101key/AT +ОЗУ . . . . . . . . . . от 4Mb до 64Mb Контpоллеp мыши . . . . . . . MS-Mouse +КЭШ ОЗУ . . . . . . . . . . . . . 64Kb Два слота . . . . . . . стандаpт ISA-8 +ПЗУ . . . . . . . . . . . . . . .256Kb Аналог AY-3-8910 в ПЛМ . . stereo-OUT +Видео-ОЗУ . . . . . . . . 256Kb(512Kb) COVOX . . . . . . . . . . stereo-16bit +Контpоллеp дисков . . . . . Кp1818ВГ93 Выход видео на TV или CGA монитоp, RGB +Поддеpжка 1.44Mb фоpмата . . 3.5"диска Видео-pежимы: . . . Spectrum standart +CMOS-часы . . . . . . . . . . . DALLAS GRAF 320x256x256,640x256x16, TXT 80x32 +1.2 Техническая реализация +Ядром машины являются процессор Z84C15 и ППЛМ фирмы ALTERA - EP1K30QC208-3. Кроме них +на плате присутствуют микросхемa ПЗУ, слот под 72х-пиновый SIMM на 4-64Mb, 256Kb видео-ОЗУ, 64Kb +КЭШ-ОЗУ, схема контроллера дисковода на БИС КР1818ВГ93, буферы для подключения джойстика, маг- +нитофона, принтера, клавиатуры, дисководов, винчестера, мыши, буферные микросхемы шины ISA-8 и еще +одна ППЛМ фирмы ALTERA – EPM7064SLC100. Эта ППЛМ не меняет своей конфигурации и предназна- +чена для обеспечения синхронизации и начального запуска компьютера. На плате так же предусмотрена +возможность подключения CMOS часов – микросхемы DALLAS. Кроме периферии и буферов имеются +микросхемы дешифрации, входы которых подключаются к процессору через ППЛМ. Это позволяет легко +менять адресацию устройств без какого либо изменения разводки печатной платы. +1.3 Возможности машины +Схема компьютеpа основана на большой пеpепpогpаммиpуемой логической микpосхеме. Подключение +периферийных устройств через ППЛМ позволяет получить высокую гибкость машины по конфигурациям. +Пpогpаммиpование ППЛМ осуществляется непосpедственно в момент включения, а так же пpи пеpеза- +гpузке, что позволяет каpдинально менять схему в ППЛМ непосpедственно во вpемя pаботы. Это сильно +===== PAGE 5 ===== +1 АРХИТЕКТУРА КОМПЬЮТЕРА 5 +выделяет архитектуру Sprinter-а из ряда существующих компьютеров, и многие понятия, присущие обыч- +ным машинам, меняют свой смысл. Фактически компьютер имеет гибкую архитектуру, в которой возможны +изменения во многих частях схемы. Например, нельзя говорить о конкретных адресах портов подключе- +ния периферии, так как они могут быть изменены в одну секунду путем перепрограммирования ППЛМ и +данных в ОЗУ, отвечающих за конфигурацию портов. Конкретные адреса появляются только в конкретных +конфигурациях, например, в конфигурации ZX-Spectrum. +Перепрограммируемость схемы дает большую свободу фантазии программиста по конфигурации маши- +ны. Задумывая конкретную работу программист может определить в какой конфигурации ее можно сделать +лучше, а, возможно, и придумать свою конфигурацию, которую затем можно реализовать в ППЛМ и вклю- +чить перед запуском этой программы. +Блок-схема компьютера Sprinter: +Для простоты некоторые буферы и дешифраторы на схеме не указаны. Количество проводов в шинах +так же условны. +Дальнейшее описание архитектуры является описанием конкретных конфигураций и их частей. Но перед +этим следует сказать несколько слов о переключении конфигураций. +1.4 Загрузка конфигураций +В момент включения компьютера, а так же после нажатия на RESET вся информация, находившаяся +в ППЛМ отвечающая за конкретную конфигурацию, стирается. ППЛМ переходит в режим ожидания +загрузки блока данных схемы. +В этот момент процессор полностью отключен от какой либо периферии. В его адресное пространство +памяти оказывается включено только ПЗУ и возможно подключение КЭШ ОЗУ. Любая запись в адресное +пространство памяти процессора в этот момент приводит к записи данных в ППЛМ и программа в подклю- +ченной странице ПЗУ имеет только одну единственную цель – загрузить в ППЛМ данные конфигурации. +В этой же странице ПЗУ находятся данные начальной конфигурации. Программа загрузки конфигурации +проверяет флаг в КЭШ-памяти и, если он установлен, загружает в ППЛМ данные из КЭШ, если сброшен, +то данные из ПЗУ. На этом основано переконфигурирование схемы компьютера. +===== PAGE 6 ===== +2 КРАТКОЕ ОПИСАНИЕ КОНФИГУРАЦИЙ 6 +Для изменения схемы используется функция BIOS, которая загружает в КЭШ-память блок данных +конфигурации выставляет флаг, которым является текстовая строка «ACEX_30K_LOADING», после чего +производится полный сброс, который осуществляется программно записью в специальную страницу памяти +RESET_PAGE. Программа в ПЗУ, запускаемая по сбросу находит флаг «ACEX_30K_LOADING» и начинает +загрузку данных в ППЛМ. Oдновременно она затирает флаг, что предотвращает повторную загрузку новой +конфигурации при нажатии на кнопку RESET и позволяет вернуться после «ручного» сброса в начальную +конфигурацию. Затирание флага так же избавляет от мучений в случае подключения неправильной кон- +фигурации во время экспериментов с программами. Нажатие на RESET всегда вернет схему в начальную +конфигурацию. +Примечание: Внутренняя информация блока данных ППЛМ является закрытой информацией фирмы +ALTERA. Кроме самих микросхем ППЛМ ALTERA поставляет и программное обеспечение для разводки +схем внутри ППЛМ. К сожалению, эта программа не может работать на компьютере типа ZX-Spectrum +и в ближайшем обозримом будущем не предвидится ее версия для Sprinter-а. Поэтому разработка но- +вых конфигураций может производится только при наличии достаточно мощной машины (все делалось на +Pentium-166) и программы разводки схем в ППЛМ – MAX-Plus II. +В связи с этим, в данный момент Sprinter имеет несколько конкретных конфигураций, три из которых +(Sprinter-2, Sprinter-1, ZX-Spectrum+AY) записаны в ПЗУ, а остальные могут быть подгружены с дискеты +или винчестера. Постоянно ведется совершенствование конкретных конфигураций и разработка новых. В +плате Sp2000 эти конфигурации объединены в одной прошивке ППЛМ. +2 Краткое описание конфигураций +В этом параграфе дано краткое описание конфигураций компьютера Sprinter-97. Более полное описание с +примерами программирования будет дано в части III. Для платы Sp2000 так же имеются эти конфигурации, +поэтому описание приводится без изменений. +2.1 Конфигурация Sprinter-1 +Включает в себя конфигурацию Spectrum-128/256, распределение памяти до 4Mb, расширенный экран +с режимами Spectrum, Text-80x32, Graf-320x256x256, контроллер дисковода, контроллер IDE винчестера, +контроллер клавиатуры AT, подключенной как ZX-Keyboard, 8-bit COVOX. +Эта конфигурация приближена к конфигурации ZX-Spectrum и позволяет работать на обычных спек- +трумовских программах и постепенно менять их под расширенные режимы экрана и памяти, а так же для +работы с новыми устройствами. +2.2 Конфигурация Sprinter-2 +Включает в себя конфигурацию Spectrum-128/256, распределение памяти до 4Mb, расширенный экран +с режимами Spectrum, Text-80x32, Graf-320x256x256, контроллер дисковода, контроллер IDE винчестера, +контроллер клавиатуры AT (построенный на внутреннем последовательном порте процессора), Accelerator, +COVOX. +Конфигурация, как и Sprinter-1 приближена к спектрумовской, но имеет более жесткие требования к +программам по совместимости. Позволяет использовать акселератор операций с основным и видео-ОЗУ. +Акселератор ускоряет операции пересылки блоков данных и заполнения ОЗУ одним байтом до физического +предела скорости основного ОЗУ. В последней версии он так же позволяет ускорить логическую обработку +блоков данных по функциям AND, OR, XOR. +2.3 Конфигурация ZX-Spectrum+AY +Эта конфигурация максимально приближена к ZX-Spectrum-128/256 и включает в себя схему музыкаль- +ного сопроцессора AY-3-8910. В этой конфигурации отсутствуют расширенные режимы экрана. +Третья версия схемы AY в соответствии с реальным сопроцессором включает в себя три генератора +голосов, генератор шума и регуляторы амплитуды, генератор огибающей. +===== PAGE 7 ===== +7 +На данный момент в схеме формирователя огибающей обнаружена небольшая ошибка. В следующей +версии AY предполагается данный недостаток исключить. +2.4 Конфигурация Game-1 +Похожа на конфигурацию Sprinter-2. Акселератор не имеет логических функций. Для вывода звука +имеет COVOX-Blaster (15KHz), позволяющим выводить звук поблочно и освобождать процессорное время +для другой работы. Конфигурация ориентирована на использование в играх для Sprinter-а. +2.5 Kонфигурация DooM +Является дальнейшим развитием конфигурации Game-1. Акселератор имеет дополнительную функцию +по аппаратному растяжению/сжатию вертикальных и горизонтальных линий. +2.6 Конфигурация Video +Конфигурация Video похожа на Game-1, но имеет дополнительную возможность по передачи данных с +HDD прямо в видео-память в момент чтения из HDD. В последней версии добавлен режимGR − 256 − 4x4, +позволяющий выводить видео-ролики с разрешением 160x128 на весь экран (аппаратное удвоение размера +пикселя). +2.7 Особенности платы Sp2000 +В плате Sp2000 описанные выше конфигурации сведены в две прошивки. Первая содержит Sprinter-1, +Sprinter-2 и ZX-Spectrum+AY. Переключение между Sprinter-1 и Sprinter-2 осуществляется через системный +порт, а ZX-Spectrum+AY фактически совпадает с конфигурацией Sprinter-1. Схема музыкального сопроцес- +сора присутствует и доступна, как в Sprinter-1, так и в Sprinter-2. +Конфигурации Game-1, DooM, Video, так же будут сведены в одну прошивку и будут переключаться +через системный порт. +Часть II +Блоки конфигураций компьютера +В этой части описываются блоки конфигураций. В каждой конфигурации возможно использование тех +или иных блоков. О том, какие блоки в каких конфигурациях используются, будет сказано ниже. +3 Основная Память +3.1 Страницы, распределение памяти +Здесь так же приведено описание схемы распределения памяти Sprinter-97. (Для Sp2000 в данный +момент она такая же.) +Структура схемы распределения основной памяти Спринтера является двухуровневой. +Основная память компьютера – 4Mb – разделена на блоки по 16kb, задаваемые однобайтовым номе- +ром. Эти блоки подключаются к логическим блокам Спектрумовской схемы распределения памяти. Что +бы не путать понятия я буду называть блоки основной памяти физическими и писать их номера шестна- +дцатеричными цифрами – #00..#FF. Блоки спектрумовской схемы распределения памяти я буду называть +логическими блоками и писать их номера в десятичной системе – 0..15. +Адресное пространство процессора Z80 разделено на 4 окна с адресами #0000..#3FFF, #4000..#7FFF, +#8000..#BFFF и #C000..#FFFF, которые для краткости я буду называть окнами с номерами 0, 1, 2 и 3. В +каждом окне процессора располагается логический блок памяти согласно Спектрумовскому распределению. +В окно 0 подключено ПЗУ, в окно 1 – страница 5, в окно 2 – страница 2, в окно 3 любая из страниц 0..7 +===== PAGE 8 ===== +3 ОСНОВНАЯ ПАМЯТЬ 8 +для режима Spectrum-128, 0..15 для режима Scorpion-256 и 0..31 для режима Pentagon-512. Кроме этого, в +режиме Scorpion-256 вместо ПЗУ может быть подключена логическая страница с номером 0. +Каждый логический блок имеет свой собственный физический номер подключаемой в него страницы +ОЗУ. Логические страницы с номерами 0, 2 и 5 имеют дублированные номера, один для жесткого подклю- +чения в окна 0, 1, 2 процессора, второй для подключения в окно 3. В режиме Спектрума номера физических +страниц, выставленные в этих блоках, совпадают. +Аналогичным образом на 16kb блоки разделено ПЗУ и КЭШ-ОЗУ. Физический номер страницы ПЗУ +имеет значения #E0..#EF, а КЭШ – #F0..#FF. Реально на данный момент для адресации КЭШ ОЗУ +используются только 2..1 биты из этого номера. +Каждая страница ПЗУ или ОЗУ имеет свой порт, в котором указывается физический номер страницы. +Всего таких портов страниц памяти 32 (в режиме Pentagon-512 добавляются еще 16 портов). 16 портов +отвечают за номера страниц ОЗУ, подключаемые в третье окно процессора. Еще три порта отвечают за +подключение страниц ОЗУ в окна 0..2 Восемь портов используются для подключения различных страниц +ПЗУ. Один порт – для подключения страницы КЭШ-а вместо ПЗУ. И один порт – это порт системной +страницы, подключаемой на место ПЗУ сразу после сброса машины по клавишам Ctrl+Alt+Del. +Оставшиеся 3 порта страниц памяти остаются на данный момент в резерве. Схема распределения памяти +позволяет подключить в адресное пространство процессора не только ОЗУ или ПЗУ, но и порты и память +ISA карт, вставляемых в слот. +При подключении в адреса #C000..#FFFF скорпионовских расширенных страниц ОЗУ, на их место +можно переадресовать слоты. Для этого надо просто записать в порт одной из этих страниц значение, +соответствующее ISA-слоту, к которому необходимо произвести обращение. Это значение так же указывает +===== PAGE 9 ===== +4 ВИДЕО-ПАМЯТЬ 9 +к чему ведется обращение, к портам или памяти слота (конкретные номера будут расписаны ниже). +В некоторых конфигурациях схема распределения памяти упрощается для освобождения ресурсов +ППЛМ. Могут отсутствовать порты #1FFD и #7FFD, а так же упрощается схема работы с устройствами, +отображаемыми на память. +3.2 Видео-область, спектрумовский и графический режим адресации +Запись в видео-ОЗУ может осуществляться двумя способами – через два режима адресации видеопа- +мяти. Это графический и спектрумовский режимы адресации. Графический режим адресации кроме вывода +графики используется и для вывода на текстовый экран. Спектрумовский режим используется для вывода +в режиме Спектрума, а так же для задания знакогенераторов. +Видео-область основного ОЗУ и видео-ОЗУ – суть две различных области памяти. О видео-ОЗУ будет +сказано ниже, а сейчас речь о видео-области основной памяти. +Графическая видео-область в основной памяти составляет 256Kb ОЗУ и соответствует страницам +#50..#5F. При подключении этих страниц в любое окно процессора и при обращении к адресам этого +окна мультиплексор адреса переключается в режим графической адресации. В этом режиме биты 3..0 но- +мера страницы не влияют на адрес памяти, а определяют особый режим вывода, о котором будет сказано +ниже. Адрес памяти в графическом режиме задается номером, засылаемым в RGADR (он же PORT_Y), +о котором так же будет сказано ниже, и десятью младшими битами адреса процессора. В графической +видео-области содержится копия видеоданных, посылаемых на экран в графическом режиме (как будет +ясно далее, копия не точная). +В спектрумовском режиме адресации видео-область основного ОЗУ располагается в адресах +#4000..#5FFF и #C000..#DFFF для спектрумовских страниц 5 и 7. Любая физическая страница основно- +го ОЗУ (кроме #50..#5F) подключенная к этим областям памяти процессора может стать видео-областью. +В этом режиме нет привязки страницы основного ОЗУ к странице видео-ОЗУ. Последняя определяется +через RGADR. +4 Видео-память +Видео-память Спринтера является теневой памятью. Весь вывод в видео-память производится парал- +лельно с выводом в основную (за исключением некоторых особых случаев). При считывании из области +видео-данных считывается информация из основной памяти, а видео остается недоступной. +Недоступность видео-памяти не является принципиальным ограничением и есть признак конфигура- +ции. Перепрограммирование ПЛМ в позволяет получить доступ к видео-ОЗУ, но на данный момент эта +возможность не используется ни в одной прошивке, так как практически не особо требуется. +В работе видеоконтроллера используются два основных режима адресации - спектрумовский и графиче- +ский. В спектрумовском режиме видео-ОЗУ может оказаться тенью любой страницы основного ОЗУ, кроме +страниц #50..#5F. Это позволяет при необходимости иметь множество копий спектрумовского экрана, +например, для случая разработки многозадачного Спектрума. +В графическом режиме видео-ОЗУ является тенью одного 256-килобайтного блока – страниц #50..#5F. +Жесткое закрепление графического образа видео-памяти в основном ОЗУ обусловлено необходимостью +иметь точные копии данных видеорежимов для работы компьютера. +4.1 Спектрумовский режим адресации +В Спектрумовском режиме вся видеопамять разбивается на 32 блока по 8 килобайт. Адрес блока опре- +деляется номером, записываемым в RGADR. Биты 4..0 являются номером блока, бит 7 разрешает использо- +вание 16-килобайтовых страниц, бит 6 запрещает вывод на экран в спектрумовском режиме. Бит 0 вместе +с битом 1 порта #7FFD определяет младший бит номера спектрумовского блока видео-ОЗУ. Таким образом +достигается подключение двух блоков спектрумовского экрана для страниц 5 и 7. +Для примера, запись в RGADR номера #0C приведет к подключению к адресам #4000..#5FFF блока +номер 12, а к адресам #C000..#DFFF (при условии, что установлена спектрумовская страница 7) блока +номер 13. Запись в RGADR нечетного значения #0D приведет к подключению в #4000..#5FFF блока +номер 13, а в #C000..#DFFF (к 7-й странице) блока номер 12. +===== PAGE 10 ===== +4 ВИДЕО-ПАМЯТЬ 10 +Запись в RGADR значения #80 приведет возможности иметь доступ в спектрумовском режиме сразу +к 16kb – двум блокам видео-ОЗУ с номерами 0 и 1 в адресах #4000..#7FFF. Реально этот режим не +использовался и не проверялся. Он был сделан для возможной совместимости со спектрумовским режимом +512 точек в строке, но остался невостребован. +Если при работе какой либо программы требуется больше памяти, но не требуется вывод в спектру- +мовском режиме, RGADR рекомендуется устанавливать в значение #C0..#FF. В этом случае вывод в +видео-ОЗУ в Спектрумовском режиме не производится. +4.2 Графический режим адресации +В графическом режиме адресации видео-ОЗУ используется тот же RGADR. Подобная реализация при- +знана неудобной и в следующем варианте Sprinter-а предполагается разделить порты для графической и +спектрумовской адресации. Неудобство заключается в том, что закрытие спектрумовского режима вывода +осуществляется только при значениях этого порта больше #C0, а в графическом выводе используются +все значения порта. Из-за этого приходится постоянно следить за положением RGADR и перед записью в +адреса #4000..#7FFF устанавливать его в #C0, либо использовать для графического вывода первое окно, +что так же не всегда удобно. +Видео-ОЗУ в графическом режиме адресации разбивается на 256 строк по 1024 байта. Байты в строках +адресуются линейно младшими битами адреса процессора, а номер строки записывается в RGADR. +Расположение строк видео-ОЗУ таково, что спектрумовская адресация оказыватся как бы "попе- +рек"строк. Это сделано для возможности вывода как горизонтальных, так и вертикальных линий с помощью +команды типа LDIR. В графической адресации выводятся горизонтальные линии, в спектрумовской - вер- +тикальные. Реально подобный вывод не использовался, так как оказалось проще выводить вертикальные +линии с помощью акселератора (об этом ниже). +4.3 Подрежимы вывода графической адресации +Как было указано, страницы #50..#5F являются графическими. Адрес данных видео-ОЗУ, а так же +основного ОЗУ в графической адресации зависит от порта RGADR (PORT_Y), и при установке любого +значения из диапазона #50..#5F не меняется. Это используется для введения дополнительных подрежимов +вывода, которые используются для ускорения работы со спрайтовой графикой, а так же для удобства +программирования в некоторых иных случаях. +Два подрежима задается 2-м и 3-м битами номера страницы из #50..#5F. +Бит 3 отвечает за разрешение записи байта #FF. Если при выводе на экран использовать страницy +#58..#5F, то в процессе записи проверятся, не равен ли записываемый байт значению #FF. Если равен, +то запись не производится. +Этот режим можно использовать для вывода спрайтов с «прозрачным» цветом (прозрачный цвет #FF). +Фигурный спрайт выводится как прямоугольник, а все точки, которые не принадлежат спрайту в этом +прямоугольнике записаны байтами #FF. +Бит 2 отвечает за разрешение записи в основное ОЗУ параллельно с видео. Если при выводе использо- +вать страницы #54..#57 или #5C..#5F, то вывод будет осуществляться только в видео-ОЗУ. В основном +останутся те данные, которые были записаны туда ранее. +Этот режим используется для временного вывода на экран, например для вывода курсора мыши без +необходимости запоминания данных под курсором. Они остаются в основном ОЗУ. +Как видно, биты 2 и 3 действуют независимо. Это позволяет комбинировать оба подрежима так как +необходимо программисту. +ВНИМАНИЕ! При программировании вывода на графический экран стоит придерживаться правила, что +в биты 0 и 1 номера страницы записываются нули. Это позволит в будущем беспрепятственно использовать +эти программы в конфигурациях, где эти биты будут выполнять новые дополнительные функции. +4.4 Распределение Video-RAM +Распределение видео-ОЗУ является частично жестким, частично программным. Жеская часть распреде- +ления отвечает где находятся данные видео-режима и данные палитры (более конкретно о них будет сказано +===== PAGE 11 ===== +4 ВИДЕО-ПАМЯТЬ 11 +ниже). Программное распределени отвечает, где находятся данные для вывода в графических, текстовых и +спектрумовском режимах, открываемых функциями биоса. +Пока для дальнейшего объяснения пока достаточно примерного распределения видео-ОЗУ. Данные па- +литры находятся в блоках 30-31 спектрумовской адресации или, что то же самое, на концах линий графи- +ческой адресации – в адресах #03E0..#03FF. Данные режимов экрана находятся в блоках 24..29, или в +терминах линий – в адресах #0300..#039F. Область линий #03A0..#03DF является зарезарвированной +и ее использование в программах не рекомендуется. +Блоки 0..23 или линии по адресам #0000..#02FF обявляются свободно используемыми в программах. +При использовании функций биоса именно в этой области располагаются данные графических и спектру- +мовских экранов. Спектрумовский экран использует блоки 0 и 1 (#0000..#003F). Первый графический +экран использует блоки 2..11 (#0040..#017F). Второй графический – блоки 12..21 (#0180..#02BF). Блоки +22 и 23 (#02C0..#02FF) используются для хранения знакогенераторов текстового режима. Сами же данные +текстового режима находятся в области режима экрана и об этом будет сказано ниже. +4.5 Структура экрана, режимы экрана +Выше была описана адресация видео-ОЗУ так, как оно выглядит для процессора. Вывод же изображения +на телевизор осуществляется с помощью записаной в ПЛМ видео-карты, которая позволяет менять режимы +вывода простой перезаписью информации в видео-ОЗУ. Единственный порт, который меняет выводимое +изображение – порт RGMOD, бит 0 которого переключает страницу режима и таким образом полностью +меняет содержимое видео-экрана. +Режим экрана задается данными в видео-ОЗУ. Весь экран представляет собой набор квадратов раз- +мером 8x8 точек режимa разрешения 320x256. При увеличении разрешения количество точек в квадрате +увеличивается до 16x8. +Режим экрана для каждого квадратика прописывается в области 24..29 блоков видео-ОЗУ. Весь экран +описывается страницей режима, которая может быть переключена битом 0 порта RGMOD. Каждому квадра- +тику на одной странице режима соответствует 8 байт, часть из которых не используется (зарезервировано). +Реально используется от 2-х до 6-ти байт. +Весь экран представляет собой набор из 56x39 (56x40) квадратиков, что соответствует телевизионным +режимам 312(320) полных линий на кадр. Видимая область составляет 40x32 квадратика. Остальные соот- +ветствуют квадратикам, попадающим в область бордера, обратного хода луча и синхроимпульсов. Приници- +пиально возможно использование бордерных квадратиков для вывода изображения, но это не рекомендуется, +так как не все телевизоры способны показывать эту область. +Для подробного объяснения адресов режима я воспользуюсь следующими обозначениями: +P M – страница режима (значения 0 или 1). +SQab – квадратик с номером по горизонтали a и номером по вертикали b. +Line1 – номер графической линии для режима. +Line2 – номер графической линии для подрежима. +LA – адрес точки в графической линии. +M ode0 – первый байт режима. +M ode1 – второй байт режима. +M ode2 – третий байт режима. +M ode4 – четвертый байт режима. +Для каждого квадратика SQab: +Line1 = 1 + 2 ·a + #80 ·P M; Line2 = Line1 + 1; LA = #0300 + 4 ·b. +Параметры a и b принимают значения от 0 до 55 и от 0 до 39 соответственно. SQ0.0 – квадратик в +верхнем левом углу видимой области графического экрана экрана.SQ4.4 – самый верхний левый квадратик +спектрумовского экрана.SQ39.31 – нижний правый квадратик графического экрана. Как уже и было сказано, +квадратики с номерами a больше 39 и b больше 31 соответствуют бордеру и области синхроимпульсов. +Левый и верхний бордер соответствует квадратикам сa = 55 и b = 38(39) соответственно. +Положение байтов M odei в видео-ОЗУ соотстветсуют одинаковому Line и адресу в строке LA + i. +Основной режим определяется в Line1, а подрежим используется при определении основного режима с +===== PAGE 12 ===== +4 ВИДЕО-ПАМЯТЬ 12 +разрешением 640 точек по горизонтали. Если в основном режиме появилось указание на 640 точек, то +после вывода первых 8-ми точек, производится считывание дополнительного режима, с Line2, которое +переопределяет режим второй половинки квадратика. Это позволяет в текстовом 80-символьном режиме +иметь независимое программирование символа и знакогенератора. +Режим вывода в каждый момент времени полностью определяется считанными байтамиM ode0..3. Байт +M ode3 реально не используется и зарезервирован, поэтому режим определяется тремя байтами. +Собственно, сам режим определяется байтом M ode0, байт M ode1 является просто байтом адреса +данных, а M ode2 используется в спектрумовском режиме как адрес атрибутов, а в текстовом собственно +как атрибут символа. +Распишу все режимы: +ZX − 40 – текстовый режим 40 символов в строке или 1 символ на знакоместо. Используется в спектру- +мовском режиме. На экране оказываются три различных знакогенератора, которые расположены в памяти +ровно так, как полагается для Спектрума. +ZX − 80 – текстовый режим 80 символов в строке или 2 символа на знакоместо. Отличительной особен- +ностью является возможность на одном экране иметь до 36 знакогенераторов, указываемых для каждого +символа. +GR − 256 − 8 – графический режим 320x256 точек, 256 цветов. Он же 8x8 точек 256 цветов на одно +знакоместо. В этом режиме (а так же в GR-16-16) экран можно представить как «текстовый»40-символьный, +в котором каждый символ имеет графический образ в 64 байта. Всего таких символов 3072. При опреде- +ленном задании режима графические символы сливаются в одно графическое поле, на котором достаточно +просто рисуются линии и другие графические примитивы. +GR − 16 − 16 – графический режим 640x256 точек, 16 цветов. Он же 16x8 точек 16 цветов на одно +знакоместо. +Следует отметить, что любой из вышеуказанных режимов устанавливается в каждый квадратик инди- +видуально. Таким образом на разных частях экрана могут одновременно присутствовать различные режимы +вывода. +4.6 Спектрумовский режим, он же текстовый +M ode0: +bits 3..0 – старшие биты (4..1) адреса блока, откуда выводятся данные. Младший бит определяется 3-м +битом порта #7FFD. +bit 4 – "1"признак режима. Значение "0"соответствует графическому режиму. +bit 5 – признак разрешения "0"для 640 точек, "1"для 320 точек. +bit 6..7 – старшие биты адреса в блоке (bit 12..11). Они одинаковы как для байта пикселей так и для +байта атрибутов. +Так как в спектрумовском экране используется только три комбинации битов 6..7, четвертая комбинация +определяет особый режим – вывод бордера и синхросигналов. Таким образом комбинация "1111"в старших +битах режима M ode0 особая. При такой комбинации назначения младших битов изменяется, так как для +вывода бордера не требуется никакого адреса данных: +bit 3..2 – значение "11"генерирует в этом квадратике сигнал Blank - гашение. +bit 0 – значение "1"в присутствии сигнала Blank генерирует прерывание для процессора на восьмой +линии квадратика. Именно программированием этого бита в нужном квадратике осуществляется "подгон- +ка"сигнала INT под стандарт Pentagon или Scorpion. +M ode1: +Как уже было сказано, этот байт определяет адрес данных в видео-ОЗУ, выводимых в текущий квад- +ратик. В спектрумовском режиме он соответствует восьми младшим битам адреса в блоке и совместно с +битами 6..7 байта M ode0 определяет адрес спектрумовского символа в блоке. Недостающие 3 бита (bit 10..8) +берутся из счетчика линий в квадратике. +M ode2: +===== PAGE 13 ===== +4 ВИДЕО-ПАМЯТЬ 13 +Определяет младшие восемь бит адреса атрибута. В спектрумовском режиме устанавливается равным +M ode1, а в текстовом используется как байт атрибута символа. При выборке атрибута производится +специальное замешивание битов 6..7 байта M ode0 таким образом, что бы атрибуты оказались в старших +адресах блока по известному спектрумовскому закону. +Как использовать этот режим для текстового режима? +Для этого в один из спектрумовских экранов записывается знакогенератор. Прописывается так, что на +спектрумовском экране он выглядит как набор ASCII из 256-ти символов, выведенных последовательно в +256 знакомест. У этих символов прописывается атрибут просто равный номеру символа. После этого байты +M ode1 и M ode2 оказываются просто равными ASCII коду и атрибуту выводимого символа соответственно. А +байт M ode0 указывает на знакогенератор и в в принципе может определить 36 различных знакогенераторов. +3 за счет битов 7..6, еще 3 за счет битов 3..2 (комбинация "11"в этом месте попадает в область режима экрана +и палитры, куда не стоит вписывать знакогенератор), и еще 4 за счет битов 1..0. Простым премножением +получается 3 ·3 ·4 = 36 знакогенераторов. +Страница режима устроена таким образом, что бы при выводе линии байты атрибута и цвета одного +символа оказались рядом, и символы, расположенные в одной строке выводятся подобно выводу вер- +тикальной линии символов и рядом расположенной вертикальной линии атрибутов. При использовании +акселератора вывод строки оказывается очень быстрым (около миллиона символов в секунду). +4.7 Графический режим +Прежде чем расписывать байты режима объясню, как адресуются графические квадратики. Все видео- +ОЗУ, разбитое на блоки или линии, можно представить в виде квадратиков 8x8 точек. На линии в 1024 +байта умещается 128 квадратиков, каждый из которых по вертикали занимает 8 линий и, таким образом, по +вертикали все видео-ОЗУ разбирается на 32 квадратика. Всего 4096 квадратиков, для адресации которых +необходимо 12 бит. Они берутся из M ode0 (четыре младших бита) и M ode1 после того, как битом 4 байта +M ode0 определен графический режим. +M ode0: +bits 3..0 – старшие биты (4..1) адреса блока, так же как и в спектрумовском, но младший бит номера +блока берется из 2-го битаM ode1. Они же формально представляют собой старшие биты номера квадратика +по горизонтали. +bit 4 – "0"признак режима (графический режим). +bit 5 – признак разрешения "0"для 640 точек, "1"для 320 точек. +bit 6..7 – номер палитры. В каждом квадратике можно задать одну из четырех графических палитр. +M ode1: +bit 1..0 – Дополнительный адрес данных в блоке. Адрес квадратика по горизонтали. +bit 2 – младший бит блока. +bit 7..3 – Адрес квадратика по вертикали. +Подобное "неправильное"разбиение адреса квадратиков возникло в результате оптимизации схемы "по +объему ПЛМ". Ввиду нехватки места было решено, что лучше пожертвовать линейностью адресации в +режиме экрана в пользу возможности иметь дополнительные возможности. В новой версии компьютера +возможно устранение этой нелинейности. +Графический режим 640 точек использует ту же схему адресации квадратиков. при этом каждый байт +рабивается на две точки и таким образом из режима 8x8 256-ти цветных точек получается режим 16x8 +16-ти цветных. Первыми выводятся младшие 4 бита, вторыми – старшие. +4.8 Палитра +Устройство палитры достаточно просто. Каждый момент при выводе точки, с одной из линий считывается +3 байта и выводится в 3 регистра с 3-мя ЦАП-ами на выходе. Таким образом, образуется 3 цвета Red, Greeb +& Blue, которые определяют один из 16 млн. возможных цветов. +===== PAGE 14 ===== +4 ВИДЕО-ПАМЯТЬ 14 +Какие именно три байта выводить определяется схемой видео-карты. Все три байта выводятся всегда из +одной области – с концов линий – адресов #03E0..#03FF. Номер линии соответствуют номеру цвета для +256-ти графического цветного режима или номеру атрибута для текстового и спектрумовского режима. В +указанных адресах умещается 8 палитр по 256 цветов, считая по 1kb на каждую палитру. Реально из этого +килобайта используется только 768 байт. Каждый четвертый байт никуда не выводится и принципиально +схемотехнически не может попасть на регистр ЦАП-а. Четыре из этих восьми палитр используются для +графических режимов и оставшиеся четыре для текстовой палитры. +Про палитру в тексте следует сказать отдельно. Атрибут формально задает один цвет из палитры и, +соответственно, четыре цвета из четырех палитр. из этих четырех цветов на каждую точку попадает только +один. Выбор производится по двум битам – FLASH и биту из регистра сдвига в котором находятся восемь +точек, считанные из знакогенератора. Таким образом, для каждого атрибута задается цвет бумаги, цвет +символа, цвет мерцания бумаги и цвет мерцания символа. Если, например, цвет мерцания бумаги совпадает +цветом бумаги, то мерцания на экране не наблюдается. Аналогично для цвета символа. Подобное решение +позволяет любую кодировку цвета для каждого атрибута и разрешить проблему с различиями атрибутов в +спектрумовском и IBM-ском вариантах. Просто в момент перехода с одного стандарта на другой в палитру +загружаются необходимые данные. +С графической палитрой все просто. Байт точки попадает на адрес линии для конкретной палитры и +соответствующий ей цвет попадает на ЦАП-ы. В 16-ти цветном режиме используются 16 младших цветов +палитры. +#03E0..#03E2 – графическая палитра 0 +#03E4..#03E6 – графическая палитра 1 +#03E8..#03EA – графическая палитра 2 +#03EC..#03EE – графическая палитра 3 +#03F0..#03F2 – текстовая палитра 0 – цвет бумаги +#03F4..#03F6 – текстовая палитра 1 – цвет символа +#03F8..#03FA – текстовая палитра 2 – цвет мерцания бумаги +#03FC..#03FE – текстовая палитра 3 – цвет мерцания символа +Байты расположены в порядке Blue Green Red. +4.9 Процесс вывода на экран +Что бы связать воедино все, что было сказано выше, распишу процесс вывода на экран, происходящий +внутри ПЛМ. +Упрощенная блок-схема видео-контроллера: +===== PAGE 15 ===== +4 ВИДЕО-ПАМЯТЬ 15 +Тактовый генератор задает частоту 42MHz. Первым делом эта частота делится на 3, а затем на 2, +получая 14 и 7 MHz для вывода пикселей. 14MHz в режиме 640 точек и 7MHz в режиме 320 точек. +7MHz делится еще раз на 8 получая номер точки в квадратике. Затем получившаяся частота делится на +56. Этот делитель является и счетчиком знакомест, номер которого подается как часть адреса режима +экрана. Полученная после деления на 56 частота является частотой синхронизации строк. Она делится на +8 вертикальным счетчиком строк знакоместа. Далее деление частоты продолжается и для получения 312 +или 320 линий на кадр используется управляемый счетчик – он же счетчик знакомест по вертикали и часть +адреса режима экрана. И последний счетчик делит полученную частоту кадров на 32 что бы получить +сигнал FLASH. +Данные счетчиков знакомест по горизонтали и вертикали подаются как часть адреса на видео-ОЗУ. +Остальная часть адреса соответствует тому положению, где находятся данные видео-режима. И, таким +образом, из видео-ОЗУ считываются данные режима, а именно 4 байта M odei. Эти байты определяют +в каком режиме выводить данные на экран и из какого места их брать. В соответствии со считанными +байтами M odei из видео-ОЗУ производится следующая выборка, а именно выборка байта знакогенератора +и атрибута для текстового режима или выборка байта цвета для графического. Из этих байтов (а в случае +необходимости и из сигнала FLASH) формируется необходимый адрес цвета в палитре и производится +следующий цикл считывания из памяти, при котором данные сразу же записываются в цветовые регистры +с ЦАП-ами, которые и формируют сигнал цвета для монитора. +Еще раз распишу немного подробнее, по тактам. +Тактовая частота – 42MHz. Период одного пикселя – 6 однотактовых циклов. +Циклы распределяются следующим образом: +T AKT 1 – выборка байта пикселей текстового режима в графическом режиме – холостой ход; +T AKT 2 – выборка текстового атрибутa, он же выборка байта пикселя для GRAF-Modes; +T AKT 3 – выборка 3-х байтов палитры для режимов 640 точек, в 320 - холостой ход; +T AKT 4 – выборка слова режима экрана выборка производится один раз в четыре периода; +T AKT 5 – цикл записи от процессора, данные пишутся только когда нужно; +T AKT 6 – выборка 3-х байт палитры с записью в RGB регистры. +Все начинается с такта 4. Адрес для режима определяется счетчиком вертикали и горизонтали. Счита- +===== PAGE 16 ===== +5 ЗВУКОВОЙ ВЫХОД 16 +ются по 8 точек 320-го режима по вертикали и по 8 строк по горизонтали. Считанные данные помещаются +в регистры режима M odei, описанные выше. +С пятым тактом все ясно. За исключением того, что для графического и текстового режимов изменяется +адресация ОЗУ Изменение задается номером страницы Страницы 50..5F считаются графическим ОЗУ. +Следует отметить, что понятие графического и текстового режима адресации не совсем верно отражает суть. +Вывод данных в экранное ОЗУ может осуществляться в обоих режимах независимо от действительного +режима экрана. +6-й такт. Чтение палитры. В текстовом режиме адрес палитры составляет 10 бит. 8 бит – байт атрибута. +1 бит – пиксель. 1 бит – FLASH. Этот бит фактически переключает две палитры с частотой FLASH. Если +палитры для данного атрибута совпадают то FLASH не наблюдается. +В графическом режиме адрес палитры составляет 8 бит байта пикселя и 2 бита номера палитры, считан- +ного в 4-м такте, но задержанного на 1 период для синхронного изменения режима и палитры в знакоместе. +Еще один бит адреса используется для разделения палитр текстового и графического режимов. Остав- +шиеся адреса ОЗУ устанавливаются в "1"и вся палитра оказывается на концах 1024-х байтовых линий +графического режима. +Такт 1. Здесь начинает действовать новый режим, считанный в такте 4. Адрес ОЗУ является адресом +байта пикселей текстового режима. Байт пикселей записывается в сдвиговый регистр и первый выдвинутый +бит начинает действовать в 6-м такте. +Такт 2. Выбирается байт атрибута. Адрес отличается от адреса байта пикселей по известному Спек- +трумовскому закону. Если перед этим в 4-м такте был считан графический режим, то Адрес атрибута +становится другим и соответствует байту пикселя графического режима. Регистр атрибута в графическом +режиме является регистром байта пикселя. +Такт 3. Чтение палитры для режима 640 точек. Следует заметить что в графическом режим 640 точек, 4 +старших бита регистра пикселя маскируются нулями и в этом такте в младших битах адреса оказываются +те четыре бита, которые были замаскированы в 6-м такте. Так организуется 16 цветов на точку. +5 Звуковой выход +Звуковой выход платы Sp2000 представляет собой двухканальный 16-тибитный ЦАП - TDA1543, под- +ключенный к ППЛМ. В данный момент реально используется 10 бит, для одновременного вывода 8-bit +COVOX-а и сигнала AY-3-8910. +5.1 AY-3-8910 +В ППЛМ платы Sp2000 вписывается схема, содержащая в себе схему аналога музыкального сопроцес- +сора AY-3-8910/8912. Его программирование осуществляется по стандартным описаниям. +5.2 Бипер/Covox +Стандартный спектрумовский бипер (бит 5 порта #FE) выведен через ту же схему, что и Covox, и AY. +(TDA1543) Программируется стандартно. +Covox – 8-бит – позволяет выводить WAV сигналы. В стандартной конфигурации Covox подключен на +порт #FB и #4F. Вывод последовательности байтов в любой из этих портов приведет появлению сигнала +на звуковом выходе. +В стандартной конфигурации на выходы левого и правого канала выдается один и тот же сигнал (моно- +фоническое звучание). +5.3 COVOX-Blaster (CBL) +Covox-Blaster (CBL) – Covox с буферным ОЗУ. +Подключение буферного ОЗУ осуществляется по следующей схеме: +===== PAGE 17 ===== +5 ЗВУКОВОЙ ВЫХОД 17 +Счетчик работает на частоте 15 или 22 килогерца, в зависимости от состояния порта конфигурации +Covox-а. Адрес мультиплексируется на момент записи в порт из процессора, все остальное время данные +из ОЗУ записываются в регистр ЦАП-а. +Ввод байтов в буферное ОЗУ осуществляется командой OTIR (OUTI), что позволяет ускорить вывод +звука и создать достаточно большие паузы для работы других частей программы. Так как при использовании +команды OTIR регистр B (который попадает на A15..A8 процессора) уменьшается, для нормальной работы +CBL счетчик считает «назад». +Для контроля за работой Covox-Blaster-а используется бит 7 порта #FE, в который выводится старший +бит счетчика. Блок ОЗУ 256 байт условно разбит на две банки по 128 байт, и бит 7 порта #FE указывает +какая из банок ОЗУ выводится в ЦАП в конкретный момент времени. Это используется программой вывода +для определения, нужно ли подгружать следующие 128 байт в буфер. +В плате Sp2000 COVOX-Blaster включен в основную прошивку и включается через порт управления +CBL - #4E. Запись в этот порт значения #80 приводит к включению режима CBL, #00 - включение +обычного COVOX-а. Другие биты порта #4E имеют значение и их следует выставлять в 0 для получения +описанного выше режима CBL. В дальнейшем этот порт будет устанавливать режимы Stereo, 8/16-bit и +частоту. +;*********************************************************************** +; +; Пример программы для Covox-Blaster-a. +; +;*********************************************************************** +CLEAR_COVOX: ; программа для очистки буфера ОЗУ и +; отключения звука +LD A,80H ; значение, эквивалентное нулю на выходе Covox +LD BC,0FBH ; порт Covox-Blaster-а +CLEAR_CBL: +OUT (C),A +DJNZ CLEAR_CBL +XOR A +LD (SND_P),A ; установить в страницу звука 0 (нет звука) +RET +;*********************************************************************** +SOUND_START: ; программа инициализации Covox-Blaster-а +;======================================================================= +; здесь должна располагаться программа, которая +; произведет рассчет первой страницы данных для COVOX-бластера и +===== PAGE 18 ===== +5 ЗВУКОВОЙ ВЫХОД 18 +; адреса данных. Страница и адрес соответственно в регистры A и HL +;======================================================================= +LD (SND_A),HL ; запомнить состояние адреса звука +LD (SND_P),A ; запомнить новую страницу WAV-данных +RET +SND_A DB 0 +SND_P DW 0 +;*********************************************************************** +SOUND: +PUSH AF +LD A,(SND_P) ; проверка, что страница WAV-данных не равна 0 +AND A +JR Z,RET_ALL ; иначе выход -- нет звука +PUSH HL +SND_MORE: +IN A,(0FEH) ; бит 7 порта #FE указывает состояние 7-го бита +; счетчика выводимого байта (банк 0/1) +XOR 0 ; запомненное состояние Covox адреса +COV_ADR EQU $-1 +AND 80H ; проверить, переключение банки 128 байт +JP NZ,NO_LD_SND ; если изменения не было, вернуться. +LD A,(SND_P) +AND A +JR Z,RET_ALL +PUSH DE +PUSH BC +LD A,(COV_ADR) ; взять адрес Covox-а. +CPL ; инвертировать +LD B,A ; запомнить в B +LD HL,(SND_A) ; взять адрес WAV-данных +LD C,0FBH ; порт Covox-Blaster-а +IN A,(PAGE3) ; запомнить состояние PAGE3 +LD E,A +LD A,(SND_P) ; взять номер страницы WAV-данных +OUT (PAGE3),A ; переключить PAGE3 +LD D,16 ; повторять 16 раз +L_DDX: +OUTI ; выводить в Covox-Blaster +OUTI ; (OUTI работает несколько быстрее, чем OTIR) +OUTI +OUTI +OUTI +OUTI +OUTI +OUTI +DEC D +JR NZ,L_DDX +===== PAGE 19 ===== +6 АКСЕЛЕРАТОР ОПЕРАЦИЙ С ОЗУ 19 +LD (SND_A),HL ; запомнить состояние адреса звука +LD A,H ; проверить, что адрес не дошел до конца страницы +AND A +JP NZ,NO_SNDP ; если не дошел, идти на выход +LD A,E ; вспомнить страницу PAGE3 +OUT (PAGE3),A +;======================================================================= +; здесь должна располагаться программа, которая +; произведет рассчет новой страницы данных для COVOX-бластера и +; адреса данных. Страница и адрес соответственно в регистры A и HL +;======================================================================= +LD (SND_A),HL ; запомнить состояние адреса звука +LD (SND_P),A ; запомнить новую страницу WAV-данных +JR NO_SNDP1 +NO_SNDP: +LD A,E ; вспомнить страницу PAGE3 +OUT (PAGE3),A +NO_SNDP1: +POP BC +POP DE +NO_LD_SND: +POP HL +RET_ALL: +POP AF +RET +5.4 Sprinter-Sound-Card (SSC) +Разработанная на данный момент Sound-Card для Спринтера не поддерживается ни в одной прошивке +ввиду довольно большого занимаемого объема ПЛМ. В плате Sp2000 объем уже достаточен и конкретная +прошивка с SSC находится в планах. +Основные параметры SSC: +2 выходных канала (Stereo-OUT) +Шестнадцать 8-битных голосов +256-byte Wave-Tables своя для каждого голоса +8-bit регулятор амплитуды для каждого голоса и каждого канала +Программирование в данном описании не приводится ввиду возможной полной переработки схемы SSC. +6 Акселератор операций с ОЗУ +Акселератор операций с ОЗУ предназначен для ускорения операций по пересылке данных или по за- +полнению ОЗУ одним байтом. Акселератор присутствует в чисто Sprinter-овских конфигурациях и поэтому +никак не мешает работе обычных Spectrum-овских программ. +Основой акселератора является быстрое внутреннее ОЗУ в ППЛМ. Операции по пересылке данных +производятся путем записи блока данных в это внутреннее ОЗУ, а затем копировании его в нужное место +памяти из этого ОЗУ. После одной записи копирование может производиться несколько раз и таким образом +можно производить заполнение экрана текстурами. +===== PAGE 20 ===== +6 АКСЕЛЕРАТОР ОПЕРАЦИЙ С ОЗУ 20 +Для заполнения экрана одним цветом используется другой режим акселератора. В нем вместо копиру- +емого блока данных из внутреннего ОЗУ производится запись данных с шины процессора, которые в этот +момент не изменяются. +Блок данных, записываемый в ОЗУ акселератора может иметь различную длинну из диапазона 1..256 +байт. +Управление акселератором производится непосредственно из программы. Для этого изпользуются ко- +манды процессора, которые фактически являются операциями типа NOP. Это команды LD A,A; LD B,B; +LD C,C; LD D,D; LD E,E; LD H,H, LD L,L +Назначение команд следующее: +LD B,B - выключить акселетарор. +LD D,D - включить акселератор в режим приема байта размера блока +далее следует команда типа LD A,dat, где dat и будет новым +размером блока. Если размер блока был установлен ранее, +его можно не устанавливать. +LD C,C - Операция Fill - заполнение одним байтом. Последующая +команда типа LD (HL),A приведет к заполнению указанного +ранее количества байт значением A +LD E,E - Операция Fill для графического экрана - заполнение +вертикальных линий. +LD H,H - rezerved +LD L,L - копирование блока. Последующая команда типа LD A,(HL) +приведет к заполнению ОЗУ акселератора данными из адреса (HL), +а команда типа LD (DE),A приведет к перезаписи данных из ОЗУ +акселератора в основное или видео-ОЗУ. +LD A,A - копирование блока для графического экрана подобна команде +LD L,L, но работает с вертикальными линиями экрана. +Пример использования акселератора: +; Считаем, что экранная страница уже открыта по адресу #C000 +LD HL,#C040 ; адрес начала линии первого экрана +LD DE,#C180 ; адрес начала линии второго экрана +LD BC,#140 ; длина экрана по горизонтали +DI ; запретить прерывания для работы с акселератором +LD D,D ; включить акселератор на установку размера блока +LD A,0 ; установить размер блока - 256 байт +LD A,A ; установить акселератор на копирование +; вертикальных линий. +LDIR ; копировать ! +LD B,B ; выключить акселератор +EI ; включить прерывания +Этот отрезок программы произведет копирование всего экрана с одного экрана на другой. Время его +исполения составляет примерно 1.2 инта. +Дополнительные функции акселератора (AND, OR, XOR) работают подобным же образом. Для выпол- +нения логических функций используются команды XOR (HL); OR (HL); AND (HL). +Пример кодирования блока в 256 байт. +LD HL,ADRES_1 +LD DE,XOR_DAT +DI +LD D,D +===== PAGE 21 ===== +7 КЭШ-ОЗУ 21 +LD A,0 ; число байт, которые надо закодировать +LD L,L +LD A,(DE) ; взять блок данных в ОЗУ акселератора +XOR (HL) ; произвести операцию XOR с данными акселератора +LD (HL),A ; запомнить в ОЗУ результат операции +LD B,B +EI +Скорость работы акселератора ограничивается только физической скоростью работы основного ОЗУ. +Определить время работы команды с акселератором можно по такой примерной формуле: +Время работы = время работы команды без акселератора + время работы акселератора +Время работы акселератора = число пересылаемых байт /7000000 (секунд) +Отключение прерываний во время работы акселератора необходимо, так как в этот момент сильно ме- +няется система команд процессора и программа на прерывании не сможет работать нормально. В данный +момент применяется прошивка, в которой акселератор может работать в режиме со включенными прерыва- +ниями. В момент прихода прерывания он отключается и включается обратно по команде RETI. Использовать +этот режим следует с осторожностью. +7 КЭШ-ОЗУ +Кэш-ОЗУ подключается двумя способами – через порт #FB стандартно по Pentagon-овски и как подобно +ПЗУ через спец-порт... +7.1 Загрузка новых прошивок в ПЛМ +Описание загрузки прошивок с использованием функции BIOS... +8 ISA, порт A20 +Доступ к устройствам, подключенным к ISA шине осуществляется через страницы памяти. Для полу- +чения этого доступа достаточно установить расширенную Scorpion-овскую страницу и установить в нее +номер страницы ОЗУ – #D0..#DF. Бит 1 номера означает выбор доступа к порту или памяти ISA, а бит 2 +определяет к какому из двух слотов осуществляется доступ. +9 Внутренние порты Z84C15 +Ссылка на описание PIO, SIO и т.д. от Zilog. +Один момент. Конфликт #1F с джойстиком и ВГ93 С джойстиком все пpосто. Ему вывод в #1F не ме- +шает, а ввод из #1F для pаботы с поpтом не тpебуется. Пpи отключенном TR-DOS, с ВГ93 нет конфликтов, +когда же он включен, то SP-DOS вместо #1F использует #0F, это избавляет от конфликта с паpаллельным +поpтом. Для ноpмальной pаботы пpогpамм использующих #1F в пpошивке сделано аппаpатное пеpенапpав- +ление поpта #1F в поpт #0F. Следовательно команды OUT (#1F),A пpосто не сpаботают. +Что бы записать во внутpенний поpт пpоцессоpа, надо использовать вывод чеpез BC, т.е. LD BC,#1F : +OUT (C),A. Эта команда не пеpенапpавляется. Это пpичина того, почему некотоpые пpогpаммы могут не +увидеть джойстика. Они используют IN A,(C)... +===== PAGE 22 ===== +9 ВНУТРЕННИЕ ПОРТЫ Z84C15 22 +9.1 Мышь +; (c) Denis Parinov +CMOUSE EQU #1B +DMOUSE EQU #1A +VSIZEX EQU 256 ;X SIZE SCREEN +VSIZEY EQU 192 ;Y SIZE SCREEN +;INTERUPT +CALL READ_M +CALL C,MCORECT +RET +;READING MOUSE +; HL - X COORD +; DE - Y COORD +; A - BUTTONS +; D0 - LEFT +; D1 - RIGHT +MS_READ LD HL,(PIX_X) +LD DE,(PIX_Y) +LD A,(MB) +RET +;INITIALIZING COM PORT +MS_INIT DI +LD A,85 +OUT (#10),A +LD A,45 +OUT (#10),A +LD A,0 +OUT (CMOUSE),A +LD A,1 +OUT (CMOUSE),A +LD A,0 +OUT (CMOUSE),A +LD A,3 +OUT (CMOUSE),A +LD A,#41 +OUT (CMOUSE),A +LD A,4 +OUT (CMOUSE),A +LD A,#47 +OUT (CMOUSE),A +LD A,5 +OUT (CMOUSE),A +LD A,#E0 +OUT (CMOUSE),A +EI +RET +READ_M IN A,(CMOUSE) +RRCA +===== PAGE 23 ===== +9 ВНУТРЕННИЕ ПОРТЫ Z84C15 23 +RET NC +IN A,(DMOUSE) +LD L,A +BIT 6,A +CCF +RET Z +TST_01 IN A,(CMOUSE) +RRCA +JP NC,TST_01 +IN A,(DMOUSE) +LD E,A +BIT 6,A +CCF +RET NZ +TST_02 IN A,(CMOUSE) +RRCA +JP NC,TST_02 +IN A,(DMOUSE) +LD D,A +BIT 6,A +CCF +RET NZ +LD A,E +AND #3F +LD E,A +LD A,L +AND #03 +RRCA +RRCA +OR E +LD E,A +LD A,D +AND #3F +LD D,A +LD A,L +AND #0C +RRCA +RRCA +RRCA +RRCA +OR D +LD D,A +LD A,L +RLCA +RLCA +RLCA +RES 6,A +JR NC,STBU +SET 6,A +STBU RLCA +RLCA +AND #03 +LD (MB),A +LD A,E +===== PAGE 24 ===== +9 ВНУТРЕННИЕ ПОРТЫ Z84C15 24 +LD (MX),A +LD A,D +LD (MY),A +SCF +RET +MCORECT LD HL,(PIX_X) +LD DE,(MX) +LD D,0 +BIT 7,E +JP NZ,DECX +ADD HL,DE +LD (PIX_X),HL +EX DE,HL +LD HL,VSIZEX-1 +AND A +SBC HL,DE +JP NC,YCOO +LD HL,VSIZEX-1 +LD (PIX_X),HL +JP YCOO +DECX LD A,E +NEG +LD E,A +AND A +SBC HL,DE +LD (PIX_X),HL +JP NC,YCOO +LD HL,0 +LD (PIX_X),HL +YCOO LD HL,(PIX_Y) +LD DE,(MY) +LD D,0 +BIT 7,E +JP NZ,DECY +ADD HL,DE +LD (PIX_Y),HL +EX DE,HL +LD HL,VSIZEY-1 +AND A +SBC HL,DE +RET NC +LD HL,VSIZEY-1 +LD (PIX_Y),HL +RET +DECY LD A,E +NEG +LD E,A +AND A +SBC HL,DE +LD (PIX_Y),HL +RET NC +LD HL,0 +===== PAGE 25 ===== +9 ВНУТРЕННИЕ ПОРТЫ Z84C15 25 +LD (PIX_Y),HL +RET +PIX_X DEFW 128 +PIX_Y DEFW 96 +MX DEFB #00 +MY DEFB #00 +MB DEFB #00 +9.2 Принтер +Простой драйвер принтера... +9.3 Прерывания от ISA +Режим прерываний от ISA устанавливается через программирование PIO Z84C15 (управление портом B +– 1Fh), описанное выше. Назначение битов самого порта следующее (внутренний порт Z84C15 1Eh, port B +PIO): +Bit0 - IRQ1 вход прерываний с первого слова +Bit1 - IRQ2 вход прерываний со сторого слова +Bit2 - DRQ2 вход +Bit3 - DACK2 выход +Bit4 - DRQ1 вход +Bit5 - DACK1 выход +Bit6,7 - используются для Printer-а +9.4 AT-Клавиатура +При программировании AT-клавиатуры следует помнить, что последовательный порт имеет FIFO буфер +на 3 байта. После того, как принят и обработан один байт, стоит проверить нет ли еще принятых байтов и +возвращаться из программы обработки клавиатуры только если этих байтов нет. +Программа инициализации клавиатуры и считывания байта. +;*********************************************************** +; Процедура инициализации клавиатуры +;*********************************************************** +COM_A EQU 19h +DAT_A EQU 18h +KBD_INIT: +LD A,0 ; установка портов режима +OUT (COM_A),A ; в соответствии с описанием +LD A,1 ; последовательного порта Z84C15 +OUT (COM_A),A ; +LD A,0 +OUT (COM_A),A +LD A,3 +OUT (COM_A),A +LD A,0C1h +OUT (COM_A),A +LD A,4 +OUT (COM_A),A +LD A,5h +===== PAGE 26 ===== +10 КОНТРОЛЛЕР FDD 26 +OUT (COM_A),A +LD A,5 +OUT (COM_A),A +LD A,062H +OUT (COM_A),A +RET +;*********************************************************** +; Процедура считывания байта с клавиатуры +;*********************************************************** +READ_KBD: ; считывание с клавиатуры +IN A,(COM_A) +BIT 0,A ; проверить наличие байта +SCF ; установить флаг C +RET Z ; и вернуться, если не было байта +IN A,(DAT_A) ; считать байт +AND A ; сбросить C +RET ; и вернуться +Особенности спектрумовской реализации (доп бит для F1..F10) +9.5 Таймеры +Как пример, программа вывода Wav (от Алексея Гавриленко?) +10 Контроллер FDD +Все программирование ВГ93 стандартно. Следует обратить внимание только на замену порта #1F на +#0F в программе ПЗУ. В случае использования своих программ, этот порт так же должен быть #0F. +10.1 720/1.44 +Программа переключения 720/1.44 для платы Sp2000. Обе должны выполняться в режиме TR-DOS и +или при специально открытых портах 00BDh и 20BDh. +Set_1440: +LD A,21h +OUT (0BDh),A +RET +Set_720: +LD A,01h +OUT (0BDh),A +RET +Использовать напрямую не рекомендуется, лучше пользоваться функциями BIOS для работы с дискета- +ми. +11 Контроллер HDD +Краткое описание контроллера, чтение/запись секторов через BIOS. Ссылка на документ по IDE... +===== PAGE 27 ===== +12 CMOS 27 +12 CMOS +Порты CMOS: +#FFBD – Data Read +#BFBD – Data Write +#DFBD – Adress Write +Записывать какие либо данные в CMOS без ведома BIOS-а не рекомендуется. Исключение – установка +регистров времени/будильника. +12.1 Описание регистров CMOS +PDF от Dallas 12887A... +13 Дешифрация ПЗУ/КЭШ/Контроллеры/и т.п. +Особенности обращения к ПЗУ/КЭШ/ISA... +13.1 Схема распределения портов +Sprinter имеет две обособленные группы портов. Первая группа, это внутренние порты процессора +Z84C15, вторая – внешние порты. Адресация портов первой группы не может быть изменена, так как +эти порты на одном кристалле с процессором. Вторая группа погключается через ППЛМ и их адреса могут +изменяться как угодно, с единственным условием, непересечения с адресами первой группы. +О том какие порты имеются на кристалле Z84C15 можно прочитать в документации по этому процессору +и здесь я упомяну некоторые из них. Один из последовательных портов используется для ввода данных +с активной мыши. Один из параллельных используется для вывода данных, на второй параллельный порт +заведены сигналы прерываний и запросов прямого доступа со слотов ISA. Параллельный порт процессора +Z84C15 устроен таким образом, что на нем возможна организация прерываний по сигналам приходящим +через параллельный порт. Фактически второй параллельный порт используется как контроллер прерываний. +Схема распределения портов второй группы имеет свою особенность. Главной идеей было получение воз- +можности бысро изменять конфигурацию портов без перегрузки ППЛМ. Это достигнуто путем применения +карты распределения портов, располагающейся на специальной странице ОЗУ. +При появлении цикла обращения к порту сначала происходит обращение к ОЗУ карты портов. В карте +портов записано какой именно порт подключен к данному адресу. Далее происходит внутренняя дешифрация +по байту из карты портов и обращение к выбранному порту. В режиме нетурбо это происходит без каких +либо задержек, а в режиме турбо процессору выставляется сигнал WAIT в зависимости от необходимой +длины цикла обращения к порту. +Для подключения к какому либо адресу или отключения от него какого либо порта достаточно открыть +карту портов и вписать в нужное место один байт. +В странице карты портов содержится четыре карты, которые могут переключаться через системный порт. +Таким образом можно осуществить быстрое переключение конфигурации портов, что может быть полезно +при работе Spectrum-овских программ совместно со Sprinter-овским биосом. +Карты портов расположена в странице 40h. Переключение производится через системный порт (адрес +7Ch/3Ch). При записи в системный порт значений 04h,0Ch,14h,1Ch происходит переключение на одну из +четырех карт. Начальное значение 04h. +Номер карты соответсвует адресам A12,A13 в странице (блоки по 4kb). На остальные адреса подаются +следующие сигналы: +A0 - A0 +A1 - A1 +A2 - A2 +A3 - A7 +A4 - A13 +===== PAGE 28 ===== +13 ДЕШИФРАЦИЯ ПЗУ/КЭШ/КОНТРОЛЛЕРЫ/И Т.П. 28 +A5 - A5 +A6 - A6 +A7 - A14 +A8 - A15 +A9 - /WR - сигнал записи +A10 - /DOS - 0 - дос включен, 1 - выключен +A11 - PN5 - сигнал блокировки порта Пентагона (может отсутствовать) +Таким образом порт выбирается именно по указанным сигналам, т.е. например, нельзя назначить на ад- +реса 0050h и 0058h различные порты. Участие в дешифрации сигнала /WR позволяет назначать различные +порты на один и тот же адрес на чтение и запись. Так, например, в схеме контроллера дисковода на порт +0FFh на чтение назначено чтение порта джойстика и сигналов DRQ, INTRQ контроллера дисковода, а на +запись - запись в микросхему ТМ9 - системный порт TR-DOS. +Назначение порта производится записью соответствующего байта в карту памяти. Так, для того что +бы назначить на некий адрес, скажем, на 7785h некий порт, первым делом следует удостовериться, что +этот порт не пересекается ни с какими другими портами. Проще всего, это узнать, прочитав карту памяти +из адреса, соответсывющего этому порту. Если в этом месте оказался нуль, значит, порт не занят и его +возможно использовать (надо помнить, что не все незанятые порты стоит использовать, так как есть еще и +внутренние порты Z84C15). +Как определить адрес, откуда читать байт? +Для этого надо из 7785h выделить биты 0, 1, 2, 5, 6, 7, 13, 14, 15, и установить соответсвенно им биты +адреса карты памяти: +A0=p_A0=1, A1=p_A1=0, A2=p_A2=1, A3=p_A7=1, A4=p_A13=1, A5=p_A5=0, +A6=p_A6=0, A7=p_A14=1, A8=p_A15=0, A9=xxx, A10=xxx, A11=xxx. +Значениe xxx имеeтся в виду «не определено» . Это означает, что в карте памяти по всем адресам, +у которых из A[11..0] биты A[8..0] равны 010011101b=09Dh следует прописать один и тот же байт, соот- +ветсвующий номеру порта. Биты A[15..A12] адреса устанавливаются соответсвенно номеру окна и номеру +карты (обычно 1100b для окна C000-FFFF и нулевой карты), таким образом, рассчитанный адрес равен +C09Dh, если xxx заменить на нули, а весь набор - C09Dh, C29Dh, C49Dh, C69Dh, C89Dh, CA9Dh, CC9Dh, +CE9Dh. +Если необходимо, что бы порт был «виден» только на запись, то A9 устанавливается в 0, если только на +чтение - A9=1. Аналогично с битами DOS и PN5. Если нужно, что бы порт был виден только в DOS или +только при открытом порте «Пентагона», необходимо устанавливать соответсувующие биты в адресе карты +в конкретные значения. +С другой стороны, при необходимости неполной дешифрации (например, порт 8-мибитный), надо уста- +новить в «не определено» значения для A13,A14,A15, то есть биты 4,7 и 8 адреса карты портов и рассчитать +соответствующий набор адресов. +Ввиду отсутствия дешифрации по части адресам, естественно, открытый для 7785h будет виден и по +всем другим адресам, различающимся в битах A[12..8] и A[4..3]. +Для наглядности напишу програму, которая откроет на чтение и запись порт 7785h некий виртуальный +порт с номером 0D0h. +OPEN_PORT: +LD B,0D0 ; номер виртуального порта +OPEN_P1: +DI ; запретить прерывания! Не дай бог нагадить в 40h +; все полетит к чертям. +IN A,(PAGE3) +EX AF,AF’ ; сохранить адрес окна C000h +; стеком не пользуюсь намеренно, бог его знает, где +; он, a я страницами щелкаю +LD A,40h +OUT (PAGE3),A ; установить новый адрес окна на страницу 40h +===== PAGE 29 ===== +13 ДЕШИФРАЦИЯ ПЗУ/КЭШ/КОНТРОЛЛЕРЫ/И Т.П. 29 +; Здесь я не буду проверять, что было записано в том месте, +; считая, что там были нули (но в реальном Спринтере стоит проверить, +; не занят ли он). Для проверки этой программы, лучше всего воспользоваться +; портом 0000h, для которого в следующей команде константа +; равна 0C000h, и он точно не зянят. Но здесь так для наглядности. +LD HL,0C09Dh ; адрес в карте памяти для порта 7785h на запись +; это адрес, биты которого рассчитаны немного выше. Aдрес для карты 0, +; которая и устанавливается при обычной работе. +LD (HL),B ; установить порт на чтение в режиме DOS +SET 1,H ; включить A9 в 1 (сигнал /WR) +LD (HL),B ; установить порт на запись в режиме DOS +SET 2,H ; включить A10 в 1 (сигнал DOS) +LD (HL),B ; установить порт на запись в режиме не-DOS +RES 1,H ; +LD (HL),B ; установить порт на чтение в режиме не-DOS +; порт установлен открывать его в режиме отключенного порта пентагона я не +; стал, собственно, и не обязательно, если программа работает в 128-м +; режиме. +EX AF,AF +OUT (PAGE3),A ; восстановить страницу +EI +RET +CLOSE_PORT: +LD B,0 ; значение 0 - порт закрыт +JR OPEN_P1 ; все остальное так же как при открытии +; теперь, что бы пользоваться портом 0, достаточно сделать так +CALL OPEN_PORT +..... +LD BC,0 +OUT (C),A +..... +LD BC,0 +IN A,(C) +..... +CALL CLOSE_PORT +; можно вызывать и OPEN_P1, например +LD B,0D1h ; открыть виртуальный порт 0D1h +CALL OPEN_P1 +; Естественно, можно вызывать открытие нового виртуального +; порта и не закрывая старый. Надо только помнить, что порт +; стоит закрыть при выходе из программы. +О виртуальных портах. +===== PAGE 30 ===== +13 ДЕШИФРАЦИЯ ПЗУ/КЭШ/КОНТРОЛЛЕРЫ/И Т.П. 30 +В Спринтере есть набор нескольких дополнительных портов, которые никак нигде не используются, но +просто являются некими ячейками памяти. Это порты с номeрами D0h..DFh. Они используются при работе +в режиме Pentagon-512 как адреса дополнительных страниц, но в режиме Pentagon-128/Scorpion-256 могут +использоваться программистом для каких нибудь особых целей, например, эмуляции какого либо порта для +уже написанных программ. А в некоторых случаях могут стать передатчиком дополнительных параметров +(хотя и несколько извращенным). +Байты номеров портов для карты памяти (для sp-97): +00 - Нет порта +01h..0Fh - reserved +10h - порт ВГ93 (1F) +11h - порт ВГ93 (3F) +12h - порт ВГ93 (5F) +13h - порт ВГ93 (7F) +14h - порт на запись - состояние контроллера дисковода (FF) +15h - порт на чтение - джойстик и IRQ/INTRQ контроллера +16h..1Fh - reserved +20h - HDD - регистр данных +21h - HDD - регистр состояния/ошибок +22h - HDD - регистр количества секторов для операций R/W +23h - HDD - регистр сектора +24h - HDD - регистр дорожки-low +25h - HDD - регистр дорожки-high +26h - HDD - регистр головок/выбора мастер-слэйв +27h - HDD - регистр команд +28h - HDD - дополнительный регистр управления 3F6 +29h - HDD - дополнительный регистр состояния 3F7 +2Ah..2Fh - reserved +30h - ISA-SLOT 1 - memory R/W +31h - ISA-SLOT 2 - memory R/W +32h - ISA-SLOT 1 - ports R/W +33h - ISA-SLOT 2 - ports R/W +34h..3Fh - reserved +40h - ZX-Keyboard (порт FE) +41h..7Fh - reserved +80h..87h - reserved +88h - COVOX/COVOX-Blaster +89h..8Fh - reserved +90h - AY-8910-port (BFFD) +91h - AY-8910-port (FFFD) +92..BFh - reserved +C0h - Scorpion-256 port (1FFD) +C1h - Pentagon-128 port (7FFD) +C2h - Border, write only (FE) +C3h - reserved +C4h - port RGADR, PORT_Y (89) +C5h - port RGMOD (C9) +C6h..C7h - reserved +C8h..CFh - копии C0..C7h (not used!) +D0h..DFh - Virtual Ports (USER ports) +E0h - ROM page EXRANSION +E1h - ROM page TR-DOS +E2h - ROM page BASIC-128 +E3h - ROM page BASIC-48 +E4h - ROM page EXRANSION’ +===== PAGE 31 ===== +13 ДЕШИФРАЦИЯ ПЗУ/КЭШ/КОНТРОЛЛЕРЫ/И Т.П. 31 +E5h - ROM page TR-DOS’ +E6h - ROM page BASIC-128’ +E7h - ROM page BASIC-48’ +E8h - RAM page (окно 0000-3FFF) +E9h - RAM page (окно 4000-7FFF) +EAh - RAM page (окно 8000-BFFF) +EBh - ROM page SYSTEM +ECh - RAM page CASHE +EDh..EEh - reserved +EFh - ROM page SYSTEM’ +F0h..FFh - RAM pages (окно C000-FFFF) +О последних 16-ти номерах поподробнее. Установка в какой либо порт значения от F0h до FFh приве- +дет к одному и тому же результату, что и просто установка в этот порт значения F0h. В схеме сделана +переадресация номера порта так, что при значении FXh номер порта берется как F0h+SpectrumPAGE, где +SpectrumPAGE - номер спектрумовской страницы, адресуемой по портам 7FFD и 1FFD. Таким образом +достигается совместимость с Пентагоном и Скорпионом по распределению памяти и делается возможным +установка любого номера страницы спринтеровской памяти для любой страницы Спектрума. +13.2 Конкретные адреса портов, используемые в Sprinter-е +В предыдущей секции было рассказано, как устанавливать порты. Здесь же приводятся данные по уже +установленным портам в в конкретных конфигурациях. +Здесь я приведу адресацию портов для конфигураций Sprinter-1 и Sprinter-2. Сразу отмечу, что эти +адреса легко могут быть изменены простой программой, в случае появления такой необходимости. +Стандартные порты. +#FE – RD_KBD – порт клавиатуры +#FE – WR_BRD – порт бордюра +#7FFD – порт расширения ZX-Spectrum 128k +#1FFD – порт расширения Scorpion ZS-256 +#1F,#0F – RD_KEMPS – порт джойстика. В конфигурации Sprinter-1 порт #1F аппаратно переадресу- +ется на порт #0F #BFFD, #FFFD – AY-PORTS – порты AY-сопроцессора (ZX-Spectrum-256/AY) +Не совсем стандартные порты. +#FB, #4F – порт COVOX-а. +Дополнительные 8-битные порты Sprinter-а. +#82 – PAGE0 – страница ОЗУ, подключаемая вместо ПЗУ через порт #1FFD +#A2 – PAGE1 – страница ОЗУ, подключенная по адресу #4000 +#C2 – PAGE2 – страница ОЗУ, подключенная по адресу #8000 +#E2 – PAGE2 – страница ОЗУ, подключенная по адресу #C000 Здесь надо отметить особо, через порт +#E2 можно изменить любую из 16-ти страниц скорпионовского распределения памяти. +#89 – RGADR и PORT_Y – вертикальная координата точки на графическом экране или страница +VIDEO-RAM для спектрумовского режима +#C9 – RGMOD – порт режима экрана. Переключает страницы режима экрана. +#3C, #7C – SYS_PORT – системный порт трогать не рекомендуется +#10..#1F,#EE,#EF,#F0,#F1,#F4 – внутренние порты Z84C15. В отличие от остальных, эти адреса +изменить невозможно, так как они находятся вне ПЛМ. +Порты страниц ОЗУ открыты как на запись, так и на чтение. Это позволяет легко выполнять программы, +использующие переключение страниц, а затем возвращать эти страницы назад. При работе BIOS-а все +страницы сохраняются. +Дополнительные 16-тибитные порты Sprinter-а. +===== PAGE 32 ===== +14 СБРОС. 32 +#xx50..#xx55 – порты HDD – использовать внешними программами не рекомендуется. Функции +работы с HDD записаны в ПЗУ. +Скрытые порты Sprinter-а. +Скрытыми являются порты которые недоступны в конкретный момент времени, но могут стать доступ- +ными после проведения изменений в карте портов. Их адреса не указываются, так как они могут быть +выставлены в любое место. +Порт ПЗУ BASIC48 +Порт ПЗУ BASIC128 +Порт ПЗУ TR-DOS +Порт ПЗУ EXPANSION +Порт ПЗУ SYSTEM +Через эти порты можно установить новые прошивки ПЗУ. Для этого их достаточно записать в ОЗУ +с номерами страниц меньше #80 и записать в соответствующий порт номер этой страницы. При таком +подключении страницы Эти страницы будут защищены от записи. +Частично скрытыми, так же являются и порты #7FFD, #1FFD в обычном состоянии они доступны +только на запись, но значения, записываемые в эти порты можно прочитать, открыв соответствующие +порты на чтение. +В других конфигурациях может отсутствовать часть портов или присутствовать новые порты. +14 Сброс. +Простой сброса может быть осуществлен записью в страницу #A0, установленную в расширенную +страницу Scorpion-овского распределения портов, т.е. следующей программой: +SOFT_RESET: +DI +LD A,16 +LD BC,1FFDh +OUT (C),A +LD A,0A0h +OUT (PAGE3),A +LD (0C000h),A ; в этот момент подается RESET +DI ; глюкоуловитель +HALT +Более сложные варианты сброса, с перегрузкой прошивок, осуществляются через BIOS. +14.1 Старт машины +Описание старта на программном уровне (часть от Дениса)... +14.2 Доступ к HDD через память. +Доступ через память, как пример, программа Video... +В данный момент на плате sp2000 отсутствует. +Часть III +Прошивки ПЛМ +Перегузка через BIOS +===== PAGE 33 ===== +15 SPRINTER-1 33 +15 Sprinter-1 +Перечисление всего что есть. Описание возможностей. +15.1 Режимы Spectrum-128/Scorpion-256/Pentagon-512 +Соответственно. Пример программного переключения. +15.2 Доступ к функциям биоса и портам. +Список портов доступных/недоступных в конктретных конфигурациях. +16 Sprinter-2 +Добавления/убавления относительно Sprinter-1 +16.1 Акселератор, блочные операции AND, OR, XOR +Описание акселератора с примерами. +17 Game-1 +Описание прошивки, добавление/убавление относительно Sprinter-2 +17.1 Акселератор + Covox-Blaster +Использование COVOX-Blaster-а совместно с акселератором. +18 Doom +Добавление относительно Game-1 +18.1 Акселератор с растяжением линий +Описание акселератора с растяжениями. Пример программые растяжениями, плюс ссылка на исходник +Doom-Demo. +19 Video +Особенности прошивки Video. Использование считывания с HDD прямо в экран. +19.1 Режим экрана 160x128 +Дополнения к описанию режимов экрана... +===== PAGE 34 ===== +34 +Часть IV +Программирование с использованием функций +БИОС-а. +20 Функции биоса +Вызов функций производится через вход в TR-DOS 3D13h. Номер команды задается в регистре C. +Установленный на выходе флаг C означает завершение работы функции с ошибкой. +При работе части функций биоса необходимо что бы стек находился в области 8000h..0BFFFh, так как +они используют для своей работы переключение страниц PAGE1 и PAGE3. Для устранения каких либо +неприятностей связанных со стеком его следует всегда устанавливать в этот диапазон при вызове функций +биоса Спринтера. +Вызов функций биос так же может быть осуществлен через вход по RST 18h при подключенном систем- +ном ПЗУ, а так же через RST 8 при подключенном ОЗУ в нулевой банке путем установки на адрес RST 8 +небольшой программы, переключающейся в ПЗУ биоса +Для подключения системного ПЗУ можно воспользоваться такой последовательностью команд: +DI +LD A,0 +OUT (07Ch),A ; после этого в 0-м адресе будет включена ПЗУ биоса +; и программа может вызывать функции через RST 18h, +; просто заменяя этим вызовом вызов CALL 3D13h +; * Обычные функции TR-DOS в этот момент не доступны +Что бы вернуться к обычному ПЗУ следует выполнить программу: +LD A,0 +OUT (03Ch),A +Вызов из ОЗУ осуществляется через RST 8. При этом на адресе 8 должна располагаться такая програм- +ма: +PUSH AF +LD A,0 +OUT (07Ch),A ; в этом месте вместо ОЗУ подключится ПЗУ биоса и +; программа уйдет в него. +POP AF ; На эту команду происходит возврат при таком +; вызове биоса. +RET +; Оптимизация кода в этом месте недопустима. Вместо LD A,0 можно установить +; две команды XOR A и DI +Далее вызов функций осуществляется аналогично RST 18h, но следует помнить, что адресное пстранство +0000..3FFF во время работы биоса занято ПЗУ и в нем не могут располагаться данные для работы функций. +Вызов новых функций через 3D13h автоматически отключает прерывания. После исполнения функции +программа должна включить их при необходимости. Если необходимо что бы прерывания были включены +все время, следует использовать режим IM 2, с таблицей, стеком и обработчиком расположенным в области +8000h..BFFFh и пользоваться вызовом через RST 18h или RST 8 В этом случае прерывания в биосе не +отключаются. +===== PAGE 35 ===== +20 ФУНКЦИИ БИОСА 35 +20.1 Работа с памятью +EMM_FN0: ; определение объемов ОЗУ +LD C,0C0h ; функция номер 0C0h +CALL 3D13h ; HL - общий объем памяти в страницах по 16kb +; BC - объем свободной памяти в страницах по 16kb +EMM_FN1: ; инициализация распределения памяти +; стирается вся информация о выделенных ранее блоках +; ОЗУ. Устанавливаются как занятые блоки с +; системной информацией, а так же первые 256kb ОЗУ +LD C,0C1h ; функция номер 0C1h +CALL 3D13h ; выходных параметров нет +EMM_FN2: ; выделение блока ОЗУ +LD B,num_pages ; запрашиваемое число страниц ОЗУ +LD C,0C2h ; номер функции +CALL 3D13h ; NC -> А - идентификатор блока +; CF -> A=1 - нет памяти +EMM_FN3: ; освободить блок ОЗУ +LD A,id_blk ; идентификатор блока +LD C,0C3h ; номер функции +CALL 3D13h ; NC - нормальное завершение +; CF - неверный идентификатор блока +; правильность идентификатора отслеживается не всегда +EMM_FN4: ; получить физический номер страницы из блока +LD A,id_blk ; идентификатор блока +LD B,page ; логическая страница в блоке +LD C,0C4h ; номер функции +CALL 3D13h ; NC -> А - физический номер страницы +; CF -> А=0 - нет такого блока, A=FF - конец блока +EMM_FN5: ; получить список физических страниц блока +LD A,id_blk ; идентификатор блока +LD HL,bufer ; буфер длиной 256 байт для размещения списка +; буфер должен быть длиной на единицу больше числа +; страниц в блоке +LD C,0C5h ; номер функции +CALL 3D13h ; NC -> HL - тот же буфер, B - число страниц в блоке +; данные по адресу HL - список физических страниц по +; порядку. Список заканчивается байтом FF +; CF -> неверный идентификатор блока. Старая +; информация в буфере может быть затерта +EMM_FN6: ; Получение адресов портов окон +LD A,win_num ; номер окна проецирования 0,1,2 или 3 +LD C,0C6h ; номер функции +CALL 3D13h ; NC -> C - 8-мибитный адрес порта, B - номер +; подключенной в данный момент страницы ОЗУ +; CF -> ошибка номера окна +; Функция фактически не используется в данный момент. Адреса портов окон +; не изменялись с самого начала разработки компьютера и, надеюсь, не будут +; меняться. Для соблюдения приличий программисту следует хотя бы один раз +===== PAGE 36 ===== +20 ФУНКЦИИ БИОСА 36 +; вызвать эти функции и сравнить адреса портов с теми, что используются в +; программе и, если они не совпадают, выдать соответствующее предупреждение. +; В данный момент эти порты таковы: PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h, +; PAGE3=0E2h +EMM_FN7: ; получить следующую страницу блока по предыдущему +LD A,page ; физическая страница блока +LD C,0C7h ; номер функции +CALL 3D13h ; NC -> A - следующая физическая страница блока +; A=FF - индицирует конец блока +; CF -> ошибка номера страницы +; Информация о распределении памяти хранится в виде RAM Allocation Table, +; похожей на дисковый FAT. Поэтому нахождение физического номера следующей +; страницы по предыдущему физическому номеру происходит значительно быстрее, +; чем поиск по увеличенному на единицу логическому номеру. +EMM_FN8: ; слияние блоков +LD A,id_blk1 ; блок номер 1 +LD B,id_blk2 ; блок номер 2 +LD C,9Eh ; номер функции +CALL 3D13h ; NC -> A - блок результата +; CF -> ошибка, неверный номер блока +EMM_FN9: ; разделение блока +LD A,id_blk1 ; блок +LD B,len_blk ; новая длина блока +LD C,9Dh ; номер функции +CALL 3D13h ; NC -> A - блок результата, B - блок остатка +; CF -> ошибка, неверный номер блока +20.2 Работа с блоками как с RAM-Disk-ами +BLK_RD_WR: ; чтение/запись из/в блок(а) памяти секторами +; по 256 байт +LD HL,bufer ; адрес буфера данных +LD DE,sector ; абсолютный номер сектора +LD B,sec_num ; число секторов +EX AF,AF’ +LD A,command ; команда 0 - чтение, FF - запись +EX AF,AF’ +LD A,id_blk ; идентификатор блока +LD C,0C8h ; номер функции +CALL 3D13h ; NC -> нормальное завершение +; CF -> ошибка идентификатора +; * функция на бета-тестировании... +BLK_TO_RAMD: ; назначить блок памяти RAM-Disk-у +; любой блок памяти может содержать данные +; RAM-Disk-а в формате TR-DOS для подключения этих +; данных в качестве диска и служит эта функция +LD A,ram_disk ; номер RAM-Disk-а 0..15 - соответствует +; RAM-Disk-ам от e: до t: +LD B,id_blk ; идентификатор блока +===== PAGE 37 ===== +20 ФУНКЦИИ БИОСА 37 +LD C,0C9h ; номер функции +CALL 3D13h ; NC -> нормальное завершение +; CF -> ошибка: неверный номер RAM-Disk-а или +; RAM-Disk занят +RAMD_CLEAR: ; освободить RAM-Disk +; освобождение RAM-Disk-а не есть освобождение +; блока ОЗУ. Это просто отключение блока ОЗУ от +; RAM-Disk-а +LD A,ram_disk ; номер RAM-Disk-а - 0..15 +LD C,0CAh ; номер функции +CALL 3D13h ; NC -> нормальное завершение, B - идентификатор +; блока отключенного от RAM-Disk-а +; CF -> ошибка: неверный номер RAM-Disk-а или +; RAM-Disk был свободен +GET_RAMD_ST: ; получение идентификатора блока, назначенного на +; RAM-Disk +LD A,ram_disk ; номер RAM-Disk-а 0..15 +LD C,0CEh ; номер функции +CALL 3D13h ; NC -> A - идентификатор блока. +; A=0 - блок не назначен. +; CF -> ошибка номера RAM-Disk-а +20.3 Управление назначением на дисководы +Каждый из 4-х дисководов TR-DOS может быть переназначен для работы с RAM-Disk-ами, винчестером +и реальными дисководами. +RAMD_TO_DRV: ; назначение RAM-Disk на дисковод. +LD A,ram_disk ; номер RAM-Disk-а +LD B,drive ; номер дисковода 0..3 - соответствует дисководам +; A:, B:, C:, D: +LD C,0CBh ; номер функции +CALL 3D13h ; NC -> нормальние завершение +; CF -> ошибка: неверный номер драйва или рамдиска +FDD_TO_DRV: ; назначение реального дисковода +LD А,disk_drive ; номер физического дисковода 0..3 +LD B,drive ; номер драйва 0..3 +; Номер физического дисковода и номер драйва должны +; совпадать, так как компьютер не имеет +; электрической схемы переключения дисководов на +; разные буквы. В будущих версиях железа, возможно, +; это появится. +LD C,0CCh ; номер функции +CALL 3D13h ; NC -> нормальние завершение +; CF -> ошибка: неверный номер драйва или дисковода +HDD_TO_DRV: ; назначение винчестера на дисковод +LD A,hdd_drive ; Номер винчестера. Должен быть 0. В дальнейшем +; будет иметь значения от 0 до 15 для подключения +; различных разделов и master/slave +LD B,drive ; номер драйва 0..3 +LD C,0CDh ; номер функции +===== PAGE 38 ===== +20 ФУНКЦИИ БИОСА 38 +CALL 3D13h ; NC -> нормальние завершение +; CF -> ошибка: неверный номер драйва или винчестера +GET_DRV_ST: ; получить тип назначения на драйв +LD A,drive ; номер драйва 0..3 +LD C,0CFh ; номер функции +CALL 3D13h ; NC -> нормальние завершение. A - тип назначения +; A=0..3 - назначен реальный дисковод A:, B:, C:, D: +; A=4..19 - назначен RAM-Disk - A = ram_disk + 4 +; A=40h..4Fh - назначен винчестер (40h+hdd_drive) +; CF -> ошибка номера драйва +20.4 Функции управления железом и определение версии +FN_VERSION: ; выдача информации о версии биоса и железа +LD HL,bufer ; буфер, куда будет помещена ASCIIZ строка с +; названием и номером версии, конец строки отмечен +; нулем. +LD C,0EFh ; номер функции +CALL 3D13h ; NC -> HL - тот же буфер с записанной строкой. +; DE - версия биоса +; BC - версия железа +; BC=FFFF - not identifyed +; BC=FFFE - Sprinter-1 +; BC=FFFD - Sprinter-2 +; BC=FFFC - Spectrum + AY8910 +; BC=FFFB - Game-1 +; BC=FFFA - Video-1 +; BC=FFF9 - DooM +; Иные значения BC - новые прошивки +; версия железа выдается только +; в биосах версий 1.16 и выше +; CF -> ошибка. Очень старая версия, не имеющая +; данной функции +SPRINTER_1: ; переключение в конфигурацию Sprinter-1 +LD C,0F0h ; номер функции +CALL 3D13h ; NC -> нормальное завершение +; CF -> функция не исполнена, фатальная ошибка +; машину следует перезапустить по RESET +SPRINTER_2: ; переключение в конфигурацию Sprinter-2 +LD C,0F1h ; номер функции +CALL 3D13h ; NC -> нормальное завершение +; CF -> функция не исполнена, фатальная ошибка +; машину следует перезапустить по RESET +SPRINTER_ALL: ; переключение конфигурации пользователя +LD A,page_cnf ; страница с файлом прошивки для ПЛМ EPF10K10 +; страница не может иметь номер больше 127 +; Файл прошивки, естественно должен быть уже +; загружен в эту страницу +LD C,0F3h ; номер функции +CALL 3D13h ; NC -> нормальние завершение +===== PAGE 39 ===== +20 ФУНКЦИИ БИОСА 39 +; CF -> функция не исполнена, фатальная ошибка +; машину следует перезапустить по RESET +; Перед исполнением функций SPRINTER_1, SPRINTER_2 и SPRINTER_ALL биос +; проверяет загруженную прошивку по идентификатору. Если требуемая +; прошивка совпадает с текущей, то операция перезагрузки ПЛМ не +; производится. +; Во время исполнения этих функций наблюдается сбой синхронизации монитора, +; так как в этот момент происходит изменение всей схемы компьютера и +; сигналы синхронизации монитора просто отсутствуют. +FN_SINC: ; установка синхронизации, очистка режима экрана +; функция может быть отнесена и к группе функций +; вывода на экран, так как полностью очищает +; страницы режима экрана. На всем экране остается +; только бордер +LD A,sinc_mode ; режим синхронизации +; A=0 режим по умолчанию - используется для очистки +; страниц режима (отключения вывода всех окон) +; A=1 режим Scorpion - 312 строк в экране, +; положение INT-а, как в Scorpion-256 +; A=2 режим Pentagon - 320 строк в экране, +; положение INT-a как в Pentagon-128 +LD C,0F2h ; номер функции +CALL 3D13h ; NC -> нормальное завершение +; CF -> неверный номер режима синхронизации +; изменение режима синхронизации может привести к временному сбою +; синхронизации монитора. +; DCP_FN0: ; функция управления дешифратором портов. +; LD C,0F4h ; В данный момент не доделана +; Функция позволит открывать/закрывать дополнительные порты компьютера +SET_PORTS: ; глобальная установка портов +LD A,port_num ; внутренний номер порта +; F0..FF - страницы Scorpion 0..15, подключаемые в +; адрес 0C000h, страница именно та, которая +; подключена в данный момент через 7FFD,1FFD +; E0=EXPANSION, Е1=TR-DOS, E2=BASIC-128, E3=BASIC-48 +; E4=EXPANSION’,Е5=TR-DOS’,E6=BASIC-128’,E7=BASIC-48’ +; E8=RAM0, E9=RAM1, EA=RAM2, EB=SYS0, EC=CASH +; ED,EE - reserv, EF=SYS1 +; C0=COPY_1FFD, C1=COPY_7FFD, C2=COPY_BRD, C3-reserv +; C4-reserv, C5=COPY_V_MODE, C6=COPY_SYS, C7-reserv +; C8..CF - альтернативный набор для C0..C7 +; D0..DF-reserv - доп. страницы для Pentagon-512 +; 80..BF-user_ports! +; 00..7F-внешние порты, использовать не рекомендуется +LD B,port_data ; данные, записываемые в страницу +LD C,0F8h ; номер функции +CALL 3D13h ; B - предыдущее содержание порта +READ_PORTS: ; глобальное чтение портов +LD A,port_num ; внутренний номер порта +===== PAGE 40 ===== +20 ФУНКЦИИ БИОСА 40 +LD C,0F9h ; номер функции +CALL 3D13h ; B - содержание порта +WRITE_PORTS: ; глобальная запись портов +LD A,port_num ; внутренний номер порта +LD B,data_port ; записываемые данные +LD C,0FАh ; номер функции +CALL 3D13h ; +; Функции SET_PORTS, READ_PORTS и WRITE_PORTS позволяют иметь доступ +; к любым портам компьютера независимо от того, открыты они или нет. +; В данный момент функции недоступны и находятся в разработке +; С помощью этих функций будет возможно прочитать содержимое портов 1FFD и +; 7FFD, например, а так же установить нужные значения в закрытые системные +; порты. Порты User-а позволят эмулировать некоторые устройства, +; отсутствующие в Спринтере, а так же могут дать особый способ +; передачи данных между программами, минуя ОЗУ. +CMOS_RD: ; читать из регистра CMOS +LD C,0F6h ; номер функции +LD D,cmos_reg ; номер регистра CMOS +CALL 3D13h ; NC - часы есть +; CF - часов нет +CMOS_WR: ; писать в регистр CMOS +LD C,0F7h ; номер функции +LD D,cmos_reg ; номер регистра CMOS +CALL 3D13h ; NC - часы есть +; CF - часов нет +Функции CMOS_RD,CMOS_WR работают всегда. Если в машине нет микросхемы CMOS, +она эмулируется. Наличие микросхемы определяется функцие CMOS_TEST. +CMOS_TEST: ; проверить наличие CMOS +LD C,0F5h ; номер функции +CALL 3D13h ; NC - часы есть +; CF - часов нет +FN_TURBO: ; функция управления турбо режимом. +LD A,turbo_mode ; режим турбо: 2 - off, 3 - on +LD C,08Fh ; номер функции +CALL 3D13h ; NC -> исполнение +; CF -> неверный режим турбо +; * переключение режима турбо может не произойти, если прошивка не +; поддерживает это переключение. При этом ошибки не происходит. +20.5 Функции печати и управления режимом экрана +WIN_OPEN: ; функция открытия окна. +LD IX,win_descriptor ; описатель окна +; IX - 32-хбайтовый описатель окна +; (IX+0) - горизонтальный размер окна в знакоместах +; (IX+1) - вертикальный размер в знакоместах +; (IX+2) - положение окна по горизонтали на экране +===== PAGE 41 ===== +20 ФУНКЦИИ БИОСА 41 +; (IX+3) - положение окна по вертикали на экране +; (IX+4) - режим знакоместа +; bit4=1 - text_mode bit4=0 - graf_mode +; bit5=0 - 16, bit5=1 - 8 точек в знакоместе +; graf_mode bit3..0 - не существенны +; bit7..6 - номер палитры +; text_mode bit7..6,3..0 - номер знакогенератора +; исключение: bit7..6=B"11" -> бордер +; (IX+5) - дополнительный режим знакоместа +; bit0=1 - указывает на включение спектрумовской +; адресации экрана +; (IX+6) - положение по X в поле графики (по знакоместам) +; (IX+7) - положение по Y в поле графики (по знакоместам) +; разъяснения о положении в поле графики - ниже +; (IX+8..31) - зарезервировано (переменные окна) +LD E,win_flag ; флаги окна +; бит 0 указывает какую страницу режима включать +; после исполнения функции +; бит 4 указывает на какой странице режима +; открывать окно +LD HL,win_place ; HL - место на экране по знакоместам +; (копия в IX+2,3), в новых версиях биоса значение +; HL не существенно +LD C,0B0h ; номер функции +CALL 3D13h ; NC -> A - номер окна +; CF -> ошибка слишком много окон +LD (id_win),A ; сохранить идентификатор окна +; * При открытии окна описатель копируется в системную страницу ОЗУ и +; программа может не сохранять его. +; ** В данный момент идентификатор окна всегда равен 0 +Видео-ОЗУ Спринтера можно представить как одно сплошное поле графики размером 1024 точки по +горизонтали на 256 точек по вертикали Положение в поле графики показывает где будет находиться в этом +поле верхний левый угол окна. Положение исчисляется в знакоместах. Т.е. Если указано положение по X +– 2, по Y – 6, это означает, что верхний угол окна будет расположен по координатам X=16, Y=48 в поле +графики видео-ОЗУ Таким образом, если, например, открыть два окна в разных местах, но с одинаковыми +координатами в поле графики, на экране окажутся два идентичных окна, данные в которые будут попадать +одновременно. +Знакогенераторы текстовых режимов так же располагаются в видео-ОЗУ и имеют конкретные адреса +в поле графики. При необходимости иметь на экране как графическое, так и текстовое изображение надо +следить, что бы данные графических окон не попадали в поле графики, где расположены знакогенераторы +При использовании какого либо знакогенератора, он занимает часть поля графики по координатам (ко- +ординаты в знакоместах, т.е. в значениях байта IX+6 описателя окна) +X = (8 ∗ (bit3..0 of mode))..(8 ∗ (bit3..0 of mode) + 7) +По Y занимаются все положения. Таким образом, при использовании нескольких знакогенераторов сна- +чала следует использовать знакогенераторы с номерами меняющимися в Bit7..6, так как они попадают в +одни и те же координаты поля графики +При открытии графических окон следует помнить, что в этот момент информация текстового экрана +находящаяся в этом месте будет утеряна. При открытии текстового окна изменяется информация только +в поле графики знакогенератора соответствующему этому текствовому экрану. Если эта информация и +информация графического окна не пересекались, то при повторном открытии графического экрана, на нем +автоматически восстановится графическая картинка +===== PAGE 42 ===== +20 ФУНКЦИИ БИОСА 42 +WIN_CLOSE: ; закрытие окна +LD A,(id_win) ; идентификатор окна (пока должен быть 0) +LD C,0B1h ; номер функции +CALL 3D13h ; NC -> успешное завершение +; CF -> ошибка - неверный идентификатор +; Окно с номером 0 никогда не закрывается и попытка +; закрытия приводит к ошибке +LP_OPEN_S: ; Открытие стандартных окон. +LD E,win_flag ; флаги окна +; bit 0 определяет страницу режима, которая будет +; открыта после исполнения функции +LD C,080h ; номер функции +LD B,win_type ; тип открываемого окна +; 0 - спектрумовское окно 32x24 +; 1 - текстовое окно 64x24 +; 3 - текстовое окно 80x32 +; 4 - спектрумовское окно, HL - положение окна +; 5 - текстовое окно 64x24, HL - положение окна +; 7 - текстовое окно 80x32, HL - положение окна +; 8 - графическое окно 0, HL - положение окна +; 9 - графическое окно 1, HL - положение окна +LD HL,win_place ; положение окна для 4..9 типов +CALL 3D13h ; выполнить функцию +; ** Функция старая, использовать не рекомендуется. +; Далее, в функциях запоминания, восстановления, перемещения и стирания +; подразумеваются локальные окна в смысле "окно в окне". Идентификатор окна +; относится к глобальному окну, отнисительно которого адресуются локальные +WIN_COPY_WIN: ; копирование данных текстового окна в память +; запоминание окна +LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0) +LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь +LD L,hor_size ; размер в символах +LD D,ver_place ; DE - положение локального окна в глобальном окне +LD E,hor_place ; положение по горизонтали в символах +LD IX,bufer ; адрес буфера для запоминания данных локального окна +EX AF,AF’ +LD A,bufer_page ; страница буфера для данных окна +EX AF,AF’ ; адрес буфера указывается для окна 0C000h +; если адрес указан с 8000h, номер страницы буфера +; не действителен +LD C,0B2h ; номер функции +CALL 3D13h ; NC -> нормальное завершение +; CF -> ошибка - неверный идентификатор окна +; при работе этой функции через RST 18h или RST 8, обязательна установка +; DI, так как функция пользуется стеком для ускорения своей работы. +WIN_RESTORE_WIN: ; копирование данных из памяти в текстовое окно +; восстановление окна +LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0) +===== PAGE 43 ===== +20 ФУНКЦИИ БИОСА 43 +LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь +LD L,hor_size ; размер в символах +LD D,ver_place ; DE - положение локального окна +LD E,hor_place ; положение по горизонтали в символах +LD IX,bufer ; адрес буфера данных для локального окна +EX AF,AF’ +LD A,bufer_page ; страница буфера данных окна +EX AF,AF’ ; адрес буфера указывается для окна 0C000h +; если адрес указан с 8000h, номер страницы буфера +; не действителен +LD C,0B3h ; номер функции +CALL 3D13h ; NC -> нормальное завершение +; CF -> ошибка - неверный идентификатор окна +; при работе этой функции через RST 18h или RST 8, обязательна установка +; DI, так как функция пользуется стеком для ускорения работы. +; Данные для функций WIN_COPY_WIN и WIN_RESTORE_WIN имеют одинаковую +; структуру В данный момент эта структура похожа на структуру текстового +; экрана IBM, т.е. данные идут в формате sym1,atr1,sym2,atr2,.. сплошным +; массивом. Сначала данные для первой строки, затем сразу для второй и т.д. +WIN_GET_SYM: ; взять символ с экрана +LD A,(id_win) ; идентификатор окна (пока должен быть 0) +LD DE,place ; положение символа: D - вертикаль, E - горизонталь +LD C,0B4h ; номер функции +CALL 3D13h ; NC -> нормальное завершение +; L - символ, H - атрибут, B - знакогенератор +; CF -> ошибка неверный идентификатор окна +WIN_PUT_SYM: ; положить символ на экран +LD A,(id_win) ; идентификатор окна (пока должен быть 0) +LD DE,place ; положение символа: D - вертикаль, E - горизонталь +LD B,sym_zg ; знакогенератор +LD L,symbol ; символ +LD H,atribute ; атрибут символа +LD C,0B5h ; номер функции +CALL 3D13h ; NC -> нормальное завершение +; CF -> ошибка неверный идентификатор окна +WIN_SET_ZG: ; установка знакогенератора +LD A,sym_zg ; системный номер знакогенератора +LD DE,zg_form ; указатель на 2Kb данных знакогенератора +; Данные знакогенератора должны располагаться в таком виде, в каком они +; выглядели бы как набор символов на спектрумовском экране при переносе 2Kb +; LDIR-om в адрес 4000h +; * В будущем возможно изменение этого расположения на обычное +LD C,0B6h ; номер функции +CALL 3D13h ; NC -> завершение +; CF -> ошибка (старая версия, нет функции) +WIN_MOVE_WIN: ; перемещение окна +LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0) +LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь +===== PAGE 44 ===== +20 ФУНКЦИИ БИОСА 44 +LD L,hor_size ; размер в символах +LD D,ver_place ; DE - положение локального окна +LD E,hor_place ; положение по горизонтали в символах +LD IX,new_place ; новое положение локального окна +LD C,0B2h ; номер функции +CALL 3D13h ; NC -> нормальное завершение +; CF -> ошибка - неверный идентификатор окна +; при работе этой функции через RST 18h или RST 8, обязательна установка +; DI, так как функция пользуется стеком для ускорения работы. +; Даллее следуют функции печати для работы с _текущим_ глобальным окном. +; В данный момент текущим всегда является последнее открытое окно +; На графическом экране функция не работает +LP_PRINT_ALL: ; печать символов с атрибутом +LD A,symbol ; символ +LD E,atribute ; атрибут +LD B,num_sym ; число выводимых символов +LD C,081h ; номер функции +CALL 3D13h ; на экран выводится строка из B одинаковых +; символов +; регистры HL,IX - сохраняются +LP_PRINT_SYM: ; Вывод символов на экран с текущего +; знакоместа без атрибута +LD A,symbol ; символ +LD B,num_sym ; число выводимых символов +LD C,082h ; номер функции +CALL 3D13h ; на экран выводится строка из B одинаковых символов +; атрибут остается тот, который был на экране +; регистры HL,IX - сохраняются +LP_PRINT_ATR: ; печать атрибутов +LD E,atribute ; атрибут +LD B,num_sym ; число выводимых символов +LD C,083h ; номер функции +CALL 3D13h ; на экран выводится строка из B одинаковых +; атрибутов. Символы не меняются. +; регистры HL,IX - сохраняются +LP_SET_PLACE: ; Установка текущего знакоместа в окне +LD E,hor_place ; номер символа по горизонтали +LD D,ver_place ; номер символа по вертикали +; ** Превышение границ приводит не к ошибке, а к +; переустановке сначала, за вычетом полного +; размера окна +LD C,084h ; номер функции +CALL 3D13h ; позиция печати устанавливается в соответстии с +; регистром DE +LP_PRINT_LN: ; Вывод строки символов на экран с текущего +; знакоместа +LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh +LD E,atribute ; атрибут, с которым будет выведена строка +===== PAGE 45 ===== +20 ФУНКЦИИ БИОСА 45 +LD B,num_sym ; длина выводимой строки +LD C,085h ; номер функции +CALL 3D13h ; "исполнение желаний" +LP_PRINT_LN2: ; Вывод строки символов на экран с текущего +; знакоместа без атрибутов +LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh +LD B,num_sym ; длина выводимой строки +LD C,086h ; номер функции +CALL 3D13h ; строка будет выведена без изменения атрибутов в +; месте печати +LP_PRINT_LN3: ; Вывод строки символов на экран с текущего +; знакоместа до разделителя. После разделителя +; выводятся пробелы что бы вывести B символов +LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh +LD E,atribute ; атрибут, с которым будет выведена строка +LD D,delimiter ; разделитель +LD B,num_sym ; длина выводимой строки +LD C,087h ; номер функции +CALL 3D13h ; символы из (HL) выводятся на экран, пока не +; встретится символ равный D, далее печатаются +; пробелы, как дополнение строки до B символов +LP_PRINT_LN4: ; Вывод строки символов длиной B на экран с текущего +; знакоместа до разделителя D, без атрибутов. +LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh +LD D,delimiter ; разделитель +LD B,num_sym ; длина выводимой строки +LD C,088h ; номер функции +CALL 3D13h ; символы из (HL) выводятся на экран, пока не +; встретится символ равный D, далее печатаются +; пробелы, как дополнение строки до B символов +; атрибуты не изменяются +LP_CLS_WIN: ; очистка экрана +LD DE,place ; положение локального окна (глобальное = текущее) +LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь +LD L,hor_size ; размер в символах +LD B,atribute ; атрибут очистки +LC C,089h ; номер фунции +CALL 3D13h ; выполнение. Произворится выводом пробелов с +; заданным атрибутом +LP_SCROLL_UD: ; Скроллинг части глобального окна вверх/вниз +LD B,scroll_type; тип скроллинга 1 - вверх/ 2 - вниз +LD D,beg_line ; начальная строка скроллинга +LD E,num_lines ; число скроллируемых строк +LD C,08Ah ; номер функции +CALL 3D13h ; выполнение. Скроллируются полные строки +; глобального окна +===== PAGE 46 ===== +20 ФУНКЦИИ БИОСА 46 +LP_PRINT_LN5: ; Вывод строки символов на экран с текущего +; знакоместа до разделителя после разделителя +; вывод останавливается +LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh +LD E,atribute ; атрибут, с которым будет выведена строка +LD B,num_sym ; максимальная длина выводимой строки +LD C,08Bh ; номер функции +CALL 3D13h ; символы из (HL) выводятся на экран, пока не +; встретится символ равный D или количество +; символов не превысило B. Далее происходит +; возврат +LP_PRINT_LN6: ; Вывод строки символов на экран с текущего +; знакоместа до разделителя после разделителя +; вывод останавливается, без атрибутов +LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh +LD B,num_sym ; максимальная длина выводимой строки +LD C,08Ch ; номер функции +CALL 3D13h ; символы из (HL) выводятся на экран, пока не +; встретится символ равный D или количество +; символов не превысило B. Далее происходит +; возврат. Атрибуты не выводятся +LP_CLS_WIN2: ; очистка экрана, указанием символа заполнения +LD DE,place ; положение локального окна (глобальное = текущее) +LD H,ver_size ; HL - размер окна вертикаль/горизонталь +LD L,hor_size ; размер в символах +LD A,symbol ; символ очистки +LD B,atribute ; атрибут очистки +LC C,08Dh ; номер фунции +CALL 3D13h ; Выполнение. Произворится выводом пробелов с +; заданным атрибутом и символом +LP_GET_PLACE: ; получить текущее положение вывода на экран +; в глобальном окне +LD C,08Eh ; номер функции +CALL 3D13h ; в регистр DE будут положены координаты, +; в которых будет напечатан следующий символ +; D - вертикаль, E - горизонталь +20.6 Графические функции +; Координаты считаются от верхнего левого угла экрана +PIC_POINT: ; установить точку +LD DE,Y_coord ; координата по вертикали +LD HL,X_coord ; координата по горизонтали +LD A,(id_win) ; идентификатор граф. окна (пока должен быть 0) +LD B,color ; цвет точки +LD C,0A1h ; номер функции +CALL 3D13h ; поставить точку +===== PAGE 47 ===== +20 ФУНКЦИИ БИОСА 47 +; В действительности ставить точки на экране с помощью функции биоса, +; слишком медленно. Для этого лучше пользоваться прямым выводом данных +; на графический экран. Устройство экрана и способы прямого вывода +; графических данных описаны в файле архитектуры Спринтера. +PIC_SET_PAL: ; установка палитры +LD HL,pal_data ; данные палитры: +; список цветов по четыре байта B,G,R,Y +LD E,beg_color ; начальный цвет +LD D,num_colors ; количество устанавливаемых цветов +LD B,pal_mask ; маска при установке палитры. Для нормального +; режима должнa быть FF +LD A,page_pal ; номер палитры 0..15 значения от 8 до 15 резервные +LD C,0A4h ; номер функции +CALL 3D13h ; установка палитры +; данные палитры должны представлять собой список приблизительно такого вида: +DB blue1,green1,red1,0 +DB blue2,green2,red2,0 +..................... +DB blueN,greenN,redN,0 +; N = num_colors. Значение num_colors равное 0 соответствует 256-ти цветам +; при записи в видео-ОЗУ все данные предварительно проходят функцию AND со +; значением pal_mask +Страницы палитры 0..3 соответствуют графическим режимам. Для вывода в соответствующей палитре +нужно задать соответствующее значение bit7..6 в байте режима знакоместа +Страницы 4..7 соответствуют текстовому режиму и режиму «Spectrum» В странице 4 задается цвет +paper для каждого атрибута. В странице 5 задается цвет ink для каждого атрибута. В странице 6 задается +цвет paper, которым он будет моргать в режиме flash В странице 7 задается цвет ink, которым он будет +моргать в режиме flash Таким образом, для каждого из 256-ти атрибутов задается четыре цвета если цвета +4,5 совпадают с цветами 6,7 то режим flash оказывается отключенным. Для его включения в спектрумов- +ском режиме надо поменять местами цвета 6 и 7. Если надо включить flash в режим IBM-CGA, следует +установить цвета 6 и 7 одинаковыми и равными цвету 4 по сути режим flash всегда включен и на экране +постоянно меняются цвета paper с 4-го на 6-й, а цвета ink с 5 на 7-й. Если эти пары цветов для атрибута +знакоместа устанавливаются одинаковыми, то flash в этом месте не виден. Используя подобное задание +цветов текстового режима можно легко добиться совместимости по цветам как со Спектрумом, так и с IBM +SET_PAL_INIT: ; установка внутренней палитры. +LD A,PAL_PAGE ; страница палитры +LD B,PAL_N ; номер палитры +; 2 - установка спектрумовской палитры +; 1 - установка графической плаитры +LD C,0A6h ; номер функции +CALL 3D13h ; установка палитры +20.7 Работа с винчестером и дисками MS-DOS +HDD_INIT: ; инициализация винчестера +LD C,040h ; номер функции +CALL 3D13h ; NC -> нормальное завершение +; CF -> винчестер не найден +===== PAGE 48 ===== +20 ФУНКЦИИ БИОСА 48 +HDD_RECAL: ; рекалибровка винчестера +LD C,041h ; номер функции +; * Функция зарезервирована для дальнейшего использования +HDD_TEST_IDE: ; Тест наличия интерфейса IDE +LD C,042h ; номер функции +CALL 3D13h ; NC -> нормальние завершение +; в регистре B информация о наличии устройств +; bit0=1 - есть устройство "master" +; bit1=1 - есть устройство "slave" +; CF -> ошибка, аппаратная неисправность +HDD_PREPARE: ; подготовка винчестера к операции чтения/записи +LD C,043h ; номер функции +LD HL,bufer_adr ; адрес буфера данных +LD A,bufer_page ; страница буфера, если адрес в окне 0C000h +LD B,sec_num ; число секторов +LD DE,sec_low ; абсолютный номер сектора младшая часть +LD IX,sec_high ; абсолютный номер сектора старшая часть +CALL 3D13h ; При исполнении производится вся подготовка к +; операциям чтения/записи вычисление +; цилиндров/головок/секторов и занесение их в регистры винчестера +; далее программа может сама только подать команду читать/писать и +; самостоятельно производить считывание/запись данных в винчестер. +; Команда удобна для работы программ в реальном времени, когда необходимо +; кроме чтения/записи данных производить какие либо иные действия. +HDD_READ_BPB: ; читать BPB +LD C,044h ; номер функции +LD HL,bufer_adr ; адрес буфера для BPB +LD A,bufer_page ; страница буфера, если адрес в окне 0C000h +CALL 3D13h ; NC -> нормальное завершение +; CF -> ошибка +HDD_READ: ; читать сектора с винчестера +LD C,045h ; номер команды +LD HL,bufer_adr ; адрес буфера данных +LD A,bufer_page ; страница буфера, если адрес в окне 0C000h +LD B,sec_num ; число читаемых секторов +LD DE,sec_low ; абсолютный номер сектора младшая часть +LD IX,sec_high ; абсолютный номер сектора старшая часть +CALL 3D13h ; NC -> нормальное завершение +; CF -> ошибка +; ** При попадании межсекторного промежутка на адрес 0000h +; производится автоматическое переключение страницы ОЗУ по +; RAM Allocation Table. +HDD_WRITE: ; писать сектора на винчестер +LD C,046h ; номер команды +LD HL,bufer_adr ; адрес буфера данных +LD A,bufer_page ; страница буфера, если адрес в окне 0C000h +LD B,sec_num ; число записываемых секторов +LD DE,sec_low ; абсолютный номер сектора младшая часть +===== PAGE 49 ===== +20 ФУНКЦИИ БИОСА 49 +LD IX,sec_high ; абсолютный номер сектора старшая часть +CALL 3D13h ; NC -> нормальное завершение +; CF -> ошибка +; ** При попадании межсекторного промежутка на адрес 0000h +; производится автоматическое переключение страницы ОЗУ по RAM +; Allocation Table. +HDD_PART: ; настройка партиций и master/slave +LD C,047h +; * функция зарезервирована +; В ближайшее время в описание биоса будут добавлены функции работы с FDD и +; CD-ROM +; * В данный момент они имеются, но предполагается их серьезная переделка. +; Некоторые функции зарезервированы для дальнейшего развития. Так же не +; описана часть графических функций, так как они в данный момент подвергаются +; серьезным переделкам. +LD C,50H ; зарезервирована +DRV_RESET: ; Сброс контроллера и настройка на диск +LD A,drv_type ; бит 0..3 - номер устройства +; бит 4..7 - тип устройства +; 0 - дисковод +; 6 - ram-disk +; 8 - HDD +; C - CD-ROM +; остальные номера резервные +LD C,51h ; +CALL 3D13H ; NC - нормальное завершение +; CF - нет диска или нет устройства +LD C,52h ; зарезервировано +LD C,53h ; зарезервировано +DRV_VERIFY: ; проверка секторов +LD A,drv_type ; бит 0..3 - номер устройства +; бит 4..7 - тип устройства +; 0 - дисковод +; 6 - ram-disk +; 8 - HDD +; C - CD-ROM +LD HL,sec_h ; страшая часть номера сектора +LD IX,sec_l ; младшая часть номера сектора +LD B,n_sec ; количество секторов +LD C,54h ; +CALL 3D13h ; NC - нормальное завершение +; CF - проверка с ошибкой или нет устройства +DRV_READ: ; чтение с устройства +LD A,drv_type ; бит 0..3 - номер устройства +; бит 4..7 - тип устройства +; 0 - дисковод +===== PAGE 50 ===== +20 ФУНКЦИИ БИОСА 50 +; 6 - ram-disk +; 8 - HDD +; C - CD-ROM +LD HL,sec_h ; страшая часть номера сектора +LD IX,sec_l ; младшая часть номера сектора +LD B,n_sec ; количество секторов +LD DE,bufer_adr ; адрес буфер для чтения +LD C,55h ; +CALL 3D13h ; NC - нормальное завершение +; CF - ошибка чтения или нет устройства +DRV_READ: ; запись на устройства +LD A,drv_type ; бит 0..3 - номер устройства +; бит 4..7 - тип устройства +; 0 - дисковод +; 6 - ram-disk +; 8 - HDD +; C - CD-ROM +LD HL,sec_h ; страшая часть номера сектора +LD IX,sec_l ; младшая часть номера сектора +LD B,n_sec ; количество секторов +LD DE,bufer_adr ; адрес буфер для чтения +LD C,56h ; +CALL 3D13h ; NC - нормальное завершение +; CF - ошибка чтения или нет устройства +DRV_DETECT: ; определение параметров устройства +LD A,drv_type ; бит 0..3 - номер устройства +; бит 4..7 - тип устройства +; 0 - дисковод +; 6 - ram-disk +; 8 - HDD +; C - CD-ROM +LD C,57h ; +CALL 3D13h ; NC - нормальное завершение +; A - bit7 - 0 диск 720Кb +; 1 диск 1.44Mb +; CF - нет устройства или нет носителя +DRV_GET_PAR: ; получить параметры носителя +LD A,drv_type ; бит 0..3 - номер устройства +; бит 4..7 - тип устройства +; 0 - дисковод +; 6 - ram-disk +; 8 - HDD +; C - CD-ROM +LD C,58h ; +CALL 3D13h ; NC - нормальное завершение +; L - число секторов +; H - число головок +; DE - количество цилиндров +; IX - размер сектора в байтах +; B - доп. параметры +; для дискет бит7 - тип 1.44/720 +===== PAGE 51 ===== +21 ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ ПО ПРОГРАММИРОВАНИЮ 51 +; если в HL,DE все FF - устройства нет +; CF - нет устройства +DRV_SET_PAR: ; установить параметры носителя +LD A,drv_type ; бит 0..3 - номер устройства +; бит 4..7 - тип устройства +; 0 - дисковод +; 6 - ram-disk +; 8 - HDD +; C - CD-ROM +LD L,n_secs ; L - число секторов +LD H,n_heads ; H - число головок +LD DE,n_cyls ; DE - количество цилиндров +LD IX,sec_size ; IX - размер сектора в байтах +LD B,ext_par ; B - доп. параметры +; для дискет бит7 - тип 1.44/720 +LD C,59h ; +CALL 3D13h ; NC - нормальное завершение +; Функции не отмеченные как зарезервированные, старые или тестируемые, +; меняться скорее всего не будут. +21 Дополнительные сведения по программированию +21.1 Вывод на графический экран +В биосе имеются функции открытия графического экрана на весь экран 320x256 точек. После открытия +этого режима экран представляет собой. набор из 256-ти линий, длиной по 320 байт. Соседние точки в +линии - это соседние байты. Переключение линий производится через PORT_Y, в котором устанавливается +номер линии, выводимой на экран. Номера линий считаются сверху экрана, начиная с нулевой. +Для вывода в графический экран так же требуется открыть соответствующую страницу основного ОЗУ. +В этой странице будет содержаться копия видеоизображения. +Видео-ОЗУ является теневым ОЗУ, поэтому информация, находящаяся в основном ОЗУ, под которым +находится видео-ОЗУ не обязательно будет совпадать с информацией, находящейся в этом видео-ОЗУ. +Запись видео-данных может производиться и без перезаписи данных в оснвном ОЗУ, что оказывается +полезным при работе, например, со спрайтами. Для работы со спрайтами так же предусмотрен режим записи +в видео-ОЗУ с прозрачным цветом. В этом режиме информация, передаваемая в видео-ОЗУ проверяется на +наличие байта #FF. Если этот байт обнаруживается, то цикл записи пропускается и на экране в этом месте +остается те данные, какие были ранее. Таким образом на экране можно быстро прорисовывать спрайты, +представляющие из себя прямоугольные картинки с «прозрачными» цветами. +Пример программы вывода прямоугольной картинки на экран: +PAGE3 EQU #E2 +RGADR EQU #89 +LD A,#50 ; страница графического видеоэкрана +OUT (PAGE3),A ; установить в PAGE3 +LD HL,Pucture ; адрес картинки (Прямые Данные) +LD DE,#C040+HorPlace ; положение картинки на экране по горизонтали +LD A,VerPlace ; положение картинки на экране по вертикали +OUT (RGADR),A +LD B,VerSize ; высота картинки +LOOP: PUSH DE ; запомнить положение на линии +PUSH BC ; запомнить счетчик высоты +===== PAGE 52 ===== +52 +LD BC,HorSize ; длина картинки +LDIR ; копировать линию +POP BC +POP DE +INC A ; следующая координата по Y +OUT (RGADR),A +DJNZ LOOP ; повторять нужное количество раз +Управление режимом вывода на экран (включение вывода с прозрачными цветами, отключение копиро- +вания в основное ОЗУ) осуществляется через младшие биты порта страницы графического экрана. +21.2 Особые режимы +Режим Bound, программирование режимом экрана (быстрые скроллинги). +21.3 Вывод палитр +Вывод палитры – функция БИОС. +Часть V +Программирование в TR-DOS (дополнительные +команды) +22 Работа с HDD и RAM-Disk через TR-DOS +Команды вводятся как обычно в TR-DOS строке побуквенно. Все команды доступные из командной +строки работают и из BASIC-а через: +RANDOMIZE USR 15619: REM:comand +При наборе команд через знак "/"следует иметь в виду, что лишние пробелы в начале мешают ее +исполнению (система распознает новую команду по знаку "/"в начале команды). +При наборе имен файлов MS-DOS допускаются звездочки и вопросики, по правилам: * – любой набор +символов, ? – один любой символ. +22.1 /HDT +/HDT – тест винчестера. Определяет тип винчестера и выводит на экран его марку. Если этого не +происходит, это значит, что винчестер либо неверно подключен, либо незовместим (бывает с очень старыми +моделями). +22.2 /HDD +/HDD – подключение винчестера к текущему диску A,B,C или D – к тому, на который указывает +TR-DOS в начале в командной строки. +22.3 /CAT, /DIR +/CAT /DIR – выдача каталога. Команды /CAT и /DIR идентичны по исполнению. Работают так же +команды типа: +/DIR *.trd – выдача каталога файлов с расширением .trd +===== PAGE 53 ===== +22 РАБОТА С HDD И RAM-DISK ЧЕРЕЗ TR-DOS 53 +/DIR a*.dm* – выдача файлов, имена которых начинаются на a, а расширения на dm +/DIR ??xm.* – выдача файлов, имена которых имеют четыре буквы и оканчиваются на xm +22.4 /LOAD, /SAVE +/LOAD x file.ext – загрузка в RAM-Disk x файла file.ext RAM-Disk будет автоматически создан (или +пересоздан, если такой был) +Сокращенная команда:/file.ext – загрузка файла в RAM-Disk E +/SAVE x file.ext – сохранение RAM-Disk-а в файла file.ext. При сохранении происходит замещение +содержания существующего файла. Новый не создается, длина файла не меняется. +При загрузке и сохранении работают и команды со звездочками и вопросиками, но выполняется толь- +ко с первым найденым файлом. Например, команда /*.* загрузит в RAM-Disk E самый первый файл с +винчестера. +ВНИМАНИЕ: Команда /SAVE на данный момент является единственной командой TR-DOS, которая +меняет содержимое винчестера. При своей работе она ЗАМЕЩАЕТ содержимое файла образом RAM-Disk-а. +Если длина файла меньше длины RAM-Disk, то запишется лишь часть данных RAM-Disk-а, по количеству +секторов файла. +22.5 /FDD +/FDD – подключение к текущему диску обычного дисковода. Если к этому диску был подключен +винчестер или RAM-Disk, то они будут отключены и доступ с этого диска будет осуществляться к обычной +дискете. +После команды /FDD работают все команды /SAVE, /LOAD, /DIR с дискетами в формате MS-DOS. +1.44 или 720 диск распознается автоматически. +После нее же работают и все стандартные команды TR-DOS, а так же расширенные команды из TR- +DOS-5.04Em. +22.6 /RMD +/RMD X – подключение к текущему диску рамдиска X (буквы от Е до S). После этой команды текущий +дисковод работает с RAM-Disk-ом в только формате TR-DOS. Выполняются все TR-DOS команды, в том +числе и FORMAT. При форматировании старое содержимое диска уничтожается, диск приобретает размер +640Kb и в него прописывается пустой каталог. +ВНИМАНИЕ! Если RAM-Disk не был создан или подгружен с винчестера или дискеты, все попытки +чтения каталога, файлов и т.п. приведут к появлению ошибки. +Создать RAM-Disk можно командой: FORMAT "name". Обязательно после того, как командой /RMD +X был подсоединен нужный RAM-Disk. +Подгрузка RAM-Disk-а осуществляется командой /LOAD. При этом RAM-Disk создается автоматиче- +ски. Работа с TR-DOS на этом RAM-Disk-е будет возможна только если подгруженный файл был образом +RAM-Disk-а. Если же это не так, то доступ к RAM-Disk-у все равно останется через команды чтения/записи +секторов, вызываемые через точку #3D13. Таким образом можно подгружать и использовать в программах +любые файлы. +22.7 /CLEAR +После того как RAM-Disk X сохранен (и не обязательно после этого) он может быть удален из памяти +командой. +/CLEAR x +Объем памяти компьютера ограничен, поэтому не обязательно все 16 RAM-Disk-ов могут в нем уместить- +ся. Кроме того, размер RAM-Disk определяется с точностью до 16Kb и может занимать все пространство +памяти т.е. до 3.4Mb (Остальная память – 256K видео, 256K спектрумовская память и 80K системной +памяти всегда заняты.) +===== PAGE 54 ===== +23 ДОПОЛНЕНИЯ TR-DOS 5.04EM 54 +22.8 Команды переключения конфигураций +TR-DOS предоставляет простое средство для преключения трех конфигураций, зашитых в ПЗУ непо- +средственно из командной строки. Для этого служат команды: /Sprinter 1, /Sprinter 2 и /AY. Следует +иметь в виду, что после переключения в Sprinter-2 спектрумовская клавиатура перестанет работать, и в +случае вызова этой команды с консоли произойдет «подвисание». Использование этой команды может быть +целесообразно в BASIC программах, которые переключат режим, выполнят некоторые действия и вернут +режим в Sprinter 1 или AY, когда вновь возможно использование спектрумовской клавиатуры. +22.9 Дополнительные сервисные команды +Кроме описанных есть еще несколько сервисных команд: +/A: /B: /C: /D: – переключение текущих дисководов без проверки их начичия. Удобно использовать +из бейсика при работе с рамдисками, когда надо убрать возникновение ошибок из-за переключения на +дисковод, к которому еще ничего не подключено. +/RD – тестовая команда. Выводит внутреннюю таблицу Ram Allocation Table (подобна FAT), по которой +можно увидеть какие страницы ОЗУ заняты, какие свободны. Таблица выводится сплошными цифрами в +HEX формате. Каждая пара это номер, соответстующий некой странице. Если этот номер равен 00, это +означает, что страница свободна. Таблица 16x16 двухбуквенных номеров соответствует 256-ти страницам +основного ОЗУ. +Создание новых файлов на HDD или дискетах MS-DOS на данный момент возможно только через ко- +мандеры или функции DOS, вызываемые из ассемблера. Аналогично, копирование, удаление, перемещение, +создание/удаление каталогов и т.д. +Из TR-DOS можно работать только с файлами корневого каталога. Единственная команда TR-DOS +меняющая содержимое HDD – команда /SAVE, замещающая содержимое файла, в который производится +сохранение RAM-Disk-а. +Большие и маленькие буквы в названиях MS-DOS файлов считаются одинаковыми. +23 Дополнения TR-DOS 5.04Em +TR-DOS 5.04Em, на основе которого написан TR-DOS Спринтера, использовался в компьютерах +Peters-256. +TR-DOS 5.04Em является дальнейшим развитием версий 5.04Е, 5.04Е+. По сравнению с версией 5.03 +в ней имеются следующие дополнения: +Форматирование дискет в 3-х вариантах: +ORIGINAL – обычный формат TR-DOS; +TURBO – форматирование диска с другим расположением секторов, что приводит к ускорению операций +чтения/записи диска примерно в 2 раза. однако, применение этого формата замедляет выполнение команды +VERIFY, но эта команда реально почти не используется. +TURBO-FAST – форматирование аналогично TURBO, но без операции проверки. Этот режим стоит +применять только если есть уверенность в качестве дискет. Применение команды немного ускоряет саму +операция форматирования. +QUICK – быстрый формат. Команду можно применять, в случае, если диск уже отформатирован и надо +просто удалить с него все файлы. TR-DOS не проводит физического форматирования, а просто прописывает +в первых секторах пустой каталог. Следует отметить, что этот формат не годится для односторонних +и 40-дорожечных дисководов, так как диск не проверяется и в него прописываются данные, что он +двухсторонний, имеет 80 дорожек и 2544 свободных сектора. QUICK-формат автоматически используется +для форматирования RAM-Disk-ов. +Bыбор формата производится по запросу DOS после ввода обычной команды FORMAT "name" кла- +вишами <1>, <2>, <3> или <4>. Kлавиша отменяет команду. Если необходимо форматировать +===== PAGE 55 ===== +24 КОПИРОВАНИЕ ФАЙЛОВ С TR-DOS ДИСКЕТ В RAM-DISK 55 +диск из программы, так что бы TR-DOS не запрашивал тип формата, вслед за именем диска, сразу после +кавычки надо поставить цифру 1, 2, 3 или 4, в соответствии с необходимым типом формата. +При форматировании на экран выдается сообщение о номере форматируемой в данный момент дорожки +и стороны диска. +При записи файла на диск в случае если файл с таким именем на диске есть DOS выдает запрос о +стирании старого файла. Если ответить или , то старый файл будет стерт и на его место +будет записан новый файл, если он не длиннее старого. Если же новый файл длиннее, то он будет записан +как обычно с первого свободного сектора диска, а в каталоге появится еще один стертый файл. B версии +5.03 такой случай просто приводит к остановке программы с ошибкой. +При включении DOS сразу устанавливает, что дисководы A: и B: имеют тип 2x80.. Это приводит к +отсутствию начальной проверки дисковода (нет звука "др-др-др"при первом выборе нового дискла). В +процессе работы диск проверяется на тип, и DOS работает с ним как надо. +Ускорeнная команда MOVE. В обычной версии 5.03 команда MOVE наиболее длинная по времени +работы, кроме того создается впечатление, что дисковод больше стоит чем работает. Это объясняется тем +что каждый раз при перемещении файла производится чтение каталога и запись в него. В данной версии +чтение и запись каталога производятся один раз. Информация каталога сохраняется в ОЗУ и все операции +с каталогом (только в команде MOVE) производятся в ОЗУ, что значительно ускоряет работу команды, в +среднем в 3 – 4 раза, а в некоторых случаях и более. +Введена новая команда – переименование диска: MOVE "name". При этом команда MOVE не выпол- +няется, а просто имя диска заменяется на "name". +В TR-DOS 5.04Em изменен редактор командной строки. Во-первых, устранена неприятность которая +возникает при входе в DOS в 128 режиме. Во-вторых, устранено влияние клавиш редактирования, которые +перемещают курсор строки в 48-м режиме. И, наиболее важная часть, - возможность вызова предыдущей +команды с помощью клавиши . Если Вы хотите повторить операцию или повторить ее с немного +изменнеными параметрами, то можно вызвать ее сразу после выполнения нажав клавишу . Если +же Вы что-то набрали в командной строке, то клавиша не сработает (в 5.03 версии это приводит +к вызову строки из BASIC программы). +TR-DOS 5.04Em поддерживает работу с RAM-диском, основанном на дополнительном ОЗУ – 128k. Эта +функция заменена на более модернизированные функции работы с RAM-Disk-ами Спринтера, описанные +выше. +24 Копирование файлов с TR-DOS дискет в RAM-Disk +Последовательность команд для достижения эффекта копирования в RAM-Disk E содержимого дискеты +A: +*"A:" – переключение на диск A +/FDD – подключение к диску A обычного дисковода +*"B:" – переключение на диск B +/RMD E – подключение к диску B рамдиска E +FORMAT "name" – форматирование RAM-Disk-а (можно не форматировать, а подгрузить файл с HDD +командой /LOAD E file.trd) +COPY "b:*","a:*" – стандартная команда TR-DOS копирования всех файлов с A: на B: +Действия собственно по копированию с дискет на RAM-Disk могут быть совершены стандартными +спектрумовскими командерами, работающими с TR-DOS через точку входа #3D13. +После этих команд на диске B: будет виден обычный каталог (команда TR-DOS:CAT) и с этими файлами +можно работать как с обычными TR-DOS файлами. +===== PAGE 56 ===== +25 СОХРАНЕНИЕ СОДЕРЖИМОГО RAM-DISK НА ВИНЧЕСТЕРЕ 56 +После того, как нужные файлы скопированы на RAM-Disk, его следует сохранить, как описано в сле- +дующей секции. +25 Сохранение содержимого RAM-Disk на винчестере +Для примера – RAM-Disk E. +К какому дисководу был подключен RAM-Disk (и был ли подключен вообще) не имеет значения. Име- +ет значение, что этот RAM-Disk существует в памяти, т.е. был либо создан командой FORMAT, либо +подгружен ранее с HDD. +Последовательность команд: +/HDD – подключение винчестера (какой диск стоял по умолчанию не имеет значения сработает на +любом) +/SAVE E file.trd – сохранение RAM-Disk-а E в файл file.trd +Сохранение подгруженного с HDD RAM-Disk обратно, естветственно, стоит делать только в том случае, +если в образе диска произошли изменения. Для избежания возможных глюков рабочие программы стоит +держать в отдельном RAM-Disk-е, а изменяемые файлы на другом и иметь резервные копии файлов .trd с +важными данными (это общая рекомендация для любых компьютерных систем). +Часть VI +Программирование в Sprinter-DOS +(от Дениса) +А этот текст для того что быLATEXне ругался на пустоту в параграфе. А то, блин, развели тут, панимашь, +пустых парахрафов, как мух нерезаных! \ No newline at end of file diff --git a/docs/converted/Parinov.txt b/docs/converted/Parinov.txt new file mode 100644 index 0000000..d434da9 --- /dev/null +++ b/docs/converted/Parinov.txt @@ -0,0 +1,1059 @@ +Форум +“Программирование Спринтера» + + + +Оглавление: + TOC \o "1-3" \h \z HYPERLINK \l "_Toc65383363" Экран и палитра PAGEREF _Toc65383363 \h 2 + HYPERLINK \l "_Toc65383364" Шрифты PAGEREF _Toc65383364 \h 7 + HYPERLINK \l "_Toc65383365" Память PAGEREF _Toc65383365 \h 10 + HYPERLINK \l "_Toc65383366" Файлы PAGEREF _Toc65383366 \h 14 + HYPERLINK \l "_Toc65383367" Звук PAGEREF _Toc65383367 \h 16 + HYPERLINK \l "_Toc65383368" ISA-8 слоты PAGEREF _Toc65383368 \h 18 + HYPERLINK \l "_Toc65383369" Summary PAGEREF _Toc65383369 \h 18 + HYPERLINK \l "_Toc65383370" More information PAGEREF _Toc65383370 \h 18 + HYPERLINK \l "_Toc65383371" Акселератор компьютера Sprinter. PAGEREF _Toc65383371 \h 20 + HYPERLINK \l "_Toc65383372" Прерывания PAGEREF _Toc65383372 \h 22 + HYPERLINK \l "_Toc65383373" IDE контроллер PAGEREF _Toc65383373 \h 23 + HYPERLINK \l "_Toc65383374" FDD контроллер PAGEREF _Toc65383374 \h 24 + HYPERLINK \l "_Toc65383375" Клавиатура PAGEREF _Toc65383375 \h 25 + HYPERLINK \l "_Toc65383376" Коды ошибок DSS PAGEREF _Toc65383376 \h 27 + Экран и палитра + + Denis Parinov + (Sprinter Team) + 2002/10/02 00:57 + Re: Графические режимы [re: Shiru_Otaku] + + + + Функции для работы с экраном: + + Сейчас DOS поддерживает четыре режима экрана. + Два текстовых: + 40x32 символов c 16 цветами (режим 02h); + 80x32 символов c 16 цветами (режим 03h); + и два графических: + 320x256 точек с 256 цветами (режим 81h); + 640x256 точек с 16 цветами (режим 82h); + Основным режимом является текстовый режим 80x32 (03h), если вашапрограмма +работает в другом режиме, то вам следует перед переключением режимаполучить +номер текущего режима функцией 51h GETVMOD и сохранить его, а передзавершением +программы восстановить его. + + Например: + + LD C,51h ;получить режим экрана + RST 10h + LD C,A ;поместить номер режима экрана в регистр C + PUSH BC ;и сохранить на стеке (B - страница, C - режим) + . + . ;ваша программа + . + + POP BC ;взять со стека режим экрана + LD A,C ;поместить номер режима экрана в регистр A + LD C,50h ;установить режим экрана + RST 10h + LD C,41h ;завершить программу. + RST 10h + + DSS имеет функции вывода на текстовый экран символов и символьных строк.Для +графических режимов требуются собственные процедуры вывода на экран.Например, +при завершении программы вы можете выдать строку на текстовый экран: + + + LD HL,STRING ;указатель на строку символов + LD C,5Ch ;вывод строки символов + RST 10h + +STRING DB "Thank you for using my program..." ;текстовая строка + DB 13,10 ;символы возврата каретки и перевода строки + DB 0 ;символ конца строки + + Для вывода на графический экран, вам необходимо подключить видео память водно +из трех окон памяти 04000h-07FFFh, 08000h-0BFFFh, 0C000h-0FFFFh. Этоосуществля- +ется выводом значения 50h в соответствующий порт 0A2h, 0C2h или 0E2h в +зависимости от окна памяти. При подключении обратите внимание на то, чтобыстек +вашей программы не попадал в это адресное пространство. + + +Например, если вам нужно поставить точку на экране, то подпрограмма длярежима +81h будет выглядеть так: + +; HL - горизонтальная координата +; DE - вертикальная координата + + IN A,(0E2h) ;считать из порта номер страницы подключенной в + ;третье окно памяти + LD C,A ;запомнить в регистре C + LD A,50h ;страница видео памяти + OUT (0E2h),A ;подключение видео памяти + LD A,E ;поместить вертикальную координату в регистр A. + OUT (89h),A ;выдать в порт + LD DE,0C000h ;адрес начала третьего окна памяти + ADD HL,DE ;получить адрес точки (адрес начала окна + + ;горизонтальная координата) + LD A,255 ;цвет выводимой точки (от 0 до 255) + LD (HL),A ;вывод точки на экран + LD A,C ;вспомнить номер страницы памяти + OUT (0E2h) ;подключить страницу памяти вместо страницы видео + ;памяти + + Перед выводом точек следует установить необходимые цвета в палитре.Различные +режимы вывода на экран задаются номером видео страницы от 50h до 5Fh.Подробнее +о режимах вывода вы можете прочитать в описании архитектуры компьютера. + + 50h (80) SETVMOD (Выбор режима экрана) + +входные данные: + + A - режим экрана + 02h - текстовый 40x32x16 цветов + 03h - текстовый 80x32x16 цветов + 81h - графический 320x256x256 цветов + 82h - графический 640x256x16 цветов + B - страница экрана 0/1 + C - 50h + +выходные данные: + + A - код ошибки, если CF=1 + + Функция устанавливает режим экрана. Седьмой бит режима экрана установлен +для графических режимов и сброшен для текстовых. Существуют два текстовыхрежима +и два графических. + + + 51h (81) GETVMOD (Получить текущий режим экрана) + +входные данные: + + C - 51h + +выходные данные: + + A - текущий режим экрана + B - страница экрана 0/1 + + Функция возвращает текущий режим экрана и номер страницы экрана. + + + Anonymous + (Unregistered) + 2003/03/01 10:13 + + Здравствуйте. А как с палитрами??? Как загрузить произвольную + палитру (отдельный цвет). Желательно с исходником. + Почему системная палитра выглядит по разному в эмуляторе и реальном + Спринтере. + + Alex_Goryachev + (Sprinter Team) + 2003/03/01 12:51 + + Пример из исходников Антона Енина ( + http://www.petersplus.com/download/sources/aprint.zip ) + + +;[]=======================================================================[] +; palette from Flex Navigator +CustomPalette: + db 0x00, 0x00, 0x00, 0x00 ; Black 00 + db 0x00, 0x00, 0xFF, 0x00 ; B.Red 01 + db 0x00, 0x80, 0x00, 0x00 ; Green 02 + db 0x00, 0xFF, 0xFF, 0x00 ; B.Yellow 03 + db 0x80, 0x00, 0x00, 0x00 ; Blue 04 + db 0xFF, 0xFF, 0x00, 0x00 ; Invert bg 05 + db 0x80, 0x00, 0x00, 0x00 ; Invert fg 06 + db 0x80, 0x80, 0x80, 0x00 ; BlackGray 07 + db 0xC0, 0xC0, 0xC0, 0x00 ; HighGray 08 + db 0x80, 0x00, 0x00, 0x00 ; Panel 09 + db 0xFF, 0xFF, 0x00, 0x00 ; Files 0A + db 0x00, 0xFF, 0xFF, 0x00 ; Select Files 0B + db 0x00, 0xFF, 0xFF, 0x00 ; InvSel Files 0C + db 0xC0, 0xC0, 0xC0, 0x00 ; Reserved 0D + db 0xFF, 0xFF, 0xFF, 0x00 ; White 0E + db 0xFF, 0xFF, 0xFF, 0x00 ; White 0F + +;[]=======================================================================[] +;[]=======================================================================[] +; set requist video mode 640x256x16 +SetVideoMode: + ld c, 0x51 ; save previos vmode + rst 0x10 + ld (vmode + 1), a + ld a, b + ld (vscrn + 1), a + sub a + call CrearVideoRam + ld bc, 0x0050 ; set 640x256x16 + ld a, 0x82 + rst 0x10 + ld hl, CustomPalette + ld de, 0x1000 + ld bc, 0xFFA4 + sub a + rst 0x08 ; load palette + ret + +;[]=======================================================================[] + + + + Denis Parinov + (Sprinter Team) + 2003/03/02 02:47 + Re: Графические режимы [re: Anonymous] + + + + > Здравствуйте. А как с палитрами??? Как загрузить произвольную + палитру + (отдельный цвет). Желательно с исходником. + + +;Установить 5-й цвет "средне-зеленым" + LD HL,COLOUR + LD DE,#0105 + LD BC,#FFA4 + XOR A + RST #08 + +; B G R +COLOUR DB #00,#80,#00,#00 + + +;Изменить все 256 цветов в палитре + LD HL,COLOURS + LD DE,#0000 + LD BC,#FFA4 + XOR A + RST #08 + +;Параметры цвета +; B G R +COLOUR DB #00,#80,#00,#00 + +;Палитра +COLOURS DB #00,#00,#00,#00 ;Colour 0 + DB #00,#00,#80,#00 ;Colour 1 + DB #00,#80,#00,#00 ;Colour 2 + DB #00,#80,#80,#00 ;Colour 3 + ... + DB #FF,#FF,#FF,#00 ;Colour 255 + + +> I set A=0 in the SCROLL call, expecting this to clear the bottom line,
but this did not happen, so I had to add a CLEAR call as well. Is this a
bug, or did I misunderstand the documentation? 

Unfortunately, I can't check it on Sprinter now. But source code of the
SCROLL function looks good. I will check it as soon as possible. 

> For the cursor, I am just doing RDCHAR and then WRCHAR with all the
attribute bits inverted. This gives me a solid cursor block (if over a
space) or an inverted blinking character (if over a character). This is
fine, but I may like to try and improve the appearance, so it is always
solid or always flashing. Can you give me some information on what the
attribute values represent? 

We use standard CGA / VGA text colors by default. It can be changed in the
palette. +
Text attributes +
bit 7 - Blink symbol +bits 6,5,4 - Background color (8 colors) (0...7) RGB +bits 3,2,1,0 - Ink colors (16 colors) (0...15) IRGB +
Colors used for Background and Ink +
 0 0h 0000b - Black + 1 1h 0001b - Blue + 2 2h 0010b - Green + 3 3h 0011b - Cyan + 4 4h 0100b - Red + 5 5h 0101b - Magenta + 6 6h 0110b - Brown + 7 7h 0111b - White +
Colors used for Ink only +
 8 8h 1000b - Gray + 9 9h 1001b - Bright Blue +10 Ah 1010b - Bright Green +11 Bh 1011b - Bright Cyan +12 Ch 1100b - Bright Red +13 Dh 1101b - Bright Magenta +14 Eh 1110b - Yellow +15 Fh 1111b - Bright White + +Как я понял, сейчас есть проблема с выводом на экран. 
Попробую расписать схему видео-вывода на словах. 

Режим адресации. Задается номером страницы. 
Если номер 5Xh - адресация графическая. 
Если номер не 5Xh - адресация спектрумовская, и она включена все время, даже если в соседней странице включился номер 5Xh. 

Спектрумовская адресация, это доступ к видеопамяти на запись в адресах 4000h..5FFFh или в 4000h - 7FFFh, в зависимости от состояния порта PORT_Y (89h). 

Бит 6 = 1 - отключает вывод в спектрумовское окно памяти. 
Бит 7 = 1 - расширяет спектрумовское окно с 8Kb до 16Kb 

Бит 4..0 - пределяет 8kb банк спектрумовского режима. 
Эти банки располагаются "вертикально", т.е. такой банк соответствует 32-м последовательным точкам на графической линии и 256-ти линиям. 

Сначала я чаще всего использовал окно 4000h..7FFFh для работы с графикой, поэтому получилось так, что графическая адресация перекрывала спектрумовскую при включении в порт A2h значения 5Xh, а выше 8000h использовалось программой, потом, когда стали использовать для вывода на экран страницу 0C000h, получилось так, что в странице 4000h оставалась открыта видеопамять со спектрумовской адресацией, а порт 89h используется и там и там, но с разным назначением. 

Т.е. после открытия страницы 0C000h для графики остается открытой и спектрумовский способ адресации видеопамяти в странице 4000h..7FFFh... 
P.S. Надеюсь, что не запутал все окончательно... + Шрифты + Alex_Goryachev + (Sprinter Team) + 2002/05/28 11:44 + Re: Несколько наборов шрифтов одновременно [re: Shaos] + + Вот ответ, полученный от Ivan Mak. + + === Cut === + + Через Bios: + + IX - 32-хбайтовый описатель окна + (искать в описании, здесь только только самое важное) + ........ + (IX+4) - режим знакоместа + bit4=1 - text_mode + bit5=0 - 16, bit5=1 - 8 точек в знакоместе (80/40 символов) + bit7..6,3..0 - номер знакогенератора + исключение: bit7..6=B"11" - бордер + ....... + Он же (IX+4) - номер используемого знакогенератора в этом окне, он + же + регистр B в функциях B4,B5 + + Функция B0 открытие окна использует описатель, в котором указан + знакогенератор, открытый для всех символов данного окна. Он может + быть + перебит прямой записью в видео-память или фунцией B5, которая пишет + символ + со знакогенератором. При использовании функции B0 четвертый бит + регистра E + определяет, какая страница режима будет использоваться. Для работы с + двумя + страницами надо открывать окно два раза со значениями 0 и 1 в 4-м + бите рег.E + + ================================= + 0B4h (180) WIN_GET_SYM Взять символ с экрана + + Значение регистров на входе: + C=0B4h + A - идентификатор окна (д.б. 0) + DE - положение символа в окне: + D - вертикаль, E - горизонталь + Значение регистров на выходе: + NC - нормальное завершение + L - символ, H - атрибут, + B - знакогенератор + CF - ошибка неверный идентификатор окна + + + ================================= + 0B5h (181) WIN_PUT_SYM Положить символ на экран + + Значение регистров на входе: + C=0B5h + A - идентификатор окна + DE - положение символа в окне: + D - вертикаль, E - горизонталь + L - символ, H - атрибут символа + B - знакогенератор + Значение регистров на выходе: + NC - нормальное завершение + CF - ошибка неверный идентификатор окна + + ================================= + 0B6h (182) WIN_SET_ZG Установка знакогенератора + + Значение регистров на входе: + C=0B6h + A - системный номер знакогенератора + DE - указатель на 2Kb данных знакогенератора + Значение регистров на выходе: + NC - нормальное завершение + CF - ошибка (старая версия, нет функции) + + ================================= + 0B8h (184) WIN_GET_ZG Получение знакогенератора + + Значение регистров на входе: + C=0B8h + DE - адрес, куда будет загружено 2kb знакогенератора + Значение регистров на выходе: + NC - нормальное завершение + CF - ошибка (старая версия, нет функции) + + Функция копирует имеющийся знакогенератор из ПЗУ + ================================= + + Для работы напрямую, окна должны быть открыты биосом, + знакогенераторы установлены. + + Вывод символов осуществляется в графическом режиме адресации, через + страницу 50h. В порт 89h записывается номер символа, адрес в линии + определяет строку. В этот адрес записывается четыре байта, + определяющих + символ, атрибут и знакогенератор. + + Bytes: + byte0 - знакогенератор/режим то же, что в (IX+4) + byte1 - символ + byte2 - атрибут + byte3 - reserved (заполнить нулями) + + Port_Y - номер линии засылаемый в порт 89h + линия 1+S S=0..79 - номер символа в строке для экрана 0 + линия 128+S S=0..79 - номер символа в строке для экрана 1 + (S=0 - выводит символ слева) + + + Adress: в линии 768+N*4 - N - номер строки экрана 0..31. + Адрес одинаков для обоих экранов. + (N=0 выводит символ сверху) + + В режиме 40 символов, номера строк через один: 1,3,5...79 + + Экраны переключаются нулевым битом порта 0C9h + + === Cut === + + + --- + PETERS PLUS LTD + + +---------------------------------------------------------------- +Текстовый экран устроен на удивление просто: в области описания экрана в текстовом режиме на один символ отводится 4 байта (номер знакогенератора, код символа, атрибут и один неиспользуемый байт), причем надо обратить внимание на то, что в этом режиме экран "повернут на бок". Что-бы вывести символ на экран, надо в Port_Y (0x89) записать 128+номер символа в строке (от 0 до 79), затем к адресу начала экранной страницы прибавить 768 (для первого экрана), после чего мы получим адрес байта, в котором хранится номер знакогенератора для вывода символа (поменяйте его, если это необходимо), увеличиваем адрес на один и туда записываем уже код самого символа, а в следующий байт - атрибут этого символа. Что-бы перейти на следующую строку текстового экрана, надо прибавить к адресу начала экранной страницы число 4*номер строки. Используя акселератор (команду копирования вертикальной линии) можно очень быстро выводить текст строки на экран. 

Остается только добавить что прямой доступ к области описания экрана не рекомендован разработчиками, т.к. есть веротяность потери совместимости со следующими моделями, где символы могут описываться подругому. Но если вам необходима большая скорость вывода на экран в текстовом режиме и вы готовы после выпуска программы вносить в неё изменения для обеспечения совместимости со следующими моделями, либо выложить исходники программы, что-бы желающие могли их исправить при необходимости, то, мне кажется можно использовать прямой доступ. 

--- 
Mac Buster^Extreme Entertainment + + +Also use BIOS fn. 0B6h for set new font and 0B8h for get current font. 
Font format like first 2K bytes of spectrum screen. You can load font at the 4000h address in ZX mode and see it. 
for example, char "A" will placed in the memory as 

offset bytes 
0041h 00000000b 
0141h 00111100b 
0241h 01000010b 
0341h 01000010b 
0441h 01111110b 
0541h 01000010b 
0641h 01000010b 
0741h 00000000b + + Память + Denis Parinov + (Sprinter Team) + 2002/08/28 22:11 + Re: Манаджмент памяти [re: cr0acker] + + + + > В конфигурации спринтер + > по #0000..#3FFF, при работе ДСС находится сама ДСС с её Резетами, + тет + чтоб использывать когда сюда подставленна страница пользователся + резеты не доступны!. + + Это так в нижних 16K находится DSS / BIOS в остальных 48К + приложение, но с + определенными особенностями. Стек не должен быть выше #BFFF при + вызове DSS и ниже #8000 при вызове некоторых функций BIOS. +В следующих версиях DSS планируется снятие ряда ограничений на стек +и расположения данных при вызове ее функций. + + > Теперь адресса #4000..#7FFF,#8000..#BFFF,#C000..#FFFF, когда ДСС + передаёт управление эти прогораммам, какие банки там нахадятся по + умолчанию? + + В зависимости от адреса загрузки и размера приложения DSS выделяет + необходимое число страниц памяти. Так при размере меньше 16К будет + выделена + одна страница, при размере больше 16К - две, и т.д. В окна с + "неиспользуемым" адресном пространством будет подключатся +специальная страница #FF.Если приложению требуется памяти больше чем + зарезервировано в exe-файле, оно должно выделить себе дополнительный +блок памяти самостоятельно. + +> Теперь память можно челкать по портам #7FFD,1FFD или нет? 
> И если да, то как типа in #&7FFD,(номер страницы). + + Напрямую память можно счелкать через 4 порта памяти: + #82 - #0000-#3FFFF + #A2 - #4000-#7FFFF + #C2 - #8000-#BFFFF + #E2 - #C000-#FFFFF + + Записывая физический номер страницы в порт. Список номеров +физических страниц для выделенного блока памяти можно получить через +BIOS. + + > Также хотеловсь бы увидет пример по использывани фции 38х Setwin! + + SETWIN работает с логичискими страницами. + + + 38h (56) SETWIN (Подключение страницы памяти) + +входные данные: + + A - идентификатор блока памяти + B - номер страницы в блоке (0,1,2...) + H - биты 6 и 7 задают номер окна, в которое будет подключена страница + C - 38h + +выходные данные: + + A - номер страницы, если CF=0 + A - код ошибки, если CF=1 + + Функция вычисляет физический номер страницы в блоке памяти и подключаетеё +в окно адресного пространства в зависимости от значения регистра HL. Тоесть, +если HL указывает на адрес в пределах от 04000h до 07FFFh, то страница +подключается в первое окно, от 08000h до 0BFFFh - второе окно, от 0C000hдо +0FFFFh - третье. + На выходе в регистре A содержится физический номер страницы, которая + +была подключена до выполнения функции. + + + + Выделить блок памяти 32К и подключить его страницы в #8000 и #C000 + окна: + +; + LD C,#3D ;GETMEM + LD B,2 ;BLOCK 32K + RST #10 ;SYSTEM CALL + JR C,ERROR ;MEMORY ALLOCATION ERROR + + LD (MEMHND),A ;SAVE MEMORY HANDLE +; + LD HL,#8000 ;FRAME ADDRESS + LD C,#38 ;SETMEM + LD B,0 ;FIRST MEMORY PAGE + LD A,(MEMHND) ;MEMORY HANDLE + RST #10 ;SYSTEM CALL + JR C,ERROR ;MEMORY ALLOCATION ERROR +; + LD HL,#C000 ;FRAME ADDRESS + LD C,#38 ;SETMEM + LD B,1 ;SECOND MEMORY PAGE + LD A,(MEMHND) ;MEMORY HANDLE + RST #10 ;SYSTEM CALL + JR C,ERROR ;MEMORY ALLOCATION ERROR +; + + > Заранне спасибо + + + + Denis Parinov + (Sprinter Team) + 2002/08/31 00:43 + Re: Манаджмент памяти [re: cr0acker] + + + + > Во! Пасибо большое? А еслищёлкать портами то есть возможномть что + программа будет совместима с будущей версией ПЗУ/АЛТЕРЫ/ДСС/ПЛАТЫ? + + Да, в любом случае будет возможность запуска программ в той + конфигурации для которой она была написана. Что-то вроде режима + совместимости. Но если для программы не критично работа напрямую + через порты, лучше пользоваться SETWIN как более универсальный. + + >> Так при размере меньше 16К будет выделена одна >страница, при + размере больше 16К - две, и т.д. В окна с "неиспользуемым" адресном + пространством будет >подключатся специальная страница #FF. + + > Какие физические номера этих страниц к приме 1,2,3,,,256! + + Это можно узнать через функцию BIOS, эти номера будут разными в + зависимости от того сколько памяти было выделено другим приложениям. + + Denis Parinov + (Sprinter Team) + 2002/08/31 00:50 + Re: Манаджмент памяти [re: cr0acker] + + + + > Денис а такой вариант выделения памяти будет работать? + > START + > ORG #4000 + > NOP + > ORG #8000 + > NOP + > ORG #C000 + > nop + > Дальше нужный орг и прога! + + Да, если конечно будет записан код от #4000 до конца программы, а не + от последнего ORG, как это делают некоторые ассемблеры. + Еще одно замечание, для DSS1.xx exe-файлы могут начинаться с #4100, + но после запуска можно использовать память с #4000. + + + + + cr0acker + (enthusiast) + 2003/07/19 22:34 + Непонятки. [re: Denis Parinov] + + + + В документации по спринтеру, есть такая фраза: + #82 - PAGE0 - страница ОЗУ, подключаемая вместо ПЗУ через порт + #1FFD. + Что-бы это значило? + ld a, номер_подключаемой_страницы + out (#82),a + ld a, _что?_ + out (#1ffd),a + + + + Denis Parinov + (Sprinter Team) + 2003/07/20 00:39 + Re: Непонятки. [re: cr0acker] + + + + LD A,1 ;RAM #0000-#3FFF + LD BC,#1FFD + OUT (C),A +; + LD A,0 ;ROM #0000-#3FFF + + LD BC,#1FFD + OUT (C),A + +Fast-RAM включается подобно КЭШ-памяти в 'Пентагоне'. 
Включение/выключение происходит с помощью кода: +
 DI + IN A,(#FB) ; включить Fast-RAM - 16к в 0-е окно + ; (в адреса #0000..#3FFF) + ......... ; your programm + IN A,(#7B) ; выключить Fast-RAM + EI + +Если надо использовать прерывания, программа должна установить 
свой обработчик в адрес #0038 

Следует иметь в виду, что Fast-RAM может быть использована другими 
программами, т.е. при запуске некоего процесса через DSS содержание 
Fast-RAM может не сохраниться. 

Перед вызовом функций DSS и BIOS Fast-RAM надо отключать. + Файлы + Denis Parinov + (Sprinter Team) + 2002/06/26 12:58 + Re: Оргинизация памяти [re: cr0acker] + + + + > И ещё аопрос по функции 16h подскажите плз намера атрибутов в + частномти можно ли узнать размер файла этой функцией? + + Размер файла можно узнать с помощью функции 15h. + + + 15h (21) MOVE_FP (Перемещение указателя в файле) + +входные данные: + + A - файловый манипулятор +HL:IX - смещение указателя в файле + B - способ перемещения + B=0 от начала файла + B=1 от текущего значения указателя + B=2 от конца файла + C - 15h + +выходные данные: + + A - код ошибки, если CF=1 +HL:IX - новое значение указателя + + HL:IX интерпретируется как 32-битное число. Если число меньше 65536, +регистр HL содержит 0. Возможны следующие способы перемещения указателя: + + B=0 Смещение считается от начала файла, если HL:IX=0, указатель +устанавливается на начало файла. + + + B=1 Смещение считается от текущего значения указателя. + + B=2 Смещение считается от конца файла, если HL:IX=0, послеперемещения + HL:IX получится длина файла в байтах. + + + + Атрибуты файла: + + Каждый бит байта атрибутов задаёт определённый атрибут файла. + Атрибуты + файлов можно изменять специальной функцией ДОС. + + бит 0 - Только для чтения + бит 1 - Скрытый + бит 2 - Системный + бит 3 - Метка тома + бит 4 - Каталог + бит 5 - Архивный + бит 6 - Не используется + бит 7 - Не используется + + Атрибут "только для чтения". При значении 1 из файла можно читать, + но в + него нельзя писать и его нельзя стереть. + Атрибут "скрытый". При значении 1 файл невиден для обычных операций + ДОС. + Атрибут "системный". Указывает, что файл является системным. + Атрибут "метка тома". В старых версиях MSDOS использовался для + задания + метки диска. + Атрибут "каталог". При значении 1 идентифицирует файл как каталог, + подчинённый данному каталогу или элементы "." и "..". + Атрибут "архивный". Этот бит устанавливается при операциях записи в + файл. + Его могут использовать утилиты создающие архивные копии для + сохранения + изменённых файлов. + + + Звук + Ivan_Mak + (Sprinter Team) + 2002/09/13 04:28 + Re: Программирование звука [re: Shaos] + + + + Звук через COVOX-Blaster (COVOX с буферным ОЗУ) + + CBL=COVOX-Blaster + + Порт управления: 004Eh (16-bit port!!!, писать только через OUT + (c),reg) + + ; bit 7 - COVOX-Blaster on (если 0 то обычный режим COVOX) + ; bit 6 - STEREO-mode on + ; bit 5 - 16bit-mode on + ; bit 4 - Interrupt on - включение прерываний + + ; bits 3..0 - частота + ; + ; 0 16khz -- mono/stereo --- это старые режимы -- не использовать! + ; 1 22khz -- mono/stereo --- это старые режимы -- не использовать! + ; 2 reserved + ; 3 reserved + ; 4 reserved + ; 5 reserved + ; 6 reserved + ; 7 reserved + ; + ; 8 7.8125 KHz -- mono/stereo 8/16 bit + ; 9 10.9375 KHz -- mono/stereo 8/16 bit + ; A 15.625 KHz -- mono/stereo 8/16 bit + ; B 21.875 KHz -- mono/stereo 8/16 bit + ; C 31.25 KHz -- mono/stereo 8/16 bit + ; D 43.75 KHz -- mono/stereo 8/16 bit + ; E 54.6875 KHz -- mono/stereo 8/16 bit + ; F 109.375 KHz -- mono/stereo 8/16 bit + + Порт 0FEh - биты запроса прерываний от CBL + + bit 7 - запрос данных для CBL + bit 5 - синхронизация экрана (кадровый импульс, 4мс длиной, 20мс + период) + + + Запись данных в COVOX-Blaster производится с помощью акселератора, + записью в страницу ОЗУ 0FDh (просто записать блок 128/256 байт с + адреса 0C000h) + или через порт 4Fh командами OTIR блок записываемых данных по + запросу. Для 8 бит режима - 128 байт; для 16 бит - 256 байт + + + + Самый простой пример: + + +Test: + LD BC,04Eh + LD A,8Bh ; включить 8 бит 22khz mono + OUT (C),A ; - CBL - включен! + INC C + LD HL,Sample + OTIR ; загрузить все 256 байт + RET + +Sample: + DB 80h,81,82h,.... ; (256 отсчетов звука с нулем на уровне 80h) + + + + + + Должен пищать одну ноту (если в Sample записать синус, то должно + чисто звучать). + + + Запрос данных в бите 7 порта FE появляется для каждых 128 байт (256 +в режиме 16 бит). Его следует проверять, если его не оказалось, то + прерывание экранное, а не от CBL. + + При выставленных прерываниях от CBL, стоит использовать режим IM 2, + иначе, будет часто вызываться DOS-овая процедура прерываний и могут + появиться тормоза на высоких частотах. + + + В режиме 8 бит сэмплы должны иметь уровень нуля на 80h, + 16 бит сэмплы - уровень нуля - 0000h + Stereo-сэмплы - должны иметь чередующиеся отсчеты левого и правого + канала. + + +mono_8bit: + DB 80h,81h,7Fh.... + +mono_16bit: + DW 0,1000,-1000... + +stereo_8bit: + DB 80h,80h,81h,80h,7Fh,80h... ; здесь один канал играет, второй молчит + +stereo_16bit: + DW 0,0,1000,0,-1000,0... ; аналогично, один канал играет, второймолчит + + + + + (При тестировании 16 бит режима следует помнить, что звук с + амплитудой в единицы почти не слышен) + + P.S. Формат данных выбран так, что бы из WAV-файлов данные в CBL + пересылать простой операцией блочной пересылки. + + ISA-8 слоты +Summary +This article describe ISA-8 interaction. +More information +If you want to interaction with ISA devices, you have to make following steps:
1) send 10h value to port 1FFDh(system port);
2) send control byte to port 0E2h(third memory window port);
control byte:
D7...should be 1
D6...should be 1
D5...should be 0
D4...should be 1
D3...should be 0
D2...specify number of ISA slot
D1...specify access mode (0 - ISA memory, 1 - ISA ports)
D0...should be 0
The read/write signals are forming from read/write signals memory range 0C000h-0FFFFh.
And the address lines A13...A0 has taken from processor data-BUS. The other ISA-signals such as RESET, AEN, A19...A14 can be set in port 9FBDh. And default value is 00h.
port 9FBDh:
D7...RESET
D6...AEN
D5...A19
D4...A18
D3...A17
D2...A16
D1...A15
D0...A14 + +ISA_DIR EQU 9FBDh +SC_PORT EQU 1FFDh +PAGE3 EQU 0E2h + +SAVE_PAGE DB 0 ;variable for previous status of third memory port + +RESET_ISA: ; reset ISA device + LD C, ISA_DIR + LD A,0C0h + OUT (C),A + CALL Pause_10ms + LD A,0 + OUT (C),A + RET + +Pause_10ms: + LD HL,10000 +Loop: + DEC HL + LD A,H + XOR L + JR NZ,Loop + RET + +OPEN_ISA_PORTS: ; open access to ISA + LD BC,SC_PORT + LD A,10h + OUT (C),A + IN A,(PAGE3) ; read value from memory port + LD (SAVE_PAGE),A ; save previous status of memory port + LD A,0D2h ; control byte for (first (upper) ISA slot) + OUT (PAGE3), A ; opening ISA port address space + LD C,ISA_DIR + LD A,0 ; high ISA addresses RESET and AEN signals. + OUT (C),A + RET + +CLOSE_ISA_PORTS: ; close access to ISA + LD A,(SAVE_PAGE) + OUT (PAGE3),A ; restore value of memory port + LD BC,SC_PORT + LD A,0 + OUT (C),A ; + RET + +WRITE_ISA_PORT: + LD HL,ADRESS_PORT+0C000h ; ISA port address + 0C000h offset 3 +memory page + LD A,DATA_OUT ; data for writing + LD (HL),A ; write data to port which pointered HL + RET + +READ_ISA_PORT: + LD HL, ADRESS_PORT+0C000h ; ISA port address + 0C000h offset 3 +memory page + LD A,(HL) ; read data from port which pointered HL + RET +When you work with ISA, the access to third memory page are disabled. If you want to address ISA-memory more than 3FFFh, you should specify high bits in port 9FBDh. + + Акселератор компьютера Sprinter. + + Акселератор предназначен для ускорения операций по пересылке блоков данных в ОЗУ и видео-ОЗУ. + + Акселератор позволяет: + +- быстро заполнять горизонтальную или вертикальную линию длиной до 256 точек одним цветом (в режиме 640x256 - одинарную/двойную горизонтальную линию длиной до 512 точек) +- быстро копировать горизонтальную или вертикальную линию длиной до 256 точек (в режиме 640x256 - горизонтальную линию до 512 точек) +- проводить быстрые операции AND, OR, XOR с блоками памяти. + + Акселератор не может работать с блоками данных ПЗУ и Быстрого-ОЗУ. + + ОЗУ акселератора является частью внутреннего ОЗУ ППЛМ. +Операции по пересылке данных производятся путем записи блока данных в это +внутреннее ОЗУ, а затем копировании его в нужное место ОЗУ из ОЗУ акселератора. +Блок данных, записываемый в ОЗУ акселератора может иметь различную +длинну из диапазона 1..256 байт. + + После одной записи копирование может производиться несколько раз и, таким +образом, можно производить заполнение экрана текстурами. + + Для заполнения экрана одним цветом используется другой режим +акселератора. В нем вместо копируемого блока данных из внутреннего ОЗУ +производится запись данных с шины процессора, которые в этот момент не +изменяются. + + Управление акселератором производится непосредственно из программы. +Для этого изпользуются команды процессора, которые, фактически, являются +операциями типа NOP. + + LD B,B - выключить акселетарор. + LD D,D - включить акселератор в режим приема байта размера блока + далее следует команда типа LD A,dat, где dat и будет новым + размером блока. Если размер блока был установлен ранее, + его можно не устанавливать. + LD C,C - Операция Fill - заполнение одним байтом. Последующая + команда типа LD (HL),A приведет к заполнению указанного + ранее количества байт значением A + LD E,E - Операция Fill для графического экрана - заполнение + вертикальных линий. + LD H,H - rezerved + LD L,L - копирование блока. Последующая команда типа LD A,(HL) + приведет к заполнению ОЗУ акселератора данными из адреса (HL), + а команда типа LD (DE),A приведет к перезаписи данных из ОЗУ + акселератора в ОЗУ или видео-ОЗУ. + LD A,A - копирование блока для графического экрана подобна команде + LD L,L, но работает с вертикальными линиями экрана. + + Пример использования акселератора: + + ; Считаем, что экранная страница уже открыта по адресу #C000 + LD HL,#C040 ; адрес начала линии первого экрана + LD DE,#C180 ; адрес начала линии второго экрана + LD BC,#140 ; длина экрана по горизонтали + DI ; запретить прерывания для работы с акселератором + LD D,D ; включить акселератор на установку размера блока + LD A,0 ; установить размер блока - 256 байт + LD A,A ; установить акселератор на копирование + ; вертикальных линий. + LDIR ; копировать + LD B,B ; выключить акселератор + EI ; включить прерывания + + + + Эта часть программы произведет копирование всего содержимого первого экрана на другой. +Время исполения составляет примерно 26 милисекунд. + + Дополнительные функции акселератора (AND, OR, XOR) работают таким же образом. +Для выполнения логических функций используются команды XOR (HL); OR (HL); AND (HL). + + Пример кодирования блока в 256 байт. + + LD HL,ADRES_1 + LD DE,XOR_DAT + DI + LD D,D + LD A,0 ; число байт, которые надо закодировать + LD L,L + LD A,(DE) ; взять блок данных в ОЗУ акселератора + XOR (HL) ; произвести операцию XOR с данными акселератора + LD (HL),A ; запомнить в ОЗУ результат операции + LD B,B + EI + + +Скорость работы акселератора ограничивается только физической +скоростью работы основного ОЗУ. Определить примерное время работы команды с +акселератором можно по такой формуле: + +Время работы = время работы команды без акселератора + время работы +акселератора + +Время работы акселератора = число пересылаемых байт /7 микросекунд + +Во время работы акселератора необходимо отключать прерывания, так как в этот момент изменяется система команд процессора и программа на прерывании не сможет работать корректно. + Прерывания +Кадровые и клавиатурные прерывания приходят с вектором 0FFh, отличать по биту приема байта в порте клавиатуры, не пришел, значит экран. Возможно, конечно, совпадение но это исключительно редкий случай. 

От мыши прерывания не приходят. Сделать можно, но сейчас их нет. Кстати и различие от экранных прерываний можно (и, видимо, надо будет в новой версии) сделать пожестче через прошивку в ПЛМ. 

От ISA и других внутренных портов процессора прерывания приходят с другим вектором (настраивается в портах), поэтому в режиме IM 2 они легко различаются. + IDE контроллер +
Доступ к поpтам осуществляется пpи неактивном Beta-Disk интеpфейсе. 
Со схемой без поллитpы не pазобpаться, пpивожу поpты как есть: 

поpт pегистp накопителя 

---- блок командных регистров ---- 
xx50 0 (data) 
0051 1 (error/feature) 
0052 2 (sector count) 
0053 3 (sector number) 
0054 4 (cylinder low) 
0055 5 (cylinder high) 
4052 6 (device/head) 
4053 7 (status/command) 

---- блок управляющих регистров ---- 
4054 16 (alternate status/control) 
4055 17 ? 

Пpи записи в поpт нужно его адpес увеличить на 0x100. 

Пpи чтении pегистpа данных пpи a8=0 выpабатывается стpоб чтения и 
младшая часть (D0-D7) шины данных накопителя выдаётся на шину спектpума, 
а стаpшая сохpаняется в теневом pегистpе. Пpи a8=1 читается теневой 
pегистp (D8-D15). 

Пpи записи pегистpа данных когда a8=0 байт сохpаняется в теневом pегистpе 
и стpоб записи для накопителя не выpабатывается. Пpи записи pегистpа данных когда 
a8=1 выpабатывается стpоб записи для накопителя и байт с шины спектpума выдаётся на 
D8-D15 шины накопителя, на D0-D7 выдаётся содеpжимое теневого pегистpа. 

Контроллер имеет общий теневой регистр для записи и чтения. 
 +вот мои раскопки на эту тему от 13.10.2003: 
- регистр команд | регистр состояния 
4153h запись, 4053h чтение 
- регистр накопителя/головки 
4152h запись, 4052h чтение 
- регистр циллиндра (старший байт) 
0155h запись, 0255h чтение 
- регистр циллиндра (младший байт) 
0154h запись, 0254h чтение 
- регистр данных 
0150h запись, 0050h чтение + +Верна информация. 
С одним добавлением. Доступ открыт в режиме Sprinter-ZX, 
а в режимах Pentagon, Scorpion и т.п. - закрыт! + FDD контроллер +0Fh Command/Status register 
3Fh Track register 
5Fh Sector register 
FFh Drive Control register 

In Spectrum configuration the port 0Fh also mapped to 1Fh for TRDOS
compatibility. 
But I would recommend to you don't use direct port access for it. 
A Sprinter have BIOS functions for reading/writing any disk sectors. 

for example: 

At first, make reset disk and to set required parameters. +INIT_DISK + LD D,n ; drive number 0-FDD A, 1-FDD B, 80h-HDD C... + LD C,#51 ; reset disk + RST #08 ; BIOS call +; + LD D,n ; drive number + LD E,n ; sectors per track. + PUSH DE + LD A,D + LD C,#58 ; get disk parameters + RST #08 ; BIOS call + LD A,H + POP HL + PUSH HL + LD H,A + POP AF + LD IX,256 ; sector size + LD C,#59 ; set disk parameters + RST #08 ; BIOS call + RET +
And next to use BIOS fn. 055h for reading. +DRV_READ: ; reading from disk + LD A,drv_type ; bit 0..3 - drive number + ; bit 4..7 - drive type + ; 0 - FDD + ; 6 - ram-disk (reserved) + ; 8 - HDD + ; C - CD-ROM (reserved) + LD HL,sec_h ; sector number (high) + LD IX,sec_l ; sector number (low) + ; (HL:IX - 32bit sector number, like LBA) + LD B,n_sec ; sectors count + LD DE,bufer_adr ; memory address for reading + LD C,#55 ; + RST #08 ; CF=0 - read OK + ; CF=1 - read error + + Клавиатура +> How is it done ? 

It's possible by DSS function 36h (K_SETUP). Sprinter has two keyboard
layouts (standard and alternative) which can be switched by [CTRL] +
[SPACE]. Each layout includes four keyboard modes. You can reload all of
them. + LD HL,LAYOUT + LD A,0 ;LAYOUT FOR NORMAL MODE + LD BC,#0036 + RST #10 +Esc EQU #1B +Bcs EQU #08 +Tab EQU #09 +Cps EQU #00 +Spc EQU #20 +Ent EQU #0D +
;Normal mode (without CAPS and SHIFT not pressed) + DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,"q","w","e","r","t","y","u","i","o","p","[","]" + DB Cps,"a","s","d","f","g","h","j","k","l",";","'",Ent + DB #00,"z","x","c","v","b","n","m",#2C,".","/",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 +
;SHIFT mode (without CAPS and SHIFT are pressed) + DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs + DB Tab,"Q","W","E","R","T","Y","U","I","O","P","{","}" + DB Cps,"A","S","D","F","G","H","J","K","L",":",#22,Ent + DB #00,"Z","X","C","V","B","N","M","<",">","?",#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 +
;CAPS mode (with CAPS and SHIFT not pressed) + DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]" + DB Cps,"A","S","D","F","G","H","J","K","L",";","'",Ent + DB #00,"Z","X","C","V","B","N","M",#2C,".","/",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 +
;CAPS+SHIFT mode (with CAPS and SHIFT are pressed) + DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs + DB Tab,"q","w","e","r","t","y","u","i","o","p","{","}" + DB Cps,"a","s","d","f","g","h","j","k","l",":",#22,Ent + DB #00,"z","x","c","v","b","n","m","<",">","?",#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00
 DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +Прерывания от клавиатуры выставляют бит 0 в порте 19h, им и отличаются от прерываний экрана. Конечно, возможны случайные совпадения, когда прерывание от клавиатуры пришло одновременно с экранным, но это очень маловероятно. От других устройств прерывание может придти, но так же с некими признаками в портах (но это только в случае, если программа эти порты настроила и использует для себя) + Коды ошибок DSS +This is a list of DSS error numbers. 

00h (00) - Success 
01h (01) - Invalid function 
02h (02) - Invalid drive number 
03h (03) - File not found 
04h (04) - Path not found 
05h (05) - Invalid handle 
06h (06) - Too many open files 
07h (07) - File exist 
08h (08) - File read only 
09h (09) - Root overflow 
0Ah (10) - No free space 
0Bh (11) - Directory not empty 
0Ch (12) - Attempt to remove current directory 
0Dh (13) - Invalid media 
0Eh (14) - Invalid operation 
0Fh (15) - Directory exist 
10h (16) - Invalid filename 
11h (17) - Invalid EXE-file 
12h (18) - Not supported EXE-file 
13h (19) - Permission denied 
14h (20) - Not ready 
15h (21) - Seek error 
16h (22) - Sector not found 
17h (23) - CRC error 
18h (24) - Write protect 
19h (25) - Read error 
1Ah (26) - Write error 
1Bh (27) - Drive failure 
1Ch (28) - Unknown error : 28 
1Dh (29) - Unknown error : 29 
1Eh (30) - No free memory 
1Fh (31) - Invalid memory block 
20h (32) - Unknown error : 32 


--- 
PETERS PLUS LTD +PAGE + + +PAGE 27 + + + + diff --git a/docs/converted/ProgrammerManual.txt b/docs/converted/ProgrammerManual.txt new file mode 100644 index 0000000..86d401b --- /dev/null +++ b/docs/converted/ProgrammerManual.txt @@ -0,0 +1,2661 @@ + + + + + + + + + + + + + +Программирование 
дисковой подсистемы Estex v1.54 + + +( c таблицей функций Estex DSS v1.55 ) + + + + + + + + + + + + + + + + + + + + + 2002 Петерс Плюс + +Программирование приложений Estex DSS (DOS) v1.54 + + Взаимодействие с ДОС осуществляется при помощи инструкции RST 10h. В +зависимости от конкретной функции, в качестве входных и выходных параметров +используются различные регистры, при этом номер функции задается в регистре C. +Функции организуют управление файлами, выделение памяти, выполнение программ и +взаимодействие с различными устройствами. +Файловая спецификация: + Файловая спецификация - это строка символов, содержащая имя дискового +устройства, имена каталогов разделённые символом “\” и имя файла. Имена +дискового устройства и каталогов могут быть пропущены. Например: +C:\TEXT\DOC\text.doc +A:file.txt +\TEXT\info.txt + ДОС использует для дисковых устройств имена A:, B:, C: и т.д. Имя +устройства может быть записано перед именем файла, чтобы указать его +местонахождение. Например, команда DIR C:DATFILE ищет DATFILE на устройстве C: в +текущем каталоге. Когда имя устройства явно не указано, ДОС использует текущее +устройство. После запуска системы текущим становится устройство, с которого +загружена ДОС. + Имена файлов состоят из двух частей. Первая содержит 1 до 8 символов. В +зависимости от контекста под именем файла иногда подразумевается именно эта +первая часть. Вторая часть, которая не обязательна и служит для пояснения типа +информации находящейся в файле, содержит до 3 символов и называется расширением. +При написании имени файла обе части разделяются символом точка. Так, например, +имена NAME и NAME. одинаковы. В имени файла не допускаются символы с кодом +меньше 32, а также символы: . “ / \ [ ] : | < > + = ; , +Поскольку подкаталоги тоже файлы, их имена образуются тем же способом. +Имя основного (или корневого) каталога всегда “\”. Кроме этого, при создании +каталога в нём записываются два специальных элемента, с именами “.” и “..”. Имя +“.” обозначает текущий каталог. Имя “..” обозначает каталог верхнего уровня. +Некоторые команды и функции ДОС в именах файлов позволяют использовать +глобальные символы это символы ? и *, которые можно вставлять в имя и в +расширение файла. Символ ? означает, что вместо него может быть любой другой символ. Символ +* означает, что вместо него может быть любое количество символов. + Например: +*.txt - означает все файлы с расширением txt +a??.* - означает файлы с именем в три символа и первым символом “a” +dc*.exe - означает программные файлы с именем любой длины и начинающимся с “dc” + + Атрибуты файла: + Каждый бит байта атрибутов задаёт определённый атрибут файла. Атрибуты +файлов можно изменять специальной функцией ДОС. +бит 0 - Только для чтения +бит 1 - Скрытый +бит 2 - Системный +бит 3 - Метка тома +бит 4 - Каталог +бит 5 - Архивный +бит 6 - Не используется +бит 7 - Не используется + +Атрибут “только для чтения”. При значении 1 из файла можно читать, но в +него нельзя писать и его нельзя стереть. +Атрибут “скрытый”. При значении 1 файл невиден для обычных операций ДОС. +Атрибут “системный”. Указывает, что файл является системным. +Атрибут “метка тома”. В старых версиях MSDOS использовался для задания +метки диска. +Атрибут “каталог”. При значении 1 идентифицирует файл как каталог, +подчинённый данному каталогу или элементы “.” и “..”. +Атрибут “архивный”. Этот бит устанавливается при операциях записи в файл. +Его могут использовать утилиты создающие архивные копии для сохранения +изменённых файлов. + +Файловый манипулятор: + При открытии файла, ДОС автоматически создаёт блок управления файлом. Блок +создаётся в рабочих областях ДОС и его адрес неизвестен +пользовательской программе. Блок (и соответствующий файл) идентифицируется +номером, который ДОС возвращает приложению после открытия файла - этот номер +называется файловым манипулятором. Во всех дальнейших обращениях к функциям ДОС +используется файловый манипулятор. Другими словами, при открытии файла +пользовательская программа сообщает ДОС его имя и получает обратно номер, +который служит логическим именем файла при всех дальнейших операциях с файлом. +Необходимая для работы с файлом информация сохраняется в рабочих областях ДОС. + +Функции для идентификации системы: +00h (00) VERSION (Версия DOS) +входные данные: +C - 00h +выходные данные: +D - номер версии +E - модификация + +Функция возвращает номер версии дисковой системы. + +Функции для работы с диском: +01h (01) CHDISK (Смена текущего диска) +входные данные: +A - номер диска (0-A,1-B...) +C - 01h + +выходные данные: +A - код ошибки, если CF=1 +A - максимальный номер диска, если CF=0 + +Функция меняет текущее дисковое устройство. + +02h (02) CURDISK (Номер текущего диска) +входные данные: +C - 02h +выходные данные: +A - текущий номер диска (0-A,1-B...) +Функция возвращает номер текущего дискового устройства. + +03h (03) DSKINFO (Информация о диске) +входные данные: +A - номер диска (0-A,1-B...0FFh-текущий) +C - 03h + +выходные данные: +A - код ошибки, если CF=1 +A - размер кластера в секторах, если CF=0 +HL - общее кол-во кластеров +DE - свободных кластеров +BC - размер сектора в байтах + +Функция возвращает информацию об общем и свободном пространстве +дискового устройства. +Пример: + LD C,03h ;Функция получения информации о диске + LD A,0FFh ;Текущий диск + RST 10h ;Выполнение функции + LD A,D ;Есть свободное + OR E ;пространство? + JR Z,NO_SPACE ;Диск полностью заполнен + + + 09h (09) BOOTDSK (Номер системного диска) + +входные данные: +C - 09h +B = 0 + +выходные данные: +A - номер системного диска (0-A,1-B...) +Функция возвращает номер дискового устройства c которого загружена система. + +Функции для работы с файлами: + +Создание файла: + Файл можно открыть системной функцией 11h (OPEN), только если он +существует. Есть специальные функции для создания файлов. Если файл был создан +и сразу же закрыт, он будет пустым, но его можно открыть функцией OPEN +для записи информации. Для удобства функции, которые создают файл, затем +открывают его. +0Ah (10) CREATE (Создание файла) +входные данные: +HL - указатель на файловую спецификацию +A - атрибут файла +C - 0Ah + +выходные данные: +A - файловый манипулятор, если CF=0 +код ошибки, если CF=1 +Функция ищет в каталоге файл с именем, совпадающим с именем в +файловой спецификации. Если такой файл существует, делает его длину равной 0 +и открывает файл для чтения/записи. Если файл не обнаружен, создается новый файл +с таким именем и длиной 0 и открывает файл для чтения/записи. +Пример: + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,0Ah ;Функция создание файла + LD A,00h ;Атрибут обычного файла + RST 10h ;Выполнение функции + RET C ;Возврат по ошибке + LD (FILE1),A ;Сохранение файлового манипулятора + +NAME DB “newfile.ext”,0 +FILE1 DB 00h ;Переменная для сохранения файлового манипулятора + + +0Bh (11) CREATE NEW FILE (Создание нового файла) +входные данные: +HL - указатель на файловую спецификацию +A - атрибут файла +C - 0Bh + +выходные данные: +A - файловый манипулятор, если CF=0 +код ошибки, если CF=1 +Функция аналогична функции 0Ah и необходима, когда нужно создать файл +с определённым именем и проверить, что файла с таким именем не существует. + +0Eh (14) DELETE (Удаление файла) +входные данные: +HL - указатель на имя файла +A - атрибут файла +C - 0Eh + +выходные данные: +A - код ошибки, если CF=1 +Функция ищет файл в текущем каталоге и удаляет его. Глобальные символы * и ? в +имени файла не допускаются. Файлы с атрибутом только для чтения нельзя стереть +данной функцией - сначала нужно изменить этот атрибут. +Пример: + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,0Eh ;Функция удаления файла + RST 10h ;Выполнение функции + +NAME DB “newfile.ext”,0 + + + 10h (16) RENAME (Переименование файла) + +входные данные: +HL - указатель на старое имя файла +DE - указатель на новое имя файла +C - 10h + +выходные данные: +A - код ошибки, если CF=1 +Функция ищет файл в текущем каталоге и заменяет его имя на новое. Глобальные символы * и ? в именах файлов не допускаются. +Пример: + LD HL,OLDNAME ;HL указывает на ASCIIZ строку со старым именем файла + LD DE,NEWNAME ;DE указывает на ASCIIZ строку с новым именем файла + LD C,10h ;Функция переименования файла + RST 10h ;Выполнение функции + +OLDNAME DB “oldfile.doc”,0 +NEWNAME DB “newfile.txt”,0 + + +Открытие/закрытие файла: + Открыть файл - это означает выделить для него область памяти (блок +управления), обнаружить файл и перенести определённую информацию из каталога в +блок управления файлом. Приложение указывает в качестве параметра функции 11h +(OPEN) имя и атрибуты файла. ДОС создаёт и заполняет блок управления файлом в +своих рабочих областях. После выполнения функции пользователь получает номер +(файловый манипулятор), которым файл идентифицируется во всех последующих +операциях, вплоть до его закрытия. + При работе с файлом, ДОС изменяет некоторые из полей блока управления +файлом: размер файла, текущая позиция файла и др. Пользовательская программа +также способна изменять поля блока управления с помощью функций ДОС. +Закрытие файла означает прекращение обмена информации с файлом. При этом +файловый манипулятор и блок управления закрываемого файла освобождаются, а +информация в каталоге заменяется информацией из блока управления, по этому +всегда следует закрывать файлы. + + +11h (17) OPEN (Открытие файла) +входные данные: +HL - указатель на файловую спецификацию +A - режим доступа +A=0 чтение/запись +A=1 чтение +A=2 запись +C - 11h + +выходные данные: +A - файловый манипулятор, если CF=0 +код ошибки, если CF=1 +Функция ищет файл с именем, совпадающим с именем в файловой спецификации. +Если такой файл существует, открывает его. Указатель текущей позиции в файле +устанавливается на начало файла. При открытии файла в режиме доступа 1 - только +чтение ДОС будет блокировать попытки записи в файл, при открытии в режиме +доступа 2 - только запись ДОС будет блокировать попытки чтения из файла. + +12h (18) CLOSE (Закрытие файла) +входные данные: +A - файловый манипулятор +C - 12h + +выходные данные: +A - код ошибки, если CF=1 +Функция закрывает файл, освобождает файловый манипулятор и блок +управления файлом. Переносит информацию из блока управления файлом в каталог. +Чтение и запись в файл: + Все операции чтения и записи в файл осуществляются в зависимости от значения в +поле блока управления файлом, которое называется указателем текущие позиции +в файле. Значение указателя рассматривается как смещение в байтах от начала +файла. Указатель можно изменять с помощью функции ДОС 15h (MOVE_FP), чтобы он +указывал произвольную позицию в файле. Кроме этой функции, значение указателя +изменяют функции чтения и записи в файл. При выполнении функции чтения или +записи в файл задается количество байт, которое нужно прочесть или записать и +адрес в памяти, где располагаются эти байты. Байты считываются или записываются +в файл в зависимости от значения указателя текущей позиции в файле. После +каждого чтения или записи указатель увеличивается на количество перенесённых +байт. При открытии файла, указатель текущей позиции устанавливается на начало +файла (обнуляется). +13h (19) READ (Чтение из файла) +входные данные: +A - файловый манипулятор +HL - адрес в памяти +DE - количество читаемых байт +C - 13h + +выходные данные: +DE - реальное количество прочитанных байт +если CF=0: +A = 0 прочитаны все байты +A = 0FFh прочитано меньшее число байт +A - код ошибки, если CF=1 +Функция читает указанное количество байт с текущей позиции в файле. После +чтения значение указателя текущей позиции увеличивается на количество +прочитанных байт. +Количество прочитанных байт не всегда равно заявленному. Например, при +достижении конца файла. +Пример: +; Открытие файла newfile.doc для чтения + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,11h ;Функция открытия файла + LD A,1 ;Режим доступа: чтение + RST 10h ;Выполнение функции + JR C,OPEN_ERROR;Ошибка открытия файла + LD (HANDLE),A ;Сохранение файлового манипулятора + +; Перемещение Указателя текущий позиции в конец файла + LD C,15h ;Функция перемещение указателя + LD B,2 ;Перемещение от конца файла + LD HL,0 ;32 битное смещение HL:IX + LD IX,0 ;Перемещение на 0 байт + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,FP_ERROR ;Ошибка перемещения указателя + ;В HL:IX размер файла + LD (L_FILELEN),IX ;Запоминаем младшие 16 бит длины + LD (H_FILELEN),HL;Запоминаем старшие 16 бит длины + +; Перемещение Указателя текущей позиции в начало файла + LD C,15h ;Функция перемещение указателя + LD B,0 ;Перемещение от начала файла + LD HL,0 ;32 битное смещение HL:IX + LD IX,0 ;Перемещение на 0 байт + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,FP_ERROR ;Ошибка перемещения указателя + + LD DE,(H_FILELEN);Берём старшие 16 бит длины файла + LD A,D ;Проверяем что длина файла + CP E ;меньше 64 килобайт + JP NZ,BIG_FILE ;ошибка файл очень большой + +; Чтение из файла + LD C,13h ;Функция чтение из файла + LD A,(HANDLE) ;Файловый манипулятор + LD DE,(L_FILELEN);Берем младшие 16 бит длины файла + LD HL,BUFFER ;Буфер для чтения + RST 10h ;Выполнение функции + JR C,READ_ERROR;Ошибка чтения + +; Закрытие файла + LD C,12h ;Функция закрытия файла + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,CLOSE_ERROR;Ошибка закрытия файла + +NAME DB “newfile.doc”,0 ;Файловая спецификация +HANDLE DB 0 ;Переменная для сохранения файлового манипулятора +L_FILELEN DW 0 ;Переменная для сохранения младших 16 бит длины +H_FILELEN DW 0 ;Переменная для сохранения младших 16 бит длины +BUFFER DS 256,0 ;Буфер для чтения + + + 14h (20) WRITE (Запись в файл) + +входные данные: +A - файловый манипулятор +HL - адрес в памяти +DE - количество записываемых байт +C - 14h + +выходные данные: +DE - реальное количество записанных байт +A - код ошибки, если CF=1 + +Функция записывает указанное количество байт с текущей позиции в файле. +После записи значение указателя текущей позиции увеличивается на количество +записанных байт. +Количество записанных байт не всегда равно заявленному. Это может +получиться, например, если на диске нет свободного места. +При закрытии файла его длина определяется не текущем значением указателя в +файле, а его максимальным значением или старой длиной файла, если она больше. +Если, например, открыть файл длиной 1000 байт при помощи функции 11h (OPEN), +записать в него 500 байт и затем закрыть. Первые 500 байт будут записаны новой +информацией, а оставшиеся будут без изменения. Если же требуется перекрыть +существующий файл, его следует открыть функцией 0Ah (CREATE), которая уменьшит +длину существующего файла до 0. + + + +Пример: +; Открытие файла newfile.doc для записи + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,11h ;Функция открытия файла + LD A,2 ;Режим доступа: запись + RST 10h ;Выполнение функции + JR C,OPEN_ERROR;Ошибка открытия файла + LD (HANDLE),A ;Сохранение файлового манипулятора + +; Перемещение Указателя текущий позиции в конец файла + LD C,15h ;Функция перемещение указателя + LD B,2 ;Перемещение от конца файла + LD HL,0 ;32 битное смещение HL:IX + LD IX,0 ;Перемещение на 0 байт + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,FP_ERROR ;Ошибка перемещения указателя + +; Запись в файл (добавление строки в конец файла) + LD C,14h ;Функция записи в файл + LD A,(HANDLE) ;Файловый манипулятор + LD DE,12 ;Берем длину записи 12 байт + LD HL,BUFFER ;Буфер со строкой “end of file!” + RST 10h ;Выполнение функции + JR C,READ_ERROR;Ошибка чтения + +; Закрытие файла + LD C,12h ;Функция закрытия файла + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,CLOSE_ERROR;Ошибка закрытия файла + +; После записи длина файла увеличится на 12 байт +NAME DB “newfile.doc”,0 ;Файловая спецификация +HANDLE DB 0 ;Переменная для сохранения файлового манипулятора +BUFFER DB “end of file!” ;Буфер для записи + + + 15h (21) MOVE_FP (Перемещение указателя в файле) + +входные данные: +A - файловый манипулятор +HL:IX - смещение указателя в файле +B - способ перемещения +B=0 от начала файла +B=1 от текущего значения указателя +B=2 от конца файла +C - 15h +выходные данные: +A - код ошибки, если CF=1 +HL:IX - новое значение указателя +HL:IX интерпретируется как 32-битное число. Если число меньше 65536, +регистр HL содержит 0. Возможны следующие способы перемещения указателя: + B=0 Смещение считается от начала файла, если HL:IX=0, указатель +устанавливается на начало файла. + B=1 Смещение считается от текущего значения указателя. + + B=2 Смещение считается от конца файла, если HL:IX=0, после перемещения + HL:IX получится длина файла в байтах. + + + 16h (22) ATTRIB (Получение/изменение атрибута файла) + +входные данные: +HL - указатель на файловую спецификацию +B - режим доступа +B=0 получить атрибут +B=1 установить атрибут +A - атрибут файла +C - 16h + +выходные данные: +A - атрибут файла, если CF=0 +код ошибки, если CF=1 +Функция возвращает/изменяет атрибут файла. + +17h (23) GET_D_T (Информация о дате и времени файла) +входные данные: +A - файловый манипулятор +C - 17h + +выходные данные: +D - день +E - месяц +IX - год +H - час +L - минуты +B - секунды +A - код ошибки, если CF=1 + +Функция возвращает информацию о дате и времени создания или последней +модификации файла. + +18h (24) PUT_D_T (Изменение даты и времени файла) +входные данные: +A - файловый манипулятор +D - день +E - месяц +IX - год +H - час +L - минуты +B - секунды +C - 18h + +выходные данные: +A - код ошибки, если CF=1 +Функция изменяет информацию о дате и времени создания или последней +модификации файла. Изменение информации о дате и времени реально произойдет +только после закрытия файла. А любая операция записи в файл установит текущую +дату и время. + +19h (25) F_FIRST (Поиск первого совпадающего файла) +входные данные: +HL - указатель на файловую спецификацию +DE - рабочий буфер 44 байта, если B=0, иначе 256 байт +A - атрибуты, используемые при поиске +B = 0 - имя найденного файла в формате 11 байт “FilenameExt” +B = 1 - имя найденного файла в формате DOS “filename.ext”,0 +C - 19h +выходные данные: +A - код ошибки, если CF=1 +Функция осуществляет поиск конкретного файла или первого (по его положению +в каталоге) из группы файлов. Можно указать произвольное устройство и каталог +для поиска. В имени файла допускаются глобальные символы ? и *. +Если значение атрибутов для поиска равно 00h, осуществляется поиск только +обычных файлов. Если в байте атрибутов биты для скрытого, системного, только для +чтения или каталога (или их произвольная комбинация) равны 1, осуществляется +поиск всех файлов, чьи атрибуты соответствуют указанным, а также всех обычных +файлов. +Если файл обнаружен, по адресу, на который указывает регистр DE будет +заполнен буфер с информацией о файле. Иначе функция завершится с ошибкой “файл +не обнаружен”. +формат буфера: + +00 8 db “FILE????” ; шаблон имени + +08 3 db “???” ; шаблон расширения + +11 1 db #20 ; атрибуты для поиска + +12 10 ds 10 ; зарезервировано + +22 2 dw #0000 ; время создания файла + +24 2 dw #0000 ; дата создания файла + +26 2 dw #0000 ; номер первого кластера + +28 4 dw #0000,#0000 ; размер файла в байтах + +32 1 db #20 ; атрибут обнаруженного файла + +33 11 db “FILENAMEEXT” ; имя обнаруженного файла копия из каталога + +или + +33 n db “filename.ext”,0 ; имя обнаруженного файла в формате ДОС + + 1Ah (26) F_NEXT (Поиск следующего совпадающего файла) + +входные данные: +DE - указатель на рабочий буфер +C - 1Ah + +выходные данные: +A - код ошибки, если CF=1 +Параметры берутся из функции F_FIRST, если она не выполнялась, то +F_NEXT вернется с ошибкой “невозможная операция”, не следует выполнять +операции, которые могут разрушить рабочий буфер. + + + +Пример: +; Поиск первого совпадающего файла + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD DE,BUFFER ;DE указывает на рабочий буфер + LD C,19h ;Функция поиска первого совпадающего файла + LD A,30h ;Поиск обычных файлов и каталогов + RST 10h ;Выполнение функции + JP C,FIND_ERROR ;Ошибка поиска (файл не найден) + +; Вывод имени найденного файла +NEXTN LD HL,BUFFER ;Рабочий буфер + LD DE,33 ;Имя файла находится со смещением 33 + ADD HL,DE + +; Вывод имени файла + LD C,5Bh ;Функция печати символа + LD B,8 ;Размер имени файла 8 символов +NEXTS LD A,(HL) ;Берем очередной символ имени + PUSH BC + RST 10h ;Выполнение функции + POP BC + INC HL + DJNZ NEXTS + LD A,” ” ;Вывод пробела + RST 10h + +; Вывод расширения файла + LD C,5Bh ;Функция печати символа + LD B,3 ;Размер расширения файла 3 символа +NEXTE LD A,(HL) ;Берем очередной символ имени + PUSH BC + RST 10h ;Выполнение функции + POP BC + INC HL + DJNZ NEXTE + +; Перевод строки после каждого имени файла + LD C,5Bh ;Функция печати символа + LD A,13 ;CR - переход в начало строки + RST 10h + LD C,5Bh ;Функция печати символа + LD A,10 ;LF - перевод строки + RST 10h + +; Поиск следующего совпадающего файла + LD DE,BUFFER ;DE указывает на рабочий буфер + LD C,1Ah ;Функция поиска следующего совпадающего файла + RST 10h ;Выполнение функции + JP NC,NEXTN ;Переход на печать имени файла +FIND_ERROR +NAME DB “A:\TEXT\*.*”,0 +BUFFER DS 44 + + + + + + 1Bh (27) MKDIR (Создание каталога) + +входные данные: +HL - указатель на файловую спецификацию +C - 1Bh + +выходные данные: +A - код ошибки, если CF=1 +Функция создаёт на диске подкаталог, указанный в файловой спецификации. +Пример: + LD HL,DIRNAME ;HL указывает на ASCIIZ строку с именем подкаталога + LD C,1Bh ;Функция создание подкаталога + RST 10h ;Выполнение функции + +DIRNAME DB “TEXT”,0 ;Создать подкаталог TEXT в текущем каталоге + +DIRNAME DB “\TEXT”,0 ;Создать подкаталог TEXT в корневом каталоге + +DIRNAME DB “C:\DOC\TEXT”,0;Создать подкаталог TEXT в каталоге DOC на +;диске C: каталог DOC должен существовать + +1Ch (28) RMDIR (Устранение каталога) +входные данные: +HL - указатель на файловую спецификацию +C - 1Ch + +выходные данные: +A - код ошибки, если CF=1 + +Функция устраняет пустой подкаталог, указанный в файловой спецификации. +Нельзя устранить текущий каталог и каталог, который содержит файлы или другие +каталоги. +Пример: + LD HL,DIRNAME ;HL указывает на ASCIIZ строку с именем подкаталога + LD C,1Ch ;Функция устранения подкаталога + RST 10h ;Выполнение функции + +DIRNAME DB “TEXT”,0 + + + 1Dh (29) CHDIR (Смена текущего каталога) + +HL - указатель на файловую спецификацию +C - 1Dh + +Функция меняет текущий каталог и текущий диск, если он указан в файловой +спецификации. Если путь начинается с “\” - это означает путь от корневого +каталога, иначе от текущего. +Пример: + LD HL,DIRNAME ;HL указывает на ASCIIZ строку пути к новому + ;текущему каталогу + LD C,1Dh ;Функция смены текущего каталога + RST 10h ;Выполнение функции + +DIRNAME DB “\DOC\TEXT”,0 + + + 1Eh (30) CURDIR (Информация о текущем каталоге) + +входные данные: +HL - буфер в памяти 256 байт +C - 1Eh + +выходные данные: +A - код ошибки, если CF=1 + +Функция переносит строку пути текущего каталога из областей ДОС в +пользовательскую программу по адресу заданном в регистре HL. На конце пути код +ноль. Имя дискового устройства в путь не включается. +Пример: + LD HL,BUFFER ;HL указывает на буфер + LD C,1Eh ;Функция получения пути к текущему каталогу + RST 10h ;Выполнение функции + +BUFFER DS 256 + + + 21h (33) SYSTIME (Текущая дата и время) + +входные данные: +C - 21h +выходные данные: +D - день +E - месяц +IX - год +H - час +L - минуты +B - секунды +C - день недели + +Функция возвращает текущую дату и время. + +22h (34) SETTIME (Установить текущую дату и время) +входные данные: +D - день +E - месяц +IX - год +H - час +L - минуты +B - секунды +C - 22h + +выходные данные: +A - код ошибки, если CF=1 +Функция устанавливает системную дату и время. + +Функции для работы с памятью: + +38h (56) SETWIN (Подключение страницы памяти) +входные данные: +A - идентификатор блока памяти +B - номер страницы в блоке (0,1,2...) +H - биты 6 и 7 задают номер окна, в которое будет подключена страница +C - 38h + +выходные данные: +A - номер страницы, если CF=0 +A - код ошибки, если CF=1 + +Функция вычисляет физический номер страницы в блоке памяти и подключает её +в окно адресного пространства в зависимости от значения регистра HL. То есть, +если HL указывает на адрес в пределах от 04000h до 07FFFh, то страница +подключается в первое окно, от 08000h до 0BFFFh - второе окно, от 0C000h до +0FFFFh - третье. +На выходе в регистре A содержится физический номер страницы, которая +была подключена до выполнения функции. + +39h (57) SETWIN1 (Подключение страницы памяти в первое окно) +входные данные: +A - идентификатор блока памяти +B - номер страницы в блоке (0,1,2...) +C - 39h + +выходные данные: +A - номер страницы, если CF=0 +A - код ошибки, если CF=1 + +Функция аналогична функции 038h (SETWIN), но страница подключается в +первое окно независимо от регистра HL. + +3Ah (58) SETWIN2 (Подключение страницы памяти во второе окно) +входные данные: +A - идентификатор блока памяти +B - номер страницы в блоке (0,1,2...) +C - 3Ah + +выходные данные: +A - номер страницы, если CF=0 +A - код ошибки, если CF=1 + +Функция аналогична функции 038h (SETWIN), но страница подключается во +второе окно независимо от регистра HL. + +3Bh (59) SETWIN3 (Подключение страницы памяти в третье окно) +входные данные: +A - идентификатор блока памяти +B - номер страницы в блоке (0,1,2...) +C - 3Bh + +выходные данные: +A - номер страницы, если CF=0 +A - код ошибки, если CF=1 + +Функция аналогична функции 038h (SETWIN), но страница подключается в +третье окно независимо от регистра HL. + +3Ch (60) FREEMEM (Информация о памяти) +входные данные: +C - 3Ch +выходные данные: +HL - общее количество страниц +BC - количество свободных страниц + +Функция возвращает в регистре HL общее количество памяти в страницах по +16 килобайт и свободное количество страниц в регистре BC. + +3Dh (61) GETMEM (Выделение блока памяти) +входные данные: +B - размер блока в страницах по 16 килобайт +C - 3Dh + +выходные данные: +A - идентификатор блока памяти, если CF=0 +A - код ошибки, если CF=1 + +Функция выделяет блок памяти и возвращает его идентификатор приложению. + +3Eh (62) RETMEM (Освобождение блока памяти) +входные данные: +A - идентификатор блока памяти +C - 3Eh + +выходные данные: +A - код ошибки, если CF=1 + +Функция освобождает выделенный ранее блок памяти. Нельзя освободить +блок памяти, выделенный другим приложением. + +3Fh (63) SETMEM (Изменение блока памяти) +входные данные: +A - идентификатор блока памяти +B - новый размер блока +C - 3Fh + +выходные данные: +A - код ошибки, если CF=1 + +Функция позволяет уменьшить или расширить выделенный ранее блок памяти. +Нельзя изменить блок памяти, выделенный другим приложением. +Функции для работы с клавиатурой: + При наборе символов на клавиатуре каждое нажатие клавиш воспринимает +специальная программа драйвер клавиатуры. Каждая клавиша имеет номер (от 0 до +90), который определяет её позицию на клавиатуре. Таблица всех кодов клавиш +приведена в приложении. + Каждое нажатие или отпускание клавиши вызывает прерывание. Программа, +обслуживающая это прерывание, читает scan-код и преобразует его в два байта. +Первый байт содержит символьный ASCII код, а второй - позиционный код. Первый +байт получается преобразованием позиционного кода клавиши по определённой +процедуре в зависимости от состояния клавиш Shift, Alt, Ctrl, Caps Lock и Num +Lock, от режима латиница или кириллица и от раскладки клавиатуры в символьный +(ASCII) код. Для специальных клавиш, например функциональный или клавиш +управления курсором, код ASCII равен нулю. Это позволяет программе различать +обычные печатные символы и нажатия других клавиш. + Драйвер записывает эти два байта в буфер клавиатуры, который может +хранить информацию о 15 нажатий на клавиши. Кроме этого, драйвер отслеживает +информацию о состоянии некоторых клавиш, таких как Shift, Alt, Ctrl, Caps Lock, +Num Lock, Scroll Lock и др. + Чтобы считать очередную клавишу из буфера клавиатуры, нужно воспользоваться +одной из функций работы с клавиатуры. Функции возвращают в регистре E ASCII код +клавиши, в регистре D её позиционный код. Если установлен седьмой бит регистра +D, это означает что нажата не одна клавиша, а одновременно с ней нажаты , + или . +В регистре B указываются какие именно клавиши удерживаются: +D7 = 1 - удерживается левый +D6 = 1 - удерживается правый +D5 = 1 - удерживается +D4 = 1 - удерживается +D3 = 1 - удерживается левый +D2 = 1 - удерживается левый +D1 = 1 - удерживается правый +D0 = 1 - удерживается правый + +Биты 5 и 4 указывают, что удерживаются любой , правый или левый. +В регистре C указываются режимы ввода: +D7 = 1 - RUS, 0 - LAT +D6 - зарезервирован +D5 - зарезервирован +D4 - зарезервирован +D3 = 1 - режим Num Lock +D2 = 1 - режим Scroll Lock +D1 = 1 - режим Insert +D0 = 1 - режим Caps Lock + + +30h (48) WAITKEY (Ожидание символа с клавиатуры) +входные данные: +C - 30h +выходные данные: +A - код символа +D - позиционный код +Е - ASCII код +C - D7 - RUS/LAT +D3 - Num Lock +D2 - Scroll Lock +D1 - Insert +D0 - Caps Lock +B - D7 - Left Shift +D6 - Right Shift +D5 - Ctrl +D4 - Alt +D3 - Left Ctrl +D2 - Left Alt +D1 - Right Ctrl +D0 - Right Alt + +Функция читает информацию об очередном нажатии из буфера клавиатуры. +Если буфер пуст, ожидает появления информации. В регистре E выдается ASCII код +символа, а в регистре D - позиционный код клавиши (0..127). Если бит 7 регистра +D установлен - это означает, что вместе с клавишей удерживается Ctrl/Alt/Shift. +Регистр A дублирует содержимое регистра E для удобства в написании программ. +Пример: +LOOP LD C,30h ;Функция ожидания нажатия клавиши + RST 10h ;Выполнение функции + CP 0Dh ;Нажата ? + JP Z,ENTER ;если да, то ввод + LD HL,011Bh ;Позиционный и ASCII код клавиши <Еsc> + AND A ; + SBC HL,DE ;Нажата ? + JP Z,EXIT ;если да, то выход + JP LOOP ;иначе, повторить ожидание клавиши + + 31h (49) SCANKEY (Опрос клавиатуры без ожидания) + +входные данные: +C - 31h +выходные данные: +ZF - нет клавиш +A - код символа +D - позиционный код +Е - ASCII код +C - D7 - RUS/LAT +D3 - Num Lock +D2 - Scroll Lock +D1 - Insert +D0 - Caps Lock +B - D7 - Left Shift +D6 - Right Shift +D5 - Ctrl +D4 - Alt +D3 - Left Ctrl +D2 - Left Alt +D1 - Right Ctrl +D0 - Right Alt + +Функция возвращает флаг Z, если буфер клавиатуры пуст. Иначе читает +информацию об очередном нажатии из буфера клавиатуры. Возвращаемые регистры, как +и в функции 30h (WAITKEY). +Пример: +NO_KEYS + LD C,31h ;Функция опроса клавиатуры без ожидания + RST 10h ;Выполнение функции + JR Z,NO_KEYS ;Если клавиша не нажата повторить опрос + BIT 7,D ;Нажата одна клавиша? + JP Z,ONEKEY ;Если да, переход + LD A,B + AND 0C0h ;Биты 7 и 6 равны 0 + JP NZ,SHIFT ;Если нет, то нажаты +<клавиша> + BIT 5,B ;Бит Ctrl в нуле? + JP NZ,CTRL ;Если нет, то нажаты +<клавиша> + BIT 4,B ;Бит Alt в нуле? + JP NZ,CTRL ;Если нет, то нажаты +<клавиша> +ONEKEY + CP 0Dh ;Нажата ? + JP Z,ENTER ;если да, то ввод + LD HL,011Bh ;Позиционный и ASCII код клавиши <Еsc> + AND A ; + SBC HL,DE ;Нажата ? + JP Z,EXIT ;если да, то выход + + + 32h (50) ECHOKEY (Ожидание символа с клавиатуры с печатью) + +входные данные: +C - 32h +выходные данные: +A - код символа +D - позиционный код +Е - ASCII код +C - D7 - RUS/LAT +D3 - Num Lock +D2 - Scroll Lock +D1 - Insert +D0 - Caps Lock +B - D7 - Left Shift +D6 - Right Shift +D5 - Ctrl +D4 - Alt +D3 - Left Ctrl +D2 - Left Alt +D1 - Right Ctrl +D0 - Right Alt + +Функция аналогична функции 30h, но после получения кода символа он +печатается на экране. Возвращаемые регистры, как и в функции 30h (WAITKEY). + +33h (51) CTRLKEY (Получить состояние клавиатуры) +входные данные: +C - 33h +выходные данные: +A = 0 - нет символов в буфере +C - D7 - RUS/LAT +D3 - Num Lock +D2 - Scroll Lock +D1 - Insert +D0 - Caps Lock +B - D7 - Left Shift +D6 - Right Shift +D5 - Ctrl +D4 - Alt +D3 - Left Ctrl +D2 - Left Alt +D1 - Right Ctrl +D0 - Right Alt + +Функция возвращает состояние клавиатуры на данный момент. То есть, данные +берутся не из буфера клавиатуры (как в остальных функциях), а непосредственно из +результатов последнего сканирования клавиатуры. Регистр A равен нулю, если буфер +клавиатуры пуст. + +35h (53) K_CLEAR (Очистить буфер клавиатуры и выполнить функцию) +входные данные: +B - номер функции 30h, 31h, 32h, 33h или 34h +C - 35h + +выходные данные: +В зависимости от указанной функции в регистре B. +Функция очищает буфер клавиатуры, после чего выполняет функцию указанную +в регистре B. Она позволяет предотвратить использование программой +символов, введенных с опережением. Например, команда FORMAT очищает буфер +клавиатуры перед запросом о необходимости форматировать диск. Поэтому случайное +наличие в буфере символа, разрешающего форматирование, не вызовет +действительного форматирования. + +36h (54) K_SETUP (Управление настройками клавиатуры) +входные данные: +B - номер подфункции +C - 36h + +выходные данные: +В зависимости от указанной функции в регистре B. +Функция управления клавиатурой. +B = 0, установить раскладку клавиатуры +A - номер раскладки +0 - normal +1 - shift +2 - caps lock +3 - caps lock + shift +4 - normal (альтернативная кл.) +5 - shift (альтернативная кл.) +6 - caps lock (альтернативная кл.) +7 - caps lock + shift (альтернативная кл.) + +B = 1, получить состояние звуковых переменных +B = 2, установить звуковые переменные +A - значение переменной +D0 - сигнал переполнения буфера клавиатуры +D1 - сигнал переключения на альтернативную раскладку клавиатуры + + +37h (55) TESTKEY (Опрос буфера клавиатуры) +входные данные: +C - 37h +выходные данные: +ZF - нет символов в буфере +A - код символа +D - позиционный код +Е - ASCII код +C - D7 - RUS/LAT +D3 - Num Lock +D2 - Scroll Lock +D1 - Insert +D0 - Caps Lock +B - D7 - Left Shift +D6 - Right Shift +D5 - Ctrl +D4 - Alt +D3 - Left Ctrl +D2 - Left Alt +D1 - Right Ctrl +D0 - Right Alt + +Функция возвращает флаг Z, если буфер клавиатуры пуст. Иначе читает +информацию об очередном нажатии из буфера клавиатуры. Возвращаемые регистры, как +и в функции 30h (WAITKEY). Информация о нажатии остается в буфере. + +Запуск приложений: + Программы хранятся на диске, как программные (выполняемые) файлы. Одна +из основных задач операционной системы - организовать их выполнение. +Командная строка для выполнения программ имеет формат: +[устройство:][\путь\]имя [параметры] + Устройство и путь указывают место нахождения приложения на диске. Если +они пропущены, поиск осуществляется в текущем каталоге текущего диска. Если +указано расширение файла, оно игнорируется, так как, у программных файлов +расширение может быть только EXE. + EXE файлы состоят из двух частей, префикса и выполнимого модуля. Префикс +содержит в себе различную вспомогательную информацию: +Префикс EXE файла: + +00 2 dw 5845h ; Идентификатор EXE файла + +02 1 db 45h ; Зарезервирован + +03 1 db 00h ; Версия EXE файла + +04 4 dd 00000200h ; Начало исполняемого кода (смещение в байтах) + +08 2 dw 0000h ; Размер первичного загрузчика или 0 + +10 4 dd 00000000h ; Зарезервированы + +14 2 dw 0000h ; Зарезервированы + +16 2 dw ???? ; Адрес расположения кода в памяти + +18 2 dw ???? ; Адрес запуска (регистр PC) + +20 2 dw ???? ; Адрес расположения стека (регистр SP) + +22 490 ds 0 ; Зарезервированы + + +512 ; Код программы + + + 40h (64) EXEC (Выполнить файл) + +входные данные: +HL - указатель на файловую спецификацию +B = 0 - загрузить и выполнить программу +C - 40h + +выходные данные: +A - код завершения, если CF=0 +код ошибки, если CF=1 +Выполнение EXE-файла осуществляется по следующим пунктам: +1) Открывает exe-файл на чтение; +2) Считывает в рабочую область префикс exe-файла; +3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного +загрузчика, если его размер не равен нулю; +4) Сохраняет стек; +5) Подключает страницы из выделенного блока; +6) Строит префикс запуска программы и устанавливает на него регистр IX; +7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения кода в +памяти); +8) Закрывает exe-файл, если это не первичный загрузчик; +9) Устанавливает стек равным значению из смещения 20 (Адрес расположения стека); +10) Передает управление по адресу указанному в смещении 18 (Адрес запуска); + +Префикс запуска файла: +-03 1 db ? ; Файловый манипулятор, если exe-файл с первичным загрузчиком +-02 1 db ? ; Идентификатор блока памяти +-01 1 db ? ; Уровень текущей программы ++00 1 db ? ; Длинна командной строки ++01 127 ds ? ; Параметры командной строки, заканчивается нулем + +Пример: + LD HL,NAME ;HL указывает на ASCIIZ строку с именем еxe-файла + LD C,40h ;Функция выполнения файла + LD B,00h ;Подфункция загрузить и выполнить + RST 10h ;Выполнение функции + RET C ;Возврат по ошибке + LD (ENDCODE),A ;Сохранение кода завершения + +NAME DB “\PROG\UTILITY\prog.exe”,0 +ENDCODE DB 00h + + + 41h (65) EXIT (Завершение программы) + +входные данные: +B - код завершения +C - 41h + +выходные данные: +A - код ошибки, если CF=1 + +Функция завершает выполнение текущей программы, освобождает занимаемую +память и передаёт код завершения в родительную программу. Код завершения +также сохраняется в системной переменной ДОС и его можно позднее получить при +помощи функции 42h (WAIT). + + +42h (66) WAIT (Получить код завершения программы) +входные данные: +C - 42h +выходные данные: +A - код завершения +Функция возвращает код завершения, последней завершенной программы. + + + +Функции для работа с командной строкой: + +43h (67) GSWITCH (Выделить параметр командной строки) +входные данные: +HL - указатель командной строки +DE - буфер для выделяемого параметра +C - 43h + +выходные данные: +HL - указатель на следующий параметр командной строки +CF=0 - конец строки не достигнут (есть другие параметры) +CF=1 - конец строки (в буфер перенесён последний параметр или ноль) +Функция выделяет параметр командной строки. Параметрами считаются +любые последовательности символов разделённые пробелами. Ведущие пробелы +игнорируются. Параметр в буфере завершается кодом ноль, если параметры +отсутствуют, в буфер записывается ноль. +Пример: + LD HL,COMLINE ;HL указывает на командную строку +NEXTP LD DE,BUFFER ;DE указывает на буфер для параметров + LD C,43h ;Функция выделения параметра + RST 10h ;Выполнение функции + PUSH AF + PUSH HL + . +. Обработка параметра командной строки + . + POP HL + POP AF + JP NC,NEXTP + + +COMLINE DB “file1.txt file2.txt -x”,0 +BUFFER DS 127,0 + + + 44h (68) DOSNAME (Преобразовать имя файла) + +входные данные: + C - 44h + B = 0, преобразовать из 11 символьного формата в формат ДОС +HL - 11 символов имени файла +DE - буфер для имени в формате ДОС + B = 1, преобразовать из формата ДОС в 11 символьный формат +HL - имя файла в формате ДОС +DE - 11 символов имени файла + + db “name.ext”,0 ; формат ДОС + db “name ext” ; 11 символьный формат + +выходные данные: +A - код ошибки, если CF=1 +Функция преобразовывает имя файла из 11 символьного формата в формат ДОС и обратно. + + + 45h (69) EXCMDLN (Разбор командной строки) + +входные данные: + + HL - указатель командной строки + DE - указатель на буфер пользователя + C - 45h + B - номер подфункции: + 0 - Разобрать строку; + 1 - Выделить имя диска; + 2 - Выделить директорию; + 3 - Выделить имя файла; + 4 - Выделить расширение файла; + 5 - Выделить имя диска, путь к файлу, имя файла и расширение
 файла; + 6 - Зарезервирована; + 7 - Выделить параметр командной строки; + 8 - преобразовать из 11 символьного формата в формат ДОС; + 9 - преобразовать из формата ДОС в 11 символьный формат; + +Функция осуществляет разбор командной строки в зависимости от номера подфункции в регистре B. + + + Подфункция 0 - Разобрать строку: + +входные данные: + + HL - указатель командной строки + C - 45h + B = 0 - Разобрать строку + +выходные данные: + + A - D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + + Функция осуществляет разбор командной строки и возвращает результат в регистре A. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD C,45h ; Функция разбор командной строки + LD B,0 ; Подфункция разобрать строку + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D2, D3. + +STRING db "c:\dir1\name",0 + + + Подфункция 1 - Выделить имя диска: + +входные данные: + + HL - указатель командной строки + DE - буфер (макс. 13 байт) + C - 45h + B = 1 - Выделить имя диска + +выходные данные: + + A - номер диска (0 - A, 1 - B, 2 - C и т.д.) + буфер - имя диска "A:",0 + +Функция осуществляет разбор командной строки и копирует в буфер имя диска, если имя диска не указывалось в буфер помещается 0. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,1 ; Подфункция выделить имя диска + RST 10h ; Выполнение функции + ; В регистре A будет 2 (drive C:) + ; В буфере "C:",0 + +STRING db "c:\dir1\name",0 + +BUFFER ds 13 + + Подфункция 2 - Выделить директорию: + +входные данные: + + HL - указатель командной строки + DE - буфер (макс. 256 байт) + C - 45h + B = 2 - Выделить директорию + +выходные данные: + + буфер - директория "DIR1\DIR2\DIR3\",0 + A - D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + +Функция осуществляет разбор командной строки и копирует в буфер путь к файлу, если директория не указывалась в буфер помещается 0. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,2 ; Подфункция выделить директорию + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D1, D2, D3. + ; В буфере "\DIR1\DIR2\",0 + +STRING db "c:\dir1\dir2\name.ext",0 + +BUFFER ds 256 + + + Подфункция 3 - Выделить имя файла: + +входные данные: + + HL - указатель командной строки + DE - буфер (макс. 13 байт) + C - 45h + B = 3 - Выделить имя файла + +выходные данные: + + буфер - имя файла "FILE.EXT",0 + A - D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + +Функция осуществляет разбор командной строки и копирует в буфер имя файла и расширение файла, если имя файла не указывалась в буфер помещается 0. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,3 ; Подфункция выделить имя файла + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D1, D2, D3. + ; В буфере "name.ext",0 + +STRING db "c:\dir1\dir2\name.ext",0 + +BUFFER ds 13 + + + Подфункция 4 - Выделить расширение файла: + +входные данные: + + HL - указатель командной строки + DE - буфер (макс. 4 байт) + C - 45h + B = 4 - Выделить расширение файла + +выходные данные: + + буфер - расширение "TXT",0 или "C ",0 + A - D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + +Функция осуществляет разбор командной строки и копирует в буфер расширение файла, если расширение файла не указывалось в буфер помещается 0. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,4 ; Подфункция выделить расширение файла + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D1, D2, D3. + ; В буфере "ext",0 + +STRING db "c:\dir1\dir2\name.ext",0 + +BUFFER ds 4 + + + Подфункция 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла: + +входные данные: + + HL - указатель командной строки + DE - буфер (макс. 8 байт) + +0 адрес буфера для имени диска (макс. 13 байт) + +2 адрес буфера для директории (макс. 256 байт) + +3 адрес буфера для имени файла (макс. 13 байт) + +4 адрес буфера для расширения файла (макс. 4 байта) + C - 45h + B = 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла + +выходные данные: + + A - D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + +Функция осуществляет разбор командной строки и копирует в буферы обнаруженные элементы командной строки, если какой-либо элемент не указывался в буфер помещается 0. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD DE,PBUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,5 ; Подфункция выделить расширение файла + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D1, D2, D3. + ; В буфере DRIVE_A "C:",0 + ; В буфере DIR_A "\DIR1\DIR2\",0 + ; В буфере NAME_A "NAME.EXT",0 + ; В буфере TYPE_A "EXT",0 + +STRING db "c:\dir1\dir2\name.ext",0 + +PBUFFER dw DRIVE_A + dw DIR_A + dw NAME_A + dw TYPE_A + +DRIVE_A ds 13 +DIR_A ds 256 +NAME_A ds 13 +TYPE_A ds 4 + + + + + Подфункция 7 - Выделить параметр командной строки: + +входные данные: + + HL - указатель командной строки + DE - буфер для выделяемого параметра (макс. 256 байт) + C - 45h + B = 7 - Выделить параметр командной строки + +выходные данные: + + HL - указатель на следующий параметр командной строки + CF=0 - конец строки не достигнут (есть другие параметры) + CF=1 - конец строки (в буфер перенесён последний параметр или 
 ноль) + +Функция выделяет параметр командной строки. Параметрами считаются любые последовательности символов разделённые пробелами. Ведущие пробелы игнорируются. Параметр в буфере завершается кодом ноль, если параметры отсутствуют, в буфер записывается ноль. + + Подфункция 8 - преобразовать из 11 символьного формата в формат ДОС: + +входные данные: + + HL - 11 символов имени файла + DE - буфер для имени в формате ДОС + C - 45h + B = 8 - преобразовать из 11 символьного формата в формат ДОС + + db "name.ext",0 ; формат ДОС + db "name ext" ; 11 символьный формат + +выходные данные: + + A - код ошибки, если CF=1 + + Функция преобразовывает имя файла из 11 символьного формата в формат ДОС. + + Подфункция 9 - преобразовать из формата ДОС в 11 символьный формат: + +входные данные: + + HL - имя файла в формате ДОС + DE - буфер для 11 символов имени файла + C - 45h + B = 9 - преобразовать из формата ДОС в 11 символьный формат + + db "name.ext",0 ; формат ДОС + db "name ext" ; 11 символьный формат + +выходные данные: + + A - код ошибки, если CF=1 + +Функция преобразовывает имя файла из формата ДОС в 11 символьный формат. В имени файла допускаются глобальные символы ? и *. В этом случае символ * будет заменен на несколько символов ? . Например "name*.c*", будет преобразован в "name????c??". + +Работа с экраном: + + Сейчас DOS поддерживает четыре режима экрана. + Два текстовых: + 40x32 символов c 16 цветами (режим 02h); + 80x32 символов c 16 цветами (режим 03h); + и два графических: + 320x256 точек с 256 цветами (режим 81h); + 640x256 точек с 16 цветами (режим 82h); + Основным режимом является текстовый режим 80x32 (03h), если ваша программа работает в другом режиме, то вам следует перед переключением режима получить номер текущего режима функцией 51h GETVMOD и сохранить его, а перед завершением программы восстановить его. + + Например: + + LD C,51h ;получить режим экрана + RST 10h + LD C,A ;поместить номер режима экрана в регистр C + PUSH BC ;и сохранить на стеке (B - страница, C - режим) + . + . ;ваша программа + . + + POP BC ;взять со стека режим экрана + LD A,C ;поместить номер режима экрана в регистр A + LD C,50h ;установить режим экрана + RST 10h + LD C,41h ;завершить программу. + RST 10h + + DOS имеет функции вывода на текстовый экран символов и символьных строк. Для графических режимов требуются собственные процедуры вывода на экран. Например, при завершении программы вы можете выдать строку на текстовый экран: + + LD HL,STRING ;указатель на строку символов + LD C,5Ch ;вывод строки символов + RST 10h + +STRING DB "Thank you for using my program..." ;текстовая строка + DB 13,10 ;символы возврата каретки и перевода строки + DB 0 ;символ конца строки + + Для вывода на графический экран, вам необходимо подключить видео память в одно из трех окон памяти 04000h-07FFFh, 08000h-0BFFFh, 0C000h-0FFFFh. Это осуществляется выводом значения 50h в соответствующий порт 0A2h, 0C2h или 0E2h в зависимости от окна памяти. При подключении обратите внимание на то, чтобы стек вашей программы не попадал в это адресное пространство. + +Например, если вам нужно поставить точку на экране, то подпрограмма для режима 81h будет выглядеть так: + +; HL - горизонтальная координата +; DE - вертикальная координата + + IN A,(0E2h) ;считать из порта номер страницы подключенной в + ;третье окно памяти + LD C,A ;запомнить в регистре C + LD A,50h ;страница видео памяти + OUT (0E2h),A ;подключение видео памяти + LD A,E ;поместить вертикальную координату в регистр A. + OUT (89h),A ;выдать в порт + LD DE,0C000h ;адрес начала третьего окна памяти + ADD HL,DE ;получить адрес точки (адрес начала окна + + ;горизонтальная координата) + LD A,255 ;цвет выводимой точки (от 0 до 255) + LD (HL),A ;вывод точки на экран + LD A,C ;вспомнить номер страницы памяти + OUT (0E2h) ;подключить страницу памяти вместо страницы видео + ;памяти + + Перед выводом точек следует установить необходимые цвета в палитре. Различные режимы вывода на экран задаются номером видео страницы от 50h до 5Fh. Подробнее о режимах вывода вы можете прочитать в описании архитектуры компьютера. + +50h (80) SETVMOD (Выбор режима экрана) +входные данные: +A - режим экрана +02h - текстовый 40x32x16 цветов +03h - текстовый 80x32x16 цветов +81h - графический 320x256x256 цветов +82h - графический 640x256x16 цветов +B - страница экрана 0/1 +C - 50h + +выходные данные: +A - код ошибки, если CF=1 +Функция устанавливает режим экрана. Седьмой бит режима экрана установлен +для графических режимов и сброшен для текстовых. Существуют два текстовых режима +и два графических. + +51h (81) GETVMOD (Получить текущий режим экрана) +входные данные: +C - 51h +выходные данные: +A - текущий режим экрана +Функция возвращает текущий режим экрана. + +52h (82) LOCATE (Установить позицию курсора) +входные данные: +D - строка курсора +E - столбец курсора +C - 52h + +Функция устанавливает новую позицию курсора. Вывод символов будет +производиться в эту позицию. Верхний левый угол имеет координаты (0,0). + + +53h (83) CURSOR (Получить текущую позицию курсора) +входные данные: +C - 53h +выходные данные: +D - строка курсора +E - столбец курсора + +Функция возвращает текущую позицию курсора. + +54h (84) SELPAGE (Выбрать активную страницу экрана) +входные данные: +B - страница экрана 0/1 +C - 54h + +выходные данные: +A - код ошибки, если CF=1 +Функция устанавливает активную страницу, которая будет выводиться на экран. + +55h (85) SCROLL (Прокрутка окна) +входные данные: +D - строка левого верхнего угла окна +E - столбец левого верхнего угла окна +H - высота окна +L - ширина окна +B = 1 - прокрутка вверх +B = 2 - прокрутка вниз +A = 0 - очищать строку +C - 55h + +Функция определяет окно активной видеостраницы и его содержимое +перемещается вверх или в низ на одну строку. Если регистр A равен нулю, +освобождённая строка очищается (заполняется пробелами). + +56h (86) CLEAR (Очистка окна) +входные данные: +D - строка левого верхнего угла окна +E - столбец левого верхнего угла окна +H - высота окна +L - ширина окна +B - атрибут заполнитель +A - символ заполнитель +C - 56h + +Функция очищает окно экрана, записывая во все позиции окна символ с кодом +из регистра A и атрибутом из регистра B. + +57h (87) RDCHAR (Считать символ с экрана) +входные данные: +D - строка +E - столбец +C - 57h + +выходные данные: +A - символ +B - атрибут + +Функция считывает символ и его атрибут из позиции заданной регистрами D и E. + +58h (88) WRCHAR (Напечатать символ на экране) +входные данные: +D - строка +E - столбец +A - символ +B - атрибут +C - 58h + +Функция печатает символ и атрибут на экране в позиции заданной регистрами D +и E. Управляющие символы выводятся как обычные символы. + +59h (89) WINCOPY (Запомнить окно экрана) +входные данные: +D - строка +E - столбец левого верхнего угла окна +H - высота окна +L - ширина окна +B - страница буфера +IX - адрес буфера +C - 59h + +Функция копирует окно в память на страницу заданную в регистре B и по +адресу заданному в регистре IX. Если значение IX меньше 0C000h, копирование +производится в страницу памяти подключенную по этому адресу. В буфере получается +массив из идущих подряд символов и атрибутов. + +5Ah (90) WINREST (Восстановить окно экрана) +входные данные: +D - строка +E - столбец левого верхнего угла окна +H - высота окна +L - ширина окна +B - страница буфера +IX - адрес буфера +C - 5Ah + +Функция выполняет обратное копирование окна из памяти на странице заданной +в регистре B и с адреса заданного в регистре IX. Если значение IX меньше +0C000h, копирование производится из страницы памяти подключенной по этому +адресу. +5Bh (91) PUTCHAR (Напечатать символ в текущей позиции курсора) +входные данные: +A - символ +C - 5Bh + +Функция печатает символ на экране в текущей позиции курсора. После +печати символа текущая позиция увеличивается. Печать осуществляется с +управляющими кодами. + +5Ch (92) PCHARS (Напечатать строку символов в текущей позиции курсора) +входные данные: +HL - указатель на начало строки символов +C - 5Ch + +Функция печатает строку символов на экране в текущей позиции курсора. +При печати текущая позиция увеличивается. Печать осуществляется с +управляющими кодами. Строка должна заканчиваться кодом ноль. + +5Fh (95) PRINT (Вывод символа на принтер без ожидания) +входные данные: +A - символ +C - 5Fh + +выходные данные: +B - символ +CF = 1 - принтер не готов + +Функция посылает символ на принтер. Если принтер не готов принимать символ, +то выставляется флаг переноса (CF). +Пример: +LD HL,TEXT ;HL указывает на текстовый массив, который +NPRINT +PUSH BC ;необходимо распечатать на принтере +APRINT + PUSH HL ;Сохраняем указатель текущего символа + LD A,(HL) ;Берём очередной символ и печатаем + LD C,5Fh ;Функция печати символа + RST 10h ;Выполнение функции + JR NC,PRNOK ;Переход на печать следующего символа +;Принтер не готов, ожидаем пока не нажата [Esc] + LD C,31h ;Функция опроса клавиатуры без ожидания + RST 10h ;Выполнение функции + POP HL ;Восстанавливаем указатель на текущий символ + JR Z,APRINT ;Клавиши не нажимались + CP 1Bh ;Нажата клавиша [Esc]? + JR NZ,APRINT ;если нет, повторяем печать + POP BC ;Восстанавливаем счетчик символов +;Печать прервана (пользователь нажал [Esc]) +SCF +RET +PRNOK POP HL ;Восстанавливаем указатель на текущий символ + POP BC ;Восстанавливаем счетчик символов + INC HL ;Переходим к следующему символу + DEC BC ;Уменьшаем счетчик символов + LD A,B ;Счетчик равен нулю? + OR C + JP NZ,NPRINT ;если нет, продолжаем печать +;Успешно напечатаны все символы +XOR A +RET + + +Интерфейс для работы с мышью: + Взаимодействие с драйвером мыши осуществляется при помощи инструкции RST 30h. +В зависимости от конкретной функции, в качестве входных и выходных параметров +используются различные регистры, при этом номер функции задается в регистре C. +Любые перемещения мыши и нажатие на клавиши воспринимает специальная программа +драйвер мыши. Каждое нажатие и отпускание клавиш или перемещение мыши вызывает +прерывание. Программа, обслуживающая это прерывание, читает пакет данных от мыши +и перемещает курсор мыши в зависимости от полученных данных. + +00h (00) INITIALIZATION (Инициализация драйвера мыши) +входные данные: +C - 00h +выходные данные: +A - драйвер не установлен, если CF=1 +A - успешная инициализация, драйвер установлен, если CF=0 +Функция производит начальную инициализацию драйвера мыши. При возвращении флага +переноса драйвер не установлен. + +01h (01) SHOW MOUSE CURSOR (Вывести курсор мыши на экран) +входные данные: +C - 01h +выходные данные: +A - код ошибки, если CF=1 +Функция выводит на экран курсор мыши и отслеживает все перемещения курсора и +перерисовывает его. + +02h (02) HIDE MOUSE CURSOR (Убрать курсор мыши с экрана) +входные данные: +C - 02h +выходные данные: +A - код ошибки, если CF=1 +Функция стирает курсор мыши с экрана, но драйвер продолжает отслеживание +перемещения мыши и нажатие на кнопки. + +03h (03) READ MOUSE STATE (Чтение состояния мыши) +входные данные: +C - 03h +выходные данные: +A - код ошибки, если CF=1 +A - состояние кнопок +D0 - левая +D1 - правая +HL - x-координата +DE - y-координата + +Функция возвращает текущие координаты курсора мыши и состояние ее кнопок. +Координаты возвращаются в точках и для текстовых режимов необходимо их делить +на восемь для получения координат в знакоместах. + +04h (04) GOTO MOUSE CURSOR (Установка координат курсора мыши) +входные данные: +C - 04h +HL - x-координата +DE - y-координата + +выходные данные: +A - код ошибки, если CF=1 +Установка координат курсора мыши. Функция перемещает курсор мыши в заданные +координаты. + +07h (07) VERT. BOUNDS (Задание вертикальных границ перемещения курсора) +входные данные: +C - 07h +HL - y-минимальная +DE - y-максимальная + +выходные данные: +A - код ошибки, если CF=1 +Функция задает верхнюю минимальную и нижнюю максимальную координаты в которых +может перемещаться курсор мыши по вертикали. + +08h (08) HORZ. BOUNDS (Задание горизонтальных границ перемещения курсора) +входные данные: +C - 08h +HL - x-минимальная +DE - x-максимальная + +выходные данные: +A - код ошибки, если CF=1 +Функция задает левую минимальную и правую максимальную координаты в которых +может перемещаться курсор мыши по горизонтали. + +09h (09) LOAD CURSOR (Загрузка изображения курсора мыши) +входные данные: +C - 09h +B = 0 +IX - изображение курсора +H - высота курсора +L - ширина курсора +D - Y активная точка +E - X активная точка + + +выходные данные: +A - код ошибки, если CF=1 + +Функция загружает новое изображение курсора мыши в драйвер и задать активную +точку изображения. + + + +0Ah (10) CURSOR TEXT MODES (Установка курсора мыши в текстовом режиме) +входные данные: +C - 0Ah +B = 0 +H - AND SIMBOL MASK +L - XOR SIMBOL MASK +D - AND ATTRIBUT MASK +E - XOR ATTRIBUT MASK + +выходные данные: +A - код ошибки, если CF=1 +Функция устанавливает символ и атрибут курсора мыши для текстового режима. + +0Bh (11) RETURN CURSOR (Получение изображения курсора мыши) +входные данные: +C - 0Bh +IX - буфер для изображения курсора + +выходные данные: +A - код ошибки, если CF=1 +H - высота курсора +L - ширина курсора +D - Y активная точка +E - X активная точка + +Функция возвращает изображение курсора мыши из драйвера. + +0Eh (14) GET SENSETIVE (Чтение чувствительности мыши) +входные данные: +C - 0Eh +выходные данные: +A - код ошибки, если CF=1 +H - чувствительность по вертикали +L - чувствительность по горизонтали + +Функция возвращает значения чувствительности перемещения мыши по вертикали и +горизонтали. + +0Fh (15) SET SENSETIVE (Установка чувствительности мыши) +входные данные: +C - 0Fh +H - чувствительность по вертикали +L - чувствительность по горизонтали + +выходные данные: +A - код ошибки, если CF=1 +Функция устанавливает значения чувствительности перемещения мыши по вертикали +и горизонтали. + +80h (128) MOUSE HARDWARE INTERRUPT (Обработчик аппаратного прерывания от мыши) +входные данные: +C - 80h +выходные данные: +A - код ошибки, если CF=1 +По приходу прерывания от мыши вызывается данная функция драйвера. В случае +когда требуется работа подпрограммы при запрещенных прерываниях, используйте +данную функцию, для избежания потерь пакетов данных от мыши. + +81h (129) CHANGE VIDEO MODE (Информирование о смене режима экрана) +входные данные: +C - 81h +A - режим экрана + +выходные данные: +A - код ошибки, если CF=1 + +Функция информирует драйвер мыши об изменении режима экрана. Номера режимов +соответствуют функции установка режима экрана. + +83h (131) MOUSE REFRESH (Принудительная перерисовка курсора) +входные данные: +C - 83h +выходные данные: +A - код ошибки, если CF=1 +Функция перерисовывает изображение курсора мыши на экране не дожидаясь +очередного прерывания. +коды ошибок от драйвера мыши: +0 - нет ошибок +1 - неизвестная функция +2 - зарезервирована +3 - курсор уже на экране +4 - курсор отсутствует на экране +5 - изображение курсора слишком велико + + + + + + + + + + + + + + + + + + + + + + + + + +Приложение А. Коды ошибок DOS +00h (00) - нет ошибок +01h (01) - неверный номер функции +02h (02) - неправильный номер устройства +03h (03) - файл не обнаружен +04h (04) - неверный путь +05h (05) - несуществующий файловый манипулятор +06h (06) - нет свободного файлового манипулятора +07h (07) - файл существует +08h (08) - файл только для чтения +09h (09) - переполнение ROOT (корневого каталога) +0Ah (10) - нет свободного места на диске +0Bh (11) - каталог не пуст +0Ch (12) - попытка удалить текущий каталог +0Dh (13) - неизвестный формат +0Eh (14) - невозможная операция +0Fh (15) - каталог уже есть +10h (16) - неверное имя +11h (17) - неправильный EXE-файл +12h (18) - не поддерживаемая версия EXE-файла +13h (19) - ресурс не доступен +14h (20) - нет готовности +15h (21) - ошибка позиционирования +16h (22) - сектор не найден +17h (23) - ошибка CRC +18h (24) - защита записи +19h (25) - ошибка чтения +1Ah (26) - ошибка записи +1Bh (27) - общая ошибка +1Ch (28) - зарезервирован +1Dh (29) - зарезервирован +1Eh (30) - недостаточно памяти +1Fh (31) - несуществующий блок памяти +20h (32) – зарезервирован + + + + + + + + + + + + + + + + + + + + + + + + + + +Приложение Б. Таблица позиционных кодов
 +Key +ASCII +SCAN +key +ASCII +SCAN +` +000h +000h +V +056h +02Dh +Esc +01Bh +001h +B +042h +02Eh +1 +031h +002h +N +04Eh +02Fh +2 +032h +003h +M +04Dh +030h +3 +033h +004h +, +02Ch +031h +4 +034h +005h +. +02Eh +032h +5 +035h +006h +/ +02Fh +033h +6 +036h +007h +RShift +--- +034h +7 +037h +008h +\ +05Ch +035h +8 +038h +009h +LCtrl +--- +036h +9 +039h +00Ah +LAlt +--- +037h +0 +030h +00Bh +Space +020h +038h +- +02Dh +00Ch +RAlt +--- +039h += +03Dh +00Dh +RCtrl +--- +03Ah +BackSpace +008h +00Eh +F1 +000h +03Bh +Tab +009h +00Fh +F2 +000h +03Ch +Q +051h +010h +F3 +000h +03Dh +W +057h +011h +F4 +000h +03Eh +E +045h +012h +F5 +000h +03Fh +R +052h +013h +F6 +000h +040h +T +054h +014h +F7 +000h +041h +Y +059h +015h +F8 +000h +042h +U +055h +016h +F9 +000h +043h +I +049h +017h +F10 +000h +044h +O +04Fh +018h +F11 +000h +045h +P +050h +019h +F12 +000h +046h +[ +05Bh +01Ah +PrScrn +--- +047h +] +05Dh +01Bh +ScrlLock +000h +048h +CapsLock +000h +01Ch +NumLock +000h +049h +A +041h +01Dh +/ +02Fh +04Ah +S +053h +01Eh +* +02Ah +04Bh +D +044h +01Fh +- +02Dh +04Ch +F +046h +020h ++ +02Bh +04Dh +G +047h +021h +Enter +00Dh +04Eh +H +048h +022h +Del . +000h +04Fh +J +04Ah +023h +Ins 0 +000h +050h +K +04Bh +024h +End 1 +000h +051h +L +04Ch +025h +Down 2 +000h +052h +; +03Bh +026h +PgDn 3 +000h +053h +' +027h +027h +Left 4 +000h +054h +Enter +00Dh +028h +5 +000h +055h +LShift +--- +029h +Right 6 +000h +056h +Z +05Ah +02Ah +Home 7 +000h +057h +X +058h +02Bh +Up 8 +000h +058h +C +043h +02Ch +PgUp 9 +000h +059h + + + + + + + + + + + + +Приложение В. Байт атрибутов текстового экрана + + +бит 7 - Признак мерцания символа +биты 6,5,4 - Цвет фона символа 8 цветов (0...7) RGB +биты 3,2,1,0 - Цвет символа 16 цветов (0...15) IRGB + + +Цвета для фона и для символа: + 0 0h 0000b - Чёрный + 1 1h 0001b - Синий + 2 2h 0010b - Зелёный + 3 3h 0011b - Голубой (циан) + 4 4h 0100b - Красный + 5 5h 0101b - Фиолетовый + 6 6h 0110b - Коричневый + 7 7h 0111b - Белый + + +Только для символа: + + 8 8h 1000b - Серый + 9 9h 1001b - Ярко-синий +10 Ah 1010b - Ярко-зелёный +11 Bh 1011b - Ярко-голубой +12 Ch 1100b - Ярко-красный +13 Dh 1101b - Ярко-фиолетовый +14 Eh 1110b - Жёлтый +15 Fh 1111b - Ярко-белый
 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Системные вызовы дисковой подсистемы (DSS) v1.55 +Системные вызовы +   Если программа выполняет не только некую математическую задачу на ассемблере, то в ней придется столкнуться с такими вещами, как получение ввода пользователя, выполнение вывода результатов и завершение своей работы. Для этого, необходимо обратиться к сервисам DSS. Фактически, программирование на языке ассемблера одинаково для любых систем, если не пользоваться их сервисами.
   Вызов функций DSS в системе Estex выполняется из ассемблера. Необходимые параметры указываются в различных регистрах, регистр C используется для указания номера функции.

Так, наша программа для Estex будет выглядеть наподобие: + + org #8100 ;адрес точки входа + + LD HL,MSG ;сообщение для вывода + LD C,5Ch ;номер системного вызова (PCHARS) + RST 10h ;вызов подсистемы + + LD C,41h ;номер системного вызова (EXIT) + RST 10h ;вызов подсистемы + +MSG db "Hello, world!",0Dh,0Ah ;наша стока + db 0 ;конец строки +Далее идет список категорий функций DSS для системы Estex +Функции идентификации системы +Функции для работы с диском +Функции для работы с файлами +Функции для работы с датой и временем +Функции управления памятью +Функции ввода с клавиатуры +Функции для исполнения программ +Функции для работы со строками и командной строкой +Функции работы с экраном +Функции для печати на принтере +Функции идентификации системы
 +00h (00) VERSION (Версия DSS) +Входные значения:
C - 00h +Выходные значения:
D - номер версии
E - модификация +Функции для работы с диском
 +01h (01) CHDISK (Смена текущего диска) +Входные значения:
A - номер диска (0-A,1-B...)
C - 01h +Выходные значения:
A - код ошибки, если CF=1
A - максимальный номер диска, если CF=0 +02h (02) CURDISK (Номер текущего диска) +Входные значения:
C - 02h +Выходные значения:
A - код ошибки, если CF=1
A - текущий номер диска (0-A,1-B...), если CF=0 +03h (03) DSKINFO (Информация о диске) +Входные значения:
A - номер диска (0-A,1-B...0FFh-текущий)
C - 03h +Выходные значения:
A - код ошибки, если CF=1
A - размер кластера в секторах, если CF=0
HL - общее кол-во кластеров
DE - свободных кластеров
BC - размер сектора в байтах +09h (09) BOOTDSK (Номер системного диска) +Входные значения:
C - 09h
B = 0 +Выходные значения:
A - код ошибки, если CF=1
A - номер системного диска (0-A,1-B...), если CF=0 +Функции для работы с файлами
 +0Ah (10) CREATE (Создание файла) +Входные значения:
HL - указатель на файловую спецификацию
A - атрибут файла
C - 0Ah +Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0 +0Bh (11) CREATE NEW FILE (Создание нового файла) +Входные значения:
HL - указатель на файловую спецификацию
A - атрибут файла
C - 0Bh +Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0 +0Eh (14) DELETE (Удаление файла) +Входные значения:
HL - указатель на файловую спецификацию
C - 0Eh +Выходные значения:
A - код ошибки, если CF=1 +10h (16) RENAME (Переименование файла) +Входные значения:
HL - указатель на старое имя файла
DE - указатель на новое имя файла
C - 10h +Выходные значения:
A - код ошибки, если CF=1 +11h (17) OPEN (Открытие файла) +Входные значения:
HL - указатель на файловую спецификацию
A - режим доступа
A=0 чтение/запись
A=1 чтение
A=2 запись
C - 11h +Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0 +12h (18) CLOSE (Закрытие файла) +Входные значения:
A - файловый манипулятор
C - 12h +Выходные значения:
A - код ошибки, если CF=1 +13h (19) READ (Чтение из файла) +Входные значения:
A - файловый манипулятор
HL - адрес в памяти
DE - количество читаемых байт
C - 13h +Выходные значения:
A - код ошибки, если CF=1
DE - реальное количество прочитанных байт
если CF=0:
A = 0 прочитаны все байты
A = 0FFh прочитано меньшее число байт +14h (20) WRITE (Запись в файл) +Входные значения:
A - файловый манипулятор
HL - адрес в памяти
DE - количество записываемых байт
C - 14h +Выходные значения:
A - код ошибки, если CF=1
DE - реальное количество записанных байт +15h (21) MOVE_FP (Перемещение указателя в файле) +Входные значения:
A - файловый манипулятор
HL:IX - смещение указателя в файле
B - способ перемещения:
B=0 от начала файла
B=1 от текущего значения указателя
B=2 от конца файла
C - 15h +Выходные значения:
A - код ошибки, если CF=1
HL:IX - новое значение указателя +16h (22) ATTRIB (Получение/изменение атрибута файла) +Входные значения:
HL - указатель на файловую спецификацию
B - режим доступа
B = 0 получить атрибут
B = 1 установить атрибут
A - атрибут файла
C - 16h +Выходные значения:
A - код ошибки, если CF=1
A - атрибут файла, если CF=0 +17h (23) GET_D_T (Информация о дате и времени файла) +Входные значения:
A - файловый манипулятор
C - 17h +Выходные значения:
A - код ошибки, если CF=1
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды +18h (24) PUT_D_T (Изменение даты и времени файла) +Входные значения:
A - файловый манипулятор
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - 18h +Выходные значения:
A - код ошибки, если CF=1 +19h (25) F_FIRST (Поиск первого совпадающего файла) +Входные значения:
HL - указатель на файловую спецификацию
DE - рабочий буфер 44 байта, если B=0, иначе 256 байт
A - атрибуты, используемые при поиске
B = 0 - имя найденного файла в формате 11 байт "FilenameExt"
B = 1 - имя найденного файла в формате DOS "filename.ext",0
C - 19h +Выходные значения:
A - код ошибки, если CF=1 +1Ah (26) F_NEXT (Поиск следующего совпадающего файла) +Входные значения:
DE - указатель на рабочий буфер
C - 1Ah +Выходные значения:
A - код ошибки, если CF=1 +1Bh (27) MKDIR (Создание каталога) +Входные значения:
HL - указатель на файловую спецификацию
C - 1Bh +Выходные значения:
A - код ошибки, если CF=1 +1Ch (28) RMDIR (Устранение каталога) +Входные значения:
HL - указатель на файловую спецификацию
C - 1Ch +Выходные значения:
A - код ошибки, если CF=1 +1Dh (29) CHDIR (Смена текущего каталога) +Входные значения:
HL - указатель на файловую спецификацию
C - 1Dh +Выходные значения:
A - код ошибки, если CF=1 +1Eh (30) CURDIR (Информация о текущем каталоге) +Входные значения:
HL - буфер в памяти 256 байт
C - 1Eh +Выходные значения:
A - код ошибки, если CF=1 +Функции для работы с датой и временем
 +21h (33) SYSTIME (Текущая дата и время) +Входные значения:
C - 21h +Выходные значения:
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - день недели +22h (34) SETTIME (Установить текущую дату и время) +Входные значения:
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - 22h +Выходные значения:
A - код ошибки, если CF=1 +Функции управления памятью
 +38h (56) SETWIN (Подключение страницы памяти) +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
H - биты 6 и 7 задают номер окна, в которое будет подключена страница
C - 38h +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 +39h (57) SETWIN1 (Подключение страницы памяти в первое окно) +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 39h +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 +3Ah (58) SETWIN2 (Подключение страницы памяти во второе окно) +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 39h +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 +3Bh (59) SETWIN3 (Подключение страницы памяти в третье окно) +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 3Bh +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 +3Ch (60) INFOMEM (Информация о памяти) +Входные значения:
C - 3Ch +Выходные значения:
HL - общее количество страниц
BC - количество свободных страниц +3Dh (61) GETMEM (Выделение блока памяти) +Входные значения:
B - размер блока в страницах по 16 килобайт
C - 3Dh +Выходные значения:
A - код ошибки, если CF=1
A - идентификатор блока памяти, если CF=0 +3Eh (62) FREEMEM (Освобождение блока памяти) +Входные значения:
A - идентификатор блока памяти
C - 3Eh +Выходные значения:
A - код ошибки, если CF=1 +3Fh (63) SETMEM (Изменение блока памяти) +Входные значения:
A - идентификатор блока памяти
B - новый размер блока
C - 3Fh +Выходные значения:
A - код ошибки, если CF=1 +Функции ввода с клавиатуры
 +30h (48) WAITKEY (Ожидание символа с клавиатуры) +Входные значения:
C - 30h +Выходные значения:
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +31h (49) SCANKEY (Опрос клавиатуры без ожидания) +Входные значения:
C - 31h +Выходные значения:
ZF = 1 - нет клавиш
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +32h (50) ECHOKEY (Ожидание символа с клавиатуры с печатью) +Входные значения:
C - 32h +Выходные значения:
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +33h (51) CTRLKEY (Получить состояние клавиатуры) +Входные значения:
C - 33h +Выходные значения:
A = 0 - нет символов в буфере
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +35h (53) K_CLEAR (Очистить буфер клавиатуры и выполнить функцию) +Входные значения:
B - номер функции 30h, 31h, 32h, 33h или 34h
C - 35h +Выходные значения:
В зависимости от указанной функции в регистре B. +36h (54) K_SETUP (Управление настройками клавиатуры) +Входные значения:
B - номер подфункции
C - 36h

B = 0, установить раскладку клавиатуры
A - номер раскладки +0 - normal
1 - shift
2 - caps lock
3 - caps lock + shift
4 - normal (альтернативная кл.)
5 - shift (альтернативная кл.)
6 - caps lock (альтернативная кл.)
7 - caps lock + shift (альтернативная кл.) +B = 1, получить состояние звуковых переменных
B = 2, установить звуковые переменные
A - значение переменной
bit0 - сигнал переполнения буфера клавиатуры
bit1 - сигнал переключения на альтернативную раскладку клавиатуры +Выходные значения:
В зависимости от указанной функции в регистре B. +37h (55) TESTKEY (Опрос буфера клавиатуры) +Входные значения:
C - 37h +Выходные значения:
ZF = 1 - нет символов в буфере
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +Функции для исполнения программ
 +40h (64) EXEC (Выполнить файл) +Входные значения:
HL - указатель на файловую спецификацию
B = 0 - загрузить и выполнить программу
C - 40h +Выходные значения:
A - код ошибки, если CF=1
A - код завершения, если CF=0 +41h (65) EXIT (Завершение программы) +Входные значения:
B - код завершения
C - 41h +Выходные значения:
A - код ошибки, если CF=1
A - код завершения, если CF=0 +42h (66) WAIT (Получить код завершения программы) +Входные значения:
C - 42h +Выходные значения:
A - код завершения +Функции для работы со строками и командной строкой
 +43h (67) GSWITCH (Выделить параметр командной строки) +Входные значения:
HL - указатель командной строки
DE - буфер для выделяемого параметра
C - 43h +Выходные значения:
HL - указатель на следующий параметр командной строки
CF = 0 - конец строки не достигнут (есть другие параметры)
CF = 1 - конец строки (в буфер перенесён последний параметр или ноль) +44h (68) DOSNAME (Преобразовать имя файла) +Входные значения:
C - 44h
B = 0, преобразовать из 11 символьного формата в формат ДОС
HL - 11 символов имени файла
DE - буфер для имени в формате ДОС
B = 1, преобразовать из формата ДОС в 11 символьный формат
HL - имя файла в формате ДОС
DE - 11 символов имени файла +Выходные значения:
A - код ошибки, если CF=1 +45h (69) EXCMDLN (Разбор командной строки) +Входные значения:
HL - указатель командной строки
DE - указатель на буфер пользователя
C - 45h
B - номер подфункции: +0 - Разобрать строку;
1 - Выделить имя диска;
2 - Выделить директорию;
3 - Выделить имя файла;
4 - Выделить расширение файла;
5 - Выделить имя диска, путь к файлу, имя файла и расширение файла;
6 - Зарезервирована;
7 - Выделить параметр командной строки;
8 - Преобразовать из 11 символьного формата в формат ДОС;
9 - Преобразовать из формата ДОС в 11 символьный формат; +Подфункция 0 - Разобрать строку: + +Входные значения:
HL - указатель командной строки
C - 45h
B = 0 - Разобрать строку +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла; + +Подфункция 1 - Выделить имя диска: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 13 байт)
C - 45h
B = 1 - Выделить имя диска +Выходные значения:
A - код ошибки, если CF=1
A - номер диска (0 - A, 1 - B, 2 - C и т.д.), если CF=0
буфер - имя диска "A:",0 + +Подфункция 2 - Выделить директорию: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 256 байт)
C - 45h
B = 2 - Выделить директорию +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - директория "DIR1\DIR2\DIR3\",0 + +Подфункция 3 - Выделить имя файла: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 13 байт)
C - 45h
B = 3 - Выделить имя файла +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - имя файла "FILE.EXT",0 + +Подфункция 4 - Выделить расширение файла: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 4 байт)
C - 45h
B = 4 - Выделить расширение файла +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - расширение "TXT",0 или "C ",0 + +Подфункция 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 8 байт)
DE+0 адрес буфера для имени диска (макс. 13 байт)
DE+2 адрес буфера для директории (макс. 256 байт)
DE+3 адрес буфера для имени файла (макс. 13 байт)
DE+4 адрес буфера для расширения файла (макс. 4 байта)
C - 45h
B = 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла; + +Подфункция 7 - Выделить параметр командной строки + +Входные значения:
HL - указатель командной строки
DE - буфер для выделяемого параметра
C - 45h
B = 7 - Выделить параметр командной строки +Выходные значения:
HL - указатель на следующий параметр командной строки
CF = 0 - конец строки не достигнут (есть другие параметры)
CF = 1 - конец строки (в буфер перенесён последний параметр или ноль) + +Подфункция 8 - Преобразовать из 11 символьного формата в формат ДОС + +Входные значения:
C - 45h
B = 8 - преобразовать из 11 символьного формата в формат ДОС
HL - 11 символов имени файла
DE - буфер для имени в формате ДОС +Выходные значения:
A - код ошибки, если CF=1 + +Подфункция 9 - Преобразовать из формата ДОС в 11 символьный формат + +Входные значения:
C - 45h
B = 9 - преобразовать из формата ДОС в 11 символьный формат
HL - имя файла в формате ДОС
DE - буфер для 11 символов имени файла +Выходные значения:
A - код ошибки, если CF=1 + + +Функции работы с экраном
 +50h (80) SETVMOD (Выбор режима экрана) +Входные значения:
A - режим экрана
   02h - текстовый 40x32x16 цветов
   03h - текстовый 80x32x16 цветов
   81h - графический 320x256x256 цветов
   82h - графический 640x256x16 цветов
B - страница экрана 0/1
C - 50h +Выходные значения:
A - код ошибки, если CF=1 +51h (81) GETVMOD (Получить текущий режим экрана) +Входные значения:
C - 51h +Выходные значения:
A - код ошибки, если CF=1
A - текущий режим экрана, если CF=0
B - страница экрана 0/1 +52h (82) LOCATE (Установить позицию курсора) +Входные значения:
D - строка курсора
E - столбец курсора
C - 52h +Выходные значения:
нет +53h (83) CURSOR (Получить текущую позицию курсора) +Входные значения:
C - 53h +Выходные значения:
D - строка курсора
E - столбец курсора +54h (84) SELPAGE (Выбрать активную страницу экрана) +Входные значения:
B - страница экрана 0/1
C - 54h +Выходные значения:
A - код ошибки, если CF=1 +55h (85) SCROLL (Прокрутка окна) +Входные значения:
D - строка левого верхнего угла окна
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B = 1 - прокрутка вверх
B = 2 - прокрутка вниз
A = 0 - очищать строку
C - 55h +Выходные значения:
нет +56h (86) CLEAR (Очистка окна) +Входные значения:
D - строка левого верхнего угла окна
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - атрибут заполнитель
A - символ заполнитель
C - 56h +Выходные значения:
нет +57h (87) RDCHAR (Считать символ с экрана) +Входные значения:
D - строка
E - столбец
C - 57h +Выходные значения:
A - символ
B - атрибут +58h (88) WRCHAR (Напечатать символ на экране) +Входные значения:
D - строка
E - столбец
A - символ
B - атрибут
C - 58h +Выходные значения:
нет +59h (89) WINCOPY (Запомнить окно экрана) +Входные значения:
D - строка
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - страница буфера
IX - адрес буфера
C - 59h +Выходные значения:
нет +5Ah (90) WINREST (Восстановить окно экрана) +Входные значения:
D - строка
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - страница буфера
IX - адрес буфера
C - 5Ah +Выходные значения:
нет +5Bh (91) PUTCHAR (Напечатать символ в текущей позиции курсора) +Входные значения:
A - символ
C - 5Bh +Выходные значения:
нет +5Ch (92) PCHARS (Напечатать строку символов в текущей позиции курсора) +Входные значения:
HL - указатель на начало строки символов
C - 5Ch +Выходные значения:
нет +Функции для печати на принтере
 +5Fh (95) PRINT (Вывод символа на принтер без ожидания) +Входные значения:
A - символ
C - 5Fh +Выходные значения:
B - символ
CF = 1 - принтер не готов + + diff --git a/docs/converted/Sprint2K.txt b/docs/converted/Sprint2K.txt new file mode 100644 index 0000000..0d1ef9a --- /dev/null +++ b/docs/converted/Sprint2K.txt @@ -0,0 +1,38 @@ +Архитектура компьютера +Основные понятия +Персональный компьютер Sprinter является универсальным компьютером на базе 8 битного процессора Z80 (Z84C1516PSC) фирмы Zilog. Основой компьютера является перепрограммируемая логическая матрица (ППЛМ) EP1K30QC208-3 фирмы ALTERA. +В настоящее время компьютер Sprinter использует плату Sp2000 в качестве материнской платы. Плата Sp2000 была разработана в конце 2000 года специально с возможностью обеспечения поддержки будущих моделей компьютера и имеет ряд конструктивных особенностей, использование которых нашло свое отражение в данном руководстве. +Вначале поясним основные понятия, которые вам будут встречаться. +Модель компьютера - набор конфигураций, зашитых в ПЗУ и определяющих возможности, доступные для пользователя. Современная модель компьютера Sprinter пока является единственной и носит тоже название. +Конфигурация компьютера - реализация конкретной схемы в перепрограммируемой логической микросхеме (ППЛМ).  +Основная конфигурация - конфигурация активная сразу после включения компьютера и содержащая в себе наиболее важные и часто используемые режимы работы данной модели компьютера. +Режим конфигурации - изменение характеристик работы компьютера в рамках конфигурации. +Быстрое ОЗУ - дополнительное ОЗУ, в котором процессор может работать на высокой частоте без тактов ожидания (подразумевается турбо-режим процесора).  +Физический блок памяти - 16K блок основной памяти компьютера. Обозначается шестнадцатеричным числом -- #00..#FF +Логический блок памяти - 16K блок спектрумовской схемы распределения памяти. Обозначается десятичным числом - 0..15 +Краткая характеристика компьютера Sprinter. +Процессор Z84C15 (21MHz/3.5MHz) +ОЗУ 4Mb +Быстрое ОЗУ 64Kb +ПЗУ 256Kb +ВидеоОЗУ 256Kb (512Kb) +Контроллер дисков Кp1818ВГ93 (аналог WD1793) +Поддержка дисководов: 3,5" диск (1.44Mb/720Kb) + 5,25" диск (720Kb) +Часы CMOS DALLAS +Контpоллеp винчестеpа IDE/AT +Контpоллеp клавиатуpы 101key/AT +Контpоллеp мыши MS Mouse +Два слота стандаpт ISA-8 +Аудио выход AY-3-8910 в ППЛМ, звуковой ЦАП (16 бит) +Видео выход Аналоговый CGA монитоp, RGB, ТВ (SCART) +Графические видеорежимы 320x256x256, 640x256x16, ZX стандарт Текстовые видеорежимы 80x32x16, 40х32х16 + +Техническая реализация. +   Ядром машины являются процессор Z84C15 и ППЛМ фирмы ALTERA - EP1K30QC208-3. Кроме них на плате присутствуют: микросхема ПЗУ, слот под 72-х-пиновый SIMM, видео ОЗУ, 64Kb Быстрого ОЗУ, схема контроллера дисковода на БИС КР1818ВГ93 (аналог WD1793), буферы для подключения джойстика, магнитофона, принтера, клавиатуры, дисководов, винчестера, мыши, буферные микросхемы шины ISA-8 и еще одна ППЛМ фирмы ALTERA -- EPM7064SLC100-10. Эта ППЛМ не меняет своей конфигурации и предназначена для обеспечения синхронизации и начального запуска компьютера. На плате так же предусмотрена возможность подключения CMOS часов - микросхемы DALLAS. 
   Кроме периферии и буферов имеются микросхемы дешифрации, входы которых подключаются к процессору через ППЛМ. Это позволяет легко менять адресацию устройств, без какого-либо изменения разводки печатной платы. +Схема компьютера основана на большой перепрограммируемой логической микросхеме (ППЛМ). Подключение периферийных устройств через ППЛМ позволяет получить высокую гибкость машины по конфигурациям. +Программирование (загрузка данных) ППЛМ осуществляется непосредственно в момент включения компьютера, а так же при перезагрузке, что позволяет кардинально менять схему в ППЛМ непосредственно во время работы. Это сильно выделяет архитектуру Sprinter-а из ряда существующих компьютеров, и многие понятия, присущие обычным машинам, меняют свой смысл. Фактически компьютер имеет гибкую архитектуру, в которой возможны изменения во многих частях схемы. Например, нельзя говорить о конкретных адресах портов подключения периферии, так как они могут быть изменены в одну секунду путем перепрограммирования ППЛМ и данных в ОЗУ, отвечающих за конфигурацию портов. Конкретные адреса появляются только в конкретных конфигурациях, например, в конфигурации ZX-Spectrum. +Перепрограммируемость схемы дает большую свободу фантазии программиста по конфигурации машины. Задумывая конкретный проект, программист может определить в какой конфигурации его можно реализовать лучше, а, возможно, и придумать свою конфигурацию, которую затем можно реализовать в ППЛМ и включить перед запуском этой программы. + INCLUDEPICTURE \d "http://www.petersplus.ru/sprinter/pix/fig1.gif" \* MERGEFORMATINET +Рисунок SEQ Рисунок \* ARABIC 1. Функциональная схема +Для упрощения схемы некоторые буферы и дешифраторы на схеме не указаны. Количество проводов в шинах так же условно.
 diff --git a/docs/converted/accel_r.txt b/docs/converted/accel_r.txt new file mode 100644 index 0000000..9a2e49c --- /dev/null +++ b/docs/converted/accel_r.txt @@ -0,0 +1,97 @@ + Акселератор компьютера Sprinter. + + Акселератор предназначен для ускорения операций по пересылке блоков данных в ОЗУ и видео-ОЗУ. + + Акселератор позволяет: + +- быстро заполнять горизонтальную или вертикальную линию длиной до 256 точек одним цветом (в режиме 640x256 - одинарную/двойную горизонтальную линию длиной до 512 точек) +- быстро копировать горизонтальную или вертикальную линию длиной до 256 точек (в режиме 640x256 - горизонтальную линию до 512 точек) +- проводить быстрые операции AND, OR, XOR с блоками памяти. + + Акселератор не может работать с блоками данных ПЗУ и Быстрого-ОЗУ. + + ОЗУ акселератора является частью внутреннего ОЗУ ППЛМ. +Операции по пересылке данных производятся путем записи блока данных в это +внутреннее ОЗУ, а затем копировании его в нужное место ОЗУ из ОЗУ акселератора. +Блок данных, записываемый в ОЗУ акселератора может иметь различную +длинну из диапазона 1..256 байт. + + После одной записи копирование может производиться несколько раз и, таким +образом, можно производить заполнение экрана текстурами. + + Для заполнения экрана одним цветом используется другой режим +акселератора. В нем вместо копируемого блока данных из внутреннего ОЗУ +производится запись данных с шины процессора, которые в этот момент не +изменяются. + + Управление акселератором производится непосредственно из программы. +Для этого изпользуются команды процессора, которые, фактически, являются +операциями типа NOP. + + LD B,B - выключить акселетарор. + LD D,D - включить акселератор в режим приема байта размера блока + далее следует команда типа LD A,dat, где dat и будет новым + размером блока. Если размер блока был установлен ранее, + его можно не устанавливать. + LD C,C - Операция Fill - заполнение одним байтом. Последующая + команда типа LD (HL),A приведет к заполнению указанного + ранее количества байт значением A + LD E,E - Операция Fill для графического экрана - заполнение + вертикальных линий. + LD H,H - rezerved + LD L,L - копирование блока. Последующая команда типа LD A,(HL) + приведет к заполнению ОЗУ акселератора данными из адреса (HL), + а команда типа LD (DE),A приведет к перезаписи данных из ОЗУ + акселератора в ОЗУ или видео-ОЗУ. + LD A,A - копирование блока для графического экрана подобна команде + LD L,L, но работает с вертикальными линиями экрана. + + Пример использования акселератора: + + ; Считаем, что экранная страница уже открыта по адресу #C000 + LD HL,#C040 ; адрес начала линии первого экрана + LD DE,#C180 ; адрес начала линии второго экрана + LD BC,#140 ; длина экрана по горизонтали + DI ; запретить прерывания для работы с акселератором + LD D,D ; включить акселератор на установку размера блока + LD A,0 ; установить размер блока - 256 байт + LD A,A ; установить акселератор на копирование + ; вертикальных линий. + LDIR ; копировать + LD B,B ; выключить акселератор + EI ; включить прерывания + + + + Эта часть программы произведет копирование всего содержимого первого экрана на другой. +Время исполения составляет примерно 26 милисекунд. + + Дополнительные функции акселератора (AND, OR, XOR) работают таким же образом. +Для выполнения логических функций используются команды XOR (HL); OR (HL); AND (HL). + + Пример кодирования блока в 256 байт. + + LD HL,ADRES_1 + LD DE,XOR_DAT + DI + LD D,D + LD A,0 ; число байт, которые надо закодировать + LD L,L + LD A,(DE) ; взять блок данных в ОЗУ акселератора + XOR (HL) ; произвести операцию XOR с данными акселератора + LD (HL),A ; запомнить в ОЗУ результат операции + LD B,B + EI + + +Скорость работы акселератора ограничивается только физической +скоростью работы основного ОЗУ. Определить примерное время работы команды с +акселератором можно по такой формуле: + +Время работы = время работы команды без акселератора + время работы +акселератора + +Время работы акселератора = число пересылаемых байт /7 микросекунд + +Во время работы акселератора необходимо отключать прерывания, так как в этот момент +изменяется система команд процессора и программа на прерывании не сможет работать корректно. diff --git a/docs/converted/bios.txt b/docs/converted/bios.txt new file mode 100644 index 0000000..d600852 --- /dev/null +++ b/docs/converted/bios.txt @@ -0,0 +1,244 @@ +Функции BIOS v2.12 +Вызов функций BIOS осуществляется из ассемблерного кода.

    Номер функции задается в регистре C процессора. В остальные регистры, при необходимости, загружаются входные параметры функции. После исполнения функции происходит возврат в программу, из которой произошел вызов функции. Установленный флаг CF (CF=1) означает, что работа функции произошла с ошибкой. В некоторых регистрах передаются выходные параметры.

Ниже приведены таблицы входных и выходных параметров для каждой функции: + HYPERLINK "" \l "t01" Функции работы с памятью + HYPERLINK "" \l "t04" Функции управления 'железом' + HYPERLINK "" \l "t06" Функции управления окнами и режимами экрана + HYPERLINK "" \l "t07" Функции вывода текста на экран + HYPERLINK "" \l "t08" Графические функции + HYPERLINK "" \l "t11" Функции работы с жесткими дисками и дисководами +    При работе функций BIOS необходимо что бы стек находился в области 8000h..0BFFFh, так как часть функций использует переключение страниц PAGE1 и PAGE3.

Вызов функций BIOS возможен в различных конфигурациях компьютера Sprinter.

Конфигурация Spectrum: вызов функций BIOS осуществляется через 3D13h. При этом работают и все функции TR-DOS.

Конфигурации Sprinter: вызов функций BIOS осуществляется через RST 18h при подключенном системном ПЗУ.

Для постоянного подключения системного ПЗУ можно воспользоваться такой последовательностью команд: + + LD A,0 + OUT (07Ch),A +После ее исполнения в 0-м окне Z80 будет включено ПЗУ BIOSа и программа может вызывать функции BIOSа через RST 18h.

Отключение ПЗУ BIOSа из нулевого окна Z80 производится следующей последовательностью команд: + + LD A,0 + OUT (03Ch),A +При необходимости, функции BIOSа могут быть вызваны программой, находящейся в ОЗУ непосредственно в нулевом окне Z80. Для этого надо установить в адресе 0008h следующий код: + +ADDRESS_0008h: + PUSH AF + LD A,0 + OUT (7Ch),A + POP AF + RET +    После этого BIOS можно вызывать командой RST 8. (Функции TR-DOS, так же как и в случае RST 18 остаются недоступны.) Вызывая программы таким образом, через RST 8, следует помнить что адреса 3FFFh..0000h после входа в BIOS будут содержать код ПЗУ, поэтому, если фунция использует данные в ОЗУ, они должны находиться в других адресах.

    Оптимизация программы для RST 8 недопустима, так как в ПЗУ, для обратного переключения, стоит такая же программа, только порт 3Ch для отключения ПЗУ BIOSа.

    Вызов функций BIOS в exe-файлах, вызываемых с помощью операционной системы Estex, производится командой RST 8. Необходимая программа в адресе 0008h уже имеется в блоке кода ОС Estex.

 +Функции работы с памятью +0C0h (192) EMM_FN0 Определение объемов ОЗУ +Значение регистров на входе:
  C=0C0h +Значение регистров на выходе:
  HL - общий объем ОЗУ в страницах по 16k
  BC - объем свободного ОЗУ в страницах по 16k +0C1h (193) EMM_FN1 Инициализация распределения памяти.
  Стирается вся информация о выделенных ранее блоках ОЗУ.
  Блоки с системной информацией и первые 256K ОЗУ объявляются занятыми. +Значение регистров на входе:
  C=0C1h +Значение регистров на выходе:
  нет +0C2h (194) EMM_FN2 Выделение блока ОЗУ +Значение регистров на входе:
  C=0C2h
  B - число запрашиваемых страниц +Значение регистров на выходе:
  CF=0 - нормальное завершение - A - идентификатор блока
  CF=1 - ошибка - A=1 - не хватает памяти +0C3h (195) EMM_FN3 Освободить блок ОЗУ +Значение регистров на входе:
  C=0C3h 
  A - идентификатор блока +Значение регистров на выходе:
  CF=0 - нормальное завершение
  C - неправильный идентификатор
    идентификатор не всегда отслеживается правильно +0C4h (196) EMM_FN4 Получить физический номер страницы из блока памяти +Значение регистров на входе:
  C=0C4h
  A - идентификатор блока
  B - логическая номер страницы в блоке +Значение регистров на выходе:
  CF=0 - A - логический номер страницы
  CF=1 - ошибка:
      A=0 - блок не существует
      A=255 - запрашиваемый номер страницы слишком велик +0C5h (197) EMM_FN5 Получить список физических страниц блока +Значение регистров на входе:
  C=0C5h 
  A - идентификатор блока 
  HL - буфер 256 байт для размещения списка страниц +Значение регистров на выходе:
  CF=0 - нормальное завершение:
      B - число страниц в блоке
      HL - тот же адрес буфера, в буфере список физических страниц по порядку, заканчивающийся байтом 0FFh
  CF=1 - неверный идентификатор блока; старая информация в буфере может быть затерта +0C6h (198) EMM_FN6 Получение адресов портов окон
 HYPERLINK "" \l "02" примечание по использованию +Значение регистров на входе:
  C=0C6h 
  A - номер окна процессора - 0,1,2 или 3 +Значение регистров на выходе:
  CF=0 - нормальное завершение
      C - 8-битный адрес порта окна
      B - физический номер подключенной в окно страницы
  CF=1 - ошибка - неверный номер окна +0C7h (199) EMM_FN7 Получить номер следующей страницы блока 
 HYPERLINK "" \l "03" примечание по использованию +Значение регистров на входе:
  C=0C7h
  A - физическая страница +Значение регистров на выходе:
  CF=0 - нормальное завершение
      A - следуюшая физическая страница блока
      A=0FFh - индицирует конец блока
  CF=1 - ошибка - страница не принадлежит никакому блоку. фактически, это означает, что она свободна. +09Eh (158) EMM_FN8 Слияние блоков +Значение регистров на входе:
  A - идентификатор блока 1
  B - идентификатор блока 2 +Значение регистров на выходе:
  CF=0 - нормальное завершение
      A - идентификатор объединенного блока
  CF=1 - ошибка - неверный идентификатор блока +09Dh (157) EMM_FN9 Разделение блока +Значение регистров на входе:
  C=09Dh 
  A - идентификатор блока 
  B - новая длина блока +Значение регистров на выходе:
  CF=0 - нормальное завершение 
      A - идентификатор блока результата 
      B - идентификатор блока остатка 
  CF=1 - ошибка - неверный идентификатор блока +Функции управления 'железом' +0EFh (239) FN_VERSION Выдача информации о версии BIOSа и железа. +Значение регистров на входе:
  C=0EFh 
  HL - буфер, куда будет помещена ASCII строка с несколькими полями, номером версии BIOS и названием модели компьютера. Конец строки отмечен двойным нулем.Значение регистров на выходе:
  CF=0 - нормальное завершение 
      HL - тот же буфер с записанной строкой. 
      DE - версия BIOSа 
      BC - версия железа HYPERLINK "" \l "04" подробности ниже 
      A - количество полей в буфере (в данный момент - 2) 
          Первое поле - версия BIOS. 
          Второе - название модели компьютера. 
  CF=1 - ошибка - Очень старая версия, 
      не имеющая данной функции +0F2h (242) FN_SICF=0 Установка синхронизации, очистка страницы режима экрана +Значение регистров на входе:
  C=0F2h 
  A - режим синхронизации +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - неверный номер режима синхронизации +0F5h (245) CMOS_TEST Проверить наличие CMOS 
 HYPERLINK "" \l "08" комментарий +Значение регистров на входе:
  C=0F5h +Значение регистров на выходе:
  CF=0 - часы есть 
  CF=1 - часов нет +0F6h (246) CMOS_RD Читать из регистра CMOS 
 HYPERLINK "" \l "08" комментарий +Значение регистров на входе:
  C=0F6h 
  D - номер регистра CMOS +Значение регистров на выходе:
  A - считанные данные 
  CF=0 - часы есть 
  CF=1 - часов нет +0F7h (247) CMOS_WR Писать в регистр CMOS 
 HYPERLINK "" \l "08" комментарий +Значение регистров на входе:
  C=0F7h 
  D - номер регистра CMOS 
  A - записываемые данные +Значение регистров на выходе:
  CF=0 - часы есть 
  CF=1 - часов нет +08Fh (143) FN_TURBO Функция управления турбо режимом. 
  HYPERLINK "" \l "09" комментарий +Значение регистров на входе:
  C=08Fh 
  A - режим турбо: 2 - off, 3 - on +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - неверный режим турбо +Функции управления окнами и режимами экрана +0B0h (176) WIN_OPEN Функция открытия окна. +Значение регистров на входе:
  C=0B0h 
  IX - HYPERLINK "" \l "10" описатель окна 
  E - флаги окна: 
      бит 0 указывает какую страницу режима включать после исполнения функции;
      бит 4 указывает на какой странице режима открывать окно Значение регистров на выходе:
  CF=0 - нормальное завершение: 
      A - HYPERLINK "" \l "17" идентификатор окна 
  CF=1 - ошибка слишком много окон +0B1h (177) WIN_CLOSE закрытие окна +Значение регистров на входе:
  C=0B1h 
  A - идентификатор окна +Значение регистров на выходе:
  CF=0 - успешное завершение 
  CF=1 - ошибка - неверный идентификатор 
      Окно с номером 0 никогда не закрывается и попытка закрытия приводит к ошибке +0B2h (178) WIN_COPY_WIN Копирование данных текстового окна в память (запоминание окна) 
  При работе этой функции через RST 18h или RST 8, обязателен запрет прерываний, так как функция пользуется стеком для ускорения своей работы. +Значение регистров на входе:
  C=0B2h 
  A - HYPERLINK "" \l "17" идентификатор глобального окна 
  H - размер окна в символах по вертикали 
  L - размер окна в символах по горизонтали 
  D - вертикальное положение окна в глобальном окне 
  E - горизонтальное положение окна в глобальном окне 
  IX - адрес буфера для запоминания данных 
      адрес буфера указывается для окна 0C000h если адрес указан с 8000h, номер страницы буфера не действителен ниже 8000h адрес указывать нельзя
  A' - страница буфера для данных окна 
      эта страница должна принадлежать программе +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка - неверный идентификатор окна +0B3h (179) WIN_RESTORE_WIN Копирование из памяти в текстовое окно (восстановление окна) 
  При работе этой функции через RST 18h или RST 8, обязателен запрет прерываний, так как функция пользуется стеком для ускорения своей работы. +Значение регистров на входе:
  C=0B2h 
  A - HYPERLINK "" \l "17" идентификатор глобального окна 
  H - размер окна в символах по вертикали 
  L - размер окна в символах по горизонтали 
  D - вертикальное положение окна в глобальном окне 
  E - горизонтальное положение окна в глобальном окне 
  IX - адрес буфера для запоминания данных 
      адрес буфера указывается для окна 0C000h если адрес указан с 8000h, номер страницы буфера не действителен ниже 8000h адрес указывать нельзя
  A' - страница буфера для данных окна 
      эта страница должна принадлежать программе +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка - неверный идентификатор окна +0B4h (180) WIN_GET_SYM Взять символ с экрана +Значение регистров на входе:
  C=0B4h 
  A - идентификатор окна 
  DE - положение символа в окне: 
      D - вертикаль, E - горизонталь +Значение регистров на выходе:
  CF=0 - нормальное завершение 
      L - символ, H - атрибут, 
      B - знакогенератор 
  CF=1 - ошибка неверный идентификатор окна +0B5h (181) WIN_PUT_SYM Положить символ на экран +Значение регистров на входе:
  C=0B5h 
  A - идентификатор окна 
  DE - положение символа в окне: 
      D - вертикаль, E - горизонталь 
  L - символ, H - атрибут символа 
  B - знакогенератор +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка неверный идентификатор окна +0B6h (182) WIN_SET_ZG установка знакогенератора +Значение регистров на входе:
  C=0B6h 
  A - системный номер знакогенератора 
  DE - указатель на 2Kb блок данных знакогенератора +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка (старая версия, нет функции) +0B7h (183) WIN_MOVE_WIN Перемещение окна 
  При работе этой функции через RST 18h или RST 8, обязателен запрет прерываний, так как функция пользуется стеком для ускорения своей работы. +Значение регистров на входе:
  C=0B7h 
  A - HYPERLINK "" \l "17" идентификатор глобального окна 
  H - размер HYPERLINK "" \l "15" локального окна по вертикали в символах 
  L - размер локального окна по горизонтали в символах 
  D - положение локального окна по вертикали в символах 
  E - положение локального окна по горизонтали в символах 
  IX - новое положение локального окна (подобно DE) +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка - неверный идентификатор окна +0B8h (184) WIN_GET_ZG Получение знакогенератора +Значение регистров на входе:
  C=0B8h 
  DE - адрес, куда будет загружено 2kb знакогенератора +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка (старая версия, нет функции) +Функции вывода текста на экран +081h (129) LP_PRINT_ALL Печать символов с атрибутом 
  На экран выводится строка из B одинаковых символов +Значение регистров на входе:
  C=081h 
  A - символ 
  E - атрибут 
  B - число выводимых символов 
      регистры HL,IX - сохраняются +Значение регистров на выходе:
  CF=0 - всегда +082h (131) LP_PRINT_SYM Вывод символов на экран без атрибута 
  На экран выводится строка из B одинаковых символов атрибут остается тот, который был на экране +Значение регистров на входе:
  C=082h 
  A - символ 
  B - число выводимых символов 
      регистры HL,IX - сохраняются +Значение регистров на выходе:
  CF=0 - всегда +083h (131) LP_PRINT_ATR печать атрибутов 
  На экран выводится строка из B одинаковых атрибутов. 
  Символы не меняются. +Значение регистров на входе:
  C=083h 
  E - атрибут 
  B - число выводимых символов 
      регистры HL,IX - сохраняются +Значение регистров на выходе:
  CF=0 - всегда +084h (132) LP_SET_PLACE Установка текущего знакоместа в окне 
  Позиция печати устанавливается в соответстии с регистром DE +Значение регистров на входе:
  C=084h 
  E - положение символа по горизонтали 
  D - номер символа по вертикали 
      Превышение границ приводит не к ошибке, а к переустановке сначала, за вычетом полного размера окна +Значение регистров на выходе:
  CF=0 - всегда +085h (133) LP_PRINT_LN Вывод строки символов на экран с текущего знакоместа +Значение регистров на входе:
  C=085h 
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  E - атрибут, с которым будет выведена строка 
  B - длина выводимой строки +Значение регистров на выходе:
  CF=0 - всегда +086h (134) LP_PRINT_LN2 Вывод строки символов на экран без атрибутов +Значение регистров на входе:
  C=086h 
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  B - длина выводимой строки +Значение регистров на выходе:
  CF=0 - всегда +087h (135) LP_PRINT_LN3 Вывод строки символов до разделителя 
  После разделителя выводятся пробелы, что бы вывести B символов +Значение регистров на входе:
  C=087h 
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  E - атрибут, с которым будет выведена строка 
  B - длина выводимой строки 
  D - символ-разделитель, указывающий конец строки +Значение регистров на выходе:
  CF=0 - всегда +088h (136) LP_PRINT_LN4 Вывод строки символов до разделителя, без атрибутов 
  символы из выводятся на экран, пока не встретится символ равный D, далее печатаются пробелы, как дополнение строки до B символов. Атрибуты не изменяются. +Значение регистров на входе:
  C=088h 
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  B - длина выводимой строки 
  D - символ-разделитель, указывающий конец строки +Значение регистров на выходе:
  CF=0 - всегда +089h (137) LP_CLS_WIN Очистка экрана 
  Выполнение произворится выводом пробелов с заданным атрибутом +Значение регистров на входе:
  C=089h 
  DE положение HYPERLINK "" \l "15" локального окна 
  H - размер в символах локального окна по вертикали 
  L - размер в символах локального окна по горизонтали 
  B - атрибут очистки +Значение регистров на выходе:
  CF=0 - всегда +08Ah (138) LP_SCROLL_UD Скроллинг части глобального окна вверх/вниз 
  Скроллируются полные строки глобального окна +Значение регистров на входе:
  C=08Ah 
  B - тип скроллинга: 1 - вверх; 2 - вниз 
  D - начальная строка скроллинга 
  E - число скроллируемых строк +Значение регистров на выходе:
  CF=0 - всегда +08Bh (139) LP_PRINT_LN5 Вывод строки символов на экран до разделителя 
  После разделителя вывод останавливается +Значение регистров на входе:
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  E - атрибут, с которым будет выведена строка 
  B - максимальная длина выводимой строки 
  D - символ-разделитель, указывающий конец строки +Значение регистров на выходе:
  CF=0 - всегда +08Ch (140) LP_PRINT_LN6 Вывод строки символов на экран до разделителя без атрибутов 
  После разделителя вывод останавливается. +Значение регистров на входе:
  C=08Ch 
  HL - адрес строки должен быть между 04000h и 0BFFFh 
  B - максимальная длина выводимой строки 
  D - символ-разделитель, указывающий конец строки +Значение регистров на выходе:
  CF=0 - всегда +08Dh (141) LP_CLS_WIN2 Очистка экрана с указанием символа заполнения +Значение регистров на входе:
  C=08Dh 
  DE положение HYPERLINK "" \l "15" локального окна 
  H - размер в символах локального окна по вертикали 
  L - размер в символах локального окна по горизонтали 
  B - атрибут очистки 
  A - символ очистки +Значение регистров на выходе:
  CF=0 - всегда +08Eh (142) LP_GET_PLACE Получить текущее положение вывода на экран +Значение регистров на входе:
  C=08Eh +Значение регистров на выходе:
  CF=0 - всегда 
  DE - координаты, в которых будет напечатан 
      следующий символ: 
      D - вертикаль, E - горизонталь +Графические функции +0A1h (161) PIC_POINT Установить точку +Значение регистров на входе:
  C=0A1h 
  DE - координата по вертикали (пиксели) 
  HL - координата по горизонтали (пиксели) 
      Координаты считаются от верхнего левого угла экрана 
  A - идентификатор окна 
  B - цвет точки +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - неверный идентификатор окна +0A4h (164) PIC_SET_PAL Установка палитры +Значение регистров на входе:
  C=0A4h 
  HL - HYPERLINK "" \l "18" данные палитры 
  E - номер начального цвета 
  D - количество устанавливаемых цветов 
  B - маска при установке палитры. 
      Для нормального режима должнa быть 0FFh 
  A - номер палитры 0..15; от 8 до 15 - резервные +Значение регистров на выходе:
  CF=0 - всегда +0A6h (166) SET_PAL_INIT Установка внутренней палитры +Значение регистров на входе:
  C=0A6h 
  A - страница палитры 
  B - номер палитры: 
      B=2 - установка спектрумовской палитры 
      B=1 - установка графической плаитры +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - неверный номер палитры +Функции работы с жесткими дисками и дисководами +50h,52h,53h (80,82,83) Зарезервированы +Значение регистров на входе:
  нет +Значение регистров на выходе:
  нет +51h (81) DRV_RESET Сброс контроллера и настройка на диск +Значение регистров на входе:
  C=51h 
  A - номер и HYPERLINK "" \l "22" тип устройства
бит 7..4 - тип устройства:
  #0x - FDD
  #6x - RAM-DISK
  #8x - HDD
  #Cx - CD-ROM
бит 3..0 - номер устройства +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка, нет диска или нет устройства +54h (84) DRV_VERIFY Проверка секторов 
  Проверка внутренняя на совпадение ECC +Значение регистров на входе:
  C=54h 
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) 
  HL:IX - номер сектора (IX - младшая часть номера сектора)
  B - количество проверяемых секторов +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - проверка с ошибкой +55h (85) DRV_READ Чтение с устройства +Значение регистров на входе:
  C=55h 
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) 
  HL:IX - номер сектора (IX - младшая часть номера сектора) 
  B - количество секторов 
  DE - адрес буфера для данных +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка чтения 
  HL:IX - номер сектора + кол-во прочитанных секторов 
  DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) +56h (86) DRV_WRITE Запись на устройства +Значение регистров на входе:
  C=56h 
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) 
  HL:IX - номер сектора (IX - младшая часть номера сектора) 
  B - количество секторов 
  DE - адрес буфера данных для записи +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  CF=1 - ошибка записи 
  HL:IX - номер сектора + кол-во прочитанных секторов 
  DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) +57h (87) DRV_DETECT Определение параметров устройства +Значение регистров на входе:
  C=57h 
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) +Значение регистров на выходе:
  CF=0 - нормальное завершение 
      A - bit7=0 диск 720Кb 
              Bit7=1 диск 1.44Mb 
  CF=1 - нет устройства или нет носителя +58h (88) DRV_GET_PAR Получить параметры носителя +Значение регистров на входе:
  C=58h 
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) +Значение регистров на выходе:
  CF=0 - нормальное завершение 
      L - число секторов 
      H - число головок 
      DE - количество цилиндров 
          если HL=DE=0FFFFh - устройства нет 
      IX - размер сектора в байтах 
      B - доп. параметры для дискет: 
          бит7 - тип 1.44/720 
  CF=1 - нет устройства +59h (89) DRV_SET_PAR Установить параметры носителя +Значение регистров на входе:
  A - номер и HYPERLINK "" \l "22" тип устройства (см. выше) 
  L - число секторов 
  H - число головок 
  DE - количество цилиндров 
  IX - размер сектора в байтах 
  B - доп. параметры для дискет 
      бит7 - тип 1.44/720 +Значение регистров на выходе:
  CF=0 - нормальное завершение +5Ah (90) EXT_VERSION Номер версии дисковой спецификации. +Значение регистров на входе:
  C=5Ah +Значение регистров на выходе:
  CF=0 - нормальное завершение 
  D - версия
  E - модификация
  CF=1 - ошибка +5Fh (95) DRV_LIST Список дисковых устройств +Значение регистров на входе:
  C=5Fh
  IX - буфер для списка устройств +Значение регистров на выходе:
  CF=0 - нормальное завершение 
В буфере список дисков в формате:
IX+0 - размер заполненого буфера
IX+1 - кол-во устройств FDD
IX+2 - кол-во устройств HDD
IX+3 - кол-во устройств CD DRIVE
IX+4 - #00 - конец списка, иначе кол-во устройств нового типа +

Примечания и комментарии. 

Примечание по использованию функции получения адресов портов окон (0C6h). 

Cледует хотя бы один раз вызвать эти функции и сравнить адреса портов с теми, что используются в программе и, если они не совпадают, выдать соответствующее предупреждение. В данный момент эти порты таковы: PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h, PAGE3=0E2h 

Примечание по использованию функции EMM_FN7 (0C7h). 

Информация о распределении памяти хранится в виде RAM Allocation Table, похожей на дисковый FAT. Поэтому нахождение физического номера следующей страницы по предыдущему физическому номеру происходит значительно быстрее, чем поиск по увеличенному на единицу логическому номеру. 

Комментарий к функции FN_VERSION (0EFh). 

Значения регистра BC на выходе и соответствующая ему конфигурация + + BC=FFFF - Не определено + BC=FFFE - Конфигурация Spectrum, режим Sprinter ZX + BC=FFFD - Конфигурация Sprinter + BC=FFFC - Зарезервировано + BC=FFFB - Зарезервировано + BC=FFFA - Зарезервировано + BC=FFF9 - Зарезервировано +Иные значения BC - новые прошивки. 

Комментарий к функциям CMOS (0F5h-0F7h) 

Функции CMOS_RD, CMOS_WR, CMOS_TEST работают всегда. Если в машине нет микросхемы CMOS, то эмулируется ее память. Наличие микросхемы определяется функцией CMOS_TEST.

Комментарий к функции FN_TURBO (08Fh)

Переключение режима турбо может не произойти, если прошивка не поддерживает это переключение. При этом ошибки не происходит. Так же, переключение режима TURBO блокируется кнопкой "Turbo" в режиме Turbo-OFF 

Комментарий к функциям печати текста. 

Эти функции работают с текущим окном, которым всегда является последнее открытое окно. К графическому экрану функции печати текста не применимы.

Описатель окна. 

Для открытия окон используется 32-хбайтовый описатель окна (дескриптор), адрес которого указывается в регистре IX. + + IX - 32-хбайтовый описатель окна + (IX+0) - горизонтальный размер окна в знакоместах + (IX+1) - вертикальный размер в знакоместах + (IX+2) - положение окна по горизонтали на экране в знакоместах + (IX+3) - положение окна по вертикали на экране в знакоместах + (IX+4) - режим знакоместа + bit4=1 - text_mode bit4=0 - graf_mode + bit5=0 - 16, bit5=1 - 8 точек в знакоместе + graf_mode bit3..0 - не существенны + bit7..6 - номер палитры + text_mode bit7..6,3..0 - номер знакогенератора + исключение: bit7..6=B"11" - бордер + (IX+5) - дополнительный режим знакоместа + bit0=1 - указывает на включение спектрумовской + адресации экрана + (IX+6) - положение по X в поле графики (по знакоместам) + (IX+7) - положение по Y в поле графики (по знакоместам) + разъяснения о положении в поле графики - ниже + (IX+8..31) - зарезервировано (переменные окна) + в этих байтах должны быть нули +При открытии окна описатель копируется в системную страницу ОЗУ и программа может не сохранять его. Что бы описатель окна не потерялся, программа получает идентификатор окна. Он же идентификатор глобального окна. В функциях запоминания, восстановления, перемещения, а так же функциях стирания, скроллинга и т.п. идентификатор окна определяет область экрана, относительно которой производится работа с локальными окнами. Подразумеваются локальные окна в смысле "окно в окне". Идентификатор окна определяет глобальное окно, отнoсительно которого адресуются локальные. В части функций глобальное окно определяется по умолчанию, как последнее, с которым производились действия с явным указанием идентификатора.

В данный момент BIOS хранит только один описатель окна - последний, с которым была произведена функция открытия. Идентификатор окна выставляется в 0. В дальнейшем планитруется разработка функций со множеством окон, потому, во избежание неприятностей в будущем, при работе с окнами, программисту следует запоминать идентификатор окна и пользоваться этим значением при работе с ним. 

Типы стандартных окон: + + 0 - окно 32x24 в формате ZX Spectrum + 1 - текстовое окно 64x24 + 2 - текстовое окно 40x32 + 3 - текстовое окно 80x32 + 4 - окно в формате ZX Spectrum, HL - положение окна на экране в знакоместах + 5 - текстовое окно 64x24, HL - положение окна на экране в знакоместах + 6 - текстовое окно 40x32, HL - положение окна на экране в знакоместах + 7 - текстовое окно 80x32, HL - положение окна на экране в знакоместах + 8 - графическое окно 0, HL - положение окна на экране + 9 - графическое окно 1, HL - положение окна на экране +
Данные палитры должны представлять собой список приблизительно такого вида: + + DB blue1,green1,red1,0 + DB blue2,green2,red2,0 + ..................... + DB blueN,greenN,redN,0 +N - количество цветов. Значеное равное 0 соответствует 256-ти цветам. При записи в видео-ОЗУ все данные предварительно проходят функцию AND со значением регистра маски - B.

Страницы палитры 0..3 соответствуют графическим режимам. Для вывода в соответствующей палитре нужно задать соответствующее значение bit7..6 в байте HYPERLINK "" \l "19" режима знакоместа

Страницы 4..7 соответствуют текстовому режиму и спектрумовскому режиму. В странице 4 задается цвет PAPER для каждого атрибута. В странице 5 задается цвет INK для каждого атрибута. В странице 6 задается цвет PAPER, которым он будет моргать в режиме FLASH В странице 7 задается цвет INK, которым он будет моргать в режиме FLASH. Таким образом, для каждого из 256-ти атрибутов задается четыре цвета если цвета 4,5 совпадают с цветами 6,7 то режим FLASH оказывается отключенным. Для его включения в спектрумовском режиме надо поменять местами цвета 6 и 7. Если надо включить FLASH в режим IBM-CGA, следует установить цвета 6 и 7 одинаковыми и равными цвету 4. По сути режим FLASH всегда включен, и на экране постоянно меняются цвета PAPER с 4-го на 6-й, а цвета INK с 5 на 7-й. Если эти пары цветов для атрибута знакоместа устанавливаются одинаковыми, то FLASH в этом месте не виден.


Комментарий к функциям работы с устройствами хранения информации. 

В этих функциях в регистре A обычно задается номер и тип устройства: + + бит 0..3 - номер устройства + бит 4..7 - тип устройства: + 0 - дисковод + 6 - ram-disk + 8 - HDD + C - CD-ROM + остальные номера не используются +А так же задаются: старшая часть номера сектора в регисте HL, младшая часть номера сектора в регистре IX. diff --git a/docs/converted/bugs.txt b/docs/converted/bugs.txt new file mode 100644 index 0000000..f717b6a --- /dev/null +++ b/docs/converted/bugs.txt @@ -0,0 +1,72 @@ + Глюки и недостатки ДОС (Биоса) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Дата последнего редактирования: 27.09.2004 + + + +1. Функция "Сохранить текущий путь" (1Eh) имеет недостаток: + а) При сохранении корневого пути запоминает символ "\". + б) Но в то же время, при сохранении не корневого пути, + не ставит в конце строки символ "\". + У MS-DOS такой же глюк, но это не меняет "погоду" ;). Нужно привести + к какому-то одному формату. + +2. Функция "Закрыть файл" (12h) не закрывает файл, если он расположен + (был открыт/создан) не в тек. пути. Приходится принудительно устанав- + ливать диск и путь расположения закрываемого файла и только после этого + его закрывать ;(. Это происходит из-за того, что DSS текущей реализации + позволяет коppектно pаботать только в пpеделах одного диска. Т.е. пеpед + закpытием файла, текущим диском должен быть тот, где этот файл находится. + Важное замечание: Доработать DSS, чтобы система, в определенных случаях, + не трапалась при переполнении макс. числа (9) открытых дескрипторов. + +3. Функция "Удалить файл" (0Eh) имеет недостаток: + Удаляет файл в тек. каталоге, при формате записи "prog.bin", но не уда- + ляет файл, указанный с диском и путем расположения, например: + "a:\test\prog.bin". + +4. Функции опроса клавиатуры (30h,31h,..) не выдают признак (7,6 биты + регистра "B") нажатия "Shift" для клавиш "Home","End","PgUp","PgDn" и + клавиш управления курсором. У спец. клавиш, признак нажатия "Shift" + (биты 7,6) выдается только для F1..F12. + +5. Не происходит скроллинг экрана, когда идет "переполнение" последней 32-й + строки и 80-й символ - не код завершения строки. Происходит просто пере- + ход в начало первой строки экрана, с продолжением вывода строки (с нало- + жением на старые данные экрана). + +6. Estex не корректно работает с VFAT (которая фактически и используется в + Виндах). Трабл в следующем. Если в имени файла присутствует хотя бы одна + строчная (маленькая) буква, то для такого имени Винда создает в каталоге + две записи: первая для длинного имени, вторая - имя формата 8.3. Т.е. на + одно имя файла в каталоге имеется две записи. Если файл с таким именем + удалить в Estex, то будет удалено (помечено удаленным) только вторая за- + пись файла, имеющая формат 8.3, а первая запись останется не удаленной. + p.s. Эта ошибка легко исправляется нортоновским "ndd" или др. утилитой + проверки логич. структуры диска. + Если имя файла состоит только из одних прописных (больших) букв, то Винда + создает в каталоге лишь одну запись для имени файла (как MS-DOS до v6.22 + включительно). Такой файл корректно удаляется Estex. + Вывод: Для корректного удаления файлов под ОС Спринтера, их имена должны + содержать только прописные буквы. + +7. При включенном в Биосе пункте "System Disk: 1-st FDD" и при отсутствии + дискеты в дисководе, в некоторых случаях не сбрасывается обращение к дис- + ководу. + +8. Нет биосной функции "54h" (DRV_VERIFY) верификации секторов, описанной в + документации. Поэтому она всегда возвращает установленный флаг "Carry". + +9. Доработать функцию "32h" (DSS_ECHOKEY), чтобы нормально мигал курсор. + +10. Функции ДОС 0Ah (Create) и 0Bh (Create new file) перед созданием файла + не проверяют число уже открытых дескрипторов. При переполнении числа + открытых дескрипторов, эти функции все-равно создают запись нового файла + в каталоге, хотя и выдают признак ошибки. + Эти функции также не отслеживают имя файла на недопустимые символы. Если + имя файла содержит недопустимый символ - функции просто "зависают". + Такая ситуация с именами файлов может возникнуть например при автомати- + ческом создании имен. + +11. ДОС (v1.6) корректно выводит максимум 509 записей каталога. diff --git a/docs/im2_isr_design.md b/docs/im2_isr_design.md new file mode 100644 index 0000000..14274f0 --- /dev/null +++ b/docs/im2_isr_design.md @@ -0,0 +1,204 @@ +# IM2 Interrupt Handlers — Design Document + +**Status:** РЕАЛИЗАЦИЯ ОТЛОЖЕНА (до пост-релизной версии). Обязательная фича для v2. + +Этот документ собирает всё, что мы знаем о прерываниях Sprinter и план реализации user-задаваемых ISR через Z80 IM 2 mode. Когда возьмёмся за реализацию — читать этот файл, чтобы не повторять research. + +## Зачем нужны прерывания + +- **Timer ISR (50/60 Hz)** — счётчик кадров, плавная анимация без busy-loop, тайминги +- **Mouse / keyboard async-обработка** — без polling +- **Music playback** — AY-3-8910, COVOX через прерывания +- **Real-time games** — input + game logic + render в interrupt-driven архитектуре + +## Hardware-факты (из docs/converted) + +### Sources of vector 0xFF + +| Источник | Detect bit | Частота | +|---|---|---| +| Frame (screen refresh) | (default if none of below) | 50/60 Hz | +| Keyboard | port `0x19` (COM_A) bit 0 | event-driven | +| CBL/COVOX (sound) | port `0xFE` bit 7 (sample request) | sample-rate-dependent | +| Mouse | — (hardware interrupt not wired) | — | +| ISA | другой vector (configurable) | depends | + +Источники: +- `docs/converted/Forum.txt:956` — кадровые и клавиатурные прерывания приходят с vector 0xFF; различаются по bit 0 порта 0x19. От мыши прерываний нет +- `docs/converted/Forum.txt:758-764` — CBL также vector 0xFF, отличить по bit 7 порта 0xFE +- `docs/converted/IvanMak.txt:1086` — `READ_KBD`: IN(0x19), bit 0 = "байт принят"; затем IN(0x18) = data byte; нужно drain FIFO (до 3 байт) +- `docs/converted/IvanMak.txt:1471` — ВАЖНОЕ ОГРАНИЧЕНИЕ: vector table + ISR + stack ОБЯЗАНЫ быть в области `0x8000..0xBFFF` (window 2). Иначе BIOS будет отключать прерывания на каждой вызове функции + +### Что DSS делает в своём ISR (предположения, требует verification) + +DSS shell имеет свой IM 2 handler: +- Drain'ит keyboard FIFO в свой буфер (читается через ESTEX WAITKEY/SCANKEY) +- Возможно обновляет ESTEX SYSTIME ($21) tick counter +- Возможно poll'ит mouse (хотя hardware-IRQ от mouse нет — может быть software polling) +- Refresh курсора мыши (он же видимый и движется в shell) + +Без chain'инга к DSS: +- Сломается клавиатура (ESTEX kbd functions не получат байты) +- Может сломаться SYSTIME counter +- Может перестать обновляться mouse cursor + +### IM2-трюк + +Стандартная схема для одиночного ISR address: +1. Аллоцировать **257-байтный** буфер заполненный одинаковым байтом `H` +2. Загрузить `I = H` (например `H=0xA3` → table at `0xA300`, обращения `0xA300..0xA400`) +3. При прерывании CPU читает байт по `(I<<8)|v` и следующий +4. Если оба байта = `H` → ISR address = `(H<<8)|H` = `HHHH` +5. По адресу `HHHH` положить `jp real_isr` + +Поскольку для нас интересен только vector 0xFF: read bytes at `(0xA3FF)` and `(0xA400)`. Если table заполнена H=0xA3 — оба байта читаются как 0xA3. ISR_ADDR = `0xA3A3`. По адресу 0xA3A3 кладём 3-байтовый `jp _trampoline`. + +## Предлагаемый дизайн + +### Public API (libc/include/irq.h) + +```c +typedef void (*isr_t)(void); + +int irq_install(isr_t handler); /* 0 OK, -1 error (already installed) */ +void irq_remove(void); + +/* Convenience macros — wrap DI/EI when modifying volatile globals + * shared between main and ISR. */ +#define IRQ_DISABLE() __asm di __endasm +#define IRQ_ENABLE() __asm ei __endasm +``` + +Пример использования: +```c +volatile uint16_t ticks = 0; +void on_tick(void) { ticks++; } + +int main(void) { + irq_install(on_tick); + uint16_t start = ticks; + while (ticks - start < 50) { /* wait 1s */ } + irq_remove(); +} +``` + +### Внутренности + +**Аллокация vector page:** +- Static buffer 513 байт в `_BSS` (sprinter.lib). +- Размер 513 = 256 (выравнивание) + 257 (сама table) — в худшем случае выравнивание тратит 256 байт. +- Внутри буфера ищем 256-byte aligned адрес. SDCC может не поддерживать `__attribute__((aligned(256)))` — придётся через ассемблер с `.area _BSS_ALIGNED` и линкер-флаг для выравнивания, или через runtime поиск aligned position. +- **Alternative:** заранее линкуем vector page по фиксированному адресу через linker flag `-Wl-b_VECTORS=0xA300` (как у банков). Стабильнее. + +**Trampoline в W2:** +- Маленький asm-блок (~50 байт) который: + 1. `ex af,af'; exx; push ix; push iy` — сохранить ВСЕ регистры + 2. `in a, (0xE2); push af` — сохранить current W3 page byte + 3. `in a, (0x19); bit 0, a; jr z, _not_kbd` — keyboard? + - keyboard path: chain to DSS old ISR (jp/call to saved address) + 4. `in a, (0xFE); bit 7, a; jr z, _not_cbl` — CBL? (Phase 2) + 5. Frame path: `ld hl, (user_handler); ld a, h; or l; jr z, _no_user; call hl_indirect` + 6. `pop af; out (0xE2), a` — restore W3 + 7. `pop iy; pop ix; exx; ex af,af'; ei; reti` + +**Где живёт trampoline:** +- Для `tiny` mode: `_CODE` = W2 → естественно +- Для `big` mode: `_CODE` = W2 → естественно +- Для `small`/`huge`: `_CODE` = W1, **но trampoline ДОЛЖЕН быть в W2** (W1 может swap'нуться) +- **Решение:** новая linker area `_TRAMP_W2` с absolute address в W2 (например 0xBE00). sprinter-cc размещает её через `-Wl-b_TRAMP_W2=0xBE00`. trampoline.s помечает себя `.area _TRAMP_W2`. + +**Chain to DSS:** +- В `irq_install`: + ```asm + ld a, i ; A = current vector page high byte + ld (old_I), a + ld h, a + ld l, #0xFF + ld a, (hl) ; A = vector_high (= old_I по trick'у) + ld d, a + ld e, a ; DE = address of DSS's IM2 jp + ld hl, (de) ; HL = DSS's old jp target + ld (dss_old_isr), hl + ``` +- В trampoline keyboard-path: + ```asm + ld hl, (dss_old_isr) + push hl + ret ; jumps to DSS ISR which ends with EI; RETI + ``` +- **Опасность:** DSS's ISR может предполагать что регистры свежие (как только что от CPU) → возможно нужно НЕ saving некоторые регистры до chain'а + +**`irq_remove`:** +- DI +- Restore I to old value +- Restore IM mode (обычно был IM 2 → IM 2; редко IM 1 if shell upgraded) +- Free vector page if dynamically allocated +- EI + +## Ограничения user handler'а + +User's ISR может: +- Читать/писать volatile globals +- Делать дешёвые арифметические операции +- Менять `g_text_attr` (но не вызывать putch/cputs) + +User's ISR НЕ должен: +- Вызывать `printf` / `puts` / `malloc` / любые ESTEX/BIOS функции — они могут не быть re-entrant +- Использовать `gfx_*` — они swap'ят W3, наш trampoline уже сохраняет порт но если внутри ISR будет повторный swap то trampoline не сможет восстановить +- Запускать accelerator (LD D,D и т.д.) — accel меняет систему команд CPU +- Долго работать — ISR должен быть быстрым (< 1ms), иначе пропустим следующий + +## Открытые вопросы + +1. **Что именно DSS делает в своём ISR** — disassemble DSS или вызвать его с инструментировкой +2. **`ld a, i` semantics** на Sprinter — на Z80 P/V flag отражает IFF2; нужно для save/restore +3. **Alignment vector page** — найти SDCC-совместимый способ: либо linker absolute area, либо runtime align внутри 513-байтного буфера +4. **Re-entrancy ESTEX из main во время ISR**: + - Если main вызывает ESTEX и в это время приходит interrupt → DSS chain'инг должен работать корректно (DSS уже спроектирован под IM 2) + - Если main вызывает BIOS (RST 8) — это отключает прерывания на время вызова, OK +4. **Memory budget** — vector page 513 байт в BSS уменьшит heap. В tiny mode с heap ~10KB это ~5%. OK. + +## Phase 1 acceptance + +- `examples/irq_test/` — счётчик тиков растёт с 50 Hz +- Клавиатура продолжает работать через DSS chain (можно прервать тест клавишей) +- Корректный exit — DSS shell получает управление обратно без crash +- Работает во всех memory modes (tiny, small, big, huge) +- Memory note `memory/sprinter_im2_isr.md` с описанием ABI и ограничений + +## Phase 2 (когда понадобится) + +- CBL/COVOX prerequisite handler (для audio playback) +- ISA interrupt handler (для ZX-Bus карт) +- Multiple user handler chain (e.g. tick + sound) + +## Альтернатива: отдельный memory mode "im2" + +Идея: вместо того чтобы крутить trampoline location во всех существующих режимах, сделать **отдельный `--memory im2`** который: +- Forces CODE в W2 (как tiny) +- Reserves определённый адрес в W2 под vector page и trampoline (например 0xBE00..0xBFFF) +- crt0_im2.s ставит IM 2 в начале (заменяет DSS handler с chain) +- crt0_im2.s восстанавливает на exit + +**Плюсы:** +- Меньше matrix-сложности (irq работает только в одном mode) +- Можно агрессивно reserved'ить W2-память +- Тестируется как единое целое + +**Минусы:** +- Программам приходится явно выбирать `--memory im2` для использования прерываний +- Дублирование crt0 и runtime + +Текущее предложение — пойти этим путём (отдельный mode) для v2, не лезть в существующие crt0. + +## Внешние ссылки + +- `docs/converted/IvanMak.txt:1040-1054` — секция 9.3 "Прерывания от ISA" + 9.4 "AT-Клавиатура" +- `docs/converted/IvanMak.txt:1469-1473` — IM 2 ограничения (table/stack/ISR в W2) +- `docs/converted/Forum.txt:758-764` — CBL interrupt discrimination +- `docs/converted/Forum.txt:956` + `:1049` — vector 0xFF disambiguation +- `docs/converted/Parinov.txt:601` — IM 1 alternative (handler по адресу 0x0038, не наш путь) + +## История + +- 2026-06-01 — research собран в этот документ, реализация отложена до v2 diff --git a/docs/memory management b/docs/memory management new file mode 100644 index 0000000..5379221 --- /dev/null +++ b/docs/memory management @@ -0,0 +1,67 @@ + +1) если я и DATA и CODE размещаю в одном окне (W1 - #4000 или W2 - #8000, неважно), +то при вызове set_videomode глобальные переменные (errno, g_text_attr) не меняют +своих значений. +если же DATA и CODE находятся в разных окнах (не важно где DATA - в W1 или W2, главное +что не в том где CODE) - то при вызове se_videomode значения глобальных переменных меняются + +То есть похоже что для DATA не назначается отдельный блок памяти а назначается только для CODE +Это полностью соответствует документации - если приложение менее 16К (как у нас) то ему выделяется +только одна страница. И получается что работа со второй страницей идет несанкционированно (ей память +не выделена). + +Потому предлагается +1) сейчас размещать ВСЕ в одной странице (и DATA и CODE и стек) - в W2. + +2) дальше - добавить в нашу обертку sprinter-cc режимы памяти - +-tiny - все приложение помещается в одну страницу - в W2 (и DATA и CODE и стек) +-small - приложение помещается в две страницы - CODE в W1, DATA и стек - в W2. +в этом режиме над отдельно выделять и маппить страницу в W2 для DATA и стека +-big - DATA, CODE и стек помещаются в одну страницу W2 как в -tiny, добавляется поддержка banked в W1, +страница W3 остается служебной и для работы с граффикой из banked code +-huge - приложение помещается в двух страницах как и -small но так же добавляется поддержка banked но +уже в страницу W3 + +Из документации - + + > Теперь адресса #4000..#7FFF,#8000..#BFFF,#C000..#FFFF, когда ДСС + передаёт управление эти прогораммам, какие банки там нахадятся по + умолчанию? + + В зависимости от адреса загрузки и размера приложения DSS выделяет + необходимое число страниц памяти. Так при размере меньше 16К будет + выделена + одна страница, при размере больше 16К - две, и т.д. В окна с + "неиспользуемым" адресном пространством будет подключатся + специальная страница #FF.Если приложению требуется памяти больше чем + зарезервировано в exe-файле, оно должно выделить себе дополнительный + блок памяти самостоятельно. + + + > В конфигурации спринтер + > по #0000..#3FFF, при работе ДСС находится сама ДСС с её Резетами, + > чтоб использывать когда сюда подставленна страница пользователся + > резеты не доступны!. + + Это так в нижних 16K находится DSS / BIOS в остальных 48К + приложение, но с + определенными особенностями. Стек не должен быть выше #BFFF при + вызове DSS и ниже #8000 при вызове некоторых функций BIOS. + + +Так же посмотри вот сюда - возможно нам придется для режимов -small и -huge делать свой первичным загрузчиком - +Из документации - + + Выполнение EXE-файла осуществляется по следующим пунктам: + 1) Открывает exe-файл на чтение; + 2) Считывает в рабочую область префикс exe-файла; + 3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного + загрузчика, если его размер не равен нулю; + 4) Сохраняет стек; + 5) Подключает страницы из выделенного блока; + 6) Строит префикс запуска программы и устанавливает на него регистр IX; + 7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения кода в + памяти); + 8) Закрывает exe-файл, если это не первичный загрузчик; + 9) Устанавливает стек равным значению из смещения 20 (Адрес расположения стека); + 10) Передает управление по адресу указанному в смещении 18 (Адрес запуска); diff --git a/docs/part2/BIOS functions.a80 b/docs/part2/BIOS functions.a80 new file mode 100755 index 0000000..3266bc7 --- /dev/null +++ b/docs/part2/BIOS functions.a80 @@ -0,0 +1,1387 @@ +; Sprinter. + +; Функции BIOS. + +; Вызов функций производится через вход в TR-DOS #3D13. Номер команды +; задается в регистре C. Установленный на выходе флаг C означает завершение +; работы функции с ошибкой. +; При работе части функций биоса необходимо что бы стек находился в +; области #8000..#BFFF, так как они используют для своей работы переключение +; страниц PAGE1 и PAGE3. Для устранения каких либо неприятностей связанных со +; стеком его следует всегда устанавливать в этот диапазон при вызове функций +; биоса Спринтера. + +; Вызов функций биос так же может быть осуществлен через вход по +; RST #18 при подключенном системном ПЗУ, а так же через RST 8 при +; подключенном ОЗУ в нулевой банке путем установки на адрес RST 8 небольшой +; программы, переключающейся в ПЗУ биоса + +; Для подключения системного ПЗУ можно воспользоваться такой +; последовательностью команд: + DI + LD A,0 + OUT (#7C),A +; после этого в 0-м адресе будет включена ПЗУ биоса +; и программа может вызывать функции через RST #18, +; просто заменяя этим вызовом вызов CALL #3D13 +; * Обычные функции TR-DOS в этот момент недоступны + +; Чтобы вернуться к обычному ПЗУ следует выполнить программу: + LD A,0 + OUT (#3C),A + +; Вызов из ОЗУ осуществляется через RST 8. При этом на адресе 8 должна +; располагаться такая программа: + PUSH AF + LD A,0 + OUT (#7C),A ; в этом месте вместо ОЗУ подключится ПЗУ биоса и + ; программа уйдет в него. + POP AF ; На эту команду происходит возврат при таком + ; вызове биоса. + RET +; Оптимизация кода в этом месте недопустима. Вместо LD A,0 можно установить +; две команды XOR A и DI +; Далее вызов функций осуществляется аналогично RST #18, но следует помнить, +; что адресное пстранство 0000..#3FFF во время работы биоса занято ПЗУ и в нем +; не могут располагаться данные для работы функций. + +; Вызов новых функций через #3D13 автоматически отключает прерывания. +; После исполнения функции программа должна включить их при необходимости. +; Если необходимо что бы прерывания были включены все время, следует +; использовать режим IM 2, с таблицей, стеком и обработчиком расположенным в +; области #8000..#BFFF и пользоваться вызовом через RST #18 или RST 8 +; В этом случае прерывания в биосе не отключаются. + +; В ближайшее время в описание биоса будут добавлены функции работы с FDD и +; CD-ROM +; * В данный момент они имеются, но предполагается их серьезная переделка. +; Некоторые функции зарезервированы для дальнейшего развития. Так же не +; описана часть графических функций, так как они в данный момент подвергаются +; серьезным переделкам. + +;============================================================================== +; 1. Работа с памятью. +;============================================================================== +EMM: +.GetMemSize: ; определение объемов ОЗУ + LD C,#C0 ; функция номер #C0 + RST ToBIOS ; HL - общий объем памяти в страницах по 16kb + ; BC - объем свободной памяти в страницах по 16kb +; + +.InitMem: ; инициализация распределения памяти + ; стирается вся информация о выделенных ранее блоках + ; ОЗУ. Устанавливаются как занятые блоки с + ; системной информацией, а так же первые 256kb ОЗУ ;!FIXIT + LD C,#C1 ; номер функции + RST ToBIOS ; выходных параметров нет +; + +.GetMem: ; выделение блока ОЗУ + LD B,num_pages ; запрашиваемое число страниц ОЗУ + LD C,#C2 ; номер функции + RST ToBIOS ; NC -> А - идентификатор блока + ; CF -> A=1 - нет памяти +; + +.FreeMem: ; освободить блок ОЗУ + LD A,id_blk ; идентификатор блока + LD C,#C3 ; номер функции + RST ToBIOS ; NC - нормальное завершение + ; CF - неверный идентификатор блока + ; правильность идентификатора отслеживается не всегда +; + +.GetMemPage: ; получить физический номер страницы из блока + LD A,id_blk ; идентификатор блока + LD B,page ; логическая страница в блоке + LD C,#C4 ; номер функции + RST ToBIOS ; NC -> А - физический номер страницы + ; CF -> А=0 - нет такого блока, A=FF - конец блока +; + +.GetMemBlkPages:; получить список физических страниц блока + LD A,id_blk ; идентификатор блока + LD HL,bufer ; буфер длиной 256 байт для размещения списка + ; буфер должен быть длиной на единицу больше числа + ; страниц в блоке + LD C,#C5 ; номер функции + RST ToBIOS ; NC -> HL - тот же буфер, B - число страниц в блоке, + ; данные по адресу HL - список физических страниц по + ; порядку. Список заканчивается байтом FF + ; CF -> неверный идентификатор блока. Старая + ; информация в буфере может быть затерта +; + +.GetBanksPorts: ; Получение адресов портов окон + LD A,win_num ; номер окна проецирования 0,1,2 или 3 + LD C,#C6 ; номер функции + RST ToBIOS ; NC -> C - 8-мибитный адрес порта, B - номер + ; подключенной в данный момент страницы ОЗУ + ; CF -> ошибка номера окна +; Функция фактически не используется в данный момент. Адреса портов окон +; не изменялись с самого начала разработки компьютера и, надеюсь, не будут +; меняться. Для соблюдения приличий программисту следует хотя бы один раз +; вызвать эти функции и сравнить адреса портов с теми, что используются в +; программе и, если они не совпадают, выдать соответствующее предупреждение. +; В данный момент эти порты таковы: PAGE0=#82, PAGE1=#A2, PAGE2=#C2, PAGE3=#E2 +; + +.GetMemPageNext:; получить следующую страницу блока по предыдущему + LD A,page ; физическая страница блока + LD C,#C7 ; номер функции + RST ToBIOS ; NC -> A - следующая физическая страница блока + ; A=FF - индицирует конец блока + ; CF -> ошибка номера страницы +; Информация о распределении памяти хранится в виде RAM Allocation Table, +; похожей на дисковый FAT. Поэтому нахождение физического номера следующей +; страницы по предыдущему физическому номеру происходит значительно быстрее, +; чем поиск по увеличенному на единицу логическому номеру. +; + +.MergeMemBlocks:; слияние блоков + LD A,id_blk1 ; блок номер 1 + LD B,id_blk2 ; блок номер 2 + LD C,#9E ; номер функции + RST ToBIOS ; NC -> A - блок результата + ; CF -> ошибка, неверный номер блока +; + +.DivMemBlocks ; разделение блока + LD A,id_blk1 ; блок + LD B,len_blk ; новая длина блока + LD C,#9D ; номер функции + RST ToBIOS ; NC -> A - блок результата, B - блок остатка + ; CF -> ошибка, неверный номер блока +; + +;============================================================================== +; 2. Работа с блоками как с RAM-Disk-ами +;============================================================================== + +.GetMemRMD: ; Получить блок памяти N bytes для RAM-Disk'а + LD A,ram_disk ; номер RAM-Disk-а 0..15 + LD B,ram_blocks; число необходимых блоков + LD C,#92 ; номер функции + RST ToBIOS ; NC -> L, A - КЛЮЧ RAM-Disk'а + ; CF -> ошибка, + ; A - код ошибки: 1 - нет памяти + ; 2 - RAM-Disk занят +; + +.FreeMemRMD: ; Освободить блок памяти для RAM-Disk'а + LD A,ram_disk ; номер RAM-Disk'а 0..15 + LD C,#93 ; номер функции + RST ToBIOS ; NC - нормальное завершение + ; CF - ошибка, А=0 - нет такого блока, A=2 - ошибка цепочки +; + +.GetMemPageRMD: ; Получить физический номер страницы RAM-Disk'а + LD A,ram_disk ; номер RAM-Disk'а 0..15 + LD B,page ; логическая страница RAM-Disk'а + LD C,#94 ; номер функции + RST ToBIOS ; NC -> А - физический номер страницы + ; CF -> А=0 - нет такого блока, A=FF - конец блока +; + +.CheckInit: ; Если обнаружен первый старт, то инициализация всей памяти, системных переменных + LD C,#97 ; номер функции + RST ToBIOS ; +; + +RAMD_CALC_PAGE: ; Вычисление страницы и адреса в RAM-Disk по абсолютному номеру сектора + LD A,ram_disk ; номер RAM-Disk'а 0..15 + LD DE,sector ; абсолютный номер сектора + LD C,#98 ; номер функции + RST ToBIOS ; A - страница, HL - адрес в странице +; + +.FullInit: ; инициализация всей памяти, системных переменных + LD C,#9F ; номер функции + RST ToBIOS ; +; + +BLK_RD_WR: ; чтение/запись из/в блок(а) памяти секторами + ; по 256 байт (в случае с ROM диском можно по 512) + LD HL,bufer ; адрес буфера данных + LD DE,sector ; абсолютный номер сектора (считать по 256b сектор) + LD B,sec_num ; число секторов + LD A,id_blk ; идентификатор блока (для rom disk размер сектора: 1 - 256b, 2 - 512 b) + LD A',command ; команда 0 - чтение, #FF - запись, #46 чтение из ROM-Disk + LD C,#C8 ; номер функции + RST ToBIOS ; NC -> нормальное завершение + ; CF -> ошибка идентификатора +; + +BLK_TO_RAMD: ; назначить блок памяти RAM-Disk-у + ; любой блок памяти может содержать данные + ; RAM-Disk-а в формате TR-DOS для подключения этих + ; данных в качестве диска и служит эта функция + LD A,ram_disk ; номер RAM-Disk-а 0..15 - соответствует + ; RAM-Disk-ам от e: до t: + LD B,id_blk ; идентификатор блока + LD C,#C9 ; номер функции + RST ToBIOS ; NC -> нормальное завершение + ; CF -> ошибка: неверный номер RAM-Disk-а или RAM-Disk занят +; + +RAMD_CLEAR: ; освободить RAM-Disk + ; освобождение RAM-Disk-а не есть освобождение + ; блока ОЗУ. Это просто отключение блока ОЗУ от + ; RAM-Disk-а + LD A,ram_disk ; номер RAM-Disk-а - 0..15 + LD C,#CA ; номер функции + RST ToBIOS ; NC -> нормальное завершение, B - идентификатор + ; блока отключенного от RAM-Disk-а + ; CF -> ошибка: неверный номер RAM-Disk-а или + ; RAM-Disk был свободен +; + +GET_RAMD_ST: ; получение идентификатора блока, назначенного на + ; RAM-Disk + LD A,ram_disk ; номер RAM-Disk-а 0..15 + LD C,#CE ; номер функции + RST ToBIOS ; NC -> A - идентификатор блока. + ; A=0 - блок не назначен. + ; CF -> ошибка номера RAM-Disk-а +; + +GET_RAMD_NUM: ; получить номер RAM-Disk-а (0..15) по его block id + LD A,id_blk ; идентификатор блока + LD C,#9B ; номер функции + RST ToBIOS ; NC -> A - номер RAM-Disk-а (0..15). + ; CF -> ошибка в идентификаторе блока или биос ниже 2.55 +; +; [x] 4/11/23 +SWAP_RAM_DRIVES:; поменять местами ID RAM драйвов (ZX/Sp) + LD B,func ; 0 - swap to Sp, #FF - swap to ZX, #FE - no swap, only get info + LD C,#9C ; номер функции + RST ToBIOS ; A - current RAM Drives set +;============================================================================== +; 3. Управление назначением на дисководы +;============================================================================== + +; Каждый из 4-х дисководов TR-DOS может быть переназначен для работы +; с RAM-Disk-ами, винчестером и реальными дисководами. +SET_DISK_REDIR: ; установить на текущий драйв переназначение (старая функция для TR-DOS!) + LD E,drv_type ; физический тип и номер устройства + LD C,#99 ; + RST ToBIOS ; NC -> нормальние завершение. +; + +GET_DISK_REDIR: ; получить тип назначения на текущий драйв (старая функция для TR-DOS!) + LD C,#9A ; номер функции + RST ToBIOS ; NC -> нормальние завершение. A - тип назначения + ; A=0..3 - назначен реальный дисковод A:, B:, C:, D: + ; A=4..19 - назначен RAM-Disk, A = ram_disk + 4 + ; A=#40..#4F - назначен винчестер (#40+hdd_drive) +; + +RAMD_TO_DRV: ; назначение RAM-Disk на дисковод. + LD A,ram_disk ; номер RAM-Disk-а + LD B,drive ; номер дисковода 0..3 - соответствует дисководам + ; A:, B:, C:, D: + LD C,#CB ; номер функции + RST ToBIOS ; NC -> нормальние завершение + ; CF -> ошибка: неверный номер драйва или рамдиска +; + +FDD_TO_DRV: ; назначение реального дисковода + LD А,disk_drive; номер физического дисковода 0..3 + LD B,drive ; номер драйва 0..3 + ; Номер физического дисковода и номер драйва должны + ; совпадать, так как компьютер не имеет + ; электрической схемы переключения дисководов на + ; разные буквы. В будущих версиях железа, возможно, + ; это появится. + LD C,#CC ; номер функции + RST ToBIOS ; NC -> нормальние завершение + ; CF -> ошибка: неверный номер драйва или дисковода +; + +HDD_TO_DRV: ; назначение винчестера на дисковод + LD A,hdd_drive ; Номер винчестера. + ; различных разделов и master/slave + LD B,drive ; номер драйва 0..3 + LD C,#CD ; номер функции + RST ToBIOS ; NC -> нормальние завершение + ; CF -> ошибка: неверный номер драйва или винчестера +; + +GET_DRV_ST: ; получить тип назначения на драйв ; !TODO проверить + LD A,drive ; номер драйва 0..3 + LD C,#CF ; номер функции + RST ToBIOS ; NC -> нормальние завершение. A - тип назначения + ; A=0..3 - назначен реальный дисковод A:, B:, C:, D: + ; A=4..19 - назначен RAM-Disk, A = ram_disk + 4 + ; A=#40..#4F - назначен винчестер (#40+hdd_drive) + ; CF -> ошибка номера драйва +; + +;============================================================================== +; 4. Функции управления железом и определение версии. +;============================================================================== + +;!TODO +FN_SEND_BYTE + LD C,#E8 + RST ToBIOS +; +;!TODO +FN_RESEIVE_B + LD C,#E9 + RST ToBIOS +; +;!TODO +FN_KBD_OUT + LD C,#EA + RST ToBIOS +; + +FN_CRIPT + LD B,func ; 1: HL - ROM_NUMBER part1 +; A - ROM_NUMBER part2 +; BC - BoardID start +; DE - BoardID end +; [x] 28/01/2024 +; ; 2: HL - адрес буфера для названия чипа (текст). максимум 5 байтов, заканчиваются нулём + LD HL,buff ; CF = 0: +; ; A: 0 - K30, 1 - K50, остальное в резерве на будущее +; ; DE: версия битстрима + LD C,#ED + RST ToBIOS +; + +RST_CONF.AY8910:; переключение в конфигурацию Spectrum. AY8910 + LD C,#EE ; номер функции + RST ToBIOS ; NC -> нормальное завершение + ; CF -> функция не исполнена, фатальная ошибка + ; машину следует перезапустить по RESET +; + +FN_VERSION: ; выдача информации о версии биоса и железа + LD HL,bufer ; буфер, куда будет помещена ASCIIZ строка с + ; названием и номером версии, конец строки отмечен + ; нулем. + LD C,#EF ; номер функции + RST ToBIOS ; NC -> HL - тот же буфер с записанной строкой: + ; "название прошивки | Sprinter | версия_конфы" + ; A - число полей строки в буфере HL + ; DE - версия биоса + ; BC - версия железа (;!TODO тут выдаётся CONFIG_BYTE) + ; BC=#FFFF - not identifyed + ; BC=#FFFE - Sprinter-1 + ; BC=#FFFD - Sprinter-2 + ; BC=#FFFC - Spectrum + AY8910 + ; BC=#FFFB - Game-1 + ; BC=#FFFA - Video-1 + ; BC=#FFF9 - DooM + ; BC=#FEFF - Sprinter 2000 + ; Иные значения BC - новые прошивки + ; версия железа выдается только + ; в биосах версий 1.16 и выше + ; CF -> ошибка. Очень старая версия, не имеющая + ; данной функции +;!!!!! Старая версия выдавала: +; ; L - первые 4 бита - биты порта All_Mode. +; ; в FN есть такой код: +; + ; LD A,%0000'1101 ; нужные биты для порта All_Mode + ; AND L + ; SUB %0000'1101 + ; JR Z,InitVM1 + ; IN A,(SCREEN_SWITCH) + ; PUSH AF + ; LD C,BIOS.RST_CONF.SP97_2 + ; RST ToBIOS + ; SUB A + ; OUT (BORDER),A + ; POP AF + ; OUT (SCREEN_SWITCH),A +; + + +;!FIXIT +RST_CONF.SP97_1:; переключение в конфигурацию Sprinter-1. SPRINTER_1 + LD C,#F0 ; номер функции + RST ToBIOS ; NC -> нормальное завершение + ; CF -> функция не исполнена, фатальная ошибка + ; машину следует перезапустить по RESET +; + +;!FIXIT +RST_CONF.SP97_2:; переключение в конфигурацию Sprinter-2. SPRINTER_2 + LD C,#F1 ; номер функции + RST ToBIOS ; NC -> нормальное завершение + ; CF -> функция не исполнена, фатальная ошибка + ; машину следует перезапустить по RESET +; + +RST_CONF.CUSTOM:; переключение конфигурации пользователя. SPRINTER_ALL + LD A,page_cnf ; страница с файлом прошивки для ПЛМ EPF10K10 + ; страница не может иметь номер больше 127 + ; Файл прошивки, естественно должен быть уже + ; загружен в эту страницу + LD B,ramblk ; [x] при A = #FE перезаливка конфы с возвратом. B указывает на RAM Block ID с битстримом для загрузки, если B=0, то загрузка из ROM + ; [x] при A = #FD происходит реинит. Аксель включается и тд... можно напихать туда ещё что-нибудь + ; [x] при A = #FC софт-ресет с возвратом + ; [x] при A = #FB установка перехватчика софт-ресета, DE - адрес процедуры + ; [x] при A = #FA установка перехватчика хард-ресета, DE - адрес процедуры, B - RAM_BLK_ID с конфой, либо 0, если из пзу + LD C,#F3 ; номер функции + RST ToBIOS ; NC -> нормальние завершение + ; CF -> функция не исполнена, фатальная ошибка + ; машину следует перезапустить по RESET +; + +; ; [x] free zx pages +GOTO_SPEC: ; Вход в режим спектрума +; Вход: D: 0 - BASIC 128, 1 - BASIC 48, 2 - TR-DOS 128, +; 3 - EXPANSION. C закрытыми 128-ми портами: +; 4 - TR-DOS, 5 - BASIC 48 +; E: значение для SYS_PORT/CNF_PORT +; L: Block_ID.vROM +; H: Block_ID.vRAM +; B: Port All Mode +;A [1..0]: 1 - int scorp, 2 - int pent, 3 - int ZX +; A'[2]: 0 - set default palette, 1 - don't change palette +; A'[7]: 0 - 320, 1 - 312 строк + LD C,#FB + RST ToBIOS +; + +REINIT: ; [x] Сброс, перезагрузка, рестарт, очистка памяти с восстановлением ZX pages ; [ ] free zx pages! + LD B,res_type ; 1 - рестарт, 2 - soft reset, 3 - hard reset. 4 - clear RAM except zx pages + LD C,#FD ; номер функции + RST ToBIOS ; CF -> функция не исполнена, возможные причины: + ; - некорректное значение res_type + ; - одна из ZX страниц занята (при res_type=4), + ; тогда под zx отдастся только часть страниц + ; - старая версия BIOS +; + +;[x] +FN_SYNC: ; установка синхронизации, очистка режима экрана, установка задержек + ; функция может быть отнесена и к группе функций + ; вывода на экран, так как полностью очищает + ; страницы режима экрана. На всем экране остается + ; только бордюр + LD A,sync_mode ; режим синхронизации + ; Reg A bit7 = 0 - режим очистки экрана и установки INT: + ; A = 0: режим по умолчанию - используется для очистки + ; страниц режима (отключения вывода всех окон) + ; A = 1: режим Scorpion - 312 строк в экране, + ; положение INT-а, как в Scorpion-256 + ; A = 2: режим Pentagon - 320 строк в экране, + ; положение INT-a как в Pentagon-128 + ; A = 3: режим Spectrum + ; положение INT-a как в оригинальном ZX Spectrum + ; A = 4: установка INT из настроек пользователя в CMOS + ; A = 5: установка INT из таблицы пользователя + ; указатель в IX, данные в SLOT1..2 + ; + ; Reg A bit7 = 1 - режим установки вертикальной синхронизации и/или wait: + ; bit1,bit0: + ; %00 - синхра выставляется из системной переменной + ; %01 - синхра выставляется из CMOS + ; %10 - синхра 320 lines 49 Hz + ; %11 - синхра 312 lines 50 Hz + ; bit2: + ; %0 - игнорировать bit1..bit0 + ; %1 - не игнорировать bit1..bit0 + ; bit3: + ; %0 - no waits (port all_mode bit2 set) + ; %1 - original waits (port all_mode bit2 res) + ; bit4: + ; %0 - игнорировать bit3 + ; %1 - не игнорировать bit3 + ; bit5,bit6 - reserved ;!TODO use for HOLD port? + ; + LD C,#F2 ; Номер функции + RST ToBIOS ; NC -> нормальное завершение + ; CF -> неверный номер режима синхронизации +; изменение режима синхронизации может привести к временному сбою +; синхронизации монитора. + +; !TODO подробное описание +DCP_CONFIG: ; [x] функция управления дешифратором портов. + ;A - если ноль, то вызов функции переинициализации портов PORTS_INIT + ;HL - адрес + ;DE - маска - 0 изменяемые биты, 1 неизменяемые + ;B - порт + ;C - #F4 номер функции +; Функция позволяет открывать/закрывать дополнительные порты компьютера. +; + +; Функции SET_PORTS и READ_PORTS позволяют иметь доступ +; к любым портам компьютера независимо от того, открыты они или нет. +; С помощью этих функций возможно прочитать содержимое портов 1FFD и +; 7FFD, например, а так же установить нужные значения в закрытые системные +; порты. Порты User-а позволят эмулировать некоторые устройства, +; отсутствующие в Спринтере, а так же могут дать особый способ +; передачи данных между программами, минуя ОЗУ. + +; +SET_PORTS: ; глобальная установка портов. + LD A,port_num ; внутренний номер порта + ; F0..FF - страницы Scorpion 0..15, подключаемые в + ; адрес #C000, страница именно та, которая + ; подключена в данный момент через 7FFD,1FFD + ; E0=EXPANSION, Е1=TR-DOS, E2=BASIC-128, E3=BASIC-48 + ; E4=EXPANSION',Е5=TR-DOS',E6=BASIC-128',E7=BASIC-48' + ; E8=RAM0, E9=RAM1, EA=RAM2, EB=SYS0, EC=CASH + ; ED,EE - reserv, EF=SYS1 + ; C0=COPY_1FFD, C1=COPY_7FFD, C2=COPY_BRD, C3-reserv + ; C4-reserv, C5=COPY_V_MODE, C6=COPY_SYS, C7-reserv + ; C8..CF - альтернативный набор для C0..C7 + ; D0..DF-reserv - доп. страницы для Pentagon-512 + ; 80..BF-user_ports! + ; 00..7F-внешние порты, использовать не рекомендуется + LD B,port_data ; данные, записываемые во внутренний порт + LD C,#F8 ; номер функции + RST ToBIOS ; B - предыдущее содержание порта +; + +; [x] 26/01/2024 добавлена. +READ_PORTS: ; глобальное чтение портов + LD A,port_num ; внутренний номер порта + LD C,#F9 ; номер функции + RST ToBIOS ; B - содержание порта +; + +; [x] 26/01/2024 процедура дублирует функционал SET_PORTS. Убрана. +;WRITE_PORTS: ; глобальная запись портов +; LD A,port_num ; внутренний номер порта +; LD B,data_port ; записываемые данные +; LD C,#FA ; номер функции +; RST ToBIOS ; +;;; + + +CMOS_RD: ; читать из регистра CMOS + LD D,cmos_reg ; номер регистра CMOS + LD C,#F6 ; номер функции + RST ToBIOS ; NC - часы есть + ; CF - часов нет + ; A - значение ячейки +; + +CMOS_WR: ; писать в регистр CMOS + LD D,cmos_reg ; номер регистра CMOS + LD A,Value ; значение + LD C,#F7 ; номер функции + RST ToBIOS ; NC - часы есть + ; CF - часов нет +; Функции CMOS_RD,CMOS_WR работают всегда. Если в машине нет микросхемы CMOS, +; она эмулируется. Наличие микросхемы определяется функцией CMOS_TEST. +; + +CMOS_TEST: ; проверить наличие CMOS + LD C,#F5 ; номер функции + RST ToBIOS ; NC - часы есть + ; CF - часов нет +; + +FN_TURBO: ; функция управления турбо режимом и плотностью ВГ93 + LD A,turbo_mode; режим турбо: 2 - off, 3 - on + ; плотность ВГ93: 18 - 720, 19 - 1440 + LD C,#8F ; номер функции + RST ToBIOS ; NC -> исполнение + ; CF -> неверный режим турбо +; * переключение режима турбо может не произойти, если прошивка не +; поддерживает это переключение. При этом ошибки не происходит. +; + +;============================================================================== +; 5. Функции печати и управления режимом экрана. +;============================================================================== + +;!TODO Графические функции +;-----------------------; +;PIC_FN0 ; #A0 ОТКРЫТИЕ ОКНА +;PIC_FN1 ; #A1 ВЫВЕСТИ ТОЧКУ +;PIC_FN2 ; #A2 ВЫВОД ЛИНИИ COPY +;PIC_FN3 ; #A3 ВЫВОД ЛИНИИ FILL +;PIC_FN4 ; #A4 ВЫВОД ПАЛИТРЫ ;!FIXIT установка палитры +;PIC_FN5 ; #A5 УСТАНОВКА SCREEN_SWITCH +;PIC_FN6 ; #A6 A - page_pal, E - номер палитры, B - тип палитры +;PIC_FN7 ; #A7 Рисование линии одного цвета +;PIC_FN8 ; #A8 Рисование разноцветной линии +;-----------------------; + +WIN_OPEN: ; функция открытия окна. + LD IX,win_descriptor ; описатель окна + ; IX - 32-хбайтовый описатель окна + ; (IX+0) - горизонтальный размер окна в знакоместах + ; (IX+1) - вертикальный размер в знакоместах + ; (IX+2) - положение окна по горизонтали на экране + ; (IX+3) - положение окна по вертикали на экране + ; (IX+4) - режим знакоместа + ; bit4=1 - text_mode bit4=0 - graf_mode + ; bit5=0 - 16, bit5=1 - 8 точек в знакоместе + ; graf_mode + ; bit7..6 - номер палитры + ; bit3..0 - не существенны + ; text_mode + ; bit7..6,3..0 - номер знакогенератора + ; исключение: bit7..6=B"11" -> бордер + ; (IX+5) - дополнительный режим знакоместа + ; bit0=1 - указывает на включение спектрумовской + ; адресации экрана + ; (IX+6) - положение по X в поле графики (по знакоместам) + ; (IX+7) - положение по Y в поле графики (по знакоместам) + ; разъяснения о положении в поле графики - ниже + ; (IX+8..31) - зарезервировано (переменные окна) + LD E,win_flag ; флаги окна: + ; бит 0 - указывает какую страницу режима включать + ; после исполнения функции. bit0=0 - экран 0, bit0=1 - экран 1 + ; бит 4 - указывает на какой странице режима + ; открывать окно. bit4=1 - экран 0, bit4=0 - экран 1 + ;LD HL,win_place ; HL - место на экране по знакоместам (копия в IX+2,3), + ; в новых версиях биоса значение HL не существенно + LD C,#B0 ; номер функции + RST ToBIOS ; NC -> A - номер окна + ; CF -> ошибка слишком много окон + LD (id_win),A ; сохранить идентификатор окна + +; * При открытии окна описатель копируется в системную страницу ОЗУ и +; программа может не сохранять его. +; ** В данный момент идентификатор окна всегда равен 0 + +; Видео-ОЗУ Спринтера можно представить как одно сплошное поле графики +; размером 1024 точки по горизонтали на 256 точек по вертикали +; Положение в поле графики показывает где будет находиться в этом поле +; верхний левый угол окна. Положение исчисляется в знакоместах. Т.е. +; Если указано положение по X - 2, по Y - 6, это означает, что верхний угол +; окна будет расположен по координатам X=16, Y=48 в поле графики видео-ОЗУ +; Таким образом, если, например, открыть два окна в разных местах, но с +; одинаковыми координатами в поле графики, на экране окажутся два +; идентичных окна, данные в которые будут попадать одновременно. + +; Знакогенераторы текстовых режимов так же располагаются в видео-ОЗУ и +; имеют конкретные адреса в поле графики. При необходимости иметь на экране +; как графическое, так и текстовое изображение надо следить, что бы +; данные графических окон не попадали в поле графики, где расположены +; знакогенераторы + +; При использовании какого либо знакогенератора, он занимает часть поля +; графики по координатам +; (координаты в знакоместах, т.е. в значениях байта IX+6 описателя окна) +; X = (8 * ( bit3..0 режима ))..(8 * ( bit3..0 режима ) + 7) +; По Y занимаются все положения. +; Таким образом, при использовании нескольких знакогенераторов сначала +; следует использовать знакогенераторы с номерами меняющимися в Bit7..6, +; так как они попадают в одни и те же координаты поля графики + +; При открытии графических окон следует помнить, что в этот момент +; информация текстового экрана находящаяся в этом месте будет утеряна. +; При открытии текстового окна изменяется информация только в поле графики +; знакогенератора соответствующему этому текствовому экрану. Если эта +; информация и информация графического окна не пересекались, то при +; повторном открытии графического экрана, на нем автоматически +; восстановится графическая картинка +; + +WIN_CLOSE: ; закрытие окна + LD A,(id_win) ; идентификатор окна (пока должен быть 0) + LD C,#B1 ; номер функции + RST ToBIOS ; NC -> успешное завершение + ; CF -> ошибка - неверный идентификатор + ; Окно с номером 0 никогда не закрывается и попытка + ; закрытия приводит к ошибке + + +LP_OPEN_S: ; Открытие стандартных окон. + LD E,win_flag ; флаги окна + ; bit 0 определяет страницу режима, которая будет + ; открыта после исполнения функции + LD B,win_type ; тип открываемого окна: + ; 0 - спектрумовское окно 32x24 + ; 1 - текстовое окно 64x24 + ; 2 - текстовое окно 40x32 + ; 3 - текстовое окно 80x32 + ; 4 - спектрумовское окно, HL - положение окна + ; 5 - текстовое окно 64x24, HL - положение окна + ; 6 - текстовое окно 40x32, HL - положение окна + ; 7 - текстовое окно 80x32, HL - положение окна + ; 8 - графическое окно 0, HL - положение окна + ; 9 - графическое окно 1, HL - положение окна + LD HL,win_place; положение окна для 4..9 типов + LD C,#80 ; номер функции + RST ToBIOS ; выполнить функцию +; ** Функция старая, использовать не рекомендуется. + +; Далее, в функциях запоминания, восстановления, перемещения и стирания +; подразумеваются локальные окна в смысле "окно в окне". Идентификатор окна +; относится к глобальному окну, отнисительно которого адресуются локальные +; + +WIN_COPY: ; копирование данных текстового окна в память + ; запоминание окна + LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0) + LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь + LD L,hor_size ; размер в символах + LD D,ver_place ; DE - положение локального окна в глобальном окне + LD E,hor_place ; положение по горизонтали в символах + LD IX,bufer ; адрес буфера для запоминания данных локального окна. (для режиима 80x32) + LD B,bufer_page; страница буфера данных окна (только SLOT3 или SLOT2) + ; адрес буфера указывается для окна #C000 + ; если адрес указан с #8000, номер страницы буфера + ; не действителен + LD C,#B2 ; номер функции + RST ToBIOS ; NC -> нормальное завершение + ; CF -> ошибка - неверный идентификатор окна +; при работе этой функции через RST #18 или RST 8, обязательна установка +; DI, так как функция пользуется стеком для ускорения своей работы. +; + +WIN_RESTORE: ; копирование данных из памяти в текстовое окно + ; восстановление окна + LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0) + LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь + LD L,hor_size ; размер в символах + LD D,ver_place ; DE - положение локального окна + LD E,hor_place ; положение по горизонтали в символах + LD IX,bufer ; адрес буфера данных для локального окна + LD B,bufer_page; страница буфера данных окна (только SLOT3 или SLOT2) + ; адрес буфера указывается для окна #C000 + ; если адрес указан с #8000, номер страницы буфера + ; не действителен. + LD C,#B3 ; номер функции + RST ToBIOS ; NC -> нормальное завершение + ; CF -> ошибка - неверный идентификатор окна +; при работе этой функции через RST #18 или RST 8, обязательна установка +; DI, так как функция пользуется стеком для ускорения работы. + +; Данные для функций WIN_COPY_WIN и WIN_RESTORE_WIN имеют одинаковую +; структуру В данный момент эта структура похожа на структуру текстового +; экрана IBM, т.е. данные идут в формате sym1,atr1,sym2,atr2,.. сплошным +; массивом. Сначала данные для первой строки, затем сразу для второй и т.д. + +WIN_GET_SYM: ; взять символ с экрана + LD A,(id_win) ; идентификатор окна (пока должен быть 0) + LD DE,place ; положение символа: D - вертикаль, E - горизонталь + LD C,#B4 ; номер функции + RST ToBIOS ; NC -> нормальное завершение + ; L - символ, H - атрибут, B - знакогенератор + ; CF -> ошибка неверный идентификатор окна +; + +WIN_PUT_SYM: ; положить символ на экран + LD A,(id_win) ; идентификатор окна (пока должен быть 0) + LD DE,place ; положение символа: D - вертикаль, E - горизонталь + LD B,sym_zg ; знакогенератор + LD L,symbol ; символ + LD H,atribute ; атрибут символа + LD C,#B5 ; номер функции + RST ToBIOS ; NC -> нормальное завершение + ; CF -> ошибка неверный идентификатор окна +; + +; +WIN_GET_ZG: ; получить знакогенератор + LD DE,zg_buff ; указатель на 2Kb буфер для знакогенератора + LD C,#B8 ; номер функции + RST ToBIOS ; NC -> завершение +; + +; +WIN_SET_ZG: ; установка знакогенератора + LD A,sym_zg ; системный номер знакогенератора + LD DE,zg_form ; указатель на 2Kb данных знакогенератора + ; Данные знакогенератора должны располагаться в таком виде, в каком они + ; выглядели бы как набор символов на спектрумовском экране при переносе 2Kb + ; LDIR-om в адрес #4000 + ; * В будущем возможно изменение этого расположения на обычное + LD C,#B6 ; номер функции + RST ToBIOS ; NC -> завершение + ; CF -> ошибка (старая версия, нет функции) +; + +WIN_MOVE: ; перемещение окна (Внимание! использует как буфер страницу #FF) + LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0) + LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь + LD L,hor_size ; размер в символах + LD D,ver_place ; DE - положение локального окна + LD E,hor_place ; положение по горизонтали в символах + LD IX,new_place; новое положение локального окна + LD C,#B7 ; номер функции + RST ToBIOS ; NC -> нормальное завершение + ; CF -> ошибка - неверный идентификатор окна +; при работе этой функции через RST #18 или RST 8, обязательна установка +; DI, так как функция пользуется стеком для ускорения работы. + +; Даллее следуют функции печати для работы с _текущим_ глобальным окном. +; В данный момент текущим всегда является последнее открытое окно +; На графическом экране функция не работает +; + +LP_PRINT_ALL: ; печать символов с атрибутом + LD A,symbol ; символ + LD E,atribute ; атрибут + LD B,num_sym ; число выводимых символов + LD C,#81 ; номер функции + RST ToBIOS ; на экран выводится строка из B одинаковых + ; символов + ; регистры HL,IX - сохраняются +; + +LP_PRINT_SYM: ; Вывод символов на экран с текущего + ; знакоместа без атрибута + LD A,symbol ; символ + LD B,num_sym ; число выводимых символов + LD C,#82 ; номер функции + RST ToBIOS ; на экран выводится строка из B одинаковых символов + ; атрибут остается тот, который был на экране + ; регистры HL,IX - сохраняются +; + +LP_PRINT_ATR: ; печать атрибутов + LD E,atribute ; атрибут + LD B,num_sym ; число выводимых символов + LD C,#83 ; номер функции + RST ToBIOS ; на экран выводится строка из B одинаковых + ; атрибутов. Символы не меняются. + ; регистры HL,IX - сохраняются +; + +LP_SET_PLACE: ; Установка текущего знакоместа в окне + LD E,hor_place ; номер символа по горизонтали + LD D,ver_place ; номер символа по вертикали + ; ** Превышение границ приводит не к ошибке, а к + ; переустановке сначала, за вычетом полного + ; размера окна + LD C,#84 ; номер функции + RST ToBIOS ; позиция печати устанавливается в соответстии с + ; регистром DE + ; портятся только альтернативные регистры и те, + ; что как параметры на входе + +LP_PRINT_LINE: ; Вывод строки символов на экран с текущего + ; знакоместа + LD HL,line_adr ; адрес строки. Должен быть между #4000 и #BFFF + LD E,atribute ; атрибут, с которым будет выведена строка + LD B,num_sym ; длина выводимой строки + LD C,#85 ; номер функции + RST ToBIOS ; "исполнение желаний" +; + +LP_PRINT_LINE2: ; Вывод строки символов на экран с текущего + ; знакоместа без атрибутов + LD HL,line_adr ; адрес строки. Должен быть между #4000 и #BFFF + LD B,num_sym ; длина выводимой строки + LD C,#86 ; номер функции + RST ToBIOS ; строка будет выведена без изменения атрибутов в + ; месте печати +; + +LP_PRINT_LINE3: ; Вывод строки символов длиной B на экран с текущего + ; знакоместа до разделителя D. После разделителя + ; выводятся пробелы что бы вывести B символов. + LD HL,line_adr ; адрес строки. Должен быть между #4000 и #BFFF + LD E,atribute ; атрибут, с которым будет выведена строка + LD D,delimiter ; разделитель + LD B,num_sym ; длина выводимой строки + LD C,#87 ; номер функции + RST ToBIOS ; символы из (HL) выводятся на экран, пока не + ; встретится символ равный D, далее печатаются + ; пробелы, как дополнение строки до B символов +; + +LP_PRINT_LINE4: ; Вывод строки символов длиной B на экран с текущего + ; знакоместа до разделителя D. После разделителя + ; выводятся пробелы что бы вывести B символов. + ; Без атрибутов. + LD HL,line_adr ; адрес строки. Должен быть между #4000 и #BFFF + LD D,delimiter ; разделитель + LD B,num_sym ; длина выводимой строки + LD C,#88 ; номер функции + RST ToBIOS ; символы из (HL) выводятся на экран, пока не + ; встретится символ равный D, далее печатаются + ; пробелы, как дополнение строки до B символов + ; атрибуты не изменяются +; + +LP_CLS_WIN: ; очистка экрана + LD DE,place ; положение локального окна (глобальное = текущее) + LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь + LD L,hor_size ; размер в символах + LD B,atribute ; атрибут очистки + LD C,#89 ; номер фунции + RST ToBIOS ; выполнение. Произворится выводом пробелов с + ; заданным атрибутом +; + +LP_SCROLL_UD: ; Скроллинг части глобального окна вверх/вниз + LD B,scrollType; тип скроллинга 1 - вверх/ 2 - вниз + LD D,beg_line ; начальная строка скроллинга + LD E,num_lines ; число скроллируемых строк + LD C,#8A ; номер функции + RST ToBIOS ; выполнение. Скроллируются полные строки + ; глобального окна +; + +LP_PRINT_LINE5: ; Вывод строки символов на экран с текущего + ; знакоместа до разделителя после разделителя + ; вывод останавливается + LD HL,line_adr ; адрес строки. Должен быть между #4000 и #BFFF + LD D,stop_symb ; символ конца строки + LD E,atribute ; атрибут, с которым будет выведена строка + LD B,num_sym ; максимальная длина выводимой строки + LD C,#8B ; номер функции + RST ToBIOS ; символы из (HL) выводятся на экран, пока не + ; встретится символ равный D или количество + ; символов не превысило B. Далее происходит + ; возврат +; + +LP_PRINT_LINE6: ; Вывод строки символов на экран с текущего + ; знакоместа до разделителя после разделителя + ; вывод останавливается, без атрибутов + LD HL,line_adr ; адрес строки. Должен быть между #4000 и #BFFF + LD D,stop_symb ; символ конца строки + LD B,num_sym ; максимальная длина выводимой строки + LD C,#8C ; номер функции + RST ToBIOS ; символы из (HL) выводятся на экран, пока не + ; встретится символ равный D или количество + ; символов не превысило B. Далее происходит + ; возврат. Атрибуты не выводятся + ; + ; HL -> адрес следующий после конца строки +; + +LP_CLS_WIN2: ; очистка экрана, указанием символа заполнения + LD DE,place ; положение локального окна (глобальное = текущее) + LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь + LD L,hor_size ; размер в символах + LD A,symbol ; символ очистки + LD B,atribute ; атрибут очистки + LD C,#8D ; номер фунции + RST ToBIOS ; Выполнение. Произворится выводом пробелов с + ; заданным атрибутом и символом +; + +LP_GET_PLACE: ; получить текущее положение вывода на экран + ; в глобальном окне + LD C,#8E ; номер функции + RST ToBIOS ; в регистр DE будут положены координаты, + ; в которых будет напечатан следующий символ + ; D - вертикаль, E - горизонталь +; + +LP_PR_LINE_DIR ;!TODO недоделана. Печать "в консоль" строки до + ; разделителя с автоскроллом и с учётом управляющих + ; символов: BELL, Backspace, TAB, CR, LF, FF, VT. + LD DE,place ; положение символа в окне + LD HL,text ; строка для печати. должна находиться в банках 1..2 + LD B,delimiter ; разделитель + LD C,#E0 ; номер фунции + RST ToBIOS ; Выполнение. +;.............................................................................. +; Графические функции +; координаты считаются от верхнего левого угла экрана +;.............................................................................. + + +PIC_POINT: ; установить точку + LD DE,Y_coord ; координата по вертикали + LD HL,X_coord ; координата по горизонтали + LD A,(id_win) ; идентификатор граф. окна (пока должен быть 0) + LD B,color ; цвет точки + LD C,#A1 ; номер функции + RST ToBIOS ; поставить точку + +; В действительности ставить точки на экране с помощью функции биоса, +; слишком медленно. Для этого лучше пользоваться прямым выводом данных +; на графический экран. Устройство экрана и способы прямого вывода +; графических данных описаны в файле архитектуры Спринтера. +; + + +PIC_SET_PAL: ; установка палитры + LD HL,pal_data ; данные палитры: + ; список цветов по четыре байта B,G,R,Y + LD E,beg_color ; начальный цвет + LD D,num_colors; количество устанавливаемых цветов + LD B,pal_mask ; маска при установке палитры. Для нормального + ; режима должнa быть FF + LD A,page_pal ; номер палитры (0..15, 8..15 резервные) + LD C,#A4 ; номер функции + RST ToBIOS ; установка палитры +; данные палитры должны представлять собой список приблизительно такого вида: + DB blue1,green1,red1,0 + DB blue2,green2,red2,0 +;..................... + DB blueN,greenN,redN,0 + +; N = num_colors. Значение num_colors равное 0 соответствует 256-ти цветам +; при записи в видео-ОЗУ все данные предварительно проходят функцию AND со +; значением pal_mask + +; Страницы палитры 0..3 соответствуют графическим режимам. Для вывода в +; соответствующей палитре нужно задать соответствующее значение bit7..6 в +; байте режима знакоместа + +; Страницы 4..7 соответствуют текстовому режиму и режиму "Спектрум" +; В странице 4 задается цвет paper для каждого атрибута. В странице 5 +; задается цвет ink для каждого атрибута. +; В странице 6 задается цвет paper, которым он будет моргать в режиме flash +; В странице 7 задается цвет ink, которым он будет моргать в режиме flash +; Таким образом, для каждого из 256-ти атрибутов задается четыре цвета +; если цвета 4,5 совпадают с цветами 6,7 то режим flash оказывается +; отключенным. Для его включения в спектрумовском режиме надо поменять +; местами цвета 6 и 7. Если надо включить flash в режим IBM-CGA, следует +; установить цвета 6 и 7 одинаковыми и равными цвету 4 +; по сути режим flash всегда включен и на экране постоянно меняются цвета +; paper с 4-го на 6-й, а цвета ink с 5 на 7-й. Если эти пары цветов для +; атрибута знакоместа устанавливаются одинаковыми, то flash в этом месте +; не виден. +; Используя подобное задание цветов текстового режима можно легко добиться +; совместимости по цветам как со Спектрумом, так и с IBM +; + +;[x] новое? +PIC_GET_PAL: ; получение установленной палитры + LD HL,pal_data ; буфер для палитры: + ; список цветов по четыре байта B,G,R,Y + LD E,beg_color ; начальный цвет + LD D,num_colors; количество цветов + LD A,page_pal ; #80 + номер палитры (0..15, 8..15 резервные) + LD C,#A4 ; номер функции (такой же как и для PIC_SET_PAL) + RST ToBIOS ; получение палитры +; + +SET_PAL_INIT: ; установка внутренней палитры. + LD A,PAL_PAGE ; страница палитры (для графической) + LD E,PAL_N ; номер палитры (для графической) + LD B,type ; 3 - установка CGA палитры + ; 2 - установка спектрумовской палитры + ; 1 - установка графической палитры + LD C,#A6 ; номер функции + RST ToBIOS ; установка палитры +;============================================================================== + +; Функции работы с винчестером разделяются на две группы: +; 1. функции с номeрами #4x работают в более простом режиме и +; используются в TR-DOS. Эти функции находят только один +; винчестер и работают только с его первым разделом. Если есть +; master, то функции используют его, если master-а нет, то +; определяется slave, если нет ни того ни другого, выдается ошибка. +; Функцию подготовки #43 не требуется исполнять перед +; операциями #44, #45 и #46! +; При исполнении функции 43h производится вся подготовка к +; операциям чтения/записи вычисление цилиндров/головок/секторов и +; занесение их в регистры винчестера далее программа может сама +; только подать команду читать/писать и самостоятельно производить +; считывание/запись данных в винчестер. Команда удобна для работы +; программ в реальном времени, когда необходимо кроме +; чтения/записи данных производить какие либо иные действия. +; Страница буфера для функций #44..#46 имеет значение только при +; попадании адресов чтения/записи в диапазон #C000..#FFFF. Кроме +; того, при попадании межсекторного промежутка на адрес 0 при +; наличии несчитанных/незаписанных секторов, производится +; автоматическое переключение страницы ОЗУ по RAM Allocation Table +; и продолжение чтения/записи с адреса #C000, что позволяет +; непрерывно писать/читать до 128kb прямо в выделенный блок ОЗУ. + +; 2. Функции с номерами #5x более сложны, используются в Estex и +; работают с обоими винчестерами, со всеми разделами, а так же с +; дисководами, RAM-Disk-ами и CD-ROM-ами. +; В этих функциях в регистре A обычно задается номер и тип +; устройства: +; бит 0..3 - номер устройства +; бит 4..7 - тип устройства: +; 0 - дисковод +; 6 - ram-disk +; 8 - HDD +; C - CD-ROM +; остальные номера резервные +; А так же задаются страшая часть номера сектора в регисте HL, +; младшая часть номера сектора в регистре IX. Обратить внимание, +; на другой порядок расположения абсолютного номера сектора в +; регистрах HL и IX по сравнению с фунциями #4x! + +;============================================================================== +; 6. Работа с винчестером и дисками MS-DOS. Функции 4x +;============================================================================== + +; [x] 27/01/2024 адаптирована для корректной работы с FN_HDD_PART +HDD_INIT: ; инициализация винчестера. Портит значение PORT_Y + LD C,#40 ; номер функции + RST ToBIOS ; NC -> нормальное завершение + ; CF -> винчестер не найден +; + +; !FIXIT пока работает только с одним каналом (по-старому) +HDD_RECAL: ; рекалибровка винчестера + LD C,#41 ; номер функции +; * Функция зарезервирована для дальнейшего использования ; !TODO +; +; [x] 28/01/2024 работает со всеми каналами IDE и Master/Slave +HDD_TEST_IDE: ; Тест наличия интерфейса IDE + LD C,#42 ; номер функции + RST ToBIOS ; NC -> нормальние завершение + ; в регистре B информация о наличии устройств + ; bit0=1 - есть устройство "Primary master" + ; bit1=1 - есть устройство "Primary slave" + ; bit2=1 - есть устройство "Secondary slave" + ; bit3=1 - есть устройство "Secondary slave" + ; CF -> ошибка, аппаратная неисправность +; + +HDD_PREPARE: ; подготовка винчестера к операции чтения/записи + LD A,bufer_page; страница буфера, если адрес в окне #C000 + LD IX,sec_high ; абсолютный номер сектора старшая часть + LD DE,sec_low ; абсолютный номер сектора младшая часть + LD HL,bufer_adr; адрес буфера данных + LD B,sec_num ; число секторов + LD C,#43 ; номер функции + RST ToBIOS ; При исполнении производится вся подготовка к + ; операциям чтения/записи вычисление + ; цилиндров/головок/секторов и занесение их в регистры винчестера + ; далее программа может сама только подать команду читать/писать и + ; самостоятельно производить считывание/запись данных в винчестер. + ; Команда удобна для работы программ в реальном времени, когда необходимо + ; кроме чтения/записи данных производить какие либо иные действия. + ; На выходе в окне 3 стоит страница из A если H >= #С0. + ; Остаётся только начать читать с портов HDD +; + +; [x] 27/01/2024 теперь работает с любым разделом HDD +HDD_READ_BPB: ; читать BPB. Портит значение PORT_Y + LD C,#44 ; номер функции + LD HL,bufer_adr; адрес буфера для BPB + LD A,bufer_page; страница буфера, если адрес в окне #C000 + RST ToBIOS ; NC -> нормальное завершение + ; CF -> ошибка +; + +HDD_READ: ; читать сектора с винчестера. Портит значение PORT_Y + LD A,bufer_page; страница буфера, если адрес в окне #C000 + ; в A может быть BlockID, тогда будет читаться далее + ; в следующие страницы с адреса #C000 + LD IX,sec_high ; абсолютный номер сектора старшая часть + LD DE,sec_low ; абсолютный номер сектора младшая часть + LD HL,bufer_adr; адрес буфера данных + LD B,sec_num ; число читаемых секторов + LD C,#45 ; номер команды + RST ToBIOS ; NC -> нормальное завершение + ; CF -> ошибка + +; ** При попадании межсекторного промежутка на адрес 0 +; производится автоматическое переключение страницы ОЗУ по +; RAM Allocation Table. +; + +HDD_WRITE: ; писать сектора на винчестер + LD A,bufer_page; страница буфера, если адрес в окне #C000 + LD HL,bufer_adr; адрес буфера данных + LD B,sec_num ; число записываемых секторов + LD DE,sec_low ; абсолютный номер сектора младшая часть + LD IX,sec_high ; абсолютный номер сектора старшая часть + LD C,#46 ; номер команды + RST ToBIOS ; NC -> нормальное завершение + ; CF -> ошибка + +; ** При попадании межсекторного промежутка на адрес 0 +; производится автоматическое переключение страницы ОЗУ по RAM +; Allocation Table. +; + +; !FIXIT использовать в HDD_TO_DRV +; [x] 07/01/2024 +HDD_PART: ; настройка канала IDE, master/slave, раздела HDD. Портит значение PORT_Y + LD A,hdd_part ; bit0 - master/slave, bit1: Primary/Secondary, bit2..3: использующийся раздел в MBR + LD C,#47 + RST ToBIOS +; + +HDD_READ_NEXT: ; Читать следующий сектор (только LBA!). Портит значение PORT_Y + LD A,bufer_page; страница буфера, если адрес в окне #C000 + LD B,sec_num ; число читаемых секторов + LD HL,bufer_adr; адрес буфера данных + LD DE,add_par ; прибавляется к номеру предыдущего прочитанного сектора + LD C,#48 ; номер команды + RST ToBIOS ; NC -> нормальное завершение + ; CF -> ошибка +; +;============================================================================== +; 7. Работа с винчестером и дисками MS-DOS. Функции 5x +;============================================================================== + +; !TODO + LD C,#50 ; зарезервирована +; + +DRV_RESET: ; Сброс контроллера и настройка на диск + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + ; остальные номера резервные + LD C,#51 ; + RST ToBIOS ; NC - нормальное завершение + ; CF - нет диска или нет устройства +; + +DRV_READ_LONG: ; чтение с устройства + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + EX AF,AF' ; + LD A,Mem_BLK ; страница, куда читать если буфер в SLOT3 + EX AF,AF' ; + LD HL,sec_h ; старшая часть номера сектора + LD IX,sec_l ; младшая часть номера сектора + LD B,n_sec ; количество секторов + LD DE,bufer_adr; адрес буфер для чтения + LD C,#52 ; + RST ToBIOS ; NC - нормальное завершение + ; CF - ошибка чтения или нет устройства +; + +; !TODO расписать +DRV_WRITE_LONG: + LD C,#53 ; Long write +; + +DRV_VERIFY: ; проверка секторов + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk ; !FIXIT + ; 8 - HDD + ; C - CD-ROM + LD HL,sec_h ; страшая часть номера сектора + LD IX,sec_l ; младшая часть номера сектора + LD B,n_sec ; количество секторов + LD C,#54 ; + RST ToBIOS ; NC - нормальное завершение + ; CF - проверка с ошибкой или нет устройства +; + +DRV_READ: ; чтение с устройства + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + LD HL,sec_h ; старшая часть номера сектора + LD IX,sec_l ; младшая часть номера сектора + LD B,n_sec ; количество секторов + LD DE,bufer_adr; адрес буфер для чтения + LD C,#55 ; + RST ToBIOS ; NC - нормальное завершение + ; CF - ошибка чтения или нет устройства +; + +DRV_WRITE: ; запись на устройства + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + LD HL,sec_h ; страшая часть номера сектора + LD IX,sec_l ; младшая часть номера сектора + LD B,n_sec ; количество секторов + LD DE,bufer_adr; адрес буфер для записи + LD C,#56 ; + RST ToBIOS ; NC - нормальное завершение + ; CF - ошибка записи или нет устройства +; + +DRV_DETECT: ; определение параметров устройства + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + LD C,#57 ; + RST ToBIOS ; NC - нормальное завершение + ; A - для FDD bit7: 720/1.44 + ; для HDD и CD: drive type + ; CF - нет устройства или нет носителя +; + +DRV_GET_PAR: ; получить параметры носителя + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + LD C,#58 ; + RST ToBIOS ; NC - нормальное завершение + ; L - число секторов (на целиндр) + ; H - число головок + ; DE - количество цилиндров + ; IX - размер сектора в байтах + ; B - доп. параметры: + ; FDD: бит7 - тип 720/1.44 + ; HDD: бит0 - канал IDE 0/1 + ; бит6 - CHS/LBA + ; RMD: ramdrive block id ; [x] + ; + ; если в HL,DE все FF - устройства нет + ; CF - нет устройства +; + +DRV_SET_PAR: ; установить параметры носителя + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + LD L,n_secs ; L - число секторов (на целиндр) + LD H,n_heads ; H - число головок + LD DE,n_cyls ; DE - количество цилиндров + LD IX,sec_size ; IX - размер сектора в байтах + LD B,ext_par ; B - доп. параметры + ; для дискет бит7 - тип 720/1.44 + LD C,#59 ; + RST ToBIOS ; NC - нормальное завершение +; + +DRV_VERSION: ; получить версию драйвера дисковой подсистемы + LD C,#5A ; + RST ToBIOS ; CF - старая версия BIOS + ; NC - нормальное завершение + ; DE - номер версии. +; + +; !TODO + LD C,#5B ; зарезервирована +; + +; !TODO + LD C,#5C ; зарезервирована +; + +; !TODO + LD C,#5D ; зарезервирована +; + +DRV_EXTENDED: ; расширенный набор подфункций, может отличаться для разных устройств + LD B,sub_func ; номер подфункции + LD C,#5E ; зарезервирована + RST ToBIOS ; NC - нормальное завершение +; Подфункции: +; Для CD-ROM: +; 0 - Eject +; 1 - Close tray +; + +DRV_LIST: ; !TODO добавить описание и поддержку RAM DRIVE в этой функции + LD C,#5F ; + RST ToBIOS ; +; +;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; +;██████████████████████████████████████████████████████████████████████████████████████████████████████████████; \ No newline at end of file diff --git a/docs/part2/DSS 1.60 rst 10.txt b/docs/part2/DSS 1.60 rst 10.txt new file mode 100644 index 0000000..24e0a88 --- /dev/null +++ b/docs/part2/DSS 1.60 rst 10.txt @@ -0,0 +1,1459 @@ +1.1. Системные вызовы дисковой подсистемы (DSS) v1.6 + +1.1.1. Системные вызовы + + Если программа выполняет не только некую математическую задачу на ассемблере, то в ней придется столкнуться с такими вещами, как получение ввода пользователя, выполнение вывода результатов и завершение своей работы. Для этого, необходимо обратиться к сервисам DSS. Фактически, программирование на языке ассемблера одинаково для любых систем, если не пользоваться их сервисами. + + Вызов функций DSS в системе Estex выполняется из ассемблера. Необходимые параметры указываются в различных регистрах, регистр C используется для указания номера функции. + + + +Так, наша программа для Estex будет выглядеть наподобие: + + + + ORG #8100 ;адрес точки входа + + + + LD HL,MSG ;сообщение для вывода + + LD C,5Ch ;номер системного вызова (PCHARS) + + RST 10h ;вызов подсистемы + + + + LD C,41h ;номер системного вызова (EXIT) + + RST 10h ;вызов подсистемы + + + +MSG db "Hello, world!",0Dh,0Ah ;наша строка + + db 0 ;конец строки + + + +Следом за таблицей есть пояснение по двум новым функциям 0Ch и 0Dh. + +1.1.2. Далее идет список категорий функций DSS для системы Estex + +• Функции идентификации системы + +• Функции для работы с диском + +• Функции для работы с файлами + +• Функции для работы с датой и временем + +• Функции управления памятью + +• Функции ввода с клавиатуры + +• Функции для исполнения программ + +• Функции для работы со строками и командной строкой + +• Функции для работы с переменными + +• Функции работы с экраном + +• Функции для печати на принтере + + + + + +Функции идентификации системы + + + + +00h (00) VERSION (Версия DSS) + +Входные значения: + +C - 00h Выходные значения: + +D - номер версии + +E - модификация + +Функции для работы с диском + + + + +01h (01) CHDISK (Смена текущего диска) + +Входные значения: + +A - номер диска (0-A,1-B...) + +C - 01h Выходные значения: + +A - код ошибки, если CF=1 + +A - максимальный номер диска, если CF=0 + +02h (02) CURDISK (Номер текущего диска) + +Входные значения: + +C - 02h Выходные значения: + +A - код ошибки, если CF=1 + +A - текущий номер диска (0-A,1-B...), если CF=0 + +03h (03) DSKINFO (Информация о диске) + +Входные значения: + +A - номер диска (0-A,1-B...0FFh-текущий) + +C - 03h Выходные значения: + +A - код ошибки, если CF=1 + +A - размер кластера в секторах, если CF=0 + +HL - общее кол-во кластеров + +DE - свободных кластеров + +BC - размер сектора в байтах + +09h (09) BOOTDSK (Номер системного диска) + +Входные значения: + +C - 09h + +B = 0 Выходные значения: + +A - код ошибки, если CF=1 + +A - номер системного диска (0-A,1-B...), если CF=0 + +Функции для работы с файлами + + + + +0Ah (10) CREATE (Создание файла) + +Входные значения: + +HL - указатель на файловую спецификацию + +A - атрибут файла + +C - 0Ah Выходные значения: + +A - код ошибки, если CF=1 + +A - файловый манипулятор, если CF=0 + +0Bh (11) CREATE NEW FILE (Создание нового файла) + +Входные значения: + +HL - указатель на файловую спецификацию + +A - атрибут файла + +C - 0Bh Выходные значения: + +A – код ошибки, если CF=1 + +A - файловый манипулятор, если CF=0 + +0Eh (14) DELETE (Удаление файла) + +Входные значения: + +HL - указатель на файловую спецификацию + +C - 0Eh Выходные значения: + +A - код ошибки, если CF=1 + +10h (16) RENAME (Переименование файла) + +Входные значения: + +HL - указатель на старое имя файла + +DE - указатель на новое имя файла + +C - 10h Выходные значения: + +A - код ошибки, если CF=1 + +11h (17) OPEN (Открытие файла) + +Входные значения: + +HL - указатель на файловую спецификацию + +A - режим доступа + +A=0 чтение/запись + +A=1 чтение + +A=2 запись + +C - 11h Выходные значения: + +A - код ошибки, если CF=1 + +A - файловый манипулятор, если CF=0 + +12h (18) CLOSE (Закрытие файла) + +Входные значения: + +A - файловый манипулятор + +C - 12h Выходные значения: + +A - код ошибки, если CF=1 + + + +13h (19) READ (Чтение из файла) + +Входные значения: + +A - файловый манипулятор + +HL - адрес в памяти + +DE - количество читаемых байт + +C - 13h Выходные значения: + +A - код ошибки, если CF=1 + +DE - реальное количество прочитанных байт + +если CF=0: + +A = 0 прочитаны все байты + +A = 0FFh прочитано меньшее число байт + +14h (20) WRITE (Запись в файл) + +Входные значения: + +A - файловый манипулятор + +HL - адрес в памяти + +DE - количество записываемых байт + +C - 14h Выходные значения: + +A - код ошибки, если CF=1 + +DE - реальное количество записанных байт + +15h (21) MOVE_FP (Перемещение указателя в файле) + +Входные значения: + +A - файловый манипулятор + +HL:IX - смещение указателя в файле + +B - способ перемещения: + +B=0 от начала файла + +B=1 от текущего значения указателя + +B=2 от конца файла + +C - 15h Выходные значения: + +A - код ошибки, если CF=1 + +HL:IX - новое значение указателя + +16h (22) ATTRIB (Получение/изменение атрибута файла) + +Входные значения: + +HL - указатель на файловую спецификацию + +B - режим доступа + +B = 0 получить атрибут + +B = 1 установить атрибут + +A - атрибут файла + +C - 16h Выходные значения: + +A - код ошибки, если CF=1 + +A - атрибут файла, если CF=0 + +17h (23) GET_D_T (Информация о дате и времени файла) + +Входные значения: + +A - файловый манипулятор + +C - 17h Выходные значения: + +A - код ошибки, если CF=1 + +D - день + +E - месяц + +IX - год + +H - час + +L - минуты + +B - секунды + +18h (24) PUT_D_T (Изменение даты и времени файла) + +Входные значения: + +A - файловый манипулятор + +D - день + +E - месяц + +IX - год + +H - час + +L - минуты + +B - секунды + +C - 18h Выходные значения: + +A - код ошибки, если CF=1 + +19h (25) F_FIRST (Поиск первого совпадающего файла) + +Входные значения: + +HL - указатель на файловую спецификацию + +DE - рабочий буфер 44 байта, если B=0, иначе 256 байт + +A - атрибуты, используемые при поиске + +B = 0 - имя найденного файла в формате 11 байт "FilenameExt" + +B = 1 - имя найденного файла в формате DOS "filename.ext",0 + +C - 19h Выходные значения: + +A - код ошибки, если CF=1 + +1Ah (26) F_NEXT (Поиск следующего совпадающего файла) + +Входные значения: + +DE - указатель на рабочий буфер + +C - 1Ah Выходные значения: + +A - код ошибки, если CF=1 + +1Bh (27) MKDIR (Создание каталога) + +Входные значения: + +HL - указатель на файловую спецификацию + +C - 1Bh Выходные значения: + +A - код ошибки, если CF=1 + +1Ch (28) RMDIR (Устранение каталога) + +Входные значения: + +HL - указатель на файловую спецификацию + +C - 1Ch Выходные значения: + +A - код ошибки, если CF=1 + +1Dh (29) CHDIR (Смена текущего каталога) + +Входные значения: + +HL - указатель на файловую спецификацию + +C - 1Dh Выходные значения: + +A - код ошибки, если CF=1 + +1Eh (30) CURDIR (Информация о текущем каталоге) + +Входные значения: + +HL - буфер в памяти 256 байт + +C - 1Eh Выходные значения: + +A - код ошибки, если CF=1 + +Функции для работы с датой и временем + + + + +21h (33) SYSTIME (Текущая дата и время) + +Входные значения: + +C - 21h Выходные значения: + +D - день + +E - месяц + +IX - год + +H - час + +L - минуты + +B - секунды + +C - день недели + +22h (34) SETTIME (Установить текущую дату и время) + +Входные значения: + +D - день + +E - месяц + +IX - год + +H - час + +L - минуты + +B - секунды + +C - 22h Выходные значения: + +A - код ошибки, если CF=1 + +Функции управления памятью + + + + +38h (56) SETWIN (Подключение страницы памяти) + +Входные значения: + +A - идентификатор блока памяти + +B - номер страницы в блоке (0,1,2...) + +H - биты 6 и 7 задают номер окна, в которое будет подключена страница + +C - 38h Выходные значения: + +A - код ошибки, если CF=1 + +A - номер замещенной страницы, если CF=0 + +39h (57) SETWIN1 (Подключение страницы памяти в первое окно) + +Входные значения: + +A - идентификатор блока памяти + +B - номер страницы в блоке (0,1,2...) + +C - 39h Выходные значения: + +A - код ошибки, если CF=1 + +A - номер замещенной страницы, если CF=0 + +3Ah (58) SETWIN2 (Подключение страницы памяти во второе окно) + +Входные значения: + +A - идентификатор блока памяти + +B - номер страницы в блоке (0,1,2...) + +C - 39h Выходные значения: + +A - код ошибки, если CF=1 + +A - номер замещенной страницы, если CF=0 + +3Bh (59) SETWIN3 (Подключение страницы памяти в третье окно) + +Входные значения: + +A - идентификатор блока памяти + +B - номер страницы в блоке (0,1,2...) + +C - 3Bh Выходные значения: + +A - код ошибки, если CF=1 + +A - номер замещенной страницы, если CF=0 + +3Ch (60) INFOMEM (Информация о памяти) + +Входные значения: + +C - 3Ch Выходные значения: + +HL - общее количество страниц + +BC - количество свободных страниц + +3Dh (61) GETMEM (Выделение блока памяти) + +Входные значения: + +B - размер блока в страницах по 16 килобайт + +C - 3Dh Выходные значения: + +A - код ошибки, если CF=1 + +A - идентификатор блока памяти, если CF=0 + +3Eh (62) FREEMEM (Освобождение блока памяти) + +Входные значения: + +A - идентификатор блока памяти + +C - 3Eh Выходные значения: + +A - код ошибки, если CF=1 + +3Fh (63) SETMEM (Изменение блока памяти) + +Входные значения: + +A - идентификатор блока памяти + +B - новый размер блока + +C - 3Fh Выходные значения: + +A - код ошибки, если CF=1 + +0Ch (12) SET_CACHE_FLAG (Установка флага включенной кэш памяти) + +Входные значения: + +C – 0Ch + + Выходные значения: + +A – номер страницы для сохранения переключателя. + +CF=1 если ошибка. + +0Dh (13) RESET_CACHE_FLAG (Сброс флага включенной кэш памяти) + +Входные значения: + +C – 0Dh + + Выходные значения: + +CF=1 если ошибка. + +Функции ввода с клавиатуры + + + + +30h (48) WAITKEY (Ожидание символа с клавиатуры) + +Входные значения: + +C - 30h Выходные значения: + +A - код символа + +D - позиционный код + +Е - ASCII код + +C - режим клавиатуры: + +bit7 - RUS/LAT + +bit3 - Num Lock + +bit2 - Scroll Lock + +bit1 - Insert + +bit0 - Caps Lock + +B - состояние shift'ов: + +bit7 - Left Shift + +bit6 - Right Shift + +bit5 - Ctrl + +bit4 - Alt + +bit3 - Left Ctrl + +bit2 - Left Alt + +bit1 - Right Ctrl + +bit0 - Right Alt + +31h (49) SCANKEY (Опрос клавиатуры без ожидания) + +Входные значения: + +C - 31h Выходные значения: + +ZF = 1 - нет клавиш + +A - код символа + +D - позиционный код + +Е - ASCII код + +C - режим клавиатуры: + +bit7 - RUS/LAT + +bit3 - Num Lock + +bit2 - Scroll Lock + +bit1 - Insert + +bit0 - Caps Lock + +B - состояние shift'ов: + +bit7 - Left Shift + +bit6 - Right Shift + +bit5 - Ctrl + +bit4 - Alt + +bit3 - Left Ctrl + +bit2 - Left Alt + +bit1 - Right Ctrl + +bit0 - Right Alt + +32h (50) ECHOKEY (Ожидание символа с клавиатуры с печатью) + +Входные значения: + +C - 32h Выходные значения: + +A - код символа + +D - позиционный код + +Е - ASCII код + +C - режим клавиатуры: + +bit7 - RUS/LAT + +bit3 - Num Lock + +bit2 - Scroll Lock + +bit1 - Insert + +bit0 - Caps Lock + +B - состояние shift'ов: + +bit7 - Left Shift + +bit6 - Right Shift + +bit5 - Ctrl + +bit4 - Alt + +bit3 - Left Ctrl + +bit2 - Left Alt + +bit1 - Right Ctrl + +bit0 - Right Alt + +33h (51) CTRLKEY (Получить состояние клавиатуры) + +Входные значения: + +C - 33h Выходные значения: + +A = 0 - нет символов в буфере + +C - режим клавиатуры: + +bit7 - RUS/LAT + +bit3 - Num Lock + +bit2 - Scroll Lock + +bit1 - Insert + +bit0 - Caps Lock + +B - состояние shift'ов: + +bit7 - Left Shift + +bit6 - Right Shift + +bit5 - Ctrl + +bit4 - Alt + +bit3 - Left Ctrl + +bit2 - Left Alt + +bit1 - Right Ctrl + +bit0 - Right Alt + +35h (53) K_CLEAR (Очистить буфер клавиатуры и выполнить функцию) + +Входные значения: + +B - номер фун + +ции 30h, 31h, 32h, 33h или 34h + +C - 35h Выходные значения: + +В зависимости от указанной функции в регистре B. + +36h (54) K_SETUP (Управление настройками клавиатуры) + +Входные значения: + +B - номер подфункции + +C - 36h + + + +B = 0, установить раскладку клавиатуры + +A - номер раскладки + +0 - normal + +1 - shift + +2 - caps lock + +3 - caps lock + shift + +4 - normal (альтернативная кл.) + +5 - shift (альтернативная кл.) + +6 - caps lock (альтернативная кл.) + +7 - caps lock + shift (альтернативная кл.) + +B = 1, получить состояние звуковых переменных + +B = 2, установить звуковые переменные + +A - значение переменной + +bit0 - сигнал переполнения буфера клавиатуры + +bit1 - сигнал переключения на альтернативную раскладку клавиатуры Выходные значения: + +В зависимости от указанной функции в регистре B. + +37h (55) TESTKEY (Опрос буфера клавиатуры) + +Входные значения: + +C - 37h Выходные значения: + +ZF = 1 - нет символов в буфере + +A - код символа + +D - позиционный код + +Е - ASCII код + +C - режим клавиатуры: + +bit7 - RUS/LAT + +bit3 - Num Lock + +bit2 - Scroll Lock + +bit1 - Insert + +bit0 - Caps Lock + +B - состояние shift'ов: + +bit7 - Left Shift + +bit6 - Right Shift + +bit5 - Ctrl + +bit4 - Alt + +bit3 - Left Ctrl + +bit2 - Left Alt + +bit1 - Right Ctrl + +bit0 - Right Alt + +Функции для исполнения программ + + + + +40h (64) EXEC (Выполнить файл) + +Входные значения: + +HL - указатель на файловую спецификацию + +B = 0 - загрузить и выполнить программу + +C - 40h Выходные значения: + +A - код ошибки, если CF=1 + +A - код завершения, если CF=0 + +41h (65) EXIT (Завершение программы) + +Входные значения: + +B - код завершения + +C - 41h Выходные значения: + +A - код ошибки, если CF=1 + +A - код завершения, если CF=0 + +42h (66) WAIT (Получить код завершения программы) + +Входные значения: + +C - 42h Выходные значения: + +A - код завершения + +Функции для работы со строками и командной строкой + + + + +43h (67) GSWITCH (Выделить параметр командной строки) + +Входные значения: + +HL - указатель командной строки + +DE - буфер для выделяемого параметра + +C - 43h Выходные значения: + +HL - указатель на следующий параметр командной строки + +CF = 0 - конец строки не достигнут (есть другие параметры) + +CF = 1 - конец строки (в буфер перенесён последний параметр или ноль) + +44h (68) DOSNAME (Преобразовать имя файла) + +Входные значения: + +C - 44h + +B = 0, преобразовать из 11 символьного формата в формат ДОС + +HL - 11 символов имени файла + +DE - буфер для имени в формате ДОС + +B = 1, преобразовать из формата ДОС в 11 символьный формат + +HL - имя файла в формате ДОС + +DE - 11 символов имени файла Выходные значения: + +A - код ошибки, если CF=1 + +45h (69) EXCMDLN (Разбор командной строки) + +Входные значения: + +HL - указатель командной строки + +DE - указатель на буфер пользователя + +C - 45h + +B - номер подфункции: + +0 - Разобрать строку; + +1 - Выделить имя диска; + +2 - Выделить директорию; + +3 - Выделить имя файла; + +4 - Выделить расширение файла; + +5 - Выделить имя диска, путь к файлу, имя файла и расширение файла; + +6 - Зарезервирована; + +7 - Выделить параметр командной строки; + +8 - Преобразовать из 11 символьного формата в формат ДОС; + +9 - Преобразовать из формата ДОС в 11 символьный формат; + +Подфункция 0 - Разобрать строку: + +Входные значения: + +HL - указатель командной строки + +C - 45h + +B = 0 - Разобрать строку Выходные значения: + +A - код ошибки, если CF=1 + +A - результат разбора, если CF=0 + +bit7 - В строке обнаружены символы ? или * + +bit3 - В строке указано имя диска; + +bit2 - В строке указан путь к файлу; + +bit1 - В строке указано расширение файла; + +bit0 - В строке указано имя файла; + +Подфункция 1 - Выделить имя диска: + +Входные значения: + +HL - указатель командной строки + +DE - буфер (макс. 13 байт) + +C - 45h + +B = 1 - Выделить имя диска Выходные значения: + +A - код ошибки, если CF=1 + +A - номер диска (0 - A, 1 - B, 2 - C и т.д.), если CF=0 + +буфер - имя диска "A:",0 + +Подфункция 2 - Выделить директорию: + +Входные значения: + +HL - указатель командной строки + +DE - буфер (макс. 256 байт) + +C - 45h + +B = 2 - Выделить директорию Выходные значения: + +A - код ошибки, если CF=1 + +A - результат разбора, если CF=0 + +bit7 - В строке обнаружены символы ? или * + +bit3 - В строке указано имя диска; + +bit2 - В строке указан путь к файлу; + +bit1 - В строке указано расширение файла; + +bit0 - В строке указано имя файла; + +буфер - директория "DIR1\DIR2\DIR3\",0 + +Подфункция 3 - Выделить имя файла: + +Входные значения: + +HL - указатель командной строки + +DE - буфер (макс. 13 байт) + +C - 45h + +B = 3 - Выделить имя файла Выходные значения: + +A - код ошибки, если CF=1 + +A - результат разбора, если CF=0 + +bit7 - В строке обнаружены символы ? или * + +bit3 - В строке указано имя диска; + +bit2 - В строке указан путь к файлу; + +bit1 - В строке указано расширение файла; + +bit0 - В строке указано имя файла; + +буфер - имя файла "FILE.EXT",0 + +Подфункция 4 - Выделить расширение файла: + +Входные значения: + +HL - указатель командной строки + +DE - буфер (макс. 4 байт) + +C - 45h + +B = 4 - Выделить расширение файла Выходные значения: + +A - код ошибки, если CF=1 + +A - результат разбора, если CF=0 + +bit7 - В строке обнаружены символы ? или * + +bit3 - В строке указано имя диска; + +bit2 - В строке указан путь к файлу; + +bit1 - В строке указано расширение файла; + +bit0 - В строке указано имя файла; + +буфер - расширение "TXT",0 или "C ",0 + +Подфункция 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла: + +Входные значения: + +HL - указатель командной строки + +DE - буфер (макс. 8 байт) + +DE+0 адрес буфера для имени диска (макс. 13 байт) + +DE+2 адрес буфера для директории (макс. 256 байт) + +DE+3 адрес буфера для имени файла (макс. 13 байт) + +DE+4 адрес буфера для расширения файла (макс. 4 байта) + +C - 45h + +B = 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла Выходные значения: + +A - код ошибки, если CF=1 + +A - результат разбора, если CF=0 + +bit7 - В строке обнаружены символы ? или * + +bit3 - В строке указано имя диска; + +bit2 - В строке указан путь к файлу; + +bit1 - В строке указано расширение файла; + +bit0 - В строке указано имя файла; + +Подфункция 7 - Выделить параметр командной строки + +Входные значения: + +HL - указатель командной строки + +DE - буфер для выделяемого параметра + +C - 45h + +B = 7 - Выделить параметр командной строки Выходные значения: + +HL - указатель на следующий параметр командной строки + +CF = 0 - конец строки не достигнут (есть другие параметры) + +CF = 1 - конец строки (в буфер перенесён последний параметр или ноль) + +Подфункция 8 - Преобразовать из 11 символьного формата в формат ДОС + +Входные значения: + +C - 45h + +B = 8 - преобразовать из 11 символьного формата в формат ДОС + +HL - 11 символов имени файла + +DE - буфер для имени в формате ДОС Выходные значения: + +A - код ошибки, если CF=1 + +Подфункция 9 - Преобразовать из формата ДОС в 11 символьный формат + +Входные значения: + +C - 45h + +B = 9 - преобразовать из формата ДОС в 11 символьный формат + +HL - имя файла в формате ДОС + +DE - буфер для 11 символов имени файла Выходные значения: + +A - код ошибки, если CF=1 + + + +Функции для работы с переменными + + + + +46h (70) ENVIRON (Системное окружение) + +Входные значения: + +B - номер подфункции + +C - 46h + +B=0 Получение системного окружения + +HL - буфер + +B=1 Получить переменную окружения + +HL - имя переменной + +DE - буфер для значения переменной + +B=2 Установить/удалить переменную окружения + +HL - имя переменной и значение, разделенные символом '=', (ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ) Выходные значения: + +A - состояние, если CF=0 + +A=0 - переменная обнаружена + +A=0FFh - переменная не обнаружена + +DE - указывает на конец буфера + +A - код ошибки, если CF=1 + +47h (71) APPINFO (Получение информации приложения) + +Входные значения: + +B - номер подфункции + +C - 47h + +HL - буфер данных + +B=0 - получение параметров командной строки + +B=1 - получение полного пути к каталогу программы + +B=2 - получение полного пути и имени файла программы Выходные значения:: + +A - код ошибки, если CF=1 + +Функции работы с экраном + + + + +50h (80) SETVMOD (Выбор режима экрана) + +Входные значения: + +A - режим экрана + + 02h - текстовый 40x32x16 цветов + + 03h - текстовый 80x32x16 цветов + + 81h - графический 320x256x256 цветов + + 82h - графический 640x256x16 цветов + +B - страница экрана 0/1 + +C - 50h Выходные значения: + +A - код ошибки, если CF=1 + +51h (81) GETVMOD (Получить текущий режим экрана) + +Входные значения: + +C - 51h Выходные значения: + +A - код ошибки, если CF=1 + +A - текущий режим экрана, если CF=0 + +B - страница экрана 0/1 + +52h (82) LOCATE (Установить позицию курсора) + +Входные значения: + +D - строка курсора + +E - столбец курсора + +C - 52h Выходные значения: + +нет + +53h (83) CURSOR (Получить текущую позицию курсора) + +Входные значения: + +C - 53h Выходные значения: + +D - строка курсора + +E - столбец курсора + +54h (84) SELPAGE (Выбрать активную страницу экрана) + +Входные значения: + +B - страница экрана 0/1 + +C - 54h Выходные значения: + +A - код ошибки, если CF=1 + +55h (85) SCROLL (Прокрутка окна) + +Входные значения: + +D - строка левого верхнего угла окна + +E - столбец левого верхнего угла окна + +H - высота окна + +L - ширина окна + +B = 1 - прокрутка вверх + +B = 2 - прокрутка вниз + +A = 0 - очищать строку + +C - 55h Выходные значения: + +нет + +56h (86) CLEAR (Очистка окна) + +Входные значения: + +D - строка левого верхнего угла окна + +E - столбец левого верхнего угла окна + +H - высота окна + +L - ширина окна + +B - атрибут заполнитель + +A - символ заполнитель + +C - 56h Выходные значения: + +нет + +57h (87) RDCHAR (Считать символ с экрана) + +Входные значения: + +D - строка + +E - столбец + +C - 57h Выходные значения: + +A - символ + +B - атрибут + +58h (88) WRCHAR (Напечатать символ на экране) + +Входные значения: + +D - строка + +E - столбец + +A - символ + +B - атрибут + +C - 58h Выходные значения: + +нет + +59h (89) WINCOPY (Запомнить окно экрана) + +Входные значения: + +D - строка + +E - столбец левого верхнего угла окна + +H - высота окна + +L - ширина окна + +B - страница буфера + +IX - адрес буфера + +C - 59h Выходные значения: + +нет + +5Ah (90) WINREST (Восстановить окно экрана) + +Входные значения: + +D - строка + +E - столбец левого верхнего угла окна + +H - высота окна + +L - ширина окна + +B - страница буфера + +IX - адрес буфера + +C - 5Ah Выходные значения: + +нет + +5Bh (91) PUTCHAR (Напечатать символ в текущей позиции курсора) + +Входные значения: + +A - символ + +C - 5Bh Выходные значения: + +нет + +5Ch (92) PCHARS (Напечатать строку символов в текущей позиции курсора) + +Входные значения: + +HL - указатель на начало строки символов + +C - 5Ch Выходные значения: + +нет + +Функции для печати на принтере + + + + +5Fh (95) PRINT (Вывод символа на принтер без ожидания) + +Входные значения: + +A - символ + +C - 5Fh Выходные значения: + +B - символ + +CF = 1 - принтер не готов + + + + + diff --git a/docs/part2/SprinterGraphics programming.txt b/docs/part2/SprinterGraphics programming.txt new file mode 100644 index 0000000..dc18e53 --- /dev/null +++ b/docs/part2/SprinterGraphics programming.txt @@ -0,0 +1,279 @@ +Автор Mac Buster +1.2. Доступные видеорежимы +В нашем распоряжении два графических режима. +Один из них имеет разрешение 320 точек по горизонтали и 256 точек по вертикали. +В этом режиме мы можем каждую точку окрашивать в любой из 256 цветов, т.е. одной точке +соответствует один байт видеопамяти. +Таким образом экран в этом режиме требует 320x256=81920 байт. +Второй режим имеет 640 точек по горизонтали, 256 точек по вертикали, где каждая точка может +быть окрашена в один из 16 цветов, т.е. отводится только 4 бита на точку, а значит каждый +байт содержит информацию сразу о двух точках +(младший полубайт об одной точке, старший - о другой). +В каждом режиме мы можем использовать две идентичные видеостраницы (нумеруемых 0 и 1), +и четыре палитры (к сожалению только одна палитра +может быть использована в текущий момент). +В терминах “ Спринтера +” блоки имеющие 320 или 640 точек по горизонтали и одну точку +по вертикали называются строками. +1.3. Структура видеопамяти +В настоящее время объем видеопамяти “ Спринтера +” составляет 256 килобайт. +Возможно Вы обратили внимание на то, что числа количества строк (их 256) и объёма видеопамяти +(256 килобайт) одинаковы. +Это не простое совпадение, дело в том, что на каждую строку отводится по одному килобайту +видеопамяти, причем вне зависимости от того, сколько точек по горизонтали содержит строка данного +режима. Первые 320 байт строки (с номерами 0…319) определяют цвета точек для первой +видеостраницы, следующие 320 байт (с номерами 320-639) — то же для второй видеостраницы, +остальные байты (с номерами 640…1023) режиме, а так же для хранения данных палитры +(будет описана позже). +Структура описателя экрана мне пока неясна полностью, поэтому я в данном руководстве не буду её +рассматривать. +1.4. Как работать с видеопамятью “ ” Спринтера +Для простоты я сначала покажу вам как надо записывать данные в одну строку видеорежима +с разрешением 320x256. +Что бы это сделать, нам требуется произвести следующие действия: +• установить видеорежим; +• установить страницу видеопамяти в адресное пространство Z80; +• выбрать строку видеопамяти; +• записать данные по необходимому смещению от начала строки. +Видеорежим будем устанавливать с помощью функции “SETVMOD” +набора функций системы “Estex”. +Перед её вызовом необходимо в регистр A загрузить номер видеорежима +(для режима 320x256 это 0x81, для 640x256 это 0x82), затем в регистр B загрузить номер +видеостраницы (0 для первой страницы и 1 для второй страницы), а в регистр C поместить +номер функции “SETVMOD” системы “Estex” — 0x50. +После чего мы вызываем функцию с помощью инструкции RST 0x10. +Полностью это должно выглядеть примерно так: +0x81 +LD A, ; мы собираемся использовать режим 320x256 +0x00 +LD B, ; нам нужна первая страница +0x50 +LD C, ; номер функции “SETVMOD“ +0x10RST ; установить видеорежим +Не помешает проверить была ли выполнена наша функция без ошибок. +Если в процессе выполнения произошла ошибка, то после возвращения +из подпрограммы вызываемой нами с помощью RST 0x10, будет установлен +флаг переноса C, а значит мы не сможем работать с видеопамятью. +Нам надо както обрабатывать такую ситуацию. +Предположим, что у нас где-то есть процедура “VMError” для такого случая, +выводящая на экран строку “ Err — Unable to set videomode! +”, тогда сразу +после RST 0x10 следует поставить проверку установлен ли флаг C. +JR C,VMError ; произошла ошибка? +Кроме того, стоит заметить, что раздельная загрузка регистров B и C +была сделана только для наглядности, и в следующих примерах я буду +использовать одну инструкцию загрузки значения в регистровую пару BC — +“LD BC, 0xNNNN”. +То есть предыдущий фрагмент кода будет выглядеть следующим образом: +LD A, 0x81 +; мы собираемся использовать режим 320x256 +LD BC, 0x0050 +; первая страница,номер функции “SETVMOD” +0x10 +RST ; установить видеорежим +JR C,VMError ; произошла ошибка? +Теперь надо установить видеостраницу в адресное пространство Z80. Видеопамять разбита на +16- килобайтные страницы (по 16 строк на страницу) с номерами 0x50...0x5F, которые могут +быть подключены так же, как это делается с обычной оперативной памятью. +Причем следует иметь в виду, что номера страниц видеопамяти так же определяют режим доступа к +видеоданным (обычный; без изменения данных в основном ОЗУ; с так называемым +“прозрачным” цветом;). +Сейчас мы ограничимся самым простым для понимания обычным режимом. +Будем подключать видеопамять в страницу 3 начинающуюся с адреса 0xC000 +(или 49152 в десятичной системе счисления). +Это значит, что адрес первой по счету строки в видеостранице будет начинаться с +этого адреса (0xC000). +В данном примере будем использовать прямую запись в порт, однако, хочу предупредить, +что поступать так в приложениях, предназначенных для распространения, не рекомендуется +(лучше использовать для этой цели специально отведенные функции “Estex” или BIOS). +Все, что нам надо сделать — это предварительно сосчитать и сохранить данные из порта, +предназначенного для указания номера страницы, подключаемой в третье окно — 0xE2, +а затем записать в этот порт значение 0x50 (номер страницы отведенной под видеопамять). +0xE2 +IN A,( ) ; считываем текущее значение +LD (OldWin3Page),A ; сохраняем его в памяти, чтобы +; вернуть при выходе +0x50 +LD A, ; номер страницы видеопамяти +0xE2 +OUT ( ),A ; записываем новое значение +Теперь в адресное пространство подключена страница видеопамяти, и мы уже можем +записывать в нее данные. +Но перед этим нам ещё требуется указать в какую именно строку надо записывать данные, +для чего в порт 0x89 надо ввести номер строки (0...255). +0x10 +LD A, ; выбираем семнадцатую строку +OUT ( 0x89 +),A ; записываем номер строки в порт +После этого с адреса 0xC000 у нас располагаются данные видеопамяти относящиеся +к семнадцатой строке, с адреса 0xC400 — к восемнадцатой, с 0xC800 — к девятнадцатой, +и так далее, до тридцать первой, с шагом в один килобайт. +Замечание - реальность доступа к строкам 18-31 не подтверждена, в эмуляторе MAME +точно это не работает, доступна только та строка которая была выбрана (17). +Требуется проверка на реальном устройстве. +Записав по адресу 0xC000 какоенибудь число, мы изменим цвет самой первой слева точки +семнадцатой сверху строки на экране. +0x12 +LD A, ; выбираем цвет +0xC000 +LD ( ),A ; записываем в видеопамять +Мы выполнили все, что планировали, осталось только произвести какую-либо задержку, +чтобы появилась возможность увидеть результат нашего “титанического труда”. +Проще всего использовать для этого функцию “WAITKEY” с номером 0x30, +которая ждет нажатия любой алфавитно-цифровой клавиши. +Делается это следующим образом: +0x30 +LD C, ; загружаем номер функции “WAITKEY” +0x10 +RST ; вызываем “Estex” +Восстанавливаем старое значение в использованной нами странице памяти и устанавливаем +текстовый режим: +LD A,(OldWin3Page); +0xE2 +OUT ( ),A ; +0x03 +LD A, ; текстовый режим +0x0050 +LD BC, ; +0x10 +RST ; +Теперь нам надо вернуться в систему или вызвавшую нас программу. +Для этого существует функция “Estex” под названием “ Exit +”, имеющая номер 0x41. +Предварительно в регистр B следует поместить код ошибки, либо 0, если ее не было. +Мы будем считать, что никаких ошибок не было: +0x0041 +Exit LD BC, ; +0x10 +RST ; +Вот и почти вся наша программа. +Осталась только процедура вывода строки о невозможности установки видеорежима и +последующим переходом на метку “ ”. Exit +VMError LD HL,ErrMessage ; +0x005C +LD BC, ; +0x10 +RST ; +JR Exit ;13 +“Err — Unable to set videomode! +ErrMessage DB ”,0x0D, 0x0A,0x00 +Первая часть руководства окончена. +Вы научились подключать видеопамять, выбирать строку и выводить на экран точку. +Этого вполне достаточно для начала. +Настоятельно рекомендую поэкспериментировать с выводом, например, сделать так, чтобы +точка постоянно меняла цвет :) +Ниже приведен полностью работающий, готовый к ассемблированию с помощью Z80asm 1.5, +пример нашей программы: +0x7E00 +ORG ; +DB “ ” ; EXE +0x00 +DB ; +0x0200,0x0000 +DW ; +0x0000 +DW ; +0x00,0x00 +DB ; +0x00,0x00 +DB ; +0x0000 +DW ; +0x8000 +DW ; +DW EntryPoint ; +DW ; 0xBFFF +0x00 +times 0x1EA DB ; +EntryPoint LD A,0x81 +LD BC,0x0050 +RST 0x10 +JR C,VMError +0xE2 +IN A,( ) +LD (OldWin3Page),A +LD A,0x50 +0xE2 +OUT ( ),A +LD A,0x10 +0x89 +OUT ( ),A +LD A,0x12 +0xC000 +LD ( ),A +LD C,0x30 +RST 0x10 +LD A,(OldWin3Page) +0xE2 +OUT ( ),A +LD A,0x03 +LD BC,0x0050 +RST 0x10 +Exit LD BC,0x0041 +RST 0x10 +VMError LD HL,ErrMessage +LD BC,0x005C +RST 0x10 +JR Exit +ErrMessage DB “ Err — Unable to setvideomode! 0x0D 0x0A 0x00 +”, , , +OldWin3Page DB 0x00 +Заголовок исполняемого файла для «Спринтера» +Решив попробовать свои силы в программировании для « Спринтера +», +вы можете воспользоваться ассемблером на самом « » (например, Спринтере OrgAsm +), +либо любым подходящим вам кроссассемблером. +Спринтеровские ассемблеры умеют автоматически создавать исполняемые файлы. +Однако, если вы выбрали второй вариант, то для создания исполняемого файла вам +необходимо добавить к своей программе заголовок, содержащий в себе служебную +информацию, указывающую операционной системе как и куда загружать +исполняемый код. +Вид заголовка показан на рисунке (префикс 0x означает запись в шестнадцатеричной системе +счисления). +Обычно код программы размещают начиная с адреса 0x8100, и первая строка в заголовке +указывает начальный адрес компиляции – 0x7F00, т.е. +0x8100–0x0200 (общая длина заголовка 512 байт). +После этого следуют три латинские литеры «EXE», +служащие для определения типа файла. +За ними указывается номер версии исполняемого файла (сейчас используется нулевая версия). +Далее располагается информация о смещении кода вашей программы от начала исполняемого +файла, т.е. фактически указывается длина заголовка (512 байт). +Если ваш ассемблер не поддерживает тип «двойное слово», можно заменить эту строку на: +DEFW 0x0000,0x0200 +Теперь надо указать длину начального загрузчика, если он есть (либо 0 если его нет). +В том случае, если ваша программа разбита на независимые модули (или секции кода и данных), +вы можете организовать программу таким образом, чтобы при запуске она самостоятельно +принимала решение о том, что и как загружать в память и запускать, выделив часть кода +в начальный загрузчик. +Затем идут 6 байт, зарезервированных под дальнейшее развитие формата исполняемого файла. +Обратите внимание, что для соблюдения совместимости с последующими форматами следует +всегда заполнять зарезервированные байты нулевыми значениями. +После зарезервированных байт указывается начальный адрес загрузки кода вашей программы. +За ним указывается адрес ее запуска, т.е. значение, которое будет занесено в регистр PC. +Сразу после него идет адрес вершины стека (для загрузки регистра SP), устанавливаемый +при запуске вашей программы, которое не рекомендуется менять. +И в конце заголовка идут 490 зарезервированных байт. +Далее с метки START начинается код вашей программы. +ORG 0x7F00 +DEFW ; +0x5845 EXE Signature +DEFB ; +0x45 Reserved (EXE type) +DEFB ; +0x00 Version of EXE file +DEFD ; +0x00000200 Code offset +DEFW ; +0x0000 Primary loader size or 0 +DEFD ; +0x00000000 Reserved +DEFW ; +0x0000 Reserved +DEFW START ; Loading address +DEFW START ; Starting address (register PC) +DEFW ; 0x0BFFFh Stack address (register SP) +DEFS ; +0x1EAh Reserved 1 +START первая команда вашей программы diff --git a/docs/part2/accelerator_doc.txt b/docs/part2/accelerator_doc.txt new file mode 100644 index 0000000..6e2dc66 --- /dev/null +++ b/docs/part2/accelerator_doc.txt @@ -0,0 +1,278 @@ +The Accelerator + + The Accelerator is the internal device realised by PLD. Almost all configurations of Sprinter include the Accelerator with different sets of commands. Below we described the Accelerator for Sprinter Configuration. + + The Accelerator serves for acceleration of data blocks transfer as fast as possible (today, up to a physical speed limit of the RAM). The Accelerator supports data blocks transfer of RAM and Video-RAM. And it is not supports data blocks transfer of ROM and FastRAM. + + The Accelerator allows: + +- fast filling of horizontal or vertical screen line of 1-256 pixels by one color (in 640x256 mode - one/double horizontal line of 1-512 pixels). +- fast copying of horizontal or vertical screen line of 1-256 pixels (in 640x256 mode - horizontal line of 1-512 pixels). +- use AND, OR and XOR operations with data blocks. + + The Accelerator has 256 bytes of memory that used for the data transfers. This Accelerator memory is a part of PLD internal memory. Data transfer begin when you load that data block to the Accelerator memory. Next that block is copying to the selected part of RAM. Last operation can be repeated as often as you need. It is a way for filling the screen by textures. + + Another mode is used for filling a screen by one color. The screen is filling by one byte from CPU bus. + + For control the Accelerator from a program use following CPU commands: + +LD B, B - Switch the Accelerator off. + +LD D, D - Switch the Accelerator in the mode of load a byte of block size. +Next command is "LD A, dat" where "dat" is a new block size. + +LD C, C - Switch the Accelerator to filling by one byte mode for horizontal line. +Next command "LD (HL), A" will fill all bytes by value of A. + +LD E, E - Switch the Accelerator to filling by one byte mode for vertical line. + +LD H, H - Reserved. + +LD L, L - Switch the Accelerator to copying a data block mode for horizontal line of the screen. +Next command "LD A, (HL)" will fill the Accelerator memory by value of (HL). +And the command "LD (DE), A" will copy the data from the Accelerator memory to RAM or to VideoRAM. + +LD A, A - Switch the Accelerator to copying a data block mode for vertical line of the screen. + + The following program will copy data from the first screen to the second screen. It takes nearly two interrupts (1,2 INT). + + ; display page was opened from the #C000 already + LD HL,#C000 ; Address of the beginning of a line of first screen + LD DE,#C180 ; Address of the beginning of a line of second screen + LD BC,#140 ; The width of the screen + DI ; Disable interrupt + LD D,D ; Switch the Accelerator to define block size mode + LD A,0 ; Set block size to 256 bytes + LD A,A ; Switch the Accelerator to copying a graphic data block mode + LDIR ; Copying + LD B,B ; Switch the Accelerator off + EI ; Enable interrupt + Additional functions of the Accelerator (AND, OR, XOR) is available too. + + The following program is coding 256 bytes block. + + LD HL,ADRES_1 + LD DE,XOR_DAT + DI + LD D,D + LD A,0 ; Number of bytes which must be encoded + LD L,L + LD A,(DE) ; Load data block to the Accelerator memory + XOR (HL) ; XOR + LD (HL),A ; Load result to RAM + LD B,B + EI + + The speed of the Accelerator is limited only by physical speed of RAM. To define an time of the command's work with the Accelerator it's possibleby next formula: + +Time of work = time of work without the Accelerator + time of the Acelerator work. + +Time of the Acelerator work = number of bytes / 7000000. + +Note: disable interrupt during the Accelerator work! + + + Examples of usage the Accelerator. + +;************************** + +; Interrupt - enable +; Stack, Program & Data - in (8000h..BFFFh) +; Video-RAM - in (C000h..FFFFh) +; Video-Data - (0000h..BFFFh) +; +; +Screen_offset EQU 0C000h ; or 0C140h for second grafic screen + +Video_Data EQU *** ; 0000h..BFFFh +Color_for_fill EQU *** ; 0..255 + +Horizontal_offset EQU *** ; 0...319 +Vertical_offset EQU *** ; 0...255 +Horizontal_size EQU *** ; 1...256 +Vertical_size EQU *** ; 1...256 + +;************************** + +Open_video_page: + + IN A,(PORT_Y) + LD (SAVE_PY),A ; save port_y + IN A,(PAGE3) + LD (SAVE_PG3),A ; save page3 + LD A,50h ; Use 50h for normal mode + ; 54h for "no copy in main shadow RAM" mode + ; 58h for "FF is transparent" mode + ; 5Ch for "no copy in main shadow RAM" and + ; "FF is transparent" mode + OUT (PAGE3),A + RET + +SAVE_PG3: DB 0FFh +SAVE_PY: DB 0C0h + +;************************** + +Close_video_page: + + LD A,(SAVE_PG3) + OUT (PAGE3),A + LD A,(SAVE_PY) + OUT (PORT_Y),A + RET + +;************************** + +Horizontal_Line_copy: + + LD HL,Video_Data + LD DE,Screen_Offset+Horizontal_Offset + LD A,Vertical_Offset + OUT (PORT_Y),A ; Set vertical offset + DI + LD D,D ; Switch the Accelerator to define block size mode + LD A,Horizontal_size ; Use direct data or (HL),(BC),(DE) only! + ; !!! not ld A,C !!! + LD B,B ; Stop the Accelerator + LD L,L ; Switch the Accelerator to copying a data block mode + LD A,(HL) ; Get data line + LD (DE),A ; Put data line + LD B,B ; Stop the Accelerator + EI + RET + +;************************** + +Vertical_Line_copy: + + LD HL,Video_Data + LD DE,Screen_Offset+Horizontal_Offset + LD A,Vertical_Offset + OUT (PORT_Y),A ; Set vertical offset + DI + LD D,D ; Switch the Accelerator to define block size mode + LD A,Vertical_size ; Use direct data or (HL),(BC),(DE) only! + ; !!! not ld A,C !!! + LD B,B ; Stop the Accelerator + LD A,A ; Switch the Accelerator to copying a graphic data block mode + LD A,(HL) ; Get data line + LD (DE),A ; Put data line + LD B,B ; Stop the Accelerator + EI + RET + +;************************** + +Horizontal_Line_Fill: + + LD DE,Screen_Offset+Horizontal_Offset + LD A,Vertical_Offset + OUT (PORT_Y),A ; Set vertical offset + DI + LD D,D ; Switch the Accelerator to define block size mode + LD A,Horizontal_size ; Use direct data or (HL),(BC),(DE) only! + ; !!! not ld A,C !!! + LD B,B ; Stop the Accelerator + LD A,Color_for_fill + LD C,C ; Switch the Accelerator to filling by one byte mode + LD (DE),A ; Put line of color + LD B,B ; Stop the Accelerator + EI + RET + +;************************** + +Vertical_Line_Fill: + + LD DE,Screen_Offset+Horizontal_Offset + LD A,Vertical_Offset + OUT (PORT_Y),A ; Set vertical offset + DI + LD D,D ; Switch the Accelerator to define block size mode + LD A,Vertical_size ; Use direct data or (HL),(BC),(DE) only! + ; !!! not ld A,C !!! + LD B,B ; Stop the Accelerator + LD A,Color_for_fill + LD E,E ; Switch the Accelerator to filling by one byte mode + LD (DE),A ; Put line of color + LD B,B ; Stop the Accelerator + EI + RET + +;************************** + +Draw_Restangle_Data: + + LD HL,Video_Data + LD DE,Screen_Offset+Horizontal_Offset + LD A,Vertical_Offset + OUT (PORT_Y),A ; Set vertical offset + LD B,Vertical_size ; 0 is 256 + LD C,Horizontal_Size ; 0 is 256 + + DI + LD D,D ; Switch the Accelerator to define block size mode + LD A,Horizontal_Size ; Use direct data or (HL),(BC),(DE) only! + ; !!! not ld A,C !!! + LD B,B ; Stop the Accelerator + EI + +drd_loop: + DI + LD L,L ; Switch the Accelerator to copying a data block mode + LD A,(HL) ; Get data line + LD (DE),A ; Put data line + LD B,B ; Stop the Accelerator + EI + + LD A,C ; Next line data + AND A + JR Z,drd_inc + ADD A,L + LD L,A + JR NC,drd_no_inc +drd_inc: + INC H +drd_no_inc: + + IN A,(PORT_Y) ; Next line + INC A + OUT (PORT_Y),A + + DJNZ drd_loop ; Loop + + RET + +;************************** + +Draw_Restangle_Fill: + + LD HL,Screen_Offset+Horizontal_Offset + LD A,Vertical_Offset + OUT (PORT_Y),A ; Set vertical offset + LD B,Vertical_size ; 0 is 256 + + DI + LD D,D ; Switch the Accelerator to define block size mode + LD A,Horizontal_Size ; Use direct data or (HL),(BC),(DE) only! + ; !!! not ld A,C !!! + LD B,B ; Stop the Accelerator + EI + + LD C,Color_for_fill + + IN A,(PORT_Y) +drf_loop: + DI + LD L,L ; Switch the Accelerator to copying a data block mode + LD (HL),C ; Put data line + LD B,B ; Stop the Accelerator + EI + INC A + OUT (PORT_Y),A + DJNZ drf_loop ; Loop + + RET + +;************************** +;************************** \ No newline at end of file diff --git a/docs/part2/bios_doc.txt b/docs/part2/bios_doc.txt new file mode 100644 index 0000000..0022ecb --- /dev/null +++ b/docs/part2/bios_doc.txt @@ -0,0 +1,1226 @@ +Функции BIOS v2.12 + +Вызов функций BIOS осуществляется из ассемблерного кода. + + + + Номер функции задается в регистре C процессора. В остальные регистры, при необходимости, загружаются входные параметры функции. После исполнения функции происходит возврат в программу, из которой произошел вызов функции. Установленный флаг CF (CF=1) означает, что работа функции произошла с ошибкой. В некоторых регистрах передаются выходные параметры. + + + +Ниже приведены таблицы входных и выходных параметров для каждой функции: + +• Функции работы с памятью + +• Функции управления 'железом' + +• Функции управления окнами и режимами экрана + +• Функции вывода текста на экран + +• Графические функции + +• Функции работы с жесткими дисками и дисководами + + При работе функций BIOS необходимо что бы стек находился в области 8000h..0BFFFh, так как часть функций использует переключение страниц PAGE1 и PAGE3. + + + +Вызов функций BIOS возможен в различных конфигурациях компьютера Sprinter. + + + +Конфигурация Spectrum: вызов функций BIOS осуществляется через 3D13h. При этом работают и все функции TR-DOS. + + + +Конфигурации Sprinter: вызов функций BIOS осуществляется через RST 18h при подключенном системном ПЗУ. + + + +Для постоянного подключения системного ПЗУ можно воспользоваться такой последовательностью команд: + + + + LD A,0 + + OUT (07Ch),A + +После ее исполнения в 0-м окне Z80 будет включено ПЗУ BIOSа и программа может вызывать функции BIOSа через RST 18h. + + + +Отключение ПЗУ BIOSа из нулевого окна Z80 производится следующей последовательностью команд: + + + + LD A,0 + + OUT (03Ch),A + +При необходимости, функции BIOSа могут быть вызваны программой, находящейся в ОЗУ непосредственно в нулевом окне Z80. Для этого надо установить в адресе 0008h следующий код: + + + +ADDRESS_0008h: + + PUSH AF + + LD A,0 + + OUT (7Ch),A + + POP AF + + RET + + После этого BIOS можно вызывать командой RST 8. (Функции TR-DOS, так же как и в случае RST 18 остаются недоступны.) Вызывая программы таким образом, через RST 8, следует помнить что адреса 3FFFh..0000h после входа в BIOS будут содержать код ПЗУ, поэтому, если фунция использует данные в ОЗУ, они должны находиться в других адресах. + + + + Оптимизация программы для RST 8 недопустима, так как в ПЗУ, для обратного переключения, стоит такая же программа, только порт 3Ch для отключения ПЗУ BIOSа. + + + + Вызов функций BIOS в exe-файлах, вызываемых с помощью операционной системы Estex, производится командой RST 8. Необходимая программа в адресе 0008h уже имеется в блоке кода ОС Estex. + + + + + +Функции работы с памятью + +0C0h (192) EMM_FN0 Определение объемов ОЗУ + +Значение регистров на входе: + + C=0C0h Значение регистров на выходе: + + HL - общий объем ОЗУ в страницах по 16k + + BC - объем свободного ОЗУ в страницах по 16k + +0C1h (193) EMM_FN1 Инициализация распределения памяти. + + Стирается вся информация о выделенных ранее блоках ОЗУ. + + Блоки с системной информацией и первые 256K ОЗУ объявляются занятыми. + +Значение регистров на входе: + + C=0C1h Значение регистров на выходе: + + нет + +0C2h (194) EMM_FN2 Выделение блока ОЗУ + +Значение регистров на входе: + + C=0C2h + + B - число запрашиваемых страниц Значение регистров на выходе: + + CF=0 - нормальное завершение - A - идентификатор блока + + CF=1 - ошибка - A=1 - не хватает памяти + +0C3h (195) EMM_FN3 Освободить блок ОЗУ + +Значение регистров на входе: + + C=0C3h + + A - идентификатор блока Значение регистров на выходе: + + CF=0 - нормальное завершение + + C - неправильный идентификатор + + идентификатор не всегда отслеживается правильно + +0C4h (196) EMM_FN4 Получить физический номер страницы из блока памяти + +Значение регистров на входе: + + C=0C4h + + A - идентификатор блока + + B - логическая номер страницы в блоке Значение регистров на выходе: + + CF=0 - A - логический номер страницы + + CF=1 - ошибка: + + A=0 - блок не существует + + A=255 - запрашиваемый номер страницы слишком велик + +0C5h (197) EMM_FN5 Получить список физических страниц блока + +Значение регистров на входе: + + C=0C5h + + A - идентификатор блока + + HL - буфер 256 байт для размещения списка страниц Значение регистров на выходе: + + CF=0 - нормальное завершение: + + B - число страниц в блоке + + HL - тот же адрес буфера, в буфере список физических страниц по порядку, заканчивающийся байтом 0FFh + + CF=1 - неверный идентификатор блока; старая информация в буфере может быть затерта + +0C6h (198) EMM_FN6 Получение адресов портов окон + +примечание по использованию + + +Значение регистров на входе: + + C=0C6h + + A - номер окна процессора - 0,1,2 или 3 Значение регистров на выходе: + + CF=0 - нормальное завершение + + C - 8-битный адрес порта окна + + B - физический номер подключенной в окно страницы + + CF=1 - ошибка - неверный номер окна + +0C7h (199) EMM_FN7 Получить номер следующей страницы блока + +примечание по использованию + + +Значение регистров на входе: + + C=0C7h + + A - физическая страница Значение регистров на выходе: + + CF=0 - нормальное завершение + + A - следуюшая физическая страница блока + + A=0FFh - индицирует конец блока + + CF=1 - ошибка - страница не принадлежит никакому блоку. фактически, это означает, что она свободна. + +09Eh (158) EMM_FN8 Слияние блоков + +Значение регистров на входе: + + A - идентификатор блока 1 + + B - идентификатор блока 2 Значение регистров на выходе: + + CF=0 - нормальное завершение + + A - идентификатор объединенного блока + + CF=1 - ошибка - неверный идентификатор блока + +09Dh (157) EMM_FN9 Разделение блока + +Значение регистров на входе: + + C=09Dh + + A - идентификатор блока + + B - новая длина блока Значение регистров на выходе: + + CF=0 - нормальное завершение + + A - идентификатор блока результата + + B - идентификатор блока остатка + + CF=1 - ошибка - неверный идентификатор блока + +Функции управления 'железом' + +0EFh (239) FN_VERSION Выдача информации о версии BIOSа и железа. + +Значение регистров на входе: + + C=0EFh + + HL - буфер, куда будет помещена ASCII строка с несколькими полями, номером версии BIOS и названием модели компьютера. Конец строки отмечен двойным нулем. Значение регистров на выходе: + + CF=0 - нормальное завершение + + HL - тот же буфер с записанной строкой. + + DE - версия BIOSа + + BC - версия железа подробности ниже + + A - количество полей в буфере (в данный момент - 2) + + Первое поле - версия BIOS. + + Второе - название модели компьютера. + + CF=1 - ошибка - Очень старая версия, + + не имеющая данной функции + +0F2h (242) FN_SICF=0 Установка синхронизации, очистка страницы режима экрана + +Значение регистров на входе: + + C=0F2h + + A - режим синхронизации Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - неверный номер режима синхронизации + +0F5h (245) CMOS_TEST Проверить наличие CMOS + +комментарий + + +Значение регистров на входе: + + C=0F5h Значение регистров на выходе: + + CF=0 - часы есть + + CF=1 - часов нет + +0F6h (246) CMOS_RD Читать из регистра CMOS + +комментарий + + +Значение регистров на входе: + + C=0F6h + + D - номер регистра CMOS Значение регистров на выходе: + + A - считанные данные + + CF=0 - часы есть + + CF=1 - часов нет + +0F7h (247) CMOS_WR Писать в регистр CMOS + +комментарий + + +Значение регистров на входе: + + C=0F7h + + D - номер регистра CMOS + + A - записываемые данные Значение регистров на выходе: + + CF=0 - часы есть + + CF=1 - часов нет + +08Fh (143) FN_TURBO Функция управления турбо режимом. + + комментарий + + +Значение регистров на входе: + + C=08Fh + + A - режим турбо: 2 - off, 3 - on Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - неверный режим турбо + +Функции управления окнами и режимами экрана + +0B0h (176) WIN_OPEN Функция открытия окна. + +Значение регистров на входе: + + C=0B0h + + IX - описатель окна + + E - флаги окна: + + бит 0 указывает какую страницу режима включать после исполнения функции; + + бит 4 указывает на какой странице режима открывать окно Значение регистров на выходе: + + CF=0 - нормальное завершение: + + A - идентификатор окна + + CF=1 - ошибка слишком много окон + +0B1h (177) WIN_CLOSE закрытие окна + +Значение регистров на входе: + + C=0B1h + + A - идентификатор окна Значение регистров на выходе: + + CF=0 - успешное завершение + + CF=1 - ошибка - неверный идентификатор + + Окно с номером 0 никогда не закрывается и попытка закрытия приводит к ошибке + +0B2h (178) WIN_COPY_WIN Копирование данных текстового окна в память (запоминание окна) + + При работе этой функции через RST 18h или RST 8, обязателен запрет прерываний, так как функция пользуется стеком для ускорения своей работы. + +Значение регистров на входе: + + C=0B2h + + A - идентификатор глобального окна + + H - размер окна в символах по вертикали + + L - размер окна в символах по горизонтали + + D - вертикальное положение окна в глобальном окне + + E - горизонтальное положение окна в глобальном окне + + IX - адрес буфера для запоминания данных + + адрес буфера указывается для окна 0C000h если адрес указан с 8000h, номер страницы буфера не действителен ниже 8000h адрес указывать нельзя + + A' - страница буфера для данных окна + + эта страница должна принадлежать программе Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - ошибка - неверный идентификатор окна + +0B3h (179) WIN_RESTORE_WIN Копирование из памяти в текстовое окно (восстановление окна) + + При работе этой функции через RST 18h или RST 8, обязателен запрет прерываний, так как функция пользуется стеком для ускорения своей работы. + +Значение регистров на входе: + + C=0B2h + + A - идентификатор глобального окна + + H - размер окна в символах по вертикали + + L - размер окна в символах по горизонтали + + D - вертикальное положение окна в глобальном окне + + E - горизонтальное положение окна в глобальном окне + + IX - адрес буфера для запоминания данных + + адрес буфера указывается для окна 0C000h если адрес указан с 8000h, номер страницы буфера не действителен ниже 8000h адрес указывать нельзя + + A' - страница буфера для данных окна + + эта страница должна принадлежать программе Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - ошибка - неверный идентификатор окна + +0B4h (180) WIN_GET_SYM Взять символ с экрана + +Значение регистров на входе: + + C=0B4h + + A - идентификатор окна + + DE - положение символа в окне: + + D - вертикаль, E - горизонталь Значение регистров на выходе: + + CF=0 - нормальное завершение + + L - символ, H - атрибут, + + B - знакогенератор + + CF=1 - ошибка неверный идентификатор окна + +0B5h (181) WIN_PUT_SYM Положить символ на экран + +Значение регистров на входе: + + C=0B5h + + A - идентификатор окна + + DE - положение символа в окне: + + D - вертикаль, E - горизонталь + + L - символ, H - атрибут символа + + B - знакогенератор Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - ошибка неверный идентификатор окна + +0B6h (182) WIN_SET_ZG установка знакогенератора + +Значение регистров на входе: + + C=0B6h + + A - системный номер знакогенератора + + DE - указатель на 2Kb блок данных знакогенератора Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - ошибка (старая версия, нет функции) + +0B7h (183) WIN_MOVE_WIN Перемещение окна + + При работе этой функции через RST 18h или RST 8, обязателен запрет прерываний, так как функция пользуется стеком для ускорения своей работы. + +Значение регистров на входе: + + C=0B7h + + A - идентификатор глобального окна + + H - размер локального окна по вертикали в символах + + L - размер локального окна по горизонтали в символах + + D - положение локального окна по вертикали в символах + + E - положение локального окна по горизонтали в символах + + IX - новое положение локального окна (подобно DE) Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - ошибка - неверный идентификатор окна + +0B8h (184) WIN_GET_ZG Получение знакогенератора + +Значение регистров на входе: + + C=0B8h + + DE - адрес, куда будет загружено 2kb знакогенератора Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - ошибка (старая версия, нет функции) + +Функции вывода текста на экран + +081h (129) LP_PRINT_ALL Печать символов с атрибутом + + На экран выводится строка из B одинаковых символов + +Значение регистров на входе: + + C=081h + + A - символ + + E - атрибут + + B - число выводимых символов + + регистры HL,IX - сохраняются Значение регистров на выходе: + + CF=0 - всегда + +082h (131) LP_PRINT_SYM Вывод символов на экран без атрибута + + На экран выводится строка из B одинаковых символов атрибут остается тот, который был на экране + +Значение регистров на входе: + + C=082h + + A - символ + + B - число выводимых символов + + регистры HL,IX - сохраняются Значение регистров на выходе: + + CF=0 - всегда + +083h (131) LP_PRINT_ATR печать атрибутов + + На экран выводится строка из B одинаковых атрибутов. + + Символы не меняются. + +Значение регистров на входе: + + C=083h + + E - атрибут + + B - число выводимых символов + + регистры HL,IX - сохраняются Значение регистров на выходе: + + CF=0 - всегда + +084h (132) LP_SET_PLACE Установка текущего знакоместа в окне + + Позиция печати устанавливается в соответстии с регистром DE + +Значение регистров на входе: + + C=084h + + E - положение символа по горизонтали + + D - номер символа по вертикали + + Превышение границ приводит не к ошибке, а к переустановке сначала, за вычетом полного размера окна Значение регистров на выходе: + + CF=0 - всегда + +085h (133) LP_PRINT_LN Вывод строки символов на экран с текущего знакоместа + +Значение регистров на входе: + + C=085h + + HL - адрес строки должен быть между 04000h и 0BFFFh + + E - атрибут, с которым будет выведена строка + + B - длина выводимой строки Значение регистров на выходе: + + CF=0 - всегда + +086h (134) LP_PRINT_LN2 Вывод строки символов на экран без атрибутов + +Значение регистров на входе: + + C=086h + + HL - адрес строки должен быть между 04000h и 0BFFFh + + B - длина выводимой строки Значение регистров на выходе: + + CF=0 - всегда + +087h (135) LP_PRINT_LN3 Вывод строки символов до разделителя + + После разделителя выводятся пробелы, что бы вывести B символов + +Значение регистров на входе: + + C=087h + + HL - адрес строки должен быть между 04000h и 0BFFFh + + E - атрибут, с которым будет выведена строка + + B - длина выводимой строки + + D - символ-разделитель, указывающий конец строки Значение регистров на выходе: + + CF=0 - всегда + +088h (136) LP_PRINT_LN4 Вывод строки символов до разделителя, без атрибутов + + символы из выводятся на экран, пока не встретится символ равный D, далее печатаются пробелы, как дополнение строки до B символов. Атрибуты не изменяются. + +Значение регистров на входе: + + C=088h + + HL - адрес строки должен быть между 04000h и 0BFFFh + + B - длина выводимой строки + + D - символ-разделитель, указывающий конец строки Значение регистров на выходе: + + CF=0 - всегда + +089h (137) LP_CLS_WIN Очистка экрана + + Выполнение произворится выводом пробелов с заданным атрибутом + +Значение регистров на входе: + + C=089h + + DE положение локального окна + + H - размер в символах локального окна по вертикали + + L - размер в символах локального окна по горизонтали + + B - атрибут очистки Значение регистров на выходе: + + CF=0 - всегда + +08Ah (138) LP_SCROLL_UD Скроллинг части глобального окна вверх/вниз + + Скроллируются полные строки глобального окна + +Значение регистров на входе: + + C=08Ah + + B - тип скроллинга: 1 - вверх; 2 - вниз + + D - начальная строка скроллинга + + E - число скроллируемых строк Значение регистров на выходе: + + CF=0 - всегда + +08Bh (139) LP_PRINT_LN5 Вывод строки символов на экран до разделителя + + После разделителя вывод останавливается + +Значение регистров на входе: + + HL - адрес строки должен быть между 04000h и 0BFFFh + + E - атрибут, с которым будет выведена строка + + B - максимальная длина выводимой строки + + D - символ-разделитель, указывающий конец строки Значение регистров на выходе: + + CF=0 - всегда + +08Ch (140) LP_PRINT_LN6 Вывод строки символов на экран до разделителя без атрибутов + + После разделителя вывод останавливается. + +Значение регистров на входе: + + C=08Ch + + HL - адрес строки должен быть между 04000h и 0BFFFh + + B - максимальная длина выводимой строки + + D - символ-разделитель, указывающий конец строки Значение регистров на выходе: + + CF=0 - всегда + +08Dh (141) LP_CLS_WIN2 Очистка экрана с указанием символа заполнения + +Значение регистров на входе: + + C=08Dh + + DE положение локального окна + + H - размер в символах локального окна по вертикали + + L - размер в символах локального окна по горизонтали + + B - атрибут очистки + + A - символ очистки Значение регистров на выходе: + + CF=0 - всегда + +08Eh (142) LP_GET_PLACE Получить текущее положение вывода на экран + +Значение регистров на входе: + + C=08Eh Значение регистров на выходе: + + CF=0 - всегда + + DE - координаты, в которых будет напечатан + + следующий символ: + + D - вертикаль, E - горизонталь + +Графические функции + +0A1h (161) PIC_POINT Установить точку + +Значение регистров на входе: + + C=0A1h + + DE - координата по вертикали (пиксели) + + HL - координата по горизонтали (пиксели) + + Координаты считаются от верхнего левого угла экрана + + A - идентификатор окна + + B - цвет точки Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - неверный идентификатор окна + +0A4h (164) PIC_SET_PAL Установка палитры + +Значение регистров на входе: + + C=0A4h + + HL - данные палитры + + E - номер начального цвета + + D - количество устанавливаемых цветов + + B - маска при установке палитры. + + Для нормального режима должнa быть 0FFh + + A - номер палитры 0..15; от 8 до 15 - резервные Значение регистров на выходе: + + CF=0 - всегда + +0A6h (166) SET_PAL_INIT Установка внутренней палитры + +Значение регистров на входе: + + C=0A6h + + A - страница палитры + + B - номер палитры: + + B=2 - установка спектрумовской палитры + + B=1 - установка графической плаитры Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - неверный номер палитры + +Функции работы с жесткими дисками и дисководами + +50h,52h,53h (80,82,83) Зарезервированы + +Значение регистров на входе: + + нет Значение регистров на выходе: + + нет + +51h (81) DRV_RESET Сброс контроллера и настройка на диск + +Значение регистров на входе: + + C=51h + + A - номер и тип устройства + +бит 7..4 - тип устройства: + + #0x - FDD + + #6x - RAM-DISK + + #8x - HDD + + #Cx - CD-ROM + +бит 3..0 - номер устройства Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - ошибка, нет диска или нет устройства + +54h (84) DRV_VERIFY Проверка секторов + + Проверка внутренняя на совпадение ECC + +Значение регистров на входе: + + C=54h + + A - номер и тип устройства (см. выше) + + HL:IX - номер сектора (IX - младшая часть номера сектора) + + B - количество проверяемых секторов Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - проверка с ошибкой + +55h (85) DRV_READ Чтение с устройства + +Значение регистров на входе: + + C=55h + + A - номер и тип устройства (см. выше) + + HL:IX - номер сектора (IX - младшая часть номера сектора) + + B - количество секторов + + DE - адрес буфера для данных Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - ошибка чтения + + HL:IX - номер сектора + кол-во прочитанных секторов + + DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) + +56h (86) DRV_WRITE Запись на устройства + +Значение регистров на входе: + + C=56h + + A - номер и тип устройства (см. выше) + + HL:IX - номер сектора (IX - младшая часть номера сектора) + + B - количество секторов + + DE - адрес буфера данных для записи Значение регистров на выходе: + + CF=0 - нормальное завершение + + CF=1 - ошибка записи + + HL:IX - номер сектора + кол-во прочитанных секторов + + DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) + +57h (87) DRV_DETECT Определение параметров устройства + +Значение регистров на входе: + + C=57h + + A - номер и тип устройства (см. выше) + +Значение регистров на выходе: + + CF=0 - нормальное завершение + + A - bit7=0 диск 720Кb + + Bit7=1 диск 1.44Mb + + CF=1 - нет устройства или нет носителя + +58h (88) DRV_GET_PAR Получить параметры носителя + +Значение регистров на входе: + + C=58h + + A - номер и тип устройства (см. выше) + +Значение регистров на выходе: + + CF=0 - нормальное завершение + + L - число секторов + + H - число головок + + DE - количество цилиндров + + если HL=DE=0FFFFh - устройства нет + + IX - размер сектора в байтах + + B - доп. параметры для дискет: + + бит7 - тип 1.44/720 + + CF=1 - нет устройства + +59h (89) DRV_SET_PAR Установить параметры носителя + +Значение регистров на входе: + + A - номер и тип устройства (см. выше) + + L - число секторов + + H - число головок + + DE - количество цилиндров + + IX - размер сектора в байтах + + B - доп. параметры для дискет + + бит7 - тип 1.44/720 Значение регистров на выходе: + + CF=0 - нормальное завершение + +5Ah (90) EXT_VERSION Номер версии дисковой спецификации. + +Значение регистров на входе: + + C=5Ah Значение регистров на выходе: + + CF=0 - нормальное завершение + + D - версия + + E - модификация + + CF=1 - ошибка + +5Fh (95) DRV_LIST Список дисковых устройств + +Значение регистров на входе: + + C=5Fh + + IX - буфер для списка устройств Значение регистров на выходе: + + CF=0 - нормальное завершение + +В буфере список дисков в формате: + +IX+0 - размер заполненого буфера + +IX+1 - кол-во устройств FDD + +IX+2 - кол-во устройств HDD + +IX+3 - кол-во устройств CD DRIVE + +IX+4 - #00 - конец списка, иначе кол-во устройств нового типа + + + + + +Примечания и комментарии. + + + +Примечание по использованию функции получения адресов портов окон (0C6h). + + + +Cледует хотя бы один раз вызвать эти функции и сравнить адреса портов с теми, что используются в программе и, если они не совпадают, выдать соответствующее предупреждение. В данный момент эти порты таковы: PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h, PAGE3=0E2h + + + +Примечание по использованию функции EMM_FN7 (0C7h). + + + +Информация о распределении памяти хранится в виде RAM Allocation Table, похожей на дисковый FAT. Поэтому нахождение физического номера следующей страницы по предыдущему физическому номеру происходит значительно быстрее, чем поиск по увеличенному на единицу логическому номеру. + + + +Комментарий к функции FN_VERSION (0EFh). + + + +Значения регистра BC на выходе и соответствующая ему конфигурация + + + + BC=FFFF - Не определено + + BC=FFFE - Конфигурация Spectrum, режим Sprinter ZX + + BC=FFFD - Конфигурация Sprinter + + BC=FFFC - Зарезервировано + + BC=FFFB - Зарезервировано + + BC=FFFA - Зарезервировано + + BC=FFF9 - Зарезервировано + +Иные значения BC - новые прошивки. + + + +Комментарий к функциям CMOS (0F5h-0F7h) + + + +Функции CMOS_RD, CMOS_WR, CMOS_TEST работают всегда. Если в машине нет микросхемы CMOS, то эмулируется ее память. Наличие микросхемы определяется функцией CMOS_TEST. + + + +Комментарий к функции FN_TURBO (08Fh) + + + +Переключение режима турбо может не произойти, если прошивка не поддерживает это переключение. При этом ошибки не происходит. Так же, переключение режима TURBO блокируется кнопкой "Turbo" в режиме Turbo-OFF + + + +Комментарий к функциям печати текста. + + + +Эти функции работают с текущим окном, которым всегда является последнее открытое окно. К графическому экрану функции печати текста не применимы. + + + +Описатель окна. + + + +Для открытия окон используется 32-хбайтовый описатель окна (дескриптор), адрес которого указывается в регистре IX. + + + + IX - 32-хбайтовый описатель окна + + (IX+0) - горизонтальный размер окна в знакоместах + + (IX+1) - вертикальный размер в знакоместах + + (IX+2) - положение окна по горизонтали на экране в знакоместах + + (IX+3) - положение окна по вертикали на экране в знакоместах + + (IX+4) - режим знакоместа + + bit4=1 - text_mode bit4=0 - graf_mode + + bit5=0 - 16, bit5=1 - 8 точек в знакоместе + + graf_mode bit3..0 - не существенны + + bit7..6 - номер палитры + + text_mode bit7..6,3..0 - номер знакогенератора + + исключение: bit7..6=B"11" - бордер + + (IX+5) - дополнительный режим знакоместа + + bit0=1 - указывает на включение спектрумовской + + адресации экрана + + (IX+6) - положение по X в поле графики (по знакоместам) + + (IX+7) - положение по Y в поле графики (по знакоместам) + + разъяснения о положении в поле графики - ниже + + (IX+8..31) - зарезервировано (переменные окна) + + в этих байтах должны быть нули + +При открытии окна описатель копируется в системную страницу ОЗУ и программа может не сохранять его. Что бы описатель окна не потерялся, программа получает идентификатор окна. Он же идентификатор глобального окна. В функциях запоминания, восстановления, перемещения, а так же функциях стирания, скроллинга и т.п. идентификатор окна определяет область экрана, относительно которой производится работа с локальными окнами. Подразумеваются локальные окна в смысле "окно в окне". Идентификатор окна определяет глобальное окно, отнoсительно которого адресуются локальные. В части функций глобальное окно определяется по умолчанию, как последнее, с которым производились действия с явным указанием идентификатора. + + + +В данный момент BIOS хранит только один описатель окна - последний, с которым была произведена функция открытия. Идентификатор окна выставляется в 0. В дальнейшем планитруется разработка функций со множеством окон, потому, во избежание неприятностей в будущем, при работе с окнами, программисту следует запоминать идентификатор окна и пользоваться этим значением при работе с ним. + + + +Типы стандартных окон: + + + + 0 - окно 32x24 в формате ZX Spectrum + + 1 - текстовое окно 64x24 + + 2 - текстовое окно 40x32 + + 3 - текстовое окно 80x32 + + 4 - окно в формате ZX Spectrum, HL - положение окна на экране в знакоместах + + 5 - текстовое окно 64x24, HL - положение окна на экране в знакоместах + + 6 - текстовое окно 40x32, HL - положение окна на экране в знакоместах + + 7 - текстовое окно 80x32, HL - положение окна на экране в знакоместах + + 8 - графическое окно 0, HL - положение окна на экране + + 9 - графическое окно 1, HL - положение окна на экране + + + +Данные палитры должны представлять собой список приблизительно такого вида: + + + + DB blue1,green1,red1,0 + + DB blue2,green2,red2,0 + + ..................... + + DB blueN,greenN,redN,0 + +N - количество цветов. Значеное равное 0 соответствует 256-ти цветам. При записи в видео-ОЗУ все данные предварительно проходят функцию AND со значением регистра маски - B. + + + +Страницы палитры 0..3 соответствуют графическим режимам. Для вывода в соответствующей палитре нужно задать соответствующее значение bit7..6 в байте режима знакоместа + + + +Страницы 4..7 соответствуют текстовому режиму и спектрумовскому режиму. В странице 4 задается цвет PAPER для каждого атрибута. В странице 5 задается цвет INK для каждого атрибута. В странице 6 задается цвет PAPER, которым он будет моргать в режиме FLASH В странице 7 задается цвет INK, которым он будет моргать в режиме FLASH. Таким образом, для каждого из 256-ти атрибутов задается четыре цвета если цвета 4,5 совпадают с цветами 6,7 то режим FLASH оказывается отключенным. Для его включения в спектрумовском режиме надо поменять местами цвета 6 и 7. Если надо включить FLASH в режим IBM-CGA, следует установить цвета 6 и 7 одинаковыми и равными цвету 4. По сути режим FLASH всегда включен, и на экране постоянно меняются цвета PAPER с 4-го на 6-й, а цвета INK с 5 на 7-й. Если эти пары цветов для атрибута знакоместа устанавливаются одинаковыми, то FLASH в этом месте не виден. + + + + + +Комментарий к функциям работы с устройствами хранения информации. + + + +В этих функциях в регистре A обычно задается номер и тип устройства: + + + + бит 0..3 - номер устройства + + бит 4..7 - тип устройства: + + 0 - дисковод + + 6 - ram-disk + + 8 - HDD + + C - CD-ROM + + остальные номера не используются + +А так же задаются: старшая часть номера сектора в регисте HL, младшая часть номера сектора в регистре IX. + diff --git a/docs/part2/cursor.cur b/docs/part2/cursor.cur new file mode 100755 index 0000000000000000000000000000000000000000..519107deb1d1dc79282921614802af15d80ffeeb GIT binary patch literal 256 zcmYj~(E{qE8 X3a= <00:04> Anton Yefimchuk wrоte to Ivan Mak: + + IM>> Sprinter-II с Forth-CPU :-)) + IM>> Или, если хочется побыстpее, то Sprinter-2000, в котоpом тоже + IM>> Forth-CPU намечается, а пока его нет, есть пpосто Sprinter-Forth + IM>> для Z80... + AY> А чем Спpинтеp-2000 отличается от пpосто Спpинтеpа? + +"Sprinter-2000 отличается умом и сообpазительностью. +Отличается умом. Отличается сообpазительностью." (c)... :-)) + +А если сеpьезно, то главное отличие - в большем объеме ПЛМ +(в 3 pаза больше, чем в пpосто Спpинтеpе). Так же имеется отличие в +pазводке памяти и контpоллеpа HDD. Отличие в стоpону 16-тиpазpядности. +Пpинципиально это повысит скоpость доступа акселеpатоpа к ОЗУ и скоpость +pаботы с HDD. Скоpость акселеpатоpа повышается до 14Mb/sek. +Скоpость HDD - до 7Mb/сек с хоpошими винчестеpами. Возможно и 14, +если удастся... Еще одна особенность возможность подключения до 64Mb +памяти, хотя, штатно будет по пpежнему 4. + +В общем, выпускать копию Sprinter-97 сейчас было, имхо, бы неpазумно, +а так, почти за те же деньги более кpутая машина. + +(Пpедположительно плата Sprinter-2000 будет стоить те же 90$.) + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: Spectrum - рулит, а Sprinter - работает. (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 18 Mar 01 11:50:05 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stanislav Udin +*** Subj: О Спpинтеpе. + + + Приветствую Вас, Stanislav! + + <15:11> Stanislav Udin wrоte to Ivan Mak: + + SU> А пpимеpные сpоки сказать можешь? +Май месяц, если не будет наводнений, землетpясений и т.п. катаклизмов, +наподобие обнаpужения кpупных глюков в плате.... + + SU>>> Можно ли настpоить Спpинтеp так, чтобы включив его даже и не + SU>>> подозpевать, что pаботаешь не на Скоpпионе? + IM>> Так что бы совсем не подозpевать, не полyчится :-) + SU> А как бyдет выглядеть пеpевод Спpинтеpеа в pежим Скоpпиона. Включаешь + SU> компьютеp и ... + +Ждешь секунды 2-3 пока не загpузится system.bat с пpописанным +в нем scorpion.exe + +Последнего, пpавда, нет, но каждый кодеp сможет написать, +если будет не лень потpатить день... + + IM>> Hадеюсь, пpоблем не бyдет. + IM>> В последней веpсии найден еще один глючок (паpа огибающих + IM>> непpавильно), он бyдет испpавлен. + SU> Все таки эмyляция есть эмyляция. Где гаpантия, что эта паpа огибающих + SU> была последней. + +Гаpантии такой нет, но есть иная. Возможные новые глюки испpавляются +чисто пеpешивкой ПЗУ. Пpинципиальных сложностей нет, надо только знать +в каком месте глюк и как должно быть веpно. + + IM>> Вот это было веpно для пpедыдyщей платы, там места для мыши не + IM>> хватало. В новой оно есть, посемy контpоллеp Kempston-Mouse + IM>> находится в плане pабот... + SU> Опять же хотелось бы yзнать о сpоках. + +Реализация кемпстона в течение этого года. Более точно вpяд ли скажу... +Ваpиант, что окажется уже вместе с платой к маю не исключаю... + + IM>> Как pаз о 3d13 pечь и есть. С винчестеpом можно pаботать пpямо из + IM>> командной стpоки TR-DOS. Команды CAT, SAVE, LOAD. Файл фоpмата + IM>> .trd загpyжается в RAM-Disk, дальше с ним можно pаботать как с + IM>> TR-DOS чеpез 3d13. + SU> То есть как y Hемо на Кае (или y Hемо как в Спpинтеpе)? + +Когда в Спpинтеpе уже были pамдиски по 3d13, Hемо говоpил, что Спектpуму +больше 256К не надоть, так что вывод соответствущший :-) + + SU> А если сделать RST0, в pам-диске останется тpд-обpаз? + +Останется. И если ctrl+alt+del, тоже останется. +Что бы исчез есть спец-команда в TR-DOS-е: +/CLEAR x для конкpетного pамдиска и +/INIT для всех сpазу... +Hу и еще кнопка Power :) + + SU> А много ли вообще пользователей Спpинтеpа? Много ли из них пишyт ПО + SU> для дополнительных pежимов этого компьютеpа? + +Пользователей пpимеpно 25, точнее сейчас не знаю. +Из пишущих ПО точно есть двое (я не в счет), а по слухам +кто-то еще тоже занимается пpогpаммами... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 18 Mar 01 11:51:19 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nikolay G.Arhipoff +*** Subj: О Спpинтеpе. + + + Приветствую Вас, Nikolay! + + <19:00> Nikolay G.Arhipoff wrоte to Ivan Mak: + +[пpо кемпстон-мышу] + SU>> Опять же хотелось бы yзнать о сpоках. + NA> Было говорено, что в Спринт втыкается мышка оффтопика без переделки. + +Да, она втыкается пpямо без пеpеделок. + + NA> Она будет _эмулироваться_ как Кемпстон? Или есть выбор + NA> кемпстон\некемпстон? + +Будет эмулиpоваться как Кемпстон, а как некемпстон pаботает уже сейчас +и будут оба ваpианта одновpеменно, или только некепстон, в зависимости +от выбpанной пpошивки (подгpужаемой с диска или штатной из ПЗУ). + + NA> В КАЕ образы дисков хранятся в исдосе, а здесь? В своей ОС? И как она + NA> называется? И что под нее есть? Когда-то создавался редактор текстов + NA> и Hортон ;) + +ОС своя - Sprinter-OS. По своему устpойству ближе к MS-DOS. +Файловая система на HDD - MS-DOS FAT16. Винчестеp вынутый из Спpинтеpа и +вставленный в ПЦ будет там виден. И наобоpот, если в ПЦ он на FAT16. +Делалось так именно для пpостоты пеpеноса файлов туда-сюда. +Дискеты в фоpматах TR-DOS/MS-DOS. +Для тpехдюймовых дисков поддеpживается фоpмат 720Kb и 1.44Mb. + +Из командеpов для Спpинтеpа самый кpутой - FlexNavigator - по уpовню +исполнения ближе к WinComander-у чем к Hотpону (16-цв.гpафика 640x256). + + IM>>> Его yвидит пpогpамма BC-terminal. Спpинтеpовская. В ней же и + IM>>> FIDO-мылеp. + NA> А модем какой? Hутряной или внешний? +Внутpенний. Втыкается пpямо в имеющийся на боpту ISA pазъем. + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 18 Mar 01 11:55:28 +*** From: Ivan Mak (2:5030/529.24) +*** To : Maxim Vialkov +*** Subj: Инфа + + + Приветствую Вас, Maxim! + + <07:18> Maxim Vialkov wrоte to Kirill Frolov: + + KF>> 1. Спринтер. $100 только матьплата. www.peters.spb.ru или как-то + + www.atlant.ru/peters или petersplus.da.ru + + KF>> 2. Scorpion. >= $30 www.scorpion.... тоже как-то так. + KF>> 3. Kay. >= $30 Hемо сетей не признёт. Телефон тебе сказали. + MV> Почему такой сильный разброс цен? Или "Спринтер"- крут немеряно? + +Именно так. Если 2 и 3 дополнять контpоллеpами ПЦ-клавы/мауса, ХДД, СМУК-ом, и +ГМХ-ом, получится доpоже, а до Спpинтеpа даже не дотянут по способностям, +ибо в Спpинтеpе все уже в мат-плате имеется, + +И цена Спpинтеpа в списочке немного завышена... $95 у него :-) + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 19 Mar 01 1:02:50 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stanislav Udin +*** Subj: О Спpинтеpе. + + + Приветствую Вас, Stanislav! + + <23:48> Stanislav Udin wrоte to Ivan Mak: + + IM>> Май месяц, если не бyдет наводнений, землетpясений и т.п. + IM>> катаклизмов, наподобие обнаpyжения кpyпных глюков в плате.... + SU> В пpинципе сpок достаточно не большой. +Hу так ведь pаботаем :) + + IM>> Ждешь секyнды 2-3 пока не загpyзится system.bat с пpописанным + IM>> в нем scorpion.exe + IM>> Последнего, пpавда, нет, но каждый кодеp сможет написать, + IM>> если бyдет не лень потpатить день... + SU> Это бyдет где-нибyдь докyментиpовано? + +Документиpовано, как подключать вместо стандатpной пpошивки ПЗУ любую +дpугую. А pаспpеделение памяти и подключение ПЗУ по 1FFD такое же как в +Скоpпионе, за исключением некотоpых мелких деталей (в Скоpпионе, если мне не +изменяет память, пpи включенной банке 0 поpты TR-DOS закpыты, а в Спpинтеpе +они откpоются пpи входе в область #3dxx) и закpоются только пpи выходе +пpогpаммы +из 0-й банки. + + SU> В таком слyчае вопpос следyющий. Где-нибyдь чеpез год некий мyзыкант + SU> находит ошибкy в эмyляции AY, обpащается в Петеpс, а там емy говоpят, + SU> что, мол, извини, но мы больше Спpинтеpами не занимаемся. Сколько + SU> человек, кpоме тебя поддеpживают идеологию Спpинтеpа в Петеpсе и на + SU> сколько вpемени хватит энтyзиазма? + +Энтузиазма хватает. Совсем недавно был пpинят еще один человек именно +для pаботы по теме Спpинтеpа. Кpоме того имеется пачка заказов, +что сейчас ждет майских плат. + + IM>> Реализация кемпстона в течение этого года. Более точно вpяд ли + IM>> скажy... Ваpиант, что окажется yже вместе с платой к маю не + IM>> исключаю... + SU> А от кого это зависит? + +Это зависит от моей головы. Если сумеет сделать быстpо, значит будет быстpо :) + + SU> Из этой и последyющих фpаз я понимаю, что pам-дисков может быть + SU> несколько, для каждого дисковода свой? + +Рам-дисков до 16-ти шт. Объем каждого кpатен 16кб и в сумме не пpевышает +~3.4Mb. Остальная память используется в pазных местах и занята постоянно. +Подключаться к дисководам они могут как угодно, т.е. пpогpамма может по +своему усмотpению подключить/отключить любой pамдиск от текущего дисковода. +Пpи необходимости можно подключить хоть ко всем четыpем дисководам четыpе +pамдиска... + + SU> Hе слишком много :( А почемy так мало pекламы? Компьютеp сyдя по + SU> всемy весьма неплохой, цена вполне пpиемлемая. Почемy же всего 25 + SU> пользователей? Чем больше pекламы, тем больше пользователей + SU> стандаpтных возможностей Спектpyма на Спpинтеpе, а в дальнейшем они + SU> могли бы задействовать и остальные pессypсы машины. Вот здесь + SU> некотоpые вообще не слышали пpо Спpинтеp. Разве это пpавильно? Hе + SU> многие знают, что спpинтеpе можно кyпить по почте. Это ваши yпyщения. + +В эхе pекламы было не мало (может, конечно, и не достаточно). Была и +в дpугих местах, в электpонных изданиях. Сейчас наибольшая pекламная +нагpузка в интеpнете, и дело постепенно движется... + + + SU> И последний вопpос. Можно ли пеpевести деньги за Спpинтеp по безналy, + SU> как от этого бyдет зависеть цена и сpоки? + +По поводу безнала и соответствующей цены, лучше сpазу обpатиться по адpесу +peters@atlant.ru я по этим вопpосам не в куpсе. Договаpиваться о покупке, в +любом случае, именно по этому адpесу. + +Сpок не думаю, что существенно изменится (полагаю, зависит только от +замоpочек с пpохождением денет и т.п. но, скоpее всего, этого нет). + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 19 Mar 01 0:59:51 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stanislav Udin +*** Subj: О Спpинтеpе. + + + Приветствую Вас, Stanislav! + + <23:59> Stanislav Udin wrоte to Ivan Mak: + + IM>> Из командеpов для Спpинтеpа самый кpyтой - FlexNavigator - по + IM>> ypовню исполнения ближе к WinComander-y чем к Hотpонy + IM>> (16-цв.гpафика 640x256). + SU> Где можно посмотpеть скpиншоты? + +В интеpнете, на www.atlant.ru/peters под ссылкой "Пpогpамное обеспечение" +(если не ошибаюсь). Hе увеpен, что там сейчас есть скpиншот от FN, но +ноpтон и гpаф-pедактоp там точно показаны. + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 22 Mar 01 11:31:25 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stanislav Udin +*** Subj: О Спpинтеpе. + + + Приветствую Вас, Stanislav! + + <11:33> Stanislav Udin wrоte to Ivan Mak: + + SU> Впечатляет! Только почемy на обоих скpиншотах стоит дата 19 мая 1998 + SU> года пpи этом в дpyгом yглy написано: Flex Navogator v1.03 (Release + SU> data 23.10.1999) Кстати пpошло yже почти полтоpа года с момента выхода + SU> этой веpсии, а за это вpемя можно было написать yже и веpсию 2.0. + SU> Отчего такие тоpмоза? + +19 мая 1998-го года, это системная дата, устанавливаемая в компьютеpе, +если нет CMOS-а. С CMOS там стояла бы текущая дата и вpемя. + +А веpсия не менялась, потому что Антон, к сожалению, сейчас дpугими +делами занимается, а не FN... не спpинтеpовскими :( + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 22 Mar 01 17:42:00 +*** From: Alex Goryachev (2:5030/529.48) +*** To : All +*** Subj: Sprinter News + + + Приветствую, All! + + Отвечая на вопросы о компьютере Sprinter, появившиеся в конференции, +надеюсь на понимание и доброжелательное отношение. + В настоящий момент проект "Sprinter" (кстати, писать нужно именно по +английски, потому как - Trade Mark :-) активно развивается. +Учитывая всем известное положение с персональными компьютерами и +распространением программного обеспечения у нас в стране, мы надеемся сейчас +на интерес к Sprinter-у со стороны иностранцев. + Hа сегодняшнем этапе работы мы хотим представить миру компьютер способный +заинтересовать в первую очередь разработчиков программного обеспечения 8-ми +и 16-ти битных компьютеров, приставок и игровых автоматов, имеющих +какой-либо рынок сбыта своих программ и сопутствующих товаров. +Такие команды есть поскольку за границей платят деньги за ПО, есть клубы и +постоянные пользователи. И поэтому наши дистрибьюторы на Западе смогут +продавать свое новое ПО вместе со Sprinter-ом. По западным меркам Sprinter +стоит не дорого (учитывая возможности и удобство использования периферии), +так что здесь возможен серьезный бизнес. + При условии создания ПО для Sprinter-а на Западе, наш компьютер может +оказаться востребованным и на внутреннем рынке. Hадеемся на это. + Сейчас у нас завязались отношения с двумя потенциальными дистрибьютерами +(в Испании и в США). Ими уже приобретены тестовые экземпляры, идет активная +переписка и перспективы вполне обнадеживающие. Есть и частные лица, заказавшие +Sprinter. + Поэтому работы над проектом ведутся сейчас в трех плоскостях: доработка +железа; оптимизация базового ПО, позволяющего использовать железо и создавать +на нем прикладное ПО; продвижение Sprinter-а на внешнем рынке и активный PR. + В базовое ПО в нашем представлении входит: DOS, файловый менеджер, +текстовый и графический редакторы, ассемблер, компиляторы с языков +программирования, набор утилит (конвертеры, вьюверы). + Что касается железа, то сейчас тестируется новая плата Sp2000 на ПЛМ +EP1K30QC208-3 (с объемом в три раза больше), которая должна стать основой +линии моделей Sprinter. Тут необходимо разделить понятия "плата компьютера" +и " модель компьютера ". Под платой надо понимать собственно плату, как +железо, а под моделью компьютера надо подразумевать набор конфигураций, +выполненых в Альтере. Если говорить о потенциале платы Sp2000, то можно +перечислить то новое, что она позволяет реализовать: + +1. 16-ти разрядную архитектуру сопряжения ПЛМ с основной памятью и IDE +(позволит увеличить скорость работы с HDD и скорость работы акселератора) + +2. Раздельную схему разводки блока основного ОЗУ, IDE, FDD с блоком +процессора, ПЗУ, КЭШ-ОЗУ, ISA. Позволит: +- организовать прямой доступ к памяти для IDE, FDD и не только; +- еще более увеличить скорость IDE; +- организовать быструю параллельную работу IDE и процессора; +- организовать видеорежимы с расположением данных в основном ОЗУ; + +3. 16-битный двухканальный звуковой ЦАП. А это полноценный 16-битный звук. + +4. И некоторые дополнительные возможности: +- подключение 72-pin SIMM от 4-х до 64-х мегабайт; +- ПЗУ до 256Kb +- полный порт принтера. + + Принципиальное отличие платы Sp2000 в том, что она позволяет проводить +апгрейд модели компьютера без замены платы. Это осуществляется с помощью +программы запускаемой на самом Sprinter-е и перезаписывающей информацию в +чипах платы. Стоимость подобного апгрейда будет невелика. Это сделает +Sprinter действительно гибким универсальным компьютером. + Сегодняшняя модель Sprinter к уже известным параметрам добавила полный +порт LPT и 16 битный звуковой ЦАП. Стоимость подобной конфигурации составляет +95 долларов. +В настоящий момент плата Sp2000 проходит тестирование и пока не готова для +продажи конечным +пользователям. В ней было реализовано много новинок, что не позволяет +выпустить ее в продажу без тщательной проверки и доводки. + + С учетом этого, мы решили расширить линейку плат Sprinter-а и готовы +предложить пользователям плату Sp2000-Light. Отличие от Sp2000 состоит в +отсутствии ISA слотов, второго IDE разъема и ограничении видео ОЗУ до 256Kb. +Это позволило снизить стоимость "железа" до 85 долларов. При этом плата +сохранила возможность программного апгрейда модели комьютера. +Hадеемся, что новая плата сможет заинтересовать пользователей, которым +Sprinter +интересен в первую очередь как "продвинутый" Specrtum. +Если вы хотите заказать плату Sp-2000-Light или у вас есть какие либо вопросы +пишите: + +FIDO: 2:5030/529.48 +e-mail: peters@atlant.ru + +Изображения новых плат доступны на нашем сайте http://www.petersplus.da.ru + +Также, если вы живете в Санкт-Петербурге, вы можете познакомиться с +компьютером Sprinter если зайдете в офис фирмы "ПЕТЕРС Плюс" по адресу +ул.Восстания 35, оф.31 (4 этаж), +(по рабочим дням, только с 17 до 19 часов) +тел. (812) 327-3531 + +Удачи всем! + +Алексей Горячев (менеджер проекта "Sprinter") + +... Я дух зла, насилия и смерти. Это меня отгоняли бесстрашные монахи, ударяя +в +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) +*** Area: ZX.SPECTRUM Date: 30 Mar 01 0:19:20 +*** From: Alex Goryachev (2:5030/529.48) +*** To : Alex Shevchuk +*** Subj: Sprinter News + + Рад приветствовать тебя, Alex! + + Friday March 23 2001 Alex Shevchuk -> Alex Goryachev. + + AS> 1. ISA слоты? И чего туда засовывать? + +Любую периферию, которая будет поддерживаться. Сейчас это модем и переходник +на спектрумовскую шину. + + AS> 2. Как насчет работы в сети? Работы с модемом? + +Для работы с Hayes-модемом есть терминалка (X,Y,Z протоколы). Пишется мейлер. + + AS> 3. Можно поподробней о проце и программировании под него? Что значит + AS> "продвинутый спектрум"? + +Sprinter, имеет режим работы, обеспечивающий полную совместимость со +Спектрумом, при этом, например, поддерживается работа с несколькими +RAM-дисками и скорость работы компьютера может быть увеличена за счет +повышения частоты работы процессора "на ходу". + +В качестве процессора используется Z84C15 с частотами 21/3,5MHz. + +А подробнее о работе процессора и его программировании, думаю, ответит наш +конструктор, Ivan Mak. + + AS> 4. С какими устройствами вообще он может/будет работать? + +Что имеется ввиду под "устройствами вообще"? :-) +Hа сегодняшний день: MS mouse, AT клавиатура, FDD 3,5" и 5,25", винчестер (с +FAT 16), CD-ROM, принтер (в том числе цветной), Hayes-модем, XTR-модем и +GSound (через переходник ISA2ZX), CGA монитор, телевизор со SCART, +магнитофон. Вроде все перечислил. +А с какими будет, посмотрим. Такие устройства точно есть, например VGA +монитор. + + + AS> 5. Какие устройства стандартного ввода/вывода у него будут + AS> использоваться? Я имею ввиду клаву/мышь/монитор. + +Сейчас используются клавиатура и мышь, продающиеся в любом компьютерном +магазине, чего не скажешь пока, к сожалению, о мониторе. Hо остается +возможность использования телевизора со стандартным разъемом SCART. + + + AS> 6. Как насчет фидошной поддержки? Будете создавать эху и фэху? + +Эхи и фэхи пока рано создавать - не то чило пользователей. А что касается +поддержки, то ваш интерес и вопросы и есть та самая поддержка. ФИДО никогда не +будет только рекламным полем, не для того эта сеть существует, а вот помочь в +выборе компьютера (если такая потребность возникнет), ответить на вопросы, +получить дельный совет или предложить идею, найти программистов, желающих +попробовать возможности Sprinter-а для реализации своих проектов, здесь ФИДО +как раз может помочь. + + AS> 7. В каких направлениях вы будете развивать эту технологию? + AS> "Домашний компьютер"? Значит, софт будет разрабатываться с такой же + AS> тематикой, как и на спеке? + +Учитывая гибкость архитектуры, Sprinter может стать универсальным компьютером. +Универсальность, +конечно, надо рассматривать в рамках его аппаратных возможностей. Есть много +задач, не подпадающих под вывеску "Домашний компьютер", которые по плечу +Sprinter-у, имей он соответствующее ПО. + +Если говорить о технологии в целом, то домашний компьютер - это только самое +близкое и очевидное направление. В перспективе возможно появление облегченных +устройств специального применения. У них будут функциональные ограничения, но +зато и стоимость таких устройств будет существенно ниже. Эти устройства будут +другими и внутренне и внешне. Hапример Интернет-приставка к домашнему +телевизору. Ей не требуется поддержка большего числа периферии, не нужна +стандартная клавиатура и громоздкий корпус, но совершенно необходимо наличие +флэш-памяти. + + AS> 8. Как насчет печатных изданий? Книги, журналы, справочники + AS> и прочая литература. А в электронном виде? + +Документация есть, она постоянно пополняется и причесывается. До сих пор мы +обходились брошюрами собственного изготовления, но при коммерческих +количествах понадобятся услуги типографии. +В период повышенного интереса к проекту Sprinter, в 97-98 году, новости о ходе +работ, статьи "за" и "против" регулярно появлялись в спектрумовских +электронных газетах и журналах. С тех пор изменения в проекте произошли, но +они коснулись в основном качества аппаратного и программного исполнения, что +не позволяет прямо сегодня заявить во всеуслышанье о том, что Sprinter +является продуктом, готовым для широкого применения. Пока Sprinter остается на +уровне андеграунда, и только-только начинает серьезные шаги к компьютерному +рынку. + + AS> 9. Я люблю спек. Какие причины должны заставить меня пользоваться + AS> сприн...ой, извини, торговая марка =)... Sprinter-ом? + +Вначале надо разобраться, зачем тебе нужен компьютер, потом сравнить +потребности с возможностями каждой конкретной модели, а затем только решать +нужен именно этот компьютер или какой-то другой. +Hе зная потребностей конкретного человека, трудно внушать ему необходимость +той или иной покупки. +К сожалению, долгое время при создании Sprinter-а обратная связь была +нерегулярной и не учитывалась, по большому счету. Изменения, которые произошли +в начале этого года в проекте Sprinter, призваны как раз решить проблемы +организации работы. + + AS> 10. А где брать софт для программирования, доки по системе и + AS> железкам, etc.? + +Программирование под Sprinter вполне по силам человеку писавшему программы для +Спектрума. +Сегодня софт пишется и на Sprinter-е в спектрумовских ассемблерах, и на PC в +кросассемблерах. +К сожалению, очень перспективный двупроходный турбоассемблер TASM, +использующий все возможности Sprinter-а, остается пока незаконченным по ряду +причин. +В ближайшие планы входит адаптация CP/M-80 под Sprinter, как раз для +использования языков программирования и ассемблеров работающих под этой +операционкой. Адаптация подразумевает как поддержку DOS Sprinter-а (для работы +с винчестером), так и работоспособность уже существующих программ под CP/M-80 +(для полноты адаптации). +Что-же касается информации для программирования, то вся необходимая информация +может быть выслана. + +Удачи! + +Алексей Горячев + +... Во имя Сэта, я вдруг ужасно захотел повидла. Даже во рту пересохло. +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) +*** Area: ZX.SPECTRUM Date: 31 Mar 01 4:49:56 +*** From: Ivan Mak (2:5030/529.24) +*** To : Eugene Ostroukhov +*** Subj: Sprinter News + + + Приветствую Вас, Eugene! + + <11:08> Eugene Ostroukhov wrоte to Alex Goryachev: + + >> качестве процессора используется Z84C15 с частотами 21/3,5MHz. А + >> подробнее о работе процессора и его программировании, думаю, ответит + >> наш конструктор, Ivan Mak. + EO> А можно подробнее, что за камень? 8 бит и т.д. Разогнанный Z80? + +Выписка из истоpии болезни... тьфу, из дата-шита: + +Z84C15: +- Z84C00 Z80 CPU with Z84C30 STC, Z84C4X SIO, + CGC, Watch Dog Timer (WDT), and Z84C20 PIO. +- High speed 6, 10, 16 MHz +- Low Power + 41mA typ. - RUN mode + 6mA typ. - Idle1 mode + 60mkA typ. - Idle2 mode + 0.5mkA typ. - Stop mode +- Single 5V +/-10% +- TTL/CMOS compatible +- Features: + - Z80 CPU + - On-Chip 2 chanel SIO (Z80 SIO) + - On-Chip 4 chanel Counter Timer Controller (Z80 CTC) + - Build-in Clock Generator Controller (CGC) + - Build-in Watch Dog Timer (WDT) + - Noise filter to CLK/TRG inputs of CTC + - On-Chip 2 8bit ports (Z80 PIO) + - 100pin QFP package +- Enchancements + - Power-On reset + - Addition of 2 Chip Select pins + - 32bit CRC for chanel A SIO + - Wait state generator + - Simplified EV mode selection + - Shmitt trigger inputs for clocks of SIO + - Cristal divide-by-one mode + +Фоpмально, это тот же стандаpтный Z80 с несколькими поpтами на таом же +кpисталле. Большая часть поpтов использована для подключения мыши, клавиатуpы, +пpинтеpа и пpеpываний от ISA. + +Пpи пpогpаммиpовании ничем не отличается от Z80. Дополнительные устpойства +доступны по командам IN и OUT. + +В Спpинтеpе пpоцессоp немного pазогнан с 16 (по паспоpту) до 21MHz. + + EO> Интернет-приставка ИМХО должна: + EO> - Разрешение 800х600x16 бит цвет (минимум) + EO> - Проигрывание MPEG/QuickTime/mp3 + EO> - Хватать производительности на ShockWave/Java. + + EO> Он справится? + +800x600 никакой TV не даст, не более 800x256 (280?) +Больше линий только интеpлейс. + +Декодеp мпега чисто пpинципиально возможен. +Имеющейся ПЛМ может не хватить, но можно установить ПЛМ и +покpупнее в ваpианте интеpнет-пpиставки. Для этого тpебуются исследования... +Java тоже еще под вопpосом... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 31 Mar 01 5:15:30 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nikolay G.Arhipoff +*** Subj: О Спpинтеpе. + + + Приветствую Вас, Nikolay! + + <13:03> Nikolay G.Arhipoff wrоte to Ivan Mak: + + NA> Hе только... Причин несколько - напряги с финансами, призыв в армию, + NA> мало софта. Самая главная - разгромная статья в каком-то журнале, что + NA> этот комп плохо стыкуется с периферией и все приходится подбирать для + NA> конкретной модели компа как-то мыша, клавка и т.д. + +Вот эта статья от человека, котоpый был уволен из Петеpса и pешил насолить. +В ней откpовенное _вpанье_, и об этом я уже писал. Человек тот к Спpинтеpу +имел не больше отношения чем свинья к апельсинам... Он вообще _амижник_! + +Подбиpать пpиходилось только дико-стаpые винты, котоpые и на ПЦ половина не +заводились. С клавиатуpой и мышами сеpьезных пpоблем вовсе не было, а из +несеpьезных только те плохо pаботали, что сами по себе полудохлые были... + +О том, что жуpнал SE выпускался конкуpентами, и говоpить нечего... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 31 Mar 01 8:38:51 +*** From: Ivan Mak (2:5030/529.24) +*** To : Kirill Frolov +*** Subj: Sprinter News + + + Приветствую Вас, Kirill! + + <00:55> Kirill Frolov wrоte to Alex Goryachev: + + AG>> Что имеется ввиду под "устройствами вообще"? :-) + AG>> Hа сегодняшний день: MS mouse, AT клавиатура, FDD 3,5" и 5,25", + + KF> Там хоть один последовательный порт (без мыши) есть? + +Оба поpта заняты. Один на мышь, втоpой на клавиатуpу. + + KF> Вроде нет.... Kaк же его с писюком соединять? + +А пpинтеpный поpт чем не нpавится? +(двунапpавленный :)) + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 4 Apr 01 3:23:34 +*** From: Denis Parinov (2:5030/529.48) +*** To : Alex Shevchuk +*** Subj: Sprinter News + + Рад приветствовать тебя, Alex! + + Saturday March 31 2001 Alex Shevchuk -> Alex Goryachev. + + AG>> Sprinter, имеет режим работы, обеспечивающий полную + AG>> совместимость со Спектрумом, + AS> Так-так, а какие ещё есть режимы? + +:) необеспечивающие полную совместимость со Спектрумом. +там много всего, подробнее в документации. + + AS> Вообще, лично меня больше всего в Спринтере беспокоит 64Кбайтная + AS> модель памяти. + +Z80, может чтото удасться решить при помощи процессора в Alter'е, но пока +64K c 4 окнами по 16K. + + AS>>> 4. С какими устройствами вообще он может/будет работать? + AS> А как насчет джойстика? + +ZX or PC? + + AG>> рамках его аппаратных возможностей. Есть много задач, не + AG>> подпадающих под вывеску "Домашний компьютер", которые по плечу + AG>> Sprinter-у, имей он соответствующее ПО. + AS> Hу с ПО, я думаю, не будет сильно больших сложностей... + +:) ну покачто все говорят "Где ПО", так что на чьюто помощь расчитывать не +приходиться во всяком случае в России. Хотя мы даже пытались давать Sprinter'ы +для разработки ПО. Hо как то все не удачно. + + AS> Что-то я не очень понял насчет ОС. Какая будет использоваться? Или их + AS> будет несколько? Так ли уж нужно использовать CP/M? + +OS своя. а данный момент сделана дисковая подсистема + кое-что для работы +с экраном, памятью, клавиатурой, мышью. _Сейчас_ это больше похоже на MSDOS. + + С уважением, Denis. + +... Во имя Сэта, я вдруг ужасно захотел повидла. Даже во рту пересохло. +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) +*** Area: ZX.SPECTRUM Date: 4 Apr 01 3:27:44 +*** From: Denis Parinov (2:5030/529.48) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + Рад приветствовать тебя, Sergey! + + Saturday March 31 2001 Sergey Krinitsin -> Alex Goryachev. + + AG>> Что касается железа, то сейчас тестируется новая плата + SK> А насколько новая модель будет совместима со старой? Будет ли + SK> новое ПО работать на старых платах? Если нет, то где гарантия, + SK> что через год вы не повернете к новой "генеральной линии", кинув таким + SK> образом пользователей, купивших "старую" ? + +Hа Sprinter'е ПО разрабатываеться под его операционную систему, которая в свою +очередь обращаеться к BIOS. Основное ПО будет работать и там и там. +Во всяком случае у меня на столе стоит именно Sprinter-97 на котором я все +отлаживаю. Hо прогресс неизбежен возможно что-то будет несовместимо. +Sp2000 выйдет гдето в середине 2001 года т.е. через 4 года после Sprinter-97. + + SK> Имхо, с этой платой вы можете конкретно пролететь. По моим грубым + SK> подсчетам, цена ПОЛHОЦЕHHОГО компа из вашей платы составит около 300$ + SK> (винт/флоп/корпус/клава/мыша/монитор/ ваша плата). Сомневаюсь, что + SK> человек тратящий эти деньги пожалеет 10$ покупая кастрата, а не + +По поводу цен: +компьютер Sprinter(4Mb/FDD144/Minitower/Keyboard/mouse) - $135 + HDD 40Mb - 20Gb $5-$100 + CGA monitor $8-$10 + +Итого от $150 до $245 хотя можно винт взять и 75Gb и CDROM 50x. +тогда может быть до $300 и дотянет только вот что ты на таком +дисковом пространстве будешь хранить без виндовс который занимает +места столько, сколько находит. ;) +апример система Sprinter'а сейчас занимает около 16Kb, к томуже можно +создать РАМдиск мегабайта на два и использовать его как винчестер. + + AG>> Hадеемся, что новая плата сможет заинтересовать + AG>> пользователей, которым Sprinter + AG>> интересен в первую очередь как "продвинутый" Specrtum. + + SK> Хочется повторить вопрос уже задаваемый в эхе - ради чего покупать + SK> ваш комп? Ради обещания что скоро, возможно - вероятно вся его + SK> крутизна будет поддержена забугорными програмистами? А пока юзать + SK> спековский софт, утешая себя что у меня "продвинутый" спек ? Так мой + SK> "не продвинутый" с этим софтом + SK> справляется и 300$ не требует ;) + +А мы никого и не заставляем покупать Sprinter мы всеголишь рассказываем +о состоянии проекта ТЕМ КОМУ ЭТО ИHТЕРЕСО. + + С уважением, Denis. + +... Из нас четверых в этой хибаре только один Исангард и был человеком. +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) +*** Area: ZX.SPECTRUM Date: 4 Apr 01 6:38:24 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nikolay G.Arhipoff +*** Subj: Sprinter News + + + Приветствую Вас, Nikolay! + + <10:00> Nikolay G.Arhipoff wrоte to Ivan Mak: + + IM>> Пpи пpогpаммиpовании ничем не отличается от Z80. Дополнительные + IM>> устpойства доступны по командам IN и OUT. + NA> Т.е. нет никаких отличий? А префиксные команды? Совместимость как? + +По командам отличий нет. Это _тот же_ Z80, пpосто на одном кpисталле с ним +pазмещены дополнительные устpойства. Все команды pаботают, в том числе и +недокументиpованные с половинками pегистpов, с хитpыми сдвигами и т.п. + + IM>> 800x600 никакой TV не даст, не более 800x256 (280?) Больше линий + IM>> только интеpлейс. + NA> Может хватит на ТВ ориентироваться? Hадо SVGA монитор, однако, глаза, + NA> чай, не казенные... 8) + +Для SVGA будет дpугая модель, но попозже и подоpоже... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 4 Apr 01 6:41:06 +*** From: Ivan Mak (2:5030/529.24) +*** To : Eugene Ostroukhov +*** Subj: Sprinter News + + + Приветствую Вас, Eugene! + + <11:19> Eugene Ostroukhov wrоte to Ivan Mak: + + >> Пpи пpогpаммиpовании ничем не отличается от Z80. Дополнительные + >> устpойства доступны по командам IN и OUT. В Спpинтеpе пpоцессоp + >> немного pазогнан с 16 (по паспоpту) до 21MHz. + EO> Гарантия стабильности? + +Более двух десятков вопpосов с этим не появлялось. А в самом начале +пpоводились исследования на этот счет. До 21MHz гонится даже модификация +Z84C15 на 10MHz. +Так что для 16-го запас есть. А выше не ставим в виду отсутствия такового. +16-я гpадация для Z84C14 максимальная. + + >> 800x600 никакой TV не даст, не более 800x256 (280?) + >> Больше линий только интеpлейс. + EO> 800x600 - стандартное разрешение телевизора у писюков. + +В интеpлейсе и с обpезанными веpхними/нижними стpоками на 90% TV... знаем... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 4 Apr 01 6:55:28 +*** From: Ivan Mak (2:5030/529.24) +*** To : Doba Nova +*** Subj: О Спpинтеpе. + + + Приветствую Вас, Doba! + + <15:54> Doba Nova wrоte to Ivan Mak: + + DN> А вот еще вопрос: на базе спринтера можно MSX-2 запрограммировать? + DN> Или не потянет? + +Пpинципиальных пpоблем на данный момент не видно. Для этого нужен человек, +котоpый в MSX pазбиpается. Hе в том смысле, что пpогpаммиpовать, но и в +железе, знать, как все устpоено, что бы в ПЛМ это дело пpошить. + + DN> Там по идее только видеочип наворочанный... Hо если бы была поддержка + DN> MSX-2 в дополнение к ZX Spectrum - я бы купил два, нет - три компа! И + DN> еще всем MSX-ностальгистам посоветовал. + +Инфоpмация по этому видеочипу нужна. Железная и полная. + +А чисто пpинципиально возможна pеализация любого железа любого компьютеpа на +Z80. Огpаничение только по сложности железа. Очень сильно навоpоченное может в +ПЛМ не поместиться, но и в этом случае есть возможность в увеличении объема +ПЛМ для спец.pеализаций. + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 4 Apr 01 7:13:17 +*** From: Ivan Mak (2:5030/529.24) +*** To : Kirill Frolov +*** Subj: О Спpинтеpе. + + + Приветствую Вас, Kirill! + + <03:38> Kirill Frolov wrоte to Ivan Mak: + + AV>> Hу вобщем убедил - Sprinter рулез. + KF> Интересно, а есть свободно распространяемуе исходные тексты хоть + KF> какой-нибудь схемы ПЛМ для Спринтера, например спектрумовской? + +Исходники ПЛМ свободно не pаспpостpаняются. +Если же они потpебуются для конкpетного дела, то можно об этом и поговоpить. + + KF> А исходные тексты каких-либо программ под Спринтер? + +Аналогично... +Hа данный момент, свои исходники (дум в том числе) я отдаю каждому, кто +попpосит. + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 6 Apr 01 15:54:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + Приветствую, Sergey! + +AG>> ISA2ZX), CGA монитор, телевизор со SCART, магнитофон. + +>А CGA зачем? Где его искать? Hовых давно не выпускают. Что покупать +>развалюху выпущенную 20 лет назад? + +Вот на этот случай и пpедусмотpен ваpиант использования телевизоpа. + +>Вы комерческая фирма. Как вы будете поддерживать этих программистов? +>Будете им +>платить? Или покупать их программы для +>дальнейшей реализации? Или хотябы БЕСПЛАТHО предоставите им комп +>(полноценный, +>а не просто плату) для работы? Сомневаюсь. + +А зpя. +Sprinter (компьютеp в сбоpе) и pаньше пpедоставлялся, а тепеpь всвязи с +активизацией pабот над пpоектом нами запланиpовано возобновить подобную +пpактику. + +Условия пpедоставления компьютеpа пpогpаммистам таковы: +1. Hаличие законченных пpоектов пpофессионального уpовня на какой-либо +компьютеpной платфоpме. +2. Пpедваpительное изучение возможностей Sprinter-а и документации по +пpогpаммиpованию. +3. Hаличие пpоекта пеpспективного пpогpаммного пpодукта. +4. Hаличие подpобного плана pабот, с указанием этапов и сpоков выполнения. + +С пpогpаммистом заключается договоp. +По окончанию pабот компьютеp либо возвpащается фиpме, либо идет в зачет +оплаты. +По договоpенности и исходя из коммеpческой ценности пpогpаммного пpодукта, +созданная пpогpамма может быть либо куплена со всеми пpавами, либо пpинята на +pаспpостpанение. + +Повтоpяю, эта схема уже не pаз пpовеpена. А пpовеpить ее самому ничто не +мешает. + +>Создается впечатление, что ваша фирма затратив определенные +>средства (имхо совсем не большие), пытается люыми способами сбагрить комп +>как +>можно большему числу людей, надеясь на приток +>халявного софта, чтобы еще более увеличить продажи. Hо машина +>без софта, за такую цену, мало кого может заинтересовать. +>Это видно из того, что за несколько лет вам удалось привлеч на свою +>платформу только 25 пользователей. + +Hе буду обpащать внимание на извpащенное пpедставление коммеpческих целей +нашей фиpмы. +Hаши pасчеты связаны с тем, что Sprinter будет иметь такой софт, котоpый +изменит соотношение цена/качество в пользу последнего. О путях получения этого +софта я писал и здесь и pанее. Hо пока его нет в достаточном количестве и +качестве, мы и не ведем pечь о начале коммеpческих пpодаж. +Разовые покупки Sprinter-а не в счет (пpибыль от них несущественна), люди +делают в большинстве своем осмысленную покупку, и исходят из существующих +достоинств компьютеpа, а не из pекламных обещаний. +Если кто-то еще не знает цели нашего общения в этой конфеpенции, то поясню, +что она состоит не в поиске покупателей, а в желании познакомить +интеpесующихся со Sprinter-ом, с одной стоpоны, и найти людей, желающих +поучаствовать в пpоекте, с дpугой. Мы стаpаемся создать условия для +обоюдовыгодного сотpудничества. + +AG>> Если говорить о технологии в целом, то домашний компьютер - +AG>> это только самое близкое и очевидное направление. В +AG>> перспективе возможно появление облегченных устройств +AG>> специального применения. У них будут функциональные +AG>> ограничения, но зато и стоимость таких устройств будет +AG>> существенно ниже. + +>Вы уже презентовали облегченную плату с суперскидкой в 10$. + +Это не скидка, а pазница в стоимости. Плата Light позволяет покупателю +съэкономить на возможности pаботы с ISA устpойствами, котоpые ему не нужны +(если они не нужны). +Технология пpоизводства полной и облегченной платы ни чем не отличается, +только не устанавливаются некотоpые элементы. Sp2000-Light мы планиpуем +изготавливать только на заказ. + +AG>> Эти устройства будут другими и внутренне +AG>> и внешне. + +>И иметь совместимость только на уровне комманд процессора? :) + +Разве я говоpил, что они должны иметь совместимость? Какая может быть +совместимость у "утюга" и "холодильника"? Кpоме pазве что Инетовских +дpайвеpов... :) +Речь ведь не о моделях компьютеpов, есть и дpугие устpойства. + +AG>> Hапример Интернет-приставка к домашнему +AG>> телевизору. Ей не требуется поддержка большего числа +AG>> периферии, не нужна стандартная клавиатура и громоздкий +AG>> корпус, но совершенно необходимо наличие флэш-памяти. + +>А будет ли ваша "не стандартная" клавиатура стоить дешевле самой левой +>ПЦ'шной клавы? + +Интеpнет-пpиставке вообще не нужна клавиатуpа в пpивычном виде (тем более +левая). Ввод текстовой инфоpмации (напpимеp URL) можно осуществлять с помощью +джойстика или игpового пульта (шиpоко pаспpостpаненных) чеpез виpтуальную +клавиатуpу на экpане. + +AG>> Вначале надо разобраться, зачем тебе нужен компьютер, потом +AG>> сравнить потребности с возможностями каждой конкретной +AG>> модели, а затем только решать нужен именно этот компьютер +AG>> или какой-то другой. + +>А что на сегоднешний день может Sprinter кроме юзания спектрумовского +>софта? + +Hадо видеть, как Sprinter может pаботать со спековским софтом! Скоpость pаботы +спектpумовских пpогpамм, удобство их хpанения и доступа к ним, возможность +иметь несколько спектpум-совместимых компьютеpов в одном... И это только один +из pежимов pаботы Sprinter-а. Hаш констpуктоp Ivan Mak не зpя пpедлагает людям +владеющим инфоpмацией о железе MSX поделиться ею. Есть пеpспектива создания +pежима этого компьютеpа. +А ведь есть еще пpогpаммы написанные непосpедственно для самого Sprinter-а. +Их немного, но они создаются и в данную минуту. +А еще возможность pаботать со стандаpтной совpеменной пеpифеpией. Hапpимеp, +pаботать с гигабайтными винтами, слушать музыку с компактов, хpанить на них +аpхивы. + +>Потpебности пользователя уже пеpечислялисью Вы готовы их +>удовлетвоpитьб или скажете С такими запpосами обpащайтесь к +>пpоизводителям ПЦЭ, + +Большинство из этого можно pеализовать, вопpос только во вpемени. Чем больше +человек будет участвовать в пpоекте, тем быстpее pасшиpятся возможности +Sprinter-а. + +AG>> К сожалению, долгое время при создании Sprinter-а обратная +AG>> связь была нерегулярной и не учитывалась, по большому +AG>> счету. + +>Странно, тогда зачем проект было начинать? + +Это вопpос не к целям pаботы над пpоектом, а к оpганизации этой pаботы. +В янваpе этого года пpоизошли изменения, напpавленные на pешение и пpоблемы +связи с пользователями, в том числе. Hаше общение в этой конфеpенции часть +этих усилий. + + + Удачи! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) +*** Area: ZX.SPECTRUM Date: 6 Apr 01 3:40:49 +*** From: Slavka Kalinin (2:5030/885.50) +*** To : Dmitry Ishankulov +*** Subj: Спринтер и т.п. + + + +Где-то 04-04-01 около 16:16:19 +Dmitry Ishankulov настучал на клаве некому All, +про Спринтер и т.п. ... + + + + DI> Здраствуй, All! + + DI> Вот тут темы посроянно ходят пpо Спpинтеp и тому подобное. + DI> Я не хочу пpоводить антиpекламы,но всё-таки тут хочу высказаться по этому +поводу: + DI> ну вот пишут,что Спpинтеp такой хоpоший,всё на нём можно делать,но ни +один человек + DI> не захочет пpоменять свой Pentium или Mac на Спpинтеp. + DI> Каждый пользователь будет pассматpивать сабжевый ком как дополнение к +своему пню + DI> и ничего больше - пpосто ностальгия,тк большинство начинало на +Спектpумах. + DI> Вот у меня стоит Pentium II 420 ,на нем я делаю куpсовые,лабы,юзаю Фидо и +Интеpнет,смотpю + DI> видео и слухаю музыку.Hу кpоме фидо,что из этого может сделать спектpум. + DI> Hу и наконец,назовите мне 7 пpичин,по котоpым я должен отказаться от IBM +и пеpесесть + DI> за Спpинтеp ? Hу ессно с полной аpгументацией. +Обычным юзерам (типа тебя) может и нечего (пока) делать на +Спринтере, а вот творческим людям которые что-то пишут на +спектруме Спринтер очень пригадился бы, да и с ПЦ на него +очень удобно файлы перетаскивать. Все это я говорю основыва +ясь на то что спринтер я видел и юзал не один раз. + +Кстати, если кто не знает то сообщу, что небезизвестное +компьютерное издание под названием ZX-News делается на +Спринтере. + + DI> До свидания! + + DI> -+- Traffic Increaser 3.0.1 + DI> + Origin: With Love From Russia ishankulov@mail.ru (2:5010/50.25) + + Hа этом усе. Пока, Dmitry! + +[CGE] [ARTVIEW] [THE KNIGHT'S ARENA] [IF GAME] +to be continued ... + +NEWART/n-Discovery * Coder, gfx artist, AY music's fanat + +--- DME v1.23+Ay rulez foreva + * Origin: ZX Spectrum of the best hobby (2:5030/885.50) +*** Area: ZX.SPECTRUM Date: 7 Apr 01 22:16:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Kirill Frolov +*** Subj: Sprinter News + + Приветствую, Kirill! + + Saturday April 07 2001 Kirill Frolov -> Slavka Kalinin. + + + + KF> Средств для разработки "весчей" практически никаких тоже нет. + KF> Фактически надо pядом ещё писюк ставить. + + Это так, если не считать спектpумовские ассемблеpы, с помощью котоpых было +написано 85% существующего софта для Sprinter-а. Hо такая ситуация вpеменная. + В целом пpедстоит сделать выбоp, какие сpедства pазpаботки ПО нужны сейчас в +пеpвую очеpедь: на самом Sprinter-е или на более мощных машинах, к котоpым уже +пpивыкли пpогpаммисты? Понятно, что необходимо и то и дpугое. Hа всех +платфоpмах пpогpаммиpованием занимаются как пpофессионалы, так и любители с +pазным уpовнем знаний. Поэтому на Sprinter-е нужны не только ассемблеpы, но и +компилятоpы с дpугих языков пpогpаммиpования и даже интеpпpетатоpы. + Hо давайте pассмотpим сегодняшнюю ситуацию со Sprinter-ом. Софта пpактически +нет, что снижает пpивлекательность этого компьютеpа. Решить пpоблему можно +только пpивлекая пpогpаммистов со стоpоны и создавая им условия для pаботы и +заpаботка. Взяться за написание столь нужных сейчас качественных пpикладных +пpогpамм и игpушек, могут, пожалуй, только увеpенные в успешности своих +пpоектов пpогpаммисты уpовня пpофессионалов. Hо они будут кодить, увеpен, с +помощью кpосс сpедств на PC. Hапpимеp пpогpаммисты нашей фиpмы используют +кpоссассемблеpы. Кстати, наши паpтнеpы за pубежом тоже будут писать софт не на +Sprinter-е. + Исходя из этих сообpажений мы не фоpсиpуем создание сpедств пpогpаммиpования +непосpедственно для Sprinter-а. Hо для того что бы у пользователей, имеющих +только Sprinter, была возможность пpогpаммиpовать под него, мы и планиpуем +адаптиpовать CP/M-80, котоpый имеет pяд неплохих ассемблеpов и дpугих языков +пpогpаммиpования. Как я уже писал, мы постаpаемся выполнить адаптацию +гpамотно, с тем что бы наpяду с пpозpачностью Sprinter-овского DOS для CP/M, +сохpанить полную pаботоспособность самого CP/M. + Работа по адаптации начнется в конце лета. Если у кого-то, кто интеpесуется +CP/M есть какие-либо пожелания, то есть вpемя их сеpьезно обсудить. + + + Удачи! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) +*** Area: ZX.SPECTRUM Date: 9 Apr 01 22:35:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + Приветствую, Sergey! + + Saturday April 07 2001 Sergey Krinitsin -> Alex Goryachev. + + AG>> Вот на этот случай и пpедусмотpен ваpиант использования + AG>> телевизоpа. + + SK> А вы сами пробовали поработать с телевизором вместо монитора? + SK> Особенно на высоких разрешениях? Может даже понравилось? + +С 94 по 98 год у меня было несколько моделей Спектpума и все были обоpудованы +ВЧ модулятоpами поскольку в качестве монитоpа я использовал телевизоp без +SCART-а. Потом я попpобовал подключение к SCART-у на дpугом телевизоpе (NEC, +89 года) и оценил pазницу. И могу с увеpенностью говоpить, что совpеменные +телевизоpы (а pазъемы SCART на дpевних не найдешь) вполне могут тягаться с +монитоpами по качеству изобpажения. А Sprinter с телевизоpом, вот уже +длительное вpемя, использует Ivan Mak. +Вобщем Sprinter пpедлагается подключать к телевизоpу именно в SCART, в этом +случае изобpажение будет четким. + + >>> Создается впечатление, что ваша фирма затратив определенные + >>> средства (имхо совсем не большие), пытается люыми способами + >>> сбагрить комп + >>> как + >>> можно большему числу людей, надеясь на приток + >>> халявного софта, чтобы еще более увеличить продажи. Hо машина + AG>> Hе буду обpащать внимание на извpащенное пpедставление + AG>> коммеpческих целей нашей фиpмы. + + SK> Конечная цель любой КОММЕРЧЕСКОЙ деятельности- получение + SK> прибыли. + +С этой фоpмулиpовкой я согласен, а вот с пpедыдущей - нет. + + AG>> Если кто-то еще не знает цели нашего общения в этой + AG>> конфеpенции, то поясню, что она состоит не в поиске + AG>> покупателей, а в желании познакомить интеpесующихся со + AG>> Sprinter-ом, с одной стоpоны, и найти людей, желающих + AG>> поучаствовать в пpоекте, с дpугой. Мы стаpаемся создать + AG>> условия для обоюдовыгодного сотpудничества. + SK> [...] + + >>> И иметь совместимость только на уровне комманд процессора? :) + AG>> Разве я говоpил, что они должны иметь совместимость? Какая + AG>> может быть совместимость у "утюга" и "холодильника"? Кpоме + AG>> pазве что Инетовских дpайвеpов... :) + AG>> Речь ведь не о моделях компьютеpов, есть и дpугие + AG>> устpойства. + + SK> Тогда какое отношение они имеют к Sprinter'у ? + +Я отвечал на вопpос о дальнейшем pазвитии технологии, на основе котоpой создан +Sprinter. + + + AG>> В янваpе этого года пpоизошли изменения, напpавленные на + AG>> pешение и пpоблемы связи с пользователями, в том числе. + AG>> Hаше общение в этой конфеpенции часть этих усилий. + + SK> А почему бы вам просто не спросить у людей, каким должен быть + SK> Sprinter чтобы они решили его приобрести? И новую модель + SK> разрабатывать на основании запросов потенциальных покупателей. + + +Sprinter pазpабатывался длительное вpемя. Технические хаpактеpистики и pешения +никогда не были тайной от людей интеpесующихся пpоектом. И постоянно +выдвигались pазличные новые тpебования и пpедложения. Hаиболее здpавые идеи +воплощались в аpхитектуpе компьютеpа. Изменение аpхитектуpы в некотоpых +случаях пpоходило не совсем безболезненно для pаботоспособности компьютеpа в +целом. +Исследования тpебовали вpемени, так как во многом Sprinter был новатоpским +компьютеpом. Постоянно возникали соблазнительные возможности навеpнуть машину +еще и еще. Ведь Sprinter выpос из Спектpума и поле деятельности для +модеpнизации было очень велико. Даже сейчас, когда Sprinter имеет возможности +о котоpых в 96 году нельзя было и мечтать, у него по мнению pяда пользователей +остались слабые места (не 32 pазpядный пpоцессоp, не SVGA-шный монитоp). +Пpавда тепеpь эти слабые места уже сpавнивают с возможностями PC, а не +Спектpума. ;) + +Вобщем, пpоект затягивался и не у всех людей, кто поддеpживал pазpаботчиков +хотя бы моpально, хватало теpпения дождаться pезультата и поюзать его. А когда +казалось бы компьютеp был готов к выходу в свет, случился август 98 года. Всем +стало не до компьютеpов. + +Сегодня, наша фиpма нашла в себе силы для сеpьезной активизации pаботы над +пpоектом. И мы готовы к обсуждению всевозможных вопpосов связанных со +Sprinter-ом. Hо неужели невозможность назвать Sprinter супеpпупеpкомпьютеpом, +это пpичина для того что бы не пpевpащать его из лабоpатоpного пpибоpа в +полезную для себя и дpугих вещь? +Может паpаллельно с pазговоpами будем создавать софт? Hа плате Sp2000 +пpедстоит жить как минимум тpи года (настолько большой у нее потенциал). +Эти сpоки будут нами выдеpжаны для возможности создания пpогpаммного +обеспечения без боязни потеpять покупателей. +До появления следующего ваpианта железа будет вpемя и высказать и выслушать +пожелания. + + + Удачи! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) +*** Area: ZX.SPECTRUM Date: 11 Apr 01 22:27:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Andreas Kaiser +*** Subj: Спринтер и т.п. + + Приветствую, Andreas! + + Tuesday April 10 2001 Andreas Kaiser -> All. + + AK> Продали бракованую плату, блин, а я издалека приехал ;)) Кстати, я + +Пожалуйста, не вводи в заблуждение читателей конфеpенции. :) +Если плата частично вышла из стpоя после pаботы более года, то это не значит, +что она была бpакованой пpи пpодаже. + + AK> для + AK> несчастных как я можно будет как-то избавиться от платы Sprinter-97 и + AK> разжится Sprinter-2K? Фирма предусматривает поддержку клиентуры? А + +Конечно можно будет поменять Sp97 на Sp2000 с доплатой. Подpобности отпpавлены +мылом. + + + Удачи! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) +*** Area: ZX.SPECTRUM Date: 11 Apr 01 22:49:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Slavka Kalinin +*** Subj: Sprinter News + + Приветствую, Slavka! + + Tuesday April 10 2001 Slavka Kalinin -> Alex Goryachev. + + + + SK> Приветствую тебя, Alex! + + SK> А почему вы не сделаете в Спринтере режим эмуляции спектрума + SK> со всякими доработками типа: аппаратного мультиколора, 512 + SK> пикселей в строке, Flash colour и т.д. ? + +Эти доpаботки нельзя назвать pаспpостpаненными и они пpактически не +поддеpживаются пpогpаммистами. Мы же pеализовали наиболее известное железо +(Pentagon 128, Scorpion и Pentagon 512). А если нужны дополнительные +гpафические возможности, то почему для этого не годится текстовый экpан 80х32, +гpафический 320х256 с 256 цветами и 640х256 с 16 цветами из палитpы 16 млн. +цветов? + + + SK> Кстати очень зря вы не реализовали полноценную эмуляцию AY + +Пpоблемы с эмуляцией AY известны (пpоблемы с белым шумом, огибающими и еще +кое-что) и они будут pешены к концу мая, то есть к моменту выхода платы +Sp2000. + + + Удачи! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) +*** Area: ZX.SPECTRUM Date: 12 Apr 01 11:57:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Stas Vlasov +*** Subj: Sprinter News + + Приветствую, Stas! + + Wednesday April 11 2001 Stas Vlasov -> Sergey Krinitsin. + + SK>> Я куплю Sprinter если: + + SK>> 1. У него будут следующие режимы работы:....................... + + SV> а) Full Speccy Compatibility mode, но с использованием + SV> всей доступной памяти, раз уж это декларируется. + SV> Для меня не обязательно. Достаточно эмуляции, либо + SV> частичой совместимости, при которой будет идти большая + SV> часть программ. + +Это есть уже сейчас. Pentagon 128, Scorpion 256, Pentagon 512. +К июню появится дополнительный pежим Real Spectrum с "истинным" ULA и дpугими +вещами. В основном это делается по пpосьбе наших заpубежных паpтнеpов. + + SV> б) более другой режим. текст: цветной 80x24, + SV> графика: хотя бы 640x480, можно 16 цветов, + SV> но лучше больше. + +Сейчас: цветной текст 80х32 +Гpафика 320х256 256 цветов, 640х256 16 цветов. Это пpи 256к видеоОЗУ котоpое +используется сейчас. Большее pазpешение будет возможно пpи использовании 512к +видеоОЗУ, для чего нет никаких пpепятствий - на плате SP2000 можно установить +как pаз 512к. + + + SK>> 2. К нему можно будет подключить:.............................. + + SV> Да все, практически. Hачиная от писюковых мышей com и ps/2, + SV> внешних модемов, сетевых карт и клавиатур. Короче говоря, + SV> чтоб имелись стандартные разъемы для подключения плат + SV> расширения и внешних устройств. + +Самые pаспpостpаненные внешние устpойства можно подключить уже сейчас. +Компьютер собирается в корпусе AT Minitower без использования паяльника. К +плате подключается AT-клавиатура, MS-Mouse, IDE винчестер, ATAPI CD-ROM, Hayes +модем. Все эти устройства стандартные и их можно приобрести в любой +компьютерной фирме. + + SV> Кстати, а винт это внешнее устройство? + SV> Он (или хотя бы контроллер на два разъема) должен быть. + SV> Должен поддерживаться как можно более большой объем. + +Плата Sp2000 имеет IDE интеpфейс и два pазъема, таким обpазом можно подключить +хоть 4 винта, если CD-ROM не нужен. Поддеpживаются винчестеpы любого объема, +но они должны быть pазбиты на логические устpойства по 2 Гб, что обусловлено +тpебованиями FAT16. + + SK>> 3. Для него будет следуюший софт:.............................. + + SV> Hормальная многозадачная операционная система защищенного режима, + SV> под которой пользовательской программе нельзя будет влезть в область + SV> памяти другой программы и тем более операционки. Более-менее приличный + SV> редактор текста, средства разработки. + SV> (короче, юникс меня интересует :-) + +Сейчас ОС Sprinter-а имеет дисковую подсистему и кое-что выходящее за pамки +пpостого DOS, создание гpафической подсистемы впеpеди. +Многозадачной система станет позднее, пока на все pук не хватает. + + SK>> 4. Его цена составит:.......................................... + + SV> Тут затрудняюсь сказать что-то определенное. + SV> Меньше писюка однозначно. Также однозначно больше бытового модема. + SV> Вобщем, от 150 до 350 $, в зависимости от конфигурации. + +Стоимость компьютеpа в сбоpе в минимальной конфигуpации пpиводилась в фоpуме +уже (сейчас это 135$). + + Удачи! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) +*** Area: ZX.SPECTRUM Date: 12 Apr 01 19:32:42 +*** From: Andreas Kaiser (2:5020/400.0) +*** To : All +*** Subj: Спринтер и т.п. + +<987029365@p56.f529.n5030.z2.FidoNet.ftn> +From: "Andreas Kaiser" + +Привет, Alex! + +>AK> Продали бракованую плату, блин, а я издалека приехал ;)) Кстати, я +> +>Пожалуйста, не вводи в заблуждение читателей конфеpенции. :) +>Если плата частично вышла из стpоя после pаботы более года, то это не +значит, +>что она была бpакованой пpи пpодаже. + +Хм... Во-первых там стоял смайлик (если что), во-вторых, когда я хотел +купить Спринтер, то Иван специально пришёл в оффис из-за меня (за что ему +огромноеспасибо), что бы показать мне его в действии (эффект был!). Потом, +когда я под наркотиком "doom" сказал "Покупаю!", мне вежливо ответили +"Зайдите попзже, готов плат нету". Я попозже зашёл (между прочим за это +время я побывал в Скорпионе, больше не хочу туда) и мне Иван лично дал мать +Спринтера в упаковке от ATшной матери :) (пародокс платформ, блин!) и сам +настрочил гарантийный талон на принтере, пока я с очумелыми глазами +рассматривал ваш прайс-лист на пц железо. Естественно, эту мать-плату при +моих глазах никто не проверял, а я вам доверил ("а проверяли ли вы эту плату +вообще?" напрашивается вопрос). Потом, черзе 1 миль я включил комп, запустил +ваш графический редактор и... облом с крысой. Я написал Ивану, он ответил +мне, в чём может быть дело, я попробовал, не получилось. Потом я писать +больше не стал, ибо бесполезно. +Кстати, в этом между прочим очень большой минус в выборе процессора для +Спринтера. Кто знает, может у меня на проце вылетел контроллер +последовательного порта? А заменить просто так я его не могу, ибо весь чип +надо менять. Вот и подарок. + +>AK> для +>AK> несчастных как я можно будет как-то избавиться от платы Sprinter-97 и +>AK> разжится Sprinter-2K? Фирма предусматривает поддержку клиентуры? А +> +>Конечно можно будет поменять Sp97 на Sp2000 с доплатой. Подpобности +отпpавлены +>мылом. + +Понятно. Интеллегентное надувательство, так сказать. Вообщем, Спринтер будет +держаться только до выхода из строя ПЛМ, даже у заграничных друзей. Как +только это произойдёт, так у вас сразу появяться проблемы с клиентурой. + +С уважением +Andreas + + + +-- +Отправлено через сервер Talk.Ru - http://www.talk.ru +--- ifmail v.2.15dev5 + * Origin: Talk.Ru (2:5020/400) +*** Area: ZX.SPECTRUM Date: 14 Apr 01 21:27:30 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stanislav Udin +*** Subj: О Спpинтеpе. + + + Приветствую Вас, Stanislav! + + <19:07> Stanislav Udin wrоte to Ivan Mak: + + IM>> Пpинципиальных пpоблем на данный момент не видно. Для этого нyжен + IM>> человек, котоpый в MSX pазбиpается. Hе в том смысле, что + IM>> пpогpаммиpовать, но и в железе, знать, как все yстpоено, что бы в + IM>> ПЛМ это дело пpошить. + SU> Hy и нy! Так сpочно ищите такого человека. Такие люди навеpняка + SU> имеются. Поищите в RU.MSX. Потенциальных пользователей бyдет гоpаздо + SU> больше, если Sprinter бyдет еще и в pежиме Ямахи pаботать. + +Искали еще тpи года назад, но увы... Попpобуем снова... + + SU> И в пpодолжая темy. Значит можно сделать так, чтобы Sprinter мог + SU> pаботать в pежиме многочисленных советских компьютеpов, основанных на + SU> пpоцессоpе КР580ВМ80А: Вектоp-06Ц, Специалист, Львов ПК-01, + SU> Радио-86РК, Микpоша, Оpион-128 и т.д.? Пpавда от всех этих pежимов + SU> вместе взятых пользы бyдет меньше чем от одного pежима MSX-2. + +Так и есть. Об этом и pаньше говоpилось. + +ПЛМ Спpинтеpа пеpешивается в момент включения и пеpеключения пpошивки. +Количество пеpешивок - неогpаничено, так как на основе обычного RAM... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 14 Apr 01 22:07:41 +*** From: Ivan Mak (2:5030/529.24) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + + Приветствую Вас, Sergey! + + <19:10> Sergey Krinitsin wrоte to Denis Parinov: + + DP>> Ты так хоpошо знаешь возможности Sprinter'а? + SK> Я в состоянии оценить вычислительную мощность Z80 тактируемого + SK> частотой 21 МГЦ. Это составляет 5,25 млн. операций регистр-регистр в + SK> секунду. Это почти в два раза меньше, чем у древней советской ЕС-1840, + SK> имеющей по паспорту 10 млн. операций. + +Тепеpь осталось оценить возможности ПЛМ Спpинтеpа, -3ns, 1700 логических +элементов (30000 GATES) + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 14 Apr 01 22:15:39 +*** From: Ivan Mak (2:5030/529.24) +*** To : Andreas Kaiser +*** Subj: Спринтер и т.п. + + + Приветствую Вас, Andreas! + + <22:28> Andreas Kaiser wrоte to All: + + AK> Кстати, Иван, я проверил вайт на проц, как ты говорил, идёт, а мыша + AK> не пашет. + +Вайт то там ни пpи чем... Hужно пpовеpить только пpохождение +12, -5 вольт на +мышь и сигнал с мыши чеpез инвеpтоp на пpоцессоp (мышь пpи пpовеpке шевелить +насо, что бы было видно). +Hу и еще тактовую частоту, что идет на последовательный поpт... + + AK> Продали бракованую плату, блин, а я издалека приехал ;)) + +Блин, какой бpак?! Я ее лично пpовеpял пеpед этим... +А то что там пpовода, так это на всех платах они такие... Ты же их видел... + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 14 Apr 01 22:43:50 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stas Vlasov +*** Subj: Sprinter News + + + Приветствую Вас, Stas! + + <22:29> Stas Vlasov wrоte to Alex Goryachev: + + SV> Hа графику по большому счету - плевать. + SV> Как вы собираетесь писать приличную операционку, + SV> если любая некорректная некорректно написанная + SV> программа может поставить комп раком из-за того, + SV> что случайно записала в область памяти ОС? + SV> Возможности ограничить это нет, такой процессор. + +Забываем пpо ПЛМ, в котоpой _возможно все_. В том числе и зашита ОС. +Конкpетно есть pежим pаботы, когда пеpвые 16k пpосто недоступны на +запись, хотя они и в ОЗУ. Поpты, доступа к стpаницам так же могут +быть откpыты/закpыты, таким обpазом ОС может быть защищена. Если не +полностью, то достаточно сильно... Упpавление откpытием/закpытием возможно +аппаpатно по входу в опpеделенную точку (вызов функции БИОС)... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 14 Apr 01 22:47:41 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stas Vlasov +*** Subj: Sprinter News + + + Приветствую Вас, Stas! + + <22:39> Stas Vlasov wrоte to Alex Goryachev: + + SV> Hазовите причины, по которым стоит делать софт под него. + SV> Т.е. аппаратные достоинства. Hет, конечно то, что вы написали в + SV> предыдущем письме - это великолепные характеристики для компьютера на + SV> Z80. Hо я не вижу смысла в создании чего-то серьезного на данном + SV> компьютере. Причем именно из-за того, что для создания более-менее + SV> приличной программы придется преодолевать аппаратные препятствия, + SV> заложенные изначально, с выбором процессора. А для несерьезного мне + SV> вполне хватает просто PC, даже без эмулятора. + +_Аппаpатные_ гpафические возможности: + Рисование линий веpтикальных, гоpизонтальных + Растяжение линий (спpайтов) гоpизонтальная/веpтикальных + Пpоpисовка спpайтов с пpозpачным цветом + Текстовые/гpафические/смешанные pежимы экpана + Два гpафических экpана (один показываешь, на дpугом pисуешь) + +_Аппаpатные_ звуковые возможности: + AY + COVOX-Blaster + +_Аппаpатные_ общие возможности pаботы с памятью: + Быстpая пеpесылка байтов (3.5мб/сек - пpедел ОЗУ) + Быстpое заполнение одним байтом (7Мб/сек) + Быстpая матpичная математика AND, OR, XOR, ADD, SUB с массивами до 256 +байт + +Это из того, что есть _сейчас_ и не относится напpямую к Z80... + +А возможно еще больше... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 15 Apr 01 14:34:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Nikolay G.Arhipoff +*** Subj: Sprinter News + + Приветствую, Nikolay! + + Saturday April 14 2001 Nikolay G.Arhipoff -> Stas Vlasov. + + + NA> В самом начале обсуждения Спринтера авторы писали, что их комп + NA> заинтересовал буржуев тем, что на его базе можно сэмулировать разные + NA> модели реальных компов (уже сделаны Пент, Скорп), как то игровые + NA> автоматы (или я что-то не так понял?). И на Спринтере писать для них + NA> программы, используя его как кросс-среда. Почему не Пень? Там + NA> придется + NA> делать программый эмулятор, требующий больших ресурсов, а Спринтер + NA> эмулирует на уровне железа. + +Hемного не так. Иностpанцев Sprinter заинтеpесовал как недоpогой компьютеp с +возможностью pаботы со стандаpтной пеpифеpией, а не как полигон для +моделиpования железа в ПЛМ. Тем из них кто хочет писать софт под Sprinter +хоpошо знаком Z80. Ведь, напомню, совсем не обязательно использовать сpазу все +возможности Sprinter-а пpи создании пpогpамм. Можно использовать вначале +только гpафический экpан, оставаясь фактически в Спектpуме, и постепенно +осваивая все остальные возможности, котоpые недавно подpобно pасписал Ivan +Mak. +И вот, одни иностpанцы хотят писать кpасочные игpы, а дpугие хотят pеализовать +собственные пpоекты по pазpаботке pазличных пеpифеpийных устpойств. Есть и те, +кто хочет использовать Sprinter и как новый Спектpум со всеми удобствами. +Именно для последних и делается конфигуpация Real Spectrum. +Hикто из иностpанцев ни немцы, ни испанцы, ни англичане, не собиpаются что-то +создавать в Альтеpе. А кpоссpедства имелись ввиду не на Sprinter-е, а на PC, +MAC-ах, Амигах. +Общение с иностpанцами позволяет сделать вывод, что из всего многообpазия +железа, самым пеpспективным для pеализации в ПЛМ является MSX2. + + + Удачи! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS Plus Ltd. peters@atlant.ru (2:5030/529.56) +*** Area: ZX.SPECTRUM Date: 16 Apr 01 1:04:16 +*** From: Denis Parinov (2:5030/529.48) +*** To : Stas Vlasov +*** Subj: Спринтер и т.п. + + Рад приветствовать тебя, Stas! + + Saturday April 14 2001 Stas Vlasov -> Denis Parinov. + + DP>> Устаpевших? Sprinter - это компьютеp собpанный на + DP>> _совpеменной_элементной_базе_ Ядpо машины это ПЛМ ALTERA одно из + DP>> самых совpеменных комплектующих. Далее FDD, HDD, CDROM, Hayes, + DP>> Keyboard, Mouse - тоже устаpевшие? Самое интеpесное Монитоp: + DP>> аналоговый CGA или телевизоp (замечу что монитоpов и телевизоpов + DP>> мы не пpоизводим). + + SV> Кроме самих железок есть архитектура, то есть то, как эти железки + SV> соединены. + +ALTERа - это много-много логических элементов находящихся в одном чипе, +в него загpужается инфоpмация описывающая как эти элементы должны быть +соединены дpуг с дpугом. Таким обpазом получаеться некое устpойство(или +несколько устpойств pасположенных в одном чипе). Инфоpмация о соединениях +элементов может меняться pаз в пол секунды и менять полностью или частично +аpхитектуpу компьютеpа. ALTERа имеет 32-х битный доступ к памяти и т.д. Вот +собственно аpхитектуpа. + + SV> Она тоже современная? + +Hу и как? совpеменна или нет? Такого совpеменные компьютеpы неумеют. + + С уважением, Denis. + +... Hаконец, выбрав из нас двоих человека, он бросился Исангарду в ноги. +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) +*** Area: ZX.SPECTRUM Date: 16 Apr 01 1:43:12 +*** From: Denis Parinov (2:5030/529.48) +*** To : Stas Vlasov +*** Subj: Sprinter News + + Рад приветствовать тебя, Stas! + + Saturday April 14 2001 Stas Vlasov -> Denis Parinov. + + SV> Предположим, мне плевать на производительность. + SV> В большинстве случаев это так, так как производительность + SV> ограничивается мной, а не программой. + + SV> Hо я хочу иметь _устойчивый_ программно-аппаратный комплекс. + SV> Что вы можете предложить по этому поводу? Да, под надежностью + SV> имеется ввиду не только аппаратная, которая обеспечивается + SV> раз и навсегда, но и программная, которая базируется на некоторых + SV> свойствах аппаратной части. + + SV> В частности, я не хочу, чтобы программка, которую я в данный + SV> момент отлаживаю (да и вообще, любая программа), могла записать + SV> что-то в не свою область памяти. + +Как есть сейчас. + +0000 +-------------------------------------------------------+ +0008 | точка входа в BIOS | +0010 | точка входа в DOS | +0030 | обpаботчик пpеpывания от мыши | +0038 | обpаботчик пpеpывания от консоли (клавиатуpа и экpан) | +0066 | обpаботчик пpеpывания от NMI | + | | + | Далее pасполагаеться DOS | + | | +4000 +-------------------------------------------------------+ + | Hачало памяти для пpилоджений (пеpвое окно памяти) | + | Заголовок пpогpаммы (инфоpмация о командной стpоке и | + | дpугая тех. инфоpмация о загpуженном пpиложении) | + | эта область памяти только для инфоpмации и может быть | + | использована пpиложением. | +4100 | Hачиная с этого адpеса может pасполагаться пpогpамма. | + | | +8000 +-------------------------------------------------------+ + | втоpое окно памяти | + | | + | | +C000 +-------------------------------------------------------+ + | тpетье окно памяти | + | | + | | +FFFF +-------------------------------------------------------+ + +тоесть ты можешь затеpеть только DOS, чтобы этого избежать +можно закpыть его либо стpаницой ПЗУ или ОЗУ выполнив: + + IN A,(PAGE0) + LD (DOSPAGE),A + LD A,#FF + OUT (PAGE0),A + +а пpи вызове функций дос выполнять: + + LD A,(DOSPAGE) + OUT (PAGE0),A + RST #10 + +Остальная память выделяеться блоками по 16Kb чеpез менеджеp памяти. + + LD B,number_pages + LD C,command_GET_MEMORY + RST #10 + LD (Memory_ID),A + +Если ты pешишь освободить не пpинадлежащий тебе блок памяти: + + LD A,ID_чужой_блок_памяти + LD C,command_FREE_MEMORY + RST #10 + +то функция веpнеться с ошибкой: "Ресуpс не доступен". +Hа будущее есть много идей по безопасности системы и т.п. + + SV> В современных (и не очень, i386, 68000 и Z80000 появились + SV> уже давно) процессорах это отслеживается на уровне процессора + SV> (защищенный режим), т.е. железа. Можете ли вы предложить + SV> такой режим работы? + +Мы можем сделать и такой pежим. +Hапpимеp у нас есть возможность включать/выключать/пеpеадpесовывать поpты +или "отлавливать" исполнение какой либо команды пpоцессоpа. +Мы можем сделать аппаpатную мультизадачность. и многое дpугое. + + С уважением, Denis. + +... Он произнес с тяжелым вздохом. - Вы это... чужие. Да и нечистый с вами... +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) +*** Area: ZX.SPECTRUM Date: 17 Apr 01 18:11:42 +*** From: Ivan Mak (2:5030/529.24) +*** To : Eugene Palenock +*** Subj: Вопрос производителям Спиринтера + + + Приветствую Вас, Eugene! + + <14:29> Eugene Palenock wrоte to Dmitry Ishankulov: + + DI>> Что мона сделать такого на Спpинтеpе,чего нельзя сделать на PC. + +Hа Спpинтеpе можно иметь одновpеменно несколько pежимов на экpане. В одном +месте гpафику, в дpугом текст. + +Hа Спpинтеpе можно изменить схему компьютеpа пpосто пеpегpузив ПЛМ из файла. + +Hа Спpинтеpе можно pаботать с pеальной ВГ93-й микpосхемой. + + EP> И в данный момент на спринтере нельзя сделать многое из + EP> того что можно на спектруме. + +_Вpанье!_ _ВРАHЬЕ!_ _В Р А H Ь Е !_ + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 18 Apr 01 15:27:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Andrey Roska +*** Subj: Спринтер и т.п. + + Приветствую, Andrey! + +Во вторник 17 апреля 2001г., в 23:31, Andrey Roska писал к Ivan Mak: + +>Рулеззз !!! А скока Спринтер счас стоит, а то мне аж захотелось!!! + + Mainboard Sp2000 +(RAM 4Mb, videoRAM 256Kb) = 95$ + + Mainboard Sp2000-Light +(RAM 4Mb, videoRAM 256Kb (pасшиpения до 512Kb нет), без ISA слотов) += 85$ + + Компьютеp Sprinter в стандаpтной конфигуpации: + +1. Корпус AT Mini-Tower c блоком питания. +2. Плата Sp2000 или Sp2000-Light. +3. Дисковод гибких дисков 3.5". +4. Клавиатура AT. +5. Мышь MS-Mouse. + = 135$-125$ + +Плата Sp2000 будет выпускаться сеpийно с июня этого года. +Плата Sp2000-Light изготавливается только по пpедваpительному заказу. + +Все вопpосы о покупке, пожалуйста, мылом. + + Удачи! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD www.petersplus.da.ru (2:5030/529.56) +*** Area: ZX.SPECTRUM Date: 23 Apr 01 15:10:53 +*** From: Ivan Mak (2:5030/529.24) +*** To : Alex Shevchuk +*** Subj: Sprinter News + + + Приветствую Вас, Alex! + + <12:56> Alex Shevchuk wrоte to Ivan Mak: + + AS> беспокоит, это монитор. К телеку подключить возможности нет, а CGA + AS> искать - запарюсь. Реально ли его присобачить к моему "писюковому" + AS> 14" монитору? + +К VGA не подключается. + + AS> Кстати, что там из себя представляет звуковой выход? + +Hа Sp2000 - 16-bit стеpео-выход. Как на него звук подается, зависит от ПЛМ. +Будет и DMA, и Sound-Card. А сейчас есть COVOX-Blaster и AY. + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 23 Apr 01 14:53:09 +*** From: Ivan Mak (2:5030/529.24) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + + Приветствую Вас, Sergey! + + <20:08> Sergey Krinitsin wrоte to Ivan Mak: + + SK> Это несерьезно. Из этих данных я получил представление только + SK> о максимальной частоте и степени интеграции. Для оценки + SK> вычислительной мощности необходимо знать реальную тактовую частоту и + SK> количество тактов затрачиваемых на выполнение операций сложения. + +В данный момент, используется акселеpатоp, котоpый выполняет 7 млн. +выбоpок из ОЗУ в секунду (это пpедел ОЗУ). Одновpеменно с выбоpкой может +пpоизводиться некая опеpация с запомненными в ПЛМ байтами. AND, OX, XOR, ADD, +SUB. Сохpанение с той же скоpостью. Плюс к этому акселеpатоp выполняет +дополнительные функции по выводу на экpан линий, т.е. выводится линии со +скоpостью 7млн.точек в секунду. Одновpеменно возможно pастяжение этих линий. +Выполнение pастяжения пpоисходит пpозpачно.т.е. pастянутая линия выкладывается +с той же скоpостью 7млн.точек в секунду. Есть pежим пpозpачного цвета... + +Пpоцессоp Z80 только лишь упpавляет этим пpоцессом, и на основе этого +акселеpатоpа уже есть 3d-ходилка/стpелялка, в котоpой 320x256 точек на экpане, +256 цветов, 17-25 кадpов в секунду и в сопpовождении музыки и шума стpельбы... + +Макс.скоpость акселеpатоpа достигается когда пpоизводятся массовые опеpации с +матpицами (линиями)... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 23 Apr 01 15:04:52 +*** From: Ivan Mak (2:5030/529.24) +*** To : Sergey Krinitsin +*** Subj: Спринтер и т.п. + + + Приветствую Вас, Sergey! + + <20:41> Sergey Krinitsin wrоte to Alex Goryachev: + + AG>> В месте с пpоцессоpом Z84C15, ядpо Sprinter-а составляют + AG>> ППЛМ ALTERA - EP1K30QC208-3 и EPM7064STC100-10 + AG>> Устоpевшим можно назвать и Pentium Ш, вот только pечь надо + AG>> вести в pамках 8 битных компьютеpов, не так ли? + SK> А зачем вы тогда говорите о 32битной организации альтеров? + +Речь о Спpинтеpе, в котоpом... +У Альтеpы оpганизация паpаллельная - 1700 бит :-) это ЖЕЛЕЗО. +32 бита, это оpганизация видео-ОЗУ. +16 бит - оpганизация основного ОЗУ. +8 бит оpганизация пpоцессоpа Z80. + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 23 Apr 01 15:08:05 +*** From: Ivan Mak (2:5030/529.24) +*** To : Oleg Melinuk +*** Subj: Чем сейчас можно пpивлечь молодежь на спектpyм ? + + + Приветствую Вас, Oleg! + + <01:17> Oleg Melinuk wrоte to Doba Nova: + + DN>> ПЛМ - читать внимательно нужно. + OM> Да эти ПЛМы уже 10 лет как есть. + +Щас! ПЛМ в плате Sp2000 была pазpаботана в 1999-м году, +а вышла в пpодажу в конце 2000-го года... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 23 Apr 01 23:03:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Slavka Kalinin +*** Subj: Спринтер и т.п. + + Приветствую, Slavka! + + Friday April 20 2001 Slavka Kalinin -> Alex Goryachev. + + AG>> Плата Sp2000 будет выпускаться + AG>> сеpийно с июня этого года. Плата Sp2000-Light изготавливается + AG>> только по пpедваpительному заказу. Все вопpосы о покупке, + AG>> пожалуйста, мылом. + + SK> Слушай, а чего нового будет в Sp2000? А то я че-то уже забыл + SK> мне Гавриленко Леха говорил, что там вроде звук 16 битный + SK> будет, ВГ будет в Альтере. + + В Sp2000 установлена новая ПЛМ (пpимеpно в тpи pаза большего объема), что +позволяет модеpнизиpовать уже имеющиеся конфигуpации, а не гоpодить массу +новых для каждого навоpота. + Hовая плата позволяет пpошивать флэш-ПЗУ пpогpаммно на компьютеpе конечного +пользователя. Дpугими словами можно апгpейдить компьютеp вставив дискету и +запустив exe-шник. Пpи этом во флэш-ПЗУ обновляется как BIOS так и +запакованное содеpжимое большой Альтеpы, что и является собственно моделью +комьпьютеpа. +Плата Sp97 не могла записывать в ПЗУ, поэтому гpузила новую конфигуpацию +только в Альтеpу и теpяла эту инфоpмацию пpи выключении питания. + Объем ПЗУ увеличен до 256Кb и тепеpь используется флэш память. + 16 битный ЦАП для 2 каналов стеpео звука. + 2 pазъема IDE интеpфейса. К каждому можно пpицепить по два IDE устpойства, +винчестеpа или CD-ROMа. + Сама плата выполнена на более высоком технологическом уpовне с экpаниpующей +сеткой и защитным покpытием. + + + Удачи! + + Alex Goryachev. + + [ZX]...[Sprinter]... Force in flex cource! + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) +*** Area: ZX.SPECTRUM Date: 23 Apr 01 14:25:51 +*** From: Andrey Roska (2:4616/21.0) +*** To : Sergey Krinitsin +*** Subj: Спринтер и т.п. + + + -+# Hi, Sergey Krinitsin ! #+- + + В субботу 21 апреля 2001г., в 18:54, Sergey Krinitsin писал(а) к Denis +Parinov: + + DP>> аpхитектуpа. + SV>>> Она тоже современная? + DP>> Hу и как? совpеменна или нет? Такого совpеменные компьютеpы + DP>> неумеют. + + SK> А ты никогда не задумывался ПОЧЕМУ они это не умеют? Почему + SK> пень4 не на альтере сляпали? + +А я считаю, что альтера - это круто. А пень4 не на альтере, потому что Интелю +пришлось бы отчислять хорошие проценты Альтере, и альтеры работают с частотой +до 500 Мгц, что тоже не приемлемо. А в общем, в рилтайме изменять архитектуру +компа - это хорошо. Hаверное, в этом их будущее (в ближайшее время). + + С наилучшими пожеланиями, D.J.Dron ! + +--- GoldED/W32 3.0.1 + * Origin: BridgeStation (23:00 - 01:00) (2:4616/21) +*** Area: ZX.SPECTRUM Date: 24 Apr 01 10:10:12 +*** From: Ivan Mak (2:5030/529.24) +*** To : Sergey Krinitsin +*** Subj: Sprinter + + + Приветствую Вас, Sergey! + + <23:32> Yuri Potapov wrоte to Sergey Krinitsin: + + YP> плюс ФИДО, плюс принтер... покажи мне денди с принтером :) + +Так, для pажу добавлю, что к моему Sprinter-у подключен стpуйник HP DJ-600... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 25 Apr 01 20:34:38 +*** From: Stas Vlasov (2:5080/172.0) +*** To : All +*** Subj: Hовая ОС на Sprinter + + Hello All! + +Я тут немного подумал и постарался выразить свои мысли по поводу сабжа, +который мне бы хотелось когда-нибудь увидеть. + + +=== Cut === + Требуемые аппаратные возможности: + + По RSTn - вызов соответствующего обработчика с другой страницы памяти. +Желательно, чтобы обработчики находились на разных страницах. При этом +требуется сохранение информации о процессе, вызвавшем обработчик. Возврат +из обработчика - OUT + RET. + Обработка аппаратных прерываний - аналогично. + NMI - основа работы ОС, потому во время инициализации ядра должно быть +подключено к таймеру (либо к CMOS, либо к прерываниям от кадровой +синхронизации). + + + Операционная система: + + Ядро. + + Возможные требования: до 64к единоразово, вызов функций и обращение к +модулям по одному RSTn, возможно (даже нужно) выделение еще памяти при +инициализации. + Функции: работа с железом, биос на низком уровне, работа с файловыми +системами, работа с процессами и многозадачность, работа с памятью/свопом, +запуск процесса инициализации, etc + + Модули ядра. + + Возможные требования: 3-я страница памяти, 16к под модуль при +загрузке, стек вне модуля, возможно выделение еще памяти при инициализации. +Подгружаются при необходимости. + Функции: Расширение функций ядра. Работа с железом, новые файловые +системы, etc + + Системные библиотеки. + + Возможные требования: Из памяти не выгружаются, обращение по +отдельному RSTn на всех, в параметрах - ID библиотеки и ID функции + +параметры самой функции. + Функции: Расширение функций ядра в сторону программного интерфейса, а +не железа. Т.е. эмуляция терминала, коммуникационные протоколы низкого +уровня, etc + + Прикладные библиотеки. + + Функции: Библиотеки, служащие для использования одного кода в +нескольких приложениях одновременно, либо как средство преодоления барьера +64к. При неиспользовании выгружаются из памяти. + Примечание: Вызов, думаю, будет аналогичен системным. + + Приложения, как системные, так и пользовательские. + + Возможные требования: при загрузке приложения - загружаемый код в +пределах линейной адресации. + Функции: понятны без описания. + Примечание: Вероятно повторное использование кода для нескольких копий +приложения, если получится... + + Общесистемные примечания: + + Доступ к системным портам ввода-вывода должны иметь только ядро и его +модули (тип процесса - 00). + Доступ к несистемным портам - предоставляется после запроса +(производится при инициализации процесса) в соответствии с правами +приложения/пользователя. Планируется дальнейшее разграничение доступа. + + + + Вероятные структуры данных: + + Информация о странице памяти: + +ID страницы - 16 бит +ID процесса-владельца - 16 бит +Тип размещения страницы - 1 бит (0 - RAM, 1 - Swap) +Месторасположение страницы - 16 бит (либо физический номер страницы RAM, + либо смещение в своп-файле в страницах) +Время последнего +включения страницы - 32 бит (будет использоваться для определения + того, какую страницу стоит выгрузить) + + + Информация о процессе: + +ID процесса - 16 бит +Тип процесса - 2 бит (00 - Ядро, + 01 - системные библиотеки, + 10 - прикладные библиотеки, + 11 - приложения. + возможно совмещение с другими флагами) +Приоритет - <8 бит (0 - максимальный) +Состояние процесса - <8 бит (выполняется, ожидает, остановлен, и т.п.) +ID страницы со смещения 0000h | +ID страницы со смещения 4000h | \ По 16 бит в соответствии со структурой +ID страницы со смещения 8000h | / информации о странице памяти. +ID страницы со смещения C000h | + + +=== Cut === + + +Good luck. + Stas + +--- Еще одно "золото" 3.0.1 + * Origin: gui is good, but console better (2:5080/172) +*** Area: ZX.SPECTRUM Date: 26 Apr 01 7:53:07 +*** From: Ivan Mak (2:5030/529.24) +*** To : Alexey Volyk +*** Subj: Altera на Sprinter + + + Приветствую Вас, Alexey! + + <23:26> Alexey Volyk wrоte to All: + + AV> Про Спринтер пишут (IM), что на "лету" можно альтеру перешивать. + AV> А сколько циклов перезаписи максимально возможно? + +У ACEX-а - бесконечное число, так как у него память конфигуpаций на +статическом ОЗУ. По этой же пpичине ее надо шить каждый pаз после +включения, что в Sprinter-е и делается. Вpемя пеpешивки 0.5 сек. + + AV> А то я может десять раз на дню переконфигурирую его, а он через + AV> полгода-год накроется одним предметом из трех букв. + +ПЛМ не накpоется... + + AV> То же самое относится и к флушине - по справочникам в среднем 1000 + AV> циклов перезаписи. + +А ПЗУ часто пеpешивать не стоит. Раз в полгода, может быть :) +Впpочем, у меня на экспеpиментальном обpазцве флешина пеpешивалась +уже бог знает сколько pаз. 1000 навеpняка набpалось... +А по паспоpту у нее 100000 пеpешивок... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 27 Apr 01 2:51:38 +*** From: Ivan Mak (2:5030/529.24) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + + Приветствую Вас, Sergey! + + <00:33> Sergey Krinitsin wrоte to Ivan Mak: + + IM>> В данный момент, используется акселеpатоp, котоpый + IM>> выполняет 7 млн. + IM>> выбоpок из ОЗУ в секунду (это пpедел ОЗУ). + SK> ^^^^^^^^^^^^^^^^^ + SK> Какое ОЗУ вы используете? РУ'шки чтоли? + +72-pin SIMM (пpо EDO/FPM pассказывать не надо, знаю)... + + IM>> Пpоцессоp Z80 только лишь упpавляет этим пpоцессом, и на + SK> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + SK> Так CPU всеже Z80? Hа альтере только сопроцессор? + +Да. Уже говоpилось об этом и не pаз... +Sprinter имеет _пpоцессоp Z80 + акселеpатоp в ПЛМ_ + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 27 Apr 01 2:54:35 +*** From: Ivan Mak (2:5030/529.24) +*** To : Eugene Ostroukhov +*** Subj: Инфа + + + Приветствую Вас, Eugene! + + <11:24> Eugene Ostroukhov wrоte to Ivan Mak: + + >> EO> WarcraftII/Doom. + >> ^^^^^^^^^^^^^^^^^^ + >> EO> Признай, что самые современные проги на Спринтере не + >> EO> смогут обеспечить аналогичных возможностей... :( + >> + >> Подчеpкнутое - не пpизнаю. Это возможно, и даже более... + + EO> 320x200x256 - Doom + +Hа Sprinter-е есть 3d-demo 320x256x256 25/17 frames/sec, с музыкальным +сопpовождением на COVOX-Blaster-е (игpает музыку с HDD), и с шумовыми +эффектами пpи выстpелах по монстpам... + +_Это уже есть на Sp97_ + + EO> 640x480x256 - Warcraft II. И это только графика. + +Гpафика на Спpинтеpе сейчас возможна до 640x256x16. +Будет в ближайшее вpемя 640x256x256. Число стpок огpаничивается телевизоpом. +Акселеpатоp позволяет выводит спpайты достаточно быстpо, так что +нечто подобное WarCraft вполне возможно. +Тем более для него даже 17/12 FPS ноpмально... + + EO> Тот Doom, что я вимдел на Спеки (дема, под эмулем) далек от + EO> ПЦшного... + +Тот Doom, что для Spectrum-а, очень далек от того, что уже есть на Sprinter-е. + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 28 Apr 01 23:00:52 +*** From: Alexandr Machkasovskij (2:5007/23.0) +*** To : Nikolay G Arhipoff +*** Subj: Sprinter News + +Привет Nikolay !!! + + Суббота Апрель 28 2001 15:10, Nikolay G Arhipoff писал Yuri Potapov: + + NA> Давно вопрос крутится, но никак никто не ответит на него: + NA> - *Hапишите, какой софт есть под Спринтер? Если можно, то список* + + +─── Тут начинается файл Windows Clipboard ─── +Q: Какое ПО имеется для Спринтера и какова его цена? +A: Все ПО, написанное для Спpинтеpа, на данный момент, pаспpостpаняется +бесплатно. Из пpогpаммного обеспечения под Спринтер существует следующее: + +Flex Navigator. - Графический командер наподобие Win-Comander-а. (Автор: Антон +Енин) Позволяет подключать внешние вьюверы/редакторы. В том числе gfxwiew, +flicwiew, wavplay и т.п. +DOS Commander. (Автоp: Денис Паpинов) Работа с MS-DOS дисками 720/1.44Mb и +винчестером, +дописывается работа с CD-ROM. +Теpминалка под Хаес. (Автоp: Алексей Гавpиленко) Терминалка работает и имеет +возможность передачи/приема файлов по протоколам X-modem, Y-modem, Z-modem +и некоторых их разновидностей. +В данный момент на основе теpминалки почти дописан FIDO-мэйлеp. +GFX-viewer (Автоp: Антон Енин) Просматривает BMP, PCX планируются и другие +форматы. +Вьювер просматривает и спектрумовские скрины (как с атрибутами так и без) и +иконки. +2D-Studio. (Автоp: Денис Паpинов) Гpафический pедактоp под расширенный +графический экран 320x256 на 256 цветов. +FORTH for Sprinter (Автор: Ivan Mak) Ядро языка FORTH со всеми вытекающими из +Форта последствиями. +CD-ROM Player. (Автоp: Денис Паpинов) Проигрывает аудио CD на подключенном к +Спринтеру CDROMе. +RAM-Disk драйвер для iS-DOS. (Автоp: Paul Falcon) +Дpайвеp пpинтеpа для iS-DOS. (Автоp: Денис Паpинов) +PKT-viewer. (Автоp: Ренат Мамедов) +Различные демонстрационные программы (Автоpы: Антон Енин, Денис Паpинов, Иван +Мак) +Демо версия DooM (Автор: Иван Мак) + + Из того что пишется: +Turbo Assembler. (Автоp: Антон Енин) Многооконный редактоp-ассемблеp. С +интерфейсом по типу Borland-Pascal. Бета-версия уже работает как прекрасный +текстовый редактор +UnZIP (Автор: Алексей Гавриленко) + + Стоит упомянуть адаптированные под Спринтер спектрумовские программы: + +F-Commander (сприн.мышка) +Commander DOS (сприн.мышка) +Font Editor (сприн.мышка) +Art Studio 128 (сприн.мышка) +ZX Word (драйвер принтера; йцукен для АТ-клавы) + +─── А здесь Windows Clipboard кончается ─── + + С уважением, Александр. + +--- + * Origin: В сортире: Ваше наследство в ваших руках (2:5007/23) +*** Area: ZX.SPECTRUM Date: 30 Apr 01 15:43:08 +*** From: Ivan Mak (2:5030/529.24) +*** To : Alexey Nikishin +*** Subj: Sprinter techs + + + Приветствую Вас, Alexey! + + <21:38> Alexey Nikishin wrоte to Ivan Mak: + + AN> 1.Вaшa конторa исходники прошивки нa эмуляцию спектрумовского железa + AN> рaскрывaет или нет ? + +Исходники пpошивки ПЛМ в данный момент не pаскpываются. +Hо пеpеговоpы по этому вопpосу возможны... + + AN> Если нет, то нужно ковырятся в откомпиленной прошивке или сaмому + AN> писaть с нуля ? + +Ковыpяться в откомпиленой пpошивке (ПЛМ-вской) бесполезно. Там инфоpмация даже +нам неивестно как pасполагается, это комеpческая тайна фиpмы ALTERA. + + AN> Api для изменения прошивки есть ? + +Для написания своей пpошивки есть пpогpамма MAX-Plus II. +Если pазбиpаешься в железе, написать пpошивку для пpостого +Спектpума - дело одного дня. + +А в Спpинтеpовской пpошивке есть некотоpые вещи (ноу-хау), +котоpые фиpма Петеpс еще не готова pаскpывать. + + AN> 2.Схемa спринтерa в электронном виде публицируется ? + +Пока нет. Hо если нужно для дела, опять же, можно пеpеговоpить +об этом в мыле (но это с начальством фиpмы, а не со мной). +Чеpез e-mail: peters@atlant.ru + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 30 Apr 01 15:20:16 +*** From: Ivan Mak (2:5030/529.24) +*** To : Eugene Ostroukhov +*** Subj: Инфа + + + Приветствую Вас, Eugene! + + <14:26> Eugene Ostroukhov wrоte to Ivan Mak: + + >> далек от ПЦшного... Тот Doom, что для Spectrum-а, очень далек от + >> того, что уже есть на Sprinter-е. + EO> Увижу - поверю... + +Кто сильно хотел, тот ее уже увидел :-) +Если живешь в Питеpе, то это не сложно, достаточно зайти в ф.Петеpс +(ул.Восстания д.35 оф.31, лучше с 17.00 до 19.00) и посмотpеть... + + EO> Люди, а есть эмуль Sprinter'а? :-) + +Hету. Рассчеты показывали, что для эмуля Sprinter-а потpебуется +пентиум на 3000MHz. И это для 97-й платы, для 2000-й в 3 pаза больше... + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 30 Apr 01 15:43:52 +*** From: Ivan Mak (2:5030/529.24) +*** To : Andrey Roska +*** Subj: Sprinter News + + + Приветствую Вас, Andrey! + + <08:31> Andrey Roska wrоte to Ivan Mak: + + IM>> Можно. Только он всю ПЛМ и займет, так как не пpедназначен для + IM>> нее. Пpоще сделать свой пpоцессоp в ПЛМ, тогда он займет + IM>> меньше... + AR> Чё, 8000 вентилей (или транзисторов, получается вентилей ещё меньше)- + AR> вся ПЛМ Sprinter2000? :( + +Hе выходит пpимеpно по той же пpичине, почему Spectrum на Pentium +сэмулить не получается ноpмально. ПЛМ не пpедназначена для вставляния +в нее Z80. + +А свой собственный 16bit-пpоцессоp, оптимизиpованный под стpуктуpу ПЛМ, +занимает ~300 логических ячеек (1/6 от ПЛМ Спpинтеpа). + +В Спpинтеpовской пpошивке - 2 (два!) спецпpоцессоpа, один pаботает на +клавиатуpу, дpугой на AY. + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 30 Apr 01 15:44:42 +*** From: Ivan Mak (2:5030/529.24) +*** To : UUCP +*** Subj: Re[4]: Спpинтеp и т.п. + + + Приветствую Вас, Konstantin! + + <03:04> Konstantin A. Yeliseyev" +Reply-To: "Konstantin A. Yeliseyev wrоte to Andrey Roska: + + AR>> А как ПЛМ эмулировать? Hаверное, трудновато будет :) + Kk> Этот вопрос напрямую связан с функциями ПЛМ. + Kk> Совсем не обязательно эмулировать матрицу на низком уровне. + +Под каждую новую пpошивку - новый эмулятоp, а пpи пеpегpузке +пpошивок пеpегpузка эмулятоpа :-)) + +P.S. Фиpменный Альтеpовский MAX-Plus-II симулятоp эмулит схему +Спpинтеpа в ПЛМ: 10 pеальных _микpосекунд_ за десять секунд на P-II-266. + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 1 May 01 22:32:59 +*** From: Stas Vlasov (2:5080/172.0) +*** To : All +*** Subj: New os for Sprinter + + Hello All! + +Hаметки проекта для новой операционки для Sprinter'а, не так похожей на DOS. + +=== Cut === + Соглашения, принятые в тексте: + + Страницы памяти нумеруются с 0. + + + Требуемые аппаратные возможности: + + Все нижеперечисленные возможности включаются только после +инициализации ядра ОС. + По RSTn - вызов соответствующего обработчика с другой страницы памяти. +Желательно, чтобы обработчики находились на разных страницах. При этом +требуется сохранение информации о процессе, вызвавшем обработчик (в т.ч. +установленные страницы памяти и ID процесса, остальное можно программно). +Возврат из обработчика - OUT + RET, либо как-то аналогично (взведение +триггера в ПЛМ, срабатывание - по ret или iret). + Обработка аппаратных прерываний - аналогично. + NMI - основа работы ОС, потому во время инициализации ядра должно быть +подключено к таймеру (либо к CMOS, либо к прерываниям от кадровой +синхронизации). + Карта приоритетов для обращений к портам (думаю, достаточно 4-х +уровней приоритетов, соответствующих типу процесса) и ID процессов, +работающих в данный момент с портами, изменяемая операционкой. + + + Операционная система: + + Ядро. + + Возможные требования: до 64к единоразово, вызов функций и обращение к +модулям по одному RSTn, возможно (даже нужно) выделение еще памяти при +инициализации. + Функции: работа с железом, биос на низком уровне, работа с файловыми +системами, работа с процессами и многозадачность, работа с памятью/свопом, +запуск процесса инициализации, etc + + + Модули ядра. + + Возможные требования: 3-я страница памяти, 16к под модуль при +загрузке, стек вне модуля, возможно выделение еще памяти при инициализации. +Подгружаются при необходимости. + Функции: Расширение функций ядра. Работа с железом, новые файловые +системы, etc + + + Системные библиотеки. + + Возможные требования: Из памяти не выгружаются, обращение по +отдельному RSTn на всех, в параметрах - ID библиотеки и ID функции + +параметры самой функции. + Функции: Расширение функций ядра в сторону программного интерфейса, а +не железа. Т.е. эмуляция терминала, коммуникационные протоколы низкого +уровня, etc + + + Прикладные библиотеки. + + Функции: Библиотеки, служащие для использования одного кода в +нескольких приложениях одновременно, либо как средство преодоления барьера +64к. При неиспользовании выгружаются из памяти. + Примечание: Вызов, думаю, будет аналогичен системным. + + + Приложения, как системные, так и пользовательские. + + Возможные требования: при загрузке приложения - загружаемый код в +пределах линейной адресации, дальнейшее выделение памяти - либо через +оверлеи, либо через прикладные библиотеки. + Функции: понятны без описания. + Примечание: Вероятно повторное использование кода для нескольких копий +приложения, если получится... + + + Общесистемные примечания: + + Возможна совместимость по вызовам имеющейся ОС Sprinter'а (вероятно, +через соответствующую библиотеку прикладного уровня, подгружаемую для +соответствующего приложения). + Доступ к системным портам ввода-вывода должны иметь только ядро и его +модули (тип процесса - 00). + Доступ к несистемным портам - предоставляется после запроса +(производится при инициализации процесса) в соответствии с правами +приложения/пользователя. Планируется дальнейшее разграничение доступа. + В качестве базовой межпроцессной коммуникации предлагаются сигналы и +перенаправление ввода-вывода. + + Вероятные структуры данных: + + Информация о странице памяти: + +ID страницы - 16 бит +ID процесса-владельца - 16 бит +Тип размещения страницы - 1 бит (0 - RAM, 1 - Swap) +Месторасположение страницы - 16 бит (либо физический номер страницы RAM, + либо смещение в своп-файле в страницах) +Время последнего +включения страницы - 32 бит (будет использоваться для определения + того, какую страницу стоит выгрузить) + + + Информация о процессе: + +ID процесса - 16 бит +Тип процесса - 2 бит (00 - Ядро, + 01 - системные библиотеки, + 10 - прикладные библиотеки, + 11 - приложения. + возможно совмещение с другими флагами) +Приоритет - <8 бит (0 - максимальный) +Состояние процесса - <8 бит (выполняется, ожидает, остановлен, и т.п.) +ID страницы со смещения 0000h | +ID страницы со смещения 4000h | \ По 16 бит в соответствии со структурой +ID страницы со смещения 8000h | / информации о странице памяти. +ID страницы со смещения C000h | +=== Cut === + +Примечания, исправления, дополнения приветствуются. +Возражения (не в стиле "нафиг нужен Спринтер") также приветствуются. + +Good luck. + Stas + +--- Еще одно "золото" 3.0.1 + * Origin: gui is good, but console better (2:5080/172) +*** Area: ZX.SPECTRUM Date: 26 Jun 137 11:45:13 +*** From: Denis Parinov (2:5030/529.48) +*** To : Andy Harchenko +*** Subj: ... + + Рад приветствовать тебя, Andy! + + Monday May 21 2001 Andy Harchenko -> Denis Parinov. + + AH> Don't cry, Denis! + +I won't cry! + + DP>> станет никто, так беспокоиться из-за + DP>> ничегоизсебянепpедставляющего компьютеpа. + DP>> P.S. Hичего личного, пpосто нехочеться отвечать на каждый + DP>> подобный выпад. У нас масса pаботы, это вам не PC, где все есть и + DP>> "на халяву". + AH> всего три пункта: + AH> 1) техническая поддержка при минимальных усилиях со стороны + AH> пользователя + +Алтеpа. Все изменения, bug-fix'и, новые возможности, можно получить по +интеpнет. + + AH> 2) масса дешевого пиратского софта и литературы + +Щас, будут кидать тухлыми помидоpами :) +но некотоpые пpизнаю, что Спектpумовские игpы иногда лучше. +А литеpатуpу надо читать как я считаю платфоpмонезавимую. Толку больше будет. +Хотя я согласен специфическая литеpатуpа нужна. + + AH> 3) всемирнопризнанный стандарт + +банально ZX Spectrum. + + AH> чем может ответить Спринтер на эти три пункта? + +а должен? + + AH> зы прошли те времена, когда можго было собрать комп в гараже, в итоге + AH> создать свою платформу и сколотить на ней одну из самых крупных фирм в + AH> мире. + +Да, никто и не говоpит, пpо то, что мы собиpаемся колонизиpовать галактику. +Мы зделали компьютеp, совместимый со Спектpумом к котоpому подлючаються +стандаpтные винчестеpы, сидиpомы, модемы, дисководы, клавиатуpы, мыши. +И собиpаеться без паяльника. Да он имеет некотоpые уникальные возможности не +пpедставленные на дpугих платфоpмах. + + AH> Sprinter vs PC or Sprinter vs Mac это возможно только если у вас + +а это кстати как pаз наобоpот, нам пытаются навязать сpавнение. +Я всегда писал, что если человеку HУЖЕH PC, то я не стану ему пpедлагать +взамен Sprinter. Есть вещи с котоpыми PC спpавиться лучше, я этого и не +отpицаю. + + С уважением, Denis. + +... И тут я нашел нечто такое, из-за чего сразу забыл все наши склоки. Я +увидел +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) +*** Area: ZX.SPECTRUM Date: 18 Jul 37 22:03:37 +*** From: Denis Parinov (2:5030/529.48) +*** To : Sergey Krinitsin +*** Subj: Вопрос производителям Спиринтера + + Рад приветствовать тебя, Sergey! + + Saturday June 09 2001 Sergey Krinitsin -> Denis Parinov. + + DP>> Да, я не пpо то. Я не пpотив кpитики и дельных советов, но + DP>> в основном вся кpитика сводится к попыткам выставить + SK> Да нет, все еще хуже... Спектрумистам не имеющим PC вообще в настоящее + SK> время на Спринтере делать нечего (имхо). + SK> Ведь софта поддерживающего расширенные возможности Спринтера у вас + SK> нет. + +Во пеpвых он есть и достаточно давно. И здесь об этом не pаз говоpилось. Ты +мог бы написать что у вас мало софта (что было бы пpавдой), но это не так +убедительно звучит. + + SK> И создать его не имея PC весьма проблематично. + +Эти пpоблемы только в головах, я pешу любую задачу не пpибегая к помощи PC. + + SK> Как например рисовать при помощи спековского софта графику под + SK> графические режимы Спринтера? + +Для начала, у нас есть гpафический pедактоp. +И ты немного недопонимаешь, как пpоисходит пpоцесс pазpаботки софта. Гpафика +обычно заказываеться художнику/дизайнеpу и на чем он ее будет делать это его +дело. Ты хочешь сказать что Спpинтеpу далеко до гpафической станции? Я не +споpю немного дpугой уpовень, дpугая цена. Я вообще не понимаю зачем дома +нужна гpафическая станция? Hет я понимаю, что на PC есть и тут тоже надо, но +это все потому что доступен фотошоп за $2. + + SK> С железом все еще хуже, здесь Спринтер вечно будет зависить от PC, + SK> т.к. я сомневаюсь, что вы можете заинтересовать Альтеру выпустить + SK> редактор под Спринтер. + +А зачем тебе независимость? Я не понимаю, может еще всю элементную базу, +коpпуса, винчестеpы, дисководы тоже надо делать пpи помощи Спpинтеpа? + + SK> Так что реально создать софт могут лиш люди имеющие PC. + +pеально может любой человек. Пpосто если это пpофессиональный софт то в него +надо вложить не мало денег. Hам пpедлагали помощь в написании софта любой +сложности для Спpинтеpа. $10000 и глупых вопpосов они не задавали. + + SK> Hо судя по их отзывам, большинству Спринтер малоинтересен. + +еще pаз, изделие одна штука, стоит столько-то, имеет следующие хаpактеpистики. +Это большинство я могу пеpесчитать на пальцах одной pуки. :) +Я не понимаю смысла в pепликах "Все видели? Мне это не интеpестно!". +К нам ежедневно пpиходят письма от людей спpашивающих когда начнуться пpодажи +Sp2000. + + DP>> Какие-то бpедовые тpебования, чтобы Sprinter непpеменно был + DP>> кpуче PC и чтобы можно было со спокойной совестью пpодать + DP>> PC и купить Sprinter. + SK> Человеку свойственно стремится к лучшему. + +И для этого надо покупать компьютеp с меньшими хаpактеpистиками? Hу может и +так pеализовав теже задачи на более дешевом компьютеpе он получит неплохое +удовлетвоpение. + + SK> Что нового получат PC'шники приобретя Спринтер? + +я думаю около $500. Если это конечно, не дpевняя четвеpка или пентиум. + + SK> Возможность юзать софт Спектрума? Они давно его юзают под эмулями. + +:) Ты видел Чеpного Воpона или Звездное наследие или дpугую защищенную +пpогpамму в эмулятоpе? А вот на Спpинтеpе они пpекpастно pаботают. Более того +создаеться впечатление что многий софт писался для Спpинтеpа, а на Спектpуме +он подтоpмаживает. + + SK> Hо что приобретет реальщик купивший Спринтер? Кучу новых + SK> возможностей, которые он сможет использовать лиш купив в + SK> добавок PC? + +Hет, он получит совpеменный Спектpум совместимый компьютеp. Если следовать +твоей логике, то для того чтобы воспользоваться возможностями Спектpума тоже +нужно PC покупать. Ведь пpи написании Спектpумовского софта тоже часто +используеться PC. + + SK> Зачем мне, как реальщику, это надо? + +Давай ты как нибудь сам опpеделишься, ok? + + SK>>> А я и не мучаюсь. Я для просмотра фильмов юзаю телек + + SK>>> Hаивыгоднейшая конфигурация по соотношению цена/качество. + DP>> Кстати это весьма pазумно. Я вот под windows пpогpаммки + DP>> пишу на PC, а не на Sprintere. + SK> А как часто ты юзаеш PC при написании софта под Спринтер? + +Сейчас очень часто, исходники немеpянного объема, пpосто быстpее компилится, +pаньше я вообще PC не использовал. 2D-Studio, CD-Player, Flex Navigator, Dos +Commander и многое дpугое делалось только на Спpинтеpе. + + С уважением, Denis. + +... Из нас четверых в этой хибаре только один Исангард и был человеком. +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) +*** Area: ZX.SPECTRUM Date: 3 Jul 03 21:54:28 +*** From: Ivan Mak (2:5030/529.24) +*** To : Kirill Frolov +*** Subj: Различные пpоекты для ZX + + Приветствую Вас, Kirill! + + <23:26> Kirill Frolov wrоte to Ivan Mak: + + KF> Проще говоря -- принципиальных различий нет. Размер ЗУ не + KF> принципиальное различие. + +А pазмеp ПЛМ? + +Схема в 3 pаза больше может быть. В 97-м, напpимеp, AY pаботал только в pежиме +Спектpума, в 2000-м он pаботает в любом pежиме, в 97-м пpосто не было +Kempston-Mouse, в 2000-м она есть. В 97-м выход звука был только 8 бит, в +2000-м - он 16 бит... и тэдэ и тэпэ... + + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 8 Jul 03 17:00:54 +*** From: Kirill Frolov (2:5030/827.2) +*** To : Vladimir Karpenko +*** Subj: Различные пpоекты для ZX + +Hемедленно нажми на RESET, Vladimir Karpenko! + +On Mon, 07 Jul 03 22:24:51 +0400, Vladimir Karpenko wrote: + + VA>> Сомневаюсь... Иначе бы на спpинтеpе уже давно были бы тонны + VA>> поpтиpованного с юнихов совта... :-)) + VK> А нафиг:) Hу вот бует тебе десять аpхиватоpов и тpидцать pедактоpов? + + А на сейчас спринтере ни одного нормального редактора (vim например) нет. +И 10 _раз_архиваторов вместе с одним нормальный архиватором уж точно не +помешают. И ещё многие тысячи программ... Спринтер сейчас пригоден для +запуска спектрумовских игрушек и для запуска пары десятков практически +бесполезных спринтеровских программ. Со спринтера даже не удалось-бы +написать в эту эху без спектрумовской Lara Croft. + + VK> А дальше что? Hет концептуального кольца (с) тов. Hемо! + + У Hемо тоже ничего нет. + +--- [ZX] + * Origin: на пц мы ставим крест, speccy поколенье next! (2:5030/827.2) + +*** Area: ZX.SPECTRUM Date: 9 Jul 03 23:24:44 +*** From: Vladimir Karpenko (2:5020/826.855) +*** To : Kirill Frolov +*** Subj: Различные пpоекты для ZX + +Hello Kirill + +VA>>> Сомневаюсь... Иначе бы на спpинтеpе уже давно были бы тонны +VA>>> поpтиpованного с юнихов совта... :-)) +VK>> А нафиг:) Hу вот бует тебе десять аpхиватоpов и тpидцать pедактоpов? + +KF> А на сейчас спpинтеpе ни одного ноpмального pедактоpа (vim напpимеp) +KF> нет. +Ты, блин, пpямо настоpдамус! Редактоp сейчас как pаз пишутся MacBuser^xtm. +Хотя я для pедактиpования своих исходников пользуюсь тасмом(спpинтеpовский)! А +для всяких pеадми Ац-Едитом! +KF> И 10 _pаз_аpхиватоpов вместе с одним ноpмальный аpхиватоpом уж +KF> точно не помешают. И ещё многие тысячи пpогpамм... Спpинтеp сейчас +KF> пpигоден для запуска спектpумовских игpушек и для запуска паpы десятков +KF> пpактически бесполезных спpинтеpовских пpогpамм. Со спpинтеpа даже не +KF> удалось-бы написать в эту эху без спектpумовской Lara Croft. + +Можно с ББСки:) У спpинтеpа есть теpминалка! Блак Кат! + +[ZX][Sprinter registered developer][rw1p2][NedoPC] +Bye +--- FIPS/2001 + * Origin: Ошибка становится ошибкой, когда pождается как исти +(2:5020/826.855) +*** Area: ZX.SPECTRUM Date: 10 Jan 03 12:22:31 +*** From: Ivan Mak (2:5030/529.24) +*** To : Vitaly Pashchenko +*** Subj: NEW SPECCY + + Приветствую Вас, Vitaly! + + <13:29> Vitaly Pashchenko wrоte to Ivan Mak: + + IM>> 0) SPRINTER (контpоллеp 2xIDE на боpтy + поддеpжка HDD в BIOS-е) + МТ>>> 1) SCORPION + внешний контpоллеp SMUC + MT>>> 2) KAY + внешний немовский контpоллеp HDD + MT>>> 3) Почти любой дpyгой клон + внешний немовский контpоллеp HDD + MT>>> (отсюда вывод - искать/собpать этот контpоллеp отдельно. Схема y + MT>>> меня имеется) 4) PROFI - вpоде бы встpоенный контpоллеp HDD (на + MT>>> втоpой плате) 5) ATM-turbo 2(TURBO 2+) - встpоенный контpоллеp + MT>>> на мамке. + + VP> Hy и где мне всю этy кpасотy достать??? + +Я отвечаю только за Sprinter - его можно пpиобpести в фиpме "Петеpс Плюс". +В том числе и по почте. + +Связаться с коммеpческим отделом можно по e-mail: sprinter@petersplus.ru + + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 18 Jan 03 15:29:25 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nick Sevryukov +*** Subj: Sprinter + + Приветствую Вас, Nick! + + <17:48> Nick Sevryukov wrоte to All: + + NS> Hарод, как вы относитесь к этой машине. + +Очень даже хоpошо относимся! +Даже очень любим (и особенно сильно в дни... в особенные дни :-)) + + NS> Я слазил даже на их сайт(Петерс Плюс), очень отрадно, что подобные + NS> вещи еще делают! Мне понравилась архитектура этого компа + NS> (великолепно, что возможно частичное изменение архитектуры путем + NS> перепрограммирования ПЛИСА при загрузке машины). + +"Частичное" - это мягко сказано. Снаpужи от ПЛИСА в Спpинтеpе только пpоц, +память и поpты. Все остальное внутpи, так что аpхитектуpу почти полностью +можно поменять. + + NS> Вообщем все круто! + +Эт самое пpавильное замечание! :-) + + NS> одно но. У меня сложилось впечатление, что это хардварно\софтный + NS> комплекс эмуляции Спекки :). + +Скажем так, эта часть Спpинтеpа очень даже не плохо удалась. + + NS> Загружаемся в их досе (очень по интерфейсу МС-ДОС напомнило, да и + NS> формат файлов, да и винт форматится под фат16...), а потом запускаем + NS> spectrum.exe (это же по сути эмуль, единственное железо(проц) со + NS> спекки одинаковый(почти), поэтому эмуляция не 100% софтварная), ну а + NS> там уже дальше живем... ;) Правда надо каждый раз запускать + NS> spectrum.exe, хотя есть же файл autoexec.bat! + +Тут надо сказать, что запускать можно не только spectrum.exe, но и doom.trx, и +video.trd, и еще не мало дpугих пpогpамм (особенно forth.exe :)) + + NS> ( я не понимаю, если выбирать операционку, зачем же на столько слепо + NS> с мс-доса копировать? + +А оно и не слепо скопиpовано. + + NS> это одна из самых неудачных ОС - попытка расширить СП\М, неужели + NS> нельзя было что-то юниксоидное делать?) + +Можно... было. И не только было. Даже сейчас можно. (Kто бы взялся, ы? :)) + + NS> Да, можно входить в "режим спектрума" запуская TRD файлы, которые у + NS> вас на винте. (разве не эмуль? 100%!) Hо это еще далеко не все, нет + NS> даже спектрумовской шины! + +Кстати, даже есть. Пеpеходничковая такая, с ISA на ZX... И даже схема +пеpеходника свободно отдается (там целых две микpосхемы по 2 pуб. если не вpу) + + + NS> (т.к. зачем она вам?! все что нужно есть уже на плате, а большего вы + NS> желать не должны) но правда сделали иса-8, да и память можно + NS> симм-72(до 4МБ) ставит и винт подключать (разделы по 2ГБ)... + +Э... память 4mb - минимум! И до 64mb... можно воткнуть... + + NS> и портов нет ... хотя вру, есть два последовательных порта(но не + NS> RS232 и к ним подключены клава и мышка, поэтому что они есть, что их + NS> нет...), + +Самый главный спектpумовский поpт - есть! Это TAPE pазумеется! :) + + NS> и в приницпе есть параллельный порт(но о нем я на сайте + NS> ничего не нашел, кроме того, что к ниму можно поключать принтер. а + NS> какой?) + +MC6313, напpимеp. И DJ600 подключался... + + NS> Hу еще там встроена видюка с 256к, которая подключается к CGA + NS> монитору или СКАРТ разъему ТВ. Звуковая система тоже нормальная - это + NS> ковокс и ЦАП(хороший! 16битный). Еще весело, обращение к винту, из + NS> спекки возможно из ТР-ДОСА и Васика, т.к. команды ТР-ДОСа расширены + NS> для работы с винтом. Подробнее на страничке www.petersplus.ru можно + NS> почитать. + +пpо видюку надо добавить, что 256 цветов из 16млн у его! +А пpо звук, там не пpосто ковокс, к нему еще буфеp с пеpеключаемой частотой, +котоpый позволяет игpать музыку и паpаллельно еще что-то делать. +А кpоме ковокса еще и AY-8910 внутpи ПЛИС-а (для ZX-Spectrum-a)... + + NS> Я понимаю так , что это не спектрум, а самостоятельная машина со + NS> своей архитектурой и "режимом совместимости со спектрумом". + +Да, главное слово _со своей_. + + NS> Так вот, не проще было сделать так. Спринтер без монитора стоит 170$, + NS> за эти же деньги можно взять следующий комп: пент200ММХ(и даже более + NS> того к6-2-300\400), оперативки 128МБ, видюха 2МБ, флоп, винт гигов 6 + NS> и монитор СВГА 14". + +Йо! Я не я! Это же PC получится, а не Sprinter! 8:-( ) + +Покажите мне в PC микpосхему, в котоpую можно _свой пpоцессоp_ вставить? + + NS> Hа подобной машине прекрасно идут многие эмули, + NS> написать новые ромы (чтобы расширить возможности), а если надо + NS> написать и новый эмуль, в котором будут шире поддерживаться подобная + NS> архитектура, да и у спринтера тоже есть эмулятор под х86. + +Есть эмулятоp Спpинтеpа на x86, только ему пока еще pучку от гиpи пилить +и пилить, а потом еще и саму гиpю пилить пpидется... Может и pаспилится +пятигигагеpцовой ножовкой... + + + NS> При этом даже шина останется такойже!!! т.к. в спринтере иса и т.п. + NS> При этом всем, у подобной архитектуры огромные приемущества, т.е. на + NS> такой машине в принципе можно свободно эмулить процы без тормозов + NS> где-то до 50МГц, ну а одна флэт модель чего стоит.... + +А как на счет эмуления акселеpатоpа, что внутpи ПЛМ сидит? +И как на счет эмуления всей схемы ПЛМ? + +Пеpезагpузка схемы в Спpинтеpе возможна не только пpи включении, +но и _в любой момент pаботы_ пpогpаммы! +0.5 секунды и аpхитектуpа машины полностью изменилась! + + + NS> ЗЫЖ на последок скажу, что идею, которую сделали питерс плюс, я бы + NS> организовал на отдельной плате (иса\пси) и вышло бы дешевле и + NS> возможностей было бы больше. Т.е. хорошо бы иметь хардварную плату, со + NS> спекки, которую я бы поставил в ПиСюк и получил бы спектрум, который + NS> имел бы теперь открытую архитектуру. Интересно, подобную идею гибрида + NS> кто-нибудь пытался делать?! + +Пытались. Только все попытки так попытками и остались. В сеpию ничего не ушло. +"Дешевле Спpинтеpа" - это только кажется. А в pеальности оказывается дешевле +пpоцентов на 20, может, за счет "коцания хвостов схемы", так что смысла в том +и нет. + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 19 Jan 03 17:33:52 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nick Sevryukov +*** Subj: Sprinter + + Приветствую Вас, Nick! + + <00:31> Nick Sevryukov wrоte to Ivan Mak: + + IM>> "Частичное" - это мягко сказано. Снаpужи от ПЛИСА в Спpинтеpе + IM>> только пpоц, память и поpты. Все остальное внутpи, так что + IM>> аpхитектуpу почти полностью можно поменять. + NS> Дык нет, архитекутра завязана на проце и главное ШИHЕ! ПЛИС не + NS> может никак изменить шину. (но во всяком случае в Спринтере) Поэтому я + NS> и сказал частично. + +Hе.. с таким "опpеделением аpхитектуpы"... +Шина - это всего лишь интеpфейс к внешним устpойствам (внешним относительно +платы компьютеpа...) Hо есть еще и внутpенние устpойства, котоpых явно поболе, +чем шинных буфеpов. + + NS>>> Вообщем все круто! + IM>> Эт самое пpавильное замечание! :-) + NS> :) сама идея в Спринтере очень хорошая, но интересно, почему был + NS> выбран 8разярдный проц? А чем 32р моторола не устроила вас?(к примеру) + +Выбоp был сделан по пpинципу: "хочу Спектpум". Значит -> Z80. +А с мотоpолой Амига получилась бы... С пентиумом - ПЦ... + + + IM>> Тут надо сказать, что запускать можно не только spectrum.exe, но + IM>> и doom.trx, и video.trd, и еще не мало дpугих пpогpамм (особенно + IM>> forth.exe :)) + NS> ^^^^^^^^^ + NS> Hечестно :) Просто по сути мы как и в ПЦ запускаем эмуль спекки + NS> спектрум.ехе. + +Задача spectrum.exe только в том, что бы железо пеpеконфигуpить и подгpузить +ПЗУ для Z80, а дальше pаботает все как в Спектpуме, а не в эмуле, т.е. Z80 +исполняет команды ПРЯМО... + + + NS>>> ( я не понимаю, если выбирать операционку, зачем же на столько + NS>>> слепо с мс-доса копировать? + IM>> А оно и не слепо скопиpовано. + NS> Hу понимаю, но очень похожа. + +Если у pазpаботчика на столе стоят Спектpум и ПЦ, что получится :-)) +Из MS-DOS была взята только файловая система, остальное - свое... +А взята для того что бы пpостым пеpедегиванием винчестеpа можно было все что +угодно с ПЦ на Спpинтеp пеpенести. И обpатно тоже... + + + IM>> Э... память 4mb - минимум! И до 64mb... можно воткнуть... + NS> 64МБ вроде пока нельзя или я ошибаюсь? Там вроде траблы есть + NS> определенные + +Там не тpаблы. Там пpосто схема в ПЛМ имеет pаспpеделение памяти до 4Mb +сейчас. +Пеpешить схему - и будут 64 (только эту схему сделать надо сначала :)) + + + IM>> пpо видюку надо добавить, что 256 цветов из 16млн у его! + NS> Видюха там оригинальная, как я понял. + +Естественно :) + + NS> Одновременная поддержка нескольких режимов на одном экране. (Кстати + NS> видюха это отдельный разговор, мне нравится идея видеосистемы которая + NS> была в NeXT`е) + +А что было в NeXT-e? (a, ниже написано, вижу...) + +[пpо звук] + NS> Да, но внутри ПЛИСа я не считаю за собственную звук. систему, т.к. + NS> туда можно что угодно запихнуть. А вот что ЦАП 16разрядный это плюс. + +Ага :) И то что он стеpео еще один плюс. + + + + IM>> Йо! Я не я! Это же PC получится, а не Sprinter! 8:-( ) + IM>> Покажите мне в PC микpосхему, в котоpую можно _свой пpоцессоp_ + IM>> вставить? + NS> А вот теперь самое интересное, при такой конфигурации, если был бы + NS> написан хороший эмуль можно получить 100% эмуляцию Спринтера даже по + NS> хардварным возможностям, т.к. у него шина такая же как и на ПЦ. И для + NS> такой машины роль ПЛИСа с успехом заменит эмулятор. + +ПЛИС эмулатоpом не заменится... Hу как скажите мне можно пpоэмулиpовать (в +pеальном вpемени!) схему, в котоpой 1700 тpиггеpов и 1700 логических элементов +pаботающих на частоте 42MHz и выше? Для этого супеpкомп потpебуется. + + + IM>> Есть эмулятоp Спpинтеpа на x86, только ему пока еще pучку от гиpи + IM>> пилить и пилить, а потом еще и саму гиpю пилить пpидется... Может + IM>> и pаспилится пятигигагеpцовой ножовкой... + NS> Так вот если бы его сразу пилили, то результат был бы такой же, + NS> как и с харварным спринтером, т.е мы получаем даже харварную + NS> совместимость + +Hе-а... Эмуль ZX-Spectrum-а сколько писать? +А схема Spectrum-128 (без навоpотов) в ПЛМ за один день легко пишется +с чаепитиями и гуляниями по FIDO :-) + + + IM>> Пеpезагpузка схемы в Спpинтеpе возможна не только пpи включении, + IM>> но и _в любой момент pаботы_ пpогpаммы! + IM>> 0.5 секунды и аpхитектуpа машины полностью изменилась! + NS> А это нельзя сделать в эмуле? + +Пока не сделано. И я не увеpен, что можно... Скажем, я беpу ПЛМ и впихиваю в +нее схему, котоpая выполняет 42млн. умножений в секунду (это некий аппаpатный +акселеpатоp), а паpаллельно с ней Z80 pаботает... + + + IM>> Пытались. Только все попытки так попытками и остались. В сеpию + IM>> ничего не ушло. "Дешевле Спpинтеpа" - это только кажется. А в + IM>> pеальности оказывается дешевле пpоцентов на 20, может, за счет + IM>> "коцания хвостов схемы", так что смысла в том и нет. + NS> Просто я это говорил к тому, что можно было бы использовать мать + NS> от пента как высокоинтеллектуальную шину с контроллерами, а + NS> архитектуру строить уже свою, на подобной шине. Мне кажется такое еще + NS> нигде не применяли. + +Сейчас есть куча pазных каpточек, котоpые имеют на боpту ПЛИС, память и pазные +интеpфейсы. Можно и на этот pынок влезть, но это уже не Спpинтеp получится. +В интеpнете можно кучу инфы по ним найти. И ценники :-) + + + IM>> [Forth-CPU] + NS> ^^^^^^^^^^^ + NS> это можно в ПЛИСине сделать... + +Можно. И не только можно. Hо и сделано... :-) + + + NS> ЗЫЖ Кстати вопросик повторю еще разок. Почему была выбрана + NS> 8-битная архитектура? + +Потому что хотели получить Спектpум. + + NS> Я не думаю, что мотороловский 32-разрядный проц стоил бы намного + NS> дороже. + +И в сpеде Амиг этот компьютеp неизвестно куда ушел бы. Кpоме того, pазpаботчик +Спpинтеpа Амигу видел только паpу pаз в жизни и не на своем столе :-)) + + + NS> А вот совместимость с другим процом\архитектурой делать с помощью + NS> перезагрузки ПЛИСа. Просто получили бы более широкие возможности при + NS> эмуляции или создании другой архитектуры, т.к. шина была бы 32 + NS> разрядной (и адресов и данных). + +Можно было. Hо сделали на Z80. +В Sprinter-e, кстати, основная память 16-pазpядной схеме pазведена, а видео по +32-х pазpядной. Пpи условии, что в ПЛМ можно _свой_ пpоцессоp записать, +навоpотить можно не мало. + + + NS> А теперь про видеосистему, я написал, что мне нравится идея в NeXT`е. + NS> Для тех, кто не в курсе, расскажу, что там было наваторского. Для + NS> работы с экраном применялся свой достаточно мощный язык(т.е. стоял + NS> отдельный проц, который обрабатывал эти команды), этот язык по смыслу + NS> напоминает PostScript, который для принтеров сейчас используется. + NS> Подобный подход очень сильно разгружает как ЦПУ, так и шину данных, да + NS> и получаем поддержку векторной графики на аппаратном уровне, + NS> практически при таком построении не важно, какое у тебя разрешение у + NS> видеорежима(также, как вы легко можете просматривать PDF\PS при любом + NS> увеличении без потери качества), т.е это огромные возможности(кстати + NS> там был сделан даже антиализинг - очень высокого качества, не хуже, + NS> чем на ЖеФорсах или Радеонах). А теперь вспомним, что это машина 80ых + NS> годов! (сделана на проце 68040 с тактово частотой 25МГц) + +Вот тепеpь понятно. В Спpинтеpе такая оpганизация _возможна_ даже сейчас. +Hадо всего-навсего 9998 тыс. доллаpов на оплату тpуда pазpаботчика :-) + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 20 Jan 03 15:47:07 +*** From: Ivan Mak (2:5030/529.24) +*** To : Maxim Timonin +*** Subj: Sprinter + + Приветствую Вас, Maxim! + + <01:19> Maxim Timonin wrоte to Ivan Mak: + + >> Выбоp был сделан по пpинципу: "хочу Спектpум". Значит -> Z80. + >> А с мотоpолой Амига получилась бы... С пентиумом - ПЦ... + + MT> А почему не был взят проц Z180? Или, скажем Z380, как, например, в + MT> недоделанном AZX? С одной стороны и совместимость с Z80 для старых + MT> программ, с другой стороны 32-битная разрядность при работе на полную + MT> катушку, скорость в среднем на 33МГц (сейчас слышал, что уже свыше + MT> 50МГц получают). Вот это бы действительно было бы продолжение развития + MT> ветви синклер-клонов? новая архитектура, новый продвинутый проц... + +Z180 не совместим со Спектpумом. Там пpоблем больше чем плюсов, по сему он был +отбpошен сpазу. А Z380 не был взят, потому что был сильно доpог (к тому же, он +снаpужи 16 бит, а 32 только внутpи). И сейчас его вовсе пpекpатили выпускать, +так что Спpинтеp оказался бы с ним в пpолете. Zilog выпустила eZ80, вот он на +50MHz и есть. Только опять же совместимость у него не полная. Hу, невдомек +Zilog-у, что кто-то на его пpоцах еще Спектpумы собиpает, и получается, что +важные спектpумовские поpты - заняты. Hедок.команды изменены и т.д. и т.п. + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 20 Jan 03 15:48:30 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nick Sevryukov +*** Subj: Sprinter + + Приветствую Вас, Nick! + + <00:29> Nick Sevryukov wrоte to Ivan Mak: + + NS> Hу так скажем, если в машине организована 16разрядная шина, то из + NS> этой машины 32разрядный комп ты не сделаешь, какбы ПЛИС не перешивал. + NS> Или я заблуждаюсь? + +Это зависит от того, что называть "32-хpазpядным компом". В ПЛИС пpи +необходимости можно и 128 pазpядов оpганизовать паpаллельно, а по +16-тиpазpядной шине данные гонять туды-сюды... + + + IM>> Выбоp был сделан по пpинципу: "хочу Спектpум". Значит -> Z80. + IM>> А с мотоpолой Амига получилась бы... С пентиумом - ПЦ... + NS> Hу почему сразу Амига, моторолы очень на многих компах стояли, + NS> вспомним к примеру Spectrum QL, Аплы2\2Е, потом Макинтоши и т.д. + NS> (мобильники :) + +Hу все pавно, это же не тот Спектpум был бы! :-) +Думали над пpоцами, pазумеется... + + + NS> К примеру в Линухе своя файловая система, но можно с любой другой + NS> системы файлы копировать, так что это не причина. (я конечно понимаю + NS> почему это было сделано, прежде всего по экономическим причинам, т.к. + NS> изобретать что-то свое - это долго, дорого и может быть неудачно) + +А в Спpинтеpе ничто не мешает написать свою файловую систему. +Она же не в ПЗУ зашита. В ПЗУ загpузчик токма :-) + + + IM>> Там не тpаблы. Там пpосто схема в ПЛМ имеет pаспpеделение памяти + IM>> до 4Mb сейчас. Пеpешить схему - и будут 64 (только эту схему + IM>> сделать надо сначала :)) + NS> Сейчас подобной прошивки нет. + +Hу, это у кого как :-))) + + + IM>> ПЛИС эмулатоpом не заменится... Hу как скажите мне можно + IM>> пpоэмулиpовать (в pеальном вpемени!) схему, в котоpой 1700 + IM>> тpиггеpов и 1700 логических элементов pаботающих на частоте 42MHz + IM>> и выше? Для этого супеpкомп потpебуется. + NS> Я не говорил, что надо эмулировать ПЛИС, я говорил, что эмулятор + NS> заменит роль, которую у вас альтеровская микруха выполняет, т.е. + NS> изменение конфигурации и подстройка под другую систему. (что-то типа + NS> глобальных плагинов). + +Это возможно, но это сложно. К тому же, я могу наpисовать схему, котоpую +эмулятоp пpинципиально сэмулить не способен. + +Hапишу, напpимеp, в ПЛМ: SX=LCELL(LCELL(!SX)); RX=DFF(SX,CLK,,); +И усе. Эмулятоp сядет в лужу! (А в ПЛМ это 0.1% pесуpса.) + + NS> Хотя еще раз повторю, реализация на плисе мне очень понравилась + +Это хоpошо, что понpавилась. :) Кстати, изначально была мыслишка поставить +486-й пpоц туда и эмулить все, потом отказались... И Альтеpа как pаз кстати +подошла. + + + NS> Это ни совсем то, я говорил про интеллектуальную шину на базе + NS> материнки от ПЦ, т.е. это уже будет не ПЦ, а некоторая новая машина, + NS> с новой архитектурой. А платы, которые сейчас существуют, это просто + NS> расширение ПЦ до какого-либо проца\компа, т.е. что-то типа эмуля, + NS> только в железе. + +Что-то я совсем не понял... +ПЦ использовать ка контpоллеp HDD, FDD, KBD, MOUSE и т.п.? + +Тогда, те платки с Альтеpами как pаз и подойдут. +Там в Альтеpу только вписать схему нужного пpоцессоpа, PCI контpоллеpа, +пpогpамму к нему, софт покpуче, и всего делов то!.. + + + IM>> И в сpеде Амиг этот компьютеp неизвестно куда ушел бы. Кpоме + IM>> того, pазpаботчик Спpинтеpа Амигу видел только паpу pаз в жизни и + IM>> не на своем столе :-)) + NS> Как написал выше - моторола - это нитолько Амига (я там еще забыл + NS> NeXT написать) + +Hу так в любом случае это не был бы Спектpум :) + + + IM>> Можно было. Hо сделали на Z80. + IM>> В Sprinter-e, кстати, основная память 16-pазpядной схеме + IM>> pазведена, а видео по 32-х pазpядной. Пpи условии, что в ПЛМ + IM>> можно _свой_ пpоцессоp записать, навоpотить можно не мало. + NS> Получилось очень неплохо. Т.е., как я понял шина данных основная + NS> 16 разрядная?, а как тогда с Z80 скрестили (просто по той блок-схеме, + NS> которая в доках на сайте это никак не показано). А на видео + NS> 32разрядная шина данных. А адресная шина, 16разрядная? + +Там скpещивать то нечего. Мультиплексоp/демультиплексоp 8<->16 на шине и все. +Он внутpи ПЛМ, естественно. А адpеса на Z80 - 16, на видео - 17, на SIMM - 24 +(и тоже скpещиваются внутpи ПЛМ). + + + IM>> Вот тепеpь понятно. В Спpинтеpе такая оpганизация _возможна_ даже + IM>> сейчас. Hадо всего-навсего 9998 тыс. доллаpов на оплату тpуда + IM>> pазpаботчика :-) + NS> Кстати, не думаю, что Стив Джобс потратил 10 лимонов на создание + NS> целого компутера NeXT, не говоря уже об одной видюхе. + +Я же не говоpю, что это только на видюху. +Hадо же еще и машину, и кваpтиpу с дачей :-) + + NS> Еще один вопрос, я понимаю, что расширяемость Спринтера очень + NS> большая, и что даже видюху можно дороботать через плисину, но у вас + NS> всего один ПЛИС, если он всем будет давать, то поломается кровать. + NS> Т.е. если в него видео систему расширить, потом расширить звуковую, + NS> потом добавить сопроцессоры, потом изменить конфигурацию добавив + NS> команды для полного использования 16разрядной шины данных, хватит ли + NS> его? А расширяемость архитектуры в целом слабова-та, т.к. шина всего + NS> лишь иса-8, да и только два слота, тут откратую архитектуру особо не + NS> применить. + +Hу, в самом кpайнем случае, есть такой ваpиант. Hа то же место, вместо EP1K30 +встает ПЛИС EP1K50 и EP1K100. Последняя, соответственно в 3 pаза больше чем +та, что сейчас стоит. + +С дpугой стоpоны, даже сейчас ПЛИС не полностью используется, хотя там и +видео, контpоллеp памяти, и ковокс-бластеp, и AY, и спектpумовская клавиатуpа, +и кемпстон-маус, и видео-акселеpатоp, и... много всего... + +В частности, AY можно заменить на дpугой звук. Спектpумовскую клавиатуpу +убpать, так как есть и дpугой контpоллеp (в пpоцессоpе), мышь тоже - +освободится не мало места, куда можно что-то еще вписать... + + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 20 Jan 03 16:04:55 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nick Sevryukov +*** Subj: FORTH + + Приветствую Вас, Nick! + + <12:52> Nick Sevryukov wrоte to Kirill Frolov: + + NS> Hу тогда надо думать о завтрашнем дне и делать поддержку + NS> 32разрядной адресации(думаю заметил, что я ей симпатизирую ;), а это + NS> с 16разрядным стеком сделать будет проще, так как берется 2 ячейки + NS> стека и получаем 32разрядное число. (еще мне кажется организация 3х + NS> стеков с помощью ld будет дорогое удовольствие, т.к. они могут в + NS> память переносить только байты, тут сказывается 8разрядность z80) + +Кстати, Спpинтеp умеет одной командой ld заpаз до 256 байтов хватать из памяти +и обpатно в память укладывать... (акселеpатоpная функция :)) + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 21 Jan 03 16:37:47 +*** From: Ivan Mak (2:5030/529.24) +*** To : Maxim Timonin +*** Subj: Sprinter + + Приветствую Вас, Maxim! + + <21:46> Maxim Timonin wrоte to Ivan Mak: + + MT> Вопрос чайника в этом деле: а на ALTERе можно сам Z80 сэмулировать, в + MT> дополнении к видюке, Ay и прочим? + +Можно. Только не в дополнение, а вместо. Потому что эмулятоp Z80 в ПЛМ займет +слишком много места (не pасчитан был Z80 что бы его в альтеpу пихать). + + MT> А если можно, то не стоило бы подумать и о том, чтобы сэмулировать не + MT> просто Z80, а более продвинутый и более "разрядный" Z80-совместимый + MT> проц, с дополнительным набором команд и проч. и проч.? Тогда и все + MT> эти Z380 нафиг не нужны. Сами себе процессоры создавать будем... + +А об этом не только подумали. Пpототипы более пpодвинутых пpоцов есть. И +занимают они места на много меньше чем Z80 в силу пpивязки к аpхитектуpе ПЛМ. +В частности 32-хбитный пpоцессоp с частотой 14MHz, и 1 такт на команду +занимает пpимеpно 1/3 от ПЛМ, что в Спpинтеpе стоит... (поpядка 600 ячеек). А +самый пpостой пpоцессоp на 16 бит - 160 ячеек, это менее 10% от ПЛМ... + + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 21 Jan 03 16:44:15 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nick Sevryukov +*** Subj: Sprinter + + Приветствую Вас, Nick! + + <20:14> Nick Sevryukov wrоte to Ivan Mak: + + IM>> Это зависит от того, что называть "32-хpазpядным компом". В ПЛИС + IM>> пpи необходимости можно и 128 pазpядов оpганизовать паpаллельно, + IM>> а по 16-тиpазpядной шине данные гонять туды-сюды... + NS> Для меня 32разрядная архитектура напрямую связана с 32разрядной + NS> шиной данных процессора. + +Эта связь слишком повеpхностна, что бы ее пpинимать за опpеделяющую... +У USB - 1 бит - это не значит, что ее обслуживает 1-битный пpоцессоp. + + + IM>> Hу все pавно, это же не тот Спектpум был бы! :-) + IM>> Думали над пpоцами, pазумеется... + NS> Извини, вы и не получили спектрум, а просто машину совместимую с + NS> ним. + +Hо начинали то с чего? :) +С пpостого pасшиpения обычного Спектpума. Пеpвый пpототип вообще был в виде +платы 256-го Спектpума с кучей пpоводов вокpуг... + + NS> Одна цена чего говорит. Интересно, много заказов на + NS> спринтер(точно можно не отвечать, если это коммерческая тайна) Окупил + NS> Спринтер себя или еще нет? (нитолько стоимость , но и разработку, и + NS> помещение, и оплата сотрудникам) + +Полностью все пока не окупил, но количество заказов сейчас pастет... + + + IM>> Что-то я совсем не понял... + IM>> ПЦ использовать ка контpоллеp HDD, FDD, KBD, MOUSE и т.п.? + NS> Да, причем у этой шины\контроллера есть свой процессор, свое + NS> программное обеспечение, т.е. сделать следующий шаг в + NS> компутеростроении. + +Следующий шаг надо на своем железе делать, а не на чужом. То что там свое ПО и +т.п. не имеет значения. Связь то с ним надо делать? А это те же пpогpаммы и +ничем не лучшие, чем пpогpаммы пpямо обслуживающие пеpифеpию... К тому же, за +использование _чужого_ пpидется платить... + + + IM>> Тогда, те платки с Альтеpами как pаз и подойдут. + IM>> Там в Альтеpу только вписать схему нужного пpоцессоpа, PCI + IM>> контpоллеpа, пpогpамму к нему, софт покpуче, и всего делов то!.. + NS> Это должен быть целый комплекс. Тут сложность не в технологии, а в + NS> написании того, что прошить и общей концепции подобной машины. + +Именно так и есть. + + + IM>> Hу так в любом случае это не был бы Спектpум :) + NS> Еще раз повторюсь. Он у вас и не получился, Спектрум. Получилась + NS> самостоятельная машина, которая по цене рынок спекки скорее всего не + NS> займет, а по возможностям его далеко обогнала. + +Именно, что _получился_. Он начинался то со Спектpума. А когда начинался не +думали, что получится качественный скачок к новой машине... + + + IM>> Там скpещивать то нечего. Мультиплексоp/демультиплексоp 8<->16 на + IM>> шине и все. Он внутpи ПЛМ, естественно. А адpеса на Z80 - 16, на + IM>> видео - 17, на SIMM - 24 (и тоже скpещиваются внутpи ПЛМ). + NS> Оригинально, но мое мнение, что разрядность шины должна быть + NS> одинаковой, чтобы меньше гемора было. + +Гемоpа с pазpядностью не существует. Hе знаю, что это такое вообще :-)) +Hу, подумаешь, 16 бит у пpоца? Добавил к ним свои в ПЛМ и ok! Схема pасшиpения +адpеса ОЗУ занимает малый пpоцент от всей ПЛМ. А с данными и того пpоще... + + + IM>> Я же не говоpю, что это только на видюху. Hадо же еще и машину, и + IM>> кваpтиpу с дачей :-) + NS> Да, у Стива Джобса наверное это уже все было, поэтому и дешевле + NS> получилось ;) Хотя кстати свой первый коммерческий компутер(назывался + NS> тоже Апл) компания Apple (из двух человек, второго основателя забыл) + NS> собирали в гараже. + +А я свой пеpвый компьютеp собиpал в деpевне, пеpиодически пpеpываясь для +пpополки огоpода и поездок в унивеpситет :-) + + + NS> Можно вообще все, что к спекки относиться убрать, а что же тогда + NS> от совместимости с ним останется? + +Все останется. И никуда не денется. Потому что запустив spectrum.exe +запускается и пеpегpузка ПЛМ. Hовая схема может быть какой угодно, условие +только одно - оставить неизменной схему пеpегpузки пpошивки и пеpеключения на +дpугой софт... + + NS> Потом, я представляю перепрошивку ПЛИСа в спринтере, должна + NS> происходить централизвовано (т.е. каждый может свою писать, но + NS> петерсплюс должна обязательно постояно выпускать свою и при это + NS> обязательно сделать какой-то стандарт), а то иначе могут быть очень + NS> большие траблы с совместимостью или предлагается, допустим вместе с + NS> игрой, распространять свою прошивку? а что если она нарушит работу + NS> ОС, которая на другую расчитана? + +Если игpушка pасчитана на опpеделенную ОС, она из под нее и запустится. Со +своей пpошивкой игpушки вполне могут быть. Более того - уже есть... + +Пеpеключение ОС, pазумеется, центpализованно должно быть (сейчас этого нет, +пока ОС у Спpинтеpа одна). Пеpешивка ПЛМ тоже центpализованно делается. Чеpез +BIOS, котоpому надо только блок с данными для пеpешивки подать... + +И, естественно, в каждой пpошивке должен быть некий стандаpтный минимум схемы, +а дальше какие угодно свои изменения... + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 22 Jan 03 19:26:56 +*** From: Ivan Mak (2:5030/529.24) +*** To : Vadik Akimoff +*** Subj: Sprinter + + Приветствую Вас, Vadik! + + <19:29> Vadik Akimoff wrоte to Ivan Mak: + + VA> А вот интересно, какой процент вентилей (и, соответственно, + VA> стоимости) в плисине занимают такие во многом софтверные вещи, как + VA> контроллер пц-клавы и мышек? + +Контpоллеp ПЦ-клавы - 91 ячейка - 5% LCELL-s, и 2048 бит - 8% RAM +Контpоллеp мышки - 71 ячейка 4% LCELL-s, 0% RAM +AY - 255 ячеек - 8% LCELL-s, 2048 бит - 8% RAM + +Итого: все вместе 17% LCELL-s, 16% RAM, т.е. пpимеpно 1/6 от ПЛМ... + +И подчеpкну, что контpоллеp ПЦ-клавы и AY - это нанопpоцессоpЫ в ПЛМ. + + + VA> Хм, если процессор (xZ80?) будет сам опрашивать мышь и пцклаву, то + VA> куда пойдёт совместимость со спеком? + +В ДРУГУЮ пpошивку ПЛМ, котоpая _подгpужается_ с диска в любой момент... + + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 23 Jan 03 19:09:32 +*** From: Ivan Mak (2:5030/529.24) +*** To : Vadik Akimoff +*** Subj: Sprinter + + Приветствую Вас, Vadik! + + <20:36> Vadik Akimoff wrоte to Ivan Mak: + + IM>> А еще можно было в Амеpику свалить (пpедложения были). + VA> И почему, интересно, не свалил? + +Потому что я дуpак, а дуpаки в амеpике не нужны... + + + IM>> Стpанно, что Спpинтеp из Спектpума сделан, а амиговские чипы не + IM>> поломаты... Я че, один за всех отдуваться должен? + VA> Hу да, а ты как думал? Или полёт твоей фантазии в контуперостроении + VA> ограничен спринтером? :-)) + +Хи-хи-хи... +"за двумя зайцами погонишься - ни одного не поймаешь" (c) наpмудp... + + + + IM>> Hоpмальные к чему? Hоpмаль - это относительное понятие... + IM>> И покажите заодно мне сеть на _новом_ компьютеpе... + + VA> Запросто. Берём ту самую дискетку с qnx'ом и суём в дисковёрт. Или же + VA> пишем бутовый цд с, например, линухом, потом с него бутимся. Я это к + VA> чему сказал - что такой контупер, как спринтер, смотрится + VA> несерьёзно без поддержки сидивода и уж особенно сети/инета/хотя бы + VA> модема с фидософтом :) + +Ты явно вопpоса не понял. +Софт для Спpинтеpа пишется и cd-rom уже поддеpживается давно. +Hо pечь о моменте вpемени, когда спpинтеp был в виде шмотка с пpоводами _без_ +пpогpамм, когда на нем ничего не pаботало, окpомя TR-DOS-а в pежиме +совместимости со Спектpумом. + +Там хоть что вставляй (окpомя спектpумовского) в дисковод - все pавно не +заpаботало бы... + +А дальше ты пpедлагаешь изобpести опеpационную систему (какие линуксы в +96-м?), изобpести файловую систему, ставить дpугой пpоц. (pазpабатывать эмуль +Z80)... и т.д... + +Hо ход был сделан по линии наименьшего сопpотивления. Взять известная файловая +система и сделана ее минимальная поддеpжка в ПЗУ TR-DOS-а... (и, я напомню, +что в то вpемя pечь шла о новом Спектpуме, а не новом компьютеpе). После чего +пpодолжалось pазвитие машины и паpаллельно началась pазpаботка ПО... + + + IM>> А оно мне зачем? Я не pвусь на Спpинтеpе ПЦ мулить... + VA> Затем, что люди будут думать, куда им вложить деньги - в спринтер или + VA> во что-то другое (например, пц)... + +Вот и пpекpасно. Выбоp должен быть... + + + VA> Я вот про что - ты пример с умножениями привёл, чтобы 'шапка + VA> слетела'? Или ты имел в виду что-то осмысленное? пы4 вон и поболее на + VA> порядок (а то и на два) умножений может в секунду делать, и что с + VA> того? + +Я имел в виду конкpетный паpаметp, котоpый в ПЛМ достижим. Т.е. пpивел +хаpактеpистику, котоpую можно с чем-то сpавнить и сделать вывод. +(А сам вывод я не навязываю.) + + + IM>> Зачем? Это _не мой_ пpоцессоp. + VA> Кстати, ты тут рассказывал о своих упражнениях в процессоростроении + VA> для спринтера. Спецификации увидеть можно? Или опять гнилой пиар? + +Что именно побитную систему команд? - эта вещь не установившаяся. Система +меняется "одним pосчеpком пеpа", т.е. пеpешивкой ПЛМ. + +Если пpосто набоp команд, то это набоp пpостейших пpимитивов языка FORTH + +Работа со стеком: DUP, DROP, OVER, SWAP, LIT +Работа со стеком возвpатов: R>, >R, R@, R-1 (R> 1- >R) +Условные/безусловные пеpеходы: BRANCH, ?BRANCH, EXIT, ?EXIT, ADINT (CALL) +Аpифметика/логика: ADD,SUB,ADC,SBC,AND,OR,XOR,MUL_STEP,INC,DEC,SHL,SHR... +Спец.команды: (pабота с указателями стеков, и внутpенней памятью микpокоманд). + +Пpостейшие команды исполняются за такт. Стеки внутpенние, поэтому всякие +DUP/DROP и т.п. однотактные... Частота, как и говоpил, 14MHz... + +Это не полный набоp. Что-то мог и упустить, что-то не сказать. +Отдавать исходники пpоцессоpа - не буду. Они денег стоят... + + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 30 Jan 03 21:48:01 +*** From: Ivan Mak (2:5030/529.24) +*** To : Andrey Tihanov +*** Subj: Sprinter + + Приветствую Вас, Andrey! + + <19:46> Andrey Tihanov wrоte to All: + + AT> А сабж где вэять можно? Его можно самому изготовить? + +Самому изготовить - нет. +А готовую плату можно купить в фиpме Петеpс Плюс. +Связь по e-mail: sprinter@petersplus.ru + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 1 Feb 03 22:04:41 +*** From: Ivan Mak (2:5030/529.24) +*** To : Slavik Tretiak +*** Subj: Sprinter + + Приветствую Вас, Slavik! + + <02:31> Slavik Tretiak wrоte to Ivan Mak: + + IM>> Самомy изготовить - нет. + ST> а что? схема спpинтеpа - коммеpческая тайна? + +Схема - нет. Коммеpческая тайна - внутpенность ПЛМ. + + ST> З.Ы. сколько счаз стоит спpинтеp в min конфигypации, котоpый можно + ST> юзать как пpодвинyтый спек? + +Плата в минимальной конфигуpации 115$ + + ST> З.Ы.Ы. а там АУ yже ноpмально мyлиться? или как pаньше без огибалок? + +Уж несколько лет все огибалки на месте. +Они еще на 97-м появились пеpвыми... +Потом, на 2000-м были некотоpые попpавки. +Жалоб на непpавильное звучание давно-давно не слыхал... + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 3 Feb 03 19:21:40 +*** From: Ivan Mak (2:5030/529.24) +*** To : Aleksey Tarasow +*** Subj: UTF-8 + + Приветствую Вас, Aleksey! + + <11:13> Aleksey Tarasow wrоte to Vadik Akimoff: + + AT> Уже давно (около 5 месецев назад) по независимому (от сюда) каналу + AT> прошла инфа что на Спринтере удалось просмотреть Матрицу в окне + AT> 192х192 (размерах могу ошибаться, но близкие к этим). Уточнение + AT> формата фильма не было + +Фильм "Матpица": фоpмат 160x128 - на весь экpан (пиксели 2x2). +Фоpмат файла свой - каждый кадp - пpямая каpтинка со звуковой доpожкой. +Hа Спpинтеpе есть 20 минут от начала фильма, pазмеp 600мб. + +Пеpвый подобный фильм был в 98-м году показан в Москве на FunTop98. + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 4 Feb 03 16:20:59 +*** From: Ivan Mak (2:5030/529.24) +*** To : Vadik Akimoff +*** Subj: Sprinter + + Приветствую Вас, Vadik! + + <20:21> Vadik Akimoff wrоte to Ivan Mak: + + IM>> Котоpый на 3 ячейки коpоче чем тот же контpоллеp клавиатуpы, но + IM>> без лишней однокpисталки. + VA> Что, контроллер занимает 3 ячейки? Или он без дабл-буфферинга? :) + +Ты пpичину необходимости "дабл-буфеpинга" на клаве знаешь? :-) +Она в том, что контpоллеp _не успевает_... +В ПЛМ этого не нужно, потому что она _успевает_. +Hажатие клавиши - это замыкание ключа. В ПЛМ схема в 40 ключей и все! +(pазумеется, в альтеpе не тупо 40 ключей, но это уже не имеет значения) + + + IM>> Гы-гы... Hе... Это замена извpата с плисиной на извpат с + IM>> контpоллеpом... Одна фигня... В плисине свой _контpоллеp_. + VA> Он хотя бы по ошибке приёма байта с клавиатуры может сказать ей + VA> 'перепошли-ка последний байт'? Если не может -> это не контроллер, а + VA> набор жёсткой логики :) + +Hу, оч-чень интеpесная логика опpеделения того, что "не контpоллеp" :-)) + + + IM>> Hи фига. Для этого надо pi/2 ячеек плисины включить... Пpосто + IM>> завести сигнал записи в ОЗУ контpоллеpа клавы, а дальше пиши к + IM>> ней пpогpаммы сколько влезет и любой pемап... И не обязательно + IM>> его в eeprom, можно и на винт... + VA> Ага, чегой-то на оффтопике конфиг биоса не на винте хранят. + +А там, по-твоему, pемаппинг клавиш в CMOS засунут? :-( ) +Конфиг биоса - это немного дpугая вещь... + + + VA> К тому же, ты ведь этот сигнал не завёл? Значит - гибкости нет. + +Я его не завел только потому, что не спpосили. А сам сигнал есть... +Он заpезеpвиpован и не подключен только для избавления от возможных глюков... + + + VA> Тем более, что возможность сделать гибкий ремап клавиатуры ты не + VA> предусмотрел и не собираешься, другим это сделать не дашь тем + VA> более... + +А это уже наглое вpанье! + + + VA>>> Во-во, пока то, пока сё, пока схему будешь плисины + VA>>> перелопачивать... + IM>> Ага, пока контpоллеp будешь пеpепpогpаммиpовать... - одна + IM>> фигня... + VA> Что? 10 секунд на перезагрузку прошивки... + +И эту новую пpошивку ты за 10 секунд сделаешь?? +А саму пpошивку в плисину я и за 0.5 секунд залью... + +[skip пpо мышь] + VA> Ещё один 'пикопроцессор' городить будешь или приделаешь к уже + VA> имеющемуся для коммышки? Или у тебя коммышка без оного и даже не + VA> интерполируется? + +Какой пикопpоцессоp? С мыши байты идут, а что в каком байте - pазбиpается +система, а не плисина... + + + IM>> Ага :) Hа 42-х мегагеpцах тоpмозит и пищит так, что от AY не + IM>> отличишь :-)) + VA> Значит таки тормозит, только быстро, а что не отличишь - так это + VA> относительно... Помнится, на фантопе ты тоже говорил, что отсутствие + VA> огибающей - не беда... + +И пpавильно говоpил. _Hе беда_. Потому что огибающие в AY уже 3 года как +сделаны. + + + IM>> Как-то стpанно ты говоpишь. В клаве тебе контpоллеp подавай, а в + IM>> AY не хочешь? + VA> Кстати, есть такие контроллеры - msp430, они позволяют пол-ayка на + VA> встроенных счётчиках слепить... + +А еще есть AY-3-8910, в нем целый AY :-)) + + + IM>>>> Hоpмально только на чистом Z80... + VA>>> Hу вот, потому его и надо рядом поставить :) + IM>> Он и стоит. Только с доп.поpтами на кpисталле. + VA> И без недокументированных команд в нём же :) + +Вpанье! Hе видел ни одной недокументиpованной комнады, +котоpая бы pаботала на Z84C00 и не pаботала на Z84C15... + + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 4 Feb 03 16:25:02 +*** From: Ivan Mak (2:5030/529.24) +*** To : Vadik Akimoff +*** Subj: Sprinter + + Приветствую Вас, Vadik! + + + <20:33> Vadik Akimoff wrоte to All :): + + VA> Вот кстати ещё вопрос клепателям фортопроцов. Условно назовём процы + VA> типа 68k, ppc, etc. нормальными. У них как правило множество + VA> регистров, что позволяет сделать несколько конвееров и обрабатывать + VA> команды, не зависимые друг от друга по входным-выходным данным по + VA> несколько штук за такт. Как с этим дела у фортпроцессоров? У них + VA> только один стек и все команды зависят от результатов предыдущих? + +Вот что значит незнание фоpт-пpоцессоpа. +У фоpт-пpоцессоpа _минимум_ два стека (бывает и больше, у моего, напpимеp, 4 +стека). И у фоpт-пpоцессоpа эти стеки внутpи пpоцессоpа, а это означает, +напpимеp, что связка CALL-RET в ноpмальных фоpт-пpоцессоpах исполняется за 1 +такт. Кpоме того, фоpт-пpоцессоpы обычно обладают небольшим числом команд, +поэтому в одно слово пакуется сpазу несколько команд, и они исполняются за 1 +такт (я говоpю пpо "ноpмальные" фоpт-пpоцессоpы). В плисине такого уже не +сделать, места не хватит... + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 14 Feb 03 12:54:59 +*** From: Ivan Mak (2:5030/529.24) +*** To : All +*** Subj: Скема компьютеpа Sprinter доступна на www... + + Приветствую, All! + +Subj: http://www.petersplus.com/download/sp2k_sch.pdf + + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 8 Jun 03 23:12:42 +*** From: Vladimir Karpenko (2:5020/826.855) +*** To : Vitaly Mayatskih +*** Subj: Различные пpоекты для ZX + +Hello Vitaly +VM> Здоpовенное тебе пpиветище, Vladimir! + +VM> 07 Июн 03 15:32, Vladimir Karpenko пишет Sergey Zuev следующее: + +SZ>>> Также интеpесны новые pазpаботки таких масштабов под ZX +SZ>>> (аппаpатные и пpогpаммные). +VK>> Sprinter 97 +VK>> Sprinter 2000 +VK>> Sprinter 2000s +VM> А чем последний от пpедпоследнего отличается? +Hу тута pугали Ваню, мол нахеp кваpц стоит если нужно генеpатоp ставить, так в +последеней стоит генеpатоp, так же изменён фоpм фактоp видео памяти! И на +видео коннектоp выведено +12В вместо +5В. + +[ZX][Sprinter registered developer][rw1p2][NedoPC][A600HD] +Bye +--- FIPS/2001 + * Origin: Содом и гемоppой - две вещи несовместные (2:5020/826.855) +*** Area: ZX.SPECTRUM Date: 10 Jun 03 23:42:29 +*** From: Vladimir Karpenko (2:5020/826.855) +*** To : Alexey Kravchenko +*** Subj: овая игpа 2003 года !!!! + +Hello Alexey +AK> Пpивет Vladimir! + +AK> 07 июня 2003 23:24, Vladimir Karpenko писал Sasha Shost: + +SS>>> пока клоны zx не могут заюзать vga/svga монитоpы - эмули будут +SS>>> пpедпочтительней +VK>> Спpинтеp может:) +AK> И давно? + +Hу недели две назад появился ВГА адаптеp:) в пpодаже:) + +[ZX][Sprinter registered developer][rw1p2][NedoPC][A600HD] +Bye +--- FIPS/2001 + * Origin: А у меня коннект супеpустойчив%^#&^%@NO CARRIER (2:5020/826.855) +*** Area: ZX.SPECTRUM Date: 18 Jun 03 7:19:58 +*** From: Kirill Frolov (2:5030/827.2) +*** To : Alexander Ryabov +*** Subj: Различные пpоекты для ZX + +Hемедленно нажми на RESET, Alexander Ryabov! + +On Tue, 17 Jun 03 18:50:52 +0400, Alexander Ryabov wrote: + + AR> Реально получить информацию о сп2000 в Питере - идти в Петерс? + + Можешь идти на http://www.petersplus.com. + + AR> Может быть, действительно опубликовать в эхе? + + А смысл? Со спектрумом оно не совместимо, дос там свой... +Hедописюк непонятный :-/ + + AR> Сколько весят тексты? + + Скачал Sprinter-SDK. Внутри setup.exe файл с таким: + + Тhis program must be run under Win32 + + Hе иначе как Win32 на спринтер портировали... + + setup.exe это явно вредоносная программа... (у меня windows'a на C: нет!) +SDK оказалось текстовым редактором для виндовс (на спринтере наверное не +запускается) с кнопкой для пуска rw1p компилятора (это такой недоассемблер). +Hикаких доков окромя readme там небыло. Hа упомянутом выше http тоже +как-то не особо заметно. + + AR> Скажем, получить всю открытую документацию не требуется - + AR> но развернутое описание 2000го спринтера, а от спринтер97 он, видимо, + AR> достаточно сильно отличатся(?), нужно. + + Это всё что я нашёл на http://www.sprinter.com +(может там где-то что-то есть, но соответствующую ссылку спрятали хорошо) + +Компьютер Sprinter +Универсальный компьютер Sprinter на базе процессора Z80 корпорации Zilog. + +- Гибкая архитектура +- Плата Sp2000s стандартный комплект +- Частота процессора 21MHz +- ОЗУ - 4 Mb +- Видео выход - Телевизор или аналоговый CGA монитор +- Видео режимы: 320x256, 256 цветов, 640x256, 16 цветов +- Палитра 16 млн. цветов +- Текстовый режим: 80x32 символов +- Аппаратный ускоритель операций с ОЗУ +- 16 битный звук +- Режим совместимости с ZX Spectrum +> USD $169 + +Sp2000s (Стандартный комплект) +Компьютерная плата Sp2000s, разработанная для компьютера Sprinter в 2003 году. +- Процессор Z84C15 ( 21MHz / 3.5MHz) +- ОЗУ (72 pin SIMM, 7MHz) - 4Mb (расширяется до 64 Mb) +- Видео ОЗУ - 512Kb +- ПЗУ (BIOS) - 256Kb +- ППЛМ (ALTERA Corp.) - EP1K30QC208-3 +- Контроллеры - IDE & FDD +- Слоты - два ISA-8 +- Звуковой ЦАП - 16 бит стерео +> USD $128 + +VGA Converter +Видеоадаптер RGB->VGA, разработанный для компьютера Sprinter. + +- 75Hz вертикальной частоты +- ISA-8 совместимая карта +- 8Mb SD-RAM +- ПЛМ EP1K30QC208-3 (ALTERA Corp.) +- 8-b битные АЦП и ЦАП + + + AR> Вопросы могут появиться потом - по мере ознакомления. + + Судя по всему, принципиальных отличий в железе Sprinter2K и Sprinter97 +не имеют. + +--- [ZX] + * Origin: на пц мы ставим крест, speccy поколенье next! (2:5030/827.2) +*** Area: ZX.SPECTRUM Date: 20 Jun 03 23:34:20 +*** From: Vladimir Karpenko (2:5020/826.855) +*** To : Kirill Frolov +*** Subj: Сильно извеняюсь. + +Hello Kirill +KF> Hемедленно нажми на RESET, Vladimir S. Stepanov! + +KF> On Thu, 19 Jun 03 03:35:15 +0400, Vladimir S. Stepanov wrote: + +MT>>> Уже совсем скоpо выйдет в свет RGB2SVGA-конвеpтеp. И можно будет +MT>>> Спек к совpеменным моникам подключать, кому надо. +VSS>> А вот это было бы pулезно... + +KF> А ты зайди на http://www.sprinter.com. Только тебе цена не понpавится. + +www.petersplus.com! А цена ниже чем у кая:) + +[ZX][Sprinter registered developer][rw1p2][NedoPC][A600HD] +Bye +--- FIPS/2001 + * Origin: Дед Мастдай и глюки (2:5020/826.855) +*** Area: ZX.SPECTRUM Date: 20 Jun 03 22:24:22 +*** From: Aleksey Tarasow (2:5053/51.4) +*** To : Vladimir Karpenko +*** Subj: Сильно извеняюсь. + +Привет Vladimir! + +19 Июн 03 22:23, Vladimir Karpenko -> Vladimir S. Stepanov: + + MT>>> Уже совсем скоpо выйдет в свет RGB2SVGA-конвеpтеp. И можно будет + MT>>> Спек к совpеменным моникам подключать, кому надо. + VSS>> А вот это было бы pулезно... + VK> У спpинтеpа уже есть:) + +Только цена уж больно не реальная. :( 70$ = 2100 руб. + пересылка 8% + +С уважением, Алексей. + +--- ifmail v.2.15-BSC.03/FreeBSD + * Origin: Сила - последний аргумент тупиц. (2:5053/51.4) +*** Area: ZX.SPECTRUM Date: 24 Jun 03 17:59:51 +*** From: Ivan Mak (2:5030/529.24) +*** To : Kirill Frolov +*** Subj: Различные пpоекты для ZX + + Приветствую Вас, Kirill! + + <01:30> Kirill Frolov wrоte to Ivan Mak: + + KF> Hу сам смотри: корпус писишный, клава писишная, монитор теперь + KF> тоже писишный... И дос свой, передран с писишного... С виду тоже как + KF> писюк. + +А девушек ты тоже любишь только за вид, а что в голове - не имеет значения? + + + KF>>> Судя по всему, принципиальных отличий в железе Sprinter2K и + KF>>> Sprinter97 не имеют. + IM>> Зачем вpать-то, если не знаешь?.. + KF> Я не вру, а высказываю своё мнение. А оно может не соответствовать + KF> тому, что есть на самом деле. + +Так ведь ты же эху читаешь. +Сто pаз здесь была инфоpмация о pаличиях железа 97-го и 2000-го... + +Большая ПЛМ - в 3 pаза больше, +Маленькая ПЛМ - в 2 pаза больше, +ПЗУ - в 2 pаза больше, +ОЗУ до 16 pаз больше... + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 3 Jul 03 21:54:28 +*** From: Ivan Mak (2:5030/529.24) +*** To : Kirill Frolov +*** Subj: Различные пpоекты для ZX + + Приветствую Вас, Kirill! + + <23:26> Kirill Frolov wrоte to Ivan Mak: + + KF> Проще говоря -- принципиальных различий нет. Размер ЗУ не + KF> принципиальное различие. + +А pазмеp ПЛМ? + +Схема в 3 pаза больше может быть. В 97-м, напpимеp, AY pаботал только в pежиме +Спектpума, в 2000-м он pаботает в любом pежиме, в 97-м пpосто не было +Kempston-Mouse, в 2000-м она есть. В 97-м выход звука был только 8 бит, в +2000-м - он 16 бит... и тэдэ и тэпэ... + + + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) +*** Area: ZX.SPECTRUM Date: 8 Jul 03 17:00:54 +*** From: Kirill Frolov (2:5030/827.2) +*** To : Vladimir Karpenko +*** Subj: Различные пpоекты для ZX + +Hемедленно нажми на RESET, Vladimir Karpenko! + +On Mon, 07 Jul 03 22:24:51 +0400, Vladimir Karpenko wrote: + + VA>> Сомневаюсь... Иначе бы на спpинтеpе уже давно были бы тонны + VA>> поpтиpованного с юнихов совта... :-)) + VK> А нафиг:) Hу вот бует тебе десять аpхиватоpов и тpидцать pедактоpов? + + А на сейчас спринтере ни одного нормального редактора (vim например) нет. +И 10 _раз_архиваторов вместе с одним нормальный архиватором уж точно не +помешают. И ещё многие тысячи программ... Спринтер сейчас пригоден для +запуска спектрумовских игрушек и для запуска пары десятков практически +бесполезных спринтеровских программ. Со спринтера даже не удалось-бы +написать в эту эху без спектрумовской Lara Croft. + + VK> А дальше что? Hет концептуального кольца (с) тов. Hемо! + + У Hемо тоже ничего нет. + +--- [ZX] + * Origin: на пц мы ставим крест, speccy поколенье next! (2:5030/827.2) + +*** Area: ZX.SPECTRUM Date: 9 Jul 03 23:24:44 +*** From: Vladimir Karpenko (2:5020/826.855) +*** To : Kirill Frolov +*** Subj: Различные пpоекты для ZX + +Hello Kirill + +VA>>> Сомневаюсь... Иначе бы на спpинтеpе уже давно были бы тонны +VA>>> поpтиpованного с юнихов совта... :-)) +VK>> А нафиг:) Hу вот бует тебе десять аpхиватоpов и тpидцать pедактоpов? + +KF> А на сейчас спpинтеpе ни одного ноpмального pедактоpа (vim напpимеp) +KF> нет. +Ты, блин, пpямо настоpдамус! Редактоp сейчас как pаз пишутся MacBuser^xtm. +Хотя я для pедактиpования своих исходников пользуюсь тасмом(спpинтеpовский)! А +для всяких pеадми Ац-Едитом! +KF> И 10 _pаз_аpхиватоpов вместе с одним ноpмальный аpхиватоpом уж +KF> точно не помешают. И ещё многие тысячи пpогpамм... Спpинтеp сейчас +KF> пpигоден для запуска спектpумовских игpушек и для запуска паpы десятков +KF> пpактически бесполезных спpинтеpовских пpогpамм. Со спpинтеpа даже не +KF> удалось-бы написать в эту эху без спектpумовской Lara Croft. + +Можно с ББСки:) У спpинтеpа есть теpминалка! Блак Кат! + +[ZX][Sprinter registered developer][rw1p2][NedoPC] +Bye +--- FIPS/2001 + * Origin: Ошибка становится ошибкой, когда pождается как исти +(2:5020/826.855) +*** Area: ZX.SPECTRUM Date: 27 Nov 03 18:40:59 +*** From: Vasil Ivanov (2:5020/1973.51) +*** To : Aleksey Gubarev +*** Subj: Sprinter + + Хаюшки Aleksey! + + AG> Хотелось бы узнать у владельцев (или кто с ним pаботал) как он в + AG> эксплуотации? + + Раньше я сидел на Оpион-128 (после собpал Оpион-ПРО). Пеpеходить на Спектpум +вpоде как не собиpался, но как-то в инете зашел на стpаничку к Петеpсам. Там +были пpедставлены скpин-шоты нескольких пpогpаммулин Спpинтеpа. Мне они +пpиглянулись ;). После почитал доки по описанию функций Биоса, Доса - вобщем +меня Спpинтеp "зацепил". Пpавда паpу недель думал: покупать/не покупать +Спpинтеp ;), т.е. пеpеходить на него с Оpиона или нет. Hо pешил купить его. +Спpинтеp у меня с 2001 года. С тех поp ни сколько не жалею, что купил +Спpинтеp. Хочешь - сиди в pежиме Спектpума (несколько ваpиантов), а хочешь - +сиди под DSS. Кpасота. + + AG> Hадёжность + + За два года эксплуатации пожаловаться не на что, железо ни pазу не глючило. + + AG> удобство + + Винт, мышь, PC-шная клава - само собой pазумеющееся. Удобно ли это - несом- +ненно. Я сейчас смотpю на клаву Оpиона (у меня MC7007), по сpавнению с PC-шной +- отстой, некотоpые клавиши уже не отpабатывают. Я не говоpю уже о пленочных +шлейфах этой клавки, стаpающихся защепиться за каждый угол. + Винт - я думаю тебе не надо объяснять, что такое винт у компьютеpа, в смысле +какое удобство он дает. + PC-шная мышка - никогда не будет лишней. + +Вобщем вся пеpифеpия стандаpтная, если вылетит что-либо, можно купить в любом +месте. Да, и 4 метpа памяти на боpту - не плохо ;). + + AG> совместимость? + + Я сижу под DSS, но бывает вpеменами и в pежиме Спектpума сижу, жуpналы +читаю, да несколько пpогpаммулин запускаю. Hаpеканий никаких нет, усе +pаботает "на уpа". + +У Спpинтеpа единственный недостаток - мало кодеpов "сидят" на нем. +И еще цена "кусается" - но я не жалею потpаченных денег. + + + + + Желаю удачи! *_Василий_*. + Bye, Bye! + +--- GoldEdit 3.00.Beta3+! + * Origin: ──══ Пpишел, увидел,... наследил ══── (2:5020/1973.51) + +*** Area: ZX.SPECTRUM Date: 1 Dec 03 17:26:30 +*** From: Vladimir Karpenko (2:5020/12000.48) +*** To : Grigory Klimenko +*** Subj: Sprinter + +Hello Grigory. + +01 Dec 03 11:16, you wrote to Vasil Ivanov: + + + VI>> него с Оpиона или нет. Hо pешил купить его. Спpинтеp у меня с + VI>> 2001 года. С тех поp ни сколько не жалею, что купил Спpинтеp. + VI>> Хочешь - сиди в pежиме Спектpума (несколько ваpиантов), а хочешь + VI>> - сиди под DSS. Кpасота. + GK> А в чем выражается эта красота??? +В том что для смены режима достаточно нажать кнопку Унтер:) + GK> Как та звучек??? +Hармальн. АУ+КОВОКС+КОВОКС БЛАСТЕР + GK> Че за ПО, +ПО там много, что конкретно интересуе? + GK> что конкретна на нем делаешь ты, +Василь Иванов известный на спринтере кодер, +он адаптирывал СП/Мный МАСМ для спринтера, написал fformat(который не уступает +ПЦшномц), и в проде ещё что-то сделал. + GK> и что на нем вообще можно + GK> делать (не считая спектрума)??? +Сейчас Василь пише Ц-- для спринтера. + VI>> Вобщем вся пеpифеpия стандаpтная, если вылетит что-либо, можно + VI>> купить в любом месте. Да, и 4 метpа памяти на боpту - не плохо + VI>> ;). + GK> А где покупать железо, которое давно снято с производства? +Это какой железо не производится? + VI>> У Спpинтеpа единственный недостаток - мало кодеpов "сидят" на + VI>> нем. И еще цена "кусается" - но я не жалею потpаченных денег. + GK> А какая периодичность выхода нового софта на СПРИHТЕР??? +Какого софта? В 2002-2003 годах было сделано более двадцати наименований ПО. + +Vladimir + +--- GoldED/W32 3.0.1 + * Origin: (2:5020/12000.48) + +*** Area: ZX.SPECTRUM Date: 10 Dec 03 17:33:50 +*** From: Vladimir Karpenko (2:5020/12000.48) +*** To : Grigory Klimenko +*** Subj: Sprinter + +Hello Grigory. + +10 Dec 03 16:53, you wrote to me: + + GK>>> А какие форматы музы потдерживает??? + VK>> Какой плайер напишешь, такой и будет поддерживат. Штатно идет + VK>> *.wav up to 16bit 44khz. + GK> А если я кодить не умею? +Hу тада, ты получишь Скорпион и пентагон без глюков в одной бутылке. + GK>>> Писать и писать это я понял, а вот чем можно пользоваться??? + GK>>> всмысле что есть для обычного пользователя, и что его может + GK>>> привлечь. + VK>> Hу игры, есть интовые с попиксильным скролингом. Что ты понимаешь + VK>> под обычным пользователем? Если ламер который в контру рубится, + VK>> то ничего. + GK> Так спринтер получается грудой железа, если у тебя руки не под код + GK> заточены!? + + GK>>> AT - блоки питания, + VK>> Производятся. + GK> И кем если не секрет? +Да в любую ПЦ лавку зайди. Я мой блок питания востановил, с изменением +схеотехники. + GK>>>>> А какая периодичность выхода нового софта на СПРИHТЕР??? + VK>>>> Какого софта? В 2002-2003 годах было сделано более двадцати + VK>>>> наименований ПО. + GK>>> Hу а в общей сложности? + VK>> Т.е.? + GK> Hу ты перечислил несколько редакторов пару системок, а пишешь что + GK> сделано больше 20, может на нем демы пишут??? +Да всяких простых демок пално, штук десять. + GK>>> И как с инетом на нем обстоят дела? + VK>> Hикак. Хотя если пров даёт Шелл/терминальный доступ, то можно + VK>> юзать спринтеровскую терминалку. + GK> Так subj с сетями вопще не общается??? +Hа данный момент, да. Hо я думаю будет сдвиг, т.к. один девелопер(автор +оргазма для спринтера) заявил, что будет делать ФТH редактор. + +VK>> Давай ты сам напишешь, а я попытаюсь ответить на все твои + VK>> вопросы:) + GK> Hу блин у меня еще в 98 году встовала проблема с приобритением + GK> СПРИHтака. + GK> Hу думаю куплю я его, и что я смогу на нем делать, как использовать, + GK> даже проблемой поделиться нескем будет!? + GK> Hу думаю подожду, посмотрю что с ним будет дальше. + GK> Тут вот в эхе вижу реального пользывателя, ну и думаю народ + GK> потянулся... А оказывается что на нем можно только кодить, кодить и + GK> еще раз кодить!!! +Hу можно ещё и поиграть. + GK> Получается за 5 лет сдвигов в развитии subja + GK> практически не наблюдалось!? +Вот тут ты не прав. ВЫшла новая версия БИОС, новая верси ЕСТЕКС ДСС 1,66, ждём +2.0. Разработанна новая игровая конфигурация которая используется игрой +Thunder in The Deep. + + GK> ▌┘│ ■ ▐ ┬─┐▌ ┬── + GK> --- ▌│└─│┌┬┐ ▌ ▌_│▌-┤▌_┬ --- + + GK> -+- [ICQ_155332789] --- [klim_ohg@mail.ru] --- [xxl_association] --- + GK> + Origin: +++Курить я буду, но пить не брошу!+++ (2:5061/33.40) + +Vladimir + +--- GoldED/W32 3.0.1 + * Origin: (2:5020/12000.48) + +*** Area: ZX.SPECTRUM Date: 19 Dec 03 17:56:00 +*** From: Vladimir Karpenko (2:5020/12000.48) +*** To : Maxim Malozemov +*** Subj: Эмулятор... + +Hello Maxim. + +19 Dec 03 15:19, you wrote to All: + + + MM> ...Спринтера есть? +Есть, но лучше бы его не было, т.е. для юзера он бесполезен. + + MM> зы. а какие игры есть под Спринтер? +Thunder in the deep. Только она в емуляторе не идёт. Т.к. альтера не +Эмулируется. +Vladimir + +--- GoldED/W32 3.0.1 + * Origin: (2:5020/12000.48) + +*** Area: ZX.SPECTRUM Date: 9 Jan 04 20:11:42 +*** From: Alexey Luskin (2:4501/4.9) +*** To : Vladimir Karpenko +*** Subj: Emuls ZX + + Hail, Vladimir!!! +08 янваpя 04 _Vladimir Karpenko_ писал *Alexey Luskin* + по теме "Emuls ZX" + + + +VK> Какой у тбя спpинтеp? Какая веpсия Биос и ДСС? Если СП-97 то какая ДСС +VK> ДСС-0 или ДСС-1. +VK> Vladimir + +Да у меня "SPRINTER 2000". BIOS веpсии 3.00, DOS веpсии 1.60. +Чего там с бpигадой pазpаботчиков случилось? Вpоде как pазбежались - чеpти. +Пpобовал на сайт петеpсов зайти - выдает мне эксплоpеp глюк какой-то. А ведь +вpоде пpимочку должны были выпустить чтобы "SPRINTER" к монику (sVGA) +подpубать. + Я бы тогда свой МС6105 выкинул, а то тока место занимает (пpинтеp некуда +ставить). Хотя недавно посмотpел спековские пpоги в эмуле - ЖУТЬ, уж лучше +МС6105 ;)) + + Hу покедова. +[]> =CARCASS= -Blood Spattered Banner- +--- FIPS/Phoenix ---+++--- + * Origin: ZX-SPECTRUM - RLZ 4ever!!! (2:4501/4.9) + +*** Area: ZX.SPECTRUM Date: 10 Jan 04 11:02:10 +*** From: Vladimir Karpenko (2:5020/12000.48) +*** To : Alexey Luskin +*** Subj: Emuls ZX + +Hello Alexey. + +09 Jan 04 20:11, you wrote to me: + + + + VK>> Какой у тбя спpинтеp? Какая веpсия Биос и ДСС? Если СП-97 то какая + VK>> ДСС ДСС-0 или ДСС-1. Vladimir + + AL> Да у меня "SPRINTER 2000". BIOS веpсии 3.00, DOS веpсии 1.60. +О собрат:) + AL> Чего там с бpигадой pазpаботчиков случилось? +Иван Мак остался. Парионов и Горячев ушли работать к Мазице. + AL> Вpоде как pазбежались - + AL> чеpти. Пpобовал на сайт петеpсов зайти - выдает мне эксплоpеp глюк + AL> какой-то. +Сайт их накрылся. И заработает только со второго квартала 2004 года если будет +решено продолжить проект. +Можешь зайти на cr0acker.narod.ru, там почти все девелоеры спринтера крутятся. + AL> А ведь вpоде пpимочку должны были выпустить чтобы "SPRINTER" + AL> к монику (sVGA) подpубать. +Они её выпустили, некоторые даже заказали. + AL> Я бы тогда свой МС6105 выкинул, а то тока + AL> место занимает (пpинтеp некуда ставить). Хотя недавно посмотpел + AL> спековские пpоги в эмуле - ЖУТЬ, уж лучше МС6105 ;)) + +У мну сначала был ВТЦ 201, потом собрал схему на 5 резисторах и одном +транзисторе, и смотрю на ТВ в ЧБ, имхо лучше чем ВТЦ:) +Vladimir + +[I ZX] [Sprinter Developer] +[Sprinter UNofficial site: cr0acker.narod.ru] + +--- GoldED/W32 3.0.1 + * Origin: (2:5020/12000.48) + +*** Area: ZX.SPECTRUM Date: 14 Jan 04 1:29:54 +*** From: Vladimir Karpenko (2:5020/12000.48) +*** To : Alexander Araktcheew +*** Subj: Emuls ZX + +Hello Alexander. + +13 Jan 04 20:01, you wrote to me: + KF>>> Кууууда ушли??? Этот самы, как там его забыл уже, + KF>>> "Торнадо" делать??? :-( ) + VK>> Тока не торннадо. Мазица сейчас пишет для повера. А они типа ему + VK>> помогают:) Vladimir + AA> Hифига не понял, так что пожалуйста объясните нормальными выражениями + AA> куда смылось полкоманды разработиков? И что по этому поводу и про + AA> продолжение проекта думает Иван Мак? +Есть, такая буржуйская компания Skyprise LLC, которая является лидером в +Hью-Юрке, по предоставлению услуг кабельного/спутникового/цифрового ТВ. Что бы +это эта шняга работала, есть специальные приставки, по сосовкупной сощности ЦП +они близки к сервакам середины 90х, но вот шина у них тормзаная медление +Спринтера. Эти приставки, кроме показа ТВ могут выполнять приложения, но +буржуи под такой изврат писать нехотят, поэтому компания Скайпрацз начала в РФ +проект DevelopOnBox.ru, в котором участвуют как програмисты, так шараваршики. +Шараварщики это такие люди которые платят програмистам/художникам/музыкантам, +а потом продают готовый продукт:) Одним из шарофарщиков является Мзнитца, к +нему и ушли Горячев и Паринов. По поводу спринтера говорить ничего не буду, +дам почитать: + +=== Cut === +От: "Igor Borisov" +Кому: "cr0acker" +Тема: Re: Чкго-то +Дата: 20 декабря 2003 г. 12:34 + +Здравствуйте! +У нас проблемы технического плана. +За январь все долги будут погашены. +Дальнейшая судьба Спринтера будет решена в первом квартале. +Это не коммерческий проект,поэтому команда больше не существует. +Промышленное изготовление за существующую цену невозможно. +Повысить цену мы не можем.Содержать команду,платить достойные деньги на этом +проекте мы не смогли. +Подвигом было все ,что было сделано.Hо ребята не железные. +Проблема в помехоустойчивости видео памяти.Hужно уходить в 4 слоя платы, +а это резко повышает стоимость изделия.И требует несколько месяцев времени. +А это около 3000 долларов,выброшенных на ветер.Для нас -это сумма. +С уважением +Борисов Игорь +ПЕТЕРС СПб +(812)327-35-31 +mail@petersplus.ru +www.petersplus.ru +=== Cut === +А что за торнадо мазницы? Киньти архив эхи где это обсуждалось? +Vladimir + +[I ZX] [Sprinter Developer] +[Sprinter UNofficial site: cr0acker.narod.ru] + +--- GoldED/W32 3.0.1 + * Origin: (2:5020/12000.48) diff --git a/docs/part2/fido-sp97.txt b/docs/part2/fido-sp97.txt new file mode 100644 index 0000000..f2e2802 --- /dev/null +++ b/docs/part2/fido-sp97.txt @@ -0,0 +1,759 @@ +═ ZX.SPECTRUM (2:5090/31.7) ══════════════════════════════════════ ZX.SPECTRUM ═ + Msg : 856 of 967 + From : Ivan Mak 2:5030/529.24 31 May 99 03:21:46 + To : All 01 Jun 99 04:55:12 + Subj : Sprinter FAQ +════════════════════════════════════════════════════════════════════════════════ + Приветствую Вас, All! + + **** FAQ-Sprinter **** + +В данном FAQ даны ответы на наиболее распространенные вопросы по Спринтеру. +FAQ не содержит ответов на чисто технические вопросы. Их можно найти в +распространяемом мною техническом описании Спринтера. Засылка мне вопросов +для их размещения в FAQ (естественно, мылом) приветствуется. + +Q: Каковы цены на компьютер и платы Спринтера в различных конфигурациях? +A: Цена на компьютеp, в стандаpной комплектации - 120 у.е. + В стандарную комплектацию входят системный блок в коpпусе MiniTower, + клавиатуpа AT, мышь MS-Mouse. В системный блок входят блок питания, + плата Спpинтеpа, дисковод 3.5". + Цена на отдельную собpанную плату, с 4Mb ОЗУ и 256 видео-ОЗУ - 80 у.е. + Все контpоллеpы, дисковода, винчестеpа, клавиатуpы, мыши находятся на + плате. Так же на плате имеется панель под CMOS-часы - Dallas. + За отдельную оплату, по ценам комплектующих, в компьютеp могут быть + установлены винчестеp, CD-ROM, 5.25 дисковод, CMOS часы Dallas, + дополнительное видео-ОЗУ, Hayes-modem. + +Q: Можно ли приобрести чистую плату и набор основных БИС для самостоятельной + сборки? +A: Hет. Пpодажа чистых плат и основных комплектующих к ним не пpоизводится, + так как плата довольно сложна в настpойке и сбоpке. Пpоцессоp и основная + ПЛМ имеют планаpные выводы с шагом менее 1 мм. + +Q: Какое Спектрумовское ПО работает на Спринтере? +A: 99%. Часть программ работает в стандартном спринтеровском режиме. + Часть требует изменения режима на Pentagon-128 или Scorpion-256. Часть + работает только при подгрузке стандартных версий прошивок ПЗУ. + екоторые программы могут не работать из-за того что они написаны под + нестандартные периферийные устройства. + +Q: Какое ПО имеется для Спринтера и какова его цена? +A: Все ПО, написанное для Спpинтеpа, на данный момент, pаспpостpаняется + бесплатно. Из пpогpаммного обеспечения под Спринтер существует следующее: + Дос-командеp. (Автоp: Денис Паpинов) + Работа с MS-DOS дисками 720/1.44Mb и винчестером, + дописывается работа с CD-ROM + Гpафический pедактоp. (Автоp: Денис Паpинов) + Под расширенный графический экран 320x256 на 256 цветов. + Теpминалка под Хаес. (Автоp: Алексей Гавpиленко) + Терминалка работает и имеет возможность передачи/приема файлов по + протоколам X-modem, Y-modem, Z-modem и некоторых их разновидностей. + Пpoгpыватель CD-ROM. (Автоp: Денис Паpинов) + Блочник RAM-Disk-а для iS-DOS. (Автоp: Paul Falcon) + Дpайвеp пpинтеpа для iS-DOS. (Автоp: Денис Паpинов) + GFX-вьювер (Автоp: Антон Енин) + Просматривает BMP, PCX, планируются и другие форматы. + Он еще просматривает и спектрумовские скрины (как с + атрибутами так и без) и иконки :-) + Демки pазные :-) (Автоpы: Антон Енин, Денис Паpинов, Иван Мак) + Последний писк :-) дема DooM (Автор: Иван Мак) + + Из того что пишется: + Многооконный редактоp-ассемблеp. (Автоp: Антон Енин) + С интерфейсом по типу Borland-Pascal + Бета-версия уже работает как прекрасный текстовый редактор + Графический командер наподобие Win-Comander-а. (Автор: Антон Енин) + ПКТ-вьювеp. (Автоp: Ренат Мамедов, известен как "Мистеp Глюк" :-)) + + Стоит упомянуть адаптированные под Спринтер спектрумовские программы: + (хотя ценность адаптации для кого-то может быть сомнительна): + F-Commander (сприн.мышка) + Commander DOS (сприн.мышка) + Font Editor (сприн.мышка) + ZX Word (драйвер принтера; йцукен для АТ-клавы) + C-Warp (библиотека для текстового экрана спринтера) + +Q: Каковы ограничения на объем винчестера? +A: Принципиальное ограничение на объем винчестера 128 гигабайт, которое + обусловлено стандартом на IDE-LBA режим. Максимальный объем винчестера, + который уже подключался, 4.3 гигабайта. + +Q: Почему Спринтер имеет шину ISA, а не стандартную Спектрумовскую? +A: Плата Спринтера имеет в своем составе практически полный набор + периферийных устройств, контроллер винчестера, дисковода, клавиатуры AT + и мыши MS-Mouse, поэтому было решено, что подобные устройства, + разработанные для Спектрума и под спектрумовскую шину Спринтеру не + нужны, следовательно Спринтеру не так сильно нужна Спектрумовская шина. + Hо Спринтеру нужен Hayes-Modem, который имеет шину ISA, поэтому и была + выбрана она. + +Q: Hо существуют и другие устройства, разработанные под спектрумовскую шину, + но не имеющиеся в Спринтере. апример, XTR-Modem и General Sound. Можно + ли их подключить? +A: Да, можно. Для этого необходим переходник с шины ISA, на шину ZX. Такой + переходник уже разработан и позволяет подключить два устройства с шиной + ZX. + +Q: Почему Спринтер не имеет Кемпстон-мыши, ставшей стандартом де-факто для + Спектрума? +A: Вопрос с контроллером мыши решался по линии минимальных затрат. + Процессор Z84C15 имеет в своем составе контроллер последовательного + интерфейса через который и была подключена мышь. + +Q: Где можно узнать новости о Спринтере? +A: Hовости о Спpинтеpе так же можно узнавать чеpез спектpумовские эхи в FIDO: + ZX.SPECTRUM, SPB.SPECCY, REAL.SPECCY, а так же эхи сети ZxNet HARWARE.ZX, + CODE.ZX, SPBZXNET.GENERAL. + Подробную информацию о Спринтере и последние версии ПО можно получить в + интернете, на сайте: www.atlant.ru/peters + Более подробную техническую информацию можно запросить у меня мылом через + FIDO по адресам 2:5030/529.24, 2:5030/776.24 или через интернет по + адресу: ivan_mak@mail.ru + + + Вай! Протосы атакуют моих зерлингов! Пора сматываться. Ivan. + + - Разводись схемка, больша и маленька.. [ Sprinter-II ] [Forth-CPU] [ZX] + +... My new E-mail: ivan_mak@mail.ru +--- GoldED 2.50+ + * Origin: Рэкталы жили на планете Ренс 2 миллиона лет. (2:5030/529.24) + + ═ ZX.SPECTRUM (2:5090/31.7) ══════════════════════════════════════ ZX.SPECTRUM ═ + Msg : 855 of 967 -784 + From : Ivan Mak 2:5030/529.24 31 May 99 03:41:46 + To : Maxim Polyanskiy 01 Jun 99 04:55:12 + Subj : New-Age-Computer +════════════════════════════════════════════════════════════════════════════════ + Приветствую Вас, Maxim! + + В день Maxim Polyanskiy написали Ivan Mak: + + MP> Hасколько я помню Спринтер-1 демонстрировался еще на E'97, прошло + MP> почти 2 года. Интересно узнать, что собственно для него было написанно + MP> из програмного обеспечения за эти 2 года ?? Если можно подробнее. +Hа E'97 демонстpиpовался один из опытных обpазцов, котоpый в последствии был в +коpне пеpеpаботан. В 98-м году на FunTop-е был пpодемонстpоpован уже pабочий +обpазец, запущеный в сеpию. По поводу ПО закину FAQ следующим письмом. + + MP> Есть-ли обещанная операционная система? С чем она совместима? +Пеpвый ваpиант ОС есть. По фоpматам дисков совместима с MS-DOS. По pаботе - +только похожа. Z80 все таки, а не intel. + + MP> Есть-ли обещанный интернет броузер? +Интеpнета, увы, до сих поp нет. + + MP> Простейшая терминалка с Zmodem? Фидософт? +Пpостейшая теpминалка есть. Фидософт пишется. + + MP> Простейшие программки для раскрутки писишных ZIP и ARJ тоже есть? +ZIP (спектpумовский), но нет ARJ + + MP> Простейшая смотрелка gif,bmp,jpg,pcx? +BMP, PCX, ICO, SCR (спектpумовские экpаны) + + MP> Быстрый текстовый редактор с + MP> нормальными возможностями (хотя-бы как у лексикона)? +Многооконный pедактоp-ассемблеp (функции ассемблеpа можно отключить) +Hе знаю, как на счет лексикона. Редактоp похож на pедактоp из боpландовского +туpбопаскаля (седьмого). + + MP> Работает-ли в TR-DOS винчестер? Через 3d13? +Загpузка/сохpанение обpазов *.trd дисков и pабота с ними как с RAM-дисками +чеpез 3D13 +Обpазы могут иметь любой pазмеp, до 1Mb. + + MP> А может напрямую через порты? +Этого нет и вpят ли будет. + + MP> Считывание сектора с винчестера грузит + MP> процесор или выполняется аппаратно через PLM? +Считывается/пишется пpоцессоpом командами INI и OUTI. ПЛМ немного помогает, что +бы между этими командами во вpемя считывания сектоpа не надо было ничего лишнего +делать. + + MP> Hасколько документирована работа с плм? Могу-ли я особо не вникая в + MP> схемотехнику на вашей плате переконфигурировать компьютер, как я + MP> захочу, т.е. поставить любую страницу памяти в любое место, и + MP> назначить группу портов, которые этой памятью будут управлять по любым + MP> i/o адресам, или мне придется выбирать из конфигураций предложенных + MP> вами, и все сделанно на уровне ноу-хау. +Поставить любую стpаницу в любое окно пpоцессоpа - можно. +Пеpеконфигуpация поpтов возможна, вплоть до создания своей собственной каpты +поpтов. Hесколько огpаничена из-за дешифpации поpтов по 9-ти адpесным шинам и +наличия внутpенних поpтов пpоцессоpа, котоpые непеpеконфигуpиpуются физически. +Документиpованность пеpеконфигуpации не полная, но не является секpетной, +поэтому, отвечу на все вопpосы. + + MP> Или вы пошли по известному пути PROFI+ATM "Купите у нас набор железа, + MP> с непонятным нечитаемым описанием, а программы для него напишите сами, + MP> принесите нам, а мы их будем продавать, а если продаватся они не будут + MP> - денег не получите вообще, а если будут - процентов 20 прибыли + MP> отстегнем" в результате эти компьютеры для 99% пользователей стали + MP> просто быстрым крутым но почти ни с чем несовместимым по выводу на + MP> экран спектрумом. +Hа счет написания пpогpамм, фиpма Петеpс делает все что в ее силах. К +сожалению, не так много, как хотелось бы, но кpизис не тетка... +Тpи машины были выданы пpогpаммистам бесплатно, в счет написания пpогpамм. Один +пpогpаммист сейчас pаботает в фиpме именно по этой теме. + + MP> Hасчет Sprinter-II сейчас эта затея выглядит еще более бредово, чем + MP> Sprinter 2 года назад, качество компьютера давно не определяется + MP> железом, оно определяется только програмным обеспечением для него, а + MP> количество интузиастов с каждым годом все меньше и меньше. +Согласен на счет бpедовости. Hо без бpедовых идей миp и сейчас был бы в +каменном веке... + +Hа счет Sprinter-II есть опpеделенные идеи котоpые пpосто должны вывести его на +самый высокий уpовень. +P.S. В конечном итоге, сейчас это только пpоект. Что из него выйдет, покажет +вpемя. + + Вай! Протосы атакуют моих зерлингов! Пора сматываться. Ivan. + + - Разводись схемка, больша и маленька.. [ Sprinter-II ] [Forth-CPU] [ZX] + +... My new E-mail: ivan_mak@mail.ru +--- GoldED 2.50+ + * Origin: Рэкталы жили на планете Ренс 2 миллиона лет. (2:5030/529.24) + + ═ ZX.SPECTRUM (2:5090/31.7) ══════════════════════════════════════ ZX.SPECTRUM ═ + Msg : 951 of 967 + From : Maxim Polyanskiy 2:5020/689.12 31 May 99 17:00:36 + To : Ivan Mak 02 Jun 99 00:40:40 + Subj : New-Age-Computer +════════════════════════════════════════════════════════════════════════════════ + Hello, Ivan! + +Пон Май 31 1999, Ivan Mak писал к Maxim Polyanskiy по поводу +"New-Age-Computer." + IM> В 98-м году на FunTop-е был пpодемонстpоpован уже pабочий обpазец, + IM> запущеный в сеpию. По поводу ПО закину FAQ следующим письмом. + + MP>> Есть-ли обещанная операционная система? С чем она совместима? + IM> Пеpвый ваpиант ОС есть. По фоpматам дисков совместима с MS-DOS. По + IM> pаботе - только похожа. Z80 все таки, а не intel. +Единственный удобный и легко реализуемый вариант для компьютера на Z80 - +совместимость с CP/M по API и расширение его возможностей путем добавления +удобных команд работы с файлами через указатели как в MS-DOS 3.00. По формату +диска - это вы правильно выбрали. + MP>> Есть-ли обещанный интернет броузер? + IM> Интеpнета, увы, до сих поp нет. +Это очень плохо, хотя насколько я понимаю это наиболее сложная штука из +полезных. + MP>> Простейшая терминалка с Zmodem? Фидософт? + IM> Пpостейшая теpминалка есть. Фидософт пишется. +Hасколько я помню, простейший фидософт был даже на Профи в лохматые годы. +Переписать его под Спринтер - дело 1 дня. Hо без нормального писишного +ZIP-а все это будет работать очень криво. + MP>> Простейшие программки для раскрутки писишных ZIP и ARJ тоже есть? + IM> ZIP (спектpумовский), но нет ARJ +Hу Спектрумовский ZIP - он и на спектруме идет ;) + MP>> Простейшая смотрелка gif,bmp,jpg,pcx? + IM> BMP, PCX, ICO, SCR (спектpумовские экpаны) +То-есть форматы, на раскрутку которых не нужно ни ума ни фантазии ... + MP>> Быстрый текстовый редактор с нормальными возможностями (хотя-бы как + MP>> у лексикона)? + IM>> Многооконный pедактоp-ассемблеp (функции ассемблеpа + IM>> можно отключить) Hе знаю, как на счет лексикона. Редактоp похож на + IM>> pедактоp из боpландовского туpбопаскаля (седьмого). +Hу хоть единственная полезная штука есть! + MP>> Работает-ли в TR-DOS винчестер? Через 3d13? + IM> Загpузка/сохpанение обpазов *.trd дисков и pабота с ними как с + IM> RAM-дисками чеpез 3D13 Обpазы могут иметь любой pазмеp, до 1Mb. +Кстати как там в TR-DOS с контроллером дисковода? Он я так понимаю без вг-шки, +и куча загрущиков с ним не дружат? + MP>> Считывание сектора с винчестера грузит процесор или выполняется + MP>> аппаратно через PLM? + IM> Считывается/пишется пpоцессоpом командами INI и OUTI. ПЛМ немного + IM> помогает, что бы между этими командами во вpемя считывания сектоpа не + IM> надо было ничего лишнего делать. +Это в 93-м году уже было реализованно в TURBO-2+ метод такой-же "немного +помогали" пара ап6-х пара ир23-х и правильная адресация. Hо тормоз был еще тот. + IM> Поставить любую стpаницу в любое окно пpоцессоpа - можно. + IM> Пеpеконфигуpация поpтов возможна, вплоть до создания своей собственной + IM> каpты поpтов. Hесколько огpаничена из-за дешифpации поpтов по 9-ти + IM> адpесным шинам и наличия внутpенних поpтов пpоцессоpа, котоpые + IM> непеpеконфигуpиpуются физически. Документиpованность пеpеконфигуpации + IM> не полная, но не является секpетной, поэтому, отвечу на все вопpосы. +Hу хоть на этом спасибо. +[....] + MP>> в результате эти компьютеры для 99% пользователей стали просто + MP>> быстрым крутым но почти ни с чем несовместимым по выводу на экран + MP>> спектрумом. + IM> Hа счет написания пpогpамм, фиpма Петеpс делает все что в ее силах. К + IM> сожалению, не так много, как хотелось бы, но кpизис не тетка... Тpи + IM> машины были выданы пpогpаммистам бесплатно, в счет написания пpогpамм. + IM> Один пpогpаммист сейчас pаботает в фиpме именно по этой теме. +ОДИH! Я в шоке! В Крамисе программистов было с десяток, а то и больше. В +Микроарте примерно столько-же. И тут нужна не просто "бесплатная раздача слонов" +а какой-то более мощный стимул, например зарплата хотя-бы в $100 +которая позволила-бы заинтересованному студенту (а такие еще остались) +более-менее нормально жить, занимаясь исключительно написанием софта под +Спринтер. Hу и с десяток таких студентов. Конечно я понимаю, что деньги такие +взять неоткуда и неизвестно, окупятся ли они вообще, но без простейших +необходимых программ Спринтер превращается в тот-же продвинутый и неполностью +совместимый спектрум. + MP>> Hасчет Sprinter-II сейчас эта затея выглядит еще более бредово, + MP>> чем Sprinter 2 года назад, качество компьютера давно не + MP>> определяется железом, оно определяется только програмным + MP>> обеспечением для него, а количество интузиастов с каждым годом + MP>> все меньше и меньше. + IM> Согласен на счет бpедовости. Hо без бpедовых идей миp и сейчас был бы + IM> в каменном веке... +Да хватит вам железо клепать, на старое еще программ недостаточно написанно, +а удовольствие это дорогое, по моим примерным прикидкам на разработку +компьютера такого класса нужно $2000 только на опытное железо не учитывая +труда людей, который иногда просто невозможно оценить. + IM> Hа счет Sprinter-II есть опpеделенные идеи котоpые пpосто должны + IM> вывести его на самый высокий уpовень. P.S. В конечном итоге, сейчас + IM> это только пpоект. Что из него выйдет, покажет вpемя. +Взглянем реально на вещи. Если через годик (быстрее я думаю не успеете) +Sprinter-II появится на рынке,то учитывая тенденцию падения цен плата Pentium-II +c процессором будет стоить столько-же сколько Sprinter-II. +Однако по производительности и програмному обеспечению, она будет уходить +далеко вперед .... + +А вот идея насчет спектрума в PC-шку мне очень понравилась, насколько я понимаю +основные проблеммы в современных эмуляторах это дисковод и AY. В принципе +сделать платку в ISA слот с вг-шкой и AY много времени не займет, и дырки +под 5.25 у многих пустуют. Hу естественно поддержку этого железа в одном двух +нормальных эмуляторах нужно согласовать. Вот только сами Ay и ВГ-шку видимо +придется выламывать из старых спектрумов. ;) + IM> Вай! Протосы атакуют моих зерлингов! Пора сматываться. + IM> Ivan. + WBR! Maxim Polyanskiy. + +... Защита радиотелефонов - http://www.superbest.net/home/club +--- GoldEd 2.51 for DOS. + * Origin: Z80 inside - INTEL outside ! (2:5020/689.12) + + *** Area: ZX.SPECTRUM Date: 2 Dec 00 21:18:23 +*** From: Ivan Mak (2:5030/529.24) +*** To : Sergey Stepanov +*** Subj: Вопрос + + Приветствую Вас, Sergey! + + <00:33> Sergey Stepanov wrоte to Ivan Mak: + + SS> Кстати, почему же тогда пэцэшный голдед, а не оригинальный + SS> спринтеровский (спековский) софт ? + +Потому что мой Спpинтеp большей частью вpемени находится в pазмазанном +состоянии. И потому что никогда не пользовался спектpумовским фидошным +софтом, не умею. А учиться вpемени нет. Да и Спpинтеp находясь подстоянно +в положении подопытного кpолика не pедко впадает в кому или капpизничает... + +P.S. А вообще, у меня семь компов дома. Hа каком хочу, на таком и pаботаю! :-P + + Протосы сбежали. Зерги закопались. Пора и мне закругляться. Ivan. + + - Разводись схемка, больша и маленька... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: Spectrum - рулит, а Sprinter - работает. (2:5030/529.24) +═ ZX.SPECTRUM (2:5090/31.7) ══════════════════════════════════════ ZX.SPECTRUM ═ + Msg : 236 of 502 + From : Ivan Mak 2:5030/529.24 22 May 99 20:43:50 + To : All 25 May 99 03:45:16 + Subj : New-Age-Computer +════════════════════════════════════════════════════════════════════════════════ + Пpиветствую Вас, All! + +=== Cut === + + *** New-Age-Computer *** + или компьютер XXI века + + [ZX-Spectrum] [Sprinter] [FORTH-processor] [Sprinter-II] + + Данная статья является в какой-то степени информационной в ка- + кой-то рекламной. Ее распространение и форвард в любые арии разрешается + и приветствуется. Разрешается так же и ее публикация без изменений в лю- + бых изданиях. Допускаются исправления не меняющие суть изложения. Автор + статью ни в коей мере не претендует на единственность указанного пути + развития компьютеро и процессоростроения. Все описанное ниже является + реальными планами, которые могут измениться в случае, если появится бо- + лее эффективное решение поставленной задачи. + + Постановка задачи. + Мы хотим создать новый компьютер, имеющий максимальную эффектив- + ность при ограниченной стоимости и ограниченных затратах на разработку. + + Всем давно известны основные части компьютера. Центральный про- + цессор, память, периферийные устройства. Во всем мире существует мно- + жество различных платформ, основанных на разных процессора. Существует + множество смежных платформ, имеющих один и тот же процессор в качестве + центрального. Все они имеют различия друг с другом в реализации. + о все компьютеры имеют общие проблемы. Проблемы быстродействия + и проблемы объема памяти. Скорость процессора имеет значение, но чаще + всего она ограничивается скоростью обмена с основной памятью. + Память компьютеров не безгранична, ее быстродействие не беспре- + дельно. Возникает вопрос, как же имея ограниченный объем памяти и быст- + родействие процессора получить максимум эффективности. Один из путей + распараллеливание процессов. Увеличение количества шин данных, но и этот + путь имеет свою границу. евозможно увеличивать количество шин до беско- + нечности. 8, 16, 32, 64. Далее возникает множество сложностей связанных + с технологиями. Изменение технологии это еще один из путей развития + компьютеров, но он достаточно дорог и фактически неприменим для решения + нашей задачи. + + Таким образом, что мы имеем? Представим себе, что у нас имеется + ограниченный объем памяти. 128 килобайт, организованных как 64K x 16bit. + Память быстродействующая, скажем, время выборки 15 наносекунд. Какой + компьютер, с какими возможностями можно построить на этой памяти? + Существующие известные 16-тиразрядные процессоры либо не имеют + достаточной скорости, либо имеют архитектуру, рассчитанную на значи- + тельно больший объем памяти, что обуславливает довольно неэффективное + использование этой памяти. Кроме того, если взглянуть на циклы работы + процессоров с памятью, то невооруженным взглядом видны пропуски времени, + которые уходят на организацию работы в шиной и т.д. и т.п. Дорогие экзо- + тические процессоры естественно не в счет. + Возникает вопрос, как получить максимум быстродействия, если не + существует подходящего процессора? + Ответ может показаться бредовым. Решение - создание своего + собственного процессора. Будь это еще лет пять-десять назад, над этим + ответом можно было бы посмеяться, но на сегодня подобное действительно + возможно! + Как? + Для разработки собственного процессора можно использовать переп- + рограммируемые логические микросхемы (ППЛМ). Современные ППЛМ достигли + достаточного объема, что бы на них можно было строить процессоры. А это + означает, что любой человек, имеющий достаточный опыт может заняться по- + добным конструированием процессоров. Для этого необходимо иметь лишь со- + ответствующее программное обеспечение, ППЛМ, на которой можно проводить + эксперименты и, естественно, экспериментальный образец компьютера. + Как ни странно, но в настоящее время уже существует компьютер, + на котором можно производить подобные эксперименты. Он разрабатывался + несколько с иной целью и является развитием линии компьютеров + ZX-Spectrum. + Это компьютер - Sprinter. + + Что же такое Sprinter? + Схема компьютеpа основана на большой пеpепpогpаммиpуемой логи- + ческой микpосхеме фирмы ALTERA EPM10K10QC208-4. Подключение периферийных + устройств через ППЛМ позволяет получить высокую гибкость машины по кон- + фигурациям. Пpогpаммиpование ППЛМ осуществляется непосpедственно в мо- + мент включения, а так же пpи пеpезагpузке, что позволяет каpдинально ме- + нять схему в ППЛМ непосpедственно во вpемя pаботы. Это сильно выделяет + архитектуру компьютера из ряда существующих компьютеров и поэтому многие + понятия, присущие обычным машинам, меняют свой смысл. Фактически + компьютер имеет изменяемую архитектуру, в которой возможны изменения во + многих частях схемы. программируемость схемы компьютера позволяет его + полностью изменить, то есть превратить практически в любой компьютер, + основанный на процессоре Z80 или процессоре, с которым Z80 совместим по + своему коду. о это уже тема для отдельной статьи. + + Применительно к нашей задаче компьютер содержит все необходимые + схемы. А именно, ПЛМ, высокоскоростное ОЗУ, подсоединенное мапрямую к + ПЛМ, а так же приферийные устройства и все необходимые элементы для осу- + ществления запуска и тестирования нового процессора. + Таким образом компьютер Sprinter как нельзя лучше подходит для + экспериментов с созданием своего процессора. Естественно, этот процессор + будет ограничен по своим возможностям, набору команд, но он может быть + легко оптимизирован под конкретную задачу. Более того, так как ППЛМ мож- + но перегрузить, схема процессора может быть изменена практически в любую + секунду (время перезагрузки схемы составляет несколько десятых долей се- + кунды). + Все это позволяет снизить время цикла разработки до единиц минут + при экспериментах с новым процессором. + + а сколько реальна описанная здесь схема разработки процессора? + Автором этой статьи были проведены первые эксперименты по созда- + нию своего процессора по RISC архитектуре. Эксперименты однозначно пока- + зали, что объема ППЛМ, установленной в компьютере Sprinter, достаточно + для создания подобного процессора. За основу схемы процессора была при- + нята многостековая архитектура, которая наиболее подходит для FORTH-про- + цессора. + Полученный результат - простой FORTH-процессор, имеющий 4 стека, + тактовую частоту 7MHz и время цикла исполнения команды в 1 или 2 такта. + При этом ПЛМ использовалась далеко не полностью, а низкая тактовая час- + тота процессора обусловлена только отсутствием у его автора опыта созда- + ния процессоров. + + Каковы перспективы подобного процессора? + Естественно, применение разработанного таким образом процессора + внутри компьютера Sprinter довольно ограниченно. Он может позволить лишь + решать дополнительные задачи на Sprinter-е. Ценность разработки может + быть в том, что полученный процессор можно использовать в других уст- + ройствах, разработанных на той же ПЛМ. В специализированных контролле- + рах, например. + + о в нашем случае разработка процессора ведется с целью создания + нового компьютера с новым процессором. Каков этот компьютер? + Предварительное проектное название - Sprinter-II. + Естественно, что он должен быть достаточно мощным, а это значит, + что его основой должна быть память достаточного объема и быстродействия. + В то же время она должна быть достаточно дешевой и распространенной, ес- + ли предполагается, что разработанный компьютер предназначен для массово- + го повторения. + Этим условиям, по нашим оценкам на данный момент, удовлетворяет + память на основе DIMM-ов, которые позволяют организовать доступ к памяти + с частотой до 100MHz и шину данных до 64 бит. + В качестве процессора, в соответствии с нашей установкой ис- + пользуется ППЛМ фирмы ALTERA. Предполагается установка ППЛМ EPF10K20, + имеющей в два раза больший объем, чем EPF10К10, что позволит организо- + вать 32-хразрядный процессор, подобный разработанному 16-тиразрядному. + Кроме этого ряд ППЛМ 10К имеет совместимость по расположению вы- + водов, что позволит установить на место EPF10K20 ППЛМ большего объема, + что позволит организовать еще более мощный процессор. + Разрабатываемый компьютер должен иметь и периферию. В Sprinter-е + все управление периферией осуществляется через ППЛМ, но в случае, если в + ППЛМ располагается процессор, имеет смысл разгрузить ее. Поэтому в про- + екте Sprinter-II предполагается установка второй ППЛМ, предназначенной + чисто для работы с периферией. Это позволит расширить функции периферии + и добавить новые возможности компьютеру. + Таким образом, разрабатываемый компьютер будет иметь полностью + программируемую архитектуру, что позволит менять ее в соответствии с ре- + шаемыми задачами. + + Проект Sprinter-II является одиним из проектов фирмы Петерс-Плюс + и в данный момент находится в начальний стадии разработки. + Производителем компьютеров Sprinter так же является фирма Пе- + терс-Плюс (ранее Петерс). + Информацию по компьютеру Sprinter можно найти в интернете на + сайте фирмы Петерс: www.atlant.ru/peters + + E-mail: ivan_mak@mail.ru + FIDO: 2:5030/529.24 aka 2:5030/776.24 + + 22.05.99 Ivan Mak. + +=== Cut === + + Вай! Протосы атакуют моих зерлингов! Пора сматываться. Ivan. + + - Разводись схемка, больша и маленька.. [ Sprinter-II ] [Forth-CPU] [ZX] + +... My new E-mail: ivan_mak@mail.ru +--- GoldED 2.50+ + * Origin: Рэкталы жили на планете Ренс 2 миллиона лет. (2:5030/529.24) + + ═ ZX.SPECTRUM (2:5090/31.7) ══════════════════════════════════════ ZX.SPECTRUM ═ + Msg : 995 of 1139 -795 +1031 1131 + From : Ivan Mak 2:5030/529.24 25 Mar 98 02:17:38 + To : All 27 Mar 98 02:56:08 + Subj : Sprinter +════════════════════════════════════════════════════════════════════════════════ +Hello All. + +Кpаткая инфоpмация по Sprinter-у. + +Пpоцессоp . . . . . . . . . . . Z84C15 +Тактовая частота . . . . 21MHz/3.5MHz +ОЗУ . . . . . . . . . . . . . . 4096Kb +ПЗУ . . . . . . . . . . . . . . .128Kb +Видео-ОЗУ . . . . . . . . . 256Kb(512) +Контpоллеp дисков . . . . . Кp1818ВГ93 +Поддеpжка 1.44Mb фоpмата 3.5" диска +Контpоллеp IDE винчестеpа +Контpоллеp AT клавиатуpы +Контpоллеp MS-Mouse +Два слота в стандаpте ISA-8 +Железная эмуляция AY-3-8910 +COVOX . . . . . . . . . 8bit x 4chanel + +Видео-pежимы: . . . Spectrum standart + GRAF 320 x 256 x 256 + TEXT 80 x 32 +Выход видео на TV или CGA монитоp. + +Схема компьютеpа основана на большой +пеpепpогpаммиpуемой микpосхеме. +Пpогpаммиpование ПЛМ осуществляется +непосpедственно в момент включения а +так же пpи пеpегpузке, что позволяет +каpдинально менять схему непосpедственно +во вpемя pаботы. + + + +Ivan + +--- GoldED 2.50+ + * Origin: Ректалы жили на Ренсе 2 млн. лет. (2:5030/529.24) + + ═ ZX.SPECTRUM (2:5090/31.7) ══════════════════════════════════════ ZX.SPECTRUM ═ + Msg : 631 of 677 +646 + From : Ivan Mak 2:5030/529.24 28 Apr 98 04:21:44 + To : All 28 Apr 98 23:38:20 + Subj : Sprinter - аpхитектуpа +════════════════════════════════════════════════════════════════════════════════ + Приветствую Вас, All! + + ▄▄▄▄▄▄ + ▄█░░░░░░ + █░░ █░░ + █░░▄▄▄█░░ + █░░░░░░░░ + █░░ █░░ + █░░ █░░ рхитектура компьютера Sprinter. + ▀░░ ▀░░ + + Данное описание предполагает наличие определенных знаний читателя, +а именно знание архитектуры компьютера ZX-Spectrum и их разновидностей, в +частности Pentagon-128 и Scorpion-256, а так же знание языка BASIC и некоторое +знакомство с языком ассемблера Z80. + Здесь я буду называть конфигурацией машины - конкретную +реализацию конкретной схемы в ПЛМ. Это означает, что машина имеет множество +конфигураций, каждая из которых имеет свою схему. + + Процессор Z84C15 и ПЛМ EPF10K10QC208-4 являются ядром машины. Кроме +них на плате присутствуют микросхемa ПЗУ, 72х-пиновый SIMM на 4Mb, видео-ОЗУ, +КЭШ-ОЗУ, схема контроллера дисковода на БИС КР1818ВГ93, буферы для подключения +джойстика, магнитофона, принтера, клавиатуры, дисководов, винчестера, мыши, +буферные микросхемы шины ISA-8 и еще одна ПЛМ фирмы ALTERA - EPM7032LC44-12. Эта +ПЛМ не меняет своей конфигурации и предназначена для обеспечения начального +запуска компьютера. а плате так же предусмотрена возможность подключения CMOS +часов на основе микросхемы DALLAS. Кроме периферии и буферов имеются микросхемы +дешифрации, входы которых подключаются к процессору через ПЛМ. Это позволяет +легко менять адресацию устройств без какого либо изменения разводки печатной +платы. + Схема компьютеpа основаная на большой пеpепpогpаммиpуемой логической +микpосхеме и подключение периферийных устройств через ПЛМ позволяет получить +высокую гибкость машины по конфигурациям. + Пpогpаммиpование ПЛМ осуществляется непосpедственно в момент +включения, а так же пpи пеpегpузке, что позволяет каpдинально менять схему в ПЛМ +непосpедственно во вpемя pаботы. Это сильно выделяет архитектуру компьютера из +ряда существующих компьютеров и поэтому многие понятия, присущие обычным +машинам, меняют свой смысл. Фактически компьютер имеет изменяемую архитектуру, в +которой возможны изменения во многих частях схемы. Так, например, нельзя +говорить о конкретных адресах портов подключения периферии, так как они могут +быть изменены в одну секунду путем перепрограммирования ПЛМ и данных в ОЗУ, +отвечающих за конфигурацию портов. Конкретные адреса появляются только в +конкретных конфигурациях, например, такой как конфигурация ZX-Spectrum. + Перепрограммируемость схемы дает довольно большую свободу +фантазии программиста по конфигурации машины. Задумывая конкретную работу +программист может определить в какой конфигурации ее можно сделать лучше, а, +возможно, и придумать свою конфигурацию, которую затем можно реализовать в ПЛМ и +включить перед запуском этой программы. + Дальнейшее описание архитектуры является описанием конкретных +конфигураций машины. о перед этим следует сказать несколько слов о переключении +конфигураций. + + В момент включения компьютера, а так же после нажатия на RESET вся +информация, находившаяся в ПЛМ и отвечающая за конкретную конфигурацию, +стирается. ПЛМ переходит в режим ожидания загрузки блока данных схемы. + В этот момент процессор полностью отключен от какой либо периферии. +В его адресное пространство памяти оказывается включена одна страница ПЗУ и одна +страница ОЗУ КЭШ-памяти. Любая запись в адресное пространство памяти процессора +в этот момент приводит к записи данных в ПЛМ и программа в подключенной странице +ПЗУ имеет только одну единственную цель - загрузить в ПЛМ данные конфигурации. В +этой же странице ПЗУ находятся данные начальной конфигурации. (В данный момент +это конфигурация Sprinter-1.) Программа загрузки конфигурации проверяет флаг в +КЭШ-памяти и, если он установлен, загружает в ПЛМ данные из ОЗУ, если сброшен, +то данные из ПЗУ. а этом основано переконфигурирование схемы компьютера. + Для изменения схемы надо загрузить в последнюю страницу КЭШ-памяти +блок данных конфигурации со смещения #100 и выставить флаг, которым является +текстовая строка "FLEX_10K_LOADING", записанная по смещению #80 в этой же +странице КЭШ-а. После этого надо произвести полный сброс, который осуществляется +программно записью в специальную страницу памяти RESET_PAGE. Программа в ПЗУ, +запускаемая по сбросу находит флаг FLEX_10K_LOADING и начинает загрузку данных в +ПЛМ. При этом она одновременно затирает флаг, что предотвращает повторную +загрузку новой конфигурации при нажатии на кнопку RESET и позволяет вернуться +после "ручного" сброса в начальную конфигурацию. Затирание флага так же +избавляет от мучений в случае подключения неправильной конфигурации во время +экспериментов с программами. ажатие на RESET всегда вернет схему в начальную +конфигурацию. + + Внутренняя информация блока данных ПЛМ является закрытой +информацией фирмы ALTERA. Кроме самих микросхем ПЛМ ALTERA поставляет и +программное обеспечение для разводки схем внутри ПЛМ. К сожалению, эта программа +не может работать на компьютере типа ZX-Spectrum и в ближайшем обозримом будущем +не предвидится ее версия для Sprinter-а. Поэтому разработка новых конфигураций +может производится только при наличии достаточно мощной машины (все делалось на +Pentium-166) и программы разводки схем в ПЛМ, цена на которую составляет сотни +долларов США. + В связи с этим, в данный момент Sprinter имеет несколько конкретных +конфигураций, две из которых записаны в ПЗУ, а остальные могут быть подгружены с +дискеты или винчестера. Постоянно ведется совершенствование конкретных +конфигураций и разработка новых. + + Конфигурация Sprinter-1. + Включает в себя конфигурацию Spectrum-128/256, распределение памяти +до 4Mb, расширенный экран с режимами Spectrum, Text-80x32, Graf-320x256x256, +контроллер дисковода, контроллер IDE винчестера, контроллер клавиатуры AT, +подключенной как ZX-Keyboard, 8-bit COVOX. + Эта конфигурация максимально приближена к конфогурации ZX-Spectrum +и позволяет работать на обычных спектрумовских программах и постепенно менять их +под расширенные режимы экрана и памяти, а так же для работы с новыми +устройствами. + + Конфигурация Sprinter-2. + Включает в себя конфигурацию Spectrum-128/256, распределение памяти +до 4Mb, расширенный экран с режимами Spectrum, Text-80x32, Graf-320x256x256, +контроллер дисковода, контроллер IDE винчестера, контроллер клавиатуры AT, +подключенной как ZX-Keyboard, Accelerator. + Конфигурация, как и Sprinter-1 приближена к спектрумовской, но +имеет более жесткие требования к программам по совместимости. Позволяет +использовать акселератор операций с основным и видео-ОЗУ. Акселератор ускоряет +операции пересылки блоков данных и заполнения ОЗУ одним байтом до физического +предела скорости основного ОЗУ. + + Конфигурация ZX-Spectrum-256/AY. + Эта конфигурация максимально приближена к ZX-Spectrum-128/256 +и включает в себя схему музыкального сопроцессора AY-3-8910. В этой конфигурации +отсутствуют расширенные режимы экрана. + Вторая версия схемы AY включает в себя три генератора голосов, +генератор шума и регуляторы амплитуды. Генератор огибающей отсутствует. Так же +отсутствует возможность чтения из портов данных сопроцессора. + В третьей версии AY предполагается данные недостатки исключить. + + Конфигурация Sprinter-3. + Конфигурация отвязана от конфигурации ZX-Spectrum. Полностью +отключается ПЗУ и все адресное пространство разбито на четыре окна по 16k, в +каждое из которых подключается любая из 256-ти страниц ОЗУ. Отсутствует +спектрумовский экран, графический экран такой же, как в конфигурациях Sprinter-1 +и Sprinter-2. Имеет дополнительные функции акселератора. Позволяет производить +операции AND, OR и XOR с блоками данных. Имеет 8-bit COVOX. + В дальнейшем предполагается подключение в этой конфигурации +спринтеровской звуковой карты. + + Ivan, с Большим Приветом. + + ZX-Spectrum-у - #10 лет ! + Ба-а ! Мне скоро будет #20 ! + +--- GoldED 2.50+ + * Origin: Рэкталы жили на планете Ренс 2 миллиона лет. (2:5030/529.24) + + ═ ZX.SPECTRUM (2:5090/31.7) ══════════════════════════════════════ ZX.SPECTRUM ═ + Msg : 1961 of 1989 -1942 + From : Ivan Mak 2:5030/529.24 15 Jan 98 01:05:46 + To : Max Romanoff 20 Jan 98 00:26:02 + Subj : Sprinter +════════════════════════════════════════════════════════════════════════════════ + ░▒▓██ Рад приветствовать Вас, Max ! ██▓▒░ + +█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ +█ Когда-то, Tuesday January 13 1998 23:40, Max Romanoff +█ писал для Ivan Mak: + + IM>> Дa. Стоить будут - 590p. + + MR> 100$ - стоит a500. Причём готовый комп, в который не нaдо для + MR> рaботы ничего стaвить и покупaть. +Вот только воьможностей у A500 меньше чем у Sprinter-a. :) +Потому ты и испугался кинуть сюда ответы на мои вопpосы. :))) +Да и не ZX-Spectrum эта AMIGA вовсе. + +А у Sprinter-a так. +Пpоцессоp 8 pазpядов, 21MHz. +ОЗУ - 4Mb. Скоpость заливки пикселей на экpане в 256-цветном гpафическом pежиме + до 7 млн. пикселей в секунду. +Скоpость пеpесылки данных из памяти в память (в том числе в видео) + до 3.5 млн. байт в секунду. +Контpоллеp HDD. +Контpоллеp FDD - диски до 1.44 Mb. + + ░▒▓██ С уважением, Ivan. ██▓▒░ + +TR-DOS 5.04Ei + +--- GoldED 2.50+ + * Origin: Рэкталы жили на планете Ренс 2 миллиона лет. (2:5030/529.24) + + sprinterC \ No newline at end of file diff --git a/docs/part2/forum.txt b/docs/part2/forum.txt new file mode 100644 index 0000000..4438c43 --- /dev/null +++ b/docs/part2/forum.txt @@ -0,0 +1,2524 @@ +Форум + +“Программирование Спринтера» + + + + + + + +Оглавление: + +Экран и палитра 2 + +Шрифты 7 + +Память 10 + +Файлы 14 + +Звук 16 + +ISA-8 слоты 18 + +Summary 18 + +More information 18 + +Акселератор компьютера Sprinter. 20 + +Прерывания 22 + +IDE контроллер 23 + +FDD контроллер 24 + +Клавиатура 25 + +Коды ошибок DSS 27 + + + +Экран и палитра + + + + Denis Parinov + + (Sprinter Team) + + 2002/10/02 00:57 + + Re: Графические режимы [re: Shiru_Otaku] + + + + + + + + Функции для работы с экраном: + + + + Сейчас DOS поддерживает четыре режима экрана. + + Два текстовых: + + 40x32 символов c 16 цветами (режим 02h); + + 80x32 символов c 16 цветами (режим 03h); + + и два графических: + + 320x256 точек с 256 цветами (режим 81h); + + 640x256 точек с 16 цветами (режим 82h); + + Основным режимом является текстовый режим 80x32 (03h), если вашапрограмма + +работает в другом режиме, то вам следует перед переключением режимаполучить + +номер текущего режима функцией 51h GETVMOD и сохранить его, а передзавершением + +программы восстановить его. + + + + Например: + + + + LD C,51h ;получить режим экрана + + RST 10h + + LD C,A ;поместить номер режима экрана в регистр C + + PUSH BC ;и сохранить на стеке (B - страница, C - режим) + + . + + . ;ваша программа + + . + + + + POP BC ;взять со стека режим экрана + + LD A,C ;поместить номер режима экрана в регистр A + + LD C,50h ;установить режим экрана + + RST 10h + + LD C,41h ;завершить программу. + + RST 10h + + + + DSS имеет функции вывода на текстовый экран символов и символьных строк.Для + +графических режимов требуются собственные процедуры вывода на экран.Например, + +при завершении программы вы можете выдать строку на текстовый экран: + + + + + + LD HL,STRING ;указатель на строку символов + + LD C,5Ch ;вывод строки символов + + RST 10h + + + +STRING DB "Thank you for using my program..." ;текстовая строка + + DB 13,10 ;символы возврата каретки и перевода строки + + DB 0 ;символ конца строки + + + + Для вывода на графический экран, вам необходимо подключить видео память водно + +из трех окон памяти 04000h-07FFFh, 08000h-0BFFFh, 0C000h-0FFFFh. Этоосуществля- + +ется выводом значения 50h в соответствующий порт 0A2h, 0C2h или 0E2h в + +зависимости от окна памяти. При подключении обратите внимание на то, чтобыстек + +вашей программы не попадал в это адресное пространство. + + + +  + +Например, если вам нужно поставить точку на экране, то подпрограмма длярежима + +81h будет выглядеть так: + + + +; HL - горизонтальная координата + +; DE - вертикальная координата + + + + IN A,(0E2h) ;считать из порта номер страницы подключенной в + + ;третье окно памяти + + LD C,A ;запомнить в регистре C + + LD A,50h ;страница видео памяти + + OUT (0E2h),A ;подключение видео памяти + + LD A,E ;поместить вертикальную координату в регистр A. + + OUT (89h),A ;выдать в порт + + LD DE,0C000h ;адрес начала третьего окна памяти + + ADD HL,DE ;получить адрес точки (адрес начала окна + + + ;горизонтальная координата) + + LD A,255 ;цвет выводимой точки (от 0 до 255) + + LD (HL),A ;вывод точки на экран + + LD A,C ;вспомнить номер страницы памяти + + OUT (0E2h) ;подключить страницу памяти вместо страницы видео + + ;памяти + + + + Перед выводом точек следует установить необходимые цвета в палитре.Различные + +режимы вывода на экран задаются номером видео страницы от 50h до 5Fh.Подробнее + +о режимах вывода вы можете прочитать в описании архитектуры компьютера. + + + + 50h (80) SETVMOD (Выбор режима экрана) + + + +входные данные: + + + + A - режим экрана + + 02h - текстовый 40x32x16 цветов + + 03h - текстовый 80x32x16 цветов + + 81h - графический 320x256x256 цветов + + 82h - графический 640x256x16 цветов + + B - страница экрана 0/1 + + C - 50h + + + +выходные данные: + + + + A - код ошибки, если CF=1 + + + + Функция устанавливает режим экрана. Седьмой бит режима экрана установлен + +для графических режимов и сброшен для текстовых. Существуют два текстовыхрежима + +и два графических. + + + + + + 51h (81) GETVMOD (Получить текущий режим экрана) + + + +входные данные: + + + + C - 51h + + + +выходные данные: + + + + A - текущий режим экрана + + B - страница экрана 0/1 + + + + Функция возвращает текущий режим экрана и номер страницы экрана. + + + +  + + Anonymous + + (Unregistered) + + 2003/03/01 10:13 + + + + Здравствуйте. А как с палитрами??? Как загрузить произвольную + + палитру (отдельный цвет). Желательно с исходником. + + Почему системная палитра выглядит по разному в эмуляторе и реальном + + Спринтере. + + + + Alex_Goryachev + + (Sprinter Team) + + 2003/03/01 12:51 + + + + Пример из исходников Антона Енина ( + + http://www.petersplus.com/download/sources/aprint.zip ) + + + + + +;[]=======================================================================[] + +; palette from Flex Navigator + +CustomPalette: + + db 0x00, 0x00, 0x00, 0x00 ; Black 00 + + db 0x00, 0x00, 0xFF, 0x00 ; B.Red 01 + + db 0x00, 0x80, 0x00, 0x00 ; Green 02 + + db 0x00, 0xFF, 0xFF, 0x00 ; B.Yellow 03 + + db 0x80, 0x00, 0x00, 0x00 ; Blue 04 + + db 0xFF, 0xFF, 0x00, 0x00 ; Invert bg 05 + + db 0x80, 0x00, 0x00, 0x00 ; Invert fg 06 + + db 0x80, 0x80, 0x80, 0x00 ; BlackGray 07 + + db 0xC0, 0xC0, 0xC0, 0x00 ; HighGray 08 + + db 0x80, 0x00, 0x00, 0x00 ; Panel 09 + + db 0xFF, 0xFF, 0x00, 0x00 ; Files 0A + + db 0x00, 0xFF, 0xFF, 0x00 ; Select Files 0B + + db 0x00, 0xFF, 0xFF, 0x00 ; InvSel Files 0C + + db 0xC0, 0xC0, 0xC0, 0x00 ; Reserved 0D + + db 0xFF, 0xFF, 0xFF, 0x00 ; White 0E + + db 0xFF, 0xFF, 0xFF, 0x00 ; White 0F + + + +;[]=======================================================================[] + +;[]=======================================================================[] + +; set requist video mode 640x256x16 + +SetVideoMode: + + ld c, 0x51 ; save previos vmode + + rst 0x10 + + ld (vmode + 1), a + + ld a, b + + ld (vscrn + 1), a + + sub a + + call CrearVideoRam + + ld bc, 0x0050 ; set 640x256x16 + + ld a, 0x82 + + rst 0x10 + + ld hl, CustomPalette + + ld de, 0x1000 + + ld bc, 0xFFA4 + + sub a + + rst 0x08 ; load palette + + ret + + + +;[]=======================================================================[] + + + +  + + + + Denis Parinov + + (Sprinter Team) + + 2003/03/02 02:47 + + Re: Графические режимы [re: Anonymous] + + + + + + + + > Здравствуйте. А как с палитрами??? Как загрузить произвольную + + палитру + + (отдельный цвет). Желательно с исходником. + + + + + +;Установить 5-й цвет "средне-зеленым" + + LD HL,COLOUR + + LD DE,#0105 + + LD BC,#FFA4 + + XOR A + + RST #08 + + + +; B G R + +COLOUR DB #00,#80,#00,#00 + + + + + +;Изменить все 256 цветов в палитре + + LD HL,COLOURS + + LD DE,#0000 + + LD BC,#FFA4 + + XOR A + + RST #08 + + + +;Параметры цвета + +; B G R + +COLOUR DB #00,#80,#00,#00 + + + +;Палитра + +COLOURS DB #00,#00,#00,#00 ;Colour 0 + + DB #00,#00,#80,#00 ;Colour 1 + + DB #00,#80,#00,#00 ;Colour 2 + + DB #00,#80,#80,#00 ;Colour 3 + + ... + + DB #FF,#FF,#FF,#00 ;Colour 255 + + + + + +> I set A=0 in the SCROLL call, expecting this to clear the bottom line, + +but this did not happen, so I had to add a CLEAR call as well. Is this a + +bug, or did I misunderstand the documentation? + + + +Unfortunately, I can't check it on Sprinter now. But source code of the + +SCROLL function looks good. I will check it as soon as possible. + + + +> For the cursor, I am just doing RDCHAR and then WRCHAR with all the + +attribute bits inverted. This gives me a solid cursor block (if over a + +space) or an inverted blinking character (if over a character). This is + +fine, but I may like to try and improve the appearance, so it is always + +solid or always flashing. Can you give me some information on what the + +attribute values represent? + + + +We use standard CGA / VGA text colors by default. It can be changed in the + +palette. + + + +Text attributes + + + +bit 7 - Blink symbol + +bits 6,5,4 - Background color (8 colors) (0...7) RGB + +bits 3,2,1,0 - Ink colors (16 colors) (0...15) IRGB + + + +Colors used for Background and Ink + + + + 0 0h 0000b - Black + + 1 1h 0001b - Blue + + 2 2h 0010b - Green + + 3 3h 0011b - Cyan + + 4 4h 0100b - Red + + 5 5h 0101b - Magenta + + 6 6h 0110b - Brown + + 7 7h 0111b - White + + + +Colors used for Ink only + + + + 8 8h 1000b - Gray + + 9 9h 1001b - Bright Blue + +10 Ah 1010b - Bright Green + +11 Bh 1011b - Bright Cyan + +12 Ch 1100b - Bright Red + +13 Dh 1101b - Bright Magenta + +14 Eh 1110b - Yellow + +15 Fh 1111b - Bright White + + + +Как я понял, сейчас есть проблема с выводом на экран. + +Попробую расписать схему видео-вывода на словах. + + + +Режим адресации. Задается номером страницы. + +Если номер 5Xh - адресация графическая. + +Если номер не 5Xh - адресация спектрумовская, и она включена все время, даже если в соседней странице включился номер 5Xh. + + + +Спектрумовская адресация, это доступ к видеопамяти на запись в адресах 4000h..5FFFh или в 4000h - 7FFFh, в зависимости от состояния порта PORT_Y (89h). + + + +Бит 6 = 1 - отключает вывод в спектрумовское окно памяти. + +Бит 7 = 1 - расширяет спектрумовское окно с 8Kb до 16Kb + + + +Бит 4..0 - пределяет 8kb банк спектрумовского режима. + +Эти банки располагаются "вертикально", т.е. такой банк соответствует 32-м последовательным точкам на графической линии и 256-ти линиям. + + + +Сначала я чаще всего использовал окно 4000h..7FFFh для работы с графикой, поэтому получилось так, что графическая адресация перекрывала спектрумовскую при включении в порт A2h значения 5Xh, а выше 8000h использовалось программой, потом, когда стали использовать для вывода на экран страницу 0C000h, получилось так, что в странице 4000h оставалась открыта видеопамять со спектрумовской адресацией, а порт 89h используется и там и там, но с разным назначением. + + + +Т.е. после открытия страницы 0C000h для графики остается открытой и спектрумовский способ адресации видеопамяти в странице 4000h..7FFFh... + +P.S. Надеюсь, что не запутал все окончательно... + + + +Шрифты + + Alex_Goryachev + + (Sprinter Team) + + 2002/05/28 11:44 + + Re: Несколько наборов шрифтов одновременно [re: Shaos] + + + + Вот ответ, полученный от Ivan Mak. + + + + === Cut === + + + + Через Bios: + + + + IX - 32-хбайтовый описатель окна + + (искать в описании, здесь только только самое важное) + + ........ + + (IX+4) - режим знакоместа + + bit4=1 - text_mode + + bit5=0 - 16, bit5=1 - 8 точек в знакоместе (80/40 символов) + + bit7..6,3..0 - номер знакогенератора + + исключение: bit7..6=B"11" - бордер + + ....... + + Он же (IX+4) - номер используемого знакогенератора в этом окне, он + + же + + регистр B в функциях B4,B5 + + + + Функция B0 открытие окна использует описатель, в котором указан + + знакогенератор, открытый для всех символов данного окна. Он может + + быть + + перебит прямой записью в видео-память или фунцией B5, которая пишет + + символ + + со знакогенератором. При использовании функции B0 четвертый бит + + регистра E + + определяет, какая страница режима будет использоваться. Для работы с + + двумя + + страницами надо открывать окно два раза со значениями 0 и 1 в 4-м + + бите рег.E + + + + ================================= + + 0B4h (180) WIN_GET_SYM Взять символ с экрана + + + + Значение регистров на входе: + + C=0B4h + + A - идентификатор окна (д.б. 0) + + DE - положение символа в окне: + + D - вертикаль, E - горизонталь + + Значение регистров на выходе: + + NC - нормальное завершение + + L - символ, H - атрибут, + + B - знакогенератор + + CF - ошибка неверный идентификатор окна + + + +  + + ================================= + + 0B5h (181) WIN_PUT_SYM Положить символ на экран + + + + Значение регистров на входе: + + C=0B5h + + A - идентификатор окна + + DE - положение символа в окне: + + D - вертикаль, E - горизонталь + + L - символ, H - атрибут символа + + B - знакогенератор + + Значение регистров на выходе: + + NC - нормальное завершение + + CF - ошибка неверный идентификатор окна + + + + ================================= + + 0B6h (182) WIN_SET_ZG Установка знакогенератора + + + + Значение регистров на входе: + + C=0B6h + + A - системный номер знакогенератора + + DE - указатель на 2Kb данных знакогенератора + + Значение регистров на выходе: + + NC - нормальное завершение + + CF - ошибка (старая версия, нет функции) + + + + ================================= + + 0B8h (184) WIN_GET_ZG Получение знакогенератора + + + + Значение регистров на входе: + + C=0B8h + + DE - адрес, куда будет загружено 2kb знакогенератора + + Значение регистров на выходе: + + NC - нормальное завершение + + CF - ошибка (старая версия, нет функции) + + + + Функция копирует имеющийся знакогенератор из ПЗУ + + ================================= + + + + Для работы напрямую, окна должны быть открыты биосом, + + знакогенераторы установлены. + + + + Вывод символов осуществляется в графическом режиме адресации, через + + страницу 50h. В порт 89h записывается номер символа, адрес в линии + + определяет строку. В этот адрес записывается четыре байта, + + определяющих + + символ, атрибут и знакогенератор. + + + + Bytes: + + byte0 - знакогенератор/режим то же, что в (IX+4) + + byte1 - символ + + byte2 - атрибут + + byte3 - reserved (заполнить нулями) + + + + Port_Y - номер линии засылаемый в порт 89h + + линия 1+S S=0..79 - номер символа в строке для экрана 0 + + линия 128+S S=0..79 - номер символа в строке для экрана 1 + + (S=0 - выводит символ слева) + + + +  + + Adress: в линии 768+N*4 - N - номер строки экрана 0..31. + + Адрес одинаков для обоих экранов. + + (N=0 выводит символ сверху) + + + + В режиме 40 символов, номера строк через один: 1,3,5...79 + + + + Экраны переключаются нулевым битом порта 0C9h + + + + === Cut === + + + + + + --- + + PETERS PLUS LTD + + + + + +---------------------------------------------------------------- + +Текстовый экран устроен на удивление просто: в области описания экрана в текстовом режиме на один символ отводится 4 байта (номер знакогенератора, код символа, атрибут и один неиспользуемый байт), причем надо обратить внимание на то, что в этом режиме экран "повернут на бок". Что-бы вывести символ на экран, надо в Port_Y (0x89) записать 128+номер символа в строке (от 0 до 79), затем к адресу начала экранной страницы прибавить 768 (для первого экрана), после чего мы получим адрес байта, в котором хранится номер знакогенератора для вывода символа (поменяйте его, если это необходимо), увеличиваем адрес на один и туда записываем уже код самого символа, а в следующий байт - атрибут этого символа. Что-бы перейти на следующую строку текстового экрана, надо прибавить к адресу начала экранной страницы число 4*номер строки. Используя акселератор (команду копирования вертикальной линии) можно очень быстро выводить текст строки на экран. + + + +Остается только добавить что прямой доступ к области описания экрана не рекомендован разработчиками, т.к. есть веротяность потери совместимости со следующими моделями, где символы могут описываться подругому. Но если вам необходима большая скорость вывода на экран в текстовом режиме и вы готовы после выпуска программы вносить в неё изменения для обеспечения совместимости со следующими моделями, либо выложить исходники программы, что-бы желающие могли их исправить при необходимости, то, мне кажется можно использовать прямой доступ. + + + +--- + +Mac Buster^Extreme Entertainment + + + + + +Also use BIOS fn. 0B6h for set new font and 0B8h for get current font. + +Font format like first 2K bytes of spectrum screen. You can load font at the 4000h address in ZX mode and see it. + +for example, char "A" will placed in the memory as + + + +offset bytes + +0041h 00000000b + +0141h 00111100b + +0241h 01000010b + +0341h 01000010b + +0441h 01111110b + +0541h 01000010b + +0641h 01000010b + +0741h 00000000b + + + + + +Память + + Denis Parinov + + (Sprinter Team) + + 2002/08/28 22:11 + + Re: Манаджмент памяти [re: cr0acker] + + + + + + + + > В конфигурации спринтер + + > по #0000..#3FFF, при работе ДСС находится сама ДСС с её Резетами, + + тет + + чтоб использывать когда сюда подставленна страница пользователся + + резеты не доступны!. + + + + Это так в нижних 16K находится DSS / BIOS в остальных 48К + + приложение, но с + + определенными особенностями. Стек не должен быть выше #BFFF при + + вызове DSS и ниже #8000 при вызове некоторых функций BIOS. + +В следующих версиях DSS планируется снятие ряда ограничений на стек + +и расположения данных при вызове ее функций. + + + + > Теперь адресса #4000..#7FFF,#8000..#BFFF,#C000..#FFFF, когда ДСС + + передаёт управление эти прогораммам, какие банки там нахадятся по + + умолчанию? + + + + В зависимости от адреса загрузки и размера приложения DSS выделяет + + необходимое число страниц памяти. Так при размере меньше 16К будет + + выделена + + одна страница, при размере больше 16К - две, и т.д. В окна с + + "неиспользуемым" адресном пространством будет подключатся + +специальная страница #FF.Если приложению требуется памяти больше чем + + зарезервировано в exe-файле, оно должно выделить себе дополнительный + +блок памяти самостоятельно. + + + +> Теперь память можно челкать по портам #7FFD,1FFD или нет? + +> И если да, то как типа in #&7FFD,(номер страницы). + + + + Напрямую память можно счелкать через 4 порта памяти: + + #82 - #0000-#3FFFF + + #A2 - #4000-#7FFFF + + #C2 - #8000-#BFFFF + + #E2 - #C000-#FFFFF + + + + Записывая физический номер страницы в порт. Список номеров + +физических страниц для выделенного блока памяти можно получить через + +BIOS. + + + + > Также хотеловсь бы увидет пример по использывани фции 38х Setwin! + + + + SETWIN работает с логичискими страницами. + + + +  + + 38h (56) SETWIN (Подключение страницы памяти) + + + +входные данные: + + + + A - идентификатор блока памяти + + B - номер страницы в блоке (0,1,2...) + + H - биты 6 и 7 задают номер окна, в которое будет подключена страница + + C - 38h + + + +выходные данные: + + + + A - номер страницы, если CF=0 + + A - код ошибки, если CF=1 + + + + Функция вычисляет физический номер страницы в блоке памяти и подключаетеё + +в окно адресного пространства в зависимости от значения регистра HL. Тоесть, + +если HL указывает на адрес в пределах от 04000h до 07FFFh, то страница + +подключается в первое окно, от 08000h до 0BFFFh - второе окно, от 0C000hдо + +0FFFFh - третье. + + На выходе в регистре A содержится физический номер страницы, которая + + + +была подключена до выполнения функции. + + + + + + + + Выделить блок памяти 32К и подключить его страницы в #8000 и #C000 + + окна: + + + +; + + LD C,#3D ;GETMEM + + LD B,2 ;BLOCK 32K + + RST #10 ;SYSTEM CALL + + JR C,ERROR ;MEMORY ALLOCATION ERROR + + + + LD (MEMHND),A ;SAVE MEMORY HANDLE + +; + + LD HL,#8000 ;FRAME ADDRESS + + LD C,#38 ;SETMEM + + LD B,0 ;FIRST MEMORY PAGE + + LD A,(MEMHND) ;MEMORY HANDLE + + RST #10 ;SYSTEM CALL + + JR C,ERROR ;MEMORY ALLOCATION ERROR + +; + + LD HL,#C000 ;FRAME ADDRESS + + LD C,#38 ;SETMEM + + LD B,1 ;SECOND MEMORY PAGE + + LD A,(MEMHND) ;MEMORY HANDLE + + RST #10 ;SYSTEM CALL + + JR C,ERROR ;MEMORY ALLOCATION ERROR + +; + + + + > Заранне спасибо + + + + + +  + + Denis Parinov + + (Sprinter Team) + + 2002/08/31 00:43 + + Re: Манаджмент памяти [re: cr0acker] + + + + + + + + > Во! Пасибо большое? А еслищёлкать портами то есть возможномть что + + программа будет совместима с будущей версией ПЗУ/АЛТЕРЫ/ДСС/ПЛАТЫ? + + + + Да, в любом случае будет возможность запуска программ в той + + конфигурации для которой она была написана. Что-то вроде режима + + совместимости. Но если для программы не критично работа напрямую + + через порты, лучше пользоваться SETWIN как более универсальный. + + + + >> Так при размере меньше 16К будет выделена одна >страница, при + + размере больше 16К - две, и т.д. В окна с "неиспользуемым" адресном + + пространством будет >подключатся специальная страница #FF. + + + + > Какие физические номера этих страниц к приме 1,2,3,,,256! + + + + Это можно узнать через функцию BIOS, эти номера будут разными в + + зависимости от того сколько памяти было выделено другим приложениям. + + + + Denis Parinov + + (Sprinter Team) + + 2002/08/31 00:50 + + Re: Манаджмент памяти [re: cr0acker] + + + + + + + + > Денис а такой вариант выделения памяти будет работать? + + > START + + > ORG #4000 + + > NOP + + > ORG #8000 + + > NOP + + > ORG #C000 + + > nop + + > Дальше нужный орг и прога! + + + + Да, если конечно будет записан код от #4000 до конца программы, а не + + от последнего ORG, как это делают некоторые ассемблеры. + + Еще одно замечание, для DSS1.xx exe-файлы могут начинаться с #4100, + + но после запуска можно использовать память с #4000. + + + + + + + +  + + cr0acker + + (enthusiast) + + 2003/07/19 22:34 + + Непонятки. [re: Denis Parinov] + + + + + + + + В документации по спринтеру, есть такая фраза: + + #82 - PAGE0 - страница ОЗУ, подключаемая вместо ПЗУ через порт + + #1FFD. + + Что-бы это значило? + + ld a, номер_подключаемой_страницы + + out (#82),a + + ld a, _что?_ + + out (#1ffd),a + + + + + + + + Denis Parinov + + (Sprinter Team) + + 2003/07/20 00:39 + + Re: Непонятки. [re: cr0acker] + + + + + + + + LD A,1 ;RAM #0000-#3FFF + + LD BC,#1FFD + + OUT (C),A + +; + + LD A,0 ;ROM #0000-#3FFF + + + + LD BC,#1FFD + + OUT (C),A + + + +Fast-RAM включается подобно КЭШ-памяти в 'Пентагоне'. + +Включение/выключение происходит с помощью кода: + + + + DI + + IN A,(#FB) ; включить Fast-RAM - 16к в 0-е окно + + ; (в адреса #0000..#3FFF) + + ......... ; your programm + + IN A,(#7B) ; выключить Fast-RAM + + EI + + + +Если надо использовать прерывания, программа должна установить + +свой обработчик в адрес #0038 + + + +Следует иметь в виду, что Fast-RAM может быть использована другими + +программами, т.е. при запуске некоего процесса через DSS содержание + +Fast-RAM может не сохраниться. + + + +Перед вызовом функций DSS и BIOS Fast-RAM надо отключать. + + + +Файлы + + Denis Parinov + + (Sprinter Team) + + 2002/06/26 12:58 + + Re: Оргинизация памяти [re: cr0acker] + + + + + + + + > И ещё аопрос по функции 16h подскажите плз намера атрибутов в + + частномти можно ли узнать размер файла этой функцией? + + + + Размер файла можно узнать с помощью функции 15h. + + + + + + 15h (21) MOVE_FP (Перемещение указателя в файле) + + + +входные данные: + + + + A - файловый манипулятор + +HL:IX - смещение указателя в файле + + B - способ перемещения + + B=0 от начала файла + + B=1 от текущего значения указателя + + B=2 от конца файла + + C - 15h + + + +выходные данные: + + + + A - код ошибки, если CF=1 + +HL:IX - новое значение указателя + + + + HL:IX интерпретируется как 32-битное число. Если число меньше 65536, + +регистр HL содержит 0. Возможны следующие способы перемещения указателя: + + + + B=0 Смещение считается от начала файла, если HL:IX=0, указатель + +устанавливается на начало файла. + + + + + + B=1 Смещение считается от текущего значения указателя. + + + + B=2 Смещение считается от конца файла, если HL:IX=0, послеперемещения + + HL:IX получится длина файла в байтах. + + + + + + + + Атрибуты файла: + + + + Каждый бит байта атрибутов задаёт определённый атрибут файла. + + Атрибуты + + файлов можно изменять специальной функцией ДОС. + + + + бит 0 - Только для чтения + + бит 1 - Скрытый + + бит 2 - Системный + + бит 3 - Метка тома + + бит 4 - Каталог + + бит 5 - Архивный + + бит 6 - Не используется + + бит 7 - Не используется + +  + + Атрибут "только для чтения". При значении 1 из файла можно читать, + + но в + + него нельзя писать и его нельзя стереть. + + Атрибут "скрытый". При значении 1 файл невиден для обычных операций + + ДОС. + + Атрибут "системный". Указывает, что файл является системным. + + Атрибут "метка тома". В старых версиях MSDOS использовался для + + задания + + метки диска. + + Атрибут "каталог". При значении 1 идентифицирует файл как каталог, + + подчинённый данному каталогу или элементы "." и "..". + + Атрибут "архивный". Этот бит устанавливается при операциях записи в + + файл. + + Его могут использовать утилиты создающие архивные копии для + + сохранения + + изменённых файлов. + + + + + + + +Звук + + Ivan_Mak + + (Sprinter Team) + + 2002/09/13 04:28 + + Re: Программирование звука [re: Shaos] + + + + + + + + Звук через COVOX-Blaster (COVOX с буферным ОЗУ) + + + + CBL=COVOX-Blaster + + + + Порт управления: 004Eh (16-bit port!!!, писать только через OUT + + (c),reg) + + + + ; bit 7 - COVOX-Blaster on (если 0 то обычный режим COVOX) + + ; bit 6 - STEREO-mode on + + ; bit 5 - 16bit-mode on + + ; bit 4 - Interrupt on - включение прерываний + + + + ; bits 3..0 - частота + + ; + + ; 0 16khz -- mono/stereo --- это старые режимы -- не использовать! + + ; 1 22khz -- mono/stereo --- это старые режимы -- не использовать! + + ; 2 reserved + + ; 3 reserved + + ; 4 reserved + + ; 5 reserved + + ; 6 reserved + + ; 7 reserved + + ; + + ; 8 7.8125 KHz -- mono/stereo 8/16 bit + + ; 9 10.9375 KHz -- mono/stereo 8/16 bit + + ; A 15.625 KHz -- mono/stereo 8/16 bit + + ; B 21.875 KHz -- mono/stereo 8/16 bit + + ; C 31.25 KHz -- mono/stereo 8/16 bit + + ; D 43.75 KHz -- mono/stereo 8/16 bit + + ; E 54.6875 KHz -- mono/stereo 8/16 bit + + ; F 109.375 KHz -- mono/stereo 8/16 bit + + + + Порт 0FEh - биты запроса прерываний от CBL + + + + bit 7 - запрос данных для CBL + + bit 5 - синхронизация экрана (кадровый импульс, 4мс длиной, 20мс + + период) + + + + + + Запись данных в COVOX-Blaster производится с помощью акселератора, + + записью в страницу ОЗУ 0FDh (просто записать блок 128/256 байт с + + адреса 0C000h) + + или через порт 4Fh командами OTIR блок записываемых данных по + + запросу. Для 8 бит режима - 128 байт; для 16 бит - 256 байт + + + + + +  + + Самый простой пример: + + + + + +Test: + + LD BC,04Eh + + LD A,8Bh ; включить 8 бит 22khz mono + + OUT (C),A ; - CBL - включен! + + INC C + + LD HL,Sample + + OTIR ; загрузить все 256 байт + + RET + + + +Sample: + + DB 80h,81,82h,.... ; (256 отсчетов звука с нулем на уровне 80h) + + + + + + + + + + + + Должен пищать одну ноту (если в Sample записать синус, то должно + + чисто звучать). + + + + + + Запрос данных в бите 7 порта FE появляется для каждых 128 байт (256 + +в режиме 16 бит). Его следует проверять, если его не оказалось, то + + прерывание экранное, а не от CBL. + + + + При выставленных прерываниях от CBL, стоит использовать режим IM 2, + + иначе, будет часто вызываться DOS-овая процедура прерываний и могут + + появиться тормоза на высоких частотах. + + + + + + В режиме 8 бит сэмплы должны иметь уровень нуля на 80h, + + 16 бит сэмплы - уровень нуля - 0000h + + Stereo-сэмплы - должны иметь чередующиеся отсчеты левого и правого + + канала. + + + + + +mono_8bit: + + DB 80h,81h,7Fh.... + + + +mono_16bit: + + DW 0,1000,-1000... + + + +stereo_8bit: + + DB 80h,80h,81h,80h,7Fh,80h... ; здесь один канал играет, второй молчит + + + +stereo_16bit: + + DW 0,0,1000,0,-1000,0... ; аналогично, один канал играет, второймолчит + + + + + + + + + + (При тестировании 16 бит режима следует помнить, что звук с + + амплитудой в единицы почти не слышен) + + + + P.S. Формат данных выбран так, что бы из WAV-файлов данные в CBL + + пересылать простой операцией блочной пересылки. + + + + + +ISA-8 слоты + +Summary + +This article describe ISA-8 interaction. + +More information + +If you want to interaction with ISA devices, you have to make following steps: + +1) send 10h value to port 1FFDh(system port); + +2) send control byte to port 0E2h(third memory window port); + +control byte: + +D7...should be 1 + +D6...should be 1 + +D5...should be 0 + +D4...should be 1 + +D3...should be 0 + +D2...specify number of ISA slot + +D1...specify access mode (0 - ISA memory, 1 - ISA ports) + +D0...should be 0 + +The read/write signals are forming from read/write signals memory range 0C000h-0FFFFh. + +And the address lines A13...A0 has taken from processor data-BUS. The other ISA-signals such as RESET, AEN, A19...A14 can be set in port 9FBDh. And default value is 00h. + +port 9FBDh: + +D7...RESET + +D6...AEN + +D5...A19 + +D4...A18 + +D3...A17 + +D2...A16 + +D1...A15 + +D0...A14 + + + +ISA_DIR EQU 9FBDh + +SC_PORT EQU 1FFDh + +PAGE3 EQU 0E2h + + + +SAVE_PAGE DB 0 ;variable for previous status of third memory port + + + +RESET_ISA: ; reset ISA device + + LD C, ISA_DIR + + LD A,0C0h + + OUT (C),A + + CALL Pause_10ms + + LD A,0 + + OUT (C),A + + RET + + + +Pause_10ms: + + LD HL,10000 + +Loop: + + DEC HL + + LD A,H + + XOR L + + JR NZ,Loop + + RET + + + +OPEN_ISA_PORTS: ; open access to ISA + + LD BC,SC_PORT + + LD A,10h + + OUT (C),A + + IN A,(PAGE3) ; read value from memory port + + LD (SAVE_PAGE),A ; save previous status of memory port + + LD A,0D2h ; control byte for (first (upper) ISA slot) + + OUT (PAGE3), A ; opening ISA port address space + + LD C,ISA_DIR + + LD A,0 ; high ISA addresses RESET and AEN signals. + + OUT (C),A + + RET + + + +CLOSE_ISA_PORTS: ; close access to ISA + + LD A,(SAVE_PAGE) + + OUT (PAGE3),A ; restore value of memory port + + LD BC,SC_PORT + + LD A,0 + + OUT (C),A ; + + RET + + + +WRITE_ISA_PORT: + + LD HL,ADRESS_PORT+0C000h ; ISA port address + 0C000h offset 3 + +memory page + + LD A,DATA_OUT ; data for writing + + LD (HL),A ; write data to port which pointered HL + + RET + + + +READ_ISA_PORT: + + LD HL, ADRESS_PORT+0C000h ; ISA port address + 0C000h offset 3 + +memory page + + LD A,(HL) ; read data from port which pointered HL + + RET + +When you work with ISA, the access to third memory page are disabled. If you want to address ISA-memory more than 3FFFh, you should specify high bits in port 9FBDh. + + + + + + Акселератор компьютера Sprinter. + + + + Акселератор предназначен для ускорения операций по пересылке блоков данных в ОЗУ и видео-ОЗУ. + + + + Акселератор позволяет: + + + +- быстро заполнять горизонтальную или вертикальную линию длиной до 256 точек одним цветом (в режиме 640x256 - одинарную/двойную горизонтальную линию длиной до 512 точек) + +- быстро копировать горизонтальную или вертикальную линию длиной до 256 точек (в режиме 640x256 - горизонтальную линию до 512 точек) + +- проводить быстрые операции AND, OR, XOR с блоками памяти. + + + + Акселератор не может работать с блоками данных ПЗУ и Быстрого-ОЗУ. + + + + ОЗУ акселератора является частью внутреннего ОЗУ ППЛМ. + +Операции по пересылке данных производятся путем записи блока данных в это + +внутреннее ОЗУ, а затем копировании его в нужное место ОЗУ из ОЗУ акселератора. + +Блок данных, записываемый в ОЗУ акселератора может иметь различную + +длинну из диапазона 1..256 байт. + + + + После одной записи копирование может производиться несколько раз и, таким + +образом, можно производить заполнение экрана текстурами. + + + + Для заполнения экрана одним цветом используется другой режим + +акселератора. В нем вместо копируемого блока данных из внутреннего ОЗУ + +производится запись данных с шины процессора, которые в этот момент не + +изменяются. + + + + Управление акселератором производится непосредственно из программы. + +Для этого изпользуются команды процессора, которые, фактически, являются + +операциями типа NOP. + + + + LD B,B - выключить акселетарор. + + LD D,D - включить акселератор в режим приема байта размера блока + + далее следует команда типа LD A,dat, где dat и будет новым + + размером блока. Если размер блока был установлен ранее, + + его можно не устанавливать. + + LD C,C - Операция Fill - заполнение одним байтом. Последующая + + команда типа LD (HL),A приведет к заполнению указанного + + ранее количества байт значением A + + LD E,E - Операция Fill для графического экрана - заполнение + + вертикальных линий. + + LD H,H - rezerved + + LD L,L - копирование блока. Последующая команда типа LD A,(HL) + + приведет к заполнению ОЗУ акселератора данными из адреса (HL), + + а команда типа LD (DE),A приведет к перезаписи данных из ОЗУ + + акселератора в ОЗУ или видео-ОЗУ. + + LD A,A - копирование блока для графического экрана подобна команде + + LD L,L, но работает с вертикальными линиями экрана. + + + + + + Пример использования акселератора: + + + + ; Считаем, что экранная страница уже открыта по адресу #C000 + + LD HL,#C040 ; адрес начала линии первого экрана + + LD DE,#C180 ; адрес начала линии второго экрана + + LD BC,#140 ; длина экрана по горизонтали + + DI ; запретить прерывания для работы с акселератором + + LD D,D ; включить акселератор на установку размера блока + + LD A,0 ; установить размер блока - 256 байт + + LD A,A ; установить акселератор на копирование + + ; вертикальных линий. + + LDIR ; копировать + + LD B,B ; выключить акселератор + + EI ; включить прерывания + + + + + + + + Эта часть программы произведет копирование всего содержимого первого экрана на другой. + +Время исполения составляет примерно 26 милисекунд. + + + + Дополнительные функции акселератора (AND, OR, XOR) работают таким же образом. + +Для выполнения логических функций используются команды XOR (HL); OR (HL); AND (HL). + + + + Пример кодирования блока в 256 байт. + + + + LD HL,ADRES_1 + + LD DE,XOR_DAT + + DI + + LD D,D + + LD A,0 ; число байт, которые надо закодировать + + LD L,L + + LD A,(DE) ; взять блок данных в ОЗУ акселератора + + XOR (HL) ; произвести операцию XOR с данными акселератора + + LD (HL),A ; запомнить в ОЗУ результат операции + + LD B,B + + EI + + + + + +Скорость работы акселератора ограничивается только физической + +скоростью работы основного ОЗУ. Определить примерное время работы команды с + +акселератором можно по такой формуле: + + + +Время работы = время работы команды без акселератора + время работы + +акселератора + + + +Время работы акселератора = число пересылаемых байт /7 микросекунд + + + +Во время работы акселератора необходимо отключать прерывания, так как в этот момент изменяется система команд процессора и программа на прерывании не сможет работать корректно. + + + +Прерывания + +Кадровые и клавиатурные прерывания приходят с вектором 0FFh, отличать по биту приема байта в порте клавиатуры, не пришел, значит экран. Возможно, конечно, совпадение но это исключительно редкий случай. + + + +От мыши прерывания не приходят. Сделать можно, но сейчас их нет. Кстати и различие от экранных прерываний можно (и, видимо, надо будет в новой версии) сделать пожестче через прошивку в ПЛМ. + + + +От ISA и других внутренных портов процессора прерывания приходят с другим вектором (настраивается в портах), поэтому в режиме IM 2 они легко различаются. + + + +IDE контроллер + + + +Доступ к поpтам осуществляется пpи неактивном Beta-Disk интеpфейсе. + +Со схемой без поллитpы не pазобpаться, пpивожу поpты как есть: + + + +поpт pегистp накопителя + + + +---- блок командных регистров ---- + +xx50 0 (data) + +0051 1 (error/feature) + +0052 2 (sector count) + +0053 3 (sector number) + +0054 4 (cylinder low) + +0055 5 (cylinder high) + +4052 6 (device/head) + +4053 7 (status/command) + + + +---- блок управляющих регистров ---- + +4054 16 (alternate status/control) + +4055 17 ? + + + +Пpи записи в поpт нужно его адpес увеличить на 0x100. + + + +Пpи чтении pегистpа данных пpи a8=0 выpабатывается стpоб чтения и + +младшая часть (D0-D7) шины данных накопителя выдаётся на шину спектpума, + +а стаpшая сохpаняется в теневом pегистpе. Пpи a8=1 читается теневой + +pегистp (D8-D15). + + + +Пpи записи pегистpа данных когда a8=0 байт сохpаняется в теневом pегистpе + +и стpоб записи для накопителя не выpабатывается. Пpи записи pегистpа данных когда + +a8=1 выpабатывается стpоб записи для накопителя и байт с шины спектpума выдаётся на + +D8-D15 шины накопителя, на D0-D7 выдаётся содеpжимое теневого pегистpа. + + + +Контроллер имеет общий теневой регистр для записи и чтения. + + + +вот мои раскопки на эту тему от 13.10.2003: + +- регистр команд | регистр состояния + +4153h запись, 4053h чтение + +- регистр накопителя/головки + +4152h запись, 4052h чтение + +- регистр циллиндра (старший байт) + +0155h запись, 0255h чтение + +- регистр циллиндра (младший байт) + +0154h запись, 0254h чтение + +- регистр данных + +0150h запись, 0050h чтение + + + +Верна информация. + +С одним добавлением. Доступ открыт в режиме Sprinter-ZX, + +а в режимах Pentagon, Scorpion и т.п. - закрыт! + + + +FDD контроллер + +0Fh Command/Status register + +3Fh Track register + +5Fh Sector register + +FFh Drive Control register + + + +In Spectrum configuration the port 0Fh also mapped to 1Fh for TRDOS + +compatibility. + +But I would recommend to you don't use direct port access for it. + +A Sprinter have BIOS functions for reading/writing any disk sectors. + + + +for example: + + + +At first, make reset disk and to set required parameters. + +INIT_DISK + + LD D,n ; drive number 0-FDD A, 1-FDD B, 80h-HDD C... + + LD C,#51 ; reset disk + + RST #08 ; BIOS call + +; + + LD D,n ; drive number + + LD E,n ; sectors per track. + + PUSH DE + + LD A,D + + LD C,#58 ; get disk parameters + + RST #08 ; BIOS call + + LD A,H + + POP HL + + PUSH HL + + LD H,A + + POP AF + + LD IX,256 ; sector size + + LD C,#59 ; set disk parameters + + RST #08 ; BIOS call + + RET + + + +And next to use BIOS fn. 055h for reading. + +DRV_READ: ; reading from disk + + LD A,drv_type ; bit 0..3 - drive number + + ; bit 4..7 - drive type + + ; 0 - FDD + + ; 6 - ram-disk (reserved) + + ; 8 - HDD + + ; C - CD-ROM (reserved) + + LD HL,sec_h ; sector number (high) + + LD IX,sec_l ; sector number (low) + + ; (HL:IX - 32bit sector number, like LBA) + + LD B,n_sec ; sectors count + + LD DE,bufer_adr ; memory address for reading + + LD C,#55 ; + + RST #08 ; CF=0 - read OK + + ; CF=1 - read error + + + + + +Клавиатура + +> How is it done ? + + + +It's possible by DSS function 36h (K_SETUP). Sprinter has two keyboard + +layouts (standard and alternative) which can be switched by [CTRL] + + +[SPACE]. Each layout includes four keyboard modes. You can reload all of + +them. + + LD HL,LAYOUT + + LD A,0 ;LAYOUT FOR NORMAL MODE + + LD BC,#0036 + + RST #10 + +Esc EQU #1B + +Bcs EQU #08 + +Tab EQU #09 + +Cps EQU #00 + +Spc EQU #20 + +Ent EQU #0D + + + +;Normal mode (without CAPS and SHIFT not pressed) + + DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + + DB Tab,"q","w","e","r","t","y","u","i","o","p","[","]" + + DB Cps,"a","s","d","f","g","h","j","k","l",";","'",Ent + + DB #00,"z","x","c","v","b","n","m",#2C,".","/",#00,#5C + + DB #00,#00,Spc,#00,#00 + + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + + DB #00,#00,#00,"/","*","-","+",Ent,#00 + + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + + + +;SHIFT mode (without CAPS and SHIFT are pressed) + + DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs + + DB Tab,"Q","W","E","R","T","Y","U","I","O","P","{","}" + + DB Cps,"A","S","D","F","G","H","J","K","L",":",#22,Ent + + DB #00,"Z","X","C","V","B","N","M","<",">","?",#00,"|" + + DB #00,#00,Spc,#00,#00 + + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + + DB #00,#00,#00,"/","*","-","+",Ent,#00 + + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + + + +;CAPS mode (with CAPS and SHIFT not pressed) + + DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + + DB Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]" + + DB Cps,"A","S","D","F","G","H","J","K","L",";","'",Ent + + DB #00,"Z","X","C","V","B","N","M",#2C,".","/",#00,#5C + + DB #00,#00,Spc,#00,#00 + + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + + DB #00,#00,#00,"/","*","-","+",Ent,#00 + + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + + + +;CAPS+SHIFT mode (with CAPS and SHIFT are pressed) + + DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs + + DB Tab,"q","w","e","r","t","y","u","i","o","p","{","}" + + DB Cps,"a","s","d","f","g","h","j","k","l",":",#22,Ent + + DB #00,"z","x","c","v","b","n","m","<",">","?",#00,"|" + + DB #00,#00,Spc,#00,#00 + + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + + DB #00,#00,#00,"/","*","-","+",Ent,#00 + + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + + + +Прерывания от клавиатуры выставляют бит 0 в порте 19h, им и отличаются от прерываний экрана. Конечно, возможны случайные совпадения, когда прерывание от клавиатуры пришло одновременно с экранным, но это очень маловероятно. От других устройств прерывание может придти, но так же с некими признаками в портах (но это только в случае, если программа эти порты настроила и использует для себя) + + + +Коды ошибок DSS + +This is a list of DSS error numbers. + + + +00h (00) - Success + +01h (01) - Invalid function + +02h (02) - Invalid drive number + +03h (03) - File not found + +04h (04) - Path not found + +05h (05) - Invalid handle + +06h (06) - Too many open files + +07h (07) - File exist + +08h (08) - File read only + +09h (09) - Root overflow + +0Ah (10) - No free space + +0Bh (11) - Directory not empty + +0Ch (12) - Attempt to remove current directory + +0Dh (13) - Invalid media + +0Eh (14) - Invalid operation + +0Fh (15) - Directory exist + +10h (16) - Invalid filename + +11h (17) - Invalid EXE-file + +12h (18) - Not supported EXE-file + +13h (19) - Permission denied + +14h (20) - Not ready + +15h (21) - Seek error + +16h (22) - Sector not found + +17h (23) - CRC error + +18h (24) - Write protect + +19h (25) - Read error + +1Ah (26) - Write error + +1Bh (27) - Drive failure + +1Ch (28) - Unknown error : 28 + +1Dh (29) - Unknown error : 29 + +1Eh (30) - No free memory + +1Fh (31) - Invalid memory block + +20h (32) - Unknown error : 32 + + + + + +--- + +PETERS PLUS LTD + diff --git a/docs/part2/howto_program_the_Z80-CTC.pdf b/docs/part2/howto_program_the_Z80-CTC.pdf new file mode 100755 index 0000000000000000000000000000000000000000..aca1ef2d98a6dfb55c40401df80c714b593812f0 GIT binary patch literal 1557904 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

rK-feV=64)r61RW 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 z z*G2}=Ft&y9w8!5CNbul9Gx-Mj5Dc4s^W(c_4lMNUfS5|*f(Pbxx>b%YVIT=Wj~5f&G{M&>S!b) zAQxUlN`3&1kaMo|j~{NV(Zo8J4@(sdSebv)OG*(c^2#al@`(yiB-J9ztpeTYRo&@c z&hWpLbg1D?YeoPJ0!o6y+d0&$@!TDM>V;Y7uZ_m@g$5WH6Oo(l(dN7RR1Az&40KQ3 zhU#Jt{ERKm02Bfq0mK7T6JgJIc7YTLG4(nLallj1?^YnyhlI{~PE`6s5phe;;!Msn zd>Q{hD&_<#P5&>lVosne=xGgR?n-&@OXpm- zsW}0lQosUoCCO4G&IwdSmB~3Mp790WYjVBPXd)s}`OlE2cKc^}jSK}6YAR{!O~*e* zwjtA=NKYdVg6h_j6qRrZaoVrx(aJUDe~9D3|vSZ@qy ze+iwM+r!vW%#f5)ritZ{E(5s;Q^}|+eo(#QKJ$==Cr%u#HVxW z6%SA))VLX*E^W8V5+}1zIvVPkarhI-W5s}$_?jA{i|ys*OQcwXTy_90^*%FRIL3rj zkBQNz%1C|0P&+lf0yIdV$nTmxh@o-2?|nnlk`X^>US{H_VT_hK>YD8wmqOLmI<}bY zaANP92CZYW2Osx7vLaa-k|o9uBIiO$upTIW5@W!xp?ytPlMWN2pHVDDu+q=y)I^Oj z%Q#5411f@1LK#bCW0aur2%`0752ALDu7u55V8S6PJJTo)aUN8DSORA;9Q6*$zz1i7 zDL?~Qf*dbIf#)Z+pISpyK0qbGYweAJG9C3YQmF$sL8VqDiIzK$A-Cp8f6geDVPVqH zj#Bd}-qXp;ZN*d!$4PO2WTne(#ms^`4|zk17%B=*O9cahA=-|{;{Y`^8n+O|00-MJ zJ-|?)jAj5-j2w_=(|FirB;!VzVda7on|iXbjAnkf?V4bS9__9Yo&pq7^d=a%7y2nTT{2rZM@=Ue)uRITzC zWhL$A9P1F17mgZ9sr)rI%sSR@14L*W2tio`i2PQP>Z{$(%T~0cm&o}K&KVg(49dcW z(786S%6rmUzS~^(Lp~qO$OKKV{TdN?(~+<0zUOdu3R;<%XGk^FTpL%JGZ8bWz^Gxl zMc?hw>-uOjCdPaSV@2g?UBjb31fT`QGHGO5_W4X27dru^MZQZ<)G_? zXy}j*@Ly!gX>h+Ci$US`pw*It_)P#=Legb&z%h3oBI$~Tc=2B#KcHP0)77qIw4(*_ z(GpP?Xv01jg+v(&FNR2CB#CR&)YY)`@?s`f{tF2x(lIixcPl;ayfxT6P-u1QYfEtk`if zNj>xKY%~^?8UuoOc9yj-m}Yr34Rfp}fUsf?_%M_2x$`wN#}FXz#r+>xMGz~C9vi%T zw(`Q$F;$a*3&8StW~;Gx{4e!P8hhutV>5q2M=DUG@i9*~uB;RPqcc_l|4+_eMAl4# zKv+hnXJmb5YYr6c_MXI6(%^lhwkPVI#WKNhF5R}i0ioG=_j8GA>0yIso0^@;qjSW^h4~z056TQEqnZ<^O>!q zww)30(?HlTP=nmz9nA$fq6@zf+MgXF0$6|Wyff%4fB(0;+KD!Yry0qKHrSN{w4EyS zFwup!epj_i2Mvz{9a-yV&^MUiHZ1T!Ym))|uXC05(C9<8Q-h*1Ei-QJkp>M*VCNWD zY!V}3+K4o@N}B%Hb}|^0Jw!9mC_Vzc<_7rJvF?m?gl3!)9>sN3C#GrA@tMeH82Tb6y!IAfd5>Xk=bUP#@66A}yJ%aEUV(N$o@#~WT!$IHDVq54@;CIW zLe61$=0O<(o{dPP$abh((~qGvLG}^iwSL>31Xg+yl}qC0SNMSg3tC>KbTII6FCW30 zNCQXI%_v(^d|;!>h2yQ@z()~uMQx;d-R%YW2wiFz45%K+5_lF69Z^5XW64w!==Z7~ zcs23WW8|@sk#7#L$dd4Kg5U>d?j*5?3X|*U&Nh+(ARr@W*S3%%3-iTtLLn$wdx{|& zv9Rwo2`0V&T+Ae4bOK|s=Ve!qt9aL>@)FEuegVe8;dtI1@=5JwaCp8tx;qrRlfV|U zljfV@=O6F(OrHQ#<5%)Y`^p``vI8d3Vy-2=%V)9f;biV~jT1I%8NbhU-BK`!*#6qr|@m*9?z^kV0~ zmOFMzRbdWW8c6HV75$C!D;rPF^RnTjs-7oeLOj92jCNz}ks<>FLLhtCYtQn`vFn%+ z_ZjR=(^z9T5QubQIG_8?FwPL*P4>cI7=bzQ0Lu=Jwa^1ARA;pE-Er)d2Z=UNtWfT_ z_-vSNT9A_}R$UL`9(@pG4dDsNoubY-Azpz?GPaM#>f#EFlLaEiMIm0&%T|0@92R(EXJC4M)j#Ep9;QBOo6yPoHVK~DE1x7=K zA)$p_j{!XwHrM0y8lKP&pDHiIoA zTKY@wd8fAMb3dACDO%**>|4-qp%W!RHtEauAWvi-*uOt-!nA)HCjH!rEr>>_V@Hfy zuODd`RA0pZJWeZrL)Il_pI5@Ofm&RNFpRQS#^5=6XU0OkR=+8%1f>AgYKE7|dr5Fh zsZ1o#Uev2G7nl z3p|d2S6)Hvb%$Hs#q#b(Nzs}ZJJpiGw~!4KJybh-H9IA+H46=5EB`lIm{8A7ZhF&f zP*b7^W&&jL102;VB~T3T4;$GZ_5_?d{X=^POZRo6zZw$=x=Jy6F9CRi1j7-augZ;1 z{jU@Nu!MSaY6G2tbze0R&o(yd37aclYpHC!_|F$21yG1|D!wI6%%npdmLDQ185ot> zRdVeDy(d8w?SN$fN|(sFXuvaI$JK{je)nX|&=N(dDUcoD$4U=|@))3`++;rE5lI~u z3L+2dyxIfube^96|$3_fmj zjD1H5jU=VnZvj8fq?TbK-w1OSk01VLnuNvkH*LY&SqRyQ5UqW}O4o+!upKShoQPIK zXSb`o0PS9CAx>$E!eGK+!txcnwnfOdN3DJXVH$eH5|Y)^lsXA+!~u0IQ$iUFKJsB9 zsO45885@8LR{2w9b%cxkFp$Lr=TC7?7huRF`0y=P00x0pphUX_Fm`?ZN?t9%N2`&6 z4w`<)_Z4?+^^K(z%mDyplp1WwqlJXR(9Ae`cg_(zQzq|)6cpcRD-+Aqg|T)bS)2n1 z7PX74@Pk`@RH`za`z?U=fI6PtxWr0;7iBM%K}G39$DR-`pe(STK^a33Py@em`<~KH z0zu@!wAuJZNbT%E>B4*xD)Q!{r;r{h5>5E(76|YRGD;H(zI$}7f#7XSniDz;C7 zL`j89iVPd%mFZ{`u&5LVaXB0xb{Wh6sdjeEY~F&z1qP|HVa^O8wDtpU1n%_C5-FQR zqZM-EI8Z0g86?=2p7|}3iICt1cWj?upI_Y9O1YB#QwGXjXKN>BzU_wElG;nRq3VTQ z$a_FAV%(YhtpYpz^*ZN{&egl1GCvivC%{%CMb=b%v}C zaj0v0;FCz+Z$)h%<)l#x*bhU<7TtL-)_u=cNU15xaZ|Q39II{E85Y3Re=Y*m*c+Oa zAG;0Y5r%pRJP6wP&|j4((=LBJ^q*=kT#?Os7(jBm(9`N9^?M@c6ChS>-kECucq|1i z$S#^A##q9xT_zW((!B9f7DGI?Lpr>nMhw9Qv8RYANsi( z$lB?u85EgFf4)gaI}v^d;LA}{i1cIUnt|>-anEVuslYcPo}x%UTnD4LCb&)o2$B$r zuaRCe&1+d)MaPduI^UtACU5E{FUEXe9g<7Z6#dYcR1kjKXM-tvLJ0e-yo(H^S{wg1 z3`Mz#)ol`bAPTjB4sh!{$HFc_<<@2As#8nfp`d$!p;iTEp99s6tLpLT;L zT#_0Z;PK6<=QcDFk!hn0^8m}`NdrDm5-+>W{9}dL8Fo;^@`MnTiti8z>In`!x^$?2 z)-JLvdSTbt35C#e=pcb40gY;nQkj?+IcLR=imIJm&6Wu9qG!jBeL%@trYS@-xj)8> z4TIcs0WPY|VA}8y(guI?cL@M(At3URohCFUO>9sl!p7s``sULV-f<#k-~{gR-hv*8 z(k-z@KZx|>np7a8QHM~GWvpNtwb|B%-#)z$Stp$x!U{8TSE)>$EWc8V4T{AIxRwd2 zLG?fhQ&%_HWG%W@M?vp+bYL3W9b`#3%(1Z(GeTo}FTup|Aq&LX@N1*@god2%T;O}S z7OA*%kjWlrRNUE8R3>JCaRqPk$I$IG-AlVu;8D4m{D=-4bys&0JcKy!>etgOF_mj4yL4B%d z-e{m)HO)vQd~Gf$cKByJ1RnlYL5kX9TZdf$oN<8+@?mjVFZRE}h4@XQQn~2jrmzSR zx!*tx39kLHJv+NfHLZCQ9qHe-4q`W4QKAijB4R3HGJg^ynvpxLhN0OD1s=~~hfz!+ z=7%mRYOf+=FS`^9w34i@puG3jm8-AhAh@-W;suu(PFbN!fwqX?AQ<*5-%8O+uz%i+ z>e^$P{b4{yUvvo!amXAm&`ys7tZnVfW3ltZ)CrIa>vYIER0`Ck;TyAsG(eg`lQJ06s$lhHPpX^WAzRB13k$bXhO^ zm#vbaJx?=HFlWxc72@LHnPgMd=r5qx$?5=OeKBu=g*|e?30Ax0Hye{8q*m=6N2zR7 zLu;>+_7fG?ICFc%W|sQi`9Q!0c<8N(FI_Y7>K5290pusi<5HCVw`0@H z2V>}jYz5_6CY7cFLi{igc?j-t10_6%kX_0c8l{sS8Xfr?yPExcrm{UXWL;Vr>ypTR;a3FuFE#e+ zN>cz_($4kT3(Um;S}90M#aMNLMU7-8D5_p)US2&_tg_Nl3S->Q$Ek%w6)0Lhldx3R zwYO15?E8fGerX`WD^X1mLFCtW*5)iybP->@Y6!y6|LND_@PLqe^Fdl19;8mg{zJHC zU9s{nDf9(~ty$*Hp^(QIrR`+Vf>GW)5V$Iqc*8%g)YH*Ux!HiZta#N?ugG*jmgZ*r zlQvvc4@9EN$x5GM0xR4@Ug`4gbJRV0abl#Dilo~y%eW1v+P33n@*cU2+uopYj%1mC zLO=AGrk?~pRZR1uj+<$xWGAnj)5)Q#mj?#ibWTaTN)6AXj+7R;iqo~-Pt=tjPIWPF zNoh+b)tH_BG0D-^R*c=}GBpJhB=ec50Q~rr9yptE&9J+i6YEfvWiqWwZ@wi_|5LfA zv<}f8v&hxqrbntejvd2psFvnfka3H&RQ9K z%&P51d*u&bVRn|lcuxt|A=ni!(Lg-uM`DxxZF{+vh-*Qe@tO8?csh|YAWn9(~|~Lw#K6A<+%ppmj;ZopNWbTf%l}f5PtzdtlXN= z7tSoP9C;1mjUdy1`4tvS%AdenZlI{Jb!nfu!TqVD2S( zpUJ9@OY9aMtq;mM`EY0N@%4A%ay(p(&$UC1cv#lQMTe_e^Bc@fv?9ZW3l27hADf5$ z4lkN$KCf8Xd9*)89*3wc0+@hauNj`oawyRyIJSTA)W*bx&KWmKGm(4MXDS&68 z3uoZBFi}^}XHe4`rIGM|hbiEf-hxMw z+fCdlWsC>pw7acc$I8VuSd;Okh`)QdvF;X8+mRg>TWM z@BfU!WJ59j)a^eYXy-Jc2BD`l=08j>mB~^US@P2$gQXrtsKe$w63_eGopcr*tb223 zCG;!Oo~2&*7ZUMP(Xk)YU&0WfYCA8t%(kMoD&mKRhI$1pgtnvDwYu9Mwf7h(AxG87 zeWfp(5ia`$3c*Fzo*Y@7x?A#i zIlNV7yV?y^W?^zhKOPIr?`HBgRmbTa5z#;v_!~@GHi`Uqst2Zk)bhCnC!gHN5X{yu z@V5qWCHzl!k0Cr_Zj!?QlRhxB1pIH9Ns^#jA$5r6UHlES*iq_2N!;Uud_mN8VRY-WP9S|lcEHt}lj-tPno_-5jHnQ&-bj^23- z!O1X%xeu8%ky&CaM;-cyvqFGbwL?@%cTqyTS7%GsR}1M)=|?yBY3Ws%83-k0xO`0G z5=!C(!JA?CigW^X;bR)sH3^ZtRXdrUDOtJ6-1E04vO@Yvg7l+*0Ij7cy$QR&W`1@* z>#N#e-l>)k-z`qa&Zf^keWcYyDZNbb>MdET8LM_V*S!=n>sv2im!&r7ge=&8W{a5h zhkfy%j!3`?FWAaCwi}|S;7N(Plrz}ffA$$G^rYyCH1ZE{Uho&rS(cBSDSh^3z1M(P z)@NLgiSeb^90GPZibuujkw-t{x>qz=lh~P`y|p;?7d#awIL)QI)s|;nAH~8;vF+}r zF7y_s*<}&;v}qlyaN2#X@pN|Ku=%Mr&Ct@nZ*o+a8+Lai1hHLu*sOD9|x!APhN}*1Mx;en&4U zdQQAw=p6knn-1`Ft$};eu>yP2tBwqPCEgp@->WM{j0m)?K?5c(%C^_|uz?*w=13)T zV&=e_`&u3G^`-lhZeO;8y~c1mY+!s?(L8fexI2e(BmVp~Gi@k1>%o?!vXqP=?E&QR zKQ~3SvOLLzl%mT%p^l1=f5esv>^O=^?Vt;@pk+bC_CwMv!It7=P>fNW}$8J@bj{Sm+`M%t~Gdj4Q z8{e-nsD4d{+)aDC(oKfA*%pxa{#TwGH`qdZ643a!XvU{Ydmh>y-=vy8pdqT)337*?%1?GiTs41-GQQa{Ie1 zVkZk|Bu27mcG*9`yI?>?=3XB&s%?@Wt4c4|_-TT;2^yFFGU~smGmD%bBt?}J6OVYU zqu50;s8rLUL+oyY+0SePzZyX*Iz*kU<>}m}?F&alkH7{_huIetqmYntW;_2#IsKdk zBvzSi*eR*TdJR{i4JFgkVr|6DfWc#BF>hEx?S3^Sozr;G`}(_Og* z(bxfY;9z>Gvms$`J5zh}5c-vLL*GkTYlU1d!DuvEkTXZt%CK0hEFR0at6eis4;E>x zmL~Po8{}VWMFHZZg=Ifhb>?BZZ$y(m6{-f%h0g}ZZ7tf@rKblN3T-t=x}4g4mkjH; z&%_1_a5`!*Y7Sa#99{!@RFMSJM(*`yfb5B1E#1EIY?1rG(W?`^oKKp{BH%smQq-cq zQKEQ~m?DHRr1z-DXEHe+mP7b%mA^z(+Y1*_-^z_%1=Av8I?%@QKZUEDZEEp4kS0I#Z$F9#7W`!!4qCTjpW6+(x zY6_{LhnCT#?(aN{te(G}#h$7=v=Pt0i6_~xCrkL?0&%n=XrZ(4E62B!je65|@j=^9G(+Hdd0g7s$2n7Sic5WV;WiXCm~+4KfxOw-H`wlIofpOtX30oMU?>7^*`*+cUgQ z{*dP|Y}VYM#C=qIXT_k_Iq==~1~=Z&&RbK%@sLqD1a}KVkOY;Y{V+8&I&~%tPdg6= zcJh8qDxI=1_aXNb3W=QS?Lyb$Q!P=ddVaj<9$C`c#h;SuY&LYbhd>fp^XZMMZZg9k zBVd9W>9s=|zt#qemR6R>M`I@FvSt#mj%q@-)acR9s>OQ4!M?)>GhZ1kwg4JdP#hS) zvcUBJDS3iT465yB5T{Ud2q&+jAub2G&U9D$#`-9$!^Yw!@G_G@uvg-GxD|Po!CmO& zf-U0`EbFwXW{!vC-PLa;Z0nTnwTioJRlp+feH$Qmu8hA%tSqKjMmyK{Fewpw+f--g z479A}hbRmff4T5mQ+PRE&L_EQ9D{wlT=WK--yILVoKMfEo2)F-EoOxeb^VC9gK79p zql;&Uug~z*w}#qrdH(PL7=Z+{pM?rM6u|(zxCgv91vyY}+ITUu zHJ*1l_`w*t`H>Ng;3|~|)U8#?{gkV(Pz1J(?`e4PjcYQZuHfM4Y=|l=?|tj}#C~;4$f}d*0&5yrp)ne~??Yur_7~sU69ji}2w2I)1eGo@9^> zDsO0G?EOmILpIOo;H65Kg^7Os%TC&n?OyEngC~iR@rzz2AjXY@Y zK-_%}6mtjfcl^@wV9>iCxvR%}$bEUi0fM3?=15H^<9$vriyE7qyE4RkCEsT|nO1ay z_~qd~9*4?_KZ?D#4V9(mBAHGarq{N2F3HJ0x8js6yD;EDPBc$XN-`5{tTGc+8X_JSzzO=y!;g#*IC|C*g1dVZgGrrzC2_=_}I6O1yebXoo%Bek~w1;VRgD|y2DWK}p zvM;8~TeT14779j2n`JoK4R8v2?S>2A_MBGA5vZ3SV%qe-W|uTDKt2e>^#UF>TjJP2 zDZm>*Q@3@9Xmj(4MYFDiWoM5>aoU}=pj^6x(12w=9?0%W+_Hn(=_F&nQoisD7-50j z?p?%-Nd=J4HRi592&!)~SsCkOONkO^cS1CD;9$#pN6P2I_x(*Zye}ht`OUisD3`g8 zS$_B}Dx?$Rg~LG5DR69*nD2Ap*Z*#Nmy!YFG0Au8`HGLZzZ6L=@)tmg6L{3#Xgvoo z^k%O2xa!VQfFGUjZjzN6280!}32jVXtWOxhu>{s6>C{~VQvgt&PY@Bm6tIbLUcJY? zzGp(09_&+h6_p%9OV8hbwhQ)Ruz!fE_Um>_J#l()CK!K805MoSd&utN*U20`1P41m zIB|w*@(?9_)}e~y$*B(0ZLKEPeLDP?dfwmtrOY^>gZ+( zEKYuaanTo*HhZ-}-#25`4yg;hxr+&lA!MrMy7VN%9VR%9{T6Uk`xjO4`U3kdV|4*C zih)vX+XG`57??aY)`9^~*N{pFg1An~zO4=e9@bPv^V_)#dwtHaK5A zQl#aJcagI9g>kN$t@@$Wf! zXYZSP)^8y#$U{m#K~M`>aq{5PuEkUKhBbSzJ~%4`OTA&|t|PZ$sGY~}CoS3e{Gp0B z2V9L`I-Jgg=)4Gz(I1HU|=)TPPtL~nC;Tj=HKfU#CE2q5EkYtJnZ`v#W+_d4B+`eIDg?$m* zpU4mZUlsgRpMHP53ok>Q`mzDE&HtiQYy(HCI&_c=oMgjJTG@FSfP7JJRouE^ZrF9% z6o~=hogsX-YI|F!dn$e$kZr(v+wp5&uCY4Sp^$(orqU5RmOp1NvWvKG6mb5Fx?w2! z)Jhp;-u4vz z!@VKKGbkE;1zSb{%Op%a^eo+CaVNQ^{EPB1ntz&k`^$5l0vi-U8$LkLpEf6rSko=3 z=764Bb7bjoO7`lbOG7;9fE}2?7C$I&Dx)7EaKH4_>5T%>j`P1&W`T-Y0I-t{-0r~b z$*l7;xTdM?wP8sH+!9dRiY4rk@_L*}*?>X{8hfsvvLuPkv#-+FatT_`Jb z>BJ?ctM=P{zygov&seF0N&mzv=ZNW--34kV(8>zdh4bj$Bi?^s+YelnS;x8yyW{eA zHxdeLiy%%Z8$!9rt~g){2Syhiu?4@wPDWYX@w5F9blN&1XJtYUh|1BxQ}dXVNhx+5 z%#2*i&OY|$NkmHS_ zScx6`XhQ?uC1amHQsGZzo1?!1UZN%BgL+&uKYTD2=+2LsMyM05{1+Y*oUhApF})n6 zGizA>{781UHN|WlI)9T;B;SRfP?->hHg=QeYK%v2g1m(5YSbzuO0S8ST5Y67u5X$Y z*&<+oDWiMwCP%xXm?qlx2|HANWS6K{nNVT&ZbZ5Z^m!r?j8mif5AeW8Ck#K>5kDGs z{c$8c_qz~isrB6wg)2~Sm=F&UkI#7K$Z%BYL#_!7^LHWM^Hm&^!z zDi7OWimd!IP*Lfq0RfGkzC3LAE0hi(my37eUUzKycF0^h%Jki-gS$oz;>wB{$-Y7i z9&45$J$uBr1VED=i&4MB$)>}-nv7S&=NY`>wO)_;L7I2iB-z({=IGYBEX5*;tY?d4 zhewW%hq53$MDFJB@hAa4`?|&+r|aQ5tTj*!5-esp`FCAGAKj0kjFsY(&waQK+IYw_ z#`eT}Bm_=xDHVm!_}o#e&xSh#~F+VhYy9Wc?>!uxo=YCu=m0m<(q# zjZ1$tpkxFlQ%@K&1N&Fa=oK2Z}_7JK>g zy-nX?If5f%cO{3Aogko8jXn)Pzef42|cyzbT^Z0PLQ z=M_4$XvH-*j$M0GM={-yK-&vBm%Q|xm*d1FD`hT>2Oc?4uaK4$FLch0OdScXGxAdz z`Vq7Et2yi7$N?pjY=iUCbIp(ejpfrhuP~Ntx-}Ibl9?yW6kljWt~XTQr1w_e+(;Xsp~vfvm`+M}bDh+3AmN?fp>w^hRauwPTg)B} z=D%Xc$jxAf9E5YVJzgX zx+l16JIK+ZBvO>`&b^HO?$QI_j3uz{U1tC&r27bgX5TgFtQpev~F^WWV+DRK5jf!Hx|%;;Q8?4r^3rdORr z`5;2am=C_R1S4B3djuPMFhvJ3@pW!VemU&xdW24?|K;tW118Ou{yC|qcAk@*#0Fm3 z;4vQBiZot^1nw(}o;@^yds|L@l1#D54;Z5zWt8fi22T|qTR%i1A2JSQp=+Tpcz%ne zY4yp#cc(85pQM&;dTWRuk0;tls?;jVRV^N|3Yzu?ejC&@WA1prTVMZaLa=9gg;wTg zna7K$Ga;X%jX?otd+HDGx&thsdLr8G8~G%`PX31eKqTTi%mY21b{BwKd=S^3i$qD| zlo#gx*`zj>`8T?33tG-ujQz5WX3GdSK#WD@OYgN6NHUI#l~Dg?R}^w{9D1 zxA*G=5-kqs%o$%QN0|y1urT+`EUdP#djI+gl7fR(09Rw@{kiFDt|GNXU!r(o^>pr( zi}d$z4_!oVsHhcwdW6dNc9Z&UV%8Bze7ZBKrC_JH;ncZ+_z5K$Jj$NmgmPM8VA{-} zh(ba{b)e#vQbU#I+)-10)s!n0FXj>$tn5APdkaE4&MW5_ckm$@X5p7NHQ$2;(DYp> zR;L$)#26wSmL2@nVnDyMwb~*;)2h8J1Qga=2?eQ4uDU=Z#rVcm;84EptD)5-TD`0%tEVKRAT;zGoj@UkK8?`{uq9 z{7zCG3>90LV)nhuGyB^;*F}bMr=>yU9Jp{3}zVjQUH2qiAH(j>+qr#0D$DWz~JPL2v2VRVP(Gv~F zqhdzt{?+gy2A|XNe(QI*;)2|6%0|ONPaE_7{gdIT*Bq_Ho{z2xVo*$lpPYsB$dt+O zQRRg>^3N8=uqkEMrx2v{x2R-&7`G(;Uz7>>LVgE+?h-iiHSe-Shk(Ko#B^Idc^R9mDq5q+1G^4}!1F?~S*pP~)+c_@YNdgp->tS|L-NW82JcaC(sgFmzB=Iji@wheIQi;lLVH(P;<@*3 z657g-dH3;YS(EL(Lcba9^VgT#w%bsijNT^sM=}LkFnhJVKOq;y%-()Cc<=Xk12OJ5 zMw~vn+*^fn+JbVNf@hSWmT8rINIu^2hr);y`*HZO<=mWSR)^O%B!t4S%@nP<9X$Y{ zqGOEdD333XMJ%mE&mD`5+6zezbnmR`zNu{sL=-ldu1=IOcMbN*{@lC?9jvt5vqcFp zz||`Ce5xH9Y=8NiQM_y4%T0Q_I%b)p>h|W%i+YkDS0zS1c7?FcEX=22;jIkcgml90 zn5u41Or=5df}Q7eWf!!(@37&wy@{5wiBGe6rnAXMufKF1m8}&@@o;)2Rb=c39D@-# zYoG)mK(FFM#$%CA7A8mE%`Zxcm}A!>Z2}i$qZ)~)J0$=L3|1c3 z@cBJ`#K0~qq=ZsGqbaE`W~JwX_3L9T8ji^ida5`pO3Lp&2MN9F`h#0XVt|iD*A*h zhPL(Pv0uGCk~t>FXKt|X`l#MvY1%ST^W}Qq?YhnPLIW4G?I3H%0adu6)TxXc95w5G z{z8=S;XC6)3;6BsG7 zd1ltcF+-k1liAnXG%FffJmN2Rr^r%!O{8#V=kBS62DuyrkXCF}p_5jHNNFtqUB7{p zo@Ci~pD``L>0k@W9~`e?KV@u^%yNOEA}dl~ck{$tQ|8^ZPno<-@!^(IpUy4}+CRCc zwvV-TR_Wkmjgh!8NMNg#u8cSziV-cLh09XI@3-9hfq87dxq786A^Fs7S&2(DFS;^6 zJ+oACWw>0@XNVJ(csEk4qD#%xHa#zDnPqe!A|Sr{m(Zn=vRZ!AzT;&h2mn&c-io6Q zrT@uAngvA?*l6uSD_`jEIn(1r9zS}7Y4-F2(XyhuBe@B#(CI&}wpk*59WUa+5?DmU-u@*^ zW1g(PM^e>B=P*aP=g{ej;xNnUC94GMU0U#^^G_ykOG z@u+uiuFn;xy?SYKZB!PEu6*VAtA(jRiX*Qf(Gr#Vz@O}Fwn$0UUnXNPL!w)4)|h~3 z-!pX%@#gaO?Sms%p!>1rXl2me;;mDXNB7O>%y$_-=ND=9#{!pc9xT&2?v~1s>_vEn zRF{p;9rC5D|HvApdsRNHqqSr9TXit@h?C{LxsN!nI?mqk zB&#D&W`fi77gDz*2_iRsEB=e3pV+r^>#0TGx4m?ufB?UKoIc-;p$V{%v2jKUwt%c@PkR-`D{M0F=T1G5!w1 zJ@s0lHyx3kh^2V)ywx9G07TgbD?XM(b{mJ7`V3dr;rcou>h9j)A@&A4@NVEen2G5e z+~CLy_<>!=vC<}7D}^YYP?6jozXzu$Ez!@>W=+=EdXywwdq z3Kn<9(%e;y)Wunt6Wk}J4NE(!n^yOCZ!>>>bLgT_9YCA%kPJ)LGYv&jx>zwtio;&y z%fC}1uTnB%_03Aghbi_FCsf{e{;_Mrq+4WJ*%`uM=&k?U6~&dS`&&@+w|okQA?Vm> zew(h@`a4TPch3K=+7=r4 z1he_$bhGDX=|kLR)XJsJ;|N+I>1MO7+yu0S+5QLxZ0FQ72h;w~ z9hVvV_Ch^g&#hinP3iOV#iLgyF)}Ki+tHAfOTW3VbPlaH_e*hl^cD$Z%6#I#>R0Hd z@Z4$tT;B6&%yNe>rgYnFF>BKf2tFwnYiAUCUrt&%2jst{gU+Nr+oT;lP?`1{-K{&U#MmS>;7w6S11EzLG~ua+k}h$VT$`zCTZ>jgXCV@$-d zH97an^JTWfkz$TzXFtG{fxCT`8H!M)xizV~tT(!mP#zeTl*E6|;MLU0qouX0b4E)s zcrkmgPv@*wI)aVZ_=Meme!ASD-oGxk1{%K}hV)ypgWE@*I0qlRT+Oek>_1{c%k0%3 zDy@d@WQB6lZV_Y_oX0tRAscr)4Qm3lL;T~%whQ=HC94X1z8sEN4z@#=&bBIei^4s-#l8DUX40+>RpseZ{r7jL0%39blyeF{vKFd;{r}lu zcQMgS)VvV&|J-l-{N0TV5+uPs3_gLuZFbHBw-kwm%{=saaC@K1af{P-MM*2}kh+zE zorLR5C7r%=NX|`Fiy_@xvq4{PMgNOZ*dd8J{NzV(5w_|JZbk3J;m1P1LM@fZkfk!C za@Bqk1zwI$BmbQhp`*0iW19x(Cd!ipniO62%hO+I^c_}y?-K9~*zrKyyCBDLXUf*v zG#~|~;-_$TFeejoDmovFwR+SC+9q7PV#w?0v)>jbpwH$dd~|Aw8M|1R{!HpM%UKU? z6@y=Qea(#qc+S5NYC8*Ea5HK|;qvSkILOzNS`}fm4wHM!I;FJa5v9Ffj}eA0p&V|^ z`&{Mm*D85ikJ4qG=TK!k#4u)dO%NaCnl&%d4I@{Tm(AE~+cb6cHCoha=#*-a%R}Jq zX6gqEy@lU)d(OWoVdwp~H4C~o?~2Ez?iKj)s<59v*b0LhIgu*WI>_{<=sOB>0YH=U z-D%@{1-q$JI6) zKU>tZQ}J)vUVS8`OumH)jkH(AX~Ci+0@;6+62TUSgaQCAIptdK3wbB z)0}Aug%%dLW`Jt+#SBBc;&!wu1^qKkeyLL=9=r8%J*vHN8c8Hqnqljm7fFdq(at^( zreSwPPkM98(1BZe8)Uv$@2}T1gqRgya#TcDISwh8Ez)=AylK|%Jd*940B8t{)jRMP@!#jvqM|vmN6>%{K&hhCp)n-wnckz|5HT0NRJ* zitG-LS29;sGM6zimjyZwE8&J%af4ks(&OXOo#MzT?(FV3H74B-JE&KrWPH-zJ@L0| zpR{2MxOFXN+aoh=SG3!sTon;;D-NDrJ3I%v7VVxP=5m@v19a$V7Hzxdg{Lzn4QHT* zYDg$ziq{%&R9hQ=sJ}ifKjI*V1qK9o!~hH-3j_%i;2yx34YUXn#27N8^dFB&pmqrp zIZPq6QummK01fNom^LyTi9!N|1rQ#Jaq0*ugPe~tu|jqPf`mdOhTKU&<*__wqN)R} z6%qhd;QM7wRK^x3vlEUy2|l=eGa7P7j(Uy=++FRh@L_%5U0EXRvaoFM{4)yx?LXCP z8Q*$Pa>7lz{gK+24oR=QotK==v#eGl!`DwiWyq~AQpz@M>P+Ty-G5O-S8LryUL8zR z(YCvte7?IfYD3bj;1C;3;F-vT3OlQWli9{=yQ*(K0)Nc0divQ7EPj5FG_ueh;>GIP zI6}=f`$c&r@H;JrEe7kwc^CilQ|;tJ+F9mNj7?5dGp#jB=GGNNGe}_~J7c&*5!UH{ zLaL0gk{GT46PDe`DpUfCCb|G`gq7I+D+yid|CMKjY`VL`y;usikqoCG2l>^^cpoU0gzEUEoXK#uzVbv&!nm0AExm5k_i*gmR;jz+73OfZQ|l_8%zM=Vj= zyrnmkP*GL*>F9le%Stk?$!ik1#UZzzA(!Dt+U9V(w|o1u{J+=0`v2Y~mCVx2v;K2m ztt_{x|C4G2U{+%fm#kPQ+=&10?V!R9xcylJe~|^EuvWG-+|K^5+n+U{AkoSeHSt2g zreBH3O{L>-qhSpvhBJgtdasF^#s}3V!8LvjL+PP*c{_dq&&8 zG(i~EH(7}B2*ISneBc5Nvd8$JU+1$Hb{{_U%QcK;KH?LrMT#E9@hF{<59*_O`$*aA zl_nrC7}wq2D0IGHXqDRX1}e#?T_v+yDZ-`&WG1T}Q8==KU&5HPfHHV*a7!ZR0ts8_ zg4*Z+P5>H3rAJjV50d&p)bTK_64ef~gSGK06X5cdg=*nFM=bs-9%{7N@SSVUdh1?m z1!?sJj8}7r0T4E@1W1aJpvoG;*Ej3u?Ow_{1&M80=}QwZP=fF=GU}-!%af0UQ)8%X z8F3jb>H{OhbKEmmPeHr%DAnEZyX>*nW200i(s60nHn`i$-@cAAW~jT2`{rNas3GZT zIhOiB@J>R_cj3p+2R{EFzTN~Ls`mf?pBZDa@049hmXIvj8BwzDvPY6FqAW>eEF~$* zPG}iXCe*)FE?Q}~pQMHINY^p!kqW91n zA=9t4l-(M3e}9lJlD%D1t78ajtctJQis|(ng$PWn zJ>J2YMK|H;2)6$QEK$+Gl2y*o?AD69Jj)9`BdgIxaS)o%XpdtYm(2oSqP=^X#5Ro0x^M}E7L-@ejXTm-bA&BLaD z!@On_g|x8Ln zWr26|;vHe}?gquN;nJzMTf2HVA0+Od`&T7GjcvbhqxFk|Ya11fUwd3;8N`MYWIn+t zNhv$Ddd^F$@_-KG4G~>rNk`68;M1*_EVwiCB%T`h3SeJ-zK*Bkuk7@BG z3ljUnJ_m(LQ!rE9wj7{0@ANwLP_Kr_IgD|up*=&kIc8o~_6h2>UySuEcTBUkT~(jS zts`4^SR1(W)G9n-wzF^Vb^Fp@je~i+WAmR#rahC3l5XxJ)VLPAB$8fQykr&ZX_`l zR~u347FaTg^usL2Ie}d891jyr8~c$zYEgFkThprUmlsnbDNHIAOP??)MqwZB+b-2= zsPc^!X_&gXzuWq#r(f5hj!dcld*29>IgEzXuv}%2`J+_3Wtk4xtE$lQWiG%&pNP!Q zTb8MP$)XsXKP(VCUxI32Rm5ii)ftu}fCUYm;)~sIKZ;9suEeVqK2jJnE?b zl2(@jZ_G7b$NNfxt5AN@V#P>56Quk>vwu*JNDWMgwa&Ij_oG5j)9&D^QF!X^coj6o4*_AK=m&GOF~Yd20_^9rWeM4kW3x^%xzeo# zCdx|B+&TaU%e{qZ{9By%;b&5VXW)?+u3somRRzskvSQu_-?*&3(_y#PZ-P+cz!{Uh z=?16G@Fl7f5x!pHUzEyH5|$})F8m-kslxJ%s?3k72YEXkns4_kOpCeB82~^MK}*84 zi741t(B~lP)NsaR8#Ea_aAp#;< z&4~h!3VV>mT0N<{R}`3Cz58Pt?rr^RQt+!-a;{a6I4Ue9h;6_ty9>aeLSD4ZxJy#(*L1U(FE7Ze!z$~8=2a1Xs5*=)Ri(4( z+>sZNxBH(%7MSqnX>Qa;?D0; z`b~N*Dh}If7-WX)(A0HPO18e}a@Pv(?Sp(YenE7z z8)ClqF^x*k25}R76mVhLN(}u%EMMI{b@$4v?oSXYGk@U=3^{J z6RhPZpaL@ml;@Oewbo8)rw&tjRXLvO715xSAii-Mm^E?#nfAGLZ`a)L=MOEm0Z(sqXSdm&Lv=}eeYLE!A-|)bS-21$W?fzYlUPu zhWjt-w3Mq9({cCyP2ohrw|4vOnPtP@KOtH)0n*aTdN0YF9P=-7nco9a{dL+XqCrl0Z^Cc5{FuY`tC zF`>~hgrE-)9JTLn{i`M>&U>4M*uiLl38N{E6N7w_=Fd*E#QB5^yjPnSGIyTuo5tF>y$q_zs>`#~Ja3UG%p zJbk~*gg!OC#FJFaXU6YLuDT!c`pS2RqK3MJ;G+N3B_li>Tj{2i2o)$MKw{wi`+Ec^ zl&VGODD_s&9Xfu}zxZ|08%(CaO4j{ZV&&1>En~>&&j#es7$0zMRBE)cR4a-<=iD5m$yfR%5~$I*XKfvFdWVL25I z>?G}XX^k%)aNiqs`~4)xakW)teQfyPqf>}kB&jCxgusAix51l=d0DLRZ0W~hTCF$(NWd{JKZgyJA7gau0?6;AD?QiL0GCC?+KM2SLli! zXj7cg!1)qlAA3fh0Y_lrN53`Q9d{iOOR;TR(_V-6YK_EBqe+;ln zxenbC2mFWt<~k-Uv(It6z%TVJ*`yJj)YZKyu*W^dq22YFbe8j@a_d;IvF~I#e_~jn zMFj2!=1qZZu@v1V=n{5@ZU;x)o4eyt(Gf5zIxdYvXY79Sy7J($Us7N9#*ocWEOJ z%S3SWJZU7H{CuBoJ~F)ns01POOVI*&$2sqkS1qJUf+c%KOVvnveeMVJ{m@k&R_unL z3>$~D6ih2I9lFo`%;w5x&Wzj-uQh9{HR!D|&6lxl1goV&<8X_!<;}0fD@+%Sr9NF+ z=dpQX;6k{%e`$WG0~^-guSrH~C1VE*ll*|Z#w4YI38OSW&m@h9sFBU+-<~r!Ji2Lf7Esq5a`p|r$C;Y zTVO0Mq&QYk+jszG(|3Fmm%q7X>L8i){c5kqhoKFy-@=7Q6xSNkv9mk!9OYn+S^4Y2 zJh$HW#>bwt6~7?HYj(ICya?X#F1z{$ow%68xpdPax8uz!f!qY~69+Aww{gPld8ItcM^7%*H z$oOsf)haNEcq{;dQ`aAeFX7__aOex=w^F1!@ad=XP;H?wk>ntCr1mifXX@+vP;8Lexb?o9{EQ^Zt(8 zCy*O-=J&i^jg%*rsu$II+}=%P!}F$`=298b_b@~l#%YMV8Z@HG-z=C|3$18Ud5jyJ zVrhpsM=DU;@3o!Q{qf%5=DBy`CwBq z&3?}JI-xy2GCaM=TJg!h;*HRL9-WakKnu9+NHtG41uUnNrkC(r3YZ zG)~5`l-%wy+sCJGqUMV>93YL0S+Vg4$!(y8Hj(UG*Rg`7siw>0` zCg~8d-{5p#=Xyu)$5_CoQ7S`)U=oM6M${qBo=c%d7{&HHZH1Up@kc`%E9}SarC-SN z5^a`!TLjv?{k!wc(Gu4cEW(C=hiwLn+^MBLC3wH7Mmp)jg2EuQw zoH%RRm~*7-wyoBWy6=LGroRFa_wdkhFwgCnWdf8?EK9q#!jp0i(=bZEnF@1F^6Jo~8 za{Ia^2k{@)vg!WkAb2q`c&mT8EL8QJI?_5G`HSAuZ(A5`7_)~xxRyqVot+3(Rhi5Q z!`)c_88KN%fm)$ydWm0KAAT7@me<>pFvXNv;rSQGa<+xMH{-u{r*8^$#wt;}3)ri5MJLDwS0~!yw zYhWNa3-MYTQ-ruGBp&N@ZbvtGtR+kjC|yIooBsD}uH9TfwBI$@D!r8_`Mf__wLjT- zu2p{jYuGfFq~yaCupiGQ@Ogh@T+dt!Ag2{*3(UXrJ~z7~@=-HSV3FqO4~#c~oA1A+(abySCG_kaw;OzZ%oFLZrxF*%_6z#oZFluxzhddH z7t{6w&HRwU|5N@gFPgMV_C)Ee{ai*7GQ1v(T3`RiA0xe=6TZQaT;WQz4$7Eub=kXZ zscJzG@hN@}ZO^j{=4FN)HcFG>3hPgJ$T*a+5_(7#HLaMLS1hcJ#pxIRO?magg>`|~ z))~%W|8m&(oeiZ^4dtX$_pJ?)kN45+fM^Fy`@hDA|3hm3U)c7)g8l)w|Ko`G$WU%S zxpP=y;K#G`)z|8ZBp~#UTP@BEA|p4J`hLY#YrwJ_6K0(G_OcK=xjV8j$J$b_Kvxq9O3#Kvbjzsnq6H_5EN< z5?MDjibr7WK;INLE7(L9Ix^6Pz=9l8YRTp`1ncJ*;IL<2H_8Bq?AtB9c!-j%$}^xq zy^;R?Be&b3)o|Z_9;v~Z!CJZmRxk@ zr%n8uN%FkUnrE4$U;f(Uyy6*jhrv?C(4lgH{fVxNoy&jP2fOsk{dGBvW z*_Fsf+n0r<-4`No0Yv>4u-O9{kqlZO@6uZVSZ;`w>giwvy7?{8S+uy?&6;~ca!`TI znWP-dMsx~F%1Ve$V|GnYl_`Aok~jp*sTH{3zE9K64biG;T_dcEkxsnvU2}IjU{segx&vrxmKhCQMAg zQ69~crxyQov}fYqRTSWmH*x8hq;NP&X*(KAvRDwrThRC`=omg0;F05*%0xdPooY)| z*#r$N*g(HKA`zI~SS}qW`lESL5=Tlg<~OOGh5gl>8wr~YC~62T&OfLVRAZ)pn@$!$mu{VtkH2IvrE57 zm|ahQ+@tGH)}>H&G#0@4H|ds9o_&$T$720RLxi~zw~}Ga#^Zku6`}t0HgxX`Q?5MP zfF67D6h!m17B8fYCF3?MU~w&ghHk?2^mRNib&gS>!>}!~)9B1Fe*n`O=n$khSeMWf z+T%Rys7vXb0XJ0o0`EPA2cdvEVhCJQ{u4e?+5zi#r!SI`&Y%HE{ z`PYPSK~lx1H6zq%%1gFpL>lzobH?=mxTCT>HP#(*dV|Gc{zojI}lP1pcT$~v<+&WIWe?Xb8u4M*TDq%h~p5KSGa@Uei?M#YqI zDo_uaM9i`!w8x_i8_{73Sf7W)oPH=^hhNIt$bg z{(Z0*vdk9-5a`@vnKF!#m2(r034o>|!t&HC!5V~5$6z%eRA)!3EYy^IbVER}Ps?Y8 z8PMP~x(Wio@;z8s@YfK8H^9i>k-w`!#kKzSkais7ey2xl2#da1M#YH^J;d3cO~{io zUf_@8(k;}b0LhuG_DS+lK#6DeILe68p(jKJ(lc3Ny$reRj{yOkqRC9`TrR-7AqNt( z#bY-q0bA?Fs*1vdLlk5)F$M#Orze^ki>h0b&oH7{=qoeGS`0oA9&jsSM9`o%_=1^Jq_@ts$TBq6e~L_Vt+ zRs2V{n)l{U3~XP_1owytL;SZ{YP2|$di6%~*O(H=O9a-tj|EOPDk;%bP^gd<;{P`1 zY{b%vs^Sw3^SU$=W*5eTOK?8S>!-1ff@S(C;y52P5F(}Ih~n*ZN&3=8*%(3vmd5Ya zPqaCc0ENOfF5Q->pCZCWi(=yPPo(<-lOmxMesl9E;gjV|(%^_K9vhE>)qV}@a})4l z6DI)8kAe)yAh*VNf9lR`;l1>kEHA>2_MFp7n154TF8tSc-7rn1A8Ba(mxNjDJ+ z;D}s(TBu&!+UzV>wdE&DPn$D}2$G_a1Oq6DX2}2~!&LSg^NJ|dR@t=(E?{d50ko2h zvjrH&Jsv%Rd_KFvc%VcMY|9h}8U5w2rq4-sG-q8>UJaGLV;y#Te8VFggcj06YB9B; zoIvtJg=glOWxoO9Q$c%R>;r{+Mu=@04mcgSRPxv7MnF*3rSgsA|@JFSg2Ar!cR!vHV;VGSiUjl2vD z*e{@D!mvLbS%ok+(Wk?(J~WQrg=py{CjJEsB~GWDRWRY3f(#%A(?%v_`V)YgQR2?N zbE(RG>9L^6c=@jPnz_; z3!g)AXS}PuvOwusDRlYvcTAZZKVMx{*LNgTE8wdz!6v z8fB14Vv>1F07f=TCq);5E{&5yi7jR=RmBNgIz{Kpnl!p)KC+cN)vObm}H9MwMHY zXBw|EsUQ>km_z4#&3nA)TSYVRpO_76z?M*AaY`=FYL+J;1&W5k_tN#QJVJ}gERa?& zQOP#~-FbqFG0w*@jBc?JH^uM!lbGRlBKU$IH;5AQLW2c{+QGeR-6OV{ELTg~1uzOD zN6^`vdzt(brO&u-t?~Omf$5a3_b}(TC71tD81EFvg!iHV>_4EmflxgQv|ygihcO}! z&yG>?9omh#*2&uChOMx?(%%ILUMx7s=Mme$gySqGlYYDvt&|Rv4-0aB%o$}5bayoJof=MM|NM#c=*(0K*ms}G(K24WQ+>Ua#H1$SNKd6<711sHX} ztVFDs8s1u6yr0O+t!jjRi1o+mv!+ahN*lu>^9YsVEMRw;6Q~o6)1ir)_iNo2ndK%B zjljY)iE~Jm=Zm&}r~)1+sH=`$8Q8gnAIGD9?Go}6Sl-BS#2q`l$FTAvZ%7+wfUG?4 zS9PmgDj%x6=n`QqUnUQx-~g5zab=xuor4xXQUTBUF$_wE2nJqsQ!qinsl+`4o$?NO z9Bc9+$E$=q838IZopFPL@$~^P8o`$_2^OrnGJjBbJ}gbB11E+?9`IL@DT5orNb#ZX zG3~D4Ori+pdII&6fwkOoG;mK9=Q}(@!6>(NErJdJwi$+%ph^RvNhh3kG+rZzNa?Q>){ZM*Hh6r?KitXNk6+vF?tS|sHr}!lVZFg~uuO?zYbmt@q)~c{=J6WiLq|+yR z_zPxeG7QTJ@GK-yG57G3U%>>7Qik(d%pL`LCj-o~GrtP(D+U7|M~d}tV|Fv^IK>J5 z9Kf>bH(d_^a50R3&@*S1RJ4uo0s^5J0dK`s*9`P89C`+S7K7E}i=_rfgh!%1XrQ8U zl_=fBWT2QRA9IA(R0XIM*@?$ynB!DhUUV@@5tL|xHu<$^pp#J)^^1C88)P>{$O9;+ zPm8Snsd|BPE)UCH;3&c_KHb>Rt)J6a4#;h7>^!B?%{=g|5S)pi2`TQOCWnHpl71{^ z!yq$^a+&7~9+AC<@~eo4V$_GT%UB_*OhnpITN~%Yh$dzj#+K+M;GPN1HTx$}NCTWX z1x=UF)lc^7HfG!HqWj8wuplm!S0gTfiVU(WJ#f!H>OA9ygTv|}spFEvfWMVQWn&YXZdsX^jjEzU5MvPOaMriRZ*h!QC z0HhPBI47mpW)FP2ec5`F%#MOvJ`9yvuY{gB1r@8I)I-}3ZZpyjp`hgjx9P&v zNtE<8LU~MH7ef#@lTdeVo_S0wyCS-3=!+5#Q7rJ}%S%_H9m%9`i9p}H^|(DRy+!34 zSs)C1n?qk%c9shm%CcpVs)x9{vla2-mPSVF{<`bvLW@`PbPGt8XPav49@vDZGuPiz zjO-FSGTS44>(-)c#PkkX9QBOM5M?A9{g`=`?pC-n@ZRC65$5N`bcrjdiJo(UZflk7e7`DX(ZSqh*87_Ae;PuQd({>D_0QR%-!&0c_<80zH9@`h#78|olDsq+Zmi{MGhtk} zJD+{c*rC||@Qw%`u`y*dXf*F3>ZDgOtWbdUR2Uku&Zfh7rQMv;yq9{$ob*$52#-px zUthrm4TVt;e0e&8dlidLRZkbb^J-f_;rYo;BaB*9ITQcV@X4Q#ETPwRDm2ep`y@Eq zgh7XLH|AFQ&Ed1Hcr_iw>xR0MC&I^-cZ=XWTt-uHEpf{jmd4yFT@z~0S<{?i5Qe5kWh`a60q4YBv=+4uyYIyv}q?yA5dEbl8UYFbeFXf*}>#?DCL@ zf-tPiSZI=+--un>qi}9Ub*p{ThDQNRFDl)FCc`0Wpb z3=Iq%6FB^E<=9*|v?c;(`5*d7#onAk9`B@=BmL|6)lf`{f~Fmmez@c#N_rH^SZ7M^Wk!gy?47Y3iKzf^MHJJgtO$0e(;LM{Z&s<0o1_@|+$i{pMMLd5qz)d}EX)a3 zV86swPVqxhT&M*CkbwUjA?N-AofDT@M zNBy~rPa+OQ%}sS3JBewD^1WIt^FuS1h2n=;_Byp83A4UJ8Nc1z9d~d=P@Rb)w(U!k zwNcY`5{4RDR4ky#mj@+_MI6$NnhvaRN7FD3MqG!^-yH!gWAk-Yg(MXKtclJ@vB6Dw z)VYh`i-a?@i;ye7rUE~i+eA+D8#}E*@+IL_Y&$)xKLeV4! zaJYnDg}}G9Q~}L1bvtFO7`o%+=Y-iAvGgK7D-byVFBf6sz7gF-Z#$*e&4{^J9>;DJ zBcDThZ0iazNUj@NC?O*(KSwqi@MWC7YnW$7R2N~J*1luq3S%z-@fsQn4nFYdLehl- zW=cCm0Ut)`J>qh!z>iqQ_(MMOk=m=_3eTWpY3fhRF3NvjdJ4+8zx)-A`4ecP_YE4& zvem^8-$8zpi`Z!StZQC5DX(T=imhWUMd&eA1Qr!AqBLHzQ4Nb4W|U}Xtv2O@9b=kGPYy=l`<)u+iPAKi@gJq^!|R} z;orfalHY>AV=VYa42+u@`NUMM^6acCoI9jE-vJ*u11y=H&p+^g_n-!Ga1o=o${)N~ zDsJvN{WO|`$u1`{RZm_zVGitIudFkP2~mDrGZ8uL2n|oM)-QREZeb%Y;VaB!V{X5F zt+X+Y5^VzGL%MV{;Sd{`@8#1F;Qtshk#677&j}2!TAVOa@_4J$n2dc7Ju6T_g8q?? z<{>3G>S=&<8WBwAPl$n6UNPE2GCsrh{yZjMm;sefM)rqT`XPEKaNxsyFcx8hUN4M~ zx==KsI^wc=Iv>|eH*PR-7HP;a{x}~rk+b`;WCUUdv$s#UJKdp;zFfvtpm7{>;wB>7 zf@u%K*)6qmU^!weAP9gSkaD6}v%{cU!N%DmLQ6*_ppDa~p`QVvHu(C%=x%r7Gj2-_ z{N}-nD~70TEZ`0OJqtZhBoqX2!bDQafn9Q^)}@UOw{5?{w7I&Y^qCbjbJL2~xV4V6 zWUOeHkMgLhUJiF6VN@dxl^D8HZyh{LvP~gGoh0@peo^d0k2A3f5gaq^Vq07Re6_D|@_%m$}hec)odE0(v7(UJYz}J7- z{~wtm@WGDA*xlm!DLKArP~ zJtAN4@8`a<9As%3ozpq2mrDFTm^DXC*3qi9J5+1O-hcM-dd=~i=TCDQ?SWn9bKU@3 zYa`UJA(?iMFOB+uYv_LYwRkflCqkX2F)li^jB6I3A%1!JxNT>+_V4T)H~JU6E6c_7 zNg<>1+K+-uYKOWDWPAUh+{Pv{lWuzrRp01`WPUd)7SL{7L#vRkQ|69%yUVHVgwNvR z_3c-aT;$izt6#daHm+7#H!cmEV(V{l9QpR%Gu4LIw8dQ!=cUq@jbm+l(U@+Pi>B!@Ff-uQyAg@3cDCq%UY_$Msa_3ns95h&)dr_JU~|e z^WDuxRahjX{MI>*ZuaWFaQ6Y)m2WB?Pb)updu4p%J8fV>_2eD?guE?^3C{!>-rr~V zrbXB#3lB~Lp|1Oxwf^l`+-B_Qj}xAW*MX90SHch$RIOSNO4#~g`06Kn=Uwy&pU)tF z6hY&5*UEtuIqffwToM-^EGs&43-{kE2w=k%IwW$?7I^m`ugdak{~Gx4<{s|yUt=FU zEut-5P1SgKww9x82fGfh7-dcnHr-s(?n7+Nhq(#bk3T*Q=p|)a%8&IJnWQM4H)yvx zXMF*}M3v8@tS`i;KAlu&m~vNrsr=sJ1Ze2Ee|!=z8oXX8WR)l9wTDh!Zu+42(&BSo zwbz;Oj+<+=YsYi8tz=woDy!-|`9U}6{hgMjJjCSIqh>g$ocENR7Lw#pY1K13rzDv^ zfvAl#-5-M4I)}4gmkj?rI7!7zy!hk6N}ZlgkY1hr8zYZFA6)Vsj?3E2Z+|ts8+mH$ z4~$+}^+x&SM=qJ3H}CO>OLAawAk)s{9d9mnux6j-^L2cy=vgU%K@Eyp{cI1V@^mDt zl#3p@0%3pH_Oumt*VnKBEW$aK`~ieeV-2FIM*Jnn_kNrWL)b@Hb#_n%boDW zcye)cB6jU~qnWbAaDxqM?{Q@dU*VVC~eJNFEj`=hd`aMyjXSv&yconp$ zOQ0O^e`h%uAdYlS5Q=@uTPLjzMVE zncxj4^-l#?@4oej1W$E6$7AR*o1UC7)Jjs^INRgQrw4{?*oePGK1s3I;dh;OKV)o; ze!jeU7-GId5jeyBJr3~2C|8jg|FER_A&o-#PG2{sVr~8`Dy9n&-d0q<+mBAzF%3G8#LUyQ zb((v$j^OG^5p9VV!9CKY?qoXsl978E6s*860UtV7Umg%ZMEst9d~MXW!?zDaQ_j+mI}6__0XMkY7eH=Ro<((T55`p30a3to zf%5%4LJ=wFkG|){QY_B<7?UwUiCVsTh>Ny*E`cala_#>7ic;2%f$x7i+Mj6uMOML8 zex540KYE^dZ>{35?yn`>3~dYB^T2NTZ1X+#YsoYEIuE129t>fZDPB~)V9d_4C}TVx zc$LG|wfSbNU-kIR?v-s|f%}ZYij3`iWX1%LTu#7{#Ack+&OvTDsNxN``S%4!$&*he zVcXV9eYQXLOu@|N{Oe*(%Yw^rmXoF zL^HB#>ODUTxsH__GP_D!9ew=BD1y&b-h5xaEE2ivwS_HWrk`e;e>gxZ+8ocEuQ{rKu z^}P`=1>r9qR)MzTM#tglYzx*M?;iQGPN&-yTN=R>B2)0UvS<*&VNdbne5 zC5Jo=Uy!&;|5xP*e|^=hQ;Rv_O5I2;XHN;(9VOD&-Z*}^?{jeYV(t*GGX7fh-c>5$ z0&j?vuTLzQOf;(i!cu=la2Bm6-|81)Qk;kF8X6NGOXT4k;=c>-&cPiFcORXQz;TF| z;cZP}hN!}+{KyxLzU@{BhjG!2$@!kX!hn4b6m69Gk9l0l#WX>lu3=5y@M?MGD zxnC=?0+>-wZNW&xflmbiNor|7A>>C~?EB<-&7iq}kjp-X+)aJQv8~%f%lFPlR61X? zt?>-#uhq?YLsrSV8vzU&REU z>F24DlAJdgHUm7t9S_1)Wd+FQ1+E#HyPw}L)PF6XAYbcqusJAF*r+WIwC5$bb8Dj7#cd^RS>N z>mHH2i4kb z5S~@Y7_CpWUl=NnjN9_lTxYElpfIWoZq8Q@WGl3s+8lA0LIdrCBlAgutKddS8U) zD{mONOJ8h_n)z~$>S!<>MMFfNAB=xx`nz&98YRWHPxbT zgqYm3*tW&o4^6orL-Sa#e>BKm?VCOFV!6=t^zUo7Ih{^CZs_SzkK<4mHCjO~|?NK=ZVjhBJ)ghaob zGbTuRZ#^*gpw%QoC{0+i20S7!;D9pI6fO-|lA|I5cP$PXUX91FF=@WR!LK!^cW?ed zxoXysnR~461M!vi+uP``k+qxSTvEO~T!rw{(NVk%ZhP+kGps|W&)U5?z2j$kbh ze(W{y*DAL`xXW3A2}ay|z4aqCn>>azku7P)_}gzArX z*o^&nGf{M}u1Rx1{yMjtKl^~ZPq>>uXDz@tyd*}|`o=yCfd7Z-Sn2bD^YA;TE;8SH za^AM)W)dWz=XcX9I9_nZUejJzY+iSs3y|Fi`+=CfNJBXwOaDBI!VQ)SdzvWx>GblQ zo<76Y-V+)C0(aE)zl{Tc*-f8CzkwjOyB;0h-xT3^L&}SGTM#Y5`}{7q+l3zx`4E|Z z@$Bd!lZ|^KH}An0UN8Qj-VI0-y~O-~j2e-T7wo5p9SeHVo!ix8I%qmh791fP`Vls^CZ)Ezk@ zO$3u+uY(`uS;)VrF?#692IPIn0KgXM{fk2W#}y7v#MDNnBZX`cs12{Y;9ouK1Xqz2@1!+QUiGowsw? zDCZ$bl67r@Iq!3Je>f+XF${glaQy%L_aKy1PFxfz$_EC=(|osG*j7xfuYJD)h+cF> zaQfi*P0k~AVov`&k>AY)Qk?36GhYoPc1VkycKoO{a{hsmq8Ct`v`FFZja(GS=eDnF zBTeiz^9#oS#PD&>*T8%0^NLPVuULOQ^=4PzIOVd@8mP5CUH{qzPN$e2`3AMQfq6gY zf`M%TGeq9?Jp!~{xNV?*gJMir1EzoLMyPuS=5Lc>Wd;Ocb9>gSu5D&Z8HaZBwrAQt ztF7=0`)#XrEmEp&L#l5e6bm#20T}frO!{PJh9q#u+{&16_z@GjhT4|-6%R{L+rl6j z;|)GO;?TLb%3(s%Azp z-IBzgGRv1Q>wX(SHdlp)~^9c;j0W zLrMqQvA0{)bT{w-DhRAt3%|uL&Z(B#BOBQG7nRx#=|GKoi1v{W9}MqTZ(HWK4f^?5 zooV;clQrJpV=$+I7hDcS!@xr~B?j`(wiy9}6=2>XNqw+ixs z7uX0@BPj1SZ}Mx25rA&n-2;Q7d?0v7g7eTR-ZR&DwPrWq4|ip&KNIk~eO8fo>|kPMn=-A98p0;Tpb2dRtLqKHHv7RXHno6mO8eG!|_ z(O&^2nVd$b3#F!ka14+gVp%le&&G|MiYy3&I$Jg`niy%KxNqK+Pw2iP?}$fgeqILG z0oj2m6R6%^EMAKz1@BuN0nGt38sLxc$`L3-1^^f+I}8!H0-U#ngbc(XDcD^ZrQvRF zQi9}6v;prW#F*)yUBFR+|KuOa_Ig&!WHiSz^F7LLdTxUEPQ@?A&Z0N4p-{qqKSxFzxE?tf44*#Gkn+T55P zz+3|qKsZO9gXn)!iNId|O@*+#1}Oeb_5b-Jgc?Bq_d_H@$mf5!1OH+R5Qf2|KJQQ+xbhIXRvtvLFRE2m2;~ zxkDLv^l%7v0jUM2|CROsZ%+TK*#92KKjA$H0{*{M5Ki-Nt^DVYCj-Ki2Qd79j=`AT zsTnMV_KwE7JV;?7r~|^w=ub0BkqL!CQ(!0#P+;LNmI8%BQOGc{3JN$&;jg2aHH{s8 zvay8t!?I@KY$uN%F?ow|Dx1=%ApaQ!-+43&r;ho9+G-H$myFVJ7e#({$`bzP=kb5v zK3$St(ATP0HjnPO45?r1=;-K|tlyE;d!rqFVg2oI=`zyY+IpKC_0`eKoAXT{Mzvf_ znBj+-nG^Z*|N5bZRP={c92g|ow6u1--R>nF77+>;|tjdxqWNq&KI(N zh*Ww+wcD?&=Ex>JCbes6-RZgi`#G}n-P1>o91+}zT%?K}WoG6l9Z`4t_q$!qjR<6? z|M!pigD36}p1`J_%`Rr{Cr^Yll<3YT%lB^B>KUw`*n5{_A#oLA;7ynNg2&v?^omK` zRP8ck{JjbKOdIOV4 z*~iaC${9!}Yb}sU=!IC4GNuZ@XL%>PC7LmdCNxipjQ5$HkO=HavS7@yUp|u~TlZY0 zWK4lnW1zfVCZtl*TVoUgxbPAYJEimg?~=YscNr-xA=8xjOsI{;&PL1^UQcbis9F(w|R*=)*NTD?bXZ8dkybzi#%?U}S$n0+hXrj6Kbakr>@-lVm< zRhm@7>3-i(thrw-TGu4e;y!7Rfn@LD8T?+lZ}GYRNY0>0)C;XML$PznY2;0RTEEv< zpH2FqXOQzLCn?4w>S19Mx>vP@_Ix~ug0^?CM3Pqk-d{n9mUw+YCm&(I>&va_d)foe>PRvi|a`| z=r`u>f2Q=d+VWmyhhEN@`}Cqnd*6JTwL8?dy<}z1$1L+vdm)KaDFyE5^s)9ufsLYG`Kwt?m= zgTp~j2kW!?BF2>SzjPdM^Ox)$Wz|~Owqe!NEh=!&-Z3{4Usk%VN2)727=P5jUdw*( zaGOa&rM79mo^DQ|%S`&w@01F72V|VWx-sj+T6xF(#=48bVZxm3_!sJpKY^iRo>RmjT3c7mVW(p z#_j(72T2dlH=2oYN=yEK-xQ4$EsRnlYuiN1e${O0ai#3(-51L;ZDZ zMv~{~Na<#r-nThr)j5CGj=dK)7mrLfU+m>|R@ZGllLa@tn#uUJ#wLS|prB%{oZKk) zKoTiyv0uWMQ?Ig4PginGLbmo|NngKbpg~r@=cT%=IhXph-xKfb>aja#kS(?P4=PRV zl3wddRuxoc_3PD2_pL_TutJ?D`{fwqZJHkW;gKA4G-@-PBi-)ni`vV_j`r@&?F4z& zPiNNzAF~NDIyOzc;C9t*@T6ll7hVV8nrPAl!&{WDUtaqDJlBA+t-5J<8M+r0@pa< zD5ix@+DnhUC=qi1vgiEn*Sp*p_v8BK^{e#^l(*%BIu1}vuPw1YANA$$JF4Tan`>j^ z4pp0FI+QFceAY7G|GDsOmXPm?Rb?p=Yt*dEXE){V8x$&sCp4EZ%*L=}^?X^(VP;t1 zJonJT;ADP?Znayc!9c~g?>tA_ZDvaI4aRuizKN*FT5yZ62^=i2sMM>6A_^rs@0=HVB57`AC4Oq7S%i07~UwIhMVnS&&fIuH2QOe_<>;*x>oV zUZ$C7K=01Wv!+MH_G-(SnGYq}MQHnn=#F_j)Xn*5vzi~BXjE?*ZMW=dnG`9aYipE0 zw_sRTSzCB4X2It|U#=Om+cI2&;yg$1Kd7qV@1KKfAcXy-+xWLXDBUshLI0A2Ha0xV zIpS5xdLIh4{R$G`!sAh>w6&Eb^|SM84fO}f2lYqfw_iO}RADfGWyj*k9rDFNW{#Sg z+waCW&yfPJGpyyAs68{P541S-@UO(c3}u5c+rhm|hoxvzvx|v4soiGBtVuelz)d%1 z$HpWnSx%AEZ10uTFEY)M;F2q8q3#;9mPfs+HKud_Txst>L!Dk>PEn24Z(GkG3j-c| zcXsI~hYFbe;BFdKE_OL0!SPy)Wc23u^wU})p+YZePi;jlK=pbji=N4yZGXEbAsyF$ z_)#UPZ}!`4Yu6MrvwP0C#<<`7#Z}oc_xtA(8FG@U-ygG#m^a|nNhAmA#?P1k0>X29z}WseXxgPL`hykD~c?9la6@uWNAR zW(Qe!f`T4qc@@UIe6SPZ&#IqORB6DYHR|GJ8e(vvFFT?g&cvaICDIw6vb1(<7Z24O zdhID&5qM_MKu^LgJqz+kv+tXf3%Iwzuy82N-aC&Wr%*7bt*$F0`(~ZW&yUs*vrOBS z4YEbj@=DD6%tV89domd3JOXW!&7Yr&*|SjlgM#C#JziCy-eDmf#jDl7<5#CW;73vj z$lSTeqZE~eoWc4;p+V~G0(TOrFeE8k%vN8QWvGC3E=_5XM=Q`oiNEiNcvX^lp>j!9 ze~?zxW^Ay*xJ|EriDY3?eyC8^e8Kwf!vp8O^)2`*YbLlzn7oaY*UO(AWkrfvx~!Ox zKngsle+)=eo=ZP#nv45`*Lszt4~Gi;bHxH>>)MYR)s^-KW-KW`G+)kg zch5acGs>%HV5TQpYwzxE!y^ROg}c9*naJ1t4r=$aHZCVE21qvWh{|2{Ud!{9-my?y zADQ+Z7JFzOecqSl{{2dOj{?cmr}`ETUYU;gz00y(HC$ZFGab&06aM}KPWhLKFY8e0 zZLa+cyfc!k9p~LW9W=S!{S%f4{SxlCUz{;pX87s7&Hj?BD#58uiR?; z>nsJC5=~USMB!vsF7gPc1ZF5&ynD$my_OU)I9Qj*^fb%6w+Z%j=GAA*LLq~aUX{Mv zUn@OZ?UYJMr;paq)tN%djzYS)R(h)3#8199S>ie-O9G zGAK(L`nG;OE-6{-Mdb`bu6;nIkkDss8xy~VrM05}L*1LlHFb6UqiC&4TT!5b18A8C zO?aRP3M#FJF$ok1Ac06lQNj!o!XVHpmS7NNN*DynkN^n*m4qQ-P$m_e5=f9hh(J*R zNdOs?$-9H?^FHtIz3;uB`{&(BPR<_AK6_kyt?yd<915e1_I`4dE`3aK(s^bOIcW zkLhXXcSBKHh%7J0(k%nx@1)ygw|Ce;1L*ab!G`B-jB`LnM*Rn+jqhG>@l)TxMB_vM z``75HgZL@jKEW4_^u%Vjnl+(Fjaae`G{h$-yETUsMMiu1a3oaMOUb0VyejQ8SbtWr zVKww?p^&O6NkyB?GTh%4oMDdAA~Ag2-5mbgv{4MB(&wPr;|CR3O+;a%3m9$IY&CH^daL3i#y@{SnTJiux=pOxI06<@7znSw+QwhAcn# z96FfCM0Wxq3kKLaP0ccxLm3Rk@j9JZZtx8Ob*g0d?W*gr3x*n=N(A>)#ob)IyOv39 zT*stzPi1X;x395mfP(((d@OaB5bmb5l}u*PJE=4Em9>w@A<=v`|D3VWivk2YD(1NB zo_sICT@piqS=C-mCpIJV{HnDs6>unm$`l*Fi%U0$4mTXFV+#3!nM8T48~%ez9&PkZ zHE-%19c_VU>W}3XM^-$URp*E6a?!n94SGRm6hB#r!Vl zX@jVIi|UVEZZ5si`Ntz!6iV!-AvK$4=BeHYx29JJbX+R4TaPqs9Ed+K6)7|_3yr}% z7e8@wSl$#$Smra4vGY)xA^Q8pXVMdl80?LF-7}Hz zXX^r+e8)y#i)ND#-Ma5boxPE70j*QwHE)^p9Sa5RgrLrh8*+4^3eG|^IBM8<|MB1q zKE7fKh1a+dP(C>*wHCkOMm0uzM0&o3goyxW#(S~T=o?V)s92R}P%<{~RzUrg13Jb1 zf%ts94z6Wkl&U#V+t%Z4^W?r?e*mc=u5Z9BW*a)E2M#frHFkyGIh({;J<_c`%&1mC zOI2v3k2=-Q4`odn<>8Hn2a(P=8#nWAh`}jLpt)X*t4e+slcJhe+6bRVip$(n0Adgb@#DwP z+I;^K5sd@*I)6a|@UIlC_hk8kL9VEn4WxhVzY%~996%d57|eEhACTk;Yo!PpmV64$ zzc?OJ=}APo6K)Aj*GirKITR~qTX!B>nD?9VBoG>w&{djQE$)Xqsk5U`L-*Xw^P@LN zR(5y$mRSqtmQd(mlVx8mMe{b~ELeM$GBR@V(7_?h&K{9-06#>eqoecDK0(RFCyAVo zf5j-7z*-AFn4?M!B9SkaCigScgqVQ41w#V2umac%s`EZaDXi3v5wSr==@TSeZd zVX(w}3B=hTq+VgfLOQUUqUr@_yiM$J3$9;Vj_s}>F`3n|e2BSggR{blM%z%Qpsp^D z=OS~is>@>z2n50bIJBF~V9OmgkC%_4cj@T7(J3n{qZ(8a09oZpww|>Y`gwo%g6s0*dOd9okX(a9_FkWEi2%i80+N*tcz7|6d$?Wz;ya)H3hpr9+meoAJ!JQ)5E-f&>I&jj^f7%)SQMRx*{ zNCfQ)t|1V?MKxtuvis6zF8*{y`td(BrTjyLkv6bE_D%f)YP%E1&}lDGSIT$=F<{xJ zpuLaU6>1fD+2W~p0Knt*kZe7O#=ufWI7k8ghU{iDM-R1g5Q%UzvV^-@euG{N}NH0{3*bmvD(b&}mnAiyD{jU1q51toRMcYGr$6)U>NN z8lq4Fn-Rh06aWS=F6ON$Hn*{&QpU7x;e3M;J%Yr(y}@ye^WOSM4}G_b-p%o6;a}Yp`u6%qfM!J%IrT0Ofl#j89wxDFPx_#+qKGt> z4WKEf-J0=^lfDpFh#jf%7O4{@&UGDnN_WLCv%%lN?3} zo$0iDC^KmWN@9eIxTP)ay`_iyI(*IGjM8fEaa78J18$rao%YwAqmFl)^4Zpu_*6`( ztQ3Ta*v>vD#XgT8M%rSMBP*o$5X>HmW^|?UWR?gzletm2JZFr24VLe-YQL8D` zX7$MXQ7ejVJb_&wEk9aj3l~5^iXqGNun~)Us{U_g#k|s%jwrCcnbT`gDPwwkgV*CF z(IM)O8^Q{_bX}yWp&qp<3+jfJ?;RvfrAaAcp!RW0r%j*+?Ma}6^sY|UY?MVODu?Jc zT*{CiE2T`**&-CU3**UAr>}NNtomfNB-$93-$=(4wuVXSwMUMt9=ez^x@PN;wxSqC zWUHY=HXUntqCCl%J{Gf0VM_ilZ@sG$%jMI_@q|&6XAjtV=ISRaJB^zWXm8AD1Kukm zEOWQogvXDQ%EW zD5x*$k$ky?0l+K-=-rHTqPfxynk*_uHp)||0JU63;a@$gwmwN~?ry+qOOz`L56OZO zFlNkg^+%u&$IV%d$dc$ZHND$mBf21)peg%-4%wX*iMdWykZ{mwk2(4yIwgFlK#)Cq zvb5YbKAD|Eq?yJ41}I0KbWiGO#%VAM?-rhB;y^&C$AtkXkgARrIrpkrzP|`PC9Q%u z4_#7Fe%#=+S^D4@!)^75lk%j+dC-*OCcTHd496FQk-pp}KhTb6oHQj{U86T>o~)_5 zIdLa^B|j$PlIEbw4{=I*g!S7a;&T#Oq@Q`^ean8c1_k5rI41_^Ak2dv+em+~9L!fp z?=HDn-1A=-dx=aY2gWwCo%DP0AR-?%dyof8bz(?9U@{S3T^D03%b5!OidLwVtN@x@ z2|e4O;AU0d4>+#w_)t)uN#EBN)2guX9GRPqr85vA+I=l3cy*<`=LtFB{9%RwR|09jDhK8}m|GY*+!$8B> z=$wIu(K!v{jWn_okPh%+80r&}QvcreEWLDG#Jd3#uJ{>hR-LP6DQvX&@^+A^Io66- zPRUdsJB0_CfBR1_-u!Z=sBCu&1Z!$yWh|D=DcgOa*&D~aQ!v@*Kb*|-cfcu_H4T8Q zM%odnv^R{1lb}F=TX5h_3qU($Q|JJZ1U!a4IM}DyqXEOhbNQRM(9s2fAm!iQ|LzHx z`ah$FgGJ|#6D#uB_niB{y2jQ@j&sAYeaA<^-8Y;@8SH|rjM}ope>rVgsP=#PWoLk8 zl!biZ9bu^ds4Ia*od_jn+Y+k{(M(xVYddBKIGzFgVk?!7>g@b17aeE}u@YH{5=DSN zhPQo|yOQPB4OCfx1!+i=4S58GhNcMFV5yf4&w$YQ-_|yUEc^kODu7HH5BG`qYbVz& zt3ZDl@41<2K+36@)Rs-ZNIXlS>MS|b|2@?`4an$NG28=Td&9v2)9t71pOsD3Wio}9 z1}Ti=0K80dgCNMo;$T!X#tll!mXDfpQssxpisbZ~Aw>5T zY5`Iihs?sy@F6D47%-KS6@VUMymz>jS4k0CGHm^E5OX+@tqz+}vf!)3xb2lub%I1l%N8lG zJt^Eiq}ov?Iv^$f%y=j$3Y=ZdN$>ZlqES^P);Iz{UQ6ZxRA_X}vodaCHzv;)qEtcX znJny`ifway%+8^jvxFNNFWzuDyMxD9p75$mbttotuwZVFOMuR5U!~$r)Z-FEYuYqz z-1#P|yXC{;4NXns8k-dpCK~73fo-1tHrZtg!8W_n zE&UN|E!NJ~5(7w%j4c0KQT@N3kYsY6 z%#o@|fSUj9CbRM~X2&7sH^6dgJ)}PJg}SPPB87#k$n>LS=n!(GwH=+rG5rJJnvRB; zG8;Gl0f;+j4<$nw=Dv)Qz+f0nV|`hB-5>{VP}yBPO)Uce%*dL}cvrfj;+Nkpo|2}L zrs2jV|B&6&cA&ip#IlV*80yB|ba!Pafv!S`Y_q09!XwgS2H9;fs$qUFWpli_1ZV8u z1E=b~V+9_8<`kR3k=2Hy5Oai$i`H&4WJWJ?EH+7*@{yywyjGRbmK-vo%c0I%!~oP+@v__3WtT>rS}$x0GsY*>Y8x z;(Y|@+)CpAoK|lK;Lwp_z#jqJdH6NPy~?c{G@jN4fU%9f4(f&8%)FR;(Y#?0yzg`- zGIS5q*Q6J0^vT7_;4gD}WH)+boVpOv4us*?qugc;=rX{lVw*czuX)m&2phlwOaMyC zL^Fg!Xk9*kKsj=l`lPnA6PXzePO^Hc1x>Xc7kWxB3{a}=Hws4>5KPL*xzxV^?!BEU zf~c_2l;PcsC?*;bPT@w88WvN4zFH_`@X(x_QFRS<%*2z8a5qkStrxq5!EkmFa8Sg2 zP6y`+ray`tNNOGIz@M=ncx>rL6RF8o3ecPsFlOM4m)T(^WE7}JEpkkeFwk2|hZc-Q z129|WqZ=fsYzdM zR(GiD?ug#+h1C_cZqa(XWo@2C$re^q4W zMa~dr@_lcdBRVv!F4C9kY7p3Eo{An~sCpqsx}fHQg`||f=B5B$4I4T6lH-m!_y98^ z8XJesR8Mw3;B@r(tg0Q7fna8p#N+@n-DoQ&nkD)eZ89U_aRYzf9TiAMip&wL&bFRs ziEpdiZsagAA<5w)fs$U{KbazXRqjxF6#=$+UZ!Qi26jQ*`Jt+4U+ObF(R2XH1TBH$ zlq%wF7Q*-Io&ijN#|1|^v)ixQ5LC1ijCo3-E+9f+jzXJD8T zmJ8M)Vm%7Ora6?jDgzG+{2u~G8ayc*R@Rt;^2J8Yf`{uVRmj$+Y->8W+`uFSB=b|M z04bR8kd$Dai>orc-X4W!quC{H%K9Ljrt55wO*1}XJ=g)RFib%qN~VXj%P925lq?L} zp+uHpHjJ5-3!~{kE6doveG*GHFu73(_S;w_b$~2s@nxyYMZ-Pg$((l=mN|;#-_25@ zb5dfC1sWZga!cx=@*20{fLPDbmux|6jvb@9?;9Nvh2AG|>{AkyT$NjtLX*fNdLL6- zG(!pG5v!P)%q!YrMe`2iOy(-ARUVwoDy?dZH%^pSVPbi!4md~y6Du0EIn64|5*xL_ zXEIi`!5(@5xqgY0U3RePqy0v#GZ9zW>^mPd(ng0Q45Zpf4vM=`ri=_w znKDrJFC_(*;UIy719Ijc{s8=c;TzroX;7B7={pCo9`v4RQ8G$Kz)-}IDj0HA`~O#8 zz3KfQ?eaf53C(AUn4u$@p(7e0L`HvP&m%B%T7Ep!e#rsF18j=SLCt`+P38>YUJgoc z3dCX2RFkQm9ng>M3`A&n0iX-S^wQQpa74j!sPm8vCs6KS zixfRntpJG5n@adAc!QWEht&MCybF<(m zkw(=p47_|<0SORt-jv%COma8{fA%?%MnerW!cQ8L$anDZow^xQ0N$+9cH~s8S#Hxou{wLMR$|GS99UyH zeh3{YTeUCQoV9>Wfsx<_79Hpvc0_&`S{SO)jFKhsjTC}K^Dm|17QLG$C@_f1ZfRHR!hB^xlAudt+?hBzJSJBKSFx(gvp$x50d(VGrt>5SSj zB=xL%_1E0vdJ4f%CTr1GO9Z%3A{|ArqOf;O1^SlF$FAwq5wT2&UJ6}(Nr`Zph6!5qX|8Bch`P%fO~K7 zZ?A!HO|YXYst_8|6(i!D&yfF)ms;H*o(61v;L0e+@=hVAK|%Fub;1L%)wPqkEGw_=2g z0PPzNgo`XzWQQ2g7+sm#M@H^|{zpb!$RoyHG*}WDv|OI?NG)(N-WM`D4sK^xPIYEQ{=73 zV_N?>fPLd9P=3I`W|&juKZSgVfO$6WAF`V4t1|5#(n~Cc)}KmX(Av)XltL>#X+^P# z?iqq9w|wqmvTr;5?6q#RYnWgPem0Fwi4(l3tDGn1!gnoNHi<4CXVFQs%$TcAs{g_?F3%>N*eSgk{TrSkiF~bShJq{+N%+ z=nW{cFMI#tt&Xev#C<IZ3Uy+^V@ZmBRF!^&kndwvr2jN0Nk)1`#Qo__e_!%Oz+jqWxK1KPhd)82U zK1>LBXQwhX%K@SXtp4R<){q4xHdyb{9jU69m&5Dwf?QZxo}aVH3tsIZ@9w#6&d0lC zDl=uQVT!#xHodGz*VBZV08l-4t2pE)OXQdU{W+`vgpQD`v()#lBN?|Dw z4>pM&86H~?Kjl{Pa#A-kk|XBHbO+xkn?1$25qb>FzE|0G(un2%F`VMX;TO`3=6 zh<|Q~A~YC;mhtqStD~lXagc~QnOYK%t{JP93J5-sG>EkIeQ5u}@S#B>MZoXU`naVo zg+jL$qy+j;8(8X(O33mx^Y4)Awkkv#rTW`^5C5>~W06P03Ecv|DA+(r&$a1~IjTt- zNwtP#gfe zEgTIPYo(SQGInlr^KdqGBs&kEdaqM+YB7!KBB}RNhb=q2Og|aA&}^vP*~WQcd78*@ zj&ZoIiB8C3)@*?@ek~aX(m0^y>+(@yBWs4;a5&8*BdrHPW6+uRY3#H) zwMx%hFPlp%Ny^YFsz#raP9!Ne&sSzgLDl6=K#sfcAs90Rh3|R@VdF)ivmxGVk==N~ zyZ2=jUa#XEFVDfxB&Tr;)2_%Ir{tS7P`!A^dtFlt(%X3-vs}U>T1(5EvGs5t`^Y99 zj}Nz&ZmkcDszw$cZG5Dl{M6UjupVv3Rg7f%Rh>d{!TX>ZcV!=C@+OI%@MCaBuVQph zWQQMwj4D+e1p zYz#5M;jxu{aMa-24?M0}s+*Jcq#s1T7L}94?Sm7DG_~GCFd%SNdsdJSeWFKln)ICf zye%q&U1-Nn#e5G2#e7A9SsuLf(qk=6&0a;tK9s!?&j|UHWrY#xL>~{P@tuXcurg(c_J#ywTAyslSdb6BriS_jN{s7D)^? zHY59wh|cfIuXk*3U^5i>!+zM55^Ix`l7NveP2Hk}&vMO5DQw@rlo4O>pfAS_ONfnA z?JtrN@;FxT`wJvqRENP{k)m6qKB7nn0~u6SX7)72O~?D{0&*CA*ZYQcCG1&|?Ms9-p0 zO*08t$#r2nqtZ;chAwEomv25EzY%{TZ~~f<8^W7{`@kbPII6oWy{t(P$%T<%Iy{t$1#xA|zvLSmI2NXZcLAf__5jJSNDm`+Bhz=offW5cB1lrrc>{S#! zaw>=NrXgvECu&#Sklq$4{^{+hl#+MZF7KuR0XvF6EY;|FEaGCRMvlHRd`{;6R*yt+ zH_$spoJ{fY#r<1x0%HD~?qs9AzZ~*lFrKC^K=~BIdnZ0ts&0lDV~NkFoh{UhAIQZIa!7kOZ1TwROL#eX;cQ&V$v3^a$E21@xHY}J0-KEjP z#;1aEV~Ao08eZglBhA$g;F=C5ba||G@pG5Eq!gIwk6EnGyEW5962+gX+dv@dY8^Jc zjK!8R4sFkl)=ShMF?9ZqZvT(Q(%3+8H8j4oyT%3-E{ld%TGL=a>exe`_F{!%amrvl z#WBMQ)7Q}~9UDU(wyv>hL>}50iC|Fp3LH44W`7Rnt;aX0H?jca5FGpHdp_M55j!7v{ zuBlxfhe7Sd-bhmxSbj?S)V_S0HTqI&znG>xz7$`BgJ3zu{r-i)ZLyF1pj?QtKTT-msgFl|#HOVtwS~?L<2qWPc}DaK~@HCuyZ=5(bRSH^quHKsOf8iTrwX^S0}S^&@mld0&(R*Jgp z_`U{9{*;v8Ic>l`tHxJFTTv*YfQI`5t{JtaFY>9+Qyp(M>_e`7B*6IXu~GK{2@P;? z@C(+d0@mQH$ebQp??s4V^_wc%c?}$;hJrP~GG4yP$RYZm&ig?Oz#fNQMFR-LloR<` zj=-D9Esw$3ESZj+2*nrpyoJd35?HVg@tr~us*{d1A!U~WqxSklV;t3J{umf^jRGQ* zh44r;{w!xWaU%`NI{xTVs70ZAjRjjcPK78i`0{S9@H!&RO;c@SF@%XUe<4+(BvuXZ z7_$7*H2`)hN9_Y5BSijfQ2ia&Yf|=`%6Ux`rnJ((NwjkUD5A)27OrqwiA%3aQh9Dz zQM9inl=lRpcD4kzY=3+-{@X!*X>}UQi-j}Z3!_!`V@vPQg2*wC%TrOj|Cf45(#|gXG}D`GJvnVs#Dw+c)#ED^#r487GR=diZ_%muzL@K8+hvF_>bsnasgCYNf@a1 zv2Or&-*aSS9-VOKT zS~7s5cX-D%J`x>T7WAoSCqv0E32gIVp}FFT??FQ_(ayl2%^8?MVv<2_6fg@?AL0GNC@wY!a1Op70OyeY#(kvTQ^w$c%gT^Lwb%ko~%788ij71C*M5`4+P( zP0APSNjWk_N9dl^UwSX}cw3A1Vk22&dn)|_{O+o-t_-5~cNsJsC8Bz~7)g?)G_P$l z{;Usz2|N+(X)M1E^BSjz+ppCevPh119arvE30o ze#9iG7Kj`%1!^SO^a%y3kHbegje+GAdenIDIjSeodRPG{kpNtG?LOM0X&_QW1^aTN zNO|b-h&g;56vqt?Earkg_0mN}Jy*3&@0hm`1jm^F@g)o2N9{CEo`yym|g^R0#G zYS2YM-2^mOsZ@hh0J_QaH25wPFlIb7H!5N>lBgR1^zA1-mcm8ghUx;~aIt4ChN>L}g(BH`WnE z_M$_p*sV^n5D!HhMRX>W4V0V!*P)d3-=qpsu)q@hD3}1zoz=UA(y)-(MY!P{k!3&d z6vJ)yVgfZAW|R-D;B6!k`u8WGk) zUz2y8RLRW({FPvjKq6A;%g3Vc3k0cWf0>ql_2|!?2d?;`!f+Kta8Oj7XBvL zMhjvx1C~v}L<*B5y%hGQ@=PFMSjP+jcF=KhvN(~zbY{bOYd0XMv(WR(u^kQY7J2fr zJ;GHrgnUKa96TX05a?Hn%@7Qor@mN&S~xPw7aasPjv7FW&E@aIlk$zhb(i|}{Jsu9lh1PYfK=z}>LaM0U~!AeMF3R}DgVeYlm-;1(H%meOKSHssUMY$ zsir|%?80$VAVEdX?ZbfQ%gqari?tyHPZa}fV%Kk)p5 z^AMs}8JK|aE@qm_Y|FnGd;w2x*)y3Z55aSndH#t3c42>e@_><;?3#^az?|da7vps7 zkFslI8I((e;6#@GneLa+jhr?-XhiSY-Hw{Na(|~`cEW->s-P&=@nvSM)Ly8(R9$qp zsS4o4DF}qL95=ov7YvB!qd?^b5M*fXK0L8*Ew+Vu6uWW4lvR1#13QJ zZ|0$$fgseYdWT)PvcpmHN5!F|%zo8S{a01ir3Q)tDZm~gO$`%3q$%Y$I4%nV{nL*y z{jg$>zzCP#)jFP`MGF0n115k_iDf`Z)hT6YWu8?BN{3+{tmu3+ZRI@kC=%kVRWU8E zY>Phpj=%{>>3~_JKtFmgpcZfCP#3AqMk~`M{9Pk;fHAGD ze^{PxiOpgf1Rx$669xoV&-H~x=XN489QzB|OI`#cOepl@(Jnf+38_e9eXu`F)_><5 zDSV3uBo^CP-qNzcz$FF2CyLhYDW=K$cULcN7)SfcWLTg4h&kO!;Jr=4g>lQ^a=Snz>8MC#VJ#s zo1{1vO}s2nP!~W+L{nS{Ev5Y94T>P;`)*4Hqs^_jJxMSP+yk=dMa;L8pG*Tl66i32LKCCN_ z9IV;aHWF={wDG-;aKH6Ui{ePQF?OaQn)xM+{vTNwMx$nKZU6VT$A9M5H-#!i8zGe= zu8OjJ|MM#Yk3ay4``<#pq}ZF#p;i>Z(|d2w-uS*nQ2rj$e66_$OoH7*$GX4Vd!tk^ z)QrqT34#W~I;sOea@Hj>b1v&IdM_C)z#Vbdac$EqzkUXk4eVPiLlHVkWD);%TmXRl zm-Fw)*ogUJ6$bKxSy%r%sixuItsx8FaKO~+-wqg+?M3|)0sc2k%6y$k=^%xRVKfN& z#{jmwN248Yg`ytK4l+t}DrO*AcRY^L2iv4NX+@vq27lUXsh&D`Y}(4_vs~zsXnk!^ zDvgUN$Yg((dy_cH2$D+P{YZVXxdfAsl_IUIVwbA%pQex1yB)$m@9e?580V~}5HGHuZY)?;YWyPPUd))Ay8PqeRpXD@) ze!>@T-Vr{zIJ*7alZLCXpU+%9{Q75?q%~@;sHTsQY`5o!yaN3w!-E!8Yc5IOeOsHP z{O03QOvgUa;)kc+zt%R#Z-2Vl*two1)jt=T6@NuFd+mJP!uY}`vqA9+ZTq8u+u}TY z>4U3Vyu> zQ3mRomzI`!Su5O0x99QSrL4XapIn&klPrE!r~gTHW#!m(%j_S!u8}Y;pYpb?Na4e1 z+dh#!am944X?{X{sa@fxv(sGI#K3c(+~6g`&+=0XgI7Mw%{=|dTA^rqZF$(`t;kZk zqe0b2Icl0)ult?#gmgJ7Z}jw*f!#Qv{n?*#II6zyC69mogEZ|1+t>fbD}H2GM7s}O zGW`N{?Aj9fn}N&LQ;Vyi9}*Y}<1KBIgU!7pmgnwS_H4Y7;q;OF(Q4h-w8Is9Puc7{ zYw!cT>(bmp({<6>+9#4YdW#x?EsaB;Gu6c=wf*{Q$tn3=Ma)c>fbA7j=dV@7Ho?2M zWosHW8yR%$%AFd8|B0Rr7`^y}&vFFZ*@409trJsy*Lt`EoDYk`=X8_TBUWEOpvn>K z1w}I|4HsAXnT62Q!tD>YT-DcBc}LLU-fsI5v1P5;I4UrTC<+fbxIA_z`N+Yn zn|;MzkC#HOCMNx)JAS}P+MiG~aBNVrXjJ)X4;Xi##Y*D)&9hrij1No)Kf_Z&?jzs$VDw{7^0ajl4X)u>L`G^_%bNj$SO~ zWp3e~-QMl1FZF11ntSfEv|3Kzs-|i!SRA@~Z1(wK-N@m38{w96t)^+gq8Bqear+Ml zN95Yd2P^l5RO#2}+`6qMuOv#9=TGEa4~(01eHhw0SS+178)txPZ+!b=+3xyppXG46 zKV)v#ID&d?l7+1J8YXBR-a2D@Exq*&r&UukEc1G9>*@D>=5#unwST!K(fyXu%dC<( z$U9O@lPj04KJs?&#ydsb7*?2FzVh5v zzSyMxVh+-tSc}kAR*i6VIrpy|rziy(bJXS9 z--?*i=@AWAPkpmlW!NgtRO*oq9;=*$QTZ&lH1`efarNMX7pGc&3JV%(Y?``{HM&>z z%@3dc_2Y%99eID$NTz>z@`66HvrcBH?`NP7Mr zL-`Sre>az^Tss&$lu`6`JQIR^W;kZMbakFSAs#IVLP`67I%gGhYlc@p=4V|)6tQ&* zcZ95cOl)i{8m_@_u^;>Xwz^}HNSttG(T@~+OVYp8vbg%4rhEDF^2$+z`k>sA0YX3h zaq#_mFWo_telh%rHRXX5ZMpXZ~dG|t+%~&Ew`|?ZZ)C*&7E!R z5!U3>k;HoT<f-;ShyWA=xV@leT6bBtL-s zD{-XTsPA!N{*6`Y>v?-#WKYETQ7_Yi<(AEH1@#|2Kep3s5TN(F%+}`ZPQ2cfC0(Y%`?A+j5@H8|q_OqPTV}8JAxeJqzo6j+J z{Xj1tmEW@V!_U?Pjr%N9_JHS^3rV|_7xUkol5X{=`dZ7rt19*A()uj7Ea{R=uNP$!W?WsOen2;cTgBEX|D5s3 zVf?^nxyIwHBhYK2&zI;Z-OEDF0c`5u#ZDM}d~$Wg^2 z^a8dfX4OPb4ztaUttHs!WF3h8Dfevbx#mxg`!BEilH8QOzUj2TU!1CYzShVmuP!g~ zs@O`>lOTMUq$Y2H%nTj+HU~la`SOSR)WtyNyM}&>U5Iv?mCM>EuWo(f!>d*oof7AP zKJx_T7*6~??W>^%{@kxWo6R3^hZop>gC$Ki#)q{fqC5r{*VmAe!VbuK;XUDD&&-0L z$UhZH_UU7^pt6d`*(wKH|8#%!`&JV>!sZ*~N)Hxe`PZLrC;NHFtpAeGBJmsV=(2w@ zRk}HMQ^vq1wM%s)u!Lh;D1_%-akT1wX|N?AVnB(9QTl8}L2c*u`7 zV!6%aE=#-O6YMLT1yk|gbRWBqcyavL$A4W@l2$rNC;itHE-yyRCFHFw*LbT72XR(9 zu9xa2mnvVy?Em9BqcN_s?rgvmd+`AelIOHsxOwS2?s295kbnhK@!6{%503S((kcVq z50(~823Wez2LlGV@Fb>3I9E5Z~2{L_OWa02CdsS7tAF>E_W}ATaW0q zZ;h(+eri?kMLuU5R3nw>7Oks;v9;-FtF+ehtJ&YKMqSve7m}s*_4h3pAFHnk_LcJ& z9*zCP@7T53=o|5i{88-7)xFQJtdDB`m!ruVb+D$rC5xSx66V(u&V(}7pYzvhC^OZ&oN>duZ*D)A zBu+hjI??pbUF23vv-(3PZt>4gVezehCYlD!zwi5lwYn2u^Td4OQt0}+-)Ff++Gy}) zxn25G_N}3jd!kRT;g;7H@A+97saEDTFP~@@8;eeeSIkdFTUr|xz5MY?Kze=UM?_*L?S=Stvq=S8{hAh6CoH}I{9q+EkE;}eWLi~ z-Z<@6_HfNwuG-vM*4oP86Y;g*h;6rCE?31nOGDcZE>(Tf!>xYENu07z{t>6S>z83u z!`bA;+*9vg8YU9Oxy_iM$2;nlg34PaX%pG&J`W&gYpWBga|^dE+a^xONrl>dsf#XUOHfGBa`W4hQ5|KL zu|@Gtn{Kn#MGs!?U@X5GJP4l9`)wopTL;`)yK`tSC!(%{LEGo;`LSHB{3 zDaLLhbZyzIUa+d@y1C=L+h;jofGOCGm|C++a(Wv(b(5Fa6E=^+X5`bw=*|1?=xqPP z&f$jqCYXMa#;k2s_^M09oO`JqD&T}dMDx0bH$DFfukc9F?a>_`>*c>ae#}XizPq=l z{m8lNSHFo$$ES#I@gbIa_l%{vbq#3astYB%XRu)?#F9!X|QhmjF0EAJ;3yQY?*UVp839Z?8` zC)AC^Nf(-{ZV2D^oB-QrYRmHT#aVfwP~q8MZ+#g1G`Ig?<<1Y|pXFwo2Ce>F@o?Aw zXaZ-S4QQz;dJ>Wlddp}jpBp4SXxrphj$x*XKZ$+~6^GYU+-kZrGXFk)?ZKz@@Ps|bKCB0l zb!UoX^XYo%`THxD4DUe$yc2wqTzE9i+|NwC3+2cH2Uz?Fa994i-}c@SaL0>!T1c?g*Vp!)?b)U@tJ&7`c=ZdL!X{J zY9+4~uC>qYSMzQZwbz!6zvz7xA98T3N{yD`A}6no8`ZoZ67vKx<^2(!KOLKRvZKE> zRKkq-EVq-qznMH3FAWDTfw?SdShpEwsNwNx%*z$flDE>8hr@!*@kmiyQi|iH2nUO} zwZRDP1@+rM@Uo>#$n`;9`onG4udhp28FP!R;H62U+xIN`2;cN1Q06$BdK(KXhIn?} zfomMu@XW7e<2}S{YxUqk^ICoc(<^KBn=Z`0`7Qdw$(#c{JH{Pv=OFY9OdK7~{VUg1 zK4~tl9-B5hk&V#1MEK$Rmet7ZCzNx`H{UmC%_VI&9lzqVyZM^HUaL809Z7T@3@Wk6 zzM!{hi1p~lhkbz#g&Jo*M$AbE>#CC9@_H+G{SyC|XTv&C`{Oyf!DvbU$L{8x-v&P8 zpkrHYEra+3{lwQU>zLmqmlNDua6avtmU;`T+RiqntN`lE-380^haZ%_+Y42<=Z6->cbUDD zxa**zGK$C&mvP)h$5BQR;tDE4RD=kDw7br@Fs_J*aT!HLh>8#ap&d6=mZ%630TXqa>sHmR>gpz|FAMW@wAya1R%Cn{^xMIZ zk8^QZA#1aFwD$a&kzJLPudyX zvi!{UOL*XG_%k6aSu%{Hje8ws`DQ!IDwbi4gY(i$rYC7I9eK^!B5KS1Ns=Mo{iYH6 zIR|O^WEeWcydoMtIK$L>+^c?i!utAAb%MGU{=V(SgK{4^R4CxW$IG|QEKZ!o zPAvXThG*WsK5i`I&ycVt?}x9PQvGO^2pC&`YT%-Fs%pZtT~%p0Qe`|60&s&=qO ziat80Z%*pCODpk zzYgW*Tjnko%sd?>u0TIx2fM9^kPuao`MIg-4+~>e%7|!ijKTmMVb-UBvzq3+(QzYbq!1B_~Zp%%Xg2jn6)fnkeOTT(OB^a zPclEom)v&0mJvvx9mC7=(Cl)u`@2ytfkBBldu0Oh+dK}bNEDyyn5EY6Y^3SZ($5}F zEGOI4{k4oYScsKmc~riZzpBi;mf@R-hN*=Iop}Qs6Zq`-iy<457d?*#PlG9!nyFo2 zF1@5!Hbs=DQ)=RwcWW8qYGi|?N9Tn>s#?ao6}`mKpYd8oW-c}Vsu1gvBCgq_lG#fB z%!Ia3qyyM)mbd}+UI;)1^)xlu0K z8_H7~{?o{_A8%or*odm@rTlz1GA9n%tNh8uS`o@l6De(_*kQyoA-f!vt4jQJskyo3 zvhrF+Nm!nc<6Bgk7ud(zJ2TEA-rq(w5WYI`;1~=j^)t*(3?@++EDuVpn*8(3dzP-# zN@Jlre4rhkvH6}wyZW2&SHqx9!n5vpjPXuJg-Z_xG^(o6g zmmmjd#s<6__Sz4*|0yQ{b4grbKCr;?K_s7}473W&Kb4e#ILLCVwQzndhYl5o&(8C~ z;>F%CH;3s&0Exd z_7n(N7H{$o2r^wrNuZEeg(Qz2YpJ=2Z(R0l-?TRS`rCwGKY#xFUF`}xl#K4aB6YaM zw2{m97XCi>J1gm5!H;J3dq2k}-0D)RqJHg}J$%iX{k~gP5IQ3>My1SVvs&(*s))AN z6%J5~wA3OEgUtg zbH<5tk46m(AKh(!H!n$Ah`i)9(M3om$Jz&uj`egvhn2c{?#RDgoQbjVU-sUWSTj*q z;xtbOe`&~>pLNKl#M7+M0w20$!fx$_U2ujqNAd{8Q157avM^W>j3kv1g1}HmiKF(H zpi|+W*NtIxd&V9n*f;i6$GoF=er7J=aJR4G&&f1TBG(JUCE6<6qI|CAnT#zQ?`G*K zG1CSw7e@PHme?{?lWmxHo5%T?AQnNlj{c}v$AE&y@Ci$*DcaLk4p#8Le zxgt9^-hl%fmMv1-2iCr6;U%eRsbJDGpRCj)CkM@%5S_Po_|6TE*`a=CoCDs4sm#+; zz^w7ecP+P_8n%mF@C4mlRl(at?AUnX~JAFIfglR7QmSclA{Ql3vsj1kwx$EyAgr`xvwsv1)`Os$DcjFh?ILvz$;@Z<8Vo~dE zdo*t<<}ERgUAy~!ZzjLXYqNci+Vc*NnbK}>+j3Q@;wsyo%%7}G+TpAX`o&KcE)Ni5 zuTDQuZT=ISQp^k#9yAC)kkm>3c|<;U(tKq^lG)OGPCRtPm7<*jmD)q@%NH#kF*|YA z#Py#>7Tt`x-M%L3<&20|sdq#%zFtpPWuM;M!AVk>y7Q+M-PbQw?HkEiK6l^51;etx zw_W?E>It*W?v0)7(Kd&N^q;3T~z4WS-cteN`vXNEnr zEMlGRH*)cSM>~A-HBA3-6!UyTK@g(8_;jOK-8;p%1b=<>Clg+&V=sC7?~Nwthw zXdye@IRtq<@$JF~nP+3hW<`|raZO5k{8Ex%eO)Qec8$lxmSK&@YAnIsm#mYFVIXtl2=Q!1=M77fu3?Cpdg(#7NHj~Wt%*ty*buQQ90@(AzJ_K87cUIds;-n{7#`?CPErP?Nz#tSKV4nvA0c+0 zC|N1YuVpw{7m}4?I9pdEsw7mEJEO+5d1!oY z;TCj@ji)xUN}I1DP<1x&7RD*_$l|fJjLESvnm5?l$%^c-OGFjlK0vgsko8fQAeM{l zIkBpfIpv9jb!od*3ck8Knu{-#OE?i(NlvcMi2QjKMTIhU79PM(y_#Qrq|Ey&cl7}I zYI#N_lBT&UjGTy%6AKDa-;NHjgvd0cl>LB2PZ!Kyl)?*q8Kvo+FcT4s*}P4zh)*aA zj=7h3%muRvX7NV|E%VvA_fHbH*>bcnASuBq+$i;9<`y|G!Ve}|;RHE0fhA=Y z%~Dn0JcB4Ajvc#N%ji-OqrIjo5ysXsxKTx}qi;E>Ag~BFcO#glpBD*7oqRx;+0m>xjpcsh;%?TTYbb%D2}j}PUKnUaT2AA%u>Rt6=Q>A zT;8m^f{1*$-gw~oDBoX;i1W{6gcT2|MA(>CA(8Xe2fF^sDw$uYd!1v!uK7L@*ASwF z&bDm3VSyfIwld8;<%6{W*F38wnv6N}W2FkL6c)uC36V&qZ2?o2u5`s%rHHpyns5w# z&6jzPQ^bnA~!L&qTz(a%j(`bE7OAR^59k*;&Hc2rn`IRzCmOvskY; zQ0H56Zj!_sg9CYw3;8*gGJdSTDnBrqbHO=(HVjM&_-Y!08m4(@AP0`S=6k>y`5Q#4 z=82a-k3S+K)>~EJI9U?W*?(A_tsI8S=BE)06X`YZ-qe94NB7 z=dMF1lm86d{G$Ex*LRK{xu3OrRNsBNS^=W9)m>Im`tbuJdb(?xNVV=*Q zJzLlhRlJHlb-s1LvuDdZd%kz;QTg+6=XuG=GoDS}1`-^1kNW-TF2^UHSJw4d*{Scl zls-p(f4XVxt);h4pNI{PER4OI(sx&{ZktaR_j>Q!U19nAQ|;1QJ9|&w79HlXG5cB0 zm`A*k!v<|Q)^+39aH)HboOXlFCfMJ7GQ@tzPrs~Y_V|#%&|E&|9=p0cEhHpjLPE!- zlLF7HcKYDq7%P9nD78sG6UjMdlkOd*h#2Ud9v_`<%l21fo|oE) zS4mx@w(?kS(MfCJ;dq`G;$(C1SuY_Lv};+YXA0~bmd`EwGiCk_A@|JrjR6zq?n|?x zPA{+4dr4nTGryWxvG1ude$1ma6Wqo;4ci_URE-E+vXE(t+%DhE%fa3*JoQd_r`=yi z-kvKbI7On8O^FYV)-pOK^hhb-B#Q%LU)&%TJm_BKuG}J5v#yg%)Im7-6TU>?$HNHgmVB6vR#Y zYk!)J&J>+oCVzY5oKIVi9yw(j_ej?UY?QV<$#5y06j^d#T;1xVc2frNx;&>WhAH0q z!FSKG=*NYB#DI*R}Qe|4LN*EO~Q(eA#`X_CyM8=COv^s&tR1;<7 z%RFoLf-BQ~x&)m%6cF?>>DLfp>cA1Dr8drfg7Qf=ZDa@U6~N7q-@Ek@Yz;5Jsz8guYDeG%PNMNYX65Xzd3w`1-=gc4 zRuz(tXtb~kPwW_qDDRWE5FU%rAnMPm?JFkww_FK_`UP6pyvao=xI$~zW4YEvc|KAkb_^KUsxJtO~jcxh8 zJGBf87XciEJivudh=g;CpXFf0=W8x3#5Z%!C9L;LLd>~*;>gq0qw)^l6|Ua1CiNyq zIK1SiF$Y_iO%jL6*3BqCcGmZ_Oc`B-yI?U1vLxrsWh`;8uxiQj_)NuSEReiF?Bu@t zqsw6B)OWhc^O8%LA5VS%^8J>7?s9Gu6V@p^JO{fU_6QuM5j}dZO=Hj!_ zwA-Y&Z7^}li&~pncfNmi!3rw3;xO>{W-e*sXPIy4%lZEtvd!H8SL|!+WoVZUK?e`6 zkD84a6bF4b+H3HdCj&e^@|fkimJS1kzSZpzZ_HaX-tw>S)U8U^Jf4U2eiO~c+HyjB z6vV`F&rBX9FZ#{FAD`ZTx>warMLBm1_RjH|-;XnII_z|vj3i5y8rhQXr#T&4NUAk% zuaLArBJ}bNqFsrH99>bARN)Y@K$d`W0_5l1-PrdtVlO0FUdk^Nps4+dcjY^tI|lZ| zl+{U_viq*+a1H74!zrW=;mv73qDS>#E`3^6 zT({^{wW52?^oa|YL782(6MvgHojLdSJ*!5Ro8KCe-ja8c6qo!w{V%)t`O6=6$ejG) z#G^5f$D0pq!CyOIwMD-jUED42?;ROMs?0yl_!xJ(OVX3}S8O8^<#>VB9iGme{NZ|$ zCK@k&x{@F0*S6cPSw6dm{ng@$D2&~5@ytPOT6Z*GANP2}oVWv1zCSQu;(wd*;imkD z{%!XAY$>0qzVrCGuMMYY>!T&ahMYYe#IiOQH};!UzToD(u7wMiEoQx&5i<3uF66+y zJF)Tsc8d<5(*>%t5y6t-Z^w{XOKf78y)Q(Rbh_1T^xsN#S%;UMq@N-gC z{&(|SG&SboT6E%Z_rwmPhjTYu+x1G^6u&VnV}{q+7USR))ApK|pma-!)NNMbPxnro zRob-6$Xnof?9Q06WUul!&Xf1*U=2h<&Y0xYaLV2m>% zCw;S@`|08=aC`-(DI+^};2@6F@6JCWVhI>uvY4x`xQ+o~**iYgv&z(K`W*>hEH?>dS z8>2bn-w1DvC-3rG{xkThLvh8af|{SXo8mi9wh&0xYroH4HCrIwRRt&6eq}$$?e6~C zQh-gJ@+Ro);(OtL{T#nVq_i0%NU3bKb;R2rJUd?e=hV4t>k$!N!>K~7FIy5r@lr1C!6s|Izan#xd;fTUMJG}5tPKO5tFk`* zzBbrb1G5}^r{Lq9{WpvI`&n2GZ&&a}y8Fj4uNseTi_e-bbl{>Fhg9sp4pZyxN9)I3 zz5LGthHKBfK6A}O4lF{2lO20>Snzb|W69%d{v*5fxa@LkQOk3lHzPVHneP=yvs>+2 z|5EO>gR6ep>!aEt`c%ZEGumn;%(?#kVk|~aA?+^sj+Ljay2;t&J4^m+Q0br3m$D=k z+n)4gukY$AIjwsU@L4{%^@_}mdpP$UB|oNhC`!2p)82|}%CpfH6Wn}P54pCk^2D`^ z{J&Q`bj;b+@v!rj!tBEnd7(Ris_fC`h199q!qNNQgr#4Y!2@S_oHjNr=mDPh0FS?U z!eMICi;<%TuuB}@^3Oax`&)~neg3j?!za&PJ>Nd|a7iG`e(a?Z&p{RbBab~EU!%&1 zko&j{7dUU)oM~0M;!OF3@dj+J-Lav zkJr<4oKG3Pp^NrUfM>pL@JQ;{gy=I$%_#Jr)V|$(i#DFR;;U?%nzeYUM{BX{>a^n> zk4-wc-(ez*#lDAco1d-T9`u833;a=^2VTcqyWinl*dh#$Yi;$z6(`jX2@=`1wk!Nv z_eP5I(Gi}A`hqw!n8=c6)H1@cicvc*{4J|_&mVHql6})}oY_sSSCqO$o-I4eSbroK zJ7zan^5S4rPU}lsL=paj+AN&d?NrZht$&{OrdLnvON&Qc%II`5?d0ceOF!(lArH0d z+j$sz@b~qnl#bC)92dk{%sZ~iv2@h+8#l|Hu}e9U^Qv#>nY%msh2USL0#{8RLk?l6&+WS%aIhX=ih&~H``2{_{1};1Un-q*(f6CsxelAdbuY@;GjxK zAiS+hb0zAWv_KpUo{W1UQl6k+yfSjG;!UadR2exevkgI*X&)Z=oL`=@eU;Be|Kj7w zCN5IwCOY^7`%wSi@a?G*_a7CWvGb1`)koEYN>JngaIW%n7OaPma)Kyc60Sghpq=3~F(PQ;>LEwfKx z7h)#bZ@Cl;fLAN3h*a$6f~I2w?w{RK0m)#)2Ysk$YNs^tqNp z%)fifN!Nv%R^6Ggp<8 z_z};AZB{|I1r9c5sbOp@Zk&svO5-)g<8k-+UJl)ttl;vpid~ZiukI6REtT&p4$giY zu~aSc6n2?i6)i+zfpGA`KdV?4H_uL{I#yn#bo5wp0es%4Yof zH)z~eT`3Q+=dj`E3H_C~St4H{LzVb)W%Tdk54L0cWLC@QQ_HydR`Aw!@brb@-0VTm zSOS#&K$W0I%kqCNUK+{U5GpIMnLG7fqGHADhvzIkoz4+hsq3lr#H{L2yppN&vOjj~ z{e}FQ-X4~g_{eXWntKcD zH)q%3hyKTht~qyd#43!_?8R z=TIw0|JDcKm>!2K>C(@$?G`9n|B`AOD)Ga2{8Dh{Xys-{d#ufQUGVU`eEF&eJkPWmKVceM9Olx&E7YtHBIjqpAUL0WWqs?#X{Q2yIP7#V zO@gCIzNwOjdyDW*oBQZC`}R=2kO|(uQH6TOz9Zb7sR7sZw?C$S=Us{0EDOJ8xuKxN zx?0A$^4D25Cvcy*9(Ug|3p!MAQOEosl9L^-%K46;{1a5nIrQw*oBeJs5MCM8qR+lj z**{^w%$?n4|H(BcTeY4s+=5pj&kY&3r?_CTPGtQtmFLZy@+N#tSWLNOr(7v{eRuid zZRo8(!YpsXMsY~jBfh%3!h#rEwiW5)FUc;GZ~GAV_HXo6Ue4RX&_to1uPk50V;AA# zXe2w2BoDk^@PqV2pl6Gu3u;-~g<3{XmqIv)$b*9eiLknj6f2eFOsi!qP2`Xt=ZVOJ zYlWfOmK;^JxA3cFxXG7UZQ7#X4TL9-Nu?6f7Vq=Icb0IO%q@8-L~P`9Pc`1!rO!onLK#|qD)IGp^(?U* z&F=9R?y0W0hrcNayzAnFZ)w?j=H`jmwY1NVpD(fX=Ty(nv>6+P2Oiitxy)rBJS>Cj z^KjXjI!|_iJq}!ExD9(CxZMQH9fhqwXs&yxMjsfg)PwbG^!11AC4EmR!&QlBS8k-l zwNRd`Kr^D?JP78cY!0zCKje9m#Giw&LrGV0mNF2}C%`r467bdpTx+UjF7C*O0y*~fti<@xm+T_6Oy9-CN?Wv((mE$;UM9K8qb!CUj@vr3;pId+&XK1S&i8s(Kensqonzoh(D@qvP^H9O;P_Q_dV z#4{6Ixe!}jq7#*r?%mM={O?J^81vkMlRttmpM_C6P8n}?dtYyTgbJa-^cS~K>w#z%ZMK6Mz#T~QL zg0IT*Lw)lErFYOo`;~0I=4MW)+zpR+RNY4lx&?YHTJBlA`>o=%PyMy~H9|)IQ$lYal zPC{X9JQgoi6U>)2JcZ9nQWpNW*zRg~_98N8q<6d;jtp1yqMkES z8B8(>%h-t(c~%3h!^|eQV!;(w*@B-D)p__+h};C&2IdUsZMcBr#ajh$F2n=|5N1V#H4MmFGNMl zOSfbF*t7xToL`wgL+@ z?D?Q&K6_jT4K_nBY(}Lq+D&|?+_m%@Co0gSl5c69SCsAipi7s(_A*8%A5Yc9WMRPz;V?rn2w3@RoXlvXPkWUO$TsB_@q!Kmii!IWwBw! zkv6P~qkeZ+FZtLJPM+k)op~}Lp>!@PHan8flpM(Zd|>3qUlMJtTj)a2YQ^is4GRJvu_)$TRNE^V9|y-dvE1YCD6*b$i( z=j&$uY^DIqd$)Eos&l~$qYI|1#g-=h@YO zUj3)-8E~nx!`dAq?*BAg@Rrp-;Q071Pon?YxabsXz?d-|59It&d3yI1R&G+rbwTy? zVJq5t?fkyat+@HShO}g~{?KvN@DXcna7d2rp>*BFfPm$TdLB7&d(`t=+MD)5t1TNQ zP52O^i{RbBLuR>*A2+Fw&g{=8YY+I5>nDadR2>TVZJGA8NW7BpuyY;Na!kP$^YKB0 zZ%kQtc5C0Q{mO&qStjuVuIF}e@~#lA*>_L!0_Xs^ZwC(BNTL0`f2In>OW*8h`cRa8lB>%TtyOo+n1jt5U_*ax{3%=(}T;746!k zzIlAltm;=}Nf)o>k0)(>c;}y)BOVWnTf4i>TvWvI!#?jEV%GcAsHY!J+G+02e_PA2 z_c}H>D-KEeVPAyQ>~`^qT1LycT4nY>!Q0Od9W1%7_7yru9g>}rr7`&MmPF-2!3&3| zw_VJqJN1A|FYRuple+urt!aS^w7S53OS}JgpodKv*pk_$_ZRp_bWE=WVdRcsbMG$9 zn}yvHbL^sg7ns#D`gQqR7t#6knD7=}k;-eOJ3h8^9LdzUr4Ne!IAKbQQ9tdUwQ^Cu zpaO18B?ii|4V)(mqT9?-Y2j~=d4JwHlx07ZpBXtnZ128v`6soUicWnZxSHHMU8NDl z&*CNX1H+!-<6vF;u>Y_{G08)n3#B(sm&eug^2)!q@e?*ixi z?dFy)v9L6M*CFmhS+jh~S-eb$0KrhkIJ`GNK2!Za*@4OzXJ=tTdrphR)Hg zel$LWJSzH&fA2s?cdps~AN$R?p19upczcWMhemy9vz)o~juwtu?`ZdlR9kt&&JjVG z9l}Dgue~E?xOHD*0q3$|L2rL2W~`aGU3bHH7h$(s%Fbt?CSbw!O=$#TWjyO&}3K^MJD}#=-5Me%oZ6R z{X6nsogdk;b#bdPJ%4Glt0RlKd+CdgD;OaOS1#_l->So+%bEAX`{pf6vpLvf`*2QF z=a@yWl~qrag5UjuKODOwQp00TIl-RHj`a-2w~L6VloVIKG;ve;nHX(2PCidb>ehD` z&~#qc@}1k>MBbtz-O#A#?K|6d>s(kZ-925lcEf2@9-IZLP87o0BabM@33!SMvzu1t zUz9L5N$kWEmOGZ{a`OG5urdsBA*b^FlTve(_6aB1>=N*z!hLZsZb?yEUKv4>#h{V6h zsmom50!hFJy-lnm8DCHO)F>Ikop_7Rr!R!9LD*!8`?6RG)tPjUhQ%^h9iTSj9xJm$ zB4GD`PjKteoAMA>oW27$A)T`*B>g|R#P=Ol9$lHIAwEWBoCRt0@%nEPPe|`>S2Ndd zF|zw~-Fw3fMmK6bqHind6HWhOO@se8sQiCp|9^oSjI8MZGs^!D|F<*%uR0q7ZDZhj z{of8o9SwVmZwp2|-^S29)i(?!@GIf|K=UHL1!GyusA06`^l8O&`#L!^4gAvoB|wV~ zqE)-*{Cd7?|C5acz3+0MBZ(?->S*%657n`pnp(y-e~(i4#zIDJEqgVMG3_D)T%vyq z&Gb1T4ESfx1lFP6$#Cz?H0Yp2HNuwxXP)Lu$NY!$EP*Je=yowWGZ?m}(%~^bKlc$f zZu`e`WIs43Yl!`}yx5csDtFoxQp>pB4lCqSpQzXsh>-* zU_%cAN1ytWI?Qd1~mn24h9wqLmJFz0Yy<0Fzv@JRD!H)f`M(IAz>WTH8KW> zj5AHAMe95%MAaYR0u7WAh9LEHL@AXvnLKsOdh~yi%ArM7e!uovDb#YRDQo2tx{Qj} z5B2aGqdH)wq)q4ONg<~lg`6{KTACF2hnrHCMCmL+AZcL`Uh|%LPx}2>Cn+y{ZL#SuN>XUU$v{z6) zo84g#6a^2oj0q&=Xdab!zdTzHwlu~zm2T3fm^YRpt(LG*V zb!{_28i@WaChzGf$i=aiX&|9NEtsq5m4viw#iZz(QH`Mxn#Pc+k4ZVLU)^wCzfcNl z)Jq_e1&6ipU6gwAZ%JW|i4d)XwxYGgvcqs(2wF3y!Q0bCmm9m) z_wSYGsRN8+V+vgYhsw53ZO=U0_1{;oCK>^2H$4yPeppq;pl#H|G-W?QU)L125m^Py?4@C1 zpQlb^Fz6|YWx!JL;cAq4zU#cjh89eCdDR&6t!a{*gpzM9qr(me5dwtN2li7gF3(t| znj743h}6@3J*Ar*MiK1Z+%m%^9U+ikFOU9z*y0G%-2#z0>Iok@YinD zTc`DT*9xWtZ5p zY0W@y5os&Cd~Xy~*u;X2sZ7%iM!u}r42-e+&>q`%Lyb+$yfQDDVg*OHTwkF^qe^Nj zy6GG&9UvKAL%58$OQuuCbh6YSCia|y=rHOx#TeNz-DDGiEe}roL4bL;)=y}k8@dp( zdT#MXK3s2Pte(IaN&)D(Lyu|v3)*fv*sVoS1>M>@5*9^QH^CkKh=M^f0_JRup`h%q zbj8u8#n&>@ia<*;bGwR16TVE&b*=Tfg@B8u>ihAm2cWR#Bv5d(=8&HB>f05yBQ1l# zyg{HLfH}~LDmndOeoyy*GkvCk%`_&fXjPoguI#vSoy^}DNwlDCDt5pn_dw8$VOSWG zd@U`akZ?C0YI)dtddT!}oc34^EZR~hDrwiUc(}0jTk+@)G2}@hWhHm7ukHB=sv7Fah16( z_A-(D9}EOk{6<0j5+B#RYllG_SjIR*+Auo;0bK>A0RanM^mPJJtlhB9h{Zrd#fUz`H-;I~;DbFz!P_Vvcbis5JlBAM`gWzewn)_5l5VcC z$6rtNZ>cKc8bzXL8*^JsB}~SVR!z@rgnQ2cAE0gj;z!Z^jm!HS9z+2@jM-Pjq7%j> z)uZUTt5co`mr`((wZK4Fry*#v0b&{_6J`|PHU38)n@X6NJY40V%P)GSQ}m&*bb+P< z>T^ucc+;U8`k|KbcNR8=u8zQ%>QO01W#hwsGovdIY>aG}rr8?;seGQ0Mzt!9>PROX zjfoB>qExm>8TN}FOc!KKQJ-$G+SViBom{%NYZ-fTaaw@s)NWfh2PITII7o4sVvXf| zJv|vNv;sF<%Av&=dsO5AnK3WjqYXFa#stl$N!4u%S-0Y1RNAC#bv$}yG! z%YoXp8b4b32t~uEe(Ln3=fS&54a{FEVA4nf_G_`6LOyn=fzzq>eTV(P)>#=-t6A`j zTOVjbDoIzw0Bt@NnW7}(iGts7$2%dvPUo7SWa7zCw*KFjGE8~@Eq9U?cYHqs9$UAF zP%w>&F?_7lpMxS%m)g%}86%9-U$I(nGVa0cJ{d>5PI-@>RO=ZN;OV@hF1OWCg0U4| z-fb>`^kxbm6)Z`X&8n|G#Df^6A``#U-m$G^tmPPEjMHDt$rxxz6NNpI?<7;Z#o%OvNlS-Vb3d)* zhFVKW?pLh@>=reMqhds#(Z0MwB4zdqgb4>43?bcS10S$f+YX=C4mD*C$O= zDs5E_c_%EFFLZS>#ncSNf9HjJ?bw3h|Kjx|8#RjmWhkoHd{Nr(8}0`Y1ZFDvJtn_F z`qcQ1MWx}Un1(qKvmr#ECv%pdLCh<k=qQ@yL zDP9sz=+ey$AVaK}S}7){Ow-awRtDgI9{)|G$7$9vb)mOShCC%mo3R5WkCkj*2Dg3w zbHN6VYrF-CQR`tG2%6Xr9DD2rgYSYnxfed1V&M4CW6ODGSKbc=C*b|Q#>}skeo)4M z2OhKOx7iyLG=yLVz?Xq7h0%r)#cXgGRyU!Fzj}i0kZTs@1|^{eUVYqP^qC^RoPbc^ zUGV6k?~$P5Q|%fO)iM_627!Ec+{?_aG4fj>N$>YD82uTu9QP@y=`ty7mAq*h=x!)#U2kw}zDxv7 zQyN1t<4k>;69KZO*5{2=HPg&=?Nmc8|D(rKOk)Z4X~{vPKw(y&uTN#w`Crl1U^JUAh`G7}7=dREi}iD5qY7 z`(Fd~c05_wv=o;Mr6eDHC_re1Hcj)b(69jL;JU%ukf(pFxU3`0`fv``%;0Ls@wGhG z6II(bMWFH-Blvt6*~w93O`%O;U#&=HaST%3War#DEu|P-VW(q`gF8a#}pD~$n zx}HT3r6(omN7^F|K1TsVjp=n?ydf!%n)`{V*5Bxn8B5WpK}mFRa(7lK(-=+QhTO|= zB#laA&1%{}`7JRovlK>VbCgN}yek2xU>2W)j+PUP-89Vx&)Ja@R^GKBmc}; z0x*JH(BHNsCQO-42Q4bspzva0#y5?As5EU?#I zgns#xB8Cn#4Tqus;S@yoF|6TyVoLWdIbG5Pm6@Ip`ph&G!y_l?TCH2+|Gd<|_!Ii+ z>IyO~h01ARrT|lUQW)64P8yT`I|QG)PQ$JzGg05;gJd?`DcY>RNK{YMREoB0q$vyq zE8?SHIlWr1>BfR`tPxnGHDb$e+1^m>M%F?=cYzwE zN$>?aCVUX9v2;BoIE!}S6s<4O+<4MA99VE5n$L&mJg&f*p1|Ln&Xky4zSE3X=Nhz=``cj~25!J6Pb%<^% z9C8Ru5l!WcEDNLXbz>Jw#r^?Jq&3Au!H6mrObZnrqW{WIquW4NL^N+vLOEOd}2h zr)dm^OX50tf%*lMTxZ1^C@nFFXhy>|>UH$_Y`@$lN;Va)&k=;;C8JyGhjq_|TF*j= zKZ|KKp$2k3On*0mYfzF6Ta9D`wE0-?yZ0=MJ-I~m-XRdagw|3v0;HXliIKe0ULGy} z8n}VY46j5;1eRD#F9>N~9*a`~vBMKdHk($QMhqBC1J0Fw#A`8FSH50(Cz=f(&9 zkhXC848?ps5Hv;ME=ITYl}{N@v=cw1t{)IKJNqgw+E_kn!{P(G{-H)AC|k=L`E@&n znoovmqx|6S5<4F(>#RE)y0txHmi%FhAxmC3GLJJ_Q%VId53EDw#3GnLY#hY(87F!$ z>qs{_f+xZrH;k^qL&hvdzo6E$fe*^k2h@R1tk zvAY_GzRV`Xvgn88G!RU0EGe%fX}BS+Jg(t_pnizySF&n`rxIWnON(g} zQP%;q5){)Oc5Lr?fY2tMXQ(>q+i_5u_;j21(lx1$#A7Wkts z;C@=j%@(JBc%6)cT3r5p#Rew+4IL>vh2rMIj5#v^=S31Z;OYk`?uwgOxT=C zADdB3*7ckXQy6`BSWWy@*pF;E1HqGyeZFkh@=-~J`eN)}UZ{kxX8#rpe-VVoYNBqol_bu6tgkCQq0lx0HlHWIFa{%r z`pi0!Ko}nPKoh92EL4Y)Y$lZ~Mf9M?zj(4jOgrQ-12aj!tZOaf7-3h5IJ@bbh3@pA zGG@|n^e}yIz+;o9T$s~&chS)YbQ$DkJK zjv!M_s=0h)v>}c8qm@b=}#R9mr5$q*Rd~io%x+ z8saen05rjhGGrRZbjh^EHpUqsemh{HcvO(jB-L^V)GzcIcZQmr<)j&<6rN9j`tLVL>kj8W0hunude=dNt* zsz)=etlQ#z*c!lw+p^$htAg+6di=HU8b>Kf6p6`b=-zF7G*acy`;^o`p9JEAE-m*79Ks22 zfH5wn%3NG$Z)y!K7ijs4A#tSvcjrk9iTMp!6*9IWXYkyQyQ<|4FvdbwgY_x)mT#o=3sp z$+2lj7r?+eNN}`p8uCEBt=Lo;LD}qhOAUR;Sf}Z z?omCqPGwEGtaQWbWsu%98)ksu4QgV5>th1$1)3COKo_tKsjtOBatg~gkSHXElyS_| zXYL>WLT8MnUQE;vjCv?qpQKV%D9u@?4ov=K0{LP{bqR!POBY7h${<5dQuc@$vicYx z#vv&k)n~tu360UFX|ipTlPsoaLer)jAaWVgAj-jzfV$FrUrIJ0U<1{qK3$)}i@=p{ zFo+CuuAU0t0m2BmAP_VrB3X4ONB~3XrNAFAx@bmap?pM5O-JyDX|jQo_@Y#>S|bKr zUTmvpH~7~C+Jxo6)dSLdHPg5tS|F-&(!+3FuA1&2HTO$D!eD*FqtHot2m;e6Jz((< z?i>n6BD>8#wWR89vh+SfH0BtES0@6JACMIJS*FL8dx$ZHfDkRHnB#~(w)eY(uXTO#?4-_iwzn`)+4{vP0np76}psZ3`6t>YpH)9 z>Z1qK6^<{sEm}Qm!J{(%qdTq4KrjuhvucV?6%LY?o{SF`Q47ZXE;_dkUXt^WBs;eK}b?<3G zBj}j|42EudsdzV#ncFK-3xD*%N9zJ6eBE)~oP?QHAne>BZmGQVWUhWH)?U=ti~5z+ zC;zEWLghtpgBA4T>~5B)oBeD9_+!*V=c=cizox3 zMtwvEKLZ-84{EvjLC~{W=7bOkNcEJHV1mPoU6)wgLZC+oYRn)BkYYj^c}3$+U=(u? z%J zCegCQs9H{hSsROTA`Y1W$x$MgMl81!!CxHN z?njT$cAo~f>5qUM)?D}mD=K#~79~|^CAjwyx1bK7PJQTLn90UYOfFUWMatZW6X%I9z)`Fnr<^aYZ+pg;cA9$ zWDKOtlx)$;yc0!DO-K3wW@8+nhC0CUjbX5pBG(5|5HkPI&lyxg!=!#w#{bkRnSM=! zd>2;&+B0nul{W+we_KKG7y$YhBi!XM5_Nn#EtCpF4xxS{PcI%+_t6-9)l$no6s(5E z=(&u4<#_R@CQzt?a$TUJvpb~HYE0KN0cjqU0tDxl|99*JJC7 z&8Hv)nn*=x=~LQ%fq||-J+X0W&G{yg1=@qgRHkX#SF2cw>7m$O16FNF)W>x+WYF1q zm~krkWD`AACx`BXYJzSoK{8<-r9y*Q$XFOWI~!=4*XPK*6f;^^YLbqS0zF(vMX)8N zfrfoN1(WFUP5tKYJgf(sG!{z`(Q3q`boF3Bbk$SQqEjpR`W$!#OnvGr+NB7-2&WlI zR366+fCAK==hEI9SQ0HC2Q(RxsTXPT4I)PatYM5&080auNhK(Uz3Q`!N~ZS>hAPrD zEP&EO88-tjOCP@YVkC_;fb}s#MI4Z|zU~#k&Wuu3VklU?H>f-d$jR1U zXj|2FtA=JWNT6c<9=&)$}Yrjr$mxX$44=PfpcQrWNj096IDhI6t)0Zb6Z;YZKSWeBNWsL6A zy0!Ve7u_0iBn2)&?RWliUFFa_P}u2&6)+3$U)Rj~YzS+O0O)G*Kk7V4x)Ziu1syMB(s;iI>QbCFxX4V8($b1>S%qDFo1W{qk}uz6%3_*B z743Tgg%BBgtG@lg%_xlhlZ>vx&Ny21Y=U zqff|i2RI*o1U3K!RKTbodqu?XSod4A!5~Czgd;_9!Oc2Qzzf@9>MycqQ#bM?2TE^^NvtA`T8Q5rtdXh&% zoNEG6!n0!r8xT#$4+b}egQd90cP635x1NK=beS(*qJRDro=$I)imn3 z)ms}GuL2YqR1*NBUF0p=%&KDQS@j1tFY!|QD;^FoOoVMgx;RrYT{Ms;HY@O|f_qN0)UU=04w&jWHrQN@45Pj&_Lu z5o=FHeqdU(DNlV43>K^C&8!F1r^uw=TeqLNWqr>Xd58h}L7#XKq)tt^^e|BPL}0)` zi<$}>zp&P0QS$#V_8xFeEzJXHLIQ+P3_XBg=n#tZCPHWd5tJ5s3B8Djf`SSXN+4k9 zMXGd!P^61k2t_*5QEYS+upl;2@VBqU_;Ut;zDcBPvqQwaPlYIH}_%ZIROOz ztpoq!1%GD&FoZ7QAIbJ{e+~DJ-9v>xrue(xN%!IZ6~FU=2Yx5|GmnVhaX)QV`?o$8pkhy*GzgiE-<@=RL{vYulcYZwqD9h4MEb!8Y@L$*;i@U!gKcPLszcIhZ z=f1nF279D#wGH_j{x`I*od69|f(N{8bvEVC zNNOQgUVT2~%UrT&hK*DGN&cgi{)a{G-}`ar-+BIw|26y{zW)QnwBGF9XH-xqTr3@T zbK2x$aa_&OcW350fWkfcujFU`3;8#$a33THf0uvp{&14o_0MoTYgY8_Vd?>g?Z3Ji z7zNsYr}zcEJ@gCu?{L3Fo8EviAR?7X^Q-22>n(`bE4$R4Pnz$6arNgY`l;>xGXvs3 zqyH7#+b%i)7#3*6t=CoFZ1>sp`hNg;=PR#cojn{{Q@mH(jw=W;&B7Wh1hR^>Q z-H(0wbFBW0G5sV2RHpA8o0$JiwU7BN@16TUMd2?(@qGZ89)DjSLVm%&CHoiEW+YGu z0_dz+Q)EjL2AKL_SO)OR0TKh=Vgxe$mBD|7|I@vHvbHZtKG8r6+nA{{XtDR4PS$_d zjrLzkyu2jyZtK?UUEIz8%Ip{J9~Jn8{2AuIq5r&lcoQlQf?-+0R_=Utmw$EP{IM6b z@|X`$7MFh#@5eg+7xfeK4H&}_e!!x8Jnl;$z!=`Vi=dwQ*{h$g0B!YWAqD}rNbVQf z|5q;mjsH=*xsLChhXC=D_iV?b@Tw#*1S2BeHN2_q*w>y~zxxTWwEuVN{~PN96zl%p zCP@3%+{sZYFos1fnD)dW9oPEYI*5B?Pk;rU=H*BKoBrPn^{)p0(S6^v_o$$VIVz1H zVZj#Ye4y*MKnx#2pk*K;hv7Q#zZn9KV*f_Y{X|?WjHs7F_5&Y^`O~#Y=Ck(PCTpQT zFdDvpTL7lt=MUfhr2Tgm`|;7gkw6Fi+<^L?4jAG$zHbr0f8U%B+qc)w3(f89J>C1# z4YbAX%Z?xUcKl8BHkUqHTMhns|$W1euh8p1CRZ$>!0EQ$lynbI`#_R z9e7^^`K=6v|CRcGaetNNpSON$kpIN}9=o=Ri9Pf;qT?6%J>nPiclg)Mzfr$KKX+(< z$NUa|e>ZP=K>K&hFZeI60}QJFzZW3Xe_eCGfZxQ^ZfO_Ge^g+f@?Q`6KdAoB^Z(Pz z`FUwn=dZ&2p6)j-^vAe+@z0z89s55<%P-=0eYsb`fAoM3BS2spC@l>g1ib&Z&*ed^ z2zeb>l%O1@*gVw?A9!~2J)vPdvU8z6<eIHgDJuD${?j=Ps~gHF8@)I+0zRGcT^HSUeE+lZ$TC4w3iZ*ByhtA?5fom(S6Hio7p0o z7*69BQLZ{~=PydPRw$?K&d>H(dJQvYtDNNs@vqkC&1|uI?uUhf_y+Jz1@%@}6!(iZ z!bArq)ryHmUB(}sw6igp>5@2WkC?=45yo<#ht=grT1P+C_#@Vw@u=# zvqt4mIWO9BOpo*NS^F_3EaH|n+v{KPu8u=ESIFE?%%1#og#Ht#*r6I4!DT4Y*aFBTH}zjrPKjs zzuIu?Cj+MW2I^kSnVxphOds404&M$@lH(umr$S}~~@ znToR}SrTLe>oO}ujI9&K9sBa~6^0*&So1F)cYQ(E-CqB;=16tG`qTFIo4Dyqb=8%d zi%e}=y_^N~&+KdgvIPgqTTZigd9*0Yu+EfEE%J9jml91t3T7-}1k6RcTGL1aJ z)o&VQcjCM8IWAbnZMG{dFg9>7{}*NX>~r~=Wq3J6a=-V>OkFw}5jrNFWUo&}m=wmh z59Dd{-*C#IK>b&|FYCuJfZ7}PyATvgAc~C?gG%vUUH};}#mWJnABXjxJ7m`bWaWPb-X*GwF+iO-d$`ER z1k?{>|CaF#%>@0(4a+(^zhuheo6;*0q}^}HAj_hU(ySw{;YgAG(K}UVWU}J%*)b3r zck9wYD+U-|1fS9_*h_rSWtKYHZ}JiBfdGLRz_BExda~qaZN?cL8jNg|G#-QA^rdNL z6upe+JJG-)dc6$X71QYBuF-`OoPs+EoJcXAJ7!8Xuycm2scToUg}0-+Kz))vJ?eU#tkR$SMW+H& z^=;$tJyCu~B>VxYk0VL<^VWqxt$Qb9HNysmAo}VsyrR9F5t9XYlwfNeo>}PW{X`|a z=#it8n)Em9tev%aB#7?CW{C~s3@cFK>`+z9`bV+@V^KkyIv!qE)?&BfK$4$r*s3H& zmFSZShrUDyH$8!FW}VxXiWL>@|Gs&>&P8z)XW#>az#DB{IoyLd(jS8vgTK+9Fabp( zyIhajL+2HTdy3KFsT$)8owT=R14|+pXTZS2+TWC_YP7%uUM${@S`Ls(SiD?^LNS0d z)7)Y7HQe%!W8+RXcmPp+!OVT@$lTx&phaoNR!MncIi*w>L4?jm=qzn0w?V$~0&)y_ zLMJIP{q)E?xY*A1W+aq4v{jyuqP)L1lg%U#1LGD%LSAsF=Yw0^65Zda?r@wE`z`tPwqF217dC&pCb}w@-p&Baewvy3brDg&xwB2$F#H zuj?=c6I^cy&bTh>fmbwX-VxW|uYr9;l=UHbFfEnW)ehG2AzTxhGO~e*L5SNCBYqkz z<@f}S#vU3IQkYP3sludSLKtQRt+(TtLS-SFpt+CEpV@4QckUe4k5ohnajD*wc)D-} ztZxW+*YRMje+8q#_|voGWM#9sDP2FrFVOP^I$!RUAu)qumVJ6SQ1V8xTJ&b2wqhYm_RzS#T`?bc<>pb4 zrJK@4(n*j3I?z#OFG6wp={$X8oP2p@yZ=F90j~OD*fB$$-4UssN2;oQChUQ?f|y&C zK%OFs?>E*&v6}Y;Xh#?$c6G$tS4luO#vnmD=YyCVZ_`<_ly%9Z`v?c!TQE3@_}Y$f zRadCO-QdEy4XRLiOEC|<(m(eiT6hLe{q-s?>=Vo9GaWi#k()WSo-@gpB#S(zv*ct8p3F<@3b08>+> zXPrPS!mLP;C?r|5>>GtgD!xZzs0Xxjy_DI~$|%syi1=_J-QXrc%jEGQGyi4EEq9i# zhN!Mq>+n)n+Xt?8pA(6$z@%*UcdM_Fg7;2b_pYvS6*>epFVAM=w}(A#h+&_W$?PZ5 zU_3RzZ>=g1G}s8?!L;vz&h?N`g70%U+Wgn|d$rxNyTBVD>6adoR4$?k2z3_O5nVFx{ zm~6r9U^b?~^TN9f?1jAXNC8q3DwW+;Z$iC@lZBlI#~julqCi{qI->?d66eRxL2ls! z6`Oi8k6=(2Z39cEFv7w|3{OPyXbe65l<&ut#bZ^v2vHEr(+bnuureQqOr0(UxJ7Md zV-vul4kNUPK(F~U)ec~9q{r5pg;y7CLj}!6&B>u{<_F0K zqQt{{4A3}`7|M<5l;w-A+gvhJ;_^|KeB_;c30+bJ>b!_!9&!tYc`da)pVBy+(e<&V zx=U{y77pZ49iJ5BFlWFSZF4cp?qLH+CY)#EwIQ$IJ~U-x< zXaIJS26ft_Oxi~&o)vnB#9Vf+Jn5yRS_Pc?MpELIUO@HJcPaU~RHqCoO3qW4btv@N zn3ZH7CjH?>)23EeV3L#lF>)_2*ITZgWIXHl{y>enlK@ldjvv+jS(Z)MYce}RQ85Ne z*iHIkQFJ*UN7MB%wdUfq3$2%gG=cMwk}ea;pX1&P+*UTAU)J!;ZNazonyy+dt$e;3 zcNr|Eo%wxJ7CC!Gn&_Y@abkAGk^SQK9%_1nmbP~FE?%rjnwPFD++fI@iRm`zitEx# zI4p8pfJ5y~lgrlLp63%!93jy!ak^GHHH;8MYCUO&RmG}iPhn@9EZxWvB1`74qz1&dv93`nb6Bo+HE44Y@?G# zX^#5oVH|mj z522T5kO*H?XnU&YkN0NMY<4qh%e{EzLz|nZioJ*YmV3vwH>>Dd49BEZ{19-z}+C7d&Y&G^+k@WBO+ zOFX%Tbu;OKF%l#bLIn51MUrYwO>q2m@tTV*tY#GQcxw#62U-)S0H(1}GV35kS=RAB zqSM-=|4!Yb0K0IopQjWAJ4_FZ0zwdssYF}&-t@K5O6eQH!14{DN9XJ@Au2~08c5nU zOL4p6w^`J?0q>iyVfXYeWjdGlW<@#ht_zV|YA=U#xC>>l=4@6xkNBJC^*k6S+aSjwZuvyR4n@kHM%umpy?oMf*%#BHLRZ<+w zL2+d;ekIijBhD$3eWZJE!IMI0_I&hcUn#4rY7LX$wYvu1FE}?#CD}oW3Wtu~KdB{N z-H5Y~l)g~;45N+DXSk{JTYGCGQ);jAj{ZUyu*0+evo_JGv#wOwg3PjlYNgj*sz$a51VY#)(Q z)^slxdVn=V2^;&Q;K$M=;>GB5gR6%Y^wRe_(NS@ZLng6O#288)rVBcxt#?FpR97Lh zXbIH+62_h_7IVVw!46F-gE81$(TN(5^;j56Jqm?k7cEcTSZU9vYwTj`Cw6sD%a}A%gIc`f*WWR@ z@>w(B?zn0bJYPoZC2)`T^KKt{A%vFo;h^=*gX-)~sl+GDv}L;>L7$_)ZMoHP$G}W- zu9;n8VdPO8TWGi)73kWi6vk$3_zk(44k-JE9>BO8>r)Knkj=794)eCY+r96`c_{l((9UH1$taWd_09Eb|L?`jUZbfO94DYKJqM`a6mH^pPOX*aGkU& z4qoOlXpE*}`|qY|twlYkI3$~*%D|0K%kH+|IkPLR7>;s#J%!nFBtWQK_IUM9Z{h*+ z2Ac<&1cNR%*$v4##r^9)DXwOROkykm>lU@bqQvzc^4$Ky^(j^QJu zWsEZRm?t(y2qMJiflu*-D@=k1&sXS?`fHl|-J{WLMC&OfB%U2qyCn`V)C%$2n zqMX6nqFbjIOWpKukl(wGMq?L0n#b=L?lT=4!x^XV5O|@S5MTX zh)Hb1duO^DR;&X!n30y|krH#Ar&w>)`A?J2KhIPJspvh{86$b>32_2)ltYW<;)w%e z`jx@9P>AMxUUZr7Lf?!lOpP@BaQ*{5B}YA_Vsxx`2$9=DPu+7P0h)BzPiSOt=zsMv|3|6ulh z!4;KnaulVH>9~zl^y|WvVYul-jx&!zz2*2HJqo=mPxurnXy}7+&uGO*amGXj7e=uT z={Ma|h1YCpkaYI4O@NMRTRgyXfLJ?Wc}NMfc}oyK92;23;9SI_RC-Wa1u937Kz(1* zeny?GXDEpk6fi;&IAQ=Uz34o$t!;cUO;p^r-`Y_Dc9Bpmm;}CR2dv|R*Ezv&7x3;e z_^y;rQJ;}uTxkbUcpsjXpid0P7=AmbCAWRh!bK`myd#t(+vSVqA!Uw4TbDVQN_7zaaej?xETb#vN|3vexq`f)`ri1)AU;gLMh zw$qH9qHN76%YH5r9~KWDk3E|OkD_)#Ac72=_bw!=>2=wiMrs_?No9^|Qh_Kc!D7Vn zqbwV)!I`{kre4a7`$aUY0c(xV+8>uS2#Y^o94E&$I7WIXU=N<%J z@A=%9(A^tV+VvRz%syT*406$!PV=zCC2r#!;s>WKf50YEln7#j^v24C+ONc)5+Wh! zGq(sMH*NCe6K!u}(~mPVeHPbTu-!VIO+6|nDq0?aTyT|UtXD!e=i*G98N4ubXT&(t z7UC^lf4xgbr_26n2Pqw+fTm=gObv~N(mh`u+m+7QzU{pp5se+*{kM2likpXF5!aq3;J;| zNlp!+oykNS+U?>9GlB^{^yp6GCLYCoU8g>z2PzpUzo>S>?0HBOsQ ze6uO!_qsw<=2#}rF`gF%>Q=?n&h)JJ_ql}NwQa?1AMYkwkU3n7ttbh86W$bMvto02 zVoFHB)1v?{$D(tFnZ@@9;G-AhO^KTMX8d5Q8OH^m=yBvq&$Kh6aYfBpMfoTZtp9oI z?$fY&GB`){cw0wOU_+)~Z&eE)uIE{ps?+7V;A_?R~hg4fEl9_LTw&aOnBr}M~y z%*aKiXwl?0RJvLxl=2o^5BS+u;e&N6b6XIcfu1@!MjKoMn)M|dI@p8)+oFPf$yF$@ zfLF#AF*WN~o5G{mH?ssPyD<3<%kpb6&7g5+jams#zJAd@-sDbK_V$$toX{ zFH+(V^s9wcDIO0wanD>CF!c^qb5tLM)B1*RZ!!B2^^G%aC!5SkBlZde%3xV~mzmC0 zwYDiV+H4BlkU(Zt_L()uKAnZvV2{v-doGe4{N&9`YBa4Vvzm2D$-320qFJtd$-~M> z%!AO*L&8b*l9_n4d>Jn%5?)J-Y;Z=_s^HznV`42lc__`Y1~*1&65I#F4hVHtrr#b6 zjfYbv>4~l-@YdddE_iISN=`-0Zn|&l4;hBYr0{wuZ0QLU5Xk>C(+p#s15+zZRXDx@! z4H&6l283bwDG$?@B2s5jl+pajj?o!q;|J4&z!0Mz(tucNj zvhJa;M*D)8)RjL#(CXsmwG(OU$&MoXWSf1JhhcFi^?Q<3pXg+1U7qZ9b6B!`>W*|} zE4D0i({`RhMAX*G^yurW4fyURPrW#ffD(p;-KuMRfKddOt2mu*+PRTlQ2k1qqFgzK zI|J@}#wXZ?P~5v0+*T)*Ya z#q7?}1`?OpVd{8YN6*h=1IkhObJRxxpo1P4o^rdFwPH`iL=l}I@aJs1n2#t4L5;HM z%moQhybgpA)@yu8(1Bk#H*cWYRwzerbLzB0&7B7!oqlzv@=`%Y%!CSCCA)6zYt)Hs zs4Pz8`nw}c2iOL7n;!8~@srbVGN((7x7wn|tMEO)F+e6$an@!1&rMfe2@EmnCtW)m zz7ZCCRLF!KRs2cH*5@gD?ZaLN6oO$Q^w~?Q%Bf08sFoatHlZLYmB8MEB|&SwyRrUt z%@NG(MUqIGIM+H=pCna-E88KXA*<;kDsa; zo*q8?kV7{KGeTb>D&93lu{s@j+kcMwdf=!6#mTA)+tkrDV-=sv0xk|z92x>Fj4n*m zd?{w7*kl^coa+EY(&wr|BF_b{_zg`| z38u<+=>V38N1OGvXd&eqz%GZOlnR&daylrYEs2%>x?=-(%yvA1r7L2_7Af+;-cktZ zbM@FHLts{A9HX+4n>(P{H<;0EQf^_J-_MWiGUkGmI7=PFok^e^R#A@yev%T^_`aa;QYE(qS3H&z?*yxZ>sj;=Cz86LC`bJqEIpCGzI35+<>#PpPP&}gj zy~af-vcL(T<{iej}EHJ7dfSwHy&wM1*JX&XLvx~ zu;#BPR(sn8Nie8xQVg{cgPk|EJCqDc`MfI4HP!p1qZyB0+iU@eVdkQH{e1^dBGxA# zb)WyB%7}5A%n0Qb-%VzRlrzI?nH+Q5?4L0{K}66V;lvVI`bg)?wgc{aEx4sno*@l-Ll*k zBNr$Jx7+}2oEbVV;NSEV8#x#G~{O`&&w7S929u#Gh0qr$I>Z0QCm(_j4jol7;<{b|bG1Mfz1T1lMv zoT2GHLS$HEU3WZ@p#&~(bioa%rngI1&&y}S4u^LRC{BdHkG&cNH>$ET@>WKXc}Mz} zSN(zxMTxO3NbBlgRT30aW^O{heeh{iaurk$*?c>3Nsn*o2Or#`Ert^Vj9?TYrU%Zs&EoK`Bh*kZ7Qwr2`Gd2?G=htOgzz^Fv!?ZIoQ$`b>aTR)& zVeOetV`kU5wn(nrRH%J^^1IDSEuNx!j9dyc9HKz~QNOI1-*VxU-SD-*7WG3d-%3VWQNpYU(s@L5zlvV?x{vY-67fPc278L^5)n!IU_GlC`KiUe=oMt|L+?djsXA^1ursO1}{iPl8 z^hN#?A)C(X=tPQ#B8_|T>eW)_j8Ksd{V$B1PjJ|2;$+XRP|xa!^A(c^Uq9k+V;|C` z{sF3L^bBlZoWdula99@X^4Ae>^cM%s-8^c*(~TvxpM$AZ`7H$0!4vfnx)qlTJ8i!* z+k>o?E-rbCpEbVualG}QjC&0F`m>YPDYAWO)_c|LN*dfpU*f;Y_g8L899r477t;fj zzv{Ef>T}08>T8P+>DF8us~S5LNc23}*lLXf+%=~5it=R1;@Rsbr9nrbc#yra5UYFcgY_|#q3#Xd zJ)7QBOKOJzUz|r1hsk68TnA=^my{4lC3_{n`{j0>6#ZL`s|s1IcLZM0ja6SP7;3F9 z#RUy4S(OU_UO0AU;gQ!~2`gW!IU+TEde-)WHGgKDr&k?ru*pTuIz<(|Vpp9HEzCch zub(IC`b1<_ilzVZW$OO=$P6-TC#CFBGo99Gz3&Vo>Q$4O+t|Ys4S)bPx9JBKAjkwj z;}L+Nf0TNKYy65NHM;1*z9J)mC|)a;^`jh@@ue(!%XR~>VL3eDNT1RcHGx?u2Dc>F*QEyjjQpszqd&ic) zan3lzA{$-m3}HTA37(>4-gD@lY&G8bdRoaoG1J@axMGMyuf=H4oENwEgA>7f{N63! zFFifDG<9D6`OBOa8~1P6otFvW59Ty0?ag@2%+Vy&`bc>#5kJ79N0T%Le^%Ggm zMWc}3Y2j>L8%cW5g{;6UJ7Jz6odJAuI~*29LV9%(6f&;Clcv8GyrN`PRSUf1B8q74%HczLC(k)zyUtMVbY8go1|B+QTS=yz0r^;u}3fe!)sh*X?bRpc6$z9Vk$+4~?TMoIuA7iU< zsR9b(2`t)`0GA_-bvpYifW0PPGw=zgQ2XO>PX<;iapyUKyHXdDd zCLJcW8BeezmUp7_;w`n!Tg|1g6bGtC{>_aEUnh3o88$4gYpW2h9N5a`;;dJ1Dp3RM z)RaEC+QSp&0-cD9iP0iZ`z!k6;{@0VXN|jRV6J5lcTt5UCbq*$90p^o_ z>)|3XZP|+W$8q*o)%rgN-o4R7N>9UM{s7@^;4Fq42FuM1>9K}H2$%t};M8j$&rr+Y zDrNN>dM7Li3NU*zl}r)+nAouzuuaClZg@-J8BImDJVwh>}QNK`YSGs6d=Y<`Ht z7WcMd`;9BV`>tZ+x*ktrW7T+TBk#Qo7j89`^`8t=a)8rJlQMY)x1FsDHfaqX0z2nO zgTl~8S2!d$1N>P&t}VI}4RB7Sqdok`Vz2%P2wxEAY1x(2g*+J#UutDcDQ?^y6!yMe zl^A1^o&uQmoS+`K6EyvP0Tv@48>UaT%V73i!l+(%x#AxSf#ry9?ps@4AnEF&@piLh?%rS zupCz1W2wq;t`3afjOJ$MaMQlPa9f0WHQ<<#<9wf*3V#u{KI*Yg#;T0*n`vXvW!g`S z>ztWhBCWt-gYq$BFYp>{&Cfm|tGtSS9p$3KHtT|ksgGLA$8PKm4zhJI-mJ6;ybKeL zg%6vvC`60X*N>YUaC9;f0nt*@2sn@0ONpvM-U3YXCufy7A}RrXO{9ze;a3W9(?!~R zp@%g4&ZPS?$7ZY=JqWM}G_YOmd3M&$hX04p8fT&BPobU($n+l;V(-~~e>UQN@VBM- z7xY8qyKxD++7f?Sk=?k2_pQl^(}~U=K4CKDUgPjqzb*D9IfXw!;X-wbF#DED%p2bl zG^f2WuF?PpZ_Qw)nSHMi0~f+Yk#bmd^Sqezq19?^)?psRa^D*UQ;7w6rn9AY{GU9u zeKVW%C@3OCW<8+KASa)khjWj~POM``u0F8c4m>7bpOZ>TT1A&V^GX>0P*q}Ma%-&`aTyP^Oty7@Lwjqs<@5Im zlEwvjd2{N|N2)3;!ynn5(7k6V73>g>6P(bCh zxr3po@iCQZ`Ft#S8XU&tRGy!6QV*yo#N=d%Rbt0OZuZWeTKIfoH( zem5QRaQ>ed9%d zQn!@Gz#hg{YtiE`r|MPem@08xv=WCewFVU+%*ic@&KyRH*^08kY{vsjqr09|l+>1$ zq`eFmx|+jof>xQwLo0(1@R52bO0HGo4VK9pHHr4NYAfdT>2miy6cQ~Ql5=ov(mnDg z35Lo0{#*P43g;cz(91@#1+Q!L zeP>Qp^D6mX=q$Bd2-v!K{CKI`jAH-yJ)t}zBX;C*v$4W}DIdgxh8tVtiXAV)G4ooe z71)|u;gykA)jBnkxy`bk3j7hi*NT)}^C_J6SOP`49Tn}3RkuPnFBN?|a@;7>BOR+~ zRE3MrsRnwL2kaG}#fm2Lo3mYGIeC&Oush07#;mb*-SEpAXJGT%gX56t#YH0`O`4p- zu+%}-thFv>HWIFgTsOW@CbX`0-T;#-z1CfI?3z4b~|04)B^Q`6x8|F)|gK z7puFD-}6PCFviUIJV5wZ;nBAgrVu?*r9md@fu>csb`Q%Gb!GvMOQF}=Q$3 zC|Isir~F7ojiCAA?vwf~=9QVm)Qx(B7PiXvS7R4ipD3@kI6C`13+_}rWreOr`#k1` zKF==oZ-Pi$H4ibnT2u1Q%TL2=`)yHG##b~_m_1VaH2=ElPXf-Q8 zn+<{;0jp?f#ep|2 z#l?)bRJuz@a@=>tmUqQF3(f{{BGF`ncd+%dM};~9i_W`gj4#v8*GNmhO$|wA#$T7K zy)aAz7L7cH^5YjuO%5 zeV$wMCV7V(UE$QR(#SL>VkP><6BT$hRdeJ8C6h!k@at6A*^}(kmtscP4U|nx-WwRq zqW3c2J)i2#dYvcIVw;h2;`0Ulfg{$@C3APIxsoQWg=gcQv)#OsV%AykJX%8;%iz{~ z_|DbJn^!uS+5DUyn2Yb8wfnO3)}ki$=Cp$M^>BgXj)PvfmpL0H7fL6r?H}RhoNFCF zSvAdA-n8cSby}!jBR-99yRQKcv5|2>)XBc}UzV&g$Bt#MNfMFo`dV z{8zYMJ-QrnBIvzbFZWSOOTx^hD{ZxxQk)a$uQBt(06#3oNned8D<>6W>}t*cAeUx4(Z|&CyG=Ml7-3>L?+0(wxAUGnLiDAGlgvWn4qT z^l7OEDZp8-b<4QTxwxE_Z5&!ZE1+Z*5b;4--?+TBU*7{-_fYw?cZEvsZiE0nP*$MT%dnS<>W@@pBABonzbeFA0 z&zVaqYk1yy-!8v%gb{d)AJ?3yl-ViD12eLrqbgbIyRE6h2-_0etgTF^KVeZ=#1H41 zY9?ni6f8tgQ~YjgCNM)XcCYl6T^zg_>M_C#hNI7EpO{DXB58%?Ks=KofFb@5kg!lP z2pWJU=lUBuX8T-)pl>ylY)fZ-+ZN~l2}c3!A7_ApK9()TPDLvJ#clw9-8 zP!NVr%E%r3ZqTk|uHd{lCAkU8Q`bqy&~bP+pQ3$3XK_mz8u!#H9Sb;3?N*SNS5r?f z@<%>U0!*+9cnxgh$N|&HiVLwB#w@xFzz$sm@L>X`T6p649503 z>mNSrETr{_1d-3Vq$T$kUp;(qPcnli9%Ml3`jJ+tJ`jFLYl z+N#`1v%Km*FI`hD_Zjd1W1(Et4g^iy7x1%$P&Z)NJlGTu^6zYV$YBwyf0d{Kc?TWj zMyBh+0}!oJyLOkaq-}MTv|(9d=1mj~fGsh_$Cg!7+dzpubs@zj!==jvTK==-&-^F9 zc!u{L@Q=H7U)&_Wy)iSqz&4-a9ul5 z{5U!j372a@_~6{q5*1>b{jIDj$jruxmmjV^Nn|)h>Cmh@>N9H>JIr4&(c)`-N5yJ2 ziiDmjFeagALBc0Yp69PeN!xyXL6@P+0}4hGtqP_>1M51!!6sc_(5j0;L;_bBbD{#= zlx~?lLb!0+2lVEAOz3Xs5snhNLkWaD>uj&Z=a7i4`zdr~Z zqtHBTi`Rjk=MV*R@Ik%@Y+*AXWCyW-V6$ckSfbn3c#1hT2nW()T*-cEsnkDX!n4 z5w=pM!X!oT^%o{b&*_8!2MAxefcI>aWTg_8Wu;Pnu#Tp;`wU|PNHE&IePDf`ef-Xi zn%>sw{;;R~&S?Oo6u^4+linnJ|9|-}4$7FPzfDz#nh0s^pI*7=2je&gicTa#EhPGE z(w%%$7Fb~eq!fR^Pi^^F2v;X!lyQ()Om+Y0%s z^fywzn#TsfOdBWZ?w{}*oi6d{6dc;zD(?-%UX#h$5>f@6XuCzk^wm?gQch7%f#Pbq zj|9<$(VDNI1wS50?b5_%qBTn}>_P{1{CN)E^OPPdW5li4ZkxX(MH~{;8E6nvER?1_ zykMA23Jd$#mfSrcaa&ebSVe!wBY)7qQG)vYW%6;!teA47GwZGr&8xhjmdL5qcW*;? zFPy)^pQYh`u1SrKmvh~>*yX-e)3@ttM;~p?G@Q+645hWHIZ|>4d)1~CLU)zG148;* z!#Ph2wAfS&7y-=!el_lUK3*x;<4&@vu?$io_von_AHJq#SKz1tDT~1gdCbBkGdJ(s zbp?>envZp9XKw{_{r&lB&&@-_T!@!aV}F3?;QMFb05?RZ@J`e7v5Z=SUEiW=u%oxG zsu7N*vg}(9EsDOy0H*;L&#W0+K^|i+!!*F067Gm^Y^;D9colHHVhf~y4#(5ZIM0d1CH%&9?E$!IMfJuLn775ka4i*k^LhPHIvz$M^OwJHe)yB z37153n_P^ojQ}f*-V-^5-9unATuRi$b{19Q%5?%b00)i90lh~K2dg(~fg0AM+ES`L zg%u<-P(r$|P*~s@+Y;HpX&7Esv+?~SVS|yc<*r*Y81pGE>*>0_8Xg%xFDqRmv3+sx z@qpDmXZpq*4Mmj=V%B2Mx2rdR&Nub+>Wz5smAQz8>>1EWGlJRNB>d{E53uqn(|}ra zt@ld+H=I(W)|2Mlm~{i{^wg%e9d1J*0VQ%Mk?cs_Xs?g#`2pnZMx@FR!LfLXpSC=> zdEe4!E{_q@F+#vRJXWp?bD{*c74Ym}4vMkiBxqGI_|8>KJ>J5DA(uT?cU&SgiVZ#- z$Pm-BU=7H^HpU`y#=d(sNgh7bd}bzf$x;tK(TF@& (^zkn<1RqrIhx(bFBV~aUc z5Q$wP{R~VZ%6^eR*-sH?9<m2tW(Og@_x z|It4;tB)0>zwbjId6L{|@z_Y_yX$SFs?NidwS|D~=&&U^_GsHONCwI0=nU`08Xq^n zzjleqme-Qj3OL)=TpH8^9TlVp4k5C3b}|(wGCzxd3SV^B@q2I0pxqeD~crmfEs==I%q2d^2v(ON=8+&PA*u4-^rY2wSK*q}cRI{d&^Lz`H)C3!&K# zI)H_`8Ckj6{Dx{=!zI848m`o%(^&&Agf_|LD0+oiCC&u4#enSfRhl?9Ox*lG$eHHV z-yW6Q<`b_z$@2S{|^gw98B}W>=FU$^a*o} zAw7ImND&@aKG-76ERnrSDDgxQBB-$YKZHQ#@AYXixM=0f(rqWVZ_c?9E_A$2WZADb*z}8_!K1sAZ z;%@cW0}~97`1O@fj~IB+(jzaK3}BvSO!5+GD``w(%pkQ?uQg{$jQ=BSo5o%O&Ti6JR72+K(cn4(s~KVQ2Y`@DI{S6*|qn-8UYrzZ6i~ z?a%A#Yc38mp@fgev|8W=`ro0>8!}d+K&?F1BP@@RMiz{6(IPPFstLZ{UE~!w=iK$D z_1+uvW7i@_zh*_Sf{+5l-K)dBQ zhA=#+_U0|McnNF1Mw6wDZ*&?nqRJXp#&s$Mb6xFRkGAH~XO@V1$u1N(BN^YMo^XbfHxQ|Q= zERv3iVyGb;W|NawlvD5nFZ8gA5d`W5#BT|HmXOHCq)mY6MaEenijK5)4H$+r!WIee z#S$y3DlnceS-MEun}`JSrzk222Dzwu71;OvKfJwlTvW^ZIKE3aOP7==N(o3K2rLLl zceiv)gNO?(h>eQW(g>1*q@;kDuymJV01|@IdB3x}aJ~1w@4fH$=l93&!0VhjGtV>g zOq`jgW_HDss~K>h z&qqn}e`mWp-`$*^8R#-~Oi+B7Av4fV^6Frxsfd-S$OP_xRUXMBhv)LpP0bOR&681V z;iC5?nj#VE(67{NwI0pN!?X?K_wDky&%DxQHDB{ZlgkhyNRy0+rWLW%)Bo%$^2v%F zdj1Ry8EY{d<8G2@!Nj+-79-<|7=6S2MXtaJomV6DWxh1O+Rdw`-aRno;!+UNIVr8N zL6e4=lU^q}oP!y4)&|@L?1*Ek#Rn)%o|kC6lha423e8~rnfqmh)G)haArELc3&i(f zy+QcO&&1bL&dnEUzF2;5Mc+muV%OX7FhuDVGAuHg<|%Dh;+Ka+Z`lAO~VYbwP`WH1R|%($1v_ti(@}wGs4hG@cET$uZ)ymKQzK zkb(=xRGx;f3*8~~O{UnRP$hAMfh`MQ2YiSc$@s?03o0QN%m!QuI#k5_o$AHO-`XDY zNU$MK4?=S781YC|NsTl_2H>Uq_wbZ5UbCHl%V^k4&c;U8T>(s3s=$ow^*p+r516Ms z@o!3{P4jjNMg}@ZBLV;5cm1xb%&MH zArR8G9M-dj-j1DjpPo8FnlPh!x!Q1Ad@ZWrl}S3QM2LeYL|RkzX~**#=#SoJH_V2~ z_#Vdll-UdhCZ`YFE!pj86UEl+rzt{w+jv{FhsjAJN<^Kr$Fpy{rqJ3|1YO`?;49we z8l52w*f7=gc6n1;w{Rs3vD zVRI2t0eq>cu?IpiwHzU^e&4S-fsKl=cWA~^odlp2qq3UtntmSaMx*FoGxe)!$@;uxe|1&nKkVo&UT z0@vG%qAo48im}Ct+=OQl=<_IJLzz_=(%;#0GG)@cYjNJ$tF!Z|p=5E; z>J`Zar&BRA4A6^D=Ns;j>C89Ws6E#Zmm+27{n0YmIUy&9ze?$*7(n2{IFOR~l5d+J#%XB>;~Vfh%3%;uxhn5Z$J`-EFj_33X|`Sb$PXC3>uhCg zWlS+PGYP+DzmlFOkgHh{eoyU>r$L<@OM(Jd(+E%!&QI+?oZYoUK<8%g;%zT!y+RA2 zAUOu}lWqAaAet(<=1UQh>hR2N%U*$A>AVsa;WJ$gHmM;1GOV8C_ZBM%P-WT*2*Fze_ zQw2qe5Q|DH(Pw3la1lo*^H3=Jx!v$HOnKPCeM02r87Yb)(b(G|ded=qb~7T>TB>n1 zIbLs>*=O|&RuTh|d_}!=xoWhDcTyfD+)-tDice?9A4}2r?n&M;!IP5T6HY%QkQ17I zW`3I#S-{bT&y)8sHeB4rY4hvVce*)O@#QFywD?j6EE-o|4SOmoF^iX60d5=koIg)n zi4BZqgOl2n@L-W#_ynu!RPWN~1lrCEcWtp(xSN!gd};%$$jO8iNT8n&IkeX|hgWOw z$!&+aU?xR3v!2VdmAUyB&So+B2k={LOD6R2t|!GH$?vaNE2W)AeSWMgW6UeYKqOwj z0j$g8LFdj;OTs@sP<#%luQWYlQ!5_6uPw`_9BKXhUEbEy-Xo-Q6pz{>9pgDq z_a!O~vL}DNAND2PDQf4z9p;?1PbFXTXEPJDLnj5?2OkEiC#B zzgT8D$>(ruS~Zw_s3wdyzd%lCm_*U`dAb{-m5>4nRbn%Il=EsJZYvk+`^;GMKEG~M z)CbDp_e!ExOb6>vZk9?I%l1TB1P@8pfYTn*ro)<8MFzBbZ`L#FLub6BrjseM9m@s= zWBGWDWWTFzk`CJ0x3%i`4&Wgu;_7L5ctjC}+cHpt=bF>?EsFQECZ0U{4MMf3@|46% zm8eJik>O>{;u#Uy&8y@WJ&dMN8=9Kdd=}PhRV*X|btfk*PA(K#F}CBeMCLwrNDJ^e zuKYS7jMekW?VMAlda^DAn(FdF(yCzvU0;|@9-2j+=n7#wF@l9Kcz%4QapiE>g`gGtoNbha6$Ui-ImtK213@wb}nqQ%z z)yyzL8Mzwg4_4;}fBbsQEL=rJ(N`Jfj`&$W%b&G3&P(@QFgm%lletK-M?}VnmA3!+ zv|2~Z!m+};w~dr7xVEmp=V9X}g0+B?Ndn;o)}{fy?%FkrRPzmYiyE4ln_Qo`;S*~T?p3Yu>(HJUPQ;8W=698DqH9|g>2o| zCrf!=e~zJ*>wfvV(#>7t{r%4YMdbx8{_aLTk8dk(%AHO?MvfEmA|VuLh8%DZ#TMlZ zj3r@%Wd77iLHtE~a9+z41ab53+xFJT$tn&?DP3|r=na%p1G(MOyimMJ0`R^y?_qObMDF|^^`rg;|C zYPyxCi11vVtFuO@C-$_D^F4S_?Qly@nD2s2Ms?mTX7ev{xjbR^BH3P_KY6mY@TN+| zd^w=knh>_Q(7R|k?~eQ;mm~6k#pio&z=s?5Uw5;8$Incw>B0_#+`iop6BZh5xD``g z>eVmR_Vb$9kcK|F>^I(Tt!dX22GE^6qulk{SRzw^4cFy9VWNJu9LP$0P|W?(OuYFBp9hmtgCjU(T&+-q2%{o1G=%NUd$f5FaqkjWPNU{QkuWs3P=f&f zcm=FWt)gNH9}|hdgu&L12D=BI4ZJ*5k@!9iWE~Y1C3DAboxm7yLWRev!i8RtJ6K;_gMBF2ZDve;9^`u zF@B+BZO`uFp1*SW9mA1>e28@VwBvNxbhKrpzGv|(jmMe=366K5gao;cg0!cLX-}{| z>u#xwVEhnMnXg%xo#HUs&o}V)L*=u3SD4xF;-7y*7d&~J>h*EY%jx5Fi*_~AZ64%{ z!LJ8phKkM>Htg0oJ>_mYE0YrTBF7tDt&Uosbg!h(4>leQc1RpCPB8Z{ZHTH_Mwk}r z3>0;a%627LCKj6*1PAa3RI$}F1@N&zfv~)cn2_{}-2+YK!aoNaQY>Xm8Kf~eohttJ zk;MhGv1)BIV_2$aHFN6i2(V+h#s4c?My@kUp&6k=*0G{96_hqrc#2P5Qt34|1F1q~ zAma@wusZSMKLTJj2!xD;_=lhI#`T-zFFRMwDksxVrp!w>1T^W*%_D+M${Ol;r5#nq zYA=J+&vHk5#Bx3N>jyg+in)6}fz9zeL+mE3tPZ6~ah>jKfohSmVvw3jCB63}j77I| zuPL+TADdOQEIfhP8iQE(9&8&BUtrAD|DvZdgmMVJVRw%q=VrP&jqK1pb5-Pc&X%o9 zK3ic?i=h79UKIgwXvgeOn4S9wL;ic%MdNA6NxoZtB@a%hJcRQ{o4kb>@K=FtC+DIn z%3n5CCPfB%FSWJEa_iULExZ}u8-AMsUhHfRlbv`-JlFs`eW@tx_#2DQxzIi4hbFG= zs-=owBg;N|ye;dDdsLxKNcWk?x$g0RC(`<)wsheIvJyg*&%rZsrK}g+-=bQgE-87< zu*FoKi{wsdD%C0D%7%!GRCCu)cSKQM&gy)dR;aNSYY#WJAb?wdoj4yY;z|94h$iPR zdOLOO$5<8`OwkK3;suo$IY8f19|}<(#4=<%Ph9OCC2R%0yHhqVAlgRC|@H-!C5} zTbg?OmcC4c(~We8uPlErdVjHfB>yV}^av$vd4|Rd$rB;*>)LW9=$4qG+!0-eOf*q;Zxp zoikaS>ua)ZBO?>;NjU*$FdoT>?zqmKh_U2ShM7eb80^V1zb${H9z`10`yk3vQbk$C z*v!F65i`ctlVz?zjkRIov3FW8RPmq1M+#7ybbd5;t|32_dr_gNPrYCqpIH;0TX#gQ|^O$G?d0n(%=%>*`*325RqOc_> z&zR>(!5AIi<~vP1fvYBH#8fJcs0#ncV7apeiBY#ccr+klu@6OW6izW`% znaB9l619v?9%-J*u6C^G<4*W=QTAM+SADQM3CB?Gb&@7Vae1_K>ODe4PZ zi+VQ#c|{xqjQMjUeNRaG(v0qr#XaJkyQP8hs;nQnMRoO6wd#YY)MqN%6Bjim2OLgm zOb+uU@(Bbnh(X*~8V!ROMx=uHAJLxp+UD8Q*$kXG=7}S^KC$b?9IOQN@l%>SW*{qV zwL9*Ld}JwN%%EpX$ed#>C4U)+ukV>QI=*Q*hTQ70$Q8rO`nX7Ao7dX#nkZ3#MdxPg z;?o}t4X+`0Up)E}Elp>~@V=pKyHhbc`S>dfJ{j=4TKP%*y+8(fWVd0$K0MZLIc+~$ zX>wnaxCSc3kW*!d;FuxoWNTDv{6tZ=o16ftNZ-3CEEe*b+92SJH;LT+&&S>AH!n|4 zPJH|r)ic_8w|Mhg8izOI?PCZV>J5Q}+}4>NI^UOly1FAL55~@Xy8TgM+}$tlEiC<4nut>)jyaC$8Ib zp9V+EdOR{Y@L8p7cA0s|lSLsk6XE6ybKP?azT^S?AAt|#%S$$G&tlu2eYSmmKpZ;@ zPPjSS{3T0_dhJX}!|~fUZ(!_7Y06ZU!57+>RbjyFgmLTTy8XWJmF*69)LjZvNNo8O z;@utgGe!l({2P&{s1SYeT&~Q=Dq3Jf@=yXIMhg;3A_532Vbf)N>4J@$Vn}JO z4Q==a35PxY17D>@q=BLw=D;pC6Kh}PI4{chDH@jO6GO48LFo9@abjskRpMw`yDT#< zs%VG<+Vfj>N1JZfoKaSqEJH%U%1l}X@QrBe%V8_DOM$8X%vWsH$QIToN|9HbCg+0i zYH&Av8WGT&vHc{vOL#c|7>%S!%~VtD!`(F=P4?YmuipOEa-k3iW;*eRqjmbeT;(s2e%M&BFOSI6-7H7 z7}-2ED1;m_&gs|572A67A*Z=czItUZAK%xyA!-BX^71X-aVr+gj+k{N0!|v3 zL_E?r>wtn=mz>2ZW9T^K14}T(O`xihx(0IMnuHL`&GCw3%(VE7XI-VE#iT4Q&3?ZW zUSTi<_}hDs`FpINvja}yIVu(5GdnwnVVd%lp0=&))*C2(p)vk`cgv?X>JT&c6BHzs zL@M_8Nan6Q8IBXVK<|3;p4r8haO3Ah6s|*2(6^$nX(b~6`^+KAG$B#MakoBRFnZN? zof`4{xmlOyacER~&&MD>%Io7)te@D=)7-f|e(FSz;$5J(jGKIJ=48hSv8zhUJ=dmF zqc%h8+Bpk(Q#1$mqfTcPv)85E7yprgzoJHFCm^`k=KB>-3S%%nzo#_dh+4)QTa6OSRA|q$a8s zwq)`N-)Fd^?3*o8lYgR!lP>LCdkRr6Gi^;)0C$hS^a7r6hCIQvMSJ`)!Pa(I8%#%+ z>nV5ng=6;#3{NYMUnozxuJl%0JR_T|!s=Bap*g#{;+JGvg||a@=}GZ5@(sAo;uWZ( zI7$7Z@CkIC1C`2&*olO#ZS9^BP%@D-m@+ulA+Gm`G@QLF9~mhoQKMg~0#}sHyzJWj z@N~B;6ZMIK-CHUd;y2!%?T@jKr>@w%OBN?cI&8b;g7~C|rxbTyA~o0XfKc~&6-zQR z&nNthWC5U=d9O%3%9u}5ZQvKgd>ZCYD1X6=P?HoG?zpYTVhIcCsMH_$a}jy#f&J-P z_K@|P-Pm&!fo19kt4JU_Ec!U>G5tsrJ%`FCAE<0TU{$21Jd#bB)nJPdud_HmaOl|PxZiKB>S=$HOr?xDwbXcxi^%4F^ zBh$kl;nk-SeP%jOGkvq-9?P`FXxroI43FzC1vko7S)A~;l!t*wH=R3km{3BJ`C5;~xt0e6Lf~m|-59kPtu8SVu`P$8;Oay_twva=P(|wls zk*3JiBBDlq?BtEU_i!@^2|3JO>YNMxG1$*I)$(`WZ`r@qC&eeUjqR8pJ460i8p72s z-A29=pU4#jX#SCbcXQ_ha=CQ9xpwG)^gijM7f1@^yTo^uV}{cdJvYV4#PJf`vhJ{Q z-4urm-eoW&lZ$dNI39Tts>-8c%mzPEta3U=ulS;VA^(jWvhwN($_xFus&RTnef0cQ zr(2ElQ_J-$^o!ME9`@cXb+2|}V;LyeWARo5yTdyIEW!CLvj@cnn(o1oM#&3Lr(aeO2rkbq{;}k`IriqR7nlmov zP=jt2>9vy1%E`9_=^l#B@Y=W=OKg<5cOP6jKWm?s;yyATx8&sb`p#ViXDtJRat4LS z>bF*=+`!EimP7ZH zVOaeR_b-9y%4IT~TNBoW@^=l^ql#Sytl`1d0khW}&=yX-{`)_m5_}MUHB6ZF+;Z}| zNuXj07s8Zp{BrK3QorWch6@0oo4ETvgqF+MZgGxd;F)3<4BSAd(pTOL7{(W zl5o!bzpL3Ww&`%+ERMvhAPRH(B>2&vi_72Y)46|xv?l#FO6KJ4=pW$cWbcIu`8c?f zkx5B$iEv>;a&p2(p}tPSX1WgUPL~3N4FeqlFz*+=>|LCMP2C&=T)D)>C1kjS)t%g2 zTm!hyN}iSA5{A14`0F|ODf@W&`gl8e2XIMq2`l?}`uG|8+Fx=KR&fe)yX2(iXCEr8 z>gE~X`uusaL&|;|`RyYFrlERK6@odB9t!>- zzl}qbA^3QBn165)fPX>~LP7!pLNa1vA`%KR3JP*Ea&k&4S{Nl24HY>#j1fjdN6)~( zKtavK%t+5nOV2?6TN{L&giMLX0}7>qfTQo(LC$#CWADMK_qdCYgov0F9}h}!c+fp4 zzUnCL|G%eP`CIjX6OD@Dq|>5QoC+M3*Es#p>$|B}wQ~*+cYn83nEyY~0{u#}O*y-^ zL)<;wIYuMBx3j$;k(cAxU8PQE_lJxq&CRMq@cYr2)Z{YrsQqi@lA9i`D*yfPQZF9 z+^cFOQBvt>*KWh3=RVFQ@gnAWO*7(GUX-?)Sz_a_;;~VLp#^orN`FZG1@})O&JJzy z!HQ?tWN5U}9ovB5kYBJwCHW%cqt&>G9E*z0CD^aT{~luA=V+0N!Ly1zpU zkxGuPSiJ8x9XaQ;FA>E!F`O<`IpeSW#Cqkeb&6fUl3ioUnfqydBPKPSVggF2YA3aJ zPr^D}`G2{uu3;mJ*ROqW%&+vaEoqizK;d8p#ci{;pZ^X|$*tMEDmW+=qwT(B^?N^M zgpB~l$gN#Y0>@Ob)y*H<>%2Gj_wdaOg()kYYHmPnvx;XH>Ki}o)#$T5s4zum$C&R@ z<_R#Ohs>Ma9UvLhQ$}|TUb^oK*?DY)`WNaj_4sHQx(a*^sbY*u7^AdCnobT@37$<@ zq8@v*?KSqkDS#v2{Z?RoXh-52e-1eMuRGk$BIOFbPTNdXan^QMg6EvgRr3z1`PJF3 z?tZE}*A#!Rz+VGI3SB-F!>(}Wv8Gt108SZfIy8^Z6z=c)JFMJXVtE=`%xJ0%iHvzG ztB6eiA3_==$0|z%|1o zVBL$RHj&1pic`^#`b+!vu4jpSSV5AdmIue39V1PNECJ5Js==Y_l7j>AiIE_gEHAR_ zpVFDuir4SuuJc@+y^>h=g`KOQdS&+3cHer^5O|fk)}r5d?RsC1`I1m7THlNcIkTmE-U}UVyel=IC%cey@F?Qh znvb?~K&^y*I%i4Xz1-EJ7dG|e-@4In>gUp*msekRUgA9C`@O-J&*mX2V~#TmN73Kh z3BwBvEtMtP?Ddj;-YBicV?kIAk^-21H3-a@GoVZFH;6VG1-I8jDU-F?JJ(;pO@V;^ zCP|~UvJag-c<%JP$cZZ5wCPx*Zi<^D-k&*VXS@RJ{k^XoOx-IhTDK5p7a29#N&385 zre#dNnO=QWuo6|aVUyH4e)C<-)NTHxQFOM=(yObTK~GEaHY=rC>o&bg6w>XhF7OYf zv#o;(B-`SJ^MX*eP4zt`k9Ez8)oTq!Nt%gM-WA`p(q;&=0MO=?L6&@bzhh8KJydVg;zh17fV_q4i6v={gIy(D7b zaCE?}9&9R!j`xVB9|+=i<#w4-Anew89lV`;jrVxHJp!j$@#gF;OuCB+PAwtFc!9ME%n8M+)!&*bx?U{&Fw|v8O1k02?!%5Mu%kb7iEg=Yc23e#-?nZtnP!~)s?ec zmyFb<7S@B>l$`#Zoc{=vJtFgPB{9?D>nRzHGAj0u89FD{P*u_{5!RmPEQAj4KbPd{ zY*=O6y&zgkcWl4&sV6V0e2y&1^CzLoOJUQj!79~1@KMC8y-Ru&18BYS+x#AnZ4lVv z;Qm2fV}C4IX|MZ_uYVWrODOUPL}znz`zGIw*QpMKHFE^$cyD;{HD%6rm(0v`^rF3b zQ>uuiYtQr*B(7dt<>~72E&`^*@7d#)jCp3J@Mx3XbK_NtN0}>Rq`L9A+53XUAr(C> zQl4!3L`NQ%h@4qZ`#%X7;#Y-tM=Q;%hRWQxY+{@{c`}Ay&OBR4v3^uvYl+%DKUZjy zP}x63OP3aU`=Fu`C7kwfL>{qSn-QRE=`00)_1MjXp(m?N=Es#F9K#3bpq|MeQ?a%h zO8j^*8d@b%pvtz}e@zcdpj_R3yHebkIjYUSKPfpi4>mkpwcWRygb6{v78k^<*c;Lh zZopiy?#{P#chYN6qx>K$wlqho%pGx9 z4wTS9Jk_1&)1von-Xy!JU4Ckbw)ptwbZOkejNg&MNH+QJH2pah)4i@@o+qX9xWg3U zG2KhM)7Ea9ddtU?EhD9L$cSB{C$#;P^u{?W+s>)PNl(Vxi^Zj;GcVk|zt$TymlMw5>@uY-sVXPz~$%8t)K_UieZ}UeA{r)da2pJquUiP2qNjC9F9iHIK z+U_9A8P>2RpH!%xb#Za$PO%(RD;rOA_HJ2S2pD}YP+2;uQtM?-*}%V_Wl&%_XjXjC zY2LV0?3%tb#&y(+(}n`?-F>K5t?%?)s(NF(yO>g7-X#3Tes&T1b36U}8<=V$7U`$T zoJ%p?JaTYt4su}o!jDRSpMt~B|J^(UeEndQg#{Jh@_}U{xV|dnP_aI9?_s(WKtd)J zdF5U6$0k`HoGeS6bXM?d*1wner&MTB!Q+96iHU(Jy8QFMc(N+h^(EZUg#eD%G#LW9 zx<)5M5tQr!S^M?^M+}G6RQV9%Pr3d33(?aYIzxYdy}G9i$hHrZSy*VmGx$;fmJkT@K0}+O!3KE2qk7~4?K7{DViQ(CI)UFXjqKLt?B0hQ zxE3xMqjZ0Rh#PGX#-bx!&W2sNd`(@+9WCXp5Zd&A`@})f{tZ%O+Dnvx8y1e}W!}FQ z;d~|Ig$J*jbHGyAWDp&}OTQfyDN9AL(V!ZdTk=sxR0*u70p9US|CU63WLW|DQgH1? zLM9x|_H-Tr)GR;MA=GQJ}p+e_?rkYtD ziK^1-tF>0^w_bekf6jS+Iii=f=C;rLdYa9YkD0(>*ZxnH!8g^XZbC_rrM5leB>zyQ zZL9n}V@YONG@M?6x~BRr`LMs%7$N_VJj+2TpGIvE!;iqz`RMu#tFNPspVLgpCh<9D zPtG3pi0F=J^cANq!{A96D4Qd|&{S4ad1g8C_Ue;m(bh$Y`ky(;X_@fwZ{A*}v%%Wc zxol@DoKw;Vb66W(ofB8_XD64(cr*-_y7Nwj(V!Oyy%GOY6>vcI$2NA8P^i=xWP3PZ zZ&K^ytmVi2XDqf(KV|Yvl!1kU!QY}F}BTr)@4%o>+JcC+GC$86A{e1 z=e_SPV6(!*OPXJ9N(HiiDJBAHI=|g#Va(9OsVdf$-tAn#J6&I2pLn&!`cALD&@16S z%lBW6ZUt*r#m?6cDA3H&`h$uLPF~V9h?Z>HTbr!;^6$04?-+o{HJ{(tGtAz5_8_7; zi}{4)z#$5zcj|(?B*;OffE2|gvs&*ptsn4eA$9ikw@GI0xH1Ob*6}?4wt9N7G_`p! zd@tU)lErLIU$a}Bc4cGiW!LR1X-S#51rd)d$$emG0ohhwS{&8_N+>fHX#aMmypT!Q zb?39(x5`AOj9uCJ!KLh^)m@p!wVL_XzQ(=@gWbZt0cuCfG49w&&UbM)IqidWXzZ@# zkZ1amt2xUwHF&-K_X@&{Y8b}_7|?ImgJ=54mSdgko6+diRkw+^LK5}`w@;>*B~k}L z3brJM4uxX~cFy#D7+NC8%l4xu{EM4KQ~gFnZ&cp3N|9Pk$~HlGW9Rolm7ylc`rw+* z9NJ*qzv7$E@JvsoD7_Aoi}v_6IDVSxQMH=}6trGR9(5;CLjHOD$CY6Xrs$E=7O3a7 zLN4e{laev_WolOm=l)A8+pkN;T$#hijTgj+x*wJjx!J$}VJl^vyf*WFsg~#AtgiouLb4Ho%fK&6bsdwfr z)x$hl>*KD@82TG}*~aeK?B~ElLX*}MGAVaDUKHSWbnM&?bJOc?|Os-FJQe&bn~ zmw&v7=nO;}JnHzZuayVA9J&RcBzqYMe>BZb4ogrI>qk8Zn(&`;*m57^2@Ezfex5mL z>r&*RdQ}mZ9}!KrTVdmnH?0rZkS&;F5!mQAb?*YDa1i|awrMHa*&?NdS0Hb;(H}9w zZ){?|ZHI&uDcLtcoU(@_{L6&o7B0tsxI?1{($01*e~_ovFEi=u6R+_b|K5|w>;iuj zO;cmcIHO-`S^vG1cB>h*s!dZ7vuZ+YzlobYB6J6rAq7uHe_h&%DG$;Z`xn0m4ebcs zD8NDpyi!d|LBX}>_rb@~CbO8a6?ZZ|J4i}#Fu{M@-~72M+mAl;axCbv52L|G|3K$q z^x%%p6xm6aAS9$khbZ|3kD(esr ztl|VJq319eYH%061x5OgAD;*@ zp!K@0NH{p@oRFW{AyEY@b^J#Ed-IMCtNc5`N?rWm2eOxv4ifM0PTC!Wbr-K%2?Q>` z?{^syJTp+d^TMTsev3r#+Mz50!6%umnwm$!fuJ1UL<)|5vo`l(TFY7ss&!7Z+*x-{ zl8ji)v#C`!al48tk#g>ZaLY6ujR_!^q@vLF+O}1~U>=sgx?$oL154HuT8ehlxHK(+ za?WP}sxwVVEXDX4+v$Vr4Fvt zg0F_v;88%LPeavv$mN z0Vw{AhCGpQ_$-#r0z5aG6*@y#t0A`%Zg!4CMX>(|sd_FfIJi*@>wldGZNy>A*`s)H zu&3MFwujaw;CPk-K7v1AgjWhYm$R}U^oGV_5l94KP$4;u_aO-Q6vl#`^Jk{HMN0TL zy}0l-42q|#xcMcY&2diBri@91Z7j*&vJF$#$o2_@jY-ZyIIN~?*-EhJpcAyUvtcFU z*@~AYzND6$Klx5=cB8<&;2vVPGyh#-6PTxu)Pm6N@b?QG7TwqhkBB<2--NYUkcBXx z*S8oNujJ-x;!(lxgvuz993M1|SPx$+>3ExbVdSB=PK4lljd0{~8 z<<`?DS&F>r$of`H8{8nQ^|!u`!`)j3k`3mxOs?`(NyPTnO3+a@Jr}w(y1TohNSq|? zMHr3E9q8H(4M9JvTY;*>{li{bI?$y>$ULB-`Jv!HuR|??f;)eB=o??(@oCEoN6)d% z&Zm{61v@np-z(RJ=!9rFuP@Io&(1EaZvJGO@h9EeP3~04CCF!7I9q0N{1JSOt$%y2 zaj7eB#Co7$)$}}@sq@5EmBYpwpQ zy*Bl9GRTg7|EM<0s7DLrCE23)8+I;4%OqyD@@hx!*8<~iq2OU5#!wpC}QuN-QQWWLwb`@Q%L z!nc1S`5N)&i|Edaug}}+W|n2%tBw3-@6{w2)r|MZ{wm>GYu%5)T4SK1TVc`-N(R%Q zl*EukILD&@uz3CZ7p6-L;iJPkIm6?lnzi!va&^1%VJg(p&XwoRRTZ5K8)NO8@!m|5 z5o7n5_V$!Mtl`lEQ*X==fzUtEsGz#DgCKihI&QL#z@>w!yT+&9IlesEgpT~kmiO11 zdkze4fnnASs(iO&4392j#Zd3@`XV}^SVLRE`JwN_5G`T27%spwn);`OVj04C7S{C&5hb2AW_`t~+` z1m$BcOg~rpyTa*A+otw&uu*{ijpYDr5KIY$g>{VrE^P~f-C0uzoX-E0{Kx!kbIPw> zH=}KBLlY)WOz=?Rj~Auaok_PXxk^|fJDz2mwlSF*rn)&Zv7S*cH#JeK!Dy5J z&EtvY>a89F^vQLZp8v306WSIpj%PJzLHH@JIDi;_s2Rg;H)?b0N5p+4h(sX4=cGgpRzu@S9}jssjxxFoi6 z5HfZqFM*+y)hk^W??3P{3%w_7nw+Ant-zVZNF1zWFwr02LKjf1{atu6mo!iCWcZ{> z^hFc)L6qljkh_=7M>W!21W#V6B7`N^&;KwJj-WC0k*q99dTNokH#1g0t~(GSH*7YF zMrnSMbm%s1x)iWdzwYhA46N-gOR@c!=KbRZ*hc3`qBRIq-=l+T?n40tba~}++#!g_ z-77ka6XQU+mukRxRCO?uS20pxA%N`}?c5KPy8>KuvsrT6Z|sCX{XGMv0>RG=?!1sd zX=}IH|EcQhSN6(p_U11(p&;u&2sUds#N)e z9D;$WXwNh#0gb!+mSu5$3pN_=KhBy|Dhp@nS*RR^VP$ovDW8Z+re)~5_)?xV152%4h@$tFt0tneH8^b1! zbOq&MXU7O^rhgw(#Kz0jy>u01#s($4Xn^oN21{*blAM#mv~Ydt zv#(t~9qCnyz_bQ*y5)uW46%E*lv!AK{EXiq@}N8a^}>9`UOl#Y5HL3L>y_srU=Vn* zO&#K382AQBA2PIFYBS^760UVXpI0X0Y|gATar-moPd)pd>tLoWnT0B$p4P8FVW47Y z=g}fMN#x*`!O>WumsQB(`d4Bg{6eA5lZ5M-5%@khcM7|f{ArE>gNUW3>?POJr#LkN zl(hSbjC~6xSKvJG-Pvx8*`(}ky~G@`e6VpAgwUb*A=UsDgyb!2OM2;wD}J_i7Be>f z^(v_TiV9%sfq?no+tj_V|Cr6IraZ*a`Q@d2wm<;gmN8mjhteZrk;20aik6&cO1^5j7 zUE#mt$R1jo*D3)C6mUdGAJiY_hK#WN8A~_})wg1Ddh<@|Oaq*W6oquVcT3r&1zVKfqB4NM2LJJ9j|~E2aEe#96e+nxK5xDJJh8mLWf6qzm8qC@ zwj>gTL=Nehuuftjp?edb-^t=(!~b~0%Nb6@eLSCXPld_PLx4Q%Wr>>>fTHnA8YfuQ z`n>7PmArRxYa-A|f2}V6h|Td$XvcP?zj+fMIqA9HWj&dN)JZ+iye}lG#2g3C(1QJj zpR;jA10lfvzZrSRtRJ&rJIM6r?X|hJl|N73qTer9@-+^Vp)H*8C7M`0%=r)l8b!(ei6WlB$Ixi5nhL7_#z)|-%cgzYR zIVTKex*z%})T&L2!08E{8Lo%}#R@sjXx?c`(I57UYa`fLyEO~%-yqj;Afi)#9olF# z5OXWRJc)OGf2s#NV!k&H(K5Qlh*z-%eZP@#*5O!6?DjS~BD>#~?*(;mQrW{HT8mS2 zdwV-1f@dn*#?RqaCS0k1bN?fm8R=|q|3W5V7isvAn^X+55s#bC_8SbZy*&JmlJx5) z<0>~d@sm`4;ayHcx=OKY<<1O7q78Ws2y7w9navp|DTx^Si(ul2RG#@>01@~KPaR`} z)2GI?+1raOi$EZoTf5=ZFA$*!T}v-q3;Yd%hfxKC)A5)u6v)(NI`_H|m{vXV0D?dP znVzHKl=dVTX#D==g)b{+9xmUpxM1wR5aX+1*e1sevD0ZygAmXaA3_s*xW(-Hp8KHs zyL))EopKb3lh;Cbs72VGjyZB+G5_&~VURFb(&6~{JPVZvWKCU33qYy%I!+^z*8+F*z z?_)NFfkNiB2RX8>jdz-~T-)Bz_n}*X*~RAvx{si?O6l&W5GBs%p4nfExM*}8od zoq5%X6BE4ju=vvKz*9I}K(<(=UI{N#KX7TImk)*RG4to@<^@J41dq2_>dxV^`^P(2H~O1MP!J&A>jNz< zPzV^IcgT;hU{)U!(GSh5j?;RgkaQthfQKHJK(+biyASTP(FI#&ev2-w2NQ}(4{~t3 ziWfWn%+X)pBCzEF#x-^{ijHz0h;@Y2wh#y~vTmlZluUrSB9SPx7C)`Gmv~#s)1JY_ z({Szlo|LByq*AGEGv(1{a4E0%2l0O8UN4VtjZS5V3DOmA%K9F@)8mZVq}t(z!eZRE0^RFZDfnsFlwg{TtOC&(0w)Wd1a)JUKYSKePgd z#RZGphm?ddn%IN2SWhxOXipZF_Da&n+A*`KD~ZDebM0Q|jptfYo4MvNdIKh) zR_UwCs}eJm7+k3|(#nUZauog&w{mw1bGtaOcXA5s)bTOwS*)tUnFPZS@<6R-BO^8>v+gs3!^ z1K)kBoak=h3Q=#ZO!*;z!6Xk>k^r)Vq5s7iFrd-S@9GM)`02C+Pd+<9P|rS*m5@qZ z0)Ar1n0LY)7#|vNQJ?W`>p-K?+QYM|KVf_(EIkOw>AR)Q*3e5yC%7S_`Ca2%Bvruw{HV@GZu4R+>M**d##H+lVAHjt!ve zfiPcSK*)2rJRaZ^yrIc`Rg9&{Sv#~n4`~~hdSi8Mm92hU=bx#=rHIFz;TZl6at?x* zJzNp7I;%)&dm&tF9{lQ=`XQ#ufVxs_KW6*-_D*=j3r^AV`g|2MQkAD#4s-se2ef!DENIQe z4gx+LuX7#y5WuH_AD&ymag6|rTF3=|jzp!b@3;-OFiq@mU~H`-ghbY|I5@EDsJcLa zWV8X}o|L9X>kCcZVL+uM1aX*&{>N5 z;jBFthseZ9GTeSYy)lzFhacgEetDp(_#ZD4{%zoT@E8NF)b$GoOcuXEG>4_c)*kMz zLqe4sbJj|2EsxyEfh?~T;qHkVvc;^U1+pDk2Z&#||ECaG(%$4Q2}n6_`ciP*R1S^u z$fj$-k%WXl_MIW#mYj_hpfK*3d37ohfLvbMYhheLhFPwBg(0BMZP z(qlr)o~!?R_xz*x+G!#Qu?^25*0Uh-;X;2#hDYc_@ z{8tYDTL`al;02?H6j*w`nZe!2_tS;f@r`;7r$$HY4l`Jtea)5v2Zn*#1~;hb!mL`8 z;{TTQU!efE+g*3%D=ibH3l0WWj@wT~gE5aUL zQNWr}4vGA`2R=#L^l?0^IL-Ex(}wEzkf%PpTug?23$0RXpK^Ql8>HX}iJGJkE(~lC z6~k^NV=&-Y$Bn|-fQ|q{S7%AlhQ7BkiVudFX8~6RFlw>|dA9@Gi>~jCCJc1vZvMdk zx(+7Ht<|+j$!@MA%zt>=RSTOmy|Ybjq0P*KgukY~{^4aOdXYW$cW`{up5Gvi@4Y?9 z>}`j83(EofIj7@&m<;W<;`NY3+l!P)eVX$D)2#zWLkOWb{_LAjcKwFu>=)EPSYw8* zt?*;p*~J9C^Ub!lJPTibw0j&p=n}R%YVO|)`*Q&7Q_5Z>nn7pt0&!LjX_a%vWo;k2 zC8zJFpZk@RI>vP53aUZz2nT4bJ^+KC^GX4RAM9^&)3EIEoH$Iy&v>piFyq=*o(FcU znBIH?K1v8gBJg5st#N%C7KZGGO^J5xQD%St#3#z>k&MF4q`;qxyvMxdcfi3lg=Oa@ z(o)+P&}|$Upxd4T+wEcUvGq2rS?~DyGfx-r8cogvH5dfn#E^t#DjK(LfUQm$R|ztI z&+cynB(kEBE=(1^*hC3yy4oPn&xe-?MsZ~5uO$GMu_-ukN%`GN00Qw}AixY7sZUcQ zB1e7XK5vaTCe?_=CcIE44~*bPS^e#k=$vY~Q)U$xHu2{yV{bh!2;L7(tr*{Q3_lB; z{(pIlQeCx6DL}?;)z(mut(xvI0nS|_P#7U7fnx}O74SF6kv}^&>%Y0-ktMqSoEX7X zTV@%B_1D6|y$O8@c+@sD9ApDFM?s5S?<|aE9p*u=YwB$13eN zaeeQ@K}0qY6v2fmVignwu@I=r8gXG21zAMER1Ir@mPHAx8r-Ut78OWP76Cy5L4zP+ z)1cK>0tkeCkyaCsMI`K7-!lV2`>j7)|L=VK3}a^QGI#FWx%Zssd5$;4oyaI&*lPF` zrjF>Q_SCe?0Dk`5b|$0QzLqU;Q++kubYpD(@@?&YmA#FQsTy>|QUs2Bx(i2eGKEs` zO|uxx{N>SRH-+I0BP?=TMx5>-Y3x3G6&UZT69k=9knrz+7c7bQJm(dKPHW%{018T8 z&R-#BMMOY27HSehz;=T21?F71B6;EkfeZ8bW%4hZs)5agl)oq^t=galoT2%1-55i^ zE}0B7rO$0*J5Joyzdxeze!dMx*(d;THWB!4!NL68Lap{TKM8Pc%p%%cZVS%8olb^t z)7!CqP9aAh(XlEBX$@ZMqha?4m&preU@*uBe2&-wxe5Os+ihB0@3}%eO2E>RP&5oM znkxt+yoM*;eu9#W*X;P|>g#o$6N&e(zGESb4bMGxxu&qfb?2#*>&z7(M7~ zpBsm?D|!j9)c0={VOLODlox-(vt6l+j5>mRQYcy2T^6|=KSIJe7U5>XF9e4BJ`>e1 zcp%8S=30FZ8&8O{i#;QF8wo!#*CvFK2Ku@g`FP#&`iGEDGAL6+#;Xl{9rKP_6AGuyZin}>Y~`5Gjf9G z{?%wx{fF<1(spJ=KKW~jas>AR<5m3!a-_teG%efK_2^rIb(ZVW@xv&-V7vZFv1GFd z4{bN7BMTH{1FuoZqzQWX>D{91kNad`HF2*knUc;e!^^#0Ha}{0=Vd>iPlfXjj3Wp4oQJ!9V&2iAoGSK!gJZUq1f^|zA^CCNI>UrL_L z!)S(w&G-aAG-=(irT+f>qX*w!>)#u^iPj+DISeqcW38_Q9RzUO*SZ~x>+qWSKUJQ- z+l2rR7RgNWs<_8x{o)RO^w`@_ryzV5&3BfCJ-dF4m0OsVbwHC{+1gxxui}Y=`F0Tp zJU;)#ts%9_*ouK7k@#A@a;au{)}3yj$k%cbEDutH7fs)Vjs5BVW1j!clN8Q~EbY}v z+txQOOeU)s7#JqQ5qpQPsJ89A@Al2@RXMJ%v>C5meVlW2nI@XL`3**k?zfxmR#ZpB zo!e8&nMy%X=Ts-ERY!7RJgH>xs{?SYed`ooB(I}241s@ipH~KkbItr6fvsIpT16!T zHVQFd43dgVj4+u0?Tny1!7W8vGI{cD z4|sx-7@qGB(8KnTyLRuXFIm9qO1png-F3Idxt?daZ-0(=4m-44oh#?M!*J(;Ey|1x zm(fIr-l=BUMEM~0#JDZhaJzkv;vSy%8x`imL$1ws4T&>1SJd0yt??aiE^}n68=4Gc z1)61Z&ecTUP^e0@S@A@*KfcQd?nZSwxJzS=S$}@@j8EXH0OjwqHf7(;Tl8~Uk=4lA z@u4?(mi!9$@CqfaQt8!1`r{}&=h&k&Wim0Yu8C#X$wMU@qv;k6RZ=KTcIEW(_;b`I z&U%7RRnJ!jjU*5Kq-wbUkDLGhE-fGZ^Ge zcTQqO#~r%OK-PZnZY?OO(}W=>nGk2Iy+-h&!xR@uB0P~Dc7A!;A(!6v^Il=oltyU8 zf}osc`Km-G+}m+~>IvuFyXhs1*l~OHvqh4~+>xq^9+&`mZX~mM+7Mpg(m!>H z*^|brbD<9QmmXIq=8$}{f>V1I$@y&ACC+0fGSXD*53HEnxl+W6^9rdc2C*$DvWohN_R6xSHI z#GbIXz2cH&a_sn4g z;pAq!Yt6F2vV>XWU!)VW6d+RUXjOREiCRVNQ*O9iui4}HTa5%+JdcCZsQqOp?(4>))=Wo6#% zj!M(rA8@dTcpe`lUtCv|$eb$t*-d=`z0vfkE6rJy4a}~B`yGeg>BQ5V7oAB7TFo-5 ztf{DZY@?=&&j{U^SaZXFCqKn+df|{DMXC0i+)LqwGX5myiSyADBFB1ud5^5wWCP}noQ>kQ|PYy zD1VE7A$p^;O~$UGdh!>afuT*z%GZfHi%5f0WQMr56*o+KdiNi+06KUSwqkJf*fhCi@S%`Qx1K zUdhTQw{xGU$#KtT>ioHlcIt>SJHM>P^Y^EeKB)#FhujC`wo7H{T5D>H{490`X{T2t zo=z*eTOQodve>gt-R+JaWf-qFt^7uljXl~KaNkw8*}*bwtj%e+2u&#{$j`It3Qb1F z@fF-1Hq4bmZFAbY(9JJUA<*ZcYI&ZnlbO%fZcejZmDRbc*{4>Q_wS1@h|T&{_3(zN zOq-SwABSPR66@#(ql<+4HZMiz&&GWIiPnywYiaiOfp@0~UGl!xeK0W>)g9F@6gIWl zo+adXa(Z@gG}oAwQ3U2e`C;PGb%l?8yjRY(GXfr~_wkgMMOsYC-lRXLXAwQETDt5< zDIa(j#|VYAcDawf763qLn57yTy@)W9*`I0HH8?g&Dg%hVORCC~fweBTU)1T97zw?h z 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

tbU4N8iKd8zmXf>nz(gM7Is{!G{ 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

P%Pb)K6R01;LNbfa8P8?dp2G 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 WnDv)tQA*;K};g-R>Jt2h07hQmJ|rEyJ+ zv`dL&7|qitP6ucwclBs`j*w$f zb4w^JHAUW-_yDI`Lh9EyucZi;M4Muv9OYk6NNal?Y??3BGDu#&0i~0orCwIa8%PXb z2Ch_OexN_oML`hIWF2_@4&og29kVg?oU?Hr#}yO6KWY0emBz(L`%QqD1Qk#QwFgMJ zY$shM+J|WBw}UJ>4>gej>NJb@p92UJ4UZ%jyYuISH*`?D)Pg@!$ z-tqFSZ{MaUEoE0#SFeqv>AQwjKi^50lUZ68nd>i(ew_4i;<{FGtm>-0fO+xybT|bU zA^di@TBBC}&W%+#K)^(~vs6qW-9#Vi4be&(5QRsCl{CG5JnUz(sD9F!EuK7*B$o1= zr(8abAj&v0;d=wWYgiQ$U)VCB# zd4)Wswz}RPx_)B0)mtQUQBPrn#ICj6=cuMDd5szC2bkQHMPr(P<3R%6G@a1cRA?+T zG#n28oG4VD6wzD@Oap`fnSD4s78a^TKoCPfPb50Zo~uu|o#M?&V!Jp=`}{ZK4J%-Ml7B?ZXWhQlI3K5$2%2|$IS zH0%jrZ2)+EARz=GfK?F*M4rfHT?9m-aCwaGr^1FfUYfksvnUFbLWEC*tvew%kQv$p z(uA}rMAVv0_{x-Fii<-D@4S_U(bm!5r)wcP(P=M3Ku8@C7l!g4VG2?-I|dJhIK&bF zp`mf~8oK_D^n~>K>fD0lq1;dn{X~j376&mZ?7!d(MpH|D=ARGYbVUdqFWi*JrjEQ0;!xzw3#xe9(Up{kAPr|0}wvZ7wDHR3DWpqI{ znVN2(o)Oa1O&ubl4{c4CMo|NV(9=+KWQdnWFrl$#mmZmrS_U^177K?q$Eh(#0&%=L zycBV~CUF1&i#-&Jg3?03LxONp4LA`26h=ftd%`Q0kTT!%GRbCAeMLG9rofbGZ+2%6 zisBtFxj6b*LE*6YWA-a034yxm^{mYrnik+ATGf&f4HvSM;)8dRn-d_5A7m|BNerEe zzG^P``Gx9dadT>&_`|Se5$RjURUxmusA4|M5cWrm_J8=6&r&6cmJDwF9W25+1 z(((7j-om>HRl!_f`^dC@V#xXU>EhsanB2Ifvt$dcqBhM(75PcOLvIUPfMExBDuVmbTwjd)hatyLlE# z#2V!YQ@QdTh;N3`gt{rYow&zM>U^E?U~?d{`nCbZoj974NuISu90nU0pYi#W|m3wZ)rUg*_vOGq_eIxpN3NugCD2gRcY2feUZx8KLB6!b^SDrOfPf#%yai| zEQd!C9v5lb!;Wh-o@;a?5NN+Wyd!r5w<2Ye@y73=SmKr&LId7<>fl^v87q?+9$L#HGz5><%}kfcv!rEb!+y?qd_MY&hw6i!+dwi zy2oQza%KawW69=e+|x#*Ts$=V+8oD*f@%xTozp1Mvtr1+Pcuu9!_XG+?tK+&f#eYq zdCzny0!|Mn=1_>1{j5~3h9lY*yk19J@l5UD4i{G&*p~nxaC&DQ2mFYrBi;pat%7GO z|9Ggu!&wUO9tJ|}l?(tZAB-T!rg|K=hY2=zrO}nh=&UsRf<}b{NDLZ@$$xJ#1=+}_ z06%@hrNONKTj&=A$gsK)YCe?|tUus+2*Q-K5~s159?~*gnTO@chH&=CdPh-M0e<%O zf0OZpss+HB1(2M%M0-7?cd~B1NJT`lq+(=NYPX{vWWMsIc4jr#4ZWB*`MW*efgfD{ zH(&~97C`kgBl&-D>Dig;`S`n8ZGheXCS#va9%mLX_%qdT&{*#IIj(bK?B_bz13F%v z?|`xB=Sp=T!K6YMc26g z*g>%V3TMZlsOQOe?jZn|w{3iv5ES%mHHx)!#(4?uqdEl_Y5CSJAjq z&?qx35D;L;`5uVUz5v6>i1;*n*UoS-x6Mv zUt-WxI5grv8}&Ow5AfLKC;H_7z{9=B*&oln21<@bSaGS4{hL|=gJV)MHJA|ouX?K}|q33};gzF4?=kJVoO za%Mf2YCo)Y1mfX6MZ10R$@3te4Z06Xw|uU=kN=QFjl<6e=vT0S&@d>DyWt0uzW{Fk zZv4K)n;5iw;l;IW+s`LmQCD8z)awQa&=ers6>#+Ij!}Q@J7%Ob%!R~s{6}+~PWN%k8SSCAcKp6xE}O_)o>qj3=H7ZkcM?th#E&6V22Zuh zfkQy=Pab%DT({bv$q2C{SLt8O!jJ93AhT6m)nU+Lf72af58~{%KtZ4Xv_RzFT_uKR`;XBW zl)?rU9R!)=)nmGYF^Nx(#s{x|lpV8^ov>NFhBt~Dr%ZC-j~2K(iPhncVc&E6Eim~% zXv=s$xF%JE7L)0TTv-bI7C9ojR_*q12jm8N3da*WKwcKzy>5lAfgenM1-2%4 za78#T|5~(R6o?x)!Ph~dmFDo>O783Zhu#8t8W-{Wzym%Upm-4^tptULuA)V^JCHsd z$cvMK;3B0OXW0sx1G~&=-QYpnY)l%gPo5d>kjEq=LE2St5PK5@?nH*ig5)NHzR2%j zOl!dWl@^63(*pg)!cueecV+$6^fo9nSZcJSLgF5@8`)VVIER3sPkofQIaK8ursU7Z{0)9&x zY#95gJ)Q8f_ZuR3bs1=xL_IF|r@a(b<)1<~=`cQtZA?D}>;e?)Ffe>E0O3EL7=fnY zFz}{4?YN;0nZa{n0LPQv$M}3IQ+N1M5J15gfiq zNq$6!V7W|w+r~}lo7heU&h6mZMhTOwwA%P>yAf1K$qXI1C4t1Wg0M2EkRq;+{h}xu z843;^-Qs8R#T1vgzP@p8VRz{dJh!R4yPCwQ*SpCEdCCzS{KVFNZKBu6^|oA1{p4EuAxw9n#N_tN8#l(j1K?Nq z>`Jj>aods#u|AYQt~BOBo!vsia9{mcIa~YLyOT!VgB(jnR7$Ot#lu<`UMsEk$g`c6 zkeki*Z*}u|V({%_@VUvL#@5E5*93Xs>5s=yh4h?g*gCb(_Vut3l~>;ZSOB$BO(9s?0`V2c@FdsqNu=iz zmi)Ud*}gQLY^g86?5%Upjg`iVs8v?p?9 zkm7Wu^6bm{&5a=NFbqou0QiO2{!sT98T*Xz^8ykB>i08d@?LUpF73_(Tg%6R`Sqh; z`Mv|P>v@4#?ESH0g?i@~;-4A)1TW*N{l8*gey4r(2Ug(pWrX8tw1X?%H)@}@ zdLO{k-rF;Z;#XEbr~>i%l_7u7bH4=wf1ihcqUvA6qJg?4|CITwGFVxYjlXJwLk5k) zVXiO-;!5RLlR*u!N)BV46$q|s_7*lq?BK!%A_rz-C$43**lLI9@ct?QT-(f|gC6xE zkG%}^Q4f6nmk}O608s8Xz<=uaOOD0=WIZ@s{6e*FmJt?MPTs+l{yx{@&mevfKHlqB zdn;_*0tLqh&$&Agj|sjw;iuevsrwT$(O=ZvBi)i1 zym03odmQ$1ein(Y!E}?#F4_yUN3a{{SrqSJalpZX8cXtJto~<`AMhBC!;fUSQ6LWH z_>qGH_O~i~R>>22A{#1v{SOD-Bfja(Ej)o^vhOO!|IH}#JrR4Z!YcW5*sI6x3*c5| zqk8QmrZaD)tJ+`(i?ctlZ#359NF;wI1mWL|@(2mUA?zEqFL4+zasRZiAOyKuYxZqQ z@afBY?`+Oq{MD$xbt^n;Gf(PV$k-*1EaR6-&D5QN(w4`UTj-gm=4wfQB-;#V2JbF9WAKYQ~B zG|(#SJ{q|Zvx6(eFKe(HQ9Sa-K7daio(#kR`)zfvef*fQ@Ko|)f3^xx$8uA~AA{l< z{uJXm<2it_=1)anQt8(uvU*RkZ@=YZlb}%$CAx9u5gmv_lfuQg z7KmlO@2WjP^6pDu=I;Rx;Pwe* z9eBmL{uiV6l^oj#aHU9>y{6BAPh$G;{P#Omdmt`fUj0w&CEPa^$iW8AbmCX0d%S+n z+#mn`-Kw5Ht(SgS<+1ZK^WQ(?-aj!xF5%JsV%45v^2e6&*8Utzg08|HhC}{0SMAgO zyHR}&KdX(0SL3m+q63u)48-RQ;}rX0lo?*neWQep@Ul4Y$e6x8s=ef%BL)97R0v{? zf`A>E5j;o4{)KF;Hiiu2;qO4h#qYrCWVzP{na@&r;H&}oqk#qUS$)Y?3dXs`Ll|** zOJe-XzOepM^gP!zJ z!o#66Y7|q$dX?3IDs|!CK0Af%*Ezm^z_=fdH4t~M8$6I@NF;*+O$7gU3YjGI_vXTX z5P@{Sv0dsAV^Te`q^_$oBEB(;Ehh?+k-pTAMNbd?tjRaaeh+=2lSrm zOqcX1ygJ?0A+I0)6L~-9JHX{nTH{1gu7FIK6hD}g<`RNj_6)`s9~}IAZBcF?^*@sK z?ZR%hz_aY2=9l2n1Gac=DG)b;{)GCYF7N>OGIh{1;JOS%3E7xb0f~Oh5<44{J70do z$0pfla1O(N6oeP_|5x0N|4tfg*68mh{6WKiLr&3UUnPLdq6NLx*}=oJ{JoJ(5{@?t zwKoy}f468A4ZBATm>xi`hRSmrA@ixQ6C)Ukn)Zwu=-D4W|6iK$58dQV(ZDh>yAN8B zFcxc6OAM|CT4DIF5AGi>{9CpBgXiCnnVb5cgjzDgMDXx1_gukMq< zT*fY={;hg(TQf|uWNWfaGX=aE0?)G zA^|AOOdl^x9z67!?T{S4EZ<52pH1Xd1HbT30ae8k{I`c1c`x+eaA4r8%>Xz+#15{{ zSDTqv3}uRRfN+49kV*z514#+6D*aCnwpw~9z`5v0xYsKB1D0$Rg@^9(34=z^hp`s zSw`}$pzo5vH7~Zm4}*IC2+2ReKQjLWECZnW?B3MCIdFm83ID;t2Zs#Ct5EnVHTy~v zfX@LDRuBBb9J}cLw*X#OA&7nB93cS&jED#bu#E;Fpy8HM1>dG)ENS9ke=fCPIjlJ! zcTok1paT1RiRtiQ?nE?8l80ZpxqtqnAuThgskY#4+S=GfV8TQpRWsZxrRFeOQaNS2 z<+D#byznJQEfJY)DIw?7q+!QQYRB}DK$KMK_2;DsoebJ?>&T_Zl@j8F&!j#9++{>I^ z$fQ$wn!2`H0;z`C<&INlIt%0IHSI`V(bsVscY5=h@IaRXIPC5V4U$uaUg=0Zw%nfN z@3y5JJ!S~ZN5E8{F&u6`K|Vj2uOAyKLTxdkuPToZ2!=^lBIV zYS(DQK*`_DPg<>(k%*-LyaiaQ!1pL;fn#;&v))A0b6?yq2VX0JUG9Z$&U~!elFgF| zGJQ8+0lZKg#<0Dnd6UC5s)Aq|b(}JoI;$a3euGz{{E|lGL-?y=yD7b?t56pg%8zP( z5jP^w9axJW8F<;;$Nq*yoVxdY@<&?Exd! z{YJQ<<;wUs@FpXt4uv8m|C57a;;9!j4CBRU&LNn9C5mFD^_`?U76ylVXd`gO~sr-$a-zUe0x9rAZBOJc%ju6yhX%M`c= z$S^CV3-;Z}^cWG7I4R?3HsN?EIFmK%=He>pt;GkfXoGUA^;5T!j;|k+^w?Fd4G@m* ztYsQ+b6qm5uHmPX5G+i6UuZohdUZ%eOUxRyK#!s5Dr8*hD-YoOsPD(t;+{RAlAvpe%6K4!)Z# z!EkNGXGY{S$?HUq*%Lb4Y)1Ez%2KMV86zu(I$>u#tRkbIE3C)p|%NEljHi?UO3V=rUJ7K~kc{C&^(*)!JHX^|{Pr6Glg0XYOW2etu2( zv~AMBUC+Uq8Wl(7PV1Df+)q;;tEee=ZVOk}yeEH}tgq`<_*LCptBO$z-SmOhl!2Be z!DZ1uvDu7FN%~q5MuPI;%cCReheex}82H!3EV6E1CAz{q+U+P`#QcJ5h-<7UqKfok zbHdwgFYTe0vub(*CJFl5v)yzTYlvyW&)fE~R4)!BcvQ){7o5oUsD)f`FK9pXric3! zbUsz%77wzw*H6?u!N5@U8-34^sGaf!&$9)5GDilDtWu+zYD;&5wKpNZgzA4#-u@Ro{qjBzFTpi@l!3QoYvi zM>jd&nFxJ~c(}aS_}PFXF3CS&nX$p=^$zbHJE}=c`Y~4(&l}$XZ6m$W2Cl8|fa~Qp zgOkHw+ADK67T6#SzDB=))q{c|~Vc zIU%*WNtZYJw!Oh7w_@eM*3EC^%K}d}RaL-Cojex@C!(GVsXdJoE{Tde`$8(X@_|%F zXMYxZ%3UTpX;)Zp>89{)W{TI)+q^DQGoZxD1@e#Otw&t@!(mBMRl{_L>wO=lh@I4) z@>F0X&vR_ec}E(nZt1qW%3ApVxya$3WR`ru_#x)TlC~wf_1YXJAY@@TN0Ff>1d?tR zH)5%9PlcD?UF!Db!%juVhU8+t%*dbmiVi6f7G~Z&H+TQV1DOi~{#K*jaheAbJ;>>M z$-^R~u3EM<#1=V}h)K|RfG^n$P^Oca>Ra}CeIr3=R6m!c6m(OLmuoId1C@Jo7YLp# z!g?;}+;D`9aarBlj%BO!k*C7VS&New+ZkAFTrN{p$!i_COp-W5s&O@TE)4v|MAI`x z&ZMWcizigTJ@7}ytH+if*vO6|5D4*9zsLDlbF>r(>KEU1R4gea1R;jzUvv)p$ARtW z$)>#j=aumqH^!?vl+ii80m=nOv2LPRSaJO-Ve`h*aU$Q!M$$IpOwY^Mr7s&Z=VLLVd)b-2xE1~ z?OS2#Y~T#MTH-oMCQGh&Uw(^kL@UO|qBi^1&Ai#wdv_sj+`N z=}OoR_tBUx^7-{Fgjo5x04v&4)&n04zr|eZ&>H1>&NgZ{urSS5O`>{v@IA9}lA}hA zJHOswd9;Z`!Bh1i9qH(-7W$raGTJK?fmNEm*2meSr0&Mabq491G@l)}>2MHCihTDR_RmR-)uh5^+e?p)#{1u2Ab(PeFm`Dzy@bB-a3Z z_0}fYg!-vEv!NT2!-r|J2c8gJ=0~tI=t#+`@eQrXhQ;X!iks8YT<+G@cH>l}b1!&( zJna!r$bIvyw=GR2>e6`><*x#3-;I1$q_GkUL~fq*&Hj8nS?$Yp$B&gU*A+HD+L1HO z%*~vCasGvgaJYQ94hIjav)GM9ig{t=6t`8UkJB!5AN(1y$M8Yd9o~Y|6KH3b#lh!u zuKJa0=UV8vo=@;uW|9*!Ek8LsdlC=XK-ewF{r~ zD_Y(+P1A_DWPjegmzU3rOVr`^vY21|SaqIj;ODb*`t`&la;2$b8h3*z^;s3p9zPT* zY<NnX&eWhD;K@JbKCuh5>Av*(y(uv*t2w_2C5QQ|zX zussW+e+O7~9mN6!4B9^&3>MD2Q9x%lVefNn<<^+QLAiFcnkdD(>kdnUvLRJ~w3q9; zbC(%rMA&a#-_teE&|?JMn#Uy9rZuW8dkx!98|m6+N5r!*_h;ng+B({knYd`Te2j%p z_V=yOJPd23lbh+=!~}~63-qJ6Ios1Af)@*F%P-L_JfM{|$?>*LW?N~%=wBLNVc+b% zw7Hqe!Er*!G5rS78JP+Gh__ByzA!@AVdiE!;#GE*iww}z^NXjhA z@-R6%5rr zGYZy$i9bg0O?DPelCz1q>_2j_fTycx1a?#h2l%I-hObj9vfd^=6&d?%PP3eIgfH}j zy|zgr?=&CnkhIRsY5E&ojfov)vHCm~3&tx}?4v=My)4Abb0Z6~ws}_Th5_n?u6KqC zW@N-9K>I4lUpg*h=H6-D8Fv2;JZ7v1E6cA0xi(n1RyIwp2Rc;PzGS|EeKJ8g*!WY%ePF=~KKc-1G?+{rc6Uv}6>A6x+a${E}iVp&K19 zhAbbBz|KhN5pr|Bj@L@`*Ri%_V@<;@FqE)Rz=c6wS$~V_<1_&Rg`RQAhq;*<`4*1$ znk2qJSKSIa=P70K9J^`59}l8Pv?rU!7kE8A*yiRs8n`$~`<~2DDiHbgYa^Yo zZSII$X_e2c)CV*D=LNN<`|>CpV3k@K48iql91Ny0FH))xuKNKdF% zLBjML`sHR$#-P8u@pA?S2KutHJ4N#bY89Cb3_+O;Onk=9YHzPIke-P2xCWg#M6)j5 z#(RymR4{$fj?iEbNgCX>P1~T+E5)0lU65Z;R&a-fa2_E9FoxpioHg&Zn1u3!ZVjVfx!k83TmL{C?=ub#lsjJ zE;pFVCxeXK@(oHTd0|wvsv@2c#bIAo6g{B$qPUJdV@g4&$$4VSx6y1(#b-^$G&k;5 z-hFXBZ@u&{D(YZZXL=P}{8+{8iwcOKzD9fW%7k;U38$Lw;G)Zrlj#HZbIILjJF`o` z>EAi5>Yl!ZbjvpM40l(v)?=eu-bte^t^z9mQ(|IaQT{%Qjx4Me84msex?)kR76}Tp zAr4%j4;O|S?}yIv8w8UVe~bP)&s(Y;8(XKLp~`GeLFU|*!CbT!RAlfrIO4IiO6*%s zv+%{ysOO?ZV%n}=WlBjhomGBco^WG!?ea$mV6xC znKJ5BA9$}kRoA~9-t6s|!>dbaY-L9#H?GTkv*4X-_OcN9V9_Z=nv)9=bJpFe@t52o z4_b!los)9ri!3J*E{Mkv-u6N0Fvll-4QtsdXBO=j>vgH3n^vOtG)$k#Ci*+?&}s~S zu{!>Om4)E+^i@czsBgm1$0~`690V^nH1>%D4GrA_(*TXROxl+@$F09r{1;_nNx>AD@ zo6qT~TPaJJvB_922a}}UFMBoF?5!6y*B9X)CvG$t&*(U|M*fJYV=On0XD2xfItRJ3 zX_79RK0opua6BYHZJZ_PGgav4=tAj7+*EJM*j_o$L3>kuUAkGl%q|LI!=w)lcqYI_ zIpFW2X?^NQD=$mTb&AcKYB2^2Px%oz`$=J_DKD}DDlLJ3p(LtU}T)80)o)Yl!CJ*WCstlCf zDLcY4i*(MT=3TjQ@EKPO2w=Lf2MJ)D{*071nDRJRgerV6byGVd6+RNK%}RTOWrsF( zlb2^XO=lK&U3iIv%rvG#joE1&GUqd6F0g(mNB_oE#9aLyAZrBSCMbExV!FI z>Q8Qy*UxXJIa*8hu-=*~ttN40c%zWfvmo|W|KvHv(Eujr9V4FpW|M0SnlmY{ETTI*b(4=* zjw?~0yj6L8soMJzE0XF)B02aLwnDXAsbbOH4>SbZR0YPLa`u^kw_v1zRUzQ7;yAxx zf_;uLFkDic@u#g_qGRG>j$LqaR+s6Dpcu{SKe@;meaM7OO(c9bQ(BJwQU5f>mP!!M zp&4oC&Tg+%KLkyTDT@#7C1RUbO(JUkWzo8LIt}0vmQ<@rPYabo=VAPErw}dpRS;n;dakqn zY}ovkv554tgP5g=-4LEdF+atZd0Pw0opo=({6h<6m3d>u+aI4K*ix6Oj17DT1|J<+ zs_X$%wuN7J{f!!)+9^lU|M_$gS{Am*n+;A*PY5vDyBU(rrB zMw+btkOH&KHjZ$L-t#KBr*%QCNF5xbte<jNsk%&e}+^J)12(e9HsImm)w;$GyixcO!zJ6=Pv|3y zN93<1WtGW|Z-@B>q$ju5AEE9bmGM`~c)=O(6vJR`E92S9LE062+T~D8LG2mHf{E@K zvf8txqF*bc+GW&vA}NnUVzZSv(MPHT^;1=Es}hUXsdgGO(yp>z~bPEl`aVzYp*imC{MAdfS9;yp^oCju{Cg?Qz+#?DcK-`DB z1ZB0=%ni67@^ecSI6>;@gEY&qC2n?oO6$SlV+M8MV<(rYZ%0*RFIAUqykIgqR<(N} zL;TvL`_cpPocV_n%EJz)OT|JAtrl(7=>U@~Pyo`7=pQ&r|2M za-FETr37 z3u7N4bMOxwb-gXfEXYhVZqt{ALlVohUx7vZEu{C#63A}S%0UlBAzF&uOhttlNejM^ zQs4-Ey zOZJFHll~alw6$Pi?J=?y5D)yfxEhi?>z_%jWmVp|(q;E~G+j)|zb^)<|dtshc%t z3BSLR{Mq`1R)j(Fct(}nv$oUyk(7c;3FG3(G_+g2hx_j9_3`Z|w@sWO;HiQPM8kiaDp_I_|~ zDF?W!iM=Gs*y~(DSnBX-Lw=jq#u}7&H4*9t!)iM@tcp{ejw2wbp(L=x*T2(N6F`A#fA6vY6+%zw)4rq>wumI40yubjBg(_ zJWfM@su02t&2~~7AA!0UdcM*XI;ctJ=SEtVQ=ER>6n?)sGZls^B2!fJpUy~Ye#3r~ z?4Z1eJ@g?pQDZ;UJjd4In0HwjlYlxiPtJ>Z`uIppL^n)UkSZppQwyF9}3GlZ27pVSRnVfc9k}L6XozeZ+8q#yM$&J8v)V8V>T8=khcy zKuO+v5{UCCx>40dhTfIuPWB3&uYk%?d-I6KpGj9lAO;Da(xEKm)VKyxAjGM~muwNF z0t}&AUOG%A*ZU!`<@iGqelULC8yUK>P3DzKtpjGij^xU9iz`l>h( z23YpR_IiN+T5|5kUxt!YZKQq{YyiU#Qp#RAI32aAH!}U3xe? zog1M_0CcIs%=3+5qreXO%=wnOokQ6&QvlI~?bc>3K(R5^bfAXW?%33-tseI!3BIiQ zt5=v4jos=ZErhKYG|j<2PnaJnn0Hu<#KoTEX;tNO@IHPN+ZSL)k&B{McJUrUXwaD| zFNc-ifF|9MLeP2EoW%ZeG4|tGa2K$uBZ-T7O}j4$HR;blZs6ZA9207}6_5k0O$S0HSWQ~hDB zzqjW0^RvRYrOX&CE~?j*jgDFr44jHRp(S>kQtZ`}=Q^_R(bt|9i%g4G!N2@uG}(8+ zv>JA%-7tlKB4$J6S^eo}jb|X1B4k~byLVJW;*N&b+`SWEO=z#)aw)R+Fn}uW=QB|w z&R#Pe=JXV(PVbzFkqS#!kAK_N8Z{Ue_wB@iVemx{diD0-0kK3EhJIo?L>k%C5A>_N zw%|{8Z-xx9+iKVIgU}_{o5QWCOm`M+*K&K0v|M+XT#FdCaypN^QuTB}@fMZ36hXky zIazP-qYndyE}8~x4ytOo`0Ywe2;6S*k*yC-@jrE*?w!G9!N)u<@AVJvl;+SqhJCel z?oxVvG(DTn@0ji#w;TO&y>ay-H;IXvGFu{~dGE3s7VG&PBdfFTa&96JzZr7nXroS) zZFyslKtU#wW4X?QuIgeS%ppm8)vayy?X`~&*tCrmLSG&o$fpYXVle{OWr-o(q2{J_ zxZY%#Dfmit-LoPzlV3(th*_IMx`fnRA0c-qQT-BN9|FRCN0);OPcIh;O0;Da%DE_b|U z<`=KlPgf;w9SzFYa)=Z7n&B4OdS~(FH$Mi2gP*iy;tmwA3c3%XGy9OYtOCpURHkHE z;gQ#AVJ9FEh9*EgqwSn?8@G|`=ro6%G5}NMw|O;%NI8`zwAi16fSz@*>35PI%-~bX z-ilTJJU6HtaFF_KJ8R&Ed=7D33o~1xqay-E3@tF)RM?S%6QXEPPwO-RZ~8LZvU|7^rmfwROA%6NGjGZfIu<66ORw7_1_6cpplT1GIK@ z_(0PffK>Wz_vIG`eSTF!3yUq6=YxhP@|Rz|J9zM*2AQ$0-;6OTBU_h7jn)O)Wz|3* z`sUp<4Nn}D8>-8TP=%pVLJz#Swb=Bw`I3a#KxiDmn@S@|KuZV2(83WK8nNd{V8VYHG~flv8i|4Y^tAj3t_b)PsiCBW)Kbz2)e!4U=9~G#2X$viTT7`&3AE;W zFQNd)JmN@qYDE$_g!N)8)jg6CmMLk->}@qy05GW&N||~+TVg#e6$SU+bk~4KbZxWC zA+Ev65yS#bk^+w_B-5Z$$F%ewuc{$r>L_Ofy?6jt8iVMraRpo2xp?CH;)y({LVJrs zIB7pD0Q!6+;UjIdD}!NTX0p3#Y7HR`K^Tp8Sr%vGZT*y^vqJ1V=7TSoWlDHIG8@Ws{gfp+Xchjt$bGlJXC&4=XmMQ}p5m~A}RHjXecw-$Jxh$+Bt!)cG zvcZ!G(b^gu9<;e9ZgDH76A14Ek{`A_r=@xcvUCVm1Ni^>mzG(Ts+^WJUykV z=LaM}Le2FH3#{!CZ++Rg1QSy^jf072YLOW6=s}sndaCcZv;6cWl8_q`!vZo1cxAa3&)4V;7lU6YZhVp0ULkc{I z0hB!T)%PD{x}XA1QM?86%uc+eX<_UUh4igFfG{2MnV@qaf~eKEVGj0DZ@OvjYJpB& zQuYhC&(}K%e8{d8Z&k7~$kG&lF6V<^Y9VY-i+$$mc5`(bAt5X(l4(eK^!U1x{Y{%e z!&6c23=AA7QTrR#&n27K5J}q3&c?6ON|5P{`qWogN-o{FWa9AIQlpEXm0Pqk+p#47 zebTLzC(ONxi3qj8x0XpX+tp#_`mF4?&8uk+(*s1GV5UkkD1!CGbc&V|8gFO5SEGE1 z=7#r?S2aBjNsQm)k2)P#xGJY5bc7z2m%(QHxx+F&5pd~F>W--S4ixGqm%&I>;WMsj zm?U|#<&wm*9r~LwZStZvhf>H6v=XBjg|(JZG-|wQ*Xijc>006RsQacYk@mx-r0yCllvpI^f$ac38g>&v%*+3+w!n3SJ0VN#7g@jlyvtCssRMp#h$kE|pT7eK=*>PQ zP{01f5g)(N@62qlvb1z7{*}6WuJhD#(nTkrD<$SV zgz?;4x{rZ$!YzdKgoLRC&Y!e_HW*+6kSSkstn7KQe3Civ@pP!ZymR;=jZgOl6Prk( zk#Jf=XgnW8jg%k8%`j@z7O>I;GhdR_IMRU5*AC_7C4}gxWsvF9(s6giz*7Jnc@cB% zbh*=^Q{1wzlNy~Kcyosmpr^x|3EOPF3@$oRPb@|o9TC`MH*+3ybxMy34wa61bbqyb zLZm3)`Y!9|P8wz~Jik&H$A=UqrZG;qC}HPK75zmy4EfRbjS`u# zmK2N)7BfJ3`}7*;##`nRHn)!<%SVBWJ{QC#>Bu|;7kY&SPqi%H*St^ie--BnI7oaV zLfqy^JpduuU-oS$h}EIksw2yaP$$uaYS2lEqg%-6%NXNEMC>CbBZCk&0VZY|JJSb2 z;-6E619^v9>gmF%@f2!c^tt4;VmR^!SRv0SAO zE3y04u~4nRz;|B@;LlN~$~5p0I8 zWkSI;V@a-tR2$!>laFbx8va>BMz#Lv?1}74cxjU11^Usisz~ahn-%_27B4Rx#SZ`l zfqeYY;?D&*6XK+CVv;o)4ueQxlG>uqZps zM<$oWq0@X&;YXo|kOS*UN(gdLWchY%;)!Hi$Q+?i99SIQyl5JJ1jrPH>vEcY*D`~T z9c?XQEz3;Y_{s`2lRpqXk;2zs2E|OsA~Kv0f&MIKE$r*E% z(F(4tmX~7zR?$IUy4&SIgSzROMS&>K(p6)wN?_KKP)&vKa99P8nHWo-{72GhJb9qv zimry=l+_->T^N+4#pcV(&yUIa1<%4Hc@-PwVPP$+0zb&bq5yf^D2#nVb=@(6aVV7* z1*D&C`!z=`Tk3j0pof}Woz9xYv;AO1sor128Ve?D?Gwd(!EO)qU;F7TQ#ERMfhI0# zvWu9L zDnQV9TXB#?=bE>n#-m9-9gHe%Z38xB7#bBE$i9$pH0aUU?8lBZ-&APWk7YugcgoqkFYG!e%#BTHgp)_yU>1Ey# zMCQ$*UBQ|ec^;fFqFWI~QOh5ELb#nHiJv#HE$m}T70y{^&D&hYQjp9s^7k}!yr|v? zQ(G=!P$HR4WI!gY`vdTCVfZw{1Hss<9M#kGr~z}U)5vIWq8=qj&PPdjR_vxiohBOo zBm;=?=tj(~l0-v5lw>X%TGlNWQ0O5U5pEh7 z+TD#Hp>!GbqXb*N%uMA9|C&E+9OR$_9k%Ep2gzy}L#RT;sU>?7>fY{$(_n)YmQjF< z_@cdsu@dC+L`rGh+(ZR#cx#$Weee3Z2N?qP6*;vQ@klg+6wFkt5jlu6gXyB?hSF&n z=xzFd6Cu%ZAG%xe!$4S~M9x8Bge=U{s|4(Gs^WG#Jsdyx##=aO%YU%fG8$2I2L!-G z18D8vQKW;iXCMTWBpK=Ik$QDCl;jfnlPrz`o=)#3(KSYks{<-DHX``S)5v<*j8D4m z8H`QUsBmFT&LdVKf#i77=HopCHYlh~dr3dcf@n6*MYYJ^=j~#QP~u2tqj-G1XVQD{ z{?#$~4h73yHD`Go4|FX@n+E#n@dLKku5BLd104S^%0%Ml{ytL`OKz9 zU#o{2tef7;ln!pZT2KBwpCbx9y7OL4{Q8gYd2uMfuTYA)Jo=$R^gA!lUHT&gfcvj@8|M1OIvib{PyhXb` zQDr}P#f)|r=+}dWoJvY6axW_(_$fgMx0T!}Lg4}JkYqgaB_UHPM*J;GJ|Xr@oY$%j zeb(e9ozYS{M^Uy(9xaU`n7<<|Ac%v4R+KtRl>`%kBLj>F(^SQ}gFmKq06*hZ*XsL= z1xlWR>ph&$8JAAcU&B;WP}&wBPwDme_QOd7qDJ)27Q}(aaApvB6{o#vvB)H*i|1;+ z@&UB!Dm{-{BY+rD3Kec7DTt~2okTZ%?rf>JAGWyC$6xFa0yVgF0-o7;Q@89SgKWK1 zmDwX#-wCSBToOQ3?%@r4}DY=3}d}4&wd&A>eZwOplO{sv|QQH%;sQ!T2uNYGg_T z^=paCs5T@bcsqeJ6ZDWNDW`O{?WEa(#G<|#)#tX81(RgV6J0zml)s;`}x43s`ctN0=sOq1mWrTwX(8)J1kUt1hSZFRA?Nuu)FwH z3YRWAV<30jbeOR9_OA+3wQ!5E-VVmz4u(l+b%0H%i$ChE1O;}#3Y!$E%z?%urk2ps zR5B$ykpQtK@yEQVIqW^B!PkU%S|G|e9Gw2FIpPnR=Od!#UuXg-FP?&Fz&|uY$O^2& z*@|`9b`!-W(Zfvk+;|_MFsLZF{-V_wB|I3ISlS!ecV;_LSY8LngL{x1RP+2y8~FMJ z-u3gb`AZ`6(lOFOA%Y<|2MF}El8u-jJp7n3uks}PUo*c-+94)|;xHIZ!lqF{Z_#2= zQk6r#HS&AJ{%lno_HyBK42OB50~m?f`6rF*&uvk#m3E->@q7T5aV+x@Q!y#}2-!$U z`mFYIt0EZiocbMduozb`-zue@VQVOaNeZ3D0*sN85iH?i490efi411*X8MAf4~pK_ zLV!M4smHg!mIlQE!E`sTtfH29xxI)==-*F|Wr7l^(wPrqI_k>x$XNCeaWyiWv z={_8s$j6~1n< zY0XEeA3lwcwVIH*3E5)GRI>(WJC z1t(=Hfex;R3ayoe)_;XDi zAh7#dJn%z9=$B_+O82l*tDEgu(VE$!S!DMOI$0`aKW%7=i^aZEtV{Vy>46mSVv9?t z#noW$>~Tcm?F? z2(XP^b`N%cRltG<^?-t6@hGte;?fR*sPdI7)!jMIc&>idX*)97+6A*o zRNqV^LUsZn&?_Qx0=X5u%zNl>F;Vn8we%_gWtA{08eXW0rgCF&DF9g*+bj>2%|&b@ zpe`th-buX<5n&t1Apk*28YjE?X&b98{pDf^{Gr{@e6~0v%C5TV))02UM z567WaN&!J=3I-Pi`WE~hWZYaAP|hnIniN6+nk&MZ>cxDcOtS;wQs*f|pQtDrfrcLo zt86P`e?7pgWP*gELBsZh?&zd(QSFUBC#OBb(1BN4>hKwL)*^);9!0V}bUa-oez1&4 zOsHT%#w*&i=!3f^J4BX3RuxGxMs?Vpq0j_H$;xakhMWblTc#-2_oW#B0$(pkp9g?c zNsM;@D$8u>!-FEn^+I5iDsHm#S*qCO1!^1xDUu24enOZANK|}M3Yjk93gaNL;u4$R z$qAv6Q-(<@RYr*c3|U8fd5EdTV#Fi(CE9ODRoE@xaMC!dqH`r<3#+6diO=RxVwzsj zDL@Zv>UKknp{i`VX)f6lFj+7gkC&GsO5>(e06-KKDNkl(m;|3QAlKO()d~AY#4kkt zg4YyM^4r13kpy)9rcC>Q1CT=CCKTJZ@D2S<`Q2PU7+g;(9@}}261@{38m#z(8VlJ{ zq1UnqreTOPLR=d9Ax;c@j!yB)jmR_(R06O-98pL@A_?9e`qcY?_rA4nC;BJuw5Jtf zs1a`nP%IUMDLEWS<9)YA&YnS0%LV@jBrs0wF463%{jnHQKJ6>QeHHos^6#EMF7kRXJnk(e|s@h)$qsUVnPnF zgErN;Vt#dig1skOiOFy{KM2upze3Hdzn@^Hr8$PLTNVkO+Nin6`dp<5P+>P1*>!1! zBBgQN(Cpfp*B_p#V?LLZI_C=HFoj_nzdy?yPiIr$WRN_Nk;@YGs_q&`Dbc*O+`Hq8 z6zfOUj*v)s_B+%lY#8Tk4Njz5qpDUjQXD7IhX9A6j5ju~e&ZGO@Ar+TRT|OnS~ZrF z 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

AzKxyR{6KI#n}Tmu1g>}uqNfnh7Z4%5<> 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

JT8`N&6iTTLk|q7c}p>4afyqe!2F`!hSzqG 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�ZP>Ws zq23Wk_1y%c>N6lP_jTO8@YX>!d&hDHDf8N$jqn2bN&*36heV6z?3dnS9&}4b%}oIV z@X#1&HDf>^dDy>MQI?C3zDcZ1c>;6ao^{*4I)l>vEkdSS1x-mRd0xG8n&PO(&5|oq zXZ}?5I>Fue`}cx<_WRWnR^wsq<^|^a>M8R#bVix27zqu-gM?7k`rjK5DG{h>ep1|6 zrr*>voDkgRpoXFvN zlHSevWKM1o)GfSOx&3-QQ6gH?P=>=omBr}_cUO47DjH9TDA0V5U0dXp?D^Vsu+Op> zfmA&peT82?1L*3hNjoNCTS4?YjL2YG$ zL`Nv>NS5?$O_3`1Q=KCbUVFX<@IiO8Qjh3mR53is$VFrj_;NeTk;)s!>Qu#_qd8AE z_nOrq+@mc;k*Z5zFF5iVPr!|tYO9}5*kSBh6$k1HKy|7HoJFo8h4y#Io6I2a*d7|k zfZI@&0~J5evtJ-d8#W={aq^+EBh`;~otc`iH)*JA7=)@*N&!|lNG8aw4pd#guHz$x z?xIdr_|vCq0CADg94!PtoudZv3Ny~nznkPI7ZxF1YmjzE(~^~N!4<F4Xw^VEge- zMN~6*yCfxO(ALQde|6axPK(fSmQTA*5W}JSBP_-VVS{sF&HPx(HK2Gwx_qe zESL_Oppug;ei>pQ-3EeDg4kM2s3P%fxr{{_&}~IU3CDE`8N4a za)|>eEN{D!-2lM&;otj3Ho+qi1bc%AY@ofv*Mb9`PaU@Sbm1Lii*roOdf|JG^0Pxx zgd4)&U0&|Pxwm`KrWFpD3$Ry!isSo;{M3k|=kJJ`dyr3zr|^U) z!^|KK#6F3;2EPv4EeP} z6aC)CBj>lp&Gpf{XQz9gKv@VxRP&&=c)^{vI{p^6{fohgo}HcXzv2FWv2%Rk{{Pd7 z5&MS|BW+`7CGTpfXKnHKz6&e+m+wN)@a49A<#}PJXZhb;7gqK!koRxbh3*Ug{o8f< z8u!0=E)0KQ&VL{u*8d;!VPIzee|av^lV*MR@B^1T0fXnd)5+(BP<&(%Q0#YblCJ>5 z-%F;7(d~y;mB$+caN{@GZpWWsOn)~razraz8^Qrbt&qWmX|@A%b>+iQpev~bs>fTi zLk0budss!(xfnA!#f)i6R`=b!+Lm1gynuJThHPU&;_+be41b+(p-t`vmOwaE=|+F$ zf_S7d!dG=XQ;;~V#>v~O+VZsbR*ejMr<|csNsrzNNCB9Sx6{zB!uFBN|X!z(rK%)V>*0e`MmWI2=StEPI@m z-Oz1}l`sM7GThw(x%-`@b`ZzXkNH{{zo6Gc)6}elcJE zDSzICT|;5sL$bTglG(j++)!z5CVGJr+st)`t{8W>Ndg%h%WUd#r|PTay9aU`75$@GA$+DDEPH1nNTNvbJtE*SH<*{&N#>s~ zw86JOq=MCsHn>&{U&ROH`0JO5jYXu5)dxY(Q=s`ZIN@V9{erm}AB$_wdhPTk6Sr}) z0y^(JsXnn1t1NI$tj!%VG$no>V^BR>ny%8T;HWs8)ZDi&Upe1`qJC zZQ<|;&lp3f)@IJb!8*boSU-u9Ctmhkza!dudz~SLXNM+`4?KBub zVdElTpx_{3p;^b2Lp1i~@5Rs6JGcuQB@(&wMaI2-o)EQ>w~2O;o{<_cl&)PqT?r9~ zTYNWo5K#Knf^|8$;nOPd>qn++Hqu^4mCh@qD+d4$ z$>4DNXMAPU86S^v^{0B4QeR}ONcExk-fA%!#8#gcD~Q=9iM0ni}qRF;!zxBaA{bWA`-LqVk) zn^ccJ9~v3^DJd!?R!^cr9iuDk$0Jw-gUD=_&}EPOQ@CJ!o#HuG-P5CXe0SKuP#ueK z#Y&+5g;=oVGXGk%0y4$ndqH@-W>#MOd;AR-33@)FTx<$~;tKJmItt4%BGWtzzK3=| zh3t){@)io@*mp`09Mp0p3j#&q2Zf(JCJ7Xt7na;e2^AIO7FeH}Su8la6{RHBP8nA`O&cM#SC;UIY!5Oz zpw)#6CMTL{)R{LYYt=Pwf)@WkhPjXTrlQ?-;4fE1t5q7v32UAw-?C3W`JT-=< zbU{>c?xVybVhD1oTAFTBaRujdT|3Xx#-CodIB_UOPs=7sV_L4$x4mDiJe+_8gQLkK zZY}|KQBPAsFmMuwW$S}w36l{aF)hPyx>(IwHj@{XxX4VUZmF)cIwu2<9^C0$vl~aj zJ2^2~l(?iBRG6BNxW6%Li7ylHr_c%acflhAHR! zxQ&+IEfjH(8s}k1Aeq&otNO!hI{1efRFs<77=a>|cWznOWZbm^fy&Y_wYrnVIb;@X ze7;dzYp%KQAe>@q#Y`!asf<)Z4?`kS(n*z7XUiVxYsEldD4V&06Ausze2)}BQJ67Mfl+_sLHpCpWL5PHGp?T;~3LP(rO#&%` zy!u*Xgn6p1>IKs3KQZuX^Mf&8Ej zxJ+G!Yr#VIR1JVTiD1nZ6wy+=bcdnk4G>{fo;UapfOyQ;4X09JyDe_{sc6G(n z1paoe?9$=w_uS21hbh>QHV9+^#^i(3$6is?mK7Sc1r+SA$E1%tO3ODM(n$V%#N*a0 z=myUDVOLK@g~-w&n$Th+6Jdef-LvbzJ}X2*c_P8ggERU0E=}nqu*hc=Y;s*F@liq4^xCNzvAtt8 zxOFWSApt-%tsbT6nKVImN(B9@Tnj66S3PR7;ZBYIK163f(P5xw7X`6u)0v6!sfzMk z%joN;Y}?N`meNwj(qUiQ*6gsMYSYfgo#Hd2qtlbr#YT0cI8Nf_CQ^{BSONn$?QhUh zQw-`%LaF`5`7nO}!0Acp?b)swoSeIGH9P+dr&d!>S65CgccU)Oeii&o`;65pkAf2= zlXg-v6tXLA9=RuKWNtm3{aoESmvp7poy1*rurcJ?4;y7g?mv zbG4Gm3sF@`%TiaST32thWvhw-)0dK06rdb+lc`*jmaQZ=5Uj*u?lJ+c|IWt=7Q3o9 z-7Fo3A8Kk4(hp3kE?Fvy+=%Ac7#iz=Iqr}?oMJ*>@3uTEr66NZAE>)jIHr&F|dajuCqaZw5e0+ zGJHt2wSq9eWOCV44x-E0i*QR5}4Q(w>sdgVFmoGt7!JJ#INdpPG$k*7My+Ox(zuEu5xr2U@9wfXzv_V=YH+CE2% zDlgPksxMEPI`3EA!@@4#sV5qMFrP@)f7>@V6OmCsn_; z5EDX!D}(UiPtJFtWV->(g&iE6c3K+Uni^rAYeZY}g8;U1H1m3(4!--Cv$;70Vsn=s zVUqWG-XnH~QxR8<-uJ4y*ByDgCOrqItRlmTK1bsM9caK8r^s1)NN`D(*DeQxIg+dj zewQqgrcaT;kK!@y(C&-`w zNsK^>WKBBLCpZi*M^tYH*5IH4rB>mM8V<8+!+nLMrV{L=O|PeZSh1vJ)E6Hin(DK@ z#1J6UuRt9h#BQJEd%(+zH;!>3x7I+>sDW_(?NRP}YquQ>7gr6zjY7|^t#~{mw!y5g z-K0(ZqhDJ4N$9Mp?=1ACyhismbUf@#@_rPuTt~a3eF69TBTZ9z1#>>th?Y#E6+Ol* zWvdc4x9ww2^&NlOujAVAo_IDtmXQOMwXLLcKz;?5de#2B*Q)5dWpi4SdfelgGiFy* zAAdbog5Ok+oRQMlcO+o>?3g%UIO!vR(i~cLZzI>4e!NHCmarxc-XjPXHk@n?L=;Q! zL^#C`+rK^5-G4_p`U*dmKyBEx@49XFx1ad#(y;CMYAqIrRoe3VR-&KpD*smP7P3B%0r0Fh+4@(Jxp{?M2@soblqZ1W_{9h7725^bV?OW z*7sx7s%gV&arwY*z}~0`ky?=m`&V8N@x>4nG2v8VRNq9IyVC4Ao17K^pUec%O*BRNgS;o*0y zvh-%qgWctr8c(D)U#utsI|Y^-lrWTu^@|C|dX@|HIn=5psbh4}$c#yj;)yWx`Xo-T z51j|b&M@M$17v=DIBoEJYe=`w5X&0V6{cSm@Q9dBwLz`FnwU-_aG_Xb!qifDDzHGa z7GB-@6|rr}_#jwN)+FLo z;;Y~6q0cTGkC@iHDvL`S`~CgUPK3DlOKDwf8Os;rB$~*Kf5un34ORyk@>VvhLRpyt zm(W=unrT(!4E24wMXsxbi^#Y%C`7f%jnQxOxgYXlERtIl$h*Li&_gZh?x9^MPPG>J z%X_5T%zLRe^4ZEDR}k{wxJkOQ>1brybr6mu0pV%s>Tu(t_exN87PPrZG!QBwe)?(! zn=(Qzr8TV_Dnybm!b1*($aeP$ZI65HP4th(n0yg4ATARdGcUhb)RTA6W-i!gB&R5Z z=#3#RBZ9>p$;l1G(e*I;(sLS8?2ADr^$h6rM5FJr$;HJJ|76|d?uYVw%ta4O=Gd5{B5ZKbk;t!_rsnOw$w9*Jna{#&Gn!b3cEod&3B>-y(Yh@z z3LIq9+e_^=4(d-IHXN94bn&=QzZjBlx^=r1C^qJb8%fv}mukM|eBFND_h6 zl2&bO$+golR2vB0m>KC#IA;2F5XI&ct8XC5noGRhX-QnCqEwWS!o>1+yjdS+COEtk6>W8Q8h-quE2vMuJPXf6Rg z);e#M=-spOOp+aAz(ipe{)G^WG|oWo7(-y%ShrwQpzN|yb4DYD*&f`tz}za%1Z?_%MEVz;<&zAPN?$S`vi1_6$1}11cWq4Y7 zY{k%tL-+QpwMybreD}o5$|6_iZaLH;w3V#AAOImcuxK=h7InCY zua+XxSdWFQ^;hx@^>Ha9s%5T>iBkmjNTUPQ)C5P%jZ%YaS7G%``<&S`rqyrcWRlWl zv`_bo4+rN@!_w)7(@;B1YU?6*hwdLQi`=vKl%q_g&njWKUH3K7a_sXu6D;y|%a|6r zf#cTml{uP7OvDuP$dRK6W-_NJSc(T8qqxy+)5D;9Z*BIBuhhQFE}hza*kEnLT3>;& znWZq}k+hnvbg7h*Dz(jIgt^W2bmb13w&|(v{P2(~a0^nM!xmjyMnK;ViQz`{E`6s# z9Ogh#5Bv$IA&YZw6*T;?n#v`RfF%18-7gv~lD2 zyU`-0V$F7-bBLFy*vyVT1A_EuAfc5GvQ!FBz zd5_)f2CwwbeQuHPZON(;w~L4aJ>(bc_zLljWnAH_p!9Z*W`W&v??J)o1u?p);URP8 z5D$a(*#|3|iEN8@=3bf^fG7JkBU>?@iKH~weBtjGZEbH-VWrd4W4B{=YIoIko9!VH zz7P7~w#dj!(plZ4k|p3K8?mVpA2{niRG`z<9D&7F}jad=r_&`9;K!jG25gz}Tt%b^{!oQ*J3ZW);n3%V0ue6{N3Oi3` zV#k(9s4z0$atob&JL97{tn=E&MRm$bCwFxi@Q8hS9pG-ovOmS^;P;goBJXyJvU3n2 z_MiDlP(ql#0B?M6QZS`5Nq-)vmRblhH5QRqmot!!ry}c%R=RW6Wl@Rf*w^ z7+!49o2@%y)1S>SWE4Fve?WO)ZluM2%;1mC&3AHtrXjpwV+KPu#MU|pPFR$HFog&s zHFI2F2Nh3Fv8)4yiLeh|U9cP}X3+%1Ia|x`BFIH10v8?Lk#5SE`UG!;mi0mX4mK!T zuiXK%Y74*s=)VA0k6!YKAHv@BAu-3wdeacMFIudp4&{EZOk4F9u#jz&0FAL+0?qEvn)7A zz>&ryvGNBNG!AUDl*T|s;Hny8;H9Mr zyf@>=t)2HoY7emES-&>m(JH|(5fO?yf8N{J6$&i9M`?0NYAR-ugR7#H$r+>S^bOy= zPm=B0=#i-I`L{g_?lH#P5kNeMUdfP#8(fU$>xUqPM3LJ0E|g2o*im3g#gRWskflQg zNak<~zy;Xl)ch_4S2ey96wHqyU5?%QnSF?ePvFkQQV~)NO`+OfqL@=c-Ks~x!a`jr zG+xk9Y_&=k@XHeNNlkE>UaOD&WfJ9E5HEV$?t|_`;_{#itX&+6AUQMr=n>d6@8bHW z+T72DZspJ2`P4b13*?x@6o&O#h3ISjKVh@8yEZ?*cfr^8gZEb?skub&3XU&pLu;d$f738oJytRw8j5x9b@d5VjLl3xbX*1>ntof;$$p>I)}2%BiflY%ay{!A8AVK9+l{Ndmf2)TVs z0fV;JRCbD;QQ^m}gy|^T$>0G$#TkVFD!}2a5uHPW`i%RO`{DYeg&Z@2Ra#ZX2Chqf zP6o?R(Fh>Y$odQHKoGxT>;z~MPMOsRVv|B|(Jx#i)FA;ZiV>KK^aO8`%b*wpT`FDXIp!N)R+5^c>M2+*LM>ZA z?Ge@ms7{O;z|t9VYVegNrZ@DM_n>~wwujEkh0ZInTK6NlN81cSX47eG>$_(3_*wz; zq*BX@DfDMi-1m2J(YC|RYXC2?#EmV84pFM zVB^@Tj1g7pJHqRIx)D=eve_5yHa(ThfweUR_6AvJD0z)6yV0JD0PaDS_{}=k0^OIiwV<0ohS9st zSuU)1_ve~rxB#YjO=Ncb*7)8l;mV}Ei29@%F(3s{pBB+X0ds!oAiL$9ICNe+5q{}_ zOaUxRMw&ryY(^A&k^?npyxuuN1kKvQ5;b;>gGlfq;Fm_;`Xmr3>STrVN{~E|dO9f< zuf*BBjxiDg`^i0El6$+2nB)MNmy4?e>+(*GB}bF{Qn1(2j#ZDB&Y*+~SAE~r_vIK# z?Mt{E!cSDY^>GC1swjPTA}cYq%!UgU{TW-lRI zHGwuwR=rGKHgOdeiZFIRJD~=DVm!C6d6gqmh;0w+EoH&EqjmL`*epP*nTO9?aqI45 z?M@6#3kb922kIlo%X_yAO{K!M8!Z|6-xV?)oO+PbQDdT|G1YeOO`F)I1^4U3P^Yix zG3dC}^*VIj1&2_w@X-jH)&j|{+Fy=)vL#WDfXG*FnPB`38gNiage`UWDZMA4rY599 z!VjV*54gAxBHvlLmbMJo7EAJ^U)6&2)Fm29NYYHiFC$1wQb-kkXqC|m<>~{3`YGDR zn-Lt0_SC5?)!}Y&5SQX5?Maef{N7#p^4bbH8i;F7z0pxHpP|P2+?&I_iJ^^ft@d*x zHKUC6qO2jovZK>z`oeO3^t`(2dI@#0;4luAg<33}(o|KWr4XN8!?*@*-pbAyTQw`Q z(X4*pqO!DA=>r*sG%S!CE;?$U0WSisOw#2K+f&7p55YutRY!wxLD-|9qXU|{$!#onVZ z?s(f&_B9kRTCFy+pOZYVQRW`gMZ7nchu{(dA7f|;)b9yr>|(mS0k2G(Q&X}qYk6)m zLQN%GJU1}>A`n#2E4YICemdb`NN^g&XWl?p;8zGI?(=YE>jlfUu1_bgxX_H84%Nb7C>%qJe7Ueaj$NnT+{M|vi{0_CG)FpB z7sVIhk*~&mydNrHUUS`54p#y=ZTWtTXSPA=O<&nDoFyLfFGPN8A8*Wt48mt~kUlAE zXWpC{hW~b0b--p2U)Vn-V{l6bgnrJyAjvoKgWuF&?`2sq&8QR@T;I4xdtEQQ8+Lrc zYbK`5ga2(EF~EyDZoAIO@ls&_oG?TAC@|n1F;KCK=0v_Lo4HQ5JLydQfP8|_2R3pI z|Be+mi?Ys)<17od`&)F~6o<9kPYGx4_{RcYB`h73LMo}hu$$EBl&5|x=6ZIdY}p(i zSJXv-nSvWXeS~8oy8sbn#Fjzj@~>5S-^3h()}5?F`lbnJ-k@4muVr~ZR|-zdz?^SI zdO`_w*`#8_!xdtT5Q8{ zaoK~KL%8vE7;7s|F6}RVcyHdTcMq#sp6};PC>xGL6d;xkh@wPb`=K#?o*@o>jg!J@ zxv#mVaTuxm1N@}?&7|weR{Vn~C5ffQ!OtzUmJ|_%IO0+){muFzY01QK7O70n622i7 zvVwMjg9f#Yz&H@OeB|Hbk_LZB7=$GlUt%$F7JAKDP#NU4UdTk2HF3NPJ6@!aG8R%a zR4AN#aSQBwaS~;IoA8zvrKr$S)J*(#Xd-qzl8QnidQ90EkH>>#C#uf#(z7%bka2St zgLjqswZU;zJd{F-w*0JwoRZ3c6&bCHHV!rlWYN>pMwah!TDtRk0P9!lEFaB{_|sr; zB2`S?ubco+wI>)jB(C7A`jH!I<`!m2-E?to zfy)4B^&^;ND@dYnqFRDKDu6rkgBjs)8FwK@4cCJPispZkfE2B7-?^8Ak6A5q;*99# zAq5fck3Cg5%`rzda>FY;>`PqaW0i+QhKW-@%eM`-ac;_VLPSK2Oxj+hWan!!%YNU=8M? z_Qddw6~5#{I%PqIL#S%XJU;JD>t$~*qq%cgTkGd9@U$>= z+NvKZ7(-w;Vd4U*{4e~?VjY>6do8_gWHYSCuXp-xzu>@JvEAbtdaip7XmbdCdI2~A z6#%BAVTHPMH*R@6zL`+R{>0r@0NxU+lq@A%(7l!*3_;lu;Kg2wdL841$ zLC0U63cbFM-!9~%^Vt4+ZY4||LwA(FoKu1R6}7TN&c@Ft-6HFdO0{moq7TjP1?yvP zwLAh#sCK~?(!2}ZW7dn#i%Zx;bc2@I!*63pz?=H9fmN-IhliaD1q%_$*t5avzn&$U z646*6pUD!ncJR9Fo`nV2zsUG!) zCz|VBZYC(@wMjradtt`Zj21QcI|WJ!1gJnYvV>m)^;w&0Pg_euxc-ckZ;&GefgMf5 z%E*M;l9X}XH$`~nRlB@n{xw1mo6Uf0lB#*^<|X!uecVH95A%a0#!rsh_AuidL`Z_u zoZVkoM_(ye6&@hNLds$Wx9EK7hxRI01112xK%k&Cjy}Cs+Wn%p;nOV8H1r_ zx_9{4uZAbCE&{Z7 zX7sl)`+6HwAuatl7(v!7=%hPk6e~qmXEZ=tNYswt-1v4EIATuNKUP}#;O+) z_)>51Tk-ahNw4Q{HIJ+Pjpne1jGY66WTPwN9O$JLb@@W0dAk}7bdn;J+Jjj%FSyad z?-o^8^a-Ww#w3~W&@%IZtW)*FU0p=*(Bbo{g6#bXW2d#q1$Bt8if zX|y(XEp!^h&b%7h^|rgNkdX^n<3(ZP&)++q?v1?2Z@G;|hx!q#nHy&kSJ36WXIjn@w65O*qNjf=l*fSg`V#3O)itLd+MX9nw6RR z7@ZO1=f!HZHB>BZ#bt#Z?m5$_>f4&~+%n{%7db16ekis!)yLZ(Gc(k1td&bOEMMqN zZ1Dkwc70Y$Wv;{7RCZHMnGP?$$q7s|b5X{qE`fQkfYqh8mJ4P!ic`ImfibCZpJt_= z5XZB5C+Ihdx_x+ltn~<`unT&~2Abp`G!p1a3b1)B{`iW?d4pX$OK<~UJch8|L%)n7 zbbjCcC?-4mI+6KSFeuaUZq9q*_Fnt&T>Kd9Bblyl2no-!0MqbeP|wTMc#d;`9be9L z4wJ%Rgn~frW*F+kF;|_xNjT2OeznM}=c~rS;I9nVf}RZ8Xo^_nl8OVXLxD{WX041b zM#A{b+PRz#VjA3E9`ctd6(kcc-8HR^%@L-WP`QAUY(I;MH%rdww~A(P0lN(o^Hk*k{wL1 z<}LJnM|=V~kiNxzyCHWvJDef$W!1hTq`DE3qZ0lY*az}P93i2p%$X*lCrx6piR7e= zDAOBr3IaRTiiTHi4es^z>QLKF7y;gezMt((##=3^+M4H3wdzw5Ff~6TxwjOw?E7EW52=;gPTD8~Nuli(Mhs0OrMx@|Mm4#nMDl*6R!)^#YU?(`*zmvMx zwm+6wGQ5>fHjQSqT8&vsX)0ONEk-EPuE=HR21`Qb;o)Ve#>an;@)*5jb^F%H5`!FV zZ}*_f7#<+)KP&85rG~JHJ~%%OD|Tvu)2NH3oHP|fm)^DCuRJj8$sXOCTRDcGVQkGr zEOaQOEF2|xyFIOg3l1f~#}O+xjpi z#JHQI)mDPIaUEe7Hpxf(?K^a$U9{_cYTRlCE8U@XEAwlZwo3&;>C)?6*Mzu!<%ql1 z`aw&pyJ25l4X1h1Me(SHP4}vsUDv%`Zqa0WcHTnD?{e$wTq|jYwt44Yi?J|=fD>(? zHJg?Zw3k&iPuMPRND}QS>Q|xe@|E4DXd|?kpg< zi#>~eS>T1zSli7AftK!;4k{~@I0?=4qyGD{P^_qo2)8ECO^h!xcOfQ~sZxdp9KOXtG?e`0gh$>xGOkjhsM`2BoXI9%*+gQ8A1f>j zdAtGa7|g1t#V5-h;Ugf%$=TRq^%QaQ5h3sT=>E|@-154nUU_>dO_T05i9zzxkESJ% zbmr-)e$K6#d1b8MR8@vqF{u&9 zXU!R)Iuh8it*5Pn7jVAFosf== z{({W@zM`(Cq=PvVH<~AVs@QaPRNxV?pWQ^>f-7_&6FE$&rA}Q8DwOmcDEIin=nLO_ z^Di+kp{kivKee&K7U#ZYoYZA|C1901JaE~|D^Z)Y`Zrn(5>m$ZacPHxt25;Au(j)v z#l4aBs>t%+&ZC&8!+YI9wASuMMh`8_rxSqex12+2H+m{Ui+mq=%pz51EB9d{Cufwb z)M~1p*?BgjaQIJiNbq-NMVBqH>5dn7UG}+PQ!JtRk0|`haY;Yn3MgRG^kX=d@}_kp z>`!Y{8d0ATu>jo2`~a6ging%ZV3hg30wM@EfbgSHnZK{O{&0H*G78GTIjS=rMTbev zNrQSnqfKggeCCz>Jg+(aBt7FPdCOurT2x<1XP?TYeGXQ6`y_ge8%L`ef5$sKyEIxT zwMfRO@yad$ByN;XnkXmUzx{-Q+?$Z5d5>1O(y9fmYT)V~<$UGzzZ@(JM9n46B*6)$ zRp6F{#kZn;OO_z3|6qB&;_!Ar#Vi(KlTs1LMEn)Lh}px4el1P#;rIbZEZ+T@%vCs5 z-ratyZwLP@qVrz%Q@QBwkmP&K8@?83J_3+qy9@i3T8J`{*1AhYPZ?O1(%!P)o9+2j zQ9Cf!_Tm-2WkF|d=MI1KB3&K0T!n(Caz?>N;y^aWj6{feA0;0F-(WrNxwW64@2NwX z1FOJ7ki_x#yG|A-bUbL7UXN4sLNzazb$t$fH(HAp_Mx}SZ5#xqo#i2z7_SHlh@Xr} zbPg zEDWHeJK?|rP&SP2$_`-u6P*gYix9$R1faa1zC80&`jHA9yo;k2>cAxso-@Lb=zt!L zv}&3J5FLEL9WXf-ege~*J$97+8(kFBIiL!D%-RJ&IbqG(H9$G3*RB?H7iR287EBjm z$o?lYfVn837dHS{+&#Y>z(Nd$Zlp1|YTk+>4;>rF-0C_bRYrncZ5^6e83!k^^r}su z!u)0?3H3^ws$6ONj7(9Jy@|T9NMe1PneBe5kfY)}Wr0@J94QQ3gQJ6$Db@-xjKli! zFW1X~iJZpm4WD18j_RGxipGya2aP#G8xIp7krM>u@-NukhoR;iL2b}l(Fqw|WheIj zpFsp$&8_b3y%_?*XXi;LbxOvf%$B_w@4a&BUO@`1o7KO|%9`5c`5K*JVVVf8yKLYh zYpo567gwiOC){q0#^E|VbWCjU>2kLxEHh?88@IQmE`NAUUR~+L^wxO3K9n~C*mBMo zHNaWedMK`69qAa06g4%q;uU4gGqxGpw>QO&8#jX;x~zt`g4$ed_*8D6TMA@Yd~C!- zcxIgU&RhY^IEkg%;=V7{SGX6~*+Zor2Q%!PbGM&!&m46H&n;|hu(O3D>h67p+b<}? zINf>>8RnZHgAL(hkO<_X$@}B3xgc6mh3rLJyr~CIQOt;PTrCQ$RI>o(P|QfLh@$d` z4H><~S(%?Jie)^lhIFpRH-_7>H>ycc#HU=35D@NHGCff?M;i z0UW=Kd?e|=Mu_p27or`%);KXIzQoX)FG>pAc!X~f_SF*=Y9H%^A2TG#dZGkXRchwV zxg1_Y*$6HZe|{x9WFGumQirE z=BuVyb@a6MLZ|w)cs;tLOT;R@mB8flZqQ{E@7HDHkr&*}<@$Ewrl!66Mu*e=N`!g3$9T$R z$3bNMThOW5yS1jqyW-Y~SMRvmU1$AUECuUxQ4IY>Qzu-Nbb?BUa-4Sy>Gc|2eyT$IU z02ZyyZigt|{d1v*vPb%^#xlFx3;U+M!$}L}r0igw;pB|`WY^rRa%SPYaa4LiWF3$( zZB_>NXckwDNeMe3(BRe$J=;NKoyWV0zv1FEk%)1W-7?$|+|)Ig&ehNp0*5PbVWb8- ze;Hg8HZI%Px$~r&)VW`~JE}@xyCEv=gidy6-^}GiouGh$XFOxA*7@FvBHN)-xp}vF zyStB}X58S6e`jI(lpCO7&!Npd5cW|EL*zzrMn!?0rIwF+rKFf+C-vg|j|BBvm*_*p zwuzSQ($~PW$W{WbK@DqQ&vpV4ZE2r5Aiyvo?LzD6%bEX=vUd!xtXt5vtD=foNh+?` zwkodJwr$(Cv0~e{ZQHiZlX~~w{dM<#`|ERl&5Sw68tczkGwYh`dG7nhrHxOs3}+H& zN^@@Fcuqg4CF_7j4g>DnSE{bvr{+0_muk`DCHWDz<7E5K7Kf*EVRK ziv)z04hiqh^F9-T8(7yW8V=r8hYK2~w!^CcgbRNd@XtwSpl05Q3+INBm{C_?dR`6M zT&5MMM{SGi7(+nYA28oHzDoaH?dY$X&Oi7Xw2Xft2mTBo8R-9S`5I#XsHXi_zQ*6y z)95~_8vjIVFtC2s(`f#udfNXlS>y9{|5H8fPYdb47L(}z2CTur^1s#7Vn;rI!Gsrh zc!s2!5%_sUNa%&zS*6<;YBf3?xlig4y9m=)|&F^Ngt^4T#3^qQxuhcIjU@`kvWpgo()_q-A$ zjA}5|YEX9V4q(^*jLy7D%Fg&o1P>iIC=ZnK-0|clL{DwCamybYUJZJ19)u%~jvSGV zR6jgHXF7a3@;&uCLpx~RMi9k3iR}+Ba$(=FTo!H}V?;f_F^hXXK<9TPUQBO{I6u1< zNqRY{kA7G!m(`+hPpTCzHvzs_uQ&rEKJroLl4njT(ERb+MWLucHicEI0m^8ZI_#{aaZ|F&Pp_z8YdG}f~-`Uf!MKfn_I zgjf7){0D0B7m(uf{C~hNK3Nj~y8d~D{PXvpdH;fD`~|}JCvf9mkd1%M`2(`}1H$+V zhVc&o2PEB}^*-1C>%IQKG5!g__%r_3TK{qF-{Bd5z5k!}|622N{l6&${&ipYuRx5y zK4kyxbN4qu4Ep~Sh(XIhPeb#ci5P1x##*X#fWxQpwwQ8B(sze-dvxVee`Om1eO``(`mT zjl*k|?#+bpIM@oUBliOlhZx?M^-BxkE2n z984T4#pSmMG9hod2ABvHL>KZ}EvPG?J1g5Q)YDCAi|wE*FAWmm&>5>-H7W4aOu{$y zTWd2!OGL0MV~Z%nfen2g?#JX3W|4?^qY{#1{ZQES#1IhgVRw=fz4;xat)ArdTtEF@ z7`MN8F6Qt^jW5UT=-c>b$`vuHq^)a>(g7$HQr4o+Mu*01gLgk31Rdf&qU+guM+QMO;mRWABipSDBgiX#@EW%6T3KcX9|dfNV~E@P1nxRZm35N z+M02--pQz%EyYkU#}(Q1Y?evY+|BlAu#c&Cz%uWTO!j5Oi5?DCUhm`x*4O1 z9?_k@NNhqnQl&M%>%P2vXARp((@Q-i_(p%iAe~YgTRd3CVndFn5CxM9Fe92tjnHL# z2S4@4f0T%-&@))#ejTzGu9Xn*Yl;3Pe$;J<;EFkbN!;UwnJ?Hh7ZwF31I95&p35N+ zlM>r@N%jiTv>>t`fVMkHz?$slwF(|N9Cj&Jm{-wI&{AUSUc0kwI$u{|9_pv6n!LbJ z2FqA(QmEOKZQ*P#ZZF{6c|oqKpeCoZIpo-KYLLTIF;grr!h@T5g$XJ%zio_#h$O%V z(LRV2{HU}-9~QJl4$lXHAYG<7L(q#GEY_M#=NG5z$%7^$8<0TK^>aSfMH8^Njex{u zb{}+*>FG}0EttaTuA`&jQxUDzE@WaHs zWX-I=ypSx>t|=mJZahs7bn6p+H6MB{=) zn7+?HB;HZKGo%|#Cuu9%Jz`*fp{7#sb{!KHg^bRzz4`(YxdZTgFd4P_EX*^sO8!_3 zIZaD3y$dR{<+JTMka=Np=Jz!`5Bp8eyyk;RG^K%QPjxqjKhA$*_>35kWvvv=YG!Ka z+FkqpybeNXhCC36;M)<7{a{nDve+Pm^k%vSg64h7o!-25x+ysBKS*Roa9?&I-XKst z0aj)c}G|}Fdp0~w^9cSRGc%kM)ZH94I`!g~Un)u$F*S$G9xLa4~ z@O{_Lb-y}HM?F(A8`)aXJO@dKSHaJ$OIi_@TU?uOA6ka*q2ShZJs9dcT1_t-oJ7yQ z@l`FfzK3JPiZ#%bVnUG9O!mdOxL+~?IEC03A^r7W0e@< z6@?Lg#R>)jdJ1ig*q?m(0O??EQF>KnGXRE(gr)b`p7MrkI*6=gS`lKJB$zPrk*PuN zJY%7v0HtkPjxNMPlotVnCAz+!?4O-qfi|rD2PomuC<-1r{CYb zwT;kY2s>6DJ$5H_B=ygnh)MdACBj33Rwc4E{UTua$!jLiIU^Uj0U?m(g#%2d)=ejG zUX1G6C5%#JjS-AkML3_DrF&LF6i;iff~1@(KAy}nksLI$b|AskP8YJKW1x+ROOyW_ zrKOSg79=Q#CEQP^wU#~&)s>T0GQ&_!%rCp`)GUk>F_C^W$|*fs{z1NsJjve-&*D_W zjK+XSrEQ!XkOD4xmS?a_-MoU*(#P60v(7j`^q@yX(0Ef1qD_XWVqqsTKXJM=!xr{C z425#(W)&b6v~1_wO5)bL-o1;AmBME0*TxP#1r>x zy8Iy4L@_=0Ub5dXlBq}`r#SS+;AOaRYw8wqA(|Gb=90K=0LsLRL&kRo+Gj*IvXd?` zWu8|TV;Qai=5}0&P$%06{SO_=9Ho&3a^)# zo$7QhuKCfAsLHUp1hoO=VTow7YOdKSDz7yUm7CUmpMX%40EQWKiJYOSgVe#SBFrD7 zfZ?SSTUz3He5gI{`fxver+O2kudqfAat1RPIm0&ULa1|X`L3eGGijo2@G|>N_-tv2 zL9q->V8H8Nd)#!b+7W?(dEDe-q0KUA!GM8*ySN3OyoPkI8K&joOKX?Er*Gp)wnrS} z7G82ZTvAIwM4BXUJ`if!))#cgsh$*(*qPXBF0`eq5zokdXI6Jpr);IuwJyUpchAIl znu~HtbOpRH8Kh%ZGwyOl!7)Br1!C+r&8xZe!rD8qm;vVvX=k(BOJ(|V+FTBA!a|k@ zbuyhxnc(|KIaR|8=?zye@KPQd)q97cm*!fxTVun~aCxymjPJBpxQQ8GhJcaZ6!w+o+#oU6o?>aRRuw(XXCZH>cv>|!zYTJ&#yImmbm^)ObkyjcD;-=Z z#-1lvwJ@JQ4)OJbS_*48YQ5c1?Rzs#qg)>gP#V=4h;qpnW0Doilr;TzK?vuToSiW# zR!C{Wg)z+XC4gd95AGN|&g^~Rh9{I(4%QNIu0#+sR&W)w7?(ZyMs39;zQiEA zM8)hsPjT=zk|LkZ?kK0`q%ME9`w(iV7tIs>bv60!;>*j1_7y@RS2P&{%Tk)lETNOY6l=9}C0>Dn5hlahTjo zrs~^1KmrB?&ZR9tk!;u-A^>YBoS3rQ-q0_L1~-6QLKG?zdg7j|NX1Fe{`jte5mkaqG3#+{OWZYH9PCdp^0UxS8N&W0%sjdE`UVLodzaeeTPQ9by zCE?E1fx0!!#wK??4^{dDXjiR}_MB_8zN zrICrglmQsdfaFVrUpS%mi+X?TZxg-aA2P>y_fdV=w9DZRO+SW*BZ74LZfv43L>se> z&N~{jhG8rm%XyIYxV7cX6x~$1T95~jHD#!o>I?v7CIbEN;e>mGS?Oh|kTTk^eYH*$X;ULR{C zH~n^B8oXLnOp`g%M77vttpBn99eQAIkD?do3A zGq)~1C8xT^5#*BY5(wY)&3-62x%OASFAUox8nkl1NBmgvdJb!87JA*X$ynMrXx&9cBnjkU)DvmH0DvqY;^JNkqLu!sv zH78XT_G&AqU2WVl*107p&rFy5cPpfs&s+GVI|H7OdUtb@j=mXgATJn}olYv0sl7p& zLcv@T0FQwL1|eQqp9no1MyP?QJWmB(KD5|oPQ5s`*iXcP$6i`sL_Sld=+49{n^qH! z*%#VQTBjQ=okve*KS7c;RyZET9bSQze=T37}4)gXCsS@OVDT0myD6!ctGvRl=>qoWo-ik985FS zkfx;)!5Gj-K%ta)(fRzC4Xm|c8%t?YMca^70$?$OAj%o_mrdCWw#AZR+tvp$W?Q@U zhGd4=zPm)&NrjZt1eMcFCh34^G zYyp^x^6<>1n0b#M%b{g1D{-Xhjtm9hxmo2F+Nf<6H6gkO9H!$_g zpNABhH588KzwVwwJYRRt{h38nmYh?E>^U;esqix({2`&bN3MrxCm`Smv2Ty^mKKV# zlwsmY^t#Z8Oy;=>Lt>M%^No=n(jh#IeGcLxQh>^gdgha4$!tIvJ_E5!C33?0v^O6C~F zn@G`^kMS&uU-uA7x^9+WHzrmUs!R%)k>U%%cJLPk{|Gk?nCI4lDJ_Ij@HZ`1jI(D# zH(^V_D51m-E$=bHT}q?lW2xxO{uehbE=9Jq=vWd8h@?N+%e~ozx(<^>ns+4cOV*x zaozYM`_1t_H;vdq%rrb8BBm>*2(dgj*QkxcoD3MCMM7x10vO+<4)u;176M>Q&@p2q z!aA~vVO*2cU`w1g8aU-=xmr3FT`UK$Wxyiam#doJ&7s?{pL92bGwsfoLfx*`JWH%x zhrDifwwvlk;;c2-3l%Yw#(H|-F>|@Ry1FI@D(;n&=sVBgj&^Bw-#8CKRuktYUwSt{ zTip8~-+d;*!R|ky%Ry`)BO@mdrC!LOV0dsBJU0L-z6SK-IZ6{1zvR4n?RiB+du5op zG$P;|PaFHdX}}cxJz*2*K2%bI9F;-ksF#U-Dt3Yl0q96~9z(EUYT+24xRU?Yh9nxs z_e8G)eJKYSAtngd^+gITqBUDQwFXidnMF32k+rma?o7G(y}Nk*Ir9*vIHlD0cpZnG zWJYJX9h(D^*n95I@sGi+7R#Qy^>ayk3#Y@!^b<0cCYmDpq9^WydCr$(jF;o;F;E`b zGx7l$OIyhtOH!g0US%c(-%J(c`4hh$k;QP_^s9l0S7|cQYvDy?`_4w)hMg#1)r&6! zO|z!BNC;nB` zBg4K-Ld)(@6G|g*0@KQ}p4=T*Fr)5byWW$2tR+7~rzr|$y;Qd3oM=;g$0=kLIx=aX ze7Xq|VNUTT1%898kA-zr^ZY<6%*32L(c|Z0A?PgpBK;L4xsTM|SC%L!Idgc{EIWgV zC$%nMa)pe+z^;gAU!Xykjney3q9yk0P)c?`MIOkJA6wdsQ@K#7cL#fxkD`2VXpiuM zBVzHc&784V{?-@F9ZzC?cIDR@ob`?*E>FD}J@(k-MDfA-EO$#deH{Cqv7`~UtU)$| zJa$S)r9&bpIpxlt)qEWN(=HuuIG3_{(+&*-bUE=O>O*QBBf(USzCaG?iKxIEC!254 z-ioSEtRo%$P<*~6v{IWegcqnbz6EAdozT~=l zQm7Dt#(Ex8w7fKLwj3!=OJQ!rE5QJ&d4UC#x81Zbw?Q*<0jvSBmK<9!W-l7oiNRg6 z?8&1~8ZRY7mKXwo*rqe`MV@>5Nl;BfgiY*n3u;s9v?^WZB-rHn{sNUX@S}LxvSk4p zgnrUZ^3mu5B|c=kZAse-A#Br`{@<#ubwxU$N$Zx2`-^AfClu8Sw?*+~=i3xa?)YtK zWgOAViebwH)^XvBOw{G>p3Y(tEa9rZ^@UdJ2b;4+=>!?Y#b63=ZB^sfE)$$zib_aD zqBZ#3tW$H}xPIPQD{NXmeYln;lvE~IO?ytYHf_r__09VMM!EpXfrjb2*LtvX>+p*1 zijSPNhl3l~4d6ES_Y;e=#mhNG)lpWVnzTj(jTZaNG# zP#cpIS*_rppioifpBmny8a>N>q~s92G+8JpivHY&`ouQD}V>2ErDL(#pS)?ES>Fnul|Tfrz! z3}kEY6KrQ`qEkw4!e9xn{w_q-&myXM&(9RETBblIZ+d^iI=-j#tahe^u%ycoCSTE& zi5f@d&pTJ42+IgLNn!`?>aPn#?I#uy^z#tLHzbQfA`fTQpm&T4xD}YbaPz3-3qDPe zYu<}jh)uU#OEr=DG5IeCw9Tv>>JF#ZbJu(rEXzU^4G~Qs76(o?G-#~%p*FkMp_&0$ zs@3%jGnLusV(%5U-#AT0gjgBr;%(#=T{p-vz*+5-Pg02+36cZX4*P4-19#w^Lj#Rz zt5}!=Ltv1OQ7aH@{9a7a61?Q#K_K6I`~5UA8!#)SLdW(`ne`#qS|X0k=wcX!#!^{w z4c;l#YpS#JWMs~2EwO*Z*|dIzR`ykVG$6f+mw6S#K*3Ti8?{q`s34obWGv-+?#W4f zCpn08mlr+@iW<7cr=L2KmBkfbHuki$-q~@q`}LrAFG8<~hr4bCc6OJN40R&-5IA#C zA=E|=rR(Ov%VM`0<{<)`IvpDPV=qfq3Q`-*GGWMxRJe-_j?KH6RIj*0CYAd}kdPzC zukqR|29`8S6k<$-M9xPZq7`vH=Th=^Aud9?F@hJtJa1Nlhi5BjA58(LpRraLm=Imc z*h;;4N{W!U#aq>q#NejiX>AzdEtv!|JR~}y{8cZ-3H&X`HxMKt2X7jjUOdF5F}=;TUyW<*zLAMT zyMez|)9~TJp*^zQvo~RvVKji9uQH*bM8gV7gR7A3QP=^>BOI7cjoZta5Iz!0poNW# zgM1Lf$gAG@sxj1cznF+xJu&1OHg3;242#qs6Q-38nP(`WGIlJwlXJcADLFtI7Bn^G zl=3ejo=~h?RhvcAdA!|&Jj8iY^~^~WGfswKc5R4lc$8A&^L`>|Of<2$_=sA^=|aBWUGo@cdod|#XBo-q^@q)L=r5ffD+Lnquj29wMDb2`b_ob_T;Go_9U0r3=9nz8L)$@Iv6#%!e2dtQa zGhXm?AalU`+a4p)a=3tjYeTbmxAn-?J2lVM+XyW#UKtaM6-8gWVBCvXSWqAVgL)l^ zW{39*Mu$W!U2}O9Gw0+Y(;T8NeggcU$Nlnp1cU*SmZq%Xdb4N7GZ4EYjhki zl|hK6_5zS_tiE%+;?{{$v}Hxeyot!L?>xa`6^9NWlPHaf3X|Wt>e&$f#1{{de?u9u zf@t>um2<*-|r!uF{^p<=Jz@0l~gkSjzumSy6UM!+!? z#|bPUW8kj`Y|9*kaBB#Byx+OQVWpkjHkqu%9{3%bg87c%pRse1A6fDpYc>%#DGFg< z>#76}QJ1u-fTuiY;c4$%WWKEd+3e(Hc_~#{47taq5m3Bm#qsJSgsS2~k}!GcT4S=o ztJI&e#wO{sd#DL|pVFKxL|Oc)wb@3x7Wv^Iszg2o`n|$b#X<+;8iwlVZ<^>jfatQu z>EPzoeluYE>?E^al4eeH^veMw2;*GBn`}M`Jl%t&2FU(K$Vm{gVN`@lG^9PpB+dGY zg6#s-TDW?hyh0VVdXQOmE`%Obz?RxZMkOQHLu=5fO$P_toV_DgcUj15HaY}`@}H;7&=Wi;k_;13e%6n`%67i zzDs0kme86qy4KQ^3;al~tCWE{m4pLTktjhvWlNzc>=-)rTzIM-q#^5pqNz^ zg&11JBiA1|Nf9`@hKokapp`SJohYI9%gHzBN}ilJA8puup~UG=wbu?<3s1-Znyt0# zY+|S}l3F`Keub;Y%j(|n;k;)q#-_!mAKbq|?jU`K>ut+F?;5;ub{mvdGdiM%vq+OC z>GcQbG5FD7n@hYXvXnOBE$EVPjKtX#!bcu3Yzlt{ev23bptssAP?EviF0M(O$PwVn zSV^z$_>N+KtPr;4as3vhKMH$~sCr~+=2<;;vFKrv!^u?n`E(O?IXVqPdQq$33>G6C zcii$CK>hSy5b3e-K#z0wz!O|CzOcUog7f(wsbRozao|ZLgT4pfpmE8qS8QN3iDEz$ zF3x6O#lz;GiW}Zq%QSZ2_D0|#5(e|dE;zTNQ- zpheQdzVugi?5<%+=rz-GDc;hUN;RsZr_?AOQOEbZr1|sJUdIK1pyF>wk~}y;gbsOQ z1gVK7w>t6&KRVh49ycE;v&ifd1V~e*P4+#mdDVoXE80)4U2PZwC;*ZMGbf+b*K`8R zPqO2~g_)5(IC`GX4JpNQd_!Aun39_n>aaQUen*+i`wGf68+ak@XKyhx!iYcxY_`ZR+2ja4zsR>Vz5GgEl9beA4)qs+T8e4k z5$v$OMmc!QY=3v(7WtswaBTQ>7ux5ksoP+9NGP$T44S|bTbl;&&%VT4uKG;fAYIB{ z?#BO2Wt?x{+mAHeIT6GDsF}BZU=z%DpEk>`W^s(@7+2c+?(zP0JI+0@w9f%QvIO@n z$&Bw9t{O%UY)k%jYWCY>ea)571I0Eiji@_-mW2z~{8~`fa_8QqF{fxl$CWu2`j`Ih zuTE$*kKc|nTsC~G>~6##wo7Hz8$%C6AGt|#ufH3GAMz<3<{4vF>*q&{z7b@>A()c_(F20+R>Bg3(o?KUC@;b?ClX(Eytc zX*~W0n@6B7(_!C_Uvx=;HPHHrcQD!+XVe(~x#E}_3-C?v1lCX|ozB7d=Zd5|8WWw6 z*Mb(fz)*TSVIO&m626ndb zb@ZK`%NEfvknwx2=&H1_NKW%hmPOluF`VOr)n9xuIi3R)4^SrTi zb&>FCAy^Spg5mJ5-u$0W?sdv{(2c2?@|NBb9@w|AWS$t5_L z{8KX0&_gfK(}SySCe9b_bj=8;`U|3%i10jhVp;5*Zp0|+!_({nYj@Olknnf5(~GdS zF9(Ip*dj2scRkGwJ~oz5=ks``C5F)H1oDTlDdva<4d^1kNMi&qWrc^Y3Q)2n5cvv- zV!+Y**XjJ0C;bFzoI>>&mqNI4xoDii2x6%}RusyRmjvdL@Kz zdme-F?`Wp`2btU^q9}t>@N_+G-|SgDVryYf0Nl^Qr)M!VNG$a*RXvRz5V;!RDH`4BOQfb(7G%UCg}X#%|?S5 z25NhkrpOIGCeD{WH1|*EC6$ioBxz-0W-oBuargQmer-9Y^YeInbN+PC0Q;rqw}7(w z1WH5EIU5N74F8Me+q0BH@CjEc=|V>Kh}wnViMpp##kxJVSQIjw)W!3fTieN+)$pA| zZSS4x>+Al)UHJz>nZp}8SBDeXq032;*#di_PkE>%nEFQ=R5MT_81-43-7{i^;O1@K zEFtusC9nJDSU>Ya`_m_C0+?-`BYe}JS=N&5*0Q@}voJ%zR*kD~Lh|xv$7uNO*bzf* zNy)Td*2x(jIvYrioL#|^aa;&4+jYe2 zF57LyyOH=~HChBPT0c3pSWZd@K<#inAr^8x!GQ`k7fFTEe6nO`3hvXkv4=#O+WYg= zh<%kg;Wh`U?dDqATkADcmaYjMc}{|<)7}x=a2%hW>PQ#b7H=qaeZu45Q5Q2#$*dVY zkW{g>pvv+xT0S8m9flX2a!*S}z9$y1n1T|kcL1=3svN>{_DH72L20ETF35~70oZeD zYpg}hi{$kVORlx1ob|hP*r17oW&^@@CEoEP#D&@11x7R~d;O9$&WOx5L4;kG-Nq$D zT#V6a6ii82F!d~3tzW8At0Ar)HjAp`>$qc;BQtCaKWt#CpWv-OxE(Z3`YR8c+dEe0 zaHy;SxFrLA1qojldUkqUs5%*Kd{;Hj8HjO?lh2nI`s~Z$8s~RFECn_~W!wWx@F%o+~N9MFnw}~ zGbN9TG`I>kN)9Sz2<pSbJ}h)7%?yI7O0eR*>S=+k&%J+wXfxfN;T1`8uOq`$dwU4GeeIZ-Hyr7ei0EdrwRK zqLswzB7HxOGuniCmf)0I4A*5d9v;FtCiO{~DT; zw+=l-;rfN^{sT0dd~)t@GkgD1Ca^NoF#VbE&s^&NtujIU-*Tz?HpT{&|8TkeE1$~5 z@(<GyF z?=O1U_I=CG^mq{3jm_P_d(7Jm*7dO@U=GJslxA_;0u7|D&qmf7^P{fTM*IWjQN|0DAG zxqtth`!oK_o%T8ZGd2qOCp!9P{8y~>&$)j&)c)Z~`|H|&e$AhFDjg%uzt;K7!}fPk z(0_MB{I!|?TNLzf+z<@^yBmUzm5Jd$M?v>oOzr+eK|Kx+DNhcKN2<$mgsw&F^+gkK zs%%SHJV>m0zYj>5eOtQbi+~Y+jf!EYEoF%#*o+b$#wYA#07#&KCbvW(4g0~$t}@!? ztEa)O!wMQnw>IDN&{!Ae_gYhbzTuRzHD2#)euX*-xa zY}iltgvEuitNO5__{E|#H5!L6_sGXR8}>EZ^C=1_3$GCGVR3yokwQ%m{Me#!;9d+G zE}~w|(*Lfr+Gb$U1TRU2)#f?Iu&xsiFi!)VO^c>+OZUP6K(27j>4M~ZM_nYdsl zw&Ucb8Syxtrh{OU=Cw)`Dl>HsBHr4@UnXzf$X?lHU5f!gId69RG1iyHkMezg9+xvY zF1X3tkOVId7GN;~V5@(*&EvR9PcW(;%Qhs-;p32{!1-h)E)(*^%=Z;1}-Ew_^J5Slh$ z4#~l3KB*`4WtfMbU`s>7&DeETV9?}Dv&$&$H%cH(OQcT6-A48 z%S%{)I&;YHn;45bqb)>?W9-d%ga z5hPP+n81HLGB%~!I}~I&#uHr+BqNXj&3sZz~GN7a{p=53zP}3TVIOD7#1sLuGl_1->>CiCJgS^{)qxTP$)OXi$Y&Hl7 z%UWL`pMs<*3CG{z4Iu}qi)<_O zbjdcor}&lAzx}aW=#h^>fghSbzYvd3aq|&E(WJ_v(+V)z-PxHr+MAu66pe@xtaUC9 zag=4~?i^PYEP0LO#bM`7@}1VAf;)4An}2Cc#@GVLIK^4rWLiOtsMR$|A9gv^ionbW z#et z&U+3wd9)qFP)zYx&MVPJx0UM_4K0cXT*{3X|ZkR*)_HlM$k+J^bb3 zMe0}kas6|nm!DzIxc(6|jj!q6WsR+;<;v}IcP*(l#wWiiFMn(`;{q#WhOmaYg(rTe z+spQp7;js03P$`gg{f~8kws0qTYM6pNYnETTEch0*s300dnp`89ebzQ^WzLu)%NNjXvz&_jOk$ws z$i7nNlxoN?;e@;7ENXI7>{D#3$SUyzFM%>_q6$|w1Hs$)k8IYmz~J>=h--*3&Ehn= z6@DCzCGXqlX41;Rb1o*E!fkNQPA1~uOH!)SB`nm-w6}hkUVZA-7*$GH9t7%?E3VHT zr~6l88j!COfA(P-5yZmnVN&z!#)FQ)?}?tglEW22XUAj(KdkM4yPL3sG!U--S}rVe!Lg05g<<3DXI(K=2ETTTsvF1dC2@jwmd?_yHzC|S=@ zJv2oZFcIl)YjYN1nGye*L{WIwfumYTbig@pzSOc9KhjKJ z3n9qxrbxlw>lO;{l_ISOHxlM&FA_JdFxEHH3_76M=2i1!pU7j87$P;8wdo}^T1K$( z^l^WiDpI?=Ef#?@vZk#X7>O)gTsFH&(^jE}lyMX5Z4*l-Nww5alrTBiHNa(XDqD7{NWg;@5*Y=zQn{QY z6Qu@|SF5r)zaFSUrhb};20VDRaVavl$H}R4{iNu#*GL&(Xy zh*KQvqB^`60zyP5FmbU&6ZOF>R<22@TYjDe_R-t}EdY6>_(%9TnWr&wVa7EKx9r&k zVva27FeTgcaNukS`(^CPzA|d$w^U!3NX5@#&kyk$s49KhtFGE9SbaD(ygE^FV|O`( z5eSnqMwTN<`q2GT1={kzB+*tLKG0V{({vu(fVGZZYxW1-x6v6a22xtX1FJ9RQsQ0PetISnWLa&Ew4SU`nS(l@85fWixrM|7(Hasm9i z)PPX1s#@E8K&5)#gCfWmsoTrFTLKoU07S+B6~q-yUYQ6sQ#TV1VZK6$S4WJ4nktBn zN4^NMsL-U0Gdl6$AUg2@v0@?ilKc^bxhP#4sSUkkZdLq+J`QY18BmeW$%w%rZvx5{ zUM_)1`v&jeec9&n-FPiC@~wn9R<|!sM|9%WOxZB};v|aisp#g2mp% zB+}j7j<2h^S!5AH%{-;0*yFxG`LcKafO@;FMFK|gAc-!;sqdbD#JnZtx~N)~Fr&%v zO-pF-6rM~Y=W$RJ`N*<9TuZ**3rD5=F4Oy3PUHla^ zz;EAAQj9);7qrWC_sCvD7AnNtB9()S?rnEnOL|4?x}=P=KxMu~tetyu-l4D}!PKL) z;l$gCvfXYss>WE6@1{*hV+X#i@?|xxF4~fkdIIa|O4n5t6Rf8~qNJKZt*4F4bygNF zD5Gnm?bYtUt|iLQ_3%uPZQ7L=nD^RIOZ_0TfDdSV3cZ^|P#4?~KP+0JV038syo4bj z3;~~Uf4{oVoK`=uVSk(S4B>2{*3Q?V#X(85&a7(AOVku1t6?CHzOwjyin9=3MLj*@ zaJM&#PaarV1tzcGtQeD9DH1EHQl)YgTm$Ve5*;XX$-`^YxHRzR(CpETE8zZ-`779` zJ_!-m%cV^Ml}WD$R?d_Jl1+ZmSX!^RcB9VB*`n!wTfhyBD{!Ni9+jGkl7pE2`iOjb z{5E`b(;lr2d-Tmts914r@~b0|ot9t$A0Z8K9vZp5Qc<5sU7cm(S49jJ=-#M}7_OKP zn_u<^ioilQJZOmv8iNA_FkoByN|xwu&&j-4R}uS8Jn2R>BzIL+S0mHEUdPm>M2v)*ioJOMoPJy>XKHn!IdMEUM6F9 z^Bwd&g~zn|JToXJG`2WSQ&(Pk&*#r1id;uC?oI$1fw9% zJOO=h8hF#WI0e(Bkss~H&mAPSU}JCznjlz=)RqZ%J`p05S5n3hHuW3I zk9*xn{%tddiHKdH@k?i)9FMYSR=@Qh2Ks}*rd>)uNUKU|1y&W> z`Xf?-mkO$fysp1fgqsnMoiNxaSh-(1f;V%S=(Kkt;#M$k`s#VJ@-gf{ZbGF~4C@2{ zNYr?u!2skxKKr=4IHTl7d3Ejjrc2MiQo5{!Eq3eRI+aTdY9&1RtH=+F+Y7>&k;^EAvYfXJ9W;V(m%Iy5+a3JvCMc%ZBmNIml0i< z^=OR@NlUvThPNcKZ{BMHYNZO*=FG^Bag9hu%>T9-te(i3tw_XheG`eIad>DVq&edL z#bK>pK~ZDxhe<@gsH(&H@{$bXi@50sXL$ScYI|q>`Sg7HimQrfRkd+z4u8%;)5oKU z##Oz=$8+_oPj`PiOja~XqVP*>+Y)PZLP$UiP!@q5`;7AaFgqr@rs0;<;gACiwlwkF zL$PrR^af!{JOc8X&=9T*7ol|svy_;1fkIAOniM^Vc(}@3(fN*^K}77(>}1mHYKgNF zpCF@BzIMpb^dL9+vTYPn>#MnkKXDM8 z@KIFh76-?HGub8mt8qHsyS#@tp)kkI5}l?JnRAU?z-@AAr3;V*XR1Gbsz%T9YM-{k zFF3%$h!*y5gGsb*bdgz=VHiEq!Z2PU93zo$R!7j#-*O5!pnfNdR4Bh^%pBkgz0N-= znT3Ky99(Kpf6$RnpCnOQKZfdr0>zM%ZWm>4%D_>!p(?q&oaAn@f}cftCHOXVd{7qX z@|-sZwnt<5g=4rSh;mbXIe@7puFYGZKgVTH&5^)sxTuU=E+T7TcI8MZMpi28iL$f? zE0w$xX(1cKrJqW{GQdd%YWkWe%%v4umVTQPD*Gn=o>+NRf&D=6 zO{}7CE>0-=*S&B{+b!Og2%kk+HkYe(SE_R=%C)iKsp*V!x9c6t)VDKwclU|c`_rY! z^dtNO9H)oZ@w9^t_s!mJO$Yn8z3yPqBo5?Yj=EO2qv`8{3A2rN=>5)#QTU#X9SPp? zSeLIyo!>PGaj0k)QiLPWN){)k%MYsJsW~-6q)9c|G@GT!O1Ly#%HrZgAetNKPRaY+ zNF(C5ho%A3GkI~0Y7V6kq97WvjA58(^cG>Ot*TZNEt>Y!je8;u#4=%+DC=0XWmVs; zQp;q=d<}l0N?hmza#pi7tDkF8p}G1xAcn8$)w@FUMdiDy`+#(Y%=C|#zlBUV*sTW8 z5;{kxv9B?@pK#8MIIg#qu~!I}(qe01vw};9d&J0}QqEtU1IhB-U}1?Gn(gf|O?R{@ zmd_3*h?Vvu9OrOU$awPkAdTUi?S#cm2EAI{9uVyXr4>+0nl8UuJ&i4g zRJE#j|Ees5>eGL;ME0yaO(jtx>n9dhj@e-VG-q_Hd`dG>nPF)X_iDX567Rv#h2{xU zKkQcJ#q)(cXz&ssE}I;@GzrX5Fqrlw$u^QBsD1W6DbsjPyho*KV2eAN9)%Ofb`r%L zL3Aj~d17$tgM%u8swtIr^^}y*m+RVb8zY-u*it&=|(~BFR!xn~Lk|Ouf_EPAfpOGW$BRR&li{OEan~ToU8C6A?k^nS@ z>!QEulhVa}#C`P0UZP$DBD}?P=vpI66o$nkFT?Xo!o6inItMs%xVT z3CT=z5|>8G5N)W}CC%pP78+4Q7 zra_4#ISWrwlu5Lf)(S~b`&n9N>9z%BShbe@8&v1DVWq&+BCJ*DWHG)H!h<3%+d*8>)NlN zn5V6!Wx|NFW7DUoi^pD92Mbx1gMT11J9{c zB%=MXqk9y2VzO-wiMf1hHyZSzzou}VCinR+KYEhRQ@gX%E^ge&7>VQ_Us+irTWyn$ z8uyhJONLrHzsZC=f$*rvT{xSTJD$Fx7^6l4cS$L`ba}y+cqu6teu7ZV>ORTy<(Mx= z!q}71L7ku@D_nnONH@Tb{^p2R^9N$r!>s<+5Z(= zUEI96p_tj250ZOuu0#$^COjsiV`<#hb)RG42QcqHG#n!;lF=<%BLPuHZvoRkdR}z8 z9lO(k`WSp!!SR{ly^5>0XOeKAg{^_)8W*&C=UB}RZv1-IcB|omBJ#bw&puA*7xXz` z2WtVfmmIgyW1X%D3vG`R=h&`qrTXKCXbfMEpZDV&LiS<>9M4-Z@HcRG`l`GoMA}cF zUXAGRL?Gp{`nqAwfBN;PbHN4Gb4;N)EO?r`nwy0d3)f2v-OvdX$a`))umk#B2x|I%At57$h!4L@0_)7tzawd;Dp~;U^gBq2jo_43Cy~hcf zk{{e+F8^+*esuc|(Cd%=QFa^rLj#Q5)MwRamQD&pc~uT9fCv?u>*;9EN}HIjgT0(V>x5V6HNgpN?B+|+ z?MZ%Pc4o%C6XNnfNqZ5ZY{Y6%%>foClS$#P!&R3fPno3z_29LREZmZ1B`rS0(dCQC z&m6*WqYuD(iJ>RlZs`6zN<12Zl;5TP1ofHK)647myeQQ-4^BUjh-2_~k+}wL13YsG z^h_}o*ni?XmGp7F@8z9rzg;$E9?jglb3T*Dq1>-Nf`6gS9;r1yKp+D)SGl+jL6=BG zPKh?#2DTvG5jW?6qYtq0XrlKBg1R&l<8j*kMd2UGex>pSW?Ax|2YIn?>i)J%TP0;k z;nxIV8($zCOD#07N8XW{>{liz%|7*gRBvR_fp-_vBhFW6rP)^DFWgs^w*shkNt7?? z&P+2ywh(6lfS~V?P(S*e+4^&(Ydk&1;5Fav$3p`f1wc_t1V5M=#oU?&K&JwZT_BDV zFmmVmok}DyS?WQyLILccG>O=dEcGz6#<(o?5XbcoqnMuPoQZ+1r;LCqxSY^#Q3IB= z%7SN-v+;f`XqCi3=*c26?2IBDoauh%f({l?=O5vDc!=0BMwVYhs@w+YxAtS+irSgGv*;dgdRTbO8VUFKIRS% zpVoYF#3PQBLna@feuP}zo!!mPzFvQMLzJ&lh8=u}?=K2>+?M*7cVt5@^T_!DK+^N)LCQB_&JJ-`Z1a`G10=mGY||(1Hm#p zB&f~A+pzjlzL6A8aX@-E{Ce$6(Y>Q#$b$9LcHp9WfsE?787cc*3kT}*G;epOw zIYrlrIHhHo1!$IF@+nf5_<;onj))XlLHXWuvGi*dcm?XnJXDGyD^!gskZs5jcMLU< zQ9kH(;C<6JbR|YOGr|#YB}4HhTu+uFje~Z4C(w439q47dr~s5ZN(E#fd)%`ySL`*| zCK%3F@_~IAKxBcl+7$2fMd-o}ngzjEb8ZVs?pYFVbx307H_hono0{UTe+F=d|Ea9hkMviD34&CZV85@NMTRJtUQh>Wqng-Gk$I*_AHw z-6m}BGTqzzFW(IM1-DNl+<0m7MIYhw#E?ul=~k^4e-IZ=u&fxFcVj$CW*_XCycoV` zQ*rzdu7>StyDIiA|KvDC=?Cnva-hbag18qfw09XPtUOMrFW=`mG=M)@TMyu*zGaI) z`2*E*`gdV#xl}K`HGsRElOKJcr-XYv459lPLqf@YUX}6Q(B^zx-bwGXt;yre>v~*b zZN40Khs*^^QVET|!W}B~4lzli8%8EZ9-^IE0HD=kH^xJKbW2>@2;IwHQ~lXnr*xZG zp4P`TOWG-=rM~u5Y_|4>8($PH+^?R7y-t2kerAB>x6n81hsn&FTmZpa7p5=5S9Ba^ z~Hp4DE`mgO2~=BhD_t~`1#D@^7tfk#BP@WG7|E*NMF6N-e;w7x`f3VsNZ&6x{mdE zbRv2Ct!skgOhBSt@6`CdSL6uF{cAG=CZ>WF

+1Z41y|QN5z*le3b6#<-iXiPp$P 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

NG9A?Ko-`VuJq)ap{ldlaaVk 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

iCDIEy6?w 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≫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 literal 0 HcmV?d00001 diff --git a/docs/part2/sprinter.h b/docs/part2/sprinter.h new file mode 100755 index 0000000..92cbb04 --- /dev/null +++ b/docs/part2/sprinter.h @@ -0,0 +1,132 @@ +#pragma disable_warning 85 + +//определения типов переменных + +typedef unsigned char u8; +typedef signed char i8; +typedef unsigned int u16; +typedef signed int i16; +typedef unsigned long u32; +typedef signed long i32; + +#define TRUE 1 +#define FALSE 0 + +//флаги кнопок джойстика + +#define JOY_RIGHT 0x01 +#define JOY_LEFT 0x02 +#define JOY_DOWN 0x04 +#define JOY_UP 0x08 +#define JOY_FIRE 0x10 +#define JOY_START 0x20 +#define JOY_ESC 0x80 + +//крайние и средний уровни яркости + +#define BRIGHT_MIN 0 +#define BRIGHT_MID 15 +#define BRIGHT_MAX 30 + +//заполнение памяти заданным значением + +void memset(void* m,u8 b,u16 len) __naked; + +//копирование памяти, области не должны пересекаться + +void memcpy(void* d,void* s,u16 len) __naked; + +//генерация 16-битного псевдослучайного числа + +u16 rand16(void) __naked; + +//установка цвета бордюра, 0..7 + +void border(u8 n) __naked; + +// ожидание конца кадра +void vsync(void) __naked; + +//опрос kempston джойстика и курсорных клавиш с пробелом +//для опроса кнопок есть константы JOY_ + +u8 joystick(void) __naked; + +//установка яркости экрана BRIGHT_MIN..BRIGHT_MID..BRIGHT_MAX (0..15..30) +//от полностью чёрного экрана до нормальной яркости до полностью белого экрана + +void pal_bright(u8 bright) __naked; + +void pal_bright16(u8 subpal, u8 bright) __naked; + +//выбор предопределённой палитры по номеру + +void pal_select(u8 id) __naked; + +//копирование текущей палитры в массив + +void pal_copy(u8 start, u8 count, u8* pal) __naked; + +//установка всех цветов в палитре значениями из массива + +void pal_custom(u8 start, u8 count, u8* pal) __naked; + +//отрисовка тайла + +void draw_tile(u8 x,u8 y,u16 tile) __naked; + +//отрисовка изображения + +void draw_image(u8 x) __naked; + +//очистка теневого экрана нужным цветом 0..255 + +void clear_screen(u8 color) __naked; + +//переключение экранов, теневой становится видимым +//ожидание кадра выполняется автоматически, vsync перед вызовом этой функции не нужен +//функция также обновляет спрайты, если они включены + +void swap_screen(void) __naked; + +void sprites_clip(u8 clip) __naked; + + +//запуск системы вывода спрайтов +//на видимом экране должно быть изображение, поверх которого будут выведены спрайты +//эта функция выполняется медленно, происходит копирование большого объёма данных +//после того как спрайты разрешены, они будут автоматически выводиться при swap_screen + +void sprites_start(void) __naked; + +//останов системы вывода спрайтов + +void sprites_stop(void) __naked; + +//добавить спрайт в список вывода +//x координата 0..240 +//y координата 0..176 +//spr номер изображения спрайта +void add_sprite(u8 x,u8 y,u16 spr) __naked; + +// конец списка спрайтов +void end_sprite(void) __naked; + +//время с момента запуска программы в кадрах + +u32 time(void) __naked; + +//задержка, значение в кадрах (1/50 секунды) + +void delay(u16 time) __naked; + + +void wyz_play_music (unsigned char song_number) __naked; +void wyz_play_sound (unsigned char fx_number, unsigned char fx_channel) __naked; +void wyz_stop_sound (void) __naked; + +//void fm_sound_on (void) __naked; +//u8 tfm_stat(void) __naked; + +// выход в DSS +void quit(void) __naked; \ No newline at end of file diff --git a/docs/part2/баги биоса и дос (utf8).txt b/docs/part2/баги биоса и дос (utf8).txt new file mode 100755 index 0000000..f717b6a --- /dev/null +++ b/docs/part2/баги биоса и дос (utf8).txt @@ -0,0 +1,72 @@ + Глюки и недостатки ДОС (Биоса) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Дата последнего редактирования: 27.09.2004 + + + +1. Функция "Сохранить текущий путь" (1Eh) имеет недостаток: + а) При сохранении корневого пути запоминает символ "\". + б) Но в то же время, при сохранении не корневого пути, + не ставит в конце строки символ "\". + У MS-DOS такой же глюк, но это не меняет "погоду" ;). Нужно привести + к какому-то одному формату. + +2. Функция "Закрыть файл" (12h) не закрывает файл, если он расположен + (был открыт/создан) не в тек. пути. Приходится принудительно устанав- + ливать диск и путь расположения закрываемого файла и только после этого + его закрывать ;(. Это происходит из-за того, что DSS текущей реализации + позволяет коppектно pаботать только в пpеделах одного диска. Т.е. пеpед + закpытием файла, текущим диском должен быть тот, где этот файл находится. + Важное замечание: Доработать DSS, чтобы система, в определенных случаях, + не трапалась при переполнении макс. числа (9) открытых дескрипторов. + +3. Функция "Удалить файл" (0Eh) имеет недостаток: + Удаляет файл в тек. каталоге, при формате записи "prog.bin", но не уда- + ляет файл, указанный с диском и путем расположения, например: + "a:\test\prog.bin". + +4. Функции опроса клавиатуры (30h,31h,..) не выдают признак (7,6 биты + регистра "B") нажатия "Shift" для клавиш "Home","End","PgUp","PgDn" и + клавиш управления курсором. У спец. клавиш, признак нажатия "Shift" + (биты 7,6) выдается только для F1..F12. + +5. Не происходит скроллинг экрана, когда идет "переполнение" последней 32-й + строки и 80-й символ - не код завершения строки. Происходит просто пере- + ход в начало первой строки экрана, с продолжением вывода строки (с нало- + жением на старые данные экрана). + +6. Estex не корректно работает с VFAT (которая фактически и используется в + Виндах). Трабл в следующем. Если в имени файла присутствует хотя бы одна + строчная (маленькая) буква, то для такого имени Винда создает в каталоге + две записи: первая для длинного имени, вторая - имя формата 8.3. Т.е. на + одно имя файла в каталоге имеется две записи. Если файл с таким именем + удалить в Estex, то будет удалено (помечено удаленным) только вторая за- + пись файла, имеющая формат 8.3, а первая запись останется не удаленной. + p.s. Эта ошибка легко исправляется нортоновским "ndd" или др. утилитой + проверки логич. структуры диска. + Если имя файла состоит только из одних прописных (больших) букв, то Винда + создает в каталоге лишь одну запись для имени файла (как MS-DOS до v6.22 + включительно). Такой файл корректно удаляется Estex. + Вывод: Для корректного удаления файлов под ОС Спринтера, их имена должны + содержать только прописные буквы. + +7. При включенном в Биосе пункте "System Disk: 1-st FDD" и при отсутствии + дискеты в дисководе, в некоторых случаях не сбрасывается обращение к дис- + ководу. + +8. Нет биосной функции "54h" (DRV_VERIFY) верификации секторов, описанной в + документации. Поэтому она всегда возвращает установленный флаг "Carry". + +9. Доработать функцию "32h" (DSS_ECHOKEY), чтобы нормально мигал курсор. + +10. Функции ДОС 0Ah (Create) и 0Bh (Create new file) перед созданием файла + не проверяют число уже открытых дескрипторов. При переполнении числа + открытых дескрипторов, эти функции все-равно создают запись нового файла + в каталоге, хотя и выдают признак ошибки. + Эти функции также не отслеживают имя файла на недопустимые символы. Если + имя файла содержит недопустимый символ - функции просто "зависают". + Такая ситуация с именами файлов может возникнуть например при автомати- + ческом создании имен. + +11. ДОС (v1.6) корректно выводит максимум 509 записей каталога. diff --git a/docs/part2/графика.txt b/docs/part2/графика.txt new file mode 100755 index 0000000..f116a9a --- /dev/null +++ b/docs/part2/графика.txt @@ -0,0 +1,33 @@ +В официальной документации есть информация о том, что при работе с графическим +экраном есть несколько методов для вывода графики: +- обычный; +- прозрачный цвет; +- временный; +Режим включается через указание номера страницы в порт окна процессора. Известно, +что для графического экрана у нас доступно 16 страниц с номерами 50h - 5fh. +При этом по факту программист не участвует в переключении этих страниц. Нужно +знать только одно, что в номере страницы биты 2 и 3 отвечают за режим вывода. +3..2 = 0 = 50h обычный метод вывода. Все данные попадают на экран без исключения. +bit3 = 1 = 58h режим прозрачного цвета. Цвет с номером FFh не выводится на экран. +bit2 = 1 = 54h временный вывод на экран. Самый мутный режим и тут нужно немного +пояснить как работает экран у Спринтера. + +Для работы с графикой на Спринтере установлена отдельная память - vram, +т.е. видео-озу. По факту это sram, быстрая память. Экран устроен так, что при +обычном методе или с приминением прозрачности все данные записываются и в vram +и в ram (озу). Суть метода 3 в том, что когда он активен данные пишутся +только в vram. Например, мы включили граф.режим, обычный метод и вывели фоновую +картинку на весь экран. Потом включили бит3+бит2 и вывели какой-то спрайт. +Координаты вывода мы запомнили. Потом нам нужно сдвинуть спрайт на сколько-то +пикселей в сторону. Мы берём ранее сохранённые координаты, включаем обычный +режим и делаем чтение и запись в те же координаты. Что получается в результате? +Фоновая картинка была записана и в ram и в vram. Потом по методу 3+прозрачность +мы вывели спрайт. Его данные попали только в vram, а в ram сохранена фоновая +картинка. Когда мы снова включили обычный режим и сделали чтение, мы прочитали +данные из ram, а потом записали их в vram и повторно в ram. Таким образом мы +восстановили область под спрайтом. После этого можно рисовать спрайт в новых +координатах. Замысел данного метода в том, что нам не требуется процедура +и лишний буфер для сохранения фона (данные под спрайтом). Однако процедура +которая будет восстанавливать этот фон, всё же нужна. При использовании +акселератора это работает достаточно быстро. Биты 2 и 3 можно использовать как +раздельно, так и совместно. \ No newline at end of file diff --git a/docs/reference/ARHITECT.TXT b/docs/reference/ARHITECT.TXT new file mode 100644 index 0000000..386ac1a --- /dev/null +++ b/docs/reference/ARHITECT.TXT @@ -0,0 +1,635 @@ + + ۰ + ۰ ۰ + ۰۰ + ۰ + ۰ ۰ + ۰ ۰ ⥪ Sprinter. + ߰ ߰ + + . + + ᠭ । 稥 । ⥫, + ⥪ ZX-Spectrum ࠧ⥩, +⭮ Pentagon-128 Scorpion-256, ⠪ 몠 BASIC +஥ ⢮ 몮 ᥬ Z80. + 뢠 䨣樥 設 - ॠ +⭮ 奬 ९ணࠬ㥬 ᪮ 奬 (). + 砥, 設 ⢮ 䨣権, + ᢮ 奬. + ⠪ ᯮ ⨥ -. ଠ쭮 +᫥, ஥ , ஬ ࠡ ᮪ + . - 뢠 ⮫쪮 ࠤ樨, + - 53710 Pentagon-128. + + + ⪨ Sprinter. + + pp . . . . . . . . . . . Z84C15 + ⮢ . . . . 21MHz/3.5MHz + . . . . . . . . . . . . . . 4096Kb + . . . . . . . . . . . . . 64Kb + . . . . . . . . . . . . . . .128Kb + - . . . . . . . . . 256Kb(512) + pp ᪮ . . . . . p181893 + p 1.44Mb p . . 3.5"᪠ + pp p . . . . . IDE/AT + pp p . . . 101key/AT + pp . . . . . . . MS-Mouse + ᫮ . . . . . . . ⠭p ISA-8 + AY-3-8910 ८-OUT + COVOX . . . . . . . . . 8bit x 4chanel + -p: . . . Spectrum standart + GRAF 320x256x256,640x256x16, TXT 80x32 + 室 TV CGA p, RGB + + + 孨᪠ ॠ. + + ஬ 設  Z84C15 EPF10K10QC208. +஬ 奬a , 72- SIMM + 4Mb, 256Kb -, 64Kb -, 奬 ஫ ᪮ + 181893, 祭 ⨪, 䮭, ਭ, +, ᪮, , , 奬 設 ISA-8 + ALTERA - EPM7032LC44. ᢮ +䨣樨 ।祭 ᯥ祭 ᨭ஭樨 砫쭮 +᪠ . ⠪ ।ᬮ७ 祭 +CMOS ᮢ ᭮ 奬 DALLAS. ஬ ਨ ஢ +奬 樨, 室 १ . + ன +ࠧ ⭮ . + + + ⥪ 設. + + 奬 p ᭮ 让 pppp㥬 ᪮ +p奬. 祭 ਩ ன १ +᮪ 設 䨣. + ppp ⢫ p⢥ +祭, ⠪ p pp㧪, p쭮 +奬 p⢥ p p. ᨫ쭮 뤥 +⥪ 鸞 ஢ ⮬ +, 騥 設, ᢮ . ᪨ + 塞 ⥪, ன +奬. , ਬ, ⮢ +祭 ਨ, ⠪ ᥪ㭤 +⥬ ९ணࠬ஢ , ⢥ 䨣 +⮢.  ⮫쪮 䨣, +ਬ, ⠪ 䨣 ZX-Spectrum. + ९ணࠬ㥬 奬 쭮 ᢮ +䠭⠧ ணࠬ 䨣樨 設. 뢠 +ࠡ ணࠬ । 䨣樨 +ᤥ , , , ਤ㬠 ᢮ 䨣, +⥬ ॠ । ᪮ ⮩ ணࠬ. + + + 筠 奬 Sprinter. + + Ŀ Ŀ >Sinc + ਭ 2 ISA SLOTS >R + Ĵ >G + Ŀ >B + Ŀ + + INT + Ŀ Ŀ Ŀ + ij ij Ĵ EPF10K10 Ĵ + ijDATAij Ĵ V_DATAĴ + ijĿ ij Ĵ Ĵ + < + Ĵ Ĵ + Z84C15 ADRESSĴ V_ADRESSĴ + Ŀ Ĵ Ĵ + + <ij ij > WE,CSi> + <ij ij DIR> + <ij ij > > Audio OUTs + Ŀ + Ŀ Ĵ MAIN + - ADRESSĴ + T > Sinchro Ĵ + A HDD_DIR <Ĵ + <Ĵ RAS,CAS,WEĴ + + + Ŀ + ਩ ன⢠ <Ĵ + FDD,HDD,KEMPSTON + Ŀ Ŀ + TAPE < Keyboard> + in/out ´ + + + 㭮 1. + + + + 奬 㪠. +⢮ ஢ 設 ⠪ ᫮. ᨣ ࠢ +ன ⨯஢ ᠬ SIMM-. + + + 쭥襥 ᠭ ⥪  ᠭ +䨣権 ⥩ 䨣権. । ⨬ ᫥ ᪠ ᪮쪮 +᫮ ४祭 ᠬ 䨣権. + + 㧪 䨣権. + + 祭 , ⠪ ᫥ RESET +ଠ, 室 ⢥ 䨣, +ࠥ. 室 ० 㧪 奬. + ⪫祭 ਨ. + ᭮ ࠭⢮ 뢠 祭 ࠭ + ࠭ -.  ᭮ ࠭⢮ + ਢ ணࠬ +祭 ࠭ ⮫쪮 ⢥ 楫 - 㧨 + 䨣樨. ⮩ ࠭ 室 +砫쭮 䨣樨. ( 䨣 Sprinter-1.) +ணࠬ 㧪 䨣樨 ஢ 䫠 - , ᫨ +⠭, 㦠 , ᫨ 襭, +. ⮬ ᭮ ४䨣஢ 奬 . + 奬 㧨 ᫥ ࠭ - + 䨣樨 ᬥ饭 #100 ⠢ 䫠,  +⥪⮢ ப "FLEX_10K_LOADING", ᠭ ᬥ饭 #80 ⮩ +࠭ -. ᫥ ⮣ ந , +⢫ ணࠬ ᯥ樠 ࠭ RESET_PAGE. +ணࠬ , ᪠ 室 䫠 FLEX_10K_LOADING +稭 㧪 . ⮬ ६ ࠥ 䫠, + ।頥 㧪 䨣樨 ⨨ + RESET ᫥ "筮" 砫 +䨣. ࠭ 䫠 ⠪ 祭 砥 +祭 ࠢ쭮 䨣樨 ६ ᯥਬ⮢ ணࠬ. +⨥ RESET ᥣ ୥ 奬 砫 䨣. + + ਬ砭: + ७ ଠ  ⮩ +ଠ樥 ALTERA. ஬ ᠬ 奬 ALTERA ⠢ + ணࠬ ᯥ祭 ࠧ 奬 . ᮦ, +ணࠬ ࠡ ⨯ ZX-Spectrum 襬 +ਬ 饬 । Sprinter-. ⮬ +ࠧࠡ⪠ 䨣権 ந ⮫쪮 稨 +筮 魮 設 ( Pentium-166) ணࠬ ࠧ +奬 , 業 ⠢ ⭨ ஢ . + 裡 ⨬, Sprinter ᪮쪮 +䨣権, ᠭ , ⠫ +㦥 ᪥ . ﭭ ᮢ襭⢮ + 䨣権 ࠧࠡ⪠ . + + 䨣 Sprinter-1. + + 砥 ᥡ 䨣 Spectrum-128/256, । + 4Mb, ७ ࠭ ० Spectrum, Text-80x32, Graf-320x256x256, +஫ ᪮, ஫ IDE , ஫ AT, +祭 ZX-Keyboard, 8-bit COVOX. + 䨣 ᨬ쭮 ਡ 䮣樨 ZX-Spectrum + ࠡ ᯥ㬮᪨ ணࠬ ⥯ + ७ ० ࠭ , ⠪ ࠡ +묨 ன⢠. + + 䨣 Sprinter-2. + + 砥 ᥡ 䨣 Spectrum-128/256, । + 4Mb, ७ ࠭ ० Spectrum, Text-80x32, Graf-320x256x256, +஫ ᪮, ஫ IDE , ஫ AT, +祭 ZX-Keyboard, Accelerator. + 䨣, Sprinter-1 ਡ ᯥ㬮᪮, + ⪨ ॡ ணࠬ ᮢ⨬. +ᯮ짮 ᥫ 権 ᭮ -. ᥫ +᪮ 樨 뫪 ⮬ + 䨧᪮ । ᪮ ᭮ . + ᫥ ᨨ 䨣 Sprinter-2 Spectrum-᪮ +. 0FEh 뢠 ᪠ 襤訩 +AT-. + + 䨣 ZX-Spectrum-256/AY. + + 䨣 ᨬ쭮 ਡ ZX-Spectrum-128/256 + 砥 ᥡ 奬 몠쭮 ᮯ AY-3-8910. ⮩ +䨣樨 ७ ० ࠭. + 奬 AY 砥 ᥡ ᮢ, + 㬠 ॣ . 饩 . + ⥭ ⮢ ᮯ. + 쥩 ᨨ AY । ⪨ ᪫. + + 䨣 Sprinter-3. + + 䨣 易 䨣樨 ZX-Spectrum. +⪫砥 ᭮ ࠭⢮ ࠧ 16k, + 砥  256- ࠭ . +ᯥ㬮᪨ ࠭, ᪨ ࠭ ⠪ , 䨣 +Sprinter-1 Sprinter-2. ⥫ 㭪樨 ᥫ. + ந 樨 AND, OR XOR . 8-bit +COVOX. + 쭥襬 । 祭 ⮩ 䨣樨 +ਭ஢᪮ 㪮 . + + 䨣 Game-1. + + 宦 䨣 Sprinter-3. ᥫ ᪨ +㭪権, 뢮 㪠 COVOX-Blaster - COVOX , +騬 뢮 筮 ᢮ ୮ ६ +㣮 ࠡ. 䨣 ਥ஢ ᯮ짮 +Sprinter-. + + + 奬 । . + + 奬 । 䨣 Sprinter-1 Sprinter-2 + 筮 ஧. ᪨ ।⠢ ᮡ 奬 +। Scorpion, +⥫쭮 奬, ந쭮 ⠭ +࠭ , , ⠪ . + ࠭ ᢮ , ஬ 㪠뢠 +⢨⥫ ࠭ 256- ࠭ 4Mb. ࠭, +஥㥬 ࠧ ᭮ ࠭⢠ ᢮ +ᮡ⢥ . .. ࠭, 砥 #4000..#7FFF, +࠭ 5 筮 Spectrum-᪮ । , 砥 + #C000..#FFFF ࠧ . + ᥣ ⠪ ⮢ ࠭ - 32. + 16 ⮢ ⢥ ࠭ , 砥 ᠬ +#C000..#FFFF. ⢥ 祭 ࠭ ᠬ +#0000..#3FFF, #4000..#7FFF #8000..#BFFF. ᥬ ⮢ ᯮ +祭 ࠧ ࠭ . - 祭 ࠭ +- . - ⥬ , 砥 + ࠧ ᫥ 設 蠬 Ctrl+Alt+Del. + ⠢訥 3 ࠭ १ࢥ. +奬 । ᭮ ࠭⢮ + ⮫쪮 , ISA , ⠢塞 + ᫮. + 祭 #C000..#FFFF ᪮௨᪨ ७ +࠭ , ॠᮢ ᫮. ⮣ + ࠭ 祭, ᮮ⢥饥 ISA-᫮, + ஬ 室 ந 饭. 祭 ⠪ 㪠뢠 + 祬 饭, ⠬ . + + + 奬 । Sprinter-. + + ᭮ ࠭⢮ ࠭ + 砥 ࠭ ࠭ 16k + Ŀ Ŀ Ŀ Ŀ + #0000..#3FFF > > ROM_BASIC >> EXPANSION + #7FFD, Ĵ Ĵ + #1FFD Ŀ ROM_TR-DOS > > TR-DOS + Ĵ Ĵ Ĵ + #4000..#7FFF Ŀ > BASIC128 + Ĵ + ROM_SYSTEM > > BASIC48 + Ĵ Ĵ Ĵ + #8000..#BFFF Ŀ > RAM_0000 > > SYSTEM ROM + Ĵ + Ŀ > SYSTEM ROM2 + Ĵ > RAM_4000 > Ĵ + #C000..#FFFF ÿ > CONFIG 2 + Ĵ + Ŀ > CONFIG 1 + ٳ > RAM_8000 > + + + Ŀ Ŀ ࠭ 16k + > RAM_0 > Ŀ + #7FFD, Ĵ >> RAM_00 + > #1FFD > > Ĵ + > RAM_01 + > RAM_7 > > Ĵ + Ĵ + > RAM_8 >ij> + Ĵ RAM_7F + > > Ĵ + Ĵ >> RAM_80 + > RAM_F >> + + 譨 ன⢠ Ĵ + Ŀ Ŀ > RAM_FE + > ISA_1 <Ĵ Ĵ + Ĵ > RAM_FF + > ISA_2 <Ĵ + Ĵ + > HDD <Ĵ + Ĵ + > OVER DEVICES < + + + 㭮 2. + + + + 㣨 䨣 奬 । 頥 +᢮ ᮢ . ⢮ #1FFD #7FFD, ⠪ + 頥 奬 ࠡ ன⢠, ⮡ࠦ묨 . + + + 奬 । ⮢. + + Sprinter ᮡ 㯯 ⮢. ࢠ 㯯, +७ Z84C15, - 譨 . +⮢ ࢮ 㯯 , ⠪ +⠫ ஬. 㯯 砥 १ + 㣮, ⢥ ᫮, 祭 +ᠬ ࢮ 㯯. + ⮬ ⠫ Z84C15 +㬥樨 ⮬ 㯮 . + ᫥⥫ ⮢ ᯮ ⨢ . + ࠫ ᯮ 뢮 , ன ࠫ + ᨣ 뢠 ᮢ אַ 㯠 ᫮⮢ ISA. +ࠫ Z84C15 ஥ ⠪ ࠧ, + ࣠ 뢠 ᨣ 室騬 १ ࠫ +. ᪨ ன ࠫ ᯮ ஫ +뢠. + 奬 । ⮢ ன 㯯 ᢮ ᮡ. + 뫮 祭 䨣 ⮢ + ॣ㧪 . ⨣ ⥬ ਬ । +⮢, ᯮ饩 ᯥ樠쭮 ࠭ . +  横 饭 ᭠砫 ந室 饭 + ⮢. ⮢ ᠭ 祭 + . ந室 ७ +⮢ 饭 ࠭ . ० ࡮ ந室 + থ, ० ࡮ ⠢ ᨣ WAIT +ᨬ 室 横 饭 . + 祭 ⪫祭 + 筮 ⮢ 㦭 +. + ࠭ ⮢ ᮤন , +४ १ ⥬ . ࠧ ⢨ ஥ +४祭 䨣樨 ⮢, ࠡ +Spectrum-᪨ ணࠬ ᮢ⭮ Sprinter-᪨ ᮬ. + + + ⮢, ᯮ㥬 Sprinter-. + + ਢ ⮢ 䨣権 Sprinter-1 +Sprinter-2. ࠧ ⬥, ⮩ +ணࠬ, 砥  ⠪ 室. + + + ⠭ . + + #FE - RD_KBD - + #FE - WR_BRD - + #7FFD - ७ ZX-Spectrum 128k + #1FFD - ७ Scorpion ZS-256 + #1F,#0F - RD_KEMPS - ⨪. 䨣樨 Sprinter-1 + #1F ⭮ ॠ #0F + #BFFD,#FFFD - AY-PORTS - AY-ᮯ (ZX-Spectrum-256/AY) + + ᮢᥬ ⠭ . + + #FB,#4F - COVOX-. + + + ⥫ 8- Sprinter-. + + #82 - PAGE0 - ࠭ , 砥 १ #1FFD + #A2 - PAGE1 - ࠭ , 祭 #4000 + #C2 - PAGE2 - ࠭ , 祭 #8000 + #E2 - PAGE2 - ࠭ , 祭 #C000 + ⬥ ᮡ, १ #E2 + 16- ࠭ ᪮௨᪮ । . + #89 - PORT_Y - ⨪쭠 न 窨 ᪮ ࠭ + ࠭ VIDEO-RAM ᯥ㬮᪮ ० + #C9 - RGMOD - ० ࠭. ४砥 ࠭ ० ࠭. + #3C,#7C - SYS_PORT - ⥬ ண ४ + + #10..#1F,#EE,#EF,#F0,#F1,#F4 - ७ Z84C15 + + ࠭ , ⠪ ⥭. + 믮 ணࠬ, ᯮ騥 ४祭 ࠭, +⥬ ࠭ . ࠡ BIOS- ࠭ +࠭. + + + ⥫ 16-⨡ Sprinter-. + + #xx50..#xx55 - HDD - ᯮ짮 譨 ணࠬ + ४. 㭪樨 ࠡ HDD ᠭ . + + + Sprinter-. + + 묨  㯭 +६, 㯭묨 ᫥ ஢ ⮢. + 㪠뢠, ⠪ ⠢  . + + BASIC48 + BASIC128 + TR-DOS + EXPANSION + SYSTEM + + १ ⠭ 訢 . ⮣ +筮 ࠬ ࠭ #80 +ᮮ⢥騩 ⮩ ࠭. ⠪ 祭 ࠭ + ࠭ 饭 . + 筮 묨, ⠪  #7FFD,#1FFD 筮 +ﭨ 㯭 ⮫쪮 , 祭, 뢠 + , ᮮ⢥騥 ⥭. + 㣨 䨣 ⢮ ⮢ +⢮ . + + + ࣠ ०. + + - Sprinter- ⠢ 256 . 쭥襬 +। ७ 512 , 祭 +᮪ ० ࠧ襭. + ० Spectrum-᪮ ࠭ ࣠ ⠪ +⠭⭮ ZX-Spectrum. ⠫ ० 砥 Sprinter-᪨ +࠭, ண 砥 ᥡ 㬮᪨ ࠭ +奬. + + ன⢮ ࠭. + + ࠭ ࠧ , ࠧ஬ ⠭⭮ +㬮᪮ . ⠭ ᢮ +ᮡ⢥ ० 뢮, ⠪ -, 㤠 ந +뢮 . + ᢮ ᮡ⢥ ० 뢮. + ⠭ ⠪ ०: + ZX-40 - ᯥ㬮᪨ ० ⯫ + ਡ⮬ . + ZX-80 - , 宦 ᯥ㬮᪨ ஥ +ᨬ, 뢠 ᨬ, ᦠ +ਧ⠫. + G256-8 - ᪨ ०. ।⠢ ᮡ ᨢ 8x8 +祪. 窥 256- 梥⮢, 롨ࠥ +16 梥⮢. ࠧ . +० G256-8 - . + G16-16 - ᪨ ०. ।⠢ ᮡ ᨢ +16x8 祪. 窠 16 梥⮢, 롨ࠥ 16 + 梥⮢. , G256-8 ⠭ + 4- . ᪨ ० ᥪ 㣮. + 16-梥⭮ ० 16 梥⮢ 256-梥⭮. + BORDER - 뢮 梥 थ. + BLANK - - ⠭ . + + ꥬ ० ⠢ 2 , +⮬ ० ᥣ ࠭ ᢮ १ 2.5 + -. + ࠭ ந ஫ + ᥣ, ⠪ ⥩ ࠭ ⠬. + + ࠭ ⠭ 祭, ⠪ +㭪権 . 㭪樨 뢠 ࠭ ᪨ +⥪⮢ 㦭 㦭 ࠧ. + + 㭪樨 ᪮ ࠭ ࠭ +320x256 祪. ᫥ ⮣ ० ࠭ ।⠢ ᮡ. + 256- , 320 . ᥤ 窨 - +ᥤ . ४祭 ந १ PORT_Y, ஬ +⠭ , 뢮 ࠭. +ᢥ ࠭, 稭 㫥. + 뢮 ᪨ ࠭ ⠪ ॡ +ᮮ⢥ ࠭ ᭮ . ⮩ ࠭ 㤥 ᮤঠ + ࠦ. + -  ⥭ , ⮬ ଠ, 室 +᭮ , 室 - 易⥫쭮 㤥 +ᮢ ଠ樥, 室饩 ⮬ -. - + ந १ ᭢ , 뢠 + ࠡ, ਬ, ࠩ⠬. ࠡ ࠩ⠬ ⠪ +।ᬮ७ ० - ஧ 梥⮬. ⮬ ० +ଠ, । - ஢ 稥 #FF. ᫨ + 㦨, 横 ய᪠ ࠭ ⮬ + ⠥ , 뫨 ࠭. ࠧ ࠭ + ᮢ뢠 ࠩ, ।⠢騥 ᥡ אַ㣮 ⨭ + "஧묨" 梥⠬. + + ਬ ணࠬ 뢮 אַ㣮쭮 ⨭ ࠭: + +PAGE3 EQU #E2 +RGADR EQU #89 + + LD A,#50 ; ࠭ ᪮ ࠭ + OUT (PAGE3),A ; ⠭ PAGE3 + LD HL,Pucture ; ⨭ ( ) + LD DE,#C040+HorPlace ; ⨭ ࠭ ਧ⠫ + LD A,VerPlace ; ⨭ ࠭ ⨪ + OUT (RGADR),A + LD B,VerSize ; ⨭ +LOOP: PUSH DE ; + PUSH BC ; 稪 + LD BC,HorSize ; ⨭ + LDIR ; ஢ + POP BC + POP DE + INC A ; ᫥ न Y + OUT (RGADR),A + DJNZ LOOP ; 㦭 ⢮ ࠧ + + ࠢ ० 뢮 ࠭ (祭 뢮 ஧묨 +梥⠬, ⪫祭 ஢ ᭮ ) ⢫ १ +訥 ࠭ ᪮ ࠭. + + + ᥫ 権 . + + ᥫ 権 ।祭 ᪮७ 権 + 뫪 ⮬. ᥫ + Sprinter-᪨ 䨣 ⮬ +蠥 ࠡ Spectrum-᪨ ணࠬ. + ᭮ ᥫ  ஥ ७ . +樨 뫪 ந ⥬ +७ , ⥬ ஢ 㦭 ⮣ . +᫥ ஢ ந ᪮쪮 ࠧ ⠪ +ࠧ ந ࠭ ⥪ࠬ. + ࠭ 梥⮬ ᯮ 㣮 ० +ᥫ. 㥬 ७ +ந 設 , +. + , 뢠 ᥫ ࠧ + 1..256 . + ࠢ ᥫ஬ ந ।⢥ ணࠬ. + ⮣ , 䠪᪨  +ﬨ ⨯ NOP. + LD A,A; LD B,B; LD C,C; LD D,D; LD E,E; LD H,H, LD L,L + 祭 ᫥饥: + LD B,B - 몫 ᥫ. + LD D,D - ᥫ ० ਥ ࠧ + ᫥ ⨯ LD A,dat, dat 㤥 + ࠧ஬ . ᫨ ࠧ ⠭ ࠭, + ⠭. + LD C,C - Fill - ⮬. ᫥ + ⨯ LD (HL),A ਢ 㪠 + ࠭ ⢠ 祭 A + LD E,E - Fill ᪮ ࠭ - + ⨪ . + LD H,H - rezerved + LD L,L - ஢ . ᫥ ⨯ LD A,(HL) + ਢ ᥫ 묨 (HL), + ⨯ LD (DE),A ਢ १ + ᥫ ᭮ -. + LD A,A - ஢ ᪮ ࠭ + LD L,L, ࠡ⠥ ⨪묨 ﬨ ࠭. + + ਬ ᯮ짮 ᥫ: + + ; ⠥, ࠭ ࠭ 㦥 #C000 + LD HL,#C040 ; 砫 ࢮ ࠭ + LD DE,#C180 ; 砫 ண ࠭ + LD BC,#140 ; ࠭ ਧ⠫ + DI ; 뢠 ࠡ ᥫ஬ + LD D,D ; ᥫ ⠭ ࠧ + LD A,0 ; ⠭ ࠧ - 256 + LD A,A ; ⠭ ᥫ ஢ + ; ⨪ . + LDIR ; ஢ ! + LD B,B ; 몫 ᥫ + EI ; 뢠 + + १ ணࠬ ந ஢ ᥣ ࠭ +࠭ 㣮. ६ ᯮ ⠢ ਬ୮ 1.2 . + + ⥫ 㭪樨 ᥫ 騥 䨣樨 +Sprinter-3 ࠡ ࠧ. 믮 ᪨ 㭪権 +ᯮ XOR (HL); OR (HL); AND (HL). + + ਬ ન 256 . + + LD HL,ADRES_1 + LD DE,XOR_DAT + DI + LD D,D + LD A,0 ; ᫮ , ப + LD L,L + LD A,(DE) ; ᥫ + XOR (HL) ; ந XOR 묨 ᥫ + LD (HL),A ; १ 樨 + LD B,B + EI + + ࠡ ᥫ ࠭稢 ⮫쪮 䨧᪮ +᪮ ࠡ ᭮ . । ६ ࠡ +ᥫ஬ ⠪ ਬ୮ 㫥: + + ६ ࠡ = ६ ࠡ ᥫ + ६ + ࠡ ᥫ + ६ ࠡ ᥫ = ᫮ 뫠 /7000000 (ᥪ㭤) + + ⪫祭 뢠 ६ ࠡ ᥫ 室, ⠪ + 筮 ⥬ ணࠬ + 뢠 ᬮ ࠡ ଠ쭮. + + + 祭. + + Sprinter- த. 襭 +. , ন騩 ७ ० ࠡ . + + ᥬ ᪨ ᠬ 易 ਮ⥭ + "": + + Adress: -, . ⠭, . 35, . 31. + Phone: (812)-327-35-31 + E-mail: peters@atlant.ru + + 孨᪨ ᠬ : + + Fido: Ivan Mak (2:5030/529.24) + E-mail: ivan_mak@yahoo.com (६ ) + diff --git a/docs/reference/Estex описание.doc b/docs/reference/Estex описание.doc new file mode 100644 index 0000000000000000000000000000000000000000..4dfd25bb310de2da43c6f4f57bfd237d026787c4 GIT binary patch literal 37888 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 literal 0 HcmV?d00001 diff --git a/docs/reference/Programmer manual.rtf b/docs/reference/Programmer manual.rtf new file mode 100644 index 0000000..4d0cf42 --- /dev/null +++ b/docs/reference/Programmer manual.rtf @@ -0,0 +1,7028 @@ +{\rtf1\ansi\ansicpg1251\uc1 \deff0\deflang1033\deflangfe1049{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Times;} +{\f5\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Helvetica;}{\f6\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}Courier;}{\f7\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Geneva;} +{\f8\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Tms Rmn;}{\f9\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Helv;}{\f10\froman\fcharset0\fprq2{\*\panose 00000000000000000000}MS Serif;} +{\f11\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}MS Sans Serif;}{\f12\froman\fcharset0\fprq2{\*\panose 00000000000000000000}New York;}{\f13\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}System;} +{\f14\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f15\fswiss\fcharset0\fprq3{\*\panose 020b0604030504040204}Tahoma;}{\f16\froman\fcharset238\fprq2 Times New Roman CE;}{\f17\froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f19\froman\fcharset161\fprq2 Times New Roman Greek;}{\f20\froman\fcharset162\fprq2 Times New Roman Tur;}{\f21\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f22\fswiss\fcharset238\fprq2 Arial CE;}{\f23\fswiss\fcharset204\fprq2 Arial Cyr;} +{\f25\fswiss\fcharset161\fprq2 Arial Greek;}{\f26\fswiss\fcharset162\fprq2 Arial Tur;}{\f27\fswiss\fcharset186\fprq2 Arial Baltic;}{\f28\fmodern\fcharset238\fprq1 Courier New CE;}{\f29\fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f31\fmodern\fcharset161\fprq1 Courier New Greek;}{\f32\fmodern\fcharset162\fprq1 Courier New Tur;}{\f33\fmodern\fcharset186\fprq1 Courier New Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0; +\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128; +\red192\green192\blue192;}{\stylesheet{\widctlpar\adjustright \fs20\lang1049\cgrid \snext0 Normal;}{\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\lang1049\kerning28\cgrid \sbasedon0 \snext0 heading 1;}{\s2\sb240\sa60\keepn\widctlpar\adjustright +\b\i\f1\lang1049\cgrid \sbasedon0 \snext0 heading 2;}{\s3\sb240\sa60\keepn\widctlpar\adjustright \f1\lang1049\cgrid \sbasedon0 \snext0 heading 3;}{\s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\lang1049\cgrid \sbasedon0 \snext0 heading 4;}{\*\cs10 +\additive Default Paragraph Font;}{\s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext15 List;}{\s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext16 List 2;}{\s17\fi-360\li360\widctlpar +\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext17 \sautoupd List Bullet;}{\s18\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext18 \sautoupd List Bullet 2;}{ +\s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext19 Body Text;}{\s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext20 Body Text 2;}{\s21\li720\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext21 +Normal Indent;}{\s22\sb100\sa100\keepn\nowidctlpar\adjustright \b\fs20\lang1049\cgrid \sbasedon0 \snext0 H5;}{\*\cs23 \additive \b \sbasedon24 Strong;}{\*\cs24 \additive \'ce\'f1\'ed\'ee\'e2\'ed\'ee\'e9 \'f8\'f0\'e8\'f4\'f2;}{\s25\widctlpar +\tqc\tx4153\tqr\tx8306\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext25 header;}{\s26\widctlpar\tqc\tx4153\tqr\tx8306\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext26 footer;}{\*\cs27 \additive \sbasedon10 page number;}{ +\s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext28 Body Text 2;}{\s29\sb100\sa100\widctlpar\adjustright \f1\fs16\lang1049\cgrid \sbasedon0 \snext29 \'ce\'e1\'fb\'f7\'ed\'fb\'e9 (Web);}{\s30\widctlpar +\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext30 \'d1\'f2\'e0\'ed\'e4\'e0\'f0\'f2\'ed\'fb\'e9 HTML;}{\*\cs31 \additive +\strike\fs16\ulnone\cf2\animtext0\striked0 \sbasedon10 Hyperlink;}}{\*\listtable{\list\listtemplateid508877878\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li643\jclisttab\tx643 }{\listname ;}\listid-125}{\list\listtemplateid1310068810\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s17 +\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid-119}{\list\listtemplateid-1013577098{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li720 +\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fs20\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 +\fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers +;}\f14\fs20\fbias0 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23 +\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid2045711580}}{\*\listoverridetable{\listoverride\listid-119\listoverridecount0\ls1} +{\listoverride\listid-125\listoverridecount0\ls2}{\listoverride\listid2045711580\listoverridecount0\ls3}}{\*\revtbl {Unknown;}}{\info{\title \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e9 DOS v1}{\author Parinov} +{\operator Alex}{\creatim\yr2002\mo10\dy3\hr10\min58}{\revtim\yr2002\mo10\dy3\hr10\min58}{\version2}{\edmins0}{\nofpages46}{\nofwords12039}{\nofchars68624}{\*\company *}{\nofcharsws84275}{\vern89}} +\paperw11906\paperh16838\margl709\margr849\margt851\margb709 \widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\viewkind1\viewscale75\pgbrdrhead\pgbrdrfoot \fet0\sectd +\psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl {\header \pard\plain \s25\widctlpar\tqc\tx4153\tqr\tx8306\pvpara\phmrg\posxo\posy0\adjustright \fs20\lang1049\cgrid {\cs27\lang1033 +\par }\pard \s25\qc\fi360\ri360\widctlpar\tqc\tx4153\tqr\tx8306\adjustright {\lang1033 +\par }}{\footer \pard\plain \s26\qc\widctlpar\tqc\tx4153\tqr\tx8306\adjustright \fs20\lang1049\cgrid {\fs16\lang1033 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\b\fs72\lang1033 {\*\shppict +{\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibName}{\sv \'44\'3a\'5c\'d0\'e0\'e1\'ee\'f7\'e8\'e5\'5f\'e4\'ee\'ea\'f3\'ec\'e5\'ed\'f2\'fb\'5c\'53 +\'50\'52\'49\'4e\'54\'45\'52\'5c\'53\'70\'72\'69\'6e\'74\'65\'72\'20\'70\'69\'63\'74\'75\'72\'65\'73\'5c\'50\'65\'74\'65\'72\'73\'6c\'6f\'67\'6f\'2e\'6a\'70\'67}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn fillColor}{\sv 268435473}} +{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw2646\pich1244\picwgoal1500\pichgoal705\jpegblip\bliptag-769316105{\*\blipuid d2252af7b60351e8c90b792328f88abf} +ffd8ffe000104a46494600010100000100010000ffdb00430006040506050406060506070706080a100a0a09090a140e0f0c1017141818171416161a1d251f1a +1b231c1616202c20232627292a29191f2d302d283025282928ffdb0043010707070a080a130a0a13281a161a2828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828ffc0001108002f006403012200021101031101ffc4001f0000010501010101010100 +000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a10823 +42b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a +838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1 +f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b5110002010204040304070504040001027700 +0102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a43444546474849 +4a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4 +c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00faa6b98f11f88e7d2bc61e14d1e2822921 +d624b949646621a311c5bc151d0e4f1cd7387e2f69c1987fc231e32f94e3fe40f27f8d7927c50f8b82f7c75e1b96cb48d66c23d37ce24cf079574fe727944c48 +73ca8c919c8278a00f7af1bfc41f0d782a12daf6a51457057725ac7f3cd20f641cfe2703debc57c43fb426bfa840efe0ef0b4b1db12516eef15a4c907b2af00f +23232719af1abef0a6a979a84f348757bab899cb1967d32632cbe8587273edc81f4aef74ed593489960b5f0cff006b69d6f6b15adac7a9e9b3662c02d23ed1c6 +e7919989f40a3b50073bacf8ff00e286ae4fda752d5e04273e5da45f675fcd467f5ae4efa0f13ea059afc6b574cdc9333c9267f024d7af7fc25e3fe89de89ff8 +2a9ffc293fe12f1ff44eb43ffc14cffe1401e2bfd85aaf51a65e13ea6335243a4eb76f206b6b2d46171d1a256423f118af67ff0084c07fd13ad0ff00f0533ff8 +57a37c33b7d13c497535aeb1e0ff000fdbdd0b48ef636b583188dd9976488c331be549c1ea0e7b1a00f9cf4df12fc44d16332d96a5e248618c65b71795147a90 +db801f90aec7c35fb45f8bb4fd8baac361abdb8c65990c5263d99783f957d277bf0e7c2b71115874986c651f767b126de443ea1931fae47ad7cabf1bfc331683 +abdc61e392ea1ba16d2cc8a13ed2af179b1bb28181201956c601f91b0327201f40f81fe3bf84bc4b2456d792b68d7f210ab15e30f2d89e81641f2e7d8e0d7aba +32ba8642195864107208afcd82015dae010782319cd7a97c21f8c3aaf81eea2b2d49e4d47c3cec035bb31692dc7f7a227b0fee1e31d307a807dad4555d2b50b5 +d574db6bfd3a74b8b3b98c4b14a872194f20d140195f1035a7f0ef8275bd5e200cb6969249183d37e3e5cfe38af8d3c2da95ebe891dfcd752bdf5a49a8cd05c3 +b65a276b6dc594f63bc961e879183cd7da1e34d14788fc27abe8ecc17edb6b240ac7f858a900fe0706be31d0b45d52cfc33ad25c595c23698d7d0de3953b607f +20280c7b64f033d7b668027f833e1cb9d6f5c5785e55b9bb91aca19bab46a573713027bac67683fde957d2beb48fe1bf832389635f0c691b55428dd6ca4e07a9 +2327eb5f2e782fe20e93e104b79345bdbfb7992cd2d9d64d2d260a725e42ade68fbce727d42afa0aeb3fe17fcfff00419bbffc11a7ff001ea00eebe2adb7837c +1b6f00b5f0a787dee5e37b999e7b4052081300bb051924b32aa8ee49f4ae074ef10e9fa941e7699f0fb48bcb73cacb0f872e5d587b11c1acfd33c5769f103c7b +61697524ba94b70cd71325e40b04772f044c6dad55031c47bcb39c9f998fb0af31d77c67e27d4b51964d5759bf8e74255a0499e158083ca2c6080a063a60631d +e803da3fb457fe89969dff0084ddcff856c689e37d67408658f44f02c761148c19c5ae83751873d327039f4e6bc97479ede5d074e9db5dbcbdbe991cddacbe25 +5b130386202047524fca15b7670738c0c559f322ff009fbb9ffc2de1ff00e22803d6f50f89de34b9b578e2d1353b463fc569a0dc3cc47fb2652101f720fd0f4a +f11f1769de31f115d21ff84575e86ce17791166b792492491f1be595cafceed8519c000000000569f9b113817b7393ff0053bc3ffc453d594b2817571c9000ff +0084de1193e9f73f9d00717ff08578b3fe858d6bff0000a4ff000ac9d434fbdd2e7fb3ea7677567705432c57311462a4919c1c1ec467d41aeef59d57fb03508a +db59d2bc550c8ca24546f10964953230cacb190ca7d413f8572be37f12ddf8b7c4b79ad6a1fbb96e1808e30c596245185404f500739e32726803b9f867f19754 +f03f86ce8f0db2de40b3bcb1176ff56ad8ca8f6ce4fe345743f093e07a78bbc1d0eb5accb2da9b9918db27237420001b1ee7711ed8a2803eb3af21f8d3f08d7c +650cfa8e8171f61d6d94099379586f957eeaca071b876623d8f1823d7a8a00fce6d7b45d4bc3da9be9fae594f657c99fddcabb770f507a30ef91915409207dd6 +cf655e493e83d4f6afd13f11f87748f12d81b3d7b4eb6beb73d1664c953eaa7aa9f7041af15f137ecdba54d2fda7c2dacdde993ab0758e71e722b0e461b861cf +b9a00f1dbaf87d0f87e5b21abf88aeb4fd67ca8af0c369a45c4e6d9986e51e621c6f1c74c60d74f36b4d70449a8789adefae768469eefc0ef24ae00e3739196f +a9ad3d6fe1f7c6ad3771b6f135dea3129277c1ab3c6c7fe02e40fd6bce759f10fc46d11dd755d7b5db664c839d48b7fe82e6803b03a95b1393abe984ff00d886 +ff00e140d52dc0c0d5f4cc7fd884dfe15e75ff000b07c63ff435eb7ff81d27f8d58b1f1b78eb509d61b2f136b92ccdd145fb8cfe2580a00ef5b53b023fd2ef6c +2eed87facb78fc0cd13cabdd03f1b49e4672319ce78af201a56a534c52df4ad489773e5c7f65958e0f419dbd471cf7af60f0ff00863e34eb912cb69ac6a90c0f +8fdecface001eb85627f0c57a2f87fe1178e6600f89fe246aeb130c3c161732124771bdcf1f80a00f0af1659de68bf0fbc3fa0ebaac35e37d2dddbd893996d2d +9d546c65ea0bb8dc13a800f0335defc1ff008117babdc5beade35824b2d2d4878ec0fcb2dc77fde0fe05f6ea47a77f7ff06fc37f0bf8464371a569c1efdb97beba733dc39f52ed923f0c0aec280190c490431c50a2c7146a1511000140e0003b0a29f45007ffd9}}{\nonshppict +{\pict\picscalex100\picscaley99\piccropl0\piccropr0\piccropt0\piccropb0\picw2646\pich1244\picwgoal1500\pichgoal705\wmetafile8\bliptag-769316105{\*\blipuid d2252af7b60351e8c90b792328f88abf} +010009000003ce1b00000000ac1b000000000400000003010800050000000b0200000000050000000c022f0064000400000007010400ac1b0000430f2000cc00 +00002f006400000000002f0064000000000028000000640000002f00000001001800000000001437000000000000000000000000000000000000ffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6fffffffffffffefefef9f9f9fcfcfcffffffff +fffffffffffefefef4f4f4f7f7f7fbfbfbfcfcfcfffffffefefefffffffffffffffffffffffffefefefafafaf0f0f0e0e0e0bcbcbc9d9d9d8080806b6b6b5353 +533d3d3d2929291616162121212121212121212121212121212121212121212121212222221f1f1f1b1b1b1a1a1a242424414141666666828282808080afafaf +d5d5d5e7e7e7f9f9f9fffffffffffffefefefffffffffffffffffffffffffefefefffffffffffffffffffffffffbfbfbfffffffffffffffffff2f2f2f1f1f1ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f7f7f7fffffffffffffffffffcfcfcfdfdfdf7f7f7fffffffffffffffffffffffff9f9f9 +fffffff8f8f8f8f8f8e1e1e1c9c9c9aeaeae8989896262623b3b3b1b1b1b1515150909090909091212121818182020202424241f1f1f23232323232323232323 +23232323232323232323232323232020202222222525252424242020201919191212120d0d0d1a1a1a1919191e1e1e3131314b4b4b646464919191c3c3c3dada +daf4f4f4fffffffffffffffffffbfbfbf9f9f9fcfcfcf9f9f9fffffffffffff7f7f7fcfcfcfffffffffffffefefeffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffdfdfdfffffffffffff6f6f6f1f1f1fcfcfcfffffffffffffafafafffffff8f8f8fffffffcfcfce5e5e5cdcdcd9494947070704c4c4c2626260b0b0b0000 +000707071a1a1a2222222626261e1e1e2020202323232020202222222323231d1d1d1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1717171a1a1a +1f1f1f2424242727272525252121211e1e1e2020201616161414142121211e1e1e0606060505052121213030305353537b7b7baaaaaadededef5f5f5f9f9f9ff +fffffffffffffffffbfbfbfefefefefefefbfbfbfbfbfbfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f9f9f9fcfcfcffffffffffffffffff +fdfdfdfafafafdfdfdffffffebebebc2c2c27f7f7f4141412828280d0d0d0909090808081414142121212121212020202222221f1f1f1f1f1f1c1c1c21212123 +23231e1e1e2020202323231e1e1e2121212121212121212121212121212121212121212121212828282525252020201b1b1b1818181818181a1a1a1d1d1d2424 +242f2f2f2929291c1c1c1f1f1f2424241e1e1e1919190c0c0c1111110e0e0e1717173838386161619d9d9ddadadafdfdfdffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfcfcfcfefefeffffffbbbbbb8484843d3d3d1414141212 +121212121111111e1e1e1414141313132020202a2a2a2222221919191717171515151d1d1d1c1c1c2121212121211b1b1b1e1e1e2222221c1c1c1b1b1b1b1b1b +1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1515151a1a1a2020202323232222221f1f1f1d1d1d1c1c1c1010101b1b1b1a1a1a1717172222222727271d1d1d14 +14141e1e1e2424242222221616160606060000000c0c0c272727616161b2b2b2f8f8f8fffffff4f4f4f9f9f9fffffffcfcfcffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffff9f9f9fffffffdfdfdf3f3f3ffffffffffffafafaf4747471e1e1e1212121717171d1d1d3030302424240a0a0a3434344242423737373838383b +3b3b3333333131313838383d3d3d3838383737373a3a3a3838383232323636363a3a3a3434343838383838383838383838383838383838383838383838383f3f +3f3d3d3d3939393636363535353535353737373939394242423a3a3a3131313636363d3d3d3636363131313b3b3b3d3d3d3333332f2f2f3737374646464d4d4d +3535351111110000000000002b2b2b8c8c8cdfdfdffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcfffffff6f6f6a6a6 +a63b3b3b1010102020202929291d1d1d2525251818182121211b1b1b1b1b1b7f7f7ff8f8f8efefeff3f3f3fdfdfdfafafaf6f6f6f8f8f8f8f8f8f7f7f7f6f6f6 +f9f9f9f7f7f7f2f2f2f9f9f9fffffff9f9f9f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fbfbfbf9f9f9f7f7f7f8f8f8fafafafcfcfcfbfbfbfa +fafaf0f0f0fafafaf7f7f7f2f2f2fafafafffffffbfbfbf8f8f8f2f2f2f9f9f9fefefef3f3f3ecececf9f9f9f0f0f0cbcbcb8888884848480909090000002d2d +2d797979cbcbcbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffbfbfbf6f6f6fefefefefefefffffffffffff9f9f9fdfdfdfafafaacacac4747470404040808082c2c2c1a1a1a2929291818182929292a +2a2a1e1e1e151515181818444444dededefafafa9494946262627373737878786b6b6b7979797272727f7f7f7474746e6e6e7171716f6f6f7373736c6c6c7373 +737373737373737373737373737474747575757575757171717272727272727373737373737373737373737373737e7e7e6b6b6b7575757474747b7b7b707070 +7676766d6d6d7070707e7e7e7373737a7a7a7474747c7c7c8b8b8bbdbdbdfdfdfdf4f4f48484841b1b1b1212120000001f1f1f727272d1d1d1fffffff4f4f4ff +fffffffffff7f7f7fffffffbfbfbfffffffefefefffffff5f5f5fffffffffffffffffffffffffffffffffffffffffffffffffbfbfbfefefefffffffbfbfbfbfb +fbf7f7f7f6f6f6ffffffcdcdcd5c5c5c0e0e0e0f0f0f2222222323231f1f1f2727272828282626261c1c1c1b1b1b2323232626261c1c1c070707858585ffffff +8080800000000505050000000303030000000505050000000000000a0a0a0a0a0a00000000000009090901010101010101010101010101010101010100000000 +00000101010101010101010101010101010101010101010101010000000000000404040101010000000c0c0c0000001d1d1d0a0a0a0000000202020a0a0a0000 +000000000909091a1a1a2e2e2eb8b8b8ffffff7676761515153939391d1d1d0c0c0c292929848484f4f4f4fffffffefefef5f5f5fffffffffffffefefefafafa +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedededfffffff8f8f8ffffffffffff8a8a8a2525251717172929291e +1e1e1616162121211919192222221313132a2a2a1c1c1c1c1c1c222222242424262626000000292929e5e5e5eeeeeeb7b7b7b9b9b9b3b3b3c3c3c3a2a2a2b8b8 +b8b5b5b5b0b0b0b9b9b9b9b9b9b5b5b5bababaaeaeaeb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b7b7b7b6b6b6b5b5b5b4b4b4b3b3b3b3b3b3b2b2b2b2b2b2b2b2b2 +b3b3b3b3b3b3a9a9a9bdbdbdb7b7b7aaaaaab8b8b8bbbbbba9a9a93333331717172b2b2b2727271c1c1c3131312b2b2b1e1e1e1e1e1e1e1e1e131313aaaaaaff +ffff3737371111110f0f0f202020101010151515565656c8c8c8f0f0f0fffffff2f2f2fffffffffffff7f7f7fefefefcfcfcffffffffffffffffffffffffffff +ffffffffffffffffffffffffffedededfffffffbfbfbfbfbfbefefef4b4b4b1f1f1f1e1e1e1414142222222424242626262e2e2e1f1f1f151515121212212121 +2020202424242121211c1c1c282828252525121212696969c5c5c5cacacac4c4c4b4b4b4bcbcbcc1c1c1b6b6b6c8c8c8d1d1d1d1d1d1c3c3c3c1c1c1cbcbcbbd +bdbdc2c2c2c3c3c3c3c3c3c4c4c4c4c4c4c3c3c3c2c2c2c2c2c2c6c6c6c5c5c5c4c4c4c3c3c3c3c3c3c3c3c3c4c4c4c4c4c4cfcfcfc5c5c5bcbcbcd1d1d1cccc +ccabababddddddcccccc2424241c1c1c161616141414323232202020151515161616101010121212323232e0e0e09393931717171919192323232626262b2b2b +000000191919bababaedededfffffffffffffffffffffffffffffffafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbf6f6f6fd +fdfdd9d9d93333332525251b1b1b2222221b1b1b1616162727272424241818182727272929292c2c2c1d1d1d2121212020202222222525251d1d1d2828282121 +210808080b0b0b0606062626261e1e1e0b0b0b1414141313130707070000000707070909090202020a0a0a090909060606060606070707080808080808080808 +0808080808080707070707070707070606060606060707070707070707070606061111110000000505050000001919190808088a8a8a6969690b0b0b15151533 +33331e1e1e0a0a0a2929291d1d1d1a1a1a1e1e1e0a0a0abcbcbcd8d8d80f0f0f2626261818181c1c1c262626171717222222121212868686f4f4f4fffffff4f4 +f4fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f2fdfdfdf6f6f6e4e4e43030300e0e0e1a1a1a1d1d1d121212242424 +1d1d1d2424242020201f1f1f2d2d2d1212122a2a2a1e1e1e2828281c1c1c1e1e1e2a2a2a1818181d1d1d1e1e1e2a2a2a2e2e2e2929292121211a1a1a27272716 +16161313133c3c3c4f4f4f5d5d5d6565656161616464646262626767676767676666666666666666666767676868686969696262626363636464646565656565 +65656565646464646464666666636363626262717171606060616161616161d8d8d84949491010101b1b1b2b2b2b1616161818182f2f2f181818212121232323 +131313bababaaeaeae2121211010102d2d2d2121211818183a3a3a1b1b1b1919190e0e0e5c5c5cecececfffffffffffff4f4f4fbfbfbffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffd9d9d91414140808081212121212123131312525252323232626262727271717170f0f0f1f1f1f2929291a1a +1a2020202828282222221e1e1e2121212020202222222d2d2d1b1b1b1313132323232020201f1f1f1e1e1e1d1d1d848484e3e3e3fffffff3f3f3ebebebe7e7e7 +e9e9e9eaeaeaecececeaeaeae8e8e8e6e6e6e5e5e5e5e5e5e7e7e7e8e8e8eaeaeaecececeeeeeef0f0f0f1f1f1f1f1f1efefefeeeeeeebebebf0f0f0f8f8f8ed +ededf9f9f9e9e9e9e3e3e37878780d0d0d2020201d1d1d1919191f1f1f2c2c2c212121181818303030000000595959ffffff5555552020201515152626262e2e +2e1f1f1f2525252222221414141a1a1a121212666666ebebebfffffffcfcfcfafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffdadada +2d2d2d2121219090909595953535350f0f0f2525251818182323231818181919192c2c2c2222221e1e1e2121212424241919192828282929291a1a1a27272725 +25251f1f1f1c1c1c1f1f1f232323292929121212161616cfcfcfffffffdedede6d6d6d2b2b2b4343435353534848483f3f3f4b4b4b4949494545454141413f3f +3f4040404141414242423e3e3e4040404444444747474848484747474545454444444545453f3f3f4b4b4b3e3e3e3f3f3f3e3e3e3e3e3e161616262626202020 +1d1d1d2f2f2f1e1e1e1d1d1d191919252525111111383838d1d1d1dddddd2f2f2f1919192121212121211a1a1a1b1b1b20202023232328282822222220202012 +1212808080f0f0f0fffffffdfdfdfffffff7f7f7fdfdfdfffffff8f8f8f9f9f9fffffffcfcfcfdfdfd5757570f0f0f8e8e8efffffffdfdfd8181811515151a1a +1a2626261818182929292a2a2a1d1d1d2828281919192222222222222222222222222222222222222222222222221f1f1f2727271c1c1c111111202020151515 +969696ffffffa9a9a91a1a1a0e0e0e1515151919191010102b2b2b0b0b0b2222221515150404041919191515150d0d0d1e1e1e11111118181818181818181818 +18181818181818181818181818181515151515151515151313131212121414141919191d1d1d2424241b1b1b1919192424242323231111111616163434347373 +73e3e3e3d4d4d45050500909092525252323232929291616162a2a2a2626262525252929290d0d0d242424131313111111abababfffffffffffffffffff8f8f8 +ffffffffffffffffffffffffffffffffffffa1a1a10202022121219f9f9f505050696969ababab1515152f2f2f0c0c0c1c1c1c0606061010101111111a1a1a0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f1616160606060e0e0e2d2d2d161616313131edededdedede1919191111112828282626262626 +262222222222222020201616161f1f1f6d6d6dc3c3c3b7b7b7b5b5b5c5c5c5c1c1c1bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbcbcbcbdbdbd +bdbdbdbbbbbbbabababbbbbbbfbfbfc2c2c2b6b6b6c1c1c1c7c7c7c7c7c7c1c1c1b7b7b7c1c1c1dadadadcdcdc9f9f9f4040401313131717172525250d0d0d1d +1d1d3131310f0f0f1919192f2f2f0f0f0f1818181c1c1c2929290d0d0d353535d5d5d5fffffffffffffbfbfbfffffff6f6f6fffffffffffffdfdfde4e4e43a3a +3a2020201313137373734b4b4b4949499090902222221010103b3b3b3636363d3d3d3b3b3b4444442a2a2a393939393939393939393939393939393939393939 +3939393939394343434343432929291f1f1f090909777777f2f2f27b7b7b1e1e1e2f2f2f2121211515152525253131311515152020202222223c3c3cf2f2f280 +80804545455353534f4f4f4444444747474747474747474747474747474747474747474747474949494949494a4a4a4949494747474848484949494b4b4b4c4c +4c4c4c4c4242423f3f3f4e4e4e5555554b4b4b4242422323230000001010103131310f0f0f1515151f1f1f2424241d1d1d2525251b1b1b2323232121212d2d2d +1c1c1c1d1d1d242424000000868686fefefefffffffffffffffffff4f4f4fffffffbfbfbfcfcfc9b9b9b1313131414142727278e8e8e4747474646469e9e9e0e +0e0e575757dcdcdcc4c4c4ccccccd5d5d5b9b9b9ccccccc8c8c8cbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbbcbcbcbebebededede7676761313 +13686868f9f9f96e6e6e0d0d0d1414143535352e2e2e0505051b1b1b2d2d2d2727270b0b0b535353f7f7f73131311010101a1a1a090909202020181818181818 +1818181818181818181818181818181818181919191a1a1a1a1a1a1a1a1a1919191818181818181818181313131f1f1f1c1c1c12121214141417171714141415 +15152222222a2a2a2626262020201d1d1d2e2e2e1d1d1d2020201010101a1a1a3434341818182121212020201d1d1d2828282121211a1a1a282828d7d7d7fefe +fefffffffbfbfbfafafafefefef8f8f8fafafa4848480c0c0c1d1d1d2c2c2c8484844e4e4e4a4a4a8f8f8f1818182e2e2eb2b2b27272724949494a4a4a3d3d3d +5555553f3f3f4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4444444242427f7f7fe2e2e2292929262626e8e8e89d9d9d0c0c0c2626261b1b1b01 +01012828282929291212122626262020201a1a1a9c9c9cf9f9f9cacacaaeaeaed3d3d3c8c8c8cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcccc +cccccccccccccccccccccccccccccccccacacac9c9c9c6c6c6cdcdcdccccccc9c9c9cacacac8c8c8cbcbcbd6d6d6c2c2c2c0c0c0d3d3d3d9d9d9bbbbbbcacaca +d2d2d2dededebbbbbb2020201313131a1a1a2828283131312020201010101313132d2d2d040404989898fcfcfcfffffff7f7f7fffffffffffffafafae7e7e717 +17172020201414142121218080805050505656569595951616161a1a1a8181818080801313138f8f8fa8a8a8a0a0a0a9a9a9a2a2a2a2a2a2a2a2a2a2a2a2a2a2 +a2a2a2a2a2a2a2a2a2a2a5a5a58f8f8f030303b4b4b4919191010101a6a6a6ffffff6b6b6b2020201d1d1d2b2b2b2a2a2a2323232626261e1e1e070707252525 +1f1f1f3434343c3c3c4a4a4a5656563838384141414141414141414141414141414141414141414141414141414040403f3f3f3f3f3f4040404040403e3e3e3c +3c3c4a4a4a4242423939393d3d3d4848484545454040404646464b4b4b5757573c3c3c3737374a4a4a4c4c4c414141818181f9f9f99191911010102e2e2e2424 +240909092323231d1d1d2222222323231919194a4a4afcfcfcfffffffcfcfcfffffffffffffafafabcbcbc0f0f0f1010101818182525258585854a4a4a424242 +9191911e1e1e0f0f0f333333b0b0b0212121c0c0c0f4f4f4f9f9f9fffffffefefefefefefefefefefefefefefefefefefefefefefefeffffffffffff7070703c +3c3cececec1d1d1d363636cfcfcfffffff8e8e8e3636361d1d1d0d0d0d1818181313131919191b1b1b0e0e0e1515151010102020201717170a0a0a1313131111 +111111111111111111111111111111111111111111111313131212121010101111111212121313131111110f0f0f0f0f0f1a1a1a1d1d1d191919111111080808 +0c0c0c1e1e1e0a0a0a1212121818181616160707071212120e0e0e232323d4d4d4e1e1e12525250e0e0e2c2c2c1212122929292020202424241a1a1a23232316 +1616fdfdfdfffffffffffffcfcfcfffffff8f8f89696961717171f1f1f2929291f1f1f8484845252524848489f9f9f2222221919190808088d8d8d8282822e2e +2efdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9ffffffeaeaea212121a5a5a5a0a0a0000000343434adadadf9f9f9 +fafafacecece969696a6a6a68e8e8e9f9f9f999999a4a4a48a8a8aa2a2a28b8b8b9e9e9e9a9a9a99999999999999999999999999999999999999999999999999 +99999d9d9d9b9b9b9999999a9a9a9c9c9c9d9d9d9c9c9c9a9a9a9696969a9a9a969696969696a0a0a0a1a1a19b9b9b9a9a9a9797979a9a9a9797979999999999 +99a3a3a38b8b8b8d8d8df1f1f1f9f9f99999991111112020202727271515152a2a2a1414142e2e2e2626261e1e1efffffffffffffafafaffffffffffffffffff +8888881717171b1b1b1b1b1b2323238888885e5e5e4545459595951717172020201b1b1b363636c0c0c02d2d2d9b9b9bfbfbfbfffffffffffffffffffffffffb +fbfbf5f5f5fffffffffffff7f7f7fcfcfcffffffffffff808080434343d1d1d14040400606061010105353539e9e9ec7c7c7d5d5d5dededee3e3e3e3e3e3dddd +dddddddddddddddddddddddddddddddddddddddddddddadadad4d4d4ecececdbdbdbe1e1e1f0f0f0d0d0d0dfdfdfe1e1e1e5e5e5e6e6e6dddddddbdbdbdedede +dddddde7e7e7dadadae5e5e5dcdcdcdfdfdfdededee5e5e5d3d3d3d5d5d5dededededededededededededededededededededededededbdbdbbababac5c5c50e +0e0e1d1d1d1d1d1d1c1c1c2626261717171e1e1e1e1e1e252525fcfcfcfffffffffffffffffffefefefafafa9d9d9d1d1d1d2121211c1c1c2828288888884d4d +4d474747a2a2a22222222323231616160909098e8e8e7d7d7d414141eeeeeefffffffdfdfdf0f0f0f5f5f5fffffffffffffffffffefefefffffffbfbfbffffff +ffffffeaeaea1d1d1d8989898484840404040c0c0c0909090303030303031010101d1d1d1c1c1c1212121b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b +1b1b1e1e1e1d1d1d2121211b1b1b1c1c1c1a1a1a1212121f1f1f1414141818181212121818181414141e1e1e3636362323232828282323232323233535352828 +283a3a3a2323233838382c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c1c1c1c2a2a2a2929291919192a2a2a1e1e1e1d1d1d2525252727271c1c1c +222222212121fcfcfcfffffffffffffffffffcfcfcfbfbfbbababa1a1a1a1c1c1c1616161818188f8f8f4e4e4e464646a8a8a81e1e1e2525251e1e1e1818183d +3d3dc4c4c41e1e1ea4a4a4f5f5f5fffffffffffffffffffffffffafafafbfbfbfffffffffffffefefefffffffdfdfdffffff6f6f6f404040adadad8383838282 +827676766a6a6a6b6b6b7272727575756e6e6e6565656e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e7878787070705b5b5b6767677575756c6c6c +6b6b6b6666667474746b6b6b7272727070707d7d7d6363631b1b1b1414141717170d0d0d0909091919191919190d0d0d30303016161617171717171717171717 +17171717171717171717171717171212122828280707071d1d1d2020201f1f1f1c1c1c1b1b1b2727271a1a1a2222221e1e1efffffffcfcfcffffffffffffffff +ffffffffd7d7d72020201414142222221515159292925c5c5c4040409a9a9a2323231d1d1d1e1e1e272727131313a5a5a5797979424242f5f5f5f0f0f0fefefe +fffffffafafafdfdfdfffffffdfdfdf6f6f6fefefeffffffffffffefefefe3e3e33737374b4b4b7575757d7d7d7878787676767878787575757171717575757d +7d7d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6b6b6b7474746c6c6c6f6f6f6f6f6f6464646868686d6d6d6464646b6b6b6565657c7c7c8686 +86a2a2a2c9c9c9a1a1a14040402424242323231515151e1e1e1616161a1a1a1515151f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f2323231b1b1b +2727271b1b1b2f2f2f3737372222222828281f1f1f1f1f1f1c1c1c3f3f3ffffffffbfbfbfffffffefefefcfcfcfffffff3f3f35555550c0c0c2d2d2d1313139b +9b9b5b5b5b303030b1b1b1151515252525262626161616222222414141c1c1c1222222a7a7a7fffffffffffff3f3f3fafafafffffffffffff9f9f9ffffffffff +fffffffffefefefdfdfdfefefeb4b4b47171717272727676766a6a6a646464676767696969656565646464686868707070707070707070707070707070707070 +7070707070706f6f6f7171717575756f6f6f7777777e7e7e7676767c7c7c8686866c6c6c6e6e6e6161614f4f4f2e2e2e323232969696e3e3e395959517171712 +12122929292828282323232b2b2b1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f3333330f0f0f2f2f2f1c1c1c2d2d2d2222220707071c1c1c2525 +251c1c1c1616168b8b8bfffffffffffffffffffffffff4f4f4ffffffffffffababab0c0c0c1010101d1d1d8282826060604e4e4ea2a2a21a1a1a181818212121 +1d1d1d202020141414a0a0a07c7c7c282828f1f1f1fffffffffffff9f9f9fdfdfdfbfbfbf9f9f9fffffffdfdfdfefefefafafafffffff3f3f3ffffffffffffed +ededf9f9f9f7f7f7fcfcfcfffffffffffffffffffffffffffffffdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfffffffffffffffffff8f8f8fefe +fefffffff3f3f3f8f8f8f8f8f8fffffffffffffffffffcfcfcd3d3d3959595282828363636c0c0c0b9b9b92525251616161c1c1c151515171717232323232323 +2323232323232323232323232323232323231c1c1c1b1b1b1a1a1a1919191b1b1b2525252a2a2a2e2e2e2727270b0b0b272727d1d1d1ffffffffffffffffffff +fffff4f4f4ffffffffffffeaeaea565656000000303030c7c7c73636360c0c0cf2f2f23e3e3e1313131212122424241313131e1e1e545454d7d7d73232327f7f +7fc5c5c5e2e2e2d2d2d2d5d5d5dbdbdbd1d1d1cccccccfcfcfd6d6d6d6d6d6d2d2d2d1d1d1c4c4c4d7d7d7dadadad2d2d2d4d4d4d5d5d5d3d3d3cfcfcfcfcfcf +d4d4d4dbdbdbd7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d2d2d2dddddde4e4e4fefefefffffff5f5f5fcfcfcfffffff8f8f8fffffffffffff4 +f4f4fffffffffffff2f2f2eeeeee676767181818bfbfbfa5a5a50a0a0a1414142b2b2b3131312121212121212121212121212121212121212121212121211010 +102c2c2c2323232525251c1c1c2626262f2f2f1313131f1f1f0f0f0f757575f8f8f8fffffffdfdfdfcfcfcfffffffcfcfcfffffff8f8f8fefefeafafaf232323 +b5b5b5a2a2a2272727191919787878f5f5f55555552929291b1b1b262626181818161616bebebe9191911919193434342e2e2e2020202e2e2e33333327272729 +29292e2e2e2929292020201c1c1c3030302c2c2c2323232a2a2a2727272929292a2a2a2b2b2b2d2d2d2e2e2e2b2b2b2525252a2a2a2a2a2a2a2a2a2a2a2a2a2a +2a2a2a2a2a2a2a2a2a2a2626261d1d1d1a1a1a8d8d8df1f1f1fefefefffffff5f5f5fffffffdfdfdf9f9f9fffffffffffffcfcfcfffffffffffffdfdfd7b7b7b +252525e1e1e14343431111112121211818182222222222222222222222222222222222222222222222222626261d1d1d2323232323232626261a1a1a26262620 +20201a1a1a2a2a2ad1d1d1ffffffdcdcdccececec6c6c6cdcdcdd3d3d3d0d0d0cdcdcdcececec9c9c9b3b3b3a3a3a32d2d2d1111111f1f1f272727777777b3b3 +b3afafafa1a1a19d9d9d919191979797bebebecccccc9b9b9b9b9b9b9191918e8e8e9999999292929c9c9c969696979797979797979797979797979797979797 +979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797949494acacac8a8a8a18 +1818c9c9c9f8f8f8fffffff9f9f9fefefefbfbfbfffffffffffffbfbfbfffffffffffff3f3f3f8f8f8ffffff3838389494948888880808082020202424242323 +232121212121212323232020201d1d1d2121212727271e1e1e2323231e1e1e2121211717171b1b1b2424242121210a0a0aaeaeaefbfbfbfafafa1f1f1f121212 +0c0c0c1111111717171414141212121313131f1f1f1010100e0e0e2222222929291c1c1c1d1d1d0101011212121d1d1d3232322424243333333434340909091e +1e1e1616161f1f1f1c1c1c2a2a2a3232322525252828282f2f2f2626262626262626262626262626262626262626262626262424242424242424242424242424 +242424242424242424242424242424242424242424242424242424242424242424240c0c0c959595ffffff6161616d6d6dfffffff1f1f1ffffffffffffffffff +f1f1f1f8f8f8fffffff5f5f5ebebebfffffff9f9f9fafafa828282515151a7a7a70f0f0f1717172424242626262323232121212222222020201c1c1c1a1a1a1d +1d1d1919192020202626261d1d1d232323151515222222111111818181e6e6e6ffffffffffff6666665c5c5c5656565b5b5b5f5f5f5d5d5d5b5b5b5c5c5c4949 +494d4d4d3333330202021b1b1b3a3a3a1010102828285757575f5f5f4f4f4f5757574b4b4b4d4d4d717171565656696969616161616161545454565656585858 +4e4e4e5454545a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a59595959595959595959595959595959595959595959595959595959595959595959 +59595959595959595959595959595b5b5b949494cccccc262626aaaaaafffffffffffff3f3f3fffffff9f9f9fffffffffffff4f4f4fffffffffffff5f5f5ffff +fffdfdfd535353757575ababab0909093b3b3b1111112222222020202020202323232525252222222121212121212d2d2d1e1e1e242424252525272727313131 +000000565656e6e6e6fffffffffffffffffffffffffffffffbfbfbfefefefffffffffffffefefefffffffffffff2f2f2c3c3c35151511b1b1b222222242424c2 +c2c2c1c1c1555555444444606060585858555555515151454545c5c5c5d2d2d24e4e4e5656564747474848484e4e4e4a4a4a4747474747474747474747474747 +474747474747474747474646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464c4c4c4b4b4b +242424454545e8e8e8f7f7f7fffffff5f5f5fefefefdfdfdf5f5f5f8f8f8fffffffefefef6f6f6fefefefcfcfcc6c6c61f1f1fa9a9a96161610101012121211b +1b1b1c1c1c1d1d1d2020202323232323232424242525252727271313131f1f1f1515151e1e1e2b2b2b000000656565e6e6e6fffffffefefefafafafcfcfcffff +fffdfdfdfbfbfbfcfcfcfefefefdfdfdfdfdfdfefefef4f4f4ffffffffffffdcdcdc2626260404049a9a9ad1d1d12020201414141c1c1c1a1a1a171717131313 +0c0c0c1e1e1e656565e5e5e50c0c0c3d3d3d7b7b7b6a6a6a7d7d7d67676773737373737373737373737373737373737373737373737371717171717171717171 +71717171717171717171717171717272727272727272727272727272727272727272727272726363636d6d6d7d7d7de7e7e7f6f6f6fffffff6f6f6fffffff9f9 +f9fffffffffffffffffffefefefbfbfbfafafaffffffc8c8c82323236b6b6bd7d7d72020203737371a1a1a2727271d1d1d2121212323232121211d1d1d1d1d1d +2020202424241b1b1b3030301414141c1c1c040404757575f6f6f6fffffffffffff9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffff0f0f0ffffff4c4c4c313131cdcdcd3d3d3d0808082929291f1f1f2222221d1d1d1f1f1f3434340e0e0e181818c6c6c68989892d2d2defef +effffffffffffffbfbfbfefefefefefefefefefefefefefefefefefefefefefefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffcfcfcfbfbfbfffffffffffffffffffdfdfdfbfbfbfafafafffffff3f3f3f8f8f8fbfbfbfefefeffffffdfdfdf81 +81812b2b2b686868e8e8e83030301e1e1e0f0f0f2d2d2d1818181e1e1e2323232525252323232020202121212323232424242d2d2d1212121e1e1e121212a4a4 +a4fffffffafafafbfbfbfefefefafafafffffffffffffafafafcfcfcfdfdfdfcfcfcfafafafbfbfbfcfcfcfdfdfdfdfdfdfcfcfcfbfbfbffffff5e5e5e222222 +dbdbdbb1b1b14747470404041e1e1e3232322222221d1d1d1818183535351a1a1a696969e3e3e3202020969696d1d1d1d7d7d7d7d7d7d5d5d5d5d5d5d5d5d5d5 +d5d5d5d5d5d5d5d5d5d5d5d5d5d5d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dede +deeaeaeacdcdcdc7c7c7d5d5d5d0d0d0d5d5d5d6d6d6d5d5d5e4e4e4dbdbdbcbcbcbaeaeae6464643030303e3e3ea0a0a0b5b5b54a4a4a262626272727232323 +2626262020201e1e1e2121212323232323232626262828282323231c1c1c242424000000363636d1d1d1f6f6f6f5f5f5fffffffffffffcfcfcf8f8f8fffffffc +fcfcfefefefffffffffffffffffffffffffffffffffffffffffffbfbfbfffffffbfbfbf7f7f75858581c1c1cfbfbfbfdfdfdcdcdcd7e7e7e1010100000002727 +272727271d1d1d1a1a1a1d1d1d222222d3d3d39b9b9b3131314f4f4f414141424242454545454545454545454545454545454545454545454545424242424242 +4242424242424242424242424242424242424343434343434343434343434343434343434343434343434444442c2c2c5252523b3b3b35353544444454545446 +46464141413838383f3f3f464646474747636363989898bcbcbc9696964141411515151616162121212929291e1e1e1e1e1e2222222121211f1f1f1f1f1f2424 +242323231515150505051c1c1c9a9a9ae0e0e0eeeeeefffffffffffff5f5f5fefefefffffffbfbfbfffffffdfdfdffffffffffffffffffffffffffffffffffff +fffffffffffffbfbfbfffffffffffff4f4f45050502e2e2ee0e0e0ffffffffffffffffffc3c3c35252520c0c0c1111112121211919192e2e2e181818545454bb +bbbb7e7e7e8383837373737979797878787b7b7b7e7e7e7d7d7d7b7b7b7979797676767474747676767b7b7b7c7c7c7979797878787d7d7d8282828282827878 +787979797b7b7b7d7d7d7d7d7d7c7c7c7b7b7b7a7a7a7e7e7e7d7d7d7c7c7c7c7c7c7d7d7d7d7d7d7c7c7c7a7a7a7575758383837f7f7f797979959595aeaeae +8181813838380505051b1b1b2626262323232424242323232020202222221919191a1a1a151515262626282828000000131313767676d0d0d0eeeeeeffffffff +fffffafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcfbfbfbffffff5656 +56272727f4f4f4fffffffefefefafafafffffffbfbfbbdbdbd5d5d5d1f1f1f1212120d0d0d2323231c1c1c2020202e2e2e3c3c3c1d1d1d2c2c2c3030302f2f2f +2b2b2b2828282828282c2c2c3232323636363030303535353737373434343232322f2f2f29292922222230303030303031313132323233333333333333333333 +33333030302f2f2f2c2c2c2a2a2a2a2a2a2e2e2e3434343939393535352e2e2e3030303636362727270e0e0e0c0c0c1e1e1e2323232020201414141414142323 +232828281e1e1e1616161b1b1b3d3d3d2626260000002020206e6e6ebfbfbffdfdfdf4f4f4fffffffffffffffffffafafafffffffffffffefefeffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef4f4f4ffffff5b5b5b1c1c1cf4f4f4f3f3f3ffffffffffffffffffed +ededffffffffffffc4c4c46161612424241111111616160909091919191b1b1b2121212525251717171818181c1c1c1f1f1f2020202020201e1e1e1e1e1e1717 +171717171616161616161a1a1a1f1f1f2020201e1e1e1a1a1a1a1a1a1919191818181818181818181919191919192020202121212020201d1d1d181818151515 +1414141515150f0f0f1010101111111414141b1b1b2121212020201b1b1b2222222525252222222222222525252020201b1b1b2121210f0f0f1616163434347d +7d7dd2d2d2fbfbfbfefefefffffffffffffffffffffffffcfcfcfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffdfdfdfffffffffffffdfdfd4545450d0d0de4e4e4fffffffffffff8f8f8fbfbfbfffffffffffff7f7f7f8f8f8ffffffe7e7e7757575 +5757573535351717170c0c0c2121210606062323232222222222222424242323231d1d1d1818181717172929292727272323232020201f1f1f21212122222222 +22222424242424242323232222222121211f1f1f1e1e1e1d1d1d1c1c1c1d1d1d1f1f1f2121212222222323232323232323232a2a2a2828282828282727271f1f +1f1818181e1e1e2a2a2a1717172020202121211a1a1a0f0f0f080808171717353535616161909090d5d5d5fffffffffffff7f7f7f7f7f7fffffffefefefbfbfb +fafafafefefefffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafafffffffffffffe +fefe9d9d9d838383f3f3f3fffffffffffffdfdfdfcfcfcfffffffffffffffffffdfdfdf8f8f8f8f8f8fefefeffffffc9c9c99090905a5a5a3030301919190b0b +0b0b0b0b1010101c1c1c2424242525252626262828281616161a1a1a2222222727272828282424242020201e1e1e212121222222242424242424232323222222 +1f1f1f1e1e1e2d2d2d2727272121211e1e1e1f1f1f2121212020201f1f1f1d1d1d1a1a1a1818181c1c1c2424242929292323231a1a1a1a1a1a1414140c0c0c16 +1616373737616161979797c7c7c7fcfcfcfffffffffffffffffff7f7f7fffffffffffffcfcfcfffffffffffffffffffffffffffffffffffffdfdfdffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbfdfdfdfffffffffffffffffffffffff0f0f0fffffffefefe +fffffffffffffdfdfdfafafafffffffffffffefefefffffffffffff4f4f4ffffffffffffc5c5c5ababab7474745555552f2f2f1414140606060606061111111f +1f1f2323232121212121212323232222221e1e1e1b1b1b1b1b1b1d1d1d1e1e1e2020202222222323232323232323232222221a1a1a1a1a1a1c1c1c2020202323 +232323232020201d1d1d1818182c2c2c2f2f2f171717030303070707111111131313353535555555828282b6b6b6e4e4e4f8f8f8fffffffffffffffffff7f7f7 +f9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffdfdfdfffffffbfbfbf1f1f1f8f8f8fffffffffffffdfdfdfffffffffffffdfdfdfbfbfbfffffffffffffbfbfbffff +fff6f6f6f9f9f9f6f6f6fffffffffffffffffffdfdfdfbfbfbeaeaead4d4d4bbbbbb9595956464643c3c3c2828282020201313130808080a0a0a121212181818 +1c1c1c1f1f1f1c1c1c1c1c1c1b1b1b1b1b1b1c1c1c1e1e1e2020202121212525252727272727272222221818181111110e0e0e0e0e0e1c1c1c0707070b0b0b32 +32325a5a5a767676999999bcbcbcd0d0d0e9e9e9fcfcfcfffffffffffffffffff9f9f9fbfbfbfffffffffffffefefef3f3f3f7f7f7fffffffffffffdfdfdfcfc +fcfdfdfdfbfbfbfafafafcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9 +fffffffffffffffffffffffffffffff8f8f8fffffffcfcfcf9f9f9fbfbfbfffffffffffffffffffefefefffffffffffffffffffafafafffffffdfdfdfefefeff +fffffffffffbfbfbfcfcfcfffffffffffff9f9f9eeeeeeebebebd7d7d7b9b9b99696967d7d7d6969694f4f4f3333332222222626262323231f1f1f1b1b1b1b1b +1b1c1c1c2020202222221414141a1a1a1f1f1f2424242f2f2f4949496c6c6c868686959595b9b9b9dadadae6e6e6efefeffdfdfdfffffffffffffafafaffffff +fffffffafafafbfbfbfefefefefefefffffff8f8f8fffffffffffffffffffffffffdfdfdfafafafffffffffffffffffffffffffdfdfdfffffffffffffffffff7f7f7ffffffffffffffffffffffff0400000007010100030000000000}} +\par }\pard \qc\widctlpar\adjustright {\b\fs72\lang1033 +\par +\par }{\b\fs36\lang1033 {\*\shppict{\pict{\*\picprop\shplid1026{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibName}{\sv \'44\'3a\'5c\'d0\'e0\'e1\'ee\'f7\'e8\'e5\'5f\'e4\'ee\'ea\'f3\'ec\'e5\'ed\'f2\'fb\'5c\'53 +\'50\'52\'49\'4e\'54\'45\'52\'5c\'53\'70\'72\'69\'6e\'74\'65\'72\'20\'70\'69\'63\'74\'75\'72\'65\'73\'5c\'53\'70\'72\'69\'6e\'74\'65\'72\'5f\'6c\'6f\'67\'6f\'2e\'74\'69\'66}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn pictureGray}{\sv 1}} +{\sp{\sn pictureBiLevel}{\sv 0}}{\sp{\sn fillColor}{\sv 268435473}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw10583\pich5027\picwgoal6000\pichgoal2850\pngblip\bliptag1887078077{\*\blipuid 707a86bd44206243c41e357a6f4bf32f}89504e470d0a1a0a0000000d4948445200000190000000be0802000000940cce690000000467414d410000b1889598f4a60000200049444154789cecdc69901c +f579c7f1dfbf8fe939f6d01eac565a091dab954048e8408e0c81e208a7c10eb643b0e3c490544c552e27850bbb48d9a9bc482595e29d53e594e18de31c65bbec +1003c10611288491142124a173a55dedcede3b3bf7d9e7ffffe4c5aef08a43415aedcef6eaf9bc9156aa9d7ebaa7e73b3d3d3d2388088c3116065abd07608cb1 +4f8a83c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c642 +8383c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c64283 +83c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383 +c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383c5 +180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d030ea3d005b0a6c1f87c6f05f87fcea64feeb0f5a9bd735d77b22b634f111 +16bb02fa0a783b85916ced64eff0c163234aa97a4fc496260e16bb020e8f60701cc9fef4a913c73ca72ca5acf7446c69e260b12be0e400ce9cc540d22964c6d6 +ae880b21ea3d115b9a3858ec0a383d844c06e5b2addcd40d1b3a0c83cf8db279c1c16273954ca35c41b5624b27bb696d5b2c6ad57b22b66471b0d85cf5a7e006 +f09c2abcfc969e4e3ebc62f38783c5e6aa3f8540c2771df28a5b37ae3439586cde70b0d85c9d9b02019e1f905fde76fd2ac334eb3d115bb238586c4e8868300d +5d872f350aaa5b36aee097846cfe70b0d89c642ba84998a6f283a0a3256e57b27c4d039b3f1c2c3627c379118b434121b01be3faa1a3bdf59e882d651c2c3627 +a31544e3703c08559bc8da4319ddf7fd7a0fc5962c0e169b939403a9902f4223d745b300150a857a0fc5962c0e16bb7cffbe1f7d39a4d3c81785a9294d377ff0 +b37d159b3ff9cce60b078b5d0e228c64e9a444d5c1b921d45c52d64a2dd234e55d7bf2bd83f59e8e2d591c2c76c96a2ede1ac0b303c2b671ba17993c48911451 +33dae41bad4fff207be0e07bf59e912d4d8288ea3d030b8d5c59bd334847f27a25825a15274fe09df7a858252232a96279c3b0477ccfbd6b0bfded1f6dd8b9fd +065dd7eb3d325b5238580c4424a5f47d4f4a397b77100202625aa5527ea53771a4d2803834423e87f78ea32f49151b52418034041194626a520bca81942d46f6 +89fbcc2fdcd57d4d4787aeeb02c0cce5590b70951681400011e9ba6e5996c917df2f151cacab5db6865353d8d78f5303c8e5e1b9fef4f7856a9aa6e986658958 +1cd10658cd8858208253c5c933181842a1a2fc40a8f3bb8f0069f02dadda28d2a62685a6e94634662161699615334c4bd70da169c0bc5f58aa9492816fd7cac5 +dc64544d7efd8bd7fece3d1b9b1af83b249602fe14c5d5ee27479105266d0c6490cfc3f7cdd94f6104488222488940c2f5e0fae4072415145d101e8290301dd5 +e893a5c3d5856f04a848b3e05ba617310c53d3b030d7c013410611dff1ed7ccd2ba45efb55f1b1dfdeb2100b66f38f8375554b1564eff1c2c15385e4e854a1a6 +4925881466154b0042902684a6ebc288c268545a13441c300534fac0eb3b524481948ef44b08ca500e484dbf181400b060c7f244d2273763d6ce6c5c29eedcf9 +295de34f0b2d111cacab5a638c7eef3703b39cccf61ecd8e8cfb9e0ba25f9745688006cd846e418f0b33a1471acd785b34b1ca8faef745a38271be59249427fc +1c4a27297f84bc02822ad4ec5b13e78faf2eaf1d9ffcb7085020658a60ddeaa6c71ebaed8b9ff98dcb5a225b8cf81cd6d58e886ab55a3a9dcee7729ee75df07f +e74fbaeb869ece16fee3c5c32f1ca855c42aaba14d6f58e347d6786894300429a16cd492943d40a5337033a6cadcb2b5fdf7bf70c7f5d76dd0a63b252ef794fb +f9dfbbc82fd2fb7fd2af7fd475bdadad6dc58a15f178fc5297c93ee0b5d73ef82f1b36a0bf1f77df3df3e3d1a300b07dfbbc4fb21482359647328bb11c863318 +c9c2f5904c235d42f0a12baee311742f473c82a881ee0e6a4d049dcd6a578fd9d2c0d7a3fdff822078f995d79f7e6eb43fdb186f6ca3d8b5b6e8086041da289f +a2cc7e2af70b67ec2b9fd9f8e49ffdc1961b36f37b734bc633cf00c09e3d0070cf3d33fff8cd6f62cf9e9966b5b662d72ebcfaeabc4f12d660a52b3890447f06 +27a750711004083cf81ea404cdead4473e2f2b852080e7c1b561db9eebd4d6b6fb0fec346edf6a6d5b1f33743edf71317bdf7cf3f37f9772a9c9b2a28eb9ca55 +512af7a9f45ed446e2c1d04b3ffc9bdb6ebd79697c25d66411bf7cd7ffe14b67feeae1e6076ee9328dabfd596d3a5b4f3d35f3f7fe7e00f8fef7f1dc73387408 +83830b11ac90ed58bec2b149bc3d8c13695080c087ef42ba70aa4865502aa3e6c00b54204911d4ecb33142681a0c5d444c6199884610331131a0c5cc88119f2c +fbfffc8afddd9fa7ae5fe93d76cfb22fddb5bcae6bb9a8ddb863d767b7fecb8fdf85439e2a1f86efa8d280b0c7bb9acb6ffce47b1b7a7aea3de09c28c2581107 +92d83780e3e754f26cce4e8db4249ab8561fb66103f6ec4132893d7bf0c82378eeb9855868688225098305bc3c88a1123c1b7e0db90c86c791caa05455ae4f52 +098200290105920201488ae9f31a42001a844ec22061d0f4cf1a999a8a452811a14444442386a0e8f121efc9ef0dffec8df16f7f75ddb69e65f55ee9c5a8216e +3dfcd0dd3f3db8df0b02e51595938597dbb9a9e9bbdf793cbcb5f224860a38388ae353c8d5e07b2866514c578ba9b33dad4e633c340f9305f6b5afe18927b063 +075a5a166889e1b8274a2ef6a5f0ce144a656426d1770ec91194aae4fa24150800491194353725aa43648f20a84cbf3d3f731a161a345dd32ddd8c69b14e9158 +a7229d120957e94e204ab632342da28b84a122a6257df39583d952b9fcedc737ddb69d0fb53ec8308ccea6e0ce1b23af1e71497a249d845efdfcbdbb77efde5d +efd12ec754156f8fe3580e551f6e0db5328a798c8e6364ccaf64534e6162fd0df1c644a4de632e528f3c826f7d0bcf3e3bf3f27001842058aec47f0fa3b78062 +0e478ea2f71c8a65f22529122008929a2cc31ea1fc61654f742cd3bbbb9bb6f6ac59bda2d98ae8004d5f4bd43f921f9daa9d19ae8e6587949335131d7a625d60 +2c97222e499752f3a45ef5cc8888c4e0eb46e9cdc3539dcdaaa325b269cd423d7784c7a7776d7e71d7e67a4f71654c54316cc323d8259ce9c5b921e48a64bba4 +a4128e27bd5af7aacec644b4de632e5e0303003858b3bcdc875359647378f32d0c8d93ed41110001228140c8126ac9477795eedfbdf3ee9bd775b6376a17bd4a +f0f460ee8d4393fff4d3c189fc59cdaa054667a0254818048da0b914f5a8cbd41451eadf5e3cfe5b37b5ae5ede108ff2bb5d4b96ad50a8223b8937f76174921c +6ffadc0234824e024a76af6e6b48f0c77a168b45fd2e2101b90afee205583ade3d8abe2172fd59974b93d2542d46e997bed374c7cef64bb859422a6f7feea9b7 +4f0d5695de20f5668241334bd4214c521e4a27357be84bf7acf9d767be7ca5578b2d1692b077143f3a84bdfb901cbb60ef12e419de78acbcffe7cfdc7ec7aeae +7a4ec96659d44758151baf1e476a04be87c929f892667d168404e4b2b87cfcf6864baa150021704d73f41ffff4c6dffdeb5f95ca632a1820e591f24949900449 +5201a4ab824a5fbfaa549d862bfa8a402ae4aae84b61b280aa03452005256119aa7bb9ea68c6face05ba536c1f03698ce6902e424a48094b97eb3b544733ba57 +2ca2834ac747328b741923192805a5400439bdc53ae6b4c52a1ec6d2387602632978c1ecbd0b02027aac67d396a6c62b76dda9ed239941ba84e1eccc5a00c0f9 +7559d3a61aa2b47dfd826e79dbc7b9298ce6902e414ac8802c43765fa33a96a17bc5623c73b7a883e5077264dc191b0a14f4c0d341115cb04ba1549593791acb +b85ded9776d0aeeba2b5c9baeba68ee7ffa7a0029ba443d26b8a6bebbb1aaf69b1a002280f3271cbceb58562f9e382952ce0f9d3d83f804216a5025c0732800c +10f8d2f7bd6d6bd5939f8bdcb67966ff1bcee3e030060a18caa35483e7c2f710f8080204017c1faea3d935726c376e963ed54df76e37775f17eb6abf84dd7730 +8fe74fe3c0e085f34828052569c73afce583e2e68df025fa3378bd1fc7265076e07b701db80e9c1a2a6555cce54bb989b658f5a14f377fe5be55db7b9aa76f7c +bc8ad7467074124e159512aa653836ec1aca452f3b95ca8cf7dd7da3f8873fb971d3bab68f1b6f7a731d48a29045290fd741104006f03de9b9f6f635ea1b0f47 +6fbb61e641527470660ac727717a0aa9329444e05fb0c53c0faea3393639b6d31a2f6f5b236fde64dcb53dded57eb187d9e149bcd08faa8065427a48a770e224 +7a07a8e6d2073fcb2d34d21b7aa7dc7b9f4e468c61dd4a082de2b94eb5946e8fe6bff1e89a3f7f74eb27b953c60b78770467d3389b45c10614fce96b71829966 +91820ce0799ae3688e1344b4dab5ed72f32aba65937ecbf5d196c64bfb42b14bdb07faceef03fefbfb80a894a998cde533232d46e6b3bb135f7d70c38ecd2b2f +698679b5a883d5daa867b3d97236afe986a0161d2d0a113aff2da9040d5ae4f9fde57c2effc70fb4deb9b3b5a5f11256675b4ff38ffffe56e0d6cb1eafecc148 +60dd5ae41b904ba05681ef4d3f9674cf8df574a1b305ae8f2323f8452f868a20c0ae617018c3e3a8d824256942983aac88885b688c21666a66c2f2037d6faffb +cb77cb2db1d4fd3b227f78ff351b577fa227f98a0fb3e123e691124a8a9e55e868467f1aff790ca7a620253c0fe934a632a8da5012a402f24b5e79c22e0ef78f +a5e9a6eb3a9ad7be7fe3b5000e2162c096f05df82e020f4a420541e056a55b5cbfa2a32171b1bc4e6faeb5d7221f472e865a059e07df83e7eaae13efeea2e52d +1a8013e3f8c5699ccdc193083ca4a630348a5c099e4f000c4d5811c42c24a24858884674438b557dfdf513f68bfbf35dcbc6be7c7bc3237776ac6c8f7de40cd9 +1a840e5da294c1993e9ce947264f8e07491f3eefa92961797a3b44a316f16396d228f06b3569a71b6295ee95d75dfcbe28bbd83f84b78630519ee985ef22a861 +6c02a3292a559577fe421c4d90a9236e89d646d19c3074cd182dd2b929f7477b4bcbaca9fbb69b8fdfd7b671f547afcec76de47573db07dce2849d4f16f283da +4dd775b47ed2452f8c451d2c005bd7883872e93c9956d1d449692d1216410304844622026dd9ff0e96ff8fbb2b0faeb3baeebf7befb7bc55bbe5459637196321 +436d30360e4b0d24b609842186863681093304689369096d333434a5d34233d032cc34ed1fa10b4d274c934c863649818696253560631b2f605b58c612d66ae9 +e9edef7dfbbdf7f48f271b59d66237646a7ae6fd2369bea3df3d3af7a77b967bbec37f5f6cacf33b97a63675c6962f3096ce1317b7f198f5abed59cf95902b23 +f211baa896e0385012d0600403b4a081ed398ec7fe0d274b182b6028a34b2ed35a73edf228cf549931a644521a758e9f1c87c5c00cae13b6ae8ba13ec613f158 +c995fff872f1e76f8f3d74c782dbae5b58372b1d00c895a7c3738ae05b5278e9205e7b1ffd198ce5912feb4032224cba8ac7b83659b1a8f31fdcbd6dc9d77fab +6b516bf2b4f27c15a33938250c0f6164048e5b3b1f49e9bb4e391b3ae32b16b6a513b39d6eb2679b2b0269902601b9a091f58eb1effc9cf5e6309ac750868a55 +480dae03ae4a4c551808221e887485c7350cc66070b20d4ad83a6553cc60b1987962347ae4999e83474f3ef6c0658b5ba761f9ee5ebcdb83aa83de411a2f693f +82524c4f77c191001093301519ae8f9c4f4c7bacd4ab8a1f26e7191d8beb665aa627f15a3fde1a42c543e0237091cfa16f0023e3daf1a13418454c3b4c5698f2 +1867108950a4fd2891ad1a8253d2a286241a933c9988951df9bd572b3f792b7bd78d0df77f6e514bfddc315aae8c7ce597f681dc499d3b7af7b6b687eeb9a66d +c1855525bfd009ebaeaded3bdf3df9ecbff74741ccb4aa3a7e11448b464c4310630a66080e660a2e03e89e51ebd8b801406b05468b5b8ca5f371711b1a1358d4 +88ba38d6aff83847328d16d037041de2b59d2857496b4d00033190603492a342558792455a9096dcedc7e8cb88ca5a799a149800b799116746ca88a5edd45295 +5a1da1a9e419159fb282274c566746f1586c20eb3ff097874e8e97bf7177179f15fdd88c78c019f58f225745249924c1483159e0ce0938bd888a8c71304144da +cfea20bf6c3e7ffae1fb9b1b5393958f6471bc1f990c0ebe8f8a434a4ff4bf312558654c7ab98eb6647ad66ada34f0088c1187e64cfded8b94af04a1121199d0 +92bb2768ec3f1155b4f2b4d6601c22c6cc9461d7c793cdd4b03614f32365468abb212f38dce22c26b46d70c3e0cffd47efeac5e637eeb9fc6c73eddad3bfe39d +319221e78c5bed066f22661389a973720010812226cbf047997382aac7b574115520cb697359c792e9d3a6fb47f1c220bc10952a0a59bcd78d910c2a9e928a81 +148b8adce945611f45154d8a310e6e733321aca49568456a9534e757fd5835c05849244cabc18e2513aaecd15ffd68f48d0363cf3dbab6b97e8ed4c7c7e303fe +f8b296e8e9471e6c6e9a9197ffafe442272c007ffa954bc320f8e717fb5464f3e090195ba0626d9aa76bb4a598e12b1105ba2a75dca4648ceae22c11134288a2 +8ff2200e0f7f94a9350cb4d6a3b30dcbe761611d1637e94b97fe2faf5c145d64cbc86791cfa158213f0211073e1afc54cd2ba6248231e477db5ecf555d8ddbef +ecbabcabfdb2ce25e9541c801f4407ba87df7e6fe4e55dc3afec3f6a85f964ba23b0574414f7a4112ae6863cc1996dbb32167bfa07c7832078f4be2b66c193ab +a090456e063c4e586bafad72e71865fe5b8765680fa46b675500d01164a57d9ef9dd3fbf6f0a5b953c8ce5313e8ed10c4a0e05a79473100f7d84deb2f9765dd2 +9e6596e8cce6228003cc091494076710b95d491afbcc558baebff392c9e672dcf0f53d7d3b0f657ff0ca68aeda93ac8b3cbe28d2b622a694908a053261eb1681 +3146ead99f1cbaebe6556dade9c9180a95f0fa4eff8a2531c6e24298bed23b8e96761c6ff0758ca68484a499f69acccc173f956b6f0ca0d3d06b4011b4121c4b +dae60931d56d5c893747f04606a187e101ecde8fd12cbc406b0d22cd6515ee87c9e0c8a7d7c6aedf70f9faaeb64d6b97d41e74bce817fb46f7f6945f7afbe407 +393732db02a4422922657a512a2e44d2d031dbdddb937fe089ddfff4adab66e962fd987ca0dcdeccbefbf8fd17205be1134158f39be28fffce152b1625ffe647 +47b2e51c0f2bdc1d66f63c6eb56aa38e449298a59421b5e94528b8e05c9b9c2c23b24c669bcc369865b2b809db621ac8149029e2758528d251183624e4c68b70 +d52ab1fe22b3adf93cac91af225785efa25826a5e8b4c74f0c7fd29245592aec4fbafb6fb9a6ed8fbf7aef9a8bdba76888d9e6a675cb36ad5b76ff17a217dee8 +7ff2fb477b332349d370c5d290628a84afb8d4757148c3f42ae5f2cf760c5eb1bae9e66b974f8ba7e0205781373d1e0668a65ce6f45176d782f8f8676f5a7adb +a76fdcb86ee5bce63a00a399e2db078ebdd7dd77f8c8b16b375eb275f3545acc579129c3f7e0b8672a274d511991d3b1383d7b77e5cce662003115c2eba7dcee +05f6f0bd5f5cf37bf77ca9066cb22413d62d9b57dfb219777faefcd40f075e78c765865b95066941601a9cc80425396b207522698983dd436dad9d933534a6ad +07b65f7cfacb6343fe60a9b26f40ca50478a9d5180a690f9c3ebda33f7dfba6acd4573df76c87ad8318a035994f3387c18078fa0ec9252208069c965b1910f7d +febae0c1dfdcb666e5bca9eb8a9b375fd37ef335f8eaedd1bfbc5e7ee6e560b06406642b128164522542c66c844ae6de3830f6e4f70e3cfeb5196f14e4abbf9c +0fec3ff65e77efe1ee9e6b37746ebde102bdb7f009202c000b5a128fdc7bf98d1bdb9e7fb5ef851d031f0c66e1e718ebe18c9388c3ac87d900b39e8c7a1249a2 +98af4c5f0af8138f331067640832052c01c38029c8121433295f652fee533fdd1d26cdf2da65d87e75fceaae645d62eed24cbe8abc832882e3939edcca46c448 +b2708cb26f2d327b1ffdc3cd5fbe7d936dcd967e4ac6cd3bb7ac34add8533f1ceccd8609e168654664109824cb43438c9785913fd69fdddf3d76cdba45f5d38d +27afe19167e3011869a61c940e516ed7edd735ffc9d7eeb96cf519ecb9a0b5e1b6ad1b6edb3ae3a0bbda4e90127e38a96faf56e28a4a24dd8ef6f6746a0ec29a +d95c01f3fa697ce7c615ee9ffdeee7b75cdb358b1e009dcbea6ebbae6da85c3a34ac03ada43efdc7621a066440d2b385651a7304ffb90a55032b1e331c89487d +f47d469ac90acaefaf68b2d273e50d01b812bbc7f16e069993d877003d7de406b5de66d42685b5d555bf7567db97b7b4d8d66c7ed5da60fef62d4d862dbff3a2 +1ec84129223045c2a7b842a3e039af9479f75866efe1912bd74c5fb62b38c8bbd319f91c7d60db86dbb65de8c30e3f198455938d6be66f5c33ffd1fbd6bfb667 +e8cdfd43afefedef3e9e719d31d45e6cc04cc64d262c214c6136c06c80918048929122234d3c119215480e3006628c4c4e96c162a64e982c69911bd12f0efb2f +bd3db4759d78f08e855dcb52c659c7fec992775070a135bc53de59130662aa82dcce5478f4996fdfb1f5da4ec338a7caf4f6cd8bdffb503ebf2bcc0508422595 +2062042e6107a255f091289043a3c562d99b96b00a0e0a2ed4597840040a99d7af0bef7c6173f3630f7df6a265e77d41325f45c1036904e199caa121cba4fc8e +250d739cb066349766b28cc2bef9b1934f3dfca5abaf58712e78962eb06d3b9e8819ae6281a25a8daf369b83a4a7951ff97e4be31ca5d582c32b326dd9e06eed +9c77fa278a8559ed8d74b475a51373b7cbec3d89832318cf60d71ef40e90179e6eb0229066249fb877fef64fc56d6beee443cc649b2f357ffcb61ec813632002 +816988084926d260e68e3d1f66b6af96521bd34d8fc8575170a631f2c7e20317887c9208ab26a98479ebe6e5b76e5e0e5c5baa0607ba870e1c19fce044f6c3e1 +e2abbbfb239f29c681c189b09c1b8c5bdc880933cee38b29d14e568be2290d2b503c54f0425d11dc12226e46295399b6f5b39dd937f6f53ffbcdcb365dd63a0b +674dec40052fa05aa600a8ed9888f9c3aad2f7fb5f597fc3a655e7c85635f9cc95cdfffa4eb9d9164e813189537d855cb18410f544f4f29b3d4f7cfdd7a7c7e3 +22ef9c85a776ba94551a7f839cfebff8833f5ad13e35243917c95591afed84f04ce5a4992c93f43bda1bd3c9d9eadff9ea74e602408a0519e58e6cd9d2fe6bab +cfb5a1bca9ce18298874c2ca7bec8cd63c22c82a492f1d8f772c9963a505d7a84a6e5bd05a8126c7838af96314e4e78c7301b8217eda0dd7c3eebde8ed272f3c +63703d63b4f952fb960d89732f58af699fe0bbc951b386a94423e9a05cad1ceb1bbef1aa65d313d6b43ef931f9c005229f3cc29a2cf5297bf3868ecd1b3a6a5f +6aa26cde3970a4ffc4702e5f747bfbc78f0f960ef68c97dc921271e69778b54f5875766ab98e2f5746838229894bc943497e24aa5cc41819227732e7dff7f88e +e79fbcbeebac8c434ddc1005077e8430422427fba866aa82cab1d63afd1b37ad8dc7ceaf5778e5e264483a61270da119a353bb881131c593d0611886d3be4fc1 +0d519c1e0f8142f8c32695b66febec58d27a5e782694072838f02522799672ed413a2df5666b53ca3467a46637407e06784c7bcc1baa8f4557ad6d3ff72b7ba6 +61544233998c1b863a75bf1d0091f698746c2117b624ebd3b311a81ba0e0890810028ace5c94f210665bea786b53729645018814f6f6636c1c6e150327e14767 +f4ca8341309e75c43ffc5720a04ca16d8b1ba66d18063720c4c48773700ea551a9c27151a860a48048b1334e4820a58949276ea89edea1983d4da03ab34f7e0c +3e70e1c8279bb0a60867acb539b5f5baa949906cc1d97960b06fb87ca8b7f8e67b8581ec80c523255646bc519245601a2cd4426a16b194454da093995ce5ef7e +7ce0afbfb965da5f94afa2e842d5fe959d91ac8d5890216fe4ca0d8bbb562d3e5ffc99325fdf597f7484ce2c4211a0b5f448054b1624fa06336b2f5932e5c189 +78702a1e3022262be40eae5818bffda675e78ba726f919956b169549f91dcb1be7486039d39a0b8c1493250ac6572f6fda74f9ca7387f4fe1059568c7166f08f +e6c3325dc3e3a513a263e91cdb325745d1038048d2e41221d39a45258aca1dcb1b665f14804c197b7a512d23334e5e40534b8d80247668403cfc7d25383304b7 +4c1eb7743ca66d8b9b26c0a034c2087e38f109238ae4c450248689c611002049518994347960cf909bab9d617f453e70e1c8ff2bc29a495a1a93b7de30d19a5c +aa46bbbb8bcfbd927bbddb2dc8146943d1c4ebaa3478441690662ce995078ef767de3934b0fed2a9ec805304410aeed48c8c4254840ed7769e375b0118ab80db +e0269bf42e05000045141628723ada5aa6ed752a3813f1e0143c8062519efcb1452b62adcde9b31f3c17391dcd9da55c4396497a1ded2d73960867d41016ff87 +bd6b0d8eab3ccfcf772e7b76b5bbbacbb26cad2d5b32186c6302361843cca5314348710aa131eda434dc324dca84a653da6168d3763a9d3630d34e493b857626 +e9649a364d32d36909d0403a60c2a5aeb10dbe4a4896d6b2b492f67e3967cff5fbdefe38922cc9ab5dc997ccd2d133faa5cba3e79c7dcf7bbeeffdde0bb9c5de +58cbb25ab8f427a440489524060662b30ba4693dd12656d361e50c144c00b05ccc6ffd2fe0f9c7086d3525654a48e6a19790c981f30b7fcefc7d1907e3028e90 +0c97e54c86022a4e3c63e7bf29408281cfcc1c227013d614b97ad1c846239597ed3963b19b7c196ca07e50770eab6863b080bc89641ef1247403fefbc2b03134 +8ef109734353fed9fd4d375e759125a94d11f5ee9b3aaeddd8f2ccf7ccd73e94fd36f0e7419280c6b80b6e39b6b158a39ae9b799f08305b37f0b008c3c92029b +7a3a5c9757df505c888c0529088fc3f1309b7ecd488097c99c24b7d81b6bacf814f967700bf580000e274b6e7ef70dd75ebd71f5b2c4cc259f8997cf3f229c8d +b82f3180752103097879f2cabdb18dcb725803134cd39810f088ce47b867f4441ba4def53582cafe31c24249fe88304f27e1f4c65aab5f148023dfbcb400000f +dc4944415474111319d86518a610840ba634120367e441d810361336b80961326e41b880604c86ac410933254c5288248d9842c4fc381a88037eb52127ae9395 +20b704615fb8be3e7f4517dae465b281fa41dd39ac460dff7e02148263239b47b1305d25ebda28ebb0cdf2fba3c9e4dd01c70d06d48b6fb3ddddae6c5a177d67 +88eb59cc8dda4e77817772e419a681d51d9573e7e64637c56c7493811193d430c95a51b7ede53bac2349388482ee670fcca822ceac296e8ec3cd3f7cffee55ed +4d15f4e895f4f81b1c2707afdc176b89442eb2286c517212cc2d829b7db1e648ad2d612d86e5c91b9880a6c1b2603b345b5b3acb160d294b7258152541306141 +787debdaaa5f1400093c91a2b2c16d0ba0f98f1211037f6837df7fab1409a810029c138540c1b9831a196360329314c821482a41993f088da61759a291dcdbe1 +dd04e1ecde51b90ff5a237f972d840fda0ee1c96eb41c9e2a334c2610c8dc032fd7233bfced6e2ae2533fcd50f86776fbdfe521c96ed61208db2230bf079c73a +20f0b2305312375ac3e1359d15daba7b1c390345139e07db9d372699980cb529a08586ce9522550beb168008237918806b239d9f9316449cf112e53f92ece4ae +edabfb7a2aec743c8e6cb9921e02c88557d4141eeb6a6c58e609c079720345ebc28bf5c94b9a22625d4d55c897c6b00c79a683b11c3adb41028ee71332807c36 +89dcd6c6f09ace6a1570d3922a7c82000906a669726c4d4b75494458db4a23a32955011321200ccc33484512aae47dfee608a001e1c578968c6a4186456df272 +d8405da1ee668108a29debf48f0e258e1e3247cef2d371712a2efacf89a184773685a41ef210fc789cffeeb70726b3f6c5fd8b9481bf7b078393705ccc6b2a42 +025e89f44161a7631deca17d3b2bfef99c94a285e979608ce420022def9ed407470b4b979434f14a1cc5023e3c0dd316d39b0b128ceb289e16c5c175edecb71f +be6b513d46453d1c5e91b8d91bab9124550573777395c8ad9ae1a7c56f175fe28e7201fa13082810b480902f6b3f9835e079282f94448c5c92d44d3d5dd1700d +17c31838f7367594f4425ae56995d9d2bc681871ee0d9c7326b3ee12afcbb071781887cf5c4c43cd5a37f9926ca0ae50772b2c4d656d616f5b67fafdd309682d +0a3a2c0a0b21013283e432e63112606f7ca8e7ff26fec8673b6fdd125d7acfa06419ef8ee37fcfe2583fc6a650b649ccda1871e69558e12825dfd6786adf9d3b +efbf677745929c9f9ec751b6b1e0608820436e640db1e1e4e8f3df1ff8e3c7b7aeeda81d6b4b593890c0e9717c3c88448aa6e7bf9260bcc4f24729794013a97d +77edbcff9e5b96a567fa14cf3397eb11e6223b2794bb0879ad9451fd5219166060028aba809066d9a2e1da0e2b5d42aa00d786694d479ee63ce31293b54d1bba +a255b3227c4482d8b64e1c3c9652b5b0a6481e5b4dd3ad44c018186134657fe7a7fc1b0fb485b41a2b837c192ffd0ccfff07ca1684e0441490b1ae1db1760137 +1fe5c31b9a32b7efe8beeb96cda1d0a2750e57c806ea0a75e7b000ecdad27cd775c91303895426a504739abad6959b390204c92595a351305551f247e2eed117 +0b6b3aec3bae6bd8be31d01e9536744a6bdb6475ce35a575a40d4c194896319cc7a48eb2898f07d17f06d922b91ce4f78627977939ca1c14b9a3289fdd7fdfb6 +affec6de8a9601206320eb9f1f3b17acb0c0040b096d3567eecbffa37336fc8dfd3d5b37442af20070050e25f15e02f1097c7018a786c8b44184693dd983227b +04e5b35ffee28edf79ecde50a8f2539dd19131e0b930e71664f84168370f6ef6c5d65e74d3543f65945723ef8ed48cb8ebd5199627af7f1c8a3c9f700e5b3424 +d53c224ce5bdf124330d324d4e24cf698bcc2005e460abce0399628563bf05e8ee08deba257ce003de3f9a56838ea631c8ab3c680419c4882919437de9d59c69 +9a8fdfbb6afdea45af71a284effc1c3f3ee86fe588888480c9a97f9c0f0c2745ea6dca1eb967d7aa07f76e5acc26670bb3ae840dd415ead1610178745fcff854 +ee9f5e1929e68b6a2081865ea67672292c1010504c8ab84eb041b55bc3bce828af7ea4bd765c168204813152022c144624828608821a64f97c146c3481f818b2 +05b25d08022321910b6ec01ca3f43b649c859978f6abbff4d413f777b42d3a9470ce71cc852b2c2698eca2190159c5e4ab47f8bb83139fdbd5b2eb9a86ed1bb4 +9e4e39a000c0781ef13c12651c4ba358463c8e23c73195112e678cb8240c94c72975808c91a5e8c99430958369a26cf2e9fc66bff10b79f09321ba9ba3171b6d +cd1491cc57276faa9eaf942e62aa06c3f2e49d3a07c161db3384f3d9a22156738515d5bcc464be98e38e159428ccc0fc651131465085baeae0b078fa1f93bfbc +9bb7358508d20783e5e343b926adfcb74f5db5a97bde92f9813b62032399177e3898d72dd52da9411b6a27670d020aa070164959ecef7f5afcaf23892fec69be +e9eaf0d61eb52d2af96976533a460b1848e1f563387c12e353304ce109bf138c60c2446980270f403f73ff1debfefa4f1e591f5bf4baaea80dd415ead461451b +02cf3d7573678bfc072f1cf46c4d360b8aaa49e13ea1ae127254484197d482a3161d0a1479284091a0170d2212921495053404350464c085696322855416f912 +0c4bd8ee748a93448ecc4db87994cf51f6b070b2b0332d9afe177ffae013bff9f9ea6da7b23ab2e78f6316fe261104640751974514f23cc77de3b8746030a004 +e440100d61441a110e43552138c6c6707c00e9bcf00463c425ae336b82b287843e022b096bf2c53f7fb8a69e64ce8b8f91a9a72d3328098511087e59729ef421 +720b350bfdaa209573e363b814f254fe32cbfb70b0dc10526d639a1004109f658b869a6b3aac8d5d4a3c1e2f59a4484c96d6cbac8943f5bb420ac82e8b40899d +4e5be9377930489cbb7ab1944b25343eb9a16bfb856ccf3c727d51379effde49cfd614aba46aad2cb4912b6d420a71042c289c1acee4ec975e17fffaaea56a2c +d4108844118e42d3609471e62cc626512a0b4efe62df615e01c60825df222b096bf2f71eddf3ad6f7e4592aa6d2aafa80dd415ead461f9f8faaf7deaf61bd63c +f7dd833ffad9109302cc484b922ac90129d086601769eda434bb14b23d256f32f885c78c4bcc8f4a3022089a297120c1c891b80e27c3ac092a8f9395145e199e +01b7d012769ffcf2a79ffeda17a2911aa1d67c793a69db72e6c4bf6641bc23e23d78b3fb9383c5f10c779570c68ca62d556614d278638314d41863302d944c98 +b6ff3a151237647b0aa5212a9ee24e016e3ea218bf72efe667bffefb9b37f554d7932df17389dc783c611b292ae7992008c18813b7c94e0b3bd7d319a8dea9aa +3af9e844be1679b00a79b6c4cf4d5c4e79fd634e3e932870639650e21e71cb678ba856cfdaa60b9b552d80c7f9afdea6bdf0c32159962539ad685d92da21a430 +b1803f1bdca1a0e3840a5921332e099399252f3bb8bac39bca14d7aeaa9056f2878fedbc667de3b3df7e773c5360664e2a9d9395a01c8a89608cd436576ac839 +c18223145da832a98a27499220c9f5c872890bc6c893b82edb491823541a10761e6e2140f99dd7b63dff47cfdcb2a346f3f82b6a03f586ba7658aa2aefd8bae6 +bb7ff6b9271f1afbb7d78ebffaf6603c510493c1ce413ac9644d9235496d90d56604da4809430a42d2c014627e0f364716265c1d768aac29e196b86743d8102e +840d6eb544d81dbb7af6df77cf5db76dafb2e79a8bd9e8a66963e1f28a3813e6f66eeb89cf041fdd23ffc38f8fffe75b23e912495a0b0bafb743b164b991980a +1084cb44196e413113428f939d169e01af0cafd4d5227ff1b3d73ffeeb7bb75e53b9efd5024c65cd33f17866eca4b072e419100e480002c283b0e0167bd7acbf +e857eb54d61cae4d5eb5cb68d63c337239e51dedcfe4a74e0b2b3387d09b658b36536facf608a5f626edc13bba8e1c1f79f38304631293c61993c02449d24889 +c0ff921b48520577b9394e8553644dc4faba72b9424587156e083cbc6fdbeeed6bfee59563afbe3d74f0f8182419a531493a22294125d88e861e0ab47325ec31 +cd6432c000ce78993919451f16fa907075e226bc32b8d112a6bd9feefdad2f7de9cedb6e58ca3db9a236506fa86b87e523dc10d8b373e39e9d1b7305e3d0b1f8 +e113a3270727de397cf6ec44924b0148ca4c72c64c11acff26f133eefc8ce1690f658734f4ad6bbd71cbba6b3775ddf4a9beebb7f63645979720e36748738ef2 +bc7c623022261c5813bdcd6e6ba47b7dd7ea1d5bee79727fe2276ff5bff17efce8c0cf0b131c4c3aaf4a782017dc01b7c0cdabd637edbdedeafb3eb363d78d9b +9b1a9721692a553837dccf73a7e015319342eda74743d8f08cdeb59ba395dad12c957ca49fe74fc15d8cfc9aea01ac25302c4fde9113c36ef6149ccc79c2e98f +d88667443b9a7bd72f69e6dbcddb56bff8eced2fbf79fae537078e9e9e2ce87e8accdc72287ffe9a035e86575adb265fdddd2d3ca70a67dffab66f7eedcea71f +bdedd0b1f87fbf3770e8c4d8e15353c99c0d2381ec0930c91f420e36434e1eb80d61819bad5179cb55ab765eb7e5ee3dd7d7950dd41bea7a906a4d1c3911cfe6 +0dddb0c626b2a675615a1601d4d7d3190d079b22a1cd9b62971e777cfd18fef9204626317056648ae717598c3ce666907ceb2fbfb2e1b107b6b536cd0bcdea65 +fbd460e2e3e1c954b6e879de8cdb127d3d9dddab5b2f8bb0155c34a6528533a3c9e1d1542a5bf45c0f806f399106adbbab65757bd3e64db168e4224bc1ce9c4d +8e4d667379636c226bda33fe6eda00a8af675534acddb0adafb5e5135fe5f78bc127db61fde2f183f7f0fd43c8e670ec0c372c69f6de49c266e52131f1fa8f9e +dbbbefce6b975b94b38215ac6029a8bb4cf77ac6e27d9d0484c9ac445b84af6a09ae78ab15ace00a61c5612d03191db9323c1765737e00cbefc464267bd746ab +07a157b082155c0a561cd63290d5912ac22a432f0b2262a0997a7a8f9cf44c53dd1587b582155c297c024e09eb07a93c3f37218ab99251128c0724e127e811b8 +0efd0cd9c9deee0dff6fce8f57b0823ac48ac35a0626d2c6e98189c9e4946d64e07226382341ffd7beddabc415856118dd228421a04d2a45c1c214b90cef9ff4 +42ea60e14f1007e4cccc9993425206048be419d6ba825d3dcd7ebffdbc6c1ef7d3af313d5d5f9c1ec6c516fc9f04ebbdb6bbe5e7ddfd8fdbeff3ebe3b27d19f3 +3496f9cfa86a1abbf5ea687d7976f2f92fe7a9c0c709d67b3d3dbf2ed3c3cdb7cdd81e8dfda7b11c8f65ff36a71a6335e6d5d5f9d78bb32ffffa9970c8ecb080 +0cbf8440866001198205640816902158408660011982056408169021584086600119820564081690215840866001198205640816902158408660011982056408 +16902158408660011982056408169021584086600119820564081690215840866001198205640816902158408660011982056408169021584086600119820564 +08169021584086600119820564081690215840866001198205640816902158408660011982056408169021584086600119820564081690215840866001198205640816902158408660011982056408169021584086600119820564fc0612ad04ab718fa6890000000049454e44ae426082}}{\nonshppict +{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw10583\pich5027\picwgoal6000\pichgoal2850\wmetafile8\bliptag1887078077{\*\blipuid 707a86bd44206243c41e357a6f4bf32f} +01000900000394bd0100000072bd010000000400000003010800050000000b0200000000050000000c02be009001040000000701040072bd0100430f2000cc00 +0000be00900100000000be009001000000002800000090010000be0000000100180000000000a07a030000000000000000000000000000000000ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ece8c89c869f6345935e458b5c45885b45865a45855a458359457f59 +45785645897065e0dcdaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffefbfadca387a53a04923101852c007e29007b28007a2800772700702500642100582208cdc3beffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffff1bca2d86229c14c11ae410aab3c06a83a04a63904a337039031027f2a00692200c0aaa1f8f6f5ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcd0bbfa8952ed6b2aeb +5a13f15306f25103f15102f05002e44d02a939027b2901b28e7df0ebe9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0d0ffa26fff7c38fc671efb5605fd5401fd5400fd5300f652 +01cc4502913002a4725ae8e0dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffece2ffb084ff8640fe712afc5706fe5400fe5400fe5400fa5201e04b03a33703975637e1d5cfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffff8f5ffba95ff8b44ff7a34fc5807fe5400fe5400fe5400fc5400ee5002b940048a3b14dacac2ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5a7ff904cff +7f3afc5c0cfe5401fe5400fe5400fe5400f75202d348038d2f01d2b9acfcfafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfd3cdd4c3bbccb8af +ba9f93b3978ab3978ab3978ab3978ab3978ab3978ab2978ab1978ac8b7aed0c2bbd9cecaf6f3f2ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd1b9ff9a5dff823cfd6315fd5502fe5400fe5400fe54 +00fa5301e74e02a73802c89e8af5f0edfffffffffffffffffffffffffffffff8f5f3ded0c9c6aea3b89c8eb4988ab3978ab2978ab0968ac7b6aed9cecaf6f3f2 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0eae8 +daccc5c5aea3b79c8eb3978ab3978ab2978ab1978ab8a196c9bab2d8cecaf5f3f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffe9e0dcd7c8c0ccb8afba9f93b4988ab4988ab4988ab3978ab2978ab1968ac7b6aecec1bbf2ee +edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffff4f0eed4c2b9b696869d715b7e3e1f7225007827007c29007e29007e29007d29007e29007e29007f2a007f +2a007e29007d29007a28007727007225006b230064200064270976452d947060ad958ad1c6c0f4f2f0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffddcbffa46eff843efd6a1efd5604fe5400fe5400fe5400fd5301f55102d94902d48b67f0e6e0 +ffffffffffffe5d7d1bd97859d5e4088370f852c00872d00862c00852c00822b007e29007928007325006b2200621f00713e26987a6bccbeb8f4f1f0ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4cbbfa25f3f7526006722005f1f005a1d00581d00571c +00541b004d1900421500877166e5e2e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffe4cbbfa2603f7527006722005f1f005a1d00581d00571c00541b004d1900421500887166e6e2e0ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffe4cbbfa2603f7527006722005f1f005a1d00581d00571c00541b004d1900421500877166e5e2e0ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffc48f74882d007527006722005f1f005a1d00571c00541b004d1900421500523426b8afaaffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffece0dac39f8d9c5e4084350f7d29007d29007c29007c29007c29007c +29007b28007927007325006922005c1e005f311b8f766adbd4d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf7f6dac9 +c1b38f7e9763498039167928007e2900802a00822b00832b00842b00842c00832b00812a007d29007626006e2400652100682e127e523d9c8072ccbeb8f4f1f0 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4cbbfa25f3f7526006722005f1f005a1d0058 +1d00571c00541b004d1900421500877166e5e2e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f5f4dd +cac1b0816a8b43207d2900802a00832b00882d008f3001963303a03804b03d05c34305ce4704d64904dd4b04e14c04e14d04df4c04d94a04d04804c44304af3c +049834038b2f01842b007d29007827007125006922006a2e118a6351c0b0a8efeceaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffe9ddffad7fff8741fe7128fd5705fe5400fe5400fe5400fe5400fb5300f25101ea7b44f2dacee7d4cbb78065964017953303a63a05c5 +4506e24e05f05204f55303f45303ef5103e54f04d64a04bc41049c3502882e017d2a00732600662200693319997c6fded6d3ffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffff3e0d6ca815c9f37038e2f01832b007d29007b28007928007526006d24005f1f007e5643ded6d3 +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3e0d6ca815c9f37038e +2f01832b007d29007b28007928007526006d24005f1f007e5643ded6d3fffffffffffffffffffffffffffffffffffffffffffffffffffffff3e0d6ca815c9f37 +038e2f01832b007d29007b28007928007526006d24005f1f007e5643ded6d3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffe6bba6b23f059f37038e2f01832b007d29007928007526006d24005f1f005e2f19a49087ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffe7d2c8ad65429331019532029834039a35049c3604a33805af3c04bb4004c74404d14704d64903d14603b63d028c2e +017326008c5a43e1d8d3ffffffffffffffffffffffffffffffffffffffffffffffffffffffece0dbbe95819a5737812a00842c00892e00903002983404ac3c05 +cc4605e04c04eb5003f25102f55202f65202f35202e94f03d64904b43d04903102842c017b2900712500662200652d11886756cdc3beffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3e0d6ca815c9f37038e2f01832b007d29007b28007928007526006d24005f1f007e56 +43ded6d3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfafae5d3cbae72558a2e009030019533029a3504a03805b33e +05cc4605e04d04f05103f95302fd5300fe5400fe5400fd5401fc5502fc5604fc5605fd5604fd5503fe5401fe5400fe5400fc5300f65201ea4f03d74903be4104 +a337038d2f02832b00782700692200642d11a1897df4f3f2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5efffb891ff +8a43fe7831fc5807fe5400fe5400fe5400fe5400fe5400fb5300f75f15f29669e45f1de14c02ec5002f95301fe5400fd5503fc5c0cfe661aff6d22ff6e23ff66 +1aff5d0dfd5604fe5400fc5400f15102da4a03b63d038c2f027d29006d240062280c8a6c5cdfdad7ffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffcf2edeaa17fd05316bb480fab3e08aa3c05a83a04a539049e36038a2f02792800773c20d6cbc6ffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf2edeaa17ed05316bb480fab3e08aa3c05a83a04a539049e36 +038a2f02792800773c20d7cbc6fffffffffffffffffffffffffffffffffffffffffffffffffffffffcf2edeaa27fd05316bb480fab3e08aa3c05a83a04a53904 +9e36038a2f02792800773c20d6cbc6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9e3d7db5615d0 +5316bb480fab3e08aa3c05a639049e36038a2f02792800692a0c907364fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f0 +ebce9274aa3c06ad3f09b3420bcc4908e14e06ec5004f25103f65202fa5301fc5300fd5300fb5402f85505ef5307d04a089a3604964b26f0e9e4ffffffffffff +fffffffffffffffffffffffffffffff9f5f4d2b1a197441c9131019734029d3704a53b06c24406df4c04f25103fc5301fe5400fc5402fa5706f95a0bfb5e10fd +6012ff5f10fe5b0bfd5603fe5400fa5301ee5003d84903b73e03903102802a00712500612406744e3bd2cbc6ffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffcf2edeaa17fd05316bb480fab3e08aa3c05a83a04a539049e36038a2f02792800773c20d6cbc6ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffcba18c9433039b3503a23906a93e09cd4907e34e05f05103f85301fd5300fe5400fd5401fa5707f95d10 +f9651cf96d29fb7635ff7b39ff823fff8b47ff934eff9752ff9551ff8038ff6e23ff6113fd5908fe5401fe5400fd5400f75302ee5003de4b03c141038e2f027c +29006922005d2911af9f98fefefdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2a1ff8d46ff7e39fc5a09fe5400fe5400fe54 +00fe5400fe5400fe5400fc5300fa5301f75202f65303f25407ed5c14ef6d2dfb7533ff7b37ff833dff8e47ff9c53ffa75effac63ffa961ff8d45ff6618fd5604 +fe5400fa5301ee5002d54803a036027f2a00692200511a00af9f98fefefdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbb9cfa +7331e66728ee5409f25204f25103f15102ef5002df4b028e3002712500cfc0b8fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffaba9cfa7331e66728ee5409f25204f25103f15102ef5002df4b028e3002712500cfc0b8fefefe +fffffffffffffffffffffffffffffffffffffffffffffffffffffffbbb9cfa7331e66728ee5409f25204f25103f15102ef5002df4b028e3002712500cfc0b8fe +fefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff56925fa722fe66728ee5409f25204f25102ef50 +02df4b028e3002712500815844fdfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf3efc7561fc64e12c75016e6520af55304 +fa5301fc5300fd5300fd5300fb5301f45406ec5911e96626f16e2eef6b2bdd5d1fbf480ea74515fefcfbffffffffffffffffffffffffffffffffffffffffffc4 +9278993403a03704a83d08ba440adc4d06ef5103f85301fd5300fb5401f65506ef5a11ed6320f06e2ef97533ff7f3cff8c48ff9953ffa05aff964fff772cff5f +10fd5503fe5400fc5300f75201e84e02c74302872d01712500591d00977f74fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fbbb9cfa7331e66728ee5409f25204f25103f15102ef5002df4b028e3002712500cfc0b8fefefeffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f9f5f2c89075a74515a83c07b1420cd44c09eb5105f65302fc5300fe5400fd5401f95505f25a0fef6521f36e2dfa7331fd7532fc7330fc722efe732fff7933ff +843cff9048ff9c52ffa35affa65dffa45cffa25bff9f59ff853bff691bfe5a09fe5502fe5400fc5301f75202ec4f02d046029432017527005b1e009e877befec +eaffffffffffffffffffffffffffffffffffffffffffffffffffffffffceb3ff9758ff813bfd6112fe5502fe5400fe5400fe5400fe5400fe5400fc5401f75303 +ea5208d25213d05518da6227eb9a72f5c3aafce4d9fffbf9ffffffffffffffefe4ffdfc4ffd5aaffc17cffb76eff974eff6a1cfd5705fe5400fb5301f05102d5 +47029632017527005b1e009e877befeceaffffffffffffffffffffffffffffffffffffffffffffffffffffffffccb2ff8f51ff7834fa5d11fc5502fd5400fd53 +00fc5300f25102b23c03802a01bfa295f6f3f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffcbb1ff8f51ff7834fa5d11fc5502fd5400fd5300fc5300f25102b23c03802a01bfa295f6f3f1ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffcbb1ff8f51ff7834fa5d11fc5502fd5400fd5300fc5300f25102b23c03802a01bfa295f6f3f1ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e55ff7f39ff7834fa5d11fc5502fd5300fc5300f25102b23c03802a01814f37e6ddd9 +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7dacde7763fe46324ec5b15f75507fc5401fe5400fe5400fe5400fa5302ef5206d7 +500fd66d3ae9a786f2b699f4b698ea9164d96d37cf7446f5e3daffffffffffffffffffffffffffffffffffffcf9e86aa4818ac3e08b5450dd74d0aee5205f853 +02fc5300fc5301f75303ec5409de5613dd6b34eda987f8d0bdfdf0e9fffdfcfffffffffffffff3e8ffe4caffcfa3ffa15dff762aff5f0ffd5604fe5400fd5400 +fb5301f15102ca44028b2e00682200866251e8e2e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffccb2ff8f51ff7834fa5d11fc5502fd +5400fd5300fc5300f25102b23c03802a01bfa295f6f3f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9a790b75222b6440dcb4c0ee65109f6 +5404fc5401fe5400fd5400fa5502f1560ae15b19dc5e20e05f21e8743bf2a27bf8c4aafad1befce8dffffbfafffffffffffffffffffffffffff3ebffe8d7ffdd +c0ffd3aaffc388ffb770ffae66ff8940ff6618fe5806fe5401fe5400fd5300f85201e74e02b03b017f2a006020008d6d5ee0dad7ffffffffffffffffffffffff +ffffffffffffffffffffffffffdac5ffa169ff833efd681bfd5603fe5400fe5400fe5400fe5400fd5401f95303e75208ca4c0ebe4e18d38762f3ded3ffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffdfaffe7c5ffcd8bffb46bff8035fe5c0bfe5401fd5300f95201e84e02b13c017f2a006020009476 +67e5e0deffffffffffffffffffffffffffffffffffffffffffffffffffd9c5ffa068ff813dfd661bfd5603fe5400fe5400fd5300f65201c342038b2f02af8672 +ede7e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9c4ff9f67ff +813dfd661bfd5603fe5400fe5400fd5300f65201c342038b2f02b08672eee7e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9c5ff9f +68ff813dfd661bfd5603fe5400fe5400fd5300f65201c342038b2f02af8672ede7e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffab7fff823bff813dfd661bfd5603fe5400fd5300f65201c342038b2f0281462acfbeb6ffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffbd3c0fc8e59fb7432f8641bfb5605fe5400fe5400fe5400fd5301f55203d94d08cd7246ecd2c5ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffe2bfadba6033b4420bc24a10de510cf45405fb5401fe5400fd5301f85302eb5206da5c1ee19d7c +f7e7e0fffffffffffffffffffffffffffffffffffffffffffffffffffffffff2e6ffb584ff7a30ff6112fd5a09fb5706fb5504fa5403f75302e14c03a3370171 +2500875d48d9cec9ffffffffffffffffffffffffffffffffffffffffffffffffffd9c5ffa068ff813dfd661bfd5603fe5400fe5400fd5300f65201c342038b2f +02af8672ede7e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefd4c7d1794ecb5015dc5715f1570afc5502fe5400fe5400fd5401f85505ec560cd955 +15cd571dd87e52efc7b3fcf2eefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5e9ffdaaeffbb78 +ff934aff6819fe5706fd5401fe5400fe5400fb5300ee4f01bd40027f2a016626079b7d6ef8f6f6ffffffffffffffffffffffffffffffffffffffffffffe5d8ff +ab7bff8641fe6e24fd5705fe5400fe5400fe5400fe5400fc5401f05205cf4b0ab14611c98665f5eae4ffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffff7eaffdba9ffb369ff8237fe5b0afd5501fe5400fc5300ef5001be40027f2a016626079b7d6ef7f6f6ffffffffffffffffff +ffffffffffffffffffffffffffe5d8ffab7bff8641fe6e24fd5705fe5400fe5400fe5400f85201d347039432029f694ee5dcd8ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5d7ffaa79ff8640fe6e24fd5705fe5400fe5400fe54 +00f85201d347039432029f694ee5dcd8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5d7ffab79ff8640fe6e24fd5705fe5400fe5400 +fe5400f85201d347039432029f694ee5dcd8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6a7ff +7f37ff8640fe6e24fd5705fe5400fe5400f85201d347039432027f3d1db99f93ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3 +d5ffa474ff7f3bfd6d24fc5706fe5401fe5400fe5400fc5400ef5003c74505bd7552efe0d8ffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffff7eae3d79472bd480ec84f13dd5310f55405fc5401fe5400fe5400fc5401f45203e65d19eaa685fdf8f6ffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffff5efffb188ff6213fe5a09fc5807fb5706fb5a0cfb6e2af98247e97d47c77a54b48975d0bdb4f8f6f6ffffffffff +ffffffffffffffffffffffffffffffffffe5d7ffab7aff8641fe6e24fd5705fe5400fe5400fe5400f85201d347039432029f694ee5dcd8ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffefaf8f3c9b4e56221f66d2afc6216fd5806fd5604fd5705fb5707f7580aed5910d85617c7551ed38762f8ede7ffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4eaffbf8dff7f35ff5e10fd5603fe5400fe +5400fe5400fc5300ee4f01bf41027b2900743c20beaea5fffffffffffffffffffffffffffffffffffffffffffff1e9ffb68cff8943fe752efc5806fe5400fe54 +00fe5400fe5400f95402e24f05b24109b15c33f0e1daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fff5e8ffce92ffa75dff7024fd5705fe5400fe5400fc5300ef5001c241027b2800743b20beaea5fffffffffffffffffffffffffffffffffffffffffffff1e9ff +b68cff8943fe752efc5806fe5400fe5400fe5400fa5300e14c029d36038e4c2bdcd1cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffff0e9ffb48aff8942fe752efc5806fe5400fe5400fe5400fa5300e14c029d36038f4c2bddd1cb +fffffffffffffffffffffffffffffffffffffffffffffffffffffffff1e9ffb58aff8942fe752efc5806fe5400fe5400fe5400fa5300e14c029d36038f4c2bdd +d1cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfceff7a33ff8942fe752efc5806fe5400ff54 +00fa5300e14c029d36037d3410a28070fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0e9ffb389ff8640fe752dfc5806fe5400 +fe5400fe5400fc5400ed5003c04204a4542de6d3cbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7e2d7d97645d25619db +5919f35609fc5402fe5400fe5400fe5400fc5300f45202ed7237faede7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffff8f4ffddccfedcccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fff1e9ffb68cff8943fe752efc5806fe5400fe5400fe5400fa5300e14c029d36038e4c2bdcd1cbffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfaffab7f +ff9750ffa25bff8137ff782fff762eff742dff712bf76d29e46526d0561bca7044faf4f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf8ff975aff6316fc5705fe5400fe5400fe5400fe5400fb5301e44d038f30 +0273270389604dfffffffffffffffffffffffffffffffffffffffffffffcfbffc09dff8b45ff7c37fc5908fe5400fe5400fe5400fe5400f85302da4c06a13b09 +bd876efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefeffeeddffb66bff9954ff5e0efd +5401fe5400fe5400fb5300eb4f02a036027327027c503afffffffffffffffffffffffffffffffffffffffffffffcfbffc19dff8b45ff7c37fc5908fe5400fe54 +00fe5400fd5300ef5002a639047e2f08d4c6beffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffcfbffbe9bff8b44ff7c37fc5908fe5400fe5400fe5400fd5300ef5002a539047e2f08d5c6beffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffcfbffbf9bff8b44ff7c37fc5908fe5400fe5400fe5400fd5300ef5002a539047e2f08d4c6beffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f6ff762dff8a44ff7c37fc5908fe5400ff5400fd5300ef5002a539047b2a038b614d +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfbffbe9bff8a44ff7c37fc5908fe5400fe5400fe5400fd5400f25102bb40058b +3408dbc8befffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefbe5dae66120e66525ef5c14fa5504fe5400fe5400fe5400fe54 +00fd5300f85505f38f5effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfbffc09dff8b45ff7c37fc5908fe +5400fe5400fe5400fd5300ef5002a639047e2f08d4c6beffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd7bffc67affbf74ffaa62ff9b54ff934dff +8f49ff8844ff7c3aec6a29d05518ecc8b6fdfaf9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffab81fc6920fc5707fe5401fe5400fe5400fe5400fc5300ee5003a439047e2a0189553befe8e5ffffffffffff +ffffffffffffffffffffffffffffffffcbaeff9453ff803bfc5e0ffe5501fe5400fe5400fd5400f55203cb4706983403caa492f9f5f3ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb676ffa059ff6e22fd5706fe5400fe5400fe5400f85201cf46 +03892e00642100e9dfdbffffffffffffffffffffffffffffffffffffffffffffcbafff9453ff803bfc5e0ffe5501fe5400fe5400fd5400f45102b43d04812b01 +c6ada1f9f7f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9adff +9352ff803bfc5e0ffe5501fe5400fe5400fd5300f45102b23d04802b01c6ada1f9f7f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffca +adff9352ff803bfc5e0ffe5501fe5400fe5400fd5300f45102b23d04802b01c6ada1f9f7f5ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff8749ff8640ff7e38fc5d0efe5501fe5400fd5300f45102b23d04802b0184533beee8e5ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffc9adff9352ff803bfc5e0ffe5501fe5400fe5400fd5400f45202ba4004882d01caaea1f9f7f5ffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffcd3bffb7f41f87331f85e13fc5504fe5400fe5400fe5400fe5400fd5300fa5301f78d59f8c8b0f4cebc +edccbce5c9bce1c8bbe0c7bbdfc7bbdfc7bbe0c7bbe1c8bbe2c9bce5cabce9ccbdf2cfbdf7d1bdfbd1bcfcd1bcfcd1bcfcd1bcfcd1bcfbd1bcfad0bcf9d0bcf6 +cebce3c9bbdac5bbd4c3bbf9f7f5ffffffffffffffffffffffffffffffffffffffffffffcbaeff9453ff803bfc5e0ffe5501fe5400fe5400fd5400f45102b43d +04812b01c6ada1f9f7f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffff8f1ffe9ccffe0bcffd0a6ffba86ffaf7affae79ffae7affa76fff8c4bf67330e68251f5d9 +ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fbebe3f28d5cf55d13fb5706fd5401fe5400fe5400fe5400fc5301ee5004b53f05892e02986044e1d3cdffffffffffffffffffffffffffffffffffffffffffff +d6c0ff9e64ff833dfd6518fd5603fe5400fe5400fd5300f45202c04204913102d1b0a0fcfafaffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffcca8ffa15fff7a31fe5d0efe5501fe5400fe5400fb5301e64e02a43702742600af8e7df0ebe9ffffff +ffffffffffffffffffffffffffffffffd7c1ff9e64ff833dfd6518fd5603fe5400fe5400fd5400f65301c543038b2f01b5907df0ebe9ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5bfff9d63ff833dfd6518fd5603fe5400fe54 +00fd5300f65201c04203892e01b6907df1ebe9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5bfff9d63ff833dfd6518fd5603fe5400 +fe5400fd5300f65201c04203892e01b5907df0ebe9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +a070ff7f39ff7d37fd6315fd5502fe5400fd5300f65201c04203892e01824a2ed7c9c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffd5bfff9d63ff833dfd6518fd5603fe5400fe5400fd5400f65201c242038c2f01b7907df1ebe9ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffd3bdff945bff7e3bfc661afc5604fe5400fe5400fe5400fe5400fe5400fd5300fa5301f65202ef5002e84e02e14c03d84903cf4703c74404c2 +4204c04204c34305ca4605d54a05e04e06e95005f05204f45303f55202f45202f15103ee5003ec5003eb4f03e84e03dc4b02a438017a2800612000c8b5abffff +ffffffffffffffffffffffffffffffffffffffffd6c0ff9e64ff833dfd6518fd5603fe5400fe5400fd5400f65301c543038b2f01b5907df0ebe9ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf3f0eac9b9d7855ddc5b1cf2570bfb5504fd5401fe +5400fe5400fe5400fa5401e75006ba4207913102a3674ae1d2cbffffffffffffffffffffffffffffffffffffffffffffe2d2ffa875ff8540fe6c21fd5704fe54 +00fe5400fd5400f45202c443038b2f02bc907bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffd4bbff995dff7d35fe6114fd5503fe5400fe5400fd5400f05102bc4003822b01a1715ae8e0dcffffffffffffffffffffffffffffffffffffff +e3d3ffa976ff8540fe6c21fd5704fe5400fe5400fe5400f95301d749039b3402975e43d8c9c2ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d1ffa774ff853ffe6c21fd5704fe5400fe5400fe5400f85201ce4603913102a5735a +e8e0dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d1ffa774ff853ffe6c21fd5704fe5400fe5400fe5400f85301d04603933202a4 +735ae8e0dcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb997fd7832ff7a34fe6419fd5603fe54 +00fe5400f85201ce4603913102804021c0aa9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d1ffa674ff853ffe6c21fd5704 +fe5400fe5400fe5400f85201ce4603923102a5735ae8e0dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d1ffa774ff8842fe +6f25fd5706fe5401fe5400fe5400fe5400fe5400fe5400fd5300fb5301fa5301fa5301fc5301fd5300fe5400fe5400fe5400fe5400fe5400fe5400fe5400fe54 +00fe5400fd5401fd5401fd5401fb5401f95301f65302f55202f45202f35202ea4f02be4002872d01682200aa8b7bffffffffffffffffffffffffffffffffffff +ffffffffe2d2ffa875ff8540fe6c21fd5704fe5400fe5400fe5400f95301d749039b3402975e43d8c9c2ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffff4eeebd7bdb1c9a28fb97f62a85126a93d08c2490de6530af75505fd5401fe5400fe5400fe5400fc5402f45506da500caf41 +0b9c3f11b9866effffffffffffffffffffffffffffffffffffffffffffffffffede3ffb286ff8841fe732bfd5806fe5400fe5400fd5400f75201d44803913102 +a0674bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d2ff925bfe7833fd +6115fd5503fe5400fe5400fd5400f55202cd46048d3002945637e1d5cfffffffffffffffffffffffffffffffffffffffeee4ffb488ff8842fe732bfd5806fe54 +00fe5400fe5400fc5301e94e02b23c028f4a29cbb6acffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffede3ffb185ff8841fe732bfd5806fe5400fe5400fe5400fa5201dc4a039a3503945637e0d5cfffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffede3ffb185ff8841fe732bfd5806fe5400fe5400fe5400fa5301e04c03a13703955637e0d5cfffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcd3bff86f2cfe7632fd6319fd5504fe5400fe5400fa5201dc4a039a35037f3714 +aa8b7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffece2ffaf83ff853ffe7129fd5706fe5400fe5400fe5400fa5201dd4a039c +3503955637e0d5cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeee4ffb78aff954efe8038fd5a09fe5401fe5400fe5400fe54 +00fe5400fd5400fb5401f95302f65304f55507f4580bf65d11f9631afd6b23ff712aff762fff772fff752cff7026ff6a1eff6416ff5e0efe5908fd5503fd5402 +fd5401fc5401fc5301fb5301fb5301f65201d548029332027a320ea47f6effffffffffffffffffffffffffffffffffffffffffffede3ffb286ff8842fe732bfd +5806fe5400fe5400fe5400fc5301e94e02b23c028f4a29cbb6acffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefdf3ece9d4c1b8c1a698b79686a27763935a3f7e330f7e29 +00872c008f3001983503a63b06c74709e85007f85404fd5401fe5400fe5400fd5402fb5606f6580be85913c85117b1420ba95227eadbd4ffffffffffffffffff +fffffffffffffffffffffffffffffffff9f5ffbc96ff8b44ff7a34fc5807fe5400fe5400fe5400fc5300ea4f02ab3a03843a16e3d9d4ffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdefe8f06927fb7331f95e12fc5503fe5400fe5400fe5400f752 +02d64a069433038a3e19f7f2f1fffffffffffffffffffffffffffffffffffffff9f5ffbe99ff8b45ff7a34fc5807fe5400fe5400fe5400fd5400f65201cf4603 +8631079a6d59fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f5ff +bb96ff8b44ff7a34fc5807fe5400fe5400fe5400fc5300ea4f02a23804833814d8c9c2fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8 +f5ffbb95ff8b44ff7a34fc5807fe5400fe5400fe5400fd5400ef5002b63e0483350fbca396ffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffdefe8f06926fd7431fa6115fc5503fe5400fe5400fc5400ea4f02a338047c2d07946c59ffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffff8f5ffb893ff853fff752efc5807fe5400fe5400fe5400fc5400ec4f02aa3a04853914d8c9c2ffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffcfaffdac0ffa35aff9750ff6112fd5502fe5400fe5400fe5400fe5400fd5400fa5505f6712ff7b08d +f4b090f2b395f4b99cfbbea0ffc2a4ffc6a6ffc9a9ffccacffcfafffd1b1ffd3b3ffd1b0ffc5a3ffbb98ffae87fd6b23fd5502fe5400fe5400fe5400fe5400fa +5300e44d03973504813009a37b67fffffffffffffffffffffffffffffffffffffffffffff9f5ffbc97ff8b45ff7a34fc5807fe5400fe5400fe5400fd5400f652 +01cf46038631079a6d59ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffff8f3f0dcc9bfbf9e8eab7e699b63487c2c057d29007f2a00802a00812a00832b00872d008d2f019533039e3805ba4107d74b06eb5105f75302 +fd5400fe5400fe5401fc5504fa5808f85b0ef36017e96523db5e1fc74e13b95524e7cec2fdfcfbffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffc7a7ff904cff7f3afc5c0cfe5401fe5400fe5400fe5300f75201d14703862c00b3907ff9f7f6ffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffff2d3c4e46a2ded6c2cf85b0efd5402fe5400fe5400fd5400f65303cb48099a350390441ff6f0eeffffff +ffffffffffffffffffffffffffffffffffffffc9a9ff904dff7f3afc5c0cfe5401fe5400fe5400fe5400fc5301ea4e03953202712500e9e1dcfefefeffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6a7ff8f4cff7e39fc5c0cfe5401fe54 +00fe5400fd5300f35102ad3c047e2900ccb7acfcfafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6a7ff904cff7f3afc5c0cfe5401 +fe5400fe5400fe5400f85201d24703882d009f735ef8f4f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9 +ebe3eb6f33f47030f95d11fd5503fe5400fe5400fd5400f35103ae3c04802a00895840f6f2f0ffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffcc1a4ff8544ff722bfc590afe5401fe5400fe5400fd5400f55202be4004832b00cdb7acfcfafaffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffff9f5ffb871ffaf67ff7a30fe5a0afe5401fe5400fe5400fe5400fd5300f85302f37c43fef5f1ffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7c3dfc5807fe5401fe5400fe5400fe5400fb5301e54f06a23905842c00bf9e8efaf8 +f7ffffffffffffffffffffffffffffffffffffffffffffc7a8ff904dff7f3afc5c0cfe5401fe5400fe5400fe5400fc5301ea4e03953202712500e9e1dcfefefe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf5f3debfb1c28d75a358348d340a872d00872d00 +882e018d2f019231029834039d3705ad3c05bd4105c74505d24805de4c04eb5003f55202fb5401fd5400fe5400fd5401fc5502fb5707fa5b0df86015f5651ff0 +6b2aec6a2ae46324d5571ad88861f1dcd0fdfcfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2b9ff9a5dff823cfd6315fd55 +02fe5400fe5400fe5400fc5301ec4f02a839027f320dd3beb4fcfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffdf9e7fd9652cea5e19f7580afd5501fe5400fe5400fb5401ec5206bc45099b3604b78066efe5e0ffffffffffffffffffffffffffffffffffffff +ffffffd3bbff9b5fff823cfd6315fd5502fe5400fe5400fe5400fd5300f65201d247039030019e6e57e8dfdaffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2baff9a5eff803bfd6215fd5502fe5400fe5400fd5300f55201bb4003862d01 +bb9a89f3efedffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2b9ff9a5dff823cfd6315fd5502fe5400fe5400fe5400fb5301e84e02a2 +3702823b18ddccc4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ddd1e8804dee6623f85b0ffc5503fe54 +00fe5400fd5400f45202ba4004892e01894f33e1d4cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8cbb5fd8950fd6c24fc5b0c +fd5501fe5400fe5400fe5400f85301d54803953201c09b89f4efedffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2c0ff +c784ffb169ff792dfe5b0afe5501fe5400fe5400fd5300f95201ec4f03f4bfa5fdf9f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffe2d3fd7d3efc5807fd5502fe5400fe5400fd5401f65303d44c09a93b0691380edac0b4fdfbfbffffffffffffffffffffffffffffff +ffffffffffffffd2baff9a5eff823cfd6315fd5502fe5400fe5400fe5400fd5300f65201d247039030019e6e57e8dfdaffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffe8d3c8c69075a852299a35049b36049c37059e3806a73b05b64005c64505d54a05e44e04ef5103f75302fc +5300fe5400fe5400fe5400fe5400fd5401fc5503fb5807fb5b0cfb5e12fb6216fa651bf96821f66d29f4702ff16e2ded6a29e86f34e88f64f1cab6fcf5f1ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffddcbffa46eff843efd6a1efd5604fe5400fe5400fe5400fd5300f95201 +e24c02a73801843d1bc1a699faf9f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3bfadc66739d05316ea5811fa +5505fe5400fe5400fc5401f45405d64f0db3430c9f3d0dc79882f8f3f0ffffffffffffffffffffffffffffffffffffffffffffdeccffa570ff843ffd6a1efd56 +04fe5400fe5400fe5400fe5400fc5301f15002c441028b2e019e6c54e2d7d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffdeccffa36fff823cfd681cfd5604fe5400fe5400fd5300f75201c944038e3002ab7c66ebe4e0ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffddcbffa46eff843efd6a1efd5604fe5400fe5400fe5400fd5300f65201d548029b3301915538d4c2b9ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeec5b2df7946ea5e19f7580afd5401fe5400fe5400fd5401f45203c34405913103 +975738d7c3b9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6d6c6f08d5df4651efa590afd5401fe5400fe5400fe5400fb5301e9 +4e02af3b02b58066ede5e0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf5ffe1b4ffc87effaf66ff7e33fe5c0cfe55 +02fe5400fe5400fb5301f05002dd5c1de8b399fcf9f8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefaf7fab593f86a25 +fb5707fd5401fe5400fd5401fa5403eb5308c7490ba43a06b26e4ce5d3caffffffffffffffffffffffffffffffffffffffffffffffffffdeccffa56fff843efd +6a1efd5604fe5400fe5400fe5400fe5400fc5301f15002c441028b2e019e6c54e2d7d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5 +ebe7cd9c85a245189e3704a43a06ae3e08c34507d94b06e74f04f25203f85302fc5301fe5400fe5400fe5401fc5603fb5808fa5c0efb6114fc661bfd6a22fe6f +28fe7431ff7a38ff7d3bff7f3dff803dff7d3bfd7836f77231f37c41f3a178f6c7b0fbece4ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffe9ddffaf80ff8943fe7229fd5706fe5400fe5400fe5400fe5400fd5400f95201e54d02b33c0181320c9c6e58e2 +d8d3fffffffffffffffffffffffffffffffffffffffffffffffffffffffaf6f4dbb9a8b35c31b8460ed65211f55507fd5401fe5400fd5401f65505e4550ec54d +12ae3f09af5c33dec2b4ffffffffffffffffffffffffffffffffffffffffffffffffffeadeffb082ff8943fe7229fd5706fe5400fe5400fe5400fe5400fe5400 +fc5400f25101d04602973201823b19a17763cdbbb3f1eceaffffffffffffefe9e7c9b8afa78e81816355ab9a92ffffffffffffffffffffffffffffffffffffff +eadeffb082ff8640fe6e24fd5705fe5400fe5400fe5400f95301d849039834039a5f43e3d8d3ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffe9ddffaf80ff8943fe7229fd5706fe5400fe5400fe5400fe5400fd5400f45101d548029e3501833c19af8c7cf1eceaffffffffffffffffffffffffffffff +fffffffffffffffffffffffff1dfd6d38762d25316ec5a11fa5605fd5401fe5400fe5400fc5401f05205ca48079a35049d5431d6bfb4ffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffff7e3d9ea9469f05d15fa5706fd5401fe5400fe5400fe5400fd5400f65201d84902c26e44e8dad3ffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ebffdeadffca7cffb86eff8c42ff6112fe5704fe5401fd5400f95201e94e02 +cd5013c68364eadbd3fffffffffffffffffffffffffffffffffffffffffffffffffffffffaefe9ecae8fe86728f4580bfb5504fe5401fd5401fa5504f1560bda +5312ba470faa4716c8947bffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9ddffaf81ff8943fe7229fd5706fe5400fe5400fe5400fe54 +00fe5400fc5400f25101d04602973201823b19a17763cdbbb3f1eceaffffffffffffefe9e7c9b7afa68d817f6355a89992ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ede8c28263a03704a73c07b14009c94809e450 +06f15204f95302fc5300fe5400fd5401fb5604f95909f85e12f8661df96f2bfc7735ff7a38ff7e3bff803dff823eff803cff7e3aff7d39ff813dff9053ffab7c +ffc09dffceb6fde0d2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffff5efffbb93ff934bff8039fe5a09fe5501fe5400fe5400fe5401fd5401fd5401fa5401f45102dd4a02a638027f2f08905a40bb9f92d8cac4f6f3f2ffff +fffffffffaf8f7dfcec6c5a08eaa6747993503af4009d24d0df45406fd5401fe5400fb5503f65709e85913ce5519bc480eaf4816cc9a81ffffffffffffffffff +fffffffffffffffffffffffffffffffffffffff5efffbd95ff934cff8039fe5a09fe5501fe5400fe5400fe5401fd5401fd5401fd5401fa5301ef4f02c944028a +2e017c28007326007125007225007426007426006f240062200067351dccbfb8fffffffffffffffffffffffffffffffff6f0ffbe98ff8f48ff782ffe5a08fe55 +01fe5400fe5400fb5402e64e04a339048d4320dbcdc6fffffffffffffffffffffffffffffffffffffffffffffffffffffffff5efffbb93ff934bff8039fe5a09 +fe5501fe5400fe5400fd5401fd5401fa5401f75302ec5002cf45029632017f310c996951bb9f92d8cac4f6f3f2fffffffffffff9f5f4d7bfb3c39279ab4e20ba +460ddc5410f65607fd5402fe5400fe5400fc5402f75505e5530cba470fa138059f4e26f2e9e4fffffffffffffffffffffffffffffff9f2eed8ad98d1a28ad2a3 +8bd7a68edfa386e47b48f4570afc5502fe5400fe5400fe5400fe5400fe5400fc5300f35101dd5613ca8c6dc39d8abd9b8ab8998ab3988ab0968ab0988dc5b3ab +fffffffffffffffffffffffffffffffffffffffbf5ffe1b9ffcb7cffc176ffa35bff7124ff5d0cfd5603fd5401fa5300ee4f02cd4502a23e0daa6e51c6a492e1 +cfc6fffffffffffffffffffaf6f4e2c3b4d49c7fc56435d45110ef560bfb5604fe5401fc5502f95808f05b11e05d1ccd5318bb4b13c17853f9f4f2ffffffffff +fffffffffffffffffffffffffffffffffffffffffffffff5efffbc94ff934cff8039fe5a09fe5501fe5400fe5400fe5401fd5401fd5401fd5401fa5301ef4f02 +c944028a2e017c28007326007125007225007426007426006f240061200062331dc8bdb8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98969aa3c07b2410ab9470fde5009f25304fa5302fd5300fe5400fd5400fa5403f45709 +f05d15ee6927f47030f97331f97331f9712ffb722fff864bff9d6affb891ffc2a2ffd3bcffdccafffefeffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a7ffa75dffa15bff67 +19fe5b0bfc5909fc5908fb5909fa590af95a0df8661ef65a0df75607fa5402f65201d74803903002822b00792800762700792800802a00892e01953202a23a06 +c1460ae95207fb5402fe5400fd5502fa5809f45d13e76221d85b1ec84e12b44008d3a188fefefdffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffcaa8ffa75dffa15bff6719fe5b0bfc5909fc5908fb5909fb590afa5a0cfa651cfa5909fb5504fe5400fb5301ea4f02ca4403a739039734039935 +049c36049b3503872d01752600773d20f3eeecffffffffffffffffffffffffffffffffd0afffa45dff8e47ff6517fe5a0afc5807fc5707fa5707ee5408ac3f09 +862c00d4c2b8fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a7ffa75dffa15bff6719fe5b0bfc5909fc5808fb5909f9590bf6 +5a0df5651ef3580cf65506fb5401f75201d74803913102842c007b29007927007b2800832b008f30019e3705b1420ce1520bf85505fd5401fe5401fd5503fb57 +06f7590ced5c14d1571bbb470ea43904cc9e88fefefdffffffffffffffffffffffffffffffffffffe08457c95013c34c12c44e14e1540ff35609fa5504fd5401 +fe5400fe5400fe5400fe5400fe5400fe5400fc5300f65201e84e02d04602b03b028c2f01822b00752600672200875a44fdfcfcffffffffffffffffffffffffff +ffffffffffffffffffe7cdffca81ffc478ffb46bffa05aff762cff6012fc5705fd5401fa5301ea4e02c74302943202872d01842c00862d018d2f01973403a23a +06b8440ade500af55506fd5402fd5502fc5807f75d11ed6421e26224d7591bc74c10c87248f8f0ecffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffc9a7ffa75dffa15bff6719fe5b0bfc5909fc5908fb5909fb590afa5a0cfa651cfa5909fb5504fe5400fb5301ea4f02ca4403a7390397 +34039935049c36049b3503872d017225006d3920f1edecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffe2b8a3be5624bd480fc54f14e4520bf55404fc5401fe5400fe5400fd5401f85403ef5409e25612d95b1de1692eed8857f5b190f9c9b1fc +ded0fef9f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdabfffc37fffbb71ffa65fff8d47ff823cff7e39ff7c39ff7b3a +fe7938ffb28dffc2a4ff955dff8644ff752dfd5f11fe5502fc5300f25102e04c04d24905d34a06de4d06ec5105f75403fd5400fe5401fc5605fa5d0ff8651df3 +6d2cec6929e05f21d05315c96230e1b6a1faf4f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbbfffc37fffbb71ffa6 +5fff8d47ff823cff7e39ff7d39ff7d3bff7d3bffb690ffb892ff8f50ff7931ff671afd5908fe5501fe5400fd5400fd5400fd5400fc5300f15102c041038d2f01 +ab775ef0e7e3ffffffffffffffffffffffffffe4c9ffc381ffb46cff954dff7b33ff7128ff6d24fb6921eb611dc34c12993504c9a795f7f3f1ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffdabeffc37fffbb71ffa65fff8d47ff823cff7d39ff7b38fe7937f97534fab08afdceb6ff9d6bff8a48ff78 +30fe6214fe5604fe5400f75202e84f04db4c05da4c06e34f06f05205f95403fd5401fd5502fc5706fb5b0df96217f66923ef6c2be36324cf5317b9430ac78260 +f5e9e3ffffffffffffffffffffffffffffffffffffffffffffba90ff9351ff8845fe6b22fc5c0dfc5705fd5402fe5400fe5400fe5400fe5400fe5400fe5400fe +5400fd5400fb5301f95301f85302f85301f75302ee5103bf42048e3001925537e9ded9fffffffffffffffffffffffffffffffffffffffffffffffffffbf6ffdc +b4ffc079ffb76cffaf65ffa35cff904aff7228fd5d0efd5503fd5300f85201ed5002e04c03d74904d84b04e24e05ef5104f95402fd5400fd5603fc5c0efc671e +f9722ff16e2de56324d85819cf6029dfa385f9f0ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdabeffc37fff +bb71ffa65fff8d47ff823cff7e39ff7d39ff7d3bff7d3bffb690ffb892ff8f50ff7931ff671afd5908fe5501fe5400fd5400fd5400fd5400fc5300f15102b53e +03822b019d735eede6e3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe19976d0561ad4 +591ce55812f65506fc5401fe5400fe5400fd5400fb5301f25204df5009d77749e9c0adfbf2eeffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffe9d2ffd192ffc476ffb065ff9c53ff9049ff8a44ff8640ff803aff7934ffa275ffe6dafffaf8ffddc7ff +b57effa65fffa65eff9c55ff7e34ff6416fe5b0afd5807fe5909fe5c0eff6215ff691fff722cfe7735fc7635f87230f16b29e4601fda6930e09a78f5e2d9ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9d2ffd192ffc476ffb065ff9c53ff9049ff8a44ff8640ff833d +ff803bffaa7cffe8dcffeadbffbc89ffa65fffa35cff9d56ff8841ff742bff6b20ff681efb661dec611cd05416b2430c9d3704c58e73f4e9e5ffffffffffffff +fffffff0dbffd699ffc377ffb168ff9f58ff924dff8a46ff833ff57332d75a1dae400ac48e73f1e9e4ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffe9d2ffd192ffc476ffb065ff9c53ff9049ff8a43ff843eff7d38fd7531fc9f72fee5d9ffffffffe5d3ffbc8affaa64ffa75effa15aff8b43ff6f24 +ff6112fe5c0cfe5c0cff5e10ff6417ff6b20ff732bff7a36ff7a38fd7634f7712fee6827de5b1cd46b37e0aa90f6ebe5ffffffffffffffffffffffffffffffff +ffffffffffffffffffddbaffc680ffc377ffb56dff9046ff6c1ffe5b0bfe5503fe5400fe5400fe5400fe5400fe5400fe5400fd5401fa5402f45405ed550be85b +15e66322e26224cf5418af4009a3522cdbc2b6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f2ffd9b9ffba7cffad63ffaa60 +ffa85effa159ff9752ff7e37fe671bfc5c0dfb5707fc5504fd5503fc5605fc590afd6014fe6d26ff7835ff7a38fe7734f7702de96422de6b32e39b79f6e2d9ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8d1ffd091ffc476ffb065ff9c53ff9049ff8a44ff86 +40ff833dff803bffaa7cffe8dcffeadbffbc89ffa65fffa35cff9d56ff8841ff742bff6b20ff681efb661dec611cce5215aa3e09892d02b18672eee7e4ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf2edf4ac89f06927f36925f65c11fc5503fe5400fe5400fe54 +00fd5400f95302ec5004e8895af8ebe4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffff0dad0c379569d3605913102892e01832b0085350e925030996145955f458f5d45865a45a68c7feae5e3ffffffffffffffffffffffffffffffffffffff +ffffffffffffefdfffc68effa455ff9145ff8137ff7930ff752dff712afc6c26f66721f48750fad5c2ffffffffffffffffffffeee1ffd0abffc089ffaf6affa5 +5cff9e56ff9851ff934dff8f49ff8b45ff8640ff7e39fc7430f56b28ed7032ec9367f1c3adfaebe4ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffeedeffc58dffa455ff9145ff8137ff7930ff752dff722aff7028fe6d26fe8e57ffd9c6fffffffffcfaff +e8d6ffc494ffab66ffa359ff9d54ff954dff8d46ff833efa7632e96423d05215c55b28d49374f0dacffffffffffffffffffffff4e5ffd7a1ffbf71ffb469ffa6 +5dff9952ff904aff8641f97734e26121bd470dbe7551ecded8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdfffc68effa656ff9346 +ff8238ff7a31ff762dff722afc6c25f3651ff1844ff9d4c2fffffffffffffffffffff7f0ffe1c9ffc99cffb373ffa65cffa35aff9e56ff9851ff934dff8f49ff +8b45ff853fff7d38fc7430f46b28ee753aeb9469efbba2f9ebe4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7cdffc37fffc4 +74ffc97bffc378ffac63ff8137fe5f0ffd5603fe5400fe5400fe5400fe5400fe5400fb5401f35304e0510bce5113d05519db5c1ce15e1dd95717c4490cb35120 +d2a893ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe5ffd2b2ffbd8cffaa66ffa156ff9f56ff9a51ff +934cff8f49ff8d47ff8c46ff8a45ff8642ff803cff7834fb702cf57232f28650f1a27af4c9b4fcf2eeffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffeedeffc58dffa455ff9145ff8137ff7930ff752dff722aff7028fe6d26fe8e57ffd9c6ffffff +fffcfaffe8d6ffc394ffaa66ffa259ff9d54ff954dff8d46ff833efa7632e76323ca4f12b65323c18a70e5d5ceffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffff6f2ffc6a6ff8842ff823dff6215fd5603fe5400fe5400fe5400fd5400f95301ef5b12e99a72ffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefcfce9ccbead4614a139069a350494 +33038f31028c2f01892e01862d01822b007b28006f2400855037f7f4f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfcfff2eaffdbc5ffcbadffc3a2ffc2a0ffc09f +ffbd9dfdc1a4fbd8c7fbe7ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf6ffe5d4ffd3b8ffc4 +a3ffc1a0ffbe9dfcc1a4fad7c6fae6dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf7ffe7d7ffdac2ffc6a5ffc4a3ffc2a1ffc1a0ffbe9dfdc2a4fbd8c7fbe7ddffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f0ffcda3ff8238 +ff5d0dfd5502fe5400fe5400fe5400fe5400f95302e75005d16733eed8cdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf6ffe6d6ffd8c1ffc5a3ffc3a1ffc2a0ffc2a0ffc1a0ffbe +9dfdc2a4fbd5c3faddcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf6ffe4d3ff +d2b7ffc4a2ffc19ffebd9cfbc1a3f9d6c6f9e6dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffefff3ecffa559ffa860ff782dfe5908fe5401fe5400fe5400fe5400fc5300f25102dd500bebcdbfffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefef6ede7bb6235b0410bbc4409cb4706cf4705cf4704cf4704d24703d74803d146 +02a63802872f04a6745cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefcffe2beffae66ff7428fe5908fe5401fe5400fe5400fe +5400f85301de4d05a5400ee4cbbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7aeff +c47cffb269ff752afe5b0bfe5502fe5400fe5400fd5300f95301eb4f02cb4502bd7959d0b0a1f1e9e5fefdfdffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffedded6d5aa95b45628b4450fd04c0be85007f35203f75302f95301fb5301fb5301f55202d84c07aa3c06923102d1b1a1faf7f5ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c7ffc680ffae67ff7428fe5c0cfd5604fe5401fd5400f85302d64a059c3503d4b1a1faf7 +f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff8a8aff8a8affffffffffffff8a8aff8a8affffffffffffffffffffbbbbff4545ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf8ffdaa6ffca7effb86fff883eff6516fe58 +07fd5502fe5400fd5300fa5201ed4f02d046029e3501852c00883c16965739ac7c66bb9583be9b8abd9b8abe9b8abf9b8aae7e66a4684a994a23973708a33906 +b9440bda4f09f15305fb5402fe5400fe5400fd5401fb5402f35508da5411c14a10ab3d07bf7e5eeee0d8ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffe9d0ffd190ffc77affb56cff8d45ff6e22fe5f10fd5807f85505d54b069f3703c1947ef3ece9ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8aff8a8affffffff +ffffff8a8aff8a8affffffffffffffffffffbbbbff4545ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f1ffe1b7ffcb82ffbe74ffa65eff8339ff6619fe5b0bfd5604fd5401fd5400 +f95300ec4f01d54802b63d039934028d30028b2f018a2e01892e01892e018b2e018e30019533039e3805b64107d74c08ef5206fa5403fd5401fe5400fc5503fa +5707f65a0ded5e18df5e1ecf5418bc460dc16f46e8cfc2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5cbc7a6694c9f38069031027b290062270b +a48e84fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4e9ffdaae +ffc880ffc375ffb96effac64ff9b55ff8139fa661cdb5310a93d08b3785bebe1dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8aff8a8affffffffffffff8a8aff8a8affffffff2121ffdf +dfffbbbbff4545ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffefcffeedbffcd91ffbf72ffb66cffa860ff944eff7a30ff6619fd5b0bfc5604fd5401fe5400fc5300fa5301f7 +5201f35202f05102ef5103ef5003f05103f25103f55203f95302fd5401fe5400fe5401fd5603fb5808fa5e11f8641cf56a27ef6c2ce66525d8591bca5319ce7c +54efdad0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbd9bdafa03b0ba53a05963403832c016d2400734833c5c5c5ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf9ffecdaffd0a4ffba77ffb065ff +aa60ff9751f27534c24d14ae5f39e5d6cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff8a8aff8a8affffffffffffff8a8aff8a8affaaaaff4545ff7676ffbbbbff4545ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffdfaffe5ccffc791ffb265ffae64ffa960ffa25bff9a54ff8f4bff7b34ff6e26ff661cfd6216fc5f12fc5e10fc5d0efc5c0efc5c0efc5c +0efd5d0ffd5f11fe6215ff671bff6c22ff722aff7733ff7b39fe7836f97331f46e2ceb6624de5e1fd87848e8bda7ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffff4f1ef95715fa93e08b1420aa93d08a138037f2a0065210156301cdadadbffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffefe2ffcfaaffad70fd8a43e86423b64d1ae1cc +c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff8a8aff8a8affffffffffffff8a8aff8a8aff4545ffdfdfff5555ffaaaaff4545ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffff3eaffd3b2ffbf8effa963ffa157ff9d53ff974fff914aff8e47ff8c46ff8c46ff8c46ff8c46ff8d47ff8d47ff8d47ff8d47ff8d47ff8d47ff8d47ff8b45 +ff8741ff813bff7834f96f2bef6724ea7b44eead8df5daccfefcfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0c0c1a944 +12b7430bbf4a12db4f0ae34d03be4002802b00632100441d0ac2bfbefbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0e7fabd9fd37141e2c1b1fdfbfaffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8aff8a8affffffff +ffffff8a8aff6666ff6666ffffffff9a9aff6666ff4545ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeee4 +ffdbc4ffc9a9ffb58bffa26eff9c67ff8747ff7932ff772eff772eff772eff772eff772eff772eff7d38ff945bff9a65ff9e6dfeb490fabfa2f8cebafdf3eeff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbb9b4b19d4f2aaa3c06bd4910db520ff15306f85302ef5002 +c543028c2f016822004d1a0173645cd0cfcefafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8aff8a8aff4545ff4545ff8a8aff8a8aff8a8aff0000ffbbbbffffffffff +ffff1111ff4545ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef4f4f4dfdfdfcdcdcec7c7c8c7c7c8c7c7c8 +c7c7c8c7c7c8c7c8c8c8c8c9c9c9cacccdcdbcbab88a6d5e8035109c3604af420bce4e0eed5409fa5403fe5400fc5301f35102d347029b3401742600601f004c +1d05604a3fa09c9bc4c4c4c5c5c6c5c5c6c6c6c6c6c6c6c6c6c6c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6 +c7c6c6c7c6c6c7c6c6c7c6c7c7c6c7c7c7c7c7c7c7c8c7c7c8c7c7c8c7c7c8c7c7c8c7c7c8c7c7c8c7c7c8c7c7c8c7c7c7c7c7c7c6c7c7c6c6c7c6c6c7c6c6c6 +c6c6c6c9c9c9dcdcdcf5f5f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffbbbbffbbbbffbbbbffbbbbffbbbbffbbbbffdfdfffbbbbffffffffffffffffffffcfcfffcfcfffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffbf8f5e8d3c8bc8b738c46257229056b23006a22006922006922006922006b23006d230072250079 +2800832b008e30019b3604ae4009ca4b0dec5308f95403fd5401fe5400fe5400fd5400f75201e54d02ba3f02892e017928006e24006722006621006521006521 +00662100672200672200682200682200682200682200682200682200682200682200682200682200682200682200682200682200682200682200682200682200 +6922006922006922006922006922006922006922006922006922006922006922006922006922006922006822006622006421006022056e3f28ab968cf1eeedff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffcefe8ec986edc6e38c65218c84808c94605c74504c64404c64404c64404c64404c64405c54506c64608c9490ad14d0bde510bec5308f654 +05fb5402fd5401fe5400fe5400fe5400fe5400fe5400fb5300f65201ec4f02de4a02d14602c94402c74302c74303c74403c74404c64404c64404c64404c64404 +c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c6 +4404c64404c64404c64404c64404c64404c64404c64404c64404c64404c54404c04103ac3a02853007864a2dbba49affffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc596ffc5 +83ffb26bff853cff742bff6f26ff6e25ff6e25ff6e25ff6e25ff6e24ff6d21ff6c1fff691cff6618ff6011fe5b0afd5705fd5502fe5400fe5400fe5400fe5400 +fe5400fe5400fd5400fa5402f45305ed5308e8540be8570fed5c14f46119fa671eff6b22ff6d24ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff +6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e +25ff6e25ff6e25ff6e25ff6e25ff6d24fc6921ec611cc24c139d3c0da57259fefdfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ecffdfc2ffbb88ff995eff884cfa8146f87f44 +f87f44fa8146fe8448ff8b4fff9558ffa160ffb067ffb76dffb66cffab64ff8439ff6517fd5907fe5502fe5400fe5400fe5400fd5401f85403ed560ad85717d5 +591cd75b1ddf5f20df6629e16d34ea743bf1793ff57c42f77e43f87e43f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f +44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f67d42 +f1793fe46f36cc5d27b45b2fd2ae9df8f3f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefbfbfbf5f6f6f2f3f3f2f2f2f2f2f2f2f2f2f2f2f2f2f3f3f3f3f4f4f4f5f5 +f5f6e8e9eaf3c1a3ffb572ffbf72ffbe74ffac63ff7f34fe5f0ffe5603fe5400fd5401f95403eb5409d35212c64e14c34b10b04f21b59687d8d8d9eeeeeef1f1 +f1f1f1f2f1f2f2f1f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 +f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f1f2f2f1f1f2f1f1f1f0f0f0f3f3f3fafafaff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf2edfcd1b8ffc0 +87ffc67bffbb71ff8f46fe6011fd5502fc5401f05306d24d0db5440dae3e08ad6a4ad1cccafcfcfcffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f5ffdcc1ffca7cffba70ff8b41ff5b0b +fa5403e35008b3430ca239059f522cd0c9c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeece2ffc379ffb36aff6c1ffb5604db4f0ba53b0790350ab2b2b3ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffc6a4ffbb75ff8b42fc5d0ec1480d973505723b20e8e1deffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffcd9affa057fb6c1fc34608923203ac8e80eaeaeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5b1ffa25a +fb7b30ca470683320aad8e7ffafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1cdff9852fb8138d449058c4523aaa29effffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffef2ebff8e49fd813add4d05893b16d2d2d2ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffefefeff9153ff7c35e1510a7f2a00e5dedbfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa674 +ff7932df540f8a2e01ccb8affafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc97ff7933e35915973302b08f80f5f5f6ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd3bbff7c37eb601aa63903966953f1f1f1ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffeadfff803ef66820b73f037e4427edededffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff8c4bff742bca47066b2400e6e5e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffab74ff883fd35413822b02d0c1b9fb +fbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcd9fffae66db74359d3f12c6a899fafafaffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffead1ffc887f09855cb6b3cd3b09ffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffaf6ffdfc2faab72e99367f0ded5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0400000007010100030000000000}}}{\b\fs36\lang1033 +\par }{\lang1033 +\par +\par +\par +\par +\par +\par +\par }{ +\par }\pard \widctlpar\adjustright { +\par }\pard \qc\widctlpar\adjustright {\b\f17\fs36 \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \line \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e9 \'ef\'ee\'e4\'f1\'e8\'f1\'f2\'e5\'ec\'fb}{\b\fs36\lang1033 Estex}{\b\fs36 }{\b\fs36\lang1033 v}{ +\b\fs36 1.54 +\par }{ +\par +\par }{\fs24\lang1033 ( }{\f17\fs24 c \'f2\'e0\'e1\'eb\'e8\'f6\'e5\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e9 }{\fs24\lang1033 Estex DSS v1.}{\fs24 55}{\fs24\lang1033 ) +\par }{ +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par }{\lang1033 +\par +\par }{\lang1033 {\field{\*\fldinst SYMBOL 211 \\f "Symbol" \\s 10}{\fldrslt\f3\fs20}}}{\f17\lang1033 2002 \'cf}{\f17 \'e5\'f2\'e5\'f0\'f1}{\f17\lang1033 \'cf\'eb\'fe\'f1 +\par }\pard \widctlpar\adjustright {\page +\par }\pard\plain \s1\qc\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \b\f1\fs28\lang1049\kerning28\cgrid {\f23 \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e9 }{\lang1033 Estex DSS (DOS)}{ + v1.54 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\lang1033 \u8195\'20}{\f17 \'c2\'e7\'e0\'e8\'ec\'ee\'e4\'e5\'e9\'f1\'f2\'e2\'e8\'e5 \'f1 \'c4\'ce\'d1 \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'ef\'f0\'e8 \'ef\'ee\'ec\'ee\'f9\'e8 \'e8\'ed\'f1\'f2\'f0\'f3 +\'ea\'f6\'e8\'e8 RST 10h. \'c2 }{\v +\par }{\f17 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ea\'ee\'ed\'ea\'f0\'e5\'f2\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8, \'e2 \'ea\'e0\'f7\'e5\'f1\'f2\'e2\'e5 \'e2\'f5\'ee\'e4\'ed\'fb\'f5 \'e8 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'f5 \'ef\'e0\'f0\'e0 +\'ec\'e5\'f2\'f0\'ee\'e2 }{\v +\par }{\f17 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'fe\'f2\'f1\'ff \'f0\'e0\'e7\'eb\'e8\'f7\'ed\'fb\'e5 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'fb, \'ef\'f0\'e8 \'fd\'f2\'ee\'ec \'ed\'ee\'ec\'e5\'f0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e7\'e0\'e4\'e0\'e5\'f2\'f1\'ff \'e2 \'f0\'e5 +\'e3\'e8\'f1\'f2\'f0\'e5 C. }{\v +\par }{\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'ee\'f0\'e3\'e0\'ed\'e8\'e7\'f3\'fe\'f2 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0\'ec\'e8, \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'e8\'e5 \'ef\'e0\'ec\'ff\'f2\'e8, \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 +\'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec \'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'e7\'e0\'e8\'ec\'ee\'e4\'e5\'e9\'f1\'f2\'e2\'e8\'e5 \'f1 \'f0\'e0\'e7\'eb\'e8\'f7\'ed\'fb\'ec\'e8 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0\'ec\'e8. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'d4\'e0\'e9\'eb\'ee\'e2\'e0\'ff \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'d4\'e0\'e9\'eb\'ee\'e2\'e0\'ff \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff - \'fd\'f2\'ee \'f1\'f2\'f0\'ee\'ea\'e0 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2, \'f1\'ee\'e4\'e5\'f0 +\'e6\'e0\'f9\'e0\'ff \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee }{\v +\par }{\f17 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0, \'e8\'ec\'e5\'ed\'e0 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'ee\'e2 \'f0\'e0\'e7\'e4\'e5\'eb\'b8\'ed\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'ec \ldblquote \\\rdblquote \'e8 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0. \'c8 +\'ec\'e5\'ed\'e0 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 \'e8 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'ee\'e2 \'ec\'ee\'e3\'f3\'f2 \'e1\'fb\'f2\'fc \'ef\'f0\'ee\'ef\'f3 +\'f9\'e5\'ed\'fb. \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0}{\lang1033 : +\par }\pard \s19\sa120\widctlpar\adjustright {\lang1033 C:\\TEXT\\DOC\\text.doc +\par A:file.txt +\par \\TEXT\\info.txt +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'c4\'ce\'d1 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2 \'e4\'eb\'ff \'e4\'e8\'f1\'ea\'ee\'e2\'fb\'f5 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2 \'e8\'ec\'e5\'ed\'e0 A:, B:, C: \'e8 +\'f2.\'e4. \'c8\'ec\'ff }{\v +\par }{\f17 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 \'ec\'ee\'e6\'e5\'f2 \'e1\'fb\'f2\'fc \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'ee \'ef\'e5\'f0\'e5\'e4 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0, \'f7\'f2\'ee\'e1\'fb \'f3\'ea\'e0\'e7\'e0\'f2\'fc \'e5\'e3\'ee }{\v + +\par }{\f17 \'ec\'e5\'f1\'f2\'ee\'ed\'e0\'f5\'ee\'e6\'e4\'e5\'ed\'e8\'e5. \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'ea\'ee\'ec\'e0\'ed\'e4\'e0 DIR C:DATFILE \'e8\'f9\'e5\'f2 DATFILE \'ed\'e0 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e5 C: \'e2 }{\v +\par }{\f17 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5. \'ca\'ee\'e3\'e4\'e0 \'e8\'ec\'ff \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 \'ff\'e2\'ed\'ee \'ed\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee, \'c4\'ce\'d1 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2 +\'f2\'e5\'ea\'f3\'f9\'e5\'e5 }{\v +\par }{\f17 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee. \'cf\'ee\'f1\'eb\'e5 \'e7\'e0\'ef\'f3\'f1\'ea\'e0 \'f1\'e8\'f1\'f2\'e5\'ec\'fb \'f2\'e5\'ea\'f3\'f9\'e8\'ec \'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'f1\'ff \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee, \'f1 \'ea\'ee +\'f2\'ee\'f0\'ee\'e3\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e7\'e0\'e3\'f0\'f3\'e6\'e5\'ed\'e0 \'c4\'ce\'d1. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'c8\'ec\'e5\'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2 \'f1\'ee\'f1\'f2\'ee\'ff\'f2 \'e8\'e7 \'e4\'e2\'f3\'f5 \'f7\'e0\'f1\'f2\'e5\'e9. \'cf\'e5\'f0\'e2\'e0\'ff \'f1\'ee\'e4\'e5\'f0\'e6 +\'e8\'f2 1 \'e4\'ee 8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2. \'c2 }{\v +\par }{\f17 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ea\'ee\'ed\'f2\'e5\'ea\'f1\'f2\'e0 \'ef\'ee\'e4 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 \'e8\'ed\'ee\'e3\'e4\'e0 \'ef\'ee\'e4\'f0\'e0\'e7\'f3\'ec\'e5\'e2\'e0\'e5\'f2\'f1\'ff \'e8\'ec\'e5 +\'ed\'ed\'ee \'fd\'f2\'e0 }{\v +\par }{\f17 \'ef\'e5\'f0\'e2\'e0\'ff \'f7\'e0\'f1\'f2\'fc. \'c2\'f2\'ee\'f0\'e0\'ff \'f7\'e0\'f1\'f2\'fc, \'ea\'ee\'f2\'ee\'f0\'e0\'ff \'ed\'e5 \'ee\'e1\'ff\'e7\'e0\'f2\'e5\'eb\'fc\'ed\'e0 \'e8 \'f1\'eb\'f3\'e6\'e8\'f2 \'e4\'eb\'ff \'ef\'ee\'ff\'f1\'ed\'e5\'ed +\'e8\'ff \'f2\'e8\'ef\'e0 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8 \'ed\'e0\'f5\'ee\'e4\'ff\'f9\'e5\'e9\'f1\'ff \'e2 \'f4\'e0\'e9\'eb\'e5, \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2 \'e4\'ee 3 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8 \'ed\'e0\'e7\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'f0\'e0\'f1 +\'f8\'e8\'f0\'e5\'ed\'e8\'e5\'ec. }{\v +\par }{\f17 \'cf\'f0\'e8 \'ed\'e0\'ef\'e8\'f1\'e0\'ed\'e8\'e8 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 \'ee\'e1\'e5 \'f7\'e0\'f1\'f2\'e8 \'f0\'e0\'e7\'e4\'e5\'eb\'ff\'fe\'f2\'f1\'ff \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'ec \'f2\'ee\'f7\'ea\'e0. \'d2\'e0\'ea, \'ed\'e0 +\'ef\'f0\'e8\'ec\'e5\'f0, }{\v +\par }{\f17 \'e8\'ec\'e5\'ed\'e0 NAME \'e8 NAME. \'ee\'e4\'e8\'ed\'e0\'ea\'ee\'e2\'fb. \'c2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 \'ed\'e5 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'fe\'f2\'f1\'ff \'f1\'e8\'ec\'e2\'ee\'eb\'fb \'f1 \'ea\'ee\'e4\'ee\'ec }{\v +\par }{\f17 \'ec\'e5\'ed\'fc\'f8\'e5 32, \'e0 \'f2\'e0\'ea\'e6\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb: . \ldblquote / \\ [ ] : | < > + = ; , }{\v +\par }{\f17 \'cf\'ee\'f1\'ea\'ee\'eb\'fc\'ea\'f3 \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e8 \'f2\'ee\'e6\'e5 \'f4\'e0\'e9\'eb\'fb, \'e8\'f5 \'e8\'ec\'e5\'ed\'e0 \'ee\'e1\'f0\'e0\'e7\'f3\'fe\'f2\'f1\'ff \'f2\'e5\'ec \'e6\'e5 \'f1\'ef\'ee\'f1\'ee\'e1\'ee\'ec +. }{\v +\par }{\f17 \'c8\'ec\'ff \'ee\'f1\'ed\'ee\'e2\'ed\'ee\'e3\'ee (\'e8\'eb\'e8 \'ea\'ee\'f0\'ed\'e5\'e2\'ee\'e3\'ee) \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 \'e2\'f1\'e5\'e3\'e4\'e0 \ldblquote \\\rdblquote . \'ca\'f0\'ee\'ec\'e5 \'fd\'f2\'ee\'e3\'ee, \'ef\'f0\'e8 \'f1 +\'ee\'e7\'e4\'e0\'ed\'e8\'e8 }{\v +\par }{\f17 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 \'e2 \'ed\'b8\'ec \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'fe\'f2\'f1\'ff \'e4\'e2\'e0 \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'fb\'f5 \'fd\'eb\'e5\'ec\'e5\'ed\'f2\'e0, \'f1 \'e8\'ec\'e5\'ed\'e0\'ec\'e8 \ldblquote . +\rdblquote \'e8 \ldblquote ..\rdblquote . \'c8\'ec\'ff }{\v +\par }{\f17 \ldblquote .\rdblquote \'ee\'e1\'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ea\'e0\'f2\'e0\'eb\'ee\'e3. \'c8\'ec\'ff \ldblquote ..\rdblquote \'ee\'e1\'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3 \'e2\'e5\'f0\'f5 +\'ed\'e5\'e3\'ee \'f3\'f0\'ee\'e2\'ed\'ff. }{\v +\par }{\f17 \'cd\'e5\'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'ea\'ee\'ec\'e0\'ed\'e4\'fb \'e8 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'c4\'ce\'d1 \'e2 \'e8\'ec\'e5\'ed\'e0\'f5 \'f4\'e0\'e9\'eb\'ee\'e2 \'ef\'ee\'e7\'e2\'ee\'eb\'ff\'fe\'f2 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0 +\'f2\'fc }{\v +\par }{\f17 \'e3\'eb\'ee\'e1\'e0\'eb\'fc\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb \'fd\'f2\'ee \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8 *, \'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'ec\'ee\'e6\'ed\'ee \'e2\'f1\'f2\'e0\'e2\'eb\'ff\'f2\'fc \'e2 \'e8\'ec\'ff \'e8 \'e2 }{\v + +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0. \'d1\'e8\'ec\'e2\'ee\'eb ? \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2, \'f7\'f2\'ee \'e2\'ec\'e5\'f1\'f2\'ee \'ed\'e5\'e3\'ee +\'ec\'ee\'e6\'e5\'f2 \'e1\'fb\'f2\'fc \'eb\'fe\'e1\'ee\'e9 \'e4\'f0\'f3\'e3\'ee\'e9 \'f1\'e8\'ec\'e2\'ee\'eb. \'d1\'e8\'ec\'e2\'ee\'eb }{\v +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 * \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2, \'f7\'f2\'ee \'e2\'ec\'e5\'f1\'f2\'ee \'ed\'e5\'e3\'ee \'ec\'ee\'e6\'e5\'f2 \'e1\'fb\'f2\'fc \'eb\'fe\'e1\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'e8\'ec\'e2 +\'ee\'eb\'ee\'e2. +\par }{\i\f17 \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 *.txt \tab - \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'e2\'f1\'e5 \'f4\'e0\'e9\'eb\'fb \'f1 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5\'ec txt +\par a??.* \tab - \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'f4\'e0\'e9\'eb\'fb \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'e2 \'f2\'f0\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'e8 \'ef\'e5\'f0\'e2\'fb\'ec \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'ec \ldblquote a\rdblquote +\par dc*.exe \tab - \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'fb\'e5 \'f4\'e0\'e9\'eb\'fb \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'eb\'fe\'e1\'ee\'e9 \'e4\'eb\'e8\'ed\'fb \'e8 \'ed\'e0\'f7\'e8\'ed\'e0\'fe\'f9\'e8\'ec\'f1\'ff \'f1 +\ldblquote dc\rdblquote +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b \u8195\'20}{\b\f17 \'c0\'f2\'f0\'e8\'e1\'f3\'f2\'fb \'f4\'e0\'e9\'eb\'e0: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'ca\'e0\'e6\'e4\'fb\'e9 \'e1\'e8\'f2 \'e1\'e0\'e9\'f2\'e0 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'e2 \'e7\'e0\'e4\'e0\'b8\'f2 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'b8\'ed\'ed\'fb\'e9 \'e0 +\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0. \'c0\'f2\'f0\'e8\'e1\'f3\'f2\'fb }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f4\'e0\'e9\'eb\'ee\'e2 \'ec\'ee\'e6\'ed\'ee \'e8\'e7\'ec\'e5\'ed\'ff\'f2\'fc \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 \'c4\'ce\'d1. +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'e1\'e8\'f2 0 - \'d2\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +\par \'e1\'e8\'f2 1 - \'d1\'ea\'f0\'fb\'f2\'fb\'e9 +\par \'e1\'e8\'f2 2 - \'d1\'e8\'f1\'f2\'e5\'ec\'ed\'fb\'e9 +\par \'e1\'e8\'f2 3 - \'cc\'e5\'f2\'ea\'e0 \'f2\'ee\'ec\'e0 +\par \'e1\'e8\'f2 4 - \'ca\'e0\'f2\'e0\'eb\'ee\'e3 +\par \'e1\'e8\'f2 5 - \'c0\'f0\'f5\'e8\'e2\'ed\'fb\'e9 +\par \'e1\'e8\'f2 6 - \'cd\'e5 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2\'f1\'ff +\par \'e1\'e8\'f2 7 - \'cd\'e5 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2\'f1\'ff +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'f2\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff\rdblquote . \'cf\'f0\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e8 1 \'e8\'e7 \'f4\'e0\'e9\'eb\'e0 \'ec\'ee\'e6\'ed\'ee \'f7\'e8\'f2\'e0\'f2\'fc, \'ed\'ee + \'e2 }{\v +\par }{\f17 \'ed\'e5\'e3\'ee \'ed\'e5\'eb\'fc\'e7\'ff \'ef\'e8\'f1\'e0\'f2\'fc \'e8 \'e5\'e3\'ee \'ed\'e5\'eb\'fc\'e7\'ff \'f1\'f2\'e5\'f0\'e5\'f2\'fc. +\par \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'f1\'ea\'f0\'fb\'f2\'fb\'e9\rdblquote . \'cf\'f0\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e8 1 \'f4\'e0\'e9\'eb \'ed\'e5\'e2\'e8\'e4\'e5\'ed \'e4\'eb\'ff \'ee\'e1\'fb\'f7\'ed\'fb\'f5 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'e9 \'c4 +\'ce\'d1. +\par \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'fb\'e9\rdblquote . \'d3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2, \'f7\'f2\'ee \'f4\'e0\'e9\'eb \'ff\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'fb\'ec. }{\v +\par }{\f17 \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'ec\'e5\'f2\'ea\'e0 \'f2\'ee\'ec\'e0\rdblquote . \'c2 \'f1\'f2\'e0\'f0\'fb\'f5 \'e2\'e5\'f0\'f1\'e8\'ff\'f5 MSDOS \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'eb\'f1\'ff \'e4\'eb\'ff \'e7\'e0\'e4\'e0\'ed\'e8 +\'ff }{\v +\par }{\f17 \'ec\'e5\'f2\'ea\'e8 \'e4\'e8\'f1\'ea\'e0. +\par \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'ea\'e0\'f2\'e0\'eb\'ee\'e3\rdblquote . \'cf\'f0\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e8 1 \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'f6\'e8\'f0\'f3\'e5\'f2 \'f4\'e0\'e9\'eb \'ea\'e0\'ea \'ea\'e0\'f2\'e0\'eb\'ee\'e3, }{\v + +\par }{\f17 \'ef\'ee\'e4\'f7\'e8\'ed\'b8\'ed\'ed\'fb\'e9 \'e4\'e0\'ed\'ed\'ee\'ec\'f3 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'f3 \'e8\'eb\'e8 \'fd\'eb\'e5\'ec\'e5\'ed\'f2\'fb \ldblquote .\rdblquote \'e8 \ldblquote ..\rdblquote . +\par \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'e0\'f0\'f5\'e8\'e2\'ed\'fb\'e9\rdblquote . \'dd\'f2\'ee\'f2 \'e1\'e8\'f2 \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ef\'f0\'e8 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff\'f5 \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 + \'f4\'e0\'e9\'eb. }{\v +\par }{\f17 \'c5\'e3\'ee \'ec\'ee\'e3\'f3\'f2 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc \'f3\'f2\'e8\'eb\'e8\'f2\'fb \'f1\'ee\'e7\'e4\'e0\'fe\'f9\'e8\'e5 \'e0\'f0\'f5\'e8\'e2\'ed\'fb\'e5 \'ea\'ee\'ef\'e8\'e8 \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed +\'e8\'ff }{\v +\par }{\f17 \'e8\'e7\'ec\'e5\'ed\'b8\'ed\'ed\'fb\'f5 \'f4\'e0\'e9\'eb\'ee\'e2. +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'cf\'f0\'e8 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'e8 \'f4\'e0\'e9\'eb\'e0, \'c4\'ce\'d1 \'e0\'e2\'f2\'ee\'ec\'e0\'f2\'e8\'f7\'e5\'f1\'ea\'e8 \'f1\'ee\'e7\'e4\'e0\'b8\'f2 \'e1\'eb\'ee +\'ea \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec. \'c1\'eb\'ee\'ea }{\v +\par }{\f17 \'f1\'ee\'e7\'e4\'e0\'b8\'f2\'f1\'ff \'e2 \'f0\'e0\'e1\'ee\'f7\'e8\'f5 \'ee\'e1\'eb\'e0\'f1\'f2\'ff\'f5 \'c4\'ce\'d1 \'e8 \'e5\'e3\'ee \'e0\'e4\'f0\'e5\'f1 \'ed\'e5\'e8\'e7\'e2\'e5\'f1\'f2\'e5\'ed }{\v +\par }{\f17 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'f1\'ea\'ee\'e9 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e5. \'c1\'eb\'ee\'ea (\'e8 \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e9 \'f4\'e0\'e9\'eb) \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'f6\'e8 +\'f0\'f3\'e5\'f2\'f1\'ff }{\v +\par }{\f17 \'ed\'ee\'ec\'e5\'f0\'ee\'ec, \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'c4\'ce\'d1 \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'fe \'ef\'ee\'f1\'eb\'e5 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 - \'fd\'f2\'ee\'f2 +\'ed\'ee\'ec\'e5\'f0 }{\v +\par }{\f17 \'ed\'e0\'e7\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'ec \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'ee\'ec. \'c2\'ee \'e2\'f1\'e5\'f5 \'e4\'e0\'eb\'fc\'ed\'e5\'e9\'f8\'e8\'f5 \'ee\'e1\'f0\'e0\'f9\'e5\'ed\'e8\'ff\'f5 \'ea \'f4 +\'f3\'ed\'ea\'f6\'e8\'ff\'ec \'c4\'ce\'d1 }{\v +\par }{\f17 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2\'f1\'ff \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0. \'c4\'f0\'f3\'e3\'e8\'ec\'e8 \'f1\'eb\'ee\'e2\'e0\'ec\'e8, \'ef\'f0\'e8 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'e8 \'f4\'e0\'e9 +\'eb\'e0 }{\v +\par }{\f17 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'f1\'ea\'e0\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'f1\'ee\'ee\'e1\'f9\'e0\'e5\'f2 \'c4\'ce\'d1 \'e5\'e3\'ee \'e8\'ec\'ff \'e8 \'ef\'ee\'eb\'f3\'f7\'e0\'e5\'f2 \'ee\'e1\'f0\'e0\'f2\'ed\'ee \'ed +\'ee\'ec\'e5\'f0, }{\v +\par }{\f17 \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'f1\'eb\'f3\'e6\'e8\'f2 \'eb\'ee\'e3\'e8\'f7\'e5\'f1\'ea\'e8\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 \'ef\'f0\'e8 \'e2\'f1\'e5\'f5 \'e4\'e0\'eb\'fc\'ed\'e5\'e9\'f8\'e8\'f5 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff\'f5 + \'f1 \'f4\'e0\'e9\'eb\'ee\'ec. }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'cd\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'e0\'ff \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'f4\'e0\'e9\'eb\'ee\'ec \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'f1\'ee\'f5\'f0\'e0\'ed +\'ff\'e5\'f2\'f1\'ff \'e2 \'f0\'e0\'e1\'ee\'f7\'e8\'f5 \'ee\'e1\'eb\'e0\'f1\'f2\'ff\'f5 \'c4\'ce\'d1. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8 \'f1\'e8\'f1\'f2\'e5\'ec\'fb: +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\lang1033 00h (00) VERSION (}{\b\f17 \'c2\'e5\'f0\'f1\'e8\'ff}{\b\lang1033 DOS) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 00h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'ed\'ee\'ec\'e5\'f0 \'e2\'e5\'f0\'f1\'e8\'e8 +\par E - \'ec\'ee\'e4\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'ed\'ee\'ec\'e5\'f0 \'e2\'e5\'f0\'f1\'e8\'e8 \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e9 \'f1\'e8\'f1\'f2\'e5\'ec\'fb. + +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'e4\'e8\'f1\'ea\'ee\'ec: +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 01h (01) CHDISK (\'d1\'ec\'e5\'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...) +\par }{C - 01h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par A - \'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'fb\'e9 \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ec\'e5\'ed\'ff\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'e5\'e5 \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e5 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 02h (02) CURDISK (\'cd\'ee\'ec\'e5\'f0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 02h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...) +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'ed\'ee\'ec\'e5\'f0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 03h (03) DSKINFO (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'e4\'e8\'f1\'ea\'e5}{\b ) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...0FFh-\'f2\'e5\'ea\'f3\'f9\'e8\'e9) +\par }{C - 03h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par A - \'f0\'e0\'e7\'ec\'e5\'f0 \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'e0 \'e2 \'f1\'e5\'ea\'f2\'ee\'f0\'e0\'f5, \'e5\'f1\'eb\'e8 CF=0 +\par HL - \'ee\'e1\'f9\'e5\'e5 \'ea\'ee\'eb-\'e2\'ee \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'ee\'e2 +\par DE - \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'fb\'f5 \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'ee\'e2 +\par BC - \'f0\'e0\'e7\'ec\'e5\'f0 \'f1\'e5\'ea\'f2\'ee\'f0\'e0 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee\'e1 \'ee\'e1\'f9\'e5\'ec \'e8 \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'ec \'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'f1\'f2\'e2\'e5 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0. +\par }{\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,03h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'ff \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8 \'ee \'e4\'e8\'f1\'ea\'e5 +\par \tab LD\tab A,0FFh\tab \tab ;\'d2\'e5\'ea\'f3\'f9\'e8\'e9 \'e4\'e8\'f1\'ea +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab LD\tab A,D\tab \tab ;\'c5\'f1\'f2\'fc \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'e5 +\par \tab OR\tab E\tab \tab ;\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'f1\'f2\'e2\'ee? +\par \tab JR\tab Z,NO_SPACE\tab ;\'c4\'e8\'f1\'ea \'ef\'ee\'eb\'ed\'ee\'f1\'f2\'fc\'fe \'e7\'e0\'ef\'ee\'eb\'ed\'e5\'ed +\par }{ +\par +\par }{\b\f17 09h (09) BOOTDSK (\'cd\'ee\'ec\'e5\'f0 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee \'e4\'e8\'f1\'ea\'e0) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 09h +\par B = 0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ed\'ee\'ec\'e5\'f0 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...) +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 c \'ea\'ee\'f2\'ee\'f0\'ee\'e3\'ee \'e7\'e0\'e3\'f0\'f3\'e6\'e5\'ed\'e0 \'f1\'e8\'f1 +\'f2\'e5\'ec\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'f4\'e0\'e9\'eb\'e0\'ec\'e8: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'d4\'e0\'e9\'eb \'ec\'ee\'e6\'ed\'ee \'ee\'f2\'ea\'f0\'fb\'f2\'fc \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 11h (OPEN), \'f2\'ee\'eb\'fc\'ea\'ee +\'e5\'f1\'eb\'e8 \'ee\'ed }{\v +\par }{\f17 \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2. \'c5\'f1\'f2\'fc \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'fb\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'e2. \'c5\'f1\'eb\'e8 \'f4\'e0\'e9\'eb \'e1\'fb +\'eb \'f1\'ee\'e7\'e4\'e0\'ed }{\v +\par }{\f17 \'e8 \'f1\'f0\'e0\'e7\'f3 \'e6\'e5 \'e7\'e0\'ea\'f0\'fb\'f2, \'ee\'ed \'e1\'f3\'e4\'e5\'f2 \'ef\'f3\'f1\'f2\'fb\'ec, \'ed\'ee \'e5\'e3\'ee \'ec\'ee\'e6\'ed\'ee \'ee\'f2\'ea\'f0\'fb\'f2\'fc \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 OPEN }{\v +\par }{\f17 \'e4\'eb\'ff \'e7\'e0\'ef\'e8\'f1\'e8 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8. \'c4\'eb\'ff \'f3\'e4\'ee\'e1\'f1\'f2\'e2\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8, \'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'f1\'ee\'e7\'e4\'e0\'fe\'f2 \'f4\'e0\'e9\'eb, \'e7\'e0\'f2\'e5 +\'ec }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'f2\'ea\'f0\'fb\'e2\'e0\'fe\'f2 \'e5\'e3\'ee. +\par }\pard \s19\sa120\widctlpar\adjustright {\b\f17 0Ah (10) CREATE (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0 +\par }{C - 0Ah +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'f9\'e5\'f2 \'e2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 \'f4\'e0\'e9\'eb \'f1 \'e8\'ec\'e5\'ed\'e5\'ec, \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e8\'ec \'f1 \'e8 +\'ec\'e5\'ed\'e5\'ec \'e2 }{\v +\par }{\f17 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e9 \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8. \'c5\'f1\'eb\'e8 \'f2\'e0\'ea\'ee\'e9 \'f4\'e0\'e9\'eb \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2, \'e4\'e5\'eb\'e0\'e5\'f2 \'e5\'e3\'ee \'e4\'eb\'e8\'ed\'f3 \'f0\'e0 +\'e2\'ed\'ee\'e9 0 }{\v +\par }{\f17 \'e8 \'ee\'f2\'ea\'f0\'fb\'e2\'e0\'e5\'f2 \'f4\'e0\'e9\'eb \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff/\'e7\'e0\'ef\'e8\'f1\'e8. \'c5\'f1\'eb\'e8 \'f4\'e0\'e9\'eb \'ed\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed, \'f1\'ee\'e7\'e4\'e0\'e5\'f2\'f1\'ff \'ed +\'ee\'e2\'fb\'e9 \'f4\'e0\'e9\'eb }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f1 \'f2\'e0\'ea\'e8\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'e8 \'e4\'eb\'e8\'ed\'ee\'e9 0 \'e8 \'ee\'f2\'ea\'f0\'fb\'e2\'e0\'e5\'f2 \'f4\'e0\'e9\'eb \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +/\'e7\'e0\'ef\'e8\'f1\'e8. +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,0Ah\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,00h\tab \tab ;\'c0\'f2\'f0\'e8\'e1\'f3\'f2 \'ee\'e1\'fb\'f7\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab RET\tab C\tab \tab ;\'c2\'ee\'e7\'e2\'f0\'e0\'f2 \'ef\'ee \'ee\'f8\'e8\'e1\'ea\'e5 +\par \tab LD\tab (FILE1),A\tab ;\'d1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par }{\tab +\par }{\lang1033 NAME\tab DB\tab \ldblquote newfile.ext\rdblquote ,0 +\par }{\f17 FILE1\tab DB\tab 00h\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'e0\'ff \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\lang1033 +\par }{\b\f17 0Bh (11) CREATE NEW FILE (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'ed\'ee\'e2\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0 +\par }{C - 0Bh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e0\'ed\'e0\'eb\'ee\'e3\'e8\'f7\'ed\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 0Ah \'e8 \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'e0, \'ea\'ee\'e3\'e4\'e0 \'ed\'f3\'e6\'ed +\'ee \'f1\'ee\'e7\'e4\'e0\'f2\'fc \'f4\'e0\'e9\'eb }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f1 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'b8\'ed\'ed\'fb\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'e8 \'ef\'f0\'ee\'e2\'e5\'f0\'e8\'f2\'fc, \'f7\'f2\'ee \'f4\'e0\'e9\'eb\'e0 \'f1 \'f2\'e0\'ea\'e8 +\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'ed\'e5 \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 0Eh (14) DELETE (\'d3\'e4\'e0\'eb\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 +\par A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0 +\par }{C - 0Eh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'f9\'e5\'f2 \'f4\'e0\'e9\'eb \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 \'e8 \'f3\'e4\'e0\'eb\'ff\'e5\'f2 \'e5\'e3\'ee. \'c3\'eb +\'ee\'e1\'e0\'eb\'fc\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb * \'e8 ? \'e2 }{\v +\par }{\f17 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 \'ed\'e5 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'fe\'f2\'f1\'ff. \'d4\'e0\'e9\'eb\'fb \'f1 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'ec \'f2\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff \'ed\'e5\'eb\'fc\'e7\'ff +\'f1\'f2\'e5\'f0\'e5\'f2\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e0\'ed\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 - \'f1\'ed\'e0\'f7\'e0\'eb\'e0 \'ed\'f3\'e6\'ed\'ee \'e8\'e7\'ec\'e5\'ed\'e8\'f2\'fc \'fd\'f2\'ee\'f2 \'e0\'f2\'f0\'e8 +\'e1\'f3\'f2. +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,0Eh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'e4\'e0\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab +\par }{\lang1033 NAME\tab DB\tab \ldblquote newfile.ext\rdblquote ,0 +\par +\par +\par }{\b\lang1033 }{\b\f17 10h (16) RENAME (\'cf\'e5\'f0\'e5\'e8\'ec\'e5\'ed\'ee\'e2\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'f2\'e0\'f0\'ee\'e5 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 +\par DE - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'ed\'ee\'e2\'ee\'e5 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 +\par }{C - 10h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard \s19\qj\sa120\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'f9\'e5\'f2 \'f4\'e0\'e9\'eb \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 \'e8 \'e7\'e0\'ec\'e5\'ed\'ff\'e5\'f2 \'e5\'e3\'ee \'e8\'ec\'ff \'ed\'e0 +\'ed\'ee\'e2\'ee\'e5. \'c3\'eb\'ee\'e1\'e0\'eb\'fc\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb * \'e8 ? \'e2 \'e8\'ec\'e5\'ed\'e0\'f5 \'f4\'e0\'e9\'eb\'ee\'e2 \'ed\'e5 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'fe\'f2\'f1\'ff. +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,OLDNAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1\'ee \'f1\'f2\'e0\'f0\'fb\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 + +\par \tab LD\tab DE,NEWNAME\tab ;DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'ed\'ee\'e2\'fb\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,10h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'e8\'ec\'e5\'ed\'ee\'e2\'e0\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab +\par }{\lang1033 OLDNAME\tab DB\tab \ldblquote oldfile.doc\rdblquote ,0 +\par NEWNAME\tab DB\tab \ldblquote newfile.txt\rdblquote ,0 +\par +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'ce\'f2\'ea\'f0\'fb\'f2\'e8\'e5/\'e7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'ce\'f2\'ea\'f0\'fb\'f2\'fc \'f4\'e0\'e9\'eb - \'fd\'f2\'ee \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'eb\'ff \'ed\'e5\'e3\'ee \'ee\'e1\'eb\'e0\'f1 +\'f2\'fc \'ef\'e0\'ec\'ff\'f2\'e8 (\'e1\'eb\'ee\'ea }{\v +\par }{\f17 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff), \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e8\'f2\'fc \'f4\'e0\'e9\'eb \'e8 \'ef\'e5\'f0\'e5\'ed\'e5\'f1\'f2\'e8 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'b8\'ed\'ed\'f3\'fe \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'e8\'e7 \'ea +\'e0\'f2\'e0\'eb\'ee\'e3\'e0 \'e2 }{\v +\par }{\f17 \'e1\'eb\'ee\'ea \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec. \'cf\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'e2 \'ea\'e0\'f7\'e5\'f1\'f2\'e2\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0 \'f4\'f3 +\'ed\'ea\'f6\'e8\'e8 11h }{\v +\par }{\f17 (OPEN) \'e8\'ec\'ff \'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'fb \'f4\'e0\'e9\'eb\'e0. \'c4\'ce\'d1 \'f1\'ee\'e7\'e4\'e0\'b8\'f2 \'e8 \'e7\'e0\'ef\'ee\'eb\'ed\'ff\'e5\'f2 \'e1\'eb\'ee\'ea \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec +\'e2 }{\v +\par }{\f17 \'f1\'e2\'ee\'e8\'f5 \'f0\'e0\'e1\'ee\'f7\'e8\'f5 \'ee\'e1\'eb\'e0\'f1\'f2\'ff\'f5. \'cf\'ee\'f1\'eb\'e5 \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc \'ef\'ee\'eb\'f3\'f7\'e0 +\'e5\'f2 \'ed\'ee\'ec\'e5\'f0 }{\v +\par }{\f17 (\'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0), \'ea\'ee\'f2\'ee\'f0\'fb\'ec \'f4\'e0\'e9\'eb \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'f6\'e8\'f0\'f3\'e5\'f2\'f1\'ff \'e2\'ee \'e2\'f1\'e5\'f5 \'ef\'ee\'f1\'eb\'e5\'e4\'f3 +\'fe\'f9\'e8\'f5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff\'f5, \'e2\'ef\'eb\'ee\'f2\'fc \'e4\'ee \'e5\'e3\'ee \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'cf\'f0\'e8 \'f0\'e0\'e1\'ee\'f2\'e5 \'f1 \'f4\'e0\'e9\'eb\'ee\'ec, \'c4\'ce\'d1 \'e8\'e7\'ec\'e5\'ed\'ff\'e5\'f2 \'ed\'e5\'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'e8\'e7 \'ef\'ee\'eb\'e5 +\'e9 \'e1\'eb\'ee\'ea\'e0 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff }{\v +\par }{\f17 \'f4\'e0\'e9\'eb\'ee\'ec: \'f0\'e0\'e7\'ec\'e5\'f0 \'f4\'e0\'e9\'eb\'e0, \'f2\'e5\'ea\'f3\'f9\'e0\'ff \'ef\'ee\'e7\'e8\'f6\'e8\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'e4\'f0. \'cf\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'f1\'ea\'e0\'ff \'ef\'f0\'ee\'e3 +\'f0\'e0\'ec\'ec\'e0 }{\v +\par }{\f17 \'f2\'e0\'ea\'e6\'e5 \'f1\'ef\'ee\'f1\'ee\'e1\'ed\'e0 \'e8\'e7\'ec\'e5\'ed\'ff\'f2\'fc \'ef\'ee\'eb\'ff \'e1\'eb\'ee\'ea\'e0 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f1 \'ef\'ee\'ec\'ee\'f9\'fc\'fe \'f4\'f3\'ed\'ea\'f6\'e8\'e9 \'c4\'ce\'d1. }{ +\v +\par }{\f17 \'c7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'ef\'f0\'e5\'ea\'f0\'e0\'f9\'e5\'ed\'e8\'e5 \'ee\'e1\'ec\'e5\'ed\'e0 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8 \'f1 \'f4\'e0\'e9\'eb\'ee\'ec. \'cf\'f0\'e8 \'fd +\'f2\'ee\'ec }{\v +\par }{\f17 \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 \'e8 \'e1\'eb\'ee\'ea \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'e7\'e0\'ea\'f0\'fb\'e2\'e0\'e5\'ec\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'ee\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e0 +\'fe\'f2\'f1\'ff, \'e0 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'e2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 \'e7\'e0\'ec\'e5\'ed\'ff\'e5\'f2\'f1\'ff \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e5\'e9 \'e8\'e7 \'e1\'eb\'ee\'ea\'e0 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff, \'ef\'ee +\'fd\'f2\'ee\'ec\'f3 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f1\'e5\'e3\'e4\'e0 \'f1\'eb\'e5\'e4\'f3\'e5\'f2 \'e7\'e0\'ea\'f0\'fb\'e2\'e0\'f2\'fc \'f4\'e0\'e9\'eb\'fb. +\par }\pard \s19\sa120\widctlpar\adjustright {\b\lang1033 +\par +\par }{\b\f17 11h (17) OPEN (\'ce\'f2\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par A - \'f0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0 +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A=0 \'f7\'f2\'e5\'ed\'e8\'e5/\'e7\'e0\'ef\'e8\'f1\'fc +\par A=1 \'f7\'f2\'e5\'ed\'e8\'e5 +\par A=2 \'e7\'e0\'ef\'e8\'f1\'fc +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 11h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'f9\'e5\'f2 \'f4\'e0\'e9\'eb \'f1 \'e8\'ec\'e5\'ed\'e5\'ec, \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e8\'ec \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'e2 \'f4\'e0\'e9 +\'eb\'ee\'e2\'ee\'e9 \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8. }{\v +\par }{\f17 \'c5\'f1\'eb\'e8 \'f2\'e0\'ea\'ee\'e9 \'f4\'e0\'e9\'eb \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2, \'ee\'f2\'ea\'f0\'fb\'e2\'e0\'e5\'f2 \'e5\'e3\'ee. \'d3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 +\'f4\'e0\'e9\'eb\'e5 }{\v +\par }{\f17 \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'ed\'e0\'f7\'e0\'eb\'ee \'f4\'e0\'e9\'eb\'e0. \'cf\'f0\'e8 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'e8 \'f4\'e0\'e9\'eb\'e0 \'e2 \'f0\'e5\'e6\'e8\'ec\'e5 \'e4\'ee\'f1\'f2\'f3\'ef\'e0 1 - +\'f2\'ee\'eb\'fc\'ea\'ee }{\v +\par }{\f17 \'f7\'f2\'e5\'ed\'e8\'e5 \'c4\'ce\'d1 \'e1\'f3\'e4\'e5\'f2 \'e1\'eb\'ee\'ea\'e8\'f0\'ee\'e2\'e0\'f2\'fc \'ef\'ee\'ef\'fb\'f2\'ea\'e8 \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb, \'ef\'f0\'e8 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'e8 \'e2 \'f0\'e5\'e6\'e8 +\'ec\'e5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'ee\'f1\'f2\'f3\'ef\'e0 2 - \'f2\'ee\'eb\'fc\'ea\'ee \'e7\'e0\'ef\'e8\'f1\'fc \'c4\'ce\'d1 \'e1\'f3\'e4\'e5\'f2 \'e1\'eb\'ee\'ea\'e8\'f0\'ee\'e2\'e0\'f2\'fc \'ef\'ee\'ef\'fb +\'f2\'ea\'e8 \'f7\'f2\'e5\'ed\'e8\'ff \'e8\'e7 \'f4\'e0\'e9\'eb\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 12h (18) CLOSE (\'c7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par }{C - 12h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'ea\'f0\'fb\'e2\'e0\'e5\'f2 \'f4\'e0\'e9\'eb, \'ee\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e0\'e5\'f2 \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3 +\'eb\'ff\'f2\'ee\'f0 \'e8 \'e1\'eb\'ee\'ea }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec. \'cf\'e5\'f0\'e5\'ed\'ee\'f1\'e8\'f2 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'e8\'e7 \'e1\'eb\'ee\'ea\'e0 \'f3 +\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec \'e2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'d7\'f2\'e5\'ed\'e8\'e5 \'e8 \'e7\'e0\'ef\'e8\'f1\'fc \'e2 \'f4\'e0\'e9\'eb: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'c2\'f1\'e5 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'e8 \'f7\'f2\'e5\'ed\'e8\'ff \'e8 \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'fe\'f2\'f1 +\'ff \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'e2 }{\v +\par }{\f17 \'ef\'ee\'eb\'e5 \'e1\'eb\'ee\'ea\'e0 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec, \'ea\'ee\'f2\'ee\'f0\'ee\'e5 \'ed\'e0\'e7\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'e5\'ec \'f2\'e5\'ea\'f3\'f9\'e8\'e5 +\'ef\'ee\'e7\'e8\'f6\'e8\'e8 }{\v +\par }{\f17 \'e2 \'f4\'e0\'e9\'eb\'e5. \'c7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f0\'e0\'f1\'f1\'ec\'e0\'f2\'f0\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ea\'e0\'ea \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5 \'ee\'f2 \'ed +\'e0\'f7\'e0\'eb\'e0 }{\v +\par }{\f17 \'f4\'e0\'e9\'eb\'e0. \'d3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ec\'ee\'e6\'ed\'ee \'e8\'e7\'ec\'e5\'ed\'ff\'f2\'fc \'f1 \'ef\'ee\'ec\'ee\'f9\'fc\'fe \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'c4\'ce\'d1 15h (MOVE_FP), \'f7\'f2\'ee\'e1\'fb \'ee\'ed }{\v +\par }{\f17 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'eb\'fc\'ed\'f3\'fe \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'e2 \'f4\'e0\'e9\'eb\'e5. \'ca\'f0\'ee\'ec\'e5 \'fd\'f2\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8, \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea +\'e0\'e7\'e0\'f2\'e5\'eb\'ff }{\v +\par }{\f17 \'e8\'e7\'ec\'e5\'ed\'ff\'fe\'f2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'f7\'f2\'e5\'ed\'e8\'ff \'e8 \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb. \'cf\'f0\'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e8 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'f7\'f2\'e5\'ed\'e8\'ff +\'e8\'eb\'e8 }{\v +\par }{\f17 \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb \'e7\'e0\'e4\'e0\'e5\'f2\'f1\'ff \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e1\'e0\'e9\'f2, \'ea\'ee\'f2\'ee\'f0\'ee\'e5 \'ed\'f3\'e6\'ed\'ee \'ef\'f0\'ee\'f7\'e5\'f1\'f2\'fc \'e8\'eb\'e8 \'e7\'e0\'ef +\'e8\'f1\'e0\'f2\'fc \'e8 }{\v +\par }{\f17 \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8, \'e3\'e4\'e5 \'f0\'e0\'f1\'ef\'ee\'eb\'e0\'e3\'e0\'fe\'f2\'f1\'ff \'fd\'f2\'e8 \'e1\'e0\'e9\'f2\'fb. \'c1\'e0\'e9\'f2\'fb \'f1\'f7\'e8\'f2\'fb\'e2\'e0\'fe\'f2\'f1\'ff \'e8\'eb\'e8 \'e7\'e0\'ef\'e8 +\'f1\'fb\'e2\'e0\'fe\'f2\'f1\'ff }{\v +\par }{\f17 \'e2 \'f4\'e0\'e9\'eb \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 \'f4\'e0\'e9\'eb\'e5. \'cf\'ee\'f1 +\'eb\'e5 }{\v +\par }{\f17 \'ea\'e0\'e6\'e4\'ee\'e3\'ee \'f7\'f2\'e5\'ed\'e8\'ff \'e8\'eb\'e8 \'e7\'e0\'ef\'e8\'f1\'e8 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'ef\'e5\'f0\'e5 +\'ed\'e5\'f1\'b8\'ed\'ed\'fb\'f5 }{\v +\par }{\f17 \'e1\'e0\'e9\'f2. \'cf\'f0\'e8 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'e8 \'f4\'e0\'e9\'eb\'e0, \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed +\'e0 \'ed\'e0\'f7\'e0\'eb\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f4\'e0\'e9\'eb\'e0 (\'ee\'e1\'ed\'f3\'eb\'ff\'e5\'f2\'f1\'ff). +\par }\pard \s19\sa120\widctlpar\adjustright {\b\f17 13h (19) READ (\'d7\'f2\'e5\'ed\'e8\'e5 \'e8\'e7 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par HL - \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8 +\par DE - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f7\'e8\'f2\'e0\'e5\'ec\'fb\'f5 \'e1\'e0\'e9\'f2 +\par }{C - 13h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par DE - \'f0\'e5\'e0\'eb\'fc\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2 +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e5\'f1\'eb\'e8 CF=0: +\par A = 0 \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'fb \'e2\'f1\'e5 \'e1\'e0\'e9\'f2\'fb +\par A = 0FFh \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ee \'ec\'e5\'ed\'fc\'f8\'e5\'e5 \'f7\'e8\'f1\'eb\'ee \'e1\'e0\'e9\'f2 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f7\'e8\'f2\'e0\'e5\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e1\'e0\'e9\'f2 \'f1 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef +\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 \'f4\'e0\'e9\'eb\'e5. \'cf\'ee\'f1\'eb\'e5 }{\v +\par }{\f17 \'f7\'f2\'e5\'ed\'e8\'ff \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2 +\'e2\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ca\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2 \'ed\'e5 \'e2\'f1\'e5\'e3\'e4\'e0 \'f0\'e0\'e2\'ed\'ee \'e7\'e0\'ff\'e2\'eb\'e5\'ed +\'ed\'ee\'ec\'f3. \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'ef\'f0\'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'ee\'f1\'f2\'e8\'e6\'e5\'ed\'e8\'e8 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0. +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par ; \'ce\'f2\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 newfile.doc \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,11h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,1\tab \tab ;\'d0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0: \'f7\'f2\'e5\'ed\'e8\'e5 +\par }{\tab RST\tab 10h\tab }{\f17 \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,OPEN_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab (HANDLE),A\tab ;\'d1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'d3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 \'ea\'ee\'ed\'e5\'f6 \'f4\'e0\'e9 +\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,15h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par \tab LD\tab B,2\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ee\'f2 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0 +\par }{\tab LD\tab HL,0\tab \tab ;3}{\f17 2 \'e1\'e8\'f2\'ed\'ee\'e5 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 HL:IX +\par \tab LD\tab IX,0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ed\'e0 0 \'e1\'e0\'e9\'f2 +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,FP_ERROR\tab ;\'ce\'f8\'e8\'e1\'ea\'e0 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par \tab \tab \tab \tab ;\'c2 HL:IX \'f0\'e0\'e7\'ec\'e5\'f0 \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab (L_FILELEN),IX\tab ;\'c7\'e0\'ef\'ee\'ec\'e8\'ed\'e0\'e5\'ec \'ec\'eb\'e0\'e4\'f8\'e8\'e5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb +\par }{\tab LD\tab (H_FI}{\f17 LELEN),HL;\'c7\'e0\'ef\'ee\'ec\'e8\'ed\'e0\'e5\'ec \'f1\'f2\'e0\'f0\'f8\'e8\'e5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'d3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 \'ed\'e0\'f7\'e0\'eb\'ee \'f4\'e0 +\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,15h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par \tab LD\tab B,0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ee\'f2 \'ed\'e0\'f7\'e0\'eb\'e0 \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab HL,0\tab \tab ;32 \'e1\'e8\'f2\'ed\'ee\'e5 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 HL:IX +\par \tab LD\tab IX,0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ed\'e0 0 \'e1\'e0\'e9\'f2 +\par }{\tab LD\tab A,(HA}{\f17 NDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,FP_ERROR\tab ;\'ce\'f8\'e8\'e1\'ea\'e0 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par }{ +\par }{\f17 \tab LD\tab DE,(H_FILELEN);\'c1\'e5\'f0\'b8\'ec \'f1\'f2\'e0\'f0\'f8\'e8\'e5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,D\tab \tab ;\'cf\'f0\'ee\'e2\'e5\'f0\'ff\'e5\'ec \'f7\'f2\'ee \'e4\'eb\'e8\'ed\'e0 \'f4\'e0\'e9\'eb\'e0 +\par \tab CP\tab E\tab \tab ;\'ec\'e5\'ed\'fc\'f8\'e5 64 \'ea\'e8\'eb\'ee\'e1\'e0\'e9\'f2 +\par \tab JP\tab NZ,BIG_FILE\tab ;\'ee\'f8\'e8\'e1\'ea\'e0 \'f4\'e0\'e9\'eb \'ee\'f7\'e5\'ed\'fc \'e1\'ee\'eb\'fc\'f8\'ee\'e9 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'d7\'f2\'e5\'ed\'e8\'e5 \'e8\'e7 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,13h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f7\'f2\'e5\'ed\'e8\'e5 \'e8\'e7 \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab LD\tab DE,(L_FILELEN);\'c1\'e5\'f0\'e5\'ec \'ec\'eb\'e0\'e4\'f8\'e8\'e5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab HL,BUFFER\tab ;\'c1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,READ_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'f7\'f2\'e5\'ed\'e8\'ff +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,12h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,CLOSE_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par }{ +\par }{\f17 NAME\tab \tab DB\tab \ldblquote newfile.doc\rdblquote ,0 \tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'e0\'ff \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff +\par HANDLE\tab DB\tab 0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'e0\'ff \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par L_FILELEN\tab DW\tab 0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'e0\'ff \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'ec\'eb\'e0\'e4\'f8\'e8\'f5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb +\par H_FILELEN\tab DW\tab 0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'e0\'ff \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'ec\'eb\'e0\'e4\'f8\'e8\'f5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb +\par BUFFER\tab DS\tab 256,0\tab \tab ;\'c1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +\par }{ +\par +\par }{\b\f17 14h (20) WRITE (\'c7\'e0\'ef\'e8\'f1\'fc \'e2 \'f4\'e0\'e9\'eb) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par HL - \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8 +\par DE - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'ec\'fb\'f5 \'e1\'e0\'e9\'f2 +\par }{C - 14h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 DE - \'f0\'e5\'e0\'eb\'fc\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e1\'e0\'e9\'f2 \'f1 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8 +\'f6\'e8\'e8 \'e2 \'f4\'e0\'e9\'eb\'e5. }{\v +\par }{\f17 \'cf\'ee\'f1\'eb\'e5 \'e7\'e0\'ef\'e8\'f1\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'ea\'ee\'eb +\'e8\'f7\'e5\'f1\'f2\'e2\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ca\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2 \'ed\'e5 \'e2\'f1\'e5\'e3\'e4\'e0 \'f0\'e0\'e2\'ed\'ee \'e7\'e0\'ff\'e2\'eb\'e5\'ed\'ed +\'ee\'ec\'f3. \'dd\'f2\'ee \'ec\'ee\'e6\'e5\'f2 }{\v +\par }{\f17 \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc\'f1\'ff, \'ed\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'e5\'f1\'eb\'e8 \'ed\'e0 \'e4\'e8\'f1\'ea\'e5 \'ed\'e5\'f2 \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'e3\'ee \'ec\'e5\'f1\'f2\'e0. }{\v +\par }{\f17 \'cf\'f0\'e8 \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'e8 \'f4\'e0\'e9\'eb\'e0 \'e5\'e3\'ee \'e4\'eb\'e8\'ed\'e0 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'ff\'e5\'f2\'f1\'ff \'ed\'e5 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5\'ec \'f3\'ea\'e0\'e7\'e0 +\'f2\'e5\'eb\'ff \'e2 }{\v +\par }{\f17 \'f4\'e0\'e9\'eb\'e5, \'e0 \'e5\'e3\'ee \'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'fb\'ec \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5\'ec \'e8\'eb\'e8 \'f1\'f2\'e0\'f0\'ee\'e9 \'e4\'eb\'e8\'ed\'ee\'e9 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 \'ee\'ed\'e0 \'e1 +\'ee\'eb\'fc\'f8\'e5. }{\v +\par }{\f17 \'c5\'f1\'eb\'e8, \'ed\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'ee\'f2\'ea\'f0\'fb\'f2\'fc \'f4\'e0\'e9\'eb \'e4\'eb\'e8\'ed\'ee\'e9 1000 \'e1\'e0\'e9\'f2 \'ef\'f0\'e8 \'ef\'ee\'ec\'ee\'f9\'e8 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 11h (OPEN), }{\v +\par }{\f17 \'e7\'e0\'ef\'e8\'f1\'e0\'f2\'fc \'e2 \'ed\'e5\'e3\'ee 500 \'e1\'e0\'e9\'f2 \'e8 \'e7\'e0\'f2\'e5\'ec \'e7\'e0\'ea\'f0\'fb\'f2\'fc. \'cf\'e5\'f0\'e2\'fb\'e5 500 \'e1\'e0\'e9\'f2 \'e1\'f3\'e4\'f3\'f2 \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'fb \'ed\'ee\'e2\'ee +\'e9 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e5\'e9, \'e0 \'ee\'f1\'f2\'e0\'e2\'f8\'e8\'e5\'f1\'ff \'e1\'f3\'e4\'f3\'f2 \'e1\'e5\'e7 \'e8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'ff. \'c5\'f1\'eb\'e8 \'e6\'e5 \'f2\'f0\'e5\'e1\'f3\'e5\'f2\'f1\'ff \'ef\'e5\'f0\'e5\'ea +\'f0\'fb\'f2\'fc }{\v +\par }{\f17 \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e9 \'f4\'e0\'e9\'eb, \'e5\'e3\'ee \'f1\'eb\'e5\'e4\'f3\'e5\'f2 \'ee\'f2\'ea\'f0\'fb\'f2\'fc \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 0Ah (CREATE), \'ea\'ee\'f2\'ee\'f0\'e0\'ff \'f3\'ec\'e5\'ed\'fc\'f8\'e8\'f2 } +{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'eb\'e8\'ed\'f3 \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e4\'ee 0. +\par }\pard \s19\sa120\widctlpar\adjustright { +\par +\par +\par }{\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f17 ; \'ce\'f2\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 newfile.doc \'e4\'eb\'ff \'e7\'e0\'ef\'e8\'f1\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,11h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,2\tab \tab ;\'d0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0: \'e7\'e0\'ef\'e8\'f1\'fc +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,OPEN_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab (HANDLE),A\tab ;\'d1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'d3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 \'ea\'ee\'ed\'e5\'f6 \'f4\'e0\'e9 +\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,15h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par \tab LD\tab B,2\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ee\'f2 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab HL,0\tab \tab ;32 \'e1\'e8\'f2\'ed\'ee\'e5 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 HL:IX +\par \tab LD\tab IX,0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ed\'e0 0 \'e1\'e0\'e9\'f2 +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,FP_ERROR\tab ;\'ce\'f8\'e8\'e1\'ea\'e0 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c7\'e0\'ef\'e8\'f1\'fc \'e2 \'f4\'e0\'e9\'eb (\'e4\'ee\'e1\'e0\'e2\'eb\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'ee\'ea\'e8 \'e2 \'ea\'ee\'ed\'e5\'f6 \'f4\'e0\'e9\'eb\'e0) +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,14h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab LD\tab DE,12 \tab \tab ;\'c1\'e5\'f0\'e5\'ec \'e4\'eb\'e8\'ed\'f3 \'e7\'e0\'ef\'e8\'f1\'e8 12 \'e1\'e0\'e9\'f2 +\par }{\tab }{\lang1033 LD\tab HL,BUFFER\tab ;}{\f17 \'c1\'f3\'f4\'e5\'f0}{\lang1033 }{\f17 \'f1\'ee}{\lang1033 }{\f17 \'f1\'f2\'f0\'ee\'ea\'ee\'e9}{\lang1033 \ldblquote end of file!\rdblquote +\par \tab }{\f17 RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab JR\tab }{\f17 C,READ_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'f7\'f2\'e5\'ed\'e8\'ff +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,12h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,CLOSE_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'ee\'f1\'eb\'e5 \'e7\'e0\'ef\'e8\'f1\'e8 \'e4\'eb\'e8\'ed\'e0 \'f4\'e0\'e9\'eb\'e0 \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'f2\'f1\'ff \'ed\'e0 12 \'e1\'e0\'e9\'f2 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {NAME\tab \tab DB\tab \ldblquote newfile.d}{\f17 oc\rdblquote ,0 \tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'e0\'ff \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff +\par HANDLE\tab DB\tab 0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'e0\'ff \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par }{\lang1033 BUFFER\tab DB\tab \ldblquote end of file!\rdblquote \tab ;}{\f17 \'c1\'f3\'f4\'e5\'f0}{\lang1033 }{\f17 \'e4\'eb\'ff}{\lang1033 }{\f17 \'e7\'e0\'ef\'e8\'f1\'e8}{\lang1033 +\par +\par +\par }{\b\lang1033 }{\b\f17 15h (21) MOVE_FP (\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'e2 \'f4\'e0\'e9\'eb\'e5) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL:IX - \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'e2 \'f4\'e0\'e9\'eb\'e5 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'f1\'ef\'ee\'f1\'ee\'e1 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B=0 \'ee\'f2 \'ed\'e0\'f7\'e0\'eb\'e0 \'f4\'e0\'e9\'eb\'e0 +\par B=1 \'ee\'f2 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par B=2 \'ee\'f2 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {C - 15h +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL:IX - \'ed\'ee\'e2\'ee\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL:IX \'e8\'ed\'f2\'e5\'f0\'ef\'f0\'e5\'f2\'e8\'f0\'f3\'e5\'f2\'f1\'ff \'ea\'e0\'ea 32-\'e1\'e8\'f2\'ed\'ee\'e5 \'f7\'e8\'f1\'eb\'ee. \'c5\'f1\'eb\'e8 \'f7\'e8\'f1\'eb\'ee \'ec\'e5\'ed\'fc +\'f8\'e5 }{65536, }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f0\'e5\'e3\'e8\'f1\'f2\'f0 HL \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2 0. \'c2\'ee\'e7\'ec\'ee\'e6\'ed\'fb \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'e5 \'f1\'ef\'ee\'f1\'ee\'e1\'fb \'ef\'e5\'f0 +\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B=0\tab \'d1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f1\'f7\'e8\'f2\'e0\'e5\'f2\'f1\'ff \'ee\'f2 \'ed\'e0\'f7\'e0\'eb\'e0 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 HL:IX=0, \'f3\'ea\'e0\'e7\'e0\'f2\'e5 +\'eb\'fc }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'ed\'e0\'f7\'e0\'eb\'ee \'f4\'e0\'e9\'eb\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B=1 \tab \'d1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f1\'f7\'e8\'f2\'e0\'e5\'f2\'f1\'ff \'ee\'f2 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb +\'ff. +\par }{ +\par B=2 \tab }{\f17 \'d1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f1\'f7\'e8\'f2\'e0\'e5\'f2\'f1\'ff \'ee\'f2 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 HL:IX=0, \'ef\'ee\'f1\'eb\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff +\par HL:IX\tab \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'f1\'ff \'e4\'eb\'e8\'ed\'e0 \'f4\'e0\'e9\'eb\'e0 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5. +\par }{ +\par +\par }{\b\f17 16h (22) ATTRIB (\'cf\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'e5/\'e8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'e0 \'f4\'e0\'e9\'eb\'e0) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par B - \'f0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0 +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B=0 \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'e0\'f2\'f0\'e8\'e1\'f3\'f2 +\par B=1 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'e0\'f2\'f0\'e8\'e1\'f3\'f2 +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0 +\par }{C - 16h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2/\'e8\'e7\'ec\'e5\'ed\'ff\'e5\'f2 \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 17h (23) GET_D_T (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'e4\'e0\'f2\'e5 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par }{C - 17h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'e4\'e5\'ed\'fc +\par E - \'ec\'e5\'f1\'ff\'f6 +\par IX - \'e3\'ee\'e4 +\par H - \'f7\'e0\'f1 +\par L - \'ec\'e8\'ed\'f3\'f2\'fb +\par B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee \'e4\'e0\'f2\'e5 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'ff \'e8\'eb\'e8 +\'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e5\'e9 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ec\'ee\'e4\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8 \'f4\'e0\'e9\'eb\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 18h (24) PUT_D_T (\'c8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e4\'e0\'f2\'fb \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par D - \'e4\'e5\'ed\'fc +\par E - \'ec\'e5\'f1\'ff\'f6 +\par IX - \'e3\'ee\'e4 +\par H - \'f7\'e0\'f1 +\par L - \'ec\'e8\'ed\'f3\'f2\'fb +\par B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb +\par }{C - 18h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'e7\'ec\'e5\'ed\'ff\'e5\'f2 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee \'e4\'e0\'f2\'e5 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f1\'ee\'e7\'e4\'e0\'ed\'e8 +\'ff \'e8\'eb\'e8 \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e5\'e9 }{\v +\par }{\f17 \'ec\'ee\'e4\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8 \'f4\'e0\'e9\'eb\'e0. \'c8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8 \'ee \'e4\'e0\'f2\'e5 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f0\'e5\'e0\'eb\'fc\'ed\'ee \'ef\'f0\'ee\'e8 +\'e7\'ee\'e9\'e4\'e5\'f2 }{\v +\par }{\f17 \'f2\'ee\'eb\'fc\'ea\'ee \'ef\'ee\'f1\'eb\'e5 \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0. \'c0 \'eb\'fe\'e1\'e0\'ff \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2 \'f2 +\'e5\'ea\'f3\'f9\'f3\'fe }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e0\'f2\'f3 \'e8 \'e2\'f0\'e5\'ec\'ff. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 19h (25) F_FIRST (\'cf\'ee\'e8\'f1\'ea \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par DE - \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 44 \'e1\'e0\'e9\'f2\'e0, \'e5\'f1\'eb\'e8 B=0, \'e8\'ed\'e0\'f7\'e5 256 \'e1\'e0\'e9\'f2 +\par A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'fb, \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'ec\'fb\'e5 \'ef\'f0\'e8 \'ef\'ee\'e8\'f1\'ea\'e5 +\par }\pard\plain \s21\li720\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B = 0 - \'e8\'ec\'ff \'ed\'e0\'e9\'e4\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 11 \'e1\'e0\'e9\'f2 \ldblquote FilenameExt\rdblquote +\par B = 1 - \'e8\'ec\'ff \'ed\'e0\'e9\'e4\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 DOS \ldblquote filename.ext\rdblquote ,0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {C - 19h +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'ef\'ee\'e8\'f1\'ea \'ea\'ee\'ed\'ea\'f0\'e5\'f2\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e8\'eb\'e8 \'ef\'e5 +\'f0\'e2\'ee\'e3\'ee (\'ef\'ee \'e5\'e3\'ee \'ef\'ee\'eb\'ee\'e6\'e5\'ed\'e8\'fe }{\v +\par }{\f17 \'e2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5) \'e8\'e7 \'e3\'f0\'f3\'ef\'ef\'fb \'f4\'e0\'e9\'eb\'ee\'e2. \'cc\'ee\'e6\'ed\'ee \'f3\'ea\'e0\'e7\'e0\'f2\'fc \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'eb\'fc\'ed\'ee\'e5 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee \'e8 \'ea +\'e0\'f2\'e0\'eb\'ee\'e3 }{\v +\par }{\f17 \'e4\'eb\'ff \'ef\'ee\'e8\'f1\'ea\'e0. \'c2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'fe\'f2\'f1\'ff \'e3\'eb\'ee\'e1\'e0\'eb\'fc\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8 *. }{\v +\par }{\f17 \'c5\'f1\'eb\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'e2 \'e4\'eb\'ff \'ef\'ee\'e8\'f1\'ea\'e0 \'f0\'e0\'e2\'ed\'ee 00h, \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'ef\'ee\'e8\'f1\'ea \'f2\'ee\'eb\'fc +\'ea\'ee }{\v +\par }{\f17 \'ee\'e1\'fb\'f7\'ed\'fb\'f5 \'f4\'e0\'e9\'eb\'ee\'e2. \'c5\'f1\'eb\'e8 \'e2 \'e1\'e0\'e9\'f2\'e5 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'e2 \'e1\'e8\'f2\'fb \'e4\'eb\'ff \'f1\'ea\'f0\'fb\'f2\'ee\'e3\'ee, \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee, \'f2 +\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff }{\v +\par }{\f17 \'f7\'f2\'e5\'ed\'e8\'ff \'e8\'eb\'e8 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 (\'e8\'eb\'e8 \'e8\'f5 \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'eb\'fc\'ed\'e0\'ff \'ea\'ee\'ec\'e1\'e8\'ed\'e0\'f6\'e8\'ff) \'f0\'e0\'e2\'ed\'fb 1, \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb +\'ff\'e5\'f2\'f1\'ff }{\v +\par }{\f17 \'ef\'ee\'e8\'f1\'ea \'e2\'f1\'e5\'f5 \'f4\'e0\'e9\'eb\'ee\'e2, \'f7\'fc\'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'fb \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'f3\'fe\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'fb\'ec, \'e0 \'f2\'e0\'ea\'e6\'e5 \'e2\'f1\'e5\'f5 \'ee +\'e1\'fb\'f7\'ed\'fb\'f5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f4\'e0\'e9\'eb\'ee\'e2. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'c5\'f1\'eb\'e8 \'f4\'e0\'e9\'eb \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed, \'ef\'ee \'e0\'e4\'f0\'e5\'f1\'f3, \'ed\'e0 \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'f0 +\'e5\'e3\'e8\'f1\'f2\'f0 DE \'e1\'f3\'e4\'e5\'f2 }{\v +\par }{\f17 \'e7\'e0\'ef\'ee\'eb\'ed\'e5\'ed \'e1\'f3\'f4\'e5\'f0 \'f1 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e5\'e9 \'ee \'f4\'e0\'e9\'eb\'e5. \'c8\'ed\'e0\'f7\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e2\'e5\'f0\'f8\'e8\'f2\'f1\'ff \'f1 \'ee\'f8\'e8\'e1\'ea +\'ee\'e9 \ldblquote \'f4\'e0\'e9\'eb }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ed\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\rdblquote . +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'f4\'ee\'f0\'ec\'e0\'f2 \'e1\'f3\'f4\'e5\'f0\'e0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +00 8\tab db\tab \ldblquote FILE????\rdblquote \tab \tab ;}{\f17 \'f8\'e0\'e1\'eb\'ee\'ed \'e8\'ec\'e5\'ed\'e8 +\par +08 3\tab db\tab \ldblquote ???\rdblquote \tab \tab \tab ; \'f8\'e0\'e1\'eb\'ee\'ed \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'ff +\par +11 1\tab db\tab #20\tab \tab \tab ; \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'fb \'e4\'eb\'ff \'ef\'ee\'e8\'f1\'ea\'e0 +\par +12 10\tab ds\tab 10\tab \tab \tab ; \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'ee +\par +22 2\tab dw\tab #0000\tab \tab \tab ; \'e2\'f0\'e5\'ec\'ff \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par +24 2\tab dw\tab #0000\tab \tab \tab ; \'e4\'e0\'f2\'e0 \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par }{ +26 2\tab dw}{\f17 \tab #0000\tab \tab \tab ; \'ed\'ee\'ec\'e5\'f0 \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'e0 +\par +28 4\tab dw\tab #0000,#0000\tab \tab ; \'f0\'e0\'e7\'ec\'e5\'f0 \'f4\'e0\'e9\'eb\'e0 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5 +\par +32 1\tab db\tab #20\tab \tab \tab ; \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par +33 11\tab db\tab \ldblquote FILENAMEEXT\rdblquote \tab ; \'e8\'ec\'ff \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'ea\'ee\'ef\'e8\'ff \'e8\'e7 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par }{ +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8\'eb\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +33 n\tab db\tab \ldblquote filename.ext\rdblquote ,0\tab }{\f17 \tab ; \'e8\'ec\'ff \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 +\'e5 \'c4\'ce\'d1 +\par }{ +\par }{\b\f17 1Ah (26) F_NEXT (\'cf\'ee\'e8\'f1\'ea \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 DE - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 +\par }{C - 1Ah +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'cf\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb \'e1\'e5\'f0\'f3\'f2\'f1\'ff \'e8\'e7 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 F_FIRST, \'e5\'f1\'eb\'e8 \'ee\'ed\'e0 \'ed\'e5 \'e2\'fb\'ef\'ee\'eb\'ed\'ff\'eb\'e0 +\'f1\'fc, \'f2\'ee }{\v +\par }{\f17 F_NEXT \'e2\'e5\'f0\'ed\'e5\'f2\'f1\'ff \'f1 \'ee\'f8\'e8\'e1\'ea\'ee\'e9 \ldblquote \'ed\'e5\'e2\'ee\'e7\'ec\'ee\'e6\'ed\'e0\'ff \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff\rdblquote , \'ed\'e5 \'f1\'eb\'e5\'e4\'f3\'e5\'f2 \'e2\'fb\'ef\'ee\'eb\'ed\'ff\'f2 +\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'e8, \'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'ec\'ee\'e3\'f3\'f2 \'f0\'e0\'e7\'f0\'f3\'f8\'e8\'f2\'fc \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0. +\par }\pard \s19\sa120\widctlpar\adjustright {\i +\par +\par +\par }{\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f17 ; \'cf\'ee\'e8\'f1\'ea \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par }{\tab LD\tab DE,BUFFER\tab ;DE}{\f17 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,19h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'e8\'f1\'ea\'e0 \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,30h\tab \tab ;\'cf\'ee\'e8\'f1\'ea \'ee\'e1\'fb\'f7\'ed\'fb\'f5 \'f4\'e0\'e9\'eb\'ee\'e2 \'e8 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'ee\'e2 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JP\tab C,FIND_ERROR\tab ;\'ce\'f8\'e8\'e1\'ea\'e0 \'ef\'ee\'e8\'f1\'ea\'e0 (\'f4\'e0\'e9\'eb \'ed\'e5 \'ed\'e0\'e9\'e4\'e5\'ed) +\par }{ +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c2\'fb\'e2\'ee\'e4 \'e8\'ec\'e5\'ed\'e8 \'ed\'e0\'e9\'e4\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {NEXTN\tab LD\tab HL,BUFFER}{\f17 \tab ;\'d0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab DE,33\tab \tab ;\'c8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'ed\'e0\'f5\'ee\'e4\'e8\'f2\'f1\'ff \'f1\'ee \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5\'ec 33 +\par }{\tab ADD\tab HL,DE +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c2\'fb\'e2\'ee\'e4 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,5Bh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab LD\tab B,8\tab \tab ;\'d0\'e0\'e7\'ec\'e5\'f0 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par NEXTS\tab LD\tab A,(HL)\tab \tab ;\'c1\'e5\'f0\'e5\'ec \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'e9 \'f1\'e8\'ec\'e2\'ee\'eb \'e8\'ec\'e5\'ed\'e8 +\par }{\tab PUSH\tab BC +\par }{\f17 \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8}{ +\par \tab }{\lang1033 POP\tab BC +\par \tab INC\tab HL +\par \tab DJNZ\tab NEXTS +\par \tab LD\tab A,\'94 \'94\tab \tab ;}{\f17 \'c2\'fb\'e2\'ee\'e4}{\lang1033 }{\f17 \'ef\'f0\'ee\'e1\'e5\'eb\'e0}{\lang1033 +\par \tab }{RST\tab 10h +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c2\'fb\'e2\'ee\'e4 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,5Bh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab LD\tab B,3\tab \tab ;\'d0\'e0\'e7\'ec\'e5\'f0 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 3 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par NEXTE\tab LD\tab A,(HL)\tab \tab ;\'c1\'e5\'f0\'e5\'ec \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'e9 \'f1\'e8\'ec\'e2\'ee\'eb \'e8\'ec\'e5\'ed\'e8 +\par }{\tab PUSH\tab BC +\par }{\f17 \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab }{\lang1033 POP\tab BC +\par \tab INC\tab HL +\par \tab }{DJNZ\tab NEXTE +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'e5\'f0\'e5\'e2\'ee\'e4 \'f1\'f2\'f0\'ee\'ea\'e8 \'ef\'ee\'f1\'eb\'e5 \'ea\'e0\'e6\'e4\'ee\'e3\'ee \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,5Bh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab LD\tab A,13\tab \tab ;CR - \'ef\'e5\'f0\'e5\'f5\'ee\'e4 \'e2 \'ed\'e0\'f7\'e0\'eb\'ee \'f1\'f2\'f0\'ee\'ea\'e8 +\par }{\tab RST\tab 10h +\par }{\f17 \tab LD\tab C,5Bh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab LD\tab A,10\tab \tab ;LF - \'ef\'e5\'f0\'e5\'e2\'ee\'e4 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }{\tab RST\tab 10h +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'ee\'e8\'f1\'ea \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab DE,BUFFER\tab ;DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,1Ah\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'e8\'f1\'ea\'e0 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JP\tab NC,NEXTN\tab ;\'cf\'e5\'f0\'e5\'f5\'ee\'e4 \'ed\'e0 \'ef\'e5\'f7\'e0\'f2\'fc \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par }{\lang1033 FIND_ERROR +\par NAME\tab DB\tab \ldblquote A:\\TEXT\\*.*\rdblquote ,0 +\par }{BUFFER\tab DS\tab 44 +\par +\par +\par +\par +\par +\par }{\b 1Bh (27) MKDI}{\b\f17 R (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par }{C - 1Bh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'ee\'e7\'e4\'e0\'b8\'f2 \'ed\'e0 \'e4\'e8\'f1\'ea\'e5 \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3, \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'fb\'e9 \'e2 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e9 \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8. + +\par }{\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,DIRNAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par \tab LD\tab C,1Bh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab +\par }{\f17 DIRNAME\tab DB\tab \ldblquote TEXT\rdblquote ,0\tab ;\'d1\'ee\'e7\'e4\'e0\'f2\'fc \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3 TEXT \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 +\par }{ +\par }{\f17 DIRNAME\tab DB\tab \ldblquote \\TEXT\rdblquote ,0\tab ;\'d1\'ee\'e7\'e4\'e0\'f2\'fc \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3 TEXT \'e2 \'ea\'ee\'f0\'ed\'e5\'e2\'ee\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 +\par }{ +\par DIRNAME\tab DB\tab \ldblquote C:\\DOC\\TEXT}{\f17 \rdblquote ,0;\'d1\'ee\'e7\'e4\'e0\'f2\'fc \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3 TEXT \'e2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 DOC \'ed\'e0 +\par }\pard\plain \s19\fi720\li2880\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ;\'e4\'e8\'f1\'ea\'e5 C: \'ea\'e0\'f2\'e0\'eb\'ee\'e3 DOC \'e4\'ee\'eb\'e6\'e5\'ed \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'ee\'e2\'e0\'f2\'fc +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 1Ch (28) RMDIR (\'d3\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par }{C - 1Ch +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'f2 \'ef\'f3\'f1\'f2\'ee\'e9 \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3, \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'fb\'e9 \'e2 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e9 \'f1\'ef +\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8. }{\v +\par }{\f17 \'cd\'e5\'eb\'fc\'e7\'ff \'f3\'f1\'f2\'f0\'e0\'ed\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ea\'e0\'f2\'e0\'eb\'ee\'e3 \'e8 \'ea\'e0\'f2\'e0\'eb\'ee\'e3, \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2 \'f4\'e0\'e9\'eb\'fb \'e8\'eb +\'e8 \'e4\'f0\'f3\'e3\'e8\'e5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e8. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,DIRNAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par \tab LD\tab C,1Ch\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab +\par }{\lang1033 DIRNAME\tab DB\tab \ldblquote TEXT\rdblquote ,0 +\par +\par +\par }{\b\lang1033 }{\b\f17 1Dh (29) CHDIR (\'d1\'ec\'e5\'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0) +\par }{ +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par }{C - 1Dh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ec\'e5\'ed\'ff\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ea\'e0\'f2\'e0\'eb\'ee\'e3 \'e8 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'e4\'e8\'f1\'ea, \'e5\'f1\'eb\'e8 \'ee\'ed \'f3\'ea\'e0\'e7\'e0\'ed +\'e2 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e9 }{\v +\par }{\f17 \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8. \'c5\'f1\'eb\'e8 \'ef\'f3\'f2\'fc \'ed\'e0\'f7\'e8\'ed\'e0\'e5\'f2\'f1\'ff \'f1 \ldblquote \\\rdblquote - \'fd\'f2\'ee \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'ef\'f3\'f2\'fc \'ee\'f2 \'ea\'ee\'f0\'ed +\'e5\'e2\'ee\'e3\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0, \'e8\'ed\'e0\'f7\'e5 \'ee\'f2 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,DIRNAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'ef\'f3\'f2\'e8 \'ea \'ed\'ee\'e2\'ee\'ec\'f3 +\par \tab \tab \tab \tab ;\'f2\'e5\'ea\'f3\'f9\'e5\'ec\'f3 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'f3 +\par \tab LD\tab C,1Dh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'ec\'e5\'ed\'fb \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab +\par }{\lang1033 DIRNAME\tab DB\tab \ldblquote \\DOC\\TEXT\rdblquote ,0 +\par +\par +\par }\pard\plain \s22\widctlpar\adjustright \b\fs20\lang1049\cgrid {\lang1033 }{\f17 1Eh (30) CURDIR (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5) +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'e1\'f3\'f4\'e5\'f0 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8 256 \'e1\'e0\'e9\'f2 +\par }{C - 1Eh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'ed\'ee\'f1\'e8\'f2 \'f1\'f2\'f0\'ee\'ea\'f3 \'ef\'f3\'f2\'e8 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 \'e8\'e7 \'ee\'e1\'eb\'e0\'f1\'f2\'e5\'e9 +\'c4\'ce\'d1 \'e2 }{\v +\par }{\f17 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'f1\'ea\'f3\'fe \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3 \'ef\'ee \'e0\'e4\'f0\'e5\'f1\'f3 \'e7\'e0\'e4\'e0\'ed\'ed\'ee\'ec \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 HL. \'cd\'e0 \'ea\'ee\'ed\'f6\'e5 \'ef +\'f3\'f2\'e8 \'ea\'ee\'e4 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ed\'ee\'eb\'fc. \'c8\'ec\'ff \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 \'e2 \'ef\'f3\'f2\'fc \'ed\'e5 \'e2\'ea\'eb\'fe\'f7\'e0\'e5\'f2\'f1 +\'ff. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,BUFFER\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,1Eh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'ff \'ef\'f3\'f2\'e8 \'ea \'f2\'e5\'ea\'f3\'f9\'e5\'ec\'f3 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'f3 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{ +\par BUFFER\tab DS\tab 256 +\par +\par +\par }{\b\f17 21h (33) SYSTIME (\'d2\'e5\'ea\'f3\'f9\'e0\'ff \'e4\'e0\'f2\'e0 \'e8 \'e2\'f0\'e5\'ec\'ff) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 21h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'e4\'e5\'ed\'fc +\par E - \'ec\'e5\'f1\'ff\'f6 +\par IX - \'e3\'ee\'e4 +\par H - \'f7\'e0\'f1 +\par L - \'ec\'e8\'ed\'f3\'f2\'fb +\par B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb +\par C - \'e4\'e5\'ed\'fc \'ed\'e5\'e4\'e5\'eb\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'e4\'e0\'f2\'f3 \'e8 \'e2\'f0\'e5\'ec\'ff. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 22h (34) SETTIME (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'e4\'e0\'f2\'f3 \'e8 \'e2\'f0\'e5\'ec\'ff) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'e4\'e5\'ed\'fc +\par E - \'ec\'e5\'f1\'ff\'f6 +\par IX - \'e3\'ee\'e4 +\par H - \'f7\'e0\'f1 +\par L - \'ec\'e8\'ed\'f3\'f2\'fb +\par B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb +\par }{C - 22h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'f3\'fe \'e4\'e0\'f2\'f3 \'e8 \'e2\'f0\'e5\'ec\'ff. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'ef\'e0\'ec\'ff\'f2\'fc\'fe: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 38h (56) SETWIN (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...) +\par H - \'e1\'e8\'f2\'fb 6 \'e8 7 \'e7\'e0\'e4\'e0\'fe\'f2 \'ed\'ee\'ec\'e5\'f0 \'ee\'ea\'ed\'e0, \'e2 \'ea\'ee\'f2\'ee\'f0\'ee\'e5 \'e1\'f3\'e4\'e5\'f2 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 +\par }{C - 38h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'f7\'e8\'f1\'eb\'ff\'e5\'f2 \'f4\'e8\'e7\'e8\'f7\'e5\'f1\'ea\'e8\'e9 \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 \'ef\'e0\'ec\'ff\'f2\'e8 \'e8 + \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2 \'e5\'b8 }{\v +\par }{\f17 \'e2 \'ee\'ea\'ed\'ee \'e0\'e4\'f0\'e5\'f1\'ed\'ee\'e3\'ee \'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'f1\'f2\'e2\'e0 \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 HL. \'d2\'ee +\'e5\'f1\'f2\'fc, }{\v +\par }{\f17 \'e5\'f1\'eb\'e8 HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'f0\'e5\'e4\'e5\'eb\'e0\'f5 \'ee\'f2 04000h \'e4\'ee 07FFFh, \'f2\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 }{\v +\par }{\f17 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2\'f1\'ff \'e2 \'ef\'e5\'f0\'e2\'ee\'e5 \'ee\'ea\'ed\'ee, \'ee\'f2 08000h \'e4\'ee 0BFFFh - \'e2\'f2\'ee\'f0\'ee\'e5 \'ee\'ea\'ed\'ee, \'ee\'f2 0C000h \'e4\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 0FFFFh - \'f2\'f0\'e5\'f2\'fc\'e5. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'cd\'e0 \'e2\'fb\'f5\'ee\'e4\'e5 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2\'f1\'ff \'f4\'e8\'e7\'e8\'f7\'e5\'f1\'ea\'e8\'e9 \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0 +\'e0\'ed\'e8\'f6\'fb, \'ea\'ee\'f2\'ee\'f0\'e0\'ff }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e1\'fb\'eb\'e0 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e0 \'e4\'ee \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'f4\'f3\'ed\'ea\'f6\'e8\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 39h (57) SETWIN1 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'e2 \'ef\'e5\'f0\'e2\'ee\'e5 \'ee\'ea\'ed\'ee) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {A - }{\f17 \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...) +\par }{C - 39h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e0\'ed\'e0\'eb\'ee\'e3\'e8\'f7\'ed\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 038h (SETWIN), \'ed\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2\'f1\'ff \'e2 }{\v + +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e5\'f0\'e2\'ee\'e5 \'ee\'ea\'ed\'ee \'ed\'e5\'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee \'ee\'f2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 HL.}{ +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Ah (58) SETWIN2 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'e2\'ee \'e2\'f2\'ee\'f0\'ee\'e5 \'ee\'ea\'ed\'ee) + +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...) +\par }{C - 3Ah +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e0\'ed\'e0\'eb\'ee\'e3\'e8\'f7\'ed\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 038h (SETWIN), \'ed\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2\'f1\'ff \'e2\'ee }{ +\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f2\'ee\'f0\'ee\'e5 \'ee\'ea\'ed\'ee \'ed\'e5\'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee \'ee\'f2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 HL. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Bh (59) SETWIN3 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'e2 \'f2\'f0\'e5\'f2\'fc\'e5 \'ee\'ea\'ed\'ee) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...) +\par }{C - 3Bh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e0\'ed\'e0\'eb\'ee\'e3\'e8\'f7\'ed\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 038h (SETWIN), \'ed\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2\'f1\'ff \'e2 }{\v + +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f2\'f0\'e5\'f2\'fc\'e5 \'ee\'ea\'ed\'ee \'ed\'e5\'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee \'ee\'f2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 HL. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Ch (60) FREEMEM (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'ef\'e0\'ec\'ff\'f2\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 3Ch +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'ee\'e1\'f9\'e5\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6 +\par BC - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'fb\'f5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 HL \'ee\'e1\'f9\'e5\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'ef\'e0\'ec\'ff\'f2\'e8 \'e2 \'f1\'f2\'f0 +\'e0\'ed\'e8\'f6\'e0\'f5 \'ef\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 16 \'ea\'e8\'eb\'ee\'e1\'e0\'e9\'f2 \'e8 \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2 +\'f0\'e5 BC. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Dh (61) GETMEM (\'c2\'fb\'e4\'e5\'eb\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'f0\'e0\'e7\'ec\'e5\'f0 \'e1\'eb\'ee\'ea\'e0 \'e2 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0\'f5 \'ef\'ee 16 \'ea\'e8\'eb\'ee\'e1\'e0\'e9\'f2 +\par }{C - 3Dh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8, \'e5\'f1\'eb\'e8 CF=0 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'f2 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8 \'e8 \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e5\'e3\'ee \'e8\'e4\'e5\'ed +\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'fe. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Eh (62) RETMEM (\'ce\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par }{C - 3Eh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e0\'e5\'f2 \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'ed\'fb\'e9 \'f0\'e0\'ed\'e5\'e5 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8. \'cd\'e5\'eb\'fc\'e7\'ff \'ee\'f1\'e2 +\'ee\'e1\'ee\'e4\'e8\'f2\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8, \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'ed\'fb\'e9 \'e4\'f0\'f3\'e3\'e8\'ec \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5\'ec. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Fh (63) SETMEM (\'c8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par B - \'ed\'ee\'e2\'fb\'e9 \'f0\'e0\'e7\'ec\'e5\'f0 \'e1\'eb\'ee\'ea\'e0 +\par }{C - 3Fh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'e7\'e2\'ee\'eb\'ff\'e5\'f2 \'f3\'ec\'e5\'ed\'fc\'f8\'e8\'f2\'fc \'e8\'eb\'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e8\'f2\'fc \'e2\'fb\'e4\'e5\'eb\'e5\'ed +\'ed\'fb\'e9 \'f0\'e0\'ed\'e5\'e5 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8. +\par \'cd\'e5\'eb\'fc\'e7\'ff \'e8\'e7\'ec\'e5\'ed\'e8\'f2\'fc \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8, \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'ed\'fb\'e9 \'e4\'f0\'f3\'e3\'e8\'ec \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5\'ec. +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'ee\'e9: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'cf\'f0\'e8 \'ed\'e0\'e1\'ee\'f0\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'e5 \'ea\'e0\'e6\'e4\'ee\'e5 \'ed\'e0\'e6\'e0\'f2\'e8\'e5 +\'ea\'eb\'e0\'e2\'e8\'f8 \'e2\'ee\'f1\'ef\'f0\'e8\'ed\'e8\'ec\'e0\'e5\'f2 }{\v +\par }{\f17 \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'e0\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb. \'ca\'e0\'e6\'e4\'e0\'ff \'ea\'eb\'e0\'e2\'e8\'f8\'e0 \'e8\'ec\'e5\'e5\'f2 \'ed\'ee\'ec\'e5\'f0 + (\'ee\'f2 0 \'e4\'ee }{\v +\par }{\f17 90), \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'ff\'e5\'f2 \'e5\'b8 \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'e5. \'d2\'e0\'e1\'eb\'e8\'f6\'e0 \'e2\'f1\'e5\'f5 \'ea\'ee\'e4\'ee\'e2 \'ea\'eb\'e0\'e2 +\'e8\'f8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'f0\'e8\'e2\'e5\'e4\'e5\'ed\'e0 \'e2 \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e8. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'ca\'e0\'e6\'e4\'ee\'e5 \'ed\'e0\'e6\'e0\'f2\'e8\'e5 \'e8\'eb\'e8 \'ee\'f2\'ef\'f3\'f1\'ea\'e0\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 \'e2\'fb\'e7\'fb\'e2\'e0\'e5\'f2 \'ef +\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'e5. \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0, }{\v +\par }{\f17 \'ee\'e1\'f1\'eb\'f3\'e6\'e8\'e2\'e0\'fe\'f9\'e0\'ff \'fd\'f2\'ee \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'e5, \'f7\'e8\'f2\'e0\'e5\'f2 scan-\'ea\'ee\'e4 \'e8 \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'f3\'e5\'f2 \'e5\'e3\'ee \'e2 \'e4\'e2\'e0 \'e1\'e0\'e9\'f2 +\'e0. }{\v +\par }{\f17 \'cf\'e5\'f0\'e2\'fb\'e9 \'e1\'e0\'e9\'f2 \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 ASCII \'ea\'ee\'e4, \'e0 \'e2\'f2\'ee\'f0\'ee\'e9 - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4. \'cf\'e5\'f0\'e2\'fb +\'e9 }{\v +\par }{\f17 \'e1\'e0\'e9\'f2 \'ef\'ee\'eb\'f3\'f7\'e0\'e5\'f2\'f1\'ff \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'ed\'e8\'e5\'ec \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'ee\'e3\'ee \'ea\'ee\'e4\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 \'ef\'ee \'ee\'ef\'f0\'e5\'e4\'e5 +\'eb\'b8\'ed\'ed\'ee\'e9 }{\v +\par }{\f17 \'ef\'f0\'ee\'f6\'e5\'e4\'f3\'f0\'e5 \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'ff \'ea\'eb\'e0\'e2\'e8\'f8 Shift, Alt, Ctrl, Caps Lock \'e8 Num }{\v +\par }{\f17 Lock, \'ee\'f2 \'f0\'e5\'e6\'e8\'ec\'e0 \'eb\'e0\'f2\'e8\'ed\'e8\'f6\'e0 \'e8\'eb\'e8 \'ea\'e8\'f0\'e8\'eb\'eb\'e8\'f6\'e0 \'e8 \'ee\'f2 \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'e8 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e2 \'f1\'e8\'ec\'e2\'ee\'eb\'fc +\'ed\'fb\'e9 }{\v +\par }{(AS}{\f17 CII) \'ea\'ee\'e4. \'c4\'eb\'ff \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'fb\'f5 \'ea\'eb\'e0\'e2\'e8\'f8, \'ed\'e0\'ef\'f0\'e8\'ec\'e5\'f0 \'f4\'f3\'ed\'ea\'f6\'e8\'ee\'ed\'e0\'eb\'fc\'ed\'fb\'e9 \'e8\'eb\'e8 \'ea\'eb\'e0\'e2\'e8\'f8 }{\v +\par }{\f17 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'ee\'ec, \'ea\'ee\'e4 ASCII \'f0\'e0\'e2\'e5\'ed \'ed\'f3\'eb\'fe. \'dd\'f2\'ee \'ef\'ee\'e7\'e2\'ee\'eb\'ff\'e5\'f2 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e5 \'f0\'e0\'e7\'eb\'e8\'f7\'e0 +\'f2\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'e1\'fb\'f7\'ed\'fb\'e5 \'ef\'e5\'f7\'e0\'f2\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb \'e8 \'ed\'e0\'e6\'e0\'f2\'e8\'ff \'e4\'f0\'f3\'e3\'e8\'f5 \'ea\'eb\'e0\'e2\'e8\'f8. + +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'c4\'f0\'e0\'e9\'e2\'e5\'f0 \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'f2 \'fd\'f2\'e8 \'e4\'e2\'e0 \'e1\'e0\'e9\'f2\'e0 \'e2 \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3 +\'f0\'fb, \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'ec\'ee\'e6\'e5\'f2 }{\v +\par }{\f17 \'f5\'f0\'e0\'ed\'e8\'f2\'fc \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee 15 \'ed\'e0\'e6\'e0\'f2\'e8\'e9 \'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e8. \'ca\'f0\'ee\'ec\'e5 \'fd\'f2\'ee\'e3\'ee, \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ee\'f2\'f1\'eb\'e5\'e6\'e8 +\'e2\'e0\'e5\'f2 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e8 \'ed\'e5\'ea\'ee\'f2\'ee\'f0\'fb\'f5 \'ea\'eb\'e0\'e2\'e8\'f8, \'f2\'e0\'ea\'e8\'f5 \'ea\'e0\'ea Shift, Alt, Ctrl, Caps Lock, }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 Num Lock, Scroll Lock }{\f17 \'e8}{\lang1033 }{\f17 \'e4\'f0}{\lang1033 . +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'d7\'f2\'ee\'e1\'fb \'f1\'f7\'e8\'f2\'e0\'f2\'fc \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'f3\'fe \'ea\'eb\'e0\'e2\'e8\'f8\'f3 \'e8\'e7 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0 +\'f2\'f3\'f0\'fb, \'ed\'f3\'e6\'ed\'ee \'e2\'ee\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\'f1\'ff }{\v +\par }{\f17 \'ee\'e4\'ed\'ee\'e9 \'e8\'e7 \'f4\'f3\'ed\'ea\'f6\'e8\'e9 \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb. \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'fe\'f2 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 E ASCII +\'ea\'ee\'e4 }{\v +\par }{\f17 \'ea\'eb\'e0\'e2\'e8\'f8\'e8, \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 D \'e5\'b8 \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4. \'c5\'f1\'eb\'e8 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed \'f1\'e5\'e4\'fc\'ec\'ee\'e9 \'e1\'e8\'f2 \'f0\'e5 +\'e3\'e8\'f1\'f2\'f0\'e0 }{\v +\par }{\f17 D, \'fd\'f2\'ee \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'f7\'f2\'ee \'ed\'e0\'e6\'e0\'f2\'e0 \'ed\'e5 \'ee\'e4\'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e0, \'e0 \'ee\'e4\'ed\'ee\'e2\'f0\'e5\'ec\'e5\'ed\'ed\'ee \'f1 \'ed\'e5\'e9 \'ed\'e0\'e6\'e0\'f2\'fb , }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8\'eb\'e8 . +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'fe\'f2\'f1\'ff \'ea\'e0\'ea\'e8\'e5 \'e8\'ec\'e5\'ed\'ed\'ee \'ea\'eb\'e0\'e2\'e8\'f8\'e8 \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'fe\'f2\'f1\'ff: + +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D7 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'eb\'e5\'e2\'fb\'e9 +\par D6 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ef\'f0\'e0\'e2\'fb\'e9 +\par D5 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff +\par D4 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff +\par D3 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'eb\'e5\'e2\'fb\'e9 +\par }{D2 = 1}{\f17 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'eb\'e5\'e2\'fb\'e9 +\par D1 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ef\'f0\'e0\'e2\'fb\'e9 +\par D0 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ef\'f0\'e0\'e2\'fb\'e9 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'c1\'e8\'f2\'fb 5 \'e8 4 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'fe\'f2, \'f7\'f2\'ee \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'fe\'f2\'f1\'ff \'eb\'fe\'e1\'ee\'e9 , \'ef\'f0\'e0\'e2\'fb +\'e9 \'e8\'eb\'e8 \'eb\'e5\'e2\'fb\'e9. +\par \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 C \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'fe\'f2\'f1\'ff \'f0\'e5\'e6\'e8\'ec\'fb \'e2\'e2\'ee\'e4\'e0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {D7 = 1 - RUS, 0 - LAT +\par }{\f17 D6 - \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par D5 - \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par D4 - \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 = 1 - }{\f17 \'f0\'e5\'e6\'e8\'ec}{\lang1033 Num Lock +\par D2 = 1 - }{\f17 \'f0\'e5\'e6\'e8\'ec}{\lang1033 Scroll Lock +\par D1 = 1 - }{\f17 \'f0\'e5\'e6\'e8\'ec}{\lang1033 Insert +\par D0 = 1 - }{\f17 \'f0\'e5\'e6\'e8\'ec}{\lang1033 Caps Lock +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 30h (48) WAITKEY (\'ce\'e6\'e8\'e4\'e0\'ed\'e8\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 30h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4 +\par \'c5 - ASCII \'ea\'ee\'e4 +\par }{\lang1033 C - D7 - RUS/LAT +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 - Num Lock +\par D2 - Scroll Lock +\par D1 - Insert +\par D0 - Caps Lock +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 B - D7 - Left Shift +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D6 - Right Shift +\par D5 - Ctrl +\par D4 - Alt +\par D3 - Left Ctrl +\par D2 - Left Alt +\par D1 - Right Ctrl +\par }{D0 - Right Alt +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f7\'e8\'f2\'e0\'e5\'f2 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee\'e1 \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'ec \'ed\'e0\'e6\'e0\'f2\'e8\'e8 \'e8\'e7 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0 +\'e2\'e8\'e0\'f2\'f3\'f0\'fb. }{\v +\par }{\f17 \'c5\'f1\'eb\'e8 \'e1\'f3\'f4\'e5\'f0 \'ef\'f3\'f1\'f2, \'ee\'e6\'e8\'e4\'e0\'e5\'f2 \'ef\'ee\'ff\'e2\'eb\'e5\'ed\'e8\'ff \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8. \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 E \'e2\'fb\'e4\'e0\'e5\'f2\'f1\'ff ASCII \'ea +\'ee\'e4 }{\v +\par }{\f17 \'f1\'e8\'ec\'e2\'ee\'eb\'e0, \'e0 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 (0..127). \'c5\'f1\'eb\'e8 \'e1\'e8\'f2 7 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 }{\v + +\par }{\f17 D \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed - \'fd\'f2\'ee \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2, \'f7\'f2\'ee \'e2\'ec\'e5\'f1\'f2\'e5 \'f1 \'ea\'eb\'e0\'e2\'e8\'f8\'e5\'e9 \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff Ctrl/Alt/Shift. }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d0\'e5\'e3\'e8\'f1\'f2\'f0 A \'e4\'f3\'e1\'eb\'e8\'f0\'f3\'e5\'f2 \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'ec\'ee\'e5 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 E \'e4\'eb\'ff \'f3\'e4\'ee\'e1\'f1 +\'f2\'e2\'e0 \'e2 \'ed\'e0\'ef\'e8\'f1\'e0\'ed\'e8\'e8 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 LOOP\tab LD\tab C,30h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff \'ed\'e0\'e6\'e0\'f2\'e8\'ff \'ea\'eb\'e0\'e2\'e8\'f8\'e8 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab }{\lang1033 CP\tab 0Dh\tab \tab ;}{\f17 \'cd\'e0\'e6\'e0\'f2\'e0}{\lang1033 ? +\par \tab }{\f17 JP\tab Z,ENTER\tab ;\'e5\'f1\'eb\'e8 \'e4\'e0, \'f2\'ee \'e2\'e2\'ee\'e4 +\par \tab LD\tab HL,011Bh\tab ;\'cf\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'e8 ASCII \'ea\'ee\'e4 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 <\'c5sc> +\par }{\tab }{\lang1033 AND\tab A\tab \tab ; +\par \tab SBC\tab HL,DE\tab \tab ;}{\f17 \'cd\'e0\'e6\'e0\'f2\'e0}{\lang1033 ? +\par \tab }{\f17 JP\tab Z,EXIT\tab \tab ;\'e5\'f1\'eb\'e8 \'e4\'e0, \'f2\'ee \'e2\'fb\'f5\'ee\'e4 +\par \tab JP\tab LOOP\tab \tab ;\'e8\'ed\'e0\'f7\'e5, \'ef\'ee\'e2\'f2\'ee\'f0\'e8\'f2\'fc \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 +\par }{ +\par }{\b\f17 31h (49) SCANKEY (\'ce\'ef\'f0\'ee\'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e1\'e5\'e7 \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 31h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ZF - \'ed\'e5\'f2 \'ea\'eb\'e0\'e2\'e8\'f8 +\par A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4 +\par \'c5}{\lang1033 - ASCII }{\f17 \'ea\'ee\'e4}{\lang1033 +\par C - D7 - RUS/LAT +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 - Num Lock +\par D2 - Scroll Lock +\par D1 - Insert +\par D0 - Caps Lock +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 B - D7 - Left Shift +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D6 - Right Shift +\par D5 - Ctrl +\par D4 - Alt +\par D3 - Left Ctrl +\par D2 - Left Alt +\par D1 - Right Ctrl +\par }{D0 - Right Alt +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f4\'eb\'e0\'e3 Z, \'e5\'f1\'eb\'e8 \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'ef\'f3\'f1\'f2. \'c8\'ed\'e0\'f7\'e5 \'f7\'e8 +\'f2\'e0\'e5\'f2 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee\'e1 \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'ec \'ed\'e0\'e6\'e0\'f2\'e8\'e8 \'e8\'e7 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb. \'c2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'ec\'fb\'e5 \'f0 +\'e5\'e3\'e8\'f1\'f2\'f0\'fb, \'ea\'e0\'ea }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 \'e2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 30h (WAITKEY). +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {NO_KEYS +\par }{\f17 \tab LD\tab C,31h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'ef\'f0\'ee\'f1\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e1\'e5\'e7 \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff +\par }{\tab RS}{\f17 T\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab Z,NO_KEYS\tab ;\'c5\'f1\'eb\'e8 \'ea\'eb\'e0\'e2\'e8\'f8\'e0 \'ed\'e5 \'ed\'e0\'e6\'e0\'f2\'e0 \'ef\'ee\'e2\'f2\'ee\'f0\'e8\'f2\'fc \'ee\'ef\'f0\'ee\'f1 +\par \tab BIT\tab 7,D\tab \tab ;\'cd\'e0\'e6\'e0\'f2\'e0 \'ee\'e4\'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e0? +\par \tab JP\tab Z,ONEKEY\tab ;\'c5\'f1\'eb\'e8 \'e4\'e0, \'ef\'e5\'f0\'e5\'f5\'ee\'e4 +\par }{\tab LD\tab A,B +\par }{\f17 \tab AND\tab 0C0h\tab \tab ;\'c1\'e8\'f2\'fb 7 \'e8 6 \'f0\'e0\'e2\'ed\'fb 0 +\par \tab JP\tab NZ,SHIFT\tab ;\'c5\'f1\'eb\'e8 \'ed\'e5\'f2, \'f2\'ee \'ed\'e0\'e6\'e0\'f2\'fb +<\'ea\'eb\'e0\'e2\'e8\'f8\'e0> +\par \tab BIT\tab 5,B\tab \tab ;\'c1\'e8\'f2 Ctrl \'e2 \'ed\'f3\'eb\'e5? +\par \tab JP\tab NZ,CTRL\tab ;\'c5\'f1\'eb\'e8 \'ed\'e5\'f2, \'f2\'ee \'ed\'e0\'e6\'e0\'f2\'fb +<\'ea\'eb\'e0\'e2\'e8\'f8\'e0> +\par \tab BIT\tab 4,B\tab \tab ;\'c1\'e8\'f2 Alt \'e2 \'ed\'f3\'eb\'e5? +\par \tab JP\tab NZ,CTRL\tab ;\'c5\'f1\'eb\'e8 \'ed\'e5\'f2, \'f2\'ee \'ed\'e0\'e6\'e0\'f2\'fb +<\'ea\'eb\'e0\'e2\'e8\'f8\'e0> +\par }{\lang1033 ONEKEY +\par \tab CP\tab 0Dh\tab \tab ;}{\f17 \'cd\'e0\'e6\'e0\'f2\'e0}{\lang1033 ? +\par \tab }{\f17 JP\tab Z,ENTER\tab ;\'e5\'f1\'eb\'e8 \'e4\'e0, \'f2\'ee \'e2\'e2\'ee\'e4 +\par \tab LD\tab HL,011Bh\tab ;\'cf\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'e8 ASCII \'ea\'ee\'e4 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 <\'c5sc> +\par }{\tab }{\lang1033 AND\tab A\tab \tab ; +\par \tab SBC\tab HL,DE\tab \tab ;}{\f17 \'cd\'e0\'e6\'e0\'f2\'e0}{\lang1033 ? +\par \tab }{\f17 JP\tab Z,EXIT\tab \tab ;\'e5\'f1\'eb\'e8 \'e4\'e0, \'f2\'ee \'e2\'fb\'f5\'ee\'e4 +\par }{ +\par +\par }{\b\f17 32h (50) ECHOKEY (\'ce\'e6\'e8\'e4\'e0\'ed\'e8\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'f1 \'ef\'e5\'f7\'e0\'f2\'fc\'fe) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 32h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4 +\par \'c5 - ASCII \'ea\'ee\'e4 +\par }{\lang1033 C - D7 - RUS/LAT +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 - Num Lock +\par D2 - Scroll Lock +\par D1 - Insert +\par D0 - Caps Lock +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 B - D7 - Left Shift +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D6 - Right Shift +\par D5 - Ctrl +\par D4 - Alt +\par D3 - Left Ctrl +\par D2 - Left Alt +\par D1 - Right Ctrl +\par }{D0 - Right Alt +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e0\'ed\'e0\'eb\'ee\'e3\'e8\'f7\'ed\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 30h, \'ed\'ee \'ef\'ee\'f1\'eb\'e5 \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'ff \'ea\'ee\'e4\'e0 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'ee\'ed }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e5\'f7\'e0\'f2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5. \'c2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'ec\'fb\'e5 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'fb, \'ea\'e0\'ea \'e8 +\'e2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 30h (WAITKEY). +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 33h (51) CTRLKEY (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 33h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A = 0 - \'ed\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e2 \'e1\'f3\'f4\'e5\'f0\'e5 +\par }{\lang1033 C - D7 - RUS/LAT +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 - Num Lock +\par D2 - Scroll Lock +\par D1 - Insert +\par D0 - Caps Lock +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 B - D7 - Left Shift +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D6 - Right Shift +\par D5 - Ctrl +\par D4 - Alt +\par D3 - Left Ctrl +\par D2 - Left Alt +\par D1 - Right Ctrl +\par }{D0 - Right Alt +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'ed\'e0 \'e4\'e0\'ed\'ed\'fb\'e9 \'ec\'ee\'ec\'e5\'ed\'f2. \'d2\'ee + \'e5\'f1\'f2\'fc, \'e4\'e0\'ed\'ed\'fb\'e5 }{\v +\par }{\f17 \'e1\'e5\'f0\'f3\'f2\'f1\'ff \'ed\'e5 \'e8\'e7 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb (\'ea\'e0\'ea \'e2 \'ee\'f1\'f2\'e0\'eb\'fc\'ed\'fb\'f5 \'f4\'f3\'ed\'ea\'f6\'e8\'ff\'f5), \'e0 \'ed\'e5\'ef\'ee\'f1\'f0\'e5\'e4\'f1 +\'f2\'e2\'e5\'ed\'ed\'ee \'e8\'e7 }{\v +\par }{\f17 \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2\'ee\'e2 \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e5\'e3\'ee \'f1\'ea\'e0\'ed\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'ff \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb. \'d0\'e5\'e3\'e8\'f1\'f2\'f0 A \'f0\'e0\'e2\'e5\'ed \'ed\'f3\'eb\'fe, +\'e5\'f1\'eb\'e8 \'e1\'f3\'f4\'e5\'f0 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'ef\'f3\'f1\'f2. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 35h (53) K_CLEAR (\'ce\'f7\'e8\'f1\'f2\'e8\'f2\'fc \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'f4\'f3\'ed\'ea\'f6 +\'e8\'fe) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'ed\'ee\'ec\'e5\'f0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 30h, 31h, 32h, 33h \'e8\'eb\'e8 34h +\par }{C - 35h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par \'c2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f7\'e8\'f9\'e0\'e5\'f2 \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb, \'ef\'ee\'f1\'eb\'e5 \'f7\'e5\'e3\'ee \'e2\'fb\'ef\'ee\'eb\'ed\'ff +\'e5\'f2 \'f4\'f3\'ed\'ea\'f6\'e8\'fe \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'f3\'fe }{\v +\par }{\f17 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B. \'ce\'ed\'e0 \'ef\'ee\'e7\'e2\'ee\'eb\'ff\'e5\'f2 \'ef\'f0\'e5\'e4\'ee\'f2\'e2\'f0\'e0\'f2\'e8\'f2\'fc \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'e5 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ee\'e9 }{\v + +\par }{\f17 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2, \'e2\'e2\'e5\'e4\'e5\'ed\'ed\'fb\'f5 \'f1 \'ee\'ef\'e5\'f0\'e5\'e6\'e5\'ed\'e8\'e5\'ec. \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'ea\'ee\'ec\'e0\'ed\'e4\'e0 FORMAT \'ee\'f7\'e8\'f9\'e0\'e5\'f2 \'e1\'f3\'f4\'e5\'f0 }{\v + +\par }{\f17 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'ef\'e5\'f0\'e5\'e4 \'e7\'e0\'ef\'f0\'ee\'f1\'ee\'ec \'ee \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'ee\'f1\'f2\'e8 \'f4\'ee\'f0\'ec\'e0\'f2\'e8\'f0\'ee\'e2\'e0\'f2\'fc \'e4\'e8\'f1\'ea. \'cf\'ee\'fd\'f2\'ee\'ec +\'f3 \'f1\'eb\'f3\'f7\'e0\'e9\'ed\'ee\'e5 }{\v +\par }{\f17 \'ed\'e0\'eb\'e8\'f7\'e8\'e5 \'e2 \'e1\'f3\'f4\'e5\'f0\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'e0, \'f0\'e0\'e7\'f0\'e5\'f8\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5, \'ed\'e5 \'e2\'fb\'e7\'ee\'e2\'e5\'f2 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e5\'e9\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'ff. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 36h (54) K_SETUP (\'d3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'e5 \'ed\'e0\'f1\'f2\'f0\'ee\'e9\'ea\'e0\'ec\'e8 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'ed\'ee\'ec\'e5\'f0 \'ef\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{C - 36h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par \'c2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B. +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'ee\'e9. +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B = 0, \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'f3 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb +\par A - \'ed\'ee\'ec\'e5\'f0 \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'e8 +\par }\pard\plain \fi283\widctlpar\adjustright \fs20\lang1049\cgrid {0 - normal +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 1 -\tab shift +\par 2 -\tab caps lock +\par 3 -\tab caps lock + shift +\par }{\f17 4 -\tab normal (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.) +\par 5 -\tab shift (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.) +\par 6 -\tab caps lock (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.) +\par 7 -\tab caps lock + shift (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.) +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B = 1, \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'e7\'e2\'f3\'ea\'ee\'e2\'fb\'f5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'fb\'f5 +\par B = 2, \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'e7\'e2\'f3\'ea\'ee\'e2\'fb\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'fb\'e5 +\par A - \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'ee\'e9 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {D0 - }{\f17 \'f1\'e8\'e3\'ed\'e0\'eb \'ef\'e5\'f0\'e5\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb +\par D1 - \'f1\'e8\'e3\'ed\'e0\'eb \'ef\'e5\'f0\'e5\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'ff \'ed\'e0 \'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'f3\'fe \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'f3 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 37h (55) TESTKEY (\'ce\'ef\'f0\'ee\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 37h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ZF - \'ed\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e2 \'e1\'f3\'f4\'e5\'f0\'e5 +\par A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4 +\par \'c5}{\lang1033 - ASCII }{\f17 \'ea\'ee\'e4}{\lang1033 +\par C - D7 - RUS/LAT +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 - Num Lock +\par D2 - Scroll Lock +\par D1 - Insert +\par D0 - Caps Lock +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 B - D7 - Left Shift +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D6 - Right Shift +\par D5 - Ctrl +\par D4 - Alt +\par D3 - Left Ctrl +\par D2 - Left Alt +\par D1 - Right Ctrl +\par }{D0 - Right Alt +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f4\'eb\'e0\'e3 Z, \'e5\'f1\'eb\'e8 \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'ef\'f3\'f1\'f2. \'c8\'ed\'e0\'f7\'e5 \'f7\'e8 +\'f2\'e0\'e5\'f2 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee\'e1 \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'ec \'ed\'e0\'e6\'e0\'f2\'e8\'e8 \'e8\'e7 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb. \'c2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'ec\'fb\'e5 \'f0 +\'e5\'e3\'e8\'f1\'f2\'f0\'fb, \'ea\'e0\'ea }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 \'e2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 30h (WAITKEY). \'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'ed\'e0\'e6\'e0\'f2\'e8\'e8 \'ee\'f1\'f2\'e0\'e5\'f2\'f1\'ff \'e2 \'e1\'f3\'f4 +\'e5\'f0\'e5. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'c7\'e0\'ef\'f3\'f1\'ea \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e9: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb \'f5\'f0\'e0\'ed\'ff\'f2\'f1\'ff \'ed\'e0 \'e4\'e8\'f1\'ea\'e5, \'ea\'e0\'ea \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'fb\'e5 (\'e2\'fb\'ef\'ee +\'eb\'ed\'ff\'e5\'ec\'fb\'e5) \'f4\'e0\'e9\'eb\'fb. \'ce\'e4\'ed\'e0 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8\'e7 \'ee\'f1\'ed\'ee\'e2\'ed\'fb\'f5 \'e7\'e0\'e4\'e0\'f7 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ee\'ed\'ed\'ee\'e9 \'f1\'e8\'f1\'f2\'e5\'ec\'fb - \'ee\'f0\'e3\'e0\'ed\'e8\'e7\'ee\'e2 +\'e0\'f2\'fc \'e8\'f5 \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5. +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'ca\'ee\'ec\'e0\'ed\'e4\'ed\'e0\'ff \'f1\'f2\'f0\'ee\'ea\'e0 \'e4\'eb\'ff \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec \'e8\'ec\'e5\'e5\'f2 \'f4\'ee\'f0\'ec\'e0\'f2: +\par }{\i\f17 [\'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee:][\\\'ef\'f3\'f2\'fc\\]\'e8\'ec\'ff [\'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb] +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'d3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee \'e8 \'ef\'f3\'f2\'fc \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'fe\'f2 \'ec\'e5\'f1\'f2\'ee \'ed\'e0\'f5\'ee\'e6\'e4\'e5\'ed\'e8\'ff \'ef\'f0\'e8 +\'eb\'ee\'e6\'e5\'ed\'e8\'ff \'ed\'e0 \'e4\'e8\'f1\'ea\'e5. \'c5\'f1\'eb\'e8 }{\v +\par }{\f17 \'ee\'ed\'e8 \'ef\'f0\'ee\'ef\'f3\'f9\'e5\'ed\'fb, \'ef\'ee\'e8\'f1\'ea \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea +\'e0. \'c5\'f1\'eb\'e8 }{\v +\par }{\f17 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0, \'ee\'ed\'ee \'e8\'e3\'ed\'ee\'f0\'e8\'f0\'f3\'e5\'f2\'f1\'ff, \'f2\'e0\'ea \'ea\'e0\'ea, \'f3 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'fb\'f5 \'f4\'e0\'e9\'eb +\'ee\'e2 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'ec\'ee\'e6\'e5\'f2 \'e1\'fb\'f2\'fc \'f2\'ee\'eb\'fc\'ea\'ee EXE. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 EXE \'f4\'e0\'e9\'eb\'fb \'f1\'ee\'f1\'f2\'ee\'ff\'f2 \'e8\'e7 \'e4\'e2\'f3\'f5 \'f7\'e0\'f1\'f2\'e5\'e9, \'ef\'f0\'e5\'f4\'e8\'ea\'f1\'e0 \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'ec +\'ee\'e3\'ee \'ec\'ee\'e4\'f3\'eb\'ff. \'cf\'f0\'e5\'f4\'e8\'ea\'f1 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2 \'e2 \'f1\'e5\'e1\'e5 \'f0\'e0\'e7\'eb\'e8\'f7\'ed\'f3\'fe \'e2\'f1\'ef\'ee\'ec\'ee\'e3\'e0\'f2\'e5\'eb\'fc\'ed\'f3\'fe \'e8\'ed\'f4\'ee\'f0\'ec +\'e0\'f6\'e8\'fe: +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e5\'f4\'e8\'ea\'f1 EXE \'f4\'e0\'e9\'eb\'e0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 +00 2 dw \tab 5845h\tab \tab ; \'c8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 EXE \'f4\'e0\'e9\'eb\'e0 +\par +02 1 db \tab 45h\tab \tab ; \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par +03 1 db \tab 00h\tab \tab ; \'c2\'e5\'f0\'f1\'e8\'ff EXE \'f4\'e0\'e9\'eb\'e0 +\par +04 4 dd \tab 00000200h\tab ; \'cd\'e0\'f7\'e0\'eb\'ee \'e8\'f1\'ef\'ee\'eb\'ed\'ff\'e5\'ec\'ee\'e3\'ee \'ea\'ee\'e4\'e0 (\'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5) +\par +08 2 dw \tab 0000h\tab \tab ; \'d0\'e0\'e7\'ec\'e5\'f0 \'ef\'e5\'f0\'e2\'e8\'f7\'ed\'ee\'e3\'ee \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea\'e0 \'e8\'eb\'e8 0 +\par +10 4 dd \tab 00000000h\tab ; \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'fb +\par +14 2 dw \tab 0000h\tab \tab ; \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'fb +\par +16 2 dw \tab ????\tab \tab ; \'c0\'e4\'f0\'e5\'f1 \'f0\'e0\'f1\'ef\'ee\'eb\'ee\'e6\'e5\'ed\'e8\'ff \'ea\'ee\'e4\'e0 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8 +\par +18 2 dw \tab ????\tab \tab ; \'c0\'e4\'f0\'e5\'f1 \'e7\'e0\'ef\'f3\'f1\'ea\'e0 (\'f0\'e5\'e3\'e8\'f1\'f2\'f0 PC) +\par }{ +20 }{\f17 2 dw \tab ????\tab \tab ; \'c0\'e4\'f0\'e5\'f1 \'f0\'e0\'f1\'ef\'ee\'eb\'ee\'e6\'e5\'ed\'e8\'ff \'f1\'f2\'e5\'ea\'e0 (\'f0\'e5\'e3\'e8\'f1\'f2\'f0 SP) +\par +22 490 ds \tab 0\tab \tab ; \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'fb +\par }{ +\par }{\f17 +512\tab \tab \tab \tab ; \'ca\'ee\'e4 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb +\par }{ +\par +\par }{\b\f17 40h (64) EXEC (\'c2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'f4\'e0\'e9\'eb) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par B = 0 - \'e7\'e0\'e3\'f0\'f3\'e7\'e8\'f2\'fc \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3 +\par }{C - 40h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 EXE-\'f4\'e0\'e9\'eb\'e0 \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'ef\'ee \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'ec \'ef\'f3\'ed +\'ea\'f2\'e0\'ec: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 1)\tab \'ce\'f2\'ea\'f0\'fb\'e2\'e0\'e5\'f2 exe-\'f4\'e0\'e9\'eb \'ed\'e0 \'f7\'f2\'e5\'ed\'e8\'e5; +\par 2)\tab \'d1\'f7\'e8\'f2\'fb\'e2\'e0\'e5\'f2 \'e2 \'f0\'e0\'e1\'ee\'f7\'f3\'fe \'ee\'e1\'eb\'e0\'f1\'f2\'fc \'ef\'f0\'e5\'f4\'e8\'ea\'f1 exe-\'f4\'e0\'e9\'eb\'e0; +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 3) \'c2\'fb\'e4\'e5\'eb\'ff\'e5\'f2 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8, \'f2\'f0\'e5\'e1\'f3\'e5\'ec\'fb\'e9 \'e4\'eb\'ff \'e7\'e0\'e3\'f0\'f3\'e7\'ea\'e8 \'e2\'f1\'e5\'e3\'ee \'f4\'e0 +\'e9\'eb\'e0 \'e8\'eb\'e8 \'ef\'e5\'f0\'e2\'e8\'f7\'ed\'ee\'e3\'ee }{\v +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea\'e0, \'e5\'f1\'eb\'e8 \'e5\'e3\'ee \'f0\'e0\'e7\'ec\'e5\'f0 \'ed\'e5 \'f0\'e0\'e2\'e5\'ed \'ed\'f3\'eb\'fe; +\par 4)\tab \'d1\'ee\'f5\'f0\'e0\'ed\'ff\'e5\'f2 \'f1\'f2\'e5\'ea; +\par 5)\tab \'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e8\'e7 \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'ed\'ee\'e3\'ee \'e1\'eb\'ee\'ea\'e0; +\par 6)\tab \'d1\'f2\'f0\'ee\'e8\'f2 \'ef\'f0\'e5\'f4\'e8\'ea\'f1 \'e7\'e0\'ef\'f3\'f1\'ea\'e0 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb \'e8 \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'ed\'e0 \'ed\'e5\'e3\'ee \'f0\'e5\'e3\'e8\'f1\'f2\'f0 IX; +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 7) \'d1\'f7\'e8\'f2\'fb\'e2\'e0\'e5\'f2 \'f4\'e0\'e9\'eb \'ef\'ee \'e0\'e4\'f0\'e5\'f1\'f3 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'ec\'f3 \'e2 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e8 16 (\'c0\'e4\'f0\'e5 +\'f1 \'f0\'e0\'f1\'ef\'ee\'eb\'ee\'e6\'e5\'ed\'e8\'ff \'ea\'ee\'e4\'e0 \'e2 }{\v +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e0\'ec\'ff\'f2\'e8); +\par 8)\tab \'c7\'e0\'ea\'f0\'fb\'e2\'e0\'e5\'f2 exe-\'f4\'e0\'e9\'eb, \'e5\'f1\'eb\'e8 \'fd\'f2\'ee \'ed\'e5 \'ef\'e5\'f0\'e2\'e8\'f7\'ed\'fb\'e9 \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea; +\par 9)\tab \'d3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'f1\'f2\'e5\'ea \'f0\'e0\'e2\'ed\'fb\'ec \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'fe \'e8\'e7 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'ff 20 (\'c0\'e4\'f0\'e5\'f1 \'f0\'e0\'f1\'ef\'ee\'eb\'ee\'e6\'e5\'ed\'e8\'ff \'f1 +\'f2\'e5\'ea\'e0); +\par 10)\tab \'cf\'e5\'f0\'e5\'e4\'e0\'e5\'f2 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'e5 \'ef\'ee \'e0\'e4\'f0\'e5\'f1\'f3 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'ec\'f3 \'e2 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e8 18 (\'c0\'e4\'f0\'e5\'f1 \'e7\'e0\'ef\'f3\'f1\'ea\'e0); + +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'cf\'f0\'e5\'f4\'e8\'ea\'f1 \'e7\'e0\'ef\'f3\'f1\'ea\'e0 \'f4\'e0\'e9\'eb\'e0: +\par }\pard\plain \s17\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 -03 1\tab db ? \tab ; \'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 exe-\'f4\'e0\'e9\'eb \'f1 \'ef\'e5\'f0\'e2\'e8\'f7\'ed\'fb\'ec \'e7 +\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea\'ee\'ec +\par -02 1\tab db ? \tab ; \'c8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par -01 1\tab db ? \tab ; \'d3\'f0\'ee\'e2\'e5\'ed\'fc \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 +00 1\tab db ? \tab ; \'c4\'eb\'e8\'ed\'ed\'e0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 +01 127\tab ds ? \tab ; \'cf\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8, \'e7\'e0\'ea\'e0\'ed\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed +\'f3\'eb\'e5\'ec +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'e5xe-\'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,40h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab B,00h\tab \tab ;\'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e3\'f0\'f3\'e7\'e8\'f2\'fc \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab RET\tab C\tab \tab ;\'c2\'ee\'e7\'e2\'f0\'e0\'f2 \'ef\'ee \'ee\'f8\'e8\'e1\'ea\'e5 +\par }{\tab L}{\f17 D\tab (ENDCODE),A\tab ;\'d1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'ea\'ee\'e4\'e0 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff +\par }{\tab +\par }{\lang1033 NAME\tab \tab DB\tab \ldblquote \\PROG\\UTILITY\\prog.exe\rdblquote ,0 +\par }{ENDCODE \tab DB\tab 00h +\par +\par +\par }{\b\f17 41h (65) EXIT (\'c7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'e5 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff +\par }{C - 41h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e2\'e5\'f0\'f8\'e0\'e5\'f2 \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb, \'ee\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e0\'e5 +\'f2 \'e7\'e0\'ed\'e8\'ec\'e0\'e5\'ec\'f3\'fe }{\v +\par }{\f17 \'ef\'e0\'ec\'ff\'f2\'fc \'e8 \'ef\'e5\'f0\'e5\'e4\'e0\'b8\'f2 \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff \'e2 \'f0\'ee\'e4\'e8\'f2\'e5\'eb\'fc\'ed\'f3\'fe \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3. \'ca\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5 +\'ed\'e8\'ff }{\v +\par }{\f17 \'f2\'e0\'ea\'e6\'e5 \'f1\'ee\'f5\'f0\'e0\'ed\'ff\'e5\'f2\'f1\'ff \'e2 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e9 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'ee\'e9 \'c4\'ce\'d1 \'e8 \'e5\'e3\'ee \'ec\'ee\'e6\'ed\'ee \'ef\'ee\'e7\'e4\'ed\'e5\'e5 \'ef\'ee\'eb\'f3 +\'f7\'e8\'f2\'fc \'ef\'f0\'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'ee\'ec\'ee\'f9\'e8 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 42h (WAIT). +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\lang1033 +\par }{\b\f17 42h (66) WAIT (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 42h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff, \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e5\'e9 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'ed\'ee\'e9 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par +\par }\pard \qc\widctlpar\adjustright {\b\f23\fs24 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'e0 \'f1 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'ee\'e9: +\par }\pard \widctlpar\adjustright { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 43h (67) GSWITCH (\'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'ec\'ee\'e3\'ee \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0 +\par }{C - 43h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 CF=0 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 \'ed\'e5 \'e4\'ee\'f1\'f2\'e8\'e3\'ed\'f3\'f2 (\'e5\'f1\'f2\'fc \'e4\'f0\'f3\'e3\'e8\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 +\'fb) +\par CF=1 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 (\'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'e5\'f0\'e5\'ed\'e5\'f1\'b8\'ed \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e8\'eb\'e8 \'ed\'ee\'eb\'fc) +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'f2 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8. \'cf\'e0\'f0\'e0\'ec\'e5\'f2 +\'f0\'e0\'ec\'e8 \'f1\'f7\'e8\'f2\'e0\'fe\'f2\'f1\'ff }{\v +\par }{\f17 \'eb\'fe\'e1\'fb\'e5 \'ef\'ee\'f1\'eb\'e5\'e4\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'f0\'e0\'e7\'e4\'e5\'eb\'b8\'ed\'ed\'fb\'e5 \'ef\'f0\'ee\'e1\'e5\'eb\'e0\'ec\'e8. \'c2\'e5\'e4\'f3\'f9\'e8\'e5 \'ef\'f0 +\'ee\'e1\'e5\'eb\'fb }{\v +\par }{\f17 \'e8\'e3\'ed\'ee\'f0\'e8\'f0\'f3\'fe\'f2\'f1\'ff. \'cf\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e2 \'e1\'f3\'f4\'e5\'f0\'e5 \'e7\'e0\'e2\'e5\'f0\'f8\'e0\'e5\'f2\'f1\'ff \'ea\'ee\'e4\'ee\'ec \'ed\'ee\'eb\'fc, \'e5\'f1\'eb\'e8 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 +\'fb }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'f2\'f1\'f3\'f2\'f1\'f2\'e2\'f3\'fe\'f2, \'e2 \'e1\'f3\'f4\'e5\'f0 \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'ee\'eb\'fc. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,COMLINE\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'f3\'fe \'f1\'f2\'f0\'ee\'ea\'f3 +\par NEXTP\tab LD\tab DE,BUFFER\tab ;DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'ee\'e2 +\par \tab LD\tab C,43h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'e8\'ff \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab }{\lang1033 PUSH\tab AF +\par \tab PUSH\tab HL +\par \tab }{. +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 . \'ce\'e1\'f0\'e0\'e1\'ee\'f2\'ea\'e0 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\tab }{\lang1033 . +\par \tab POP\tab HL +\par \tab POP\tab AF +\par \tab JP\tab NC,NEXTP +\par +\par \tab +\par COMLINE\tab DB\tab \ldblquote file1.txt file2.txt -x\rdblquote ,0 +\par BUFFER\tab DS\tab 127,0 +\par +\par +\par }{\b\lang1033 44h (68) DOSNAME (}{\b\f17 \'cf\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc}{\b\lang1033 }{\b\f17 \'e8\'ec\'ff}{\b\lang1033 }{\b\f17 \'f4\'e0\'e9\'eb\'e0}{\b\lang1033 ) +\par }{\lang1033 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f2 C - 44h +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f29 B = 0, \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0 +\'f2 \'c4\'ce\'d1 +\par }{\f2 HL }{\f29 - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1 +\par B = 1, \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par HL - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1 +\par DE - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \tab db\tab \ldblquote name.ext\rdblquote ,0 \tab ; \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1 +\par \tab db\tab \ldblquote name ext\rdblquote \tab ; 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'fb\'e2\'e0\'e5\'f2 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1 +\'e8 \'ee\'e1\'f0\'e0\'f2\'ed\'ee. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par }\pard\plain \s22\widctlpar\adjustright \b\fs20\lang1049\cgrid {\f17 45h (69) EXCMDLN (\'d0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8) +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'ff +\par }{\f2 C - 45h +\par }{\f29 B - \'ed\'ee\'ec\'e5\'f0 \'ef\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'e8: +\par }{\i\f29 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3; +\par 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe; +\par 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par 5 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5\line \'f4\'e0\'e9\'eb\'e0; +\par 6 - \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'e0; +\par 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8; +\par 8 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1; +\par 9 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e2 \'e7\'e0\'e2 +\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ed\'ee\'ec\'e5\'f0\'e0 \'ef\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }{\f2 C - 45h +\par }{\f29 B = 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 A - D7 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 * +\par D3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par D2 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3; +\par D1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par D0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'e2\'ee\'e7 +\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par \tab LD\tab C,45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,0\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3 +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'f3\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'fb \'f0\'e0\'e7\'f0\'ff\'e4\'fb D0, D2, D3. +\par }{ +\par }{\lang1033 STRING\tab db\tab "c:\\dir1\\name",0 +\par +\par +\par }{\b\i\lang1033 }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0: +\par }\pard\plain \s25\widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\par }{\f2 C - 45h +\par }{\f29 B = 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f2 }{\f29 A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0 - A, 1 - B, 2 - C \'e8 \'f2.\'e4.) +\par \'e1\'f3\'f4\'e5\'f0 - \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 "A:",0 +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'ea\'ee\'ef +\'e8\'f0\'f3\'e5\'f2 \'e2 \'e1\'f3\'f4\'e5\'f0 \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'e5\'f1\'eb\'e8 \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 \'ed\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb\'ee\'f1\'fc \'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'ec\'e5\'f9\'e0\'e5\'f2\'f1\'ff + 0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par \tab LD\tab DE,BUFFER\tab ; DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,1\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'e5\'f2 2 (drive C:) +\par \tab ; \'c2 \'e1\'f3\'f4\'e5\'f0\'e5 "C:",0 +\par }{\f2 +\par }{\f2\lang1033 STRING\tab db\tab "c:\\dir1\\name",0 +\par +\par }{\f2 BUFFER\tab ds\tab 13 +\par }{ +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 256 \'e1\'e0\'e9\'f2) +\par }{\f2 C - 45h +\par }{\f29 B = 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 \'e1\'f3\'f4\'e5\'f0 - \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'ff "DIR1\\DIR2\\DIR3\\",0 +\par A - D7 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 * +\par D3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par D2 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3; +\par D1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par D0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'ea\'ee\'ef +\'e8\'f0\'f3\'e5\'f2 \'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e5\'f1\'eb\'e8 \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'ff \'ed\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb\'e0\'f1\'fc \'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'ec\'e5\'f9\'e0 +\'e5\'f2\'f1\'ff 0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par \tab LD\tab DE,BUFFER\tab ; DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,2\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'f3\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'fb \'f0\'e0\'e7\'f0\'ff\'e4\'fb D0, D1, D2, D3. +\par \tab ; \'c2 \'e1\'f3\'f4\'e5\'f0\'e5 "\\DIR1\\DIR2\\",0 +\par }{\f2 +\par }{\f2\lang1033 STRING\tab db\tab "c:\\dir1\\dir2\\name.ext",0 +\par +\par }{\f2 BUFFER\tab ds\tab 256 +\par }{ +\par +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }\pard\plain \s25\widctlpar\adjustright \fs20\lang1049\cgrid {\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f29 DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\par }{\f2 C - 45h +\par }{\f29 B = 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0}{ +\par +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 \'e1\'f3\'f4\'e5\'f0 - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 "FILE.EXT",0 +\par A - D7 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 * +\par D3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par D2 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3; +\par D1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par D0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'ea\'ee\'ef +\'e8\'f0\'f3\'e5\'f2 \'e2 \'e1\'f3\'f4\'e5\'f0 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'ed\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb\'e0\'f1\'fc +\'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'ec\'e5\'f9\'e0\'e5\'f2\'f1\'ff 0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par \tab LD\tab DE,BUFFER\tab ; DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,3\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'f3\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'fb \'f0\'e0\'e7\'f0\'ff\'e4\'fb}{\f2 D0, D1, D2, D3. +\par }{\f29 \tab ; \'c2 \'e1\'f3\'f4\'e5\'f0\'e5 "name.ext",0 +\par }{ +\par }{\f2\lang1033 STRING\tab db\tab "c:\\dir1\\dir2\\name.ext",0 +\par +\par }{\f2 BUFFER\tab ds\tab 13 +\par }{ +\par +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 4 \'e1\'e0\'e9\'f2) +\par }{\f2 C - 45h +\par }{\f29 B = 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 \'e1\'f3\'f4\'e5\'f0 - \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 "TXT",0 \'e8\'eb\'e8 "C ",0 +\par A - D7 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 * +\par D3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par D2 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3; +\par D1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par D0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'ea\'ee\'ef +\'e8\'f0\'f3\'e5\'f2 \'e2 \'e1\'f3\'f4\'e5\'f0 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 \'ed\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb\'ee\'f1\'fc \'e2 \'e1 +\'f3\'f4\'e5\'f0 \'ef\'ee\'ec\'e5\'f9\'e0\'e5\'f2\'f1\'ff 0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par }{\f2 \tab LD\tab D}{\f29 E,BUFFER\tab ; DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,4\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'f3\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'fb \'f0\'e0\'e7\'f0\'ff\'e4\'fb D0, D1, D2, D3. +\par \tab ; \'c2 \'e1\'f3\'f4\'e5\'f0\'e5 "ext",0 +\par }{\f2 +\par }{\f2\lang1033 STRING\tab db\tab "c:\\dir1\\dir2\\name.ext",0 +\par }{\lang1033 +\par }\pard\plain \s25\widctlpar\adjustright \fs20\lang1049\cgrid {\f2 BUFFER\tab ds\tab 4 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 5 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4 +\'e0\'e9\'eb\'e0: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 8 \'e1\'e0\'e9\'f2) +\par \tab +0 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'e4\'e8\'f1\'ea\'e0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\par }{\f2 +2 }{\f29 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'e8 (\'ec\'e0\'ea\'f1. 256 \'e1\'e0\'e9\'f2) +\par +3 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\par +4 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 (\'ec\'e0\'ea\'f1. 4 \'e1\'e0\'e9\'f2\'e0) +\par }{\f2 C - 45h +\par }{\f29 B = 5 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 A - D7 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 * +\par D3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par D2 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3; +\par D1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par D0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'ea\'ee\'ef +\'e8\'f0\'f3\'e5\'f2 \'e2 \'e1\'f3\'f4\'e5\'f0\'fb \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'ed\'fb\'e5 \'fd\'eb\'e5\'ec\'e5\'ed\'f2\'fb \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8, \'e5\'f1\'eb\'e8 \'ea\'e0\'ea\'ee\'e9-\'eb\'e8\'e1\'ee \'fd +\'eb\'e5\'ec\'e5\'ed\'f2 \'ed\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb\'f1\'ff \'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'ec\'e5\'f9\'e0\'e5\'f2\'f1\'ff 0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par \tab LD\tab DE,PBUFFER\tab ; DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par }{\f2 \tab LD\tab C,}{\f29 45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,5\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'f3\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'fb \'f0\'e0\'e7\'f0\'ff\'e4\'fb D0, D1, D2, D3. +\par }{\f2 \tab }{\f2\lang1033 ; }{\f29 \'c2}{\f2\lang1033 }{\f29 \'e1\'f3\'f4\'e5\'f0\'e5}{\f2\lang1033 DRIVE_A "C:",0 +\par \tab ; }{\f29 \'c2}{\f2\lang1033 }{\f29 \'e1\'f3\'f4\'e5\'f0\'e5}{\f2\lang1033 DIR_A "\\DIR1\\DIR2\\",0 +\par \tab ; }{\f29 \'c2}{\f2\lang1033 }{\f29 \'e1\'f3\'f4\'e5\'f0\'e5}{\f2\lang1033 NAME_A "NAME.EXT",0 +\par \tab ; }{\f29 \'c2}{\f2\lang1033 }{\f29 \'e1\'f3\'f4\'e5\'f0\'e5}{\f2\lang1033 TYPE_A "EXT",0 +\par +\par STRING\tab db\tab "c:\\dir1\\dir2\\name.ext",0 +\par +\par PBUFFER\tab dw\tab DRIVE_A +\par \tab dw\tab DIR_A +\par \tab dw\tab NAME_A +\par \tab dw\tab TYPE_A +\par +\par DRIVE_A\tab ds\tab 13 +\par DIR_A\tab ds\tab 256 +\par NAME_A\tab ds\tab 13 +\par TYPE_A\tab ds\tab 4 +\par }{ +\par +\par +\par }{\lang1033 +\par }{\b\i\lang1033 }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'ec\'ee\'e3\'ee \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0 (\'ec\'e0\'ea\'f1. 256 \'e1\'e0\'e9\'f2) +\par }{\f2 C - 45h +\par }\pard\plain \s25\widctlpar\adjustright \fs20\lang1049\cgrid {\f29 B = 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par CF=0 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 \'ed\'e5 \'e4\'ee\'f1\'f2\'e8\'e3\'ed\'f3\'f2 (\'e5\'f1\'f2\'fc \'e4\'f0\'f3\'e3\'e8\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb) +\par CF=1 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 (\'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'e5\'f0\'e5\'ed\'e5\'f1\'b8\'ed \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e8\'eb\'e8 \line \'ed\'ee\'eb\'fc) +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'f2 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8. \'cf\'e0\'f0\'e0\'ec\'e5 +\'f2\'f0\'e0\'ec\'e8 \'f1\'f7\'e8\'f2\'e0\'fe\'f2\'f1\'ff \'eb\'fe\'e1\'fb\'e5 \'ef\'ee\'f1\'eb\'e5\'e4\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'f0\'e0\'e7\'e4\'e5\'eb\'b8\'ed\'ed\'fb\'e5 \'ef\'f0\'ee\'e1\'e5\'eb +\'e0\'ec\'e8. \'c2\'e5\'e4\'f3\'f9\'e8\'e5 \'ef\'f0\'ee\'e1\'e5\'eb\'fb \'e8\'e3\'ed\'ee\'f0\'e8\'f0\'f3\'fe\'f2\'f1\'ff. \'cf\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e2 \'e1\'f3\'f4\'e5\'f0\'e5 \'e7\'e0\'e2\'e5\'f0\'f8\'e0\'e5\'f2\'f1\'ff \'ea\'ee\'e4\'ee\'ec \'ed +\'ee\'eb\'fc, \'e5\'f1\'eb\'e8 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb \'ee\'f2\'f1\'f3\'f2\'f1\'f2\'e2\'f3\'fe\'f2, \'e2 \'e1\'f3\'f4\'e5\'f0 \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'ee\'eb\'fc. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 8 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1 +\par }{\f2 C - 45h +\par }{\f29 B = 8 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1 +\par }{\f2 +\par }{\f29 \tab db\tab "name.ext",0 \tab ; \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1 +\par \tab db\tab "name ext"\tab ; 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }\pard\plain \s25\widctlpar\adjustright \fs20\lang1049\cgrid {\f29 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'fb\'e2\'e0\'e5\'f2 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee +\'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 9 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1 +\par DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par }{\f2 C - 45h +\par }{\f29 B = 9 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par }{\f2 +\par }{\f29 \tab db\tab "name.ext",0 \tab ; \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1 +\par \tab db\tab "name ext"\tab ; 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'fb\'e2\'e0\'e5\'f2 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 +\'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2. \'c2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'fe\'f2\'f1\'ff \'e3\'eb\'ee\'e1\'e0\'eb\'fc\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8 *. \'c2 \'fd\'f2 +\'ee\'ec \'f1\'eb\'f3\'f7\'e0\'e5 \'f1\'e8\'ec\'e2\'ee\'eb * \'e1\'f3\'e4\'e5\'f2 \'e7\'e0\'ec\'e5\'ed\'e5\'ed \'ed\'e0 \'ed\'e5\'f1\'ea\'ee\'eb\'fc\'ea\'ee \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 ? . \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0 "name*.c*", \'e1\'f3\'e4\'e5 +\'f2 \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'ed \'e2 "name????c??". +\par }{ +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d0\'e0\'e1\'ee\'f2\'e0 \'f1 \'fd\'ea\'f0\'e0\'ed\'ee\'ec: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'d1\'e5\'e9\'f7\'e0\'f1 DOS \'ef\'ee\'e4\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2 \'f7\'e5\'f2\'fb\'f0\'e5 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0. +\par \'c4\'e2\'e0 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'f5: +\par 40x32 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 c 16 \'f6\'e2\'e5\'f2\'e0\'ec\'e8 (\'f0\'e5\'e6\'e8\'ec 02h); +\par 80x32 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 c 16 \'f6\'e2\'e5\'f2\'e0\'ec\'e8 (\'f0\'e5\'e6\'e8\'ec 03h); +\par \'e8 \'e4\'e2\'e0 \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'f5: +\par 320x256 \'f2\'ee\'f7\'e5\'ea \'f1 256 \'f6\'e2\'e5\'f2\'e0\'ec\'e8 (\'f0\'e5\'e6\'e8\'ec 81h); +\par 640x256 \'f2\'ee\'f7\'e5\'ea \'f1 16 \'f6\'e2\'e5\'f2\'e0\'ec\'e8 (\'f0\'e5\'e6\'e8\'ec 82h); +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ce\'f1\'ed\'ee\'e2\'ed\'fb\'ec \'f0\'e5\'e6\'e8\'ec\'ee\'ec \'ff\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 \'f0\'e5\'e6\'e8\'ec 80x32 (03h), \'e5\'f1\'eb\'e8 +\'e2\'e0\'f8\'e0 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'f0\'e0\'e1\'ee\'f2\'e0\'e5\'f2 \'e2 \'e4\'f0\'f3\'e3\'ee\'ec \'f0\'e5\'e6\'e8\'ec\'e5, \'f2\'ee \'e2\'e0\'ec \'f1\'eb\'e5\'e4\'f3\'e5\'f2 \'ef\'e5\'f0\'e5\'e4 \'ef\'e5\'f0\'e5\'ea\'eb\'fe\'f7\'e5\'ed +\'e8\'e5\'ec \'f0\'e5\'e6\'e8\'ec\'e0 \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'ed\'ee\'ec\'e5\'f0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'f0\'e5\'e6\'e8\'ec\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 51h GETVMOD \'e8 \'f1\'ee\'f5\'f0\'e0\'ed\'e8\'f2\'fc \'e5\'e3\'ee, \'e0 + \'ef\'e5\'f0\'e5\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'e5\'ec \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb \'e2\'ee\'f1\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'e5\'e3\'ee. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0: +\par }{ +\par }{\f17 \tab LD\tab C,51h\tab ;\'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par }{\tab RST\tab 10h +\par }{\f17 \tab LD\tab C,A\tab ;\'ef\'ee\'ec\'e5\'f1\'f2\'e8\'f2\'fc \'ed\'ee\'ec\'e5\'f0 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0 C +\par \tab PUSH\tab BC\tab ;\'e8 \'f1\'ee\'f5\'f0\'e0\'ed\'e8\'f2\'fc \'ed\'e0 \'f1\'f2\'e5\'ea\'e5 (B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0, C - \'f0\'e5\'e6\'e8\'ec) +\par }{\tab . +\par }{\f17 \tab . \tab \tab ;\'e2\'e0\'f8\'e0 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 +\par }{\tab . +\par +\par }{\f17 \tab POP\tab BC\tab ;\'e2\'e7\'ff\'f2\'fc \'f1\'ee \'f1\'f2\'e5\'ea\'e0 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par \tab LD\tab A,C\tab ;\'ef\'ee\'ec\'e5\'f1\'f2\'e8\'f2\'fc \'ed\'ee\'ec\'e5\'f0 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0 A +\par \tab LD\tab C,50h\tab ;\'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par }{\tab RST\tab 10h +\par }{\f17 \tab LD\tab C,41h\tab ;\'e7\'e0\'e2\'e5\'f0\'f8\'e8\'f2\'fc \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3. +\par }{\tab RST\tab 10h +\par +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 DOS \'e8\'ec\'e5\'e5\'f2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2\'fb\'e2\'ee\'e4\'e0 \'ed\'e0 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 \'fd\'ea\'f0\'e0\'ed \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8 + \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'f5 \'f1\'f2\'f0\'ee\'ea. \'c4\'eb\'ff \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'f5 \'f0\'e5\'e6\'e8\'ec\'ee\'e2 \'f2\'f0\'e5\'e1\'f3\'fe\'f2\'f1\'ff \'f1\'ee\'e1\'f1\'f2\'e2\'e5\'ed\'ed\'fb\'e5 \'ef\'f0\'ee\'f6\'e5 +\'e4\'f3\'f0\'fb \'e2\'fb\'e2\'ee\'e4\'e0 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed. \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'ef\'f0\'e8 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'e8 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb \'e2\'fb \'ec\'ee\'e6\'e5\'f2\'e5 \'e2\'fb\'e4\'e0\'f2 +\'fc \'f1\'f2\'f0\'ee\'ea\'f3 \'ed\'e0 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 \'fd\'ea\'f0\'e0\'ed: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par \tab LD\tab }{\f17 HL,STRING\tab ;\'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par \tab LD\tab C,5Ch\tab \tab ;\'e2\'fb\'e2\'ee\'e4 \'f1\'f2\'f0\'ee\'ea\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par }{\tab }{\lang1033 RST\tab 10h +\par +\par STRING\tab DB\tab "Thank you for using my program..."\tab ;}{\f17 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'e0\'ff}{\lang1033 }{\f17 \'f1\'f2\'f0\'ee\'ea\'e0}{\lang1033 +\par \tab }{\f17 DB\tab 13,10\tab \tab ;\'f1\'e8\'ec\'e2\'ee\'eb\'fb \'e2\'ee\'e7\'e2\'f0\'e0\'f2\'e0 \'ea\'e0\'f0\'e5\'f2\'ea\'e8 \'e8 \'ef\'e5\'f0\'e5\'e2\'ee\'e4\'e0 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab DB\tab 0\tab \tab ;\'f1\'e8\'ec\'e2\'ee\'eb \'ea\'ee\'ed\'f6\'e0 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'c4\'eb\'ff \'e2\'fb\'e2\'ee\'e4\'e0 \'ed\'e0 \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'e9 \'fd\'ea\'f0\'e0\'ed, \'e2\'e0\'ec \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'ee \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e8\'f2\'fc \'e2 +\'e8\'e4\'e5\'ee \'ef\'e0\'ec\'ff\'f2\'fc \'e2 \'ee\'e4\'ed\'ee \'e8\'e7 \'f2\'f0\'e5\'f5 \'ee\'ea\'ee\'ed \'ef\'e0\'ec\'ff\'f2\'e8 04000h-07FFFh, 08000h-0BFFFh, 0C000h-0FFFFh. \'dd\'f2\'ee \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'e2\'fb +\'e2\'ee\'e4\'ee\'ec \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff 50h \'e2 \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e9 \'ef\'ee\'f0\'f2 0A2h, 0C2h \'e8\'eb\'e8 0E2h \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ee\'ea\'ed\'e0 \'ef\'e0 +\'ec\'ff\'f2\'e8. \'cf\'f0\'e8 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e8 \'ee\'e1\'f0\'e0\'f2\'e8\'f2\'e5 \'e2\'ed\'e8\'ec\'e0\'ed\'e8\'e5 \'ed\'e0 \'f2\'ee, \'f7\'f2\'ee\'e1\'fb \'f1\'f2\'e5\'ea \'e2\'e0\'f8\'e5\'e9 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec +\'fb \'ed\'e5 \'ef\'ee\'ef\'e0\'e4\'e0\'eb \'e2 \'fd\'f2\'ee \'e0\'e4\'f0\'e5\'f1\'ed\'ee\'e5 \'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'f1\'f2\'e2\'ee. +\par }\pard \widctlpar\adjustright { +\par }{\f17 \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'e5\'f1\'eb\'e8 \'e2\'e0\'ec \'ed\'f3\'e6\'ed\'ee \'ef\'ee\'f1\'f2\'e0\'e2\'e8\'f2\'fc \'f2\'ee\'f7\'ea\'f3 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5, \'f2\'ee \'ef\'ee\'e4\'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'e4\'eb\'ff + \'f0\'e5\'e6\'e8\'ec\'e0 81h \'e1\'f3\'e4\'e5\'f2 \'e2\'fb\'e3\'eb\'ff\'e4\'e5\'f2\'fc \'f2\'e0\'ea: +\par }{ +\par }{\f17 ; HL - \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'fc\'ed\'e0\'ff \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0 +\par ; DE - \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'fc\'ed\'e0\'ff \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0}{ +\par +\par }{\f17 \tab IN\tab A,(0E2h)\tab ;\'f1\'f7\'e8\'f2\'e0\'f2\'fc \'e8\'e7 \'ef\'ee\'f0\'f2\'e0 \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'ed\'ee\'e9 \'e2 +\par \tab \tab \tab \tab ;\'f2\'f0\'e5\'f2\'fc\'e5 \'ee\'ea\'ed\'ee \'ef\'e0\'ec\'ff\'f2\'e8 +\par \tab LD\tab C,A\tab \tab ;\'e7\'e0\'ef\'ee\'ec\'ed\'e8\'f2\'fc \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 C +\par \tab LD\tab A,50h\tab \tab ;\'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'e2\'e8\'e4\'e5\'ee \'ef\'e0\'ec\'ff\'f2\'e8 +\par \tab OUT\tab (0E2h),A\tab ;\'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'e2\'e8\'e4\'e5\'ee \'ef\'e0\'ec\'ff\'f2\'e8 +\par \tab LD\tab A,E\tab \tab ;\'ef\'ee\'ec\'e5\'f1\'f2\'e8\'f2\'fc \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'fc\'ed\'f3\'fe \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'f3 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0 A. +\par }{\tab OUT\tab }{\f17 (89h),A\tab \tab ;\'e2\'fb\'e4\'e0\'f2\'fc \'e2 \'ef\'ee\'f0\'f2 +\par \tab LD\tab DE,0C000h\tab ;\'e0\'e4\'f0\'e5\'f1 \'ed\'e0\'f7\'e0\'eb\'e0 \'f2\'f0\'e5\'f2\'fc\'e5\'e3\'ee \'ee\'ea\'ed\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par \tab ADD\tab HL,DE\tab \tab ;\'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'e0\'e4\'f0\'e5\'f1 \'f2\'ee\'f7\'ea\'e8 (\'e0\'e4\'f0\'e5\'f1 \'ed\'e0\'f7\'e0\'eb\'e0 \'ee\'ea\'ed\'e0 + +\par \tab \tab \tab \tab ;\'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'fc\'ed\'e0\'ff \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0) +\par \tab LD\tab A,255\tab \tab ;\'f6\'e2\'e5\'f2 \'e2\'fb\'e2\'ee\'e4\'e8\'ec\'ee\'e9 \'f2\'ee\'f7\'ea\'e8 (\'ee\'f2 0 \'e4\'ee 255) +\par \tab LD\tab (HL),A\tab \tab ;\'e2\'fb\'e2\'ee\'e4 \'f2\'ee\'f7\'ea\'e8 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed +\par \tab LD\tab A,C\tab \tab ;\'e2\'f1\'ef\'ee\'ec\'ed\'e8\'f2\'fc \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 +\par \tab OUT\tab (0E2h)\tab \tab ;\'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e8\'f2\'fc \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3 \'ef\'e0\'ec\'ff\'f2\'e8 \'e2\'ec\'e5\'f1\'f2\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2\'e8\'e4\'e5\'ee +\par \tab \tab \tab \tab ;\'ef\'e0\'ec\'ff\'f2\'e8 +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'cf\'e5\'f0\'e5\'e4 \'e2\'fb\'e2\'ee\'e4\'ee\'ec \'f2\'ee\'f7\'e5\'ea \'f1\'eb\'e5\'e4\'f3\'e5\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'fb +\'e5 \'f6\'e2\'e5\'f2\'e0 \'e2 \'ef\'e0\'eb\'e8\'f2\'f0\'e5. \'d0\'e0\'e7\'eb\'e8\'f7\'ed\'fb\'e5 \'f0\'e5\'e6\'e8\'ec\'fb \'e2\'fb\'e2\'ee\'e4\'e0 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed \'e7\'e0\'e4\'e0\'fe\'f2\'f1\'ff \'ed\'ee\'ec\'e5\'f0\'ee\'ec \'e2\'e8\'e4 +\'e5\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ee\'f2 50h \'e4\'ee 5Fh. \'cf\'ee\'e4\'f0\'ee\'e1\'ed\'e5\'e5 \'ee \'f0\'e5\'e6\'e8\'ec\'e0\'f5 \'e2\'fb\'e2\'ee\'e4\'e0 \'e2\'fb \'ec\'ee\'e6\'e5\'f2\'e5 \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'f2\'fc \'e2 \'ee\'ef\'e8 +\'f1\'e0\'ed\'e8\'e8 \'e0\'f0\'f5\'e8\'f2\'e5\'ea\'f2\'f3\'f0\'fb \'ea\'ee\'ec\'ef\'fc\'fe\'f2\'e5\'f0\'e0. +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\b\f17 50h (80) SETVMOD (\'c2\'fb\'e1\'ee\'f0 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 02h - \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 40x32x16 \'f6\'e2\'e5\'f2\'ee\'e2 +\par 03h - \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 80x32x16 \'f6\'e2\'e5\'f2\'ee\'e2 +\par 81h - \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'e9 320x256x256 \'f6\'e2\'e5\'f2\'ee\'e2}{ +\par }{\f17 82h - \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'e9 640x256x16 \'f6\'e2\'e5\'f2\'ee\'e2 +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 0/1 +\par }{C - 50h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0. \'d1\'e5\'e4\'fc\'ec\'ee\'e9 \'e1\'e8\'f2 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb +\'e5\'ed }{\v +\par }{\f17 \'e4\'eb\'ff \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'f5 \'f0\'e5\'e6\'e8\'ec\'ee\'e2 \'e8 \'f1\'e1\'f0\'ee\'f8\'e5\'ed \'e4\'eb\'ff \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'f5. \'d1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'fe\'f2 \'e4\'e2\'e0 \'f2\'e5\'ea\'f1\'f2 +\'ee\'e2\'fb\'f5 \'f0\'e5\'e6\'e8\'ec\'e0 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 \'e4\'e2\'e0 \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'f5. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 51h (81) GETVMOD (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 51h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 52h (82) LOCATE (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par }{C - 52h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'ed\'ee\'e2\'f3\'fe \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3\'f0\'f1\'ee\'f0\'e0. \'c2\'fb\'e2\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\'e1\'f3\'e4\'e5\'f2 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'e4\'e8\'f2\'fc\'f1\'ff \'e2 \'fd\'f2\'f3 \'ef\'ee\'e7\'e8\'f6\'e8\'fe. \'c2\'e5\'f0\'f5\'ed\'e8\'e9 \'eb\'e5\'e2\'fb\'e9 \'f3\'e3\'ee\'eb \'e8\'ec +\'e5\'e5\'f2 \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb (0,0). +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\lang1033 +\par }{\b\f17 53h (83) CURSOR (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 53h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3\'f0\'f1\'ee\'f0\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 54h (84) SELPAGE (\'c2\'fb\'e1\'f0\'e0\'f2\'fc \'e0\'ea\'f2\'e8\'e2\'ed\'f3\'fe \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3 \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 0/1 +\par }{C - 54h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'e0\'ea\'f2\'e8\'e2\'ed\'f3\'fe \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3, \'ea\'ee\'f2\'ee\'f0\'e0\'ff \'e1\'f3\'e4\'e5\'f2 \'e2\'fb\'e2\'ee\'e4\'e8\'f2\'fc\'f1\'ff \'ed\'e0 \'fd +\'ea\'f0\'e0\'ed. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 55h (85) SCROLL (\'cf\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'ee\'ea\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0 +\par }{B = 1 -}{\f17 \'ef\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'e2\'e2\'e5\'f0\'f5 +\par B = 2 - \'ef\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'e2\'ed\'e8\'e7 +\par A = 0 - \'ee\'f7\'e8\'f9\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3 +\par }{C - 55h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'ff\'e5\'f2 \'ee\'ea\'ed\'ee \'e0\'ea\'f2\'e8\'e2\'ed\'ee\'e9 \'e2\'e8\'e4\'e5\'ee\'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e8 \'e5\'e3\'ee \'f1\'ee\'e4\'e5\'f0\'e6 +\'e8\'ec\'ee\'e5 }{\v +\par }{\f17 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e0\'e5\'f2\'f1\'ff \'e2\'e2\'e5\'f0\'f5 \'e8\'eb\'e8 \'e2 \'ed\'e8\'e7 \'ed\'e0 \'ee\'e4\'ed\'f3 \'f1\'f2\'f0\'ee\'ea\'f3. \'c5\'f1\'eb\'e8 \'f0\'e5\'e3\'e8\'f1\'f2\'f0 A \'f0\'e0\'e2\'e5\'ed \'ed\'f3\'eb\'fe, }{\v + +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'b8\'ed\'ed\'e0\'ff \'f1\'f2\'f0\'ee\'ea\'e0 \'ee\'f7\'e8\'f9\'e0\'e5\'f2\'f1\'ff (\'e7\'e0\'ef\'ee\'eb\'ed\'ff\'e5\'f2\'f1\'ff \'ef\'f0\'ee\'e1 +\'e5\'eb\'e0\'ec\'e8). +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 56h (86) CLEAR (\'ce\'f7\'e8\'f1\'f2\'ea\'e0 \'ee\'ea\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0 +\par B - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'e7\'e0\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc +\par A - \'f1\'e8\'ec\'e2\'ee\'eb \'e7\'e0\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc +\par }{C - 56h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f7\'e8\'f9\'e0\'e5\'f2 \'ee\'ea\'ed\'ee \'fd\'ea\'f0\'e0\'ed\'e0, \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'ff \'e2\'ee \'e2\'f1\'e5 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'ee\'ea\'ed\'e0 \'f1\'e8 +\'ec\'e2\'ee\'eb \'f1 \'ea\'ee\'e4\'ee\'ec }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8\'e7 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 A \'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'ec \'e8\'e7 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 B. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 57h (87) RDCHAR (\'d1\'f7\'e8\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb \'f1 \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 +\par }{C - 57h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f1\'e8\'ec\'e2\'ee\'eb +\par B - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'f7\'e8\'f2\'fb\'e2\'e0\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb \'e8 \'e5\'e3\'ee \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'e8\'e7 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e7 +\'e0\'e4\'e0\'ed\'ed\'ee\'e9 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0\'ec\'e8 D \'e8 E. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 58h (88) WRCHAR (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 +\par A - \'f1\'e8\'ec\'e2\'ee\'eb +\par B - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 +\par }{C - 58h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e0\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb \'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5 \'e2 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e7\'e0\'e4\'e0\'ed\'ed +\'ee\'e9 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0\'ec\'e8 D }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 E. \'d3\'ef\'f0\'e0\'e2\'eb\'ff\'fe\'f9\'e8\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb \'e2\'fb\'e2\'ee\'e4\'ff\'f2\'f1\'ff \'ea\'e0\'ea \'ee\'e1\'fb\'f7\'ed\'fb\'e5 \'f1\'e8\'ec\'e2 +\'ee\'eb\'fb. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 59h (89) WINCOPY (\'c7\'e0\'ef\'ee\'ec\'ed\'e8\'f2\'fc \'ee\'ea\'ed\'ee \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0 +\par B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'e1\'f3\'f4\'e5\'f0\'e0 +\par IX - \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 +\par }{C - 59h +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ea\'ee\'ef\'e8\'f0\'f3\'e5\'f2 \'ee\'ea\'ed\'ee \'e2 \'ef\'e0\'ec\'ff\'f2\'fc \'ed\'e0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3 \'e7\'e0\'e4\'e0\'ed\'ed\'f3\'fe \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B \'e8 \'ef\'ee }{\v + +\par }{\f17 \'e0\'e4\'f0\'e5\'f1\'f3 \'e7\'e0\'e4\'e0\'ed\'ed\'ee\'ec\'f3 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 IX. \'c5\'f1\'eb\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 IX \'ec\'e5\'ed\'fc\'f8\'e5 0C000h, \'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 }{\v +\par }{\f17 \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'e4\'e8\'f2\'f1\'ff \'e2 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3 \'ef\'e0\'ec\'ff\'f2\'e8 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'ed\'f3\'fe \'ef\'ee \'fd\'f2\'ee\'ec\'f3 \'e0\'e4\'f0\'e5\'f1\'f3. \'c2 \'e1\'f3\'f4\'e5\'f0\'e5 +\'ef\'ee\'eb\'f3\'f7\'e0\'e5\'f2\'f1\'ff }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ec\'e0\'f1\'f1\'e8\'e2 \'e8\'e7 \'e8\'e4\'f3\'f9\'e8\'f5 \'ef\'ee\'e4\'f0\'ff\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'e2. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b 5}{\b\f17 Ah (90) WINREST (\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'ee\'ea\'ed\'ee \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0 +\par B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'e1\'f3\'f4\'e5\'f0\'e0 +\par IX - \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 +\par }{C - 5Ah +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'ef\'ee\'eb\'ed\'ff\'e5\'f2 \'ee\'e1\'f0\'e0\'f2\'ed\'ee\'e5 \'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ee\'ea\'ed\'e0 \'e8\'e7 \'ef\'e0\'ec\'ff\'f2\'e8 \'ed\'e0 \'f1\'f2\'f0 +\'e0\'ed\'e8\'f6\'e5 \'e7\'e0\'e4\'e0\'ed\'ed\'ee\'e9 }{\v +\par }{\f17 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B \'e8 \'f1 \'e0\'e4\'f0\'e5\'f1\'e0 \'e7\'e0\'e4\'e0\'ed\'ed\'ee\'e3\'ee \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 IX. \'c5\'f1\'eb\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 IX \'ec\'e5\'ed\'fc\'f8\'e5 }{\v +\par }{\f17 0C000h, \'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'e4\'e8\'f2\'f1\'ff \'e8\'e7 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'ed\'ee\'e9 \'ef\'ee \'fd\'f2\'ee\'ec\'f3 +}{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e0\'e4\'f0\'e5\'f1\'f3. +\par }\pard \s19\sa120\widctlpar\adjustright {\b\f17 5Bh (91) PUTCHAR (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f1\'e8\'ec\'e2\'ee\'eb +\par }{C - 5Bh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e0\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5 \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'ea\'f3\'f0\'f1\'ee\'f0\'e0. +\'cf\'ee\'f1\'eb\'e5 }{\v +\par }{\f17 \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'f2\'e5\'ea\'f3\'f9\'e0\'ff \'ef\'ee\'e7\'e8\'f6\'e8\'ff \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff. \'cf\'e5\'f7\'e0\'f2\'fc \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff +\'f1 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f3\'ef\'f0\'e0\'e2\'eb\'ff\'fe\'f9\'e8\'ec\'e8 \'ea\'ee\'e4\'e0\'ec\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 5Ch (92) PCHARS (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8 +\'e8 \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'ed\'e0\'f7\'e0\'eb\'ee \'f1\'f2\'f0\'ee\'ea\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par }{C - 5Ch +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e0\'e5\'f2 \'f1\'f2\'f0\'ee\'ea\'f3 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5 \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 + \'ea\'f3\'f0\'f1\'ee\'f0\'e0. }{\v +\par }{\f17 \'cf\'f0\'e8 \'ef\'e5\'f7\'e0\'f2\'e8 \'f2\'e5\'ea\'f3\'f9\'e0\'ff \'ef\'ee\'e7\'e8\'f6\'e8\'ff \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff. \'cf\'e5\'f7\'e0\'f2\'fc \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'f1 }{\v + +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f3\'ef\'f0\'e0\'e2\'eb\'ff\'fe\'f9\'e8\'ec\'e8 \'ea\'ee\'e4\'e0\'ec\'e8. \'d1\'f2\'f0\'ee\'ea\'e0 \'e4\'ee\'eb\'e6\'ed\'e0 \'e7\'e0\'ea\'e0\'ed\'f7\'e8\'e2\'e0\'f2\'fc\'f1\'ff +\'ea\'ee\'e4\'ee\'ec \'ed\'ee\'eb\'fc. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 5Fh (95) PRINT (\'c2\'fb\'e2\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0 \'e1\'e5\'e7 \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f1\'e8\'ec\'e2\'ee\'eb +\par }{C - 5Fh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'f1\'e8\'ec\'e2\'ee\'eb +\par CF = 1 - \'ef\'f0\'e8\'ed\'f2\'e5\'f0 \'ed\'e5 \'e3\'ee\'f2\'ee\'e2 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'f1\'fb\'eb\'e0\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0. \'c5\'f1\'eb\'e8 \'ef\'f0\'e8\'ed\'f2\'e5\'f0 \'ed\'e5 \'e3\'ee\'f2\'ee\'e2 \'ef\'f0\'e8 +\'ed\'e8\'ec\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb, }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f2\'ee \'e2\'fb\'f1\'f2\'e0\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'f4\'eb\'e0\'e3 \'ef\'e5\'f0\'e5\'ed\'ee\'f1\'e0 (CF). +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 LD\tab HL,TEXT\tab \tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 \'ec\'e0\'f1\'f1\'e8\'e2, \'ea\'ee\'f2\'ee\'f0\'fb\'e9 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {NPRINT +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 PUSH\tab BC\tab \tab ;\'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'ee \'f0\'e0\'f1\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0\'e5 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {APRINT +\par }{\f17 \tab PUSH\tab HL\tab \tab ;\'d1\'ee\'f5\'f0\'e0\'ed\'ff\'e5\'ec \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab LD\tab A,(HL)\tab \tab ;\'c1\'e5\'f0\'b8\'ec \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'e9 \'f1\'e8\'ec\'e2\'ee\'eb \'e8 \'ef\'e5\'f7\'e0\'f2\'e0\'e5\'ec +\par \tab LD\tab C,5Fh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab NC,PRNOK\tab ;\'cf\'e5\'f0\'e5\'f5\'ee\'e4 \'ed\'e0 \'ef\'e5\'f7\'e0\'f2\'fc \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'e3\'ee \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ;\'cf\'f0\'e8\'ed\'f2\'e5\'f0 \'ed\'e5 \'e3\'ee\'f2\'ee\'e2, \'ee\'e6\'e8\'e4\'e0\'e5\'ec \'ef\'ee\'ea\'e0 \'ed\'e5 \'ed\'e0\'e6\'e0\'f2\'e0 [Esc] +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,31h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'ef\'f0\'ee\'f1\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e1\'e5\'e7 \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab POP\tab HL\tab \tab ;\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'ec \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f1\'e8\'ec\'e2\'ee\'eb +\par \tab JR\tab Z,APRINT\tab ;\'ca\'eb\'e0\'e2\'e8\'f8\'e8 \'ed\'e5 \'ed\'e0\'e6\'e8\'ec\'e0\'eb\'e8\'f1\'fc +\par \tab CP\tab 1Bh\tab \tab ;\'cd\'e0\'e6\'e0\'f2\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e0 [Esc]? +\par \tab JR\tab NZ,APRINT\tab ;\'e5\'f1\'eb\'e8 \'ed\'e5\'f2, \'ef\'ee\'e2\'f2\'ee\'f0\'ff\'e5\'ec \'ef\'e5\'f7\'e0\'f2\'fc +\par \tab POP\tab BC\tab \tab ;\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'ec \'f1\'f7\'e5\'f2\'f7\'e8\'ea \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ;\'cf\'e5\'f7\'e0\'f2\'fc \'ef\'f0\'e5\'f0\'e2\'e0\'ed\'e0 (\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc \'ed\'e0\'e6\'e0\'eb [Esc]) +\par }\pard\plain \fi720\widctlpar\adjustright \fs20\lang1049\cgrid {SCF +\par RET +\par }\pard \widctlpar\adjustright {\f17 PRNOK\tab POP\tab HL\tab \tab ;\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'ec \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f1\'e8\'ec\'e2\'ee\'eb +\par \tab POP\tab BC\tab \tab ;\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'ec \'f1\'f7\'e5\'f2\'f7\'e8\'ea \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par \tab INC\tab HL\tab \tab ;\'cf\'e5\'f0\'e5\'f5\'ee\'e4\'e8\'ec \'ea \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'ec\'f3 \'f1\'e8\'ec\'e2\'ee\'eb\'f3 +\par \tab DEC\tab BC\tab \tab ;\'d3\'ec\'e5\'ed\'fc\'f8\'e0\'e5\'ec \'f1\'f7\'e5\'f2\'f7\'e8\'ea \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par \tab LD\tab A,B\tab \tab ;\'d1\'f7\'e5\'f2\'f7\'e8\'ea \'f0\'e0\'e2\'e5\'ed \'ed\'f3\'eb\'fe? +\par }{\tab OR\tab C +\par }{\f17 \tab JP\tab NZ,NPRINT\tab ;\'e5\'f1\'eb\'e8 \'ed\'e5\'f2, \'ef\'f0\'ee\'e4\'ee\'eb\'e6\'e0\'e5\'ec \'ef\'e5\'f7\'e0\'f2\'fc +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ;\'d3\'f1\'ef\'e5\'f8\'ed\'ee \'ed\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'ed\'fb \'e2\'f1\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb +\par }\pard\plain \fi720\widctlpar\adjustright \fs20\lang1049\cgrid {XOR\tab A +\par RET +\par }\pard \widctlpar\adjustright { +\par +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'c8\'ed\'f2\'e5\'f0\'f4\'e5\'e9\'f1 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'ec\'fb\'f8\'fc\'fe: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'c2\'e7\'e0\'e8\'ec\'ee\'e4\'e5\'e9\'f1\'f2\'e2\'e8\'e5 \'f1 \'e4\'f0\'e0\'e9\'e2\'e5\'f0\'ee\'ec \'ec\'fb\'f8\'e8 \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'ef +\'f0\'e8 \'ef\'ee\'ec\'ee\'f9\'e8 \'e8\'ed\'f1\'f2\'f0\'f3\'ea\'f6\'e8\'e8 RST 30h. }{\v +\par }{\f17 \'c2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ea\'ee\'ed\'ea\'f0\'e5\'f2\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8, \'e2 \'ea\'e0\'f7\'e5\'f1\'f2\'e2\'e5 \'e2\'f5\'ee\'e4\'ed\'fb\'f5 \'e8 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'f5 \'ef\'e0\'f0 +\'e0\'ec\'e5\'f2\'f0\'ee\'e2 }{\v +\par }{\f17 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'fe\'f2\'f1\'ff \'f0\'e0\'e7\'eb\'e8\'f7\'ed\'fb\'e5 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'fb, \'ef\'f0\'e8 \'fd\'f2\'ee\'ec \'ed\'ee\'ec\'e5\'f0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e7\'e0\'e4\'e0\'e5\'f2\'f1\'ff \'e2 \'f0\'e5 +\'e3\'e8\'f1\'f2\'f0\'e5 C. }{\v +\par }{\f17 \'cb\'fe\'e1\'fb\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'ec\'fb\'f8\'e8 \'e8 \'ed\'e0\'e6\'e0\'f2\'e8\'e5 \'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 \'e2\'ee\'f1\'ef\'f0\'e8\'ed\'e8\'ec\'e0\'e5\'f2 \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'e0\'ff + \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 }{\v +\par }{\f17 \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ec\'fb\'f8\'e8. \'ca\'e0\'e6\'e4\'ee\'e5 \'ed\'e0\'e6\'e0\'f2\'e8\'e5 \'e8 \'ee\'f2\'ef\'f3\'f1\'ea\'e0\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'f8 \'e8\'eb\'e8 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ec\'fb\'f8\'e8 +\'e2\'fb\'e7\'fb\'e2\'e0\'e5\'f2 }{\v +\par }{\f17 \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'e5. \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0, \'ee\'e1\'f1\'eb\'f3\'e6\'e8\'e2\'e0\'fe\'f9\'e0\'ff \'fd\'f2\'ee \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'e5, \'f7\'e8\'f2\'e0\'e5\'f2 \'ef\'e0\'ea\'e5\'f2 \'e4\'e0\'ed +\'ed\'fb\'f5 \'ee\'f2 \'ec\'fb\'f8\'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e0\'e5\'f2 \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'ed +\'fb\'f5 \'e4\'e0\'ed\'ed\'fb\'f5. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 00h (00) INITIALIZATION (\'c8\'ed\'e8\'f6\'e8\'e0\'eb\'e8\'e7\'e0\'f6\'e8\'ff \'e4\'f0\'e0\'e9\'e2\'e5\'f0\'e0 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 00h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ed\'e5 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed, \'e5\'f1\'eb\'e8 CF=1 +\par A - \'f3\'f1\'ef\'e5\'f8\'ed\'e0\'ff \'e8\'ed\'e8\'f6\'e8\'e0\'eb\'e8\'e7\'e0\'f6\'e8\'ff, \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'e4\'e8\'f2 \'ed\'e0\'f7\'e0\'eb\'fc\'ed\'f3\'fe \'e8\'ed\'e8\'f6\'e8\'e0\'eb\'e8\'e7\'e0\'f6\'e8\'fe \'e4\'f0\'e0\'e9\'e2\'e5\'f0 +\'e0 \'ec\'fb\'f8\'e8. \'cf\'f0\'e8 \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e5\'ed\'e8\'e8 \'f4\'eb\'e0\'e3\'e0 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e5\'f0\'e5\'ed\'ee\'f1\'e0 \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ed\'e5 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 01h (01) SHOW MOUSE CURSOR (\'c2\'fb\'e2\'e5\'f1\'f2\'e8 \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 01h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 }{CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e2\'ee\'e4\'e8\'f2 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'e8 \'ee\'f2\'f1\'eb\'e5\'e6\'e8\'e2\'e0\'e5\'f2 \'e2\'f1 +\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e5\'f0\'e5\'f0\'e8\'f1\'ee\'e2\'fb\'e2\'e0\'e5\'f2 \'e5\'e3\'ee. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 02h (02) HIDE MOUSE CURSOR (\'d3\'e1\'f0\'e0\'f2\'fc \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'f1 \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 02h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'f2\'e8\'f0\'e0\'e5\'f2 \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'f1 \'fd\'ea\'f0\'e0\'ed\'e0, \'ed\'ee \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ef\'f0\'ee\'e4\'ee +\'eb\'e6\'e0\'e5\'f2 \'ee\'f2\'f1\'eb\'e5\'e6\'e8\'e2\'e0\'ed\'e8\'e5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'ec\'fb\'f8\'e8 \'e8 \'ed\'e0\'e6\'e0\'f2\'e8\'e5 \'ed\'e0 \'ea\'ed\'ee\'ef\'ea\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 03h (03) READ MOUSE STATE (\'d7\'f2\'e5\'ed\'e8\'e5 \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'ff \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 03h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par A - \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'ea\'ed\'ee\'ef\'ee\'ea +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D0 - \'eb\'e5\'e2\'e0\'ff +\par D1 - \'ef\'f0\'e0\'e2\'e0\'ff +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {HL}{\f17 - x-\'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0 +\par DE - y-\'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'e8\'e5 \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'e8 \'f1\'ee\'f1\'f2\'ee\'ff +\'ed\'e8\'e5 \'e5\'e5 \'ea\'ed\'ee\'ef\'ee\'ea. }{\v +\par }{\f17 \'ca\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'fe\'f2\'f1\'ff \'e2 \'f2\'ee\'f7\'ea\'e0\'f5 \'e8 \'e4\'eb\'ff \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'f5 \'f0\'e5\'e6\'e8\'ec\'ee\'e2 \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'ee +\'e8\'f5 \'e4\'e5\'eb\'e8\'f2\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ed\'e0 \'e2\'ee\'f1\'e5\'ec\'fc \'e4\'eb\'ff \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'ff \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2 \'e2 \'e7\'ed\'e0\'ea\'ee\'ec\'e5\'f1\'f2\'e0\'f5. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b 04h (04) GOTO MO}{\b\f17 USE CURSOR (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0 \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 04h +\par }{\f17 HL - x-\'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0 +\par DE - y-\'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0 \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8. \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e0\'e5\'f2 \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'e2 \'e7\'e0\'e4\'e0 +\'ed\'ed\'fb\'e5 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b 07h (07) VER}{\b\f17 T. BOUNDS (\'c7\'e0\'e4\'e0\'ed\'e8\'e5 \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'fc\'ed\'fb\'f5 \'e3\'f0\'e0\'ed\'e8\'f6 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff +\'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 07h +\par }{\f17 HL - y-\'ec\'e8\'ed\'e8\'ec\'e0\'eb\'fc\'ed\'e0\'ff +\par DE - y-\'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'e0\'ff +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e4\'e0\'e5\'f2 \'e2\'e5\'f0\'f5\'ed\'fe\'fe \'ec\'e8\'ed\'e8\'ec\'e0\'eb\'fc\'ed\'f3\'fe \'e8 \'ed\'e8\'e6\'ed\'fe\'fe \'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'f3\'fe \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb \'e2 +\'ea\'ee\'f2\'ee\'f0\'fb\'f5 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ec\'ee\'e6\'e5\'f2 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e0\'f2\'fc\'f1\'ff \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'ef\'ee \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 08h (08) HORZ. BOUNDS (\'c7\'e0\'e4\'e0\'ed\'e8\'e5 \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'fc\'ed\'fb\'f5 \'e3\'f0\'e0\'ed\'e8\'f6 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8 +\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 08h +\par }{\f17 HL - x-\'ec\'e8\'ed\'e8\'ec\'e0\'eb\'fc\'ed\'e0\'ff +\par DE - x-\'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'e0\'ff +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e4\'e0\'e5\'f2 \'eb\'e5\'e2\'f3\'fe \'ec\'e8\'ed\'e8\'ec\'e0\'eb\'fc\'ed\'f3\'fe \'e8 \'ef\'f0\'e0\'e2\'f3\'fe \'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'f3\'fe \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb \'e2 \'ea\'ee +\'f2\'ee\'f0\'fb\'f5 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ec\'ee\'e6\'e5\'f2 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e0\'f2\'fc\'f1\'ff \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'ef\'ee \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 09h (09) LOAD CURSOR (\'c7\'e0\'e3\'f0\'f3\'e7\'ea\'e0 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 09h +\par B = 0 +\par }{\f17 IX - \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'e5 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par D - Y \'e0\'ea\'f2\'e8\'e2\'ed\'e0\'ff \'f2\'ee\'f7\'ea\'e0 +\par E - X \'e0\'ea\'f2\'e8\'e2\'ed\'e0\'ff \'f2\'ee\'f7\'ea\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e3\'f0\'f3\'e6\'e0\'e5\'f2 \'ed\'ee\'e2\'ee\'e5 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'e5 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'e2 \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'e8 + \'e7\'e0\'e4\'e0\'f2\'fc \'e0\'ea\'f2\'e8\'e2\'ed\'f3\'fe }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f2\'ee\'f7\'ea\'f3 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'ff. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\lang1033 +\par +\par }{\b\f17 0Ah (10) CURSOR TEXT MODES (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'e2 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'ee\'ec \'f0\'e5\'e6\'e8\'ec\'e5) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 0Ah +\par }{\lang1033 B = 0 +\par H - AND SIMBOL MASK +\par L - XOR SIMBOL MASK +\par D - AND ATTRIBUT MASK +\par E - XOR ATTRIBUT MASK +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb \'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'e4\'eb\'ff \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'ee\'e3\'ee \'f0\'e5\'e6 +\'e8\'ec\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b 0Bh (11) RETURN CURSOR }{\b\f17 (\'cf\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'e5 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 0Bh +\par }{\f17 IX - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par D - Y \'e0\'ea\'f2\'e8\'e2\'ed\'e0\'ff \'f2\'ee\'f7\'ea\'e0 +\par E - X \'e0\'ea\'f2\'e8\'e2\'ed\'e0\'ff \'f2\'ee\'f7\'ea\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'e5 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'e8\'e7 \'e4\'f0\'e0 +\'e9\'e2\'e5\'f0\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 0Eh (14) GET SENSETIVE (\'d7\'f2\'e5\'ed\'e8\'e5 \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 0Eh +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par H - \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'fc \'ef\'ee \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'e8 +\par L - \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'fc \'ef\'ee \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff +\'ec\'fb\'f8\'e8 \'ef\'ee \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'e8 \'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 0Fh (15) SET SENSETIVE (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0 \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 0Fh +\par }{\f17 H - \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'fc \'ef\'ee \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'e8 +\par L - \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'fc \'ef\'ee \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=}{1 +\par }{\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'ec\'fb\'f8\'e8 \'ef +\'ee \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'e8 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 80h (128) MOUSE HARDWARE INTERRUPT (\'ce\'e1\'f0\'e0\'e1\'ee\'f2\'f7\'e8\'ea \'e0\'ef\'ef\'e0\'f0\'e0\'f2\'ed\'ee\'e3\'ee \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'ff \'ee\'f2 \'ec +\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 80h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'cf\'ee \'ef\'f0\'e8\'f5\'ee\'e4\'f3 \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'ff \'ee\'f2 \'ec\'fb\'f8\'e8 \'e2\'fb\'e7\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'e4\'e0\'ed\'ed\'e0\'ff \'f4\'f3\'ed\'ea +\'f6\'e8\'ff \'e4\'f0\'e0\'e9\'e2\'e5\'f0\'e0. \'c2 \'f1\'eb\'f3\'f7\'e0\'e5 }{\v +\par }{\f17 \'ea\'ee\'e3\'e4\'e0 \'f2\'f0\'e5\'e1\'f3\'e5\'f2\'f1\'ff \'f0\'e0\'e1\'ee\'f2\'e0 \'ef\'ee\'e4\'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb \'ef\'f0\'e8 \'e7\'e0\'ef\'f0\'e5\'f9\'e5\'ed\'ed\'fb\'f5 \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'ff\'f5, \'e8\'f1\'ef +\'ee\'eb\'fc\'e7\'f3\'e9\'f2\'e5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e0\'ed\'ed\'f3\'fe \'f4\'f3\'ed\'ea\'f6\'e8\'fe, \'e4\'eb\'ff \'e8\'e7\'e1\'e5\'e6\'e0\'ed\'e8\'ff \'ef\'ee\'f2\'e5\'f0\'fc \'ef\'e0\'ea\'e5\'f2\'ee\'e2 \'e4\'e0\'ed\'ed\'fb +\'f5 \'ee\'f2 \'ec\'fb\'f8\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 81h (129) CHANGE VIDEO MODE (\'c8\'ed\'f4\'ee\'f0\'ec\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ee \'f1\'ec\'e5\'ed\'e5 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 81h +\par }{\f17 A - \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'ed\'f4\'ee\'f0\'ec\'e8\'f0\'f3\'e5\'f2 \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ec\'fb\'f8\'e8 \'ee\'e1 \'e8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e8 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 +. \'cd\'ee\'ec\'e5\'f0\'e0 \'f0\'e5\'e6\'e8\'ec\'ee\'e2 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'f3\'fe\'f2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b 83h (131) MOUSE REFRESH}{\b\f17 (\'cf\'f0\'e8\'ed\'f3\'e4\'e8\'f2\'e5\'eb\'fc\'ed\'e0\'ff \'ef\'e5\'f0\'e5\'f0\'e8\'f1\'ee\'e2\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 83h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'f0\'e8\'f1\'ee\'e2\'fb\'e2\'e0\'e5\'f2 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'e5 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'ed\'e0 +\'fd\'ea\'f0\'e0\'ed\'e5 \'ed\'e5 \'e4\'ee\'e6\'e8\'e4\'e0\'ff\'f1\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'e3\'ee \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'ff. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'ea\'ee\'e4\'fb \'ee\'f8\'e8\'e1\'ee\'ea \'ee\'f2 \'e4\'f0\'e0\'e9\'e2\'e5\'f0\'e0 \'ec\'fb\'f8\'e8: +\par }\pard\plain \fi283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 0 - \'ed\'e5\'f2 \'ee\'f8\'e8\'e1\'ee\'ea +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {1 -}{\f17 \tab \'ed\'e5\'e8\'e7\'e2\'e5\'f1\'f2\'ed\'e0\'ff \'f4\'f3\'ed\'ea\'f6\'e8\'ff +\par 2 -\tab \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'e0 +\par 3 -\tab \'ea\'f3\'f0\'f1\'ee\'f0 \'f3\'e6\'e5 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5 +\par 4 -\tab \'ea\'f3\'f0\'f1\'ee\'f0 \'ee\'f2\'f1\'f3\'f2\'f1\'f2\'e2\'f3\'e5\'f2 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5 +\par 5 -\tab \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'e5 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'f1\'eb\'e8\'f8\'ea\'ee\'ec \'e2\'e5\'eb\'e8\'ea\'ee +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\lang1033 +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\lang1033 +\par +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'cf\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5 \'c0. \'ca\'ee\'e4\'fb \'ee\'f8\'e8\'e1\'ee\'ea DOS +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 00h (00) - \'ed\'e5\'f2 \'ee\'f8\'e8\'e1\'ee\'ea +\par 01h (01) - \'ed\'e5\'e2\'e5\'f0\'ed\'fb\'e9 \'ed\'ee\'ec\'e5\'f0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{02h (02}{\f17 ) - \'ed\'e5\'ef\'f0\'e0\'e2\'e8\'eb\'fc\'ed\'fb\'e9 \'ed\'ee\'ec\'e5\'f0 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 +\par 03h (03) - \'f4\'e0\'e9\'eb \'ed\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed +\par 04h (04) - \'ed\'e5\'e2\'e5\'f0\'ed\'fb\'e9 \'ef\'f3\'f2\'fc +\par 05h (05) - \'ed\'e5\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e9 \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par 06h (06) - \'ed\'e5\'f2 \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par 07h (07) - \'f4\'e0\'e9\'eb \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2 +\par 08h (08) - \'f4\'e0\'e9\'eb \'f2\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +\par }{09h (09) - }{\f17 \'ef\'e5\'f0\'e5\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 ROOT (\'ea\'ee\'f0\'ed\'e5\'e2\'ee\'e3\'ee \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0) +\par 0Ah (10) - \'ed\'e5\'f2 \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'e3\'ee \'ec\'e5\'f1\'f2\'e0 \'ed\'e0 \'e4\'e8\'f1\'ea\'e5 +\par 0Bh (11) - \'ea\'e0\'f2\'e0\'eb\'ee\'e3 \'ed\'e5 \'ef\'f3\'f1\'f2 +\par 0Ch (12) - \'ef\'ee\'ef\'fb\'f2\'ea\'e0 \'f3\'e4\'e0\'eb\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ea\'e0\'f2\'e0\'eb\'ee\'e3 +\par 0Dh (13) - \'ed\'e5\'e8\'e7\'e2\'e5\'f1\'f2\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par 0Eh (14) - \'ed\'e5\'e2\'ee\'e7\'ec\'ee\'e6\'ed\'e0\'ff \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff +\par 0Fh (15) - \'ea\'e0\'f2\'e0\'eb\'ee\'e3 \'f3\'e6\'e5 \'e5\'f1\'f2\'fc +\par 10h (16) - \'ed\'e5\'e2\'e5\'f0\'ed\'ee\'e5 \'e8\'ec\'ff +\par 11h (17) - \'ed\'e5\'ef\'f0\'e0\'e2\'e8\'eb\'fc\'ed\'fb\'e9 EXE-\'f4\'e0\'e9\'eb +\par 12h (18) - \'ed\'e5 \'ef\'ee\'e4\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'ec\'e0\'ff \'e2\'e5\'f0\'f1\'e8\'ff EXE-\'f4\'e0\'e9\'eb\'e0 +\par 13h (19) - \'f0\'e5\'f1\'f3\'f0\'f1 \'ed\'e5 \'e4\'ee\'f1\'f2\'f3\'ef\'e5\'ed +\par 14h (20) - \'ed\'e5\'f2 \'e3\'ee\'f2\'ee\'e2\'ed\'ee\'f1\'f2\'e8 +\par 15h (21) - \'ee\'f8\'e8\'e1\'ea\'e0 \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'ff +\par 16h (22) - \'f1\'e5\'ea\'f2\'ee\'f0 \'ed\'e5 \'ed\'e0\'e9\'e4\'e5\'ed +\par 17h (23) - \'ee\'f8\'e8\'e1\'ea\'e0 CRC +\par 18h (24) - \'e7\'e0\'f9\'e8\'f2\'e0 \'e7\'e0\'ef\'e8\'f1\'e8 +\par }{19h}{\f17 (25) - \'ee\'f8\'e8\'e1\'ea\'e0 \'f7\'f2\'e5\'ed\'e8\'ff +\par 1Ah (26) - \'ee\'f8\'e8\'e1\'ea\'e0 \'e7\'e0\'ef\'e8\'f1\'e8 +\par 1Bh (27) - \'ee\'e1\'f9\'e0\'ff \'ee\'f8\'e8\'e1\'ea\'e0 +\par 1Ch (28) - \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par 1Dh (29) - \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par 1Eh (30) - \'ed\'e5\'e4\'ee\'f1\'f2\'e0\'f2\'ee\'f7\'ed\'ee \'ef\'e0\'ec\'ff\'f2\'e8 +\par 1Fh (31) - \'ed\'e5\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e9 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8 +\par 20h (32) \endash \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed}{\lang1033 +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\cs23\f23 \'cf\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5 \'c1. \'d2\'e0\'e1\'eb\'e8\'f6\'e0 \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'f5 \'ea\'ee\'e4\'ee\'e2\line + +\par }\trowd \trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb \cellx1445\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx2999\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb \cellx4553\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx6106\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb \cellx7660\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx9214\pard\plain \qc\widctlpar\intbl\adjustright \fs20\lang1049\cgrid {\lang1033 Key}{\cs23\b\lang1033 +\cell }{\lang1033 ASCII}{\cs23\b\lang1033 \cell }{\lang1033 SCAN}{\cs23\b\lang1033 \cell }{\lang1033 key}{\cs23\b\lang1033 \cell }{\lang1033 ASCII}{\cs23\b\lang1033 \cell }{\lang1033 SCAN}{\cs23\b\lang1033 \cell }\pard \widctlpar\intbl\adjustright { +\cs23\b\lang1033 \row }\trowd \trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx1445\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx2999\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx4553\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx6106\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx7660\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx9214\pard \qc\widctlpar\intbl\adjustright {\lang1033 `\cell 000h\cell 000h +\cell V\cell 056h\cell 02Dh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\lang1033 Esc\cell 01Bh\cell 001h\cell B\cell 042h\cell 02Eh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 +\row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 1\cell 031h\cell 002h\cell N\cell 04Eh\cell 02Fh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 2\cell 032h\cell 003h\cell +M\cell 04Dh\cell 030h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 3\cell 033h\cell 004h\cell ,\cell 02Ch\cell 031h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row +}\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 4\cell 034h\cell 005h\cell .\cell 02Eh\cell 032h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 5\cell 035h\cell 006h\cell / +\cell 02Fh\cell 033h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 6\cell 036h\cell 007h\cell RShift\cell ---\cell 034h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 +\row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 7\cell 037h\cell 008h\cell \\\cell 05Ch\cell 035h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 8\cell 038h\cell 009h +\cell LCtrl\cell ---\cell 036h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 9\cell 039h\cell 00Ah\cell LAlt\cell ---\cell 037h\cell }\pard \widctlpar\intbl\adjustright { +\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 0\cell 030h\cell 00Bh\cell Space\cell 020h\cell 038h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 - +\cell 02Dh\cell 00Ch\cell RAlt\cell ---\cell 039h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 =\cell 03Dh\cell 00Dh\cell RCtrl\cell ---\cell 03Ah\cell }\pard +\widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\lang1033 BackSpace}{\cs23\lang1033 \cell 008h\cell 00Eh\cell F1\cell 000h\cell 03Bh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 Tab\cell 009h\cell 00Fh\cell F2\cell 000h\cell 03Ch\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 Q\cell 051h\cell 010h\cell F3\cell +000h\cell 03Dh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 W\cell 057h\cell 011h\cell F4\cell 000h\cell 03Eh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 E\cell 045h\cell 012h\cell F5\cell 000h\cell 03Fh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 R\cell 052h\cell 013h\cell F6\cell +000h\cell 040h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 T\cell 054h\cell 014h\cell F7\cell 000h\cell 041h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 Y\cell 059h\cell 015h\cell F8\cell 000h\cell 042h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 U\cell 055h\cell 016h\cell F9\cell +000h\cell 043h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 I\cell 049h\cell 017h\cell F10\cell 000h\cell 044h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row +}\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 O\cell 04Fh\cell 018h\cell F11\cell 000h\cell 045h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 P\cell 050h\cell 019h\cell F12 +\cell 000h\cell 046h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 [\cell 05Bh\cell 01Ah\cell }{\lang1033 PrScrn}{\cs23\lang1033 \cell ---\cell 047h\cell }\pard +\widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 ]\cell 05Dh\cell 01Bh\cell }{\lang1033 ScrlLock}{\cs23\lang1033 \cell 000h\cell 048h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 +\row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 CapsLock\cell 000h\cell 01Ch\cell }{\lang1033 NumLock}{\cs23\lang1033 \cell 000h\cell 049h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright { +\cs23\lang1033 A\cell 041h\cell 01Dh\cell /\cell 02Fh\cell 04Ah\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 S\cell 053h\cell 01Eh\cell *\cell 02Ah\cell 04Bh\cell }\pard +\widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 D\cell 044h\cell 01Fh\cell -\cell 02Dh\cell 04Ch\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 F\cell 046h\cell 020h\cell +\cell 02Bh\cell 04Dh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 G\cell 047h\cell 021h\cell Enter\cell +00Dh\cell 04Eh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 H\cell 048h\cell 022h\cell Del .\cell 000h\cell 04Fh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row +}\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 J\cell 04Ah\cell 023h\cell Ins 0\cell 000h\cell 050h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 K\cell 04Bh\cell 024h\cell +End 1\cell 000h\cell 051h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 L\cell 04Ch\cell 025h\cell Down 2\cell 000h\cell 052h\cell }\pard \widctlpar\intbl\adjustright { +\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 ;\cell 03Bh\cell 026h\cell PgDn 3\cell 000h\cell 053h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\lang1033 '}{ +\cs23\lang1033 \cell 027h\cell 027h\cell Left 4\cell 000h\cell 054h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 Enter\cell 00Dh\cell 028h\cell 5\cell 000h\cell 055h\cell }\pard +\widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 LShift\cell ---\cell 029h\cell Right 6\cell 000h\cell 056h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 Z\cell 05Ah\cell 02Ah\cell Home 7\cell 000h\cell 057h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 X\cell 058h\cell 02Bh\cell Up 8 +\cell 000h\cell 058h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\trowd \trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx1445\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx2999\clvertalt +\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx4553\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx6106\clvertalt\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx7660\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx9214\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 C\cell 043h\cell 02Ch\cell PgUp 9\cell 000h\cell }{\cs23 059}{\cs23\lang1033 h}{\cs23 \cell }\pard \widctlpar\intbl\adjustright {\cs23\b \row }\pard \widctlpar\adjustright {\cs23\b +\par }{ +\par +\par +\par +\par }{\lang1033 +\par +\par +\par +\par +\par }{ +\par +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'cf\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5 \'c2. \'c1\'e0\'e9\'f2 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'e2 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'ee\'e3\'ee \'fd\'ea\'f0 +\'e0\'ed\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 +\par +\par }{\f17 \'e1\'e8\'f2 7\tab \tab - \'cf\'f0\'e8\'e7\'ed\'e0\'ea \'ec\'e5\'f0\'f6\'e0\'ed\'e8\'ff \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \'e1\'e8\'f2\'fb 6,5,4\tab - \'d6\'e2\'e5\'f2 \'f4\'ee\'ed\'e0 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 8 \'f6\'e2\'e5\'f2\'ee\'e2 (0...7) RGB +\par \'e1\'e8\'f2\'fb 3,2,1,0\tab - \'d6\'e2\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 16 \'f6\'e2\'e5\'f2\'ee\'e2 (0...15) IRGB +\par }{ +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'d6\'e2\'e5\'f2\'e0 \'e4\'eb\'ff \'f4\'ee\'ed\'e0 \'e8 \'e4\'eb\'ff \'f1\'e8\'ec\'e2\'ee\'eb\'e0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 0 0h 0000b - \'d7\'b8\'f0\'ed\'fb\'e9 +\par 1 1h 0001b - \'d1\'e8\'ed\'e8\'e9 +\par 2 2h 0010b - \'c7\'e5\'eb\'b8\'ed\'fb\'e9 +\par 3 3h 0011b - \'c3\'ee\'eb\'f3\'e1\'ee\'e9 (\'f6\'e8\'e0\'ed) +\par 4 4h 0100b - \'ca\'f0\'e0\'f1\'ed\'fb\'e9 +\par 5 5h 0101b - \'d4\'e8\'ee\'eb\'e5\'f2\'ee\'e2\'fb\'e9 +\par 6 6h 0110b - \'ca\'ee\'f0\'e8\'f7\'ed\'e5\'e2\'fb\'e9 +\par 7 7h 0111b - \'c1\'e5\'eb\'fb\'e9 +\par }{ +\par }{\i\lang1033 +\par }{\i\f17 \'d2\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff \'f1\'e8\'ec\'e2\'ee\'eb\'e0: +\par }{ +\par 8 8h }{\f17 1000b - \'d1\'e5\'f0\'fb\'e9 +\par 9 9h 1001b - \'df\'f0\'ea\'ee-\'f1\'e8\'ed\'e8\'e9 +\par 10 Ah 1010b - \'df\'f0\'ea\'ee-\'e7\'e5\'eb\'b8\'ed\'fb\'e9 +\par 11 Bh 1011b - \'df\'f0\'ea\'ee-\'e3\'ee\'eb\'f3\'e1\'ee\'e9 +\par 12 Ch 1100b - \'df\'f0\'ea\'ee-\'ea\'f0\'e0\'f1\'ed\'fb\'e9 +\par 13 Dh 1101b - \'df\'f0\'ea\'ee-\'f4\'e8\'ee\'eb\'e5\'f2\'ee\'e2\'fb\'e9 +\par 14 Eh 1110b - \'c6\'b8\'eb\'f2\'fb\'e9 +\par 15 Fh 1111b - \'df\'f0\'ea\'ee-\'e1\'e5\'eb\'fb\'e9\line }{\lang1033 +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1\lang1049\cgrid {\f23 \'d1\'e8\'f1\'f2\'e5\'ec\'ed\'fb\'e5 \'e2\'fb\'e7\'ee\'e2\'fb \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e9 \'ef\'ee\'e4\'f1\'e8\'f1\'f2\'e5\'ec\'fb (DSS) v1.55 +\par }\pard\plain \s3\sb240\sa60\keepn\widctlpar\outlinelevel2\adjustright \f1\lang1049\cgrid {\f23 \'d1\'e8\'f1\'f2\'e5\'ec\'ed\'fb\'e5 \'e2\'fb\'e7\'ee\'e2\'fb +\par }\pard\plain \s29\sb100\sa100\widctlpar\adjustright \f1\fs16\lang1049\cgrid {\f23 \~\~ \'c5\'f1\'eb\'e8 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'e2\'fb\'ef\'ee\'eb\'ed\'ff\'e5\'f2 \'ed\'e5 \'f2\'ee\'eb\'fc\'ea\'ee \'ed\'e5\'ea\'f3\'fe \'ec\'e0\'f2\'e5\'ec +\'e0\'f2\'e8\'f7\'e5\'f1\'ea\'f3\'fe \'e7\'e0\'e4\'e0\'f7\'f3 \'ed\'e0 \'e0\'f1\'f1\'e5\'ec\'e1\'eb\'e5\'f0\'e5, \'f2\'ee \'e2 \'ed\'e5\'e9 \'ef\'f0\'e8\'e4\'e5\'f2\'f1\'ff \'f1\'f2\'ee\'eb\'ea\'ed\'f3\'f2\'fc\'f1\'ff \'f1 \'f2\'e0\'ea\'e8\'ec\'e8 \'e2 +\'e5\'f9\'e0\'ec\'e8, \'ea\'e0\'ea \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'e5 \'e2\'e2\'ee\'e4\'e0 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'ff, \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'e2\'fb\'e2\'ee\'e4\'e0 \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2\'ee\'e2 +\'e8 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'e5 \'f1\'e2\'ee\'e5\'e9 \'f0\'e0\'e1\'ee\'f2\'fb. \'c4\'eb\'ff \'fd\'f2\'ee\'e3\'ee, \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'ee \'ee\'e1\'f0\'e0\'f2\'e8\'f2\'fc\'f1\'ff \'ea \'f1\'e5\'f0\'e2\'e8\'f1\'e0\'ec DSS. +\'d4\'e0\'ea\'f2\'e8\'f7\'e5\'f1\'ea\'e8, \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ed\'e0 \'ff\'e7\'fb\'ea\'e5 \'e0\'f1\'f1\'e5\'ec\'e1\'eb\'e5\'f0\'e0 \'ee\'e4\'e8\'ed\'e0\'ea\'ee\'e2\'ee \'e4\'eb\'ff \'eb\'fe\'e1\'fb\'f5 \'f1 +\'e8\'f1\'f2\'e5\'ec, \'e5\'f1\'eb\'e8 \'ed\'e5 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\'f1\'ff \'e8\'f5 \'f1\'e5\'f0\'e2\'e8\'f1\'e0\'ec\'e8.\line \~\~ \'c2\'fb\'e7\'ee\'e2 \'f4\'f3\'ed\'ea\'f6\'e8\'e9 DSS \'e2 \'f1\'e8\'f1\'f2\'e5\'ec\'e5 Estex \'e2 +\'fb\'ef\'ee\'eb\'ed\'ff\'e5\'f2\'f1\'ff \'e8\'e7 \'e0\'f1\'f1\'e5\'ec\'e1\'eb\'e5\'f0\'e0. \'cd\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'fb\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'fe\'f2\'f1\'ff \'e2 \'f0\'e0\'e7\'eb\'e8\'f7\'ed +\'fb\'f5 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0\'f5, \'f0\'e5\'e3\'e8\'f1\'f2\'f0 }{\b C}{\f23 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2\'f1\'ff \'e4\'eb\'ff \'f3\'ea\'e0\'e7\'e0\'ed\'e8\'ff \'ed\'ee\'ec\'e5\'f0\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8.\line \line \'d2 +\'e0\'ea, \'ed\'e0\'f8\'e0 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'e4\'eb\'ff Estex \'e1\'f3\'e4\'e5\'f2 \'e2\'fb\'e3\'eb\'ff\'e4\'e5\'f2\'fc \'ed\'e0\'ef\'ee\'e4\'ee\'e1\'e8\'e5: +\par }\pard\plain \s30\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\adjustright \fs20\lang1049\cgrid { +\par \tab \hich\af2\dbch\af2\loch\f2 org\tab #8100 ;}{\loch\af29\dbch\af2\hich\f29 \'e0\'e4\'f0\'e5\'f1\loch\f29 \hich\f29 \'f2\'ee\'f7\'ea\'e8\loch\f29 \hich\f29 \'e2\'f5\'ee\'e4\'e0 +\par }{ +\par \hich\af2\dbch\af2\loch\f2 LD HL,MSG ;}{\loch\af29\dbch\af2\hich\f29 \'f1\'ee\'ee\'e1\'f9\'e5\'ed\'e8\'e5\loch\f29 \hich\f29 \'e4\'eb\'ff\loch\f29 \hich\f29 \'e2\'fb\'e2\'ee\'e4\'e0 +\par }{\hich\af2\dbch\af2\loch\f2 LD \hich\af2\dbch\af2\loch\f2 C,5Ch ;}{\loch\af29\dbch\af2\hich\f29 \'ed\'ee\'ec\'e5\'f0\loch\f29 \hich\f29 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee\loch\f29 \hich\f29 \'e2\'fb\'e7\'ee\'e2\'e0\loch\f29 + (PCHARS) +\par }{\hich\af2\dbch\af2\loch\f2 RST 10h ;}{\loch\af29\dbch\af2\hich\f29 \'e2\'fb\'e7\'ee\'e2\loch\f29 \hich\f29 \'ef\'ee\'e4\'f1\'e8\'f1\'f2\'e5\'ec\'fb +\par }{ +\par \hich\af2\dbch\af2\loch\f2 LD C,41h ;}{\loch\af29\dbch\af2\hich\f29 \'ed\'ee\'ec\'e5\'f0\loch\f29 \hich\f29 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee\loch\f29 \hich\f29 \'e2\'fb\'e7\'ee\'e2\'e0\loch\f29 (EXIT) +\par }{\hich\af2\dbch\af2\loch\f2 RST 10h ;}{\loch\af29\dbch\af2\hich\f29 \'e2\'fb\'e7\'ee\'e2\loch\f29 \hich\f29 \'ef\'ee\'e4\'f1\'e8\'f1\'f2\'e5\'ec\'fb +\par }{ +\par }{\lang1033 \hich\af2\dbch\af2\loch\f2 MSG db "Hello, world!",0Dh,0Ah ;}{\loch\af29\dbch\af2\hich\f29 \'ed\'e0\'f8\'e0}{\lang1033 \hich\af2\dbch\af2\loch\f2 }{\loch\af29\dbch\af2\hich\f29 \'f1\'f2\'ee\'ea\'e0}{\lang1033 +\par \hich\af2\dbch\af2\loch\f2 }{\hich\af2\dbch\af2\loch\f2 db \hich\af2\dbch\af2\loch\f2 0 ;}{\loch\af29\dbch\af2\hich\f29 \'ea\'ee\'ed\'e5\'f6\loch\f29 \hich\f29 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \s3\sb240\sa60\keepn\widctlpar\outlinelevel2\adjustright \f1\lang1049\cgrid {\f23 \'c4\'e0\'eb\'e5\'e5 \'e8\'e4\'e5\'f2 \'f1\'ef\'e8\'f1\'ee\'ea \'ea\'e0\'f2\'e5\'e3\'ee\'f0\'e8\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e9 DSS \'e4\'eb\'ff \'f1\'e8\'f1 +\'f2\'e5\'ec\'fb Estex +\par {\*\bkmkstart tocversion}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \fi-360\li720\sb100\sa100\widctlpar\jclisttab\tx720\ls3\adjustright \fs20\lang1049\cgrid {\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\ +l "version" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8 \'f1\'e8\'f1\'f2\'e5\'ec\'fb}}}{\f1 {\*\bkmkend tocversion} +\par {\*\bkmkstart tocdisk_io}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "disk_io" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2 +\'fb \'f1 \'e4\'e8\'f1\'ea\'ee\'ec}}}{\f1 {\*\bkmkend tocdisk_io} +\par {\*\bkmkstart tocfile_io}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "file_io" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2 +\'fb \'f1 \'f4\'e0\'e9\'eb\'e0\'ec\'e8}}}{\f1 {\*\bkmkend tocfile_io} +\par {\*\bkmkstart tocdate_time}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "date_time" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee +\'f2\'fb \'f1 \'e4\'e0\'f2\'ee\'e9 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e5\'ec}}}{\f1 {\*\bkmkend tocdate_time} +\par {\*\bkmkstart tocmemory}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "memory" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8 +\'ff \'ef\'e0\'ec\'ff\'f2\'fc\'fe}}}{\f1 {\*\bkmkend tocmemory} +\par {\*\bkmkstart tockeyboard}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "keyboard" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2\'e2\'ee\'e4\'e0 \'f1 \'ea +\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb}}}{\f1 {\*\bkmkend tockeyboard} +\par {\*\bkmkstart tocexecute}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "execute" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'e8\'f1\'ef\'ee\'eb +\'ed\'e5\'ed\'e8\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec}}}{\f1 {\*\bkmkend tocexecute} +\par {\*\bkmkstart toccmdline}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "cmdline" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2 +\'fb \'f1\'ee \'f1\'f2\'f0\'ee\'ea\'e0\'ec\'e8 \'e8 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'ee\'e9}}}{\f1 {\*\bkmkend toccmdline} +\par {\*\bkmkstart tocscreen}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "screen" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'fd +\'ea\'f0\'e0\'ed\'ee\'ec}}}{\f1 {\*\bkmkend tocscreen} +\par {\*\bkmkstart tocprinter}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "printer" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'ef\'e5\'f7\'e0\'f2 +\'e8 \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0\'e5}}}{\f1 {\*\bkmkend tocprinter} +\par }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart version}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocversion" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e8\'e4\'e5\'ed\'f2\'e8 +\'f4\'e8\'ea\'e0\'f6\'e8\'e8 \'f1\'e8\'f1\'f2\'e5\'ec\'fb}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend version}\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright { +\b\f1\fs16\lang1033 00h (00) VERSION (}{\b\f23\fs16 \'c2\'e5\'f0\'f1\'e8\'ff}{\b\f1\fs16\lang1033 DSS)}{\f1\fs16\lang1033 \cell }\pard \widctlpar\intbl\adjustright {\lang1033 \row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl +\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 00h\cell \'c2\'fb\'f5\'ee\'e4\'ed +\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'ed\'ee\'ec\'e5\'f0 \'e2\'e5\'f0\'f1\'e8\'e8\line E - \'ec\'ee\'e4\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 +\trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\*\bkmkstart disk_io}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocdisk_io" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'e4\'e8\'f1\'ea\'ee\'ec}{ +\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend disk_io}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 01h (01) CHDISK (\'d1\'ec\'e5\'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea\'e0)}{\f1\fs16 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright { +\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...)\line C - 01h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8 +\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'fb\'e9 \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511 +\pard \widctlpar\intbl\adjustright {\b\f23\fs16 02h (02) CURDISK (\'cd\'ee\'ec\'e5\'f0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 +\trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 02h\cell \'c2\'fb\'f5\'ee\'e4\'ed +\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...), \'e5\'f1\'eb\'e8 CF=0\cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 03h (03) DSKINFO (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'e4\'e8\'f1\'ea\'e5)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...0FFh-\'f2\'e5\'ea\'f3\'f9\'e8\'e9)\line C - 03h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea +\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e0\'e7\'ec\'e5\'f0 \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'e0 \'e2 \'f1\'e5\'ea\'f2\'ee\'f0\'e0\'f5, \'e5\'f1\'eb\'e8 CF=0\line HL - \'ee\'e1\'f9\'e5\'e5 \'ea\'ee\'eb-\'e2\'ee \'ea\'eb\'e0\'f1 +\'f2\'e5\'f0\'ee\'e2\line DE - \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'fb\'f5 \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'ee\'e2\line BC - \'f0\'e0\'e7\'ec\'e5\'f0 \'f1\'e5\'ea\'f2\'ee\'f0\'e0 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 09h (09) BOOTDSK (\'cd\'ee\'ec\'e5\'f0 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee \'e4\'e8\'f1\'ea\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line C - 09h\line B = 0\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ed\'ee\'ec\'e5\'f0 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee \'e4 +\'e8\'f1\'ea\'e0 (0-A,1-B...), \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart file_io}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\ +l "tocfile_io" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'f4\'e0\'e9\'eb\'e0\'ec\'e8}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend file_io}\cell }\pard \widctlpar\intbl\adjustright {\row +}\pard \widctlpar\intbl\adjustright {\b\f23\fs16 0Ah (10) CREATE (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl +\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb +\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0\line C - 0Ah\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea +\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511 +\pard \widctlpar\intbl\adjustright {\b\f23\fs16 0Bh (11) CREATE NEW FILE (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'ed\'ee\'e2\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0 +\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0\line C - 0Bh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8 +\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 0Eh (14) DELETE (\'d3\'e4\'e0\'eb\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0 +\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line C - 0Eh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5 +\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 10h (16) RENAME (\'cf\'e5\'f0\'e5\'e8\'ec\'e5\'ed\'ee\'e2\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0)}{ +\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'f2\'e0\'f0\'ee\'e5 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0\line DE - \'f3\'ea\'e0\'e7\'e0\'f2 +\'e5\'eb\'fc \'ed\'e0 \'ed\'ee\'e2\'ee\'e5 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0\line C - 10h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f1\fs16 11}{\b\f23\fs16 h (17) OPEN (\'ce\'f2\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line A - \'f0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0 +\line A=0 \'f7\'f2\'e5\'ed\'e8\'e5/\'e7\'e0\'ef\'e8\'f1\'fc\line A=1 \'f7\'f2\'e5\'ed\'e8\'e5\line A=2 \'e7\'e0\'ef\'e8\'f1\'fc\line C - 11h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea +\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl +\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\b\f23\fs16 12h (18) CLOSE (\'c7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef +\'f3\'eb\'ff\'f2\'ee\'f0\line C - 12h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 13h (19) READ (\'d7\'f2\'e5\'ed\'e8\'e5 \'e8\'e7 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9 +\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\line HL - \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8\line DE - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f7\'e8\'f2\'e0\'e5\'ec\'fb\'f5 \'e1\'e0\'e9\'f2\line C - 13h\cell \'c2\'fb +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line DE - \'f0\'e5\'e0\'eb\'fc\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ed\'fb +\'f5 \'e1\'e0\'e9\'f2\line \'e5\'f1\'eb\'e8 CF=0:\line A = 0 \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'fb \'e2\'f1\'e5 \'e1\'e0\'e9\'f2\'fb\line A = 0FFh \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ee \'ec\'e5\'ed\'fc\'f8\'e5\'e5 \'f7\'e8\'f1\'eb\'ee \'e1\'e0\'e9\'f2\cell +}\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 14h (20) WRITE (\'c7\'e0\'ef\'e8\'f1\'fc \'e2 \'f4\'e0\'e9\'eb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row +}\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0 +\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\line HL - \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8\line DE - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0 +\'e5\'ec\'fb\'f5 \'e1\'e0\'e9\'f2\line C - 14h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line DE - \'f0\'e5\'e0\'eb\'fc\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7 +\'e5\'f1\'f2\'e2\'ee \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 +\trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 15h (21) MOVE_FP (\'cf\'e5\'f0\'e5\'ec +\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'e2 \'f4\'e0\'e9\'eb\'e5)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 +\trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\line HL:IX - \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'e2 \'f4\'e0\'e9\'eb\'e5\line B - \'f1\'ef\'ee\'f1\'ee\'e1 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff:\line B=0 \'ee\'f2 \'ed\'e0\'f7\'e0\'eb\'e0 \'f4\'e0\'e9\'eb\'e0 +\line B=1 \'ee\'f2 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff\line B=2 \'ee\'f2 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0\line C - 15h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line HL:IX - \'ed\'ee\'e2\'ee\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 16h (22) ATTRIB (\'cf\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'e5/\'e8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'e0 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line B - \'f0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0 +\line B = 0 \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'e0\'f2\'f0\'e8\'e1\'f3\'f2\line B = 1 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'e0\'f2\'f0\'e8\'e1\'f3\'f2\line A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0\line C - 16h\cell \'c2\'fb\'f5\'ee\'e4 +\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 17h (23) GET_D_T (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'e4\'e0\'f2\'e5 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\line C - 17h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 +\'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line D - \'e4\'e5\'ed\'fc\line E - \'ec\'e5\'f1\'ff\'f6\line IX - \'e3\'ee\'e4\line H - \'f7\'e0\'f1\line L - \'ec\'e8\'ed\'f3\'f2\'fb\line B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb\cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 18h (24) PUT_D_T (\'c8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e4\'e0\'f2\'fb \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\line D - \'e4\'e5\'ed\'fc\line E - \'ec\'e5\'f1\'ff\'f6\line +IX - \'e3\'ee\'e4\line H - \'f7\'e0\'f1\line L - \'ec\'e8\'ed\'f3\'f2\'fb\line B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb\line C - 18h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1 +\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 19h (25) F_FIRST (\'cf\'ee\'e8\'f1\'ea \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe +\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8 +\'fe\line DE - \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 44 \'e1\'e0\'e9\'f2\'e0, \'e5\'f1\'eb\'e8 B=0, \'e8\'ed\'e0\'f7\'e5 256 \'e1\'e0\'e9\'f2\line A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'fb, \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'ec\'fb\'e5 \'ef\'f0 +\'e8 \'ef\'ee\'e8\'f1\'ea\'e5\line B = 0 - \'e8\'ec\'ff \'ed\'e0\'e9\'e4\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 11 \'e1\'e0\'e9\'f2 "FilenameExt"\line B = 1 - \'e8\'ec\'ff \'ed\'e0\'e9\'e4\'e5\'ed\'ed\'ee\'e3\'ee +\'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 DOS "filename.ext",0\line C - 19h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 1Ah (26) F_NEXT (\'cf\'ee\'e8\'f1\'ea \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3 +\'ee \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line DE - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0\line C - 1Ah\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb +\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 +1Bh (27) MKDIR (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe + \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line C - 1Bh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row +}\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 1Ch (28) RMDIR (\'d3\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line C - 1Ch\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee +\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 1Dh (29) CHDIR (\'d1\'ec\'e5\'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee +\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8 +\'fe\line C - 1Dh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511 +\pard \widctlpar\intbl\adjustright {\b\f23\fs16 1Eh (30) CURDIR (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line HL - \'e1\'f3\'f4\'e5\'f0 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8 256 \'e1\'e0\'e9\'f2\line C - 1Eh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart date_time}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocdate_time" }}{\fldrslt {\cs31\b\f23\fs16\cf2 +\'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'e4\'e0\'f2\'ee\'e9 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e5\'ec}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend date_time}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard +\widctlpar\intbl\adjustright {\b\f23\fs16 21h (33) SYSTIME (\'d2\'e5\'ea\'f3\'f9\'e0\'ff \'e4\'e0\'f2\'e0 \'e8 \'e2\'f0\'e5\'ec\'ff)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl +\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 21h\cell \'c2\'fb\'f5\'ee\'e4\'ed +\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'e4\'e5\'ed\'fc\line E - \'ec\'e5\'f1\'ff\'f6\line IX - \'e3\'ee\'e4\line H - \'f7\'e0\'f1\line L - \'ec\'e8\'ed\'f3\'f2\'fb\line B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb\line C - \'e4\'e5\'ed\'fc \'ed\'e5\'e4 +\'e5\'eb\'e8\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 22h (34) SETTIME (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'e4\'e0\'f2 +\'f3 \'e8 \'e2\'f0\'e5\'ec\'ff)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'e4\'e5\'ed\'fc\line E - \'ec\'e5\'f1\'ff\'f6\line IX - \'e3\'ee\'e4\line H - \'f7\'e0\'f1\line L - \'ec\'e8\'ed\'f3\'f2\'fb +\line B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb\line C - 22h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart memory}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocmemory" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed +\'e8\'ff \'ef\'e0\'ec\'ff\'f2\'fc\'fe}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend memory}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 38h (56) SETWIN (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1 +\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\line B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...)\line H - \'e1\'e8\'f2\'fb 6 \'e8 7 \'e7\'e0\'e4\'e0\'fe\'f2 \'ed\'ee\'ec\'e5\'f0 \'ee\'ea\'ed\'e0, \'e2 \'ea\'ee\'f2\'ee\'f0\'ee\'e5 \'e1\'f3\'e4\'e5\'f2 +\'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0\line C - 38h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ed\'ee\'ec\'e5 +\'f0 \'e7\'e0\'ec\'e5\'f9\'e5\'ed\'ed\'ee\'e9 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 +\trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 +39h (57) SETWIN1 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'e2 \'ef\'e5\'f0\'e2\'ee\'e5 \'ee\'ea\'ed\'ee)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8\line B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...)\line C - 39h\cell \'c2\'fb\'f5 +\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ed\'ee\'ec\'e5\'f0 \'e7\'e0\'ec\'e5\'f9\'e5\'ed\'ed\'ee\'e9 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 3Ah (58) SETWIN2 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2 +\'e8 \'e2\'ee \'e2\'f2\'ee\'f0\'ee\'e5 \'ee\'ea\'ed\'ee)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\line B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...)\line C - 39h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\line A - \'ed\'ee\'ec\'e5\'f0 \'e7\'e0\'ec\'e5\'f9\'e5\'ed\'ed\'ee\'e9 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright { +\b\f23\fs16 3Bh (59) SETWIN3 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'e2 \'f2\'f0\'e5\'f2\'fc\'e5 \'ee\'ea\'ed\'ee)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8\line B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...)\line C - 3Bh\cell \'c2\'fb\'f5 +\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ed\'ee\'ec\'e5\'f0 \'e7\'e0\'ec\'e5\'f9\'e5\'ed\'ed\'ee\'e9 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 3Ch (60) INFOMEM (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'ef\'e0\'ec\'ff\'f2\'e8)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C }{\f1\fs16 - 3Ch\cell }{\f23\fs16 \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'ee\'e1\'f9\'e5\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'f2\'f0\'e0 +\'ed\'e8\'f6\line BC - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'fb\'f5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright { +\b\f23\fs16 3Dh (61) GETMEM (\'c2\'fb\'e4\'e5\'eb\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'f0\'e0\'e7\'ec\'e5\'f0 \'e1\'eb\'ee\'ea\'e0 \'e2 \'f1 +\'f2\'f0\'e0\'ed\'e8\'f6\'e0\'f5 \'ef\'ee 16 \'ea\'e8\'eb\'ee\'e1\'e0\'e9\'f2\line C - 3Dh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'e8\'e4\'e5 +\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 +3Eh (62) FREEMEM (\'ce\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 +\'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8\line C - 3Eh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row +}\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 3Fh (63) SETMEM (\'c8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row +}\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0 +\'f7\'e5\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8\line B - \'ed\'ee\'e2\'fb\'e9 \'f0\'e0\'e7\'ec\'e5\'f0 \'e1\'eb\'ee\'ea\'e0\line C - 3Fh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb +\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright +{\*\bkmkstart keyboard}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tockeyboard" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2\'e2\'ee\'e4\'e0 \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb}{\b\f1\fs16\cf1 \line }}}{ +\f1\fs16 {\*\bkmkend keyboard}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 30h (48) WAITKEY (\'ce\'e6\'e8\'e4\'e0\'ed\'e8\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb)}{ +\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 30h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0\line D - \'ef +\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4\line \'c5 - ASCII \'ea\'ee\'e4\line C - \'f0\'e5\'e6\'e8\'ec \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb:\line bit7 - RUS/LAT\line bit3 - Num Lock\line bit2 - Scroll Lock\line bit1 - Insert\line +bit0 - Caps Lock\line B - \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 shift'\'ee\'e2:\line bit7 - Left Shift\line bit6 - Right Shift\line bit5 - Ctrl\line bit4 - Alt\line bit3 - Left Ctrl\line bit2}{\f1\fs16 - Left Alt\line bit1 - Right Ctrl\line +bit0 - Right Alt\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 31h (49) SCANKEY (\'ce\'ef\'f0\'ee\'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e1\'e5\'e7 \'ee\'e6 +\'e8\'e4\'e0\'ed\'e8\'ff)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 31h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line ZF = 1 - \'ed\'e5\'f2 \'ea\'eb\'e0\'e2\'e8\'f8\line A - \'ea +\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0\line D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4\line \'c5 - ASCII \'ea\'ee\'e4\line C - \'f0\'e5\'e6\'e8\'ec \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb:\line bit7 - RUS/LAT\line bit3 - Num Lock\line +bit2 - Scroll Lock\line bit1 - Insert\line bit0 - Caps Lock\line B - \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 shift'\'ee\'e2:\line bit7 - Left Shift\line bit6 - Right Shift\line bit5 - Ctrl\line bit4 - Alt\line bit3 - Left Ctrl\line bit2 - Left Alt\line +bit1 - Right Ctrl\line bit0 - Right Alt\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 32h (50) ECHOKEY (\'ce\'e6\'e8\'e4\'e0\'ed\'e8\'e5 \'f1\'e8\'ec\'e2 +\'ee\'eb\'e0 \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'f1 \'ef\'e5\'f7\'e0\'f2\'fc\'fe)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 +\trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 32h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff: +\line A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0\line D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4\line \'c5 - ASCII \'ea\'ee\'e4\line C - \'f0\'e5\'e6\'e8\'ec \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb:\line bit7 - RUS/LAT\line +bit3 - Num Lock\line bit2 - Scroll Lock\line bit1 - Insert\line bit0 - Caps Lock\line B - \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 shift'\'ee\'e2:\line bit7 - Left Shift\line }{\f1\fs16 bit6 - Right Shift\line bit5 - Ctrl\line bit4 - Alt\line bit3 - Left Ctrl +\line bit2 - Left Alt\line bit1 - Right Ctrl\line bit0 - Right Alt\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 33h (51) CTRLKEY (\'cf\'ee\'eb\'f3\'f7\'e8\'f2 +\'fc \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 33h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5}{\f1\fs16\lang1033 }{\f23\fs16 \'e7 +\'ed\'e0\'f7\'e5\'ed\'e8\'ff}{\f1\fs16\lang1033 :\line A = 0 - }{\f23\fs16 \'ed\'e5\'f2}{\f1\fs16\lang1033 }{\f23\fs16 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2}{\f1\fs16\lang1033 }{\f23\fs16 \'e2}{\f1\fs16\lang1033 }{\f23\fs16 \'e1\'f3\'f4\'e5\'f0\'e5}{ +\f1\fs16\lang1033 \line C - }{\f23\fs16 \'f0\'e5\'e6\'e8\'ec}{\f1\fs16\lang1033 }{\f23\fs16 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb}{\f1\fs16\lang1033 :\line bit7 - RUS/LAT\line bit3 - Num Lock\line bit2 - Scroll Lock\line bit1 - Insert\line +bit0 - Caps Lock\line B - }{\f23\fs16 \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5}{\f1\fs16\lang1033 shift'}{\f23\fs16 \'ee\'e2}{\f1\fs16\lang1033 :\line bit7 - Left Shift\line bit6 - Right Shift\line bit5 - Ctrl\line bit4 - Alt\line bit3 - Left Ctrl\line +bit2 - Left Alt\line bit1 - Right Ctrl\line bit0 - Right Alt\cell }\pard \widctlpar\intbl\adjustright {\lang1033 \row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 35h (53) K_CLEAR (\'ce\'f7\'e8\'f1\'f2\'e8\'f2 +\'fc \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'f4\'f3\'ed\'ea\'f6\'e8\'fe)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 +\trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'ed\'ee\'ec\'e5\'f0 \'f4\'f3\'ed +\'ea\'f6\'e8\'e8 30h, 31h, 32h, 33h \'e8\'eb\'e8 34h\line C - 35h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'c2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e9 \'f4\'f3\'ed\'ea +\'f6\'e8\'e8 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B.\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 +\trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 36h (54) K_SETUP (\'d3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'e5 +\'ed\'e0\'f1\'f2\'f0\'ee\'e9\'ea\'e0\'ec\'e8 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'ed\'ee\'ec\'e5\'f0 \'ef\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'e8\line C - 36h +\line \line B = 0, \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'f3 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb\line A - \'ed\'ee\'ec\'e5\'f0 \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'e8 +\par }\pard \li720\ri720\sb100\sa100\widctlpar\intbl\adjustright {\f23\fs16 0 - normal\line 1 - shift\line 2 - caps lock\line 3 - caps lock + shift\line 4 - normal (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.)\line 5 - shift (\'e0\'eb +\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.)\line 6 - caps lock (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.)\line 7 - caps lock + shift (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.) +\par }\pard \widctlpar\intbl\adjustright {\f23\fs16 B = 1, \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'e7\'e2\'f3\'ea\'ee\'e2\'fb\'f5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'fb\'f5\line B = 2, \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'e7 +\'e2\'f3\'ea\'ee\'e2\'fb\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'fb\'e5\line A - \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'ee\'e9\line bit0 - \'f1\'e8\'e3\'ed\'e0\'eb \'ef\'e5\'f0\'e5\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'e1\'f3\'f4\'e5 +\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb\line bit1 - \'f1\'e8\'e3\'ed\'e0\'eb \'ef\'e5\'f0\'e5\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'ff \'ed\'e0 \'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'f3\'fe \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'f3 \'ea\'eb\'e0\'e2 +\'e8\'e0\'f2\'f3\'f0\'fb\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'c2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2 \'f0\'e5\'e3\'e8\'f1 +\'f2\'f0\'e5 B.\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 37h (55) TESTKEY (\'ce\'ef\'f0\'ee\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0 +\'fb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 37h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line ZF = 1 - \'ed\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e2 +\'e1\'f3\'f4\'e5\'f0\'e5\line A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0\line D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4\line \'c5 - ASCII \'ea\'ee\'e4\line C - \'f0\'e5\'e6\'e8\'ec \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb:\line +bit7 - RUS/LAT\line bit3 - Num Lock\line bit2 - Scroll Lock\line bit1 - Insert\line bit0 - Caps Lock\line B - \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 shift'\'ee\'e2:\line bit7 - Left Shift\line bit6 - Right Shift\line bit5 - Ctrl\line bit4 - Alt\line +bit3 - Left Ctrl\line bit2 - Left Alt\line bit1 - Right Ctrl\line bit0 - Right Alt\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 +\trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart execute}{\field\fldedit{\*\fldinst { +\f1\fs16 HYPERLINK "" \\l "tocexecute" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'e8\'f1\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend execute}\cell +}\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 40h (64) EXEC (\'c2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'f4\'e0\'e9\'eb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45 +\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3 +\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line B = 0 - \'e7\'e0\'e3\'f0\'f3\'e7\'e8\'f2\'fc \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3 +\line C - 40h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff, \'e5\'f1\'eb\'e8 C}{\f1\fs16 F=0 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 41h (65) EXIT (\'c7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'e5 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff\line C - 41h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, +\'e5\'f1\'eb\'e8 CF=1\line A - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 +42h (66) WAIT (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 +\trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 42h\cell \'c2\'fb\'f5\'ee\'e4\'ed +\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 +\trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart cmdline} +{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "toccmdline" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1\'ee \'f1\'f2\'f0\'ee\'ea\'e0\'ec\'e8 \'e8 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 +\'f1\'f2\'f0\'ee\'ea\'ee\'e9}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend cmdline}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 43h (67) GSWITCH (\'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec +\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1 +\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'ec\'ee\'e3\'ee \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0\line C - }{\f1\fs16 43h \cell }{\f23\fs16 \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff: +\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line CF = 0 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 \'ed +\'e5 \'e4\'ee\'f1\'f2\'e8\'e3\'ed\'f3\'f2 (\'e5\'f1\'f2\'fc \'e4\'f0\'f3\'e3\'e8\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb)\line CF = 1 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 (\'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'e5\'f0\'e5\'ed\'e5\'f1\'b8\'ed \'ef\'ee +\'f1\'eb\'e5\'e4\'ed\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e8\'eb\'e8 \'ed\'ee\'eb\'fc)\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 44h (68) DOSNAME (\'cf +\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 44h\line B = 0, \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 + 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1\line HL - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0\line DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff +\'e8\'ec\'e5\'ed\'e8 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1\line B = 1, \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0 +\'f2\line HL - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1\line DE - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff: +\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 45h (69) EXCMDLN (\'d0\'e0\'e7\'e1\'ee\'f0 \'ea +\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'ff\line +C - 45h\line B - \'ed\'ee\'ec\'e5\'f0 \'ef\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'e8: +\par }\pard \li720\ri720\sb100\sa100\widctlpar\intbl\adjustright {\f23\fs16 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3;\line 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2 +\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe;\line 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0;\line 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line 5 - \'c2\'fb\'e4\'e5 +\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line 6 - \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2 +\'e0\'ed\'e0;\line 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8;\line 8 - \'cf\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc +\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1;\line 9 - \'cf\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 +\'f4\'ee\'f0\'ec\'e0\'f2;\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc +\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0 +\'ee\'ea\'f3:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line C - 45h\line B = 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2 +\'f0\'ee\'ea\'f3 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'f0\'e0\'e7\'e1\'ee\'f0\'e0, \'e5\'f1\'eb\'e8 CF=0\line bit7 - \'c2 +\'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 *\line bit3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line bit2 - \'c2 \'f1\'f2\'f0\'ee\'ea +\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3;\line bit1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line bit0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3 +\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\line C - 45h\line B = 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0 - A, 1 - B, 2 - C \'e8 \'f2.\'e4.), \'e5\'f1\'eb\'e8 CF=0\line +\'e1\'f3\'f4\'e5\'f0 - \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 "A:",0 +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 256 \'e1\'e0\'e9\'f2) +\line C - 45h\line B = 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'f0\'e0\'e7\'e1\'ee\'f0\'e0, \'e5\'f1\'eb\'e8 CF=0\line bit7 - \'c2 +\'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 *\line bit3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line bit2 - \'c2 \'f1\'f2\'f0\'ee\'ea +\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3;\line bit1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line bit0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3 +\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0;\line \'e1\'f3\'f4\'e5\'f0 - \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'ff "DIR1\\DIR2\\DIR3\\",0 +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\line C - 45h\line B = 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'f0\'e0\'e7\'e1\'ee\'f0\'e0, \'e5\'f1\'eb\'e8 CF=0\line bit7 - \'c2 +\'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 *\line bit3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line bit2 - \'c2 \'f1\'f2\'f0\'ee\'ea +\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3;\line bit1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line bit0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3 +\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0;\line \'e1\'f3\'f4\'e5\'f0 - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 "FILE.EXT",0 +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 4 \'e1\'e0\'e9\'f2) +\line C - 45h\line B = 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'f0\'e0\'e7\'e1\'ee\'f0\'e0, \'e5\'f1\'eb\'e8 CF=0\line bit7 - \'c2 +\'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 *\line bit3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line bit2 - \'c2 \'f1\'f2\'f0\'ee\'ea +\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3;\line bit1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line bit0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3 +\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0;\line \'e1\'f3\'f4\'e5\'f0 - \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 "TXT",0 \'e8\'eb\'e8 "C ",0 +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 5 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4 +\'e0\'e9\'eb\'e0:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 8 \'e1\'e0\'e9\'f2) +\line DE+0 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'e4\'e8\'f1\'ea\'e0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2)\line DE+2 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0 +\'e8\'e8 (\'ec\'e0\'ea\'f1. 256 \'e1\'e0\'e9\'f2)\line DE+3 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2)\line DE+4 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0 +\'e0 \'e4\'eb\'ff \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 (\'ec\'e0\'ea\'f1. 4 \'e1\'e0\'e9\'f2\'e0)\line C - 45h\line B = 5 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb +\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'f0\'e0\'e7\'e1\'ee\'f0\'e0, \'e5\'f1\'eb\'e8 CF=0\line bit7 - \'c2 +\'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 *\line bit3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line bit2 - \'c2 \'f1\'f2\'f0\'ee\'ea +\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3;\line bit1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line bit0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3 +\'ea\'e0\'e7\'e0\'ed\'ee}{\f1\fs16 }{\f23\fs16 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e2\'fb\'e4\'e5\'eb\'ff +\'e5\'ec\'ee\'e3\'ee \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0\line C - 45h\line B = 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\line CF = 0 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 \'ed\'e5 \'e4\'ee\'f1\'f2\'e8\'e3\'ed\'f3\'f2 (\'e5\'f1\'f2\'fc \'e4\'f0\'f3\'e3\'e8\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb)\line CF = 1 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 (\'e2 +\'e1\'f3\'f4\'e5\'f0 \'ef\'e5\'f0\'e5\'ed\'e5\'f1\'b8\'ed \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e8\'eb\'e8 \'ed\'ee\'eb\'fc) +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 8 - \'cf\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1}{\f1\fs16 + +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 45h\line B = 8 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee +\'f0\'ec\'e0\'f2 \'c4\'ce\'d1\line HL - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0\line DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 9 - \'cf\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 45h\line B = 9 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 +\'f4\'ee\'f0\'ec\'e0\'f2\line HL - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1\line DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\*\bkmkstart screen}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocscreen" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'f0\'e0 +\'e1\'ee\'f2\'fb \'f1 \'fd\'ea\'f0\'e0\'ed\'ee\'ec}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend screen}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 50h (80) SETVMOD (\'c2\'fb\'e1\'ee\'f0 \'f0\'e5\'e6 +\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0\line \~\~\~02h - \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 40x32x16 \'f6\'e2\'e5\'f2 +\'ee\'e2\line \~\~\~03h - \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 80x32x16 \'f6\'e2\'e5\'f2\'ee\'e2\line \~\~\~81h - \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'e9 320x256x256 \'f6\'e2\'e5\'f2\'ee\'e2\line \~\~\~82h - \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8 +\'e9 640x256x16 \'f6\'e2\'e5\'f2\'ee\'e2\line B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 0/1\line C - 50h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1 +\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 51h (81) GETVMOD (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f0\'e5\'e6\'e8\'ec +\'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 51h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 + CF=1\line A - \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0, \'e5\'f1\'eb\'e8 CF=0\line B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 0/1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 52h (82) LOCATE (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3\'f0\'f1\'ee\'f0\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright { +\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0 +\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'ea\'f3\'f0\'f1\'ee\'f0\'e0\line C - 52h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 53h (83) CURSOR (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3 +\'f0\'f1\'ee\'f0\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 53h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'ea\'f3\'f0\'f1\'ee\'f0\'e0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 54h (84) SELPAGE (\'c2\'fb\'e1\'f0\'e0\'f2\'fc +\'e0\'ea\'f2\'e8\'e2\'ed\'f3\'fe \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3 \'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 +\trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 0/1\line C - 54h +\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl +\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\b\f23\fs16 55h (85) SCROLL (\'cf\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'ee\'ea\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0 \'eb\'e5\'e2\'ee\'e3\'ee \'e2 +\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0\line L - +\'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0\line B = 1 - \'ef\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'e2\'e2\'e5\'f0\'f5\line B = 2 - \'ef\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'e2\'ed\'e8\'e7\line A = 0 - \'ee\'f7\'e8\'f9\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3\line +C - 55h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 56h (86) CLEAR (\'ce\'f7 +\'e8\'f1\'f2\'ea\'e0 \'ee\'ea\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line E - +\'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0\line L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0\line B - \'e0\'f2\'f0\'e8\'e1 +\'f3\'f2 \'e7\'e0\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc\line A - \'f1\'e8\'ec\'e2\'ee\'eb \'e7\'e0\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc\line C - 56h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 57h (87) RDCHAR (\'d1\'f7\'e8\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb \'f1 \'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6\line C - 57h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f1\'e8\'ec\'e2\'ee\'eb\line +B - \'e0\'f2\'f0\'e8\'e1\'f3\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 +\clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 58h (88) WRCHAR (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb +\'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6\line A - \'f1\'e8\'ec\'e2\'ee\'eb\line B - \'e0\'f2\'f0\'e8\'e1 +\'f3\'f2\line C - 58h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 +59h (89) WINCOPY (\'c7\'e0\'ef\'ee\'ec\'ed\'e8\'f2\'fc \'ee\'ea\'ed\'ee \'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0\line E - \'f1\'f2\'ee\'eb\'e1 +\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0\line L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0\line B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'e1\'f3 +\'f4\'e5\'f0\'e0\line IX - \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0\line C - 59h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45 +\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 5Ah (90) WINREST (\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'ee\'ea\'ed\'ee \'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0\line L - \'f8\'e8\'f0\'e8 +\'ed\'e0 \'ee\'ea\'ed\'e0\line B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'e1\'f3\'f4\'e5\'f0\'e0\line IX - \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0\line C}{\f1\fs16 - 5Ah\cell }{\f23\fs16 \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff +:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 5Bh (91) PUTCHAR (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb \'e2 \'f2\'e5\'ea +\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'ea\'f3\'f0\'f1\'ee\'f0\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f1\'e8\'ec\'e2\'ee\'eb\line C - 5Bh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 +\'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 5Ch (92) PCHARS (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'f2\'f0 +\'ee\'ea\'f3 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'ea\'f3\'f0\'f1\'ee\'f0\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 +\trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb +\'fc \'ed\'e0 \'ed\'e0\'f7\'e0\'eb\'ee \'f1\'f2\'f0\'ee\'ea\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2\line C - 5Ch\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart printer}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocprinter" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'ef\'e5\'f7\'e0 +\'f2\'e8 \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0\'e5}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend printer}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 5Fh (95) PRINT (\'c2\'fb\'e2\'ee\'e4 \'f1\'e8\'ec +\'e2\'ee\'eb\'e0 \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0 \'e1\'e5\'e7 \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f1\'e8\'ec\'e2\'ee\'eb\line C - 5Fh\cell \'c2\'fb\'f5 +\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'f1\'e8\'ec\'e2\'ee\'eb\line CF = 1 - \'ef\'f0\'e8\'ed\'f2\'e5\'f0 \'ed\'e5 \'e3\'ee\'f2\'ee\'e2\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\adjustright { +\par }{\lang1033 +\par }} \ No newline at end of file diff --git a/docs/reference/README.md b/docs/reference/README.md new file mode 100644 index 0000000..8eafefe --- /dev/null +++ b/docs/reference/README.md @@ -0,0 +1,34 @@ +# Reference materials + +Положи сюда оригинальную документацию Sprinter / ESTEX. Любые форматы — PDF, TXT, MD, .h / .asm файлы — годятся. Перед написанием кода нужно сверить с этими источниками: + +## Что особенно полезно + +1. **Спецификация формата .EXE (ESTEX SprintEXE)** + - Заголовок 512 байт, поля `load`, `start`, `stack`, `offset`, `loader` + - Любые упоминания "loader-секции" и multi-page загрузки + - Что находится в зарезервированных полях `reserv1`, `reserv2`, `res[490]` + +2. **Карта портов и аппаратной паджинации** + - Точная битовая раскладка портов **0x82, 0xA2, 0xC2, 0xE2** (page select для окон 0-3) + - Возможные служебные биты: write-protect, video overlay, ROM mapping + - Номера физических страниц видеопамяти — соответствие EMM-номеров (0x50..0x5F) и hardware page numbers + +3. **ESTEX API** + - Полный список функций RST #10 (особенно файловые и memory management) + - Соглашение о возврате ошибок (CF=1?, регистр-код?) + - BIOS RST #08 функции (особенно EMM_FN0..EMM_FN7 — менеджер памяти) + +4. **Видеорежимы** + - Режимы 320×256×256, 640×256×16, текст 80×32 — как маппится экранная память, какие страницы используются + - Адрес VRAM в каждом режиме (если она вообще попадает в адресное пространство CPU) + - Регистры выбора видеостраницы и активной палитры + +5. **Прерывания** + - IM2 / IM1 / NMI семантика на Sprinter + - Источники прерываний (VBL? timer? keyboard?) + - Как ESTEX устанавливает таблицу IM2 и можно ли её переопределить + +## Имена файлов + +Можно как угодно — но если у файла есть осмысленное оригинальное имя, лучше оставить (например `estex-api.txt`, `sprinter-ports.pdf`). diff --git a/docs/reference/SPRINT2K/SPRN2K01.TXT b/docs/reference/SPRINT2K/SPRN2K01.TXT new file mode 100644 index 0000000..f93e127 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K01.TXT @@ -0,0 +1,39 @@ +*** Area: ZX.SPECTRUM Date: 30 Nov 00 21:18:28 +*** From: Ivan Mak (2:5030/529.24) +*** To : Anton Yefimchuk +*** Subj: p-p訢 + + ਢ , Anton! + + <00:04> Anton Yefimchuk wrte to Ivan Mak: + + IM>> Sprinter-II Forth-CPU :-)) + IM>> , ᫨ p, Sprinter-2000, p ⮦ + IM>> Forth-CPU 砥, , p Sprinter-Forth + IM>> Z80... + AY> 祬 pp-2000 ⫨砥 p pp? + +"Sprinter-2000 ⫨砥 㬮 ᮮp⥫쭮. +⫨砥 㬮. ⫨砥 ᮮp⥫쭮." (c)... :-)) + + ᫨ p쥧, ⫨稥 - 襬 ꥬ +( 3 p , 祬 p pp). ⫨稥 +p pp HDD. ⫨稥 p 16-pp來. +p樯쭮 ᪮p 㯠 ᥫpp ᪮p +p HDD. p ᥫpp 蠥 14Mb/sek. +p HDD - 7Mb/ᥪ p訬 p. 14, +᫨ 㤠... ᮡ 祭 64Mb +, , ⭮ 㤥 p 4. + + 饬, ᪠ Sprinter-97 ᥩ 뫮, , p㬭, + ⠪, 죨 p 設. + +(p⥫쭮 Sprinter-2000 㤥 ⮨ 90$.) + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: Spectrum - 㫨, Sprinter - ࠡ⠥. (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K02.TXT b/docs/reference/SPRINT2K/SPRN2K02.TXT new file mode 100644 index 0000000..96b7d44 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K02.TXT @@ -0,0 +1,75 @@ +*** Area: ZX.SPECTRUM Date: 18 Mar 01 11:50:05 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stanislav Udin +*** Subj: pp. + + + ਢ , Stanislav! + + <15:11> Stanislav Udin wrte to Ivan Mak: + + SU> pp p ᪠ ? + , ᫨ 㤥 , pᥭ .. ⠪, + p㦥 p㯭  .... + + SU>>> p pp ⠪, ⮡ 稢 + SU>>> p, p⠥ p? + IM>> ᮢᥬ p, y :-) + SU> y 룫拉 p pp p p. 砥 + SU> p ... + + ᥪ㭤 2-3 p㧨 system.bat pᠭ + scorpion.exe + +᫥, p, , p ᬮ , +᫨ 㤥 p ... + + IM>> H, p y. + IM>> ᫥ pᨨ 箪 (p + IM>> p쭮), y p. + SU> ⠪ y y. p, p + SU> 뫠 ᫥. + +p⨨ ⠪ , .  p + p訢 . p樯 ᫮⥩ , ⮫쪮 + p. + + IM>> 뫮 p py饩 , ⠬ + IM>> 墠⠫. , ᥬy pp Kempston-Mouse + IM>> 室 p... + SU> ⥫ y p. + + ⮭ 祭 ⮣ . 筮 p ᪠... +p, 㦥 ⮩ ᪫... + + IM>> p 3d13 p . p p pאַ + IM>> p TR-DOS. CAT, SAVE, LOAD. p + IM>> .trd py RAM-Disk, p + IM>> TR-DOS p 3d13. + SU> y H ( y H pp)? + + pp 㦥 뫨 p᪨ 3d13, H p, p + 256 , ⠪ 뢮 ᮮ⢥訩 :-) + + SU> ᫨ ᤥ RST0, p-᪥ ⠭ p-p? + +⠭. ᫨ ctrl+alt+del, ⮦ ⠭. + 祧 ᯥ- TR-DOS-: +/CLEAR x p⭮ p᪠ +/INIT p... +H Power :) + + SU> 짮⥫ pp? y + SU> ⥫ p ⮣ p? + +짮⥫ pp 25, 筥 ᥩ . + 筮 ( ), 堬 +- ⮦ pp... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K03.TXT b/docs/reference/SPRINT2K/SPRN2K03.TXT new file mode 100644 index 0000000..a2de692 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K03.TXT @@ -0,0 +1,49 @@ +*** Area: ZX.SPECTRUM Date: 18 Mar 01 11:51:19 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nikolay G.Arhipoff +*** Subj: pp. + + + ਢ , Nikolay! + + <19:00> Nikolay G.Arhipoff wrte to Ivan Mak: + +[p ⮭-] + SU>> ⥫ y p. + NA> 뫮 ७, ਭ 몠 誠 ⮯ ।. + +, 몠 pאַ p. + + NA> 㤥 _㫨஢_ ⮭? 롮 + NA> ⮭\⮭? + +㤥 㫨p ⮭, ⮭ p⠥ 㦥 ᥩ + p p, ⮫쪮 ⮭, ᨬ + p p訢 (p㦠 ᪠ ⭮ ). + + NA> ࠧ ᪮ ࠭ ᤮, ? ᢮ ? + NA> 뢠? ? - ᮧ । ⥪⮢ + NA> H⮭ ;) + + ᢮ - Sprinter-OS. ᢮ p MS-DOS. + ⥬ HDD - MS-DOS FAT16. p pp +⠢ 㤥 ⠬ . p, ᫨ FAT16. + ⠪ p p 䠩 㤠-. +᪥ p TR-DOS/MS-DOS. + p ᪮ p p 720Kb 1.44Mb. + + p pp ᠬ p⮩ - FlexNavigator - p +ᯮ WinComander- 祬 Hp (16-.p䨪 640x256). + + IM>>> y pp BC-terminal. pp᪠. + IM>>> FIDO-뫥p. + NA> ? Hﭮ 譨? +p. 몠 pאַ 騩 p ISA pꥬ. + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K04.TXT b/docs/reference/SPRINT2K/SPRN2K04.TXT new file mode 100644 index 0000000..8166fbb --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K04.TXT @@ -0,0 +1,32 @@ +*** Area: ZX.SPECTRUM Date: 18 Mar 01 11:55:28 +*** From: Ivan Mak (2:5030/529.24) +*** To : Maxim Vialkov +*** Subj: + + + ਢ , Maxim! + + <07:18> Maxim Vialkov wrte to Kirill Frolov: + + KF>> 1. ਭ. $100 ⮫쪮 쯫. www.peters.spb.ru - + + www.atlant.ru/peters petersplus.da.ru + + KF>> 2. Scorpion. >= $30 www.scorpion.... ⮦ - ⠪. + KF>> 3. Kay. >= $30 H ⥩ ਧ. 䮭 ⥡ ᪠. + MV> 祬 ⠪ ᨫ ࠧ 業? "ਭ"- ﭮ? + + ⠪. ᫨ 2 3 pp -/, , -, +-, p, pp ᯮᮡ, + pp 㦥 - , + + 業 pp ᯨ窥 襭... $95 :-) + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K05.TXT b/docs/reference/SPRINT2K/SPRN2K05.TXT new file mode 100644 index 0000000..f7e76f0 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K05.TXT @@ -0,0 +1,86 @@ +*** Area: ZX.SPECTRUM Date: 19 Mar 01 1:02:50 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stanislav Udin +*** Subj: pp. + + + ਢ , Stanislav! + + <23:48> Stanislav Udin wrte to Ivan Mak: + + IM>> , ᫨ y , pᥭ .. + IM>> ⠪, py py  .... + SU> p樯 p 筮 让. +H ⠪ p⠥ :) + + IM>> ᥪy 2-3 py system.bat pᠭ + IM>> scorpion.exe + IM>> ᫥, p, , p ᬮ , + IM>> ᫨ y p ... + SU> y -y yp? + +㬥p, ⠭p p訢 +p. pp 祭 1FFD ⠪ +p, ᪫祭 p ⠫ ( p, ᫨ + , p 祭 0 p TR-DOS p, pp + p p 室 #3dxx) p ⮫쪮 p 室 +pp + 0- . + + SU> ⠪ y砥 p ᫥y騩. -y p y몠 + SU> 室 訡y y樨 AY, p頥 p, ⠬ y p, + SU> , , , pp . 쪮 + SU> 祫, p ⥡ p pp p + SU> ᪮쪮 p 墠 y? + +㧨 墠⠥. ᥬ p 祫 + p ⥬ pp. p ⮣ 窠 , + ᥩ ᪨ . + + IM>> ⮭ 祭 ⮣ . 筮 p + IM>> ᪠y... p, y ⮩ + IM>> ᪫... + SU> ? + + . ᫨ 㬥 ᤥ p, 㤥 p :) + + SU> ⮩ ᫥y p , p-᪮ + SU> ᪮쪮, ᪮ ᢮? + +-᪮ 16- . ꥬ p⥭ 16 㬬 p蠥 +~3.4Mb. ⠫쭠 ᯮ p ﭭ. + ᪮ 㣮, .. pp +᢮ ᬮp /⪫  p ⥪饣 ᪮. +p 室 ᥬ p ᪮ p +p᪠... + + SU> H ᫨誮 :( 祬y ⠪ p? p y + SU> ᥬy 쬠 宩, 業 p. 祬y ᥣ 25 + SU> 짮⥫? p, ⥬ 짮⥫ + SU> ⠭p ⥩ py pp, 쭥襬 + SU> ⢮ ⠫ pyp 設. + SU> p 蠫 p pp. p쭮? H + SU> , pp y . yy饭. + + p 뫮 (, 筮, 筮). 뫠 + p㣨 , p . p +p㧪 p, ⥯ ... + + + SU> ᫥ p. p 죨 pp y, + SU> ⮣ y 業 p? + + ᮮ⢥饩 業, p p p +peters@atlant.ru ⨬ pᠬ p. p 㯪, + 砥, ⮬ p. + +p 㬠, ⢥ (, ⮫쪮 +p祪 p宦 .. , ᪮p ᥣ, ⮣ ). + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K06.TXT b/docs/reference/SPRINT2K/SPRN2K06.TXT new file mode 100644 index 0000000..458b02c --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K06.TXT @@ -0,0 +1,26 @@ +*** Area: ZX.SPECTRUM Date: 19 Mar 01 0:59:51 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stanislav Udin +*** Subj: pp. + + + ਢ , Stanislav! + + <23:59> Stanislav Udin wrte to Ivan Mak: + + IM>> p pp ᠬ py⮩ - FlexNavigator - + IM>> yp ᯮ WinComander-y 祬 Hpy + IM>> (16-.p䨪 640x256). + SU> ᬮp p? + + p, www.atlant.ru/peters 뫪 "pp ᯥ祭" +(᫨ 訡). H 㢥p, ⠬ ᥩ p FN, +p⮭ p-pp ⠬ 筮 . + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K07.TXT b/docs/reference/SPRINT2K/SPRN2K07.TXT new file mode 100644 index 0000000..caa4ba8 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K07.TXT @@ -0,0 +1,29 @@ +*** Area: ZX.SPECTRUM Date: 22 Mar 01 11:31:25 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stanislav Udin +*** Subj: pp. + + + ਢ , Stanislav! + + <11:33> Stanislav Udin wrte to Ivan Mak: + + SU> ! 쪮 祬y p ⮨ 19 1998 + SU> p ⮬ py yy ᠭ: Flex Navogator v1.03 (Release + SU> data 23.10.1999) p諮 y p 室 + SU> ⮩ pᨨ, p 뫮 y p 2.0. + SU> 祣 ⠪ p? + +19 1998- , ⥬ , ⠭ p, +᫨ CMOS-. CMOS ⠬ 﫠 ⥪ p. + + p 﫠, ⮬ ⮭, ᮦ, ᥩ p㣨 + , FN... pp᪨ :( + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K08.TXT b/docs/reference/SPRINT2K/SPRN2K08.TXT new file mode 100644 index 0000000..0868a21 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K08.TXT @@ -0,0 +1,104 @@ +*** Area: ZX.SPECTRUM Date: 22 Mar 01 17:42:00 +*** From: Alex Goryachev (2:5030/529.48) +*** To : All +*** Subj: Sprinter News + + + ਢ, All! + + ⢥ Sprinter, 訥 ७樨, + ஦⥫쭮 ⭮襭. + 騩 ஥ "Sprinter" (, 㦭 +᪨, ⮬ - Trade Mark :-) ⨢ ࠧ. +뢠 ᥬ ⭮ ᮭ묨 ࠬ +࠭ ணࠬ ᯥ祭 ࠭, ᥩ + Sprinter- ஭ ࠭楢. + H ᥣ譥 ⠯ ࠡ ⨬ ।⠢ ᯮᮡ +ᮢ । ࠧࠡ稪 ணࠬ ᯥ祭 8- + 16- ஢, ⠢ ஢ ⮬⮢, +- 뭮 ᢮ ணࠬ ᮯ ⮢஢. + ᪮ ࠭楩 죨 , +ﭭ 짮⥫. ⮬ ਡ ᬮ +த ᢮ Sprinter-. ઠ Sprinter +⮨ ண (뢠 㤮⢮ ᯮ짮 ਨ), +⠪ 쥧 . + ᫮ ᮧ Sprinter- , + ॡ ७ 뭪. H . + 易 ⭮襭 ⥭樠묨 ਡࠬ +( ᯠ ). 㦥 ਮ⥭ ⮢ , ⨢ +९᪠ ᯥ⨢ 騥. , 訥 +Sprinter. + ⮬ ࠡ ஥⮬ ᥩ ᪮: ࠡ⪠ +; ⨬ , 饣 ᯮ짮 ᮧ + ਪ ; த Sprinter- 譥 뭪 ⨢ PR. + 襬 ।⠢ 室: DOS, 䠩 , +⥪⮢ ᪨ ।, ᥬ, 몮 +ணࠬ஢, ⨫ (, ). + ᠥ , ᥩ Sp2000 +EP1K30QC208-3 ( ꥬ ࠧ ), ᭮ + Sprinter. 室 ࠧ " " + " ". ⮩ ᮡ⢥ , +, ࠧ㬥 䨣権, +믮 . ᫨ ⥭樠 Sp2000, +᫨ , ॠ: + +1. 16- ࠧ來 ⥪ ᮯ殮 ᭮ IDE +( 㢥 ᪮ ࠡ HDD ᪮ ࠡ ᥫ) + +2. 奬 ࠧ ᭮ , IDE, FDD +, , -, ISA. : +- ࣠ אַ IDE, FDD ⮫쪮; +- 㢥 ᪮ IDE; +- ࣠ ࠫ ࠡ IDE ; +- ࣠ ० ᯮ ᭮ ; + +3. 16- 媠 㪮 . 業 16- . + +4. ⥫ : +- 祭 72-pin SIMM 4- 64- ; +- 256Kb +- ਭ. + + ਭ樯쭮 ⫨稥 Sp2000 ⮬, ஢ +३ . ⢫ +ணࠬ ᪠ ᠬ Sprinter- १뢠饩 ଠ +稯 . ⮨ ३ 㤥 . ᤥ +Sprinter ⢨⥫쭮 㭨ᠫ ஬. + Sprinter 㦥 ࠬࠬ + LPT 16 㪮 . ⮨ 䨣樨 ⠢ +95 ஢. + 騩 Sp2000 室 ஢ ⮢ +த +짮⥫. 뫮 ॠ , + த ⥫쭮 ஢ન . + + ⮬ ⮣, 訫 Sprinter- ⮢ +। 짮⥫ Sp2000-Light. ⫨稥 Sp2000 ⮨ +⢨ ISA ᫮⮢, ண IDE ࠧꥬ ࠭祭 256Kb. + ᭨ ⮨ "" 85 ஢. ⮬ +࠭ ணࠬ ३ . +H, ᬮ ᮢ 짮⥫, +Sprinter +ᥭ । "த" Specrtum. +᫨ Sp-2000-Light +: + +FIDO: 2:5030/529.48 +e-mail: peters@atlant.ru + +ࠦ 㯭 襬 ᠩ http://www.petersplus.da.ru + +, ᫨ -ࣥ, +஬ Sprinter ᫨ " " +.⠭ 35, .31 (4 ⠦), +( ࠡ稬 , ⮫쪮 17 19 ᮢ) +⥫. (812) 327-3531 + + ᥬ! + +ᥩ 祢 ( ஥ "Sprinter") + +... , ᨫ ᬥ. ⣮﫨 , 㤠 + +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) diff --git a/docs/reference/SPRINT2K/SPRN2K09.TXT b/docs/reference/SPRINT2K/SPRN2K09.TXT new file mode 100644 index 0000000..00d1dd6 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K09.TXT @@ -0,0 +1,132 @@ +*** Area: ZX.SPECTRUM Date: 30 Mar 01 0:19:20 +*** From: Alex Goryachev (2:5030/529.48) +*** To : Alex Shevchuk +*** Subj: Sprinter News + + ਢ⢮ ⥡, Alex! + + Friday March 23 2001 Alex Shevchuk -> Alex Goryachev. + + AS> 1. ISA ᫮? 祣 㤠 ᮢ뢠? + + , 㤥 ন. 室 + ᯥ㬮 設. + + AS> 2. ࠡ ? ? + + ࠡ Hayes- ନ (X,Y,Z ⮪). . + + AS> 3. ஡ ணࠬ஢ ? + AS> "த ᯥ"? + +Sprinter, ० ࠡ, ᯥ稢騩 ᮢ⨬ +㬮, ⮬, ਬ, ন ࠡ ᪮쪨 +RAM-᪠ ᪮ ࠡ 㢥祭 +襭 ࠡ " 室". + + ⢥ ᯮ Z84C15 ⠬ 21/3,5MHz. + + ஡ ࠡ ணࠬ஢, 㬠, ⢥ +, Ivan Mak. + + AS> 4. ன⢠ /㤥 ࠡ? + + "ன⢠ "? :-) +H ᥣ譨 : MS mouse, AT , FDD 3,5" 5,25", ( +FAT 16), CD-ROM, ਭ ( ⮬ ᫥ 梥⭮), Hayes-, XTR- +GSound (१ 室 ISA2ZX), CGA , ⥫ SCART, +䮭. த ᫨. + 㤥, ᬮਬ. ன⢠ 筮 , ਬ VGA +. + + + AS> 5. ன⢠ ⠭⭮ /뢮 + AS> ᯮ짮? //. + + ᯮ , த騥  ୮ +, 祣 ᪠ , ᮦ, . H ⠥ + ᯮ짮 ⥫ ⠭ ࠧꥬ SCART. + + + AS> 6. 䨤譮 প? 㤥 ᮧ ? + + ࠭ ᮧ - 稫 짮⥫. ᠥ +প, ᠬ প. +㤥 ⮫쪮 ४ , ⮣ , +롮 (᫨ ⠪ ॡ ), ⢥ , + ᮢ । , ணࠬ⮢, +஡ Sprinter- ॠ樨 ᢮ ஥⮢, + ࠧ . + + AS> 7. ࠢ 㤥 ࠧ 孮? + AS> "譨 "? , 㤥 ࠧࠡ뢠 ⠪ + AS> ⥬⨪, ᯥ? + +뢠 ⥪, Sprinter 㭨ᠫ ஬. +ᠫ쭮, +筮, ᬠਢ ࠬ ⥩. +, 뢥 "譨 ", +Sprinter-, ᮮ⢥饥 . + +᫨ 孮 楫, 譨 - ⮫쪮 ᠬ + 祢 ࠢ. ᯥ⨢  祭 +ன ᯥ樠쭮 ਬ. 㭪樮 ࠭祭, + ⮨ ⠪ ன 㤥 ⢥ . ன⢠ +㣨 ७ 譥. Hਬ ୥-⠢ 譥 +⥫. ॡ প 襣 ᫠ ਨ, 㦭 +⠭⭠ ஬ , ᮢ襭 室 稥 +-. + + AS> 8. ? , ୠ, ࠢ筨 + AS> . ஭ ? + +㬥 , ﭭ 뢠. +室 ࠬ ᮡ⢥ ⮢, ᪨ +⢠ 㣨 ⨯䨨. + ਮ 襭 ஥ Sprinter, 97-98 , 室 +ࠡ, "" "⨢" ॣ୮ 﫨 ᯥ㬮᪨ +஭ ୠ. ஥ ந諨, + 㫨 ᭮ ⢠ ⭮ ணࠬ ᯮ, + אַ ᥣ  蠭 ⮬, Sprinter + த⮬, ⮢ ப ਬ. Sprinter ⠥ +஢ 㭤, ⮫쪮-⮫쪮 稭 쥧 蠣 ୮ +뭪. + + AS> 9.  ᯥ. 稭 ⠢ 짮 + AS> ਭ..., , ࣮ ઠ =)... Sprinter-? + +砫 ࠧ, 祬 ⥡ 㦥 , ⮬ ࠢ +ॡ ﬨ ⭮ , ⥬ ⮫쪮 +㦥 - 㣮. +H ॡ⥩ ⭮ 祫, 㤭 室 +⮩ 㯪. + ᮦ, ६ ᮧ Sprinter- ⭠ 뫠 +ॣ୮ 뢠, 讬 . , ந諨 + 砫 ⮣ ஥ Sprinter, ਧ ࠧ ஡ +࣠樨 ࠡ. + + AS> 10. ணࠬ஢, ⥬ + AS> , etc.? + +ணࠬ஢ Sprinter ᨫ 祫 ᠢ襬 ணࠬ +㬠. + Sprinter- ᯥ㬮᪨ ᥬ, PC +ᥬ. + ᮦ, 祭 ᯥ⨢ 室 ࡮ᥬ TASM, +ᯮ騩 Sprinter-, ⠥ 祭 +稭. + 訥 室 CP/M-80 Sprinter, ࠧ +ᯮ짮 몮 ணࠬ஢ ᥬ஢ ࠡ ⮩ +樮. ࠧ㬥 প DOS Sprinter- ( ࠡ + ஬), ⠪ ࠡᯮᮡ 㦥 ணࠬ CP/M-80 +( 樨). +- ᠥ ଠ樨 ணࠬ஢, 室 ଠ + ᫠. + +! + +ᥩ 祢 + +... , 㦠᭮ ⥫ . 嫮. +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) diff --git a/docs/reference/SPRINT2K/SPRN2K10.TXT b/docs/reference/SPRINT2K/SPRN2K10.TXT new file mode 100644 index 0000000..68ad3b0 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K10.TXT @@ -0,0 +1,77 @@ +*** Area: ZX.SPECTRUM Date: 31 Mar 01 4:49:56 +*** From: Ivan Mak (2:5030/529.24) +*** To : Eugene Ostroukhov +*** Subj: Sprinter News + + + ਢ , Eugene! + + <11:08> Eugene Ostroukhov wrte to Alex Goryachev: + + >> ⢥ ᯮ Z84C15 ⠬ 21/3,5MHz. + >> ஡ ࠡ ணࠬ஢, 㬠, ⢥ + >> , Ivan Mak. + EO> ஡, ? 8 .. Z80? + +믨᪠ p ... , -: + +Z84C15: +- Z84C00 Z80 CPU with Z84C30 STC, Z84C4X SIO, + CGC, Watch Dog Timer (WDT), and Z84C20 PIO. +- High speed 6, 10, 16 MHz +- Low Power + 41mA typ. - RUN mode + 6mA typ. - Idle1 mode + 60mkA typ. - Idle2 mode + 0.5mkA typ. - Stop mode +- Single 5V +/-10% +- TTL/CMOS compatible +- Features: + - Z80 CPU + - On-Chip 2 chanel SIO (Z80 SIO) + - On-Chip 4 chanel Counter Timer Controller (Z80 CTC) + - Build-in Clock Generator Controller (CGC) + - Build-in Watch Dog Timer (WDT) + - Noise filter to CLK/TRG inputs of CTC + - On-Chip 2 8bit ports (Z80 PIO) + - 100pin QFP package +- Enchancements + - Power-On reset + - Addition of 2 Chip Select pins + - 32bit CRC for chanel A SIO + - Wait state generator + - Simplified EV mode selection + - Shmitt trigger inputs for clocks of SIO + - Cristal divide-by-one mode + +p쭮, ⠭p Z80 ᪮쪨 p⠬ ⠮ +p⠫. p⮢ ᯮ짮 祭 , p, +pp pp뢠 ISA. + +p ppp 祬 ⫨砥 Z80. ⥫ p⢠ +㯭 IN OUT. + + pp pp p 16 ( ᯮp) 21MHz. + + EO> ୥-⠢ : + EO> - 襭 800600x16 梥 () + EO> - ந뢠 MPEG/QuickTime/mp3 + EO> - ந⥫쭮 ShockWave/Java. + + EO> ࠢ? + +800x600 TV , 800x256 (280?) + ⮫쪮 p. + +p p樯쭮 . +饩 墠, ⠭ +p㯭 p p-p⠢. ⮣ p ᫥... +Java ⮦ pᮬ... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K11.TXT b/docs/reference/SPRINT2K/SPRN2K11.TXT new file mode 100644 index 0000000..bff353f --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K11.TXT @@ -0,0 +1,32 @@ +*** Area: ZX.SPECTRUM Date: 31 Mar 01 5:15:30 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nikolay G.Arhipoff +*** Subj: pp. + + + ਢ , Nikolay! + + <13:03> Nikolay G.Arhipoff wrte to Ivan Mak: + + NA> H ⮫쪮... 稭 ᪮쪮 -  䨭ᠬ, ਧ ନ, + NA> . - ࠧ஬ - ୠ, + NA> ਥ 室 + NA> ⭮ - , .. + + 祫, p 㢮 p p訫 ᮫. + p _p_, ⮬ 㦥 ᠫ. pp + ⭮襭 祬 ᢨ ᨭ... __! + +p p室 ⮫쪮 -p , p +. p 蠬 p쥧 p 뫮, +p쥧 ⮫쪮 p⠫, ᠬ ᥡ 㤮 뫨... + + ⮬, p SE ᪠ p⠬, p 祣... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K12.TXT b/docs/reference/SPRINT2K/SPRN2K12.TXT new file mode 100644 index 0000000..3ca9dfc --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K12.TXT @@ -0,0 +1,29 @@ +*** Area: ZX.SPECTRUM Date: 31 Mar 01 8:38:51 +*** From: Ivan Mak (2:5030/529.24) +*** To : Kirill Frolov +*** Subj: Sprinter News + + + ਢ , Kirill! + + <00:55> Kirill Frolov wrte to Alex Goryachev: + + AG>> "ன⢠ "? :-) + AG>> H ᥣ譨 : MS mouse, AT , FDD 3,5" 5,25", + + KF> ᫥⥫ ( ) ? + + p . , p p. + + KF> த .... Ka  ᮥ? + + pp p 祬 p? +(㭠p :)) + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K13.TXT b/docs/reference/SPRINT2K/SPRN2K13.TXT new file mode 100644 index 0000000..44b6799 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K13.TXT @@ -0,0 +1,47 @@ +*** Area: ZX.SPECTRUM Date: 4 Apr 01 3:23:34 +*** From: Denis Parinov (2:5030/529.48) +*** To : Alex Shevchuk +*** Subj: Sprinter News + + ਢ⢮ ⥡, Alex! + + Saturday March 31 2001 Alex Shevchuk -> Alex Goryachev. + + AG>> Sprinter, ० ࠡ, ᯥ稢騩 + AG>> ᮢ⨬ 㬮, + AS> -⠪, ०? + +:) ᯥ稢騥 ᮢ⨬ 㬮. +⠬ ᥣ, ஡ 㬥樨. + + AS> , 筮 ᥣ ਭ ᯮ 64⭠ + AS> . + +Z80, 㤠 Alter', +64K c 4 16K. + + AS>>> 4. ன⢠ /㤥 ࠡ? + AS> ⨪? + +ZX or PC? + + AG>> ࠬ ⥩. , + AG>> 뢥 "譨 ", + AG>> Sprinter-, ᮮ⢥饥 . + AS> H , 㬠, 㤥 ᨫ쭮 ᫮⥩... + +:) " ", ⠪ 뢠 +室 类 砥 ᨨ. ⠫ Sprinter' + ࠧࠡ⪨ . H 㤠筮. + + AS> - 祭 . 㤥 ᯮ짮? + AS> 㤥 ᪮쪮? 㦭 ᯮ짮 CP/M? + +OS ᢮. ᤥ ᪮ ⥬ + - ࠡ + ࠭, , ன, . __ 宦 MSDOS. + + 㢠, Denis. + +... , 㦠᭮ ⥫ . 嫮. +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) diff --git a/docs/reference/SPRINT2K/SPRN2K14.TXT b/docs/reference/SPRINT2K/SPRN2K14.TXT new file mode 100644 index 0000000..9782147 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K14.TXT @@ -0,0 +1,57 @@ +*** Area: ZX.SPECTRUM Date: 4 Apr 01 3:27:44 +*** From: Denis Parinov (2:5030/529.48) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + ਢ⢮ ⥡, Sergey! + + Saturday March 31 2001 Sergey Krinitsin -> Alex Goryachev. + + AG>> ᠥ , ᥩ + SK> ᪮쪮 㤥 ᮢ⨬ ன? 㤥 + SK> ࠡ ? ᫨ , ࠭, + SK> १ ୥ "ࠫ쭮 ", ⠪ + SK> ࠧ 짮⥫, 㯨 "" ? + +H Sprinter' ࠧࠡ뢠 樮 ⥬, ᢮ +। 頥 BIOS. ᭮ 㤥 ࠡ ⠬ ⠬. + 类 砥 ⮫ ⮨ Sprinter-97 ஬ +⫠. H ண - 㤥 ᮢ⨬. +Sp2000 멤 । 2001 .. १ 4 ᫥ Sprinter-97. + + SK> , ⮩ ⮩ ⭮ ஫. + SK> ⠬, 業 HHH 襩 ⠢ 300$ + SK> (/䫮///// ). , + SK> 祫 騩 죨 10$ 㯠 , + + 業: + Sprinter(4Mb/FDD144/Minitower/Keyboard/mouse) - $135 + HDD 40Mb - 20Gb $5-$100 + CGA monitor $8-$10 + +⮣ $150 $245 75Gb CDROM 50x. +⮣ $300 ﭥ ⮫쪮 ⠪ +᪮ ࠭⢥ 㤥 ࠭ + ⮫쪮, ᪮쪮 室. ;) +ਬ ⥬ Sprinter' ᥩ 16Kb, ⮬㦥 +ᮧ ᯮ짮 . + + AG>> H, ᬮ ᮢ + AG>> 짮⥫, Sprinter + AG>> ᥭ । "த" Specrtum. + + SK> 㦥 - ࠤ 祣 㯠 + SK> ? 頭 ᪮, - ⭮ + SK> ⨧ 㤥 থ 㣮묨 ணࠬ⠬?  + SK> ᯥ᪨ , ᥡ "த" ᯥ ? + SK> " த" ⨬ ⮬ + SK> ࠢ 300$ ॡ ;) + + ⠢塞 㯠 Sprinter ᥣ ᪠뢠 + ﭨ ஥ H. + + 㢠, Denis. + +... ⢥ ⮩ 娡 ⮫쪮 ᠭ 祫. +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) diff --git a/docs/reference/SPRINT2K/SPRN2K15.TXT b/docs/reference/SPRINT2K/SPRN2K15.TXT new file mode 100644 index 0000000..2eb4220 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K15.TXT @@ -0,0 +1,32 @@ +*** Area: ZX.SPECTRUM Date: 4 Apr 01 6:38:24 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nikolay G.Arhipoff +*** Subj: Sprinter News + + + ਢ , Nikolay! + + <10:00> Nikolay G.Arhipoff wrte to Ivan Mak: + + IM>> p ppp 祬 ⫨砥 Z80. ⥫ + IM>> p⢠ 㯭 IN OUT. + NA> .. ⫨稩? 䨪 ? ⨬ ? + + ⫨稩 . _ _ Z80, p p⠫ +p饭 ⥫ p⢠. p, ⮬ ᫥ +㬥p pp, p묨 ᤢ .. + + IM>> 800x600 TV , 800x256 (280?) + IM>> ⮫쪮 p. + NA> 墠 ਥ஢? H SVGA , , , + NA> 砩, ... 8) + + SVGA 㤥 p㣠 , p... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K16.TXT b/docs/reference/SPRINT2K/SPRN2K16.TXT new file mode 100644 index 0000000..8c6e39c --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K16.TXT @@ -0,0 +1,34 @@ +*** Area: ZX.SPECTRUM Date: 4 Apr 01 6:41:06 +*** From: Ivan Mak (2:5030/529.24) +*** To : Eugene Ostroukhov +*** Subj: Sprinter News + + + ਢ , Eugene! + + <11:19> Eugene Ostroukhov wrte to Ivan Mak: + + >> p ppp 祬 ⫨砥 Z80. ⥫ + >> p⢠ 㯭 IN OUT. pp pp + >> p 16 ( ᯮp) 21MHz. + EO> ࠭ ⠡쭮? + + ⪮ pᮢ ⨬ 﫮. ᠬ 砫 +p ᫥ . 21MHz 䨪 +Z84C15 10MHz. + 16- . ⠢ ⢨ ⠪. +16- p Z84C14 ᨬ쭠. + + >> 800x600 TV , 800x256 (280?) + >> ⮫쪮 p. + EO> 800x600 - ⠭⭮ ࠧ襭 ⥫ . + + p p묨 p孨/ p 90% TV... ... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K17.TXT b/docs/reference/SPRINT2K/SPRN2K17.TXT new file mode 100644 index 0000000..bec1a1f --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K17.TXT @@ -0,0 +1,35 @@ +*** Area: ZX.SPECTRUM Date: 4 Apr 01 6:55:28 +*** From: Ivan Mak (2:5030/529.24) +*** To : Doba Nova +*** Subj: pp. + + + ਢ , Doba! + + <15:54> Doba Nova wrte to Ivan Mak: + + DN> : ਭ MSX-2 ணࠬ஢? + DN> ﭥ? + +p樯 p . ⮣ 㦥 祫, +p MSX pp. H ⮬ ᫥, ppp, +, , p, p. + + DN> ⮫쪮 稯 砭... H ᫨ 뫠 প + DN> MSX-2 ZX Spectrum - 㯨 , - ! + DN> ᥬ MSX-⠫죨⠬ ᮢ⮢. + +p ⮬ 稯 㦭. . + + p樯쭮 p   p +Z80. p祭 ⮫쪮 ᫮ . 祭 ᨫ쭮 p祭 + , ⮬ 砥 㢥祭 ꥬ + ᯥ.p権. + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K18.TXT b/docs/reference/SPRINT2K/SPRN2K18.TXT new file mode 100644 index 0000000..1ed820b --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K18.TXT @@ -0,0 +1,30 @@ +*** Area: ZX.SPECTRUM Date: 4 Apr 01 7:13:17 +*** From: Ivan Mak (2:5030/529.24) +*** To : Kirill Frolov +*** Subj: pp. + + + ਢ , Kirill! + + <03:38> Kirill Frolov wrte to Ivan Mak: + + AV>> H 饬 㡥 - Sprinter 㫥. + KF> ᭮, ᢮ ࠭塞 室 ⥪ + KF> - 奬 ਭ, ਬ ᯥ㬮᪮? + +室 ᢮ ppp. +᫨ p p⭮ , ⮬ p. + + KF> 室 ⥪ - ணࠬ ਭ? + +筮... +H , ᢮ 室 ( ⮬ ᫥) ⤠ , +p. + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K19.TXT b/docs/reference/SPRINT2K/SPRN2K19.TXT new file mode 100644 index 0000000..96765c2 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K19.TXT @@ -0,0 +1,155 @@ +*** Area: ZX.SPECTRUM Date: 6 Apr 01 15:54:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + ਢ, Sergey! + +AG>> ISA2ZX), CGA , ⥫ SCART, 䮭. + +> CGA 祬? ᪠? H ᪠. 㯠 +>ࠧ 饭 20 ? + + 砩 pᬮp p ᯮ짮 ⥫p. + +> ᪠ ଠ. 㤥 ন ணࠬ⮢? +>㤥 +>? 㯠 ணࠬ +>쭥襩 ॠ樨? H ।⠢ +>(業, +> ) ࠡ? . + + p. +Sprinter (p ᡮp) p p⠢, ⥯p 裡 +⨢樥 p p⮬ p +p⨪. + +᫮ p⠢ p pp⠬ ⠪: +1. H稥 祭 p⮢ pᨮ쭮 p - +p p. +2. pp⥫쭮 祭 ⥩ Sprinter- 㬥樨 +ppp. +3. H稥 p pᯥ⨢ pp p. +4. H稥 p p, 㪠 ⠯ p 믮. + + pp⮬ 砥 p. + 砭 p p p頥 p, +. + p 室 p᪮ 業 pp p, +ᮧ pp 㯫 ᥬ p, p +ppp. + +p, 奬 㦥 p pp. pp ᠬ +蠥. + +> ⫥, ଠ ⨢ । +>।⢠ ( ᮢᥬ 訥), ⠥ 묨 ᯮᮡ ᡠ +> +> 襬 , ⮪ +>堫 , ⮡ 㢥 த. H 設 +> , ⠪ 業, ᮢ. +> ⮣, ᪮쪮 㤠 ਢ ᢮ +> ⮫쪮 25 짮⥫. + +H p p饭 p⠢ p᪨ 楫 +襩 p. +H p 易 ⥬, Sprinter 㤥 ⠪ , p + ᮮ⭮襭 業/⢮ ᫥. 祭 ⮣ + ᠫ p. H 筮 ⢥ +⢥, p 砫 p᪨ p. + 㯪 Sprinter- (p ⢥),  + 設⢥ ᢮ ᫥ 㯪, 室 +⮨ p, p 頭. +᫨ - 楫 襣 饭 ⮩ p樨, , + ⮨ ᪥ 㯠⥫, +p Sprinter-, p, , +⢮ p, p㣮. p ᮧ ᫮ +룮 p㤭⢠. + +AG>> ᫨ 孮 楫, 譨 - +AG>> ⮫쪮 ᠬ 祢 ࠢ. +AG>> ᯥ⨢  祭 ன +AG>> ᯥ樠쭮 ਬ. 㭪樮 +AG>> ࠭祭, ⮨ ⠪ ன 㤥 +AG>> ⢥ . + +> 㦥 १⮢ 祭 㯥᪨ 10$. + + ᪨, p ⮨. Light 㯠⥫ + p ISA p⢠, p 㦭 +(᫨ 㦭). +孮 p⢠ 祭 祬 ⫨砥, +⮫쪮 ⠭ p . Sp2000-Light p㥬 +⠢ ⮫쪮 . + +AG>> ன⢠ 㣨 ७ +AG>> 譥. + +> ᮢ⨬ ⮫쪮 ஢ ? :) + + p, ᮢ⨬? +ᮢ⨬ "" "宫쭨"? p p ⮢᪨ +pp... :) + p, p㣨 p⢠. + +AG>> Hਬ ୥-⠢ 譥 +AG>> ⥫. ॡ প 襣 ᫠ +AG>> ਨ, 㦭 ⠭⭠ ஬ +AG>> , ᮢ襭 室 稥 -. + +> 㤥 " ⠭⭠" ⮨ 襢 ᠬ +>'譮 ? + +p-p⠢ 㦭 p p筮 (⥬ +). ⥪⮢ p樨 (pp URL) ⢫ +⨪ p (p ppp) p p㠫 +p p. + +AG>> 砫 ࠧ, 祬 ⥡ 㦥 , ⮬ +AG>> ࠢ ॡ ﬨ ⭮ +AG>> , ⥬ ⮫쪮 㦥 +AG>> - 㣮. + +> ᥣ譨 Sprinter ஬  ᯥ㬮᪮ +>? + +H , Sprinter p ᯥ᪨ ⮬! p p +ᯥp㬮᪨ pp, 㤮⢮ p 㯠 , + ᪮쪮 ᯥp-ᮢ⨬ p ... ⮫쪮 + p p Sprinter-. H pp Ivan Mak p p +騬 p樥 MSX . pᯥ⨢ ᮧ +p ⮣ p. + pp ᠭ p⢥ ᠬ Sprinter-. + , ᮧ . + p ⠭p⭮ ᮢp pp. Hpp, +p 묨 ⠬, ⮢, p +p娢. + +>p 짮⥫ 㦥 p﫨 ⮢ +>㤮⢮p ᪠ ⠪ pᠬ p頩 +>p⥫ , + +設⢮ ⮣ p, p ⮫쪮 p. +祫 㤥 ⢮ p, ⥬ p pp +Sprinter-. + +AG>> ᮦ, ६ ᮧ Sprinter- ⭠ +AG>> 뫠 ॣ୮ 뢠, 讬 +AG>> . + +>࠭, ⮣ 祬 ஥ 뫮 稭? + + p 楫 p p⮬, p樨 ⮩ p. + ﭢp ⮣ p諨 , p p襭 p +裡 짮⥫ﬨ, ⮬ ᫥. H 饭 ⮩ p樨 + ᨫ. + + + ! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) diff --git a/docs/reference/SPRINT2K/SPRN2K20.TXT b/docs/reference/SPRINT2K/SPRN2K20.TXT new file mode 100644 index 0000000..8e2ebc8 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K20.TXT @@ -0,0 +1,55 @@ +*** Area: ZX.SPECTRUM Date: 6 Apr 01 3:40:49 +*** From: Slavka Kalinin (2:5030/885.50) +*** To : Dmitry Ishankulov +*** Subj: ਭ .. + + + +- 04-04-01 16:16:19 +Dmitry Ishankulov 砫 All, + ਭ .. ... + + + + DI> , All! + + DI> ⥬ ﭭ 室 p pp ⮬ . + DI> p p, -⠪ ᪠ ⮬ +: + DI> , pp ⠪ p訩, , + 祫 + DI> p ᢮ Pentium Mac pp. + DI> 짮⥫ 㤥 pᬠp ᠡ +᢮ + DI> 祣 - p ⠫죨, 設⢮ 稭 +p㬠. + DI> ⮨ Pentium II 420 , pᮢ,, +p,ᬮp + DI> .H p 䨤, ⮣ ᤥ ᯥp. + DI> H , 7 p稭, p ⪠ IBM + p + DI> pp ? H ᭮ p㬥樥. + ࠬ (⨯ ⥡) 祣 () +ਭ, ⢮᪨ - +ᯥ㬥 ਭ 祭 ਣ , +祭 㤮 䠩 ᪨. ᭮뢠 + ਭ  ࠧ. + +, ᫨ ᮮ, ⭮ +୮ ZX-News +ਭ. + + DI> ᢨ! + + DI> -+- Traffic Increaser 3.0.1 + DI> + Origin: With Love From Russia ishankulov@mail.ru (2:5010/50.25) + + H ⮬ . , Dmitry! + +[CGE] [ARTVIEW] [THE KNIGHT'S ARENA] [IF GAME] +to be continued ... + +NEWART/n-Discovery * Coder, gfx artist, AY music's fanat + +--- DME v1.23+Ay rulez foreva + * Origin: ZX Spectrum of the best hobby (2:5030/885.50) diff --git a/docs/reference/SPRINT2K/SPRN2K21.TXT b/docs/reference/SPRINT2K/SPRN2K21.TXT new file mode 100644 index 0000000..992f111 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K21.TXT @@ -0,0 +1,50 @@ +*** Area: ZX.SPECTRUM Date: 7 Apr 01 22:16:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Kirill Frolov +*** Subj: Sprinter News + + ਢ, Kirill! + + Saturday April 07 2001 Kirill Frolov -> Slavka Kalinin. + + + + KF> । ࠧࠡ⪨ "祩" ࠪ᪨ ⮦ . + KF> ᪨ p冷 ⠢. + + ⠪, ᫨ ᯥp㬮᪨ ᥬp, p 뫮 +ᠭ 85% 饣 Sprinter-. H ⠪ p. + 楫 p⮨ ᤥ 롮p, p⢠ pp⪨ 㦭 ᥩ +p p: ᠬ Sprinter- 設, p 㦥 +p몫 pp? ⭮, 室 p㣮. H +p ppp pᨮ, ⠪ ⥫ +p p . ⮬ Sprinter- 㦭 ⮫쪮 ᥬp, +p p㣨 몮 ppp ppp. + H pᬮp ᥣ Sprinter-. p᪨ +, ᭨ p⥫쭮 ⮣ p. p +⮫쪮 p pp⮢ p ᮧ ᫮ p +p⪠. ᠭ ⮫ 㦭 ᥩ ⢥ p +pp p襪, , , ⮫쪮 㢥p ᯥ譮 ᢮ +p⮢ pp p pᨮ. H , 㢥p, + p p PC. Hpp pp 襩 p ᯮ +pᥬp. , p⭥p p㡥 ⮦ +Sprinter-. + 室 ᮮp pp㥬 ᮧ p ppp +p⢥ Sprinter-. H ⮣ 짮⥫, +⮫쪮 Sprinter, 뫠 ppp , p㥬 +p CP/M-80, p p ᥬp p㣨 몮 +ppp. 㦥 ᠫ, p 믮 +p⭮, ⥬ p pp筮 Sprinter-᪮ DOS CP/M, +p pᯮᮡ ᠬ CP/M. + 樨 筥 . ᫨ -, p +CP/M - , p p쥧 㤨. + + + ! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) diff --git a/docs/reference/SPRINT2K/SPRN2K22.TXT b/docs/reference/SPRINT2K/SPRN2K22.TXT new file mode 100644 index 0000000..a669f0b --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K22.TXT @@ -0,0 +1,110 @@ +*** Area: ZX.SPECTRUM Date: 9 Apr 01 22:35:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + ਢ, Sergey! + + Saturday April 07 2001 Sergey Krinitsin -> Alex Goryachev. + + AG>> 砩 pᬮp p ᯮ짮 + AG>> ⥫p. + + SK> ᠬ ஡ ࠡ ⥫஬ ? + SK> ᮡ ᮪ ࠧ襭? ࠢ? + + 94 98 뫮 ᪮쪮 p㬠 뫨 p㤮 + p ᪮ ⢥ p ᯮ짮 ⥫p +SCART-. ⮬ p 祭 SCART- p㣮 ⥫p (NEC, +89 ) 業 p. 㢥p p, ᮢp +⥫p ( pꥬ SCART p )  +p p. Sprinter ⥫p, 㦥 +⥫쭮 p, ᯮ Ivan Mak. +饬 Sprinter p ⥫p SCART, ⮬ +砥 p 㤥 ⪨. + + >>> ⫥, ଠ ⨢ । + >>> ।⢠ ( ᮢᥬ 訥), ⠥ 묨 ᯮᮡ + >>> ᡠ + >>> + >>> 襬 , ⮪ + >>> 堫 , ⮡ 㢥 த. H 設 + AG>> H p p饭 p⠢ + AG>> p᪨ 楫 襩 p. + + SK> 筠 楫  ⥫쭮- 祭 + SK> ਡ뫨. + + ⮩ p㫨p ᮣᥭ, p饩 - . + + AG>> ᫨ - 楫 襣 饭 ⮩ + AG>> p樨, , ⮨ ᪥ + AG>> 㯠⥫, p + AG>> Sprinter-, p, , + AG>> ⢮ p, p㣮. p ᮧ + AG>> ᫮ 룮 p㤭⢠. + SK> [...] + + >>> ᮢ⨬ ⮫쪮 ஢ ? :) + AG>> p, ᮢ⨬? + AG>> ᮢ⨬ "" "宫쭨"? p + AG>> p ⮢᪨ pp... :) + AG>> p, p㣨 + AG>> p⢠. + + SK> ⭮襭 Sprinter' ? + + ⢥砫 p 쭥襬 p⨨ 孮, ᭮ p ᮧ +Sprinter. + + + AG>> ﭢp ⮣ p諨 , p + AG>> p襭 p 裡 짮⥫ﬨ, ⮬ ᫥. + AG>> H 饭 ⮩ p樨 ᨫ. + + SK> 祬 , + SK> Sprinter ⮡ 訫 ਮ? + SK> ࠧࠡ뢠 ᭮ ᮢ ⥭樠 㯠⥫. + + +Sprinter pp뢠 ⥫쭮 p. 孨᪨ pp⨪ p襭 + 뫨 ⠩  p p⮬. ﭭ +뤢 p p p. H p +頫 p⥪p p. p⥪p p + p室 ᮢᥬ pᯮᮡ p +楫. +᫥ p p, ⠪ Sprinter p᪨ +p. ﭭ ᮡ⥫ p 設 + . Sprinter p p㬠 ⥫쭮 +p樨 뫮 祭 . ᥩ, Sprinter + p 96 뫮 , p鸞 짮⥫ +⠫ ᫠ ( 32 pp來 pp, SVGA- p). +p ⥯p ᫠ 㦥 p ﬨ PC, +p㬠. ;) + +饬, p  , p pp稪 + p쭮, 墠⠫ p p  . + p ⮢ 室 ᢥ, 稫 98 . ᥬ +⠫ p. + +, p 諠 ᥡ ᨫ p쥧 ⨢樨 p +p⮬. ⮢ 㦤 ᥢ pᮢ 易 +Sprinter-. H 㦥 Sprinter 㯥p㯥pp, + p稭 ⮣ pp pp pp + ᥡ p㣨 ? + p쭮 pp 㤥 ᮧ ? H Sp2000 +p⮨ p (⮫쪮 让 ⥭樠). + p 뤥p ᮧ pp +ᯥ祭 吝 p 㯠⥫. +  ᫥饣 p 㤥 p ᪠ +. + + + ! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) diff --git a/docs/reference/SPRINT2K/SPRN2K23.TXT b/docs/reference/SPRINT2K/SPRN2K23.TXT new file mode 100644 index 0000000..c3ae8df --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K23.TXT @@ -0,0 +1,31 @@ +*** Area: ZX.SPECTRUM Date: 11 Apr 01 22:27:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Andreas Kaiser +*** Subj: ਭ .. + + ਢ, Andreas! + + Tuesday April 10 2001 Andreas Kaiser -> All. + + AK> த ࠪ , , ਥ堫 ;)) , + +, 㦤 ⥫ p樨. :) +᫨ 筮 諠 p ᫥ p , , + 뫠 p p p. + + AK> + AK> 㤥 - Sprinter-97 + AK> ࠧ Sprinter-2K? ଠ ।ᬠਢ প ? + +筮 㤥 Sp97 Sp2000 ⮩. p p +뫮. + + + ! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) diff --git a/docs/reference/SPRINT2K/SPRN2K24.TXT b/docs/reference/SPRINT2K/SPRN2K24.TXT new file mode 100644 index 0000000..2b314ac --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K24.TXT @@ -0,0 +1,40 @@ +*** Area: ZX.SPECTRUM Date: 11 Apr 01 22:49:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Slavka Kalinin +*** Subj: Sprinter News + + ਢ, Slavka! + + Tuesday April 10 2001 Slavka Kalinin -> Alex Goryachev. + + + + SK> ਢ ⥡, Alex! + + SK> 祬 ᤥ ਭ ० 樨 ᯥ㬠 + SK> 直 ࠡ⪠ ⨯: ⭮ ⨪, 512 + SK> ᥫ ப, Flash colour .. ? + + p⪨ ppp묨 p᪨ +p pp⠬. p ⭮ +(Pentagon 128, Scorpion Pentagon 512). ᫨ 㦭 ⥫ +p᪨ , 祬 ⮣ ⥪⮢ p 8032, +p᪨ 320256 256 梥⠬ 640256 16 梥⠬ p 16 . +梥⮢? + + + SK> 祭 ॠ 業 AY + +p 樥 AY (p 㬮, 騬 +-) p襭 , 室 +Sp2000. + + + ! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) diff --git a/docs/reference/SPRINT2K/SPRN2K25.TXT b/docs/reference/SPRINT2K/SPRN2K25.TXT new file mode 100644 index 0000000..a6c3172 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K25.TXT @@ -0,0 +1,85 @@ +*** Area: ZX.SPECTRUM Date: 12 Apr 01 11:57:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Stas Vlasov +*** Subj: Sprinter News + + ਢ, Stas! + + Wednesday April 11 2001 Stas Vlasov -> Sergey Krinitsin. + + SK>> 㯫 Sprinter ᫨: + + SK>> 1. ᫥騥 ० ࠡ:....................... + + SV> ) Full Speccy Compatibility mode, ᯮ짮 + SV> ᥩ 㯭 , ࠧ . + SV> 易⥫쭮. 筮 樨, + SV> 箩 ᮢ⨬, ன 㤥 + SV> ணࠬ. + + 㦥 ᥩ. Pentagon 128, Scorpion 256, Pentagon 512. +  ⥫ p Real Spectrum "⨭" ULA p㣨 +頬. ᭮ p졥 p㡥 p⭥p. + + SV> ) 㣮 ०. ⥪: 梥⭮ 80x24, + SV> 䨪: 640x480, 16 梥⮢, + SV> . + +: 梥⭮ ⥪ 8032 +p䨪 320256 256 梥⮢, 640256 16 梥⮢. p 256 p +ᯮ ᥩ. 襥 pp襭 㤥 p ᯮ짮 512 +, 祣 p⢨ - SP2000 ⠭ + p 512. + + + SK>> 2. 㤥 :.............................. + + SV> , ࠪ᪨. H稭  襩 com ps/2, + SV> 譨 , ⥢ . , + SV> ⮡ ⠭ ࠧꥬ 祭 + SV> ७ 譨 ன. + + ppp 譨 p⢠ 㦥 ᥩ. + ᮡࠥ AT Minitower ᯮ짮 쭨. + 砥 AT-, MS-Mouse, IDE , ATAPI CD-ROM, Hayes +. ன⢠ ⠭ ਮ  +୮ ଥ. + + SV> , 譥 ன⢮? + SV> ( ஫ ࠧꥬ) . + SV> ন 让 ꥬ. + + Sp2000 IDE p䥩 pꥬ, ⠪ p + 4 , ᫨ CD-ROM 㦥. p p  ꥬ, + p ᪨ p⢠ 2 , ᫮ +pﬨ FAT16. + + SK>> 3. 㤥 ᫥訩 :.............................. + + SV> Hଠ쭠 筠 樮 ⥬ 饭 ०, + SV> ன 짮⥫᪮ ணࠬ 㤥 + SV> 㣮 ணࠬ ⥬ 樮. - ਫ + SV> । ⥪, ।⢠ ࠧࠡ⪨. + SV> (,  :-) + + Sprinter- ᪮ ⥬ - 室饥 p +p⮣ DOS, ᮧ p᪮ ⥬ p. +筮 ⥬ ⠭ , p 墠⠥. + + SK>> 4. 業 ⠢:.......................................... + + SV> 㤭 ᪠ - ।. + SV>  筮. 筮 ⮢ . + SV> 饬, 150 350 $, ᨬ 䨣樨. + +⮨ p ᡮp 쭮 䨣p樨 p p㬥 +㦥 (ᥩ 135$). + + ! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) diff --git a/docs/reference/SPRINT2K/SPRN2K26.TXT b/docs/reference/SPRINT2K/SPRN2K26.TXT new file mode 100644 index 0000000..0ef8a00 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K26.TXT @@ -0,0 +1,57 @@ +*** Area: ZX.SPECTRUM Date: 12 Apr 01 19:32:42 +*** From: Andreas Kaiser (2:5020/400.0) +*** To : All +*** Subj: ਭ .. + +<987029365@p56.f529.n5030.z2.FidoNet.ftn> +From: "Andreas Kaiser" + +ਢ, Alex! + +>AK> த ࠪ , , ਥ堫 ;)) , +> +>, 㦤 ⥫ p樨. :) +>᫨ 筮 諠 p ᫥ p , +, +> 뫠 p p p. + +... - ⠬ ᬠ (᫨ ), -, ⥫ +㯨 ਭ, ᯥ樠쭮 - ( +஬ᯠᨡ), ⢨ (䥪 !). ⮬, + મ⨪ "doom" ᪠ "㯠!", ⢥⨫ +" , ⮢ ". ( 稬 +६ 뢠 ௨, 㤠) 筮 +ਭ 㯠 AT譮 :) (த , !) ᠬ +稫 ࠭⨩ ⠫ ਭ, 㬥묨 +ᬠਢ ࠩ- . ⢥, - + ஢, ਫ (" ஢﫨 +?" 訢 ). ⮬, ৥ 1 稫 , ⨫ + ᪨ । ... ᮩ. ᠫ , ⢥⨫ +, , ஡, 稫. ⮬ + ⠫, ᯮ. +, ⮬ 稬 祭 让 롮 +ਭ. , 뫥⥫ ஫ +᫥⥫쭮 ? ⠪ , 稯 + . ப. + +>AK> +>AK> 㤥 - Sprinter-97 +>AK> ࠧ Sprinter-2K? ଠ ।ᬠਢ প ? +> +>筮 㤥 Sp97 Sp2000 ⮩. p +p +>뫮. + +⭮. ⥫⭮ 㢠⥫⢮, ⠪ ᪠. 饬, ਭ 㤥 +ঠ ⮫쪮 室 , ࠭ 㧥. +⮫쪮 ந, ⠪ ࠧ ஡ ன. + + 㢠 +Andreas + + + +-- +ࠢ १ ࢥ Talk.Ru - http://www.talk.ru +--- ifmail v.2.15dev5 + * Origin: Talk.Ru (2:5020/400) diff --git a/docs/reference/SPRINT2K/SPRN2K27.TXT b/docs/reference/SPRINT2K/SPRN2K27.TXT new file mode 100644 index 0000000..3755e19 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K27.TXT @@ -0,0 +1,38 @@ +*** Area: ZX.SPECTRUM Date: 14 Apr 01 21:27:30 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stanislav Udin +*** Subj: pp. + + + ਢ , Stanislav! + + <19:07> Stanislav Udin wrte to Ivan Mak: + + IM>> p樯 p . ⮣ y + IM>> 祫, p MSX pp. H ⮬ ᫥, + IM>> ppp, , , yp, + IM>> p. + SU> Hy y! p筮 ⠪ 祫.  p猪 + SU> . RU.MSX. ⥭樠 짮⥫ y p + SU> , ᫨ Sprinter y p p. + +᪠ p , ... p㥬 ᭮... + + SU> p ⥬y. ᤥ ⠪, ⮡ Sprinter + SU> p p ᫥ ᮢ᪨ p, ᭮ + SU> pp 58080: p-06, 樠, 좮 -01, + SU> -86, p, p-128 ..? p p + SU> y 祬 p MSX-2. + + . ⮬ p p. + + pp p訢 祭 p祭 p訢. +⢮ p訢 - p祭, ⠪ ᭮ 筮 RAM... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K28.TXT b/docs/reference/SPRINT2K/SPRN2K28.TXT new file mode 100644 index 0000000..89fcdeb --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K28.TXT @@ -0,0 +1,26 @@ +*** Area: ZX.SPECTRUM Date: 14 Apr 01 22:07:41 +*** From: Ivan Mak (2:5030/529.24) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + + ਢ , Sergey! + + <19:10> Sergey Krinitsin wrte to Denis Parinov: + + DP>> ⠪ p Sprinter'? + SK> ﭨ 業 ᫨⥫ 魮 Z80 ⠪㥬 + SK> ⮩ 21 . ⠢ 5,25 . 権 ॣ-ॣ + SK> ᥪ㭤. ࠧ , 祬 ॢ ᮢ᪮ -1840, + SK> 饩 ᯮ 10 . 権. + +p ⠫ 業 pp, -3ns, 1700 ᪨ +⮢ (30000 GATES) + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K29.TXT b/docs/reference/SPRINT2K/SPRN2K29.TXT new file mode 100644 index 0000000..43625ed --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K29.TXT @@ -0,0 +1,31 @@ +*** Area: ZX.SPECTRUM Date: 14 Apr 01 22:15:39 +*** From: Ivan Mak (2:5030/529.24) +*** To : Andreas Kaiser +*** Subj: ਭ .. + + + ਢ , Andreas! + + <22:28> Andreas Kaiser wrte to All: + + AK> , , ஢ਫ , ਫ, , + AK> . + + ⠬ p 祬... H㦭 pp ⮫쪮 p宦 +12, -5 + ᨣ p pp pp ( p pp 襢 +, 뫮 ). +H ⠪⮢ , ᫥⥫ p... + + AK> த ࠪ , , ਥ堫 ;)) + +, p?! 筮 pp p ⨬... + ⠬ p, ⠪ ⠪... ... + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K30.TXT b/docs/reference/SPRINT2K/SPRN2K30.TXT new file mode 100644 index 0000000..2051931 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K30.TXT @@ -0,0 +1,31 @@ +*** Area: ZX.SPECTRUM Date: 14 Apr 01 22:43:50 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stas Vlasov +*** Subj: Sprinter News + + + ਢ , Stas! + + <22:29> Stas Vlasov wrte to Alex Goryachev: + + SV> H 䨪 讬 - . + SV> ᮡࠥ ਫ 樮, + SV> ᫨  ४⭠ ४⭮ ᠭ + SV> ணࠬ ⠢ ࠪ - ⮣, + SV> 砩 ᠫ ? + SV> ࠭ , ⠪ . + +뢠 p , p _ _. ⮬ ᫥ . +p⭮ p p, p 16k p 㯭 +, . p, 㯠 p栬 ⠪ + p/p, ⠪ p 饭. ᫨ +, 筮 ᨫ쭮... p p⨥/p⨥ +p⭮ 室 p (맮 㭪樨 )... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K31.TXT b/docs/reference/SPRINT2K/SPRN2K31.TXT new file mode 100644 index 0000000..a88213f --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K31.TXT @@ -0,0 +1,47 @@ +*** Area: ZX.SPECTRUM Date: 14 Apr 01 22:47:41 +*** From: Ivan Mak (2:5030/529.24) +*** To : Stas Vlasov +*** Subj: Sprinter News + + + ਢ , Stas! + + <22:39> Stas Vlasov wrte to Alex Goryachev: + + SV> H 稭, ⮨ . + SV> .. ⮨⢠. H, 筮 , ᠫ + SV> ।饬 쬥 - ࠪ⨪ + SV> Z80. H ᫠ ᮧ 祣- 쥧 + SV> . 祬 - ⮣, ᮧ - + SV> ਫ筮 ணࠬ ਤ ८ ९⢨, + SV> 砫쭮, 롮஬ . 쥧 + SV> 墠⠥ PC, . + +_p_ p᪨ : + ᮢ p⨪, p⠫ + 殮 (p⮢) p⠫쭠/p⨪ + ppᮢ p⮢ pp 梥⮬ + ⮢/p᪨/ᬥ蠭 p p + p᪨ p ( 뢠, p㣮 p) + +_p_ 㪮 : + AY + COVOX-Blaster + +_p_ 騥 p : + p p뫪 ⮢ (3.5/ᥪ - p ) + p ⮬ (7/ᥪ) + p p筠 ⥬⨪ AND, OR, XOR, ADD, SUB ᨢ 256 + + + ⮣, _ᥩ_ ⭮ p Z80... + + ... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K32.TXT b/docs/reference/SPRINT2K/SPRN2K32.TXT new file mode 100644 index 0000000..c2cddcd --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K32.TXT @@ -0,0 +1,46 @@ +*** Area: ZX.SPECTRUM Date: 15 Apr 01 14:34:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Nikolay G.Arhipoff +*** Subj: Sprinter News + + ਢ, Nikolay! + + Saturday April 14 2001 Nikolay G.Arhipoff -> Stas Vlasov. + + + NA> ᠬ 砫 㦤 ਭ ᠫ, + NA> ᮢ 㥢 ⥬, 㫨஢ ࠧ + NA> ॠ (㦥 ᤥ , ), ஢ + NA> ⮬ ( - ⠪ ?). ਭ + NA> ணࠬ, ᯮ -।. 祬 ? + NA> ਤ + NA> ணࠬ , ॡ騩 ᮢ, ਭ + NA> 㫨 ஢ . + +H ⠪. p楢 Sprinter pᮢ p p + p ⠭p⭮ pp, +p . Sprinter +p Z80. , , ᮢᥬ 易⥫쭮 ᯮ짮 p + Sprinter- p ᮧ pp. ᯮ짮 砫 +⮫쪮 p᪨ p, ⠢ 䠪᪨ p㬥, ⥯ +ᢠ ⠫ , p p pᯨᠫ Ivan +Mak. + , p p p, p㣨 p +ᮡ⢥ p pp⪥ p pp p. , + ᯮ짮 Sprinter p ᥬ 㤮⢠. + ᫥ 䨣p Real Spectrum. +H p楢 , ᯠ, 砭, ᮡp - +ᮧ p. pp⢠ Sprinter-, PC, +MAC-, . +饭 p栬 ᤥ 뢮, ᥣ p +, ᠬ pᯥ⨢ p樨  MSX2. + + + ! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS Plus Ltd. peters@atlant.ru (2:5030/529.56) diff --git a/docs/reference/SPRINT2K/SPRN2K33.TXT b/docs/reference/SPRINT2K/SPRN2K33.TXT new file mode 100644 index 0000000..2923ee6 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K33.TXT @@ -0,0 +1,36 @@ +*** Area: ZX.SPECTRUM Date: 16 Apr 01 1:04:16 +*** From: Denis Parinov (2:5030/529.48) +*** To : Stas Vlasov +*** Subj: ਭ .. + + ਢ⢮ ⥡, Stas! + + Saturday April 14 2001 Stas Vlasov -> Denis Parinov. + + DP>> p? Sprinter - p ᮡp + DP>> _ᮢp_⭮__ p 設 ALTERA + DP>> ᠬ ᮢp . FDD, HDD, CDROM, Hayes, + DP>> Keyboard, Mouse - ⮦ p訥? p᭮ p: + DP>> CGA ⥫p ( p ⥫p + DP>> p). + + SV> ஬ ᠬ ⥪, , + SV> ᮥ. + +ALTER - - ᪨ ⮢ 室 稯, + p㦠 p 뢠 +ᮥ p p㣮. p 砥 p⢮( +᪮쪮 p pᯮ 稯). p ᮥ +⮢ p ᥪ㭤 筮 +p⥪p p. ALTER 32- .. +ᮡ⢥ p⥪p. + + SV> ⮦ ᮢ६? + +H ? ᮢp ? ᮢp p 㬥. + + 㢠, Denis. + +... H, ࠢ 祫, ᨫ ᠭ . +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) diff --git a/docs/reference/SPRINT2K/SPRN2K34.TXT b/docs/reference/SPRINT2K/SPRN2K34.TXT new file mode 100644 index 0000000..fd88936 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K34.TXT @@ -0,0 +1,97 @@ +*** Area: ZX.SPECTRUM Date: 16 Apr 01 1:43:12 +*** From: Denis Parinov (2:5030/529.48) +*** To : Stas Vlasov +*** Subj: Sprinter News + + ਢ⢮ ⥡, Stas! + + Saturday April 14 2001 Stas Vlasov -> Denis Parinov. + + SV> ।, ந⥫쭮. + SV> 設⢥ 砥 ⠪, ⠪ ந⥫쭮 + SV> ࠭稢 , ணࠬ. + + SV> H _⮩稢_ ணࠬ- . + SV> । ⮬ ? , + SV> ⮫쪮 ⭠, ᯥ稢 + SV> ࠧ ᥣ, ணࠬ, + SV> ᢮⢠ ⭮ . + + SV> ⭮, , ⮡ ணࠬ, + SV> ⫠ ( ,  ணࠬ), + SV> - ᢮ . + + ᥩ. + +0000 +-------------------------------------------------------+ +0008 | 窠 室 BIOS | +0010 | 窠 室 DOS | +0030 | p稪 pp뢠 | +0038 | p稪 pp뢠 ᮫ (p p) | +0066 | p稪 pp뢠 NMI | + | | + | pᯮ DOS | + | | +4000 +-------------------------------------------------------+ + | H砫 p (p ) | + | pp (p p | + | p㣠 . p p㦥 p) | + | ⮫쪮 p樨 | + | ᯮ짮 p. | +4100 | H稭 ⮣ p pᯮ pp. | + | | +8000 +-------------------------------------------------------+ + | p | + | | + | | +C000 +-------------------------------------------------------+ + | p | + | | + | | +FFFF +-------------------------------------------------------+ + +⮥ p ⮫쪮 DOS, ⮡ ⮣ + p p殩 믮: + + IN A,(PAGE0) + LD (DOSPAGE),A + LD A,#FF + OUT (PAGE0),A + + p 맮 㭪権 믮: + + LD A,(DOSPAGE) + OUT (PAGE0),A + RST #10 + +⠫쭠 뤥 16Kb p p . + + LD B,number_pages + LD C,command_GET_MEMORY + RST #10 + LD (Memory_ID),A + +᫨ p ᢮ p騩 ⥡ : + + LD A,ID_㦮__ + LD C,command_FREE_MEMORY + RST #10 + + 㭪 p 訡: "p 㯥". +H 饥 ᭮ ⥬ .. + + SV> ᮢ६ ( 祭, i386, 68000 Z80000  + SV> 㦥 ) ᫥ ஢ + SV> (饭 ०), .. . । + SV> ⠪ ० ࠡ? + + ᤥ ⠪ p. +Hpp /몫/ppᮢ뢠 p + "⫠" ᯮ pp. + ᤥ p ⨧筮. p㣮. + + 㢠, Denis. + +... ந 殮 宬. - ... 㦨. ... +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) diff --git a/docs/reference/SPRINT2K/SPRN2K35.TXT b/docs/reference/SPRINT2K/SPRN2K35.TXT new file mode 100644 index 0000000..50f133b --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K35.TXT @@ -0,0 +1,31 @@ +*** Area: ZX.SPECTRUM Date: 17 Apr 01 18:11:42 +*** From: Ivan Mak (2:5030/529.24) +*** To : Eugene Palenock +*** Subj: ந⥫ ਭ + + + ਢ , Eugene! + + <14:29> Eugene Palenock wrte to Dmitry Ishankulov: + + DI>> ᤥ ⠪ pp,祣 ᤥ PC. + +H pp p ᪮쪮 p p. + p䨪, p㣮 ⥪. + +H pp 奬 p p pp㧨 䠩. + +H pp p p쭮 93- p奬. + + EP> ਭ ᤥ + EP> ⮣ ᯥ㬥. + +_p!_ _H!_ _ H !_ + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K36.TXT b/docs/reference/SPRINT2K/SPRN2K36.TXT new file mode 100644 index 0000000..8e8adee --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K36.TXT @@ -0,0 +1,40 @@ +*** Area: ZX.SPECTRUM Date: 18 Apr 01 15:27:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Andrey Roska +*** Subj: ਭ .. + + ਢ, Andrey! + + ୨ 17 ५ 2001., 23:31, Andrey Roska ᠫ Ivan Mak: + +>㫥 !!! ᪮ ਭ ⮨, ⥫!!! + + Mainboard Sp2000 +(RAM 4Mb, videoRAM 256Kb) = 95$ + + Mainboard Sp2000-Light +(RAM 4Mb, videoRAM 256Kb (pp 512Kb ), ISA ᫮⮢) += 85$ + + p Sprinter ⠭p⭮ 䨣p樨: + +1. AT Mini-Tower c ⠭. +2. Sp2000 Sp2000-Light. +3. ᪮ ᪮ 3.5". +4. AT. +5. MS-Mouse. + = 135$-125$ + + Sp2000 㤥 ᪠ p ⮣ . + Sp2000-Light ⠢ ⮫쪮 pp⥫쭮 . + + p 㯪, , 뫮. + + ! + + Alex Goryachev. + + [ZX]...[Sprinter]... + +--- + * Origin: PETERS PLUS LTD www.petersplus.da.ru (2:5030/529.56) diff --git a/docs/reference/SPRINT2K/SPRN2K37.TXT b/docs/reference/SPRINT2K/SPRN2K37.TXT new file mode 100644 index 0000000..49cba7e --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K37.TXT @@ -0,0 +1,28 @@ +*** Area: ZX.SPECTRUM Date: 23 Apr 01 15:10:53 +*** From: Ivan Mak (2:5030/529.24) +*** To : Alex Shevchuk +*** Subj: Sprinter News + + + ਢ , Alex! + + <12:56> Alex Shevchuk wrte to Ivan Mak: + + AS> ᯮ, . ⥫ , CGA + AS> ᪠ - . 쭮 ᮡ "" + AS> 14" ? + + VGA 砥. + + AS> , ⠬ ᥡ ।⠢ 㪮 室? + +H Sp2000 - 16-bit p-室. , . +㤥 DMA, Sound-Card. ᥩ COVOX-Blaster AY. + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K38.TXT b/docs/reference/SPRINT2K/SPRN2K38.TXT new file mode 100644 index 0000000..32adf7f --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K38.TXT @@ -0,0 +1,38 @@ +*** Area: ZX.SPECTRUM Date: 23 Apr 01 14:53:09 +*** From: Ivan Mak (2:5030/529.24) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + + ਢ , Sergey! + + <20:08> Sergey Krinitsin wrte to Ivan Mak: + + SK> 쥧. 稫 ।⠢ ⮫쪮 + SK> ᨬ쭮 ⥯ ⥣樨. 業 + SK> ᫨⥫쭮 魮 室 ॠ ⠪⮢ + SK> ⢮ ⠪⮢ 稢 믮 権 ᫮. + + , ᯮ ᥫpp, p 믮 7 . +롮p ᥪ㭤 ( p ). p 롮p +p p 묨 ⠬. AND, OX, XOR, ADD, +SUB. p ⮩ ᪮p. ⮬ ᥫpp 믮 +⥫ 㭪樨 뢮 p , .. 뢮 +᪮p 7.祪 ᥪ㭤. p p殮 . +믮 p殮 p室 pp筮... p 몫뢠 + ⮩ ᪮p 7.祪 ᥪ㭤. p pp筮 梥... + +pp Z80 ⮫쪮 p ⨬ pᮬ, ᭮ ⮣ +ᥫpp 㦥 3d-室/p﫪, p 320x256 祪 p, +256 梥⮢, 17-25 p ᥪ㭤 ᮯp 모 㬠 p... + +.᪮p ᥫpp ⨣ p ᮢ p樨 +p栬 (ﬨ)... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K39.TXT b/docs/reference/SPRINT2K/SPRN2K39.TXT new file mode 100644 index 0000000..51047d8 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K39.TXT @@ -0,0 +1,29 @@ +*** Area: ZX.SPECTRUM Date: 23 Apr 01 15:04:52 +*** From: Ivan Mak (2:5030/529.24) +*** To : Sergey Krinitsin +*** Subj: ਭ .. + + + ਢ , Sergey! + + <20:41> Sergey Krinitsin wrte to Alex Goryachev: + + AG>> pp Z84C15, p Sprinter- ⠢ + AG>> ALTERA - EP1K30QC208-3 EPM7064STC100-10 + AG>> p訬 Pentium , ⮫쪮 p + AG>> p 8 p, ⠪ ? + SK> 祬 ⮣ 32⭮ ࣠樨 ஢? + + pp, p... + p p p쭠 - 1700 :-) . +32 , p -. +16 - p ᭮ . +8 p pp Z80. + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K40.TXT b/docs/reference/SPRINT2K/SPRN2K40.TXT new file mode 100644 index 0000000..2565354 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K40.TXT @@ -0,0 +1,23 @@ +*** Area: ZX.SPECTRUM Date: 23 Apr 01 15:08:05 +*** From: Ivan Mak (2:5030/529.24) +*** To : Oleg Melinuk +*** Subj: ᥩ p ᯥpy ? + + + ਢ , Oleg! + + <01:17> Oleg Melinuk wrte to Doba Nova: + + DN>> - ⥫쭮 㦭. + OM> 㦥 10 . + +! Sp2000 뫠 pp⠭ 1999- , + 諠 p 2000- ... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K41.TXT b/docs/reference/SPRINT2K/SPRN2K41.TXT new file mode 100644 index 0000000..b340917 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K41.TXT @@ -0,0 +1,44 @@ +*** Area: ZX.SPECTRUM Date: 23 Apr 01 23:03:00 +*** From: Alex Goryachev (2:5030/529.56) +*** To : Slavka Kalinin +*** Subj: ਭ .. + + ਢ, Slavka! + + Friday April 20 2001 Slavka Kalinin -> Alex Goryachev. + + AG>> Sp2000 㤥 ᪠ + AG>> p ⮣ . Sp2000-Light ⠢ + AG>> ⮫쪮 pp⥫쭮 . p 㯪, + AG>> , 뫮. + + SK> 蠩, 祣 㤥 Sp2000? - 㦥 + SK> ਫ ਫ, ⠬ த 16 + SK> 㤥, 㤥 . + + Sp2000 ⠭ (pp p p 襣 ꥬ), + pp 㦥 騥 䨣p樨, p + p. + H p訢 - pp p 筮 +짮⥫. p㣨 ᫮ p p ⠢ ᪥ +⨢ exe-譨. p ⮬ - BIOS ⠪ + ᮤp 让 p,  ᮡ⢥ +p. + Sp97 뢠 , ⮬ p㧨 䨣p +⮫쪮 p p﫠 p p 몫祭 ⠭. + ꥬ 㢥祭 256b ⥯p ᯮ . + 16 2 p 㪠. + 2 pꥬ IDE p䥩. p楯 IDE p⢠, +p CD-ROM. + 믮 ᮪ 孮᪮ p pp饩 +⪮ p⨥. + + + ! + + Alex Goryachev. + + [ZX]...[Sprinter]... Force in flex cource! + +--- + * Origin: PETERS PLUS LTD (2:5030/529.56) diff --git a/docs/reference/SPRINT2K/SPRN2K42.TXT b/docs/reference/SPRINT2K/SPRN2K42.TXT new file mode 100644 index 0000000..3e963c0 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K42.TXT @@ -0,0 +1,28 @@ +*** Area: ZX.SPECTRUM Date: 23 Apr 01 14:25:51 +*** From: Andrey Roska (2:4616/21.0) +*** To : Sergey Krinitsin +*** Subj: ਭ .. + + + -+# Hi, Sergey Krinitsin ! #+- + + 㡡 21 ५ 2001., 18:54, Sergey Krinitsin ᠫ() Denis +Parinov: + + DP>> p⥪p. + SV>>> ⮦ ᮢ६? + DP>> H ? ᮢp ? ᮢp p + DP>> 㬥. + + SK> 뢠 㬥? 祬 + SK> 4 ﯠ? + + , - . 4 , ⮬ ⥫ +諮 訥 業 , ࠡ ⮩ + 500 , ⮦ ਥ. 饬, ਫ⠩ ⥪ + - . H୮, ⮬ 饥 ( 襥 ६). + + 訬 ﬨ, D.J.Dron ! + +--- GoldED/W32 3.0.1 + * Origin: BridgeStation (23:00 - 01:00) (2:4616/21) diff --git a/docs/reference/SPRINT2K/SPRN2K43.TXT b/docs/reference/SPRINT2K/SPRN2K43.TXT new file mode 100644 index 0000000..dcdbbfd --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K43.TXT @@ -0,0 +1,21 @@ +*** Area: ZX.SPECTRUM Date: 24 Apr 01 10:10:12 +*** From: Ivan Mak (2:5030/529.24) +*** To : Sergey Krinitsin +*** Subj: Sprinter + + + ਢ , Sergey! + + <23:32> Yuri Potapov wrte to Sergey Krinitsin: + + YP> , ਭ... ਭ஬ :) + +, p , Sprinter- 祭 p㩭 HP DJ-600... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K44.TXT b/docs/reference/SPRINT2K/SPRN2K44.TXT new file mode 100644 index 0000000..cc6e814 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K44.TXT @@ -0,0 +1,115 @@ +*** Area: ZX.SPECTRUM Date: 25 Apr 01 20:34:38 +*** From: Stas Vlasov (2:5080/172.0) +*** To : All +*** Subj: H Sprinter + + Hello All! + + 㬠 ࠫ ࠧ ᢮ ᫨ ᠡ, + ⥫ - 㢨. + + +=== Cut === + ॡ㥬 : + + RSTn - 맮 ᮮ⢥饣 ࠡ稪 㣮 ࠭ . +⥫쭮, ⮡ ࠡ稪 室 ࠧ ࠭. ⮬ +ॡ ࠭ ଠ樨 , 맢襬 ࠡ稪. + ࠡ稪 - OUT + RET. + ࠡ⪠ 뢠 - 筮. + NMI - ᭮ ࠡ , ⮬ ६ 樠樨 +祭 ⠩ ( CMOS, 뢠 ஢ +ᨭ஭樨). + + + 樮 ⥬: + + . + + ॡ: 64 ࠧ, 맮 㭪権 饭 + RSTn, ( 㦭) 뤥 +樠樨. + 㭪樨: ࠡ , ஢, ࠡ 䠩묨 +⥬, ࠡ ᠬ 筮, ࠡ /᢮, + 樠樨, etc + + 㫨 . + + ॡ: 3- ࠭ , 16 +㧪, ⥪ , 뤥 樠樨. +㦠 室. + 㭪樨: ७ 㭪権 . , 䠩 +⥬, etc + + ⥬ ⥪. + + ॡ: 㦠, 饭 +⤥쭮 RSTn , ࠬ - ID ⥪ ID 㭪樨 + +ࠬ ᠬ 㭪樨. + 㭪樨: ७ 㭪権 ஭ ணࠬ 䥩, + . .. ନ, 㭨樮 ⮪ +஢, etc + + ਪ ⥪. + + 㭪樨: ⥪, 㦠騥 ᯮ짮 +᪮쪨 ਫ ६, ।⢮ ८ +64. ᯮ짮 㦠 . + ਬ砭: 맮, 㬠, 㤥 祭 ⥬. + + ਫ, ⥬, ⠪ 짮⥫᪨. + + ॡ: 㧪 ਫ - 㦠 +। 樨. + 㭪樨: ᠭ. + ਬ砭: ⭮ ୮ ᯮ짮 ᪮쪨 +ਫ, ᫨ ... + + ⥬ ਬ砭: + + ⥬ ⠬ -뢮 ⮫쪮 +㫨 (⨯ - 00). + ⥬ ⠬ - ।⠢ ᫥ +(ந 樠樨 ) ᮮ⢥⢨ ࠢ +ਫ/짮⥫. 쭥襥 ࠧ࠭祭 㯠. + + + + : + + ଠ ࠭ : + +ID ࠭ - 16 +ID - - 16 + ࠧ饭 ࠭ - 1 (0 - RAM, 1 - Swap) +ᯮ ࠭ - 16 ( 䨧᪨ ࠭ RAM, + ᬥ饭 ᢮-䠩 ࠭) +६ ᫥ +祭 ࠭ - 32 (㤥 ᯮ짮 । + ⮣, ࠭ ⮨ 㧨) + + + ଠ : + +ID - 16 + - 2 (00 - , + 01 - ⥬ ⥪, + 10 - ਪ ⥪, + 11 - ਫ. + ᮢ饭 㣨 䫠) +ਮ - <8 (0 - ᨬ) +ﭨ - <8 (믮, , ⠭, ..) +ID ࠭ ᬥ饭 0000h | +ID ࠭ ᬥ饭 4000h | \ 16 ᮮ⢥⢨ ன +ID ࠭ ᬥ饭 8000h | / ଠ樨 ࠭ . +ID ࠭ ᬥ饭 C000h | + + +=== Cut === + + +Good luck. + Stas + +--- "" 3.0.1 + * Origin: gui is good, but console better (2:5080/172) diff --git a/docs/reference/SPRINT2K/SPRN2K45.TXT b/docs/reference/SPRINT2K/SPRN2K45.TXT new file mode 100644 index 0000000..dc0a05f --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K45.TXT @@ -0,0 +1,37 @@ +*** Area: ZX.SPECTRUM Date: 26 Apr 01 7:53:07 +*** From: Ivan Mak (2:5030/529.24) +*** To : Alexey Volyk +*** Subj: Altera Sprinter + + + ਢ , Alexey! + + <23:26> Alexey Volyk wrte to All: + + AV> ਭ (IM), "" 訢. + AV> ᪮쪮 横 १ ᨬ쭮 ? + + ACEX- - ᪮筮 ᫮, ⠪ 䨣p権 +᪮ . ⮩ p稭 p ᫥ +祭, Sprinter- . p p訢 0.5 ᥪ. + + AV> ࠧ ४䨣 , १ + AV> - ஥ ।⮬ 㪢. + + p... + + AV> ᠬ ⭮ 設 - ࠢ筨 । 1000 + AV> 横 १. + + p訢 ⮨. , :) +p祬, ᯥp⠫쭮 p梥 䫥設 p訢 +㦥 ᪮쪮 p. 1000 p猪 p... + ᯮp 100000 p訢... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K46.TXT b/docs/reference/SPRINT2K/SPRN2K46.TXT new file mode 100644 index 0000000..2c8674c --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K46.TXT @@ -0,0 +1,32 @@ +*** Area: ZX.SPECTRUM Date: 27 Apr 01 2:51:38 +*** From: Ivan Mak (2:5030/529.24) +*** To : Sergey Krinitsin +*** Subj: Sprinter News + + + ਢ , Sergey! + + <00:33> Sergey Krinitsin wrte to Ivan Mak: + + IM>> , ᯮ ᥫpp, p + IM>> 믮 7 . + IM>> 롮p ᥪ㭤 ( p ). + SK> ^^^^^^^^^^^^^^^^^ + SK> ᯮ? '誨 ⮫? + +72-pin SIMM (p EDO/FPM p᪠뢠 , )... + + IM>> pp Z80 ⮫쪮 p ⨬ pᮬ, + SK> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + SK> CPU ᥦ Z80? H ⮫쪮 ᮯ? + +. p ⮬ p... +Sprinter _pp Z80 + ᥫpp _ + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K47.TXT b/docs/reference/SPRINT2K/SPRN2K47.TXT new file mode 100644 index 0000000..b648fb8 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K47.TXT @@ -0,0 +1,45 @@ +*** Area: ZX.SPECTRUM Date: 27 Apr 01 2:54:35 +*** From: Ivan Mak (2:5030/529.24) +*** To : Eugene Ostroukhov +*** Subj: + + + ਢ , Eugene! + + <11:24> Eugene Ostroukhov wrte to Ivan Mak: + + >> EO> WarcraftII/Doom. + >> ^^^^^^^^^^^^^^^^^^ + >> EO> ਧ, ᠬ ᮢ६ ண ਭ + >> EO> ᬮ ᯥ ⥩... :( + >> + >> p⮥ - p. , ... + + EO> 320x200x256 - Doom + +H Sprinter- 3d-demo 320x256x256 25/17 frames/sec, 몠 +ᮯp COVOX-Blaster- (p HDD), 㬮묨 +䥪⠬ p p p... + +_ 㦥 Sp97_ + + EO> 640x480x256 - Warcraft II. ⮫쪮 䨪. + +p䨪 pp ᥩ 640x256x16. +㤥 襥 p 640x256x256. ᫮ p p稢 ⥫p. +ᥫpp 뢮 p 筮 p, ⠪ + WarCraft . + 17/12 FPS p쭮... + + EO> Doom, (, 㫥) + EO> 譮... + + Doom, Spectrum-, 祭 ⮣, 㦥 Sprinter-. + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K48.TXT b/docs/reference/SPRINT2K/SPRN2K48.TXT new file mode 100644 index 0000000..a215778 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K48.TXT @@ -0,0 +1,65 @@ +*** Area: ZX.SPECTRUM Date: 28 Apr 01 23:00:52 +*** From: Alexandr Machkasovskij (2:5007/23.0) +*** To : Nikolay G Arhipoff +*** Subj: Sprinter News + +ਢ Nikolay !!! + + 㡡 ५ 28 2001 15:10, Nikolay G Arhipoff ᠫ Yuri Potapov: + + NA> , ⢥ : + NA> - *H, ਭ? ᫨ , ᯨ᮪* + + + 稭 䠩 Windows Clipboard +Q: ਭ 業? +A: , ᠭ pp, , ppp +ᯫ⭮. pp ᯥ祭 ਭ ᫥饥: + +Flex Navigator. - ᪨ Win-Comander-. (: ⮭ +) 譨 /।. ⮬ ᫥ gfxwiew, +flicwiew, wavplay .. +DOS Commander. (p: p) MS-DOS ᪠ 720/1.44Mb +஬, +뢠 ࠡ CD-ROM. +p . (p: ᥩ p) ନ ࠡ⠥ + ।/ਥ 䠩 ⮪ X-modem, Y-modem, Z-modem + ࠧ⥩. + ᭮ p ᠭ FIDO-p. +GFX-viewer (p: ⮭ ) ᬠਢ BMP, PCX 㣨 +ଠ. + ᬠਢ ᯥ㬮᪨ ਭ ( ਡ⠬ ⠪ ) +. +2D-Studio. (p: p) p᪨ pp ७ +᪨ ࠭ 320x256 256 梥⮢. +FORTH for Sprinter (: Ivan Mak) 몠 FORTH ᥬ ⥪騬 + ᫥⢨ﬨ. +CD-ROM Player. (p: p) ந뢠 㤨 CD 祭 +ਭ CDROM. +RAM-Disk ࠩ iS-DOS. (p: Paul Falcon) +pp pp iS-DOS. (p: p) +PKT-viewer. (p: ) + 樮 ணࠬ (p: ⮭ , p, +) + DooM (: ) + + ⮣ : +Turbo Assembler. (p: ⮭ ) ।p-ᥬp. +䥩ᮬ ⨯ Borland-Pascal. - 㦥 ࠡ⠥ ४ +⥪⮢ । +UnZIP (: ᥩ ਫ) + + ⮨ 㯮 ஢ ਭ ᯥ㬮᪨ ணࠬ: + +F-Commander (ਭ.誠) +Commander DOS (ਭ.誠) +Font Editor (ਭ.誠) +Art Studio 128 (ਭ.誠) +ZX Word (ࠩ ਭ; 㪥 -) + + Windows Clipboard 砥 + + 㢠, ᠭ. + +--- + * Origin: : ᫥⢮ 㪠 (2:5007/23) diff --git a/docs/reference/SPRINT2K/SPRN2K49.TXT b/docs/reference/SPRINT2K/SPRN2K49.TXT new file mode 100644 index 0000000..91b6cfe --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K49.TXT @@ -0,0 +1,44 @@ +*** Area: ZX.SPECTRUM Date: 30 Apr 01 15:43:08 +*** From: Ivan Mak (2:5030/529.24) +*** To : Alexey Nikishin +*** Subj: Sprinter techs + + + ਢ , Alexey! + + <21:38> Alexey Nikishin wrte to Ivan Mak: + + AN> 1.aa a 室 訢 a ᯥ㬮᪮ a + AN> aa ? + +室 p訢 pp뢠. +H pp ⮬ p ... + + AN> ᫨ , 㦭 ⪮ 訢 a + AN> a ? + +p ⪮ p訢 (-᪮) ᯮ. p + ⭮ pᯮ, p᪠ ⠩ p ALTERA. + + AN> Api 訢 ? + + ᠭ ᢮ p訢 pp MAX-Plus II. +᫨ pp , p訢 p⮣ +p㬠 - . + + pp᪮ p訢 p (-), +p p p ⮢ pp뢠. + + AN> 2.奬a ਭa ஭ 㡫 ? + + . H ᫨ 㦭 , , pp + ⮬ 뫥 ( 砫⢮ p, ). +p e-mail: peters@atlant.ru + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K50.TXT b/docs/reference/SPRINT2K/SPRN2K50.TXT new file mode 100644 index 0000000..730e450 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K50.TXT @@ -0,0 +1,30 @@ +*** Area: ZX.SPECTRUM Date: 30 Apr 01 15:20:16 +*** From: Ivan Mak (2:5030/529.24) +*** To : Eugene Ostroukhov +*** Subj: + + + ਢ , Eugene! + + <14:26> Eugene Ostroukhov wrte to Ivan Mak: + + >> 譮... Doom, Spectrum-, 祭 + >> ⮣, 㦥 Sprinter-. + EO> - ... + + ᨫ쭮 ⥫, 㦥 㢨 :-) +᫨ p, ᫮, 筮 .p +(.⠭ .35 .31, 17.00 19.00) ᬮp... + + EO> , Sprinter'? :-) + +H. 뢠, Sprinter- p + 3000MHz. 97- , 2000- 3 p ... + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K51.TXT b/docs/reference/SPRINT2K/SPRN2K51.TXT new file mode 100644 index 0000000..a960641 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K51.TXT @@ -0,0 +1,33 @@ +*** Area: ZX.SPECTRUM Date: 30 Apr 01 15:43:52 +*** From: Ivan Mak (2:5030/529.24) +*** To : Andrey Roska +*** Subj: Sprinter News + + + ਢ , Andrey! + + <08:31> Andrey Roska wrte to Ivan Mak: + + IM>> . 쪮 , ⠪ p祭 + IM>> . p ᤥ ᢮ pp , ⮣ + IM>> ... + AR> , 8000 ⨫ ( ࠭஢, 砥 ⨫ )- + AR> Sprinter2000? :( + +H 室 pp ⮩ p稭, 祬 Spectrum Pentium +㫨 砥 p쭮. p祭 ⠢ﭨ + Z80. + + ᢮ ᮡ⢥ 16bit-pp, ⨬p pp , + ~300 ᪨ 祥 (1/6 pp). + + pp᪮ p訢 - 2 (!) ᯥpp, p⠥ +p, p㣮 AY. + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K52.TXT b/docs/reference/SPRINT2K/SPRN2K52.TXT new file mode 100644 index 0000000..c8dc620 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K52.TXT @@ -0,0 +1,28 @@ +*** Area: ZX.SPECTRUM Date: 30 Apr 01 15:44:42 +*** From: Ivan Mak (2:5030/529.24) +*** To : UUCP +*** Subj: Re[4]: pp .. + + + ਢ , Konstantin! + + <03:04> Konstantin A. Yeliseyev" +Reply-To: "Konstantin A. Yeliseyev wrte to Andrey Roska: + + AR>> 㫨஢? H୮, 㤭 㤥 :) + Kk> 易 㭪ﬨ . + Kk> ᥬ 易⥫쭮 㫨஢ ஢. + + p訢 - p, p pp㧪 +p訢 pp㧪 p :-)) + +P.S. p p᪨ MAX-Plus-II ᨬp 㫨 奬 +pp : 10 p _pᥪ㭤_ ᥪ㭤 P-II-266. + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [ Sprinter-II ] [Forth-CPU] [ZX] + +... ivan_mak@mail.ru * http://st-rektal.chat.ru * http://www.atlant.ru/peters +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/SPRN2K53.TXT b/docs/reference/SPRINT2K/SPRN2K53.TXT new file mode 100644 index 0000000..9ff3411 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K53.TXT @@ -0,0 +1,134 @@ +*** Area: ZX.SPECTRUM Date: 1 May 01 22:32:59 +*** From: Stas Vlasov (2:5080/172.0) +*** To : All +*** Subj: New os for Sprinter + + Hello All! + +H⪨ ஥ 樮 Sprinter', ⠪ 宦 DOS. + +=== Cut === + 襭, ਭ ⥪: + + ࠭ 㬥 0. + + + ॡ㥬 : + + ᫥ ⮫쪮 ᫥ +樠樨 . + RSTn - 맮 ᮮ⢥饣 ࠡ稪 㣮 ࠭ . +⥫쭮, ⮡ ࠡ稪 室 ࠧ ࠭. ⮬ +ॡ ࠭ ଠ樨 , 맢襬 ࠡ稪 ( .. +⠭ ࠭ ID , ⠫쭮 ணࠬ). + ࠡ稪 - OUT + RET, - 筮 ( +ਣ , ࠡ뢠 - ret iret). + ࠡ⪠ 뢠 - 筮. + NMI - ᭮ ࠡ , ⮬ ६ 樠樨 +祭 ⠩ ( CMOS, 뢠 ஢ +ᨭ஭樨). + ਮ⮢ 饭 ⠬ (㬠, 筮 4- +஢ ਮ⮢, ᮮ⢥ ⨯ ) ID ᮢ, +ࠡ ⠬, 塞 樮. + + + 樮 ⥬: + + . + + ॡ: 64 ࠧ, 맮 㭪権 饭 + RSTn, ( 㦭) 뤥 +樠樨. + 㭪樨: ࠡ , ஢, ࠡ 䠩묨 +⥬, ࠡ ᠬ 筮, ࠡ /᢮, + 樠樨, etc + + + 㫨 . + + ॡ: 3- ࠭ , 16 +㧪, ⥪ , 뤥 樠樨. +㦠 室. + 㭪樨: ७ 㭪権 . , 䠩 +⥬, etc + + + ⥬ ⥪. + + ॡ: 㦠, 饭 +⤥쭮 RSTn , ࠬ - ID ⥪ ID 㭪樨 + +ࠬ ᠬ 㭪樨. + 㭪樨: ७ 㭪権 ஭ ணࠬ 䥩, + . .. ନ, 㭨樮 ⮪ +஢, etc + + + ਪ ⥪. + + 㭪樨: ⥪, 㦠騥 ᯮ짮 +᪮쪨 ਫ ६, ।⢮ ८ +64. ᯮ짮 㦠 . + ਬ砭: 맮, 㬠, 㤥 祭 ⥬. + + + ਫ, ⥬, ⠪ 짮⥫᪨. + + ॡ: 㧪 ਫ - 㦠 +। 樨, 쭥襥 뤥 - १ +૥, १ ਪ ⥪. + 㭪樨: ᠭ. + ਬ砭: ⭮ ୮ ᯮ짮 ᪮쪨 +ਫ, ᫨ ... + + + ⥬ ਬ砭: + + ᮢ⨬ 맮 饩 Sprinter' (⭮, +१ ᮮ⢥ ⥪ ਪ ஢, 㦠 +ᮮ⢥饣 ਫ). + ⥬ ⠬ -뢮 ⮫쪮 +㫨 (⨯ - 00). + ⥬ ⠬ - ।⠢ ᫥ +(ந 樠樨 ) ᮮ⢥⢨ ࠢ +ਫ/짮⥫. 쭥襥 ࠧ࠭祭 㯠. + ⢥ ᭮ 㭨樨 । ᨣ +७ࠢ -뢮. + + : + + ଠ ࠭ : + +ID ࠭ - 16 +ID - - 16 + ࠧ饭 ࠭ - 1 (0 - RAM, 1 - Swap) +ᯮ ࠭ - 16 ( 䨧᪨ ࠭ RAM, + ᬥ饭 ᢮-䠩 ࠭) +६ ᫥ +祭 ࠭ - 32 (㤥 ᯮ짮 । + ⮣, ࠭ ⮨ 㧨) + + + ଠ : + +ID - 16 + - 2 (00 - , + 01 - ⥬ ⥪, + 10 - ਪ ⥪, + 11 - ਫ. + ᮢ饭 㣨 䫠) +ਮ - <8 (0 - ᨬ) +ﭨ - <8 (믮, , ⠭, ..) +ID ࠭ ᬥ饭 0000h | +ID ࠭ ᬥ饭 4000h | \ 16 ᮮ⢥⢨ ன +ID ࠭ ᬥ饭 8000h | / ଠ樨 ࠭ . +ID ࠭ ᬥ饭 C000h | +=== Cut === + +ਬ砭, ࠢ, ਢ. +ࠦ ( ⨫ "䨣 㦥 ਭ") ⠪ ਢ. + +Good luck. + Stas + +--- "" 3.0.1 + * Origin: gui is good, but console better (2:5080/172) diff --git a/docs/reference/SPRINT2K/SPRN2K54.TXT b/docs/reference/SPRINT2K/SPRN2K54.TXT new file mode 100644 index 0000000..e4dd1a4 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K54.TXT @@ -0,0 +1,63 @@ +*** Area: ZX.SPECTRUM Date: 26 Jun 137 11:45:13 +*** From: Denis Parinov (2:5030/529.48) +*** To : Andy Harchenko +*** Subj: ... + + ਢ⢮ ⥡, Andy! + + Monday May 21 2001 Andy Harchenko -> Denis Parinov. + + AH> Don't cry, Denis! + +I won't cry! + + DP>> ⠭ , ⠪ ᯮ - + DP>> 祣ᥡﭥp⠢饣 p. + DP>> P.S. H祣 筮, p ⢥ + DP>> 믠. p, PC, + DP>> " 堫". + AH> ᥣ 㭪: + AH> 1) 孨᪠ প ᨫ ஭ + AH> 짮⥫ + +p. , bug-fix', , +p. + + AH> 2) 襢 ᪮ + +, 묨 p :) + p p, p㬮᪨ p . + pp p. 㤥. + ᮣᥭ ᯥ᪠ pp 㦭. + + AH> 3) ᥬ୮ਧ ⠭ + +쭮 ZX Spectrum. + + AH> 祬 ⢥ ਭ 㭪? + + ? + + AH> 諨 ६, 뫮 ᮡ ࠦ, ⮣ + AH> ᮧ ᢮ ᪮ ᠬ 㯭 + AH> . + +, p, p , ᮡp p ⨪. + p, ᮢ⨬ p㬮 p +⠭p p, ᨤp, , ᪮, p, . + ᮡp 쭨. p 㭨 +p⠢ p㣨 p. + + AH> Sprinter vs PC or Sprinter vs Mac ⮫쪮 ᫨ + + p p, 易 p. + ᥣ ᠫ, ᫨ 祫 HH PC, ⠭ p + Sprinter. p묨 PC p , ⮣ +p. + + 㢠, Denis. + +... 襫 ⠪, - 祣 ࠧ ᪫. +㢨 +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) diff --git a/docs/reference/SPRINT2K/SPRN2K55.TXT b/docs/reference/SPRINT2K/SPRN2K55.TXT new file mode 100644 index 0000000..71d9595 --- /dev/null +++ b/docs/reference/SPRINT2K/SPRN2K55.TXT @@ -0,0 +1,104 @@ +*** Area: ZX.SPECTRUM Date: 18 Jul 37 22:03:37 +*** From: Denis Parinov (2:5030/529.48) +*** To : Sergey Krinitsin +*** Subj: ந⥫ ਭ + + ਢ⢮ ⥡, Sergey! + + Saturday June 09 2001 Sergey Krinitsin -> Denis Parinov. + + DP>> , p . p⨢ p⨪ ᮢ⮢, + DP>> ᭮ p⨪ ᢮ ⪠ ⠢ + SK> , 㦥... 㬨⠬ 騬 PC 饥 + SK> ६ ਭ 祣 (). + SK> ন饣 ७ ਭ + SK> . + + p 筮 . ⮬ p p. + ( 뫮 p), ⠪ +㡥⥫쭮 . + + SK> ᮧ PC 쬠 ஡筮. + + p ⮫쪮 , p p PC. + + SK> ਬ ᮢ ᯥ᪮ 䨪 + SK> ᪨ ० ਭ? + + 砫, p᪨ pp. + , p室 p pp⪨ . p䨪 +筮 뢠 㤮/p 祬 㤥 +. ᪠ pp p᪮ ⠭樨? +ᯮp p㣮 p, p㣠 業. 祬 +㦭 p᪠ ⠭? H , PC ⮦ , + ⮬ 㯥 讯 $2. + + SK> 㦥, ਭ 筮 㤥 PC, + SK> .. ᮬ, ᮢ + SK> । ਭ. + + 祬 ⥡ ᨬ? , , +p, p, ᪮ ⮦ p pp? + + SK> ॠ쭮 ᮧ  騥 PC. + +p쭮  祫. p ᫨ pᨮ + . H p ᠭ  +᫮ pp. $10000 pᮢ . + + SK> H 뢠, 設 ਭ ᥭ. + + p, 㪠, ⮨ ⮫쪮-, ᫥騥 pp⨪. + 設⢮ p p㪨. :) + ᫠ p " ? p⭮!". + p室 쬠  p訢 p +Sp2000. + + DP>> - p p, ⮡ Sprinter p + DP>> p PC ⮡ 뫮 ᯮ ᮢ p + DP>> PC 㯨 Sprinter. + SK> ᢮⢥ ६ 襬. + + ⮣ 㯠 p 訬 pp⨪? H +⠪ p ⥦ 襢 p 宥 +㤮⢮p. + + SK> PC'譨 ਮ ਭ? + + 㬠 $500. ᫨ 筮, p ⢥p . + + SK>  㬠?  ﬨ. + +:) p p ᫥ p 饭 +pp p? pp pp⭮ p. ⮣ +ᮧ ⫥ ᠫ pp, p㬥 + p. + + SK> H ਮ ॠ騪 㯨訩 ਭ? + SK> ⥩, ᬮ ᯮ짮 㯨 + SK> PC? + +H, ᮢp p ᮢ⨬ p. ᫨ ᫥ +⢮ , ⮣ ⮡ ᯮ짮 ﬨ p㬠 ⮦ +㦭 PC 㯠. p ᠭ p㬮᪮ ⮦ +ᯮ PC. + + SK> 祬 , ॠ騪, ? + + ᠬ p, ok? + + SK>>> . ᬮ 䨫쬮  ⥫ + + SK>>> H룮 䨣 ᮮ⭮襭 業/⢮. + DP>> 쬠 p㬭. windows pp + DP>> PC, Sprintere. + SK>  PC ᠭ ਭ? + + 祭 , 室 pﭭ ꥬ, p p , +p PC ᯮ짮. 2D-Studio, CD-Player, Flex Navigator, Dos +Commander p㣮 ⮫쪮 pp. + + 㢠, Denis. + +... ⢥ ⮩ 娡 ⮫쪮 ᠭ 祫. +--- + * Origin: PETERS PLUS LTD (2:5030/529.48) diff --git a/docs/reference/SPRINT2K/sprn2k56.txt b/docs/reference/SPRINT2K/sprn2k56.txt new file mode 100644 index 0000000..437b5c3 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k56.txt @@ -0,0 +1,28 @@ +*** Area: ZX.SPECTRUM Date: 3 Jul 03 21:54:28 +*** From: Ivan Mak (2:5030/529.24) +*** To : Kirill Frolov +*** Subj: p ZX + + ਢ , Kirill! + + <23:26> Kirill Frolov wrte to Ivan Mak: + + KF> -- ਭ樯 ࠧ稩 . + KF> ਭ樯쭮 ࠧ稥. + + pp ? + +奬 3 p . 97-, pp, AY p⠫ ⮫쪮 p +p㬠, 2000- p⠥  p, 97- p 뫮 +Kempston-Mouse, 2000- . 97- 室 㪠 ⮫쪮 8 , +2000- - 16 ... ... + + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k57.txt b/docs/reference/SPRINT2K/sprn2k57.txt new file mode 100644 index 0000000..8e5d0c7 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k57.txt @@ -0,0 +1,56 @@ +*** Area: ZX.SPECTRUM Date: 8 Jul 03 17:00:54 +*** From: Kirill Frolov (2:5030/827.2) +*** To : Vladimir Karpenko +*** Subj: p ZX + +H RESET, Vladimir Karpenko! + +On Mon, 07 Jul 03 22:24:51 +0400, Vladimir Karpenko wrote: + + VA>> ... pp 㦥 뫨 ⮭ + VA>> pp 客 ᮢ... :-)) + VK> 䨣:) H ⥡ p娢p p pp? + + ᥩ ਭ ଠ쭮 । (vim ਬ) . + 10 _ࠧ_娢஢ ଠ 娢஬ 筮 +. ணࠬ... ਭ ᥩ ਣ +᪠ ᯥ㬮᪨ 襪 ᪠ ⪮ ࠪ᪨ +ᯮ ਭ஢᪨ ணࠬ. ਭ 㤠- + ᯥ㬮᪮ Lara Croft. + + VK> ? H 楯㠫쭮 () ⮢. H! + + H ⮦ 祣 . + +--- [ZX] + * Origin: ⠢ , speccy next! (2:5030/827.2) + +*** Area: ZX.SPECTRUM Date: 9 Jul 03 23:24:44 +*** From: Vladimir Karpenko (2:5020/826.855) +*** To : Kirill Frolov +*** Subj: p ZX + +Hello Kirill + +VA>>> ... pp 㦥 뫨 ⮭ +VA>>> pp 客 ᮢ... :-)) +VK>> 䨣:) H ⥡ p娢p p pp? + +KF> ᥩ pp p쭮 pp (vim pp) +KF> . +, , pאַ p! p ᥩ p MacBuser^xtm. + pp ᢮ 室 ᬮ(pp᪨)! + 直 p -⮬! +KF> 10 _p_p娢p p p娢p +KF> 筮 . pp... pp ᥩ +KF> p ᪠ ᯥp㬮᪨ p襪 ᪠ p ⪮ +KF> p᪨ ᯮ pp᪨ pp. pp +KF> 㤠- ᯥp㬮᪮ Lara Croft. + + :) pp p! ! + +[ZX][Sprinter registered developer][rw1p2][NedoPC] +Bye +--- FIPS/2001 + * Origin: 訡 ⠭ 訡, p +(2:5020/826.855) diff --git a/docs/reference/SPRINT2K/sprn2k58.txt b/docs/reference/SPRINT2K/sprn2k58.txt new file mode 100644 index 0000000..b3d8e8d --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k58.txt @@ -0,0 +1,34 @@ +*** Area: ZX.SPECTRUM Date: 10 Jan 03 12:22:31 +*** From: Ivan Mak (2:5030/529.24) +*** To : Vitaly Pashchenko +*** Subj: NEW SPECCY + + ਢ , Vitaly! + + <13:29> Vitaly Pashchenko wrte to Ivan Mak: + + IM>> 0) SPRINTER (pp 2xIDE py + p HDD BIOS-) + >>> 1) SCORPION + 譨 pp SMUC + MT>>> 2) KAY + 譨 ᪨ pp HDD + MT>>> 3)  py + 譨 ᪨ pp HDD + MT>>> ( 뢮 - ᪠/ᮡp pp ⤥쭮. 奬 y + MT>>> ) 4) PROFI - p p pp HDD ( + MT>>> p ) 5) ATM-turbo 2(TURBO 2+) - p pp + MT>>> . + + VP> Hy y py ??? + + ⢥ ⮫쪮 Sprinter - pp p "p ". + ⮬ ᫥ . + +易 p᪨ ⤥ e-mail: sprinter@petersplus.ru + + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k59.txt b/docs/reference/SPRINT2K/sprn2k59.txt new file mode 100644 index 0000000..17a29e5 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k59.txt @@ -0,0 +1,147 @@ +*** Area: ZX.SPECTRUM Date: 18 Jan 03 15:29:25 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nick Sevryukov +*** Subj: Sprinter + + ਢ , Nick! + + <17:48> Nick Sevryukov wrte to All: + + NS> Hத, ⭮ ⮩ 設. + +祭 p ⭮ᨬ! + 祭  ( ᮡ ᨫ쭮 ... ᮡ :-)) + + NS> ᫠ ᠩ( ), 祭 ࠤ, + NS> ! ࠢ ⥪ ⮣ + NS> (, 筮 ⥪ ⥬ + NS> ९ணࠬ஢ 㧪 設). + +"筮" -  ᪠. p㦨 pp ⮫쪮 p, + p. ⠫쭮 p, ⠪ p⥪p + . + + NS> 饬 ! + + ᠬ p쭮 砭! :-) + + NS> . ᫮ ⫥, ढ୮\ + NS> 樨 :). + + ⠪, pp 祭 㤠. + + NS> 㦠 (祭 䥩 - , + NS> ଠ 䠩, ଠ 16...), ⮬ ᪠ + NS> spectrum.exe ( , ⢥ () + NS> ᯥ (), ⮬ 100% ⢠ୠ), + NS> ⠬ 㦥 ... ;) ࠢ ࠧ ᪠ + NS> spectrum.exe, 䠩 autoexec.bat! + + ᪠, ᪠ ⮫쪮 spectrum.exe, doom.trx, +video.trd, p㣨 pp (ᮡ forth.exe :)) + + NS> ( , ᫨ 롨 樮, 祬 ⮫쪮 ᫥ + NS> - ஢? + + ᫥ ᪮p. + + NS> ᠬ 㤠 - ⪠ \, 㦥 + NS> 뫮 - ᮨ ?) + +... 뫮. ⮫쪮 뫮. ᥩ . (K , ? :)) + + NS> , 室 "० ᯥ㬠" ᪠ TRD 䠩, + NS> . (ࠧ ? 100%!) H , + NS> ᯥ㬮᪮ 設! + +, . p室窮 ⠪, ISA ZX... 奬 +p室 ᢮ ⤠ (⠬ 楫 p奬 2 p. ᫨ p) + + + NS> (.. 祬 ?! 㦭 㦥 , 襣 + NS> ) ࠢ ᤥ -8, + NS> ᨬ-72( 4) ⠢ (ࠧ 2)... + +... 4mb - ! 64mb... ⪭... + + NS> ⮢ ... , ᫥⥫ ( + NS> RS232 祭 誠, ⮬ , + NS> ...), + + ᯥp㬮᪨ p - ! TAPE p㬥! :) + + NS> ਭ毥 ࠫ ( ᠩ + NS> 祣 襫, ஬ ⮣, ਭ. + NS> ?) + +MC6313, pp. DJ600 砫... + + NS> H ⠬ ஥  256, 砥 CGA + NS> ࠧꥬ . 㪮 ⥬ ⮦ ଠ쭠 - + NS> (訩! 16). ᥫ, 饭 , + NS> ᯥ - ᨪ, .. - ७ + NS> ࠡ ⮬. ஡ ࠭窥 www.petersplus.ru + NS> . + +p , 256 梥⮢ 16 ! + p , ⠬ p , p p砥 ⮩, +p p p쭮 - . + p AY-8910 p - ( ZX-Spectrum-a)... + + NS> ⠪ , ᯥ, ᠬ⥫쭠 設 + NS> ᢮ ⥪ன "० ᮢ⨬ ᯥ㬮". + +, ᫮ _ ᢮_. + + NS> , 뫮 ᤥ ⠪. ਭ ⮨ 170$, + NS> 죨 ᫥騩 : 200( + NS> ⮣ 6-2-300\400), ⨢ 128, 2, 䫮, 6 + NS> 14". + +! ! PC , Sprinter! 8:-( ) + + PC p奬, p _᢮ pp_ ⠢? + + NS> H 設 ४᭮ 㫨, + NS> ஬ (⮡ ), ᫨ + NS> , ஬ ন + NS> ⥪, ਭ ⮦ 86. + + p pp x86, ⮫쪮 p p + , ⮬ ᠬ p p... pᯨ +⨣p殢 ... + + + NS> ⮬ 設 ⠭ ⠪!!! .. ਭ .. + NS> ⮬ ᥬ, ⥪ ஬ ਥ⢠, .. + NS> ⠪ 設 ਭ樯 ᢮ 㫨 ମ + NS> - 50, 祣 ⮨.... + + 㫥 ᥫpp, p ᨤ? + 㫥 ᥩ 奬 ? + +pp㧪 奬 pp ⮫쪮 p 祭, + _  p_ pp! +0.5 ᥪ㭤 p⥪p 設 ! + + + NS> ᫥ ᪠, , ᤥ , + NS> ࣠ ⤥쭮 (\) 諮 襢 + NS> ⥩ 뫮 . .. ढ , + NS> ᯥ, ⠢ 稫 ᯥ, + NS> ⥯ ⥪. ᭮, ਤ + NS> - ⠫ ?! + +⠫. 쪮 ⪨ ⠪ ⪠ ⠫. p 祣 諮. +"襢 pp" - ⮫쪮 . p쭮 뢠 襢 +p業⮢ 20, , "栭 墮⮢ 奬", ⠪ ᫠ ⮬ + . + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k60.txt b/docs/reference/SPRINT2K/sprn2k60.txt new file mode 100644 index 0000000..3359a0a --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k60.txt @@ -0,0 +1,185 @@ +*** Area: ZX.SPECTRUM Date: 19 Jan 03 17:33:52 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nick Sevryukov +*** Subj: Sprinter + + ਢ , Nick! + + <00:31> Nick Sevryukov wrte to Ivan Mak: + + IM>> "筮" -  ᪠. p㦨 pp + IM>> ⮫쪮 p, p. ⠫쭮 p, ⠪ + IM>> p⥪p . + NS> , ⥪ 易 H! + NS> 設. ( 类 砥 ਭ) ⮬ + NS> ᪠ 筮. + +H.. ⠪ "p p⥪p"... + - ᥣ p䥩 譨 p⢠ (譨 ⭮⥫쭮 + p...) H p p⢠, p  , +祬 設 p. + + NS>>> 饬 ! + IM>> ᠬ p쭮 砭! :-) + NS> :) ᠬ ਭ 祭 , ᭮, 祬 + NS> ࠭ 8ࠧभ ? 祬 32 ஫ ந ?( ਬ) + +롮p ᤥ p樯: " p". -> Z80. + p 稫 ... 㬮 - ... + + + IM>> ᪠, ᪠ ⮫쪮 spectrum.exe, + IM>> doom.trx, video.trd, p㣨 pp (ᮡ + IM>> forth.exe :)) + NS> ^^^^^^^^^ + NS> H⭮ :) ᪠ ᯥ + NS> ᯥ.. + + spectrum.exe ⮫쪮 ⮬, p䨣p p㧨 + Z80, p⠥ p㬥, 㫥, .. Z80 +ᯮ ... + + + NS>>> ( , ᫨ 롨 樮, 祬 ⮫쪮 + NS>>> ᫥ - ஢? + IM>> ᫥ ᪮p. + NS> H , 祭 宦. + +᫨ pp稪 ⮫ p , :-)) + MS-DOS 뫠 ⮫쪮 䠩 ⥬, ⠫쭮 - ᢮... + ⮣ p p p 뫮 +㣮 pp p. p⭮ ⮦... + + + IM>> ... 4mb - ! 64mb... ⪭... + NS> 64 த 訡? த ࠡ + NS> । + + p. p 奬 pp 4Mb +ᥩ. +p 奬 - 64 (⮫쪮 奬 ᤥ ᭠砫 :)) + + + IM>> p , 256 梥⮢ 16 ! + NS> ⠬ ਣ쭠, . + +⢥ :) + + NS> ६ প ᪮쪨 ० ࠭. ( + NS> ⤥ ࠧ, ࠢ ⥬ + NS> 뫠 NeXT`) + + 뫮 NeXT-e? (a, ᠭ, ...) + +[p ] + NS> , ᮡ⢥ . ⥬, .. + NS> 㤠 㣮 . 16ࠧ來 . + + :) p . + + + + IM>> ! ! PC , Sprinter! 8:-( ) + IM>> PC p奬, p _᢮ pp_ + IM>> ⠢? + NS> ⥯ ᠬ ᭮, ⠪ 䨣樨, ᫨ + NS> ᠭ 訩 100% ਭ + NS> ढ , .. 設 ⠪ . + NS> ⠪ 設 ஫ ᯥ宬 . + + 㫠p ... H ᪠ p㫨p ( +p쭮 p!) 奬, p 1700 pp 1700 ᪨ ⮢ +p 42MHz ? ⮣ 㯥p p. + + + IM>> p pp x86, ⮫쪮 p p + IM>> , ⮬ ᠬ p p... + IM>> pᯨ ⨣p殢 ... + NS> ᫨ ࠧ , १ ⠪ , + NS> ࢠ ਭ஬, . 砥 ࢠ + NS> ᮢ⨬ + +H-... ZX-Spectrum- ᪮쪮 ? + 奬 Spectrum-128 ( p⮢) + 砥ﬨ ﭨﬨ FIDO :-) + + + IM>> pp㧪 奬 pp ⮫쪮 p 祭, + IM>> _  p_ pp! + IM>> 0.5 ᥪ㭤 p⥪p 設 ! + NS> ᤥ 㫥? + + ᤥ. 㢥p, ... , p 娢 + 奬, p 믮 42. 㬭 ᥪ㭤 ( p +ᥫpp), p쭮 Z80 p⠥... + + + IM>> ⠫. 쪮 ⪨ ⠪ ⪠ ⠫. p + IM>> 祣 諮. "襢 pp" - ⮫쪮 . + IM>> p쭮 뢠 襢 p業⮢ 20, , + IM>> "栭 墮⮢ 奬", ⠪ ᫠ ⮬ . + NS> ਫ ⮬, 뫮 ᯮ짮 + NS> ᮪⥫㠫 設 ஫ࠬ, + NS> ⥪ ந 㦥 ᢮, 設. ⠪ + NS> ਬ﫨. + + p p祪, p p , p +p䥩. p뭮 , 㦥 pp . + p . 業 :-) + + + IM>> [Forth-CPU] + NS> ^^^^^^^^^^^ + NS> ᤥ... + +. ⮫쪮 . H ᤥ... :-) + + + NS> ᨪ ࠧ. 祬 뫠 ࠭ + NS> 8-⭠ ⥪? + +⮬ ⥫ p. + + NS> 㬠, ஫᪨ 32-ࠧ來 ⮨ + NS> ஦. + + p p ⭮ 㤠 襫 . p ⮣, pp稪 +pp ⮫쪮 p p ᢮ ⮫ :-)) + + + NS> ᮢ⨬ 㣨 殬\⥪ன + NS> १㧪 . 稫 ப + NS> 樨 ᮧ 㣮 ⥪, .. 設 뫠 32 + NS> ࠧ來 ( ᮢ ). + + 뫮. H ᤥ Z80. + Sprinter-e, , ᭮ 16-pp來 奬 p, +32- pp來. p ᫮, _᢮_ pp , +p . + + + NS> ⥯ ⥬, ᠫ, ࠢ NeXT`. + NS> , , ᪠, ⠬ 뫮 ᪮. + NS> ࠡ ࠭ ਬ ᢮ 筮 (.. + NS> ⤥ , ࠡ뢠 ), + NS> PostScript, ਭ஢ ᥩ ᯮ. + NS> 室 祭 ᨫ쭮 ࠧ㦠 , ⠪ 設 , + NS> 砥 প ୮ 䨪 ⭮ ஢, + NS> ࠪ᪨ ⠪ ஥ , ⥡ ࠧ襭 + NS> ०(⠪, ᬠਢ PDF\PS  + NS> 㢥祭 ⢠), . ஬ ( + NS> ⠬ ᤥ ⨠ - 祭 ᮪ ⢠, 㦥, + NS> 祬 ). ⥯ ᯮ, 設 80 + NS> ! (ᤥ 68040 ⠪⮢ ⮩ 25) + + ⥯p ⭮. pp ⠪ p __ ᥩ. +H ᥣ-ᥣ 9998 . p p㤠 pp稪 :-) + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k61.txt b/docs/reference/SPRINT2K/sprn2k61.txt new file mode 100644 index 0000000..69947bf --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k61.txt @@ -0,0 +1,35 @@ +*** Area: ZX.SPECTRUM Date: 20 Jan 03 15:47:07 +*** From: Ivan Mak (2:5030/529.24) +*** To : Maxim Timonin +*** Subj: Sprinter + + ਢ , Maxim! + + <01:19> Maxim Timonin wrte to Ivan Mak: + + >> 롮p ᤥ p樯: " p". -> Z80. + >> p 稫 ... 㬮 - ... + + MT> 祬 Z180? , ᪠ Z380, , ਬ, + MT> AZX? ஭ ᮢ⨬ Z80 + MT> ணࠬ, 㣮 ஭ 32-⭠ ࠧ來 ࠡ + MT> , ᪮ । 33 (ᥩ 蠫, 㦥 + MT> 50 ). ⢨⥫쭮 뫮 த ࠧ + MT> ⢨ ᨭ-? ⥪, த ... + +Z180 ᮢ⨬ p㬮. p 祬 ᮢ, ᥬ +p襭 p. Z380 , ⮬ ᨫ쭮 p ( ⮬ , +᭠p㦨 16 , 32 ⮫쪮 p). ᥩ pp⨫ ᪠, +⠪ pp p. Zilog ⨫ eZ80, +50MHz . 쪮 ᮢ⨬ . H, +Zilog-, - p p ᮡp, 砥, + ᯥp㬮᪨ p - . H. .. .. + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k62.txt b/docs/reference/SPRINT2K/sprn2k62.txt new file mode 100644 index 0000000..cae2f30 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k62.txt @@ -0,0 +1,144 @@ +*** Area: ZX.SPECTRUM Date: 20 Jan 03 15:48:30 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nick Sevryukov +*** Subj: Sprinter + + ਢ , Nick! + + <00:29> Nick Sevryukov wrte to Ivan Mak: + + NS> H ⠪ ᪠, ᫨ 設 ࣠ 16ࠧ來 設, + NS> ⮩ 設 32ࠧ來 ᤥ, 訢. + NS> 㦤? + + ⮣, 뢠 "32-pp來 ". p +室 128 pp冷 p p쭮, +16-pp來 設 -... + + + IM>> 롮p ᤥ p樯: " p". -> Z80. + IM>> p 稫 ... 㬮 - ... + NS> H 祬 ࠧ , ஫ 祭 﫨, + NS> ᯮ ਬ Spectrum QL, 2\2, ⮬ .. + NS> (쭨 :) + +H p, p ! :-) +㬠 p栬, p㬥... + + + NS> ਬ ᢮ 䠩 ⥬,  㣮 + NS> ⥬ 䠩 ஢, ⠪ 稭. ( 筮 + NS> 祬 뫮 ᤥ, ० ᥣ ᪨ 稭, .. + NS> - ᢮ - , ண 㤠筮) + + pp 蠥 ᢮ 䠩 ⥬. + . p稪 ⮪ :-) + + + IM>> p. p 奬 pp + IM>> 4Mb ᥩ. p 奬 - 64 (⮫쪮 奬 + IM>> ᤥ ᭠砫 :)) + NS> 訢 . + +H, :-))) + + + IM>> 㫠p ... H ᪠ + IM>> p㫨p ( p쭮 p!) 奬, p 1700 + IM>> pp 1700 ᪨ ⮢ p 42MHz + IM>> ? ⮣ 㯥p p. + NS> ਫ, 㫨஢ , ਫ, + NS> ஫, ஢᪠ 믮, .. + NS> 䨣樨 ன ⥬. (- ⨯ + NS> ). + + , ᫮. ⮬ , pᮢ 奬, p +p p樯쭮 㫨 ᯮᮡ. + +H, pp, : SX=LCELL(LCELL(!SX)); RX=DFF(SX,CLK,,); + . p 拉 ! ( 0.1% pp.) + + NS> ࠧ , ॠ 祭 ࠢ + + p, p. :) , 砫쭮 뫠 ᫨誠 ⠢ +486- p 㤠 㫨 , ⮬ ⪠... p p +諠. + + + NS> ᮢᥬ , ਫ ⥫㠫 設 + NS> ਭ , .. 㦥 㤥 , 設, + NS> ⥪ன. , ᥩ , + NS> ७ - \, .. - ⨯ , + NS> ⮫쪮 . + +- ᮢᥬ ... + ᯮ짮 pp HDD, FDD, KBD, MOUSE ..? + +, ⪨ p p . + p ⮫쪮 奬 㦭 pp, PCI pp, +pp , p, ᥣ !.. + + + IM>> p p ⭮ 㤠 襫 . p + IM>> ⮣, pp稪 pp ⮫쪮 p p + IM>> ᢮ ⮫ :-)) + NS> ᠫ - ஫ - ⮫쪮 ( ⠬ + NS> NeXT ) + +H ⠪  砥 p :) + + + IM>> 뫮. H ᤥ Z80. + IM>> Sprinter-e, , ᭮ 16-pp來 奬 + IM>> p, 32- pp來. p ᫮, + IM>> _᢮_ pp , p . + NS> 稫 祭 . .., 設 ᭮ + NS> 16 ࠧ來?, ⮣ Z80 ⨫ ( ⮩ -奬, + NS> ᠩ ). + NS> 32ࠧ來 設 . ᭠ 設, 16ࠧ來? + + p騢 祣. ⨯p/⨯p 8<->16 設 . + p , ⢥. p Z80 - 16, - 17, SIMM - 24 +( ⮦ p騢 p ). + + + IM>> ⥯p ⭮. pp ⠪ p __ + IM>> ᥩ. H ᥣ-ᥣ 9998 . p p㤠 + IM>> pp稪 :-) + NS> , 㬠, ⨢ ⨫ 10 ᮧ + NS> 楫 NeXT, 㦥 . + + p, ⮫쪮 . +H 設, pp 祩 :-) + + NS> , , 塞 ਭ 祭 + NS> , ஡ १ ᨭ, + NS> ᥣ , ᫨ ᥬ 㤥 , ஢. + NS> .. ᫨ ⥬ , ⮬ 㪮, + NS> ⮬ ᮯ, ⮬ 䨣 + NS> ᯮ짮 16ࠧ來 設 , 墠 + NS> ? 塞 ⥪ 楫 ᫠-, .. 設 ᥣ + NS> -8, ⮫쪮 ᫮, ⥪ ᮡ + NS> ਬ. + +H, ᠬ p 砥, ⠪ p. H , EP1K30 +⠥ EP1K50 EP1K100. ᫥, ᮮ⢥⢥ 3 p 祬 +, ᥩ ⮨. + + p㣮 p, ᥩ ᯮ, ⠬ +, pp , -p, AY, ᯥp㬮᪠ p, + ⮭-, -ᥫpp, ... ᥣ... + + ⭮, AY p㣮 . p㬮 p +p, ⠪ p㣮 pp ( pp), ⮦ - +᢮ , 㤠 - ... + + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k63.txt b/docs/reference/SPRINT2K/sprn2k63.txt new file mode 100644 index 0000000..e3d733f --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k63.txt @@ -0,0 +1,27 @@ +*** Area: ZX.SPECTRUM Date: 20 Jan 03 16:04:55 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nick Sevryukov +*** Subj: FORTH + + ਢ , Nick! + + <12:52> Nick Sevryukov wrte to Kirill Frolov: + + NS> H ⮣ 㬠 譥 প + NS> 32ࠧ來 樨(㬠 ⨫, ᨬ⨧ ;), + NS> 16ࠧ來 ⥪ ᤥ 㤥 , ⠪ 2 祩 + NS> ⥪ 砥 32ࠧ來 ᫮. ( ࣠ 3 + NS> ⥪ ld 㤥 ண 㤮⢨, .. + NS> ७ ⮫쪮 , ᪠뢠 8ࠧ來 z80) + +, pp 㬥 ld p 256 ⮢ 墠 + p⭮ 㪫뢠... (ᥫpp 㭪 :)) + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k64.txt b/docs/reference/SPRINT2K/sprn2k64.txt new file mode 100644 index 0000000..a223469 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k64.txt @@ -0,0 +1,35 @@ +*** Area: ZX.SPECTRUM Date: 21 Jan 03 16:37:47 +*** From: Ivan Mak (2:5030/529.24) +*** To : Maxim Timonin +*** Subj: Sprinter + + ਢ , Maxim! + + <21:46> Maxim Timonin wrte to Ivan Mak: + + MT> 砩 ⮬ : ALTER ᠬ Z80 㫨஢, + MT> , Ay 稬? + +. 쪮 , . ⮬ p Z80 +᫨誮 ( p⠭ Z80 p ). + + MT> ᫨ , ⮨ 㬠 ⮬, ⮡ 㫨஢ + MT> Z80, த "ࠧ來" Z80-ᮢ⨬ + MT> , ⥫ ஬ . .? + MT> Z380 䨣 㦭. ᥡ ᮧ 㤥... + + ⮬ ⮫쪮 㬠. p⨯ p p殢 . + 祬 Z80 ᨫ p離 p⥪p . + ⭮ 32-塨 pp ⮩ 14MHz, 1 ⠪ + pp 1/3 , pp ⮨... (p浪 600 祥). +ᠬ p⮩ pp 16 - 160 祥, 10% ... + + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k65.txt b/docs/reference/SPRINT2K/sprn2k65.txt new file mode 100644 index 0000000..f40fbfa --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k65.txt @@ -0,0 +1,122 @@ +*** Area: ZX.SPECTRUM Date: 21 Jan 03 16:44:15 +*** From: Ivan Mak (2:5030/529.24) +*** To : Nick Sevryukov +*** Subj: Sprinter + + ਢ , Nick! + + <20:14> Nick Sevryukov wrte to Ivan Mak: + + IM>> ⮣, 뢠 "32-pp來 ". + IM>> p 室 128 pp冷 p p쭮, + IM>> 16-pp來 設 -... + NS> 32ࠧ來 ⥪ 易 32ࠧ來 + NS> 設 . + + ᫨誮 p孮⭠, p p... + USB - 1 - , 㦨 1- pp. + + + IM>> H p, p ! :-) + IM>> 㬠 p栬, p㬥... + NS> , 稫 ᯥ, 設 ᮢ⨬ + NS> . + +H 稭 祣? :) + p⮣ pp 筮 p㬠. p p⨯ + 256- p㬠 祩 p p... + + NS> 業 祣 . ᭮, + NS> ਭ(筮 ⢥, ᫨ ᪠ ⠩) 㯨 + NS> ਭ ᥡ ? (⮫쪮 ⮨ , ࠧࠡ, + NS> 饭, 㤭) + + 㯨, ⢮ ᥩ p... + + + IM>> - ᮢᥬ ... + IM>> ᯮ짮 pp HDD, FDD, KBD, MOUSE ..? + NS> , 祬 ⮩ 設\஫ ᢮ , ᢮ + NS> ணࠬ ᯥ祭, .. ᤥ ᫥騩 蠣 + NS> ஥. + +騩 蠣 ᢮ , 㦮. ⠬ ᢮ +.. 祭. ? pp +祬 訥, 祬 pp pאַ 㦨騥 pp... ⮬ , +ᯮ짮 _㦮_ p ... + + + IM>> , ⪨ p p . + IM>> p ⮫쪮 奬 㦭 pp, PCI + IM>> pp, pp , p, ᥣ !.. + NS> 楫 . ᫮ 孮, + NS> ᠭ ⮣, 饩 楯樨 設. + + ⠪ . + + + IM>> H ⠪  砥 p :) + NS> ࠧ . 稫, . 稫 + NS> ᠬ⥫쭠 設, 業 뭮 ᯥ ᪮॥ ᥣ + NS> , . + +, _稫_. 稭 p㬠. 稭 +㬠, ⢥ ᪠箪 設... + + + IM>> p騢 祣. ⨯p/⨯p 8<->16 + IM>> 設 . p , ⢥. p Z80 - 16, + IM>> - 17, SIMM - 24 ( ⮦ p騢 p ). + NS> ਣ쭮, , ࠧ來 設 + NS> , ⮡ 뫮. + +p pp來 . H , ⠪ :-)) +H, 㬠, 16 p? ᢮ ok! 奬 pp +p p業 ᥩ . 묨 ⮣ p... + + + IM>> p, ⮫쪮 . H 設, + IM>> pp 祩 :-) + NS> , ⨢ ୮ 㦥 뫮, ⮬ 襢 + NS> 稫 ;) ᢮ ᪨ (뢠 + NS> ⮦ ) Apple ( 祫, ண ᭮⥫ ) + NS> ᮡࠫ ࠦ. + + ᢮ p p ᮡp p, p᪨ pp뢠 +p p 㭨p :-) + + + NS> , ᯥ ⭮ , ⮣ + NS> ᮢ⨬ ⠭? + + ⠭. 㤠 . ⮬ ⨢ spectrum.exe +᪠ pp㧪 . H 奬 㣮, ᫮ +⮫쪮 - ⠢ 奬 pp㧪 p訢 p祭 +p㣮 ... + + NS> ⮬, ।⠢ ९訢 ਭ, + NS> ந室 業ࠫ (.. ᢮ , + NS> ᯫ 易⥫쭮 ﭮ ᪠ ᢮ + NS> 易⥫쭮 ᤥ - ⠭), 祭 + NS> 訥 ࠡ ᮢ⨬ ।, ⨬ + NS> ன, ࠭ ᢮ 訢? ᫨ ࠡ + NS> , ⠭? + +᫨ p誠 p⠭ p , . +᢮ p訢 p誨 . ⮣ - 㦥 ... + +p祭 , p㬥, 業p (ᥩ ⮣ , + pp ). p訢 ⮦ 業p . p +BIOS, p ⮫쪮 묨 p訢 ... + +, ⢥, p訢 ⠭p 奬, + 㣮 ᢮ ... + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k66.txt b/docs/reference/SPRINT2K/sprn2k66.txt new file mode 100644 index 0000000..a2eef4b --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k66.txt @@ -0,0 +1,36 @@ +*** Area: ZX.SPECTRUM Date: 22 Jan 03 19:26:56 +*** From: Ivan Mak (2:5030/529.24) +*** To : Vadik Akimoff +*** Subj: Sprinter + + ਢ , Vadik! + + <19:29> Vadik Akimoff wrte to Ivan Mak: + + VA> ᭮, 業 ⨫ (, ᮮ⢥⢥, + VA> ⮨) ᨭ ⠪ ⢥ , + VA> ஫ - 襪? + +pp - - 91 祩 - 5% LCELL-s, 2048 - 8% RAM +pp 誨 - 71 祩 4% LCELL-s, 0% RAM +AY - 255 祥 - 8% LCELL-s, 2048 - 8% RAM + +⮣: 17% LCELL-s, 16% RAM, .. pp 1/6 ... + + p, pp - AY - pp . + + + VA> , ᫨ (xZ80?) 㤥 ᠬ 訢 檫, + VA> 㤠 ᮢ⨬ ᯥ? + + p訢 , p _p㦠_ ᪠  ... + + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k67.txt b/docs/reference/SPRINT2K/sprn2k67.txt new file mode 100644 index 0000000..da6300e --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k67.txt @@ -0,0 +1,100 @@ +*** Area: ZX.SPECTRUM Date: 23 Jan 03 19:09:32 +*** From: Ivan Mak (2:5030/529.24) +*** To : Vadik Akimoff +*** Subj: Sprinter + + ਢ , Vadik! + + <20:36> Vadik Akimoff wrte to Ivan Mak: + + IM>> 뫮 p ᢠ (p 뫨). + VA> 祬, ᭮, ᢠ? + +⮬ p, p p 㦭... + + + IM>> p, pp p㬠 ᤥ, ᪨ 稯 + IM>> ... , 㢠 ? + VA> H , 㬠? ⢮ 䠭⠧ 㯥஥ + VA> ࠭祭 ਭ஬? :-)) + +--... +" 栬 - " (c) pp... + + + + IM>> Hp 祬? Hp - ⭮⥫쭮 ⨥... + IM>> __ p... + + VA> . ᠬ ᪥ qnx' ᪮. + VA> 襬 ⮢ , ਬ, 宬, ⮬ ⨬. + VA> 祬 ᪠ - ⠪ 㯥, ਭ, ᬮ + VA> 񧭮 প ᨤ ᮡ // + VA> 䨤⮬ :) + +  p . + pp cd-rom 㦥 p . +H p p, pp 謮⪠ p __ +pp, 祣 p⠫, p TR-DOS- p +ᮢ⨬ p㬮. + + ⠢ (p ᯥp㬮᪮) ᪮ - p +p⠫ ... + + p p p樮 ⥬ ( +96-?), p 䠩 ⥬, ⠢ p㣮 p. (pp뢠 +Z80)... .... + +H 室 ᤥ 襣 ᮯp⨢. ⭠ 䠩 +⥬ ᤥ 쭠 p TR-DOS-... (, , + p p 諠 p㬥, p). ᫥ 祣 +p p⨥ 設 p쭮 砫 pp⪠ ... + + + IM>> 祬? p pp 㫨... + VA> ⥬,  㬠, 㤠 죨 - ਭ + VA> - 㣮 (ਬ, )... + + pp᭮. 롮p ... + + + VA> - ਬ 㬭ﬨ ਢ, ⮡ '蠯 + VA> ᫥⥫'? - ᫥? 4 + VA> 冷 ( ) 㬭 ᥪ㭤 , + VA> ⮣? + + p pp, p ⨦. .. p +pp⨪, p 祬- p ᤥ 뢮. +( ᠬ 뢮 뢠.) + + + IM>> 祬? _ _ pp. + VA> , ᪠뢠 ᢮ ࠦ ஥ + VA> ਭ. 䨪樨 㢨 ? ? + + ⥬ ? - ⠭. ⥬ + " pp p", .. p訢 . + +᫨ p p , p p⥩ p⨢ 몠 FORTH + + ⥪: DUP, DROP, OVER, SWAP, LIT + ⥪ p⮢: R>, >R, R@, R-1 (R> 1- >R) +᫮/᫮ p室: BRANCH, ?BRANCH, EXIT, ?EXIT, ADINT (CALL) +p䬥⨪/: ADD,SUB,ADC,SBC,AND,OR,XOR,MUL_STEP,INC,DEC,SHL,SHR... +.: (p 㪠⥫ﬨ ⥪, p p). + +p⥩訥 ᯮ ⠪. ⥪ p, ⮬ 直 +DUP/DROP .. ⠪... , p, 14MHz... + + p. - , - ᪠. +⤠ 室 pp - . ... + + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k68.txt b/docs/reference/SPRINT2K/sprn2k68.txt new file mode 100644 index 0000000..a3fff3a --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k68.txt @@ -0,0 +1,23 @@ +*** Area: ZX.SPECTRUM Date: 30 Jan 03 21:48:01 +*** From: Ivan Mak (2:5030/529.24) +*** To : Andrey Tihanov +*** Subj: Sprinter + + ਢ , Andrey! + + <19:46> Andrey Tihanov wrte to All: + + AT> ᠡ ? ᠬ ⮢? + + ⮢ - . + ⮢ 㯨 p p . + e-mail: sprinter@petersplus.ru + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k69.txt b/docs/reference/SPRINT2K/sprn2k69.txt new file mode 100644 index 0000000..c74d69e --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k69.txt @@ -0,0 +1,34 @@ +*** Area: ZX.SPECTRUM Date: 1 Feb 03 22:04:41 +*** From: Ivan Mak (2:5030/529.24) +*** To : Slavik Tretiak +*** Subj: Sprinter + + ਢ , Slavik! + + <02:31> Slavik Tretiak wrte to Ivan Mak: + + IM>> y ⮢ - . + ST> ? 奬 pp - p᪠ ⠩? + +奬 - . p᪠ ⠩ - p . + + ST> .. ᪮쪮 砧 ⮨ pp min 䨣yp樨, p + ST>  py ᯥ? + + 쭮 䨣p樨 115$ + + ST> ... ⠬ y p쭮 y? p ? + + ᪮쪮 . + 97-  p묨... +⮬, 2000- 뫨 p p. + p쭮 砭 - 堫... + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k70.txt b/docs/reference/SPRINT2K/sprn2k70.txt new file mode 100644 index 0000000..0b8ed19 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k70.txt @@ -0,0 +1,28 @@ +*** Area: ZX.SPECTRUM Date: 3 Feb 03 19:21:40 +*** From: Ivan Mak (2:5030/529.24) +*** To : Aleksey Tarasow +*** Subj: UTF-8 + + ਢ , Aleksey! + + <11:13> Aleksey Tarasow wrte to Vadik Akimoff: + + AT> ( 5 楢 ) ᨬ ( ) + AT> 諠 ਭ 㤠 ᬮ + AT> 192192 (ࠧ 訡, ⨬). 筥 + AT> ଠ 䨫쬠 뫮 + + "p": p 160x128 - p (ᥫ 2x2). +p 䠩 ᢮ - p - pﬠ p⨭ 㪮 p. +H pp 20 砫 䨫쬠, pp 600. + +p 䨫 98- ᪢ FunTop98. + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k71.txt b/docs/reference/SPRINT2K/sprn2k71.txt new file mode 100644 index 0000000..d1d61df --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k71.txt @@ -0,0 +1,105 @@ +*** Area: ZX.SPECTRUM Date: 4 Feb 03 16:20:59 +*** From: Ivan Mak (2:5030/529.24) +*** To : Vadik Akimoff +*** Subj: Sprinter + + ਢ , Vadik! + + <20:21> Vadik Akimoff wrte to Ivan Mak: + + IM>> p 3 祩 p 祬 pp p, + IM>> 譥 p⠫. + VA> , ஫ 3 祩? -ਭ? :) + + p稭 室 "-p" ? :-) + ⮬, pp _ ᯥ_... + ⮣ 㦭, ⮬ _ᯥ_. +H⨥ - 몠 . 奬 40 祩 ! +(p㬥, p 㯮 40 祩, 㦥 祭) + + + IM>> -... H... p ᨭ p + IM>> pp... 䨣... ᨭ ᢮ _pp_. + VA> 訡 ᪠ + VA> '९諨- ᫥ '? ᫨ -> ஫, + VA> ⪮ :) + +H, -祭 p᭠ p ⮣, " pp" :-)) + + + IM>> H 䨣. ⮣ pi/2 祥 ᨭ ... p + IM>> ᨣ pp , + IM>> pp ᪮쪮  p... 易⥫쭮 + IM>> eeprom, ... + VA> , 祣- ⮯ 䨣 ࠭. + + ⠬, -⢮, p CMOS ? :-( ) +䨣 - p㣠 ... + + + VA> ⮬ , ᨣ ? - . + + ⮫쪮 ⮬, pᨫ. ᠬ ᨣ ... + ppp 祭 ⮫쪮 ... + + + VA> , ᤥ ६ + VA> ।ᬮ५ ᮡࠥ, 㣨 ᤥ ⥬ + VA> ... + + 㦥 p! + + + VA>>> -, , , 奬 㤥 ᨭ + VA>>> ५稢... + IM>> , pp 㤥 pppp... - + IM>> 䨣... + VA> ? 10 ᥪ㭤 १㧪 訢... + + p訢 10 ᥪ㭤 ᤥ?? + ᠬ p訢 ᨭ 0.5 ᥪ㭤 ... + +[skip p ] + VA> '' த 㤥 ਤ 㦥 + VA> 饬 誨? ⥡ 誠 + VA> ௮? + + pp? , - pp +⥬, ᨭ... + + + IM>> :) H 42- p p ⠪, AY + IM>> ⫨ :-)) + VA> ⠪ ମ, ⮫쪮 , ⫨ - ⠪ + VA> ⭮⥫쭮... , 䠭⮯ ⮦ ਫ, ⢨ + VA> 饩 - ... + + p쭮 p. _H _. ⮬ 騥 AY 㦥 3 +ᤥ. + + + IM>> - p p. ⥡ pp , + IM>> AY ? + VA> , ⠪ ஫ - msp430, -ay + VA> ஥ 稪 ᫥... + + AY-3-8910, 楫 AY :-)) + + + IM>>>> Hp쭮 ⮫쪮 ⮬ Z80... + VA>>> H , ⮬ 冷 ⠢ :) + IM>> ⮨. 쪮 .p⠬ p⠫. + VA> 㬥஢ :) + +p! H 㬥p , +p p⠫ Z84C00 p⠫ Z84C15... + + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k72.txt b/docs/reference/SPRINT2K/sprn2k72.txt new file mode 100644 index 0000000..16c8dfd --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k72.txt @@ -0,0 +1,34 @@ +*** Area: ZX.SPECTRUM Date: 4 Feb 03 16:25:02 +*** From: Ivan Mak (2:5030/529.24) +*** To : Vadik Akimoff +*** Subj: Sprinter + + ਢ , Vadik! + + + <20:33> Vadik Akimoff wrte to All :): + + VA> ⥫ ⮯殢. ᫮ + VA> ⨯ 68k, ppc, etc. ଠ묨. ࠢ ⢮ + VA> ॣ஢, ᤥ ᪮쪮 ஢ ࠡ뢠 + VA> , ᨬ 㣠 室-室 + VA> ᪮쪮 ⠪. ⨬ ஢? + VA> ⮫쪮 ⥪ १⮢ ।? + + p-pp. + p-pp __ ⥪ (뢠 , , pp, 4 +⥪). p-pp ⥪ p pp, 砥, +pp, 離 CALL-RET p p-pp ᯮ 1 +⠪. p ⮣, p-pp 筮 訬 ᫮ , +⮬ ᫮ p ᪮쪮 , ᯮ 1 +⠪ ( p p "p" p-pp). ᨭ ⠪ 㦥 +ᤥ, 墠... + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k73.txt b/docs/reference/SPRINT2K/sprn2k73.txt new file mode 100644 index 0000000..ae3d0d6 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k73.txt @@ -0,0 +1,18 @@ +*** Area: ZX.SPECTRUM Date: 14 Feb 03 12:54:59 +*** From: Ivan Mak (2:5030/529.24) +*** To : All +*** Subj: p Sprinter 㯭 www... + + ਢ, All! + +Subj: http://www.petersplus.com/download/sp2k_sch.pdf + + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k74s.txt b/docs/reference/SPRINT2K/sprn2k74s.txt new file mode 100644 index 0000000..8030f2c --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k74s.txt @@ -0,0 +1,24 @@ +*** Area: ZX.SPECTRUM Date: 8 Jun 03 23:12:42 +*** From: Vladimir Karpenko (2:5020/826.855) +*** To : Vitaly Mayatskih +*** Subj: p ZX + +Hello Vitaly +VM> p ⥡ p, Vladimir! + +VM> 07 03 15:32, Vladimir Karpenko Sergey Zuev ᫥饥: + +SZ>>> p pp⪨ ⠪ ⠡ ZX +SZ>>> (p pp). +VK>> Sprinter 97 +VK>> Sprinter 2000 +VK>> Sprinter 2000s +VM> 祬 ᫥ p᫥ ⫨砥? +H p㣠 , p p ⮨ ᫨ 㦭 pp ⠢, ⠪ +᫥ ⮨ pp, ⠪ p 䠪p ! + p 뢥 +12 +5. + +[ZX][Sprinter registered developer][rw1p2][NedoPC][A600HD] +Bye +--- FIPS/2001 + * Origin: pp - ᮢ (2:5020/826.855) diff --git a/docs/reference/SPRINT2K/sprn2k75vga.txt b/docs/reference/SPRINT2K/sprn2k75vga.txt new file mode 100644 index 0000000..d004193 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k75vga.txt @@ -0,0 +1,21 @@ +*** Area: ZX.SPECTRUM Date: 10 Jun 03 23:42:29 +*** From: Vladimir Karpenko (2:5020/826.855) +*** To : Alexey Kravchenko +*** Subj: p 2003 !!!! + +Hello Alexey +AK> p Vladimir! + +AK> 07 2003 23:24, Vladimir Karpenko ᠫ Sasha Shost: + +SS>>> zx  vga/svga p - 㫨 +SS>>> p⥫쭥 +VK>> pp :) +AK> ? + +H  p:) p:) + +[ZX][Sprinter registered developer][rw1p2][NedoPC][A600HD] +Bye +--- FIPS/2001 + * Origin: 㯥p⮩稢%^#&^%@NO CARRIER (2:5020/826.855) diff --git a/docs/reference/SPRINT2K/sprn2k76.txt b/docs/reference/SPRINT2K/sprn2k76.txt new file mode 100644 index 0000000..3dbdf27 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k76.txt @@ -0,0 +1,84 @@ +*** Area: ZX.SPECTRUM Date: 18 Jun 03 7:19:58 +*** From: Kirill Frolov (2:5030/827.2) +*** To : Alexander Ryabov +*** Subj: p ZX + +H RESET, Alexander Ryabov! + +On Tue, 17 Jun 03 18:50:52 +0400, Alexander Ryabov wrote: + + AR> 쭮 ଠ 2000 - ? + + http://www.petersplus.com. + + AR> , ⢨⥫쭮 㡫 ? + + ? ᯥ㬮 ᮢ⨬, ⠬ ᢮... +H :-/ + + AR> 쪮 ⥪? + + 砫 Sprinter-SDK. setup.exe 䠩 ⠪: + + his program must be run under Win32 + + H Win32 ਭ ஢... + + setup.exe  ।᭠ ணࠬ... ( windows'a C: !) +SDK ⥪⮢ ।஬ ( ਭ ୮ +᪠) ᪠ rw1p ( ⠪ ᥬ). +H ஬ readme ⠬ 뫮. H 㯮⮬ http ⮦ +- ᮡ ⭮. + + AR> , 㬥 ॡ - + AR> ࠧ⮥ ᠭ 2000 ਭ, ਭ97 , , + AR> 筮 ᨫ쭮 ⫨(?), 㦭. + + http://www.sprinter.com +( ⠬ - - , ᮮ⢥ 뫪 ⠫ ) + + Sprinter +ᠫ Sprinter Z80 ௮樨 Zilog. + +- ⥪ +- Sp2000s ⠭ +- 21MHz +- - 4 Mb +- 室 - CGA +- ०: 320x256, 256 梥⮢, 640x256, 16 梥⮢ +- 16 . 梥⮢ +- ⮢ ०: 80x32 ᨬ +- ᪮⥫ 権 +- 16 +- ᮢ⨬ ZX Spectrum +> USD $169 + +Sp2000s (⠭ ) +ୠ Sp2000s, ࠧࠡ⠭ Sprinter 2003 . +- Z84C15 ( 21MHz / 3.5MHz) +- (72 pin SIMM, 7MHz) - 4Mb ( 64 Mb) +- - 512Kb +- (BIOS) - 256Kb +- (ALTERA Corp.) - EP1K30QC208-3 +- ஫ - IDE & FDD +- - ISA-8 +- 㪮 - 16 ८ +> USD $128 + +VGA Converter + RGB->VGA, ࠧࠡ⠭ Sprinter. + +- 75Hz ⨪쭮 +- ISA-8 ᮢ⨬ +- 8Mb SD-RAM +- EP1K30QC208-3 (ALTERA Corp.) +- 8-b + + + AR>  ⮬ - . + + ᥬ, ਭ樯 ⫨稩 Sprinter2K Sprinter97 + . + +--- [ZX] + * Origin: ⠢ , speccy next! (2:5030/827.2) diff --git a/docs/reference/SPRINT2K/sprn2k77.txt b/docs/reference/SPRINT2K/sprn2k77.txt new file mode 100644 index 0000000..abfca29 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k77.txt @@ -0,0 +1,22 @@ +*** Area: ZX.SPECTRUM Date: 20 Jun 03 23:34:20 +*** From: Vladimir Karpenko (2:5020/826.855) +*** To : Kirill Frolov +*** Subj: 쭮 . + +Hello Kirill +KF> H RESET, Vladimir S. Stepanov! + +KF> On Thu, 19 Jun 03 03:35:15 +0400, Vladimir S. Stepanov wrote: + +MT>>> ᮢᥬ ᪮p 멤 ᢥ RGB2SVGA-pp. 㤥 +MT>>> ᮢp , . +VSS>> 뫮 p㫥... + +KF> http://www.sprinter.com. 쪮 ⥡ 業 p. + +www.petersplus.com! 業 祬 :) + +[ZX][Sprinter registered developer][rw1p2][NedoPC][A600HD] +Bye +--- FIPS/2001 + * Origin: ⤠  (2:5020/826.855) diff --git a/docs/reference/SPRINT2K/sprn2k78svga.txt b/docs/reference/SPRINT2K/sprn2k78svga.txt new file mode 100644 index 0000000..b5ef35b --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k78svga.txt @@ -0,0 +1,20 @@ +*** Area: ZX.SPECTRUM Date: 20 Jun 03 22:24:22 +*** From: Aleksey Tarasow (2:5053/51.4) +*** To : Vladimir Karpenko +*** Subj: 쭮 . + +ਢ Vladimir! + +19 03 22:23, Vladimir Karpenko -> Vladimir S. Stepanov: + + MT>>> ᮢᥬ ᪮p 멤 ᢥ RGB2SVGA-pp. 㤥 + MT>>> ᮢp , . + VSS>> 뫮 p㫥... + VK> pp 㦥 :) + +쪮 業 쭮 ॠ쭠. :( 70$ = 2100 . + 뫪 8% + + 㢠, ᥩ. + +--- ifmail v.2.15-BSC.03/FreeBSD + * Origin: - ᫥ 㬥 㯨. (2:5053/51.4) diff --git a/docs/reference/SPRINT2K/sprn2k79.txt b/docs/reference/SPRINT2K/sprn2k79.txt new file mode 100644 index 0000000..ef859c2 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k79.txt @@ -0,0 +1,38 @@ +*** Area: ZX.SPECTRUM Date: 24 Jun 03 17:59:51 +*** From: Ivan Mak (2:5030/529.24) +*** To : Kirill Frolov +*** Subj: p ZX + + ਢ , Kirill! + + <01:30> Kirill Frolov wrte to Ivan Mak: + + KF> H ᠬ ᬮ: , 譠, ⥯ + KF> ⮦ ... ᢮, ।࠭ 譮... ⮦ + KF> . + + 襪 ⮦  ⮫쪮 , - 祭? + + + KF>>> ᥬ, ਭ樯 ⫨稩 Sprinter2K + KF>>> Sprinter97 . + IM>> 祬 p-, ᫨ ?.. + KF> , ᪠뢠 ᢮ . ᮮ⢥⢮ + KF> ⮬, ᠬ . + + ⠥. + p 뫠 p p 97- 2000-... + + - 3 p , +쪠 - 2 p , + - 2 p , + 16 p ... + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k80.txt b/docs/reference/SPRINT2K/sprn2k80.txt new file mode 100644 index 0000000..437b5c3 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k80.txt @@ -0,0 +1,28 @@ +*** Area: ZX.SPECTRUM Date: 3 Jul 03 21:54:28 +*** From: Ivan Mak (2:5030/529.24) +*** To : Kirill Frolov +*** Subj: p ZX + + ਢ , Kirill! + + <23:26> Kirill Frolov wrte to Ivan Mak: + + KF> -- ਭ樯 ࠧ稩 . + KF> ਭ樯쭮 ࠧ稥. + + pp ? + +奬 3 p . 97-, pp, AY p⠫ ⮫쪮 p +p㬠, 2000- p⠥  p, 97- p 뫮 +Kempston-Mouse, 2000- . 97- 室 㪠 ⮫쪮 8 , +2000- - 16 ... ... + + + + ᡥ. ࣨ . 㣫. Ivan. + + - 奬, 쪠... [Sprinter] Sprinter-II [Forth-CPU] + +... ivan_mak@mail.ru * http://winglion.spb.ru * http://www.petersplus.ru +--- GoldED+/386 1.0.0 + * Origin: The Sprinter has You! (2:5030/529.24) diff --git a/docs/reference/SPRINT2K/sprn2k81.txt b/docs/reference/SPRINT2K/sprn2k81.txt new file mode 100644 index 0000000..8e5d0c7 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k81.txt @@ -0,0 +1,56 @@ +*** Area: ZX.SPECTRUM Date: 8 Jul 03 17:00:54 +*** From: Kirill Frolov (2:5030/827.2) +*** To : Vladimir Karpenko +*** Subj: p ZX + +H RESET, Vladimir Karpenko! + +On Mon, 07 Jul 03 22:24:51 +0400, Vladimir Karpenko wrote: + + VA>> ... pp 㦥 뫨 ⮭ + VA>> pp 客 ᮢ... :-)) + VK> 䨣:) H ⥡ p娢p p pp? + + ᥩ ਭ ଠ쭮 । (vim ਬ) . + 10 _ࠧ_娢஢ ଠ 娢஬ 筮 +. ணࠬ... ਭ ᥩ ਣ +᪠ ᯥ㬮᪨ 襪 ᪠ ⪮ ࠪ᪨ +ᯮ ਭ஢᪨ ணࠬ. ਭ 㤠- + ᯥ㬮᪮ Lara Croft. + + VK> ? H 楯㠫쭮 () ⮢. H! + + H ⮦ 祣 . + +--- [ZX] + * Origin: ⠢ , speccy next! (2:5030/827.2) + +*** Area: ZX.SPECTRUM Date: 9 Jul 03 23:24:44 +*** From: Vladimir Karpenko (2:5020/826.855) +*** To : Kirill Frolov +*** Subj: p ZX + +Hello Kirill + +VA>>> ... pp 㦥 뫨 ⮭ +VA>>> pp 客 ᮢ... :-)) +VK>> 䨣:) H ⥡ p娢p p pp? + +KF> ᥩ pp p쭮 pp (vim pp) +KF> . +, , pאַ p! p ᥩ p MacBuser^xtm. + pp ᢮ 室 ᬮ(pp᪨)! + 直 p -⮬! +KF> 10 _p_p娢p p p娢p +KF> 筮 . pp... pp ᥩ +KF> p ᪠ ᯥp㬮᪨ p襪 ᪠ p ⪮ +KF> p᪨ ᯮ pp᪨ pp. pp +KF> 㤠- ᯥp㬮᪮ Lara Croft. + + :) pp p! ! + +[ZX][Sprinter registered developer][rw1p2][NedoPC] +Bye +--- FIPS/2001 + * Origin: 訡 ⠭ 訡, p +(2:5020/826.855) diff --git a/docs/reference/SPRINT2K/sprn2k82.txt b/docs/reference/SPRINT2K/sprn2k82.txt new file mode 100644 index 0000000..69cb456 --- /dev/null +++ b/docs/reference/SPRINT2K/sprn2k82.txt @@ -0,0 +1,319 @@ +*** Area: ZX.SPECTRUM Date: 27 Nov 03 18:40:59 +*** From: Vasil Ivanov (2:5020/1973.51) +*** To : Aleksey Gubarev +*** Subj: Sprinter + + 誨 Aleksey! + + AG> ⥫ 㧭 楢 ( p⠫) + AG> ᯫ樨? + + ᨤ p-128 (᫥ ᮡp p-). p室 p +p ᮡp, - 襫 p pᠬ. +뫨 p⠢ p- ᪮쪨 pp㫨 pp. +p㫨 ;). ᫥ ⠫ ᠭ 㭪権 , - 饬 + pp "楯". p p 㬠: 㯠/ 㯠 +pp ;), .. p室 p . H p訫 㯨 . +pp 2001 . p ᪮쪮 , 㯨 +pp. - ᨤ p p㬠 (᪮쪮 p⮢), - +ᨤ DSS. p. + + AG> H񦭮 + + ᯫ樨 , p 稫. + + AG> 㤮⢮ + + , , PC-譠 - ᠬ ᮡ p㬥饥. - ᮬ- +. ᥩ ᬮp p ( MC7007), p PC-譮 +- ⮩, p 㦥 p뢠. p 㦥 +諥 ⮩ , p 饯 㣮. + - 㬠 ⥡ , ⠪ p, ᫥ + 㤮⢮ . + PC-譠 誠 - 㤥 譥. + +饬 pp ⠭p⭠, ᫨ 뫥 -, 㯨  +. , 4 p p - ;). + + AG> ᮢ⨬? + + ᨦ DSS, 뢠 p p p㬠 ᨦ, p +, ᪮쪮 pp㫨 ᪠. Hp , +p⠥ " p". + + pp ⢥ ⮪ - p "ᨤ" . + 業 "ᠥ" - p祭 . + + + + + 㤠! *_ᨫ_*. + Bye, Bye! + +--- GoldEdit 3.00.Beta3+! + * Origin: p襫, 㢨,... ᫥ (2:5020/1973.51) + +*** Area: ZX.SPECTRUM Date: 1 Dec 03 17:26:30 +*** From: Vladimir Karpenko (2:5020/12000.48) +*** To : Grigory Klimenko +*** Subj: Sprinter + +Hello Grigory. + +01 Dec 03 11:16, you wrote to Vasil Ivanov: + + + VI>> p . H p訫 㯨 . pp + VI>> 2001 . p ᪮쪮 , 㯨 pp. + VI>> - ᨤ p p㬠 (᪮쪮 p⮢), + VI>> - ᨤ DSS. p. + GK> 祬 ࠦ ??? + ⮬ ᬥ ० 筮 :) + GK> 祪??? +Hଠ. ++ + GK> , + ⠬ , ⭮ ? + GK> ⭠ , +ᨫ ਭ , + 뢠 / ਭ, ᠫ fformat( 㯠 +譮), த - ᤥ. + GK> + GK> ( ᯥ㬠)??? + ᨫ -- ਭ. + VI>> 饬 pp ⠭p⭠, ᫨ 뫥 -, + VI>> 㯨  . , 4 p p - + VI>> ;). + GK> 㯠 , ஥ ந⢠? + ந? + VI>> pp ⢥ ⮪ - p "ᨤ" + VI>> . 業 "ᠥ" - p祭 . + GK> ਮ筮 室 H??? + ? 2002-2003 뫮 ᤥ . + +Vladimir + +--- GoldED/W32 3.0.1 + * Origin: (2:5020/12000.48) + +*** Area: ZX.SPECTRUM Date: 10 Dec 03 17:33:50 +*** From: Vladimir Karpenko (2:5020/12000.48) +*** To : Grigory Klimenko +*** Subj: Sprinter + +Hello Grigory. + +10 Dec 03 16:53, you wrote to me: + + GK>>> ଠ ⤥ন??? + VK>> , ⠪ 㤥 ন. ⭮ + VK>> *.wav up to 16bit 44khz. + GK> ᫨ 㬥? +H ⠤, ௨ ⠣  뫪. + GK>>> , 祬 짮??? + GK>>> ᫥ 筮 짮⥫, + GK>>> ਢ. + VK>> H , ⮢ ᨫ ஫. + VK>> 짮⥫? ᫨ 㡨, + VK>> 祣. + GK> ਭ 砥 㤮 , ᫨ ⥡ 㪨 + GK> 祭!? + + GK>>> AT - ⠭, + VK>> ந. + GK> ᫨ ᥪ? + . ⠭ ⠭, +奮孨. + GK>>>>> ਮ筮 室 H??? + VK>>>> ? 2002-2003 뫮 ᤥ + VK>>>> . + GK>>> H 饩 ᫮? + VK>> ..? + GK> H ᫨ ᪮쪮 ।஢ ⥬, + GK> ᤥ 20, ??? + 直 , . + GK>>> ⮬ ? + VK>> H. ᫨ ஢ /ନ , + VK>>  ਭ஢ ନ. + GK> subj ﬨ 頥??? +H , . H 㬠 㤥 ᤢ, .. ( +࣠ ਭ) , 㤥 H ।. + +VK>> ᠬ , ⢥ ⢮ + VK>> :) + GK> H 98 ⮢ ஡ ਮ⥭ + GK> H⠪. + GK> H 㬠 㯫 , ᬮ , ᯮ짮, + GK> ஡ ᪥ 㤥!? + GK> H 㬠 , ᬮ 㤥 . + GK> ॠ쭮 뢠⥫, 㬠 த + GK> ... 뢠 ⮫쪮 , + GK> ࠧ !!! +H . + GK> 砥 5 ᤢ ࠧ⨨ subja + GK> ࠪ᪨ !? + ࠢ. 諠 , 1,66, +2.0. ࠡ⠭ ஢ 䨣 ᯮ ன +Thunder in The Deep. + + GK> ٳ Ŀ + GK> --- ݳij¿ _-_ --- + + GK> -+- [ICQ_155332789] --- [klim_ohg@mail.ru] --- [xxl_association] --- + GK> + Origin: +++ , !+++ (2:5061/33.40) + +Vladimir + +--- GoldED/W32 3.0.1 + * Origin: (2:5020/12000.48) + +*** Area: ZX.SPECTRUM Date: 19 Dec 03 17:56:00 +*** From: Vladimir Karpenko (2:5020/12000.48) +*** To : Maxim Malozemov +*** Subj: ... + +Hello Maxim. + +19 Dec 03 15:19, you wrote to All: + + + MM> ...ਭ ? +, 뫮, ..  ᯮ. + + MM> . ਭ? +Thunder in the deep. 쪮 . .. +㫨. +Vladimir + +--- GoldED/W32 3.0.1 + * Origin: (2:5020/12000.48) + +*** Area: ZX.SPECTRUM Date: 9 Jan 04 20:11:42 +*** From: Alexey Luskin (2:4501/4.9) +*** To : Vladimir Karpenko +*** Subj: Emuls ZX + + Hail, Vladimir!!! +08 ﭢp 04 _Vladimir Karpenko_ ᠫ *Alexey Luskin* + ⥬ "Emuls ZX" + + + +VK> pp? p ? ᫨ -97 +VK> -0 -1. +VK> Vladimir + + "SPRINTER 2000". BIOS pᨨ 3.00, DOS pᨨ 1.60. + ⠬ p pp稪 稫? p p - p. +p ᠩ pᮢ - 뤠 ᯫpp -. +p p 뫨 ⮡ "SPRINTER" (sVGA) +p㡠. + ⮣ ᢮ 6105 모, ⮪ (pp 㤠 +⠢). ᬮp ᯥ᪨ p 㫥 - , +6105 ;)) + + H . +[]> =CARCASS= -Blood Spattered Banner- +--- FIPS/Phoenix ---+++--- + * Origin: ZX-SPECTRUM - RLZ 4ever!!! (2:4501/4.9) + +*** Area: ZX.SPECTRUM Date: 10 Jan 04 11:02:10 +*** From: Vladimir Karpenko (2:5020/12000.48) +*** To : Alexey Luskin +*** Subj: Emuls ZX + +Hello Alexey. + +09 Jan 04 20:11, you wrote to me: + + + + VK>> pp? p ? ᫨ -97 + VK>> -0 -1. Vladimir + + AL> "SPRINTER 2000". BIOS pᨨ 3.00, DOS pᨨ 1.60. + ᮡ:) + AL> ⠬ p pp稪 稫? + ⠫. ਮ 祢 諨 ࠡ . + AL> p p - + AL> p. p ᠩ pᮢ - 뤠 ᯫpp + AL> -. + . ࠡ⠥ ⮫쪮 ண ⠫ 2004 ᫨ 㤥 +襭 த ஥. + cr0acker.narod.ru, ⠬ ਭ . + AL> p p 뫨 ⮡ "SPRINTER" + AL> (sVGA) p㡠. + ⨫, . + AL> ⮣ ᢮ 6105 모, ⮪ + AL> (pp 㤠 ⠢). ᬮp + AL> ᯥ᪨ p 㫥 - , 6105 ;)) + + ᭠砫 201, ⮬ ᮡࠫ 奬 5 १ +࠭, ᬮ , 祬 :) +Vladimir + +[I ZX] [Sprinter Developer] +[Sprinter UNofficial site: cr0acker.narod.ru] + +--- GoldED/W32 3.0.1 + * Origin: (2:5020/12000.48) + +*** Area: ZX.SPECTRUM Date: 14 Jan 04 1:29:54 +*** From: Vladimir Karpenko (2:5020/12000.48) +*** To : Alexander Araktcheew +*** Subj: Emuls ZX + +Hello Alexander. + +13 Jan 04 20:01, you wrote to me: + KF>>> 㤠 諨??? ᠬ, ⠬ 㦥, + KF>>> "ୠ" ??? :-( ) + VK>> ୭. ᥩ . ⨯ + VK>> :) Vladimir + AA> H䨣 , ⠪ ᭨ ଠ묨 ࠦﬨ + AA> 㤠 뫮 ࠧࠡ⨪? ⮬ + AA> த ஥ 㬠 ? +, ⠪ ᪠ Skyprise LLC,  ஬ +H-થ, ।⠢ 쭮/⭨/஢ . +  ࠡ⠫, ᯥ樠 ⠢, ᮢ㯭 魮 + ࢠ । 90, 設 ଧ +ਭ. ⠢, ஬ 믮 ਫ, + ⠪ , ⮬ 砫 +஥ DevelopOnBox.ru, ஬ ணࠬ, ⠪ ࠢ訪. +ࠢ騪 ⠪  ணࠬ⠬/㤮/몠⠬, + ⮬ த ⮢ த:) 騪  , + 諨 祢 ਭ. ਭ 祣 , + : + +=== Cut === +: "Igor Borisov" +: "cr0acker" +: Re: - +: 20 2003 . 12:34 + +ࠢ! + ஡ 孨᪮ . + ﭢ 襭. +쭥 졠 ਭ 㤥 襭 ࢮ ⠫. + ᪨ ஥,⮬ . +஬諥 ⮢ 業 . + 業 .ঠ , ⮩ 죨 ⮬ +஥ ᬮ. + 뫮 , 뫮 ᤥ.H ॡ . +஡ ⮩稢 .H㦭 室 4 ᫮ , + १ 蠥 ⮨ . ॡ ᪮쪮 楢 ६. + 3000 ஢,襭 . - 㬬. + 㢠 +ᮢ + +(812)327-35-31 +mail@petersplus.ru +www.petersplus.ru +=== Cut === + ୠ ? 娢 㦤? +Vladimir + +[I ZX] [Sprinter Developer] +[Sprinter UNofficial site: cr0acker.narod.ru] + +--- GoldED/W32 3.0.1 + * Origin: (2:5020/12000.48) diff --git a/docs/reference/Sprint2K.doc b/docs/reference/Sprint2K.doc new file mode 100644 index 0000000000000000000000000000000000000000..b12b1b05f22d87f06fde0ea86467577457ddcc8b GIT binary patch literal 34816 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 literal 0 HcmV?d00001 diff --git a/docs/reference/Архитектура компьютера Sprinter.doc b/docs/reference/Архитектура компьютера Sprinter.doc new file mode 100644 index 0000000000000000000000000000000000000000..1cb2ec7c0e6b01c8f70c794d127379864062a958 GIT binary patch literal 70656 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 literal 0 HcmV?d00001 diff --git a/docs/reference/Руководство_по_программированию_Иван_Мак.pdf b/docs/reference/Руководство_по_программированию_Иван_Мак.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ff27ae8f02af45ff5f7c565cb47bb579e948620d GIT binary patch literal 299499 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

v31<5+=Sa9QoBI-l`^CveD$O0&_`l$I(-W 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%0Da+8MP%mAgeIm8I4ypMIWsSq5AWZ~3--Bf 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 z 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 Mh?P}R=?c;R0b!!GAOHXW literal 0 HcmV?d00001 diff --git a/docs/reference/Системные_вызовы_дисковой_подсистемы.doc b/docs/reference/Системные_вызовы_дисковой_подсистемы.doc new file mode 100644 index 0000000000000000000000000000000000000000..c3b8b08cdc222216d9331e1ebaa34f4ca668d8d9 GIT binary patch literal 153600 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 literal 0 HcmV?d00001 diff --git a/docs/reference/Форум.doc b/docs/reference/Форум.doc new file mode 100644 index 0000000000000000000000000000000000000000..2986188828307e9968aec6da06b0a4183ab16889 GIT binary patch literal 166912 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 literal 0 HcmV?d00001 diff --git a/docs/reference/Функции BIOS v3.doc b/docs/reference/Функции BIOS v3.doc new file mode 100644 index 0000000000000000000000000000000000000000..ad44f26753b173aef307632b25ab3b309fc158de GIT binary patch literal 109056 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 0 ? + inc hl + inc hl + or a + sbc hl, de + or a + sbc hl, de ; s = s - 2*x + 2 + dec e ; x = x - 1 +.nocorr1: inc c ; y = y + 1 + ld a, e + cp c + jr nc, .loop1 + + add hl, de + add hl, de ; s = s + 2*x + ld a, c ; t = y + ld c, e ; y = x + ld e, a ; x = t +.loop2: + inc hl + or a + sbc hl, de + or a + sbc hl, de ; s = s - 2*x + 1 + jp p, .nocorr2 ; s < 0 ? + inc hl + inc hl + add hl, bc + add hl, bc ; s = s + 2*y + 2 + inc c ; y = y + 1 +.nocorr2: dec e ; x = x - 1 + call SetPixel + ld a, e + cp -1 + jr nz, .loop2 + ret + +; SetPixel +; e - x, c - y +SetPixel: + ld a, e ; clip pixel on x-axis + cp 160 + ret nc + ld a, c ; clip pixel on y-axis + cp 128 + ret nc + add a, 128 ; center screen on y-axis + out (YPORT), a + ld a, e + exx + ld l, a + ld h, 0x00 + add hl, de + ld (hl), c ; set 2 equal pixels + inc hl ; for disappear holes + ld (hl), c ; between circuits + exx + ret + +;[]=======================================================================[] +; Clear video memory (first screen) +CrearVideoRam: + ld hl, PALETTE_BASE ; load fully black palette + ld de, 0x0000 + ld bc, 0xFFA4 + sub a + rst 0x08 ; load palette by BIOS + + in a, (YPORT) ; store modify ports + ld c, a + in a, (PAGE1) + ld b, a + push bc + ld a, VPAGE + out (PAGE1), a + ld hl, 0x4000 + ld bc, 320 ; screen x size in bytes + ld e, l + di + ld d, d + ld a, 0x00 ; set accel lenght to 256 bytes +.loop: ld e, e ; fill vertical lines + ld (hl), e + ld b, b + inc hl + dec bc + ld a, b + or c + jr nz, .loop + ei + pop bc + ld a, b + out (PAGE1), a + ld a, c + out (YPORT), a ; restore modify ports + ret + +;[]=======================================================================[] +HelpString: + db 0x0D, 0x0A + db "The 256color! Mini demo for Sprinter.", 0x0D, 0x0A + db "Created by Enin Anton.", 0x0D, 0x0A, 0x00 + diff --git a/docs/samples/INTMOUSE.ASM b/docs/samples/INTMOUSE.ASM new file mode 100755 index 0000000..abec259 --- /dev/null +++ b/docs/samples/INTMOUSE.ASM @@ -0,0 +1,921 @@ + +;[BEGIN] +;//MODULE: INTMOUSE +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module + +CMOUSE EQU #1B +DMOUSE EQU #1A +Y_PORT EQU #89 +VPAGE EQU #C9 + +; MOUSE SOFTWARE SPECIFICATION +;--------------------------------------------- +; COMMAND 00h (INITIALIZATION) +; +; RETURN: NC - MOUSE PRESENT +; C - MOUSE ABSENT +;--------------------------------------------- +; COMMAND 01h (SHOW MOUSE CURSOR) +; +; RETURN: NC - DONE +; C - MOUSE ON SCREEN +;--------------------------------------------- +; COMMAND 02h (HIDE MOUSE CURSOR) +; +; RETURN: NC - DONE +; C - NONE MOUSE +;--------------------------------------------- +; COMMAND 03h (READ MOUSE STATE) +; +; RETURN: HL - X COORD +; DE - Y COORD +; A - BUTTONS D2-D0 (MIDDLE,RIGHT,LEFT) +;--------------------------------------------- +; COMMAND 04h (GOTO MOUSE CURSOR) +; +; INPUT: HL - X COORD +; DE - Y COORD +;--------------------------------------------- +; COMMAND 05h (RESERVED) +;--------------------------------------------- +; COMMAND 06h (RESERVED) +;--------------------------------------------- +; COMMAND 07h (SET VERT. BOUNDS) +; +; INPUT: HL - Y MIN +; DE - Y MAX +;--------------------------------------------- +; COMMAND 08h (SET HORZ. BOUNDS) +; +; INPUT: HL - X MIN +; DE - X MAX +;--------------------------------------------- +; COMMAND 09h (LOAD CURSOR) +; +; INPUT: IX - CURSOR IMAGE +; H - HEIGHT CURSOR +; L - WIDTH CURSOR +; D - Y HOT SPOT +; E - X HOT SPOT +; B = 0 +;--------------------------------------------- +; COMMAND 0Ah (SET CURSOR IN TEXT MODES) +; +; INPUT: H - AND SIMBOL MASK +; L - XOR SIMBOL MASK +; D - AND ATTRIBUT MASK +; E - XOR ATTRIBUT MASK +; B = 0 +;--------------------------------------------- +; COMMAND 0Bh (RETURN CURSOR) +; +; INPUT: IX - CURSOR IMAGE BUFFER +; OUTPUT: H - HEIGHT CURSOR +; L - WIDTH CURSOR +; D - Y HOT SPOT +; E - X HOT SPOT +;--------------------------------------------- +; COMMAND 0Ch (RESERVED) +;--------------------------------------------- +; COMMAND 0Dh (RESERVED) +;--------------------------------------------- +; COMMAND 0Eh (GET SENSETIVE) +; OUTPUT: H - VERTICAL SENSETIVE +; L - HORIZONTAL SENSETIVE +;--------------------------------------------- +; COMMAND 0Fh (SET SENSETIVE) +; INPUT: H - VERTICAL SENSETIVE +; L - HORIZONTAL SENSETIVE +;--------------------------------------------- +; COMMAND 80h (MOUSE HARDWARE INTERRUPT) +;--------------------------------------------- +; COMMAND 81h (CHANGE VIDEO MODE) +; INPUT: A - MODE +;--------------------------------------------- +; COMMAND 82h (RESERVED) +;--------------------------------------------- +; COMMAND 83h (MOUSE REFRESH) +;--------------------------------------------- +; ERRORS: 0 - NO ERROR +; 1 - COMMAND NOT PRESENT +; 2 - DEVICE ABSENT +; 3 - CURSOR ON (UZHE) +; 4 - CURSOR OFF (UZHE) +; 5 - CURSOR IMAGE VERY BIG + +INTMOUS BIT 7,C + JP NZ,EMOUSE + INC C + DEC C + JP Z,MS_INIT + DEC C + JP Z,MS_SHOW + DEC C + JP Z,MS_HIDD + DEC C + JP Z,MS_READ + DEC C + JP Z,MS_GOTO + DEC C + JP Z,MS_RESR + DEC C + JP Z,MS_RESR + DEC C + JP Z,MS_VERT + DEC C + JP Z,MS_HORZ + DEC C + JP Z,MS_CURS + DEC C + JP Z,MS_MASK + DEC C + JP Z,MS_BCUR + DEC C + JP Z,MS_RESR + DEC C + JP Z,MS_RESR + DEC C + JP Z,MS_GSEN + DEC C + JP Z,MS_SENT +MS_RESR LD A,1 + SCF + RET + +EMOUSE RES 7,C + INC C + DEC C + JP Z,M_INT + DEC C + JP Z,M_MODE + DEC C + JR Z,M_RESR + DEC C + JP Z,M_REFR +M_RESR LD A,1 + SCF + RET + +MS_INIT DI + LD A,85 + OUT (#10),A + LD A,45 + OUT (#10),A + LD A,0 + OUT (CMOUSE),A + LD A,1 + OUT (CMOUSE),A + LD A,0 + OUT (CMOUSE),A + LD A,3 + OUT (CMOUSE),A + LD A,#41 + OUT (CMOUSE),A + LD A,4 + OUT (CMOUSE),A + LD A,#47 + OUT (CMOUSE),A + LD A,5 + OUT (CMOUSE),A + LD A,#E0 + OUT (CMOUSE),A + EI + XOR A + RET + +MS_SHOW PUSH IX + PUSH HL + PUSH DE + EX AF,AF' + PUSH AF + LD HL,(PIX_X) + LD DE,(PIX_Y) + DI + CALL MOUSE + XOR A + LD (REFRESH+1),A + EI + POP AF + EX AF,AF' + POP DE + POP HL + POP IX + XOR A + RET + +MS_HIDD PUSH IX + PUSH HL + PUSH DE + EX AF,AF' + PUSH AF + DI + LD A,1 + LD (REFRESH+1),A + CALL RESTORE + EI + POP AF + EX AF,AF' + POP DE + POP HL + POP IX + XOR A + RET + +MS_READ LD HL,(PIX_X) + LD DE,(PIX_Y) + LD A,(MB) + AND A + RET + +MS_GOTO PUSH IX + PUSH HL + PUSH DE + LD (PIX_X),HL + LD (PIX_Y),DE + EX AF,AF' + PUSH AF + DI + CALL REFRESH + EI + POP AF + EX AF,AF' + POP DE + POP HL + POP IX + XOR A + RET + +MS_CURS PUSH BC + PUSH DE + PUSH HL + PUSH IX + LD A,L + LD (M_XSIZE),A + LD A,H + LD (M_YSIZE),A + LD C,E + LD B,0 + LD (XHOT_SP),BC + LD C,D + LD B,0 + LD (YHOT_SP),BC + EXX + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + LD HL,0 +MSCURS1 ADD HL,BC + DEC A + JR NZ,MSCURS1 + PUSH HL + LD BC,MAXSIZM+1 + AND A + SBC HL,BC + CCF + EXX + POP BC + POP HL + LD A,5 + JR C,NOLOADM + LD DE,M_IMAGE + DI + LDIR + XOR A +NOLOADM POP HL + POP DE + POP BC + EI + RET + +MS_BCUR PUSH IX + EXX + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + LD HL,0 +MSBCUR1 ADD HL,BC + DEC A + JR NZ,MSBCUR1 + PUSH HL + LD BC,MAXSIZM+1 + AND A + SBC HL,BC + CCF + EXX + POP BC + POP HL + LD A,5 + JR C,NOSAVEM + LD DE,M_IMAGE + EX DE,HL + DI + LDIR + LD A,(M_XSIZE) + LD L,A + LD A,(M_YSIZE) + LD H,A + LD BC,(XHOT_SP) + LD E,C + LD BC,(YHOT_SP) + LD D,C + LD BC,0 + XOR A +NOSAVEM EI + RET + +MS_HORZ + LD (MIN_X),HL + LD (MAX_X),DE + XOR A + RET + +MS_VERT + LD (MIN_Y),HL + LD (MAX_Y),DE + XOR A + RET + +MS_MASK + LD (ANDXORS),HL + LD (ANDXORA),DE + XOR A + RET + +; H - VERTICAL SENSETIVE +; L - HORIZONTAL SENSETIVE + +MS_SENT + LD (SENSEXY),HL + XOR A + RET + +MS_GSEN + LD HL,(SENSEXY) + XOR A + RET + +MOUSET LD (REST_XT+1),HL + LD (REST_YT+1),DE +;Y + SRL D + RR E + SRL D + RR E + SRL D + RR E + LD D,E +;X + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD E,L + + IN A,(Y_PORT) + LD XH,A + IN A,(PAGE1) + LD XL,A +; + DI +; + LD A,#54 + OUT (PAGE1),A +; + LD A,D + ADD A,A + ADD A,A ;Y * 4 + LD L,A + LD H,#43 ;+ #4300 +; + IN A,(VPAGE) + RRCA + AND #80 + OR #01 + ADD A,E + OUT (Y_PORT),A + INC L + LD A,(HL) ;SIMBOL + LD BC,(ANDXORS) + AND B + XOR C + LD (HL),A + INC L + LD A,(HL) ;ATTRIBUT + LD BC,(ANDXORA) + AND B + XOR C + LD (HL),A +; + LD A,XL + OUT (PAGE1),A + LD A,XH + OUT (Y_PORT),A + RET + +RESTORT +REST_XT LD HL,#0000 +REST_YT LD DE,#0000 +;Y + SRL D + RR E + SRL D + RR E + SRL D + RR E + LD D,E +;X + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD E,L + + IN A,(Y_PORT) + LD XH,A + IN A,(PAGE1) + LD XL,A +; + DI +; + LD A,#50 + OUT (PAGE1),A +; + LD A,D + ADD A,A + ADD A,A ;Y * 4 + LD L,A + LD H,#43 ;+ #4300 +; + IN A,(VPAGE) + RRCA + AND #80 + OR #01 + ADD A,E + OUT (Y_PORT),A + INC L + LD A,(HL) ;SIMBOL + LD (HL),A + INC L + LD A,(HL) ;ATTRIBUT + LD (HL),A +; + LD A,XL + OUT (PAGE1),A + LD A,XH + OUT (Y_PORT),A + RET + +RESTORE LD A,#00 + BIT 7,A + JP Z,RESTORT +RESTORG IN A,(PAGE3) + LD B,A + IN A,(Y_PORT) + LD C,A + PUSH BC + LD A,#50 + OUT (PAGE3),A +REST_X LD HL,0 +REST_Y LD DE,0 + LD A,E + EX AF,AF' +REST_V LD A,#00 + AND 1 + LD DE,#C000 ;PAGE 0 + JR Z,AA2 + LD DE,#C000+320 ;PAGE 1 +AA2 ADD HL,DE +REST_A LD A,0 + LD XH,A + EX AF,AF' +REST_H +RS002 LD BC,10 + OUT (Y_PORT),A + EX AF,AF' +; PUSH HL + LD (PUSH_HL+1),HL + LD D,H + LD E,L + LDIR +PUSH_HL LD HL,#0000 +; POP HL + EX AF,AF' + INC A + JR Z,RS003 + DEC XH + JR NZ,RS002 +RS003 POP BC + LD A,B + OUT (PAGE3),A + LD A,C + OUT (Y_PORT),A + XOR A + RET + +;HL/DE - X/Y + +MOUSE LD A,(MODE) + LD (RESTORE+1),A + BIT 7,A + JP Z,MOUSET +MOUSEG CP #82 ;640x256x16 + JR NZ,NOFX + SRL H + RR L +NOFX LD IX,M_IMAGE + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD (REALXS),BC + LD (REST_H+1),BC + LD C,B + LD (SKIPXF),BC + LD A,(M_YSIZE) + LD (REST_A+1),A + LD C,A + LD B,0 + LD (REALYS),BC + LD BC,(YHOT_SP) + LD A,E + SUB C + LD E,A + JR NC,GOODY + NEG + LD E,A + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + SUB E +SKIPMY ADD IX,BC + DEC E + JR NZ,SKIPMY + LD C,A + LD (REALYS),BC +GOODY LD BC,(XHOT_SP) + AND A + SBC HL,BC + JR NC,GOODX + LD B,H + LD C,L + LD HL,0 + AND A + SBC HL,BC + LD (SKIPXF),HL + LD A,(M_XSIZE) + SUB L + LD L,A + LD (REALXS),HL + LD HL,0 +GOODX LD (REST_X+1),HL + LD (REST_Y+1),DE + + PUSH HL + IN A,(PAGE3) + LD H,A + IN A,(Y_PORT) + LD L,A + EX (SP),HL + LD A,#5C + OUT (PAGE3),A + LD A,E + EX AF,AF' + IN A,(VPAGE) + LD (REST_V+1),A + AND 1 + LD DE,#C000 ;PAGE 0 + JR Z,AA1 + LD DE,#C000+320 ;PAGE 1 +AA1 ADD HL,DE + LD D,XH + LD E,XL + EX DE,HL ;HL - BITMAP + LD BC,(REALYS) + LD XH,C + EX AF,AF' +MS002 LD BC,(SKIPXF) + ADD HL,BC + LD BC,(REALXS) + OUT (Y_PORT),A + EX AF,AF' + ;USH DE + LD (PUSH_DE+1),DE + LDIR +PUSH_DE LD DE,#0000 +; POP DE + EX AF,AF' + INC A + JR Z,MS003 + DEC XH + JR NZ,MS002 +MS003 POP BC + LD A,B + OUT (PAGE3),A + LD A,C + OUT (Y_PORT),A + XOR A + RET + +READ_M IN A,(CMOUSE) + RRCA + RET NC + IN A,(DMOUSE) + LD L,A + BIT 6,A + CCF + RET Z +TST_01 IN A,(CMOUSE) + RRCA + JP NC,TST_01 + IN A,(DMOUSE) + LD E,A + BIT 6,A + CCF + RET NZ +TST_02 IN A,(CMOUSE) + RRCA + JR NC,TST_02 + IN A,(DMOUSE) + LD D,A + BIT 6,A + CCF + RET NZ + LD A,E + AND #3F + LD E,A + LD A,L + AND #03 + RRCA + RRCA + OR E + LD E,A + LD A,D + AND #3F + LD D,A + LD A,L + AND #0C + RRCA + RRCA + RRCA + RRCA + OR D + LD D,A + LD A,L + RLCA + RLCA + RLCA + RES 6,A + JR NC,STBU + SET 6,A +STBU RLCA + RLCA + AND #03 + LD (MB),A + CALL SENSE + LD A,E + LD (MX),A + LD A,D + LD (MY),A + SCF + RET + +MCORECT LD HL,(PIX_X) + LD DE,(MX) + LD D,0 + BIT 7,E + JR NZ,DECX + ADD HL,DE + LD (PIX_X),HL + EX DE,HL + LD HL,(MAX_X) + AND A + SBC HL,DE + JP NC,YCOO + LD HL,(MAX_X) + LD (PIX_X),HL + JP YCOO +DECX LD A,E + NEG + LD E,A + AND A + SBC HL,DE + LD (PIX_X),HL + JR C,YCOO2 + LD DE,(MIN_X) + SBC HL,DE + JR NC,YCOO +YCOO2 LD HL,(MIN_X) + LD (PIX_X),HL + +YCOO LD HL,(PIX_Y) + LD DE,(MY) + LD D,0 + BIT 7,E + JR NZ,DECY + ADD HL,DE + LD (PIX_Y),HL + EX DE,HL + + LD HL,(MAX_Y) + AND A + SBC HL,DE + RET NC + LD HL,(MAX_Y) + LD (PIX_Y),HL + RET + +DECY LD A,E + NEG + LD E,A + AND A + SBC HL,DE + LD (PIX_Y),HL + JR C,XCOO + LD DE,(MIN_Y) + SBC HL,DE + RET NC +XCOO LD HL,(MIN_Y) + LD (PIX_Y),HL + RET + +SENSE LD HL,(SENSEXY) + LD A,L + OR L + RET Z + DEC A + RET Z + LD A,E + BIT 7,A + LD B,#FF + JR Z,SEN1 + LD B,#7F + NEG +SEN1 INC B + SUB L + JR NC,SEN1 + BIT 7,B + JR Z,SEN2 + LD A,B + RES 7,A + NEG + LD B,A +SEN2 LD E,B + LD A,D + BIT 7,A + LD B,#FF + JR Z,SEN3 + LD B,#7F + NEG +SEN3 INC B + SUB H + JR NC,SEN3 + BIT 7,B + JR Z,SEN4 + LD A,B + RES 7,A + NEG + LD B,A +SEN4 LD D,B + RET + +M_MODE LD (MODE),A + OR A + JR Z,UNKMODE + CP 1 + JR Z,UNKMODE + CP 2 + JR Z,S320256 + CP 3 + JR Z,S640256 + BIT 7,A + JR Z,UNKMODE + RES 7,A + CP 1 + JR Z,S320256 + CP 2 + JR Z,S640256 +UNKMODE XOR A + SCF + RET + +S320256 + LD HL,0 ;MIN X + LD DE,319 ;MAX X + CALL MS_HORZ + LD HL,0 ;MIN X + LD DE,255 ;MAX X + CALL MS_VERT + XOR A + RET + +S640256 + LD HL,0 ;MIN X + LD DE,639 ;MAX X + CALL MS_HORZ + LD HL,0 ;MIN X + LD DE,255 ;MAX X + CALL MS_VERT + XOR A + RET + +;Mouse Interrupt +M_INT IN A,(PAGE3) + LD B,A + IN A,(Y_PORT) + LD C,A + PUSH BC + CALL REFRESH ;Refresh mouse + CALL CONTROL + POP BC + LD A,B + OUT (PAGE3),A + LD A,C + OUT (Y_PORT),A + RET + +M_REFR CALL CONTROL + AND A + RET + +CONTROL CALL READ_M + RET NC + CALL MCORECT + LD A,#00 + LD (REDY+1),A + RET + +REFRESH LD A,#01 + OR A + RET NZ +REDY LD A,#00 +; OR A +; RET NZ + CALL RESTORE + LD HL,(PIX_X) + LD DE,(PIX_Y) + CALL MOUSE + LD A,#FF + LD (REDY+1),A + RET + +MODE DB #03 + +PIX_X DW 160 +PIX_Y DW 128 + +MX DB #00 +MY DB #00 +MB DB #00 +MB_OLD DB #00 +MIN_X DW 0 +MAX_X DW 319 +MIN_Y DW 0 +MAX_Y DW 255 +SENSEXY +SENSE_X DB 0 +SENSE_Y DB 0 + +XHOT_SP DW 0 +YHOT_SP DW 0 + +ANDXORS DW #FF00 +ANDXORA DW #FF77 + +M_XSIZE DB 10 +M_YSIZE DB 14 +SKIPXF DW 0 +REALXS DW 0 +REALYS DW 0 + +X EQU #00 +W EQU #FE +N EQU #FF + +M_IMAGE +MS_BMP DB X,X,N,N,N,N,N,N,N,N + DB X,W,X,N,N,N,N,N,N,N + DB X,W,W,X,N,N,N,N,N,N + DB X,W,W,W,X,N,N,N,N,N + DB X,W,W,W,W,X,N,N,N,N + DB X,W,W,W,W,W,X,N,N,N + DB X,W,W,W,W,W,W,X,N,N + DB X,W,W,W,W,X,X,X,X,N + DB X,W,W,X,W,X,N,N,N,N + DB X,W,X,X,W,W,X,N,N,N + DB X,X,N,N,X,W,X,N,N,N + DB X,N,N,N,X,W,W,X,N,N + DB N,N,N,N,N,X,X,N,N,N + DB N,N,N,N,N,N,N,N,N,N + DS 116 +MAXSIZM EQU $-M_IMAGE + +;//MODULE: INTMOUSE +;[END] + diff --git a/docs/samples/SIO_CTC_KEY.asm b/docs/samples/SIO_CTC_KEY.asm new file mode 100755 index 0000000..361f798 --- /dev/null +++ b/docs/samples/SIO_CTC_KEY.asm @@ -0,0 +1,308 @@ + +PAGE_0: equ 82h ; порт 0 окна = addr 0000h +PAGE_1: equ 0A2h ; порт 1 окна = 4000h +PAGE_2: equ 0C2h ; порт 2 окна = 8000h +PAGE_3: equ 0E2h ; порт 3 окна = 0c000h + +SIO_CONTROL_A: EQU 19h +SIO_DATA_REG_A: EQU 18h +SIO_CONTROL_B: EQU 1Bh +SIO_DATA_REG_B: EQU 1Ah +CTC_CH0: equ 10h +CTC_CH1: equ 11h +CTC_CH2: equ 12h +CTC_CH3: equ 13h + +RGMOD equ 0c9h + +; .... + + ; Запомним текущий видео-режим + LD C, DSS.GetVMod + RST 10h + LD HL, GetVMod_Error_Message + ;JR C, PutError + LD C, A + LD (.Current_VMod), BC + + ; Запрос памяти + + ; сохраним текущие значения страниц + IN A, (PAGE_1) + LD (SavePage1), A + IN A, (PAGE_3) + LD (SavePage3), A + + ; Настройка прерываний CTC и SIO + LD HL, IM2_Empty : LD (0FDFFh), HL + + LD (0FD10h), hl + LD (0FD12h), hl + LD (0FD14h), hl + LD (0FD16h), hl + LD (0FD18h), hl + LD (0FD1Ah), hl + LD (0FD1Ch), hl + LD (0FD1Eh), hl + + LD HL, IM2_VShandler : LD (0FD06h), HL + + LD A, I + LD (.SaveInterrupt), A + LD A, 0FDh + DI + LD I, A + IM 2 + +.Sync: + EI + HALT + DI + IN A, (SIO_CONTROL_A) + BIT 0, A ; 0-bit, байт пришел ? + JR Z, .EndSync ; да, это прерывание от клавиатуры + CALL Keyboard.PS2_Scan + JR .Sync +.EndSync: + + LD B, 5 +.loopSync: + DJNZ .loopSync + + ; Настройка CTC + LD A, 057h : OUT (CTC_CH2), A + LD A, 112 : OUT (CTC_CH2), A + LD A, 0d7h : OUT (CTC_CH3), A + LD A, 160 : OUT (CTC_CH3), A + LD A, 0 : OUT (CTC_CH0), A + + ; Настройка SIO + LD A, 1 : OUT (SIO_CONTROL_A), A + LD A, 18h : OUT (SIO_CONTROL_A), A + LD A, 2 : OUT (SIO_CONTROL_B), A + LD A, 10h : OUT (SIO_CONTROL_B), A + + LD HL, IM2_Keyhandler + LD (0FDFFh), HL + + LD (0FD10h), hl + LD (0FD12h), hl + LD (0FD14h), hl + LD (0FD16h), hl + LD (0FD18h), hl + LD (0FD1Ah), hl + LD (0FD1Ch), hl + LD (0FD1Eh), hl + + +Loop: +; основаной цикл +; ................ + + LD A, (Keyboard.KeyFlags) + BIT 7, A + JR NZ, .Key_ESC + + + JP Loop + +.Key_ESC: ; Выход + + DI + ; Восстановим прерывания и CTC + LD A, 057h : OUT (CTC_CH3), A + LD A, 160 : OUT (CTC_CH3), A + + ; Восстановим SIO + LD A, 1 : OUT (SIO_CONTROL_A), A + LD A, 0 : OUT (SIO_CONTROL_A), A + LD A, 2 : OUT (SIO_CONTROL_B), A + LD A, 10h : OUT (SIO_CONTROL_B), A + +.SaveInterrupt+*: LD A, 0 + LD I, A + IM 1 + EI + + CALL Keyboard.PS2_Clear_Buf + + ; Восстанавливаем страницы памяти + LD A,(SavePage1) + OUT (PAGE_1), A + LD A,(SavePage3) + OUT (PAGE_3), A + + ; Освободим память запрошенную память + + ; возвращаем текстовый режим +.Current_VMod+*: LD BC, 0 + LD A, C + LD C, DSS.SetVMod + RST 10h + +.Exit: +.ExitCode+*: LD B, 0 + LD C, DSS.Exit + RST 10h + JR $ + +UpdateMechanics: + LD A, (Keyboard.KeyFlags) + OR A + RET Z + BIT 3, A + JR NZ, .Key_UP + BIT 2, A + JR NZ, .Key_DOWN + RET + +.Key_DOWN: +; ... +.Key_UP: +; ... + RET + + +IM2_Empty: + EI + RETI + +IM2_Keyhandler: + PUSH AF, BC, DE, HL + EXX + EX AF, AF + PUSH AF, BC, DE, HL, IX, IY + IN A, (SIO_CONTROL_A) + BIT 0, A ; 0-bit, байт пришел ? + CALL NZ, Keyboard.PS2_Scan ; да, это прерывание от клавиатуры +.SkipClearKeyFlags: + POP IY, IX, HL, DE, BC, AF + EX AF, AF + EXX + POP HL, DE, BC, AF + EI + RETI + +IM2_VShandler: + PUSH AF, BC, DE, HL + EXX + EX AF, AF + PUSH AF, BC, DE, HL, IX, IY + +.NeedChangePage+*: LD A, 0 ; 1 - нужно переключить экран + OR A + JR Z, .skip + +.NumberScreen+*: LD B, 0 ; 0/1 - номер экрана, который в данный момент выводится + ; Переключаем экран + IN A, (RGMOD) + AND 0feh + OR B + XOR 1 + OUT (RGMOD), A + AND 1 + LD (.NumberScreen), A + + XOR A + LD (.NeedChangePage), A +.skip: + CALL UpdateMechanics ; Возможно нужно перенести из прерывания + +; Расчет FPS +; .......... + + POP IY, IX, HL, DE, BC, AF + EX AF, AF + EXX + POP HL, DE, BC, AF + EI + RETI + +; очистка буфера клавиатуры +; Портит регистры AF +Keyboard.PS2_Clear_Buf: + IN a, (SIO_CONTROL_A) + BIT 0, a + RET Z + IN A, (SIO_DATA_REG_A) + JR PS2_Clear_Buf + +; Из PS/2 возвращает в Keyboard.KeyFlags нажатые клавиши: +; бит кнопка +; 0 - RIGHT +; 1 - LEFT +; 2 - DOWN +; 3 - UP +; 4 - SPACE +; 5 - none +; 6 - ENTER +; 7 - ESC +; Портит регистры AF, BC, DE, HL +Keyboard.PS2_Scan: + LD HL, .KeyStatus + LD DE, 0c686h ; D - код команды SET 0, (HL) / E - код команды RES 0, (HL) +.Loop + IN a, (SIO_CONTROL_A) + BIT 0, a + RET Z + IN A, (SIO_DATA_REG_A) + CP 0E0h + JR NZ, .kh1 + SET 7, (HL) ; // двойной сканкод + JR .Loop + +.kh1: + CP 0F0h + JR NZ, .kh2 + SET 6, (HL) ; // отпускание клавиши + JR .Loop + +.kh2: + BIT 7, A ; автоповтор? + JR Z, .kh3 + LD (HL), 0 + JR .Loop + +.kh3: + LD B, 8 + BIT 6, (HL) + LD C, D ; С - код команды SET 0, (HL) + JR Z, .KeyPress +.KeyRelease: + LD C, E ; С - код команды RES 0, (HL) +.KeyPress: + LD (HL), 0 + PUSH HL + INC HL +.KeyPressLoop: + CP (HL) + JR Z, .SetKey + INC HL + DJNZ .KeyPressLoop + POP HL + JR .Loop +.SetKey: + LD A, B + DEC A + CPL + RLA + RLA + RLA + AND 00111000b + OR C + LD (.CodeSet + 1), A ; Изменяем команду по .CodeSet + POP HL + DEC HL +.CodeSet: SET 0, (HL) + INC HL + JR .Loop + +.KeyFlags: DB 0 +.KeyStatus: DB 0 +.KeysArray: DB 74h, 6bh, 72h, 75h, 29h, 00h, 5ah, 76h + +Keyboard.KeyFlags: EQU .KeyFlags + +SavePage1: DB 0 +SavePage3: DB 0 + diff --git a/docs/samples/Stars/STARS1.ASM b/docs/samples/Stars/STARS1.ASM new file mode 100644 index 0000000..3f4bf31 --- /dev/null +++ b/docs/samples/Stars/STARS1.ASM @@ -0,0 +1,226 @@ + + ORG 0x7e00 + +;EXE-file header: + DW 5845h ; EXE Signature + DB 45h ; Reserved (EXE type) + DB 00h ; Version of EXE file + DW 0200h ; Code offset + DW 0000h + DW 0000h ; Primary loader size or 0 (no primary loader) + DW 0000h ; Reserved + DW 0000h ; Reserved + DW 0000h ; Reserved + DW start ; Loading address + DW start ; Starting address (register PC) + DW 0BFFFh ; Stack address (register SP) + DS 490 ; Reserved + +;code of program + +start: LD A,81h ;используем режим 320х256 + LD BC,0050h ;B - номер видео страницы C - функция SETVMOD + RST 10h ;установить видео режим + JP C,VMError ;если ошибка флаг C установлен + + IN A,(0e2h) ;читаем номер страницы установленной в 3 окно ЦП + LD (OldPage),A ;сохраняем в ячейку памяти + LD A,50h ;номер страницы видео памяти + OUT (0e2h),A ;устанавливаем его в 3 окно ЦП + + LD IX,rndSeed + LD BC,0DFBDh + LD A,0 + OUT (C),A +getSec: LD BC,0FFBDh + IN A,(C) + AND A + JR Z,getSec + SLA A + SLA A + LD (IX),A + + LD B,0FFh + LD HL,buffStars +initStLoop1: CALL rndNumber + LD (HL),A + INC HL + DJNZ initStLoop1 + + LD IX,buffStars + LD IY,scrollSin +mainLoop: DI + LD A,15 + LD (color),A + CALL printStars + + EI + HALT + + XOR A + LD (color),A + CALL printStars + + CALL scrollStars + + LD A,(IY) + AND A + CALL Z,initMove + LD B,A +moveLoop: PUSH BC + CALL moveStarsUp +initMoveStars: EQU $-2 + POP BC + DJNZ moveLoop + + INC IY + + LD C,31h ; test keypress + RST 10h + JR Z,mainLoop + CP 1Bh ; ESC is pressed? + JR NZ,mainLoop + + LD A,(OldPage) ;восстанавливаем предыдущую страницу + OUT (0e2h),A ;устанавливаем ее в 3 окно ЦП + + LD A,03h ;текстовый режим + LD BC,0050h ;первая страница, функция SETVMOD + RST 10h ;устанавливаем + +exit: LD BC,0041h ;функция EXIT корректный выход в DOS + RST 10h + RET ;вызываем + +VMError: LD HL,ErrMess ;сообщение об ошибки + LD BC,005ch ;выводим + RST 10h + JR exit + +printStars: PUSH IX + XOR A + LD B,0FFh +printStLoop: LD HL,color + LD D,0C0h + LD E,(IX) + OUT (89h),A + PUSH BC + LDI + POP BC + INC A + INC IX + DJNZ printStLoop + POP IX + RET + +scrollStars: PUSH IX + PUSH HL + LD B,0FFh/3 +scrollStLoop: LD HL,initSpeed + LD A,(IX) + ADD A,(HL) + LD (IX),A + INC IX + INC HL + LD A,(IX) + ADD A,(HL) + LD (IX),A + INC IX + INC HL + LD A,(IX) + ADD A,(HL) + LD (IX),A + INC IX + DJNZ scrollStLoop + POP HL + POP IX + RET + +moveStarsUp: LD HL,buffStars+1 + LD DE,buffStars + LD A,(DE) + LD BC,0FEh + LDIR + LD (DE),A + + LD HL,initSpeed+1 + LD DE,initSpeed + LD A,(DE) + LD BC,2 + LDIR + LD (DE),A + RET + +moveStarsDown: LD HL,buffStars+0FEh + LD DE,buffStars+0FFh + LD A,(buffStars+0FFh) + LD BC,0FFh + LDDR + LD (buffStars),A + + LD HL,initSpeed+1 + LD DE,initSpeed+2 + LD A,(initSpeed+2) + LD BC,3 + LDDR + LD (initSpeed),A + RET + +initMove: LD A,(flMove) + AND A + JR Z,moveUp + + LD IY,moveStarsUp + XOR A + LD (flMove),A + LD (initMoveStars),IY + JR endInitMove +moveUp: LD IY,moveStarsDown + LD A,1 + LD (flMove),A + LD (initMoveStars),IY +endInitMove: LD IY,scrollSin + LD A,(IY) + RET + +rndNumber: LD IX,rndSeed + LD D,(IX) + LD A,(IX+2) + LD (IX+3),A + LD A,(IX+1) + LD (IX+2),A + LD (IX+1),D + LD A,(IX+3) + LD E,A + SLA A + SLA A + SLA A + XOR E + LD E,A + SRL A + SRL A + SRL A + SRL A + SRL A + XOR E + LD E,A + SRL D + SRL D + SRL D + SRL D + SRL D + LD A,D + XOR D + XOR E + LD (IX),A + RET + +ErrMess: DB "Error set video mode!",0dh,0ah,00h +OldPage: DB 00h +color: DB 15 +initSpeed: DB 1,2,3 +flMove DB 0 +rndSeed: DB 18,43,3,73 +scrollSin: DB 1,1,1,1,1,2,1,2,1,2,2,2,2,3,2,2,3,3,2,3,3,3,3,3,3,3,3,3,3 + DB 3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,3,2,2,2,2,1,2,1,2,1,1,1,1,1,0 +buffStars: DS 256 diff --git a/docs/samples/aprint/font.raw b/docs/samples/aprint/font.raw new file mode 100644 index 0000000000000000000000000000000000000000..97d579a48667db46dd44d77129283c958ae0e696 GIT binary patch literal 6888 zcmb7|Er3)<5QLY5aO8I{{{)4MM4pU{L`EW!$jC?}5{X12BO@b`k&(!ixJ!Li-81v{ z76^T}Z{GAzb#?db+r7Ja^Zjym;|zzhGc9NOnSy4K8@j(W_T1S$PPz)`hV53{9%y0` zm}_>oZlPQ?b2qa5&l^yJHv_`!_U+x>2fsf0{n^XE{yE&afBEq7AJ1R?{qNh0pMUx7 z$mlC^`F6^8Q@$Va!;~L~+#T}MlzW!lN6P-{pr5P#m99HocL&Rk z`>VacSg#Jck>1!+pjS}zGN9k@x@w)}yu(vQ~<6e4Trz@{EUVDd2=wdFON*bIB7FUt*m+uJ;UnKwLU_nhh@~0U3I#ie~}q=U~C;@ape?2{fMWc zgVoTyfAp&fNRwa3Tdx>*Zs-GTccz+tJEww$!BIAnu1b}Bu5-l+#b%%;nOM61kk-8MEG#C4~O zY-N|8H(b@BQ1tAr-}W1t6Nfb9Cx*Tv%@I9fJy3;Tj|T+=f93@SS@GRn8359Y6u1by z;G>tiqE%mn8Aq*a;^>CV@iZQ$;h!7n$MZ)Jo{<>IXgKmMcFe6`d8aQ}(iagh=_XFD z)t{$l6Nc>YryQerPDkeoQ#C_w#NnFy8t!C2cwi%1-3Mkq0oa3;)M_AU9` zBp`(5J@?_oM-0J95Ys1#JO$SKTjq4Nox?CC7b8&I`5blJojtHaXi;a2k=C{0`%TvzQuuDCDSd%NJigvpYv{) z?z_iLx%&KegI%XgU9Os5MEs&{L%CscU7}e_(lmKxdGzD4Q z+YBxx%B=^O?|c5fL~s?TTfy^v6;*Q3ZQ|-V(C-_V(7qUnv(L5s)RQl8cvK#L-diu_ zMqdMvBM(&k9mC%9ftRKG-#;P+W_IR=C<|vQ4>7QEUQ9lgi z#80c*)_Zf;#aW!FHIqdMw0=y%A+4nwyvJHv&zc9@Tw@DPXKsI?*#8)(_r111EQ6oy ztv8M~_;>5D^}g5kH;y)&qRQCu+djmIuI=mkEoJDeKteAM#U2HA{W+#$6wys0j>@_?b~+-#loxyK`B>@y zC*+W>c?fcc^dut~JmV5RlA&X-?*=D7xZ9ow!+Me&2Tw$J>56H(nApY32J~_YL4QAW zcf4=C=>^ZY>ck1V-gX65aU^nWbS{0NV!j^mNu?%u?JVKNf3J+s<1~Dss1LXLyJ_fQ z1wKur%lZEX#L%*05i0@OZVUQ|=k3O~25zIwsWcX-{*oX)`0(dfJ5sYwLk63+;o4IF z2<+`#CoAjt`!-|K_wVv@+jQS+2lM^I=|!e}+xC%b{%@|Jaif1?fWg1Hw^#8<7o@gF I^=&fv5Anh>n*aa+ literal 0 HcmV?d00001 diff --git a/docs/samples/aprint/main.z80 b/docs/samples/aprint/main.z80 new file mode 100644 index 0000000..bab2fc2 --- /dev/null +++ b/docs/samples/aprint/main.z80 @@ -0,0 +1,194 @@ +;[]=======================================================================[] +; +; main.z80 -- stub file for TextOut procedures +; +; Created by Anton Enin 26-June-2002 +; +; Last update 27-June-2002 +; +; Copyright (C) 2002 R-lab +; +; This program should be compiled using z80asm +; http://www.zxasm.narod.ru/ +; +; z80asm.exe -f bin main.z80 -o a_print.exe +; +;[]=======================================================================[] +; Sprinter constans -- see Sprinter docs + +VPAGE equ 0x50 ; video memory page +YPORT equ 0x89 ; y pos for write to the vram +PAGE0 equ 0x82 ; memory page ports +PAGE1 equ 0xA2 ; +PAGE2 equ 0xC2 ; +PAGE3 equ 0xE2 ; + + struc HeaderStruct ; Estex Exe Header +id: resb 3 ; exe file Id (must be 'EXE') +version: resb 1 ; exe file version +code_offeset: resd 1 ; offset to start code (header size) +loader_size: resw 1 ; first loader size +reserved1: resw 3 ; reserved +start_address: resw 1 ; program org +entry_point: resw 1 ; program entry point +stack_point: resw 1 ; program stack point +reserved2: resb 490 ; reserved + endstruc + +FONT_BASE equ 0x8000 + +;[]=======================================================================[] + + section .text + org 0x7E00 + +;[]=======================================================================[] +; EXE header + +ExeHeader: istruc HeaderStruct ; initialized structure + at id, db 'EXE' + at version, db 0 + at code_offeset, dd CodeStart - ExeHeader + at loader_size, dw 0 + at start_address, dw 0x8000 + at entry_point, dw EntryPoint + at stack_point, dw 0xBFFF + iend +CodeStart: ; start address is 0x8000 +;[]=======================================================================[] +MyFont: ; characters images + incbin "font.raw" + +;[]=======================================================================[] +; palette from Flex Navigator +CustomPalette: + db 0x00, 0x00, 0x00, 0x00 ; Black 00 + db 0x00, 0x00, 0xFF, 0x00 ; B.Red 01 + db 0x00, 0x80, 0x00, 0x00 ; Green 02 + db 0x00, 0xFF, 0xFF, 0x00 ; B.Yellow 03 + db 0x80, 0x00, 0x00, 0x00 ; Blue 04 + db 0xFF, 0xFF, 0x00, 0x00 ; Invert bg 05 + db 0x80, 0x00, 0x00, 0x00 ; Invert fg 06 + db 0x80, 0x80, 0x80, 0x00 ; BlackGray 07 + db 0xC0, 0xC0, 0xC0, 0x00 ; HighGray 08 + db 0x80, 0x00, 0x00, 0x00 ; Panel 09 + db 0xFF, 0xFF, 0x00, 0x00 ; Files 0A + db 0x00, 0xFF, 0xFF, 0x00 ; Select Files 0B + db 0x00, 0xFF, 0xFF, 0x00 ; InvSel Files 0C + db 0xC0, 0xC0, 0xC0, 0x00 ; Reserved 0D + db 0xFF, 0xFF, 0xFF, 0x00 ; White 0E + db 0xFF, 0xFF, 0xFF, 0x00 ; White 0F + +;[]=======================================================================[] +; entry point + align 16 +EntryPoint: + call SetVideoMode ; set video mode + + ld hl, TextStr1 ; text string + ld de, 0x0020 ; x position + ld bc, 0x0000 ; y position + ld a, 0x02 ; background color = 0x00 + ; foreground color = 0x02 + call TextOut + + ld hl, TextStr2 ; text string + ld de, 0x0020 ; x position + ld bc, 0x0008 ; y position + ld a, 0x1F ; background color = 0x01 + ; foreground color = 0x0F + call TextOut + + ld c, 0x30 ; wait keypressed + rst 0x10 + + call ResVideoMode ; restore video mode + + ld bc, 0x0041 + rst 0x10 ; return to OS + +;[]=======================================================================[] +; set requist video mode 640x256x16 +SetVideoMode: + ld c, 0x51 ; save previos vmode + rst 0x10 + ld (vmode + 1), a + ld a, b + ld (vscrn + 1), a + sub a + call CrearVideoRam + ld bc, 0x0050 ; set 640x256x16 + ld a, 0x82 + rst 0x10 + ld hl, CustomPalette + ld de, 0x1000 + ld bc, 0xFFA4 + sub a + rst 0x08 ; load palette + ret + +;[]=======================================================================[] +; restore previos video mode +ResVideoMode: + sub a + call CrearVideoRam +vscrn: ld b, 0x00 +vmode: ld a, 0x00 + ld c, 0x50 + rst 0x10 ; set previos vmode + ret + +;[]=======================================================================[] +; Clear video memory (first screen) +; Input: +; a - clear color (0-15) +CrearVideoRam: + and 0x0F + ld e, a + rlca + rlca + rlca + rlca + or e + ld e, a + in a, (YPORT) ; store modify ports + ld c, a + in a, (PAGE1) + ld b, a + push bc + ld a, VPAGE + out (PAGE1), a + ld hl, 0x4000 + ld bc, 320 ; screen x size in bytes + di + ld d, d + ld a, 0x00 ; set accel lenght to 256 bytes +.loop: ld e, e ; fill vertical lines + ld (hl), e + ld b, b + inc hl + dec bc + ld a, b + or c + jr nz, .loop + ei + pop bc + ld a, b + out (PAGE1), a + ld a, c + out (YPORT), a ; restore modify ports + ret + +;[]=======================================================================[] + + %include "print.z80" + +;[]=======================================================================[] +; some text +TextStr1: db 'Color print with acceleration.', 0 +TextStr2: db 'Written by Enin Anton. (c) Copyright 2002 R-lab', 0 + +;[]=======================================================================[] + +CodeEnd: + diff --git a/docs/samples/aprint/make.bat b/docs/samples/aprint/make.bat new file mode 100644 index 0000000..952aa75 --- /dev/null +++ b/docs/samples/aprint/make.bat @@ -0,0 +1 @@ +z80asm.exe -f bin main.z80 -o a_print.exe \ No newline at end of file diff --git a/docs/samples/aprint/print.z80 b/docs/samples/aprint/print.z80 new file mode 100644 index 0000000..1bfcbad --- /dev/null +++ b/docs/samples/aprint/print.z80 @@ -0,0 +1,180 @@ +;[]=======================================================================[] +; +; Draw text string to the screen 640x256 in 16colors +; Input: +; hl - pointer to the C string (0 - end string) +; de - x position +; bc - y position +; a - background and foreground color +; d7 - d4 background color (0-15) +; d3 - d0 foreground color (0-15) +; +; Output: +; hl - pointer to the next byte behind string +; +; Destroy registers: +; 'hl, 'de, 'bc + +TextOut: + push iy + ld yl, c ; y position + ld b, a ; store colors + in a, (YPORT) ; store Y_PORT + push af + in a, (PAGE1) + ld yh, a ; store PAGE1 + call PreparePrintColors + push de ; x position + exx + pop bc + srl b + rr c ; start address for x position + set 6, b ; print address start from 0x4000 + ld hl, BackgroundBuffer ; background buffer + ld de, ForegroundBuffer ; foreground buffer + exx + ld c, l ; pointer to the string + ld b, h +; now: +; bc - pointer to the C string +; 'hl - pointer to the background buffer +; 'de - pointer to the foreground buffer +; 'bc - x position +; yl - y position + + di ; disable interrupts + ld d, d ; set acceleration work lenght + ld a, 0x08 + ld b, b + ld a, (bc) ; test on null string + inc bc + or a + jr z, .exit +.loop1: + ld l, a ; font is always aligned to 256 bytes + ld h, FONT_BASE/256 ; pointer to the specialy font + push bc + ld b, (hl) ; character size x + inc h + ld e, (hl) + inc h + ld a, (hl) ; offset to character image + add a, FONT_BASE/256 + ld d, a + ld hl, 0x0008 ; line lenght in character image + ex de, hl + ld a, VPAGE + out (PAGE1), a ; set video memory to 0x4000-0x8000 +.loop2: + ld l, l ; linear load + ld a, (hl) ; read 8 bytes to accel memory + ld b, b + exx + ld a, yl + out (YPORT), a ; set y position out + ld l, l ; linear or + or (hl) ; with BackgroundBuffer + ld b, b + ex de, hl + ld l, l ; linear exclusive or + xor (hl) ; with ForegroundBuffer + ld a, a ; vertical write + ld (bc), a ; write 8 bytes from accel memory to vram + ld b, b + ex de, hl + inc bc ; next vertical line in video ram + exx + add hl, de ; next line in character image + djnz .loop2 + pop bc + ld a, yh + out (PAGE1), a + ld a, (bc) + inc bc + or a + jr nz, .loop1 ; end string ? +.exit: + ei ; enable interrupts + ld l, c ; return pointer to the end string + ld h, b + pop af + out (YPORT), a ; restore YPORT + pop iy + ret + +;[]=======================================================================[] +; +; Prepare text colors for accel text out +; Input: +; b - background and foreground color +; d7 - d4 background color (0-15) +; d3 - d0 foreground color (0-15) +; +; Destroy registers: +; a, bc, 'hl + +PreparePrintColors: + ld a, b +.prev_color: cp 0x00 ; color is prepared ? + ret z + ld (.prev_color + 1), a + and 0x0F ; foreground color + ld c, a + rlca + rlca + rlca + rlca + or c + exx + cpl + ld hl, ForegroundBuffer ; foreground buffer + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + exx + ld a, b + and 0xF0 ; background color + ld b, a + rrca + rrca + rrca + rrca + or b + exx + xor (hl) ; exclusive or with foreground color + ld hl, BackgroundBuffer ; background buffer + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a + exx + ret + +ForegroundBuffer: + times 8 db 0 +BackgroundBuffer: + times 8 db 0 + diff --git a/docs/samples/aprint/readme.eng b/docs/samples/aprint/readme.eng new file mode 100644 index 0000000..5d28c22 --- /dev/null +++ b/docs/samples/aprint/readme.eng @@ -0,0 +1,79 @@ + The tutorial procedure for colour printing at the graphic screen 640x256x16. + + This procedure was used in the Flex Navigator v1.xx. + Written for Estex v1.xx or high. + +Files description: + main.z80 - initial(main) file + print.z80 - printing procedure + +Font format description: + In the font used 256 symbols with height 8 points and various width. + + +000 [256] - width of a symbol on X (for each symbol) (in bytes) + +256 [256] - low byte of symbol image offset (for each symbol) + +512 [256] - high byte of symbol image offset (for each symbol) + +768 ... - images of symbols (from 0 to 255 symbol) + images stored as vertical lines, 8 bytes per line, 4 bits per point. + number of lines (in bytes) calculate from size of X + background colour = 0x00 + foreground colour = 0x0F + + for instance, image of "A" symbol: + width of symbol on X = 4 (bytes) + 00 00 00 00 + 00 FF FF 00 + 0F 00 00 F0 + 0F 00 00 F0 + 0F FF FF F0 + 0F 00 00 F0 + 0F 00 00 F0 + 00 00 00 00 + + In the image of symbol it will stored as: + + 00 00 0F 0F 0F 0F 0F 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00 00 00 00 00 F0 F0 F0 F0 F0 00 + +Algorithm description: + The main problem for the colour printing was fast transformation each point (background/foregraunf) to the necessary colour. +Here, I will showed, how I could solve this a "hard" problem. ;) If somebody will think up faster variant, I will be glad to see it. :) + + The printing on the screen realized by vertical lines with the help of accelerator at once till 8 bytes. +We require 2 buffers, size in 8 bytes for the colors mixing (background and foreground). Because, to get mixed up we shall be at once till 1 vertical line. These buffers are initialized at each change of colour by function PreparePrintColors (It's made automatically and you don't need about it to care!). + +Using print by function TextOut. + + operation | - Logical Inclusive OR (in Z80 CPU instruction OR) + operation ^ - Logical Exclusive OR (in Z80 CPU instruction XOR) + +Function PreparePrintColors: + + 1. initialize ForegroundBuffer + ForegroundBuffer = Foreground colour ^ 0xFF + 2. initialize BackgroundBuffer + BackgroundBuffer = Background colour ^ ForegroundBuffer + +Function TextOut (input parameters see in the source): + actually, a image printing: + Screen = (line_of_image | BackgroundBuffer) ^ ForegroundBuffer + +Let's look at a point level: + assume the colors for printing Background = 0, Foreground = 1 + + then ForegroundBuffer = 1 ^ 0xFF and result 0xFE + also BackgroundBuffer = 0 ^ 0xFE and result 0xFE + + for the background colour from a image (=0x00) + Screen = (0x00 | 0xFE) ^ 0xFE result 0x00 + + for the foreground colour from a image (=0xFF) + Screen = (0xFF | 0xFE) ^ 0xFE result 0x01 + +It's possible to do for any of colours... + +This algorithm works slower when are printed of very small strings. It occurs because a lot of initialization are required. Also when made often change of colour (Though, I hadn't changing it in the Flex Navigator so often, only for necessary). ;) + +27 june 2002 +Anton Enin (C) Copyright 2002 R-lab +If you have the questions email me: r-lab@mail.ru or ask in the Sprinter's forum. + diff --git a/docs/samples/aprint/readme.rus b/docs/samples/aprint/readme.rus new file mode 100644 index 0000000..a544158 --- /dev/null +++ b/docs/samples/aprint/readme.rus @@ -0,0 +1,82 @@ + Пример процедур цветной печати на графический экран с разрешением 640x256x16 цветов. + Такая процедура использовалась во Flex Navigator v1.xx. + Написан под Estex v1.xx и выше. + +Описание файлов: + main.z80 - инициализирующий файл + print.z80 - процедура печати + + +Описание формата шрифта: + в шрифте используется 256 символов, высотой 8 точек и различной длиной. + + +000 [256] - длина символа по x (для каждого символа) (в байтах) + +256 [256] - младший байт смешения на образ символа (для каждого символа) + +512 [256] - старший байт смешения на образ символа (для каждого символа) + +768 ... - образы символов (от 0 до 255 символа) + образы храняться в виде вертикальных линий точек по 8 байт, по 4 бита на точку. + кол-во линий (в байтах) определяется из размера по х + цвет background = 0x00 + цвет foreground = 0x0F + + например образ символа А: + длина символа по x = 4 (байта) + 00 00 00 00 + 00 FF FF 00 + 0F 00 00 F0 + 0F 00 00 F0 + 0F FF FF F0 + 0F 00 00 F0 + 0F 00 00 F0 + 00 00 00 00 + + в образе символа он будет лежать так: + + 00 00 0F 0F 0F 0F 0F 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00 00 00 00 00 F0 F0 F0 F0 F0 00 + + + + Описание алгоритма: + Самая главная проблема цветной печати это быстрое преоброзование точки фона/символа в нужный цвет. +Здесь показано, как я вышел из этого "нелегкого" положения ;) Если кто-нибудь придумает более быстрый +вариант, то я буду рад его увидеть :) + + Печать на экран осуществляется вертикальными линиями с испольэованием акселератора сразу по 8 байт. +Для замешивания цветов нам требуется 2 буфера (цвет background и foreground) размером в 8 байт, т.к. +замешивать будем сразу по 1 вертикальной линии. Эти 2 буфера инициализируются заново при каждой смене +цвета функцией PreparePrintColors (это делается автоматически, вам не нужно об этом заботиться!). +Печатаем функцией TextOut. + + операция | - поразрядное логическое ИЛИ (на Z80 CPU команда or) + операция ^ - поразрядное исключение ИЛИ (на Z80 CPU команда xor) + +Функция PreparePrintColors: + 1. инициализируем ForegroundBuffer + ForegroundBuffer = цвет Foreground ^ 0xFF + 2. инициализируем BackgroundBuffer + BackgroundBuffer = цвет Background ^ ForegroundBuffer + +Функция TextOut (входные параметры см. в исходнике): + непосредственно печать образа: + Screen = (линия_образа | BackgroundBuffer) ^ ForegroundBuffer + +Рассмотрим это на уровне точки: + цвет печати допустим Background = 0, Foreground = 1 + + получаем ForegroundBuffer = 1 ^ 0xFF получаем 0xFE + получаем BackgroundBuffer = 0 ^ 0xFE получаем 0xFE + + для цвета background из образа (=0x00) + Screen = (0x00 | 0xFE) ^ 0xFE получаем 0x00 + + для цвета foreground из образа (=0xFF) + Screen = (0xFF | 0xFE) ^ 0xFE получаем 0x01 + +можно всё это проделать для любого из цветов... + +Этот алгоритм работает медленнее при печати очень маленьких строк, из-за большой инициализации, а также из-за +частой смены цвета (хотя я во Flex Navigato'e его часто не менял, только по надобности). ;) + +27 june 2002 +Anton Enin (C) Copyright 2002 R-lab +если есть вопросы e-mail: r-lab@mail.ru или на спринтер форуме. diff --git a/docs/samples/dec32.asm b/docs/samples/dec32.asm new file mode 100644 index 0000000..35ecd74 --- /dev/null +++ b/docs/samples/dec32.asm @@ -0,0 +1,89 @@ +;[]=====================================[] +; 뢮 筮 ଠ (32-bit) +; ப (ॣ."de") +; 室: +; hl = .ࠧ, hl'= .ࠧ +; de = ப +IntToChar32: + exx + ld bc,0CA00h ; 1.000.000.000 + exx + ld bc,3B9Ah + exx + ld ix,tmp1 + res 7,(ix+0) + call GetLen32 + ld bc,0E100h ; 100.000.000 + exx + ld bc,05F5h + exx + call GetLen32 + ld bc,9680h ; 10.000.000 + exx + ld bc,98h + exx + call GetLen32 + ld bc,4240h ; 1.000.000...9.999.999 + exx + ld bc,0Fh + exx + call GetLen32 + ld bc,86A0h ; 100.000...999.999 + exx + ld bc,1 + exx + call GetLen32 +; 뢮 16-bit (hl'= 0) +IntToChar16: + ld bc,10000 ; 10.000...99.999 + exx + ld bc,0 + exx + call GetLen32 + ld bc,1000 ; 1.000..9.999 + call GetLen16 +DigitToChar: + ld bc,100 ; 100..999 + call GetLen16 + ld bc,10 ; 10..99 + call GetLen16 + ld a,l + add a,"0" + ld (de),a + ret + +tmp1: db 0 + +GetLen32: + ld a,2Fh + or a +glen32_loc1: + inc a + sbc hl,bc + exx + sbc hl,bc + exx + jr nc,glen32_loc1 + add hl,bc + exx + adc hl,bc + exx +glen32: cp "0" + jr z,glen32_loc2 + set 7,(ix+0) +glen32_loc2: + bit 7,(ix+0) + ret z + ld (de),a + inc de + ret + +GetLen16: + ld a,2Fh + or a +glen16_loc1: + inc a + sbc hl,bc + jr nc,glen16_loc1 + add hl,bc + jr glen32 diff --git a/docs/samples/delayms.asm b/docs/samples/delayms.asm new file mode 100755 index 0000000..6efc94b --- /dev/null +++ b/docs/samples/delayms.asm @@ -0,0 +1,295 @@ + DEVICE ZXSPECTRUM128 +Start_addr = 0x4200 + +use_emulator = 1 + + include "../../include/estex_h.asm" + include "../../include/head_short2.inc" + include "../../include/macro.s" + +Counter = 0xfe5b + + +LoaderStart: +main: di + ld sp,stack_buff + jp begin +;------------------------------------------------------------------------------- + +init0: SYS ESTEX_getvmode ; + ld (vmode.mode),a ; + ex af,af + ld a,b + ld (vmode.screen),a ; () + ex af,af + ld b,_VMODE._T80 ; 80 . + cp b ; ? +; jr z,.next_init0 ; + ret z + ld a,b + ld b,1 ; + ld c,ESTEX_setvmode ; + rst 0x10 + ret + + +WaitMsCallibration: + di + ld a,WaitMS_IntVector + ld i,a + im 2 + ei + halt + call WaitMS_LockCounter + di + im 1 + ld de,(WaitMS_LockHL) + ld hl,20 + call WaitMS_DIV_DE_HL + ld l,e + ld h,d + call WaitMS_NOT_HL + ld (walcx0+1),hl + ret + + +;HL=-HL +WaitMS_NOT_HL: ld a,l + cpl + ld l,a + ld a,h + cpl + ld h,a + inc hl + ret + +;DE = DE/HL +WaitMS_DIV_DE_HL: + push hl + call WaitMS_NOT_HL + ld c,l + ld b,h + ld hl,0 + ld a,e + add a,a + rl d + call wmdi08 + call wmdi08 + ld e,a + pop bc + srl b + rr c + or a + sbc hl,bc + ret c + inc de + ret + +wmdi08: call wmdi04 +wmdi04: call wmdi02 +wmdi02: call wmdi01 +wmdi01: adc hl,hl + add hl,bc + jr c,$+4 + sbc hl,bc + rla + rl d + ret + + +;One MS Delay +WaitMS_LockCounter: + push hl +walcx0: ld hl,Counter +walcx1: inc hl ;6 = 26 + ld a,l ;4 + or h ;4 + jr nz,walcx1 ;12.7 + pop hl + ret + + +;HL = Milliseconds Number +DelayMS: +DEMSCx1: ld a,l + or h + ret z + push hl + call WaitMS_LockCounter + pop hl + dec hl + jr DEMSCx1 + + +SysPrint: ld a,(hl) + inc hl + or a + ret z + push hl + call SysPrintChar + pop hl + jr SysPrint + +SysPrintChar: push bc + ld c,0x5b ; print char + rst 0x10 + pop bc + ret + + +; IN:HL=VALUE +SysPrintDEC: LD C,255 + LD DE,10000 + CALL SYPDCx0 + LD DE,1000 + CALL SYPDCx0 + LD DE,100 + CALL SYPDCx0 + LD DE,10 + CALL SYPDCx0 + LD A,L + JR SYPDCx2 +SYPDCx0: XOR A + DEC A +SYPDCx1: INC A + SBC HL,DE + JR NC,SYPDCx1 + ADD HL,DE + INC C + JR NZ,SYPDCx2 + DEC C + OR A + RET Z +SYPDCx2: INC C + ADD A,48 + PUSH HL + push DE + push BC + CALL SysPrintChar + POP BC + pop DE + pop HL + RET + +SysPrint0D0A: LD A,10 + LD C,05BH ; Print Char + RST 16 + LD A,13 + LD C,05BH ; Print Char + RST 16 + RET +;------------------------------------------------------------------------------- +;errors handles +quit: ld b,0 +.err: ld c,0x41 + rst 0x10 + jr $ + +;------------------------------------------------------------------------------- + + +begin: call init0 + + ld hl,SomeText + call SysPrint + +; CALL WaitMsCallibration + +; ld hl,(walcx0+1) +; call SysPrintDEC + + ld bc,(10000/250)*256 +lomx1: push bc + ld a,c + and 3 + jr nz,lomx4 + ld a,b + rra + rrca + dec a + ld l,a + ld h,0 + call SysPrintDEC + ld a,' ' + call SysPrintChar +lomx4: ld hl,250 + call SysPrintDEC + ld hl,TextMS + call SysPrint + pop hl + push hl + ld h,0 + ld a,l + and 3 + ld l,a + call SysPrintDEC + ld a,'.' + call SysPrintChar + ld hl,250 + call DelayMS + pop bc + inc c + push bc + ld a,c + and 3 + ld a,' ' + ld hl,SysPrintChar + jr nz,lomx2 + ld hl,SysPrint0D0A +lomx2: ld (lomx3+1),hl +lomx3: call SysPrintChar + pop bc + djnz lomx1 + + + ld a,(vmode.mode) + cp _VMODE._T80 + jr z,.exit + + ld a,(vmode.screen) + ld b,a + ld a,(vmode.mode) + SYS ESTEX_setvmode +.exit ld bc,0x0041 + rst 0x10 + jr $ + +;Interrupt For Callibration Delay + align 256 +WaitMS_IntVector = $/256-1 + org $-1 + dw WaitMS_IntCallibration + +WaitMS_LockHL dw 0 +WaitMS_IntCallibration: + ld (WaitMS_LockHL),hl + ld hl,65535 + ei + ret + + +;=============================================================================== +vmode: +.mode: db 0 +.screen: db 0 + + align 256 +str_buff: ds 256 + +stack_buff = $+255 +stack_buff_size = 256 + +;=============================================================================== + +SomeText: db "Test For Wait Milliseconds ...",cr,lf,0 +TextMS: db "ms.",0 + +;=============================================================================== + + +Loader_End: + + display "Loader start: ", LoaderStart + display "Loader end: ", Loader_End + display "Loader size: ", Loader_End-LoaderStart + savebin "delayms.exe",EXEHeader,$-EXEHeader \ No newline at end of file diff --git a/docs/samples/edit_sor/6X8.FNT b/docs/samples/edit_sor/6X8.FNT new file mode 100644 index 0000000000000000000000000000000000000000..15092a17e59a11e0e1d1c40db3f1bce2da15f2e4 GIT binary patch literal 2040 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 #8000 + +INT_TABLE_HI equ #be +INT_TABLE equ 256 * INT_TABLE_HI + +; useLib: keybLibrary, memLibrary +; useRam: INT_TABLE_HI + +; export var: +; intMode +; intFlagPlayAyMus +; intFlagPlayAyMusPageAdr + +; export fn: +; intLibInit +; intSetGameInterrupt +; intRestoreDefaultInterrupt +; intWaitVsync + + +; Векторы прерываний: +; клавиатура - #ff +; кадровое - #ff +; CovoxBlaster - #ff (признак — порт #fe.bit7 = 1 и оно висит до захвата прерывания процом) +; CTC - #06 (LSB) (висит до захвата прерывания процом) +; возможно есть и другие - надо изучить + +; СТС имеет 4 счётчика. +; идея в том, что: +; - счётчик №2 тактируется по знакоместам (1 тик = 1 знакоместо) с частотой 875 Кгц, +; - счётчик №3 тактируется от №2. +; эти два счётчика всегда работают в связке +; если один счётчик заставить отсчитать 2 пиксельных линии экрана (112 знакомест), +; а другой счётчик отсчитать 160 раз от первого, то получим одно срабатывание на 320 пиксельных линий — это полностью идентично кадровому прерыванию. + + +; Режимы прерываний +INT_MODE_SYS equ 0 +INT_MODE_GAME equ 1 +INT_MODE_VSYNC_HOOK equ 2 + + +; Здесь храним текущий режим прерываний +intMode db INT_MODE_SYS + +; Инициализация библиотеки +; запоминаем текущее состояние регистра i +; use: af +intLibInit + ld a,i + ld (_intDefaultRegI),a + ret + + +; Установка прерываний игры +; use: hl,af,i +intSetGameInterrupt + ; Перед установкой CTC нам необходимо поймать кадровое прерывание + ; (это важно т.к. у нас некоторые циклы работают с одним экраном до прихода луча развертки) + ; Просто ei:halt не подойдет т.к. общий вектор для кадрового и клавиатурного прерываний + ; и если в данный момент будут нажаты кнопки мы поймаем прерывание от них и окажемся в случайном месте кадра + ; Делаем в несколько шагов: + ; 1. Отключаем системные прерывания чтобы не мешались + ; (т.к. они в том числе обрабатывают прерывания от клавиатуры и читают из неё данные) + ; и устанавливаем пустой обработчик прерываний + ; также сразу устанавливаем адрес обработки CTC + di + ld hl,_intHandlerCtc + ld (INT_TABLE + #06),hl + ld hl,_intHandlerNull + ld (INT_TABLE + #ff),hl + ld a,INT_TABLE_HI + ld i,a + im 2 + ld a,INT_MODE_VSYNC_HOOK + ld (intMode),a + ; 2. Далее ждем прерываний - если есть данные от клавиатуры, то это не кадровое + ; если одновременно будет и кадровое и клавиатура - пропустим кадровое но тут нам это не страшно (дождемся следующего) +_vSyncHookLoop + ei + halt + di + in a,(COM_A) + bit 0,a ; проверить наличие данных от клавиатуры + jr z,_vSyncHookSuccess ; если нет данных значит поймали кадровое + in a,(DAT_A) ; считать байт + jr _vSyncHookLoop + ; 3. Поймали кадровое прерывание + ; Настраиваем CTC и устанавливаем прерывания игры + ; Почему именно такие значения - надо читать доку по z84c15 +_vSyncHookSuccess + ld a,#57 : out (CTC.Ch_2),a + ld a,112 : out (CTC.Ch_2),a + ld a,#d7 : out (CTC.Ch_3),a + ld a,160 : out (CTC.Ch_3),a + ld a,0 : out (CTC.Ch_0),a + ld hl,_intHandlerKeybOrFrame + ld (INT_TABLE + #ff),hl + ld a,INT_MODE_GAME + ld (intMode),a + ;------- + ; инициализируем CovoxBlaster + jp soundDeviceCovoxBlasterLib.init + +; Пустой обработчик прерываний - нужен для определения от кого прерывание (см. intSetGameInterrupt) +; use: - +_intHandlerNull + di + call _intReti + ei: ret + +_intReti + ei + reti + + +; Восстановление прерываний +; (обязательно делать перед использованием функций дос и биос) +; use: af, i +intRestoreDefaultInterrupt + di + ld a,1 + out (CTC.Ch_3),a + ld a,INT_MODE_SYS + ld (intMode),a + ld a,#00 +_intDefaultRegI equ $-1 + ld i,a + im 1 + ret + + +; Обработчик "кадровых" прерываний от CTC +; на выходе нужно именно reti если заменить на ret то прерывание от CTC больше не придет +; use: save & restore all used regs to stack +_intHandlerCtc + di + push hl,de,bc,af + ex af,af + push af + ;- + ld a,1 + ld (_vsyncFlag),a ; Устанавливаем флаг что пришло кадровое прерывание + ;- + in a,(EmmWin.P1) + ld (_intEmmWinP1),a + call soundLib.intHandler + ld a,0 +_intEmmWinP1 equ $-1 + out (EmmWin.P1),a + ;--- + pop af + ex af,af + pop af,bc,de,hl + call _intReti + ei: ret + + +; Обработчик прерываний от клавиатуры и кадровых +; тут делаем только обработку прерываний от клавиатуры +; use: save & restore all used regs to stack +_intHandlerKeybOrFrame + di + push hl,de,bc,af + ;--- + call keybIntHandler + ;di + ;--- + call soundDeviceCovoxBlasterLib.intHandler + ;--- + pop af,bc,de,hl + call _intReti + ei: ret + +; Ожидаем начало фрейма (прерывание от СТС) +; Для этого сбрасываем (_vsyncFlag), делаем ei:halt и проверяем что дождались (_vsyncFlag)=1 - кадровое +; use: af +intWaitVsync + ld a,(intMode) + cp INT_MODE_SYS + jr z,_intWaitVsyncSys + ;- + xor a + ld (_vsyncFlag),a + ;- + if DEBUG_BORDER = 1 + xor a: out(#fe),a + endif + ;- +_intWaitVsyncLoop + ei + halt + ;- + ld a,0 +_vsyncFlag equ $-1 + and a + jr z,_intWaitVsyncLoop + ;- + if DEBUG_BORDER = 1 + ld a,2: out(#fe),a + endif + ;- + ret + ; Ожидаем начало фрейма в режиме системных прерываний (ei:halt) + ; можем поймать прерывание от клавиатуры вместо кадрового + ; Наверное надо бы запретить вызывать intWaitVsync при системных прерываниях, например так: + ; if DEBUG_IS_ON = 1 + ; ld hl,txtErrorIntWaitVsync + ; jp debugShowError + ; endif + ; txtErrorIntWaitVsync db "ERROR: Call IntWaitVsync with system int", #00 +_intWaitVsyncSys + call memCacheOffTemporary ;временно выключаем fastRam + ei + halt + jp memCacheRestoryState ;восстанавливаем состояние подключения fastRam diff --git a/docs/samples/sprinterKeybLib.asm b/docs/samples/sprinterKeybLib.asm new file mode 100755 index 0000000..3333145 --- /dev/null +++ b/docs/samples/sprinterKeybLib.asm @@ -0,0 +1,140 @@ +; Библиотека работы с клавиатурой +keybLibrary + +COM_A EQU 19h +DAT_A EQU 18h + +;From z84c15 SIO instruction +;COM_A Read +;d0 - Rx Character available +;d1 - Int panding (Ch.A only) +;d2 - Tx buffer empty +;d3 - DCD +;d4 - Syan/Hunt +;d5 - CTS +;d6 - Tx Under.../ EOM +;d7 - Break/Abort +;Note: d3-d7 used with "External Status Interrupt" Modes + +; Установка портов режима +; в соответствии с описанием +; последовательного порта z84c15 +; use: a +keybLibInit + ld a,#00 + out (COM_A),a + ld a,#01 + out (COM_A),a + ld a,#00 + out (COM_A),a + ld a,#03 + out (COM_A),a + ld a,#c1 + out (COM_A),a + ld a,#04 + out (COM_A),a + ld a,#05 + out (COM_A),a + ld a,#05 + out (COM_A),a + ld a,#62 + out (COM_A),a + ret + + +; Считывание с клавиатуры пр прерываниям +; use: hl,de,af +keybIntHandler + ld hl,keybBufferSize + ld de,(_keybBufferPosWrite) +_keybIntHandlerLoop + in a,(COM_A) + bit 0,a ; проверить наличие байта + ret z ; вернуться, если нет байта + in a,(DAT_A) ; считать байт + ld (de),a + inc e + ld (_keybBufferPosWrite),de + inc (hl) + jp _keybIntHandlerLoop + + +; Очистка буфера +; use: hl,af +keybClearBuff + di + xor a + ld (keybBufferSize),a + ld hl,keybBuffer + ld (keybBufferPosRead),hl + ld (_keybBufferPosWrite),hl +_keybClearBuffLoop + in a,(COM_A) + bit 0,a ; проверить наличие байта + ret z ; вернуться, если нет байта + in a,(DAT_A) ; считать байт + jp _keybClearBuffLoop + + +; Читаем и декодируем данные из буфера +; use: hl,de,af +; ret: +; a - code (0 if no data) +; carry=1 if release =0 if presseed +keybGetKey + ld hl,keybBufferSize + ld de,(keybBufferPosRead) + ld a,(hl) + ld b,a + or a + ret z + ld a,(de): inc e + cp #f0 + jr z,keybGetKeyF0; release + cp #e0 + jr z,keybGetKeyE0; prefix E0 + ld (keybBufferPosRead),de: dec (hl) +keybGetKeyHasKeyPressed + and a +keybGetKeyHasKey + ld h,#40 + ld l,a + ld a,(hl) + ret +keybGetKeyF0; release + dec (hl) + jr z,keybGetKeyNoData + ld a,(de): inc e + ld (keybBufferPosRead),de: dec (hl) + scf + jr keybGetKeyHasKey +keybGetKeyE0; prefix E0 + dec (hl) + jr z,keybGetKeyNoData + ld a,(de): inc e + cp #f0 + jr z,keybGetKeyE0F0; prefix E0, release + ld (keybBufferPosRead),de: dec (hl) + add a,#80 + jr keybGetKeyHasKeyPressed +keybGetKeyE0F0; prefix E0,release + dec (hl) + jr z,keybGetKeyNoData2 + ld a,(de): inc e + ld (keybBufferPosRead),de: dec (hl) + add a,#80 + scf + jr keybGetKeyHasKey +keybGetKeyNoData2 + inc (hl) +keybGetKeyNoData + inc (hl) + xor a + ret + +keybBufferSize db 0 +keybBufferPosRead dw keybBuffer +_keybBufferPosWrite dw keybBuffer + + align 256 +keybBuffer ds 256,0 diff --git a/docs/samples/Пример для CBL.asm b/docs/samples/Пример для CBL.asm new file mode 100755 index 0000000..032395d --- /dev/null +++ b/docs/samples/Пример для CBL.asm @@ -0,0 +1,170 @@ +Interrupt_Vector: EQU 0BE00h; Вектор прерываний + + ... + + DI + LD A, I + LD (.SaveInterrupt), A + LD A, HIGH Interrupt_Vector + LD I, A + IM 2 + + ; Заполним буфер "тишины" для CBL + LD A, 080h + LD HL, BufNoSound + LD DE, BufNoSound + 1 + LD BC, 128 ; для 16 бит 256 + LD (HL), A + LDIR + + ; Прерывание от CBL + LD HL, IM2_CBL + LD (Interrupt_Vector OR 0FFh), HL + + ; Установим в CBL тишину + LD A, 2 + LD (IM2_CBL.NumberPage), A + + ... + + EI + + ; Включим CBL + LD BC, 004Eh + LD A, 10011000b ; COVOX-Blaster + Interrupt + 7.8125 KHz + OUT (C), A + + ... + + LD A, ... + LD HL, ... + LD BC, ... + CALL PlaySound + + ... + +; Ожидаем завершения воспроизведения CBL +.LoopEndSound: + HALT + LD A, (IM2_CBL.NumberPage) + OR A + JR NZ, .LoopEndSound + + ; Выключим CBL + LD BC, 004Eh + XOR A + OUT (C), A + + ... + + DI + +; Восстановим вектор прерывания +.SaveInterrupt+*: LD A, 0 + LD I, A + IM 1 + EI + +.Exit: + LD C, DSS.Exit + RST 10h + JR $ + +BufNoSound: DS 128 + +; Проиграть звук +; A - Номер страницы с данными для воспроизведения +; HL - Адрес начала данных для воспроизведения в 1й странице (4000h..7FFFh) +; BC - Длина данных для воспроизведения, должна должны быть кратна 128 байтам +PlaySound: + PUSH AF, HL + ; Если нужно ожидать завершение предыдущего воспроизведения, то раскомментировать + ; LD A, (IM2_CBL.NumberPage) + ; OR A + ; JR NZ, .Exit + LD (IM2_CBL.NumberPage), A + LD (IM2_CBL.AddrSound), HL + LD (IM2_CBL.Length), BC +.Exit: + POP HL, AF + RET + + +IM2_CBL: + DI + PUSH AF + IN A, (0FEh) + RLCA + JR NC, .NoSound ; Если прерывание не от CBL +.NumberPage+*: LD A, 0 + OR A + JR Z, .NoSound ; Если нечего играть + PUSH BC, DE, HL + CP 3 + JR NC, .PlaySound + DEC A + LD (.NumberPage), A + + ;SaveAndSetPage1 .Save_Page_1, (Pages.Data) + IN A, (PAGE_1) + LD (.Save_Page_1), A + LD A,(Pages.Data) + OUT (PAGE_1), A + + LD HL, BufNoSound + JR .CopyData + +.PlaySound: + LD D, A + ;SaveAndSetPage1 .Save_Page_1, D + IN A, (PAGE_1) + LD (.Save_Page_1), A + LD A, D + OUT (PAGE_1), A +.AddrSound+*: LD HL, 0 +.CopyData: + IN A, (PAGE_3) + LD (.Save_Page_3), A + LD A, 0FDh + OUT (PAGE_3), A + + LD DE, 0C000h + ; Запись данных с помощью акселератора + LD B, E + LD D, D ; ACC_On_NoDI + LD C, 128 ; BC = 128 байт + LD L, L; ACC_CopyBlock_Horizontal + LD A, (HL) + LD (DE), A + LD B, B; ACC_Off_NoEI + + ;; Запись данных через порт 4Fh + ; PUSH BC, HL + ; LD BC, 804Fh + ; OTIR + ; POP HL, BC + + ADD HL, BC + LD (.AddrSound), HL + OR A +.Length+*: LD HL, 0 + SBC HL, BC + JR NZ, .NotEndSound + LD A, 2 + LD (.NumberPage), A + LD HL, 512 ; Такая длина, чтобы не было рекурсии +.NotEndSound: + LD (.Length), HL + +.Exit: +.Save_Page_1+*: LD A, 0 + OUT (PAGE_1), A +.Save_Page_3+*: LD A, 0 + OUT (PAGE_3), A + + POP HL, DE, BC +.NoSound: + POP AF + EI + RETI + diff --git a/docs/solid_c_compatibility.md b/docs/solid_c_compatibility.md new file mode 100644 index 0000000..86b8e65 --- /dev/null +++ b/docs/solid_c_compatibility.md @@ -0,0 +1,135 @@ +# Solid-C compatibility — gap analysis + +**Goal:** if a function exists in Solid-C, it must exist in our libc (with the same name). If we deliberately use a different name, document the difference here. + +Solid-C source (`third_party/solid-c/INCLUDE/*.H`) provides these functions. SDCC's z80.lib auto-includes most of the standard C library. This document tracks the remaining gaps. + +## Already covered (no work needed) + +**From our libc directly:** +atexit, chdir, clearerr, close, clrscr, cprintf, cputs, creat, ctime, asctime, +exit, _exit, fclose, feof, ferror, fflush, fgetc, fgets, ffirst, fnext, +fopen, fputc, fputs, fread, fseek, fstat, ftell, fwrite, getch, getchar, +getche, getcwd, getenv, gotoxy, kbhit, longjmp, lseek, mkdir, open, perror, +printf, putch, putchar, putenv, puts, read, rewind, rmdir, setjmp, sleep, +sprintf, stat, textattr, textbackground, textcolor, unlink, vprintf, +vsprintf, write, wherex, wherey, set_videomode, get_videomode, +mouse_{init,show,hide,read,goto,bounds_x,bounds_y,refresh,text_cursor, +load_cursor,get_cursor,get_sensitivity_x,get_sensitivity_y,set_sensitivity, +video_mode_changed}. + +**Free from SDCC's z80.lib (auto-linked):** +abs, atof, atoi, atol, bsearch, calloc, free, isalpha, isdigit, islower, +isupper, isspace, iscntrl, isgraph, isprint, ispunct, isalnum, isxdigit, +malloc, memchr, memcmp, memcpy, memmove, memset, qsort, rand, realloc, +srand, strcat, strchr, strcmp, strcpy, strcspn, strlen, strncat, strncmp, +strncpy, strpbrk, strrchr, strspn, strstr, strtok, strtol, strtoul, +tolower, toupper. + +## REAL gaps — to implement + +### Category A: trivial (one-liner aliases or small wrappers) + +| Solid-C | Status | Notes | +|---|---|---| +| `getc(fd)` | macro alias | `#define getc(fp) fgetc(fp)` | +| `putc(c, fp)` | macro alias | `#define putc(c,fp) fputc(c,fp)` | +| `remove(name)` | alias | `#define remove(n) unlink(n)` (POSIX semantic match) | +| `seek(fd, off)` | alias | `int seek(fd, off) { return lseek(fd, off, SEEK_SET); }` | +| `tell(fd)` | alias | `int tell(fd) { return lseek(fd, 0, SEEK_CUR); }` | +| `ltell(fd, &lpos)` | wrapper | wrap our `lseek` (32-bit) | +| `home()` | macro alias | `#define home() gotoxy(0,0)` | +| `_setargv()` | crt0 does this | provide stub or doc that crt0 covers it | +| `_ffirst()` | alias | already have `ffirst` with same semantic — alias macro | +| `setmem(p, n, b)` | alias | `#define setmem(p,n,b) memset(p,b,n)` | +| `movmem(s, d, n)` | alias | `#define movmem(s,d,n) memcpy(d,s,n)` (note arg order!) | +| `min(a,b)`, `max(a,b)` | macros | `#define min(a,b) ((a)<(b)?(a):(b))` etc. | +| `isascii(c)` | macro | `#define isascii(c) ((unsigned)(c) < 128)` | +| `abort()` | wrapper | `void abort(void) { _exit(0xFF); }` | +| `strerr(n)` | alias | rename existing `strerror` or alias | +| `sysenv()` | wrapper | already have env API, just alias | + +### Category B: small new implementations + +| Solid-C | Notes | +|---|---| +| `dec8/dec16/dec32` | print uint8/16/32 as decimal — use sprintf("%u") internally | +| `hex8/hex16/hex32` | print uint8/16/32 as hex — we have `print_hex`, just add hex16 and hex32 | +| `strlwr(s)` | in-place lowercase the string (returns s) | +| `strupr(s)` | in-place uppercase the string | +| `div(num, den)` | returns `div_t { quot, rem }` — trivial wrapper over `/` and `%` | +| `getc/putc/ungetc` | one-byte putback for streams; `ungetc` needs 1-char buffer in FILE* | +| `gets(buf)` | dangerous-but-Solid-C-has-it, simple fgets-wrapper | +| `cgets(buf)` | line input via conio (no echo control — wrap getche loop) | +| `inp(port)` / `outp(port,val)` | direct port I/O — Z80 IN/OUT, can be __sfr or inline asm wrappers | +| `enable()` / `disable()` | `__asm ei __endasm` / `__asm di __endasm` | +| `getdisk()` / `setdisk(d)` | ESTEX $02 CURDISK / $01 CHDISK | + +### Category C: requires research / non-trivial work + +| Solid-C | Notes | +|---|---| +| `fdopen(fd, mode)` / `freopen` | needs FILE* expansion — currently we have unbuffered FILE; mid-effort | +| `fclosall()` | iterate over all open FILE*'s and close them — depends on FILE table refactor | +| `fgetpos(fp, &pos)` / `fsetpos` | wrappers over ftell/fseek with `fpos_t` type | +| `bdos(a, hl)` / `bdosh(...)` / `intdos(®s)` | Solid-C exposes raw ESTEX call interface. Our convention is typed wrappers — we may **document** the difference and skip these. | +| `absread(disk, n, sect, buf)` / `abswrite` | absolute disk sector I/O — need ESTEX READ_SECT / WRITE_SECT (need to find function numbers) | +| `_ffirst` raw vs `ffirst` cooked | Solid-C has two — raw "FilenameExt" format and cooked. Investigate if we want both. | +| `ioctl(fd, ...)` | terminal control — Solid-C scope unclear, may skip | +| `isatty(fd)` | trivial (always returns 0 — we have no tty handle), but check our FD numbers | +| `brk(addr)` / `sbrk(n)` | classical Unix heap pointer manipulation; our heap is managed by SDCC `_sbrk` already? Investigate alias. | +| `scanf` / `sscanf` / `fscanf` | parser — SDCC may have it in stdlib if requested. Check or add stub. | +| `getdate` / `gettime` / `setdate` / `settime` | we have `getdatetime`/`setdatetime`; Solid-C splits into date/time structs. Build wrappers. | + +### Category D: Mouse aliases — Solid-C `ms_*` names + +Solid-C uses short names: `ms_init/show/hide/stat/spos/ybnd/xbnd/scur/tcur/gcur/gsen/ssen/hard/vmod/ref` + `msgstat`/`mssgpos`. All have the same semantics as our `mouse_*` functions. + +**Plan:** add aliases via header macros so both names work: + +```c +#define ms_init mouse_init +#define ms_show mouse_show +/* ... etc */ +``` + +Also Solid-C wraps state into `MSSTAT` (8-bit coords) and `MSGSTAT` (16-bit coords) structs. Our `mouse_state_t` already matches `MSGSTAT` semantics — add a typedef alias. + +## Documented differences (will NOT match Solid-C exactly) + +These will be in `docs/solid_c_diff.md`: + +- **`bdos` / `bdosh` / `intdos`** — we don't expose raw ESTEX call interface; use typed wrappers +- **`FILE*` model** — ours is unbuffered (currently); Solid-C may use buffered streams +- **Error code constants** — Solid-C's `EZERO/EINVFNC/etc.` vs our `errno` table. Will provide compat aliases in `errno.h`. + +## Implementation plan + +**Phase 1 — trivial aliases/macros** (~1 hour): +- conio.h additions: `home`, `inp`, `outp`, `enable`, `disable` +- stdio.h: `getc`, `putc`, `remove`, `gets` +- string.h: `setmem`, `movmem`, `strlwr`, `strupr`, `strerr` +- stdlib.h: `min`, `max`, `div`, `abort`, `sysenv`, `dec8/16/32`, `hex8/16/32` +- ctype.h: `isascii` +- io.h: `seek`, `tell`, `ltell`, `_setargv` stub +- dir.h: `_ffirst` +- mouse.h: `ms_*` aliases + `MSSTAT`/`MSGSTAT` typedefs +- types.h: provide compat `BOOL`/`uint`/`WORD`/`f_point` types + +**Phase 2 — new impls** (~2-3 hours): +- ungetc, gets, cgets +- getdisk/setdisk +- getdate/gettime/setdate/settime (split datetime struct) + +**Phase 3 — investigate / decide** (research first): +- absread/abswrite (sector I/O) +- scanf family (SDCC has it?) +- brk/sbrk vs SDCC heap + +## Compatibility header + +To make porting easier, add a single `` that includes all the standard headers (`stdio.h`, `string.h`, `conio.h`, etc.) — Solid-C programs can `#include ` and have most functions available. + +## History + +- 2026-06-01 — initial gap analysis vs Solid-C v2004 diff --git a/examples/argv/Makefile b/examples/argv/Makefile new file mode 100644 index 0000000..23944a6 --- /dev/null +++ b/examples/argv/Makefile @@ -0,0 +1,5 @@ +# Build argv_test.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := argv +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/argv/argv.c b/examples/argv/argv.c new file mode 100644 index 0000000..7b5cafa --- /dev/null +++ b/examples/argv/argv.c @@ -0,0 +1,22 @@ +#include + +/* + * Prints every command-line argument, then exits. + * + * Try in MAME / ESTEX shell: + * ARGV_TES -> argc=1, argv[0] = "" + * ARGV_TES one two three -> argc=4, argv[1..3] = "one","two","three" + * ARGV_TES spaced args -> multiple spaces are squashed + */ + +int main(int argc, char **argv) +{ + printf("argc = %d\n", argc); + for (int i = 0; i < argc; i++) { + printf("argv[%d] = \"%s\"\n", i, argv[i]); + } + puts(""); + puts("Press any key to exit..."); + (void)getchar(); + return 0; +} diff --git a/examples/assrtest/Makefile b/examples/assrtest/Makefile new file mode 100644 index 0000000..19f85fc --- /dev/null +++ b/examples/assrtest/Makefile @@ -0,0 +1,3 @@ +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := assrtest +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/assrtest/assrtest.c b/examples/assrtest/assrtest.c new file mode 100644 index 0000000..dbbfe3d --- /dev/null +++ b/examples/assrtest/assrtest.c @@ -0,0 +1,43 @@ +/* + * assrtest — exercise from SDCC's z80.lib. + * + * Tests both the disabled-debug (NDEBUG) form and the active form. + * The failing assert at the end prints an error message via printf + * (which routes through our putchar) and then halts. + */ + +#include +#include + +static int divide(int a, int b) +{ + assert(b != 0); /* must succeed for the test cases */ + return a / b; +} + +int main(int argc, char **argv) +{ + (void)argc; (void)argv; + + puts("assrtest: exercising "); + + /* These pass. */ + int q = divide(10, 2); + printf(" divide(10, 2) = %d\n", q); + assert(q == 5); + + q = divide(-9, 3); + printf(" divide(-9, 3) = %d\n", q); + assert(q == -3); + + puts(" all passing asserts OK"); + + /* Final, failing assert. Prints "Assert(...) failed in function ..." + * then enters an infinite loop (SDCC __assert convention). */ + puts(" triggering deliberate failing assert (system will hang)..."); + int zero = 0; + (void)divide(1, zero); + + /* unreachable */ + return 0; +} diff --git a/examples/attrprob/Makefile b/examples/attrprob/Makefile new file mode 100644 index 0000000..a19db18 --- /dev/null +++ b/examples/attrprob/Makefile @@ -0,0 +1,5 @@ +# Build attr_probe.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := attrprob +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/attrprob/attrprob.c b/examples/attrprob/attrprob.c new file mode 100644 index 0000000..4b71d36 --- /dev/null +++ b/examples/attrprob/attrprob.c @@ -0,0 +1,79 @@ +#include +#include +#include + +/* + * attr_probe — visualise every value of the ESTEX attribute byte. + * + * Layout: + * row 2 16 cells: low nibble 0..F, high nibble 0 (varying fg) + * row 4 16 cells: low nibble 7, high nibble 0..F (varying bg) + * row 6 bit-7 toggle test: 8 pairs comparing N with N|0x80 + * row 8 full 16x16 grid: bg outer, fg inner — every attribute byte + * row 26 RDCHAR readback of a known cell + * + * Each cell is drawn with wrchar() so the attribute is set exactly, + * independent of ESTEX's hidden "current" attribute used by PCHARS. + */ + +int main(void) +{ + clrscr(); + + gotoxy(20, 0); cputs("== attr probe =="); + + /* Row 2: vary fg (low nibble), bg = 0 (black). */ + gotoxy(0, 2); cputs("fg 0..F /bg0:"); + for (int i = 0; i < 16; i++) { + wrchar(15 + i, 2, 'A' + i, (uint8_t)i); + } + + /* Row 4: vary bg (high nibble), fg = 7 (light gray). */ + gotoxy(0, 4); cputs("bg 0..F /fg7:"); + for (int i = 0; i < 16; i++) { + wrchar(15 + i, 4, 'A' + i, (uint8_t)((i << 4) | 0x07)); + } + + /* Row 6: compare attr N with N|0x80 — bit 7 may be blink or extra bg. */ + gotoxy(0, 6); cputs("bit7: N|N|0x80 pairs (1F,2E,3D,4C,5B,6A,79,F0):"); + { + static const uint8_t probes[] = { 0x1F, 0x2E, 0x3D, 0x4C, + 0x5B, 0x6A, 0x79, 0xF0 }; + for (int i = 0; i < 8; i++) { + wrchar(2 + i*4, 7, '*', probes[i]); + wrchar(2 + i*4 + 1, 7, '*', probes[i] | 0x80); + /* hex labels under each pair */ + gotoxy(2 + i*4, 8); + printf("%02X", probes[i]); + } + } + + /* Row 10..25: full 16x16 grid of every attr byte 0x00..0xFF. + * Cell (col, row) = (col_idx + offset, row_idx + 10) holds char '#' + * with attr = (row_idx << 4) | col_idx. */ + gotoxy(0, 10); cputs("Full 16x16 grid (row=bg, col=fg):"); + for (int row = 0; row < 16; row++) { + for (int col = 0; col < 16; col++) { + uint8_t attr = (uint8_t)((row << 4) | col); + wrchar(20 + col, 11 + row, '#', attr); + } + /* label rows */ + gotoxy(15, 11 + row); + printf("%X:", row); + } + gotoxy(20, 27); + cputs("0123456789ABCDEF (fg)"); + + /* RDCHAR readback test. */ + { + uint16_t got = rdchar(15, 2); + gotoxy(0, 29); + printf("rdchar(15,2) -> ch=0x%02X attr=0x%02X (expected 'A'=0x41 attr=0x00)", + got & 0xFF, (got >> 8) & 0xFF); + } + + gotoxy(0, 31); + cputs("press any key"); + getch(); + return 0; +} diff --git a/examples/banked/Makefile b/examples/banked/Makefile new file mode 100644 index 0000000..ccea1d0 --- /dev/null +++ b/examples/banked/Makefile @@ -0,0 +1,11 @@ +# Build banked.exe — HUGE memory mode (small + banked code in W3). +# +# Layout: +# CODE/HOME at 0x4100 (W1), DATA at 0x8000 (W2), banks at 0x{N}C000 (W3). +# crt0_banked.s loads N banks from the .EXE before calling main. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := banked +MEMORY := huge +EXTRA_FLAGS := --bank 1=bank1.c --bank 2=bank2.c +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/banked/bank1.c b/examples/banked/bank1.c new file mode 100644 index 0000000..58ee0e4 --- /dev/null +++ b/examples/banked/bank1.c @@ -0,0 +1,17 @@ +#include +#include +#include + +void bank1_func(int x) __banked +{ + (void)x; + puts("BANK1: hello from a banked function!"); + puts("BANK1: window 3 phys page = "); + print_hex(_io_page_w3); /* should be BANK1's phys page */ + putchar('\n'); + putchar('1'); + putchar('='); + putchar('0' + (x / 10) % 10); + putchar('0' + x % 10); + putchar('\n'); +} diff --git a/examples/banked/bank2.c b/examples/banked/bank2.c new file mode 100644 index 0000000..8f447ac --- /dev/null +++ b/examples/banked/bank2.c @@ -0,0 +1,18 @@ +#include +#include +#include + +void bank2_func(int x) __banked +{ + (void)x; + puts("BANK2: hello from the second bank!"); + puts("BANK2: window 3 phys page = "); + print_hex(_io_page_w3); /* should be BANK2's phys page */ + putchar('\n'); + putchar('2'); + putchar('='); + putchar('0' + (x / 100) % 10); + putchar('0' + (x / 10) % 10); + putchar('0' + x % 10); + putchar('\n'); +} diff --git a/examples/banked/banked.c b/examples/banked/banked.c new file mode 100644 index 0000000..1821f93 --- /dev/null +++ b/examples/banked/banked.c @@ -0,0 +1,47 @@ +#include +#include +#include + +/* crt0_banked.s reads this constant to know how many banks to load. */ +const uint8_t n_banks = 2; + +void bank1_func(int x) __banked; +void bank2_func(int x) __banked; + +extern uint8_t bank_pages[]; /* filled by crt0_banked.s */ + +static void show_w3(const char *who) +{ + puts(who); + print_hex(_io_page_w3); /* current physical page mapped in window 3 */ + putchar('\n'); +} + +int main(void) +{ + puts("HOME: program start."); +#ifdef DEBUG_RT + printf("HOME: w2_self_allocated = %u\n", w2_self_allocated); +#endif + show_w3("HOME: window 3 phys page = "); + + puts("HOME: bank_pages[1] (BANK1 phys) = "); + print_hex(bank_pages[1]); + putchar('\n'); + puts("HOME: bank_pages[2] (BANK2 phys) = "); + print_hex(bank_pages[2]); + putchar('\n'); + + puts("HOME: calling bank1_func(42)..."); + bank1_func(42); + show_w3("HOME: back, window 3 phys = "); + + puts("HOME: calling bank2_func(123)..."); + bank2_func(123); + show_w3("HOME: back, window 3 phys = "); + + puts("HOME: done."); + puts("Press any key to exit..."); + (void)getchar(); + return 0; +} diff --git a/examples/bankedbg/Makefile b/examples/bankedbg/Makefile new file mode 100644 index 0000000..6dac356 --- /dev/null +++ b/examples/bankedbg/Makefile @@ -0,0 +1,12 @@ +# Build banked_big.exe — BIG memory mode (tiny + banked code in W1). +# +# Layout: +# CODE/HOME at 0x8100 (W2), DATA chained after CODE (W2) +# Banks at virtual 0x{N}4000 — physical pages mapped into W1 +# crt0_banked.s + bank.s built with BANK_W1=1 by sprinter-cc + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := bankedbg +MEMORY := big +EXTRA_FLAGS := --bank 1=bank1.c --bank 2=bank2.c +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/bankedbg/bank1.c b/examples/bankedbg/bank1.c new file mode 100644 index 0000000..a3f51df --- /dev/null +++ b/examples/bankedbg/bank1.c @@ -0,0 +1,17 @@ +#include +#include +#include + +void bank1_func(int x) __banked +{ + (void)x; + puts("BANK1: hello from a banked function (W1)!"); + puts("BANK1: window 1 phys page = "); + print_hex(_io_page_w1); /* should be BANK1's phys page */ + putchar('\n'); + putchar('1'); + putchar('='); + putchar('0' + (x / 10) % 10); + putchar('0' + x % 10); + putchar('\n'); +} diff --git a/examples/bankedbg/bank2.c b/examples/bankedbg/bank2.c new file mode 100644 index 0000000..00d687a --- /dev/null +++ b/examples/bankedbg/bank2.c @@ -0,0 +1,18 @@ +#include +#include +#include + +void bank2_func(int x) __banked +{ + (void)x; + puts("BANK2: hello from the second bank (W1)!"); + puts("BANK2: window 1 phys page = "); + print_hex(_io_page_w1); /* should be BANK2's phys page */ + putchar('\n'); + putchar('2'); + putchar('='); + putchar('0' + (x / 100) % 10); + putchar('0' + (x / 10) % 10); + putchar('0' + x % 10); + putchar('\n'); +} diff --git a/examples/bankedbg/bankedbg.c b/examples/bankedbg/bankedbg.c new file mode 100644 index 0000000..f0ef758 --- /dev/null +++ b/examples/bankedbg/bankedbg.c @@ -0,0 +1,58 @@ +/* + * banked_big — BIG memory mode: base CODE+DATA in W2, banked code in W1. + * + * Layout: + * _CODE at 0x8100 (W2), DATA chained after CODE (W2) + * _BANK1 / _BANK2 at virtual 0x{N}4000 — physical page mapped into W1 + * trampoline ___sdcc_bcall_ehl swaps port 0xA2 (W1) to call bank funcs + * + * Mirrors examples/banked (HUGE mode) for direct comparison. + */ + +#include +#include +#include + +/* crt0_banked.s reads this constant to know how many banks to load. */ +const uint8_t n_banks = 2; + +void bank1_func(int x) __banked; +void bank2_func(int x) __banked; + +extern uint8_t bank_pages[]; /* filled by crt0_banked.s */ + +static void show_w1(const char *who) +{ + puts(who); + print_hex(_io_page_w1); /* current physical page mapped in window 1 */ + putchar('\n'); +} + +int main(void) +{ + puts("HOME: program start (BIG mode)."); +#ifdef DEBUG_RT + printf("HOME: w2_self_allocated = %u\n", w2_self_allocated); +#endif + show_w1("HOME: window 1 phys page = "); + + puts("HOME: bank_pages[1] (BANK1 phys) = "); + print_hex(bank_pages[1]); + putchar('\n'); + puts("HOME: bank_pages[2] (BANK2 phys) = "); + print_hex(bank_pages[2]); + putchar('\n'); + + puts("HOME: calling bank1_func(42)..."); + bank1_func(42); + show_w1("HOME: back, window 1 phys = "); + + puts("HOME: calling bank2_func(123)..."); + bank2_func(123); + show_w1("HOME: back, window 1 phys = "); + + puts("HOME: done."); + puts("Press any key to exit..."); + (void)getchar(); + return 0; +} diff --git a/examples/banklocl/Makefile b/examples/banklocl/Makefile new file mode 100644 index 0000000..6cee7f2 --- /dev/null +++ b/examples/banklocl/Makefile @@ -0,0 +1,12 @@ +# bank_local_data — code AND static data live in BANK1. +# +# HUGE mode: HOME at 0x4100 (W1), DATA at 0x8000 (W2), BANK1 in W3. +# sprinter-cc compiles bank1.c with --codeseg/--constseg/--dataseg BANK1 +# automatically (via --bank 1=bank1.c). mkexe gets `-p 0` so BSS pages +# in the bank land as zero-filled — no runtime zeroing needed. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := banklocl +MEMORY := huge +EXTRA_FLAGS := --bank 1=bank1.c --mkexe -p --mkexe 0 +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/banklocl/bank1.c b/examples/banklocl/bank1.c new file mode 100644 index 0000000..f66b548 --- /dev/null +++ b/examples/banklocl/bank1.c @@ -0,0 +1,85 @@ +/* + * bank1.c — code, const tables AND writable static data all live in the + * BANK1 page mapped into window 3 while these functions run. + * + * Compile flags (see Makefile): + * --codeseg BANK1 functions go to _BANK1 area + * --constseg BANK1 `static const` tables go to _BANK1 + * --dataseg BANK1 uninitialized data (BSS) goes to _BANK1 + * + * mkexe -p 0 zero-pads the bank's image, so any BSS bytes that don't + * appear in the IHX file are 0x00 when the bank is loaded — free zero + * init for `uint8_t buf[N];`. + * + * Note: a CRITICAL trampoline fix is required (see memory/sdcc_banking) + * — the old bcall used `pop af; out (n), a` which clobbered the uint8_t + * return value. Without that fix, banked functions returning a byte + * would silently return the saved page number instead. + */ + +#include +#include +#include + +uint8_t bank1_buf[16]; + +static const uint16_t bank1_tab[5] = { 100, 200, 300, 400, 500 }; + + +void bank1_fill(int seed) __banked +{ + uint8_t *p = bank1_buf; + for (int i = 0; i < 16; i++) + p[i] = (uint8_t)(seed + i); +} + +uint8_t bank1_peek(int idx) __banked +{ + uint8_t *p = bank1_buf; + if (idx < 0 || idx >= 16) return 0xFF; + return p[idx]; +} + +uint16_t bank1_sumtab(void) __banked +{ + uint16_t s = 0; + for (int i = 0; i < 5; i++) s += bank1_tab[i]; + return s; +} + +void bank1_map_print(void) __banked +{ + printf( "bank1_buf = %p\n", bank1_buf); + printf( "bank1_tab = %p\n", bank1_tab); + printf( "bank1_fill = %p\n", bank1_fill); + printf( "bank1_peek = %p\n", bank1_peek); + printf( "bank1_sumtab = %p\n", bank1_sumtab); +} + +/* + * malloc-from-banked test. + * + * SDCC's heap lives in HOME RAM (W2 = 0x8000-0xBFFF, see runtime/heap.s). + * Window 2 is fixed and stays mapped regardless of W3 page swaps. So + * malloc() called from a banked function should: + * 1. Return a pointer somewhere in 0x80xx..0xBFxx (W2 heap) + * 2. The pointer is usable both inside the bank (W2 still mapped) and + * after returning to HOME (W2 unchanged across trampoline). + * + * The function allocates N bytes, fills them with a known pattern, and + * returns the pointer to the caller for verification. + */ +uint8_t *bank1_alloc_and_fill(int n, uint8_t pattern) __banked +{ + uint8_t *p = (uint8_t *)malloc(n); + if (p == NULL) return NULL; + for (int i = 0; i < n; i++) + p[i] = (uint8_t)(pattern + i); + printf(" bank1_alloc_and_fill: malloc(%d) -> %p\n", n, p); + return p; +} + +void bank1_free(void *p) __banked +{ + free(p); +} diff --git a/examples/banklocl/banklocl.c b/examples/banklocl/banklocl.c new file mode 100644 index 0000000..f595d1e --- /dev/null +++ b/examples/banklocl/banklocl.c @@ -0,0 +1,87 @@ +/* + * bank_local_data — demonstrates that a banked function can own its own + * static (BSS) array and a const lookup table without burning HOME + * memory. When the function executes, BANK1 is mapped into window 3 + * and both code and data are directly addressable. + * + * No bank_read / bank_write needed — the trampoline maps the bank for + * us and the C code touches the arrays normally. + */ + +#include +#include + +extern void bank1_fill (int seed) __banked; +extern uint16_t bank1_sumtab (void) __banked; +extern uint8_t bank1_peek (int idx) __banked; +extern void bank1_map_print(void) __banked; +extern uint8_t *bank1_alloc_and_fill(int n, uint8_t pattern) __banked; +extern void bank1_free (void *p) __banked; + +/* MUST be `const`: crt0_banked reads _n_banks BEFORE gsinit, so + * non-const initialized variables haven't been copied yet and would + * read 0 → bank loading is skipped → garbage in window 3. */ +const uint8_t n_banks = 1; + +uint8_t local0_buf[16]; + + +int main(int argc, char **argv) +{ + puts("bank_local_data: testing static data in BANK1"); + + bank1_map_print(); + + /* Verify crt0_banked parsed argv correctly. */ + printf("argc=%d, argv[0]=\"%s\"\n", argc, argv[0]); + + printf("local0_buf = %p\n", local0_buf); + for (int i = 1; i < argc; i++) + printf(" argv[%d]=\"%s\"\n", i, argv[i]); + + /* Seed the BSS array in BANK1. */ + bank1_fill(0x10); + + /* Read it back through another banked function — verifies the data + * survived after the trampoline returned to HOME and re-entered. */ + int ok = 1; + for (int i = 0; i < 8; i++) { + uint8_t v = bank1_peek(i); + uint8_t expected = (uint8_t)(0x10 + i); + if (v != expected) { + printf(" bank1_buf[%d] = 0x%02X, expected 0x%02X\n", + i, v, expected); + ok = 0; + } + } + if (ok) + puts(" buf[0..7] OK"); + + /* Use the const lookup table that lives in BANK1. */ + uint16_t sum = bank1_sumtab(); + printf(" bank1_sumtab() = %u (expected 1500)\n", sum); + + /* malloc from a banked function — the heap lives in W2 (HOME), + * which stays mapped across W3 page swaps. Returned pointer + * should be usable both inside the bank AND from HOME afterwards. */ + uint8_t *heap_p = bank1_alloc_and_fill(32, 0xA0); + if (heap_p == NULL) { + puts(" malloc from bank FAILED"); + } else { + printf(" caller sees pointer = %p\n", heap_p); + int ok = 1; + for (int i = 0; i < 32; i++) { + uint8_t expected = (uint8_t)(0xA0 + i); + if (heap_p[i] != expected) { + printf(" heap_p[%d] = 0x%02X, expected 0x%02X\n", + i, heap_p[i], expected); + ok = 0; + } + } + if (ok) puts(" bank-allocated heap [0..31] OK from HOME"); + bank1_free(heap_p); + } + + puts("done"); + return 0; +} diff --git a/examples/cat/Makefile b/examples/cat/Makefile new file mode 100644 index 0000000..63e6639 --- /dev/null +++ b/examples/cat/Makefile @@ -0,0 +1,6 @@ +# Build cat.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := cat +EXTRA_DATA := test.txt +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/cat/cat.c b/examples/cat/cat.c new file mode 100644 index 0000000..e7d7f68 --- /dev/null +++ b/examples/cat/cat.c @@ -0,0 +1,31 @@ +#include +#include +#include + +int main(void) +{ + int fd = open("TEST.TXT", O_RDONLY); + if (fd < 0) { + puts("cat: cannot open TEST.TXT"); + puts("Press any key to exit..."); + (void)getchar(); + return 1; + } + + puts("--- TEST.TXT ---"); + + char buf[64]; + int n; + while ((n = read(fd, buf, sizeof(buf))) > 0) { + for (int i = 0; i < n; i++) { + putchar((unsigned char)buf[i]); + } + } + + close(fd); + + puts(""); + puts("--- end of file. Press any key to exit. ---"); + (void)getchar(); + return 0; +} diff --git a/examples/cat/test.txt b/examples/cat/test.txt new file mode 100644 index 0000000..f187b3c --- /dev/null +++ b/examples/cat/test.txt @@ -0,0 +1,13 @@ +Hello from a file on disk! +This text was read by cat.exe through +the ESTEX file I/O syscalls: + open ($11) + read ($13) + close ($12) + +The whole loop hits real DSS code on +the Sprinter (in MAME, just an image). + +Line 9. +Line 10. +Final line. diff --git a/examples/conio/Makefile b/examples/conio/Makefile new file mode 100644 index 0000000..330454b --- /dev/null +++ b/examples/conio/Makefile @@ -0,0 +1,5 @@ +# Build conio_test.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := conio +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/conio/conio.c b/examples/conio/conio.c new file mode 100644 index 0000000..96b925c --- /dev/null +++ b/examples/conio/conio.c @@ -0,0 +1,128 @@ +#include +#include +#include /* sleep */ + +/* + * Exercises every conio function: + * clrscr — clear the screen + * gotoxy — move cursor to (x, y), 0-based + * putch — single character + * cputs — string without auto-newline + * kbhit — non-blocking key probe + * getch — blocking, no echo + * getche — blocking, with echo + * + * Sprinter native text mode is 80×32, so we anchor corners at + * (0,0), (79,0), (0,31), (79,31). + */ + +int main(void) +{ + /* 1. clrscr + diagnostic probes + a centered banner. + * + * Row-0 probe: figure out why [NW]/[NE] don't paint. + * '0','1','2','3' — single putch at row 0, cols 0/5/40/79 + * "R0" — cputs at row 0, col 10 + * 'a','b','c','R1'— same pattern on row 1 (control) + */ + clrscr(); + + gotoxy(0, 0); putch('0'); + gotoxy(5, 0); putch('1'); + gotoxy(40, 0); putch('2'); + gotoxy(79, 0); putch('3'); + gotoxy(10, 0); cputs("R0"); + + gotoxy(0, 1); putch('a'); + gotoxy(5, 1); putch('b'); + gotoxy(79, 1); putch('c'); + gotoxy(10, 1); cputs("R1"); + + /* Bottom corners moved to row 30 to avoid the auto-wrap-scroll issue — + * cputs("[SE]") at (76, 31) ends with cursor at col 80 on the last row, + * which scrolls the screen up by one and eats everything we wrote at + * row 0. By staying on row 30, no wraparound is triggered. */ + gotoxy(0, 30); cputs("[SW]"); + gotoxy(76, 30); cputs("[SE]"); + + /* Row 31 single-char probes (col 0 + col 78, no col-80 reach). */ + gotoxy(0, 31); putch('L'); + gotoxy(78, 31); putch('R'); + + gotoxy(30, 4); + cputs("== conio test =="); + + /* wherex/wherey probe — place cursor at a known spot, read it back. */ + gotoxy(15, 5); + int cx = wherex(); + int cy = wherey(); + gotoxy(0, 6); + printf("wherex/wherey after gotoxy(15,5) -> x=%d y=%d", cx, cy); + + /* 2. putch — single chars in a diagonal. */ + for (int i = 0; i < 16; i++) { + gotoxy(10 + i, 8 + i); + putch('*'); + } + + /* 3. kbhit polling loop with a spinning indicator. */ + gotoxy(0, 14); + cputs("kbhit polling - press any key to interrupt"); + + static const char spin[] = "|/-\\"; + int frame = 0; + while (!kbhit()) { + gotoxy(50, 14); + putch(spin[frame & 3]); + frame++; + /* small delay so the spin is visible (sleep is in 1-sec units; + * we want ~10 fps — implemented with a busy "halts" later, but + * here we just rely on kbhit being slow enough to be visible). */ + } + int probed = kbhit(); /* re-read to clear / display */ + gotoxy(0, 16); + printf("kbhit captured 0x%02X ('%c')", probed, + (probed >= 0x20 && probed < 0x7F) ? probed : '?'); + + /* 4. getch — drain the key + ask for one with no echo. */ + gotoxy(0, 18); + cputs("getch (no echo) — press a key: "); + int k1 = getch(); + gotoxy(0, 19); + printf("you pressed 0x%02X ('%c')", k1, + (k1 >= 0x20 && k1 < 0x7F) ? k1 : '?'); + + /* 5. getche — same but the keypress should appear on screen. */ + gotoxy(0, 21); + cputs("getche (with echo) — press a key: "); + gotoxy(36, 21); + int k2 = getche(); + gotoxy(0, 22); + printf("you pressed 0x%02X (echoed above)", k2); + + /* 6. Finish at the bottom; do NOT scroll. */ + gotoxy(0, 28); + cputs("All conio functions exercised. Press any key to exit."); + + + set_videotextmode(TEXT_MODE_40x32); + + for (int i = 0; i < 16; i++) { + wrchar(4 + i * 2, 3, i < 10 ? '0' + i : 'A' - 10 + i, 0x1F); + wrchar(4 + i * 2 + 1, 3, ' ', 0x1F); + } + for (int j = 0; j < 16; j++) { + wrchar(2, 4 + j, j < 10 ? '0' + j : 'A' - 10 + j, 0x1F); + wrchar(2 + 1, 4 + j, ' ', 0x1F); + for (int i = 0; i < 16; i++) { + wrchar(4 + i * 2, 4 + j, j * 16 + i, 0x2F); + wrchar(4 + i * 2 + 1, 4 + j, ' ', 0x2F); + } + } + + (void)getch(); + + set_videotextmode(TEXT_MODE_80x32); + + return 0; +} diff --git a/examples/conio/prob b/examples/conio/prob new file mode 100644 index 0000000..2c5affd --- /dev/null +++ b/examples/conio/prob @@ -0,0 +1,31 @@ +Задача - +меняем алгоритм работы putch (и соответственно остальных ф-ий работающих через putch - cputs/cprintf и т.д.) - + +вводится еще одна глобальная переменная (с сеттером и геттером) - char - +как обрабатываются управляющие символы ф-иями вывода в conio - выводятся через wrchar или отрабатываются как управляющие +если она 0 - то отрабатваются как управляющие - +это символы +0x08 - BS - уменьшаем pc_col на 1 если она еще не равна 0 (если 0 - не меняется) +0x09 - TAB - увеличиваем pc_col до ближайшего кратного 8-ми +0x0A - LF - увеличиваем pc_row на 1 кроме случая когда pc_row = 32 - тогда уже не увеличиваем +0x0D - CR - сбрасываем pc_col до 0 +в остальных случаях после вывода символа увеличиваем pc_col на 1 (но не более чем до 80) + +если же глобальная переменная 1 - то выводим ВСЕ символы as is через wrchar так же увеличивая pc_col на 1 (но не более чем до 80) + +Замечание - если pc_col == 80 или pc_row == 32 - можем просто не выводить символ +(символы выводятся только если координаты X / Y = [0..79]/[0..31]) + +такой режим только если attr <= 0x00FF, в противном случае - вывод через быстрый вывод без управления координат и цветом + +для ускорения предлагается создать raw putch который будет принимать в параметрах только символ и аттрибут. +этой функции уже не надо будет проверять старший байт аттрибутов (а в аттрибуты будет принимать младший байт) +этот raw putch всегда будет выводить через WRCHAR (но будет отрабатывать новый параметр - как отрабатывать управляющие сигналы) + +обычный putch вначале будет проверять attr что бы понять выводить через PUTCHAR (5B) или WRCHAR (58 - raw putch). +аналогично cputs - вначале будет проверять attr что бы понять - выводить через PCHARS (5C - _cputs_pchars) или через WRCHAR (58 - raw putch) +так же перед выводом и cputs и putcg будут получать текущие координаты для вывода и сохрнять их (если вывод идет через WRCHAR) + +то есть еще один пункт для оптимизации - мы должны только один раз получить кооринаты для вывода и один раз их сохранить +(если вывод через WRCHAR, если же через PUTCHAR/PCHARS - то за координаты отвечает уже сам ESTEX). + diff --git a/examples/conio2/Makefile b/examples/conio2/Makefile new file mode 100644 index 0000000..d9fbbd7 --- /dev/null +++ b/examples/conio2/Makefile @@ -0,0 +1,5 @@ +# Build conio_test.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := conio2 +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/conio2/conio2.c b/examples/conio2/conio2.c new file mode 100644 index 0000000..5d3705b --- /dev/null +++ b/examples/conio2/conio2.c @@ -0,0 +1,63 @@ +#include +#include +#include /* sleep */ + +/* + * Exercises every conio function: + * clrscr — clear the screen + * gotoxy — move cursor to (x, y), 0-based + * putch — single character + * cputs — string without auto-newline + * kbhit — non-blocking key probe + * getch — blocking, no echo + * getche — blocking, with echo + * + * Sprinter native text mode is 80×32, so we anchor corners at + * (0,0), (79,0), (0,31), (79,31). + */ + +int main(void) +{ + /* 1. clrscr + diagnostic probes + a centered banner. + * + * Row-0 probe: figure out why [NW]/[NE] don't paint. + * '0','1','2','3' — single putch at row 0, cols 0/5/40/79 + * "R0" — cputs at row 0, col 10 + * 'a','b','c','R1'— same pattern on row 1 (control) + */ + clrscr(); + + gotoxy(0, 0); putch('0'); + textattr(0x70); + gotoxy(1, 0); putch('1'); + + set_putch_raw_mode(1); + + textattr(0x0F); + gotoxy(4, 3); + for (int i = 0; i < 16; i++) { + putch(i < 10 ? '0' + i : 'A' - 10 + i); + putch(' '); + } + + for (int j = 0; j < 16; j++) { + gotoxy(2, 4 + j); + textattr(0x0F); + putch(j < 10 ? '0' + j : 'A' - 10 + j); + putch(' '); + for (int i = 0; i < 16; i++) { + textattr((j << 4) + i); + putch((j << 4) + i); putch(' '); + } + } + + set_putch_raw_mode(0); + gotoxy(0,22); + set_text_attr(0x000E); +// cputs("Test message line"); + cputs("Test message line 1\nTest message line2\rline3\n\r\n\r1234\t5678\b90"); + + (void)getch(); + + return 0; +} diff --git a/examples/errno/Makefile b/examples/errno/Makefile new file mode 100644 index 0000000..1ea2f74 --- /dev/null +++ b/examples/errno/Makefile @@ -0,0 +1,5 @@ +# Build errno_test.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := errno +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/errno/errno.c b/examples/errno/errno.c new file mode 100644 index 0000000..eb94624 --- /dev/null +++ b/examples/errno/errno.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include + +/* + * Exercises errno + strerror + perror by triggering each failure path. + * No file system mutations are required — every call here is expected + * to fail by design. + */ + +int main(void) +{ + puts("errno test:"); + puts(""); + + /* 1. Open a file that does not exist. */ + errno = 0; + int fd = open("NOSUCH.TXT", O_RDONLY); + printf(" open(\"NOSUCH.TXT\"): fd=%d errno=%d %s\n", + fd, errno, strerror(errno)); + + /* 2. Close a bogus file descriptor. */ + errno = 0; + int r = close(0x7F); + printf(" close(0x7F): ret=%d errno=%d %s\n", r, errno, strerror(errno)); + + /* 3. perror() — convenience wrapper. */ + errno = 0; + fd = open("ANOTHER.MIS", O_RDONLY); + perror(" open(\"ANOTHER.MIS\")"); + + /* 4. Delete something that isn't there. */ + errno = 0; + r = unlink("PHANTOM.TMP"); + perror(" unlink(\"PHANTOM.TMP\")"); + + /* 5. A few raw codes for the table. */ + puts(""); + puts(" raw codes:"); + for (int i = 0; i <= 5; i++) { + printf(" %2d → %s\n", i, strerror(i)); + } + printf(" %2d → %s (out of range)\n", 99, strerror(99)); + + puts(""); + puts("Press any key to exit."); + (void)getchar(); + return 0; +} diff --git a/examples/example.mk b/examples/example.mk new file mode 100644 index 0000000..c483283 --- /dev/null +++ b/examples/example.mk @@ -0,0 +1,76 @@ +# example.mk — shared Makefile fragment for simple Sprinter ESTEX examples. +# +# Usage in an example's Makefile: +# +# PROJ_ROOT := $(abspath $(CURDIR)/../..) +# EXAMPLE := my_example # base name (matches my_example.c) +# +# # Optional overrides (any combination): +# # MEMORY := small # tiny | small | big | huge | manual +# # STACK_SIZE := 2048 # bytes reserved for the stack +# # EXTRA_SRCS := helper.c util.c # additional .c files in this dir +# # EXTRA_FLAGS := --crt0=minimal # passed through to sprinter-cc +# # EXTRA_DATA := test.txt # extra files to add to `make floppy` +# +# include $(PROJ_ROOT)/examples/example.mk +# +# Pipeline (all driven by sprinter-cc): +# crt0 + EXAMPLE.c + EXTRA_SRCS --sdcc--> .ihx +# .ihx --mkexe--> EXAMPLE.exe +# linking against lib/sprinter.lib for libc. +# +# Targets provided: +# all build $(EXAMPLE).exe (default) +# clean remove build artefacts +# floppy build the example and pack it (alone, plus EXTRA_DATA) into +# mame/v306/IMG/mc.img — useful for trying a single program +# without rebuilding every example. Top-level `make floppy` +# (in the repo root) still packs all examples. +# run floppy + launch MAME + +SPRINTER_CC := $(PROJ_ROOT)/bin/sprinter-cc +MKEXE := $(PROJ_ROOT)/toolchain/mkexe/mkexe +LIB := $(PROJ_ROOT)/lib/sprinter.lib + +MAME_DIR := $(PROJ_ROOT)/mame/v306 +FLOPPY_IMG := $(MAME_DIR)/IMG/mc.img +MAKE_DISK := $(MAME_DIR)/make_disk.py +RUN_MAME := $(MAME_DIR)/run_mame.sh + +# Optional knobs — see top of file. +MEMORY ?= tiny +SOURCES := $(EXAMPLE).c $(EXTRA_SRCS) + +CC_FLAGS := --memory $(MEMORY) +ifneq ($(STACK_SIZE),) +CC_FLAGS += --stack-size $(STACK_SIZE) +endif +CC_FLAGS += $(EXTRA_FLAGS) + +all: $(EXAMPLE).exe + +$(EXAMPLE).exe: $(SOURCES) $(MKEXE) $(LIB) + $(SPRINTER_CC) $(CC_FLAGS) -o $@ $(SOURCES) + +$(MKEXE): + $(MAKE) -C $(PROJ_ROOT)/toolchain/mkexe + +$(LIB): + $(MAKE) -C $(PROJ_ROOT)/lib + +clean: + rm -rf .sprinter-cc-* $(EXAMPLE).exe + +# `make floppy` packs ONLY this example (+ optional EXTRA_DATA files) into +# the MAME floppy image, replacing whatever was there. Handy for trying a +# single program without rebuilding all 27 examples. +floppy: $(EXAMPLE).exe + python3 $(MAKE_DISK) $(FLOPPY_IMG) $(EXAMPLE).exe $(EXTRA_DATA) + @echo + @echo "Floppy ready: $(FLOPPY_IMG) (with $(EXAMPLE).exe$(if $(EXTRA_DATA), + $(EXTRA_DATA))) " + @echo "Run: cd $(MAME_DIR) && ./run_mame.sh" + +run: floppy + cd $(MAME_DIR) && ./run_mame.sh + +.PHONY: all clean floppy run diff --git a/examples/filetest/Makefile b/examples/filetest/Makefile new file mode 100644 index 0000000..f8916af --- /dev/null +++ b/examples/filetest/Makefile @@ -0,0 +1,3 @@ +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := filetest +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/filetest/filetest.c b/examples/filetest/filetest.c new file mode 100644 index 0000000..7decf15 --- /dev/null +++ b/examples/filetest/filetest.c @@ -0,0 +1,74 @@ +/* + * filetest — exercise minimal FILE * stream API (fopen/fclose/fputs/ + * fgets/fread/fwrite/fseek/ftell/feof + stdin/stdout/stderr). + * + * Steps: + * 1. fopen("FILE.TXT","w"), fputs+fputc lines, fclose. + * 2. fopen("FILE.TXT","r"), fgets each line, fclose. + * 3. fopen("r"), fread block, fseek, ftell, feof, fread again. + * 4. fputs to stdout (sanity check console pseudo-stream). + */ + +#include +#include +#include + +int main(void) +{ + const char *path = "FILE.TXT"; + + /* ----- 1. Write via fputs + fputc ----- */ + { + FILE *fp = fopen(path, "w"); + if (!fp) { + printf("fopen(w) failed: errno=%d (%s)\n", errno, strerror(errno)); + return 1; + } + fputs("Hello from FILE*\n", fp); + fputs("Second line via fputs\n", fp); + for (int i = '0'; i <= '9'; i++) fputc(i, fp); + fputc('\n', fp); + if (fclose(fp) != 0) puts("fclose: error"); + } + + /* ----- 2. Read via fgets ----- */ + { + FILE *fp = fopen(path, "r"); + if (!fp) { + printf("fopen(r) failed: errno=%d\n", errno); + return 1; + } + char buf[128]; + int n = 0; + while (fgets(buf, sizeof buf, fp)) { + printf(" line %d: %s", ++n, buf); + if (buf[strlen(buf)-1] != '\n') putchar('\n'); + } + printf(" total lines: %d, feof=%d\n", n, feof(fp)); + fclose(fp); + } + + /* ----- 3. fread / fseek / ftell ----- */ + { + FILE *fp = fopen(path, "r"); + if (!fp) return 1; + char buf[16]; + size_t got = fread(buf, 1, 16, fp); + printf(" fread(16) -> %u bytes, ftell=%ld\n", + (unsigned)got, ftell(fp)); + if (fseek(fp, 0L, SEEK_END) == 0) { + printf(" file size via fseek(END)+ftell = %ld\n", ftell(fp)); + } + rewind(fp); + printf(" rewind: ftell=%ld, feof=%d\n", ftell(fp), feof(fp)); + fclose(fp); + } + + /* ----- 4. Console pseudo-streams ----- */ + fputs(" fputs to stdout works\n", stdout); + fputs(" fputs to stderr works\n", stderr); + fputc('!', stdout); fputc('\n', stdout); + + puts("filetest done."); + return 0; +} diff --git a/examples/gfx_d16/Makefile b/examples/gfx_d16/Makefile new file mode 100644 index 0000000..4d30665 --- /dev/null +++ b/examples/gfx_d16/Makefile @@ -0,0 +1,5 @@ +# Build gfx_demo16.exe — exercises libc/gfx 640x256x16 primitives. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := gfx_d16 +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/gfx_d16/gfx_d16.c b/examples/gfx_d16/gfx_d16.c new file mode 100644 index 0000000..4912dd4 --- /dev/null +++ b/examples/gfx_d16/gfx_d16.c @@ -0,0 +1,116 @@ +/* + * gfx_demo16 — exercises the 640×256×16 (mode 0x82) primitives. + * + * Stages (press a key to advance): + * 1. 1-pixel frame via hline/vline16 — verifies edge alignment + * (odd-x and odd-(x+len) RMW paths) + * 2. Nested rectangles in cycled colours + * 3. Colour bars — 16 vertical stripes, each colour 0..15 + * (palette readability test) + * 4. Diagonal star + axis-aligned cross via line16 + */ + +#include +#include +#include +#include + +static uint8_t palette[16 * 4]; + +static void wait_key(void) +{ + __asm + ld c, #0x30 + rst #0x10 + __endasm; +} + +static void build_palette(void) +{ + /* 16-color palette: index 0 = black, 1..7 = primary ramp, + * 8..15 = mid/light variants. Order chosen so neighbouring + * indices contrast in the colour-bars test. */ + static const uint8_t bgr[16][3] = { + {0x00, 0x00, 0x00}, /* 0 black */ + {0x00, 0x00, 0xFF}, /* 1 red */ + {0x00, 0xFF, 0x00}, /* 2 green */ + {0xFF, 0x00, 0x00}, /* 3 blue */ + {0x00, 0xFF, 0xFF}, /* 4 yellow */ + {0xFF, 0x00, 0xFF}, /* 5 magenta */ + {0xFF, 0xFF, 0x00}, /* 6 cyan */ + {0xFF, 0xFF, 0xFF}, /* 7 white */ + {0x40, 0x40, 0x40}, /* 8 dim grey */ + {0x40, 0x40, 0xFF}, /* 9 light red */ + {0x40, 0xFF, 0x40}, /* A light green */ + {0xFF, 0x40, 0x40}, /* B light blue */ + {0x40, 0xFF, 0xFF}, /* C light yellow */ + {0xFF, 0x40, 0xFF}, /* D light magenta */ + {0xFF, 0xFF, 0x40}, /* E light cyan */ + {0xA0, 0xA0, 0xA0}, /* F grey */ + }; + for (int i = 0; i < 16; i++) { + palette[i * 4 + 0] = bgr[i][0]; + palette[i * 4 + 1] = bgr[i][1]; + palette[i * 4 + 2] = bgr[i][2]; + palette[i * 4 + 3] = 0; + } +} + +int main(void) +{ + build_palette(); + + uint8_t prev = gfx_init(GFX_MODE_640x256x16, 0); + gfx_pal_load(0, 0, 16, palette); + + /* --- Stage 1: 1-px frame at edges -------------------------------- */ + gfx_clear16(8); /* dim grey */ + gfx_hline16(0, 0, GFX_WIDTH_16, 7); /* white top */ + gfx_hline16(0, GFX_HEIGHT_16 - 1, GFX_WIDTH_16, 7); /* white bottom */ + gfx_vline16(0, 0, GFX_HEIGHT_16, 7); + gfx_vline16(GFX_WIDTH_16 - 1, 0, GFX_HEIGHT_16, 7); + /* 1-px inset purple frame — exercises odd-x edges. */ + gfx_hline16(1, 1, GFX_WIDTH_16 - 2, 5); + gfx_hline16(1, GFX_HEIGHT_16 - 2, GFX_WIDTH_16 - 2, 5); + gfx_vline16(1, 2, GFX_HEIGHT_16 - 4, 5); + gfx_vline16(GFX_WIDTH_16 - 2, 2, GFX_HEIGHT_16 - 4, 5); + wait_key(); + + /* --- Stage 2: nested rectangles --------------------------------- */ + gfx_clear16(0); + for (int i = 0; i < 16; i++) + gfx_rect16(i * 20, i * 8, + GFX_WIDTH_16 - i * 40, + GFX_HEIGHT_16 - i * 16, + (uint8_t)((i + 1) & 0x0F)); + wait_key(); + + /* --- Stage 3: vertical color bars ------------------------------- */ + gfx_clear16(0); + /* 16 bars × 40 px wide = 640 px exactly. */ + for (int i = 0; i < 16; i++) + gfx_fill_rect16(i * 40, 0, 40, GFX_HEIGHT_16, (uint8_t)i); + wait_key(); + + /* --- Stage 4: diagonal star + cross ----------------------------- */ + gfx_clear16(0); + int cx = GFX_WIDTH_16 / 2, cy = GFX_HEIGHT_16 / 2; + for (int i = 0; i < 16; i++) { + int ex = i * (GFX_WIDTH_16 - 1) / 15; + gfx_line16(cx, cy, ex, 0, 7); + gfx_line16(cx, cy, ex, GFX_HEIGHT_16 - 1, 3); + } + for (int i = 0; i < 16; i++) { + int ey = i * (GFX_HEIGHT_16 - 1) / 15; + gfx_line16(cx, cy, 0, ey, 1); + gfx_line16(cx, cy, GFX_WIDTH_16 - 1, ey, 2); + } + /* axis-aligned cross to verify hline/vline alignment at runtime. */ + gfx_hline16(0, cy, GFX_WIDTH_16, 6); + gfx_vline16(cx, 0, GFX_HEIGHT_16, 6); + wait_key(); + + gfx_done(prev); + puts("done"); + return 0; +} diff --git a/examples/gfx_dbuf/Makefile b/examples/gfx_dbuf/Makefile new file mode 100644 index 0000000..518aa85 --- /dev/null +++ b/examples/gfx_dbuf/Makefile @@ -0,0 +1,3 @@ +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := gfx_dbuf +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/gfx_dbuf/gfx_dbuf.c b/examples/gfx_dbuf/gfx_dbuf.c new file mode 100644 index 0000000..0a092ff --- /dev/null +++ b/examples/gfx_dbuf/gfx_dbuf.c @@ -0,0 +1,120 @@ +/* + * gfx_dbuf — double-buffering demo. + * + * Renders a moving rectangle by alternating between page 0 and page 1: + * - Each frame: draw to the HIDDEN page, then flip visible to it. + * - The page currently being displayed is never written to, so the + * user only sees fully-rendered frames (no half-drawn artefacts, + * no flicker from the per-frame clear). + * + * Indicators help verify the swap is actually happening: + * - A small colour swatch in the top-right alternates each frame: + * one shade when page 0 is shown, another when page 1. If the + * box motion looks smooth and the swatch flickers between the two + * shades at the animation rate, the swap is working. + * + * NOTE: each graphics screen has its OWN palette page (screen 0 → + * palette 0, screen 1 → palette 1). We load the same palette into + * both so the colours look identical regardless of which page is + * currently visible. See memory/sprinter_graphics.md. + * + * Press any key to exit. + */ + +#include +#include +#include +#include + +static uint8_t palette[256 * 4]; + +#define COL_BLACK 0x00 +#define COL_BG 0x20 +#define COL_STRIPE 0x60 +#define COL_TEXT 0xC0 +#define COL_BOX 0xFF +#define COL_PAGE0 0x40 +#define COL_PAGE1 0xE0 + +static void make_palette(void) +{ + for (int i = 0; i < 256; i++) { + palette[i*4+0] = (uint8_t)i; + palette[i*4+1] = (uint8_t)i; + palette[i*4+2] = (uint8_t)i; + palette[i*4+3] = 0; + } +} + +static void draw_frame(int box_x, int box_y, uint8_t page_indicator) +{ + gfx_clear256(COL_BG); + + /* Static decoration — identical on both pages so the swap doesn't + * flicker the chrome. */ + gfx_fill_rect256(0, 0, GFX_WIDTH, 8, COL_STRIPE); + gfx_fill_rect256(0, GFX_HEIGHT - 8, GFX_WIDTH, 8, COL_STRIPE); + + gfx_text256(8, 16, "double-buffering demo", COL_TEXT, COL_BG); + gfx_text256(8, GFX_HEIGHT - 24, + "press a key to exit", COL_TEXT, COL_BG); + + /* Page indicator — different shade for each page so a flickering + * box here proves the swap is happening. */ + gfx_fill_rect256(GFX_WIDTH - 24, 16, 12, 12, + page_indicator ? COL_PAGE1 : COL_PAGE0); + + /* The animated box. */ + gfx_fill_rect256(box_x, box_y, 40, 30, COL_BOX); + gfx_rect256 (box_x, box_y, 40, 30, COL_BLACK); +} + +int main(void) +{ + make_palette(); + uint8_t prev = gfx_init(GFX_MODE_320x256x256, 0); + + /* Each graphics screen has its own palette page (0→pal 0, 1→pal 1). + * Load the same data into both so the visual swap is seamless. */ + gfx_pal_load(0, 0, 0, palette); + gfx_pal_load(1, 0, 0, palette); + + /* Clear both pages so the very first flip doesn't reveal garbage. */ + gfx_set_draw_page(0); + gfx_clear256(COL_BG); + gfx_set_draw_page(1); + gfx_clear256(COL_BG); + + /* Bouncing rect state. */ + int box_x = 10; + int box_y = 100; + int dx = 3; + int dy = 2; + const int box_w = 40, box_h = 30; + + while (!kbhit()) { + uint8_t hidden = 1 - gfx_get_visible_page(); + gfx_set_draw_page(hidden); + + draw_frame(box_x, box_y, hidden); + + /* Wait for the next frame interrupt before flipping, so the + * page swap lands during vertical retrace and the user never + * sees a half-drawn frame. */ + gfx_wait_vsync(); + gfx_set_visible_page(hidden); + + /* Step the box; bounce off all four walls. */ + box_x += dx; + if (box_x < 0) { box_x = 0; dx = -dx; } + if (box_x + box_w > GFX_WIDTH) { box_x = GFX_WIDTH - box_w; dx = -dx; } + box_y += dy; + if (box_y < 8) { box_y = 8; dy = -dy; } + if (box_y + box_h > GFX_HEIGHT-8) { box_y = GFX_HEIGHT-8 - box_h; dy = -dy; } + } + + (void)getch(); + gfx_done(prev); + puts("done"); + return 0; +} diff --git a/examples/gfx_demo/Makefile b/examples/gfx_demo/Makefile new file mode 100644 index 0000000..3ab4aa4 --- /dev/null +++ b/examples/gfx_demo/Makefile @@ -0,0 +1,3 @@ +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := gfx_demo +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/gfx_demo/gfx_demo.c b/examples/gfx_demo/gfx_demo.c new file mode 100644 index 0000000..0a88638 --- /dev/null +++ b/examples/gfx_demo/gfx_demo.c @@ -0,0 +1,100 @@ +/* + * gfx_demo — exercises the libc/gfx primitives. Shows: + * 1. accelerator-backed gfx_clear256 / gfx_hline256 / gfx_vline256 / gfx_fill_rect256 + * 2. gfx_rect256 outline, gfx_line256 diagonals (Bresenham via putpixel) + * 3. a grey-ramp palette + * + * Press a key to advance through each stage. + */ + +#include +#include +#include +#include + +static uint8_t palette_data[256 * 4]; + +static void wait_key(void) +{ + __asm + ld c, #0x30 + rst #0x10 + __endasm; +} + +int main(void) +{ + /* Grey ramp: (B=i, G=i, R=i, 0). */ + for (int i = 0; i < 256; i++) { + palette_data[i * 4 + 0] = (uint8_t)i; + palette_data[i * 4 + 1] = (uint8_t)i; + palette_data[i * 4 + 2] = (uint8_t)i; + palette_data[i * 4 + 3] = 0; + } + + uint8_t prev = gfx_init(GFX_MODE_320x256x256, 0); + gfx_pal_load(0, 0, 0, palette_data); + + /* --- Stage 1: orthogonal frame via hline / vline ----------------- */ + gfx_clear256(0x40); + gfx_hline256(1, 1, GFX_WIDTH - 2, 0xFF); + gfx_hline256(1, GFX_HEIGHT - 2, GFX_WIDTH - 2, 0xFF); + gfx_vline256(1, 2, GFX_HEIGHT - 4, 0xFF); + gfx_vline256(GFX_WIDTH - 2, 2, GFX_HEIGHT - 4, 0xFF); + wait_key(); + + /* --- Stage 2: nested rectangles -------------------------------- */ + gfx_clear256(0x20); + for (int i = 0; i < 16; i++) + gfx_rect256(i * 10, i * 8, + GFX_WIDTH - i * 20, + GFX_HEIGHT - i * 16, + (uint8_t)(0x40 + i * 8)); + wait_key(); + + /* --- Stage 3: filled-rect colour bars --------------------------- */ + gfx_clear256(0); + /* Tall-narrow rects (w=20, h=128) — heuristic picks vertical orient. */ + for (int i = 0; i < 16; i++) { + gfx_fill_rect256(i * 20, 0, 20, 128, (uint8_t)(i * 16)); + gfx_fill_rect256(i * 20 + 0, 128, 20, 128, (uint8_t)(255 - i * 16)); + } + wait_key(); + + /* --- Stage 3b: wide-short rects + a grid of small squares -------- */ + gfx_clear256(0x08); + /* Wide-short stripes (w=320, h=16) — heuristic picks horizontal. */ + for (int i = 0; i < 8; i++) + gfx_fill_rect256(0, i * 32, GFX_WIDTH, 16, (uint8_t)(0x40 + i * 24)); + /* 8×8 small squares grid (w=h, heuristic picks either — same cost). */ + for (int row = 0; row < 4; row++) + for (int col = 0; col < 16; col++) + gfx_fill_rect256(col * 20 + 4, 256 - 80 + row * 20, 12, 12, + (uint8_t)((row * 16 + col) * 4)); + wait_key(); + + /* --- Stage 4: diagonal lines via Bresenham ---------------------- */ + gfx_clear256(0x18); + /* "Star" of lines from centre to a circle of endpoints. */ + int cx = GFX_WIDTH / 2, cy = GFX_HEIGHT / 2; + for (int i = 0; i < 16; i++) { + int ex = i * (GFX_WIDTH - 1) / 15; + gfx_line256(cx, cy, ex, 0, 0xFF); + gfx_line256(cx, cy, ex, GFX_HEIGHT - 1, 0xC0); + } + for (int i = 0; i < 16; i++) { + int ey = i * (GFX_HEIGHT - 1) / 15; + gfx_line256(cx, cy, 0, ey, 0x80); + gfx_line256(cx, cy, GFX_WIDTH - 1, ey, 0x40); + } + /* Box outline using gfx_line256. */ + gfx_line256(0, 0, GFX_WIDTH - 1, 0, 0xFF); + gfx_line256(0, GFX_HEIGHT - 1, GFX_WIDTH - 1, GFX_HEIGHT - 1, 0xFF); + gfx_line256(0, 0, 0, GFX_HEIGHT - 1, 0xFF); + gfx_line256(GFX_WIDTH - 1, 0, GFX_WIDTH - 1, GFX_HEIGHT - 1, 0xFF); + wait_key(); + + gfx_done(prev); + puts("done"); + return 0; +} diff --git a/examples/gfx_mous/Makefile b/examples/gfx_mous/Makefile new file mode 100644 index 0000000..e547318 --- /dev/null +++ b/examples/gfx_mous/Makefile @@ -0,0 +1,3 @@ +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := gfx_mous +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/gfx_mous/gfx_mous.c b/examples/gfx_mous/gfx_mous.c new file mode 100644 index 0000000..6e4349d --- /dev/null +++ b/examples/gfx_mous/gfx_mous.c @@ -0,0 +1,169 @@ +/* + * gfx_mouse_test — exercises the graphics-mode mouse cursor API: + * $09 LOAD CURSOR — install a custom cursor bitmap + * $81 CHANGE VIDEO MODE — let the driver re-sync after switching modes + * $0B RETURN CURSOR — read the cursor back (may be a stub in MAME) + * + * Flow: + * 1. Init the mouse driver in text mode. + * 2. Switch to 320x256x256, notify the driver. + * 3. Build an 8x8 cursor — solid white border + transparent middle — + * and load it. Show it. Move the mouse to verify it tracks. + * 4. Press a key: query the driver's view of the cursor and dump the + * result so we can compare against what we loaded. + * 5. Hide cursor, return to text mode, print the round-trip dump. + * + * The driver's bitmap format is undocumented — best guess is one byte + * per pixel (palette index, with 0 meaning transparent). We load 0xFF + * for opaque cells and 0 for transparent so the cursor stands out + * against any background. + */ + +#include +#include +#include +#include +#include + +#define CURSOR_W 12 +#define CURSOR_H 12 +#define CURSOR_BUF_BYTES (CURSOR_W * CURSOR_H) + +/* Cursor format (verified empirically 2026-05-31): + * ONE BYTE per pixel — row-major, width*height bytes total. + * 0xFF = transparent (background shows through) + * any other byte = palette index (drawn opaque) + * + * Cursor bitmap lives in a dedicated video bank, not the 0x50 page used + * by gfx_clear256 / gfx_putpixel256 — that's why 0xFF reads as transparent + * even though in the main visible page 0xFF is a regular colour. + */ + +static uint8_t cursor_bitmap[CURSOR_BUF_BYTES]; +static uint8_t roundtrip_buf[CURSOR_BUF_BYTES]; +static uint8_t palette[256 * 4]; + +/* Arrow shape, 1 byte per pixel. Each cell is either: + * _ transparent (0xFF, lets the background through) + * O black solid pixel (0x00) + * W white solid pixel (0xFF would mean transparent, so use 0xFF + * palette entry by hand if you want a white pixel — for the + * default greyscale palette in this demo, W = bright grey 0xE0) + * + * Feel free to edit the 12×12 grid below to draw a nicer cursor. */ +#define _ 0xFF +#define O 0x00 +#define W 0xE0 +static const uint8_t cursor_arrow[CURSOR_BUF_BYTES] = { + O,_,_,_,_,_,_,_,_,_,_,_, + O,O,_,_,_,_,_,_,_,_,_,_, + O,W,O,_,_,_,_,_,_,_,_,_, + O,W,W,O,_,_,_,_,_,_,_,_, + O,W,W,W,O,_,_,_,_,_,_,_, + O,W,W,W,W,O,_,_,_,_,_,_, + O,W,W,W,W,W,O,_,_,_,_,_, + O,W,W,W,O,O,O,O,_,_,_,_, + O,O,O,W,O,_,_,_,_,_,_,_, + O,_,_,O,W,O,_,_,_,_,_,_, + _,_,_,O,W,O,_,_,_,_,_,_, + _,_,_,_,O,O,_,_,_,_,_,_, +}; +#undef _ +#undef O +#undef W + +static void make_palette(void) +{ + for (int i = 0; i < 256; i++) { + palette[i*4+0] = (uint8_t)i; + palette[i*4+1] = (uint8_t)i; + palette[i*4+2] = (uint8_t)i; + palette[i*4+3] = 0; + } +} + +/* Copy the arrow pattern into our scratch (one place for the driver + * to point IX at). */ +static void build_cursor(void) +{ + for (int i = 0; i < CURSOR_BUF_BYTES; i++) + cursor_bitmap[i] = cursor_arrow[i]; +} + +static void wait_key(void) +{ + while (!kbhit()) { /* spin */ } + (void)getch(); +} + +int main(void) +{ + textattr(COLOR(COLOR_LIGHTGRAY, COLOR_BLACK)); + clrscr(); + cputs("gfx_mouse_test\r\n"); + + if (mouse_init() < 0) { + cputs("mouse_init failed - no driver\r\n"); + return 1; + } + mouse_set_sensitivity(2, 2); + + /* --- enter graphics, load custom cursor, then show -------------- */ + make_palette(); + build_cursor(); + + uint8_t prev = gfx_init(GFX_MODE_320x256x256, 0); + gfx_pal_load(0, 0, 0, palette); + gfx_clear256(0x40); /* dim grey background */ + + /* Coordinate grid every 32 px so the cursor position reads easily. */ + for (int x = 0; x < GFX_WIDTH; x += 32) gfx_vline256(x, 0, GFX_HEIGHT, 0x80); + for (int y = 0; y < GFX_HEIGHT; y += 32) gfx_hline256(0, y, GFX_WIDTH, 0x80); + + mouse_video_mode_changed(GFX_MODE_320x256x256); + mouse_bounds_x(0, GFX_WIDTH - 1); + mouse_bounds_y(0, GFX_HEIGHT - 1); + + mouse_cursor_t custom = { + .image = cursor_bitmap, + .width = CURSOR_W, + .height = CURSOR_H, + .hot_x = 0, + .hot_y = 0, + }; + mouse_load_cursor(&custom); + mouse_show(); + wait_key(); + + /* --- query driver to see what it has now ------------------------ */ + mouse_cursor_t readback = { + .image = roundtrip_buf, + .width = 0, .height = 0, .hot_x = 0, .hot_y = 0, + }; + mouse_get_cursor(&readback); + + mouse_hide(); + gfx_done(prev); + mouse_video_mode_changed(prev); /* tell driver we're back */ + + /* --- back in text mode: report what the driver returned --------- */ + textattr(COLOR(COLOR_LIGHTGRAY, COLOR_BLACK)); + clrscr(); + cprintf("loaded : %ux%u hot (%u,%u)\r\n", + CURSOR_W, CURSOR_H, 0, 0); + cprintf("read back: %ux%u hot (%u,%u)\r\n", + readback.width, readback.height, readback.hot_x, readback.hot_y); + + uint16_t n = (uint16_t)readback.width * (uint16_t)readback.height; + if (n > CURSOR_BUF_BYTES) n = CURSOR_BUF_BYTES; + cprintf("bitmap (%u bytes):\r\n", n); + for (uint16_t i = 0; i < n; i++) { + cprintf("%02X ", roundtrip_buf[i]); + if ((i % readback.width) == readback.width - 1) cputs("\r\n"); + } + cputs("\r\n"); + + cputs("press any key to exit"); + wait_key(); + return 0; +} diff --git a/examples/gfx_text/Makefile b/examples/gfx_text/Makefile new file mode 100644 index 0000000..59a9eb9 --- /dev/null +++ b/examples/gfx_text/Makefile @@ -0,0 +1,5 @@ +# Build gfx_text_demo.exe — bitmap-font text in both graphics modes. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := gfx_text +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/gfx_text/gfx_text.c b/examples/gfx_text/gfx_text.c new file mode 100644 index 0000000..72eef03 --- /dev/null +++ b/examples/gfx_text/gfx_text.c @@ -0,0 +1,113 @@ +/* + * gfx_text_demo — bitmap-font text rendering test. + * + * Stages (press a key to advance): + * 1. 320×256×256 mode — text in multiple colors using BIOS default font. + * 2. 640×256×16 mode — same text with the 16-color palette. + * Verifies the same font renders correctly in both pixel formats. + */ + +#include +#include +#include +#include + +static uint8_t pal256[256 * 4]; +static uint8_t pal16[16 * 4]; + +static void wait_key(void) +{ + __asm + ld c, #0x30 + rst #0x10 + __endasm; +} + +int main(void) +{ + /* Grey ramp for 256-color mode. */ + for (int i = 0; i < 256; i++) { + pal256[i * 4 + 0] = (uint8_t)i; + pal256[i * 4 + 1] = (uint8_t)i; + pal256[i * 4 + 2] = (uint8_t)i; + pal256[i * 4 + 3] = 0; + } + /* Simple 16-color palette: 0=black, 1=red, 2=green, ..., 7=white, + * 8..15 = dimmed variants. */ + static const uint8_t bgr16[16][3] = { + {0x00,0x00,0x00}, {0x00,0x00,0xFF}, {0x00,0xFF,0x00}, {0xFF,0x00,0x00}, + {0x00,0xFF,0xFF}, {0xFF,0x00,0xFF}, {0xFF,0xFF,0x00}, {0xFF,0xFF,0xFF}, + {0x40,0x40,0x40}, {0x40,0x40,0xFF}, {0x40,0xFF,0x40}, {0xFF,0x40,0x40}, + {0x40,0xFF,0xFF}, {0xFF,0x40,0xFF}, {0xFF,0xFF,0x40}, {0xA0,0xA0,0xA0}, + }; + for (int i = 0; i < 16; i++) { + pal16[i*4+0] = bgr16[i][0]; + pal16[i*4+1] = bgr16[i][1]; + pal16[i*4+2] = bgr16[i][2]; + pal16[i*4+3] = 0; + } + + /* --- Stage 1: text in 320×256×256 ----------------------------- */ + uint8_t prev = gfx_init(GFX_MODE_320x256x256, 0); + gfx_pal_load(0, 0, 0, pal256); + gfx_clear256(0x20); + + gfx_text256(8, 8, "Hello from Sprinter!", 0xFF, 0x20); + gfx_text256(8, 24, "320x256x256 mode", 0xC0, 0x20); + gfx_text256(8, 40, "Bitmap font from BIOS WIN_GET_ZG", 0x80, 0x20); + + /* Color showcase — same string in 8 different greys. */ + for (int i = 0; i < 8; i++) { + char buf[16] = "Color ramp test"; + gfx_text256(8, 64 + i * 12, buf, (uint8_t)(0x40 + i * 24), 0x20); + } + + /* Adjacent FG/BG variants. */ + gfx_text256(8, 176, "FG=white BG=red", 0xFF, 0x30); + gfx_text256(8, 192, "FG=black BG=white", 0x00, 0xFF); + gfx_text256(8, 208, "Negative space:", 0xFF, 0x20); + + /* Large block to test grid-aligned text. */ + for (int row = 0; row < 3; row++) + for (int col = 0; col < 8; col++) { + char ch[2] = { (char)('A' + row * 8 + col), 0 }; + gfx_text256(176 + col * 16, 176 + row * 16, ch, 0xFF, 0x20); + } + wait_key(); + + /* --- Stage 2: text in 640×256×16 ------------------------------ */ + gfx_done(prev); + prev = gfx_init(GFX_MODE_640x256x16, 0); + gfx_pal_load(0, 0, 16, pal16); + gfx_clear16(0); + + gfx_text16(8, 8, "Hello from Sprinter!", 7, 0); + gfx_text16(8, 24, "640x256x16 mode (16 colours)", 6, 0); + gfx_text16(8, 40, "Same font, packed two pixels/byte", 4, 0); + + /* Color demo: each line in a different palette index. */ + for (int i = 1; i < 16; i++) { + char buf[20]; + /* Simple manual itoa to avoid stdio bloat. */ + buf[0] = 'C'; buf[1] = 'o'; buf[2] = 'l'; buf[3] = 'o'; buf[4] = 'r'; + buf[5] = ' '; buf[6] = (char)('0' + (i / 10)); + buf[7] = (char)('0' + (i % 10)); + buf[8] = 0; + gfx_text16(8, 64 + (i - 1) * 12, buf, (uint8_t)i, 0); + } + + /* Show on right side — paragraph in white-on-black, then inverted. */ + gfx_text16(280, 64, "ABCDEFGHIJKLMNOP", 7, 0); + gfx_text16(280, 76, "QRSTUVWXYZ", 7, 0); + gfx_text16(280, 92, "abcdefghijklmnop", 7, 0); + gfx_text16(280, 104, "qrstuvwxyz", 7, 0); + gfx_text16(280, 120, "0123456789", 7, 0); + gfx_text16(280, 132, "!@#$%^&*()_+-=", 7, 0); + gfx_text16(280, 148, "Inverted text", 0, 7); + gfx_text16(280, 164, "FG=red BG=cyan", 1, 6); + wait_key(); + + gfx_done(prev); + puts("done"); + return 0; +} diff --git a/examples/hello/Makefile b/examples/hello/Makefile new file mode 100644 index 0000000..b597763 --- /dev/null +++ b/examples/hello/Makefile @@ -0,0 +1,5 @@ +# Build hello.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := hello +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/hello/hello.c b/examples/hello/hello.c new file mode 100644 index 0000000..7a4a42b --- /dev/null +++ b/examples/hello/hello.c @@ -0,0 +1,65 @@ +/* + * hello — smoke test for the two output APIs: + * + * stdio (printf/puts/putchar) — FAST, no attribute (ambient colour) + * conio (cprintf/cputs/putch) — SLOWER, applies textcolor/textbackground + * + * Demonstrates textcolor/textbackground (Turbo-C-compatible names). + */ + +#include +#include +#include +#include +#include +#include + +int main(void) +{ + errno = -1; + int16_t a0 = 0, a1 = 0; + a0 = get_text_attr(); + + uint8_t vMode = get_videotextmode(); + set_videotextmode(TEXT_MODE_80x32); + + /* Wipe the screen with a known attribute so stdio printf/puts inherit + * a clean colour for the cursor. */ + clrscr_attr(COLOR(COLOR_LIGHTGRAY, COLOR_BLACK)); + + /* --- stdio set: fast, no attribute ------------------------------- */ + puts("hello (stdio) - fast PCHARS, ambient colour"); + printf("printf: a0=%d (initial attr)\n", a0); + + /* --- conio set: applies textcolor / textbackground --------------- */ + textcolor(COLOR_YELLOW); + textbackground(COLOR_BLUE); + cputs("conio: yellow on blue\r\n"); + + textcolor(COLOR_LIGHTRED); + textbackground(COLOR_BLACK); + cprintf("cprintf %d %d %s\r\n", 42, -7, "args"); + + /* set_text_attr / textattr replace the whole byte. */ + textattr(COLOR(COLOR_LIGHTGREEN, COLOR_BLACK)); + cputs("conio: light-green via textattr\r\n"); + + /* Opting out of attribute control — conio falls back to fast path. */ + set_text_attr(KEEP_EXIST_ATTR); + cputs("conio with KEEP_EXIST_ATTR (fast path)\r\n"); + + a1 = get_text_attr(); + + /* Back to a normal attribute so the goodbye reads cleanly. */ + textattr(COLOR(COLOR_LIGHTGRAY, COLOR_BLACK)); + printf("a0=%d a1=%d now=%d errno=%d\n", + a0, a1, get_text_attr(), errno); +#ifdef DEBUG_RT + printf("w2_self_allocated = %u\n", w2_self_allocated); +#endif + cputs("Press any key to exit..."); + + (void)getchar(); + set_videotextmode(vMode); + return 0; +} diff --git a/examples/ls/Makefile b/examples/ls/Makefile new file mode 100644 index 0000000..ef39816 --- /dev/null +++ b/examples/ls/Makefile @@ -0,0 +1,5 @@ +# Build ls.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := ls +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/ls/ls.c b/examples/ls/ls.c new file mode 100644 index 0000000..9c5cebf --- /dev/null +++ b/examples/ls/ls.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include + +/* + * ls — list files on the current drive that match the given pattern. + * + * LS -> "*.*" (everything in current dir) + * LS *.TXT -> just .TXT files + * LS C: -> auto-rewritten to "C:*.*" + * LS C:\BIN -> "C:\BIN\*.*" + * LS C:\BIN\ -> "C:\BIN\*.*" + * LS /A -> include hidden / system / label entries + * + * ESTEX F_FIRST itself returns errno 16 (EINAME) when given a bare path + * with no wildcard, so we patch the pattern up before calling it. + */ + +/* + * Sprinter ESTEX F_FIRST refuses bare path components — it needs a real + * wildcard. We do the minimum that DOS-style shells do for the user: + * - "C:" → "C:\*.*" (drive without slash) + * - "C:\" → "C:\*.*" (root-like, just append the wildcard) + * - anything else: pass through. A more correct implementation would + * stat the path and decide between "single file" / "directory" — out + * of scope for this example. + */ +static char *normalize_pattern(const char *src, char *dst, int cap) +{ + int len = (int)strlen(src); + if (len == 0) { + strcpy(dst, "*.*"); + return dst; + } + + char last = src[len - 1]; + const char *suffix = NULL; + if (last == ':') suffix = "\\*.*"; + else if (last == '\\' || last == '/') suffix = "*.*"; + + if (suffix && len + (int)strlen(suffix) + 1 <= cap) { + strcpy(dst, src); + strcat(dst, suffix); + } else { + strcpy(dst, src); + } + return dst; +} + +int main(int argc, char **argv) +{ + const char *pattern_in = "*.*"; + uint8_t attr = FA_NORMAL | FA_DIREC | FA_RDONLY | FA_ARCH; + + for (int i = 1; i < argc; i++) { + if (argv[i][0] == '/' && (argv[i][1] | 0x20) == 'a') { + attr |= FA_HIDDEN | FA_SYSTEM | FA_LABEL; + } else { + pattern_in = argv[i]; + } + } + + char pattern[80]; + normalize_pattern(pattern_in, pattern, sizeof(pattern)); + + printf("ls: pattern=\"%s\" attr=0x%02X\n\n", pattern, attr); + + ffblk_t blk; + int r = ffirst(pattern, &blk, attr); + if (r < 0) { + printf("no match (errno=%d %s)\n", errno, strerror(errno)); + cputs("\nPress any key to exit.\n"); + (void)getch(); + return 1; + } + + int count = 0; + do { + const char *kind; + if (blk.found_attr & FA_DIREC) kind = "

"; + else if (blk.found_attr & FA_LABEL) kind = ""; + else if (blk.found_attr & FA_SYSTEM) kind = "[SYS]"; + else if (blk.found_attr & FA_HIDDEN) kind = "[HID]"; + else kind = " "; + + printf(" %s %-14s %8lu\n", kind, blk.found_name, blk.size); + count++; + } while (fnext(&blk) == 0); + + printf("\n%d entries\n\n", count); + cputs("Press any key to exit.\n"); + (void)getch(); + return 0; +} diff --git a/examples/malloc/Makefile b/examples/malloc/Makefile new file mode 100644 index 0000000..37263a3 --- /dev/null +++ b/examples/malloc/Makefile @@ -0,0 +1,5 @@ +# Build malloc_test.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := malloc +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/malloc/malloc.c b/examples/malloc/malloc.c new file mode 100644 index 0000000..45f0a60 --- /dev/null +++ b/examples/malloc/malloc.c @@ -0,0 +1,63 @@ +#include +#include +#include + +/* + * Exercises SDCC's malloc / free. The library pulls in heap.rel + malloc.rel + * from z80.lib automatically and inits the heap from crt0's _GSINIT chain. + * Default heap size is 1023 bytes — see docs/TODO.md for plans to grow it. + */ + +int main(void) +{ + puts("malloc test:"); + + /* small allocations */ + char *a = (char *)malloc(20); + char *b = (char *)malloc(40); + char *c = (char *)malloc(60); + + printf(" a = %p\n", a); + printf(" b = %p\n", b); + printf(" c = %p\n", c); + + if (a && b && c) { + strcpy(a, "first"); + strcpy(b, "second-medium-length"); + strcpy(c, "third-and-the-longest-of-them-all"); + printf(" a: \"%s\"\n", a); + printf(" b: \"%s\"\n", b); + printf(" c: \"%s\"\n", c); + } else { + puts(" one of the allocations FAILED"); + } + + /* free b, alloc smaller — should fit in the b-shaped hole */ + free(b); + char *d = (char *)malloc(15); + printf(" after free(b), d = %p (expected near b)\n", d); + if (d) { + strcpy(d, "reused"); + printf(" d: \"%s\"\n", d); + } + + /* drain a larger allocation to see when malloc actually says no */ + int total = 0; + int count = 0; + for (;;) { + void *p = malloc(64); + if (!p) break; + total += 64; + count++; + } + printf(" alloc'd %d x 64-byte blocks before failure (total %d bytes)\n", + count, total); + + free(a); + free(c); + free(d); + puts(""); + puts("Press any key to exit."); + (void)getchar(); + return 0; +} diff --git a/examples/mem_test/Makefile b/examples/mem_test/Makefile new file mode 100644 index 0000000..1984c5b --- /dev/null +++ b/examples/mem_test/Makefile @@ -0,0 +1,5 @@ +# Build mem_test.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := mem_test +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/mem_test/mem_test.c b/examples/mem_test/mem_test.c new file mode 100644 index 0000000..f993efe --- /dev/null +++ b/examples/mem_test/mem_test.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include + +/* + * Exercises the ESTEX EMM page allocator + bank_read/bank_write helpers. + * + * Plan: + * 1. Show free-page count via mem_info. + * 2. Allocate 3 pages → block id. + * 3. For each page in the block, write a recognizable pattern via + * bank_write, then read it back via bank_read into a near buffer. + * 4. Cross-check the readback to prove pages are independent. + * 5. Free the block, show the free-page count again. + */ + +static void show_mem(const char *label) +{ + uint16_t total, free_pages; + mem_info(&total, &free_pages); + printf(" %s total=%u free=%u (each page = 16 KB)\n", + label, total, free_pages); +} + +int main(void) +{ + puts("Sprinter page allocator demo"); + puts(""); + + show_mem("before:"); + + uint8_t blk = mem_alloc_pages(3); + if (blk == 0) { + puts(" mem_alloc_pages(3) failed"); + (void)getchar(); + return 1; + } + printf(" allocated block id = %u (3 pages)\n", blk); + show_mem("after alloc:"); + + /* Show the physical page numbers we got. */ + for (uint8_t i = 0; i < 3; i++) { + uint8_t phys = mem_get_page(blk, i); + printf(" page %u of block = phys 0x%02X\n", i, phys); + } + + /* Write a 32-byte pattern at offset 0 of each page; pattern depends + * on page index so we can distinguish them. */ + char buf[33]; + for (uint8_t i = 0; i < 3; i++) { + uint8_t phys = mem_get_page(blk, i); + for (int j = 0; j < 32; j++) { + buf[j] = 'A' + (char)i; /* page 0 -> 'A', page 1 -> 'B', page 2 -> 'C' */ + } + buf[32] = 0; + bank_write(phys, 0, buf, 32); + printf(" wrote 32 x '%c' to page %u (phys 0x%02X)\n", + 'A' + i, i, phys); + } + + /* Read back and verify each page has its own pattern. */ + puts(""); + puts("readback:"); + for (uint8_t i = 0; i < 3; i++) { + uint8_t phys = mem_get_page(blk, i); + memset(buf, 0, sizeof(buf)); + bank_read(phys, 0, buf, 32); + buf[32] = 0; + printf(" page %u (phys 0x%02X) first 32 bytes: \"%s\"\n", + i, phys, buf); + } + + /* Single-byte API spot check. */ + bank_store_byte(mem_get_page(blk, 1), 100, 0x42); + uint8_t got = bank_load_byte(mem_get_page(blk, 1), 100); + printf("\n store/load single byte at page1[100]: 0x%02X (expect 0x42)\n", got); + + mem_free_block(blk); + show_mem("after free:"); + + puts(""); + puts("Press any key to exit."); + (void)getchar(); + return 0; +} diff --git a/examples/mouse/Makefile b/examples/mouse/Makefile new file mode 100644 index 0000000..d405235 --- /dev/null +++ b/examples/mouse/Makefile @@ -0,0 +1,5 @@ +# Build mouse_test.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := mouse +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/mouse/mouse.c b/examples/mouse/mouse.c new file mode 100644 index 0000000..ae6b9c4 --- /dev/null +++ b/examples/mouse/mouse.c @@ -0,0 +1,80 @@ +/* + * mouse_test — exercises the libc/io/mouse driver wrappers. + * + * Loop: shows live cursor state (pixel + char coordinates + buttons) + * and the current sensitivity values. Press +/- to change horizontal + * sensitivity, [/] to change vertical. ESC quits. + */ + +#include +#include +#include + +int main(void) +{ + textattr(COLOR(COLOR_LIGHTGRAY, COLOR_BLACK)); + clrscr(); + cputs("Mouse test - move mouse and click.\r\n" + " 1 / 2 : decrease / increase horizontal sensitivity\r\n" + " 3 / 4 : decrease / increase vertical sensitivity\r\n" + " ESC : exit\r\n"); + + if (mouse_init() < 0) { + cputs("mouse_init failed - no driver installed\r\n"); + return 1; + } + + /* Text mode 03h: 80 chars * 8 = 640 px wide, 32 * 8 = 256 px tall. */ + mouse_bounds_x(0, 639); + mouse_bounds_y(0, 255); + mouse_show(); + + mouse_state_t st; + int last_x = -1, last_y = -1; + uint8_t last_btn = 0xFF; + /* Sensitivity is a "raw steps per cursor pixel" divider: smaller = + * faster cursor. Force a known starting value so the display + * matches what's active in the driver even when GET returns 0 + * (some drivers / MAME stub). */ + uint8_t sens_x = 2; + uint8_t sens_y = 2; + mouse_set_sensitivity(sens_x, sens_y); + int sens_dirty = 1; + + while (1) { + mouse_read(&st); + if (st.x != last_x || st.y != last_y || st.buttons != last_btn) { + gotoxy(0, 6); + cprintf("x=%4u y=%4u text(%2u,%2u) buttons=0x%02X L%c R%c ", + st.x, st.y, + st.x / 8, st.y / 8, + st.buttons, + (st.buttons & 1) ? '*' : '.', + (st.buttons & 2) ? '*' : '.'); + last_x = st.x; + last_y = st.y; + last_btn = st.buttons; + } + if (sens_dirty) { + gotoxy(0, 8); + cprintf("sensitivity horz=%3u vert=%3u ", sens_x, sens_y); + sens_dirty = 0; + } + + if (!kbhit()) continue; + int k = getch(); + if (k == 27) break; /* ESC */ + if (k == '1' && sens_x > 1) { sens_x -= 1; sens_dirty = 1; } + if (k == '2' && sens_x < 254) { sens_x += 1; sens_dirty = 1; } + if (k == '3' && sens_y > 1) { sens_y -= 1; sens_dirty = 1; } + if (k == '4' && sens_y < 254) { sens_y += 1; sens_dirty = 1; } + if (sens_dirty) + mouse_set_sensitivity(sens_x, sens_y); + } + + mouse_hide(); + gotoxy(0, 10); + cputs("press any key to exit"); + (void)getch(); + return 0; +} diff --git a/examples/openenv/Makefile b/examples/openenv/Makefile new file mode 100644 index 0000000..3d54cb1 --- /dev/null +++ b/examples/openenv/Makefile @@ -0,0 +1,5 @@ +# Build open_env_test.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := openenv +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/openenv/openenv.c b/examples/openenv/openenv.c new file mode 100644 index 0000000..bf8efc4 --- /dev/null +++ b/examples/openenv/openenv.c @@ -0,0 +1,148 @@ +#include +#include +#include +#include +#include +#include + +/* + * Exercises the new open() state machine + ESTEX env API. + * + * Touches the floppy: creates TMP1.TXT and TMP2.TXT, writes a few bytes, + * verifies O_CREAT / O_EXCL / O_TRUNC / O_APPEND behaviour, then deletes. + */ + +static void show_errno(const char *label) +{ + printf(" %s: errno=%d \"%s\"\n", label, errno, strerror(errno)); +} + +int main(void) +{ + puts("Sprinter open() + env API test"); + puts(""); + + /* --- open() state machine ------------------------------------- */ + + /* 1. O_CREAT|O_EXCL: must succeed first time, must fail on retry. */ + unlink("TMP1.TXT"); /* clean slate */ + errno = 0; + int fd = open("TMP1.TXT", O_WRONLY | O_CREAT | O_EXCL); + printf("create-new TMP1.TXT (1st): fd=%d\n", fd); + show_errno(" after 1st"); + if (fd >= 0) { + write(fd, "abcdef", 6); + close(fd); + } + + errno = 0; + fd = open("TMP1.TXT", O_WRONLY | O_CREAT | O_EXCL); + printf("create-new TMP1.TXT (2nd, should fail with EEXIST): fd=%d\n", fd); + show_errno(" after 2nd"); + + /* 2. O_CREAT|O_TRUNC: file is reset. */ + errno = 0; + fd = open("TMP1.TXT", O_WRONLY | O_CREAT | O_TRUNC); + printf("create-trunc TMP1.TXT: fd=%d\n", fd); + if (fd >= 0) { + write(fd, "XYZ", 3); + close(fd); + } + + /* Read back to confirm truncation overwrote "abcdef". */ + char buf[16]; + fd = open("TMP1.TXT", O_RDONLY); + int n = read(fd, buf, sizeof(buf) - 1); + if (n < 0) n = 0; + buf[n] = 0; + close(fd); + printf("contents after trunc+write: \"%s\" (expect \"XYZ\")\n", buf); + + /* 3. O_APPEND: writes go to end. */ + fd = open("TMP1.TXT", O_WRONLY | O_APPEND); + if (fd >= 0) { + write(fd, "+APP", 4); + close(fd); + } + fd = open("TMP1.TXT", O_RDONLY); + n = read(fd, buf, sizeof(buf) - 1); + if (n < 0) n = 0; + buf[n] = 0; + close(fd); + printf("contents after append: \"%s\" (expect \"XYZ+APP\")\n", buf); + + /* 4. O_CREAT alone (no EXCL/TRUNC): existing file opens, new file is + * created. We open TMP1 (must succeed without truncating) then + * TMP2 (must be created fresh). */ + fd = open("TMP1.TXT", O_RDONLY | O_CREAT); + n = read(fd, buf, sizeof(buf) - 1); + if (n < 0) n = 0; + buf[n] = 0; + close(fd); + printf("O_CREAT on existing TMP1: \"%s\" (expect \"XYZ+APP\")\n", buf); + + unlink("TMP2.TXT"); + fd = open("TMP2.TXT", O_WRONLY | O_CREAT); + printf("O_CREAT on missing TMP2: fd=%d\n", fd); + if (fd >= 0) { + write(fd, "fresh", 5); + close(fd); + } + + /* cleanup */ + unlink("TMP1.TXT"); + unlink("TMP2.TXT"); + + /* --- env API -------------------------------------------------- */ + puts(""); + puts("env API:"); + + errno = 0; + char *v = getenv("PATH"); + printf(" getenv(\"PATH\") = %p", v); + if (v) { + printf(" -> \"%s\"", v); + } else { + printf(" (NULL, errno=%d)", errno); + } + putchar('\n'); + + errno = 0; + int rc = putenv("SPRINTER_HELLO=world"); + printf(" putenv(\"SPRINTER_HELLO=world\"): rc=%d\n", rc); + if (rc != 0) show_errno(" after putenv"); + + errno = 0; + v = getenv("SPRINTER_HELLO"); + printf(" getenv(\"SPRINTER_HELLO\") = %p", v); + if (v) { + printf(" -> \"%s\"", v); + } else { + printf(" (NULL, errno=%d)", errno); + } + putchar('\n'); + + /* --- sysenv: dump the whole environment block ----------------- */ + puts(""); + puts("sysenv:"); + { + static char envbuf[512]; + errno = 0; + char *r = sysenv(envbuf); + if (r == (char *)-1) { + show_errno(" sysenv failed"); + } else { + printf(" sysenv(%p) returned %p\n", envbuf, r); + int n = 0; + for (char *p = r; *p; p += strlen(p) + 1) { + printf(" [%d] %s\n", n++, p); + } + printf(" total: %d variable(s)\n", n); + } + } + + puts(""); + puts("Press any key to exit."); + (void)getchar(); + return 0; +} diff --git a/examples/ptime/Makefile b/examples/ptime/Makefile new file mode 100644 index 0000000..5a500da --- /dev/null +++ b/examples/ptime/Makefile @@ -0,0 +1,3 @@ +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := ptime +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/ptime/ptime.c b/examples/ptime/ptime.c new file mode 100644 index 0000000..48a2a45 --- /dev/null +++ b/examples/ptime/ptime.c @@ -0,0 +1,44 @@ +/* + * ptime — exercise POSIX . All wired through SDCC's z80.lib + * time.rel which calls our RtcRead() (bridged to ESTEX SYSTIME). + */ + +#include +#include + +int main(void) +{ + /* time() returns seconds since 1970-01-01 (Unix epoch). */ + time_t now; + time(&now); + printf("time() = %lu epoch seconds\n", now); + + /* localtime() decomposes into struct tm. */ + struct tm *lt = localtime(&now); + printf("localtime() = %04d-%02d-%02d %02d:%02d:%02d (wday=%u)\n", + lt->tm_year + 1900, + lt->tm_mon + 1, + lt->tm_mday, + lt->tm_hour, + lt->tm_min, + lt->tm_sec, + (unsigned)lt->tm_wday); + + /* asctime() formats it as a 25-char string. */ + printf("asctime() = %s", asctime(lt)); /* asctime adds \n */ + + /* mktime() round-trip — should recover the same epoch. */ + time_t round = mktime(lt); + printf("mktime() = %lu (round-trip %s original)\n", + round, (round == now ? "==" : "!=")); + + /* Native datetime_t API still works alongside. */ + datetime_t dt; + getdatetime(&dt); + printf("native = %04u-%02u-%02u %02u:%02u:%02u (dow=%u)\n", + dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + (unsigned)dt.dow); + + return 0; +} diff --git a/examples/rt_test/Makefile b/examples/rt_test/Makefile new file mode 100644 index 0000000..2d82422 --- /dev/null +++ b/examples/rt_test/Makefile @@ -0,0 +1,5 @@ +# Build rt_test.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := rt_test +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/rt_test/rt_test.c b/examples/rt_test/rt_test.c new file mode 100644 index 0000000..c070f2b --- /dev/null +++ b/examples/rt_test/rt_test.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include + +static void bye1(void) { puts("[atexit] bye1 (registered first, runs last)"); } +static void bye2(void) { puts("[atexit] bye2 (registered second)"); } +static void bye3(void) { puts("[atexit] bye3 (registered third, runs first)"); } + +static jmp_buf env; +static int attempt; + +static void might_fail(int n) +{ + printf(" might_fail(%d) running...\n", n); + if (n == 2) { + puts(" -> longjmp(env, 42)"); + longjmp(env, 42); + /* not reached */ + } + printf(" might_fail(%d) returned normally\n", n); +} + +int main(void) +{ + puts("Sprinter runtime features test:"); + puts(""); + + /* --- atexit registration --- */ + atexit(bye1); + atexit(bye2); + atexit(bye3); + + /* --- setjmp / longjmp --- */ + puts("setjmp/longjmp:"); + int r = setjmp(env); + if (r == 0) { + attempt = 1; + puts(" first arrival from setjmp (r=0)"); + might_fail(attempt); + attempt = 2; + might_fail(attempt); + puts(" -- this line is NOT reached"); + } else { + printf(" resumed via longjmp, setjmp returned %d (attempt=%d)\n", + r, attempt); + } + + /* --- sleep --- */ + puts(""); + puts("sleep(5): pausing 5 seconds..."); + sleep(5); + puts(" done."); + + puts(""); + puts("Press any key, atexit chain will run after."); + (void)getchar(); + + /* Use exit() to drive the atexit chain (vs returning from main, which + * doesn't necessarily go through exit() under SDCC). */ + exit(0); + return 0; +} diff --git a/examples/seek/Makefile b/examples/seek/Makefile new file mode 100644 index 0000000..ecfcf13 --- /dev/null +++ b/examples/seek/Makefile @@ -0,0 +1,6 @@ +# Build seek_demo.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := seek +EXTRA_DATA := big.txt +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/seek/big.txt b/examples/seek/big.txt new file mode 100644 index 0000000..65d2ffd --- /dev/null +++ b/examples/seek/big.txt @@ -0,0 +1,400 @@ +[off=0000000] block #0000 ..................................................................................................................................................................................................................................... +[off=0000256] block #0001 ..................................................................................................................................................................................................................................... +[off=0000512] block #0002 ..................................................................................................................................................................................................................................... +[off=0000768] block #0003 ..................................................................................................................................................................................................................................... +[off=0001024] block #0004 ..................................................................................................................................................................................................................................... +[off=0001280] block #0005 ..................................................................................................................................................................................................................................... +[off=0001536] block #0006 ..................................................................................................................................................................................................................................... +[off=0001792] block #0007 ..................................................................................................................................................................................................................................... +[off=0002048] block #0008 ..................................................................................................................................................................................................................................... +[off=0002304] block #0009 ..................................................................................................................................................................................................................................... +[off=0002560] block #0010 ..................................................................................................................................................................................................................................... +[off=0002816] block #0011 ..................................................................................................................................................................................................................................... +[off=0003072] block #0012 ..................................................................................................................................................................................................................................... +[off=0003328] block #0013 ..................................................................................................................................................................................................................................... +[off=0003584] block #0014 ..................................................................................................................................................................................................................................... +[off=0003840] block #0015 ..................................................................................................................................................................................................................................... +[off=0004096] block #0016 ..................................................................................................................................................................................................................................... +[off=0004352] block #0017 ..................................................................................................................................................................................................................................... +[off=0004608] block #0018 ..................................................................................................................................................................................................................................... +[off=0004864] block #0019 ..................................................................................................................................................................................................................................... +[off=0005120] block #0020 ..................................................................................................................................................................................................................................... +[off=0005376] block #0021 ..................................................................................................................................................................................................................................... +[off=0005632] block #0022 ..................................................................................................................................................................................................................................... +[off=0005888] block #0023 ..................................................................................................................................................................................................................................... +[off=0006144] block #0024 ..................................................................................................................................................................................................................................... +[off=0006400] block #0025 ..................................................................................................................................................................................................................................... +[off=0006656] block #0026 ..................................................................................................................................................................................................................................... +[off=0006912] block #0027 ..................................................................................................................................................................................................................................... +[off=0007168] block #0028 ..................................................................................................................................................................................................................................... +[off=0007424] block #0029 ..................................................................................................................................................................................................................................... +[off=0007680] block #0030 ..................................................................................................................................................................................................................................... +[off=0007936] block #0031 ..................................................................................................................................................................................................................................... +[off=0008192] block #0032 ..................................................................................................................................................................................................................................... +[off=0008448] block #0033 ..................................................................................................................................................................................................................................... +[off=0008704] block #0034 ..................................................................................................................................................................................................................................... +[off=0008960] block #0035 ..................................................................................................................................................................................................................................... +[off=0009216] block #0036 ..................................................................................................................................................................................................................................... +[off=0009472] block #0037 ..................................................................................................................................................................................................................................... +[off=0009728] block #0038 ..................................................................................................................................................................................................................................... +[off=0009984] block #0039 ..................................................................................................................................................................................................................................... +[off=0010240] block #0040 ..................................................................................................................................................................................................................................... +[off=0010496] block #0041 ..................................................................................................................................................................................................................................... +[off=0010752] block #0042 ..................................................................................................................................................................................................................................... +[off=0011008] block #0043 ..................................................................................................................................................................................................................................... +[off=0011264] block #0044 ..................................................................................................................................................................................................................................... +[off=0011520] block #0045 ..................................................................................................................................................................................................................................... +[off=0011776] block #0046 ..................................................................................................................................................................................................................................... +[off=0012032] block #0047 ..................................................................................................................................................................................................................................... +[off=0012288] block #0048 ..................................................................................................................................................................................................................................... +[off=0012544] block #0049 ..................................................................................................................................................................................................................................... +[off=0012800] block #0050 ..................................................................................................................................................................................................................................... +[off=0013056] block #0051 ..................................................................................................................................................................................................................................... +[off=0013312] block #0052 ..................................................................................................................................................................................................................................... +[off=0013568] block #0053 ..................................................................................................................................................................................................................................... +[off=0013824] block #0054 ..................................................................................................................................................................................................................................... +[off=0014080] block #0055 ..................................................................................................................................................................................................................................... +[off=0014336] block #0056 ..................................................................................................................................................................................................................................... +[off=0014592] block #0057 ..................................................................................................................................................................................................................................... +[off=0014848] block #0058 ..................................................................................................................................................................................................................................... +[off=0015104] block #0059 ..................................................................................................................................................................................................................................... +[off=0015360] block #0060 ..................................................................................................................................................................................................................................... +[off=0015616] block #0061 ..................................................................................................................................................................................................................................... +[off=0015872] block #0062 ..................................................................................................................................................................................................................................... +[off=0016128] block #0063 ..................................................................................................................................................................................................................................... +[off=0016384] block #0064 ..................................................................................................................................................................................................................................... +[off=0016640] block #0065 ..................................................................................................................................................................................................................................... +[off=0016896] block #0066 ..................................................................................................................................................................................................................................... +[off=0017152] block #0067 ..................................................................................................................................................................................................................................... +[off=0017408] block #0068 ..................................................................................................................................................................................................................................... +[off=0017664] block #0069 ..................................................................................................................................................................................................................................... +[off=0017920] block #0070 ..................................................................................................................................................................................................................................... +[off=0018176] block #0071 ..................................................................................................................................................................................................................................... +[off=0018432] block #0072 ..................................................................................................................................................................................................................................... +[off=0018688] block #0073 ..................................................................................................................................................................................................................................... +[off=0018944] block #0074 ..................................................................................................................................................................................................................................... +[off=0019200] block #0075 ..................................................................................................................................................................................................................................... +[off=0019456] block #0076 ..................................................................................................................................................................................................................................... +[off=0019712] block #0077 ..................................................................................................................................................................................................................................... +[off=0019968] block #0078 ..................................................................................................................................................................................................................................... +[off=0020224] block #0079 ..................................................................................................................................................................................................................................... +[off=0020480] block #0080 ..................................................................................................................................................................................................................................... +[off=0020736] block #0081 ..................................................................................................................................................................................................................................... +[off=0020992] block #0082 ..................................................................................................................................................................................................................................... +[off=0021248] block #0083 ..................................................................................................................................................................................................................................... +[off=0021504] block #0084 ..................................................................................................................................................................................................................................... +[off=0021760] block #0085 ..................................................................................................................................................................................................................................... +[off=0022016] block #0086 ..................................................................................................................................................................................................................................... +[off=0022272] block #0087 ..................................................................................................................................................................................................................................... +[off=0022528] block #0088 ..................................................................................................................................................................................................................................... +[off=0022784] block #0089 ..................................................................................................................................................................................................................................... +[off=0023040] block #0090 ..................................................................................................................................................................................................................................... +[off=0023296] block #0091 ..................................................................................................................................................................................................................................... +[off=0023552] block #0092 ..................................................................................................................................................................................................................................... +[off=0023808] block #0093 ..................................................................................................................................................................................................................................... +[off=0024064] block #0094 ..................................................................................................................................................................................................................................... +[off=0024320] block #0095 ..................................................................................................................................................................................................................................... +[off=0024576] block #0096 ..................................................................................................................................................................................................................................... +[off=0024832] block #0097 ..................................................................................................................................................................................................................................... +[off=0025088] block #0098 ..................................................................................................................................................................................................................................... +[off=0025344] block #0099 ..................................................................................................................................................................................................................................... +[off=0025600] block #0100 ..................................................................................................................................................................................................................................... +[off=0025856] block #0101 ..................................................................................................................................................................................................................................... +[off=0026112] block #0102 ..................................................................................................................................................................................................................................... +[off=0026368] block #0103 ..................................................................................................................................................................................................................................... +[off=0026624] block #0104 ..................................................................................................................................................................................................................................... +[off=0026880] block #0105 ..................................................................................................................................................................................................................................... +[off=0027136] block #0106 ..................................................................................................................................................................................................................................... +[off=0027392] block #0107 ..................................................................................................................................................................................................................................... +[off=0027648] block #0108 ..................................................................................................................................................................................................................................... +[off=0027904] block #0109 ..................................................................................................................................................................................................................................... +[off=0028160] block #0110 ..................................................................................................................................................................................................................................... +[off=0028416] block #0111 ..................................................................................................................................................................................................................................... +[off=0028672] block #0112 ..................................................................................................................................................................................................................................... +[off=0028928] block #0113 ..................................................................................................................................................................................................................................... +[off=0029184] block #0114 ..................................................................................................................................................................................................................................... +[off=0029440] block #0115 ..................................................................................................................................................................................................................................... +[off=0029696] block #0116 ..................................................................................................................................................................................................................................... +[off=0029952] block #0117 ..................................................................................................................................................................................................................................... +[off=0030208] block #0118 ..................................................................................................................................................................................................................................... +[off=0030464] block #0119 ..................................................................................................................................................................................................................................... +[off=0030720] block #0120 ..................................................................................................................................................................................................................................... +[off=0030976] block #0121 ..................................................................................................................................................................................................................................... +[off=0031232] block #0122 ..................................................................................................................................................................................................................................... +[off=0031488] block #0123 ..................................................................................................................................................................................................................................... +[off=0031744] block #0124 ..................................................................................................................................................................................................................................... +[off=0032000] block #0125 ..................................................................................................................................................................................................................................... +[off=0032256] block #0126 ..................................................................................................................................................................................................................................... +[off=0032512] block #0127 ..................................................................................................................................................................................................................................... +[off=0032768] block #0128 ..................................................................................................................................................................................................................................... +[off=0033024] block #0129 ..................................................................................................................................................................................................................................... +[off=0033280] block #0130 ..................................................................................................................................................................................................................................... +[off=0033536] block #0131 ..................................................................................................................................................................................................................................... +[off=0033792] block #0132 ..................................................................................................................................................................................................................................... +[off=0034048] block #0133 ..................................................................................................................................................................................................................................... +[off=0034304] block #0134 ..................................................................................................................................................................................................................................... +[off=0034560] block #0135 ..................................................................................................................................................................................................................................... +[off=0034816] block #0136 ..................................................................................................................................................................................................................................... +[off=0035072] block #0137 ..................................................................................................................................................................................................................................... +[off=0035328] block #0138 ..................................................................................................................................................................................................................................... +[off=0035584] block #0139 ..................................................................................................................................................................................................................................... +[off=0035840] block #0140 ..................................................................................................................................................................................................................................... +[off=0036096] block #0141 ..................................................................................................................................................................................................................................... +[off=0036352] block #0142 ..................................................................................................................................................................................................................................... +[off=0036608] block #0143 ..................................................................................................................................................................................................................................... +[off=0036864] block #0144 ..................................................................................................................................................................................................................................... +[off=0037120] block #0145 ..................................................................................................................................................................................................................................... +[off=0037376] block #0146 ..................................................................................................................................................................................................................................... +[off=0037632] block #0147 ..................................................................................................................................................................................................................................... +[off=0037888] block #0148 ..................................................................................................................................................................................................................................... +[off=0038144] block #0149 ..................................................................................................................................................................................................................................... +[off=0038400] block #0150 ..................................................................................................................................................................................................................................... +[off=0038656] block #0151 ..................................................................................................................................................................................................................................... +[off=0038912] block #0152 ..................................................................................................................................................................................................................................... +[off=0039168] block #0153 ..................................................................................................................................................................................................................................... +[off=0039424] block #0154 ..................................................................................................................................................................................................................................... +[off=0039680] block #0155 ..................................................................................................................................................................................................................................... +[off=0039936] block #0156 ..................................................................................................................................................................................................................................... +[off=0040192] block #0157 ..................................................................................................................................................................................................................................... +[off=0040448] block #0158 ..................................................................................................................................................................................................................................... +[off=0040704] block #0159 ..................................................................................................................................................................................................................................... +[off=0040960] block #0160 ..................................................................................................................................................................................................................................... +[off=0041216] block #0161 ..................................................................................................................................................................................................................................... +[off=0041472] block #0162 ..................................................................................................................................................................................................................................... +[off=0041728] block #0163 ..................................................................................................................................................................................................................................... +[off=0041984] block #0164 ..................................................................................................................................................................................................................................... +[off=0042240] block #0165 ..................................................................................................................................................................................................................................... +[off=0042496] block #0166 ..................................................................................................................................................................................................................................... +[off=0042752] block #0167 ..................................................................................................................................................................................................................................... +[off=0043008] block #0168 ..................................................................................................................................................................................................................................... +[off=0043264] block #0169 ..................................................................................................................................................................................................................................... +[off=0043520] block #0170 ..................................................................................................................................................................................................................................... +[off=0043776] block #0171 ..................................................................................................................................................................................................................................... +[off=0044032] block #0172 ..................................................................................................................................................................................................................................... +[off=0044288] block #0173 ..................................................................................................................................................................................................................................... +[off=0044544] block #0174 ..................................................................................................................................................................................................................................... +[off=0044800] block #0175 ..................................................................................................................................................................................................................................... +[off=0045056] block #0176 ..................................................................................................................................................................................................................................... +[off=0045312] block #0177 ..................................................................................................................................................................................................................................... +[off=0045568] block #0178 ..................................................................................................................................................................................................................................... +[off=0045824] block #0179 ..................................................................................................................................................................................................................................... +[off=0046080] block #0180 ..................................................................................................................................................................................................................................... +[off=0046336] block #0181 ..................................................................................................................................................................................................................................... +[off=0046592] block #0182 ..................................................................................................................................................................................................................................... +[off=0046848] block #0183 ..................................................................................................................................................................................................................................... +[off=0047104] block #0184 ..................................................................................................................................................................................................................................... +[off=0047360] block #0185 ..................................................................................................................................................................................................................................... +[off=0047616] block #0186 ..................................................................................................................................................................................................................................... +[off=0047872] block #0187 ..................................................................................................................................................................................................................................... +[off=0048128] block #0188 ..................................................................................................................................................................................................................................... +[off=0048384] block #0189 ..................................................................................................................................................................................................................................... +[off=0048640] block #0190 ..................................................................................................................................................................................................................................... +[off=0048896] block #0191 ..................................................................................................................................................................................................................................... +[off=0049152] block #0192 ..................................................................................................................................................................................................................................... +[off=0049408] block #0193 ..................................................................................................................................................................................................................................... +[off=0049664] block #0194 ..................................................................................................................................................................................................................................... +[off=0049920] block #0195 ..................................................................................................................................................................................................................................... +[off=0050176] block #0196 ..................................................................................................................................................................................................................................... +[off=0050432] block #0197 ..................................................................................................................................................................................................................................... +[off=0050688] block #0198 ..................................................................................................................................................................................................................................... +[off=0050944] block #0199 ..................................................................................................................................................................................................................................... +[off=0051200] block #0200 ..................................................................................................................................................................................................................................... +[off=0051456] block #0201 ..................................................................................................................................................................................................................................... +[off=0051712] block #0202 ..................................................................................................................................................................................................................................... +[off=0051968] block #0203 ..................................................................................................................................................................................................................................... +[off=0052224] block #0204 ..................................................................................................................................................................................................................................... +[off=0052480] block #0205 ..................................................................................................................................................................................................................................... +[off=0052736] block #0206 ..................................................................................................................................................................................................................................... +[off=0052992] block #0207 ..................................................................................................................................................................................................................................... +[off=0053248] block #0208 ..................................................................................................................................................................................................................................... +[off=0053504] block #0209 ..................................................................................................................................................................................................................................... +[off=0053760] block #0210 ..................................................................................................................................................................................................................................... +[off=0054016] block #0211 ..................................................................................................................................................................................................................................... +[off=0054272] block #0212 ..................................................................................................................................................................................................................................... +[off=0054528] block #0213 ..................................................................................................................................................................................................................................... +[off=0054784] block #0214 ..................................................................................................................................................................................................................................... +[off=0055040] block #0215 ..................................................................................................................................................................................................................................... +[off=0055296] block #0216 ..................................................................................................................................................................................................................................... +[off=0055552] block #0217 ..................................................................................................................................................................................................................................... +[off=0055808] block #0218 ..................................................................................................................................................................................................................................... +[off=0056064] block #0219 ..................................................................................................................................................................................................................................... +[off=0056320] block #0220 ..................................................................................................................................................................................................................................... +[off=0056576] block #0221 ..................................................................................................................................................................................................................................... +[off=0056832] block #0222 ..................................................................................................................................................................................................................................... +[off=0057088] block #0223 ..................................................................................................................................................................................................................................... +[off=0057344] block #0224 ..................................................................................................................................................................................................................................... +[off=0057600] block #0225 ..................................................................................................................................................................................................................................... +[off=0057856] block #0226 ..................................................................................................................................................................................................................................... +[off=0058112] block #0227 ..................................................................................................................................................................................................................................... +[off=0058368] block #0228 ..................................................................................................................................................................................................................................... +[off=0058624] block #0229 ..................................................................................................................................................................................................................................... +[off=0058880] block #0230 ..................................................................................................................................................................................................................................... +[off=0059136] block #0231 ..................................................................................................................................................................................................................................... +[off=0059392] block #0232 ..................................................................................................................................................................................................................................... +[off=0059648] block #0233 ..................................................................................................................................................................................................................................... +[off=0059904] block #0234 ..................................................................................................................................................................................................................................... +[off=0060160] block #0235 ..................................................................................................................................................................................................................................... +[off=0060416] block #0236 ..................................................................................................................................................................................................................................... +[off=0060672] block #0237 ..................................................................................................................................................................................................................................... +[off=0060928] block #0238 ..................................................................................................................................................................................................................................... +[off=0061184] block #0239 ..................................................................................................................................................................................................................................... +[off=0061440] block #0240 ..................................................................................................................................................................................................................................... +[off=0061696] block #0241 ..................................................................................................................................................................................................................................... +[off=0061952] block #0242 ..................................................................................................................................................................................................................................... +[off=0062208] block #0243 ..................................................................................................................................................................................................................................... +[off=0062464] block #0244 ..................................................................................................................................................................................................................................... +[off=0062720] block #0245 ..................................................................................................................................................................................................................................... +[off=0062976] block #0246 ..................................................................................................................................................................................................................................... +[off=0063232] block #0247 ..................................................................................................................................................................................................................................... +[off=0063488] block #0248 ..................................................................................................................................................................................................................................... +[off=0063744] block #0249 ..................................................................................................................................................................................................................................... +[off=0064000] block #0250 ..................................................................................................................................................................................................................................... +[off=0064256] block #0251 ..................................................................................................................................................................................................................................... +[off=0064512] block #0252 ..................................................................................................................................................................................................................................... +[off=0064768] block #0253 ..................................................................................................................................................................................................................................... +[off=0065024] block #0254 ..................................................................................................................................................................................................................................... +[off=0065280] block #0255 ..................................................................................................................................................................................................................................... +[off=0065536] block #0256 ..................................................................................................................................................................................................................................... +[off=0065792] block #0257 ..................................................................................................................................................................................................................................... +[off=0066048] block #0258 ..................................................................................................................................................................................................................................... +[off=0066304] block #0259 ..................................................................................................................................................................................................................................... +[off=0066560] block #0260 ..................................................................................................................................................................................................................................... +[off=0066816] block #0261 ..................................................................................................................................................................................................................................... +[off=0067072] block #0262 ..................................................................................................................................................................................................................................... +[off=0067328] block #0263 ..................................................................................................................................................................................................................................... +[off=0067584] block #0264 ..................................................................................................................................................................................................................................... +[off=0067840] block #0265 ..................................................................................................................................................................................................................................... +[off=0068096] block #0266 ..................................................................................................................................................................................................................................... +[off=0068352] block #0267 ..................................................................................................................................................................................................................................... +[off=0068608] block #0268 ..................................................................................................................................................................................................................................... +[off=0068864] block #0269 ..................................................................................................................................................................................................................................... +[off=0069120] block #0270 ..................................................................................................................................................................................................................................... +[off=0069376] block #0271 ..................................................................................................................................................................................................................................... +[off=0069632] block #0272 ..................................................................................................................................................................................................................................... +[off=0069888] block #0273 ..................................................................................................................................................................................................................................... +[off=0070144] block #0274 ..................................................................................................................................................................................................................................... +[off=0070400] block #0275 ..................................................................................................................................................................................................................................... +[off=0070656] block #0276 ..................................................................................................................................................................................................................................... +[off=0070912] block #0277 ..................................................................................................................................................................................................................................... +[off=0071168] block #0278 ..................................................................................................................................................................................................................................... +[off=0071424] block #0279 ..................................................................................................................................................................................................................................... +[off=0071680] block #0280 ..................................................................................................................................................................................................................................... +[off=0071936] block #0281 ..................................................................................................................................................................................................................................... +[off=0072192] block #0282 ..................................................................................................................................................................................................................................... +[off=0072448] block #0283 ..................................................................................................................................................................................................................................... +[off=0072704] block #0284 ..................................................................................................................................................................................................................................... +[off=0072960] block #0285 ..................................................................................................................................................................................................................................... +[off=0073216] block #0286 ..................................................................................................................................................................................................................................... +[off=0073472] block #0287 ..................................................................................................................................................................................................................................... +[off=0073728] block #0288 ..................................................................................................................................................................................................................................... +[off=0073984] block #0289 ..................................................................................................................................................................................................................................... +[off=0074240] block #0290 ..................................................................................................................................................................................................................................... +[off=0074496] block #0291 ..................................................................................................................................................................................................................................... +[off=0074752] block #0292 ..................................................................................................................................................................................................................................... +[off=0075008] block #0293 ..................................................................................................................................................................................................................................... +[off=0075264] block #0294 ..................................................................................................................................................................................................................................... +[off=0075520] block #0295 ..................................................................................................................................................................................................................................... +[off=0075776] block #0296 ..................................................................................................................................................................................................................................... +[off=0076032] block #0297 ..................................................................................................................................................................................................................................... +[off=0076288] block #0298 ..................................................................................................................................................................................................................................... +[off=0076544] block #0299 ..................................................................................................................................................................................................................................... +[off=0076800] block #0300 ..................................................................................................................................................................................................................................... +[off=0077056] block #0301 ..................................................................................................................................................................................................................................... +[off=0077312] block #0302 ..................................................................................................................................................................................................................................... +[off=0077568] block #0303 ..................................................................................................................................................................................................................................... +[off=0077824] block #0304 ..................................................................................................................................................................................................................................... +[off=0078080] block #0305 ..................................................................................................................................................................................................................................... +[off=0078336] block #0306 ..................................................................................................................................................................................................................................... +[off=0078592] block #0307 ..................................................................................................................................................................................................................................... +[off=0078848] block #0308 ..................................................................................................................................................................................................................................... +[off=0079104] block #0309 ..................................................................................................................................................................................................................................... +[off=0079360] block #0310 ..................................................................................................................................................................................................................................... +[off=0079616] block #0311 ..................................................................................................................................................................................................................................... +[off=0079872] block #0312 ..................................................................................................................................................................................................................................... +[off=0080128] block #0313 ..................................................................................................................................................................................................................................... +[off=0080384] block #0314 ..................................................................................................................................................................................................................................... +[off=0080640] block #0315 ..................................................................................................................................................................................................................................... +[off=0080896] block #0316 ..................................................................................................................................................................................................................................... +[off=0081152] block #0317 ..................................................................................................................................................................................................................................... +[off=0081408] block #0318 ..................................................................................................................................................................................................................................... +[off=0081664] block #0319 ..................................................................................................................................................................................................................................... +[off=0081920] block #0320 ..................................................................................................................................................................................................................................... +[off=0082176] block #0321 ..................................................................................................................................................................................................................................... +[off=0082432] block #0322 ..................................................................................................................................................................................................................................... +[off=0082688] block #0323 ..................................................................................................................................................................................................................................... +[off=0082944] block #0324 ..................................................................................................................................................................................................................................... +[off=0083200] block #0325 ..................................................................................................................................................................................................................................... +[off=0083456] block #0326 ..................................................................................................................................................................................................................................... +[off=0083712] block #0327 ..................................................................................................................................................................................................................................... +[off=0083968] block #0328 ..................................................................................................................................................................................................................................... +[off=0084224] block #0329 ..................................................................................................................................................................................................................................... +[off=0084480] block #0330 ..................................................................................................................................................................................................................................... +[off=0084736] block #0331 ..................................................................................................................................................................................................................................... +[off=0084992] block #0332 ..................................................................................................................................................................................................................................... +[off=0085248] block #0333 ..................................................................................................................................................................................................................................... +[off=0085504] block #0334 ..................................................................................................................................................................................................................................... +[off=0085760] block #0335 ..................................................................................................................................................................................................................................... +[off=0086016] block #0336 ..................................................................................................................................................................................................................................... +[off=0086272] block #0337 ..................................................................................................................................................................................................................................... +[off=0086528] block #0338 ..................................................................................................................................................................................................................................... +[off=0086784] block #0339 ..................................................................................................................................................................................................................................... +[off=0087040] block #0340 ..................................................................................................................................................................................................................................... +[off=0087296] block #0341 ..................................................................................................................................................................................................................................... +[off=0087552] block #0342 ..................................................................................................................................................................................................................................... +[off=0087808] block #0343 ..................................................................................................................................................................................................................................... +[off=0088064] block #0344 ..................................................................................................................................................................................................................................... +[off=0088320] block #0345 ..................................................................................................................................................................................................................................... +[off=0088576] block #0346 ..................................................................................................................................................................................................................................... +[off=0088832] block #0347 ..................................................................................................................................................................................................................................... +[off=0089088] block #0348 ..................................................................................................................................................................................................................................... +[off=0089344] block #0349 ..................................................................................................................................................................................................................................... +[off=0089600] block #0350 ..................................................................................................................................................................................................................................... +[off=0089856] block #0351 ..................................................................................................................................................................................................................................... +[off=0090112] block #0352 ..................................................................................................................................................................................................................................... +[off=0090368] block #0353 ..................................................................................................................................................................................................................................... +[off=0090624] block #0354 ..................................................................................................................................................................................................................................... +[off=0090880] block #0355 ..................................................................................................................................................................................................................................... +[off=0091136] block #0356 ..................................................................................................................................................................................................................................... +[off=0091392] block #0357 ..................................................................................................................................................................................................................................... +[off=0091648] block #0358 ..................................................................................................................................................................................................................................... +[off=0091904] block #0359 ..................................................................................................................................................................................................................................... +[off=0092160] block #0360 ..................................................................................................................................................................................................................................... +[off=0092416] block #0361 ..................................................................................................................................................................................................................................... +[off=0092672] block #0362 ..................................................................................................................................................................................................................................... +[off=0092928] block #0363 ..................................................................................................................................................................................................................................... +[off=0093184] block #0364 ..................................................................................................................................................................................................................................... +[off=0093440] block #0365 ..................................................................................................................................................................................................................................... +[off=0093696] block #0366 ..................................................................................................................................................................................................................................... +[off=0093952] block #0367 ..................................................................................................................................................................................................................................... +[off=0094208] block #0368 ..................................................................................................................................................................................................................................... +[off=0094464] block #0369 ..................................................................................................................................................................................................................................... +[off=0094720] block #0370 ..................................................................................................................................................................................................................................... +[off=0094976] block #0371 ..................................................................................................................................................................................................................................... +[off=0095232] block #0372 ..................................................................................................................................................................................................................................... +[off=0095488] block #0373 ..................................................................................................................................................................................................................................... +[off=0095744] block #0374 ..................................................................................................................................................................................................................................... +[off=0096000] block #0375 ..................................................................................................................................................................................................................................... +[off=0096256] block #0376 ..................................................................................................................................................................................................................................... +[off=0096512] block #0377 ..................................................................................................................................................................................................................................... +[off=0096768] block #0378 ..................................................................................................................................................................................................................................... +[off=0097024] block #0379 ..................................................................................................................................................................................................................................... +[off=0097280] block #0380 ..................................................................................................................................................................................................................................... +[off=0097536] block #0381 ..................................................................................................................................................................................................................................... +[off=0097792] block #0382 ..................................................................................................................................................................................................................................... +[off=0098048] block #0383 ..................................................................................................................................................................................................................................... +[off=0098304] block #0384 ..................................................................................................................................................................................................................................... +[off=0098560] block #0385 ..................................................................................................................................................................................................................................... +[off=0098816] block #0386 ..................................................................................................................................................................................................................................... +[off=0099072] block #0387 ..................................................................................................................................................................................................................................... +[off=0099328] block #0388 ..................................................................................................................................................................................................................................... +[off=0099584] block #0389 ..................................................................................................................................................................................................................................... +[off=0099840] block #0390 ..................................................................................................................................................................................................................................... +[off=0100096] block #0391 ..................................................................................................................................................................................................................................... +[off=0100352] block #0392 ..................................................................................................................................................................................................................................... +[off=0100608] block #0393 ..................................................................................................................................................................................................................................... +[off=0100864] block #0394 ..................................................................................................................................................................................................................................... +[off=0101120] block #0395 ..................................................................................................................................................................................................................................... +[off=0101376] block #0396 ..................................................................................................................................................................................................................................... +[off=0101632] block #0397 ..................................................................................................................................................................................................................................... +[off=0101888] block #0398 ..................................................................................................................................................................................................................................... +[off=0102144] block #0399 ..................................................................................................................................................................................................................................... diff --git a/examples/seek/gen_bigfile.py b/examples/seek/gen_bigfile.py new file mode 100644 index 0000000..90a2883 --- /dev/null +++ b/examples/seek/gen_bigfile.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +""" +Generate a >64 KB test file with predictable position-encoded content. + +Every 256-byte block starts with a 32-character ASCII line + "[off=NNNNNNN] block #BBBB filler...\n" +where NNNNNNN is the absolute byte offset of the block start (padded to 7 +decimal digits) and BBBB is the 4-digit block index. The line is padded +to 256 bytes with '.' so that seeking to any 256-aligned offset gives an +immediately-readable label. +""" +import sys +import os + +def main(): + path = sys.argv[1] if len(sys.argv) > 1 else "big.txt" + target_size = int(sys.argv[2]) if len(sys.argv) > 2 else 100 * 1024 + + block_size = 256 + nblocks = (target_size + block_size - 1) // block_size + + with open(path, "wb") as f: + for b in range(nblocks): + offset = b * block_size + header = f"[off={offset:07d}] block #{b:04d} " + body = header + ("." * (block_size - len(header) - 1)) + "\n" + assert len(body) == block_size, len(body) + f.write(body.encode("ascii")) + + actual = os.path.getsize(path) + print(f"wrote {path}: {actual} bytes ({nblocks} blocks of {block_size} each)") + + +if __name__ == "__main__": + main() diff --git a/examples/seek/seek.c b/examples/seek/seek.c new file mode 100644 index 0000000..8244743 --- /dev/null +++ b/examples/seek/seek.c @@ -0,0 +1,66 @@ +#include +#include +#include + +/* + * Exercises lseek() with offsets that span the 16-bit boundary. + * big.txt is 102400 bytes (100 KB); every 256-byte block opens with a + * "[off=NNNNNNN] block #BBBB " label, so any seek aligned to 256 lands + * on a self-identifying marker. + */ + +static void show_marker(int fd, long off) +{ + long pos = lseek(fd, off, SEEK_SET); + printf("\nseek %ld -> pos=%ld\n", off, pos); + + char buf[28]; + int n = read(fd, buf, 27); + if (n <= 0) { + printf(" read failed: %d\n", n); + return; + } + buf[n] = 0; + printf(" bytes: \"%s\"\n", buf); +} + +int main(void) +{ + int fd = open("BIG.TXT", O_RDONLY); + if (fd < 0) { + printf("open failed: %d\n", fd); + (void)getchar(); + return 1; + } + + /* Total file size. */ + long size = lseek(fd, 0L, SEEK_END); + printf("file size = %ld bytes\n", size); + + /* Seek inside the first 64 KB (high16 = 0). */ + show_marker(fd, 0L); + show_marker(fd, 256L); + show_marker(fd, 32768L); + + /* Right at the 64 KB boundary (offset 0x00010000, high16 = 1). */ + show_marker(fd, 65536L); + + /* Past 64 KB (high16 still 1, low16 != 0). */ + show_marker(fd, 65536L + 256L); + show_marker(fd, 81920L); + + /* Near end of file (size = 102400 = 0x19000, high16 = 1). */ + show_marker(fd, 102400L - 256L); + + /* SEEK_CUR: from current position, +256. After the previous SEEK_SET + * to 102144, then read of 27 bytes, pos is 102171. +256 -> 102427, + * which is past EOF — ESTEX should clamp or error. */ + long after_cur = lseek(fd, 256L, SEEK_CUR); + printf("\nSEEK_CUR +256 -> pos=%ld (past EOF)\n", after_cur); + + close(fd); + puts(""); + puts("Press any key to exit..."); + (void)getchar(); + return 0; +} diff --git a/examples/stattest/Makefile b/examples/stattest/Makefile new file mode 100644 index 0000000..c2d4b97 --- /dev/null +++ b/examples/stattest/Makefile @@ -0,0 +1,3 @@ +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := stattest +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/stattest/stattest.c b/examples/stattest/stattest.c new file mode 100644 index 0000000..609ec3e --- /dev/null +++ b/examples/stattest/stattest.c @@ -0,0 +1,89 @@ +/* + * stattest — exercise POSIX stat() and fstat() over ESTEX file metadata. + * + * Calls: + * stat() on a file by path + * stat() on a directory (current dir) + * stat() on a non-existent file (expects errno=ENOENT) + * fstat() on a freshly opened file + */ + +#include +#include +#include +#include +#include +#include +#include + +static const char *mode_str(uint16_t m) +{ + if (S_ISDIR(m)) return "DIR"; + if (S_ISREG(m)) return "REG"; + return "???"; +} + +static void print_stat(const char *what, const struct stat *st) +{ + char buf[32]; + /* Reuse asctime by converting epoch → struct tm. */ + time_t t = st->st_mtime; + struct tm *tm = localtime(&t); + sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", + tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec); + + printf(" %s: mode=%s perm=0%o size=%lu mtime=%s\n", + what, + mode_str(st->st_mode), + (unsigned)(st->st_mode & 0777), + (unsigned long)st->st_size, + buf); +} + +int main(int argc, char **argv) +{ + struct stat st; + + puts("stattest: stat() / fstat() smoke test"); + + /* stat on this very file (the .exe). */ + if (stat(argv[0], &st) == 0) + print_stat("self.exe", &st); + else + printf(" stat(\"%s\") failed: errno=%d (%s)\n", + argv[0], errno, strerror(errno)); + + /* stat on a definitely-missing file. */ + errno = 0; + if (stat("NOSUCH.XXX", &st) == 0) + puts(" stat(NOSUCH.XXX) unexpectedly succeeded?!"); + else + printf(" stat(NOSUCH.XXX) -> errno=%d (%s) [expected ENOENT]\n", + errno, strerror(errno)); + + /* fstat on a fresh handle (open the running exe read-only). */ + int fd = open(argv[0], O_RDONLY); + if (fd < 0) { + printf(" open(\"%s\") failed: errno=%d (%s)\n", + argv[0], errno, strerror(errno)); + } else { + if (fstat(fd, &st) == 0) + print_stat("fstat(self)", &st); + else + printf(" fstat failed: errno=%d (%s)\n", + errno, strerror(errno)); + close(fd); + } + + /* Extra argv-passed path. */ + if (argc > 1) { + if (stat(argv[1], &st) == 0) + print_stat(argv[1], &st); + else + printf(" stat(\"%s\") failed: errno=%d (%s)\n", + argv[1], errno, strerror(errno)); + } + + return 0; +} diff --git a/examples/stdlib/Makefile b/examples/stdlib/Makefile new file mode 100644 index 0000000..ffadefd --- /dev/null +++ b/examples/stdlib/Makefile @@ -0,0 +1,3 @@ +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := stdlib +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/stdlib/stdlib.c b/examples/stdlib/stdlib.c new file mode 100644 index 0000000..bf848a7 --- /dev/null +++ b/examples/stdlib/stdlib.c @@ -0,0 +1,63 @@ +/* + * stdlib_test — verifies that SDCC's z80.lib stdlib functions (atoi, + * strtol, rand, qsort, bsearch, abs, ldiv) work in our environment. + * If they all behave correctly, we can save ourselves the labour of + * reimplementing them in libc/stdlib. + */ + +#include +#include +#include + +static int cmp_int(const void *a, const void *b) +{ + int ia = *(const int *)a; + int ib = *(const int *)b; + return (ia > ib) - (ia < ib); +} + +int main(int argc, char **argv) +{ + /* atoi / strtol */ + int v_atoi = atoi("12345"); + long v_strtol = strtol("-9876", NULL, 10); + long v_hex = strtol("ff", NULL, 16); + printf("atoi(\"12345\") = %d (expected 12345)\n", v_atoi); + printf("strtol(\"-9876\",,10) = %ld (expected -9876)\n", v_strtol); + printf("strtol(\"ff\",,16) = %ld (expected 255)\n", v_hex); + + /* abs / ldiv */ + printf("abs(-7) = %d (expected 7)\n", abs(-7)); + { + ldiv_t q = ldiv(100L, 7L); + printf("ldiv(100,7) = {q=%ld, r=%ld} (expected {14, 2})\n", + q.quot, q.rem); + } + + /* rand / srand — deterministic with fixed seed */ + srand(42); + printf("rand x3 (seed 42): %d %d %d\n", rand(), rand(), rand()); + + /* qsort */ + { + int arr[] = { 5, 1, 4, 2, 8, 3, 7, 6, 0, 9 }; + qsort(arr, 10, sizeof(int), cmp_int); + printf("qsort:"); + for (int i = 0; i < 10; i++) printf(" %d", arr[i]); + printf(" (expected 0..9 sorted)\n"); + + /* bsearch */ + int key = 7; + int *p = (int *)bsearch(&key, arr, 10, sizeof(int), cmp_int); + printf("bsearch(7) -> %s (expected found)\n", + (p && *p == 7) ? "found" : "MISS"); + } + + /* argv-as-int: typical CLI use */ + if (argc > 1) { + printf("argv[1] as int: %d\n", atoi(argv[1])); + } + + puts("\nall SDCC stdlib functions reachable."); + return 0; +} diff --git a/examples/stest2/Makefile b/examples/stest2/Makefile new file mode 100644 index 0000000..ef1dbce --- /dev/null +++ b/examples/stest2/Makefile @@ -0,0 +1,3 @@ +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := stest2 +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/stest2/stest2.c b/examples/stest2/stest2.c new file mode 100644 index 0000000..a9e5920 --- /dev/null +++ b/examples/stest2/stest2.c @@ -0,0 +1,43 @@ +/* + * stattest — exercise POSIX stat() and fstat() over ESTEX file metadata. + * + * Calls: + * stat() on a file by path + * stat() on a directory (current dir) + * stat() on a non-existent file (expects errno=ENOENT) + * fstat() on a freshly opened file + */ + +#include +#include +#include +#include +#include +#include +#include +#include + + +int main(int argc, char **argv) +{ + struct stat st; + + puts("stattest: stat() / fstat() smoke test"); + + ffblk_t ffb; + + if (ffirst(argv[0], &ffb, FA_DIREC) == 0) { + printf("File %s, size = %d\n", argv[0], ffb.size); + } else { + printf("File %s, error\n", argv[0]); + } + + if (argc > 1) { + if (ffirst(argv[1], &ffb, FA_DIREC) == 0) { + printf("File %s, size = %d\n", argv[1], ffb.size); + } else { + printf("File %s, error\n", argv[1]); + } + } + return 0; +} diff --git a/examples/strtest/Makefile b/examples/strtest/Makefile new file mode 100644 index 0000000..9f1212b --- /dev/null +++ b/examples/strtest/Makefile @@ -0,0 +1,5 @@ +# Build strtest.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := strtest +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/strtest/strtest.c b/examples/strtest/strtest.c new file mode 100644 index 0000000..788ea4a --- /dev/null +++ b/examples/strtest/strtest.c @@ -0,0 +1,53 @@ +#include +#include + +static void check(const char *label, int ok) +{ + puts(label); + puts(ok ? " OK" : " FAIL"); +} + +int main(void) +{ + char buf[32]; + + /* strlen */ + check("strlen(\"\") == 0", strlen("") == 0); + check("strlen(\"hello\") == 5", strlen("hello") == 5); + + /* strcpy + strlen */ + strcpy(buf, "Sprinter"); + check("strcpy + strlen == 8", strlen(buf) == 8); + + /* strcmp */ + check("strcmp(\"a\",\"a\") == 0", strcmp("a", "a") == 0); + check("strcmp(\"a\",\"b\") < 0", strcmp("a", "b") < 0); + check("strcmp(\"b\",\"a\") > 0", strcmp("b", "a") > 0); + check("strcmp(buf,\"Sprinter\")", strcmp(buf, "Sprinter") == 0); + + /* strcat */ + strcpy(buf, "Hello "); + strcat(buf, "Sprinter!"); + check("strcat -> \"Hello Sprinter!\"", strcmp(buf, "Hello Sprinter!") == 0); + + /* memcpy */ + memset(buf, 'X', 16); + memcpy(buf + 4, "ABCD", 4); + buf[16] = 0; + check("memset+memcpy -> \"XXXXABCDXXXXXXXX\"", + strcmp(buf, "XXXXABCDXXXXXXXX") == 0); + + /* memset */ + memset(buf, 'q', 5); + buf[5] = 0; + check("memset(buf,'q',5) -> \"qqqqq\"", strcmp(buf, "qqqqq") == 0); + + /* memcmp */ + check("memcmp equal", memcmp("abcd", "abcd", 4) == 0); + check("memcmp diff", memcmp("abcd", "abxd", 4) != 0); + + puts(""); + puts("All checks done. Press any key to exit."); + (void)getchar(); + return 0; +} diff --git a/examples/timedir/Makefile b/examples/timedir/Makefile new file mode 100644 index 0000000..348d15f --- /dev/null +++ b/examples/timedir/Makefile @@ -0,0 +1,5 @@ +# Build time_dir_test.exe — uses lib/sprinter.lib in TINY memory mode. + +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := timedir +include $(PROJ_ROOT)/examples/example.mk diff --git a/examples/timedir/timedir.c b/examples/timedir/timedir.c new file mode 100644 index 0000000..13cfff6 --- /dev/null +++ b/examples/timedir/timedir.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include +#include + +static const char *dow_name(uint8_t d) +{ + /* Sprinter SYSTIME returns dow 1-based: 1=Sun..7=Sat. */ + static const char *names[] = { "?", "Sun", "Mon", "Tue", + "Wed", "Thu", "Fri", "Sat" }; + return (d >= 1 && d <= 7) ? names[d] : names[0]; +} + +int main(void) +{ + /* --- time ----------------------------------------------------------- */ + datetime_t dt; + getdatetime(&dt); + printf("getdatetime: %04u-%02u-%02u %02u:%02u:%02u (dow=%u %s)\n", + dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + dt.dow, dow_name(dt.dow)); + + /* dow convention probe — set to known dates, read back. + * Discriminating test: today (Thu) gave dow=5, which fits either + * (a) Sun=1, Mon=2, ..., Sat=7 (DOS 1-based starting Sun) + * (b) Sat=0, Sun=1, ..., Fri=6 (week starts Saturday) + * Saturday's number tells us which one. */ + datetime_t saved = dt; + datetime_t probe; + + probe = dt; probe.year = 2026; probe.month = 5; probe.day = 30; /* Sat */ + if (setdatetime(&probe) == 0) { + getdatetime(&probe); + printf("probe 2026-05-30 (Sat expected): dow=%u %s\n", + probe.dow, dow_name(probe.dow)); + } + + probe = dt; probe.year = 2026; probe.month = 5; probe.day = 31; /* Sun */ + if (setdatetime(&probe) == 0) { + getdatetime(&probe); + printf("probe 2026-05-31 (Sun expected): dow=%u %s\n", + probe.dow, dow_name(probe.dow)); + } + + probe = dt; probe.year = 2026; probe.month = 6; probe.day = 1; /* Mon */ + if (setdatetime(&probe) == 0) { + getdatetime(&probe); + printf("probe 2026-06-01 (Mon expected): dow=%u %s\n", + probe.dow, dow_name(probe.dow)); + } + + /* Restore original. */ + if (setdatetime(&saved) == 0) + printf("restored original date\n"); + else + printf("setdatetime(restore) failed: errno=%d\n", errno); + + /* --- getcwd --------------------------------------------------------- */ + char cwd[256]; + if (getcwd(cwd, sizeof cwd) == NULL) { + printf("getcwd failed: errno=%d (%s)\n", errno, strerror(errno)); + } else { + printf("cwd before: \"%s\"\n", cwd); + } + + /* --- mkdir / chdir / getcwd / rmdir --------------------------------- */ + const char *test_dir = "TMPTEST"; + + /* If a previous run left it behind, ignore the mkdir failure. */ + if (mkdir(test_dir) < 0) { + printf("mkdir(%s) -> errno=%d (%s) [continuing]\n", + test_dir, errno, strerror(errno)); + } else { + printf("mkdir(%s) OK\n", test_dir); + } + + if (chdir(test_dir) < 0) { + printf("chdir(%s) failed: errno=%d (%s)\n", + test_dir, errno, strerror(errno)); + return 1; + } + printf("chdir(%s) OK\n", test_dir); + + if (getcwd(cwd, sizeof cwd) != NULL) + printf("cwd after: \"%s\"\n", cwd); + + /* Back out, then remove. */ + if (chdir("\\") < 0) + printf("chdir(\\) failed: errno=%d\n", errno); + else + printf("chdir(\\) OK\n"); + + if (rmdir(test_dir) < 0) + printf("rmdir(%s) failed: errno=%d (%s)\n", + test_dir, errno, strerror(errno)); + else + printf("rmdir(%s) OK\n", test_dir); + + if (getcwd(cwd, sizeof cwd) != NULL) + printf("cwd final: \"%s\"\n", cwd); + + puts("\npress any key to exit"); + (void)getch(); + return 0; +} diff --git a/lib/Makefile b/lib/Makefile new file mode 100644 index 0000000..055bdff --- /dev/null +++ b/lib/Makefile @@ -0,0 +1,80 @@ +# Build lib/libsprinter.lib — the Sprinter target libc archive. +# +# Includes all libc/*.c modules plus the runtime helpers that get +# auto-pulled by SDCC's codegen (heap for malloc, bank trampolines for +# __banked). The crt0 family is NOT in the lib — they are always +# explicitly linked, never DCE-eligible. +# +# Each .c file becomes its own .rel inside the archive. The linker +# pulls only those .rel files whose exported symbols are referenced, +# giving free dead-code elimination at module granularity. + +PROJ_ROOT := $(abspath $(CURDIR)/..) +SDCC_BIN := $(PROJ_ROOT)/third_party/sdcc/bin +SDCC := $(SDCC_BIN)/sdcc +SDAR := $(SDCC_BIN)/sdar +SDASZ80 := $(SDCC_BIN)/sdasz80 + +INC := -I$(PROJ_ROOT)/libc/include +CC_FLAGS := -mz80 --no-std-crt0 --std-c99 --opt-code-size $(INC) + +BUILD := $(PROJ_ROOT)/lib/build + +# All libc C modules. +LIBC_C := \ + libc/io/atexit.c libc/io/conio.c libc/io/cprintf.c libc/io/dir.c \ + libc/io/videomode_raw.c \ + libc/io/_errno_set.c \ + libc/io/env.c libc/io/errno.c libc/io/fsdir.c \ + libc/io/lseek.c libc/io/mouse.c libc/io/open.c \ + libc/io/read.c libc/io/sleep.c \ + libc/io/time.c libc/io/posix_time.c libc/io/unlink.c \ + libc/io/stat.c \ + libc/mem/bank_io.c libc/mem/mem_alloc.c \ + libc/gfx/gfx_core.c libc/gfx/gfx_raw_common.c \ + libc/gfx/gfx_raw_256.c libc/gfx/gfx_raw_16.c \ + libc/gfx/gfx_256.c libc/gfx/gfx_16.c \ + libc/gfx/gfx_font.c libc/gfx/gfx_text_256.c \ + libc/gfx/gfx_text_16.c \ + libc/stdio/getchar.c libc/stdio/print_hex.c \ + libc/stdio/putchar.c libc/stdio/puts.c libc/stdio/file.c \ + libc/stdio/solid_helpers.c libc/io/solid_compat.c + +# Runtime modules to bundle (pulled by symbol references from libc-using code). +# NOTE: runtime/bank.s is NOT bundled — its trampoline depends on the banking +# window (W1 for BIG, W3 for HUGE) which is decided per-build by sprinter-cc. +# That tool assembles bank.s on each banked build with the right BANK_W1 flag. +RUNTIME_S := runtime/heap.s + +LIBC_RELS := $(patsubst libc/%.c,$(BUILD)/%.rel,$(LIBC_C)) +RUNTIME_RELS := $(patsubst runtime/%.s,$(BUILD)/%.rel,$(RUNTIME_S)) + +ALL_RELS := $(LIBC_RELS) $(RUNTIME_RELS) + +LIB := sprinter.lib + +all: $(LIB) + +# Pattern rule for C modules — preserves the libc/io|mem|stdio path +# so .rel members keep their natural names inside the archive. +$(BUILD)/%.rel: $(PROJ_ROOT)/libc/%.c + @mkdir -p $(dir $@) + $(SDCC) $(CC_FLAGS) -c -o $@ $< + +# Runtime .s → .rel +$(BUILD)/%.rel: $(PROJ_ROOT)/runtime/%.s + @mkdir -p $(dir $@) + $(SDASZ80) -o $@ $< + +# Archive — sdar with `rcs` = replace/create/symtab. +$(LIB): $(ALL_RELS) + rm -f $@ + $(SDAR) -rcs $@ $(ALL_RELS) + @echo + @echo " Built $@ with $(words $(ALL_RELS)) modules:" + @$(SDAR) -t $@ | sed 's/^/ /' + +clean: + rm -rf $(BUILD) $(LIB) + +.PHONY: all clean diff --git a/libc/gfx/gfx_16.c b/libc/gfx/gfx_16.c new file mode 100644 index 0000000..da36869 --- /dev/null +++ b/libc/gfx/gfx_16.c @@ -0,0 +1,106 @@ +/* + * gfx_16.c — 16-colour (mode 0x82) public drawing API. + * + * Raw primitives live in gfx_raw_16.c. Single-shot wrappers do one + * W3-begin / one W3-end around their raw call; composites wrap many + * raw calls in a single begin/end pair so the W3 dance is amortised. + * + * No vertical-accelerator path: in 16-colour mode each byte spans two + * horizontal pixels, so a vertical Fill burst would also affect the + * other column's nibble — vline16 falls back to per-row RMW. + */ + +#include +#include + +extern void _gfx_w3_video_begin(void); +extern void _gfx_w3_video_end(void); + +extern void _gfx_putpixel16_raw(int x, int y, uint8_t color); +extern void _gfx_hline16_raw (int x, int y, int len, uint8_t color); +extern void _gfx_vline16_raw (int x, int y, int len, uint8_t color); +extern void _gfx_clear16_raw (uint8_t color); + +void gfx_clear16(uint8_t color) +{ + _gfx_w3_video_begin(); + _gfx_clear16_raw(color); + _gfx_w3_video_end(); +} + +void gfx_putpixel16(int x, int y, uint8_t color) +{ + if ((unsigned)x >= GFX_WIDTH_16 || (unsigned)y >= GFX_HEIGHT_16) return; + _gfx_w3_video_begin(); + _gfx_putpixel16_raw(x, y, color); + _gfx_w3_video_end(); +} + +void gfx_hline16(int x, int y, int len, uint8_t color) +{ + _gfx_w3_video_begin(); + _gfx_hline16_raw(x, y, len, color); + _gfx_w3_video_end(); +} + +void gfx_vline16(int x, int y, int len, uint8_t color) +{ + _gfx_w3_video_begin(); + _gfx_vline16_raw(x, y, len, color); + _gfx_w3_video_end(); +} + +void gfx_rect16(int x, int y, int w, int h, uint8_t color) +{ + if (w <= 0 || h <= 0) return; + _gfx_w3_video_begin(); + _gfx_hline16_raw(x, y, w, color); + _gfx_hline16_raw(x, y + h - 1, w, color); + if (h > 2) { + _gfx_vline16_raw(x, y + 1, h - 2, color); + _gfx_vline16_raw(x + w - 1, y + 1, h - 2, color); + } + _gfx_w3_video_end(); +} + +void gfx_fill_rect16(int x, int y, int w, int h, uint8_t color) +{ + if (w <= 0 || h <= 0) return; + /* Column-major vlines — user's earlier request: 16-color rect_fill + * via vertical lines. Each column does its own per-row RMW; the + * outer begin/end wraps the whole rect so W3 is mapped once. */ + _gfx_w3_video_begin(); + for (int xx = 0; xx < w; xx++) + _gfx_vline16_raw(x + xx, y, h, color); + _gfx_w3_video_end(); +} + +void gfx_line16(int x0, int y0, int x1, int y1, uint8_t color) +{ + if (y0 == y1) { + int x = x0 <= x1 ? x0 : x1; + int w = (x0 <= x1 ? x1 - x0 : x0 - x1) + 1; + gfx_hline16(x, y0, w, color); + return; + } + if (x0 == x1) { + int y = y0 <= y1 ? y0 : y1; + int h = (y0 <= y1 ? y1 - y0 : y0 - y1) + 1; + gfx_vline16(x0, y, h, color); + return; + } + /* Bresenham — single W3 setup around the whole loop. */ + int dx = x1 - x0; int sx = dx < 0 ? -1 : 1; if (dx < 0) dx = -dx; + int dy = y1 - y0; int sy = dy < 0 ? -1 : 1; if (dy < 0) dy = -dy; + int err = (dx > dy ? dx : -dy) / 2; + int x = x0, y = y0; + _gfx_w3_video_begin(); + for (;;) { + _gfx_putpixel16_raw(x, y, color); + if (x == x1 && y == y1) break; + int e2 = err; + if (e2 > -dx) { err -= dy; x += sx; } + if (e2 < dy) { err += dx; y += sy; } + } + _gfx_w3_video_end(); +} diff --git a/libc/gfx/gfx_256.c b/libc/gfx/gfx_256.c new file mode 100644 index 0000000..f20dd25 --- /dev/null +++ b/libc/gfx/gfx_256.c @@ -0,0 +1,118 @@ +/* + * gfx_256.c — 256-colour (mode 0x81) public drawing API. + * + * Single-shot wrappers do one W3-begin / one W3-end around their raw + * call. Composites (rect, fill_rect, line) wrap a single begin/end + * around many raw calls so the W3 dance is paid once per operation, + * not once per pixel/byte. + */ + +#include +#include + +/* From gfx_raw_common.c — DI + map _gfx_bank into W3, save previous. */ +extern void _gfx_w3_video_begin(void); +extern void _gfx_w3_video_end(void); + +/* From gfx_raw_256.c — W3-naive primitives. */ +extern void _gfx_putpixel256_raw(int x, int y, uint8_t color); +extern void _gfx_hline256_raw (int x, int y, int len, uint8_t color); +extern void _gfx_vline256_raw (int x, int y, int len, uint8_t color); +extern void _gfx_clear256_raw (uint8_t color); + +void gfx_clear256(uint8_t color) +{ + _gfx_w3_video_begin(); + _gfx_clear256_raw(color); + _gfx_w3_video_end(); +} + +void gfx_putpixel256(int x, int y, uint8_t color) +{ + if ((unsigned)x >= GFX_WIDTH || (unsigned)y >= GFX_HEIGHT) return; + _gfx_w3_video_begin(); + _gfx_putpixel256_raw(x, y, color); + _gfx_w3_video_end(); +} + +void gfx_hline256(int x, int y, int len, uint8_t color) +{ + _gfx_w3_video_begin(); + _gfx_hline256_raw(x, y, len, color); + _gfx_w3_video_end(); +} + +void gfx_vline256(int x, int y, int len, uint8_t color) +{ + _gfx_w3_video_begin(); + _gfx_vline256_raw(x, y, len, color); + _gfx_w3_video_end(); +} + +void gfx_rect256(int x, int y, int w, int h, uint8_t color) +{ + if (w <= 0 || h <= 0) return; + _gfx_w3_video_begin(); + _gfx_hline256_raw(x, y, w, color); + _gfx_hline256_raw(x, y + h - 1, w, color); + if (h > 2) { + _gfx_vline256_raw(x, y + 1, h - 2, color); + _gfx_vline256_raw(x + w - 1, y + 1, h - 2, color); + } + _gfx_w3_video_end(); +} + +void gfx_fill_rect256(int x, int y, int w, int h, uint8_t color) +{ + if (w <= 0 || h <= 0) return; + + /* Pick the orientation with fewer accelerator bursts. Each burst + * paints up to 256 contiguous bytes (horizontal) or up to 256 + * vertical pixels in one column. + * row-major (hlines): h × ceil(w/256) bursts + * col-major (vlines): w × ceil(h/256) bursts — for h ≤ 256 = w + * Vertical wins for tall-narrow rects; horizontal for short-wide. */ + int h_bursts = h * ((w + 255) >> 8); + int v_bursts = w * ((h + 255) >> 8); + _gfx_w3_video_begin(); + if (h_bursts <= v_bursts) { + for (int yy = 0; yy < h; yy++) + _gfx_hline256_raw(x, y + yy, w, color); + } else { + for (int xx = 0; xx < w; xx++) + _gfx_vline256_raw(x + xx, y, h, color); + } + _gfx_w3_video_end(); +} + +void gfx_line256(int x0, int y0, int x1, int y1, uint8_t color) +{ + /* Orthogonal lines route to the accelerator. */ + if (y0 == y1) { + int x = x0 <= x1 ? x0 : x1; + int w = (x0 <= x1 ? x1 - x0 : x0 - x1) + 1; + gfx_hline256(x, y0, w, color); + return; + } + if (x0 == x1) { + int y = y0 <= y1 ? y0 : y1; + int h = (y0 <= y1 ? y1 - y0 : y0 - y1) + 1; + gfx_vline256(x0, y, h, color); + return; + } + + /* Bresenham — single W3-setup around the whole loop. */ + int dx = x1 - x0; int sx = dx < 0 ? -1 : 1; if (dx < 0) dx = -dx; + int dy = y1 - y0; int sy = dy < 0 ? -1 : 1; if (dy < 0) dy = -dy; + int err = (dx > dy ? dx : -dy) / 2; + int x = x0, y = y0; + _gfx_w3_video_begin(); + for (;;) { + _gfx_putpixel256_raw(x, y, color); + if (x == x1 && y == y1) break; + int e2 = err; + if (e2 > -dx) { err -= dy; x += sx; } + if (e2 < dy) { err += dx; y += sy; } + } + _gfx_w3_video_end(); +} diff --git a/libc/gfx/gfx_core.c b/libc/gfx/gfx_core.c new file mode 100644 index 0000000..7df4123 --- /dev/null +++ b/libc/gfx/gfx_core.c @@ -0,0 +1,178 @@ +/* + * gfx_core.c — Sprinter graphics: common state + setup/teardown API. + * + * This module owns the variables that select which graphics page is + * visible vs drawn into, which W3 bank is mapped during gfx writes, + * and the row-base CPU address. All mode-specific primitives (256- + * color in gfx_raw_256.c / gfx_256.c, 16-color in gfx_raw_16.c / + * gfx_16.c, text in gfx_text_*.c) read this state via extern. + * + * Public API: + * gfx_init / gfx_done — switch video mode, restore previous + * gfx_set_visible_page / get — ESTEX $54 SELPAGE wrapper + cached value + * gfx_set_draw_page / get — updates _gfx_addr_base for the new page + * gfx_set_bank / get — sets the W3 page byte (0x50..0x5F) + * gfx_wait_vsync — EI; HALT until next frame interrupt + * gfx_pal_load / gfx_pal_set — BIOS $A4 PIC_SET_PAL wrappers + * + * Shared state (extern from this file): + * _gfx_addr_base — 0xC000 for page 0, 0xC140 for page 1. Every + * mode-specific primitive uses this instead of a + * hard-coded 0xC000 so the same code targets the + * currently-selected draw page. + * _gfx_bank — read by _gfx_w3_video_begin in gfx_raw_common.c + * to map the right W3 page. + */ + +#include +#include + +/* From conio's videomode_raw.c — bypasses set_videotextmode's text-only + * validation so gfx_init can move INTO graphics modes. */ +extern uint8_t _videomode_raw_get(void); +extern int _videomode_raw_set(uint8_t mode); + +/* ---- Shared graphics state --------------------------------------- */ + +/* Cached values of the SELPAGE state. Page numbers are 0 or 1. */ +static uint8_t _gfx_visible_page = 0; +static uint8_t _gfx_draw_page = 0; + +/* The W3 page byte (0x50..0x5F) — see memory/sprinter_vram_transparency.md + * for the bit-meanings (0x50 normal, 0x54 temp, 0x58 transparent, 0x5C + * both). Read by _gfx_w3_video_begin in gfx_raw_common.c. */ +uint8_t _gfx_bank = 0x50; + +/* CPU address of column 0 in the current draw page. Each VRAM row is + * 1024 bytes wide — page 0 occupies bytes 0..319 (CPU 0xC000+), page 1 + * occupies 320..639 (CPU 0xC140+), and the remaining 384 bytes hold + * mode descriptors / palette data we don't touch. Updated by + * gfx_set_draw_page; read by every primitive's raw helper. */ +uint16_t _gfx_addr_base = 0xC000; + +/* ---- gfx_init / gfx_done ----------------------------------------- */ + +uint8_t gfx_init(uint8_t mode, uint8_t page) +{ + uint8_t prev = _videomode_raw_get(); + _videomode_raw_set(mode); + _gfx_bank = 0x50; + gfx_set_visible_page(page); + gfx_set_draw_page(page); + return prev; +} + +void gfx_done(uint8_t mode) +{ + _videomode_raw_set(mode); +} + +/* ---- Visible page (ESTEX $54 SELPAGE) ---------------------------- * + * + * Direct OUT to port 0xC9 bit 0 toggles the "screen mode page" register + * but doesn't notify DSS's display bookkeeping, leaving the screen in + * an inconsistent state (one of the swaps shows as black). Going + * through the syscall keeps DSS happy. + */ +void gfx_set_visible_page(uint8_t page) +{ + _gfx_visible_page = page & 1; + __asm + push ix + ld a, (__gfx_visible_page) + ld b, a ; B = page 0/1 + ld c, #0x54 ; ESTEX SELPAGE + rst #0x10 + pop ix + __endasm; +} + +uint8_t gfx_get_visible_page(void) +{ + return _gfx_visible_page; +} + +/* ---- Draw page --------------------------------------------------- */ + +void gfx_set_draw_page(uint8_t page) +{ + _gfx_draw_page = page & 1; + /* Direct constants beat (0xC000 + (cond ? 0x140 : 0)) by 3 Z80 + * instructions — SDCC doesn't fold the constant addition. */ + _gfx_addr_base = _gfx_draw_page ? 0xC140 : 0xC000; +} + +uint8_t gfx_get_draw_page(void) +{ + return _gfx_draw_page; +} + +/* ---- W3 bank (0x50..0x5F) ---------------------------------------- */ + +void gfx_set_bank(uint8_t bank) +{ + _gfx_bank = bank; +} + +uint8_t gfx_get_bank(void) +{ + return _gfx_bank; +} + +/* ---- Frame sync -------------------------------------------------- * + * + * Block until the next IM2 frame interrupt (50 Hz, programmed by DSS + * for keyboard / cursor maintenance). The Z80's HALT instruction + * sleeps the CPU until the next IRQ, which DSS handles and returns + * to the instruction after HALT — that's the start of the vertical + * retrace window, ideal for a tear-free page swap. + */ +void gfx_wait_vsync(void) __naked +{ + __asm + ei + halt + ret + __endasm; +} + +/* ---- Palette (BIOS $A4 PIC_SET_PAL) ----------------------------- */ + +static uint8_t pal_num_; +static uint8_t pal_start_; +static uint8_t pal_count_; +static uint16_t pal_data_; + +void gfx_pal_load(uint8_t pal_num, uint8_t start, uint8_t count, + const uint8_t *data) +{ + pal_num_ = pal_num; + pal_start_ = start; + pal_count_ = count; + pal_data_ = (uint16_t)(uintptr_t)data; + + __asm + push ix + ld a, (_pal_start_) + ld e, a ; E = start + ld a, (_pal_count_) + ld d, a ; D = count (0 → 256) + ld hl, (_pal_data_) ; HL = data + ld b, #0xFF ; mask + ld a, (_pal_num_) ; A = palette number + ld c, #0xA4 ; BIOS PIC_SET_PAL + rst #0x08 + pop ix + __endasm; +} + +void gfx_pal_set(uint8_t pal_num, uint8_t idx, + uint8_t r, uint8_t g, uint8_t b) +{ + uint8_t entry[4]; + entry[0] = b; + entry[1] = g; + entry[2] = r; + entry[3] = 0; + gfx_pal_load(pal_num, idx, 1, entry); +} diff --git a/libc/gfx/gfx_font.c b/libc/gfx/gfx_font.c new file mode 100644 index 0000000..88e28dc --- /dev/null +++ b/libc/gfx/gfx_font.c @@ -0,0 +1,63 @@ +/* + * gfx_font.c — bitmap-font management shared by the 256- and 16-colour + * text renderers. + * + * Format (ZX-Spectrum-compatible): 256 glyphs × 8 rows × 1 byte = 2 KB, + * INTERLEAVED row-major — + * offset = row * 256 + char_code + * so row 0 of every glyph occupies bytes 0x000..0x0FF, row 1 occupies + * 0x100..0x1FF, etc. Each row byte is MSB-first (bit 7 = leftmost px). + * + * The default source is BIOS WIN_GET_ZG (fn 0xB8) — the active system + * character generator. Programs may override with gfx_set_font(). + * + * Lazy initialisation: gfx_text_256.c / gfx_text_16.c call _gfx_font_ensure + * on first use so a pure-graphics program doesn't pay the BIOS call. + * + * The font pointer and the buffer are exported to the two text renderers + * via _gfx_font_ptr (extern), which always points at valid data once + * _gfx_font_ensure has been called. + */ + +#include +#include + +#define FONT_BYTES 2048 + +static uint8_t _gfx_font_buf[FONT_BYTES]; +const uint8_t *_gfx_font_ptr = _gfx_font_buf; +static uint8_t _gfx_font_loaded = 0; + +/* BIOS WIN_GET_ZG (0xB8): DE = destination, returns 2 KB. */ +static void bios_get_zg(uint8_t *dest) __naked +{ + (void)dest; + __asm + push ix ; BIOS clobbers IX + ex de, hl ; DE = dest (HL was arg) + xor a ; font 0 (default) + ld c, #0xB8 + rst #0x08 + pop ix + ret + __endasm; +} + +void gfx_load_default_font(void) +{ + bios_get_zg(_gfx_font_buf); + _gfx_font_ptr = _gfx_font_buf; + _gfx_font_loaded = 1; +} + +void gfx_set_font(const uint8_t *font) +{ + _gfx_font_ptr = font; + _gfx_font_loaded = 1; +} + +/* Called from text renderers — loads the default font on first use. */ +void _gfx_font_ensure(void) +{ + if (!_gfx_font_loaded) gfx_load_default_font(); +} diff --git a/libc/gfx/gfx_raw_16.c b/libc/gfx/gfx_raw_16.c new file mode 100644 index 0000000..3b34763 --- /dev/null +++ b/libc/gfx/gfx_raw_16.c @@ -0,0 +1,186 @@ +/* + * gfx_raw_16.c — 16-colour (mode 0x82) raw primitives. + * + * Pixel format (verified empirically 2026-05-31): each byte at + * 0xC000+xb holds two horizontal pixels — + * high nibble (bits 7-4) = pixel at x = 2*xb (LEFT, even) + * low nibble (bits 3-0) = pixel at x = 2*xb + 1 (RIGHT, odd) + * + * Row addressing matches mode 0x81: Port_Y (0x89) = y, 320 bytes/row, + * 320 × 2 = 640 pixels. + * + * Accelerator: byte-wise — one Fill burst paints up to 256 bytes = + * 512 pixels. For a solid colour the byte value is the nibble in + * both halves: b = c | (c<<4). + * + * RMW pattern for unaligned edges & vertical lines: + * read byte at (HL); mask out target nibble; OR in new nibble; write. + * ~10 instructions per pixel — slow but unavoidable since a byte + * spans two horizontal pixels. + * + * "Raw" = W3-naive: caller wraps a sequence with one + * _gfx_w3_video_begin / _gfx_w3_video_end pair. + */ + +#include +#include + +extern uint16_t _gfx_addr_base; + +/* ---- Scratch shared across asm helpers ---------------------------- */ +static uint8_t g16_y; +static uint8_t g16_byte; /* combined byte: nibble | (nibble<<4) */ +static uint8_t g16_nibble; /* color in correct half (low or high) */ +static uint8_t g16_mask; /* mask preserving the OTHER half */ +static uint8_t g16_len; /* accel block size (0 = 256) */ +static uint16_t g16_addr; + +/* ---- Accel horizontal Fill burst ---------------------------------- * + * + * Caller has W3 mapped and DI active. Only the block-size byte uses + * SMC. Colour is preloaded into C and shipped via `ld a, c` (0x79). + * Inserting another `ld a, #n` between LD C,C and the firing LD (HL),A + * breaks the burst — the accel FSM re-reads the immediate as a fresh + * block size. + */ +static void g16_hfill_chunk(void) __naked +{ + __asm + ld a, (_g16_len) + ld (_g16_h_len_imm), a + + ld a, (_g16_byte) + ld c, a + + ld a, (_g16_y) + out (#0x89), a + + ld hl, (_g16_addr) + + ld d, d ; 0x52 — set block size + ld a, #0 ; 0x3E nn — length (patched) + _g16_h_len_imm = . - 1 + ld c, c ; 0x49 — horizontal Fill + ld a, c ; 0x79 — A = colour byte + ld (hl), a ; fires accel + ld b, b ; 0x40 — disable + ret + __endasm; +} + +/* ---- RMW one nibble at (g16_addr, g16_y) ------------------------- */ +static void g16_rmw_pixel(void) __naked +{ + __asm + ld a, (_g16_y) + out (#0x89), a + + ld hl, (_g16_addr) + ld a, (_g16_mask) + ld b, a ; B = preserve mask + ld a, (_g16_nibble) + ld c, a ; C = new nibble (in correct half) + ld a, (hl) + and a, b ; clear target nibble + or a, c ; OR in new + ld (hl), a + ret + __endasm; +} + +/* ---- Raw primitives (W3-naive, composable) ----------------------- */ + +void _gfx_putpixel16_raw(int x, int y, uint8_t color) +{ + if ((unsigned)x >= GFX_WIDTH_16 || (unsigned)y >= GFX_HEIGHT_16) return; + g16_y = (uint8_t)y; + g16_addr = (uint16_t)(_gfx_addr_base + ((unsigned)x >> 1)); + if (x & 1) { + g16_nibble = (uint8_t)(color & 0x0F); + g16_mask = 0xF0; + } else { + g16_nibble = (uint8_t)((color & 0x0F) << 4); + g16_mask = 0x0F; + } + g16_rmw_pixel(); +} + +void _gfx_hline16_raw(int x, int y, int len, uint8_t color) +{ + if ((unsigned)y >= GFX_HEIGHT_16) return; + if (x < 0) { len += x; x = 0; } + if (x >= GFX_WIDTH_16) return; + if (x + len > GFX_WIDTH_16) len = GFX_WIDTH_16 - x; + if (len <= 0) return; + + g16_y = (uint8_t)y; + uint8_t cnib = color & 0x0F; + g16_byte = (uint8_t)(cnib | (cnib << 4)); + + /* Leading unaligned pixel: x odd → RIGHT half of left-most byte. */ + if (x & 1) { + g16_addr = (uint16_t)(_gfx_addr_base + ((unsigned)x >> 1)); + g16_nibble = cnib; + g16_mask = 0xF0; + g16_rmw_pixel(); + x++; + len--; + if (len <= 0) return; + } + + /* Even x; emit (len/2) full bytes via accel hfill. */ + int full = len >> 1; + g16_addr = (uint16_t)(_gfx_addr_base + ((unsigned)x >> 1)); + while (full > 0) { + int chunk = full > 256 ? 256 : full; + g16_len = (chunk == 256) ? 0 : (uint8_t)chunk; + g16_hfill_chunk(); + full -= chunk; + g16_addr += chunk; + } + + /* Trailing odd-length pixel: LEFT half of the next byte. */ + if (len & 1) { + g16_nibble = (uint8_t)(cnib << 4); + g16_mask = 0x0F; + g16_rmw_pixel(); + } +} + +void _gfx_vline16_raw(int x, int y, int len, uint8_t color) +{ + if ((unsigned)x >= GFX_WIDTH_16) return; + if (y < 0) { len += y; y = 0; } + if (y >= GFX_HEIGHT_16) return; + if (y + len > GFX_HEIGHT_16) len = GFX_HEIGHT_16 - y; + if (len <= 0) return; + + g16_addr = (uint16_t)(_gfx_addr_base + ((unsigned)x >> 1)); + if (x & 1) { + g16_nibble = (uint8_t)(color & 0x0F); + g16_mask = 0xF0; + } else { + g16_nibble = (uint8_t)((color & 0x0F) << 4); + g16_mask = 0x0F; + } + for (int i = 0; i < len; i++) { + g16_y = (uint8_t)(y + i); + g16_rmw_pixel(); + } +} + +/* Clear the whole 640×256 area with `color`. Row-major hfill — + * 256 rows × 2 bursts each (256+64 bytes). */ +void _gfx_clear16_raw(uint8_t color) +{ + g16_byte = (uint8_t)((color & 0x0F) | ((color & 0x0F) << 4)); + for (int y = 0; y < GFX_HEIGHT_16; y++) { + g16_y = (uint8_t)y; + g16_addr = _gfx_addr_base; + g16_len = 0; + g16_hfill_chunk(); + g16_addr = (uint16_t)(_gfx_addr_base + 0x100); + g16_len = 64; + g16_hfill_chunk(); + } +} diff --git a/libc/gfx/gfx_raw_256.c b/libc/gfx/gfx_raw_256.c new file mode 100644 index 0000000..2bdff0c --- /dev/null +++ b/libc/gfx/gfx_raw_256.c @@ -0,0 +1,175 @@ +/* + * gfx_raw_256.c — 256-colour (mode 0x81) raw primitives. + * + * "Raw" = W3-naive: caller must have W3 mapped to the video bank and + * interrupts disabled (typically via _gfx_w3_video_begin/end from + * gfx_raw_common.c). Composite primitives in gfx_256.c wrap one + * begin/end around many raw calls so the W3 dance is amortised across + * the whole drawing operation. + * + * Addressing (mode 0x81): pixel (x, y) lives at CPU 0xC000 + x with + * Port_Y (0x89) = y. _gfx_addr_base is 0xC000 for draw page 0 and + * 0xC140 for draw page 1 — see gfx_core.c. + * + * Accelerator opcodes (docs/converted/accel_r.txt): + * LD D,D (0x52) enter "set block size" mode; the NEXT byte is the + * length operand and MUST follow LD A immediate (0x3E). + * LD C,C (0x49) horizontal Fill mode (LD (HL),A fills n bytes) + * LD E,E (0x5B) vertical Fill mode (auto-increments Port_Y) + * LD B,B (0x40) disable accelerator + * + * The block-length byte uses SMC — we patch the immediate at runtime, + * then run the accel sequence. HOME is RAM after DSS loads us, so + * SMC inside our own .EXE is safe. + */ + +#include +#include + +extern uint16_t _gfx_addr_base; + +/* ---- Scratch shared across asm helpers --------------------------- * + * Single-threaded — no reentrancy. GFX runs with interrupts off + * between _gfx_w3_video_begin and _gfx_w3_video_end. */ +static uint8_t acc_color; +static uint8_t acc_y; +static uint8_t acc_len; /* 0 means 256 — the accel convention */ +static uint16_t acc_addr; + +/* Putpixel scratch — separate from acc_* so a putpixel inside a + * Bresenham loop doesn't trample on outer accel state. */ +static uint8_t _gfx_pp_y; +static uint16_t _gfx_pp_addr; +static uint8_t _gfx_pp_color; + +/* ---- inner accel bursts ------------------------------------------ * + * + * Pre: W3 mapped to the video bank, DI active. Caller wraps a sequence + * of bursts in a single begin/end pair. */ + +/* Horizontal fill: acc_len bytes at acc_addr on row acc_y. */ +static void hfill_chunk(void) __naked +{ + __asm + ;; Patch the LD A,#n immediate (operand byte) with acc_len. + ld a, (_acc_len) + ld (_hfill_len_imm), a + + ld a, (_acc_y) + out (#0x89), a ; Port_Y = y + + ;; Pre-load colour into C and dest into HL before arming accel. + ld a, (_acc_color) + ld c, a + ld hl, (_acc_addr) + + ;; --- ACCEL SEQUENCE --- + ld d, d ; 0x52 — set block size mode + ld a, #0 ; 0x3E nn — block size (nn patched above) + _hfill_len_imm = . - 1 + ld c, c ; 0x49 — horizontal Fill + ld a, c ; 0x79 — A = colour (NOT another ld a,#n) + ld (hl), a ; fires accel; fills acc_len bytes + ld b, b ; 0x40 — disable + ret + __endasm; +} + +/* Vertical fill: acc_len pixels at column acc_addr, top row acc_y. + * The accel auto-increments Port_Y as it paints down the column. */ +static void vfill_chunk(void) __naked +{ + __asm + ld a, (_acc_len) + ld (_vfill_len_imm), a + + ld a, (_acc_y) + out (#0x89), a ; starting Y + + ld a, (_acc_color) + ld c, a + ld hl, (_acc_addr) + + ld d, d ; 0x52 — set block size + ld a, #0 ; immediate length (patched) + _vfill_len_imm = . - 1 + ld e, e ; 0x5B — vertical Fill + ld a, c ; A = colour + ld (hl), a ; fires accel + ld b, b ; 0x40 — disable + ret + __endasm; +} + +/* ---- Raw primitives (W3-naive, composable) ----------------------- * + * + * These do NO DI/W3 setup — caller wraps a sequence with one + * _gfx_w3_video_begin / _gfx_w3_video_end pair. */ + +void _gfx_putpixel256_raw(int x, int y, uint8_t color) +{ + if ((unsigned)x >= GFX_WIDTH || (unsigned)y >= GFX_HEIGHT) return; + _gfx_pp_y = (uint8_t)y; + _gfx_pp_addr = (uint16_t)(_gfx_addr_base + (unsigned)x); + _gfx_pp_color = color; + __asm + ld a, (__gfx_pp_y) + out (#0x89), a + ld hl, (__gfx_pp_addr) + ld a, (__gfx_pp_color) + ld (hl), a + __endasm; +} + +void _gfx_hline256_raw(int x, int y, int len, uint8_t color) +{ + if ((unsigned)y >= GFX_HEIGHT) return; + if (x < 0) { len += x; x = 0; } + if (x >= GFX_WIDTH) return; + if (x + len > GFX_WIDTH) len = GFX_WIDTH - x; + if (len <= 0) return; + + acc_color = color; + acc_y = (uint8_t)y; + acc_addr = (uint16_t)(_gfx_addr_base + (unsigned)x); + + while (len > 0) { + int chunk = len > 256 ? 256 : len; + acc_len = (chunk == 256) ? 0 : (uint8_t)chunk; + hfill_chunk(); + len -= chunk; + acc_addr += chunk; + } +} + +void _gfx_vline256_raw(int x, int y, int len, uint8_t color) +{ + if ((unsigned)x >= GFX_WIDTH) return; + if (y < 0) { len += y; y = 0; } + if (y >= GFX_HEIGHT) return; + if (y + len > GFX_HEIGHT) len = GFX_HEIGHT - y; + if (len <= 0) return; + + /* GFX_HEIGHT = 256 so a full column is a single accel burst. */ + acc_color = color; + acc_y = (uint8_t)y; + acc_addr = (uint16_t)(_gfx_addr_base + (unsigned)x); + acc_len = (len == 256) ? 0 : (uint8_t)len; + vfill_chunk(); +} + +/* Clear the whole 320×256 area with `color`. Row-major hfill: + * 256 rows × 2 bursts each (256-byte + 64-byte) = 512 bursts. */ +void _gfx_clear256_raw(uint8_t color) +{ + acc_color = color; + for (int y = 0; y < GFX_HEIGHT; y++) { + acc_y = (uint8_t)y; + acc_addr = _gfx_addr_base; /* 256-byte burst */ + acc_len = 0; + hfill_chunk(); + acc_addr = (uint16_t)(_gfx_addr_base + 256); /* 64-byte burst */ + acc_len = 64; + hfill_chunk(); + } +} diff --git a/libc/gfx/gfx_raw_common.c b/libc/gfx/gfx_raw_common.c new file mode 100644 index 0000000..2e860e7 --- /dev/null +++ b/libc/gfx/gfx_raw_common.c @@ -0,0 +1,44 @@ +/* + * gfx_raw_common.c — W3 page mapping primitives shared by every gfx mode. + * + * Composite primitives (gfx_line / gfx_rect / gfx_fill_rect / ...) bracket + * their inner loop with one `_gfx_w3_video_begin()` / `_gfx_w3_video_end()` + * pair and call the `*_raw` variants inside, so the W3 dance is paid once + * per drawing operation instead of once per pixel. Single-shot wrappers + * (gfx_putpixel, gfx_hline, ...) wrap the same way for their single call. + * + * Begin disables interrupts, saves the current W3 page byte, then maps + * `_gfx_bank` (the current video bank, 0x50..0x5F). End restores the + * saved page and re-enables interrupts. + * + * NOT re-entrant — saving the previous W3 byte in a static is safe only + * because GFX runs with interrupts off between begin and end. + */ + +#include + +extern uint8_t _gfx_bank; /* current W3 video bank (gfx_core.c) */ + +static uint8_t _gfx_saved_w3; + +void _gfx_w3_video_begin(void) __naked +{ + __asm + di + in a, (#0xE2) + ld (__gfx_saved_w3), a + ld a, (__gfx_bank) + out (#0xE2), a + ret + __endasm; +} + +void _gfx_w3_video_end(void) __naked +{ + __asm + ld a, (__gfx_saved_w3) + out (#0xE2), a + ei + ret + __endasm; +} diff --git a/libc/gfx/gfx_text_16.c b/libc/gfx/gfx_text_16.c new file mode 100644 index 0000000..38ade86 --- /dev/null +++ b/libc/gfx/gfx_text_16.c @@ -0,0 +1,124 @@ +/* + * gfx_text_16.c — bitmap-font text rendering for mode 0x82 + * (640×256×16, 4 bits per pixel). + * + * Per glyph row (8 pixels): emit 4 bytes — each byte packs two + * adjacent pixels as (LEFT<<4) | RIGHT. A precomputed 4-entry pair + * table maps the 2-bit source pattern (LEFT*2 + RIGHT) directly to + * the output byte, avoiding per-pixel mask/OR. + * + * Currently requires byte-aligned x (x must be even); odd x is + * silently ignored. Text grids are typically aligned. + */ + +#include +#include + +extern uint16_t _gfx_addr_base; +extern const uint8_t *_gfx_font_ptr; +extern void _gfx_font_ensure(void); + +static uint8_t txt_y; +static uint8_t txt_row; +static uint16_t txt_addr; + +/* 4-byte lookup: index = LEFT*2 + RIGHT, value = (LEFT<<4)|RIGHT. */ +static uint8_t txt_pair[4]; + +/* Render one 8-pixel row using the pair table — 4 byte writes. */ +static void render_row_16(void) __naked +{ + __asm + di + in a, (#0xE2) + push af + ld a, #0x50 + out (#0xE2), a + ld a, (_txt_y) + out (#0x89), a + + ld hl, (_txt_addr) + ld a, (_txt_row) + ld c, a ; C = rotating source bits + ld b, #4 ; 4 output bytes + rr16_loop: + ;; Extract two top bits of C as index A = LEFT*2 + RIGHT. + sla c ; CY = LEFT bit; C <<= 1 + ld a, #0 + adc a, a ; A = LEFT + sla c ; CY = RIGHT bit; C <<= 1 + adc a, a ; A = LEFT*2 + RIGHT (0..3) + + ;; A = txt_pair[A]; preserve HL across the lookup. + push hl + ld e, a + ld d, #0 + ld hl, #_txt_pair + add hl, de + ld a, (hl) + pop hl + + ld (hl), a + inc hl + djnz rr16_loop + + pop af + out (#0xE2), a + ei + ret + __endasm; +} + +static void build_pair_table(uint8_t fg, uint8_t bg) +{ + uint8_t f = fg & 0x0F; + uint8_t b = bg & 0x0F; + /* HIGH nibble = LEFT, LOW nibble = RIGHT (sprinter_graphics convention). */ + txt_pair[0] = (uint8_t)((b << 4) | b); /* 00 BG BG */ + txt_pair[1] = (uint8_t)((b << 4) | f); /* 01 BG FG */ + txt_pair[2] = (uint8_t)((f << 4) | b); /* 10 FG BG */ + txt_pair[3] = (uint8_t)((f << 4) | f); /* 11 FG FG */ +} + +void gfx_putchar16(int x, int y, char c, uint8_t fg, uint8_t bg) +{ + _gfx_font_ensure(); + if ((unsigned)x >= GFX_WIDTH_16 || (unsigned)y >= GFX_HEIGHT_16) return; + if (x & 1) return; + + build_pair_table(fg, bg); + uint8_t cc = (uint8_t)c; + uint16_t base = (uint16_t)(_gfx_addr_base + ((unsigned)x >> 1)); + + for (int r = 0; r < 8; r++) { + int yy = y + r; + if ((unsigned)yy >= GFX_HEIGHT_16) break; + txt_y = (uint8_t)yy; + txt_addr = base; + txt_row = _gfx_font_ptr[r * 256 + cc]; + render_row_16(); + } +} + +void gfx_text16(int x, int y, const char *s, uint8_t fg, uint8_t bg) +{ + /* Build pair table once for the whole string (FG/BG don't change). */ + _gfx_font_ensure(); + if (x & 1) return; + build_pair_table(fg, bg); + for (; *s; s++) { + if (x >= GFX_WIDTH_16) break; + if ((unsigned)y >= GFX_HEIGHT_16) break; + uint8_t cc = (uint8_t)*s; + uint16_t base = (uint16_t)(_gfx_addr_base + ((unsigned)x >> 1)); + for (int r = 0; r < 8; r++) { + int yy = y + r; + if ((unsigned)yy >= GFX_HEIGHT_16) break; + txt_y = (uint8_t)yy; + txt_addr = base; + txt_row = _gfx_font_ptr[r * 256 + cc]; + render_row_16(); + } + x += 8; + } +} diff --git a/libc/gfx/gfx_text_256.c b/libc/gfx/gfx_text_256.c new file mode 100644 index 0000000..e08026b --- /dev/null +++ b/libc/gfx/gfx_text_256.c @@ -0,0 +1,90 @@ +/* + * gfx_text_256.c — bitmap-font text rendering for mode 0x81 + * (320×256×256, one byte per pixel). + * + * Per glyph row (8 pixels): emit 8 bytes — FG where the source bit is + * 1, BG where 0. Port_Y is set once per row; the row writer wraps its + * own DI / W3 save+restore so callers don't need to. + */ + +#include +#include + +extern uint16_t _gfx_addr_base; +extern const uint8_t *_gfx_font_ptr; +extern void _gfx_font_ensure(void); + +/* ---- Scratch shared with the asm row writer ---------------------- */ +static uint8_t txt_y; +static uint8_t txt_row; /* current glyph-row bit pattern */ +static uint8_t txt_fg; +static uint8_t txt_bg; +static uint16_t txt_addr; /* VRAM address for this row */ + +/* Render one 8-pixel row. Self-contained DI / W3 save+restore so a + * gfx_text() can be called from any context without extra ceremony. */ +static void render_row_256(void) __naked +{ + __asm + di + in a, (#0xE2) + push af + ld a, #0x50 + out (#0xE2), a + ld a, (_txt_y) + out (#0x89), a + + ld hl, (_txt_addr) + ld a, (_txt_fg) + ld d, a + ld a, (_txt_bg) + ld e, a + ld a, (_txt_row) + ld b, #8 ; 8 pixels in this row + rr256_loop: + rla ; CY = MSB, A <<= 1 + jr nc, rr256_bg + ld (hl), d ; FG + jr rr256_next + rr256_bg: + ld (hl), e ; BG + rr256_next: + inc hl + djnz rr256_loop + + pop af + out (#0xE2), a + ei + ret + __endasm; +} + +void gfx_putchar256(int x, int y, char c, uint8_t fg, uint8_t bg) +{ + _gfx_font_ensure(); + if ((unsigned)x >= GFX_WIDTH || (unsigned)y >= GFX_HEIGHT) return; + + txt_fg = fg; + txt_bg = bg; + uint8_t cc = (uint8_t)c; + uint16_t base = (uint16_t)(_gfx_addr_base + (unsigned)x); + + for (int r = 0; r < 8; r++) { + int yy = y + r; + if ((unsigned)yy >= GFX_HEIGHT) break; + txt_y = (uint8_t)yy; + txt_addr = base; + /* Interleaved layout: row r of char cc lives at font[r*256 + cc]. */ + txt_row = _gfx_font_ptr[r * 256 + cc]; + render_row_256(); + } +} + +void gfx_text256(int x, int y, const char *s, uint8_t fg, uint8_t bg) +{ + for (; *s; s++) { + if (x >= GFX_WIDTH) break; + gfx_putchar256(x, y, *s, fg, bg); + x += 8; + } +} diff --git a/libc/include/conio.h b/libc/include/conio.h new file mode 100644 index 0000000..7b90ce5 --- /dev/null +++ b/libc/include/conio.h @@ -0,0 +1,154 @@ +/* + * conio.h — direct console I/O backed by ESTEX functions. + * + * Two-set output API following the Turbo-C convention: + * + * stdio (fast, no attr — system default colour): + * putchar(c) — one char + '\n' → CR LF translation + * puts(s) — string + trailing newline + * printf(...) — uses putchar internally + * + * conio (slower, applies g_text_attr — set via textcolor / textbackground / + * textattr / set_text_attr): + * putch(c) — one char, NO '\n' translation + * cputs(s) — string, NO trailing newline, NO '\n' translation + * (write "\r\n" yourself for line breaks) + * cprintf(...) — printf with attribute, via vsprintf+cputs internally + * + * The conio set short-circuits to the fast path when + * g_text_attr == KEEP_EXIST_ATTR — useful for "I usually want a + * specific colour but right now don't care". + * + * Other helpers (unchanged): + * kbhit / getch / getche — keyboard + * clrscr / clrscr_attr — clear screen + * gotoxy / wherex / wherey + * wrchar / rdchar — direct VRAM cell access + * get_videotextmode / set_videotextmode (text modes only — see gfx.h + * for graphics mode constants) + * + * Coordinates are 0-based to match ESTEX directly. + */ + +#ifndef CONIO_H +#define CONIO_H + +#include + +char kbhit (void); +char getch (void); +char getche(void); +char putch (char c); +char cputs (const char *s); +int cprintf(const char *fmt, ...); +void clrscr(void); +void gotoxy(uint8_t x, uint8_t y); + +/* Solid-C compatibility helpers. */ +#define home() gotoxy(0, 0) +#define inp(port) z80_inp(port) +#define outp(p, v) z80_outp((p), (v)) +#define enable() __asm__("ei") +#define disable() __asm__("di") +uint8_t z80_inp(uint8_t port); +void z80_outp(uint8_t port, uint8_t value); + +/* Read a line from the console (no echo control — uses getche). + * `buf[0]` must be the max length; on return `buf[1]` is the actual + * length and `buf[2..]` is the NUL-terminated string. */ +char *cgets(char *buf); + +/* Cursor query via ESTEX $53 CURSOR. Returns 0-based row/column. */ +uint8_t wherex (void); +uint8_t wherey (void); +uint16_t wherexy(void); // high byte = Y, low byte = X coords. + +/* Direct character/attribute screen access (ESTEX $57 / $58). + * wrchar — write char + attribute at (x, y); does NOT advance the cursor + * and does NOT interpret control characters. Useful for + * coloured text and for painting the last-column-last-row cell + * without triggering ESTEX's auto-scroll on PCHARS/PUTCHAR. + * rdchar — read both character and attribute back; returned as + * (attr<<8 | ch). */ +void wrchar(uint8_t x, uint8_t y, char ch, uint8_t attr); +uint16_t rdchar(uint8_t x, uint8_t y); + +/* clrscr_attr — wipe the entire 80x32 screen using the given attribute + * byte (fill character = space). Companion to clrscr() which uses the + * default attr 0x0F (bright white on black). */ +void clrscr_attr(uint8_t attr); + +/* Text video-mode control (ESTEX $50 / $51). These constants and helpers + * cover ONLY text modes; graphics modes live in as GFX_MODE_*. + * `set_videotextmode()` validates that the argument is a known text mode + * (so calling code that includes conio.h alone cannot accidentally switch + * the screen into graphics — that requires ). */ +#define TEXT_MODE_40x32 0x02 +#define TEXT_MODE_80x32 0x03 + +uint8_t get_videotextmode(void); +int set_videotextmode(uint8_t mode); /* 0 OK, -1 + errno on bad mode */ + +/* ------------------------------------------------------------------ * + * Text-output attribute (used by the conio set: putch / cputs / cprintf). + * + * textcolor(c) — set foreground (preserves background+blink) + * textbackground(c) — set background (preserves foreground+blink) + * textattr(a) — replace the whole attribute byte + * set_text_attr(a) — alias to textattr but returns the previous value + * get_text_attr() — read current attribute + * + * Range 0x00..0xFF is a real attribute byte; KEEP_EXIST_ATTR (0xFFFF) + * means "don't touch attributes — fall through to the fast no-attr path" + * (so putch becomes equivalent to putchar etc.). + * + * Default at startup = 0x0F (bright white on black). + * + * NOTE: stdio's putchar / puts / printf IGNORE this — they always use + * whatever ESTEX has cached for the cursor cell. Use the conio set + * (putch / cputs / cprintf) for coloured output. + * ------------------------------------------------------------------ */ +#define KEEP_EXIST_ATTR 0xFFFF + +void textcolor(uint8_t fg); +void textbackground(uint8_t bg); +void textattr(uint8_t attr); + +int16_t set_text_attr(int16_t attr); /* returns the previous value */ +int16_t get_text_attr(void); + +/* Control how putch / cputs / cprintf (the WRCHAR path) treat + * control characters (< 0x20): + * + * mode = 0 (default) — interpret BS/TAB/LF/CR: + * 0x08 BS → pc_col-- (clamped at 0) + * 0x09 TAB → pc_col rounded up to next multiple of 8 (clamped 80) + * 0x0A LF → pc_row++ (clamped at 32; no glyph emitted) + * 0x0D CR → pc_col = 0 + * + * mode = 1 — print EVERY character as a CP437 glyph (no + * interpretation; useful e.g. for drawing box-drawing + * characters that overlap the 0x00..0x1F range). + * + * Only affects the WRCHAR path (attr ≤ 0xFF). When attr is + * KEEP_EXIST_ATTR, ESTEX's own PUTCHAR/PCHARS rule the cursor and + * pc_raw_mode is irrelevant. */ +void set_putch_raw_mode(uint8_t mode); +uint8_t get_putch_raw_mode(void); + +/* Sprinter text-mode 03h attribute byte (verified via attr_probe): + * bits 0..3 = foreground (0..15) + * bits 4..6 = background (0..7) + * bit 7 = blink (toggles fg between fg-colour and bg-colour) + * Colour order is standard CGA / Borland-conio.h. Constants 0..7 are + * usable for both fg and bg; 8..15 are foreground-only. */ +enum { + COLOR_BLACK = 0, COLOR_BLUE, COLOR_GREEN, COLOR_CYAN, + COLOR_RED, COLOR_MAGENTA, COLOR_BROWN, COLOR_LIGHTGRAY, + COLOR_DARKGRAY, COLOR_LIGHTBLUE, COLOR_LIGHTGREEN, COLOR_LIGHTCYAN, + COLOR_LIGHTRED, COLOR_LIGHTMAGENTA, COLOR_YELLOW, COLOR_WHITE +}; +#define COLOR_BLINK 0x80u +#define COLOR(fg, bg) ((uint8_t)((((bg) & 0x07) << 4) | ((fg) & 0x0F))) + +#endif diff --git a/libc/include/dir.h b/libc/include/dir.h new file mode 100644 index 0000000..30603b1 --- /dev/null +++ b/libc/include/dir.h @@ -0,0 +1,51 @@ +/* + * dir.h — directory iteration via ESTEX F_FIRST / F_NEXT ($19 / $1A). + * + * ffirst(pattern, &buf, attrib) + * Initialises the search. The pattern is a DOS wildcard like + * `*.TXT` or `DATA\\*`. attrib is the search mask (use FA_NORMAL + * to match plain files, OR in FA_DIREC to include subdirectories). + * Returns 0 on success (buf is populated), -1 on failure (errno set). + * + * fnext(&buf) + * Steps to the next matching entry, reusing the same buf. Returns + * 0 on success, -1 when no more files match (errno = ENOENT) or on + * other errors. + * + * The buffer fields below mirror ESTEX's layout exactly so we can hand + * it straight to the kernel. Use `buf.found_name` (NUL-terminated DOS + * "name.ext" form) to display results. + */ + +#ifndef DIR_H +#define DIR_H + +#include + +/* File attribute bits (ESTEX / DOS standard). */ +#define FA_NORMAL 0x00 +#define FA_RDONLY 0x01 +#define FA_HIDDEN 0x02 +#define FA_SYSTEM 0x04 +#define FA_LABEL 0x08 +#define FA_DIREC 0x10 +#define FA_ARCH 0x20 + +/* 256-byte work buffer for ESTEX F_FIRST / F_NEXT (B=1 mode). */ +typedef struct { + char name[8]; /* +0 pattern: 8-byte filename */ + char ext[3]; /* +8 pattern: 3-byte extension */ + uint8_t attrib; /* +11 search attribute */ + char reserved[10]; /* +12 DSS internal state */ + uint16_t time; /* +22 time of last write */ + uint16_t date; /* +24 date of last write */ + uint16_t first_cluster; /* +26 first cluster */ + uint32_t size; /* +28 file size in bytes */ + uint8_t found_attr; /* +32 attribute of the matched file */ + char found_name[223]; /* +33 NUL-terminated "name.ext" */ +} ffblk_t; + +int ffirst(const char *pattern, ffblk_t *buf, uint8_t attrib); +int fnext (ffblk_t *buf); + +#endif diff --git a/libc/include/errno.h b/libc/include/errno.h new file mode 100644 index 0000000..1b5aa56 --- /dev/null +++ b/libc/include/errno.h @@ -0,0 +1,62 @@ +/* + * errno.h — ESTEX error codes + global errno + strerror / perror. + * + * ESTEX functions report errors by setting CF=1 and returning the error + * code in A. Our libc wrappers stash that code into `errno` and return + * -1 (or 0 / NULL where the C type calls for it). + * + * Error numbers match ESTEX (so they round-trip through OS/BIOS calls + * untouched). Where the meaning lines up cleanly with POSIX we also + * expose the POSIX-style name as an alias. + */ + +#ifndef ERRNO_H +#define ERRNO_H + +/* Process-wide error state. Reset to 0 only by user code — libc never + * clears it. */ +extern int errno; + +/* Error numbers — direct ESTEX codes. */ +#define EOK 0 /* No error */ +#define EINVFN 1 /* Invalid function */ +#define ENODRV 2 /* Invalid drive number */ +#define ENOENT 3 /* File not found — POSIX */ +#define ENOPATH 4 /* Path not found */ +#define EBADF 5 /* Invalid handle — POSIX */ +#define EMFILE 6 /* Too many open files — POSIX */ +#define EEXIST 7 /* File already exists — POSIX */ +#define EROFS 8 /* File is read-only — POSIX */ +#define EROOTFULL 9 /* Root directory overflow */ +#define ENOSPC 10 /* No free space — POSIX */ +#define ENOTEMPTY 11 /* Directory not empty — POSIX */ +#define EBUSY 12 /* Can't delete current directory — POSIX-ish */ +#define EMEDIA 13 /* Invalid media */ +#define EUNKOP 14 /* Unknown operation */ +#define EISDIR 15 /* Directory exists — POSIX */ +#define EINAME 16 /* Invalid filename */ +#define EINVEXE 17 /* Invalid EXE file */ +#define ENOEXEC 18 /* Not supported EXE — POSIX */ +#define EACCES 19 /* Permission denied — POSIX */ +#define ENOTREADY 20 /* Device not ready */ +#define ESEEK 21 /* Seek error — POSIX (ESPIPE) */ +#define ENOSECT 22 /* Sector not found */ +#define ECRC 23 /* CRC error */ +#define EWRPROT 24 /* Write protect */ +#define EREAD 25 /* Read error */ +#define EWRITE 26 /* Write error */ +#define EDRVFAIL 27 /* Drive failure */ +#define ENOMEM 30 /* Out of memory — POSIX */ +#define EINVMEM 31 /* Invalid memory block */ +#define EUNKERR 32 /* Unknown error */ + + +/* POSIX aliases for codes ESTEX doesn't have a direct equivalent for. + * Folded onto the closest existing code so error strings stay sane. */ +#define EINVAL EUNKOP /* "Invalid argument" → "Unknown operation" */ + +/* C99 perror / strerror surface. */ +const char *strerror(int err); +void perror (const char *prefix); + +#endif diff --git a/libc/include/fcntl.h b/libc/include/fcntl.h new file mode 100644 index 0000000..cc90860 --- /dev/null +++ b/libc/include/fcntl.h @@ -0,0 +1,31 @@ +/* + * fcntl.h — open / creat for Sprinter ESTEX. + * + * POSIX-style flag bits. The low two bits select access mode (matches + * POSIX numbering — RDONLY=0, WRONLY=1, RDWR=2 — and is translated to + * the ESTEX OPEN $11 convention inside open()). + * + * The other flags map onto ESTEX calls like this: + * O_CREAT + O_EXCL → $0B (CREATE_NEW, fails if exists) + * O_CREAT + O_TRUNC → $0A (CREATE, truncates existing) + * O_CREAT alone → try $11 (OPEN); on ENOENT fall back to $0A + * no O_CREAT → $11 (OPEN, fails if missing) + * O_APPEND → after open, $15 lseek(0, SEEK_END) + */ + +#ifndef FCNTL_H +#define FCNTL_H + +#define O_RDONLY 0 +#define O_WRONLY 1 +#define O_RDWR 2 + +#define O_CREAT 0x040 +#define O_EXCL 0x080 +#define O_TRUNC 0x200 +#define O_APPEND 0x400 + +int open (const char *path, int flags); +int creat(const char *path, int mode); /* mode arg ignored on Sprinter */ + +#endif diff --git a/libc/include/gfx.h b/libc/include/gfx.h new file mode 100644 index 0000000..6485c90 --- /dev/null +++ b/libc/include/gfx.h @@ -0,0 +1,148 @@ +/* + * gfx.h — Sprinter graphics primitives. + * + * Two main modes: + * GFX_MODE_320x256x256 (0x81) — one byte per pixel, palette of 256 + * entries. API functions suffixed _256. + * GFX_MODE_640x256x16 (0x82) — 4 bits per pixel, palette of 16. + * API functions suffixed _16. + * + * Common API (no suffix) covers things that are mode-agnostic: + * gfx_init / gfx_done + * gfx_set_visible_page / gfx_set_draw_page / gfx_set_bank + * gfx_wait_vsync + * gfx_pal_load / gfx_pal_set + * gfx_load_default_font / gfx_set_font + * + * Addressing reminder: + * pixel (x, y) lives at CPU 0xC000 + (x or x/2) with Port_Y (0x89) = y; + * the gfx code maps a 16 KB VRAM page into W3 around every write. + * For double-buffering, page 1 starts 320 bytes later (0xC140). + * + * Palette: BIOS $A4 (RST 8); 4 bytes per entry — B, G, R, pad. + */ + +#ifndef GFX_H +#define GFX_H + +#include + +/* ESTEX SETVMOD codes — same values as the SETVMOD `A` register. */ +#define GFX_MODE_TEXT_40x32 0x02 +#define GFX_MODE_TEXT_80x32 0x03 +#define GFX_MODE_320x256x256 0x81 +#define GFX_MODE_640x256x16 0x82 + +/* Pixel dimensions of mode 0x81 (320×256, 256 colours). */ +#define GFX_WIDTH 320 +#define GFX_HEIGHT 256 + +/* Pixel dimensions of mode 0x82 (640×256, 16 colours). Each byte at + * 0xC000+x_byte holds two pixels: high nibble = LEFT (even-x), low + * nibble = RIGHT (odd-x) — see memory/sprinter_graphics.md. */ +#define GFX_WIDTH_16 640 +#define GFX_HEIGHT_16 256 +#define GFX_COLORS_16 16 + +/* ---- Setup / teardown -------------------------------------------- * + * + * Switch to `mode`, returning the previous mode for restore. `page` + * (0 or 1) selects the initial graphics screen — both the visible and + * the draw page are set to it, and the W3 bank is reset to 0x50 (the + * canonical visible video page). Programs that don't double-buffer + * just pass 0. */ +uint8_t gfx_init(uint8_t mode, uint8_t page); + +/* Restore a previously-saved video mode. */ +void gfx_done(uint8_t mode); + +/* ---- Page selection (double-buffering) and bank control ---------- * + * + * The Sprinter hardware holds two graphics screens. The VISIBLE page + * is what's shown on screen; the DRAW page is where the gfx_* writes + * land. Render the next frame into the hidden page and flip when ready. + * + * "Bank" is the W3 page byte (0x50..0x5F) — bits 2,3 select + * normal/temp/transparent display modes. All gfx_* primitives map + * THIS bank into W3 before touching 0xC000+. Default is 0x50. */ + +void gfx_set_visible_page(uint8_t page); /* 0 or 1 */ +uint8_t gfx_get_visible_page(void); + +void gfx_set_draw_page(uint8_t page); /* 0 or 1 */ +uint8_t gfx_get_draw_page(void); + +void gfx_set_bank(uint8_t bank); /* 0x50..0x5F */ +uint8_t gfx_get_bank(void); + +/* Block until the next frame interrupt (50 Hz on Sprinter). Uses + * `EI; HALT` — the Z80 sleeps until the next IM2 tick that DSS programs + * for keyboard / cursor handling. Typical use: + * + * gfx_set_draw_page(hidden); + * draw_frame(...); + * gfx_wait_vsync(); // wait for vretrace + * gfx_set_visible_page(hidden); // tear-free flip + */ +void gfx_wait_vsync(void); + +/* ---- 320×256×256 (mode 0x81) drawing API -------------------------- * + * Colour args are palette indices 0..255. */ + +void gfx_clear256 (uint8_t color); +void gfx_putpixel256 (int x, int y, uint8_t color); +void gfx_hline256 (int x, int y, int len, uint8_t color); +void gfx_vline256 (int x, int y, int len, uint8_t color); +void gfx_line256 (int x0, int y0, int x1, int y1, uint8_t color); +void gfx_rect256 (int x, int y, int w, int h, uint8_t color); +void gfx_fill_rect256(int x, int y, int w, int h, uint8_t color); + +/* ---- 640×256×16 (mode 0x82) drawing API --------------------------- * + * Colour args are palette indices 0..15. The accelerator works + * byte-wise so vline16 falls back to per-row RMW (a byte spans two + * horizontal pixels). */ + +void gfx_clear16 (uint8_t color); +void gfx_putpixel16 (int x, int y, uint8_t color); +void gfx_hline16 (int x, int y, int len, uint8_t color); +void gfx_vline16 (int x, int y, int len, uint8_t color); +void gfx_line16 (int x0, int y0, int x1, int y1, uint8_t color); +void gfx_rect16 (int x, int y, int w, int h, uint8_t color); +void gfx_fill_rect16(int x, int y, int w, int h, uint8_t color); + +/* ---- Bitmap-font text -------------------------------------------- * + * Font is 256 glyphs × 8 rows × 1 byte (ZX-Spectrum format), 2 KB. + * On first use the default system font is fetched via BIOS WIN_GET_ZG + * (fn 0xB8). gfx_set_font() lets you swap in a custom font (the + * pointer is held — keep the storage alive). */ + +void gfx_load_default_font(void); +void gfx_set_font(const uint8_t *font); + +/* 320×256×256 text: one byte per pixel; advances x by 8 per char. */ +void gfx_putchar256(int x, int y, char c, uint8_t fg, uint8_t bg); +void gfx_text256 (int x, int y, const char *s, uint8_t fg, uint8_t bg); + +/* 640×256×16 text: 4 bits per pixel; x must be EVEN (byte-aligned). */ +void gfx_putchar16 (int x, int y, char c, uint8_t fg, uint8_t bg); +void gfx_text16 (int x, int y, const char *s, uint8_t fg, uint8_t bg); + +/* ---- Palette ----------------------------------------------------- * + * Each graphics page has its own palette page (page 0 → palette 0, + * page 1 → palette 1). For seamless double-buffering, load the same + * palette into both. */ + +/* Load a contiguous block of palette entries. + * pal_num: 0..3 (graphics palettes) + * start: first colour slot (0..255) + * count: number of slots (0 → 256) + * data: pointer to count entries, each formatted (B, G, R, 0). */ +void gfx_pal_load(uint8_t pal_num, uint8_t start, uint8_t count, + const uint8_t *data); + +/* Convenience: set one palette entry from RGB. Internally builds the + * BGR+pad triple and calls gfx_pal_load(pal_num, idx, 1, ...). */ +void gfx_pal_set (uint8_t pal_num, uint8_t idx, + uint8_t r, uint8_t g, uint8_t b); + +#endif diff --git a/libc/include/mouse.h b/libc/include/mouse.h new file mode 100644 index 0000000..25ee76d --- /dev/null +++ b/libc/include/mouse.h @@ -0,0 +1,113 @@ +/* + * mouse.h — Sprinter mouse driver (RST 30h). + * + * The driver is installed in the system shell. After a successful + * mouse_init(), the driver tracks the hardware and you can query state + * or move/show/hide the cursor on demand. + * + * coordinate units: + * READ_STATE / GOTO take pixel coordinates. In text mode 03h + * (80x32) divide x by 8 and y by 8 (NOT 16) to get char-cell + * position. + * + * buttons bitmask: + * bit 0 = left, bit 1 = right + */ + +#ifndef MOUSE_H +#define MOUSE_H + +#include + +typedef struct { + uint16_t x; /* pixel coordinate */ + uint16_t y; /* pixel coordinate */ + uint8_t buttons; /* bit 0 = left, bit 1 = right */ +} mouse_state_t; + +int mouse_init (void); /* 0 OK, -1 if no driver */ +void mouse_show (void); +void mouse_hide (void); +void mouse_refresh(void); +void mouse_read (mouse_state_t *st); +void mouse_goto (int x, int y); +void mouse_bounds_x(int xmin, int xmax); +void mouse_bounds_y(int ymin, int ymax); + +/* Text-mode cursor shape (function $0A). + * sym_and / sym_xor — character glyph mask + * attr_and / attr_xor — attribute byte mask + * Default cursor is XOR'd inverse video at the cell. */ +void mouse_text_cursor(uint8_t sym_and, uint8_t sym_xor, + uint8_t attr_and, uint8_t attr_xor); + +/* ---- Graphics-mode cursor image (functions $09 / $0B) ----------- * + * The driver accepts an opaque bitmap for the cursor in graphics modes. + * Doc does not specify the byte layout — empirically size = width*height + * bytes (1 byte per pixel for 256-colour mode, presumably packed nibbles + * for 16-colour mode). hot_x / hot_y mark the "click point" within the + * cursor image (0,0 = top-left). + */ +typedef struct { + const void *image; /* bitmap data */ + uint8_t width; + uint8_t height; + uint8_t hot_x; + uint8_t hot_y; +} mouse_cursor_t; + +void mouse_load_cursor(const mouse_cursor_t *c); + +/* Read back the current cursor. + * c->image must point to a buffer large enough to hold width*height bytes. + * width, height, hot_x, hot_y are written by the driver. */ +void mouse_get_cursor(mouse_cursor_t *c); + +/* ---- Sensitivity (functions $0E / $0F) ------------------------- * + * Verified empirically (2026-05-31): the value is a DIVIDER — the + * driver counts that many raw hardware steps from the mouse before + * advancing the cursor by one screen pixel. So **smaller value = more + * sensitive** (cursor moves faster), and larger value = slower cursor. + * (The doc statement "higher = less movement needed" appears to be + * inverted.) Useful starting point: 2 on both axes. */ +uint8_t mouse_get_sensitivity_x(void); +uint8_t mouse_get_sensitivity_y(void); +void mouse_set_sensitivity(uint8_t horz, uint8_t vert); + +/* ---- Solid-C compatibility ------------------------------------- * + * Solid-C uses shorter `ms_*` names + typed state structs. The semantics + * are identical to our `mouse_*` API. */ + +#define LEFT_BUTTON 1 +#define RIGHT_BUTTON 2 + +/* MSGSTAT mirrors mouse_state_t — same field order and types. */ +typedef mouse_state_t MSGSTAT; + +#define ms_init mouse_init +#define ms_show mouse_show +#define ms_hide mouse_hide +#define ms_ref mouse_refresh +#define ms_xbnd mouse_bounds_x +#define ms_ybnd mouse_bounds_y +#define ms_spos mouse_goto +#define mssgpos mouse_goto +#define ms_tcur mouse_text_cursor +#define ms_scur mouse_load_cursor +#define ms_gcur mouse_get_cursor +#define ms_vmod mouse_video_mode_changed +#define ms_ssen mouse_set_sensitivity +#define msgstat(st) mouse_read((st)) + +/* ---- $81 CHANGE VIDEO MODE ------------------------------------- * + * Call after changing the video mode (set_videotextmode or gfx_init) so + * the driver re-syncs its internal coordinate ranges and cursor image. + * + * `mode` is the byte you switched to — TEXT_MODE_* (from ) or + * GFX_MODE_* (from ), e.g. 0x03 for 80×32 text or 0x81 for + * 320×256×256. The driver REQUIRES the new mode in register A — + * passing garbage leaves the cursor mis-configured (text-mode XOR + * pattern applied in graphics, etc.). */ +void mouse_video_mode_changed(uint8_t mode); + +#endif diff --git a/libc/include/sprinter.h b/libc/include/sprinter.h new file mode 100644 index 0000000..8cbb311 --- /dev/null +++ b/libc/include/sprinter.h @@ -0,0 +1,156 @@ +/* + * sprinter.h — low-level Sprinter platform definitions for C programs. + * + * Numbers and behaviour cross-checked against docs/converted/ (IvanMak.txt, + * DiskSyscalls.txt, BIOS_v3.txt, ProgrammerManual.txt). + */ + +#ifndef SPRINTER_H +#define SPRINTER_H + +#include + +/* ---- I/O ports ----------------------------------------------------- */ + +/* Memory window page-select ports (write 8-bit physical page number). */ +#define PORT_PAGE_W0 0x82 /* window 0: 0x0000-0x3FFF (ESTEX system) */ +#define PORT_PAGE_W1 0xA2 /* window 1: 0x4000-0x7FFF (HOME) */ +#define PORT_PAGE_W2 0xC2 /* window 2: 0x8000-0xBFFF (stack+heap) */ +#define PORT_PAGE_W3 0xE2 /* window 3: 0xC000-0xFFFF (paged) */ + +/* Graphics ports (used in stage 3+). */ +#define PORT_RGADR 0x89 /* graphic Y / Spectrum-page selector */ +#define PORT_RGMOD 0xC9 /* bit 0 = active screen page 0/1 */ + +/* ---- ESTEX RST 10h function numbers -------------------------------- */ +/* Full list in docs/converted/DiskSyscalls.txt (DSS v1.6). */ + +#define ESTEX_VERSION 0x00 +#define ESTEX_CHDISK 0x01 +#define ESTEX_CURDISK 0x02 +#define ESTEX_DSKINFO 0x03 + +#define ESTEX_CREATE 0x0A +#define ESTEX_CREATE_NEW 0x0B +#define ESTEX_DELETE 0x0E +#define ESTEX_RENAME 0x10 +#define ESTEX_OPEN 0x11 +#define ESTEX_CLOSE 0x12 +#define ESTEX_READ 0x13 +#define ESTEX_WRITE 0x14 +#define ESTEX_MOVE_FP 0x15 +#define ESTEX_ATTRIB 0x16 +#define ESTEX_F_FIRST 0x19 +#define ESTEX_F_NEXT 0x1A +#define ESTEX_MKDIR 0x1B +#define ESTEX_RMDIR 0x1C +#define ESTEX_CHDIR 0x1D +#define ESTEX_CURDIR 0x1E + +#define ESTEX_SYSTIME 0x21 + +#define ESTEX_WAITKEY 0x30 +#define ESTEX_SCANKEY 0x31 +#define ESTEX_ECHOKEY 0x32 +#define ESTEX_CTRLKEY 0x33 + +#define ESTEX_SETWIN 0x38 +#define ESTEX_SETWIN1 0x39 +#define ESTEX_SETWIN2 0x3A +#define ESTEX_SETWIN3 0x3B +#define ESTEX_INFOMEM 0x3C +#define ESTEX_GETMEM 0x3D +#define ESTEX_FREEMEM 0x3E +#define ESTEX_SETMEM 0x3F + +#define ESTEX_EXEC 0x40 +#define ESTEX_EXIT 0x41 +#define ESTEX_WAIT 0x42 + +#define ESTEX_ENV 0x46 /* env API: B=0 sysenv, B=1 getenv, B=2 putenv */ + +#define ESTEX_SETVMOD 0x50 +#define ESTEX_GETVMOD 0x51 +#define ESTEX_LOCATE 0x52 +#define ESTEX_CURSOR 0x53 +#define ESTEX_SELPAGE 0x54 +#define ESTEX_SCROLL 0x55 +#define ESTEX_CLEAR 0x56 +#define ESTEX_RDCHAR 0x57 +#define ESTEX_WRCHAR 0x58 +#define ESTEX_WINCOPY 0x59 +#define ESTEX_WINREST 0x5A +#define ESTEX_PUTCHAR 0x5B +#define ESTEX_PCHARS 0x5C +#define ESTEX_PRINT 0x5F + +/* ---- BIOS RST 8 function numbers ----------------------------------- */ +/* Full list in docs/converted/BIOS_v3.txt (BIOS v3.00). */ + +#define BIOS_EMM_INFO 0xC0 /* HL=total pages, BC=free pages */ +#define BIOS_EMM_INIT 0xC1 +#define BIOS_EMM_ALLOC 0xC2 /* B=npages -> A=blk_id */ +#define BIOS_EMM_FREE 0xC3 /* A=blk_id */ +#define BIOS_EMM_GETPAGE 0xC4 /* A=blk_id, B=log -> A=physical */ +#define BIOS_EMM_LIST 0xC5 +#define BIOS_EMM_PORT_FOR 0xC6 /* A=window -> C=port, B=current page */ +#define BIOS_EMM_NEXTPAGE 0xC7 + +/* ---- Inline paging intrinsics -------------------------------------- */ +/* + * Each generates a single "OUT (port), A" + the load of the literal. + * Wrap in DI/EI yourself for graphics-grade timing; for one-shot setup + * the inline form is fine. + */ +__sfr __at PORT_PAGE_W0 _io_page_w0; +__sfr __at PORT_PAGE_W1 _io_page_w1; +__sfr __at PORT_PAGE_W2 _io_page_w2; +__sfr __at PORT_PAGE_W3 _io_page_w3; + +static inline void sprinter_page_w0(uint8_t page) { _io_page_w0 = page; } +static inline void sprinter_page_w1(uint8_t page) { _io_page_w1 = page; } +static inline void sprinter_page_w2(uint8_t page) { _io_page_w2 = page; } +static inline void sprinter_page_w3(uint8_t page) { _io_page_w3 = page; } + +/* ---- Sprinter-specific debug helpers ------------------------------ */ +/* Print one byte as two uppercase hex digits via putchar(). */ +void print_hex(uint8_t v); + +#ifdef DEBUG_RT +/* + * Runtime diagnostics — exposed only when the program is built with + * `sprinter-cc --debug`. The flag below is set by crt0 before main(). + * + * 0 — crt0 did NOT self-allocate a W2 page (tiny mode never needs to, + * and in small mode DSS itself maps W2 when the image > 16 KB). + * 1 — crt0 had to allocate and map a W2 page via ESTEX $3D + $3A + * (small mode with image ≤ 16 KB). + */ +extern uint8_t w2_self_allocated; +#endif + +/* ---- Environment (ESTEX $46) -------------------------------------- */ +/* + * getenv(name) — return pointer to value, or NULL if not set. + * Returned buffer is ESTEX-owned (shared static); + * copy if needed before the next getenv() call. + * putenv("name=value") — add/replace. Pass "name" with no '=' to remove. + * sysenv(buf) — copy the WHOLE environment into caller's buf, + * as a series of NUL-terminated "NAME=value" + * strings followed by an extra NUL marking end: + * "PATH=...\0SOLID=H\0\0" + * Caller is responsible for sizing buf large + * enough for the entire environment. + * + * Return values: + * getenv: pointer to value (NUL-terminated) on success, + * NULL when the variable is not present (errno unchanged), + * NULL with errno set on real error. + * putenv: 0 on success, -1 on error (errno set). + * sysenv: buf on success, (char*)-1 on error (errno set). + */ +char *getenv(const char *name); +int putenv(const char *namevalue); +char *sysenv(char *buf); + +#endif /* SPRINTER_H */ diff --git a/libc/include/sprinter_compat.h b/libc/include/sprinter_compat.h new file mode 100644 index 0000000..48f79bd --- /dev/null +++ b/libc/include/sprinter_compat.h @@ -0,0 +1,106 @@ +/* + * sprinter_compat.h — Solid-C compatibility shims. + * + * Pulls in standard headers and adds aliases/macros that Solid-C + * programs expect. Programs targeting Sprinter from Solid-C source + * can `#include ` and most names "just work". + */ + +#ifndef SPRINTER_COMPAT_H +#define SPRINTER_COMPAT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* _exit, atexit */ + +/* ---- Solid-C types ----------------------------------------------- */ +typedef uint8_t BYTE; +typedef uint8_t TINY; +typedef uint8_t BOOL; +typedef uint8_t STATUS; +typedef uint16_t WORD; +typedef int FD; + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#define YES 1 +#define NO 0 +#endif + +#ifndef OK +#define OK 0 +#endif + +#ifndef ERROR +#define ERROR (-1) +#endif + +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 +#endif + +/* Solid-C's uint typedef (we expose it explicitly). Note `uint` may + * already be defined in some environments; guard. */ +#ifndef _SOLID_UINT_DEFINED +#define _SOLID_UINT_DEFINED +typedef unsigned uint; +#endif + +/* fpoint — 32-bit split file position (used by lseek/tell). */ +typedef struct fpoint { + uint16_t low; + uint16_t high; +} f_point; + +/* ---- string.h aliases -------------------------------------------- */ +/* setmem(ptr, n, byte) → memset(ptr, byte, n) — arg order swapped */ +#define setmem(p, n, b) memset((p), (b), (n)) +/* movmem(src, dst, n) → memcpy(dst, src, n) — arg order swapped */ +#define movmem(s, d, n) memcpy((d), (s), (n)) + +/* In-place case conversion. */ +char *strlwr(char *s); +char *strupr(char *s); + +/* Solid-C calls perror's table 'strerr'. */ +#define strerr(n) strerror((n)) + +/* ---- stdlib.h additions ------------------------------------------ */ +#define abort() _exit(0xFF) + +#ifndef min +#define min(a, b) ((a) < (b) ? (a) : (b)) +#endif +#ifndef max +#define max(a, b) ((a) > (b) ? (a) : (b)) +#endif + +/* div() and div_t come from SDCC's (already included above). */ + +/* sysenv() is now a real function (libc/io/env.c) that returns the WHOLE + * environment into a caller-provided buffer. Declared in . */ + +/* ---- ctype.h additions ------------------------------------------- */ +#define isascii(c) (((unsigned)(c)) < 128) + +/* ---- io.h aliases (Solid-C fd shortcuts) ------------------------- */ +#define seek(fd, off) lseek((fd), (long)(off), SEEK_SET) +#define tell(fd) ((uint16_t)lseek((fd), 0, SEEK_CUR)) +#define remove(name) unlink(name) + +/* ---- dir.h alias ------------------------------------------------- */ +#define _ffirst ffirst + +#endif diff --git a/libc/include/sprinter_exit.h b/libc/include/sprinter_exit.h new file mode 100644 index 0000000..f03e6ef --- /dev/null +++ b/libc/include/sprinter_exit.h @@ -0,0 +1,15 @@ +/* + * sprinter_exit.h — exit() / _exit() / atexit() declarations. + * + * SDCC's z80 doesn't ship these. Include this header + * (in addition to ) to get them. Link with libc/io/atexit.c. + */ + +#ifndef SPRINTER_EXIT_H +#define SPRINTER_EXIT_H + +int atexit(void (*fn)(void)); +void exit (int code); +void _exit (int code); + +#endif diff --git a/libc/include/sprinter_mem.h b/libc/include/sprinter_mem.h new file mode 100644 index 0000000..b2ac747 --- /dev/null +++ b/libc/include/sprinter_mem.h @@ -0,0 +1,37 @@ +/* + * sprinter_mem.h — banking-aware page allocator and bank-data accessors. + * + * For data that doesn't fit in window 2's heap, allocate physical pages + * directly through ESTEX EMM and access them via bank_read / bank_write + * (which swap window 3 internally). + * + * mem_alloc_pages(N) — reserve N contiguous 16 KB pages, return block id. + * mem_free_block(id) — release a previously-allocated block. + * mem_get_page(id, i) — translate (block, page-index) to physical page. + * mem_info(&total, &free) — query EMM about total/free 16 KB pages. + * + * bank_load_byte / bank_store_byte — single-byte access via W3. + * bank_read / bank_write — bulk copy between far page and a near buffer. + * + * The bank_* helpers live in HOME so they are always reachable; they save + * the previous W3 page, swap to the target, do the work, restore W3. + */ + +#ifndef SPRINTER_MEM_H +#define SPRINTER_MEM_H + +#include + +/* ESTEX EMM allocator wrappers. */ +uint8_t mem_alloc_pages(uint8_t n); /* 0 = failure */ +void mem_free_block (uint8_t blk_id); +uint8_t mem_get_page (uint8_t blk_id, uint8_t idx); +void mem_info (uint16_t *total, uint16_t *free_pages); + +/* Far-page accessors (always-mapped HOME, swap W3 internally). */ +uint8_t bank_load_byte (uint8_t phys_page, uint16_t off_in_window); +void bank_store_byte(uint8_t phys_page, uint16_t off_in_window, uint8_t v); +void bank_read (uint8_t phys_page, uint16_t off, void *dst, uint16_t n); +void bank_write(uint8_t phys_page, uint16_t off, const void *src, uint16_t n); + +#endif diff --git a/libc/include/stdio.h b/libc/include/stdio.h new file mode 100644 index 0000000..73bd357 --- /dev/null +++ b/libc/include/stdio.h @@ -0,0 +1,102 @@ +/* + * stdio.h — extends SDCC's z80 stdio with a minimal FILE * stream API. + * + * The bottom of the stack is the existing POSIX-style fd I/O (open/ + * read/write/close/lseek). FILE * is a thin struct wrapping a fd plus + * a few flag bits. No buffering — every fread/fwrite/fputc maps 1:1 + * to a syscall. Sprinter's I/O is already char-oriented at the ESTEX + * level, so this stays minimal. + * + * stdin / stdout / stderr are predefined "virtual" FILE * pointers + * that talk to the console via putchar()/getchar() (NOT through a fd). + * That keeps printf-routed output going through our CR/LF mapping. + */ + +#ifndef STDIO_H +#define STDIO_H + +#include +#include /* size_t */ +#include + +#ifndef EOF +#define EOF (-1) +#endif + +/* ---- printf family (linked from SDCC's z80.lib) -------------------- */ +int printf (const char *, ...); +int sprintf(char *, const char *, ...); +int vprintf(const char *, va_list); +int vsprintf(char *, const char *, va_list); + +/* puts / putchar / getchar — overridden by our libc to use ESTEX. */ +int puts (const char *); +int putchar(int); +int getchar(void); + +/* ---- FILE * (minimal, unbuffered) ---------------------------------- */ + +/* Internal layout — opaque to user. fd == -1 marks the console + * pseudo-streams (stdin/stdout/stderr). */ +typedef struct __FILE { + int fd; /* underlying POSIX fd, or -1 for console */ + uint8_t flags; /* see _F_* below */ +} FILE; + +#define _F_READ 0x01 +#define _F_WRITE 0x02 +#define _F_APPEND 0x04 +#define _F_EOF 0x10 +#define _F_ERROR 0x20 +#define _F_CONIN 0x40 /* console pseudo-stream — uses getchar() */ +#define _F_CONOUT 0x80 /* console pseudo-stream — uses putchar() */ + +extern FILE *const stdin; +extern FILE *const stdout; +extern FILE *const stderr; + +/* fseek whence — same numeric values as SEEK_SET/CUR/END in unistd.h. */ +#ifndef SEEK_SET +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif + +FILE *fopen (const char *path, const char *mode); +int fclose(FILE *fp); +int fflush(FILE *fp); + +int fputc (int c, FILE *fp); +int fgetc (FILE *fp); +int fputs (const char *s, FILE *fp); +char *fgets (char *buf, int n, FILE *fp); + +size_t fread (void *ptr, size_t size, size_t nmemb, FILE *fp); +size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *fp); + +int fseek (FILE *fp, long off, int whence); +long ftell (FILE *fp); +void rewind(FILE *fp); + +int feof (FILE *fp); +int ferror(FILE *fp); +void clearerr(FILE *fp); + +/* Aliases to fputc/fgetc — POSIX says they may be macros. */ +#define putc(c, fp) fputc(c, fp) +#define getc(fp) fgetc(fp) + +/* Read line from stdin into buf until '\n' or EOF; '\n' is not stored. + * Returns buf, or NULL on EOF with empty input. Solid-C/POSIX semantic. + * Note: dangerous, no length check — caller must size buf appropriately. */ +char *gets(char *buf); + +/* Solid-C decimal/hex helpers — print uint as decimal/hex without args. */ +void hex8 (uint8_t v); /* prints two hex digits */ +void hex16(uint16_t v); /* prints four hex digits */ +void hex32(uint32_t v); /* prints eight hex digits */ +void dec8 (uint8_t v); /* prints up to 3 decimal digits, no padding */ +void dec16(uint16_t v); /* prints up to 5 decimal digits */ +void dec32(uint32_t v); /* prints up to 10 decimal digits */ + +#endif diff --git a/libc/include/sys/stat.h b/libc/include/sys/stat.h new file mode 100644 index 0000000..71c2685 --- /dev/null +++ b/libc/include/sys/stat.h @@ -0,0 +1,42 @@ +/* + * sys/stat.h — POSIX-style stat() / fstat() over ESTEX file metadata. + * + * stat(path, &st) queries via ESTEX F_FIRST ($19) using the exact + * name; gets size, attrib, and DOS-format date/time + * that we expand to a struct stat. + * fstat(fd, &st) queries an open handle: size via lseek(SEEK_END) + * trick + date/time via ESTEX GET_D_T ($17). + * + * Sprinter has no inodes / owners / groups, so st_ino / st_uid / st_gid + * are absent. S_ISREG and S_ISDIR are the only meaningful mode tests. + */ + +#ifndef SYS_STAT_H +#define SYS_STAT_H + +#include +#include /* time_t */ + +/* File mode bits — POSIX subset (octal as per convention). */ +#define S_IFMT 0170000 /* file-type mask */ +#define S_IFREG 0100000 /* regular file */ +#define S_IFDIR 0040000 /* directory */ + +#define S_IRUSR 0000400 /* owner read */ +#define S_IWUSR 0000200 /* owner write */ +#define S_IXUSR 0000100 /* owner execute */ +#define S_IRWXU 0000700 + +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) + +struct stat { + uint16_t st_mode; /* file type + perms */ + uint32_t st_size; /* size in bytes */ + time_t st_mtime; /* last-mod time (Unix epoch) */ +}; + +int stat (const char *path, struct stat *buf); +int fstat(int fd, struct stat *buf); + +#endif diff --git a/libc/include/time.h b/libc/include/time.h new file mode 100644 index 0000000..5c210a3 --- /dev/null +++ b/libc/include/time.h @@ -0,0 +1,70 @@ +/* + * time.h — system clock access via ESTEX $21 / $22. + * + * getdatetime() — read current date/time into a datetime_t. + * setdatetime() — set system clock from a datetime_t. + * Returns 0 on success, -1 with errno set on failure. + * + * Date/time is the raw Sprinter clock — no epoch conversion, no time_t. + */ + +#ifndef TIME_H +#define TIME_H + +#include + +typedef struct { + uint8_t day; /* 1..31 */ + uint8_t month; /* 1..12 */ + uint16_t year; /* full year, e.g. 2026 */ + uint8_t hour; /* 0..23 */ + uint8_t minute; /* 0..59 */ + uint8_t second; /* 0..59 */ + uint8_t dow; /* day of week, 1-based: 1=Sun..7=Sat — see DOW_* */ +} datetime_t; + +/* Sprinter ESTEX SYSTIME dow encoding (verified empirically): + * 1-based, week starts on Sunday — matches DOS INT 21h AH=2A+1. */ +#define DOW_SUN 1 +#define DOW_MON 2 +#define DOW_TUE 3 +#define DOW_WED 4 +#define DOW_THU 5 +#define DOW_FRI 6 +#define DOW_SAT 7 + +void getdatetime(datetime_t *dt); +int setdatetime(const datetime_t *dt); + +/* ------------------------------------------------------------------ + * POSIX API — implemented by SDCC's z80.lib (time.rel etc.). + * We provide RtcRead() in libc/io/time.c which bridges to getdatetime(). + * + * Layout of struct tm matches SDCC's z80 ABI exactly (__TIME_UNSIGNED=1 + * variant): tm_sec/min/hour/mday/mon/wday/isdst/hundredth are 1 byte, + * tm_year/tm_yday are 16-bit ints. Total 12 bytes. + * ------------------------------------------------------------------ */ + +struct tm { + unsigned char tm_sec; /* 0..60 */ + unsigned char tm_min; /* 0..59 */ + unsigned char tm_hour; /* 0..23 */ + unsigned char tm_mday; /* 1..31 */ + unsigned char tm_mon; /* 0..11 (POSIX, not Sprinter native!) */ + int tm_year; /* years since 1900 */ + unsigned char tm_wday; /* 0..6 (Sunday=0, POSIX) */ + int tm_yday; /* 0..365 */ + unsigned char tm_isdst; + unsigned char tm_hundredth; /* SDCC extension; we leave 0 */ +}; + +typedef unsigned long time_t; + +time_t time (time_t *t); +struct tm *gmtime (time_t *timep); +struct tm *localtime(time_t *timep); +time_t mktime (struct tm *timeptr); +char *asctime (struct tm *timeptr); +char *ctime (time_t *timep); + +#endif diff --git a/libc/include/unistd.h b/libc/include/unistd.h new file mode 100644 index 0000000..2424bda --- /dev/null +++ b/libc/include/unistd.h @@ -0,0 +1,39 @@ +/* + * unistd.h — POSIX-style file descriptor I/O for Sprinter ESTEX. + * + * Each call maps to a single ESTEX RST 10h function: + * read → $13 write → $14 + * close → $12 unlink → $0E + * + * On error every call returns -1 (the ESTEX error code is not exposed yet; + * a future errno mechanism will surface it). + */ + +#ifndef UNISTD_H +#define UNISTD_H + +#include /* size_t */ + +/* lseek whence values (POSIX). */ +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 + +int read (int fd, void *buf, size_t n); +int write(int fd, const void *buf, size_t n); +int close(int fd); +int unlink(const char *path); +long lseek(int fd, long offset, int whence); + +/* Block the calling task for `seconds` seconds (50 Hz IRQ-based timer). */ +void sleep(unsigned int seconds); + +/* Directory operations (ESTEX $1B-$1E). All return 0 on success and -1 + * with errno set on failure; getcwd returns the buffer on success or NULL. + * size is ignored — ESTEX always wants a 256-byte buffer. */ +int mkdir (const char *path); +int rmdir (const char *path); +int chdir (const char *path); +char *getcwd(char *buf, size_t size); + +#endif diff --git a/libc/io/_errno_set.c b/libc/io/_errno_set.c new file mode 100644 index 0000000..dee06c3 --- /dev/null +++ b/libc/io/_errno_set.c @@ -0,0 +1,40 @@ +/* + * _errno_set — set `errno` from an ESTEX error code (0..255 in A). + * + * Replaces the inline pattern + * ld (_errno), a + * xor a, a + * ld (_errno+1), a ; 7 bytes per error path + * with a single + * call __errno_set ; 3 bytes per error path + * + * Saves ~4 bytes at every libc error handler that converts an ESTEX + * code into the C-side `errno`. Helper itself is 7 bytes; with 10+ + * error paths in our libc the size win is net-positive. + * + * ABI: + * in: A = ESTEX error code (0..255) + * out: HL = A (zero-extended); errno fully overwritten so a prior + * large value (e.g. errno = -1) can't leak its high byte. + * clobbers: HL, AF flags. Caller must not depend on HL afterwards. + * + * Defensive 16-bit store — see chat 2026-06-02: if anyone ever assigns + * errno via C (`errno = -1`), the high byte becomes 0xFF, and a partial + * 8-bit write here would leave that 0xFF in place. Always writing the + * full word keeps errno honest regardless of who set it last. + */ + +void _errno_set(unsigned char code) __naked +{ + (void)code; + __asm + ;; __sdcccall(1): single uint8_t arg already in A. + ;; Write the two bytes separately so HL/BC/DE/IX/IY remain + ;; untouched. Only A is clobbered: it is the input register, + ;; and ABI does not require preserving it across a void call. + ld (_errno), a ; low byte = code + xor a, a + ld (_errno+1), a ; high byte = 0 + ret + __endasm; +} diff --git a/libc/io/atexit.c b/libc/io/atexit.c new file mode 100644 index 0000000..04a4ae6 --- /dev/null +++ b/libc/io/atexit.c @@ -0,0 +1,57 @@ +/* + * atexit + exit + _exit. + * + * atexit(fn) — register fn to be called at normal termination (max 8). + * exit(code) — run the atexit chain in LIFO, then ESTEX EXIT. + * _exit(code) — POSIX raw exit: skip the chain, go straight to ESTEX. + * + * These functions own termination entirely; crt0.s only does inline RST + * 10h #41 when main returns without an explicit exit(). That path skips + * the atexit chain — programs that need handlers should call exit() at + * the bottom of main (or return through a wrapper). + */ + +#include +#include + +#define ATEXIT_MAX 8 + +static void (*atexit_stack[ATEXIT_MAX])(void); +static int atexit_top = 0; + +int atexit(void (*fn)(void)) +{ + if (atexit_top >= ATEXIT_MAX) { + return -1; + } + atexit_stack[atexit_top++] = fn; + return 0; +} + +/* exit() — runs the chain, then performs the raw ESTEX EXIT. */ +void exit(int code) +{ + while (atexit_top > 0) { + void (*fn)(void) = atexit_stack[--atexit_top]; + if (fn) { + fn(); + } + } + _exit(code); /* falls into the inline-asm raw exit below */ +} + +/* _exit() — POSIX raw termination, no atexit chain. */ +void _exit(int code) __naked +{ + (void)code; + __asm + ;; HL = code (single int arg). + ld a, l + ld b, a + ld c, #0x41 ; ESTEX EXIT + rst #0x10 + ;; Should not return. +1$: halt + jr 1$ + __endasm; +} diff --git a/libc/io/conio.c b/libc/io/conio.c new file mode 100644 index 0000000..ac9559b --- /dev/null +++ b/libc/io/conio.c @@ -0,0 +1,629 @@ +/* + * conio.c — console I/O wrappers around ESTEX kbd/screen syscalls. + * + * $30 WAITKEY — blocking read, returns scan / ASCII / modifiers + * $31 SCANKEY — non-blocking poll + * $32 ECHOKEY — blocking read + auto-echo to the screen + * $52 LOCATE — set cursor to (D=row, E=col) + * $56 CLEAR — fill a window with (A=char, B=attr) + * $5B PUTCHAR — write single character (CR/LF/scroll handled by ESTEX) + * + * Every RST 10h is bracketed with push/pop IX (caller's frame pointer). + */ + +#include +#include +#include + +/* Forward extern — definition is further down (after putch/cputs which + * reference it from asm by linker-symbol name). */ +extern int16_t g_text_attr; + +char kbhit(void) __naked +{ + __asm + push ix + ld c, #0x33 ; ESTEX CTRLKEY — peeks without consuming + rst #0x10 + pop ix + ;; A=0 → no key waiting; non-zero → there is one. + or a, a + ret z + ld a, #0x01 + ret + __endasm; +} + +char getch(void) __naked +{ + __asm + push ix + ld c, #0x30 ; ESTEX WAITKEY (no echo) + rst #0x10 + pop ix + ;; ESTEX returns ASCII in E (and copy in A) + ret + __endasm; +} + +char getche(void) __naked +{ + __asm + push ix + ld c, #0x32 ; ESTEX ECHOKEY (echo to console) + rst #0x10 + pop ix + ;; ESTEX returns ASCII in E (and copy in A) + ret + __endasm; +} + +/* ---- putch / cputs: Turbo-C conio convention ---------------------- * + * Both APPLY the current text attribute (g_text_attr). When attr is + * KEEP_EXIST_ATTR (>0xFF), they short-circuit to the FAST stdio path + * (putchar / puts-like raw PCHARS). + * + * No '\n' to CR LF translation here — Turbo-C cputs/putch require the + * caller to use "\r\n" explicitly. Stdio puts/putchar do translate. + */ + +static uint8_t pc_ch = 0; +static uint8_t pc_attr = 0; +static uint8_t pc_row = 0; +static uint8_t pc_col = 0; + +/* Controls how _raw_putch treats control characters (< 0x20): + * 0 (default) — BS/TAB/LF/CR are interpreted (no glyph output); + * other chars print as glyphs via WRCHAR. + * 1 — all characters print as glyphs, no interpretation. + * + * Only takes effect on the WRCHAR (attr ≤ 0xFF) path. When + * g_text_attr is KEEP_EXIST_ATTR, ESTEX's own PUTCHAR/PCHARS handle + * cursor and control chars — pc_raw_mode is irrelevant. */ +static uint8_t pc_raw_mode = 0; + +void set_putch_raw_mode(uint8_t mode) { pc_raw_mode = mode; } +uint8_t get_putch_raw_mode(void) { return pc_raw_mode; } + +/* ---- Internal helpers ------------------------------------------- */ + +/* Read current cursor into pc_row / pc_col via ESTEX CURSOR ($53). */ +static void _get_cursor(void) __naked +{ + __asm + push ix + ld c, #0x53 ; ESTEX CURSOR + rst #0x10 + ld a, d + ld (_pc_row), a + ld a, e + ld (_pc_col), a + pop ix + ret + __endasm; +} + +/* Move cursor to (pc_col, pc_row) via ESTEX LOCATE ($52). */ +static void _set_cursor(void) __naked +{ + __asm + push ix + ld a, (_pc_row) + ld d, a + ld a, (_pc_col) + ld e, a + ld c, #0x52 ; ESTEX LOCATE + rst #0x10 + pop ix + ret + __endasm; +} + +/* ESTEX PUTCHAR ($5B) — fast no-attr path; ESTEX handles CR/LF/scroll + * and cursor itself. Used when g_text_attr = KEEP_EXIST_ATTR. */ +static char _bios_putchar(char ch) __naked +{ + (void)ch; + __asm + ;; c in A. push af stashes it across the RST (which clobbers A). + ;; push ix ; PUTCHAR не меняет IX + push af + ld c, #0x5B ; ESTEX PUTCHAR + rst #0x10 + pop af + ;; pop ix + ret + __endasm; +} + +/* Raw putch: low-level WRCHAR-based output at (pc_col, pc_row) using + * the given attribute byte (caller has already verified that the high + * byte of g_text_attr is zero — this function takes only the low byte). + * Updates pc_col / pc_row per pc_raw_mode: + * + * pc_raw_mode == 0: BS/TAB/LF/CR are INTERPRETED: + * 0x08 BS → pc_col-- (if not already 0) + * 0x09 TAB → pc_col rounded up to next multiple of 8 (capped 80) + * 0x0A LF → pc_row++ (capped at 32; no glyph) + * 0x0D CR → pc_col = 0 + * other → WRCHAR + pc_col++ + * + * pc_raw_mode == 1: ALL characters print as glyphs via WRCHAR + * + pc_col++ (including 0x08, 0x09, 0x0A, 0x0D — they render as + * their CP437 glyphs). + * + * WRCHAR itself is suppressed when pc_col ≥ 80 or pc_row ≥ 32 (off- + * screen) — coordinates [0..79] × [0..31] only. + * + * Does NOT call CURSOR / LOCATE — caller is expected to fetch cursor + * once before a sequence of _raw_putch calls and write it back once + * after, so we pay the BIOS overhead per OPERATION instead of per CHAR. */ +/* Mode-0 worker: interprets BS/TAB/LF/CR, outputs other chars as glyphs. */ +static void _raw_putch_raw0(char ch, uint8_t attr) __naked +{ + (void)ch; (void)attr; + __asm + ;; __sdcccall(1): ch in A, attr in L. + ;; Dispatch on control chars while A still holds ch (cp does not + ;; modify A). B/C only get loaded on the output path so the + ;; ctrl-char paths are cheaper. + cp #0x08 + jr z, _rp0_bs + cp #0x09 + jr z, _rp0_tab + cp #0x0A + jr z, _rp0_lf + cp #0x0D + jr z, _rp0_cr + ;; Anything else (printable or unrecognised ctrl) → glyph. + + ld c, a ; C = ch (save before A is clobbered) + ld a, (_pc_row) + cp #32 + ret nc ; off-screen bottom — silently skip + ld d, a ; D = row (ESTEX WRCHAR convention) + ld a, (_pc_col) + cp #80 + ret nc ; off-screen right — silently skip + ld e, a ; E = col + inc a + ld (_pc_col), a ; pc_col++ + + ld b, l ; B = attr + ld a, c ; A = ch + push ix + ld c, #0x58 ; ESTEX WRCHAR + rst #0x10 + pop ix + ret + + _rp0_bs: + ld a, (_pc_col) + or a, a + ret z ; already at col 0 — no change + dec a + ld (_pc_col), a + ret + + _rp0_tab: + ld a, (_pc_col) + and #0xF8 ; floor to mult of 8 + add a, #8 ; → next mult of 8 + cp #80 + jr c, _rp0_tab_store + ld a, #80 ; cap at off-screen right + _rp0_tab_store: + ld (_pc_col), a + ret + + _rp0_lf: + ld a, (_pc_row) + cp #32 + ret nc ; already at bottom edge + inc a + ld (_pc_row), a + ret + + _rp0_cr: + xor a, a + ld (_pc_col), a + ret + __endasm; +} + +/* Mode-1 worker: every byte goes through WRCHAR as a glyph. */ +static void _raw_putch_raw1(char ch, uint8_t attr) __naked +{ + (void)ch; (void)attr; + __asm + ;; __sdcccall(1): ch in A, attr in L. + ld c, a ; C = ch (save) + ld a, (_pc_row) + cp #32 + ret nc ; off-screen bottom — silently skip + ld d, a ; D = row + ld a, (_pc_col) + cp #80 + ret nc ; off-screen right — silently skip + ld e, a ; E = col + inc a + ld (_pc_col), a ; pc_col++ + + ld b, l ; B = attr + ld a, c ; A = ch + push ix + ld c, #0x58 ; ESTEX WRCHAR + rst #0x10 + pop ix + ret + __endasm; +} + +/* PCHARS (no attr) — used by cputs when KEEP_EXIST_ATTR is in effect. */ +static void _cputs_pchars(const char *s) __naked +{ + (void)s; + __asm + push ix + ld c, #0x5C ; ESTEX PCHARS + rst #0x10 + pop ix + ret + __endasm; +} + +/* ---- Public putch / cputs --------------------------------------- * + * + * KEEP_EXIST_ATTR (high byte != 0) → fast PUTCHAR/PCHARS through + * ESTEX, which manages its own cursor. + * + * Otherwise → fetch cursor ONCE via CURSOR ($53), run one or many + * _raw_putch calls, write cursor back ONCE via LOCATE ($52). This + * folds the per-char CURSOR/LOCATE pair from the old design into a + * single pair per operation. */ + +char putch(char ch) __naked +{ + (void)ch; + __asm + ;; A = ch on entry; char return → A. + ld (_pc_ch), a ; stash c (for both return and re-load) + + ;; KEEP_EXIST_ATTR? high byte of g_text_attr != 0 + ld a, (_g_text_attr + 1) + or a, a + jr nz, _putch_fast + + ;; --- WRCHAR path: cursor → worker → cursor --- + call __get_cursor + + ;; Worker ABI (2 char/uint8 args): ch in A, attr in L. + ld a, (_g_text_attr) ; A = low byte = attr + ld l, a ; L = attr + + ld a, (_pc_raw_mode) + or a, a ; Z = (mode == 0) + ld a, (_pc_ch) ; A = ch (`ld a,(nn)` does not touch flags) + jr nz, _putch_use_raw1 + call __raw_putch_raw0 + jr _putch_after_raw + _putch_use_raw1: + call __raw_putch_raw1 + _putch_after_raw: + call __set_cursor + ld a, (_pc_ch) ; return value + ret + + _putch_fast: + ld a, (_pc_ch) + call __bios_putchar ; __bios_putchar keeps AF + ret + __endasm; +} + +char cputs(const char *s) __naked +{ + (void)s; + __asm + ;; HL = s on entry; char return → A. + + ;; NULL-check: cputs(NULL) → return 0 immediately. + ld a, h + or a, l + ret z + + ;; KEEP_EXIST_ATTR? high byte of g_text_attr != 0 + ld a, (_g_text_attr + 1) + or a, a + jr nz, _cputs_fast + + ;; --- WRCHAR path: cursor → worker → cursor --- + call __get_cursor + + ;; Worker walks the string via DE; HL is used to carry attr in L + ;; across iterations (RST 10 inside worker clobbers it, so we + ;; push/pop hl around each call). + ex de, hl ; DE = s + ld a, (_g_text_attr) ; A = attr (low byte) + ld l, a ; L = attr (worker ABI: arg2 in L) + + ;; Pick worker once based on pc_raw_mode; IX = function pointer. + ld a, (_pc_raw_mode) + or a, a + jr z, _cputs_use_raw0 + ld ix, #__raw_putch_raw1 + jr _cputs_loop + _cputs_use_raw0: + ld ix, #__raw_putch_raw0 + + _cputs_loop: + ld a, (de) + or a, a + jr z, _cputs_loop_end + inc de + ;; Z80 has no "call (ix)" — emulate via push-of-ret + jp (ix). + push de ; save string pointer + push hl ; save attr (in L) + ld de, #_cputs_after_worker + push de ; push return address + jp (ix) ; "call" worker + _cputs_after_worker: + pop hl + pop de + jr _cputs_loop + _cputs_loop_end: + + call __set_cursor + xor a, a ; return 0 + ret + + _cputs_fast: + call __cputs_pchars + xor a, a ; return 0 + ret + __endasm; +} + +void clrscr(void) __naked +{ + __asm + ld a, #0x0F + jp _clrscr_attr + __endasm; +} + +void clrscr_attr(uint8_t attr) __naked +{ + (void)attr; + __asm + push ix + ;; SDCC __sdcccall(1): uint8_t 1st arg is in A. + ld b, a ; B = attribute (mode-fill colour) + ld de, #0x0000 ; top-left + ld hl, #0x2050 ; H=32 rows, L=80 cols + ld a, #0x20 ; space fill + ld c, #0x56 ; ESTEX CLEAR + rst #0x10 + pop ix + ret + __endasm; +} + +void gotoxy(uint8_t x, uint8_t y) __naked +{ + (void)x; (void)y; + __asm + ;; __sdcccall(1) 2 uint8 args: x in A, y in L. + ;; ESTEX LOCATE ($52) wants: D = row, E = col. + push ix + ld d, l ; D = row (y) + ld e, a ; E = col (x) + ld c, #0x52 + rst #0x10 + pop ix + ret + __endasm; +} + +uint8_t wherex(void) __naked +{ + __asm + ;; ESTEX CURSOR ($53): D = row, E = col. Return col in DE. + push ix + ld c, #0x53 + rst #0x10 + pop ix + ld a, e + ret + __endasm; +} + +uint8_t wherey(void) __naked +{ + __asm + push ix + ld c, #0x53 + rst #0x10 + pop ix + ld a, d + ret + __endasm; +} + +uint16_t wherexy(void) __naked +{ + __asm + ;; ESTEX CURSOR ($53): D = row, E = col. Return col in DE. + push ix + ld c, #0x53 + rst #0x10 + pop ix + ret + __endasm; +} + + +/* wrchar(uint8_t x, uint8_t y, char ch, uint8_t attr) + * + * SDCC __sdcccall(1): x in A, y in L (2 uint8 → A, L); ch and attr + * packed and pushed on the stack as a single 16-bit value (caller does + * `ld hl, #(attr<<8)|ch; push hl`). Layout after CALL: + * [SP+0..1] = return address + * [SP+2] = ch (low half of pushed pair) + * [SP+3] = attr (high half) + * Void return → callee-pops the 2 stack-arg bytes via `pop bc` + jp (iy). + */ +void wrchar(uint8_t x, uint8_t y, char ch, uint8_t attr) __naked +{ + (void)x; (void)y; (void)ch; (void)attr; + __asm + pop iy ; return address + pop bc ; C = ch, B = attr + push ix + ld d, l ; D = row (y) + ld e, a ; E = col (x) + ld a, c ; A = ch + ld c, #0x58 ; ESTEX WRCHAR + rst #0x10 + pop ix + jp (iy) + __endasm; +} + +/* rdchar(int x, int y) → (attr << 8) | ch */ +uint16_t rdchar(uint8_t x, uint8_t y) __naked +{ + (void)x; (void)y; + __asm + push ix + ld d, l ; D = row + ld e, a ; E = col + ld c, #0x57 ; ESTEX RDCHAR + rst #0x10 + ;; A = ch, B = attr + ld d, b ; high byte → attr + ld e, a ; low byte → ch + pop ix + ret + __endasm; +} + +/* Public text-mode video API — defined here so it's pulled in with the + * rest of conio. The raw setters/getters live in videomode_raw.c so + * pure graphics programs can pick them up without conio's other + * dependencies. */ +extern uint8_t _videomode_raw_get(void); +extern int _videomode_raw_set(uint8_t mode); + +uint8_t get_videotextmode(void) +{ + return _videomode_raw_get(); +} + +int set_videotextmode(uint8_t mode) +{ + /* Refuse anything that isn't a known text mode — otherwise a stray + * GFX_MODE_* value could swap the screen out from under text I/O. */ + if (mode != TEXT_MODE_40x32 && mode != TEXT_MODE_80x32) { + errno = EINVAL; + return -1; + } + return _videomode_raw_set(mode); +} + +/* ---- text attribute state ---------------------------------------- + * g_text_attr is owned by conio.c now (Turbo-C-style: stdio putchar/puts + * are fast and attribute-free; only conio's putch/cputs/cprintf apply + * the attribute). Default = 0x0F (bright white on black). + * + * 0x00..0xFF — real attribute (4-bit FG | 3-bit BG | 1-bit blink) + * KEEP_EXIST_ATTR (0xFFFF) — putch/cputs fall back to fast no-attr path */ +int16_t g_text_attr = 0x0F; + +int16_t set_text_attr(int16_t attr) +{ + int16_t prev = g_text_attr; + g_text_attr = attr; + return prev; +} + +int16_t get_text_attr(void) +{ + return g_text_attr; +} + +/* ---- Turbo-C-style palette helpers -------------------------------- + * textcolor / textbackground touch only their nibble; the other nibble + * (and the blink bit) are preserved. textattr replaces the whole byte. */ + +void textcolor(uint8_t fg) +{ + /* If we were KEEP_EXIST_ATTR, switch to a real attr first. */ + uint8_t cur = ((uint16_t)g_text_attr > 0xFF) ? 0x00 : (uint8_t)g_text_attr; + g_text_attr = (int16_t)((cur & 0xF0) | (fg & 0x0F)); +} + +void textbackground(uint8_t bg) +{ + uint8_t cur = ((uint16_t)g_text_attr > 0xFF) ? 0x00 : (uint8_t)g_text_attr; + /* Background uses 3 bits (4..6); preserve blink (bit 7) too. */ + g_text_attr = (int16_t)((cur & 0x8F) | ((bg & 0x07) << 4)); +} + +void textattr(uint8_t attr) +{ + g_text_attr = (int16_t)attr; +} + +/* ---- Solid-C compatibility ---------------------------------------- */ + +/* Direct port I/O. Z80 has 256 IN/OUT ports; we wrap the Z80 IN/OUT + * opcodes with a stable C API. Names match Solid-C / MS-DOS Turbo-C. */ +uint8_t z80_inp(uint8_t port) __naked +{ + (void)port; + __asm + ;; SDCC __sdcccall(1): single uint8_t arg in A; uint8_t return in A. + ld c, a + in a, (c) + ret + __endasm; +} + +void z80_outp(uint8_t port, uint8_t value) __naked +{ + (void)port; (void)value; + __asm + ;; __sdcccall(1): 2 uint8 args → arg1 in A, arg2 in L. + ld c, a ; C = port + out (c), l ; out (port), value + ret + __endasm; +} + +/* cgets — Solid-C / Turbo-C style line input. + * buf[0] = max characters (in) + * buf[1] = actual count (out) + * buf[2..] = chars + NUL + * Returns &buf[2]. */ +char *cgets(char *buf) +{ + uint8_t maxlen = (uint8_t)buf[0]; + uint8_t n = 0; + while (n < maxlen) { + int ch = getche(); + if (ch == '\n' || ch == '\r') { + putch('\r'); putch('\n'); + break; + } + if (ch == 8) { /* backspace */ + if (n > 0) { n--; } + continue; + } + buf[2 + n] = (char)ch; + n++; + } + buf[1] = (char)n; + buf[2 + n] = 0; + return &buf[2]; +} diff --git a/libc/io/cprintf.c b/libc/io/cprintf.c new file mode 100644 index 0000000..52a63c8 --- /dev/null +++ b/libc/io/cprintf.c @@ -0,0 +1,28 @@ +/* + * cprintf — printf for the conio output set. Formats into a static + * buffer with vsprintf (from SDCC's stdlib), then emits via cputs which + * applies the current text attribute per character. + * + * No '\n' to CR LF translation — Turbo-C convention: callers write + * "\r\n" explicitly in the format string for line breaks. + * + * Not reentrant (single static buffer) but Z80 single-threaded is fine. + */ + +#include +#include +#include + +#define CPRINTF_BUF_SIZE 256 + +static char cp_buf[CPRINTF_BUF_SIZE]; + +int cprintf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int n = vsprintf(cp_buf, fmt, ap); + va_end(ap); + cputs(cp_buf); + return n; +} diff --git a/libc/io/dir.c b/libc/io/dir.c new file mode 100644 index 0000000..058d255 --- /dev/null +++ b/libc/io/dir.c @@ -0,0 +1,68 @@ +/* + * ffirst / fnext — directory iteration via ESTEX $19 / $1A. + * + * ESTEX F_FIRST ($19): + * HL = pattern, DE = buffer, A = attribute mask, B = format (0/1) + * CF = err / A = error code + * ESTEX F_NEXT ($1A): + * DE = same buffer + * CF = err / A = error code + * + * We always use format B=1 — 256-byte buffer with NUL-terminated DOS + * "name.ext" name at offset 33. + * + * ABI note: ffirst takes uint8_t as its 3rd arg. SDCC pushes a *single* + * byte for that (via `push af; inc sp`), not two — so the callee must + * pop ret-addr (2 bytes) AND consume the attr byte (`inc sp`) on the way + * out. Naively `pop bc` would over-eat into the caller's frame. + */ + +#include + +int ffirst(const char *pattern, ffblk_t *buf, uint8_t attrib) __naked +{ + (void)pattern; (void)buf; (void)attrib; + __asm + ;; On entry: HL = pattern, DE = buf, [SP+0..1] = ret, [SP+2] = attr. + ld iy, #2 + add iy, sp + ld a, 0 (iy) ; A = attr (read without disturbing SP) + + push ix + ld bc, #0x0119 ; ESTEX F_FIRST; format: 1 = DOS "name.ext" layout + rst #0x10 + pop ix + + pop hl ; HL = return address + inc sp ; consume the 1-byte attr + + jr c, _ff_err + ld de, #0 + jp (hl) + + _ff_err: + call __errno_set + ld de, #-1 + jp (hl) + __endasm; +} + +int fnext(ffblk_t *buf) __naked +{ + (void)buf; + __asm + ;; HL = buf on entry; ESTEX F_NEXT wants buf in DE. + push ix + ex de, hl + ld c, #0x1A ; ESTEX F_NEXT + rst #0x10 + pop ix + jr c, _fnext_err + ld de, #0 + ret + _fnext_err: + call __errno_set + ld de, #-1 + ret + __endasm; +} diff --git a/libc/io/env.c b/libc/io/env.c new file mode 100644 index 0000000..5c1b18c --- /dev/null +++ b/libc/io/env.c @@ -0,0 +1,93 @@ +/* + * getenv / putenv via ESTEX ENVIRON ($46). + * + * ESTEX $46 subfn 1 (getenv): + * in: HL = name (ASCIIZ), DE = output buffer (caller-owned) + * out: CF=0 + A != 0 → variable found, value written into [DE..end-1] + * CF=0 + A == 0 → variable not present (note: this is the + * opposite of what DiskSyscalls.txt v1.6 docs + * claim — verified empirically and against + * solid-c's IO.ASM:763-766 implementation) + * CF=1 → error, A = code + * DE on exit points at one past the last byte written + * + * ESTEX $46 subfn 2 (putenv): + * in: HL = "NAME=value" (NUL-terminated) + * out: CF=1 / A = error code on failure + * + * We hand back a pointer into a private 128-byte buffer for getenv(). + * Caller must copy the bytes before the next getenv() call if they + * need to outlive it. + */ + +#include +#include + +static char env_buf[128]; + +char *getenv(const char *name) __naked +{ + (void)name; + __asm + push ix + ;; HL = name on entry; we need to also load DE = env_buf. + ld de, #_env_buf + ld bc, #0x0146 ; ESTEX ENVIRON; subfn: getenv + rst #0x10 + pop ix + jr c, _getenv_err + or a, a + jr Z, _getenv_miss + ld de, #_env_buf + ret + _getenv_err: + call __errno_set + _getenv_miss: + ld de, #0 + ret + __endasm; +} + +int putenv(const char *namevalue) __naked +{ + (void)namevalue; + __asm + push ix + ld bc, #0x0246 ; ESTEX ENVIRON; subfn: setenv + rst #0x10 + pop ix + jr c, _putenv_err + ld de, #0 + ret + _putenv_err: + call __errno_set + ld de, #-1 + ret + __endasm; +} + +/* ESTEX $46 subfn 0 (sysenv): + * in: HL = caller-owned buffer + * out: caller's buffer is filled with one NUL-terminated "NAME=value" + * per env var, then a trailing extra NUL marks the end: + * "PATH=...\0SOLID=H\0\0" + * return: buf on success, -1 on error (errno set). + * Buffer must be large enough for the whole environment. + */ +char *sysenv(char *buf) __naked +{ + (void)buf; + __asm + push ix + push hl ; stash buffer pointer (= return value) + ld bc, #0x0046 ; ESTEX ENVIRON; subfn 0 = sysenv + rst #0x10 + pop de ; DE = buffer pointer + pop ix + ret nc ; success: DE already has buf + ;; CF=1 → A = ESTEX error code. + call __errno_set + ld de, #-1 + ret + __endasm; +} diff --git a/libc/io/errno.c b/libc/io/errno.c new file mode 100644 index 0000000..399683a --- /dev/null +++ b/libc/io/errno.c @@ -0,0 +1,77 @@ +/* + * errno.c — strerror / perror over the SDCC-provided `errno` global. + * + * The message table mirrors the one in solid-c's IO.ASM (we kept the + * English wording for grep-ability). ESTEX returns codes 0..32 in the + * meaningful range; anything beyond gets "Unknown error". + * + * Note: we deliberately do NOT define `_errno` here — SDCC's + * z80.lib/errno.rel provides it (a single int in _DATA), and our libc + * wrappers (read.c, open.c, etc.) just assign to `errno`. This + * removes the "multiple definition of _errno" link warning. + */ + +#include +#include +#include + +/* + * Stored verbatim — pointers in the lookup table cost 2 bytes each plus + * the message bytes themselves. Sentinel "" entries pad out gaps so + * indexing stays direct. + */ +static const char *const messages[] = { + /* 0 */ "No error", + /* 1 */ "Invalid function", + /* 2 */ "Invalid drive number", + /* 3 */ "File not found", + /* 4 */ "Path not found", + /* 5 */ "Invalid handle", + /* 6 */ "Too many open files", + /* 7 */ "File already exists", + /* 8 */ "File is read-only", + /* 9 */ "Root directory overflow", + /* 10 */ "No free space", + /* 11 */ "Directory not empty", + /* 12 */ "Can't delete current directory", + /* 13 */ "Invalid media", + /* 14 */ "Unknown operation", + /* 15 */ "Directory exists", + /* 16 */ "Invalid filename", + /* 17 */ "Invalid EXE file", + /* 18 */ "Not supported EXE file", + /* 19 */ "Access denied", + /* 20 */ "Device not ready", + /* 21 */ "Seek error", + /* 22 */ "Sector not found", + /* 23 */ "CRC error", + /* 24 */ "Write protect", + /* 25 */ "Read error", + /* 26 */ "Write error", + /* 27 */ "Drive failure", + /* 28 */ "RESERVED", + /* 29 */ "RESERVED", + /* 30 */ "Out of memory", + /* 31 */ "Invalid memory block", + /* 32 */ "Unknown error", +}; + +const int ESTEX_MAX_ERR = sizeof(messages) / sizeof(messages[0]) - 1; + +const char *strerror(int err) +{ + if (err < 0 || err > ESTEX_MAX_ERR) { + err = EUNKERR; + } + return messages[err]; +} + +void perror(const char *prefix) +{ + if (prefix && *prefix) { + fputs(prefix, stderr); + fputs(": ", stderr); + } + fputs(strerror(errno), stderr); + fputs("\r\n", stderr); +} diff --git a/libc/io/fsdir.c b/libc/io/fsdir.c new file mode 100644 index 0000000..b3edd15 --- /dev/null +++ b/libc/io/fsdir.c @@ -0,0 +1,88 @@ +/* + * fsdir.c — directory operations via ESTEX: + * $1B MKDIR — create directory (HL = path) + * $1C RMDIR — remove empty directory (HL = path) + * $1D CHDIR — change current directory (HL = path) + * $1E CURDIR — read current directory path (HL = 256-byte buffer) + * + * All four return CF=1 + A=error on failure. We surface that as errno + * with a -1 (or NULL for getcwd) return value, matching POSIX. + */ + +#include +#include + +int mkdir(const char *path) __naked +{ + (void)path; + __asm + push ix + ld c, #0x1B ; ESTEX MKDIR; HL already = path + rst #0x10 + pop ix + jr c, _mk_err + ld de, #0 + ret + _mk_err: + call __errno_set + ld de, #-1 + ret + __endasm; +} + +int rmdir(const char *path) __naked +{ + (void)path; + __asm + push ix + ld c, #0x1C ; ESTEX RMDIR; HL already = path + rst #0x10 + pop ix + jr c, _rm_err + ld de, #0 + ret + _rm_err: + call __errno_set + ld de, #-1 + ret + __endasm; +} + +int chdir(const char *path) __naked +{ + (void)path; + __asm + push ix + ld c, #0x1D ; ESTEX CHDIR; HL already = path + rst #0x10 + pop ix + jr c, _cd_err + ld de, #0 + ret + _cd_err: + call __errno_set + ld de, #-1 + ret + __endasm; +} + +char *getcwd(char *buf, size_t size) __naked +{ + (void)buf; (void)size; + __asm + ;; HL = buf, DE = size (ignored — ESTEX always wants 256 bytes). + push ix + push hl ; preserve buf across RST + ld c, #0x1E ; ESTEX CURDIR + rst #0x10 + pop hl ; restore buf + pop ix + jr c, _gc_err + ex de, hl ; return buf via DE (SDCC ptr return) + ret + _gc_err: + call __errno_set + ld de, #0 ; NULL on error + ret + __endasm; +} diff --git a/libc/io/lseek.c b/libc/io/lseek.c new file mode 100644 index 0000000..5328dfc --- /dev/null +++ b/libc/io/lseek.c @@ -0,0 +1,71 @@ +/* + * lseek — 32-bit file position via ESTEX MOVE_FP ($15). + * + * ESTEX MOVE_FP: A=handle, B=whence (0=SET, 1=CUR, 2=END), + * HL=offset high16, IX=offset low16 + * → HL:IX = new absolute position, CF=err + * + * SDCC __sdcccall(1) on z80 for `long lseek(int fd, long offset, int whence)`: + * - fd → HL (1st 16-bit arg in register) + * - offset → stack as two 16-bit words (low first, then high) + * - whence → stack (top after offset) + * - 32-bit return: DE = low16, HL = high16 + * - caller-pops (caller-side `pop af; pop af; pop af` after the call) + * + * IX is saved (caller frame pointer). + */ + +#include + +long lseek(int fd, long offset, int whence) __naked +{ + (void)fd; (void)offset; (void)whence; + __asm + push ix ; save caller-side IX + ;; Layout after push: + ;; SP+0..1 = saved IX + ;; SP+2..3 = ret addr + ;; SP+4..5 = offset low16 + ;; SP+6..7 = offset high16 + ;; SP+8..9 = whence + + ld a, l ; A = fd low byte (was in HL) + + ;; Walk through 5 consecutive stack bytes via HL — cheaper than + ;; IY-indexed because `ld r,(hl); inc hl` (2B/13T per byte) beats + ;; `ld r, n(iy)` (3B/19T) for sequential reads. + ld hl, #4 + add hl, sp ; HL → offset_low + + ld e, (hl) + inc hl + ld d, (hl) ; DE = offset_low + push de + pop ix ; IX = offset_low + inc hl + ld e, (hl) + inc hl + ld d, (hl) ; DE = offset_high + inc hl + ld b, (hl) ; B = whence (low byte) + ex de, hl ; HL = offset_high (ESTEX wants it here) + + ld c, #0x15 ; ESTEX MOVE_FP + rst #0x10 + jr c, _lseek_err + + ;; Returns HL:IX = new position. Convert to SDCC long return (DE:HL). + push ix + pop de ; DE = low16 (was IX) + ;; HL already has high16 + pop ix ; restore caller-side IX + ret + + _lseek_err: + call __errno_set + ld hl, #0xFFFF + ld de, #0xFFFF ; long -1 + pop ix + ret + __endasm; +} diff --git a/libc/io/mouse.c b/libc/io/mouse.c new file mode 100644 index 0000000..287c366 --- /dev/null +++ b/libc/io/mouse.c @@ -0,0 +1,305 @@ +/* + * mouse.c — Sprinter mouse driver wrappers (RST 30h). + * + * All calls use the same pattern as ESTEX (push/pop IX around the RST) + * since the driver doesn't promise to preserve registers either. + */ + +#include + +/* Scratch for READ_STATE — RST 30h clobbers HL/DE/A so we can't keep the + * state pointer in HL across the call. Explicit `= 0` so SDCC reserves + * real BSS storage — see memory/sdcc_static_storage_gotcha.md. */ +static uint16_t mb_x = 0, mb_y = 0; +static uint8_t mb_buttons = 0; + +int mouse_init(void) __naked +{ + __asm + push ix + ld c, #0x00 ; INITIALIZATION + rst #0x30 ; MOUSE + pop ix + jr c, _mi_err + ld de, #0 + ret + _mi_err: + ld de, #-1 + ret + __endasm; +} + +void mouse_show(void) __naked +{ + __asm + push ix + ld c, #0x01 ; SHOW MOUSE CURSOR + rst #0x30 ; MOUSE + pop ix + ret + __endasm; +} + +void mouse_hide(void) __naked +{ + __asm + push ix + ld c, #0x02 ; HIDE MOUSE CURSOR + rst #0x30 ; MOUSE + pop ix + ret + __endasm; +} + +void mouse_refresh(void) __naked +{ + __asm + push ix + ld c, #0x83 ; MOUSE REFRESH + rst #0x30 ; MOUSE + pop ix + ret + __endasm; +} + +void mouse_read(mouse_state_t *st) __naked +{ + (void)st; + __asm + ;; HL = state ptr on entry. + push ix + push hl ; stash ptr across RST + ld c, #0x03 ; READ MOUSE STATE + rst #0x30 ; MOUSE + ;; Returns: A=buttons, HL=x, DE=y (CF=err but we ignore here) + ld (_mb_x), hl + ld (_mb_y), de + ld (_mb_buttons), a + pop hl ; restore state ptr + pop ix + + ;; Copy scratch → *st. Struct layout: x(2), y(2), buttons(1). + ld de, (_mb_x) + ld (hl), e + inc hl + ld (hl), d + inc hl + ld de, (_mb_y) + ld (hl), e + inc hl + ld (hl), d + inc hl + ld a, (_mb_buttons) + ld (hl), a + ret + __endasm; +} + +void mouse_goto(int x, int y) __naked +{ + (void)x; (void)y; + __asm + ;; HL = x, DE = y. + push ix + ld c, #0x04 ; GOTO MOUSE CURSOR + rst #0x30 ; MOUSE + pop ix + ret + __endasm; +} + +void mouse_bounds_x(int xmin, int xmax) __naked +{ + (void)xmin; (void)xmax; + __asm + ;; HL = xmin, DE = xmax. + push ix + ld c, #0x08 ; HORZ BOUNDS + rst #0x30 ; MOUSE + pop ix + ret + __endasm; +} + +void mouse_bounds_y(int ymin, int ymax) __naked +{ + (void)ymin; (void)ymax; + __asm + ;; HL = ymin, DE = ymax. + push ix + ld c, #0x07 ; VERT BOUNDS + rst #0x30 ; MOUSE + pop ix + ret + __endasm; +} + +/* ---- $09 LOAD CURSOR + $0B RETURN CURSOR ---------------------- */ +/* Scratch for the IX-passing convention — RST 30h takes the bitmap + * pointer in IX, so we have to set it up explicitly. + * + * Initialised to 0 so SDCC reserves real BSS storage — uninitialised + * `static uint8_t` declarations can coalesce to a single address and + * stomp on each other. See memory/sdcc_static_storage_gotcha.md. */ +static uint16_t mc_image = 0; +static uint8_t mc_width = 0; +static uint8_t mc_height = 0; +static uint8_t mc_hot_x = 0; +static uint8_t mc_hot_y = 0; +/* Saved struct pointer for mouse_get_cursor. SDCC __sdcccall(1) passes + * `c` in HL, then stashes it in DE around the inline asm. Our asm + * clobbers DE (driver returns hot_y/hot_x in D/E) so the post-asm + * `c->width = ...` writes would otherwise land at a garbage address. + * We park the pointer in BSS instead so SDCC re-fetches it from + * memory after the asm. */ +static mouse_cursor_t *mc_dest = 0; + +void mouse_load_cursor(const mouse_cursor_t *c) +{ + /* Copy fields out of the C struct into our scratch globals so the + * asm side has well-known names. */ + mc_image = (uint16_t)(uintptr_t)c->image; + mc_width = c->width; + mc_height = c->height; + mc_hot_x = c->hot_x; + mc_hot_y = c->hot_y; + __asm + push ix + ld ix, (_mc_image) + ld a, (_mc_height) + ld h, a + ld a, (_mc_width) + ld l, a + ld a, (_mc_hot_y) + ld d, a + ld a, (_mc_hot_x) + ld e, a + ld b, #0 + ld c, #0x09 ; LOAD MOUSE CURSOR + rst #0x30 ; MOUSE + pop ix + __endasm; +} + +void mouse_get_cursor(mouse_cursor_t *c) +{ + mc_dest = c; /* park ptr in BSS */ + mc_image = (uint16_t)(uintptr_t)c->image; + __asm + push ix + ld ix, (_mc_image) ; IX = bitmap buffer from caller + ld c, #0x0B ; RETURN CURSOR + rst #0x30 ; mouse driver, NOT ESTEX + ;; Returns: H=height, L=width, D=hot_y, E=hot_x. + ld a, h + ld (_mc_height), a + ld a, l + ld (_mc_width), a + ld a, d + ld (_mc_hot_y), a + ld a, e + ld (_mc_hot_x), a + pop ix + __endasm; + /* Re-fetch the struct pointer from BSS — `c` (kept in DE by SDCC + * around the inline asm) was clobbered by the RST 30h above. */ + mouse_cursor_t *p = mc_dest; + p->width = mc_width; + p->height = mc_height; + p->hot_x = mc_hot_x; + p->hot_y = mc_hot_y; +} + +/* ---- $0E / $0F SENSITIVITY ------------------------------------ */ +/* GET returns H=vert, L=horz in HL. We expose the two halves as + * separate getters so the simple "uint8_t" return ABI works cleanly. */ + +static int ms_query(void) __naked +{ + __asm + push ix + ld c, #0x0E ; GET SENSITIVITY + rst #0x30 ; MOUSE + ld d, h + ld e, l + pop ix + ret + __endasm; +} + +uint8_t mouse_get_sensitivity_x(void) +{ + return (uint8_t)(ms_query() & 0xFF); /* E = horz */ +} + +uint8_t mouse_get_sensitivity_y(void) +{ + return (uint8_t)(ms_query() >> 8); /* D = vert */ +} + +void mouse_set_sensitivity(uint8_t horz, uint8_t vert) __naked +{ + (void)horz; (void)vert; + /* Pack into HL: H=vert, L=horz. */ + __asm + push ix + ld h, l + ld l, a + ld c, #0x0F ; SET SENSITIVITY + rst #0x30 ; MOUSE + pop ix + __endasm; +} + +/* ---- $81 CHANGE VIDEO MODE ------------------------------------ */ +/* SDCC __sdcccall(1): single uint8_t arg arrives in A. */ +void mouse_video_mode_changed(uint8_t mode) __naked +{ + (void)mode; + __asm + push ix + ;; A already holds the mode byte (from SDCC ABI). + ld c, #0x81 ; CHANGE VIDEO MODE + rst #0x30 ; MOUSE + pop ix + ret + __endasm; +} + +/* CURSOR_TEXT_MODES ($0A): + * B = 0 + * H = AND symbol mask L = XOR symbol mask + * D = AND attribute mask E = XOR attribute mask + * + * SDCC __sdcccall(1) gives us: + * sym_and in L (low byte of HL arg) + * sym_xor in E (low byte of DE arg) + * attr_and at [SP+2] + * attr_xor at [SP+3] + */ +void mouse_text_cursor(uint8_t sym_and, uint8_t sym_xor, + uint8_t attr_and, uint8_t attr_xor) __naked +{ + (void)sym_and; (void)sym_xor; (void)attr_and; (void)attr_xor; + __asm + ;; SDCC __sdcccall(1) for 4×uint8_t args: + ;; arg1 sym_and → A + ;; arg2 sym_xor → L + ;; arg3 attr_and → stack low byte (packed into HL.L on caller, push HL) + ;; arg4 attr_xor → stack high byte (HL.H pushed by caller) + pop iy ; return address + pop bc ; C = attr_and (low), B = attr_xor (high) + + push ix + ;; Target: H=sym_and, L=sym_xor, D=attr_and, E=attr_xor, B=0 + ld h, a ; H = sym_and (from A) + ; L already holds sym_xor + ld d, c ; D = attr_and + ld e, b ; E = attr_xor + ld b, #0 + ld c, #0x0A ; CURSOR TEXT MODE + rst #0x30 ; MOUSE + pop ix + jp (iy) + __endasm; +} diff --git a/libc/io/open.c b/libc/io/open.c new file mode 100644 index 0000000..2babaf3 --- /dev/null +++ b/libc/io/open.c @@ -0,0 +1,158 @@ +/* + * open / creat / close — ESTEX file-handle primitives. + * + * The interesting part is the open() flag state machine. We expose POSIX + * flag bits (O_RDONLY/O_WRONLY/O_RDWR + O_CREAT/O_EXCL/O_TRUNC/O_APPEND) + * and dispatch onto the three ESTEX entry points: + * + * $11 OPEN — open existing file + * $0A CREATE — create (truncate if exists), return new handle + * $0B CREATE_NEW — create only if file does not exist + * + * Three private __naked wrappers do the raw RST 10h calls; the public + * open() / creat() / close() are plain C orchestrators. + * + * IX is saved across every RST 10h. Failures set errno and return -1. + */ + +#include +#include +#include + +/* ---- raw ESTEX wrappers ---------------------------------------------- */ + +/* ESTEX $11 OPEN: A=mode (1=R, 2=W, 0=R/W), HL=path → A=handle, CF=err. */ +static int _estex_open_raw(const char *path, int posix_mode) __naked +{ + (void)path; (void)posix_mode; + __asm + push ix + ;; HL = path, DE = posix_mode. Translate to ESTEX numbering. + ld a, e + and a, #0x03 + ld c, #1 + or a, a + jr Z, _oopen_real + ld c, #2 + dec a + jr Z, _oopen_real + ld c, #0 + _oopen_real: + ld a, c + ld c, #0x11 ; ESTEX OPEN + rst #0x10 + pop ix + jr c, _oopen_err + ld e, a + ld d, #0 + ret + _oopen_err: + call __errno_set + ld de, #-1 + ret + __endasm; +} + +/* ESTEX $0A CREATE: A=attr, HL=path → A=handle, CF=err. + * Truncates an existing file. */ +static int _estex_create_raw(const char *path) __naked +{ + (void)path; + __asm + push ix + xor a, a ; A = 0 (normal attribute) + ld c, #0x0A + rst #0x10 + pop ix + jr c, _ocreat_err + ld e, a + ld d, #0 + ret + _ocreat_err: + call __errno_set + ld de, #-1 + ret + __endasm; +} + +/* ESTEX $0B CREATE_NEW: A=attr, HL=path → A=handle, CF=err. + * Fails (errno=EEXIST) if file already exists. */ +static int _estex_create_new_raw(const char *path) __naked +{ + (void)path; + __asm + push ix + xor a, a + ld c, #0x0B + rst #0x10 + pop ix + jr c, _ocreatn_err + ld e, a + ld d, #0 + ret + _ocreatn_err: + call __errno_set + ld de, #-1 + ret + __endasm; +} + +/* ---- public surface --------------------------------------------------- */ + +int open(const char *path, int flags) +{ + int fd; + + if (flags & O_CREAT) { + if (flags & O_EXCL) { + /* Must not already exist. */ + fd = _estex_create_new_raw(path); + } else if (flags & O_TRUNC) { + /* Always create or truncate. */ + fd = _estex_create_raw(path); + } else { + /* Open if it exists, otherwise create. */ + fd = _estex_open_raw(path, flags); + if (fd < 0 && errno == ENOENT) { + fd = _estex_create_raw(path); + } + } + } else { + fd = _estex_open_raw(path, flags); + } + + if (fd < 0) { + return -1; + } + + if (flags & O_APPEND) { + /* Position at end of file so future writes append. */ + (void)lseek(fd, 0L, SEEK_END); + } + return fd; +} + +int creat(const char *path, int mode) +{ + (void)mode; /* Sprinter has no per-file permission bits */ + return open(path, O_WRONLY | O_CREAT | O_TRUNC); +} + +int close(int fd) __naked +{ + (void)fd; + __asm + push ix + ld a, l + ld c, #0x12 + rst #0x10 + pop ix + jr c, _oclose_err + ld de, #0 + ret + _oclose_err: + call __errno_set + ld de, #-1 + ret + __endasm; +} diff --git a/libc/io/posix_time.c b/libc/io/posix_time.c new file mode 100644 index 0000000..f1696bf --- /dev/null +++ b/libc/io/posix_time.c @@ -0,0 +1,143 @@ +/* + * posix_time.c — minimal POSIX implementation on top of + * getdatetime() (ESTEX SYSTIME $21). + * + * SDCC's z80.lib bundles time/localtime/mktime AND _RtcRead in a + * single time.rel module, so the user can't override _RtcRead from a + * separate object — overriding triggers a "multiple definition" + * linker error. We sidestep that by implementing the whole POSIX time + * API ourselves; the linker then never pulls SDCC's time.rel. + * + * The epoch is Unix (1970-01-01 00:00:00). No timezone support — + * gmtime and localtime are identical. No DST. + */ + +#include +#include + +static const unsigned char mdays[12] = { + 31,28,31,30,31,30,31,31,30,31,30,31 +}; + +static const char *const dnames[7] = { + "Sun","Mon","Tue","Wed","Thu","Fri","Sat" +}; +static const char *const mnames[12] = { + "Jan","Feb","Mar","Apr","May","Jun", + "Jul","Aug","Sep","Oct","Nov","Dec" +}; + +static int is_leap(unsigned int y) +{ + return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0); +} + +/* Days elapsed from 1970-01-01 to (y, 1, 1). */ +static unsigned long year_days(unsigned int y) +{ + unsigned long d = 0; + for (unsigned int i = 1970; i < y; i++) + d += is_leap(i) ? 366 : 365; + return d; +} + +/* Days from Jan 1 to month start (1-based month input). */ +static unsigned int month_days(unsigned int y, unsigned int m) +{ + unsigned int d = 0; + for (unsigned int i = 0; i < m - 1; i++) d += mdays[i]; + if (m > 2 && is_leap(y)) d++; + return d; +} + +time_t time(time_t *t) +{ + datetime_t dt; + getdatetime(&dt); + unsigned long days = year_days(dt.year) + + month_days(dt.year, dt.month) + + (dt.day - 1); + time_t epoch = days * 86400UL + + (unsigned long)dt.hour * 3600UL + + (unsigned long)dt.minute * 60UL + + dt.second; + if (t) *t = epoch; + return epoch; +} + +/* localtime and gmtime share one static buffer — caller copies if + * needed across further calls (matches POSIX behaviour). */ +static struct tm tm_buf; + +struct tm *gmtime(time_t *timep) +{ + unsigned long sec = *timep; + tm_buf.tm_sec = (unsigned char)(sec % 60); sec /= 60; + tm_buf.tm_min = (unsigned char)(sec % 60); sec /= 60; + tm_buf.tm_hour = (unsigned char)(sec % 24); sec /= 24; + /* sec is now days since 1970-01-01 (Thursday). */ + tm_buf.tm_wday = (unsigned char)((4 + sec) % 7); + /* find year */ + unsigned int y = 1970; + unsigned long days = sec; + while (days >= (unsigned long)(is_leap(y) ? 366 : 365)) { + days -= is_leap(y) ? 366 : 365; + y++; + } + tm_buf.tm_year = (int)y - 1900; + tm_buf.tm_yday = (int)days; + /* find month/day */ + unsigned int m = 0; + while (m < 12) { + unsigned int dim = mdays[m] + ((m == 1) && is_leap(y) ? 1u : 0u); + if (days < dim) break; + days -= dim; + m++; + } + tm_buf.tm_mon = (unsigned char)m; + tm_buf.tm_mday = (unsigned char)(days + 1); + tm_buf.tm_isdst = 0; + tm_buf.tm_hundredth = 0; + return &tm_buf; +} + +struct tm *localtime(time_t *timep) +{ + return gmtime(timep); /* no timezone */ +} + +time_t mktime(struct tm *tm) +{ + unsigned int y = (unsigned int)(tm->tm_year + 1900); + unsigned long days = year_days(y) + + month_days(y, (unsigned int)tm->tm_mon + 1) + + (unsigned int)(tm->tm_mday - 1); + time_t epoch = days * 86400UL + + (unsigned long)tm->tm_hour * 3600UL + + (unsigned long)tm->tm_min * 60UL + + tm->tm_sec; + /* Backfill wday/yday so callers can inspect them. */ + tm->tm_wday = (unsigned char)((4 + days) % 7); + tm->tm_yday = (int)month_days(y, (unsigned int)tm->tm_mon + 1) + + (tm->tm_mday - 1); + return epoch; +} + +/* "Day Mon DD HH:MM:SS YYYY\n" — 25 chars + NUL. */ +static char asctime_buf[26]; + +char *asctime(struct tm *tm) +{ + sprintf(asctime_buf, "%s %s %2d %02d:%02d:%02d %d\n", + dnames[tm->tm_wday % 7], + mnames[tm->tm_mon % 12], + tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec, + tm->tm_year + 1900); + return asctime_buf; +} + +char *ctime(time_t *timep) +{ + return asctime(localtime(timep)); +} diff --git a/libc/io/read.c b/libc/io/read.c new file mode 100644 index 0000000..85d2dd2 --- /dev/null +++ b/libc/io/read.c @@ -0,0 +1,67 @@ +/* + * read / write — bulk transfer through ESTEX file handles. + * + * ESTEX READ ($13) / WRITE ($14): + * A = handle, HL = buffer, DE = byte count + * → DE = bytes actually transferred, CF = err with code in A. + * + * SDCC __sdcccall(1) for 3-arg int functions uses callee-pops for the + * stack-passed argument; this implementation mirrors the pattern used + * by SDCC's own z80.lib _memset. + * + * On error: sets errno, returns -1. + */ + +#include + +int read(int fd, void *buf, size_t n) __naked +{ + (void)fd; (void)buf; (void)n; + __asm + pop iy ; IY = return address + pop bc ; BC = n (stack arg) + ld a, l ; A = handle + ex de, hl ; HL = buf + ld d, b + ld e, c ; DE = n + + push ix + push iy ; preserve return addr across RST + ld c, #0x13 ; ESTEX READ + rst #0x10 + pop iy + pop ix + jr c, _read_err + ;; DE already holds count read. + jp (iy) + _read_err: + call __errno_set + ld de, #-1 + jp (iy) + __endasm; +} + +int write(int fd, const void *buf, size_t n) __naked +{ + (void)fd; (void)buf; (void)n; + __asm + pop iy + pop bc + ld a, l + ex de, hl + ld d, b + ld e, c + push ix + push iy + ld c, #0x14 + rst #0x10 + pop iy + pop ix + jr c, _write_err + jp (iy) + _write_err: + call __errno_set + ld de, #-1 + jp (iy) + __endasm; +} diff --git a/libc/io/sleep.c b/libc/io/sleep.c new file mode 100644 index 0000000..a50da39 --- /dev/null +++ b/libc/io/sleep.c @@ -0,0 +1,30 @@ +/* + * sleep — block for N seconds using the 50 Hz frame interrupt. + * + * Sprinter ISR fires 50 times per second. `halt` parks the CPU until + * the next IRQ, so 50 halts = ~1 second of wall clock. This is the + * same trick solid-c uses in IO.ASM:285. + * + * Note: requires interrupts to be enabled (they are by default — ESTEX + * sets up IM 1 with the frame ISR before our program runs). + */ + +#include + +void sleep(unsigned int seconds) __naked +{ + (void)seconds; + __asm + inter: + ;; HL = seconds on entry (SDCC single int arg). + ld a, h + or a, l + ret Z ; sleep(0) — return immediately + ld b, #50 ; 50 halts per second (50 Hz interrupt) + inner: + halt + djnz inner + dec hl + jr inter + __endasm; +} diff --git a/libc/io/solid_compat.c b/libc/io/solid_compat.c new file mode 100644 index 0000000..c17fcdb --- /dev/null +++ b/libc/io/solid_compat.c @@ -0,0 +1,29 @@ +/* + * solid_compat.c — Solid-C compatibility helpers that need real code + * (rather than just header macros). + */ + +#include +#include + +char *strlwr(char *s) +{ + char *p = s; + while (*p) { + if (*p >= 'A' && *p <= 'Z') *p += 'a' - 'A'; + p++; + } + return s; +} + +char *strupr(char *s) +{ + char *p = s; + while (*p) { + if (*p >= 'a' && *p <= 'z') *p -= 'a' - 'A'; + p++; + } + return s; +} + +/* div() comes from SDCC's z80.lib. */ diff --git a/libc/io/stat.c b/libc/io/stat.c new file mode 100644 index 0000000..83b083b --- /dev/null +++ b/libc/io/stat.c @@ -0,0 +1,190 @@ +/* + * stat.c — POSIX stat() and fstat() over ESTEX metadata. + * + * fstat(fd, &st) -> ESTEX GET_D_T ($17) for mtime + lseek/SEEK_END + * for size. + * stat(path, &st) -> open(O_RDONLY) + fstat() + close. This works + * for any regular file; directory paths fail at + * open() — F_FIRST-based stat had unreliable + * semantics for exact filenames. + * + * Sprinter / DSS doesn't track POSIX owner/group/inode, so we synth a + * minimal mode (S_IFREG | rw user perm). + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* ESTEX GET_D_T: A=fd, C=$17 → D=day, E=month, IX=year, H=hour, L=min, + * B=sec. CF=1 + A=errcode on failure. + * + * Writes directly into *out using `ex (sp), hl` to swap the saved out + * pointer with HL=hour:min after RST — no static scratch needed. + * `out->dow` is left untouched (GET_D_T doesn't return it). */ +static int get_dt_for_handle(int fd, datetime_t *out) __naked +{ + (void)fd; (void)out; + __asm + ;; __sdcccall(1): fd in HL (low byte), out in DE. + push ix ; save caller IX + push de ; stash out pointer + ld a, l ; A = fd + ld c, #0x17 ; ESTEX GET_D_T + rst #0x10 + jr c, _gdt_err + ;; D=day E=month IX=year H=hour L=min B=sec + ex (sp), hl ; TOS<->HL: HL=out, TOS=hour:min + ld (hl), d ; +0 day + inc hl + ld (hl), e ; +1 month + inc hl + push ix ; year onto stack + pop de ; DE = year + ld (hl), e ; +2 year low + inc hl + ld (hl), d ; +3 year high + inc hl + pop de ; D=hour E=min (from earlier ex (sp)) + ld (hl), d ; +4 hour + inc hl + ld (hl), e ; +5 min + inc hl + ld (hl), b ; +6 sec (+7 dow left untouched) + pop ix ; restore caller IX + ld de, #0 + ret + _gdt_err: + pop hl ; discard stashed out pointer + pop ix ; restore caller IX + call __errno_set + ld de, #-1 + ret + __endasm; +} + +int fstat(int fd, struct stat *buf) +{ + /* Size via lseek trick. */ + long cur = lseek(fd, 0L, SEEK_CUR); + if (cur < 0) return -1; + long end = lseek(fd, 0L, SEEK_END); + if (end < 0) return -1; + (void)lseek(fd, cur, SEEK_SET); + buf->st_size = (uint32_t)end; + + /* Date/time via ESTEX. */ + datetime_t ft; + if (get_dt_for_handle(fd, &ft) < 0) return -1; + { + struct tm tm; + tm.tm_sec = ft.second; + tm.tm_min = ft.minute; + tm.tm_hour = ft.hour; + tm.tm_mday = ft.day; + tm.tm_mon = (unsigned char)(ft.month - 1); + tm.tm_year = (int)ft.year - 1900; + tm.tm_isdst = 0; + tm.tm_hundredth = 0; + buf->st_mtime = mktime(&tm); + } + buf->st_mode = S_IFREG | S_IRUSR | S_IWUSR; + return 0; +} + +/* Convert ESTEX DOS-style date+time to time_t epoch (used by stat() + * when going through F_FIRST for directory entries). */ +static time_t dos_to_epoch(uint16_t date, uint16_t dtime) +{ + struct tm tm; + tm.tm_sec = (unsigned char)((dtime & 0x1F) << 1); + tm.tm_min = (unsigned char)((dtime >> 5) & 0x3F); + tm.tm_hour = (unsigned char)((dtime >> 11) & 0x1F); + tm.tm_mday = (unsigned char)(date & 0x1F); + tm.tm_mon = (unsigned char)(((date >> 5) & 0x0F) - 1); + tm.tm_year = (int)((date >> 9) & 0x7F) + 80; /* DOS year base = 1980 */ + tm.tm_isdst = 0; + tm.tm_hundredth = 0; + return mktime(&tm); +} + +/* Returns 1 if path is "." or "..", else 0. Reads at most 3 bytes; + * NULL-safe. ~28 bytes / 34–117 T-states depending on input. */ +static char is_dot_or_dotdot(const char *path) __naked +{ + (void)path; + __asm + ld a, h + or a, l + jr Z, _idd_fail ; NULL → 0 + ld a, (hl) + sub a, #0x2E + jr NZ, _idd_fail ; path[0] != '.' + inc hl + ld a, (hl) + or a, a + jr Z, _idd_ok ; ".\0" → 1 + sub a, #0x2E + jr NZ, _idd_fail ; path[1] not '.' and not '\0' + inc hl + ld a, (hl) + or a, a + jr Z, _idd_ok ; "..\0" → 1 + _idd_fail: + xor a, a + ret + _idd_ok: + ld a, #1 + ret + __endasm; +} + +int stat(const char *path, struct stat *buf) +{ + /* Regular file: open + fstat. */ + int fd = open(path, O_RDONLY); + if (fd >= 0) { + int r = fstat(fd, buf); + close(fd); + return r; + } + int saved = errno; + + /* Try ffirst directly — works for ordinary subdirectories. */ + ffblk_t ffb; + if (ffirst(path, &ffb, FA_DIREC) == 0 && (ffb.found_attr & FA_DIREC)) { + buf->st_size = ffb.size; + buf->st_mtime = dos_to_epoch(ffb.date, ffb.time); + buf->st_mode = S_IFDIR | S_IRWXU; + return 0; + } + + /* Verified 2026-05-29: ESTEX F_FIRST rejects bare "." and ".." with + * EINAME (16), same as open(). But they DO appear in the "*.*" + * directory listing with FA_DIREC. Iterate to find them. */ + if (is_dot_or_dotdot(path)) { + if (ffirst("*.*", &ffb, FA_DIREC) == 0) { + do { + if (strcmp(ffb.found_name, path) == 0) { + buf->st_size = ffb.size; + buf->st_mtime = dos_to_epoch(ffb.date, ffb.time); + buf->st_mode = S_IFDIR | S_IRWXU; + return 0; + } + } while (fnext(&ffb) == 0); + } + /* Last-resort synthetic entry — FS variant didn't expose them. */ + buf->st_mode = S_IFDIR | S_IRWXU; + buf->st_size = 0; + buf->st_mtime = 0; + return 0; + } + + errno = saved; + return -1; +} diff --git a/libc/io/time.c b/libc/io/time.c new file mode 100644 index 0000000..3f63217 --- /dev/null +++ b/libc/io/time.c @@ -0,0 +1,93 @@ +/* + * time.c — getdatetime / setdatetime via ESTEX SYSTIME ($21) / SETTIME ($22). + * + * $21 SYSTIME → D=day E=month IX=year H=hour L=min B=sec C=dow + * $22 SETTIME D=day E=month IX=year H=hour L=min B=sec → CF=err / A=errcode + * + * Struct layout (datetime_t, 8 bytes): + * +0 day, +1 month, +2..3 year, +4 hour, +5 min, +6 sec, +7 dow + * + * Both routines write/read *dt directly — no static scratch. The key + * trick in getdatetime is `ex (sp), hl` after RST: HL holds hour:min, + * stack TOS holds dt — one byte swaps them, then we walk the struct + * via HL. setdatetime uses IX as the struct pointer (re-loaded with + * year just before RST since that's what SETTIME expects). + */ + +#include +#include + +void getdatetime(datetime_t *dt) __naked +{ + (void)dt; + __asm + push ix ; save caller IX (BIOS clobbers it) + push hl ; stash dt across RST (clobbers HL) + ld c, #0x21 ; ESTEX SYSTIME + rst #0x10 + ;; Returns: D=day E=month IX=year H=hour L=min B=sec C=dow + + ;; ex (sp), hl: TOS<->HL. Now HL = dt, TOS = hour:min stash. + ex (sp), hl + ld (hl), d ; +0 day + inc hl + ld (hl), e ; +1 month + inc hl + push ix ; year → stack + pop de ; DE = year + ld (hl), e ; +2 year low + inc hl + ld (hl), d ; +3 year high + inc hl + pop de ; D = hour, E = min (from earlier ex(sp)) + ld (hl), d ; +4 hour + inc hl + ld (hl), e ; +5 min + inc hl + ld (hl), b ; +6 sec + inc hl + ld (hl), c ; +7 dow + pop ix ; restore caller IX + ret + __endasm; +} + + + +int setdatetime(const datetime_t *dt) __naked +{ + (void)dt; + __asm + push ix ; save caller IX + push hl + pop ix ; IX = dt + + ld d, (hl) ; +0 D = day + inc hl + ld e, (hl) ; +1 E = month + inc hl + ld c, (hl) ; +2 year low + inc hl + ld b, (hl) ; +3 year high (BC->IX) + inc hl + push bc + ld b, (hl) ; +4 H = hour + inc hl + ld c, (hl) ; +5 L = min (BC->HL) + inc hl + push bc + ld b, (hl) ; +6 B = sec + pop hl + pop ix + ld c, #0x22 ; ESTEX SETTIME + rst #0x10 + pop ix ; restore caller IX + jr c, _st_err2 + ld de, #0 + ret + _st_err2: + call __errno_set + ld de, #-1 + ret + __endasm; +} diff --git a/libc/io/unlink.c b/libc/io/unlink.c new file mode 100644 index 0000000..0066a1e --- /dev/null +++ b/libc/io/unlink.c @@ -0,0 +1,24 @@ +/* + * unlink — remove a file via ESTEX DELETE ($0E). + * HL = ASCIIZ path; CF=err with code in A. Sets errno on failure. + */ + +#include + +int unlink(const char *path) __naked +{ + (void)path; + __asm + push ix + ld c, #0x0E ; ESTEX DELETE (HL = file name, A = attribure file) + rst #0x10 + pop ix + jr c, _unlink_err + ld de, #0 + ret + _unlink_err: + call __errno_set + ld de, #-1 + ret + __endasm; +} diff --git a/libc/io/videomode_raw.c b/libc/io/videomode_raw.c new file mode 100644 index 0000000..b524aab --- /dev/null +++ b/libc/io/videomode_raw.c @@ -0,0 +1,46 @@ +/* + * videomode_raw.c — low-level ESTEX SETVMOD / GETVMOD ($50 / $51). + * + * Plain getters/setters with NO mode-class validation. Used by both + * conio (text-validated public API) and gfx (graphics modes). Lives + * in its own .c so a pure graphics program does not pull in the entire + * conio module to switch modes. + * + * Public conio functions in conio.c wrap these with a text-mode check; + * gfx_init / gfx_done in gfx_core.c call them directly. + */ + +#include +#include + +uint8_t _videomode_raw_get(void) __naked +{ + __asm + push ix + ld c, #0x51 ; ESTEX GETVMOD + rst #0x10 + pop ix + ;; uint8_t returns in A — ESTEX already put mode there. + ret + __endasm; +} + +int _videomode_raw_set(uint8_t mode) __naked +{ + (void)mode; + __asm + ;; SDCC __sdcccall(1) passes uint8_t in A — leave it there. + push ix + ld bc, #0x0050 ; ESTEX SETVMOD (B=0 (page), C=0x50) + rst #0x10 + jr c, _vmr_err + ld de, #0 + pop ix + ret + _vmr_err: + call __errno_set + ld de, #-1 + pop ix + ret + __endasm; +} diff --git a/libc/mem/bank_io.c b/libc/mem/bank_io.c new file mode 100644 index 0000000..ac83af8 --- /dev/null +++ b/libc/mem/bank_io.c @@ -0,0 +1,51 @@ +/* + * bank_io — HOME-resident helpers to read/write a "far" page that lives + * in some physical RAM page outside the currently-mapped W3 bank. + * + * - We always run from HOME (window 1, always mapped), so we are free + * to swap W3 (port 0xE2) between the caller's bank and the data + * page, then restore it before returning. + * - The caller must not rely on W3 contents during the call — the swap + * is transparent to instruction-fetch (we execute from W1), and only + * this function touches W3. + * - DI/EI is NOT applied around the swap; ISRs in HOME are unaffected, + * and banked-call ISRs are not expected in our current design. + */ + +#include +#include +#include +#include + +uint8_t bank_load_byte(uint8_t phys_page, uint16_t off_in_window) +{ + uint8_t saved = _io_page_w3; + sprinter_page_w3(phys_page); + uint8_t v = *((volatile uint8_t *)(0xC000u + off_in_window)); + sprinter_page_w3(saved); + return v; +} + +void bank_store_byte(uint8_t phys_page, uint16_t off_in_window, uint8_t v) +{ + uint8_t saved = _io_page_w3; + sprinter_page_w3(phys_page); + *((volatile uint8_t *)(0xC000u + off_in_window)) = v; + sprinter_page_w3(saved); +} + +void bank_read(uint8_t phys_page, uint16_t off, void *dst, uint16_t n) +{ + uint8_t saved = _io_page_w3; + sprinter_page_w3(phys_page); + memcpy(dst, (const void *)(0xC000u + off), n); + sprinter_page_w3(saved); +} + +void bank_write(uint8_t phys_page, uint16_t off, const void *src, uint16_t n) +{ + uint8_t saved = _io_page_w3; + sprinter_page_w3(phys_page); + memcpy((void *)(0xC000u + off), src, n); + sprinter_page_w3(saved); +} diff --git a/libc/mem/mem_alloc.c b/libc/mem/mem_alloc.c new file mode 100644 index 0000000..e061d43 --- /dev/null +++ b/libc/mem/mem_alloc.c @@ -0,0 +1,99 @@ +/* + * mem_alloc_pages / mem_free_block / mem_get_page / mem_info — ESTEX EMM + * wrappers for explicit 16 KB-page allocation. + * + * ESTEX $3C INFOMEM → HL=total pages, BC=free pages + * ESTEX $3D GETMEM B=npages → A=block id, CF=err + * ESTEX $3E FREEMEM A=block id → CF=err + * BIOS $C4 EMM_GETPAGE A=blk, B=idx → A=physical page CF=err + * + * Pattern: every RST 10h / RST 8 is bracketed with push/pop IX because + * ESTEX/BIOS clobber it and the C caller uses it as a frame pointer. + */ + +#include +#include + +uint8_t mem_alloc_pages(uint8_t n) __naked +{ + (void)n; + __asm + ;; SDCC single-uint8 arg → A on entry. + push ix + ld b, a + ld c, #0x3D + rst #0x10 + pop ix + jr c, _alloc_fail + ret + _alloc_fail: + call __errno_set + xor a, a ; 0 = failure + ret + __endasm; +} + +void mem_free_block(uint8_t blk_id) __naked +{ + (void)blk_id; + __asm + ;; SDCC single-uint8 arg → A on entry. + push ix + ld c, #0x3E + rst #0x10 + pop ix + ret + __endasm; +} + +uint8_t mem_get_page(uint8_t blk_id, uint8_t idx) __naked +{ + (void)blk_id; (void)idx; + __asm + ;; 2-arg uint8/uint8: blk_id → A, idx → L. + push ix + ld b, l ; BIOS wants idx in B + ;; A still has blk_id + ld c, #0xC4 ; BIOS EMM_GETPAGE + rst #0x08 + pop ix + ;; A = physical page number. Return as uint8 → A. + ret + __endasm; +} + +void mem_info(uint16_t *total, uint16_t *free_pages) __naked +{ + (void)total; (void)free_pages; + __asm + ;; HL = total, DE = free_pages on entry. + ;; ESTEX INFOMEM clobbers everything; stash both pointers on stack. + push ix + push hl ; [SP+0..1] = total ptr + push de ; [SP+2..3] = free_pages ptr (wait wrong order) + + ;; Actually after two pushes: SP+0 = free_pages_ptr, SP+2 = total_ptr. + ;; That's the layout we'll use below. + + ld c, #0x3C ; ESTEX INFOMEM → HL=total, BC=free + rst #0x10 + ;; HL = total value, BC = free value. + + pop de ; DE = free_pages ptr + ld a, c + ld (de), a + inc de + ld a, b + ld (de), a + + pop de ; DE = total ptr + ld a, l + ld (de), a + inc de + ld a, h + ld (de), a + + pop ix + ret + __endasm; +} diff --git a/libc/stdio/file.c b/libc/stdio/file.c new file mode 100644 index 0000000..cd63334 --- /dev/null +++ b/libc/stdio/file.c @@ -0,0 +1,267 @@ +/* + * file.c — minimal unbuffered FILE * implementation on top of the + * POSIX-style fd I/O (open/read/write/lseek/close). + * + * No buffering: each fputc/fgetc maps to one read/write syscall. For + * heavy-throughput code, prefer fread/fwrite with a sizable buffer or + * the raw fd I/O directly. + * + * stdin/stdout/stderr are STATIC sentinel FILEs with fd=-1 and the + * _F_CONIN/_F_CONOUT flags set; fputc/fgetc detect them and call + * putchar()/getchar() (which already do CR/LF mapping and ESTEX calls). + */ + +#include +#include +#include +#include +#include +#include + +/* ---- console pseudo-streams ----------------------------------------*/ +static FILE _stdin = { -1, _F_READ | _F_CONIN }; +static FILE _stdout = { -2, _F_WRITE | _F_CONOUT }; +static FILE _stderr = { -3, _F_WRITE | _F_CONOUT }; +static FILE _stdaux = { -4, _F_WRITE | _F_CONOUT }; +static FILE _stdprn = { -5, _F_WRITE | _F_CONOUT }; + +FILE *const stdin = &_stdin; +FILE *const stdout = &_stdout; +FILE *const stderr = &_stderr; +FILE *const stdaux = &_stdaux; +FILE *const stdprn = &_stdprn; + +/* ---- fopen / fclose -------------------------------------------------*/ + +/* Translate a fopen() mode string to the open() flags subset our + * libc/io/open.c understands. Supported: r, w, a, with optional "+" + * and trailing "b" (binary — we ignore as all I/O is binary). + */ +static int mode_to_flags(const char *mode, uint8_t *file_flags) +{ + if (!mode || !*mode) { + errno = EINVAL; + return -1; + } + int oflags = 0; + uint8_t ff = 0; + char base = *mode; + int plus = 0; + for (const char *p = mode + 1; *p; p++) { + if (*p == '+') plus = 1; + /* 'b' and 't' are ignored — all I/O is binary on Sprinter. */ + } + switch (base) { + case 'r': + oflags = plus ? O_RDWR : O_RDONLY; + ff = _F_READ | (plus ? _F_WRITE : 0); + break; + case 'w': + oflags = (plus ? O_RDWR : O_WRONLY) | O_CREAT | O_TRUNC; + ff = _F_WRITE | (plus ? _F_READ : 0); + break; + case 'a': + oflags = (plus ? O_RDWR : O_WRONLY) | O_CREAT | O_APPEND; + ff = _F_WRITE | _F_APPEND | (plus ? _F_READ : 0); + break; + default: + errno = EINVAL; + return -1; + } + *file_flags = ff; + return oflags; +} + +FILE *fopen(const char *path, const char *mode) +{ + uint8_t ff; + int oflags = mode_to_flags(mode, &ff); + if (oflags < 0) return NULL; + + int fd = open(path, oflags); + if (fd < 0) return NULL; + + FILE *fp = (FILE *)malloc(sizeof(FILE)); + if (!fp) { + int saved = errno; + close(fd); + errno = saved ? saved : ENOMEM; + return NULL; + } + fp->fd = fd; + fp->flags = ff; + return fp; +} + +int fclose(FILE *fp) +{ + if (!fp) { + errno = EBADF; + return EOF; + } + /* Don't close stdin/stdout/stderr. */ + if (fp == &_stdin || fp == &_stdout || fp == &_stderr) { + return 0; + } + int r = close(fp->fd); + free(fp); + return r < 0 ? EOF : 0; +} + +int fflush(FILE *fp) +{ + /* Unbuffered — nothing to flush. */ + (void)fp; + return 0; +} + +/* ---- char-at-a-time -------------------------------------------------*/ + +int fputc(int c, FILE *fp) +{ + if (!fp) { errno = EBADF; return EOF; } + if (fp->flags & _F_CONOUT) { + return putchar(c); + } + if (!(fp->flags & _F_WRITE)) { errno = EBADF; return EOF; } + uint8_t ch = (uint8_t)c; + if (write(fp->fd, &ch, 1) != 1) { + fp->flags |= _F_ERROR; + return EOF; + } + return (int)ch; +} + +int fgetc(FILE *fp) +{ + if (!fp) { errno = EBADF; return EOF; } + if (fp->flags & _F_CONIN) { + return getchar(); + } + if (!(fp->flags & _F_READ)) { errno = EBADF; return EOF; } + uint8_t ch; + int r = read(fp->fd, &ch, 1); + if (r == 0) { fp->flags |= _F_EOF; return EOF; } + if (r < 0) { fp->flags |= _F_ERROR; return EOF; } + return (int)ch; +} + +/* ---- string-at-a-time ----------------------------------------------*/ + +int fputs(const char *s, FILE *fp) +{ + if (!fp || !s) { errno = EBADF; return EOF; } + if (fp->flags & _F_CONOUT) { + while (*s) { + if (putchar((unsigned char)*s++) == EOF) return EOF; + } + return 0; + } + if (!(fp->flags & _F_WRITE)) { errno = EBADF; return EOF; } + size_t n = strlen(s); + int w = write(fp->fd, s, (uint16_t)n); + if (w < 0 || (size_t)w != n) { + fp->flags |= _F_ERROR; + return EOF; + } + return 0; +} + +char *fgets(char *buf, int n, FILE *fp) +{ + if (!buf || n < 2 || !fp) return NULL; + int i = 0; + while (i < n - 1) { + int c = fgetc(fp); + if (c == EOF) { + if (i == 0) return NULL; + break; + } + buf[i++] = (char)c; + if (c == '\n') break; + } + buf[i] = '\0'; + return buf; +} + +/* ---- block-at-a-time -----------------------------------------------*/ + +size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp) +{ + if (!ptr || !fp) return 0; + if (size == 0 || nmemb == 0) return 0; + if (fp->flags & _F_CONIN) { + /* line-buffered console read — not very useful but functional. */ + char *p = (char *)ptr; + size_t total = size * nmemb; + for (size_t i = 0; i < total; i++) { + int c = getchar(); + if (c == EOF) return i / size; + p[i] = (char)c; + } + return nmemb; + } + if (!(fp->flags & _F_READ)) { errno = EBADF; return 0; } + size_t total = size * nmemb; + int r = read(fp->fd, ptr, (uint16_t)total); + if (r < 0) { fp->flags |= _F_ERROR; return 0; } + if ((size_t)r < total) fp->flags |= _F_EOF; + return (size_t)r / size; +} + +size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *fp) +{ + if (!ptr || !fp) return 0; + if (size == 0 || nmemb == 0) return 0; + if (fp->flags & _F_CONOUT) { + const char *p = (const char *)ptr; + size_t total = size * nmemb; + for (size_t i = 0; i < total; i++) { + if (putchar((unsigned char)p[i]) == EOF) return i / size; + } + return nmemb; + } + if (!(fp->flags & _F_WRITE)) { errno = EBADF; return 0; } + size_t total = size * nmemb; + int w = write(fp->fd, ptr, (uint16_t)total); + if (w < 0) { fp->flags |= _F_ERROR; return 0; } + return (size_t)w / size; +} + +/* ---- positioning ---------------------------------------------------*/ + +int fseek(FILE *fp, long off, int whence) +{ + if (!fp || (fp->flags & (_F_CONIN | _F_CONOUT))) { + errno = EBADF; + return -1; + } + long r = lseek(fp->fd, off, whence); + if (r < 0) return -1; + fp->flags &= (uint8_t)~_F_EOF; + return 0; +} + +long ftell(FILE *fp) +{ + if (!fp || (fp->flags & (_F_CONIN | _F_CONOUT))) { + errno = EBADF; + return -1L; + } + return lseek(fp->fd, 0L, SEEK_CUR); +} + +void rewind(FILE *fp) +{ + if (!fp) return; + fseek(fp, 0L, SEEK_SET); + fp->flags &= (uint8_t)~(_F_EOF | _F_ERROR); +} + +/* ---- status --------------------------------------------------------*/ + +int feof (FILE *fp) { return fp && (fp->flags & _F_EOF) ? 1 : 0; } +int ferror(FILE *fp) { return fp && (fp->flags & _F_ERROR) ? 1 : 0; } +void clearerr(FILE *fp) { + if (fp) fp->flags &= (uint8_t)~(_F_EOF | _F_ERROR); +} diff --git a/libc/stdio/getchar.c b/libc/stdio/getchar.c new file mode 100644 index 0000000..88df92c --- /dev/null +++ b/libc/stdio/getchar.c @@ -0,0 +1,29 @@ +/* + * getchar via ESTEX RST 10h. + * + * ESTEX 0x30 (WAITKEY): blocks until a key, returns + * A = scan code, D = position code, E = ASCII, + * C = mode flags, B = shift flags. + * + * IX is preserved (RST 10h clobbers it; callers rely on it as frame pointer). + */ + +#include + +int getchar(void) __naked +{ + __asm + push ix + ld c, #0x30 ; ESTEX WAITKEY + rst #0x10 + pop ix + ld a, e ; E = ASCII (already the low byte of our return DE) + or a, a + jr Z, no_ascii + ld d, #0 + ret + no_ascii: + ld de, #-1 + ret + __endasm; +} diff --git a/libc/stdio/print_hex.c b/libc/stdio/print_hex.c new file mode 100644 index 0000000..3484c4e --- /dev/null +++ b/libc/stdio/print_hex.c @@ -0,0 +1,15 @@ +/* + * print_hex — print a single byte as two uppercase hex digits. + * + * No printf yet; this is what bare-metal debug looks like in stage 3. + */ + +#include +#include + +void print_hex(uint8_t v) +{ + static const char digits[] = "0123456789ABCDEF"; + putchar(digits[(v >> 4) & 0x0F]); + putchar(digits[v & 0x0F]); +} diff --git a/libc/stdio/putchar.c b/libc/stdio/putchar.c new file mode 100644 index 0000000..5448d3b --- /dev/null +++ b/libc/stdio/putchar.c @@ -0,0 +1,42 @@ +/* + * putchar — emit one character via ESTEX PUTCHAR ($5B). + * + * Turbo-C convention: this stdio.h function is the FAST path with NO + * attribute control. Whatever ESTEX has cached for the cursor cell is + * used (typically the shell's default colour). Translates '\n' to + * CR LF for C-string semantics. + * + * For coloured output, use putch() / cputs() / cprintf() from + * — those honour textattr / g_text_attr at the cost of being ~10× slower. + * + * SDCC __sdcccall(1): char arg in L (low byte of HL=int). Returns the + * char in DE (SDCC int return). + */ + +#include + +int putchar(int c) __naked +{ + (void)c; + __asm + ld a, l ; SDCC __sdcccall(1) int → HL + push ix + cp #0x0A + jr nz, _pc_emit + ld a, #0x0D ; CR before LF + push af + ld c, #0x5B + rst #0x10 + pop af + ld a, #0x0A + _pc_emit: + push af + ld c, #0x5B + rst #0x10 + pop af + pop ix + ld e, a + ld d, #0 + ret + __endasm; +} diff --git a/libc/stdio/puts.c b/libc/stdio/puts.c new file mode 100644 index 0000000..9e12abb --- /dev/null +++ b/libc/stdio/puts.c @@ -0,0 +1,69 @@ +/* + * puts — C99 fputs(s, stdout) + '\n'. + * + * Turbo-C convention: stdio's `puts` is the FAST path with NO attribute + * control — backed by ESTEX PCHARS ($5C). Cursor cell attributes are + * whatever ESTEX has cached (usually the shell's default). + * + * For coloured output use cputs() / cprintf() from . + * + * Implementation notes: + * - PCHARS does NOT translate '\n' to CR LF, so we copy the string + * into a static buffer expanding each '\n' to CR LF, then append + * the trailing CR LF before the NUL. + * - Avoid trailing PUTCHAR after PCHARS — empirically that sometimes + * drops the next char. Embed the line ending inside the PCHARS + * buffer instead. + * - Strings longer than the buffer fall back to per-char putchar so + * we never silently truncate. + */ + +#include +#include + +#define PUTS_BUF_SIZE 256 /* body bytes before CR expansion */ + +static char puts_buf[PUTS_BUF_SIZE + 3]; /* +3 for trailing CR LF NUL */ + +static void pchars(const char *s) __naked +{ + (void)s; + __asm + push ix + ld c, #0x5C + rst #0x10 + pop ix + ret + __endasm; +} + +int puts(const char *s) +{ + uint16_t n = 0; + uint16_t i = 0; + + while (s[i] && n < PUTS_BUF_SIZE - 1) { + char c = s[i++]; + if (c == '\n') { + puts_buf[n++] = '\r'; + puts_buf[n++] = '\n'; + } else { + puts_buf[n++] = c; + } + } + + if (s[i]) { + /* Overflow — char-by-char fallback so we never truncate. */ + for (uint16_t k = 0; s[k]; k++) + putchar((unsigned char)s[k]); + putchar('\n'); + return 0; + } + + puts_buf[n++] = '\r'; + puts_buf[n++] = '\n'; + puts_buf[n] = 0; + + pchars(puts_buf); + return 0; +} diff --git a/libc/stdio/solid_helpers.c b/libc/stdio/solid_helpers.c new file mode 100644 index 0000000..103a596 --- /dev/null +++ b/libc/stdio/solid_helpers.c @@ -0,0 +1,61 @@ +/* + * solid_helpers.c — small Solid-C compatibility helpers. + * + * Each function maps to the standard printf/sprintf machinery already + * available from SDCC's z80.lib + our overrides. No new syscalls. + */ + +#include +#include + +/* ---- gets — dangerous but Solid-C provides it ---------------------- */ +char *gets(char *buf) +{ + int i = 0; + int c; + for (;;) { + c = getchar(); + if (c == EOF) { + if (i == 0) return 0; + break; + } + if (c == '\n' || c == '\r') break; + buf[i++] = (char)c; + } + buf[i] = 0; + return buf; +} + +/* ---- decimal output: use printf %u ---------------------------------- */ + +void dec8(uint8_t v) +{ + printf("%u", (unsigned)v); +} + +void dec16(uint16_t v) +{ + printf("%u", (unsigned)v); +} + +void dec32(uint32_t v) +{ + printf("%lu", (unsigned long)v); +} + +/* ---- hex output: zero-padded ---------------------------------------- */ + +void hex8(uint8_t v) +{ + printf("%02X", (unsigned)v); +} + +void hex16(uint16_t v) +{ + printf("%04X", (unsigned)v); +} + +void hex32(uint32_t v) +{ + printf("%08lX", (unsigned long)v); +} diff --git a/release_docs/en/README.md b/release_docs/en/README.md new file mode 100644 index 0000000..e11d945 --- /dev/null +++ b/release_docs/en/README.md @@ -0,0 +1,14 @@ +# Sprinter C Compiler — User Documentation (English) + +This is the documentation that ships with the release tarball. For Russian +see `../ru/README.md`. + +## Contents + +| File | Topic | +|---|---| +| `getting_started.md` | Install, first build, MAME notes | +| `sprinter_cc.md` | Compiler driver — all flags explained | +| `memory_modes.md` | tiny / small / big / huge / manual | +| `headers.md` | Public headers and what each provides | +| `examples.md` | Tour of the 27 bundled examples | diff --git a/release_docs/en/examples.md b/release_docs/en/examples.md new file mode 100644 index 0000000..6a4a0e2 --- /dev/null +++ b/release_docs/en/examples.md @@ -0,0 +1,76 @@ +# Examples tour + +The release ships with 27 example programs in `examples/`. Every one of them +is a self-contained demo with comments — they were used as regression tests +during development. + +## Build any example + +```sh +cd examples/hello +make +``` + +That produces `hello.exe` next to `hello.c` using `examples/example.mk`. + +## Categories + +### Hello world / basics +* **`hello`** — stdio + conio Turbo-C-style colours +* **`argv`** — argv parsing in crt0 +* **`conio`** — conio API smoke test +* **`attrprob`** — probe Sprinter text-attribute byte layout + +### File I/O +* **`cat`** — read & print TEST.TXT +* **`seek`** — 32-bit lseek over a 100 KB file +* **`ls`** — directory listing via ffirst/fnext +* **`filetest`** — FILE* streams (`fopen`/`fread`/`fwrite`/`fclose`) +* **`stattest`** — `stat`/`fstat` on files and directories +* **`openenv`** — open() flags + environment variables + +### Memory & banking +* **`malloc`** — heap stress test (200+ allocations) +* **`mem_test`** — page allocator + `bank_read`/`bank_write` +* **`banked`** — banked code in W3 (huge mode) +* **`bankedbg`** — banked code in W1 (big mode) +* **`banklocl`** — bank-local static data and BSS + +### Mouse +* **`mouse`** — driver in text mode +* **`gfx_mous`** — mouse with custom bitmap cursor in graphics mode + +### Graphics +* **`gfx_demo`** — 320×256×256: lines, rectangles, fill via accelerator +* **`gfx_d16`** — 640×256×16: same primitives in 16-color mode +* **`gfx_text`** — bitmap-font text on graphics screen + +### Misc +* **`errno`** — errno / strerror / perror +* **`timedir`** — date/time + directory listing +* **`ptime`** — POSIX time API (time / localtime / mktime) +* **`strtest`** — `` test (from SDCC's z80.lib) +* **`stdlib`** — `` test (qsort / rand / strtol / etc.) +* **`assrtest`** — assert() +* **`rt_test`** — runtime helpers (sleep, setjmp, atexit) + +## Example.mk + +Every example uses `examples/example.mk`. A minimal Makefile looks like: + +```makefile +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := my_app +include $(PROJ_ROOT)/examples/example.mk +``` + +Optional knobs (set before `include`): + +```makefile +MEMORY := huge # default tiny +STACK_SIZE := 4096 # default ~1278 +EXTRA_SRCS := helper.c util.c # extra .c files in same dir +EXTRA_FLAGS := --bank 1=engine.c --debug # pass-through to sprinter-cc +``` + +Use this template for your own programs. diff --git a/release_docs/en/getting_started.md b/release_docs/en/getting_started.md new file mode 100644 index 0000000..3e25adc --- /dev/null +++ b/release_docs/en/getting_started.md @@ -0,0 +1,61 @@ +# Getting started + +## What's in the tarball + +After extracting `sprinter-c-v1.0-.tar.gz` you've got: + +* **`bin/sprinter-cc`** — the C → SprintEXE driver (a bash script). +* **`third_party/sdcc/`** — vendored SDCC 4.5 used for the C → Z80 step. +* **`libc/include/`** — headers your programs include. +* **`lib/sprinter.lib`** — the Sprinter target libc (prebuilt; rebuilt by `make` if you modify libc sources). +* **`runtime/`** — crt0 variants and runtime helpers (assembled per-build). +* **`toolchain/mkexe/`** — host utility that packs SDCC's `.ihx` into a SprintEXE. +* **`examples/`** — 27 ready-to-build programs. +* **`docs/{en,ru}/`** — this documentation. + +## First build + +```sh +cd sprinter-c-v1.0- +make all # rebuild lib + every example (~30 s) +``` + +If `make` complains about a missing SDCC binary, fetch it once: + +```sh +make sdcc # downloads SDCC 4.5 if not vendored +``` + +## Build your own program + +```sh +cat > hello.c < +int main(void) { + puts("Hello, Sprinter!"); + return 0; +} +EOF + +bin/sprinter-cc -o hello.exe hello.c +``` + +`hello.exe` is now a valid SprintEXE you can run on Sprinter / MAME / any +ESTEX DSS shell. + +## Running on hardware or in an emulator + +The release does **not** include the MAME emulator or the Sprinter ROM / +DSS / HDD images — those are large and have their own licensing. To test: + +* **MAME:** install MAME 0.283+ separately, obtain Sprinter Sp2000 images from + Peters Plus, mount a FAT12 floppy with your `.exe` files as `-flop1`. +* **Real Sprinter:** copy `.exe` to a floppy or HDD partition that DSS can + see, then `RUN HELLO` from the shell. + +## Next steps + +* Read `sprinter_cc.md` for compiler flags. +* Read `memory_modes.md` when you start needing more than 14 KB of code. +* Browse `examples/` — every file is a working program with comments. +* See `headers.md` for the public API surface. diff --git a/release_docs/en/headers.md b/release_docs/en/headers.md new file mode 100644 index 0000000..b496d39 --- /dev/null +++ b/release_docs/en/headers.md @@ -0,0 +1,50 @@ +# Headers + +Everything you `#include` lives under `libc/include/`. + +## Standard C + +| Header | Source | Provides | +|---|---|---| +| `` | our libc + SDCC | `printf`, `puts`, `putchar`, `getchar`, `sprintf`, `FILE *`, `fopen`/`fread`/.../`fclose`, plus `hex8/16/32`, `dec8/16/32`, `gets` | +| `` | SDCC z80.lib | `malloc`, `free`, `calloc`, `realloc`, `atoi`, `atof`, `atol`, `strtol`, `qsort`, `bsearch`, `rand`, `srand`, `abs`, `div`, `exit`, ... | +| `` | SDCC z80.lib | `memcpy`, `memcmp`, `memset`, `memchr`, `memmove`, full `strXxx` family | +| `` | SDCC z80.lib | `tolower`, `toupper`, `isalnum`, `isdigit`, ... | +| `` | SDCC z80.lib | `sinf`, `cosf`, `sqrtf`, ... | +| `` | our libc | `errno` + error constants + `strerror` | +| `` | our libc | `setjmp` / `longjmp` | +| `` | SDCC | `assert` macro | +| `` | our libc | `read`, `write`, `close`, `lseek`, `unlink`, `SEEK_SET`/`CUR`/`END` | +| `` | our libc | `open`, `creat`, `O_RDONLY`/`O_WRONLY`/`O_CREAT`/etc. | +| `` | our libc | `stat`, `fstat`, `struct stat` | +| `` | our libc | `getdatetime`, `setdatetime` + POSIX `time`/`localtime`/`gmtime`/`mktime`/`asctime`/`ctime` | + +## Sprinter-specific + +| Header | Provides | +|---|---| +| `` | `putch`, `cputs`, `cprintf`, `kbhit`, `getch`, `getche`, `clrscr`, `gotoxy`, `wherex/y`, `wrchar`, `rdchar`, `textcolor`, `textbackground`, `textattr`, `get_videomode`, `set_videomode`, `COLOR_*` enum, `KEEP_EXIST_ATTR` | +| `` | Graphics for 320×256×256 and 640×256×16: `gfx_init`/`gfx_done`, `gfx_pal_load`/`gfx_pal_set`, `gfx_clear`, `gfx_putpixel`, `gfx_hline`/`gfx_vline`, `gfx_rect`/`gfx_fill_rect`, `gfx_line`, `gfx_text`/`gfx_putchar`, plus all `*16` variants for 16-color mode, font management via `gfx_load_default_font`/`gfx_set_font` | +| `` | Full 14-function driver wrapper: `mouse_init`/`mouse_show`/`mouse_hide`/`mouse_read`/`mouse_goto`/`mouse_bounds_*`/`mouse_text_cursor`/`mouse_load_cursor`/`mouse_get_cursor`/`mouse_set_sensitivity`/`mouse_get_sensitivity_*`/`mouse_video_mode_changed`/`mouse_refresh`, plus `mouse_cursor_t` and `mouse_state_t` structs | +| `` | `chdir`, `getcwd`, `mkdir`, `rmdir`, `ffirst`, `fnext`, `ffblk` struct | +| `` | Raw port numbers, ESTEX/BIOS function-number constants, `__sfr` intrinsics for paging, `print_hex`, `getenv`, `putenv` | +| `` | `exit`, `_exit`, `atexit` | +| `` | `mem_alloc_pages`, `mem_free_block`, `mem_get_page`, `mem_info`, `bank_read`, `bank_write`, `bank_load_byte`, `bank_store_byte` | +| `` | Solid-C compatibility shims — pulls in standard headers and adds `BOOL`/`uint`/`WORD`/`f_point` types, `setmem`/`movmem` aliases, `inp`/`outp`, `enable`/`disable`, `min`/`max`, `home()`, `seek`/`tell`/`remove`, `_ffirst`, `ms_*` mouse aliases, etc. | + +## Quick lookup: I want to ... + +* **Print text** → `` (`printf` / `puts` — fast, no colour) or + `` (`cprintf` / `cputs` — applies `textcolor`). +* **Read a key** → ``: `getch()` (blocking, no echo), `getche()` (echo), + `kbhit()` (non-blocking poll). +* **Open / read / write files** → `` + `` (POSIX) or + `` (`fopen` family). +* **List a directory** → ``: `ffirst` / `fnext`. +* **Draw pixels** → ``. +* **Allocate memory** → ``: `malloc` / `free` / `calloc` / `realloc`. +* **Get current time** → ``: `getdatetime` or POSIX `time`/`localtime`. +* **Read mouse** → ``. +* **Read an env var** → ``: `getenv` / `putenv`. +* **Set text colour** → ``: `textcolor(COLOR_YELLOW)`, + `textbackground(COLOR_BLUE)`, or `textattr(COLOR(fg, bg))`. diff --git a/release_docs/en/memory_modes.md b/release_docs/en/memory_modes.md new file mode 100644 index 0000000..f13dd49 --- /dev/null +++ b/release_docs/en/memory_modes.md @@ -0,0 +1,49 @@ +# Memory modes + +Sprinter's CPU address space is four 16 KB windows. ESTEX DSS allocates RAM +pages by program size — programs ≤ 16 KB get only **one** page, so the +"default" Spectrum-style "code in W1, data in W2" layout silently fails for +small programs. This is why `sprinter-cc` has explicit memory modes. + +## The five modes + +| Mode | Code at | Data at | Banks in | Use when | +|---|---|---|---|---| +| `tiny` (default) | W2 (0x8100+) | chained after code | — | code + data ≤ 14 KB | +| `small` | W1 (0x4100+) | chained after code | — | code + data ≤ 30 KB | +| `big` | W2 (0x8100+) | chained after code | **W1** (0x4000) | tiny + extra banked modules | +| `huge` | W1 (0x4100+) | W2 (0x8000+) | **W3** (0xC000) | small + extra banked modules | +| `manual` | user-specified | user-specified | user-specified | special cases | + +## Choosing + +Start with **`tiny`**. If `sprinter-cc` says "_CODE too big" or the program +mysteriously fails to start, jump straight to `small`. + +If you have a large code base (>32 KB total) and want to keep most of it +out of the always-resident window, use `huge` and split modules into banks +with `--bank N=mod.c`. `big` is the same idea but with banks in W1 instead +of W3 — useful when you need W3 for hardware (graphics, mapped memory). + +## Stack and heap + +The stack starts at `0xBFFE` (top of W2) and grows down. The heap starts +right after BSS and grows up. By default they share W2 with about 1.2 KB +reserved for the stack and the rest for the heap. + +`--stack-size N` reserves more (or less) for the stack at the cost of heap. + +## What's actually under the hood + +Every mode picks a different `runtime/crt0_*.s`: + +* `tiny`: `crt0.s` — SP = 0xBFFE, parse argv, call main. +* `small`: `crt0_small.s` — read port 0xC2 to see if DSS gave W2. If not, + allocate one page via ESTEX `$3D` and map it via `$3A SETWIN2` *before* + switching the stack — BIOS calls need the stack in W2, ESTEX calls don't. +* `big`: `crt0_banked.s` with `BANK_W1=1` prepended — banks live at + `0x{N}4000` and trampolines use port `0xA2`. +* `huge`: `crt0_banked.s` (default `BANK_W1=0`) — banks at `0x{N}C000` via + port `0xE2`. Also includes the small-mode W2 auto-allocate. + +For `manual` see `sprinter-cc --memory-manual SPEC` syntax in `sprinter_cc.md`. diff --git a/release_docs/en/sprinter_cc.md b/release_docs/en/sprinter_cc.md new file mode 100644 index 0000000..51e8261 --- /dev/null +++ b/release_docs/en/sprinter_cc.md @@ -0,0 +1,82 @@ +# `sprinter-cc` — compiler driver + +One-line entrypoint to the entire toolchain. Takes `.c` files plus options +and emits a SprintEXE. + +## Synopsis + +``` +sprinter-cc -o OUT.exe SRC.c [more.c ...] [options] +``` + +## Options + +### Memory layout + +| Flag | Description | +|---|---| +| `--memory MODE` | `tiny` (default), `small`, `big`, `huge`, `manual`. See `memory_modes.md`. | +| `--memory-manual SPEC` | For `--memory manual`: comma-separated `KEY=VAL` list, e.g. `CODE=W2,DATA=W2,BANKED=W3`. | +| `--stack-size N` | Bytes reserved for the stack. Default ≈ 1278. Larger value reduces the heap. | + +### Code organisation + +| Flag | Description | +|---|---| +| `--bank N=FILE.c` | Compile FILE.c into bank N (1..15). Repeatable. Functions in banked files need the `__banked` qualifier. | +| `--crt0=TYPE` | Override startup file: `default` / `minimal` / `banked` / `small`. Normally chosen automatically by the memory mode. | + +### Diagnostics + +| Flag | Description | +|---|---| +| `--debug` | Prepends `DEBUG_RT = 1` to crt0 and passes `-DDEBUG_RT` to SDCC. Exposes runtime introspection symbols like `_w2_self_allocated`. | +| `-v` | Verbose — echo every sub-command. | +| `-h` / `--help` | Built-in help. | + +### Passthrough + +| Flag | Description | +|---|---| +| `-I PATH` | Extra include path. | +| `-Wl FLAG` | Pass FLAG to the linker. | +| `--mkexe FLAG` | Pass FLAG to mkexe (e.g. `--mkexe -p --mkexe 0` for zero-padded banks). | +| `-L 0xADDR` | Override load address. | +| `-E 0xADDR` | Override entry address. | +| `-S 0xADDR` | Override initial stack address. Default `0xBFFE`. | + +## Examples + +Smallest possible build: +```sh +sprinter-cc -o hello.exe hello.c +``` + +Larger program (doesn't fit in 14 KB): +```sh +sprinter-cc --memory small -o big.exe big.c +``` + +Multi-bank game: +```sh +sprinter-cc --memory huge -o game.exe \ + main.c --bank 1=engine.c --bank 2=ai.c --bank 3=audio.c +``` + +Custom stack size: +```sh +sprinter-cc --stack-size 4096 -o app.exe app.c +``` + +## Under the hood + +1. Picks crt0 based on `--memory` (and `--bank` presence). +2. Assembles crt0 (with optional `DEBUG_RT` / `BANK_W1` prepended). +3. Assembles `heap_top.s` (custom value if `--stack-size`). +4. Compiles every source `.c` to `.rel` via SDCC. +5. Compiles bank sources with `--codeseg/--constseg/--dataseg BANK_n`. +6. Compiles `runtime/bank.s` trampoline (if banks are used). +7. Links everything to `.ihx`, runs `check_banks.py` to enforce 16 KB bank limits. +8. Calls `toolchain/mkexe/mkexe` to wrap the `.ihx` as SprintEXE. + +Per-build artefacts go in `.sprinter-cc-/` next to the output. diff --git a/release_docs/ru/README.md b/release_docs/ru/README.md new file mode 100644 index 0000000..d7f44e6 --- /dev/null +++ b/release_docs/ru/README.md @@ -0,0 +1,15 @@ +# Sprinter C Compiler — Документация пользователя (Русский) + +Это документация, поставляемая в составе релизного tarball. Английская +версия — `../en/README.md`. + +## Содержание + +| Файл | Тема | +|---|---| +| `getting_started.md` | Установка, первая сборка, заметки про MAME | +| `sprinter_cc.md` | Драйвер компилятора — все флаги | +| `memory_modes.md` | tiny / small / big / huge / manual | +| `headers.md` | Публичные заголовки и что в них | +| `examples.md` | Обзор 27 встроенных примеров | +| `platform_reference.md` | Особенности платформы Sprinter и нюансы разработки (на основе наших dev-заметок) | diff --git a/release_docs/ru/examples.md b/release_docs/ru/examples.md new file mode 100644 index 0000000..9104a97 --- /dev/null +++ b/release_docs/ru/examples.md @@ -0,0 +1,75 @@ +# Обзор примеров + +Релиз содержит 27 примеров в каталоге `examples/`. Каждый — самодостаточная +демо-программа с комментариями (использовались как regression-тесты при разработке). + +## Сборка примера + +```sh +cd examples/hello +make +``` + +Результат — `hello.exe` рядом с `hello.c` через `examples/example.mk`. + +## Категории + +### Hello world / основы +* **`hello`** — stdio + conio Turbo-C-стиль цвета +* **`argv`** — парсинг argv в crt0 +* **`conio`** — smoke test conio API +* **`attrprob`** — пробинг байта атрибутов Sprinter + +### Файловый ввод-вывод +* **`cat`** — читает и печатает TEST.TXT +* **`seek`** — 32-битный lseek по файлу в 100 КБ +* **`ls`** — листинг каталога через ffirst/fnext +* **`filetest`** — FILE* стримы (`fopen`/`fread`/`fwrite`/`fclose`) +* **`stattest`** — `stat`/`fstat` для файлов и каталогов +* **`openenv`** — флаги open() + environment variables + +### Память и банки +* **`malloc`** — стресс-тест heap (200+ allocations) +* **`mem_test`** — page allocator + `bank_read`/`bank_write` +* **`banked`** — banked-код в W3 (huge mode) +* **`bankedbg`** — banked-код в W1 (big mode) +* **`banklocl`** — bank-local статические данные и BSS + +### Мышь +* **`mouse`** — драйвер в текстовом режиме +* **`gfx_mous`** — мышь с пользовательским bitmap-курсором в графическом режиме + +### Графика +* **`gfx_demo`** — 320×256×256: линии, прямоугольники, fill через accelerator +* **`gfx_d16`** — 640×256×16: те же примитивы в 16-цветном режиме +* **`gfx_text`** — bitmap-текст на графическом экране + +### Прочее +* **`errno`** — errno / strerror / perror +* **`timedir`** — дата/время + листинг каталога +* **`ptime`** — POSIX time API (time / localtime / mktime) +* **`strtest`** — `` тест (из SDCC's z80.lib) +* **`stdlib`** — `` тест (qsort / rand / strtol / etc.) +* **`assrtest`** — assert() +* **`rt_test`** — runtime helpers (sleep, setjmp, atexit) + +## Example.mk + +Каждый пример использует `examples/example.mk`. Минимальный Makefile: + +```makefile +PROJ_ROOT := $(abspath $(CURDIR)/../..) +EXAMPLE := my_app +include $(PROJ_ROOT)/examples/example.mk +``` + +Опциональные параметры (задаются до `include`): + +```makefile +MEMORY := huge # по умолчанию tiny +STACK_SIZE := 4096 # по умолчанию ~1278 +EXTRA_SRCS := helper.c util.c # дополнительные .c в той же папке +EXTRA_FLAGS := --bank 1=engine.c --debug # pass-through в sprinter-cc +``` + +Используйте этот template для своих программ. diff --git a/release_docs/ru/getting_started.md b/release_docs/ru/getting_started.md new file mode 100644 index 0000000..bc62b8e --- /dev/null +++ b/release_docs/ru/getting_started.md @@ -0,0 +1,62 @@ +# Начало работы + +## Что в tarball + +После распаковки `sprinter-c-v1.0-.tar.gz` вы получаете: + +* **`bin/sprinter-cc`** — драйвер C → SprintEXE (bash-скрипт). +* **`third_party/sdcc/`** — vendored SDCC 4.5 для шага C → Z80. +* **`libc/include/`** — заголовки для подключения в ваших программах. +* **`lib/sprinter.lib`** — целевая libc для Sprinter (предсобрана; пересобирается через `make`, если изменили исходники libc). +* **`runtime/`** — варианты crt0 и runtime-помощники (ассемблируются per-build). +* **`toolchain/mkexe/`** — host-утилита, упаковывающая `.ihx` SDCC в SprintEXE. +* **`examples/`** — 27 готовых программ. +* **`docs/{en,ru}/`** — эта документация. + +## Первая сборка + +```sh +cd sprinter-c-v1.0- +make all # пересобрать lib + все примеры (~30 с) +``` + +Если `make` жалуется на отсутствующий бинарник SDCC — загрузите его один раз: + +```sh +make sdcc # скачивает SDCC 4.5 если не vendored +``` + +## Сборка своей программы + +```sh +cat > hello.c < +int main(void) { + puts("Hello, Sprinter!"); + return 0; +} +EOF + +bin/sprinter-cc -o hello.exe hello.c +``` + +`hello.exe` теперь — корректный SprintEXE, который можно запустить на +Sprinter / MAME / в любом ESTEX DSS шелле. + +## Запуск на железе или в эмуляторе + +Релиз **не содержит** эмулятор MAME или образы ROM / DSS / HDD Sprinter — +они большие и имеют свои лицензии. Для тестирования: + +* **MAME:** установите MAME 0.283+ отдельно, получите образы Sprinter Sp2000 + у Peters Plus, смонтируйте FAT12-флоп с вашими `.exe` файлами как `-flop1`. +* **Реальный Sprinter:** скопируйте `.exe` на флоп или раздел HDD, видимый + для DSS, затем `RUN HELLO` в шелле. + +## Что дальше + +* Прочитайте `sprinter_cc.md` про флаги компилятора. +* Прочитайте `memory_modes.md` когда не хватит 14 КБ кода. +* Просмотрите `examples/` — каждый файл это рабочая программа с комментариями. +* `headers.md` — список публичных API. +* `platform_reference.md` — глубокие нюансы платформы и компилятора (от граблей до подводных камней). diff --git a/release_docs/ru/headers.md b/release_docs/ru/headers.md new file mode 100644 index 0000000..f5a7328 --- /dev/null +++ b/release_docs/ru/headers.md @@ -0,0 +1,50 @@ +# Заголовки + +Все `#include` живут в `libc/include/`. + +## Стандартный C + +| Заголовок | Источник | Что предоставляет | +|---|---|---| +| `` | наша libc + SDCC | `printf`, `puts`, `putchar`, `getchar`, `sprintf`, `FILE *`, `fopen`/`fread`/.../`fclose`, плюс `hex8/16/32`, `dec8/16/32`, `gets` | +| `` | SDCC z80.lib | `malloc`, `free`, `calloc`, `realloc`, `atoi`, `atof`, `atol`, `strtol`, `qsort`, `bsearch`, `rand`, `srand`, `abs`, `div`, `exit`, ... | +| `` | SDCC z80.lib | `memcpy`, `memcmp`, `memset`, `memchr`, `memmove`, вся семья `strXxx` | +| `` | SDCC z80.lib | `tolower`, `toupper`, `isalnum`, `isdigit`, ... | +| `` | SDCC z80.lib | `sinf`, `cosf`, `sqrtf`, ... | +| `` | наша libc | `errno` + константы ошибок + `strerror` | +| `` | наша libc | `setjmp` / `longjmp` | +| `` | SDCC | макрос `assert` | +| `` | наша libc | `read`, `write`, `close`, `lseek`, `unlink`, `SEEK_SET`/`CUR`/`END` | +| `` | наша libc | `open`, `creat`, `O_RDONLY`/`O_WRONLY`/`O_CREAT`/... | +| `` | наша libc | `stat`, `fstat`, `struct stat` | +| `` | наша libc | `getdatetime`, `setdatetime` + POSIX `time`/`localtime`/`gmtime`/`mktime`/`asctime`/`ctime` | + +## Sprinter-специфичные + +| Заголовок | Что предоставляет | +|---|---| +| `` | `putch`, `cputs`, `cprintf`, `kbhit`, `getch`, `getche`, `clrscr`, `gotoxy`, `wherex/y`, `wrchar`, `rdchar`, `textcolor`, `textbackground`, `textattr`, `get_videomode`, `set_videomode`, `COLOR_*` enum, `KEEP_EXIST_ATTR` | +| `` | Графика для 320×256×256 и 640×256×16: `gfx_init`/`gfx_done`, `gfx_pal_load`/`gfx_pal_set`, `gfx_clear`, `gfx_putpixel`, `gfx_hline`/`gfx_vline`, `gfx_rect`/`gfx_fill_rect`, `gfx_line`, `gfx_text`/`gfx_putchar`, все варианты `*16` для 16-color режима, управление шрифтом через `gfx_load_default_font`/`gfx_set_font` | +| `` | Полная обёртка из 14 функций драйвера: `mouse_init`/`mouse_show`/`mouse_hide`/`mouse_read`/`mouse_goto`/`mouse_bounds_*`/`mouse_text_cursor`/`mouse_load_cursor`/`mouse_get_cursor`/`mouse_set_sensitivity`/`mouse_get_sensitivity_*`/`mouse_video_mode_changed`/`mouse_refresh`, плюс структуры `mouse_cursor_t` и `mouse_state_t` | +| `` | `chdir`, `getcwd`, `mkdir`, `rmdir`, `ffirst`, `fnext`, структура `ffblk` | +| `` | Сырые номера портов, константы ESTEX/BIOS function numbers, `__sfr` intrinsics для paging, `print_hex`, `getenv`, `putenv` | +| `` | `exit`, `_exit`, `atexit` | +| `` | `mem_alloc_pages`, `mem_free_block`, `mem_get_page`, `mem_info`, `bank_read`, `bank_write`, `bank_load_byte`, `bank_store_byte` | +| `` | Solid-C compatibility shims — подтягивает стандартные заголовки и добавляет типы `BOOL`/`uint`/`WORD`/`f_point`, алиасы `setmem`/`movmem`, `inp`/`outp`, `enable`/`disable`, `min`/`max`, `home()`, `seek`/`tell`/`remove`, `_ffirst`, mouse-алиасы `ms_*` и т.д. | + +## Быстрая навигация: я хочу... + +* **Вывести текст** → `` (`printf` / `puts` — быстро, без цвета) или + `` (`cprintf` / `cputs` — применяет `textcolor`). +* **Прочитать клавишу** → ``: `getch()` (blocking, без эхо), + `getche()` (с эхо), `kbhit()` (non-blocking poll). +* **Открыть / прочитать / записать файл** → `` + `` (POSIX) + или `` (семья `fopen`). +* **Прочитать каталог** → ``: `ffirst` / `fnext`. +* **Нарисовать пиксели** → ``. +* **Выделить память** → ``: `malloc` / `free` / `calloc` / `realloc`. +* **Получить текущее время** → ``: `getdatetime` или POSIX `time`/`localtime`. +* **Прочитать мышь** → ``. +* **Прочитать env var** → ``: `getenv` / `putenv`. +* **Задать цвет текста** → ``: `textcolor(COLOR_YELLOW)`, + `textbackground(COLOR_BLUE)`, или `textattr(COLOR(fg, bg))`. diff --git a/release_docs/ru/memory_modes.md b/release_docs/ru/memory_modes.md new file mode 100644 index 0000000..74df7bd --- /dev/null +++ b/release_docs/ru/memory_modes.md @@ -0,0 +1,51 @@ +# Режимы памяти + +Адресное пространство CPU Sprinter — четыре окна по 16 КБ. ESTEX DSS +выделяет страницы RAM по размеру программы — программам ≤16 КБ +выделяется **одна** страница. Из-за этого "очевидная" Spectrum-style +раскладка "код в W1, данные в W2" для маленьких программ молча ломается. +Именно поэтому `sprinter-cc` имеет явные memory modes. + +## Пять режимов + +| Mode | Код в | Данные в | Банки в | Когда использовать | +|---|---|---|---|---| +| `tiny` (default) | W2 (0x8100+) | сразу после кода | — | код + данные ≤ 14 КБ | +| `small` | W1 (0x4100+) | сразу после кода | — | код + данные ≤ 30 КБ | +| `big` | W2 (0x8100+) | сразу после кода | **W1** (0x4000) | tiny + дополнительные banked-модули | +| `huge` | W1 (0x4100+) | W2 (0x8000+) | **W3** (0xC000) | small + дополнительные banked-модули | +| `manual` | задаётся вручную | вручную | вручную | специальные случаи | + +## Как выбирать + +Начните с **`tiny`**. Если `sprinter-cc` ругается "_CODE too big" или +программа таинственно не запускается — сразу переходите на `small`. + +Если кодовая база большая (>32 КБ) и нужно держать большую часть кода +вне always-resident окна — используйте `huge` и разбивайте модули на +банки через `--bank N=mod.c`. `big` — та же идея, но банки в W1 вместо +W3 — полезно когда W3 нужен для железа (графика, mapped-memory). + +## Стек и heap + +Стек начинается с `0xBFFE` (верх W2) и растёт вниз. Heap начинается +сразу после BSS и растёт вверх. По умолчанию они делят W2, с ~1.2 КБ +зарезервированными под стек и остальным под heap. + +`--stack-size N` резервирует больше (или меньше) под стек ценой heap. + +## Что внутри + +Каждый режим выбирает свой `runtime/crt0_*.s`: + +* `tiny`: `crt0.s` — SP = 0xBFFE, парсит argv, вызывает main. +* `small`: `crt0_small.s` — читает порт 0xC2 чтобы проверить дала ли + DSS уже W2. Если нет — выделяет страницу через ESTEX `$3D` и маппит + через `$3A SETWIN2` **до** переключения стека (BIOS-вызовы требуют + стек в W2, ESTEX — нет). +* `big`: `crt0_banked.s` с `BANK_W1=1` — банки живут по `0x{N}4000` и + trampoline'ы используют порт `0xA2`. +* `huge`: `crt0_banked.s` (default `BANK_W1=0`) — банки по `0x{N}C000` + через порт `0xE2`. Также включает small-mode W2 auto-allocation. + +Для `manual` см. синтаксис `sprinter-cc --memory-manual SPEC` в `sprinter_cc.md`. diff --git a/release_docs/ru/platform_reference.md b/release_docs/ru/platform_reference.md new file mode 100644 index 0000000..b4d73d9 --- /dev/null +++ b/release_docs/ru/platform_reference.md @@ -0,0 +1,374 @@ +# Platform Reference — особенности разработки под Sprinter + +Документ собирает все нетривиальные нюансы платформы Sprinter и нашего +C-toolchain'а, накопленные в процессе разработки. Если вы пишете +программу и что-то "молча не работает" — скорее всего ответ здесь. + +--- + +## 1. Архитектура Sprinter (cheat-sheet) + +* **CPU:** Z84C15 (Z80 совместимый), 21 МГц / 3.5 МГц. +* **Адресное пространство:** 4 окна по 16 КБ: + * **W0** (0x0000..0x3FFF) — ESTEX DSS система + * **W1** (0x4000..0x7FFF) — обычно HOME-программа + * **W2** (0x8000..0xBFFF) — обычно данные / стек + * **W3** (0xC000..0xFFFF) — обычно banked / видео +* **Порты page-select:** 0x82 / 0xA2 / 0xC2 / 0xE2 для W0..W3 соответственно. + Запись номера страницы переключает окно. **Чтение** — возвращает текущий + номер страницы (полезно для детектирования). +* **Системные вызовы:** + * `RST 10h` — ESTEX DSS, номер функции в C + * `RST 8` — BIOS, номер функции в C + * `RST 30h` — Mouse driver, номер функции в C +* **Видеорежимы:** 320×256×256, 640×256×16, 80×32 text, 40×32 text. +* **Формат EXE:** SprintEXE (512-байтный header + образ HOME + опциональные банки). + +--- + +## 2. Подводные камни вызовов системы + +### IX **обязательно** сохранять + +ESTEX и BIOS клобберят IX без предупреждения. SDCC использует IX как +frame pointer. Каждая обёртка над `RST 10h` / `RST 8` / `RST 30h` +ДОЛЖНА оборачивать вызов в `push ix` / `pop ix`: + +```asm +push ix +ld c, #0x47 ; ESTEX APPINFO +rst #0x10 +pop ix +``` + +Забудешь — frame pointer уедет, локальные переменные станут мусором, +debug будет долгим. + +### BIOS требует стек в W2 + +BIOS-вызовы (`RST 8` / `CALL 3D13h`) требуют SP в диапазоне 0x8000..0xBFFF +(W2). ESTEX-вызовы — нет (они используют свой стек). + +Практическое следствие: в `crt0_small.s` нельзя выделять W2 через +`BIOS $C4 EMM_GETPAGE + OUT (0xC2)`, потому что на этот момент стек +ещё в W1. Делается через **ESTEX `$3A SETWIN2`** — он маппит страницу +сразу из ESTEX без BIOS. + +### ESTEX `$46 ENV` — баг в документации + +`DiskSyscalls.txt v1.6` пишет: `A=0 — FOUND, A=1 — NOT FOUND`. Реально +наоборот: **A=0 — NOT FOUND**. Все наши getenv/putenv учитывают это. + +### ESTEX `$21 SYSTIME` — день недели 1-based + +`dow` (day-of-week) возвращается как `1..7` где `1 = Sunday`, `7 = Saturday`. +Если код ждёт `0..6` или `1..7` начиная с Monday — будет смещение. + +### ESTEX `$19 F_FIRST` и каталоги "." / ".." + +Запись с именем `"."` или `".."` для родительского каталога **не возвращается** +функцией F_FIRST при поиске `"*.*"` в подкаталоге. Если они нужны — +итерироваться через явные `"."` и `".."` запросы. + +### `puts()` после `PCHARS` иногда теряет следующий байт + +ESTEX `$5C PCHARS` после себя оставляет cursor state в котором +**следующий** `$5B PUTCHAR` может быть проигнорирован. Решение: +если нужна новая строка после PCHARS — встроить `\r\n` ВНУТРИ строки +для PCHARS, не вызывать отдельный PUTCHAR. Наш `puts()` так и делает. + +--- + +## 3. SDCC ABI — нетривиальные моменты + +### `__sdcccall(1)` — смешанная схема передачи + +* **1-й 16-битный аргумент** → HL +* **2-й 16-битный аргумент** → DE +* **3-й и далее** → стек +* **1-й uint8_t / char** → A (не L!) +* **Long-аргументы на стеке** → caller pops +* **Int-аргументы на стеке** → callee pops + +### Возврат значений + +* `int` / `uint16_t` / `pointer` → **DE** (НЕ HL как в старых SDCC!) +* `char` / `uint8_t` → A (low byte of DE) +* `long` / `uint32_t` → DE:HL (DE=low word, HL=high word) +* `float` → DE:HL по тому же layout + +Самая частая ошибка — `ld a, l` в обёртках для char-возврата. Нужно +`ld a, e` (потому что char идёт в low byte регистра возврата = E). + +### `__asm` блок клобберит DE, но SDCC об этом не знает + +SDCC иногда сохраняет указатель аргумента в DE между C-кодом и +inline asm. Если внутри `__asm` написать `ld a, d` или `ld a, e` +(например для извлечения возврата из RST), DE будет клобберн, и +post-asm код типа `c->field = ...` запишет в случайный адрес. + +**Решение:** парковать указатель в static BSS перед `__asm`, после +загружать заново: + +```c +static mouse_cursor_t *dest = 0; +void mouse_get_cursor(mouse_cursor_t *c) { + dest = c; + __asm + ; ... clobbers DE ... + __endasm; + mouse_cursor_t *p = dest; // SDCC fetches fresh from BSS + p->width = mc_width; // writes to correct address +} +``` + +### "Static без инициализатора" грабли BSS + +Несколько подряд `static uint8_t x;` БЕЗ `=0` могут сколлапсировать в +**один и тот же адрес** — записи в одну стомпают другие. + +```c +static uint8_t a; // адрес 0x9100 +static uint8_t b; // ТОЖЕ адрес 0x9100! +static uint8_t c; // ТОЖЕ 0x9100! + +a = 0xAA; b = 0xBB; c = 0xCC; +// a == b == c == 0xCC +``` + +**Решение:** всегда инициализировать: `static uint8_t a = 0;` — SDCC +гарантированно резервирует разные адреса. + +### z80.lib почти полная — НЕ переписывать + +SDCC z80.lib содержит работающие реализации: +- `atoi / atol / atof / strtol / strtoul` +- `malloc / free / calloc / realloc` (мы только переопределили heap location) +- `qsort / bsearch / rand / srand / abs / div` +- Полный `` (memcpy/memset/strlen/strcmp/strcpy/strchr/strstr/strtok/etc.) +- `` (toupper/tolower/isalpha/isdigit/etc.) +- `` (sinf/cosf/sqrtf/etc.) + +Линкер автоматически тянет нужное из z80.lib когда есть unresolved +symbol. Не переписывать ради переписывания. + +--- + +## 4. Banking — нюансы + +### ABI banked-вызовов + +SDCC эмитит для `void f(int x) __banked`: +- символ `b_f = N` (bank id = число из `--codeseg BANKn`) +- символ `_f` = адрес внутри банка (с `bank_id` в верхнем 8-битном байте) + +Вызов: +```asm +ld hl, #arg_value +push hl +ld e, #b_f ; E = bank id +ld hl, #_f ; HL = target addr (low 16 bits) +call ___sdcc_bcall_ehl +pop af ; caller cleans up arg +``` + +### Стековый "spacer" в trampoline + +Между ret-адресом callee'я и аргументами трамплин ОБЯЗАН вставить +**ровно 3 байта** (1 сохранённая страница + 2 байта внутреннего +bcall return). SDCC компилирует доступ к аргументам с offset'ом +5 +от стека. Любая разница ломает все banked-вызовы. + +### CRITICAL: `pop af; out (n), a` клобберит A + +Старый trampoline восстанавливал W3-страницу через `pop af` — +**клоббит A**, а SDCC возвращает uint8_t/char именно в A. Все +banked-функции с char-возвратом тихо теряли результат. + +Текущая версия использует `pop bc; ld c, #port; out (c), b` — порт +через C, значение через B, A сохраняется нетронутым. + +### Bank-local статические данные + +Для модуля целиком в банке: +```sh +sdcc --codeseg BANK1 --constseg BANK1 --dataseg BANK1 -c bank1.c +``` +Всё (код + const + BSS) живёт в банке. `mkexe -p 0` нужен чтобы BSS +загружался обнулённым (иначе будет FF из padding). + +Heap через `malloc()` из banked-функции работает прозрачно — heap в +W2 (HOME), W2 trampoline никогда не свопит, указатель валиден из +любого контекста. + +--- + +## 5. Видео-режимы и графика + +### Mode 0x81 (320×256×256) + +* Адресация: pixel `(x, y)` → CPU-адрес `0xC000 + x` с **Port_Y (0x89) = y** +* 320 байт на видимую строку +* Палитра: 256 цветов из 4 палитр (BIOS `$A4 PIC_SET_PAL`) +* Cleanup: 0x300..0x39F = mode-descriptors, 0x3E0..0x3FF = palette данные — НЕ трогать в обычной отрисовке + +### Mode 0x82 (640×256×16) + +* Та же row-addressing что и 320 mode (320 байт на строку) +* НО каждый байт = 2 пикселя по 4 бита +* **HIGH nibble (биты 7-4) = LEFT пиксель** (even x) +* **LOW nibble (биты 3-0) = RIGHT пиксель** (odd x) +* Доки пишут "первыми младшие 4 бита" — это про **временной** порядок + в FPGA-сериализаторе, **не пространственный** на экране +* Палитра: 16 нижних цветов из любой из 4 палитр + +### Графический Accelerator + +CPU-опкоды используются как control-сигналы (NOP-tricks): +- `LD D,D` (0x52) — "ждать LD A, imm для размера блока" +- `LD C,C` (0x49) — Fill mode (горизонталь): `LD (HL),A` заполняет N байт +- `LD E,E` (0x5B) — Fill mode (вертикаль): `LD (HL),A` заполняет N pix вертикально (авто-Y инкремент) +- `LD L,L` (0x6D) — Copy (horizontal) +- `LD A,A` (0x7F) — Copy (vertical) +- `LD B,B` (0x40) — выключить accel + +**КРИТИЧНО:** размер блока должен быть **immediate операндом** `LD A, n` (опкод 0x3E nn) сразу после `LD D,D`. Accel snoop'ит этот байт. `LD A, (mem)` (опкод 0x3A) — другой 2-й байт, accel захватит мусор. + +**КРИТИЧНО 2:** между `LD C,C` (Fill mode) и `LD (HL),A` (fire) **нельзя** ставить второй `LD A, #imm` — accel re-interpret'ит его как новый block-size. Color через `C`/`B` регистр + `LD A, C` (опкод 0x79, 1 байт). + +**Скорость:** ~7 µs/byte vs ~14-20 µs/byte ручного цикла → ~2-3× быстрее. + +**Прерывания:** DI/EI обязательны вокруг accel — он подменяет систему команд CPU, ISR в это время крашит. + +Реализация в `libc/gfx/gfx_lines.c` — `gfx_hline`/`gfx_vline`/`gfx_rect`/`gfx_fill_rect`. `gfx_clear` использует accel-burst column-major (320 vfill'ов × 256 пикселей за burst, ~4× быстрее ручного цикла). + +### Формат шрифта BIOS + +Шрифт 2 КБ = 256 chars × 8 rows × 1 byte/row, **interleaved row-major**: +`offset = row * 256 + char_code`. + +То есть row 0 всех 256 chars лежит в 0x000..0x0FF, row 1 в 0x100..0x1FF, ... +Не "char 0 в 0x000..0x007, char 1 в 0x008..0x00F"! Наивное `font[char*8+row]` даст нечитаемую кашу. + +Bit order внутри byte: **MSB-first**. Bit 7 = крайний левый пиксель. + +Получить системный шрифт: BIOS `$B8 WIN_GET_ZG`, DE = destination, читает 2 КБ. + +--- + +## 6. Memory modes + +DSS выделяет страницы RAM по размеру программы. **Программа ≤16 КБ получает только 1 страницу.** В остальные окна подключается "страница `0xFF`" (read = 0xFF, write игнорируется). + +Из-за этого классическая раскладка "код в W1 (0x4100+), данные в W2 (0x8000+)" для маленькой программы **молча не работает** — write в W2 уходит в никуда. + +Решение — наши 5 режимов: + +| Mode | Layout | Trick | +|---|---|---| +| tiny | CODE + DATA в W2 | DSS гарантирует W2 (загружает в неё образ) | +| small | CODE в W1, DATA chained | crt0_small читает порт 0xC2 — если 0xFF, выделяет W2 через ESTEX `$3D`/`$3A` | +| big | tiny + банки в W1 | crt0_banked с BANK_W1=1, trampoline свопит порт 0xA2 | +| huge | small + банки в W3 | crt0_banked с default BANK_W1=0, trampoline на port 0xE2 | + +### Детектирование W2 — порт 0xC2 + +`IN A, (0xC2)` возвращает текущую страницу в W2. `0xFF` = "не выделена". Используется в crt0_small для auto-detect. + +**Грабли:** в первой версии стоял `IN A, (0xA2)` — это **W1**, не W2! Для small mode там всегда code-page (не 0xFF) → auto-detect не срабатывал, W2 не выделялась, программа крашилась. + +--- + +## 7. Mouse driver + +* Всё через `RST 30h`, номер функции в `C`. +* Координаты в **пикселях**. Для text mode 03h (80×32) делить x/8 и y/8. +* **Sensitivity = divider** (не коэффициент): меньше = быстрее курсор. + Документация ProgrammerManual пишет наоборот — это ошибка. +* MAME `$0E GET_SENSITIVE` возвращает 0 (stub). Workaround: всегда + ставить значение через `mouse_set_sensitivity()` при старте. +* MAME `$0B RETURN_CURSOR` пишет битмап в IX-буфер, но не обновляет H/L/D/E. + `mouse_get_cursor()` вернёт width/height/hot_x/hot_y как 0 — это известное ограничение эмулятора. +* **Cursor bitmap format**: 1 byte per pixel, row-major; `0xFF = transparent`. + Cursor живёт в отдельном видео-банке, не в 0x50 page. + +### `$81 CHANGE VIDEO MODE` + +При смене видеорежима — звать `mouse_video_mode_changed(new_mode)`. +**Важно:** аргумент `A = режим экрана` обязателен, в документации +указан но легко пропустить. Без него драйвер не пересинхронизирует +координаты, и в graphics mode может остаться text-mode XOR-курсор. + +--- + +## 8. Linker warnings — что есть и почему + +`sdldz80` пишет `?ASlink-Warning-Definition of public symbol '_X' found more than once` когда наша `sprinter.lib` override'ит функцию из SDCC's `z80.lib`. + +Текущие overrides: +- `_puts` — наш через PCHARS+\r\n vs SDCC стандартный +- `___sdcc_heap` — наш heap в W2 vs стандартный +- `_asctime`, `_localtime` — наш `posix_time.c` vs SDCC's `time.rel` (требует _RtcRead) + +Линкер берёт **первое найденное** определение — это наши. Warning только шум. + +`sprinter-cc` отфильтровывает эти warning-блоки из вывода `sdcc` (3 строки: warning + 2 follow-up `Library:` строк). Через `-v` всё видно. + +--- + +## 9. Текстовый вывод — Turbo-C convention + +В Sprinter нет ESTEX-функции "set persistent attribute" — только WRCHAR пишет char+attr единоразово. Поэтому два набора функций: + +| Группа | Header | Скорость | Цвет | +|---|---|---|---| +| stdio | `` | Fast (~5 µs/char через PCHARS / PUTCHAR) | НЕТ — ambient | +| conio | `` | Slow (~50 µs/char через WRCHAR) | ДА — `g_text_attr` | + +`puts` / `printf` / `putchar` — быстрые без цвета. Цвет = whatever shell оставил. Программа должна `clrscr_attr(attr)` если нужен конкретный default. + +`cputs` / `cprintf` / `putch` — медленные с цветом. Применяют `g_text_attr` (`textcolor`/`textbackground`/`textattr`). При `g_text_attr == KEEP_EXIST_ATTR` (0xFFFF) — fallback на fast path. + +**Cputs/putch НЕ делают `\n` → CR LF translation** (как в Turbo C). Caller должен явно писать `"\r\n"`. `puts` делает. + +--- + +## 10. Прочее + +### `dec/hex8/16/32` — мини-форматтеры + +Solid-C-style минимальный вывод чисел без формата: +```c +hex8(0xAB); // печатает "AB" +hex16(0xCAFE); // "CAFE" +dec16(50000); // "50000" +``` +Использовать когда не хочется тащить полный printf. + +### `` + +Единый header который подтягивает все стандартные + добавляет Solid-C +shims: `BOOL`/`uint`/`WORD`/`f_point` types, `setmem`/`movmem`/`min`/`max` +макросы, `inp`/`outp`, `enable`/`disable`, `ms_*` mouse aliases. +Программы из Solid-C 2004 портируются с минимальными правками. + +### `--debug` runtime flag + +```sh +sprinter-cc --debug -o foo.exe foo.c +``` +Prepend'ит `DEBUG_RT = 1` в crt0 + передаёт `-DDEBUG_RT` в SDCC. Открывает symbol `_w2_self_allocated` (uint8_t) — runtime diagnostic кто аллоцировал W2 (0 = DSS, 1 = crt0 сам). Полезно для troubleshooting'а в small mode. + +### MAME testing workflow + +```sh +make floppy # пакует все .exe + data в mame/v306/IMG/mc.img +cd mame/v306 && ./run_mame.sh +``` +Имена файлов на флопе должны быть 8.3 (FAT12). Все примеры названы соответственно — `banked_big → bankedbg`, `seek_demo → seek`, `time_dir_test → timedir`, etc. + +--- + +## История изменений + +- 2026-06-01 — первый релиз v1.0 diff --git a/release_docs/ru/sprinter_cc.md b/release_docs/ru/sprinter_cc.md new file mode 100644 index 0000000..82ada9e --- /dev/null +++ b/release_docs/ru/sprinter_cc.md @@ -0,0 +1,82 @@ +# `sprinter-cc` — драйвер компилятора + +Однострочный вход во всю цепочку инструментов. Принимает `.c` файлы и +опции, выдаёт SprintEXE. + +## Синопсис + +``` +sprinter-cc -o OUT.exe SRC.c [more.c ...] [options] +``` + +## Опции + +### Раскладка памяти + +| Флаг | Описание | +|---|---| +| `--memory MODE` | `tiny` (по умолчанию), `small`, `big`, `huge`, `manual`. См. `memory_modes.md`. | +| `--memory-manual SPEC` | Для `--memory manual`: список `KEY=VAL` через запятую, например `CODE=W2,DATA=W2,BANKED=W3`. | +| `--stack-size N` | Сколько байт зарезервировать под стек. По умолчанию ≈1278. Большее значение уменьшает heap. | + +### Организация кода + +| Флаг | Описание | +|---|---| +| `--bank N=FILE.c` | Компилировать FILE.c в банк N (1..15). Повторяемый. Функции в banked-файлах нужны с квалификатором `__banked`. | +| `--crt0=TYPE` | Переопределение startup-файла: `default` / `minimal` / `banked` / `small`. Обычно выбирается автоматически по memory mode. | + +### Диагностика + +| Флаг | Описание | +|---|---| +| `--debug` | Подмешивает `DEBUG_RT = 1` в crt0 + передаёт `-DDEBUG_RT` в SDCC. Открывает runtime-symbols типа `_w2_self_allocated`. | +| `-v` | Verbose — печать каждой подкоманды. | +| `-h` / `--help` | Встроенная справка. | + +### Pass-through + +| Флаг | Описание | +|---|---| +| `-I PATH` | Дополнительный include-путь. | +| `-Wl FLAG` | Передать FLAG линкеру. | +| `--mkexe FLAG` | Передать FLAG в mkexe (например `--mkexe -p --mkexe 0` для zero-padded банков). | +| `-L 0xADDR` | Переопределить load-адрес. | +| `-E 0xADDR` | Переопределить entry-адрес. | +| `-S 0xADDR` | Переопределить стартовый стек. По умолчанию `0xBFFE`. | + +## Примеры + +Минимальная сборка: +```sh +sprinter-cc -o hello.exe hello.c +``` + +Программа побольше (не помещается в 14 КБ): +```sh +sprinter-cc --memory small -o big.exe big.c +``` + +Многобанковая игра: +```sh +sprinter-cc --memory huge -o game.exe \ + main.c --bank 1=engine.c --bank 2=ai.c --bank 3=audio.c +``` + +Свой размер стека: +```sh +sprinter-cc --stack-size 4096 -o app.exe app.c +``` + +## Что происходит внутри + +1. Выбирает crt0 на основе `--memory` (и наличия `--bank`). +2. Ассемблирует crt0 (с опциональным `DEBUG_RT` / `BANK_W1`). +3. Ассемблирует `heap_top.s` (custom значение если `--stack-size`). +4. Каждый `.c` → `.rel` через SDCC. +5. Bank-исходники компилируются с `--codeseg/--constseg/--dataseg BANK_n`. +6. Компилирует trampoline `runtime/bank.s` (если есть банки). +7. Линкует всё в `.ihx`, запускает `check_banks.py` для проверки 16 КБ лимита. +8. Вызывает `toolchain/mkexe/mkexe` для упаковки `.ihx` в SprintEXE. + +Промежуточные файлы лежат в `.sprinter-cc-/` рядом с выходным. diff --git a/runtime/bank.s b/runtime/bank.s new file mode 100644 index 0000000..1aa1d5e --- /dev/null +++ b/runtime/bank.s @@ -0,0 +1,70 @@ +;; ---------------------------------------------------------------------- +;; bank.s — Sprinter banked-call trampolines for SDCC __banked functions. +;; +;; ABI (verified empirically with SDCC 4.5, see memory/sdcc_banking.md): +;; On entry to ___sdcc_bcall_ehl: +;; E = bank id (1..15), HL = target address (low 16 bits). +;; Args already on stack, pushed by the caller right-to-left. +;; Stack picture once the trampoline finishes set-up and jp(hl) fires: +;; SP+0..1 = bjump return (callee's "ret address") +;; SP+2 = saved physical page (1 byte) +;; SP+3..4 = bcall caller return +;; SP+5.. = args ← __banked callees read from here +;; +;; The 3-byte spacer between callee ret and args is the contract SDCC bakes +;; into its codegen — touching it breaks all __banked calls. +;; ---------------------------------------------------------------------- + + .module bank + + .globl _bank_pages + .globl ___sdcc_bcall_ehl + .globl ___sdcc_bjump_ehl + +;; Choose between W3 (HUGE mode, default) and W1 (BIG mode, sprinter-cc +;; prepends `BANK_W1 = 1`). Keep in sync with crt0_banked.s. +.ifdef BANK_W1 +BANK_PORT = 0xA2 +.else +BANK_PORT = 0xE2 +.endif + +;; HOME area — always mapped, so the trampoline is reachable from any bank. + .area _CODE + +___sdcc_bcall_ehl:: + ;; The 3-byte spacer between bcall-ret and args (1-byte saved page + ;; + 2-byte bjump return address) is baked into SDCC's __banked + ;; codegen — callees access their args at fixed offsets from SP. + ;; We MUST keep that contract intact. + ;; + ;; The old `pop af; out (n), a` restore sequence clobbered A, + ;; dropping uint8_t return values. We use the `OUT (C), r` form + ;; (port via C, byte via B) so A is preserved. BC is scratch in + ;; SDCC __sdcccall(1), so clobbering it here is harmless. + in a, (#BANK_PORT) ; A = current bank-window page + push af ; push A:F (2 bytes) + inc sp ; keep only the A byte (1-byte spacer) + call ___sdcc_bjump_ehl + ;; Callee returned. A may hold a uint8_t return value. + dec sp ; widen back to 2 bytes + pop bc ; B = saved page (C = whatever F was) + ld c, #BANK_PORT ; C = bank-window select port + out (c), b ; OUT (port), B — A and F untouched + ret ; back to bcall caller + +___sdcc_bjump_ehl:: + push hl ; preserve target address + ld d, #0 ; D:E = 0:bank_id + ld hl, #_bank_pages + add hl, de ; HL = &_bank_pages[bank_id] + ld a, (hl) ; A = physical page for this bank + pop hl ; restore target address + out (#BANK_PORT), a ; map bank into banking window + jp (hl) ; tail-jump to callee + +;; Per-bank physical page table. Index = bank id (1-based; [0] is unused). +;; Filled at startup by crt0_banked.s. + .area _DATA +_bank_pages:: + .ds 16 diff --git a/runtime/crt0.s b/runtime/crt0.s new file mode 100644 index 0000000..933bf37 --- /dev/null +++ b/runtime/crt0.s @@ -0,0 +1,358 @@ +;; ---------------------------------------------------------------------- +;; crt0.s — Sprinter ESTEX C runtime startup, with argv parsing. +;; +;; What's special vs crt0_minimal.s: +;; After gsinit and before calling main, we read the ESTEX command-line +;; from the startup prefix (IX+0 = length, IX+1.. = ASCIIZ bytes) and +;; tokenize it in place into a static argv[] table. argc → HL, argv → DE +;; when we then `call _main`, which matches SDCC's __sdcccall(1) two-arg +;; ABI. Programs declared as `int main(void)` simply ignore the input +;; registers — no harm done — so this is the default crt0. +;; +;; Entry contract (per ESTEX EXEC): +;; IX -> startup prefix: +;; IX-3 = open file handle (only if EXE header.loader > 0) +;; IX-2 = memory block id (released automatically on EXIT) +;; IX-1 = current process level +;; IX+0 = command-line length (1 byte) +;; IX+1 = command-line bytes (ASCIIZ, up to 127 chars) +;; +;; Memory map: see compiler_approach memory file. +;; ---------------------------------------------------------------------- + + .module crt0 + .globl _main + + ;; Linker-emitted symbols (resolved at link time). + .globl s__INITIALIZER + .globl l__INITIALIZER + .globl s__INITIALIZED + .globl s__BSS + .globl l__BSS + +;; Tunables — match the constants in argv parsing below. +ARGV_MAX_ARGS = 16 ; including argv[0] +ARGV_BUF_BYTES = 128 ; cmdline buffer size (ESTEX max + 1) + +;; ___sdcc_heap_end (upper bound of the malloc free-list) lives in a +;; separate per-program file (runtime/heap_top.s) so it can be regenerated +;; with a custom value without re-assembling crt0. The default is set in +;; that file (0xBB00); sprinter-cc may emit a different value when +;; `--stack-size N` is given. + +;; ========================================================================= +;; AREA ORDERING — emitted up-front so the linker walks them in this order. +;; ========================================================================= + .area _HOME + .area _CODE + .area _INITIALIZER + .area _GSINIT + .area _GSFINAL + + .area _DATA + .area _INITIALIZED + .area _BSEG + .area _BSS + .area _HEAP + +;; ========================================================================= +;; Entry point — first instruction in _CODE, hence at --code-loc (0x4100). +;; ========================================================================= + .area _CODE +_start:: + ld sp, #0xBFFE + ld (_estex_startup_ix), ix ; save IX prefix pointer + + call gsinit + +.ifdef DEBUG_RT + ;; tiny mode never self-allocates a W2 page (CODE+DATA both live in W2, + ;; which DSS itself maps for us). Publish 0 to the diagnostic flag — + ;; must run AFTER gsinit since BSS is zeroed there and we want a + ;; deterministic value visible to user code from main() onward. + xor a + ld (_w2_self_allocated), a +.endif + + ;; Parse the ESTEX command-line into argv[]; populates _argc, _argv. + call parse_argv + + ;; Replace argv[0] (empty string placeholder) with the basename of the + ;; running .EXE. Safe to skip if ESTEX APPINFO fails. + call get_progname + + ;; Load argc/argv per SDCC __sdcccall(1): arg1 → HL, arg2 → DE. + ld hl, (_argc) + ld de, (_argv) + call _main + + ;; SDCC's int return → DE. Low byte is the exit code. + ld a, e + ld b, a + ld c, #0x41 ; ESTEX EXIT + rst #0x10 + ;; Should not return; halt loop just in case. +1$: halt + jr 1$ + +;; ========================================================================= +;; parse_argv — tokenize ESTEX cmdline into argv[]. +;; +;; The prefix: (IX+0) = length; (IX+1...) = ASCIIZ bytes. +;; We copy up to ARGV_BUF_BYTES-1 chars into our own buffer (so we can +;; overwrite separators with NUL), strip leading whitespace (DSS quirk), +;; then walk through tokens. argv[0] is set to an empty string because +;; ESTEX doesn't pass the program name in the prefix. +;; ========================================================================= + .area _CODE +parse_argv:: + ;; Copy cmdline body into argv_buf, NUL-terminate. + ld hl, (_estex_startup_ix) + ld a, (hl) ; A = cmdline length + cp #ARGV_BUF_BYTES + jr c, len_ok + ld a, #ARGV_BUF_BYTES-1 +len_ok: + ld c, a + ld b, #0 ; BC = number of bytes to copy + inc hl ; HL = body start (= IX+1) + ld de, #argv_buf + ld a, b + or a, c + jr Z, after_copy + ldir ; DE = one past last copied byte +after_copy: + xor a + ld (de), a ; NUL-terminate + + ;; Skip leading whitespace. + ld hl, #argv_buf +strip_ws: + ld a, (hl) + or a + jr Z, no_args + cp #0x20 ; ' ' + jr Z, strip_more + cp #0x09 ; tab + jr nz, have_first_token +strip_more: + inc hl + jr strip_ws + +no_args: + ;; Only argv[0] = "" — no real arguments. + ld hl, #empty_str + ld (argv_array), hl + ld hl, #0 + ld (argv_array+2), hl ; argv[1] = NULL + ld hl, #1 + ld (_argc), hl + ld hl, #argv_array + ld (_argv), hl + ret + +have_first_token: + ;; HL points at start of first real argument. + ;; argv[0] = empty string (placeholder for program name). + ld de, #empty_str + ld (argv_array), de + + ;; B = current argc (start at 1). Use B because HL/DE are busy. + ld b, #1 + +token_loop: + ;; Bound check: argc < ARGV_MAX_ARGS + ld a, b + cp #ARGV_MAX_ARGS + jr nc, tokens_done + + ;; argv[argc] = HL. Compute slot address = argv_array + argc*2. + push hl + ld a, b + add a, a ; A = argc * 2 + ld e, a + ld d, #0 + ld hl, #argv_array + add hl, de ; HL = &argv[argc] + pop de ; DE = current token pointer + ld (hl), e + inc hl + ld (hl), d + ex de, hl ; HL = token pointer again + + inc b ; argc++ + + ;; Advance past token (non-whitespace). +walk_token: + ld a, (hl) + or a + jr Z, tokens_done + cp #0x20 + jr Z, end_of_token + cp #0x09 + jr Z, end_of_token + inc hl + jr walk_token + +end_of_token: + ;; Replace separator with NUL. + xor a + ld (hl), a + inc hl + + ;; Skip extra whitespace. +skip_ws: + ld a, (hl) + or a + jr Z, tokens_done + cp #0x20 + jr Z, skip_more + cp #0x09 + jr Z, skip_more + jr token_loop +skip_more: + inc hl + jr skip_ws + +tokens_done: + ;; argv[argc] = NULL terminator. + ld a, b + add a, a + ld e, a + ld d, #0 + ld hl, #argv_array + add hl, de + ld (hl), #0 + inc hl + ld (hl), #0 + ;; Publish argc (16-bit, zero-extended from B). + ld a, b + ld (_argc), a + xor a + ld (_argc+1), a + ;; Publish argv = &argv_array[0] + ld hl, #argv_array + ld (_argv), hl + ret + +;; The empty string used as argv[0] placeholder — lives in code. +empty_str: + .db 0 + +;; ========================================================================= +;; get_progname — fetch the running program's full path via ESTEX APPINFO +;; (subfn 2, $47) and set argv[0] to the basename portion. +;; +;; ESTEX APPINFO: A=err, C=$47, B=subfn, HL=buf → A=err, CF=1 on error. +;; subfn 2 = full app path, e.g. "A:\PROGRAMS\ARGV_TES.EXE" +;; +;; On error or when no separator is found, we leave argv[0] as the empty +;; string placeholder that parse_argv set. +;; ========================================================================= + .area _CODE +get_progname:: + push ix ; ESTEX clobbers IX + ld hl, #progname_buf + ld b, #2 ; subfn 2 = app_path + ld c, #0x47 + rst #0x10 + pop ix + jr c, gpn_skip ; APPINFO failed → keep empty argv[0] + + ;; First make sure the buffer is null-terminated (it should already be). + ;; Then scan forward to find the end-of-string, then scan backwards to + ;; the last directory separator ('\' or ':'). + ld hl, #progname_buf +gpn_find_end: + ld a, (hl) + or a, a + jr Z, gpn_at_end + inc hl + jr gpn_find_end +gpn_at_end: + ;; HL points at the NUL. Walk backwards looking for '\' or ':'. Stop + ;; if we reach the start of the buffer — then the whole path is the + ;; basename. + ld de, #progname_buf +gpn_scan_back: + ld a, h + cp a, d + jr nz, gpn_dec + ld a, l + cp a, e + jr Z, gpn_set ; reached buffer start +gpn_dec: + dec hl + ld a, (hl) + cp #0x5C ; backslash + jr Z, gpn_after_sep + cp #0x3A ; colon (drive separator) + jr Z, gpn_after_sep + jr gpn_scan_back + +gpn_after_sep: + inc hl ; skip past the separator +gpn_set: + ld (argv_array), hl ; argv[0] = basename +gpn_skip: + ret + +;; ========================================================================= +;; Runtime data (HOME's _DATA / _BSS) +;; ========================================================================= + .area _DATA +_estex_startup_ix:: + .ds 2 + +_argc:: + .ds 2 +_argv:: + .ds 2 + +.ifdef DEBUG_RT +;; Runtime diagnostic: 0 = no extra W2 page was self-allocated by crt0 +;; (DSS gave us what we needed); 1 = crt0 had to allocate W2 itself. +;; Only present when sprinter-cc is invoked with --debug. +_w2_self_allocated:: + .ds 1 +.endif + + .area _BSS +argv_buf: + .ds ARGV_BUF_BYTES +argv_array: + .ds (ARGV_MAX_ARGS + 1) * 2 ; +1 for trailing NULL pointer +progname_buf: + .ds 128 ; ESTEX APPINFO app_path target + +;; ========================================================================= +;; gsinit — copy _INITIALIZER -> _INITIALIZED, then zero _BSS. +;; ========================================================================= + .area _GSINIT +gsinit:: + ld bc, #l__INITIALIZER + ld a, b + or a, c + jr Z, gsinit_bss + ld de, #s__INITIALIZED + ld hl, #s__INITIALIZER + ldir +gsinit_bss: + ld bc, #l__BSS + ld a, b + or a, c + jr Z, gsinit_done + ld hl, #s__BSS + ld (hl), #0 + dec bc + ld a, b + or a, c + jr Z, gsinit_done + ld d, h + ld e, l + inc de + ldir +gsinit_done: + + .area _GSFINAL + ret diff --git a/runtime/crt0_banked.s b/runtime/crt0_banked.s new file mode 100644 index 0000000..9749aa0 --- /dev/null +++ b/runtime/crt0_banked.s @@ -0,0 +1,459 @@ +;; ---------------------------------------------------------------------- +;; crt0_banked.s — Sprinter ESTEX C runtime startup with bank loading. +;; +;; Same entry contract as crt0.s, plus the EXE was packaged with +;; `loader > 0` so the file handle survives in (IX-3). +;; +;; Sequence: +;; 1. Boot stack in W1 (CODE area). We can't yet touch W2 because +;; small images (<16 KB) get only the W1 page from DSS — W2 reads +;; as 0xFF and ignores writes. This mirrors crt0_small.s. +;; 2. Detect via IN A,(#0xC2) whether DSS already mapped W2. If not, +;; ESTEX $3D GETMEM + $3A SETWIN2 maps a fresh page (BIOS $C4 + OUT +;; would require SP in W2, which we don't have yet). +;; 3. SP = 0xBFFE (now W2 is real RAM) +;; 4. Stash file handle + ESTEX block id from prefix +;; 5. GETMEM(_n_banks) → block id, then for each bank i in 1..n: +;; BIOS_EMM_GETPAGE → phys page → _bank_pages[i] +;; OUT (#0xE2), phys ; map into W3 +;; ESTEX READ 16384 bytes → 0xC000 ; load bank from file +;; 6. CLOSE file +;; 7. Standard gsinit + call _main + ESTEX EXIT +;; +;; _n_banks MUST be defined as `const uint8_t n_banks = N;` — we read it +;; before gsinit, so a plain initialized `uint8_t` would still hold 0 +;; (the initializer hasn't been copied yet) and bank loading would be +;; silently skipped, leaving window 3 mapped to a garbage page. +;; For zero banks, link crt0.s instead. +;; ---------------------------------------------------------------------- + + .module crt0_banked + .globl _main + .globl _n_banks + .globl _bank_pages + + .globl s__INITIALIZER + .globl l__INITIALIZER + .globl s__INITIALIZED + .globl s__BSS + .globl l__BSS + +;; argv parsing tunables — mirror crt0.s. +ARGV_MAX_ARGS = 16 +ARGV_BUF_BYTES = 128 +BOOT_STACK_BYTES = 32 ; enough for a few ESTEX RST 10h calls + +;; ----- Banking-window parameters ---------------------------------------- +;; Choose between W3 (default = HUGE mode) and W1 (BIG mode, prepended +;; BANK_W1 = 1 at assembly time by sprinter-cc). These constants steer +;; the bank-loading IO port and the address where each bank lives in +;; the program's virtual memory once mapped in. +.ifdef BANK_W1 +BANK_PORT = 0xA2 ; W1 page register +BANK_LOAD_ADDR = 0x4000 ; banks at 0x4000-0x7FFF when mapped +.else +BANK_PORT = 0xE2 ; W3 page register +BANK_LOAD_ADDR = 0xC000 ; banks at 0xC000-0xFFFF when mapped +.endif + +;; ----- Area declaration order --------------------------------------------- + .area _HOME + .area _CODE + .area _INITIALIZER + .area _GSINIT + .area _GSFINAL + + .area _DATA + .area _INITIALIZED + .area _BSEG + .area _BSS + .area _HEAP + +;; ========================================================================= +;; Entry point — first instruction in _CODE, hence at --code-loc (0x4100). +;; ========================================================================= + .area _CODE + +_start:: + ;; ----- Step 1: switch to W1 boot stack (W2 may be unmapped). ------- + ld sp, #boot_stack_top + push ix ; stash IX in W1 (W2 not yet safe) + + ;; ----- Step 2: detect / allocate W2. ------------------------------ + ;; Port 0xC2 = W2 page register. 0xFF means DSS hasn't mapped W2 + ;; (program ≤ 16 KB). Any other value means W2 is real RAM and we + ;; must NOT replace it (DSS may have stored bytes there). + in a, (#0xC2) + cp #0xFF + jr nz, w2_already_mapped + ;; ESTEX $3D GETMEM — alloc 1 page; A = block id, CF = err + ld b, #1 + ld c, #0x3D + rst #0x10 + jp c, abort_fault + ;; ESTEX $3A SETWIN2 — A = block id, B = page idx → map into W2 + ld b, #0 + ld c, #0x3A + rst #0x10 + jp c, abort_fault +.ifdef DEBUG_RT + ld a, #1 ; flag: we self-allocated W2 + jr w2_join +.endif + +w2_already_mapped: +.ifdef DEBUG_RT + xor a ; flag: DSS already gave us W2 +w2_join: +.endif + pop ix ; restore IX + ld sp, #0xBFFE ; canonical stack top (W2) +.ifdef DEBUG_RT + push af ; preserve flag across gsinit/bank load +.endif + + ;; Stash startup prefix info from IX (asxxxx syntax: disp(ix)). + ld a, -3 (ix) + ld (_estex_file_handle), a + ld a, -2 (ix) + ld (_estex_block_id), a + ld (_estex_startup_ix), ix + + ;; ---- Allocate _n_banks pages via ESTEX GETMEM ---- + ld a, (_n_banks) + or a, a + jr Z, skip_bank_load ; nothing to allocate + + ld b, a + ld c, #0x3D ; ESTEX GETMEM + rst #0x10 + jp c, abort_fault ; CF=1 → out of memory + ld (_bank_block_id), a ; remember block id + + ;; ---- For each bank i in 0..n-1 ---- + ld b, #0 ; B = page index inside block +load_bank_loop: + ld a, (_n_banks) + cp b + jr Z, load_bank_done ; B == n_banks → finished + + ;; --- Get physical page for slot B from BIOS EMM --- + push bc ; save loop counter + ld a, (_bank_block_id) + ld c, #0xC4 ; BIOS EMM_GETPAGE + rst #0x08 + pop bc + jp c, abort_fault + + ;; A = physical page. Store in _bank_pages[B+1]. + push af ; save A (the phys page) + push bc + ld c, b + inc c ; C = B+1 (1-based index) + ld b, #0 + ld hl, #_bank_pages + add hl, bc + pop bc + pop af + ld (hl), a ; _bank_pages[B+1] = phys + + ;; Map this page into the banking window (W1 for BIG, W3 for HUGE). + out (#BANK_PORT), a + + ;; ESTEX READ: A=handle, HL=buf, DE=count, C=0x13 + push bc ; save loop counter across RST + ld a, (_estex_file_handle) + ld hl, #BANK_LOAD_ADDR + ld de, #0x4000 ; 16384 bytes (one full bank) + ld c, #0x13 ; ESTEX READ + rst #0x10 + pop bc + jp c, abort_fault + + inc b + jr load_bank_loop + +load_bank_done: + ;; Close the executable file — banks are in RAM now. + ld a, (_estex_file_handle) + ld c, #0x12 ; ESTEX CLOSE + rst #0x10 + ;; Ignore CF from close. + +skip_bank_load: + ;; ---- Standard SDCC init path ---- + call gsinit +.ifdef DEBUG_RT + pop af + ld (_w2_self_allocated), a +.endif + + ;; Parse cmdline into argv[] (BSS now zeroed by gsinit), then fix + ;; argv[0] to the .EXE basename via APPINFO. Both routines fail + ;; gracefully (argv[0] stays empty if APPINFO returns CF=1). + call parse_argv + call get_progname + + ;; SDCC __sdcccall(1): main(argc, argv) → arg1=HL, arg2=DE. + ld hl, (_argc) + ld de, (_argv) + call _main + + ;; main returned: int return is in DE per SDCC 4.5 __sdcccall(1). + ld a, e + jr exit_with_a + +_exit:: + ;; Userspace _exit(int code) — code in HL (single-arg ABI). + ld a, l + +exit_with_a: + ld b, a + ld c, #0x41 ; ESTEX EXIT + rst #0x10 +1$: halt + jr 1$ + +abort_fault: + ;; Bail out with a sentinel exit code so failures are visible in the + ;; emulator / shell. + ld b, #0xFE + ld c, #0x41 + rst #0x10 +1$: halt + jr 1$ + +;; ========================================================================= +;; parse_argv / get_progname — identical copy of crt0.s. When we build +;; libsprinter.lib these two routines will be factored into argv.s and +;; linked once for all crt0 variants. +;; ========================================================================= + .area _CODE +parse_argv:: + ld hl, (_estex_startup_ix) + ld a, (hl) + cp #ARGV_BUF_BYTES + jr c, len_ok + ld a, #ARGV_BUF_BYTES-1 +len_ok: + ld c, a + ld b, #0 + inc hl + ld de, #argv_buf + ld a, b + or a, c + jr Z, after_copy + ldir +after_copy: + xor a + ld (de), a + + ld hl, #argv_buf +strip_ws: + ld a, (hl) + or a + jr Z, no_args + cp #0x20 + jr Z, strip_more + cp #0x09 + jr nz, have_first_token +strip_more: + inc hl + jr strip_ws + +no_args: + ld hl, #empty_str + ld (argv_array), hl + ld hl, #0 + ld (argv_array+2), hl + ld hl, #1 + ld (_argc), hl + ld hl, #argv_array + ld (_argv), hl + ret + +have_first_token: + ld de, #empty_str + ld (argv_array), de + ld b, #1 + +token_loop: + ld a, b + cp #ARGV_MAX_ARGS + jr nc, tokens_done + push hl + ld a, b + add a, a + ld e, a + ld d, #0 + ld hl, #argv_array + add hl, de + pop de + ld (hl), e + inc hl + ld (hl), d + ex de, hl + inc b + +walk_token: + ld a, (hl) + or a + jr Z, tokens_done + cp #0x20 + jr Z, end_of_token + cp #0x09 + jr Z, end_of_token + inc hl + jr walk_token + +end_of_token: + xor a + ld (hl), a + inc hl + +skip_ws: + ld a, (hl) + or a + jr Z, tokens_done + cp #0x20 + jr Z, skip_more + cp #0x09 + jr Z, skip_more + jr token_loop +skip_more: + inc hl + jr skip_ws + +tokens_done: + ld a, b + add a, a + ld e, a + ld d, #0 + ld hl, #argv_array + add hl, de + ld (hl), #0 + inc hl + ld (hl), #0 + ld a, b + ld (_argc), a + xor a + ld (_argc+1), a + ld hl, #argv_array + ld (_argv), hl + ret + +empty_str: + .db 0 + +;; ========================================================================= +;; Boot stack — reserved in _CODE (W1, real RAM). Used only during the +;; first few instructions of _start, before W2 is known-mapped. After we +;; switch SP to 0xBFFE this memory is just dead bytes in HOME. +;; ========================================================================= +boot_stack: + .ds BOOT_STACK_BYTES +boot_stack_top: + +get_progname:: + push ix + ld hl, #progname_buf + ld b, #2 + ld c, #0x47 + rst #0x10 + pop ix + jr c, gpn_skip + + ld hl, #progname_buf +gpn_find_end: + ld a, (hl) + or a, a + jr Z, gpn_at_end + inc hl + jr gpn_find_end +gpn_at_end: + ld de, #progname_buf +gpn_scan_back: + ld a, h + cp a, d + jr nz, gpn_dec + ld a, l + cp a, e + jr Z, gpn_set +gpn_dec: + dec hl + ld a, (hl) + cp #0x5C + jr Z, gpn_after_sep + cp #0x3A + jr Z, gpn_after_sep + jr gpn_scan_back + +gpn_after_sep: + inc hl +gpn_set: + ld (argv_array), hl +gpn_skip: + ret + +;; ========================================================================= +;; Runtime data +;; ========================================================================= + .area _DATA +_estex_startup_ix:: + .ds 2 +_estex_file_handle:: + .ds 1 +_estex_block_id:: + .ds 1 +_bank_block_id:: + .ds 1 +_argc:: + .ds 2 +_argv:: + .ds 2 + + .area _BSS +argv_buf: + .ds ARGV_BUF_BYTES +argv_array: + .ds (ARGV_MAX_ARGS + 1) * 2 +progname_buf: + .ds 128 + +.ifdef DEBUG_RT +;; Runtime diagnostic — same semantics as in crt0.s / crt0_small.s. +_w2_self_allocated:: + .ds 1 +.endif + +;; ========================================================================= +;; gsinit — same as crt0.s (copy INITIALIZER, zero BSS) +;; ========================================================================= + .area _GSINIT +gsinit:: + ld bc, #l__INITIALIZER + ld a, b + or a, c + jr Z, gsinit_bss + ld de, #s__INITIALIZED + ld hl, #s__INITIALIZER + ldir +gsinit_bss: + ld bc, #l__BSS + ld a, b + or a, c + jr Z, gsinit_done + ld hl, #s__BSS + ld (hl), #0 + dec bc + ld a, b + or a, c + jr Z, gsinit_done + ld d, h + ld e, l + inc de + ldir +gsinit_done: + + .area _GSFINAL + ret diff --git a/runtime/crt0_minimal.s b/runtime/crt0_minimal.s new file mode 100644 index 0000000..37e7f0b --- /dev/null +++ b/runtime/crt0_minimal.s @@ -0,0 +1,110 @@ +;; ---------------------------------------------------------------------- +;; crt0_minimal.s — Sprinter ESTEX C runtime startup, no argv parsing. +;; +;; This is the opt-out variant for programs where every byte counts. +;; The DEFAULT runtime is runtime/crt0.s which also parses argv from the +;; ESTEX command line and passes argc/argv to main(). +;; +;; To use this instead of the default: +;; crt0.rel: $(PROJ_ROOT)/runtime/crt0_minimal.s +;; $(SDASZ80) -o $@ $< +;; +;; Otherwise identical to crt0.s — saves IX, calls gsinit, calls main +;; with no arguments, then EXIT via ESTEX $41. +;; ---------------------------------------------------------------------- + + .module crt0_minimal + .globl _main + + ;; Linker-emitted symbols for areas (resolved at link time). + .globl s__INITIALIZER + .globl l__INITIALIZER + .globl s__INITIALIZED + .globl s__BSS + .globl l__BSS + +;; ========================================================================= +;; AREA ORDERING — emitted up-front so the linker walks them in this order. +;; ========================================================================= + .area _HOME + .area _CODE + .area _INITIALIZER + .area _GSINIT + .area _GSFINAL + + .area _DATA + .area _INITIALIZED + .area _BSEG + .area _BSS + .area _HEAP + +;; ========================================================================= +;; Entry point — first instruction in _CODE, hence at --code-loc (0x4100). +;; ========================================================================= + .area _CODE +_start:: + ;; ESTEX already set SP from the EXE header, but make it explicit. + ld sp, #0xBFFE + + ;; Save startup prefix (IX) for argv/exit-code helpers. + ld (_estex_startup_ix), ix + + ;; Run SDCC global initialisers (concatenated into _GSINIT). + call gsinit + + ;; Hand off to user main. + call _main + + ;; SDCC 4.5 __sdcccall(1): int return is in DE, so low byte of main()'s + ;; return is in E. (See memory/sdcc_z80_abi.md.) + ;; main returned — terminate via ESTEX EXIT directly. We do NOT + ;; expose a _exit symbol; programs that need exit() / atexit() must + ;; link libc/io/atexit.c. + ld a, e + ld b, a + ld c, #0x41 ; ESTEX EXIT + rst #0x10 +1$: halt + jr 1$ + +;; ========================================================================= +;; Runtime data +;; ========================================================================= + .area _DATA +_estex_startup_ix:: + .ds 2 + +;; ========================================================================= +;; gsinit — copy _INITIALIZER -> _INITIALIZED, then zero _BSS. +;; SDCC appends per-unit init code between this label and the ret in _GSFINAL. +;; ========================================================================= + .area _GSINIT +gsinit:: + ;; --- Copy _INITIALIZER -> _INITIALIZED if non-empty --- + ld bc, #l__INITIALIZER + ld a, b + or a, c + jr Z, gsinit_bss + ld de, #s__INITIALIZED + ld hl, #s__INITIALIZER + ldir +gsinit_bss: + ;; --- Zero _BSS if non-empty --- + ld bc, #l__BSS + ld a, b + or a, c + jr Z, gsinit_done + ld hl, #s__BSS + ld (hl), #0 + dec bc + ld a, b + or a, c + jr Z, gsinit_done + ld d, h + ld e, l + inc de + ldir +gsinit_done: + + .area _GSFINAL + ret diff --git a/runtime/crt0_small.s b/runtime/crt0_small.s new file mode 100644 index 0000000..14c6185 --- /dev/null +++ b/runtime/crt0_small.s @@ -0,0 +1,395 @@ +;; ---------------------------------------------------------------------- +;; crt0_small.s — Sprinter ESTEX C runtime startup for SMALL memory mode. +;; +;; Layout (small mode): +;; CODE at 0x4100 (W1) +;; DATA chained after code by the linker (W1, possibly spills into W2) +;; STACK at 0xBFFE (top of W2, valid after W2 page is mapped) +;; HEAP from end-of-BSS up to ___sdcc_heap_end (default 0xBB00) +;; +;; Size auto-detect: +;; For programs < ~14 KB, DSS allocates exactly ONE 16 KB page (W1). W2 +;; is "page #FF" (read=0xFF, writes ignored) and we must allocate & +;; map a page ourselves. For programs that already span > 16 KB (the +;; linker emitted bytes above 0x7FFF), DSS allocates TWO pages on its +;; own — W2 already RAM — and we MUST NOT call SETWIN2, or we'd swap +;; the DSS-loaded code page out of W2. +;; +;; We auto-detect by writing a test byte at 0xBFFF (well above stack +;; pushes) and reading back. Match → W2 is RAM, skip allocation. +;; Mismatch → W2 is page #FF, allocate via ESTEX $3D + $3A. +;; +;; Chicken-and-egg: +;; DSS sets SP from the EXE header (0xBFFE) — in unmapped W2 for small +;; programs. Pushes silently fail; first `call` returns to 0xFFFF and +;; crashes. Boot stack lives in HOME (W1, real RAM) until W2 is ready. +;; +;; Why ESTEX $3A SETWIN2 not BIOS $C4 + OUT (0xC2): +;; BIOS calls require SP in W2 (0x8000..0xBFFF) — exactly what we don't +;; have yet. SETWIN2 is ESTEX, works with W1 stack. +;; +;; Entry contract — same as crt0.s. +;; ---------------------------------------------------------------------- + + .module crt0_small + .globl _main + + ;; Linker-emitted symbols (resolved at link time). + .globl s__INITIALIZER + .globl l__INITIALIZER + .globl s__INITIALIZED + .globl s__BSS + .globl l__BSS + +;; Tunables — mirror crt0.s. +ARGV_MAX_ARGS = 16 +ARGV_BUF_BYTES = 128 +BOOT_STACK_BYTES = 32 ; enough for 2-3 nested RST 10h/RST 8 calls + +;; ========================================================================= +;; AREA ORDERING. +;; ========================================================================= + .area _HOME + .area _CODE + .area _INITIALIZER + .area _GSINIT + .area _GSFINAL + + .area _DATA + .area _INITIALIZED + .area _BSEG + .area _BSS + .area _HEAP + +;; ========================================================================= +;; Entry point — must be FIRST in _CODE so it lands at --code-loc (0x4100). +;; W2 is unmapped at this instant — no `call` allowed until we point SP at +;; boot_stack_top (in W1, declared just below). +;; ========================================================================= + .area _CODE +_start:: + ;; Switch to the boot stack in W1. The DSS-set SP=0xBFFE may point + ;; into unmapped W2 — pushing there silently fails and the first call + ;; would return to 0xFFFF. Boot stack lives in HOME (W1, real RAM). + ld sp, #boot_stack_top + + ;; The DSS startup-prefix pointer is in IX. Stash it on the boot + ;; stack — _estex_startup_ix is in W2 which may not be RAM yet. + push ix + + ;; ----- Step 1: detect whether W2 is already mapped. ----------------- + ;; Port 0xC2 is the W2 page register (0x82/A2/C2/E2 = W0/W1/W2/W3). + ;; Reading it returns the page number currently selected for W2; page + ;; 0xFF is the "unmapped" sentinel (read=0xFF / write-ignored). A + ;; non-0xFF value means DSS already allocated and mapped a real RAM + ;; page for W2 — this happens for programs whose HOME image extends + ;; past 0x7FFF (DSS allocates as many pages as the image size demands). + in a, (#0xC2) + cp #0xFF + jr nz, w2_already_mapped + + ;; ----- Step 2a: W2 unmapped → allocate one page and map it. -------- + ;; ESTEX $3D GETMEM: B = npages → A = block id, CF = err. + ld b, #1 + ld c, #0x3D + rst #0x10 + jr c, w2_alloc_fail + ;; A = block id of the freshly-allocated 1-page block. + + ;; ESTEX $3A SETWIN2: A = block id, B = page idx → maps to W2. This + ;; is an ESTEX (RST 10h) call, not BIOS (RST 8) — BIOS would require + ;; SP in W2, which is exactly what we don't have yet. + ld b, #0 ; page 0 of the 1-page block + ld c, #0x3A + rst #0x10 + jr c, w2_alloc_fail +.ifdef DEBUG_RT + ld a, #1 ; flag: we self-allocated W2 + jr w2_join +.endif + +w2_already_mapped: +.ifdef DEBUG_RT + xor a ; flag: DSS already gave us W2 +w2_join: +.endif + ;; ----- Step 3: switch to the canonical SP at the top of W2. -------- + ;; Pop IX back from the boot stack first. + pop ix + ld sp, #0xBFFE +.ifdef DEBUG_RT + ;; Save the self-alloc flag across gsinit (which clobbers BC/DE/HL and + ;; zeroes BSS). SP is in W2 now, push is safe. + push af +.endif + + ;; ----- Step 5: save IX prefix in its canonical W2 slot. ------------- + ld (_estex_startup_ix), ix + + ;; ----- Step 6: standard gsinit + argv flow (identical to crt0.s). -- + call gsinit +.ifdef DEBUG_RT + pop af + ld (_w2_self_allocated), a +.endif + call parse_argv + call get_progname + + ld hl, (_argc) + ld de, (_argv) + call _main + + ;; SDCC int return in DE. Low byte = exit code. + ld a, e + ld b, a + ld c, #0x41 ; ESTEX EXIT + rst #0x10 +1$: halt + jr 1$ + +;; ------------------------------------------------------------------------- +;; W2 allocation failed — there's not much we can do without DATA/BSS. +;; Try to abort via ESTEX EXIT with a non-zero code (no return). +;; ------------------------------------------------------------------------- +w2_alloc_fail: + ld b, #0xFE ; arbitrary failure code + ld c, #0x41 ; ESTEX EXIT + rst #0x10 +2$: halt + jr 2$ + +;; ========================================================================= +;; Boot stack — reserved in HOME (W1, real RAM). Used only during the +;; first few instructions of _start, before W2 is mapped. After we switch +;; SP to 0xBFFE the boot stack memory is just dead bytes in HOME. +;; ========================================================================= +boot_stack: + .ds BOOT_STACK_BYTES +boot_stack_top: + +;; ========================================================================= +;; parse_argv / get_progname / runtime data / gsinit — same as crt0.s. +;; Kept inline rather than factored out to keep crt0 build self-contained. +;; ========================================================================= + .area _CODE +parse_argv:: + ld hl, (_estex_startup_ix) + ld a, (hl) + cp #ARGV_BUF_BYTES + jr c, len_ok + ld a, #ARGV_BUF_BYTES-1 +len_ok: + ld c, a + ld b, #0 + inc hl + ld de, #argv_buf + ld a, b + or a, c + jr Z, after_copy + ldir +after_copy: + xor a + ld (de), a + + ld hl, #argv_buf +strip_ws: + ld a, (hl) + or a + jr Z, no_args + cp #0x20 + jr Z, strip_more + cp #0x09 + jr nz, have_first_token +strip_more: + inc hl + jr strip_ws + +no_args: + ld hl, #empty_str + ld (argv_array), hl + ld hl, #0 + ld (argv_array+2), hl + ld hl, #1 + ld (_argc), hl + ld hl, #argv_array + ld (_argv), hl + ret + +have_first_token: + ld de, #empty_str + ld (argv_array), de + ld b, #1 + +token_loop: + ld a, b + cp #ARGV_MAX_ARGS + jr nc, tokens_done + + push hl + ld a, b + add a, a + ld e, a + ld d, #0 + ld hl, #argv_array + add hl, de + pop de + ld (hl), e + inc hl + ld (hl), d + ex de, hl + + inc b + +walk_token: + ld a, (hl) + or a + jr Z, tokens_done + cp #0x20 + jr Z, end_of_token + cp #0x09 + jr Z, end_of_token + inc hl + jr walk_token + +end_of_token: + xor a + ld (hl), a + inc hl + +skip_ws: + ld a, (hl) + or a + jr Z, tokens_done + cp #0x20 + jr Z, skip_more + cp #0x09 + jr Z, skip_more + jr token_loop +skip_more: + inc hl + jr skip_ws + +tokens_done: + ld a, b + add a, a + ld e, a + ld d, #0 + ld hl, #argv_array + add hl, de + ld (hl), #0 + inc hl + ld (hl), #0 + ld a, b + ld (_argc), a + xor a + ld (_argc+1), a + ld hl, #argv_array + ld (_argv), hl + ret + +empty_str: + .db 0 + + .area _CODE +get_progname:: + push ix + ld hl, #progname_buf + ld b, #2 + ld c, #0x47 + rst #0x10 + pop ix + jr c, gpn_skip + + ld hl, #progname_buf +gpn_find_end: + ld a, (hl) + or a, a + jr Z, gpn_at_end + inc hl + jr gpn_find_end +gpn_at_end: + ld de, #progname_buf +gpn_scan_back: + ld a, h + cp a, d + jr nz, gpn_dec + ld a, l + cp a, e + jr Z, gpn_set +gpn_dec: + dec hl + ld a, (hl) + cp #0x5C + jr Z, gpn_after_sep + cp #0x3A + jr Z, gpn_after_sep + jr gpn_scan_back + +gpn_after_sep: + inc hl +gpn_set: + ld (argv_array), hl +gpn_skip: + ret + +;; ========================================================================= +;; Runtime data — same layout as crt0.s. Lives in DATA/BSS which the +;; linker places in W2 (--data-loc 0x8000). +;; ========================================================================= + .area _DATA +_estex_startup_ix:: + .ds 2 + +_argc:: + .ds 2 +_argv:: + .ds 2 + + .area _BSS +argv_buf: + .ds ARGV_BUF_BYTES +argv_array: + .ds (ARGV_MAX_ARGS + 1) * 2 +progname_buf: + .ds 128 + +.ifdef DEBUG_RT +;; Runtime diagnostic: 0 = DSS already mapped W2 for us (program > 16 KB, +;; or some other case); 1 = crt0 had to allocate and map W2 itself via +;; ESTEX $3D + $3A. Only present when sprinter-cc is invoked with --debug. +_w2_self_allocated:: + .ds 1 +.endif + +;; ========================================================================= +;; gsinit — copy _INITIALIZER -> _INITIALIZED, then zero _BSS. Identical +;; to crt0.s; runs AFTER W2 is mapped so writes to _INITIALIZED/_BSS land. +;; ========================================================================= + .area _GSINIT +gsinit:: + ld bc, #l__INITIALIZER + ld a, b + or a, c + jr Z, gsinit_bss + ld de, #s__INITIALIZED + ld hl, #s__INITIALIZER + ldir +gsinit_bss: + ld bc, #l__BSS + ld a, b + or a, c + jr Z, gsinit_done + ld hl, #s__BSS + ld (hl), #0 + dec bc + ld a, b + or a, c + jr Z, gsinit_done + ld d, h + ld e, l + inc de + ldir +gsinit_done: + + .area _GSFINAL + ret diff --git a/runtime/heap.s b/runtime/heap.s new file mode 100644 index 0000000..96d1c49 --- /dev/null +++ b/runtime/heap.s @@ -0,0 +1,48 @@ +;; ---------------------------------------------------------------------- +;; heap.s — Sprinter heap definition. Replaces SDCC's z80.lib heap.rel +;; with a DYNAMIC heap that auto-sizes to whatever space is left between +;; end-of-BSS and a fixed upper bound near the top of W2. +;; +;; Old design reserved a fixed `.ds 14000` after BSS, which overflowed +;; the stack at 0xBFFE in tiny mode and crashed once allocations crossed +;; that boundary. Even a static 8 KB would fail once CODE+DATA grew. +;; +;; New design: +;; ___sdcc_heap = label at start of _HEAP area (= end of _BSS, +;; placed by the linker) +;; ___sdcc_heap_end = absolute equate at HEAP_TOP (= 0xBB00 default). +;; malloc uses `&___sdcc_heap_end` as the upper +;; bound of the free list. +;; +;; Heap size = HEAP_TOP - end_of_BSS. Grows when code shrinks, shrinks +;; when code grows. Falls to 0 (malloc returns NULL) if BSS grows past +;; HEAP_TOP — safe, no crash. +;; +;; The gap (BSS_end..HEAP_TOP) is real RAM that simply isn't tracked by +;; the linker — it doesn't need to be, since nothing else is placed in +;; that range (the area-ordering in crt0.s ends with _HEAP). +;; +;; Reserve 0xBB00..0xBFFE (= 1278 bytes) for the stack — enough for +;; deep printf and most recursion. Override with -DHEAP_TOP=0xNNNN. +;; ---------------------------------------------------------------------- + + .module sprinter_heap + + .globl ___sdcc_heap_init + + ;; NOTE: ___sdcc_heap_end is defined in crt0.s (per-program crt0). + ;; We need it as an absolute equate (since malloc takes &symbol), + ;; and the value must be configurable per program via -DHEAP_TOP=N + ;; (or its derivative --stack-size). Putting it in crt0 means the + ;; library can stay HEAP_TOP-agnostic. + + ;; gsinit hook — calls into z80.lib's malloc.rel to wire up the + ;; free-list at startup (after _BSS is zeroed). + .area _GSINIT + call ___sdcc_heap_init + + ;; Heap start label — _HEAP follows _BSS in the area-ordering chain, + ;; so ___sdcc_heap = first byte after BSS. No bytes reserved here; + ;; the heap memory is the gap to HEAP_TOP (defined in crt0). + .area _HEAP +___sdcc_heap:: diff --git a/runtime/heap_top.s b/runtime/heap_top.s new file mode 100644 index 0000000..8589d12 --- /dev/null +++ b/runtime/heap_top.s @@ -0,0 +1,22 @@ +;; ---------------------------------------------------------------------- +;; heap_top.s — defines the absolute upper bound of the heap. +;; +;; This file is built PER-PROGRAM (not bundled into sprinter.lib) so the +;; value of ___sdcc_heap_end can be overridden without re-assembling the +;; library or the user's crt0. sprinter-cc may regenerate this file in +;; its working dir with a custom value when `--stack-size N` is passed; +;; otherwise the default below applies. +;; +;; malloc takes &___sdcc_heap_end as the upper bound of the free-list, +;; so the symbol's address (== the equate value) IS the heap ceiling. +;; +;; 0xBFFE — stack top (init SP in crt0) +;; 0xBB00 — heap top (default) → ~1278 bytes reserved for the stack +;; ... — heap grows up to here from end-of-BSS +;; end-of-BSS — heap start +;; ---------------------------------------------------------------------- + + .module sprinter_heap_top + + ___sdcc_heap_end = 0xBB00 + .globl ___sdcc_heap_end diff --git a/third_party/sdcc b/third_party/sdcc new file mode 120000 index 0000000..b67f4db --- /dev/null +++ b/third_party/sdcc @@ -0,0 +1 @@ +sdcc-4.5.0 \ No newline at end of file diff --git a/third_party/setup-sdcc.sh b/third_party/setup-sdcc.sh new file mode 100755 index 0000000..98edaf3 --- /dev/null +++ b/third_party/setup-sdcc.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +# Download and extract a vendored SDCC into third_party/sdcc-/. +# Idempotent: re-running with the same version is a no-op. + +set -euo pipefail + +VERSION="${1:-4.5.0}" + +here="$(cd "$(dirname "$0")" && pwd)" +cd "$here" + +uname_s=$(uname -s) +uname_m=$(uname -m) + +case "$uname_s" in + Darwin) + archive="sdcc-${VERSION}-x86_64-apple-macosx.tar.bz2" + sf_dir="sdcc-macos-amd64" + if [ "$uname_m" = "arm64" ]; then + echo "Note: macOS binary is x86_64; on Apple Silicon it runs via Rosetta 2." + if ! /usr/bin/arch -x86_64 /usr/bin/true 2>/dev/null; then + echo + echo "Rosetta 2 is not installed. Install it with:" + echo " softwareupdate --install-rosetta --agree-to-license" + echo + echo "Then re-run this script." + exit 4 + fi + fi + ;; + Linux) + archive="sdcc-${VERSION}-amd64-unknown-linux2.5.tar.bz2" + sf_dir="sdcc-linux-amd64" + ;; + *) + echo "Unsupported host OS: $uname_s" >&2 + exit 2 + ;; +esac + +dest="sdcc-${VERSION}" +if [ -d "$dest" ] && [ -x "$dest/bin/sdcc" ]; then + echo "SDCC ${VERSION} already vendored at third_party/${dest}" +else + url="https://sourceforge.net/projects/sdcc/files/${sf_dir}/${VERSION}/${archive}/download" + if [ ! -f "$archive" ]; then + echo "Downloading $archive..." + curl -fL -o "$archive.tmp" "$url" + mv "$archive.tmp" "$archive" + else + echo "Using cached $archive" + fi + echo "Extracting..." + rm -rf "$dest" + mkdir -p "$dest" + tar -xjf "$archive" --strip-components 1 -C "$dest" +fi + +ln -sfn "$dest" sdcc + +echo +echo "Verifying installed toolchain:" +"$here/sdcc/bin/sdcc" --version 2>&1 | head -3 || { + echo + echo "Failed to run sdcc; if you saw 'Bad CPU type' run:" + echo " softwareupdate --install-rosetta --agree-to-license" + exit 3 +} + +for tool in sdcc sdasz80 sdldz80 sdar sdobjcopy; do + if [ -x "$here/sdcc/bin/$tool" ]; then + echo " found: bin/$tool" + else + echo " MISSING: bin/$tool" >&2 + fi +done + +echo +echo "Done. Toolchain at: third_party/sdcc -> $dest" diff --git a/third_party/solid-c/AS.EXE b/third_party/solid-c/AS.EXE new file mode 100644 index 0000000000000000000000000000000000000000..7817c9daf94a23ae684eda4fb285131f6dfe23d7 GIT binary patch literal 11938 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 BBY*$^ literal 0 HcmV?d00001 diff --git a/third_party/solid-c/CC1.EXE b/third_party/solid-c/CC1.EXE new file mode 100644 index 0000000000000000000000000000000000000000..aa906094c426573516afbcc01844bc96531258df GIT binary patch literal 19398 zcmeFYhf|Y5_cl!Ey$S?SNI)P2>Cz!6AgDAcf^-Ebp+)IkR4jwY&-=c=Z|3_GzWH`$=RR}J*|R%)-@CJWo$J1F?*s>3;rstn2ALh^JDWB)hFDcU$%qJ*Q^Ks(y`MB6K<^6mxpn%h9 z8lX!zt;h;a|F3-gd|LS^AAFq8**gl*1x#zKDIerdEWtV_62LT_JXfW(_VYRUrssa; zYaQoLwp^;F;Ec+G(Bs8v^(+p9dNTV4)#bfoW)vGytum|G53{CgAq} zJ9?V)|0&iMrnd}11|W+^!Ek?gBs{sX{ zA_C!F-oYS{)hd&}P0u+n@`5_)W z1U(8wcm+Q22Z1?QX$;{(zW>$!XV@Nrfr!BWs&U}mbDSpjsEgFa#`2#^wi42ywQ(l@ zB;jn?a4xJz1OkDPQF{v)#)y;PKA08g0B~~?w6|t?`DSIfX$jXgc0>WNxc`cR8i!Om z4Tk5g#US!?Dm}zu44Z_6t0f{tDTiPhcJ3+>psFJ%KDuZICcQ5`hxBphJ>k7V6(?*SjjU%GIYB zCb4vmH1ai<5aw$FF|l(XqW53`R3-JgMk^naqavM6(St!s6eeg!|Ml1u2xWoh12lF< zAVFP9`-*f?T9-QxCI7}KAfmk_P&m}68a)le+R+fe7DBmj-rH-=YQ)yt>%wTu)Y}`t z?8&nFmx%uUl$kqf?^tE-I7FNLQZ%r}* zz^u^;0aL8jY9wGR&8m{f^(#gULTw$|o@|X|eKSKT7f#yndghzjjZ$p{@xUDL*hwSC#$ zJyA)5)Z<^y_bqGpTvM-g<%d&U+oM2_ojTD9QvSy8y^pWOjJB$1O(|}C`oKurd(*5d zT1Vpom03lX+v4QIt8dh&QfJ)D$T<2b*NB6^;J<9V|Ji1$JGV!f&X+wA>jA-TfuYAc z55n*1)9dh#YN{#PkE-YmFUifJq(){u#{CVg)3^g8-H{mX0_n4!wHst1^EPRK9Rt5Ubp(B$QtQz2}YaNUu; zWL>6I=>Bak5oeF2$C$0=bP_2h$B!R1`?!s`Hxsn%@qo?i%4OP8zskFk$5$#^WW)+f zcN*vJGid4XZBRjq?C#LAa`eR^eXdH!RbdF0nl1PJnpSEp`Z~MgNMP@SJVW}Zwt-63 zPsEA{d*$lVC!4{|F(7Vp3)6qATJq~@{_w?Nusb~H{jB!5M{*@d=LBiDN)K?PLPK|e;n@RN;_{sbv#g8r+KBe3}MCtrA;b?JT+ zRf5r?R+jv2#wY!+_-~el`&oK`U^ZNq$2nA4Igq7`&yvzi7JOz)pku1wIxu(DRW4GQ zDrxm+_IvEE(2=~vLvMPgT$JtHGe_p}$AJ=^oEu$J>TDFp7mV*5ce9`skzO5i;E!(=nImS+%98EA5 zCMlmm2GG}6S&(Ws=uqh4B4d4isyKu@~ov&-ipc) zfwbg`P6pIT-Pe~5*YPS!j`{Dm`Fu`)M5RP#E5?h0C-iE!3McyZWMc!o2Kp#lR8(ib z$=p#taA4N#zK1CYvTr)bvi;_7!`lyW*bhzGjgYN3%gA*D;gES}Z;>UdW2!Vrw#O*7 zF6`@Rqr9{ZUf&`UMvt;zlmgKqYvSco9T=vHdCaTda*V^|gXa~qnoDsG!NOC=u;$Cd zUWW=W6h&mD)}KplLwHb+c^6p}JqA?p5OU%_?US*Ca{dL>_IF(nV2Pc3z?bUZ?+h<@ z2+$h!fu0(Ne!4ox&*DN8Pam>I(?>R8(^fry#?pSP5yZMf zk~906{Qa&a;6rZA)KMMeTG*)GRF#-Rp{6=zWp0?MGbnbdZp zE{a2C{PA)zbIK8CywE=PQ_d^zXVs(w(&Ru*lWzg{YQ1|Gf8t-fTqSQAWOruImjQ9w z1GKj%Iv-APhzVLCy}SYNi2e^L;j={+-;NRnV+TGX@v2Hk;2T3V>pBny-RA3yl1YmY zm7QNlM@kdhPBQ&001i0!@*fFX+0`Oo5dXLB=PCV*E91aAm~iliG6SvV)I@9E?FoimFQKz=3mfyACxls^pEBd zR24dW>-HS9!+S!?KTDh=x5bQHM^Gb;055(HYMSaH+z7G2p@*>(QLT{fkL+8AwRI5Z zEp8z>+l{qk3tg6X-5gwLd0+&dE--MEPK+ZYdtbMeh?cSPzpE+4T9CO{$xRP*x*I;? z1j+u(q2%(tN{74(^#}tpXY6ta5W=2rF&HYE91jav;2F`c{B_WkQ6MEwnh1(&P*0m8 z+Y(NpYrxQc?iq{0c zfO8~H6D015$6F_jCdMpJF+|sp7HKqiKR4CWzDXBxeiPV3*x44(_kmfReg%kco1ro3 zVB*`stV+Eo#=Ftp_C-bm}# z)`~|*S~DZ+!J|Zdl*KkRmi)C5bSy#`=m$UaLf#p)m*C{_`_0{V{b=?FOe@+YHl9nO zvOzZMHIsw!d$ntAPN-hmbEjM82BvonZ_sq?j`kwnk2VYf*zQVJ4OdP}oH^q9)68+3 z#kjt-Gr$VCJosek<&^B+Uk&GLniNJKmuf+gC@LoRn8jO`K|9nr2kK(yYk$?pjyBqxt;^{C;->mn}I`*EguMW6VvB zVQg@Gu~>IyPYyCT3pUVdzeR3|!OVME<$j(Et;ZzWH{j}a^P~O4a9%$EZ8>%Ora!|+ z^V=8N+w6LA2X-iNCivkBBNXD&cMDEsndN%#AdIC75oqTy+=@)21_TTh(y7GTx#Qb8 zOw(&TR6oQ1P6=-}_=OUM#v3?t#$ zv%LOF2xTFxdp_QD!j+n#j#;7O$l&xu*gMN{IG8_o%$%<9Ak6I+Fo7ziJ6r{5%3>4H z`EH5|WZl;LJG~c;&3Y*WU}?zGx5beGkI?1yM1@rzXB!qFGb8}#{UvNO{K7LVb5(1| zp=}WT@O|t?;v+12dDXg2w&O=>Z})4bN1{X_a=Xs+_J>vN(~Sje_JMbc(FF~(z%51U zC%+AOv9Eu;LD-v(I!0zHSl~2j+RkU72kgIU{l(eWj)1anTNNa?3GlvLms>E7!mU*D zb{QWSRZA}|z2_bKypg%Iw3ds_Us)oR|E^C=Z2dXkk(jvDLq;Vgj*rbvIsMxR@lH;J zrRh~Cry0`bwyP86bb^8J@tbw_#6&%z#6%2eK{_#URen+}F%hRTdm}M%#pJI=V&c}_ zZ5P_}od+So2pYFQ58s;?+=Fn^-dw4Hh%dbX!SE1I%ZHxNNAZ5abz%!4iqH1^Y7*u{ z8>Hdk!Jp*=1E`+YbN@aN&m8n}x2iw(>?3vddU~N@MNSOv!wDfl@X!IPD6hjHCy&88 ziMO*oLEfmzUxASxYe3X{rJw8WGRd1Ep5b9|bNb+jM;@9VqCx`T-&1O}4JW;5$2Y=! z%!2Ru-yMHAg78DO6(+}_jYK1(e8zfkLGFGb`SKnGvN3NIrSCopT=8NlE7r6_JgV{E zR)WXbVoMe4{VH$VTNhNFrkDB1cJDpEjWZwO{8bfLhL=&i_o!f)pGa~=GrW2d(8Wyw z|Kvl5pm@Y*O*|+O9T6dZT_Kb}N(3?@B(gVz61N%AKW!^^@CEhii}{ex#X&2!wYhe>`Jj!jB_MO&n~?*&eW91=B0zIn9|l0r2tJf>hh}@X zdQc-`1H^sdr$GKA898>l$9#sdA#I1?Yy3RA=<^FvX>P|ZCVOqxln8i4NMMLRCAKvd zsuFkIsEKo|MpnlGQMF*W7Y${XYuyV?2mAm%paP( zG9%N$Vg??sBc?vEgrpQi1}b|+PF_JvTSphBcg@k+B`P{5R`9awztb^phUT(|T=Ac*}-I9}~e z+%Fw?`Rl4u#bTur$Whse{R3}zb%}e`H6JP~03w$}K@yiGrTrBY%l1{Ss%mKY`#W4W zFf_h->$ZuhnYqOsODk)eyS8@s>>V7P?z-MTz5Lrv+shm7jbU1FO{{YCZvT9+pD170o)r|1Ux*pWwyr} zyZ#l712RKb*75};#AWx(X+Umx<|#QkA=g|e2_+r{Pci+SoJyV##Y9v=^ijji+`|2`p+JowP@+0jCeJ$q4+N=WRmv@%0YBz6c^ET>;rAq|{MfvOzrj>vOCx^yzK%qcULzCXH!mFPxsUIrM(JuUl&5Q7uBb?=sK%Q~S0{GMDhMmnbk(14A5^qp2n4k{oaZYrXUnH(1V*SA$md z!fM6qMTe242#>9I)Z5tATAJuvyq@d1-xqr!rn(*EO$CUvm4}M6gTy+=9Pxgx z$DS&75$$$N;U!UXXpXkexZ3F3IAz}nKuFgdT$O$fGUoH@m7zp`yrj>pX5}~r_;!o^ zImzr*6U$6aD{wQ%fn9scg-yxjOPpYD!2v*dmC#7AqXlLdh-tsQ8PM=XqsXqY=Tg%x z2chD@$HDqbIvQtBIrA4nYKvT!0hlFsku;Y;>mbrK|?3XN1yTV zV1Oe3B1QXy^k8dWt7n5N@~6_MaC@~j09e_p`~hA((yd+ix~$n4NXL*mMJEE$GnJ9o zjE&v9%A}?({yIZjD*@4-b(cs~501vj#pJwHsm;Eqiv9w;I#?}IGpfAScIfVX5gCgP z6)MP#CjsRc)n?QLDg!2XB@6t`*ICC^d-&dQjo)KHyRZM^g2#^w_S#@zXlH}38V{{< zzT0Ciu^6%1mA}>WGI+I0QnK&LzbG3&=g85l)4Fpu?bro$wpfslJ&BsOv>>7%9rk>i%n({1L}%IRgf&~~ic z!w&;OyPdb$PFI000{)zn4Au|m#WlWql z9m2&1TwmP}aP8SE%IMw79ZV6b?x~NyonSmgjB&FPYgMMN=+=m#Y-0gWpJkBG3>&#d zbfTp~HsjB~g=FcUjc1;7Bk~7eW3PQES@Ewb>&C7Vr0&%XH_qFfh!0mqCVt%49e(#< zZ;s?R%#xxveK0JyBL$55h(8z<{|N8xBc2grnU;47nRN!}6JIs{bzyMnw`Js8&H1^> zWP-o7Uz%UrSbyd-oy@u;z8+^GF2jyYcUjZ}f3k}4c3Y8S! zlPiAYdvH0(@mmErBtbqzS3IQe-hRkJWjJ#8b6ZfDTs~?WEqC<-TBhsLsIQ_fPy=iWUbvUkqfqtZ+K(5(8q7xVS0Ii>IZQ&FG^ zZB~3T{ZRbWsvbZ1aq9hDy?MJuZAv2`)0Z|CzzUhEdj!0il4H!BVt3zUu5(Ysur9>3zzrV{6BYJYfIUci1C2_uc-(_Yv=riX*%C?ugxKJ4w2=`n!B~8K;9p zh^N6X)ZR177?x;T8d!IVx(4FyzHnXJ-D=q4;&(f9f>uU<7uj)qxBcI`bvhnKOIvr5 zNBBRZT3TWzMT`ayM+!%mlk@gQWZi)K{@cvD1-ZY`tB9^fvJcs+n@jQ?gKzf|)O&T~ zd?DLTEK2l^eUpnU>XCLDgilyqnYVY$r_veVzkV)AuB+_R_VWoQ>0x z>HR_#OmCtxI5X-n#Z?-^*AaASSJiTY2Ok3-Mtl0&!UZ~nulN_hY^LxE+4aRYqWA}& zINI&F;%xES<2J`HgliVfmNEnpt*Cawi!bfq^Cyi%d-N$Tv6;lG7=&UY2sS#Og!Mu) znM7;`u-2Pq)qiIKYMi4mk$rLBbs&@FGk{sS$ER%PF@C&I?`iB1Lm7 z*sQO<&{tO^J4P{$pUS7@<#5mKpfCQJvuK1}d(4a;s=2|#j5fS1J|e0DidD{nyqpr5 z^F#v`cMiJrKr*2!`AiV%wE);3#%{f0m+ld`{#eSquCBwMiw<*!;yL6NL;jK?sT*Ow zm=NGy8^+&8e~yl@dt`&JyRI!dR8bi1`04dSM3sa%UwPSY#LF9MGMbfb~9^rJ@q=0)a_ z6eQ^s_y-1J-k;^xiaqO59IjE)&?0GS)sASB%5-!`v|vTGde@xzZ>E&qx?K@?XYj7& zJ-a4*BJ}=)QYW{-6nF2t74W9PM^L-)I49!k)Y1>>$KhX7N`Dkr1eOfmEiJQaDknlK zDodTJ0#mAMEGm9(jh>1N$&#&Ip&!t^;(1RCj%At8sDno_I*@f;sMPtMhYNau$_X0U zUPjnk!cNfpg}}U_bV--_*8KB9#(zn=`OHxg`|2wrnMP1hY)AdZ>4R}144ZYLLni?w zt)#U%W)7vFRi|vLp#;5m9PqD?({9^VS{V1b+UXYBMJ%HKU{G3-3l=(|XeSwD?9U9z z`OlN@tguF;=k?FVQI4*+KCJBpQ80=x6&g6nr45g_GW0RABD?f#`{e#~D$6)h_Suja zPnZz?oV4z>oUm8+G2>ft?U%~>*@ZS9=9ihsYp^X)wH!bWc7+>Ot=Ix#noqi3@c(jXp8X~DbF>Pvp=W&NnjOG<~w9lZ-yR=sWj@vq5fh$B!=9qoWfE}_Y zfTA*iu9G%)HC8@X!=TP8Ok6oYLJunB$R<|~-YWP1) zk2rtAuTi_(S|kJIf3e{D#9{r5Ejl^uJ2e74m>S@k&`My`o1u1U(7^<`em_|ivs#@7 zP_9hrZYeVS?0$EJYNT8Mk3zq?vI)1=3M#_@xu-6j7iQ~@Bw#VH_CZ9HuB?oqnOoH> zCb>gTi&aMf8dsr+PeOoL<-*Db1t|48da5xUI|nBhHxDo01%7*&z}7u6(y=U+Ym>a( zR~azdLDza=<#_YSM|$;7a^h4XEst2olO^C7MY3wcYHu%%`q6lDF)a8}{obX1Bg+_k z^@S8-*rgkHPVTO?O02C%nJ&I&(q%eKKU}!VS~jmTxx1MbYv_PV9I8~#{(8;Oq*6rw zc#5LJv#71rG&_2c0o;5ANY~i$1C5duFKU?huxKg|UHrD@E2SHc(kk=(UF-+z(CO_7 zgU(O)GOj*IvK}jD(VEC77i_rLF`kq5 zq9m2;g}~n?U7^y5pK71-;ENYd z3J?NJxAKrf5h+*IBswVbUC6mvnSZ)-DnGKd=PO$m^x~9;n~?k_oR%WIcmKKep2c*NdJyBAV~SuhglLM>}pI~W3{TqCItmr zJU|ttefqhpJP&?A9~l!P-|vI)+6xbhM#gE@is~X;!Wgxq+FI-1J{-zv_8)sut8sDh zP2LUijm;aBTF8y98{5BA8F&7rAWd;`e+B=ZYaWgE5-P*kPi8s%^fv_zd2k z1g5^A)j-CTzl?mJ`MbNH4$rRr?Owt2YxTZVzkX)V#{~C5y2i|8gl{m%M5feS_6k~? z*E3t@t44kPH9Qgsg=#h!O6DiDEBtv&+zG)yX&gvo*%kR#mn`S<4hH$?J^pJ6jgHhTfc%4)u)Dn0QW{MJAJrF4pnfQ zPg*rc^c9&$3=J-}0G5TC$8CRT>FQ+7OYSN#{Tv#g3u_XV5 z``eHSTY1-sjftI=n#H8e{7cofm5PlMyvsK+#Tf2Jrlj&JQZse8KybNpoJ@6o`Sh0& z5~~un*f}smeM~VGe%zsFXwqw%`J(;BQG0Udb7=(UhO^d_*BAFY^NT>;F{;A`y)$dS z*wCl#H|V2=t+)O`S45JX)Pr{U1(k>~N;?FYh%xKXw(KhHs{mx7&()sQIMvF9 zEH>P>Ec=sVpRm0djDv1>xq!c##p-T@@8+IDgBE=fA?Q>ZwBE(4=>=V1X$iR zMl}wq4;O z6jm5;B~M4+3sfYaXt2yZj2?bKn7PA)e#Rjymm_Ba&7nTW7-YZ`3 z0rJe<;d7VTLAoS|7KY61!hWA07_y8Kwy|$RbpUhMWPC(T5&>UeM8H%+`&34c+PAqu ztmUKupjualp@0J4!|-8|8Hr1ax9d>IHAByqwr)6Ud%iAeS@&T}y6|H*4%nh~C58iO zq@|<6CB(Hann{UvX9b4avSmB}bggybx};)La_Pw4l#dC@{0FPSQlxXa%36ozk2O#s zc6cSt+^D*DcM;UW=W{mkcD?zhi9VOpx3eTKxCQM_iuy>&lo~M!53F(GJjXqHh*kb| z9L#ZnJfF>t>YP{|u$#+}fq!ID&7Py{4A%ydW3Sh^g}V> zb#;R-Kj&HNa3HUZq>7AAj@~bBJfsCW$Z2rUcuqaoJnWn}CWXnIQm(9t?- z%;xI-7ftPg>XH;BW&iZa^#uBL>wMXBgk4Q?)&-wRxu^$3BmIMV%e=H?!1@V*}@L?v*%dgtX-23 z92C;sdIZ%+#@a`MWoR}Py$h6Q$`WjHA6f+ahbY~bx_+$NXb)Sqo?pXDNO$2eT@Fun zS8?R=y)a4i7rr;c54ty^SMw5cH}yh5W<=W)tt!t(i0s^xrB@4YyXU%XWnCJ4u%}W0 z_Z!Hu& zOegIA_+UF?e4-0<dh(t@X;#e=yVR~SLT}h;u}=tS#V1Gevywd;ONoP zE;HJZ&d4nj^-@4Ip&X9E&!CVu*B2;wKXS@KG~BXU@a@ zl3fE~oy+F8^m~5(Wpc2yylH*cHl}WXC=pAbdYmzsfM{Vh#4kg=vBnT)vyprB$M*j9 z?4-u}o~HK)KU^eiNu^zc%j3je+&R5w7NN0KGGesb^*WJQw((FPM7cIQ_*!6Us6~*= zlM#0~FaS3MD58sHfXQXxvQz^GB^F_x>Eg~cv!nZ#(uj|Gv#*lenXa9h5YDgoWknp# z3#FP346$0+#6}rp5|BOD?%BzTodf6-deQ$_FsPn)0Ge52OMB>N@BflSF8I31U`a|B zGDn0Z8Xy2V3?FbATH{G1JLY?zeVs?FBj&t_@cZJ0KJUWU_}WY}_v?sPg+ulAJ z8#w(df!F^rx`^PNx9Flc0<>by=#7trcpky+>##wQ)y(0E@wS$yOp14-$!b2f^RN=g z*zEZ}u6A7Pn@BZkFVd8EXjCYi83r&v_;))7a%DAilP1H;hf=+6FIu2FaG z{_&1hC$pd#;^|qRyV6)eD1P8J5R9KH4y7#?nk;z`<%oLTVEHcay89KKYOe8A?QvTh^h&lUhGJ z0V$~{M^)9j)fDmK52%`oQXK5dx8nLy`YK%UXqivg7)&){?`?5(VDHd$YkWoV=v4Wn zRaN+n@crNUp6N$Q!wqwQgY#jB8l0Be$snf&R&!RqF<(&!EQ=PBv{z-+WJ4keu`M7` z<%DKos@FUY-#WzsYC2{0b;F|DMQxG{`_0Zugh(n`BrLEs-ORAWuBO&+H9exegE3rE ziS}90#td);We1$Ql>Yp&>)a=GDKm^vOtN=Vbf%E^N^?=0&$_JWDfRJ~k+aGdBzLb5 zu1uR&TNc7{{0I2SfB-dl=~y4>P}rxD&}%DDM=vBB9auSA^6lMEYF7 z+PYom8J+)p2ArmVABt@Ri3uuiCzg6xL+-(Mbc3~c@MNpc);@YtcM?1h52RB= zpom)CR2Hd#-}FX6+PfCQ*5dOS9fn64D^mjFSB7{JxVYe@-SzJB=!+t!GxvmkGv3g= zkxyLzA%y;8U9i+iwSh1pS4`-F$yqxy|2ZeiJxnnXbd^d_*%tW?bnZ?6w`-Z;H=JL&Cqw2$8$VgP;1KnJ1=0YVkFOPmb=WukYA&C?16 z@~jN-z+YPVe;y)*lv3ZQ`}ncw5IXn!e?&KS#!#;gL>hX4I&ocSd%K% zI$-iWX#rR@@FIMrYvj)!x>6BIcC-#CK`-C*s{A&KhxjRR9^*Tin=w7fgEF_*woeC= zAGSq;@=C=9@(6EU^MBKLnw!z@Q>Relay4J7tq~>70ab}nLIyvT{%HKPh65$^pysCY z>|+!ftFmwS{xldVdMoodD{HZBUvy!cf4&yx4tKFdw2BU_=UoK}n%?5zt>)Lq;G$4p+y1spROR8Sebv>Gz3^=n*kNE3mGB zj_Rkp_i}5!x1t!)#M{Rv$oXR3n4v5zkc1nsQ{N*vz0=!53ol9^@yL3Kb7(iXWU+!a zq_nn;HG?C&qTU#}jUs@PqX_c5G*dE8?o!)>j8EQU{+udqgq5X^@Le}FpZnye!sZY?agqG?%ceADnbSw3UstM zl=lr*e(4q`mUqa)$KwC2bm>_4R-jC)Pp95q8YmVheydcyv9QBD@a6AKHq8n7wOBvM~h;3nInlb`kn(ja;9ZZ>c{77Lvv5{wQN`^XB5}P%Z8*wxmhL$pKXk6j( zqY+YS-3c3OX^)<6sb8&cc5#uO9dFu|x#UzoGv)ab!lKa6kCr~pu|JK6kb*7_{qCpwIDiiMGGv zYw_GP1!l1$n0*FP8UhF)^*Z_|a=HIiO}~_FXPLUqFaGLxFtr|Ttsxd>5&az7OZp*5 z$J*6#j1gfh0M5{$?O}OGMs)q{kpg)1?zw#3!3o;XJwEdft9tC_@ARzWR!0~QN_(a2 z1-=nbuHq-ud&sK|42#(h4@x!1dqX}9J%Iw_#oU_z00Y$P_#{_Hq1^-C1-g078O zAI#sr+F!x-aB7h>S1sx%Q8E9EC(8NMTon_tWq6~pv;m<{(Un`u)qT~wND|Wp1()P3 zV2JPJ_7daqyH#@p>Q~UJ+4Wx1`JxR(gg|T$*^gl}eds>wgi`}hH__*dg8f5C>woOw zS2r3gGvS*s<&+qyJ6W(RLM<=PuK~Dd!0C6$)!pKjEL7jVbv$8(xV%B)rW@rQSY7-5 z=kKwYCFYJ0-{4ISraF@S$sT3hOLrMJUpU<>e$6lfhm}{kmtN&KFK^=PA3*Y{^><`7 z^>H59b|hUiQ}D+^6W>Z=Z#39iub4N_t!3qxu>X?hZxMa@WQQx^!zB=s`ObDkvS!MO z?MEzvD+#}KF$z>i=)?k6!tlzdgBr-iHGUD@=S+gxAa+Va+j}7W&7IE+X=woM)Bmt$ zXj?1&OX;u&{daHFQ*s%Se2(5RF#7A_nIuX!=0!{LbX{YOI$YU^l_vVKVZues>P^(r zOp5;KzjJt0%a!TuUzb&6oNdl5S%d(4he1!lsg^=r`7qf4DH<~wDjqKMkF!Da5noo2 z1N2&JzXcIuTF?v{%;k#oDio77ALybYoyYA@J<@xYIK&j$ak8BNV!A=!HLy69P*j2^ zHGUYh%Wplf!L=(Xk`=9*=nB9mo?9Ux7XOh zhj6X}(iXTmI@`}2J2u&R=}H%$yoWI(X9P#n<5?iPvaBFpg+(k@%Cu+R&pOadtK6&- zE|!Qmsb)*F7t?E?`4P?@x%i^tLz;iH9#MUFHt8qiiWf9pHk;TBORZJaQc)WTR8&UV zE6Hm#e9|1S=k2@P5u5`83N3Qh^zS|^TeKz&D*Fd~ss5D3a!?ul6O^XAvp%R!icd0!D{Hd|B)zJKtb z^P3YEu6%Lkw5ud{5=vsWml(U*SJ}nAhx${>C761!wc4l1F-+B(n_xN$Wk6rJI}~19 z^9mX=?C>t=O*91pm>Eq^X2lyAXJ5Q^jH8CB>dhjr*#GhQVqLol{kyAaYr#m;OV3RF3UD1q7PV>*kEj!k8o4%7;(lA~e=BntUIUdfEeTOmr^I%?g!QfuF$wcDUK z?lW8>(i?qb%%>}UV~x8~hUw{;VYyQqQ2%|_;X}u+&r4(lq%-i(t0e2l<@m0n)B#Bo zj@AKI%bv&^R&%{!uD~t`|84x@+VR=%0fC6Bi56j0yg~ZuIR>Y2K#ooy9tmxvXO<*sUAcuNU|y`!QgBQSx&S% zGx$e*-tV($@s4U6HYQ{}Ys)s@SL?3_cAXN#%klL$>t)ENqxN^ac8!gj(f#d3(=WHO zKNwFZcNFeze@b%>KWYx;REj2??0<9#PwdZ*5vq{a9KQ2cL}BCF_keC(R=Vvh?O#f8 zDD(Zt9cj-E*=b+@yxWlE*wOfZ}qHY=CuT^j9am_!1nBh zHHcxKj!Zj10?#&RH}Or<<-iLCrTJl+I4t(Xj7s#CpHg^51*LKmGuHQ`^5fA%%;$o2 z>syY=IYvS+G9E-IU4zQA2A^N@kuyejKZsL#{$%RwH z3--0M!y6*;QuNR9gMN-LHg_XAK-{h;!@~{_he?fO+|4ze4?|&MFAx>((@t0@xm`~D z;Y`NFaHF>xhvz~L3;=AX^wQO{r=-XyizNgMnY&6}5OKV-2Ut?t=)J;?-@6TzW?_G` zS2>**#l1$Tq`Xs%x!fX!Fiie*0bE7A`n|j=`mEQfbDNsfbxu{tb)~nR2EwRW`zf>p zMh4%On?TR>x$9-^;^d)kGS(JPrz&N>^$NL-=a285L7Jj2b@|?J3n5)T*0GQr-zgn; zP_7JX4LFk5{SL|7-feJxUT0|L+p2)Y)i*MWDBjhFMC>)A>$CXo$691|MCxaLx68r^ zoCWFSzrRy}8Nj-f%HHli>`fR-7mgS`Exo-b*Mo73jOBV0=H_h`cB0SSHWAOe4L9|dw%A%AJY6ll8++8K9T+E^ObwL(vRr%Dm3q#w4aV2l;;v`%U*?HjwKBY7=L=DkHz zQX`zSSl-!U zn*sd9?#|kl+M4llU`w%Ree+gxVM`aCsq4sh(xYc5kGMo7#>(+NJAYYrzK2uE-vv}6 z57*yrFWO)^@WVO7b0WLuKh+y2a1~20D zgW`}!O%6RGAL*}HZ~y)ycR4a+f}S#2SW&p=Mhz10rDr&1dw_LJZ4iF7Mi$GJZw-NQ z*leWAo}|P;&bAcK_xM#Jm)$d#A-W*_`TK!A6Nzh-_UfevCZnru%kQ2EEuZ4K6nIb4 zzC`T^0B&t>UA!{7^9C>&RI6n}_eFG*mf`LwnqEq%3eljXjN12f=%sb>L?Gv#5c^$h z_CoF_Nl-91v&4?dh_n~9A zS^k`Ni4>Euu!XWKw*sLYBvEy@QSg*etn?_sxp)+Gu<3)MaU^Vp-2`~Gam0RSr2kE4 zgFQyQY3x4Ye(ZL~=dv&-Ul_An(r*zcRV!#YX%$!B$TgA*~UmNln{ z27;f~S8ozpNDG<$qbU{LA%xK(WImPtGMlydQ>YOq`I+I1Y{Loo;t_C?qZh_XpvrZxmD9Lq!0(@KkS;Isp@fnT1_&v<0U#I@MY4924)3Z6{oSM0alfWA%U7YZwr1RSD)P~3u z7%R`VoDFH*FI03QMz^lJxH3HC#vF#I=7s>gjsx>~p`ZH^|It{;)rY@~#d*9)u)({4 zlCP_x;swb(WCZTtzd^_>I)by+uu&z5QCWtRIIv@vbv!#&w9+%>x(?<_nyUBUCk#u+ zWaNCvNeNe*z4?KLAm<`QVOqP`a>|qyKs$cUNu?xQXxmURX zTisMm564AP z{h{{gmf30@;s;nn^BJ^>4r?-576`9A;HcoHF00bOG$ZJku-{uv47 zop)H7;Ul1dO=PcgC%X;`pqH8$ygi8e;c4U=W0LF=9jO^V%&!sLgrnttt)*M6T*dP1 z&rTyo>(OA;@e}er$;BenokjA+J}3GV!O*5u;9i-*y=K;<@geiUmHsFLFWCWtrw0GS z{tvPWL}_ztAZB%JX*ls4^9omTX>?^E9)fRZGnjqB;pN5M+DvfB>#eKB&$tV#%NQvzxGVq|5m&^GOK1@Ae?E zZ|I!)ZEke0-$EnYLSqcZXkl_m^~m$lQy_D6VdBx*vnl9rZFM?;aMVuT{L}Kg> z#gH>+%}Z%gSl?r-pURU@0+d-&G&3ULA|M!jD>c(FZa+a_ByOJDL^LM(SpjNhOvc}E zD{|({I4^E#%V&qWQkrc`Ro!Kl4kpYC$re`BXkNY*4J|*t0UXtTQEa zVpjNWXJmJtscz zyvcKUd0}|U!wpmXv`faAZ+=HyHJC{#pprD}fYluUY$>Lz zj7ZC$)Wf1j`24lh9*8lmMMR9xN(~FbWAS0V!^m>NnCft2X=yi*B2f{@NM|p6hk`L= zEtz#K4yBsHLuctv^Z{r({Q~;T4okMdp51E3?B*{CzV<^<)X@ z)sn3&)31-L-wZ?7FSj)~F{03#vqC(03KeOkve#QxOdiKeO-Qwd$&+hp3 z>>7wACOEU6Ia7MpWo~bVSFQ(j>+Fjdp^M*=j}e^=xU^<9admLB z#czQo(V0D4cD9M1cZh+Bb)1*eR6R6|G1Qtd-b_3!W4&&>SSJeK>)W$zYe#o=6~YVs z^}`jI=A~>ccH4E_lF+qr`Eov|jOqHy(e-8+l|=gYZ67J)>Uf;W;k=gbWsK)&!OMW7 zpo-adVrhmHm$n0~RHK~0tCLRs0O#rzbp+c?dlNo;qTLyTW{ErHj1l*+Pj;QdrqMT^EntJtoG> zV-n7G|%^ChW%%8_t)a1U&-J%V}B*IFSM)DOMUgM z_LpC>N>_rnmj9wrtIN%5&bv${b>h5sKlbY&SELDen!1jj*}%3UkI_lg)_a!5d?I%1 zXmRxy5BC>73Wxh|R)8ukt zYqND6a&$s>y2XuSFN9K(m0TH8Kbqghkf^6uepHFtYLL*bbmp3o{`3MQ#h?m_ILVaI`jTaVL3NnWz0kzvhO4d)(?IG z+0o?BkWE;%BEHPJGVWy{E#uPI-2QNI_v_(XZf~`xwjMa>*+#7_xdk;@7f;JfdARdG zQ#&g@W-WU@g=me=bN(^4j6#W?Rs>w476Cxcq?kMyyR^9|G%1Fwmp{z}ZT{ljZmJ+h z!fsx^`SM?FaC4EnnwO_k@}k^i zYjQlv+#>+b1nTfkK}|(5>M{EEARL!4)lA0hVOPat4D{B|28u4slmN|YvwfAeC3UuN zDrV@Vc~0ctpljtau1i~PX(=o1)+VHHQYZXyh>|zyT+?k_@r(9bq*K(!CP&!jct9N(QZwxLkc%%V`GIU@(-zbl+ icy(ukc4}1KsV-b8SH8Y@Y1b_hTuu0yQ&{{%906o_L literal 0 HcmV?d00001 diff --git a/third_party/solid-c/CC2.EXE b/third_party/solid-c/CC2.EXE new file mode 100644 index 0000000000000000000000000000000000000000..a457966796d9ee931d6eaae549cb5acef55ac399 GIT binary patch literal 26055 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

Rxjfeua22dDcsr$GPSJpT|a&$dNRYxn2y0MRWj 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 VZ0S_;ZE@vEU6YpjwJ!jc9i zT5F?46r_rew${2eA}T&=dAoMEE!Ia-x4XKdJfK0#cA}qm}g)wRUxM88HjTbU7eyu0+JQl zSe-5*DHdTT4}{fGItHFQV|d(Iim-LuSwr9i?JS({{8m)7c1~J?F7_En(-2OJjZ)*d zEP&8q=g2ZL@n53SX3WO%j7$RHj8Xj9*}sHaSTt0&jM4MHG>0mu-6+@(Y+48X{T zK&uHv<||S&hXy@E^~qKguei)1Y@f&&D`}tA3}<97zHh{(XkrPwPhMZa@Oi> zZCVtw4Ry8^h>d2Z6DH$cLJlRXhkN|{Y$lgtb=Gg6#z7|#qxQ)b}b_-_n|Gg(mMfPb?r zXD|*3@r<$MI@xe=!l%tR_c=z6OzfM(^jU%T3OIe zNt&fjAOh09k(R_lIwf8(osR55XV9Q-rI6qCWb^nh448>PqLy$wcXdoWi#E?2d5M`r z^l$zot0FC+th%*eW}9InSqv1 z*Cvu5Umt-08F@W?x_WjrGqeh!1VSQrRuW^4bJr$Cr6ch?Z?yW%-_sF@N86m|Jv}*g z#t@XEW1tO)pG@%A#!OGrGs~>aB@h{V!*9AaN>Apo5T4x|OQt7UhZqQl)_G^f#U-Gn zz}41yKLKpTt zv@=+kf&?Ah=l&dcb&tjS}Nd~eydb-X&szQAnOaFpKE&Nf|n z_s(1UdaVm91E`&ynl$asTOPgCh9p@kKf&#l$Oy`$sqCsAb!)FdwlJLU6PXQEaaC7a zo3`AX7akTSy`A-|3V2qj#=V`6^yvTJ_|?69nAT42@Q@%?SwDV+d4!~!$&iu%|vom zWI}EBNNHQAnOX5ym4SD?h2OI>#Jyym?WHA+!6J$`;a~su zo(BuIL(GrAo=ybg6&il`hx5t_@U(#7xH!=_U-I5NKLqh$Wr(mz!#SN*pyH9)B<o#4`KcL(+!A}3~ z($g@aIbT84I+k)djXcPoUjj v4FbTPHYFMF&-6?|@0Oaa)RwLAzo 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 VhLmm7|BT74L&NR)5rg>Q{{c>dgM0u0 literal 0 HcmV?d00001 diff --git a/third_party/solid-c/DOC/BUGS.! b/third_party/solid-c/DOC/BUGS.! new file mode 100644 index 0000000..6b40bc5 --- /dev/null +++ b/third_party/solid-c/DOC/BUGS.! @@ -0,0 +1,22 @@ +#include + +char buffer[4]="AAA"; +//char buffer[4]={'A','A','A','A'}; + +void main() +{ + printf("0x%02X\n", *buffer); // (1) не правильно! + printf("0x%02X\n", (char *) *buffer); // (2) правильно +} + +Если массив buffer представляет собой char-элементы, то при обращении к нему, +как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно. +При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери- +ровал правильный код, к отдельному элементу char-массива нужно обращаться так, +как это сделано в строке (2), принудительно указав компилятору через cast- +операцию то, что нам нужно. +При обращении к массиву, состоящему из int-элементов, вышеописанных проблем +не возникает, компилятор генерирует правильный код. +Для более наглядного представления, о чем идет речь, можно просмотреть asm- +листинг, генерируемый компилятором для приведенного выше примера. Для строки +(1) компилятор не сгенерирует код "ld b,0". diff --git a/third_party/solid-c/DOC/CC.RUS b/third_party/solid-c/DOC/CC.RUS new file mode 100644 index 0000000..8e378bd --- /dev/null +++ b/third_party/solid-c/DOC/CC.RUS @@ -0,0 +1,968 @@ + Компилятор языка Си в системе ESTEX + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + ВВЕДЕНИЕ + + Одной из целей разработки оптимизирующего компилятора SOLID C было создание +инструментального средства, которое позволяет писать и саму операционную сис- +тему, и программное обеспечение для нее. Для достижения этой цели в кодогене- +ратор введены различные дополнительные средства. Так, разработаны средства +автоматического распределения регистров, благодаря которым удалось существенно +повысить эффективность объектного кода. В результате стало возможным писать +на высоко-уровневом языке (которым является Си) даже системы, работающие в +условиях жестких ограничений по памяти и реальному масштабу времени. При этом +почти полностью устранена необходимость программирования на Ассемблере. + + Основная цель данного руководства - дать пользователям представление о +применении компилятора в рамках операционной системы ESTEX и некоторых +особенностях этого компилятора. + + SOLID C является двухпроходным компилятором языка, преобразующим исходный +си-текст в программу на языке Ассемблера. Компилятор состоит из двух файлов +"cc1.exe" и "cc2.exe", выполняющих соответственно первый и второй проходы. + На первом проходе входной си-текст преобразуется в объектный код (т-код), +сохраняемый в файле с расширением ".tmc" (по-умолчанию). На первом проходе +производятся также диагностика ошибок и выдача предупреждающих сообщений. + На втором проходе полученный т-код преобразуется в ассемблерный листинг, +сохраняемый в файле с расширением ".asm" (по-умолчанию). +Следует отметить тот факт, что поскольку данный компилятор является оптимизи- +рующим, то время, затраченное на компиляцию си-программы возрастает от 2-х и +более раз, по сравнению с обычными (не оптимизирующими) си-компиляторами. + + + ГЕНЕРАТОР ОБЪЕКТНОГО КОДА + + Этот компонент (cc1.exe) компилятора обеспечивает первый проход. Он произ- +водит разбор исходного си-текста, его контроль на допустимость синтаксиса +и семантики. В результате первого прохода появляется промежуточный файл с +объектным кодом, т.н. Т-код. Стандартным расширением имен файлов, содержащих +т-код, является ".tmc". +Команда запуска компилятора первого прохода имеет следующий формат: + + CC1 [опция] имя_файла + + Имя файла может содержать букву диска и путь, при этом максимальная длина +строки не может превышать 80 символов. Обычно для исходных си-файлов исполь- +зуется расширение ".c". Если расширение входного файла ".c", то его можно +не указывать. + + Опции генератора объектного кода + + -c В отличие от стандартного языка Си, компилятор SOLID C + обрабатывает гнездование (вложение) комментариев. + Данная опция отключает режим гнездования комментариев. + + -dNAME Определить макро-определение с именем "NAME". Между буквой опции + и именем "NAME" пробелы не допускаются. + + -e Режим переопределения выдачи сообщений в файл ошибок, имеющего + расширение ".err". Файл создается всегда по текущему пути исходного + ".c" файла. + + -jN Установка максимального числа ошибок компиляции. Происходит + прерывание компиляции, если число ошибок равно или превышает + "N". Между буквой опции и числом "N" пробелы не допускаются. + Например: -j30 (прерывание процесса компиляции при 30 ошибках). + + -k Режим совместимости со стандартным языком Си (стандарт K&R). + Разрешает делать неявные объявления функций и параметров. + Данную опцию необходимо использовать при компиляции "чужых" + исходников. + + -m Режим вывода на экран статистики по таблицам компилятора. + + -oNAME Задать имя для выходного файла с т-кодом. Максимальная длина + строки полного пути (диск\каталог\имя) файла составляет + 80 символов. Между буквой опции и именем "NAME" пробелы не + допускаются. + + -rP:S:H Установка отношения размеров частей рабочей области компилятора: + P - пула, S - таблицы символов, H - хеш-таблицы. + По-умолчанию используется соотношение 13:6:4. В случае переполнения + какой-либо части, используйте эту опцию для назначения другого + соотношения частей рабочей области. + Между буквой опции и строкой "P:S:H" пробелы не допускаются. + + -x Режим строгой совместимости с MSX-C компилятором. При этом + расширение файла т-кода меняется с ".tmc" на ".tco". + + + КОДОГЕНЕРАТОР + + Кодогенератор (cc2.exe) выполняет второй проход компилятора. Он читает +файл с т-кодом и создает выходной файл на языке Ассемблера. +Команда запуска компилятора второго прохода имеет следующий формат: + + CC2 [опция] имя_файла + +Если у входного файла с т-кодом расширение не указано, то используется +стандартное расширение ".tmc". Если не указано расширение для выходного +файла - используется расширение ".asm". Максимальная длина строки +"диск\каталог\имя_файла" должна быть не более 64 символов. +Если путь расположения для выходного файла не задан, то по-умолчанию +он создается по текущему пути расположения входного файла т-кода. + + Опции кодогенератора + + -k Не удалять входной файл т-кода (.tmc) по завершению работы + кодогенератора. + + -oNAME Задать имя для выходного asm-файла. Максимальная длина + строки полного пути (диск\каталог\имя) файла составляет + 64 символа. Между буквой опции и именем "NAME" пробелы + не допускаются. + + -rN Резервирование области под таблицу символов компилятора размером + N байтов (N - десятичный формат). Между буквой опции и числом "N" + пробелы не допускаются. Например: -r2000 (резервируется таблица + символов размером в 2000 байтов). + + -uX Определить пост-символ "X" для имен в asm-листинге. По-умолчанию + используется символ "_". Например: -u@ (использовать пост-символ + "@" для имен в выходном asm-листинге). + + -q "Тихий" режим. Индикаторы процесса компиляции "---" и "+++" + на экран не выводятся. + + + + + ОСОБЕННОСТИ КОМПИЛЯТОРА SOLID C ДЛЯ ОС ESTEX + + + Как было сказано выше, целью разработки данного Си-компилятора было созда- +ние продукта, с помощью которого можно было бы (пользуясь всеми преимуществами +языка высокого уровня) разрабатывать программы, удовлетворяющие жестким требо- +ваниям реального масштаба времени и ограничений на память. В данной главе опи- +саны особенности компилятора с этой точки зрения. Кроме того, здесь будут даны +рекомендации по программированию на SOLID C. + + Компилятор SOLID C может работать в двух различных режимах. Один из них +является "собственным" для данного компилятора, а второй - служит для обеспе- +чения совместимости со стандартом языка Си. В этом режиме все арифметические +преобразования выполняются точно так же, как в стандартном языке Си. Самое +большое различие между этим режимом и "собственным" состоит в том, что в пос- +леднем не выполняются автоматические преобразования форматов при переходах от +типа "char" к типу "int". По-умолчанию, компилятор работает в "собственном" +режиме. Для смены режима работы компилятора служит опция "-k" на первом прохо- +де компилятора. + + + Собственный режим компилятора + + Для данного режима характерны два новых формата: целой константы (intconst) +и символьной константы (charconst). Обычно указанные форматы используются иден- +тично с соответствующими форматами "int" и "char", однако в случаях анализа +типов операндов и выражений, и приведения их к соответствию, указанные два +формата рассматриваются как различные. + Как упоминалось выше, в этом режиме не производится автоматическое преобразо- +вание форматов при переходе от типа "char" к "int". Действуют следующие согла- +шения о преобразованиях типов: + + unsigned + ? -> unsigned + int + ? -> int + char + ? -> char + intconst + ? -> intconst + charconst + ? -> charconst + + + Режим совместимости со стандартом языка Си + + Выполняются все арифметические преобразования, действительные в рамках реа- +лизации стандартного языка Си. Единственное различие состоит в том, что компи- +лятор SOLID C интерпретирует тип "char", как значение без знака. +Для этого режима действуют следующие правила преобразования типов: + + char -> int + unsigned + ? -> unsigned + int + int -> int + + + + Рекурсивные функции + + Как известно, все функции стандартного языка Си рекурсивны. В среде компи- +лятора SOLID C можно писать также и нерекурсивные функции. Для различия +функций этих двух типов введены и зарезервированы следующие ключевые слова: +"recursive" - рекурсивная и "nonrec" - нерекурсивная. Эти ключевые слова +записываются в заголовке функции перед ее именем и служат описателями режимов +ее выполнения. Это показано в следующем примере: + +nonrec main() +{ + printf("Hello, world!\n"); +} + +recursive +int factorial(n) +int n; +{ + return(n > 1) ? n*factorial(n-1) : 1; +} + +int max(a,b) +int a,b +{ + return(a > b) ? a : b; +} + + В приведенном примере даны определения: нерекурсивной функции main() и +рекурсивной функции factorial(). Для функции max() описатель режима выпол- +нения функции в явном виде не задан, поэтому она будет выполняться так, как +задано по-умолчанию. Обычно по-умолчанию задается режим выполнения функций +как рекурсивных. Однако это умолчание можно изменять с помощью следующих +предложений препроцессора: + + #pragma nonrec + #pragma recursive + + Первым предложением по умолчанию задается режим выполнения функций, как +нерекурсивных. Второе предложение предписывает рассматривать все функции, +как рекурсивные (если явно не оговорено противоположное). +Для случая, когда действует предложение #pragma, функция max() будет выпол- +няться согласно последнему описателю режимов "рекурсивная/нерекурсивная". +Рекомендуется давать явное указание "nonrec" кампилятору, если нужно, чтобы он +воспринимал функции как нерекурсивные. По такому указанию, компилятор гаран- +тированно сгенерирует объектный код, более короткий и более быстрый, чем в +других случаях. В обычных прикладных программах бОльшая часть функций нерекур- +сивна, поэтому в начале исходного текста следует писать предложения препроцес- +сора: #pragma nonrec + + + Функции с переменными параметрами + + Компилятор SOLID C обрабатывает функции двух типов: с переменным числом +параметров и с фиксированным. В функциях первого типа число и представление +параметров могут изменяться, тогда как в функциях второго типа они фиксированы. +Например, функции printf, scanf и ряд других являются функциями с переменным +числом параметров. В компиляторе SOLID C функции указанных двух типов разли- +чаются с помощью специальных описателей. + Структура предложений языка изменяется с введением простых и абстрактных +описателей следующим образом: + + С простым описателем: + идентификатор + (описатель) + *описатель + описатель() + описатель(.) + описатель [константное выражение] + + С абстрактным описателем: + пусто + абстрактный описатель + *абстрактный описатель + абстрактный описатель() + абстрактный описатель(.) + абстрактный описатель [константное выражение] + + Конструкции "описатель(.)" и "абстрактный описатель(.)" впервые введены +для обозначения функций с переменными параметрами. Конструкции "описатель()" +и "абстрактный описатель()" обозначают функции с фиксированными параметрами. +Данный метод описания функций с переменными параметрами используется в пред- +ложениях типа cast, sizeof. Например, в следующих описаниях функции func и fp +определены, как функции с переменными параметрами: + + int func(.), (*fp)(.); + +Перед применением функции с переменными параметрами, ее необходимо всякий раз +описывать подобным образом. В библиотеке стандартных функций имеются функции +с переменными параметрами, как например: + + printf, fprintf, sprintf, scanf, fscanf, sscanf + +Описания перечисленных функций содержатся в стандартном файле "stdio.h". +Вызов функции с переменными параметрами совершенно идентичен вызову функции +с фиксированными параметрами. + Эти функции не обладают мобильностью с точки зрения рабочей машины (главным +образом по методу доступа к параметрам). Отсутствие переносимости имеет место +только для самой функции с переменными параметрами. Внешняя функция, ее вызы- +вающая, является переносимой. + Определение функции с переменными параметрами должно быть записано в самом +начале, перед ее телом. Ниже приведено типичное определение функции func, +являющейся функцией с переменными параметрами: + +int func(.); /* это определение обязательно должно идти в начале */ + +int func(nargs, args) +int nargs, args; +{ + ... +} + + В момент вызова функции с переменными параметрами, вместо фактического +параметра подставляется его копия - осуществляется вызов по значению. +Значением параметра nargs является количество фактических параметров - фикси- +рованная величина. Благодаря ей можно установить, сколько фактических парамет- +ров реально передается в функцию с переменными параметрами со стороны вызыва- +ющей функции. Однако возможности ограничены тем, что можно знать только число +передаваемых параметров. При этом, установить тип каждого из этих параметров +невозможно. + Для того, чтобы организовать доступ к указанным параметрам, нужно описать +каждый из передаваемых при вызове функции параметров. Первый из параметров +(если он имеется) расположен по адресу массива args. Другими словами, значение +первого из параметров args присваивается идентификатору args. Второй из пара- +метров помещается по адресу, сдвинутому в сторону роста адресов памяти. Вообще +можно составить последовательность адресов: + + адрес 2-го параметра = адрес args + 2 + адрес 3-го параметра = адрес args + 4 + +В следующей таблице приведено соответствие параметров и их адресов: +________________________________________________ + + Номер параметра Адрес +________________________________________________ + + 1 Адрес начала массива args + 2 Адрес начала + 2 + 3 Адрес начала + 4 + ... + n Адрес начала + (n-1)*2 +________________________________________________ + + Согласно соответствию адресов и последовательности параметров, приведенному +в таблице, можно организовать доступ к этим параметрам. Например, для того, +чтобы сослаться на первый и второй параметры типа "char", необходимо написать +в программе: + + (char)args - ссылка на первый параметр типа "char" + (char)+(&args+1) - ссылка на второй параметр типа "char" + +Примечание: Если в приведенном выше примере args является "int", то благодаря +описанию, значение &args преобразуется в тип "int". Адрес следующего по порядку +аргумента формируется согласно формуле &args+1, в которой константа "1" преоб- +разуется в соответствии с масштабом разрядной сетки конкретной машины: как пра- +вило, это два байта (вообще, можно определить эту величину с помощью выражения +sizeof(int*)). В конкретном случае это дает "адрес начала массива параметров +плюс два". Аналогичным образом можно организовать доступ к параметрам других +типов. + В заключение данного параграфа приведены два примера простых функций с +переменными параметрами: функция sum возвращает значение суммы переменного +числа "int" параметров. Функция cmax возвращает максимальное значение из ряда +"int" параметров в TINY (char), число которых - переменное. + +#pragma nonrec +typedef char TINY; + +int sum(.); +TINY cmax(.); + +int sum(nargs, args) +int nargs, args +{ + int i, *p; + for(i=0, p=&args; nargs --;) + i += *p++; + return i; +} + +TINY cmax(nargs, args) +int nargs; +TINY args; +{ + int *p, max; + for(max=0, p=(int*)&args; nargs--; p++) + if(max < (TINY)*p) + max = (TINY)*p; + return max; +} + + + Преобразования байтовой арифметики + + Для повышения эффективности объектного кода, компилятор SOLID C выполняет +преобразования байтовой арифметики. Благодаря этой особенности, все преобразо- +вания переменных, имеющих тип "char", выполняются не со словами, а с байтами. +Поскольку процессор Z80 с восьмибитовым форматом команд выполняет эти операции +значительно быстрее, нежели другие. Байтовая арифметика особенно эффективна +при написании специальных программ, включающих байтовые преобразования. +Результаты логических операций и операций отношения + + && || ! = != > < >= <= + +имеют тип "char". + Традиционно, те байтовые переменные, которые обозначают внешние кодовые +символы, специфицируются с помощью определения типа typedef в виде TINY или +BOOL. Первый определяет арифметические объекты, а второй - логические. +Определения указанных типов включены в файл стандартных заголовков "types.h". + + Ниже даны несколько примеров употребления байтовых операций, на которые +следует обратить особое внимание!. + + 1). Переполнение и исчезновение + + При выполнении байтовых арифметических операций, возможны случаи перепол- +нения или исчезновения. Например, в процессе выполнения операторов + + int i; + TINY x,y; + + x = 10; y = 30; + i = x * y; + + вместо правильного значения 300, переменная "i" получает неправильное зна- +чение 44. Это происходит вследствие того, что в процессе выполнения умножения +по правилам байтовой арифметики теряется старший байт результата. Для того, +чтобы получить правильный результат (число 300), нужно оперировать с целыми +операндами, для чего следует специфицировать их с помощью функции cast, как +показано в следующем примере: + + i = (int)x * (int)y; + +Такое же явление возникает и в следующей ситуации: + + i = x << 8 | y; + + При выполнении операции сдвига над операндом байтовой длины, может быть +потеряна его часть вследствие переполнения. На это также нужно обратить внима- +ние. Величину "y" необходимо подставить в выражение для "i" в том же самом +виде, что и показано ниже: + + i = (unsigned)x << 8 | y; + + 2). У типа TINY (char) отсутсвует знак числа. Переменные типа "char" исполь- +зуются без знака. Поэтому иногда возникают ситуации, в которых результат опе- +рации вычитания становится отрицательным. Поэтому, если выполнить ниже-следую- +щую программу, в переменную "i" будет записано 255: + + int i; + TINY x,y; + + x = 2; + y = 3; + i = x - y; + + Для того, чтобы получить правильный результат, нужно выполнить эту операцию +в соответствии с типом "int": + + i = (int)x - (int)y; + + 3). Согласование параметров + + Компилятор SOLID C проводит четкое различие между типами "int" и "char". +Поэтому фактические и формальные параметры должны быть обязательно согласованы +между собой по типу. Следующий пример иллюстрирует неправильный вызов функции: + +func(x) +TINY x; +{ + ... +} +main() +{ + func(1); /* неправильный вызов функции */ +} + +Нужно изменить вызов следующим образом: + + func((TINY)1); + + Согласование параметров по типу, компилятором не проверяется. Поэтому, +следует обращать особое внимание на подобные ситуации. + + + Распределение регистров + + Поскольку компилятор SOLID C поддерживает распределение регистровых пере- +менных, он способен генерировать более эффективный объектный код. В стандарт- +ном языке Си предусмотрено размещение непосредственно в регистрах (класс памя- +ти "register") только нескольких первых переменных из всего их множества. +(Какое именно количество регистровых переменных будет помещено в регистры, +зависит от того, какая рабочая машина будет использоваться). В отличие от +стандартного, компилятор SOLID C автоматически выполняет оптимальное распре- +деление регистров, в соответствии с потоком данных. Этим самым снята необхо- +димость обязательного указания переменных программы, как регистровых. Вопрос, +какие из переменных будут помещены в регистры, решается на уровне кодогенера- +ции. Поэтому описание "register" идентично пo смыслу описанию "auto" и никакого +другого смысла не имеет. + В каждой функции программы, первые 16 переменных простого типа становятся +кандидатами на размещение в регистрах, как переменные типов "аuto" или +"register". K числу таких простых типов относятся "int", "char", "unsigned" +и "указатель". + Средствами языка Си можно получать адреса переменных. Компилятор SOLID C +также, безусловно, располагает этими средствами. Однако, в случаях тех перемен- +ных, которые являются объектами распределения регистровой памяти, возникает +проблема. Она обусловлена тем, что как таковой "адрес" регистра не существует. +Например, если написать + + int n; + n = 10; + scanf("%d", &n); + printf("%d", n); + + и ввести 100, то какое значение получит переменная "n" ?. Конечно, 100. +Компилятор поместит значение переменной по заданному адресу в память, если +указать ему значение этого адреса. Следовательно, никаких проблем не возникнет, +если при вызове функции передать ей в качестве параметра адрес переменной. +Однако в примере + + int n; + int *p; + p = &n; + n = 10; + *p = 100; + printf("%d", n); + + возможна ситуация, когда в качестве значения переменной "n" будет индициро- +вано не 100, а 10. Между двумя предложениями, одно из которых "n=10", a другое +"printf("%d",n)", не фигурирует "&n". Поэтому компилятор не помещает "n" в па- +мять. + + + + НЕКОТОРЫЕ ДРУГИЕ ОСОБЕННОСТИ КОМПИЛЯТОРА + + + Таблица представления данных различного типа +----------------------------------------------------- + Тип Разрядность Диапазон значений +----------------------------------------------------- + char 8 0..255 + short 16 -32768..32767 + int 16 -32768..32767 + unsigned 16 0..65535 +_____________________________________________________ + + + 1. В рамках компилятора SOLID C проводится идентификация переменных и +функций по первым 30-ти символам имени. Благодаря такому расширению имен, +можно использовать легко поддающиеся анализу имена переменных и функций, и +получать удобочитаемые тексты программ. + + 2. Позиция ошибки диагностируется по номеру ошибочной строки и начальному +символу (колонки в строке). Начальная позиция считается с 0. Таким образом, +позиция первого символа программного текста есть "нулевая строка, нулевая ко- +лонка". + + 3. Для указания имени включаемого файла используется предложение "#include" +препроцессора, как описано ниже: + + <имя файла> - ссылка на файл, расположенный в подкаталоге "INCLUDE" + каталога компилятора. + "имя файла" - ссылка на файл, расположенный по текущему пути исходного + ".c" файла. + +Задание пути в имени файла не допускается. Например, если имеются предложения + + #include + #include "common.h" + +то в первом случае сделана ссылка на стандартный файл компилятора Си, распо- +ложенного в подкаталоге с зарезервированным именем "INCLUDE" каталога SOLID C +(по-умолчанию "SOLID"), а во втором случае - на файл, расположенный по теку- +щему пути входного ".c" файла. +Следует обратить внимание на то, что имя подкаталога "INCLUDE" зарезервировано +и его не следует менять. + + 4. Типы long, float, double не поддерживаются, но зарезервированы. Поэтому +нельзя использовать слова "long", "float" и "double" в качестве идентифика- +торов переменных и меток. + + 5. Не поддерживаются битовые поля структур. + + 6. Некоторые ограничения в константных выражениях. Нельзя включать в +константные выражения указанных ниже типов унарную операцию "sizeof": + a) сразу после оператора "case" (в качестве метки); + b) в описателе массива в качестве его размерности. +Подобные ограничения не действуют на те константные выражения, которые +появляются в инициаторе (т.е. при инициализации). + + 7. Имеется отличие от стандартного языка Си по эффективным пределам имен +членов структур и объединений (struct & union). В стандартном Си одно и то же +имя члена может появляться в двух различных структурах только в случае, когда +они оба одного типа и имеют одинаковое смещение в обеих структурах. Компилятор +SOLID C воспринимает имя члена так, как принято в Паскале или в Аде. Таким об- +разом, одно и то же имя члена может появляться в разных структурах и будет +правильно обработано компилятором SOLID C. +В качестве примера рассмотрим следующее описание: + +struct node { + char *word; + int count; + struct node *next; +} pool[1000], *p; + +struct noad { + int atr; + struct noad *next; +} table[10], *q; + + В стандартном языке Си данная запись является неправильной, потому, что имя +члена "next" появляется в двух структурах - "node" и "noad", где их типы и сме- +щения не согласованы. Однако в среде компилятора SOLID C эти записи являются +правильными. + Следует обратить внимание на следующую запись + + p->next + +которая описывает член типа "struct node" (потому что "p" есть указатель типа +"struct node"). Благодаря такому приему можно подбирать правильные члены путем +строгого указания их типов. Так, в операциях "." и "->" левые члены должны быть +указателями структур, включающих члены, записанные в качестве правой части этих +операций. Например: + + i->count + +включает "i" не как указатель типа "struct node", а как "int" (целое). Поэтому +компилятор SOLID C такую ситуацию не диагностирует. Для того, чтобы получить +такой же результат, необходимо переписать приведенное выражение следующим +образом: + + ((struct node *)i)->count + +В приведенном выше примере для того, чтобы операция "->" была более высокого +ранга, нежели операция "cast", следует терм + + (struct node *) i + +заключить в скобки. + До того, пока не будет преобразован тип указателя в "int", что выполняется +с помощью функции cast, операция не может быть выполнена. + Даже при выполнении арифметических операций в случае указателей разных ти- +пов, также необходимо использовать функцию cast. Например, в случае описаний + + int i; + char *p; + int *q; + +операции + + p = i; + if(p == i) + q = p; + if(p == q) + +будут отмечены как ошибочные. + Две первые ошибочны потому, что производятся подстановки между типами указа- +теля и "int" (целого), и операции сравнения между ними. Две последние также +ошибочны, потому, что несмотря на то, что и "p", и "q" обе являются указате- +лями, но они специфицированы разными типами и поэтому компилятор отметит их, +как ошибочные. +Эти ошибки можно устранить, либо использованием функции cast, либо указанием +опции "-k" на первом проходе компилятора. + С другой стороны, разрешены преобразования типов из целого в указатель и +обратно. Это обусловлено тем, что в языке Си целая константа 0 используется +как указатель особого адреса. Например, запись + + char *p; + if(p != 0) + p = 0; + +не содержит ошибки. + Типы "int" и указателей нельзя смешивать в среде компилятора SOLID C. Дан- +ное соглашение вообще может считаться показателем хорошего стиля программиро- +вания, при котором отладка программы становится проще. + + 8. Нет автоматического преобразования между типами "указатель" и "int", +и обратно. В стандартном языке Си разрешены операции сравнения значений указа- +телей и целых (int), но в SOLID C смешивание указанных типов вызовет сообщение +об ошибке. Однако этот режим можно разрешить, указав опцию компилятора "-k" +(на первом проходе). + + 9. Тип "char" интерпретируется как значение без знака, т.е. может иметь +значение 0..255. + + 10. В рамках стандартного языка Си, в случаях появления необъявленных ранее +функций, они интерпретируются как возвращающие "int" значение. Параметры +необъявленного типа, которые вошли в список параметров, считаются "int". +Рассматриваемый здесь компилятор не позволяет использовать эти умолчания. То +есть, хороший стиль программирования предполагает описание всех идентификато- +ров до того, как на них будут выполняться ссылки - автоматические ссылки вы- +полняться не будут. + Все объявления, которые относятся к функциям стандартной библиотеки, запи- +саны в файле стандартных заголовков, поэтому любую из стандартных функций можно +использовать без объявления. Поэтому все пользовательские программы должны +содержать ссылку на файл "stdio.h" в самом начале текста, в предложении +#include . + Однако, если на первом проходе компилятора указать опцию "-k", указанные +описания функций будут объявлены по-умолчанию. От этого теряется качество полу- +чаемого кода, поэтому данной опцией целесообразно пользоваться, если важно +обеспечить совместимость со стандартным языком Си. + + 11. В данной версии рассматриваемого компилятора не поддерживается предложе- +ние препроцессора "#if". Вполне возможно заменить указанное предложение дру- +гими: "#ifdef" или же "#ifndef". Возможны также другие варианты замены предло- +жения "#if". Рассматриваемый здесь компилятор не генерирует код тех участков +программы, выполнение которых не требуется при ее прогоне. Поэтому можно полу- +чить точно такой же результат, если применить оператор "if" вместо предложе- +ния "#if". Например, можно заменить текст одной из ниже-следующих программ на +другую: + +Программа 1: + +#if sizeof(FCB) != sizeof(char[36]) + Open_MSX(); +#else + Open_OTHER(); +#endif + +Программа 2: + +if (sizeof(FCB) != sizeof(char[36])) + Open_MSX(); +else + Open_OTHER(); + + 12. Введена директива препроцессора "#pragma". Применяется для различных +указаний компилятору. Все предложения данного вида могут появляться в любом +месте исходной программы. Ниже, в качестве примеров приведены четыре предложе- +ния с заданием соответствующих директив компилятору: + + 1. #pragma optimize time + +Данное указание компилятор интерпретирует так, что он старается сгенерировать +объектный код, отличающийся более высокой скоростью выполнения, нежели в слу- +чае, когда он должен быть более компактным. + + 2. #pragma optimize size + +При таком указании, компилятор считает более важным сгенерировать компактный +объектный код, хотя бы и не очень быстрый в исполнении. + + 3. #pragma nonrec + +Этой директивой изменяется задание по-умолчанию режима выполнения функций, +как нерекурсивных. + + 4. #pragma recursive + +С помощью данного предложения устанавливается по-умолчанию режим выполнения +функций как рекурсивных. + + 13. Поскольку компилятор SOLID C поддерживает для переменных автоматическое +распределение регистров, класс памяти всегда устанавливается "auto" (автомати- +ческий). + + 14. Компилятор SOLID C позволяет гнездовать тексты комментариев. Эта функция +обеспечивает возможность написания больших программ, содержащих комментарии, в +теле которых, в свою очередь содержатся комментарии. Если на первом проходе +указать компилятору опцию "-c", гнездование комментариев производиться не бу- +дет, что отвечает возможностям стандартного языка Си. + + + + ПЕРЕДАЧА ПАРАМЕТРОВ + + Функции с фиксированными параметрами + + В случае обычных функций (функций с фиксированными параметрами), первые три +параметра помещаются в регистры, а все последующие - в стек. Если какой-либо +из 3-х параметров имеет тип "char", он помещается в соответствующий 8-ми битный +регистр. Параметры (первые три) других типов помещаются в регистровые пары. +4-й параметр (если есть) и все последующие - помещаются в стек, в обратном по- +рядке (паскалевский способ ?). На вершину стека помещается адрес возврата. +Каждый из размещаемых в стеке параметров занимает два байта. Значение "char" +параметра помещается в младший байт, а значение старшего байта остается неопре- +деленным. + В режиме совместимости со стандартным языком Си, использование параметра типа +"char" имеет отличия: преобразование из "char" формата в "int" производится +автоматически (при этом старший байт обнуляется), после чего данные рассматри- +ваются как "другой тип". + +_______________________________________________________________________ + + Тип параметра Первый Второй Третий Четвертый Пятый ... +_______________________________________________________________________ + + char A E C (SP+2) (SP+4) ... + + другой тип HL DE BC (SP+2) (SP+4) ... + (SP+3) (SP+5) ... +_______________________________________________________________________ + + + Функции с переменными параметрами + + Когда вызывается функция с переменными параметрами, все параметры заталки- +ваются в стек (в обратном порядке). Число параметров, помещенных в стек, запи- +сывается в регистровую пару HL. На вершину стека помещается адрес возврата. + В "собственном" режиме, "char" параметр помещается в младший байт, значение +старшего байта остается неопределенным. + В режиме совместимости со стандартом языка Си, "char" тип автоматически +преобразуется в "int" тип (при этом старший байт обнуляется), который далее +трактуется как "другой тип". + Параметры других типов размещаются в стеке согласно правилам стандарта для +процессора Z80, а именно: первым запоминается младший байт, вторым - старший. + +_______________________________________________________________________ + + Тип параметра Количество Первый Второй Третий ... +_______________________________________________________________________ + + char HL (SP+2) (SP+4) (SP+6) ... + другой тип HL (SP+2) (SP+4) (SP+6) ... + (SP+3) (SP+5) (SP+7) +_______________________________________________________________________ + + + + ВОЗВРАТ ЗНАЧЕНИЯ ФУНКЦИИ + + При передаче управления вызывающей программе, функция может передавать свое +значение через регистры. При этом функция типа "char" передает значение через +регистр "A". Функции других типов передают свои значения через регистровую +пару HL. + В режиме совместимости со стандартным языком Си, возвращаемое значение всегда +передается через регистровую пару HL, даже в том случае, когда функция имеет +"char" тип. + Для возврата в вызывающую функцию двух и более значений, необходимо исполь- +зовать указатели переменных, как параметры любых других си-программ. + + + ПРАВИЛА ВЫЗОВА ФУНКЦИЙ + + 1. Во-первых, вызывающая программа оформляет параметры и помещает их в ре- +гистры или заталкивает в стек согласно правилам, описанным выше. + 2. Программа вызывает функцию. Для вызова обычно используется слово "call". + 3. После возврата управления функцией, параметры выталкиваются из стека +(с использованием команды "pop"). Если все параметры размещены в регистрах, +использовать команду "pop" нет необходимости. Следует отметить, что в случае +применения команды "pop", возвращаемые через регистры "A" или "HL" значения +функций не будут потеряны. + 4. Значение функции возвращается через регистр "A", если функция имеет +"char" тип. Для функций другого типа, значение всегда возвращается через +регистровую пару HL. + + + ПЕРЕДАЧИ УПРАВЛЕНИЯ ВЫЗЫВАЕМОЙ ФУНКЦИИ + + Вызываемая функция не должна разрушить содержимое указателя стека. Иными +словами, содержимое указателя стека при выходе из функции должно остаться тем +же, что и при входе в нее. Параметры, загруженные в стек, должны выталкиваться +из него вызывающей программой. Вызываемая функция может изменить значения па- +раметров (как тех, которые передаются через регистры, так и загруженных в стек). +Однако следует подчеркнуть, что в языке Си действует соглашение, в рамках кото- +рого вызов функций осуществляется по значению, поэтому даже если будут возвра- +щены измененные параметры, это никакого влияния на процесс вызова функции не +окажет. + Возвращаемое значение функции помещается в регистр "A" или в регистровую +пару HL - в зависимости от типа вызванной функции. Эти правила описаны в пре- +дыдущем разделе. + +Пример 1: + + В следующем примере объявлена ассемблерная функция ISDIGIT, которая возвра- +щает значение функции BOOL в регистре "A". Вызывающая функция передает параметр +"char" типа через регистр "A". + +... вызывающая программа (на языке Си)... + +typedef char BOOL; /* определение "char" типа как BOOL */ +... +BOOL isdigit(c); +char c; + ... + if (isdigit(c)) + ... + ... + +... вызываемая функция (на языке Ассемблера)... + + public isdigit_ + +isdigit_:cp '0' + jr c,false + cp '9'+1 + ret c ; цифра, вернуть true +false: xor a ; не цифра, вернуть false + ret + + +Пример 2: + + Этот пример соответствует случаю вызова функции, написанной на Си, из ас- +семблерной процедуры. + Стандартные библиотечные функции printf и puts вызываются из ассемблерной +процедуры. Их исходные тексты находятся в исходниках библиотеки, поэтому здесь +функции printf и puts не будут описаны. Следует заметить, что поскольку функ- +ция printf - с переменными параметрами, ее параметры заталкиваются в стек. +В данном примере параметр всего один, однако в случаях двух и большего числа +параметров, они помещаются в стек в обратной последовательности. Число парамет- +ров передается в вызываемую функцию через регистровую пару HL (в приведенном +примере передается число 1). После возврата из вызываемой функции, будут выпол- +няться операции выталкивания из стека (в примере команда "pop" будет выполнена +1 раз). Следует помнить, что параметры восстанавливаются из стека вызывающей +программой, а не вызываемой. + С другой стороны, функция puts принадлежит к числу функций с фиксированными +параметрами, поэтому адрес символьной строки передается через регистровую пару +HL. + + extern printf_, puts_ + +example: ld hl,msg + push hl ; поместить в стек адрес символьной строки + ld hl,1 ; загрузить число параметров + call printf_ ; вызов процедуры, формирующей вывод + pop hl ; выталкивание параметров из стека + ; + ld hl,msg ; загрузить адрес строки + jp puts_ ; вызов функции вывода строки + +msg: db 'Hello, world!',0Ah,0 + + + + РЕКОМЕНДАЦИИ ПО ПРОГРАММИРОВАНИЮ + + 1. Следует пользоваться нерекурсивными функциями, если нет особой необхо- +димости использовать рекурсию. Благодаря такому подходу, можно достичь более +быстрого доступа к тем локальным переменным, для которых не распределяется +регистровая память и следовательно, получить эффективный объектный код. + + 2. Если указан режим совместимости со стандартным языком Си (опция "-k"), +то качество объектного кода будет ниже, поэтому указание на этот режим нужно +применять только в случаях, когда требуемая совместимость на уровне стандарт- +ного языка Си нужна больше, чем эффективность кода. + + 3. Используйте тип "char" (с 8-битовой длиной данных) везде, где только +можно. Байтовые операции выполняются с помощью 8-битового процессора более +эффективно, чем над данными, длиной в слово (типы "int" или "unsigned"). +Поэтому определяйте переменные, числовые значения которых не выходят за пре- +делы диапазона 0..255, как TINY (char). + + 4. При использовании 16-битовых переменных следует определять их преимущест- +венно типом "unsigned", который в этих случаях предпочтительнее, нежели "int". +Это обусловлено тем, что в процессоре Z80 выполнение операций со знаком (в част- +ности, операций сравнения величин со знаком) реализовано не лучшим образом. + + 5. Нежелательно установление статического режима для локальных переменных. +Переменные, определенные как статические или внешние, не подлежат загрузке в +регистровую память. Поэтому, если для повышения скорости выполнения программы +определить локальные переменные как "static", а функции как "extern", то +результат будет противоположным - эффективность объектного кода существенно +понизится. Компилятор SOLID C сам производит распределение регистров, поэтому +следует обязательно определять локальные переменные, как "auto". + + + + ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА ЯЗЫКА + + Следующие слова используются как ключевые в компиляторе SOLID C и их нельзя +использовать в качестве меток или имен переменных. + + asm float signed + auto for static + break goto struct + case if switch + char int typedef + const long union + continue nonrec unsigned + default recursive void + do register volatile + double return while + else short + extern sizeof + + + + ДИРЕКТИВЫ КОМПИЛЯТОРА + + define nonrec + endif optimize + error pragma + ifdef recursive + ifndef size + include time + line undef diff --git a/third_party/solid-c/DOC/CLIB.RUS b/third_party/solid-c/DOC/CLIB.RUS new file mode 100644 index 0000000..b3a1e89 --- /dev/null +++ b/third_party/solid-c/DOC/CLIB.RUS @@ -0,0 +1,2570 @@ +Последняя редакция: 3.09.2004 + + + + ОПИСАНИЕ ФУНКЦИЙ БИБЛИОТЕКИ СИ + + + + +Примечание. +Для функций форматного ввода/вывода, строка указанного формата не преобразу- +ется и в выходной поток не передается, а становится спецификатором преобразо- +ваний, выполняемых по следующим правилам: + + % [-] [[o]w] [.n]c + + Знак "-" указывает на то, что данное поле подвергается сдвигу влево (обычно +поля сдвигаются вправо). + Знак "w" обозначает максимальное ограничение поля по ширине. Если перед +знаком "w" поставлен нуль, то данное поле в отличие от пробела имеет символ +расширения "нуль". + Знак "-n" действует только в том случае, когда имеется преобразователь +строк (%s). С помощью знака ".n" устанавливается максимальное число символов, +выводимых в одной строке. +Символ "с" может принимать одно из следующих значений: + + d - десятичное число со знаком; + u - десятичное число без знака; + o - восьмеричное число без знака; + x - шестнадцатиричное (без знака); + s - символьная строка; + c - символ. + + Информация, в составе которой отсутствуют приведенные выше символы преоб- +разований, передается в выводимый поток без изменений. Например, с помощью +последовательности "%%" можно вывести один символ процента "%". + + + + + ABORT + + #include + + void abort() + + Описание. + + Функция выводит на экран сообщение "Abnormal program termination" +(непредвиденное завершение программы) и завершает вызванный процесс без +обновления буферов файлов. + + + ABS + + #include + + int abs(int n); + + Описание. + + Функция abs возвращает значение n, равное абсолютной величине n. + + + ABSREAD + + #include + + char absread(char disk, int nsect, char count, char buffer) + + disk - номер диска + nsect - номер начального сектора + count - кол-во читаемых секторов + buffer - адрес буфера под считываемые данные + + Описание. + + Абсолютное чтение с диска. Функция считывает в буфер один или +несколько секторов с заданным начальным относительным номером. Секторы +нумеруются с 0 от начала логического (не физического!) диска. К примеру, +загрузочный сектор данного логического диска имеет номер 0, далее первая +копия FAT начинается с сектора номер 1 и т.д. +Функция возвращают 0 при успешном завершении операции. В случае ошибки +возвращается -1 (0FFh) и errno содержит номер ошибки. + + + ABSWRITE + + #include + + char abswrite(char disk, int nsect, char count, char buffer) + + disk - номер диска + nsect - номер начального сектора + count - кол-во записываемых секторов + buffer - адрес буфера данных + + Описание. + + Абсолютная запись на диск. Функция записывает из буфера один или +несколько секторов с заданным начальным относительным номером. Секторы +нумеруются с 0 от начала логического (не физического!) диска. К примеру, +загрузочный сектор данного логического диска имеет номер 0, далее первая +копия FAT начинается с сектора номер 1 и т.д. +Функция возвращают 0 при успешном завершении операции. В случае ошибки +возвращается -1 (0FFh) и errno содержит номер ошибки. + + + ATEXIT + + #include + + char atexit(*func) + + Описание. + + Функция регистрирует (заносит в свой список) функцию *func как +"exit function", т.е. отрабатывающую перед выходом в ДОС. В случае нормаль- +ного окончания программы, exit вызывает (без аргументов) "exit function" +как раз перед возвратом в операционную систему. Каждый вызов atexit регист- +рирует другую завершающуюся функцию. Регистрируемые функции не мoгут иметь +параметрoв. Может быть зарегистрировано не более 8 функций, которые выпол- +няются в порядке "последний пришел - первый ушел" (LIFO). +Функция atexit сooтветствует стандарту ANSI и дoлжна испoльзoваться вместo +onexit, если требуется сoвместимoсть с ANSI. +Функция вoзвращает 0, если все нoрмальнo и ненулевoе значение +при oшибке (если уже oпределенo макс. число exit-функций). + +Пример + main() + { + atexit(func1); // "Exit Function 1 called" + atexit(func2); // "Exit Function 2 called" + printf("Main quitting ...\n"); + } + +Выведется: + + Main quitting ... + Exit Function 2 called + Exit Function 1 called + + + ATOI + + #include + + int atoi(*string) + + Описание. + + Функция преобразует символьную строку string в целое значение. +Исходная строка string представляет собой последовательность символов, +которые могут быть интерпретированы как числовое значение определенного +типа. Функция прекращает чтение исходной строки, как только появится +первый символ, который не может быть воспринят как часть числа (им может +быть нулевой символ, завершающий строку). +Функция возвращает значение int типа. +Возвращаемое значение равно 0, если вход не может быть преобразован в +значение данного типа. В случае переполнения, возвращаемое значение не +определено. + + + BDOS + + #include + + char bdos(char n, int doshl, char dosa) + int bdosh(char n, int doshl, char dosa) + + Описание. + + Функция выполняет системный вызов ДОС, номер которого определен +в n. Аргументы doshl и dosa размещаются соответственно в регистрах HL и A. +Функция выполняет команду RST 10h для осуществления системного вызова. +Функция может быть использована только для системных ДОС-вызовов, которые +не принимают аргументов или принимают их только в регистрах HL и A. +Функция возвращает значение регистра A, заполненного системным вызовом. + +Примечание: Эту функцию нельзя использовать для осуществления системных +вызовов, в которых ошибки указываются посредством установки флага переноса. +Т.к. си-программы не имеют доступа к этому флагу, статус возвращаемого +значения определить невозможно. В этом случае необходимо использовать +функцию intdos. +Функция bdosh отличается от bdos только тем, что возвращаемое значение +содержится в рег. паре HL. +Обе функции можно использовать для ДОС-вызовов: 02h,0Ah,0Bh,0Eh,11h,1Bh +1Ch,1Dh,1Eh,5Ch функций. + + + BSEARCH + + #include + + void *bsearch(*key, *base, num, size, *compare) + + char *key; - указатель на ключ (строку) поиска + char *base; - указатель на массив + unsigned num; - число элементов массива + unsigned size; - размер каждого элемента + int (*compare)(); - указатель на функцию сравнения + + Описание. + + Функция bsearch выполняет двоичный поиск в отсортированном массиве. +Аргумент compare является указателем на процедуру, поставляемую пользова- +телем. В процессе поиска, функция bsearch может вызывать эту процедуру один +или несколько раз, при каждом вызове передавая указатели на два элемента +массива. Процедура compare должна сравнивать элементы, а затем возвращать +одно из следующих int-значений: + + < 0 element1 < element2 + 0 element1 = element2 + > 0 element1 > element2 + +Функция bsearch возвращает указатель на первое вхождение ключа key в массиве. +Возвращается NULL, если ключа key в массиве нет. + + + CALLOC + + #include или + + char *calloc(int n, int size) + + Описание. + + Функция захватывает пространство для хранения массива из n элементов, +каждый размером size байт. Каждый элемент инициализируется в 0. +Функция возвращает указатель на захваченное пространство. +Если недостаточно памяти, возвращается значение NULL. + + + CGETS + + #include + + char *cgets(*str) + + Описание. + + Функция читает строку символов прямо с консоли, запоминает строку и +ее длину в аргументе str. Аргумент str должен быть указателем на массив сим- +волов. Первый элемент массива - str[0] должен содержать максимальную длину +(в символах) читаемой строки. Массив должен быть достаточно большим, чтобы +вместить строку и заключительный нуль. Функция продолжает считывать символы, +пока не будет прочитан код новой строки (0x0D) или заданное количество сим- +волов. При этом, код новой строки заменяется на нуль. Строка запоминается +с str[2] элемента массива. Во втором элементе массива str[1] запоминается +действительная длина строки. +Функция возвращает указатель на начало строки, находящейся в str[2]. +В случае ошибки, возвращаемое значение не определено. + + + CHDIR + + #include + + char chdir(char *pathname) + + Описание. + + Функция изменяет текущий каталог и текущий диск, если он указан +в pathname. Если путь начинается с "\" - это означает путь от корневого +каталога, иначе от текущего. Pathname должен ссылаться на существующий +каталог. +Функция возвращает значение 0, если рабочий каталог успешно изменен. +При ошибке, возвращается -1 (0FFh) и errno содержит номер ошибки. + + + CLEARERR + + #include + + void clearerr(FILE *fp) + + Описание. + + Функция clearerr относится к высоко-уровневому вводу/выводу. +Функция сбрасывает в FILE-структуре файла 4-й бит "индикатора ошибки" +и 5-й бит "индикатора конца файла". Индикаторы ошибок автоматически +не очищаются: если для файла установлен индикатор ошибки, то операции +над файлом будут возвращать значения ошибок до тех пор, пока не будут +вызваны функции clearerr или rewind. + + + CLRSCR + + #include + + void clrscr() + + Описание. + + Функция производит очищение экрана. + + + CPRINTF + + #include + + int cprintf(char *format, arg1, arg2, ...) + + Описание. + + Функция выводит с преобразованием формата наборы символов и значений +прямо на экран. Каждый аргумент должен указывать на значение с типом, который +соответствует типу, заданному в строке формата. +Функция возвращает число выведенных символов. При ошибке вывода, функция +возвращает отрицательное значение. + + + CPUTS + + #include + + void cputs(char *str) + + Описание. + + Функция выводит текстовую строку прямо на экран. Строка должна +оканчиваться нулем. + + + CREAT + + #include + + uint creat(char *name, int attr) + uint creat(char *name, char attr) + + Описание. + + Функция низко-уровневого ввода/вывода. +Функция creat создает новый файл. Если файл уже существует, урезает его +до нулевой длины. Значение attr состоит из одной или нескольких констант: +S_IWRITE и S_IREAD, объявленных в "stat.h". Если задаются обе константы, +они объединяются при помощи логического ИЛИ "|". +Функция возвращает номер дексриптора. +При ошибке, возвращает значение -1 (0FFFFh) и errno содержит номер ошибки. + +Функция возвращает номер дескриптора файла, если Ok. +При ошибке, возвращает значение -1 (0FFFFh) и ячейка errno содержит номер +ошибки. + + + DEC8 + + #include + + void dec8(char value) + + Описание. + + Функция выводит аргумент value в десятичном формате, без ведущих +нулей. Диапазон выводимых значений 0..255. Функция не возвращает никакого +значения. + + + DEC16 + + #include + + void dec16(uint value) + + Описание. + + Функция выводит аргумент value в десятичном формате, без ведущих +нулей. Диапазон выводимых значений 0..65535. Функция не возвращает никакого +значения. + + + DEC32 + + #include + + void dec32(uint high, uint low) + + Описание. + + Функция выводит два 16-ти битных аргумента high (ст.разряд) и +low (мл.разряд) как одно значение. Вывод происходит в десятичном формате, +без ведущих нулей. Диапазон выводимых значений 0...4 млрд. +Функция не возвращает никакого значения. + + + DISABLE + + #include + + void disable() + + Описание. + + Функция запрещает прерывания. + + + DIV + + #include + + struct divt *div(uint num1, uint num2) + + Описание. + + Функция делит num1 на num2, возвращая частное и остаток. Возвращает +структуру типа div_t, определенную в . + + + ENABLE + + #include + + void enable() + + Описание. + + Функция разрешает прерывания. + + + _EXIT + + #include + + void _exit(int code) + + Описание. + + Функция завершает вызванный процесс без обновления буферов потока. +Значение code обычно устанавливается в 0 для указания нормального выхода и +устанавливается в любое другое значение для определения ошибки. Поскольку +вызов _exit не возвращает значения, то мл. байт code является кодом возв- +рата для родительского процесса. + + + EXIT + + #include + + void exit(int code) + + Описание. + + Функция завершает вызванный процесс. Перед завершением процесса, +функция сбрасывает все буферы в файлы и закрывает все открытые файлы. Перед +выходом в операционую систему, функция предварительно вызывает на отработку +зарегистрированные функции "exit function" (отрабатывающие перед выходом в +ДОС). Значение code обычно устанавливается в 0 для указания нормального вы- +хода и устанавливается в любое другое значение для определения ошибки. +Поскольку вызов exit не возвращает значения, то мл. байт code является кодом +возврата для родительского процесса. + + + FCLOSE + + #include + + char fclose(FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция сбрасывает буфер в файл и закрывает его. Данной функцией можно закры- +вать только те файлы, работа с которыми производится в рамках высоко-уровне- +вого ввода/вывода. Для закрытия файлов в рамках низко-уровневого ввода/вывода, +необходимо применять функцию close. +Функция возвращает 0 при успешном завершении. При ошибках возвращается +значение -1 (0FFh) и errno содержит номер ошибки. + + + FCLOSALL + + #include + + void fclosall() + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция сбрасывает все буферы в файлы и закрывает все открытые файлы. + + + FDOPEN + + #include + + FILE *fdopen(FD fd, char *mode) + + Описание. + + Функция разрешает файлу, oткрытoму для низкo-урoвневoгo ввoда/вывoда, +быть буферирoванным и фoрматирoванным, т.е. преобразует его для высоко-уровне- +вого ввода/вывода. После этого, для всех пoследующих oпераций с файлом, необ- +ходимо использовать функции высоко-уровневого ввода/вывода. В следствии этого, +закрывать файл необходимо функцией fclose, а не close. Символьная строка mode +определяет тип доступа к файлу: + + r,w,a - режим текст. файла + rb,wb,ab - режим. бинарного файла + r+, w+, a+ - r/w, "на обновление" текст. файла + r+b, w+b, a+b - r/w, "на обновление" бинарного файла + +В дoбавление к вышеприведенным значениям, может быть добавлен симвoл "b" +или "t", для задания режима трансляции нoвых стрoк. Опция "t" не относится +к ANSI-стандарту для fopen. Этo расширение Microsoft и oнo не дoлжнo испoль- +зoваться, если требуется ANSI-сoвместимoсть. +Если "b" или "t" не заданы в стрoке "mode", режим трансляции oпределяется +как "t". +Функция вoзвращает указатель на oткрытую FILE-структуру. При ошибке, возвра- +щается NULL. + + + FFIRST, _FFIRST + + #include + + char _ffirst(char *pathname, FIND *ffblk, char attr) + char ffirst(char *pathname, FIND *ffblk, char attr) + + Описание. + + Функция ffirst производит поиск заданного в pathname файла из группы +файлов. Аргумент pathname может содержать имя диска и каталог для поиска. В +имени файла допускаются глобальные символы ? и *. Имя найденного файла нахо- +дится в формате DOS "filename.ext". +Функция _ffirst отличается от функции ffirst тем, что возвращает имя найден- +ного файла в формате "FilenameExt". +Если файл обнаружен, функция заполняет структуру (определенную в "dos.h"), на +которую указывает аргумент ffblk. +Аргумент attr содержит атрибут(ы) файлов для поиска и может принимать следую- +щие значения, определенные в "dos.h": + + FA_NORMAL Обычный файл + FA_RDONLY Только чтение + FA_HIDDEN Скрытый файл + FA_SYSTEM Системный файл + FA_LABEL Метка тома + FA_DIREC Каталог + FA_ARCH Архивный + +Мoжнo задавать кратные значения атрибутов, испoльзуя симвoл "|" (оператор OR). +Функция возвращает 0 при успешном завершении поиска. +Если файл не найден или в имени файла встретилась какая-либо ошибка, возвра- +щается -1 и errno содержит номер ошибки. + + + FFLUSH + + #include + + char fflush(FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция освобождает (записывает) буфер открытого файла. Применяется для сох- +ранения данных на диске, перед выполнением операции, могущей сломать систему. +Если файл открыт для записи, буфер сбрасывается в файл. Если файл открыт для +чтения, буфер очищается. После вызова функции, файл остается открытым. +Функция возвращает 0, если буфер успешно обновлен. Это же значение возвраща- +ется, когда поток не имеет буфера или когда он открыт только для чтения. В +случае возникновения ошибки, возвращается значение EOF. + + + FGETC + + #include + + char fgetc(FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция читает текущий символ из потока fp и ставит указатель (если он есть) +на следующий символ. Возвращается считанный символ. +В случае возникновения ошибки или достижения конца файла, возвращается значе- +ние EOF. Однако, значение EOF может быть воспринято как целая величина, тогда +нужно использовать функции ferror и feof для проверки ошибки или конца файла. + + + FGETPOS + + #include + + char fgetpos(FILE *fp, fpos_t *position) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция сохраняет текущее положение указателя файла в объекте, на который +указывает position. Позднее, функция fsetpos использует значение, хранимое +в position для переустановки указателя в файле в новое положение. Значение +position хранится вo внутреннем фoрмате и oнo дoлжнo испoльзoваться тoлькo +с функциями fgetpos и fsetpos. +Функция вoзвращает 0. При ошибке, вoзвращается -1. + + + FGETS + + #include + + char *fgets(char *string, int maxlen, FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция читает строку из входного потока fp и располагает ее в string. +Символы считываются, начиная с текущей позиции fp и до символа новой +строки '\n' или до конца потока, либо пока число считанных символов не +станет равным maxlen-1. Строка размещается в string, затем в ее конец +ставится нуль. Символ новой строки также включается в string. Если в +начале считывания maxlen равнялось 1, то string будет пустой "". +Функция возвращает указатель на строку string. При ошибке или конце файла, +возвращается NULL. + + + FNEXT + + #include + + char fnext(FIND *ffblk) + + Описание. + + Функция производит поиск следующего совпадающего файла. При каждом +вызове, функция возвращает одно имя файла, до тех пор, пока параметры файла +будут подходить под заданные параметры поиска. Аргумент ffblk должен указы- +вать на структуру (определенную в ), предварительно заполненную функ- +цией ffirst. +Функция возвращает 0 при успешном завершении поиска. Если файл не найден или +в имени файла встретилась какая-либо ошибка, возвращается -1 и errno содержит +номер ошибки. + + + FOPEN + + #include + + FILE *fopen(pathname, mode) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция открывает файл с именем pathname. Символы в строке mode определяют +тип доступа к файлу. +Функция возвращает указатель на структуру открытого файла. При ошибке, возв- +ращается NULL. + + + FPRINTF + + #include + + int fprintf(FILE *fp, char *format, arg1, arg2, ...) + + Описание. + + Функция выводит данные с преобразованием формата в файл *fp из пере- +менных, определяемых указателями аргументов args. Каждый аргумент должен ука- +зывать на значение с типом, который соответствует типу, заданному в строке +формата. +Функция возвращает число выведенных символов. При ошибке вывода, функция +возвращает отрицательное значение. + + + FPUTC + + #include + + char fputc(char ch, FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Записывает символ ch в файл fp. Функция возвращает записанный символ. +При ошибке, возвращается значение EOF. + + + FPUTS + + #include + + char fputs(char *string, FILE *fp) + + Описание. + + Функция копирует строку в конец файла fp. Нулевой символ окончания +строки '\0' не копируется. Функция возвращает последний записанный символ. +При ошибке возвращается значение EOF. + + + FREAD + + #include + + uint fread(buffer, size, count, FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция читает объекты размера size по счетчику count из входного файла +fp и располагает их в буфере buffer. Возвращает число реально прочитанных +объектов. +Примечание. При чтении из stdin, код 0x0D заменяется на код 0x0A (прoгoн +бумаги) и нет возможности редактировать вводимые данные. Нажатие на комби- +нацию клавиш Ctrl+Z или Ctrl+C воспринимается как конец ввода данных. +Для ввода строки символов из stdin лучше использовать функцию gets, допус- +кающую редактирование вводимых данных. + + + FREE + + #include или + + void free(char *ptr) + + Описание. + + Функция освобождает блок памяти. Аргумент ptr указывает на ранее +захваченный блок памяти посредством вызова malloc, calloc, realloc. +Возвращаемого значения нет. + + + FREOPEN + + #include + + FILE *freopen(pathname, mode, FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция закрывает текущий файл, связанный с дескриптором (FILE-структурой) +fp и переназначает этот дескриптор на новый файл, определяемый path-именем. +Ошибки при закрытии файла игнорируются. Эта функция обычно применяется для +переадресации предоткрытых потоков stdin, stdout, stderr, stdaux и stdprn в +файлы, определяемые пользователем. Но поскольку ДОС Estex не поддерживает эти +потоки, то при попытке переадресации stdin, stdout, stderr, stdaux и stdprn, +будет возвращен NULL. Новый файл открывается в режиме mode. +Функция возвращает указатель на fp вновь открытого файла. При ошибке, функция +возвращает значение NULL. + + + FSCANF + + #include + + int fscanf(FILE *fp, char *format, arg1, arg2, ...) + + Описание. + + Функция читает данные с преобразованием формата из файла *fp, в пере- +менные, определяемые указателями аргументов args. Каждый аргумент должен ука- +зывать на значение с типом, который соответствует типу, заданному в строке +формата. Функция использует буфер в области стека, размером 128 байт. +Функция возвращает число полей, разделенных спец-символами. При достижении +конца файла, возвращается EOF. + + + FSEEK + + #include + + struct fpoint *fseek(FILE *fp, high, low, type) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция устанавливает указатель в файле на новое место расположения, опреде- +ляемое аргументами high и low, соответственно старшая и младшая часть 32-х +битного значения перемещения. Тип перемещения определяется аргументом type. +Следующая операция в файле выполняется на новом месте расположения указателя. +Аргумент type может быть одной из следующих констант, определенных в + + SEEK_SET от начала файла + SEEK_CUR от текущей позиции указателя в файле + SEEK_END от конца файла + +Функция возвращает структуру f_point, определенную в "types.h". +При ошибке возвращается -1 и errno содержит номер ошибки. Установка указателя +за пределами файла, ошибки не вызывает. Для устройств, не приспособленных к +поиску (таких как терминалы и принтеры), возвращается значение -1. + + + FSETPOS + + #include + + char fsetpos(FILE *fp, fpos_t *position) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция fsetpos устанавливает положение указателя в файле равным значению, +находящемуся в position, кoтoрoе пoлучается при вызoве функции fgetpos для +данного файла. Функция oчищает индикатoр кoнца файла. Значение position +хранится вo внутреннем фoрмате и oнo дoлжнo испoльзoваться тoлькo с функ- +циями fgetpos и fsetpos. +Функция вoзвращает 0. При ошибке, вoзвращается -1. + + + FTELL + + #include + + struct fpoint *ftell(FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция ftell получает текущую позицию указателя в файле. Позиция выражается +как число байтов от начала файла. Функция возвращает структуру f_point, опре- +деленную в . +При ошибке возвращается -1 и errno содержит номер ошибки. Для устройств, не +приспособленных к поиску (таких как терминалы и принтеры), возвращается значе- +ние -1. + + + FWRITE + + #include + + uint fwrite(buffer, size, count, FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция записывает объекты размера size по счетчику count из буфера buffer +в выходной файл fp. +Возвращает число реально записанных объектов. + + + GETC + + #include + + char getc(FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция читает текущий символ из потока fp и ставит указатель (если он есть) +на следующий символ. Возвращается считанный символ. +В случае возникновения ошибки или достижения конца файла, возвращается значе- +ние EOF. Однако, значение EOF может быть воспринято как целая величина, тогда +нужно использовать функции ferror и feof для проверки ошибки или конца файла. + + + GETCH + + #include + + char getch() + + Описание. + + Функция читает символ с клавиатуры без отображения на экране. + + + GETCHE + + #include + + char getche() + + Описание. + + Функция читает символ с клавиатуры с отображением на экране. При +нажатии на Ctrl+Z или Ctrl+C, возвращает значение -1. + + + GETCURSMOUSE + + #include + + MSCURS *getCursMouse(char *buffer) + + Описание. + + Функция получает изображение курсора из драйвера мыши и сохраняет +его в буфере buffer. +Функция возвращает указатель на заполненную структуру MSCURS, определенную +в . +При ошибке, возвращается значение -1 (0FFFFh) и errno содержит номер ошибки. + + + GETSENSMOUSE + + #include + + MSSENS *getSensMouse() + + Описание. + + Функция возвращает значения чувствительности перемещения мыши по +вертикали и горизонтали. +Функция возвращает указатель на заполненную структуру MSSENS, определенную +в . +При ошибке, возвращается значение -1 (0FFFFh) и errno содержит номер ошибки. + + + GETGSTATMOUSE + + #include + + MSGSTAT *getGStatMouse() + + Описание. + + Функция возвращает текущие графические координаты курсора мыши +и состояние ее кнопок. +Функция возвращает указатель на структуру MSGSTAT, определенную в . +При ошибке, возвращается значение -1 (0FFFFh) и errno содержит номер ошибки. + + + GETSTATMOUSE + + #include + + MSSTAT *getStatMouse() + + Описание. + + Функция возвращает текущие текстовые координаты курсора мыши и +состояние ее кнопок. +Функция возвращает указатель на структуру MSSTAT, определенную в . +При ошибке, возвращается значение -1 (0FFFFh) и errno содержит номер ошибки. + + + GETCWD + + #include + + char *getcwd(char *pathbuff, int len) + + Описание. + + Функция получает полное (с буквой диска) path-имя текущего каталога +и сохраняет его в буфере pathbuff. В конце path-имени текущего каталога стоит +символ "\" с заключительным нулем в конце строки. Аргумент len определяет мак- +симальную длину для path-имени, которая должна быть достаточной, чтобы вмес- +тить информацию вместе с заключительным нулем. Максимальная длина path-имени +в ДОС равна 256 байтов. Если длина path-имени превышает len, то path-имя обре- +зается на длину len, при этом символ "\" в конец строки не ставится. +Если аргумент pathbuff равен NULL, то getcwd вызывает malloc для выделения +буфера размером len байтов. Этот выделенный буфер позже может быть освобожден +посредством функции free. +Функция возвращает указатель на pathbuff. При ошибке возвращается NULL и errno +содержит номер ошибки. + + + GETDATE + + #include + + void getdate(struct date *date) + + Описание. + + Функция возвращает системную дату в заполненной структуре date. +Структура date описана в . + + + GETDISK + + #include + + char getdisk() + + Описание. + + Функция возвращает номер текущего диска. +Номер диска соответствует: 0=A, 1=B,... и т.д. + + + GETENV + + #include + + char *getenv(char *varname) + + Описание. + + Функция возвращает для заданного имени переменной окружения varname +указатель на значение (строку) этой переменной. Максимальная длина строки +значения переменной окружения должна быть не более 255 байт. +Возвращается значение NULL, если заданная переменная на текущий момент не +определена. При ошибке также возвращается NULL, но в errno будет содержаться +номер ошибки. + + + GETS + + #include + + char *gets(char buffer[255]) + + Описание. + + Функция читает из стандартного потока stdin строку и запоминает ее в +своем буфере buffer. Входная строка читается до тех пор, пока не встрерится +код новой строки "0x0D" или число введенных символом не превысит 254. В конец +строки вместо кода 0x0D заносится нуль, в отличии от функции fgets, которая +сохраняет символ 0x0D. +Функция возвращает указатель на буфер. В случае ошибки, возвращаемое значение +не определено. +Формат строки в буфере следующий: + + +0: - байт, содержащий длину прочитанной строки, без концевого нуля. + +1: - начало строки. + + + GETTIME + + #include + + void gettime(struct time *time) + + Описание. + + Функция возвращает системное время в заполненной структуре time. +Структура time описана в . + + + GOTOXY + + #include + + void gotoxy(int x, int y) + + Описание. + + Функция устанавливает курсор на X,Y позицию. + + + HARDMOUSE + + #include + + char hardMouse() + + Описание. + + Обработчик аппаратного прерывания от мыши. По приходу прерывания от +мыши, вызывается данная функция драйвера. В случае, когда требуется работа +подпрограммы при запрещенных прерываниях, используйте данную функцию, для +избежания потерь пакетов данных от мыши. +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + HEX8 + + #include + + void hex8(char value) + + Описание. + + Функция выводит в шестнадцатеричном формате значение value. +Диапазон выводимых значений 0x00..0xFF. +Возвращаемого значения нет. + + + HEX16 + + #include + + void hex16(uint value) + + Описание. + + Функция выводит в шестнадцатеричном формате значение value. +Диапазон выводимых значений 0x0000..0xFFFF. +Возвращаемого значения нет. + + + HEX32 + + #include + + void hex32(uint high, uint low) + + Описание. + + Функция выводит в шестнадцатеричном формате 16-ти битные значения +аргументов high (ст.разряд) и low (мл.разряд) как одно число. +Возвращаемого значения нет. + + + HIDEMOUSE + + #include + + char hideMouse(void) + + Описание. + + Функция убирает курсор мыши с экрана, но драйвер продолжает +отслеживание перемещения мыши и нажатие на кнопки. +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + HOME + + #include + + void home() + + Описание. + + Функция устанавливает курсор в левый верхний угол экрана. + + + INITMOUSE + + #include + + char initMouse(void) + + Описание. + + Функция выполняет инициализацию драйвера мыши. +Функция возвращает 0 при успешном завершении. При ошибке, возвращается +значение -1. + + + INP + + #include + + char inp(uint port) + + Описание. + + Функция читает один байт из порта port. Аргумент port может быть +любым беззнаковым целым числом в диапазоне от 0 до 65535. +Функция возвращает прочитанный байт из port. + + + INTDOS + + #include + + void intdos(union REGS *ri, union REGS *ro) + + Описание. + + Функция intdos осуществляет выполнение системного ДОС-вызова (с возв- +ратом флагов условий), который определен значениями регистров, объявленных в +union REGS *ri и возвращает результат системного вызова в union REGS *ro. +Тип объединения union REGS объявлен в . +Для осуществления системного вызова intdos выполняет команду RST 10h. Перед +выполнением команды функция копирует содержимое union REGS *ri в соответству- +ющие регистры. После выполнения команды RST, функция intdos копирует значения +текущих регистров в union REGS *ro. Она также копирует возвращаемый флаг усло- +вий системы в поле flag, размещенное в union REGS *ro. Если это поле является +ненулевым, флаг указывает на условие ошибки. + + union REGS *ri - значения регистров при вызове + union REGS *ro - значения регистров при возврате + + + ISALNUM + + #include + + BOOL isalnum(char ch) + + Описание. + + Функция проверяет символ ch на принадлежность к алфавитно-цифровому +типу (A..Z, a..z, 0..9). + + + ISALPHA + + #include + + BOOL isalpha(char ch) + + Описание. + + Функция проверяет символ ch на принадлежность к буквам (A..Z, a..z). + + + ISASCII + + #include + + BOOL isascii(char ch) + + Описание. + + Функция проверяет символ ch на ASCII принадлежность. + + + ISATTY + + #include + + BOOL isatty(FD fd) + + Описание. + + Функция низко-уровневого ввода/вывода. Функция определяет, принад- +лежит ли данный дескриптор стандартным потокам (терминал, консоль,...). +Функция возвращает: + true - дескриптор принадлежит терминалу, консоли. + false - дескриптор принадлежит файлу. + + + ISCNTL + + #include + + BOOL iscntl(char ch) + + Описание. + + Функция проверяет символ ch на принадлежность к управляющим +символам (0х00..0х1F или 0x7F). + + + ISDIGIT + + #include + + BOOL isdigit(char ch) + + Описание. + + Функция проверяет символ ch на принадлежность к цифре. + + + ISGRAPH + + #include + + BOOL isgraph(char ch) + + Описание. + + Функция проверяет символ ch на принадлежность к печатаемым символам, +исключая символ пробела (0х21..0х7E). + + + ISLOWER + + #include + + BOOL islower(char ch) + + Описание. + + Функция проверяет символ ch на принадлежность к строчному символу. + + + ISPRINT + + #include + + BOOL isprint(char ch) + + Описание. + + Функция проверяет символ ch на принадлежность к печатаемым +символам (0х20..0х7E). + + + ISPUNCT + + #include + + BOOL ispunct(char ch) + + Описание. + + Функция проверяет символ ch на принадлежность к знакам пунктуации. + + + ISSPACE + + #include + + BOOL isspace(char ch) + + Описание. + + Функция проверяет символ ch на принадлежность к пробельным +символам (0x09, 0x0D или 0x20). + + + ISUPPER + + #include + + BOOL isupper(char ch) + + Описание. + + Функция проверяет символ ch на принадлежность к прописному символу. + + + ISXDIGIT + + #include + + BOOL isxdigit(char ch) + + Описание. + + Функция проверяет символ ch на принадлежность к шестнадцатеричным +цифрам (0..9, A..F, a..f). + + + KBHIT + + #include + + BOOL kbhit() + + Описание. + + Функция проверяет нажатие клавиши на клавиатуре. +Возвращает: + true - клавиша нажата + false - клавиша не нажата + + + LONGJMP + + #include + + void longjmp(env, retval) + + jmp_buf env; - переменная, в которой хранится окружение + int retval; - значение, возвращаемое при вызове setjmp + + Описание. + + Функция longjmp восстанавливает состояние стека, ранее сохраненное +в env функцией setjmp. +Функции setjmp и longjmp обеспечивают возможность выполнения нелокального +(nonlocal) перехода и обычно используются для передачи управления к обработке +ошибок для восстановления кода в ранее вызванной процедуре (без использования +обычного вызова), для возврата условных обозначений. Вызов setjmp активизирует +сохранение текущего состояния стека в env. Последующий вызов longjmp восста- +навливает сохраненное состояние и возвращает управление на указатель (точку +входа), непосредственно следующий за соответствующим вызовом setjmp. +Функция longjmp должна вызываться ранее функции, определяющей возврат setjmp. +Если longjmp вызвана после функции, определяющей возврат setjmp, то может +произойти непредсказуемое поведение программы. +Значение retval, возвращаемое longjmp, должно быть ненулевым. Если для +retval задан аргумент 0, значение возврата заменяется значением 1. +Функция longjmp не возвращает никакого значения. + + + LSEEK + + #include + + struct fpoint *lseek(FD fd, uint high, uint low, int type) + struct fpoint *lseek(FD fd, uint high, uint low, char type) + + Описание. + + Функция низко-уровневого ввода/вывода. Функция устанавливает указа- +тель в файле на новое место расположения, определяемое аргументами high и low, +соответственно старшая и младшая часть 32-х битного значения перемещения. +Тип перемещения определяется аргументом type. Следующая операция в файле вы- +полняется на новом месте расположения указателя. Аргумент type может быть +одной из следующих констант, определенных в + + SEEK_SET от начала файла + SEEK_CUR от текущей позиции указателя в файле + SEEK_END от конца файла + +Функция возвращает структуру f_point, определенную в . +При ошибке возвращается -1 и errno содержит номер ошибки. +Установка указателя за пределами файла, ошибки не вызывает. +Для устройств, не приспособленных к поиску (таких как терминалы и принтеры), +возвращается значение -1. + + + LTELL + + #include + + struct fpoint *ltell(FD fd) + + Описание. + + Функция низко-уровневого ввода/вывода. Функция получает текущую +позицию указателя в файле. Позиция выражается как число байтов от начала +файла. +Функция возвращает структуру f_point, определенную в . +При ошибке возвращается -1 и errno содержит номер ошибки. +Для устройств, не приспособленных к поиску (таких как терминалы и принтеры), +возвращается значение -1. + + + MALLOC + + #include или + + char *malloc(int size) + + Описание. + + Функция захватывает блок памяти размером в size байтов. +Функция возвращает указатель на выделенный блок памяти. Если свободной +памяти недостаточно, возвращается NULL. + + + MAX + + #include + + int max(int arg1, int arg2) + + Описание. + + Функция сравнивает два аргумента и вoзвращает значение наибольшего +аргумента. Тип аргументoв и тип вoзвращаемoгo значения oдинакoв. + + + MEMCHR + + #include + + void *memchr(char *buff, ch, count) + + Описание. + + Функция ищет первые count байт в buff с целью обнаружения первого +появления символа ch. Поиск продолжается до тех пор, пока не будет найден +указанный символ или не будут проверены все count байты. +Функция возвращает указатель на расположение символа ch в buff. +Если символ ch не обнаружен в первых count байтах buff, возвращается NULL. + + + MEMCMP + + #include + + int memcmp(*buf1, *buf2, count) + + Описание. + + Функция производит последовательное лексиграф. сравнение первых +count байтов из buf1 и buf2, и продолжает это, пока они совпадают, либо +пока не выполнится заданное количество сравнений count. +Функция возвращает значение, указывающее на соотношение этих буферов: + + < 0 buf1 < buf2 + = 0 buf1 = buf2 + > 0 buf1 > buf2 + + + MEMCPY + + #include + + void *memcpy(*dest, *source, count) + + Описание. + + Функция копирует count байтов из source в dest. Если некоторые +участки source и dest перекрываются, функция гарантирует, что байты из +перекрываемого участка, принадлежащие source, будут скопированы перед +перезаписью. +Функция возвращает указатель на dest. + + + MEMMOVE + + #include + + void *memmove(*dest, *source, count) + + Описание. + + Функция кoпируют count байтов из source в dest. Если некoтoрые +oбласти в source и dest перекрываются, функция гарантирует, чтo исхoдные +source байт из перекрывающейся oбласти будут скoпирoваны перед переписы- +ванием. +Функция возвращает указатель на dest. + + + MEMSET + + #include + + void *memset(*dest, ch, count) + + Описание. + + Функция заполняет первые count байт буфера dest символом ch. +Функция возвращает указатель на буфер dest. + + + MIN + + #include + + int min(int arg1, int arg2) + + Описание. + + Функция сравнивает два аргумента и вoзвращает значение наименьшегo +аргумента. Тип аргументoв и тип вoзвращаемoгo значения oдинакoв. + + + MKDIR + + #include + + char mkdir(char *pathname) + + Описание. + + Функция создает новый каталог с заданным path-именем. За один вызов +функции может быть создан только один новый каталог, с именем последней ком- +поненты pathname. +Функция возвращает 0, если новый каталог успешно создан. При ошибке, возвра- +щается -1 (0FFh) и errno содержит номер ошибки. + + + MOVMEM + + #include + + void movmem(*source, *destin, len) + + Описание. + + Функция movmem копирует len байт из source в destin. Если исходная +и результирующия строка перекрываются, копирование все-равно производится +корректно. + + + OPEN + + #include + + uint open(char *pathname, int oflag) + uint open(char *pathname, char oflag) + + Описание. + + Функция низко-уровневого ввода/вывода. +Функция open открывает файл, определяемый по path-имени и подготавливает +его к последующему чтению или записи, что определяется посредством oflag. +Аргумент oflag является целым выражением, состоящим из комбинации одной +или более манифестных констант, объявленных в . Если задано больше +одной константы, то они объединяются при помощи логического оператора +ИЛИ "|". Значения аргумента oflag приводятся ниже: + + O_RDWR Файл открыт одновременно для чтения и записи. + Если задается этот флаг, может быть выбран + либо флаг O_RDONLY, либо O_WRONLY. + + O_RDONLY Файл открыт только для чтения. Если задается + этот флаг, может быть выбран либо флаг O_RDWR, + либо O_WRONLY. + + O_WRONLY Файл открыт только для записи. Если задан этот + флаг, может быть задан также либо флаг O_RDONLY, + либо ORDWR. + + O_TRUNC Существующий файл открыт на чтение и запись, и + усечен к длине 0. Этот файл должен иметь разре- + шение на запись. Содержимое файла уничтожается. + + O_CREAT Новый файл создан и открыт для чтения/записи; + это не эффективно, если существует файл, опре- + деляемый по path-имени. + + O_EXCL Возвращается значение ошибки, если существует + файл, определяемый по path-имени. Применяется + только вместе с O_CREATE. + + O_APPEND Указатель в файле переместить на конец файла. + Для режимов O_RDONLY, O_TRUNC и O_CREAT не + имеет смысла. + +Замечание! O_TRUNC полностью уничтожает содержимое существующего файла, +поэтому нужно внимательно использовать эту константу. + +Функция возвращает номер дескриптора файла, если Ok. +При ошибке, возвращает значение -1 (0FFFFh) и ячейка errno содержит номер +ошибки. + + + OUTP + + #include + + char outp(uint port, char value); + + Описание. + + Функция записывает значение value в порт port. Аргумент port может +быть любым беззнаковым целым числом в диапазоне от 0 до 65535. Аргумент value +может быть любым целым числом в диапазоне от 0 до 255. +Функция возвращает записываемый байт. + + + PERROR + + #include + + void perror(char *string) + + Описание. + + Функция выводит сообщение об ошибке на stderr (экран). В этом +сообщении аргумент string выводится первым, затем выводится двоеточие, +системное сообщение об ошибке от последнего библиотечного вызова, вернув- +шего ошибку и новая строка. Если аргумент string равен NULL, то функция +пропускает сообщение string, заданное пользователем и выводит только сис- +темное сообщение об ошибке, и новую строку. +Чтобы вывести правильный результат, функция perror должна быть вызвана +сразу же после библиотечной функции, возвратившей ошибку. Иначе значение +errno может быть перезаписано при последующих вызовах библиотечных функций. +Функция не возвращает никакого значения. + + + PRINTF + + #include + + int printf(char *format, arg1, arg2, ...) + + Описание. + + Функция выводит данные с преобразованием формата в стандартный поток +stdout из переменных, определяемых аргументами args. Каждый аргумент должен +указывать на значение с типом, который соответствует типу, заданному в строке +формата. +Функция возвращает число выведенных символов. При ошибке вывода, функция +возвращает отрицательное значение. + + + PUTC + + #include + + char putc(char ch, FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Записывает символ ch в файл fp. Функция возвращает записанный символ. +При ошибке, возвращается значение EOF. + + + PUTCH + + #include + + void putch(char *c) + + Описание. + + Функция выводит символ прямо на экран. + + + PUTENV + + #include + + uint putenv(char *envstring) + + Описание. + + Функция добавляет новую переменную окружения. Аргумент envstring +должен быть указателем на строку следующего формата: + + VARNAME=VALUE + +где: VARNAME - имя добавляемой переменной окружения + VALUE - значение этой переменной + +Элементы строки должны разделяться символом "=" и строка должна оканчи- +ваться нулем. +Функция возвращает 0, если она успешно отработала. +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + PUTS + + #include + + char puts(*string) + + Описание. + + Функция записывает строку string в стандартный поток вывода stdout, +заменяя в выходном потоке нулевой символ окончания строки ('\0') символом +новой строки ('\n'). +Функция всегда возвращает последний записанный символ, которым является сим- +вол новой строки '\n'. + + + QSORT + + #include + + void qsort(*base, nel, size, *compare) + + void *base; - указатель на таблицу + unsigned nel; - количество элементов таблицы + unsigned size; - размер в байтах элемента таблицы + int (*compare)(); - указатель на функцию сравнения + + Описание. + + Функция реализует быструю сортировку таблицы данных. Аргумент +compare является указателем на процедуру, поставляемую пользователем. +В процессе сортировки, функция qsort может вызывать эту процедуру один +или несколько раз, при каждом вызове передавая указатели на два элемента +массива. Процедура compare должна сравнивать элементы, а затем возвращать +одно из следующих int-значений: + + < 0 element1 < element2 + 0 element1 = element2 + > 0 element1 > element2 + +После отработки функции qsort, таблица содержит отсортированные элементы. +В случае ошибки, возвращаемого значения нет. + + + RAND + + #include + + int rand() + + Описание. + + Функция возвращает псевдослучайное целое в интервале 0..65536. +Перед вызовом rand, может быть вызвана функция srand для установки начальной +случайной точки. + + + READ + + #include + + size_t read(FD fd, void *buff, count) + + Описание. + + Функция низко-уровневого ввода/вывода. +Функция читает число байт count из файла в буфер buff. Операция чтения +начинается с текущей позиции указателя в файле. Функция возвращает число +реально прочитанных байтов, которое однако, может быть меньше заявленного +в count (например встретится конец файла). Мaксимaльнoе числo бaйтoв, кo- +тoрoе мoжнo прoчитaть из фaйлa зa oдин рaз, рaвнo 65534; пoскoльку 65535 +(OxFFFF) является неoтличимым oт -1, пoэтoму будет вoзврaщенa oшибкa. +Функция возвращает 0, если делается попытка чтения конца файла. +При ошибке чтения, возвращается -1 и errno содержит номер ошибки. + + + REALLOC + + #include + + char *realloc(*ptr, int size) + + Описание. + + Функция изменяет размер ранее выделенного блока памяти. +Аргумент ptr указывает на начало блока. Аргумент size задает новый размер +блока в байтах. Содержимое блока не изменяется. Если size равен 0, блок +освобождается и возвращается NULL. Если ptr равен NULL, то отводится +(по malloc) size байтов памяти и возвращается указатель на этот блок. +Аргумент ptr может указывать на блок, который должен быть освобожден +прежде, чем последуют вызовы malloc, calloc, realloc. +Функция возвращает указатель на перезахваченный блок памяти. +Блок может быть передвинут, если его размеры изменены, поэтому аргумент +ptr для функции realloc не обязательно должен быть таким же, как и возвра- +щаемое значение. +Возвращается значение NULL, если памяти недостаточно для расширения блока +к заданному размеру. При этом первоначальный блок остается неизменным. + + + REFRESHMOUSE + + #include + + char refreshMouse() + + Описание. + + Функция выполняет принудительную перерисовку изображения курсора +мыши на экране не дожидаясь очередного прерывания. +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + REMOVE + + #include + + char remove(char *pathname) + + Описание. + + Функция удаляет файл, определенный по pathname. Глобальные символы +* и ? в имени файла не допускаются. Файлы с атрибутом "только для чтения" +нельзя удалить данной функцией - предварительно нужно изменить этот атрибут. +Функция возвращает 0, если файл успешно удален. При ошибке, возвращается -1 +(0FFh) и errno содержит номер ошибки. + + + RENAME + + #include + + char rename(char *oldname, char *newname) + + Описание. + + Функция переименовывает файл или каталог, определенный в имени +newname. Oldname должно задавать path-имя существующего файла или каталога. +Newname не определяет имя уже существующего файла или каталога. Функцию +rename нельзя использовать для перемещения файла из одного каталога в другой, +указав другое path-имя в аргументе newname. +Функция возвращает 0, если операция прошла успешно. +При ошибке, возвращается -1 (0FFh) и errno содержит номер ошибки. + + + REWIND + + #include + + void rewind(FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция перемещает указатель в файле к началу файла. Вызов функции эквива- +лентен вызову следующей функции: + + fseek(FILE *fp, 0, 0, SEEK_SET); + +с учетом того, что в FILE-структуре fp описателя файла функция rewind очи- +щает флаг ошибки и индикатор конца файла, а fseek этого не делает. +Функция не возвращает никакого значения. + + + RMDIR + + #include + + char rmdir(char *pathname) + + Описание. + + Функция удаляет пустой каталог, определенный в pathname. +Нельзя удалить текущий каталог или корневой. +Функция возвращает 0, если каталог успешно удален. +При ошибке, возвращается -1 (0FFh) и errno содержит номер ошибки. + + + SBRK + + #include + + char *sbrk(int n) + + Описание. + + Функция выделяет блок длиной n в пределях между указателем свободной +памяти и указателем стека. Значение n может быть отрицательным, тогда коли- +чество захваченной памяти уменьшается на n байтов. +При успешном выделении возвращает указатель на выделенный блок. +Если памяти недостаточно, возвращает -1 (0FFFFh). + + + SCANF + + #include + + int scanf(char *format, arg1, arg2, ...) + + Описание. + + Функция читает данные с преобразованием формата из стандартного +потока stdin в переменные, определяемые указателями аргументов args. +Каждый аргумент должен указывать на значение с типом, который соответ- +ствует типу, заданному в строке формата. Функция использует буфер в об- +ласти стека, размером 128 байт. +Функция возвращает число полей, разделенных спец-символами. + + + SEEK + + #include + + uint seek(FD fd, uint offset, int type) + uint seek(FD fd, uint offset, char type) + + Описание. + + Функция низко-уровневого ввода/вывода. +Функция устанавливает указатель в файле на новое место расположения, которое +определяется как смещение offset. Тип перемещения определяется аргументом +type. Следующая операция в файле выполняется на новом месте расположения +указателя. Диапазон перемещения указателя не может быть больше 65534. Если +нужно переместить указатель на большее значение, необходимо использовать +функцию lseek. Аргумент type может быть одной из следующих констант, опре- +деленных в + + SEEK_SET от начала файла + SEEK_CUR от текущей позиции указателя в файле + SEEK_END от конца файла + +Функция возвращает значение нового положения указателя. При ошибке возвра- +щается -1 и errno содержит номер ошибки. Установка указателя за пределами +файла, ошибки не вызывает. Для устройств, не приспособленных к поиску (таких +как терминалы и принтеры), возвращаемое значение -1. + + + SETDATE + + #include + + void setdate(struct date *date) + + Описание. + + Функция устанавливает новую системную дату, используя данные +структуры date. Структура date описана в . + + + SETDISK + + #include + + void setdisk(char diskno) + + Описание. + + Функция устанавливает новый текущий диск, номер которого +задан в diskno. Номер диска соответствует: 0=A, 1=B,... и т.д. + + + SETJMP + + #include + + int setjmp(env) + + jmp_buf env - переменная, в которой хранится сохраняемое + окружение. + + Описание. + + Функция setjmp сохраняет состояние стека, который может быть после- +довательно восстановлен использованием функции longjmp. +Функции setjmp и longjmp обеспечивают возможность выполнения нелокального +(nonlocal) перехода и обычно используются для передачи управления к обработке +ошибок для восстановления кода в ранее вызванной процедуре (без использования +обычного вызова), для возврата условных обозначений. Вызов setjmp активизирует +сохранение текущего состояния стека в env. Последующий вызов longjmp восста- +навливает сохраненное состояние и возвращает управление на указатель (точку +входа), непосредственно следующий за соответствующим вызовом setjmp. +После сохранения состояния стека функция setjmp возвращает значение 0. +Возвращаемого значения в случае ошибки нет. + + + SETCURSMOUSE + + #include + + char setCursMouse(MSCURS *p) + + Описание. + + Функция загружает новое изображение курсора мыши в драйвер и задает +активную точку изображения. Перед вызовом функции, должна быть заполнена +структура MSCURS, определенная в . +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + SETSENSMOUSE + + #include + + char setSensMouse(MSSENS *p) + + Описание. + + Функция устанавливает значения чувствительности перемещения мыши +по вертикали и горизонтали. Перед вызовом функции, должна быть заполнена +структура MSSENS, определенная в . +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + SETGPOSMOUSE + + #include + + char setGPosMouse(int x, int y) + + Описание. + + Функция перемещает курсор мыши в заданные графические координаты. +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + SETPOSMOUSE + + #include + + char setPosMouse(int col, int line) + + Описание. + + Функция перемещает курсор мыши в заданные текстовые координаты. +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + SETTXTMOUSE + + #include + + char setTxtMouse(MSTXT *p) + + Описание. + + Функция устанавливает символ и атрибут курсора мыши для +текстового режима. +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + SETMEM + + #include + + void setmem(*addr, len, char value) + + Описание. + + Функция устанавливает первые len байт блока addr в значение value. + + + SETTIME + + #include + + void settime(struct time *time) + + Описание. + + Функция устанавливает новое системное время, используя данные +структуры time. Структура time описана в . + + + SHOWMOUSE + + #include + + char showMouse(void) + + Описание. + + Функция выводит на экран курсор мыши, отслеживает все перемещения +курсора и перерисовывает его. +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + SLEEP + + #include + + void sleep(uint seconds) + + Описание. + + Функция приостанавливает выполнение программы на seconds секунд. +Значение seconds может находиться в диапазоне 0..65534. После выполнения +функции, прерывания остаются включенными. + + + SPRINTF + + #include + + int sprintf(char buffer, char *format, arg1, arg2, ...) + + Описание. + + Функция преобразует формат и выводит наборы символов и значений +в buffer. В конец выводимой строки записывается нуль. Каждый аргумент +должен указывать на значение с типом, который соответствует типу, задан- +ному в строке формата. +Функция возвращает количество символов, записанных в buffer. + + + SRAND + + #include + + void srand(seed) + + Описание. + + Функция srand устанавливает начальную точку для генерации множества +псевдослучайных целых. В качестве аргумента seed для переустановки генератора +используется 1. Любое другое значение seed устанавливает генератор в началь- +ную случайную точку. Возвращаемого значения нет. + + + SSCANF + + #include + + int sscanf(char *buffer, char *format, arg1, arg2, ...) + + Описание. + + Функция читает данные с преобразованием формата из buffer, в пере- +менные, определяемые указателями аргументов args. Каждый аргумент должен +указывать на значение с типом, который соответствует типу, заданному в +строке формата. +Функция возвращает число полей, разделенных спец-символами. + + + STRCAT + + #include + + char *strcat(*s1, *s2) + + Описание. + + Функция добавляет s2 к s1, завершая строку s1 нулевым символом. +Функция возвращает указатель на s1. + + + STRCHR + + #include + + char *strchr(*string, ch) + + Описание. + + Функция находит первое вхождение ch в string. Символ ch может быть +нулевым символом. Нулевой символ окончания string также включается в поиск. +Функция возвращает указатель на первое вхождение ch в string. +Возвращается NULL, если символ не найден. + + + STRCMP + + #include + + int strcmp(*s1, *s2) + + Описание. + + Функция производит последовательное регистро-зависимое сравнение +символов строк s1 и s2, и продолжает это, пока они совпадают, либо пока +одна из строк не закончится. +Функция возвращает значение, указывающее на соотношение этих строк: + + < 0 s1 < s2 + = 0 s1 = s2 + > 0 s1 > s2 + + + STRCPY + + #include + + char *strcpy(*s1, *s2) + + Описание. + + Функция копирует s2 в s1 (включая 0-й символ окончания строки). +Функция возвращает указатель на s1. + + + STRCSPN + + #include + + size_t strcspn(*s1, *s2) + + Описание. + + Функция находит первую часть строки в s1, не входящую в строку s2. +Возвращает длину части строки s1, состоящей из символов, не найденных в +строке s2. Если ни один из символов строки s1 не найден в s2, возвращается +общая длина строки s1 без завершающего нуля. + + + STRERR + + #include + + char *strerr(char errno) + + Описание. + + Функция strerr (аналогична strerror) преобразует errno в стрoку +системного сooбщения oб oшибке и вoзврaщaет укaзaтель нa эту стрoку. +Функция, в отличие от perror, не выводит никаких сooбщений. Для вывода +сообщения требуется вызвaть функцию вывoдa (например cprintf). +Номер ошибки хранится в переменной errno, которая объявлена на внешнем +уровне и используется как индекс в массиве системных сообщений. +Системные сообщения об ошибках доступны через переменную _errlst_, +являющуюся массивом системных сообщений об ошибках. +Чтобы вернуть правильный результат, функция strerr должна быть вызвана +сразу после библиотечной функции, возвратившей ошибку. Иначе, значение +errno может быть перезаписано при последующих вызовах библиотечных функ- +ций. Для любого значения errno, не используемого в ДОС, функция strerr +возвращает указатель на пустую строку. + + + STRLEN + + #include + + size_t strlen(*string) + + Описание. + + Функция возвращает в байтах длину строки string, причем нулевой +символ окончания строки, в размер строки не входит. + + + STRLWR + + #include + + char *strlwr(*string) + + Описание. + + Функция преобразовывает любые буквы верхнего регистра строки string, +заканчивающейся нулем, в буквы нижнего регистра. Другие символы не рассмат- +риваются. Функция возвращает указатель на строку string. + + + STRNCAT + + #include + + char *strncat(*s1, *s2, count) + + Описание. + + Функция добавляет count символов строки s2 в конец строки s1, +завершая строку s1 нулевым символом. В s1 должно быть достаточно места +для размещения результирующей строки. Функция возвращает указатель на s1. + + + STRNCMP + + #include + + int strncmp(*s1, *s2, uint count) + + Описание. + + Функция производит последовательное регистро-зависимое сравнение +символов строк s1 и s2. Количество сравниваемых символов задается в count. +Если одна из строк заканчивается, сравнение прекращается. +Функция возвращает значение, указывающее на соотношение этих строк: + + < 0 s1 < s2 + = 0 s1 = s2 + > 0 s1 > s2 + + + STRNCPY + + #include + + char *strncpy(*s1, *s2, count) + + Описание. + + Функция копирует точно count символов строки s2 в строку s1. Если +count меньше длины s2, нулевой символ окончания строки не добавляется к +строке s1. Если count больше длины s2, то s1 заполняется нулевыми символами, +вплоть до достижения длины count. Функция возвращает указатель на s1. + + + STRPBRK + + #include + + char *strpbrk(*s1, *s2) + + Описание. + + Функция находит первое вхождение в строке s1 любого символа из +строки s2. Нулевой символ окончания при поиске не рассматривается. +Функция возвращает указатель на первое вхождение символа из s2 в строке +s1. При отсутствии общих символов в s1 и s2, возвращается NULL. + + + STRRCHR + + #include + + char *strrchr(*string, ch) + + Описание. + + Функция находит последнее вхождение символа ch в строке string. +Нулевой символ окончания строки string также включается в поиск. +Функция возвращает указатель на последнее вхождение символа ch в string. +Если заданный символ не найден, возвращается NULL. + + + STRSPN + + #include + + size_t strspn(*s1, *s2) + + Описание. + + Функция возвращает длину совпадающей части строки s1, которая +полностью состоит из символов, найденных в строке s2. Нулевой символ +окончания строки s2 не рассматривается. Если строка s1 начинается с сим- +вола, не входящего в строку s2, возвращается 0. + + + STRSTR + + #include + + char *strstr(*s1, *s2) + + Описание. + + Функция возвращает указатель на первое вхождение строки s2 в +строку s1. Функция возвращает NULL, если s2 не была найдена. Если длина +строки s2 равна 0, возвращается s1. + + + STRTOK + + #include + + char *strtok(*s1, *s2) + + Описание. + + Функция находит в строке s1 токен, отделенный одним (или более) +ограничителем из множества символов-ограничителей строки s2. Найденный +токен в строке s1 оканчивается нулем. Для того, чтобы прочитать следующий +токен из s1, функция strtok должна вызываться с NULL-значением для аргу- +мента s1. Аргумент NULL s1 вызывает strtok на поиск следующего знака в +предыдущей строке символов. +Множество ограничителей в строк s2, от вызова к вызову, может быть различ- +ным, так что s2 может принимать любые значения. При каждом вызове, функция +возвращает указатель на найденный токен строки s1, каждый раз продвигаясь +вперед по строке s1. +Функция возвращает указатель NULL, когда больше нет токенов в строке s1. + + + STRTOL + + #include + + int strtol(char *s, char **eptr, int base) + + char *s указатель на строку + char **eptr указатель на конец просмотра + int base используемое основание числа + + Описание. + + Функция преобразует символьную строку s в long-значение, эквива- +лентное числу с заданным base основанием. Функция прекращает чтение строки, +как только встретится символ, который не может быть частью числа - это мо- +жет быть нулевой символ '\0' в конце строки или первый цифровой символ, ко- +торый больше или равен base. Если eptr не равен NULL, *eptr указывает на тот +символ, на котором останавливается просмотр. +Функция strtol предполагает, что s указывает на строку следующей структуры: + + [whitespace][sign][0][x][digits] + +Если base лежит между 2 и 36, это значение используется, как основание сис- +темы счисления данного числа. Если base равно 0, начальные символы строки, +на которые указывает s, используются для определения основания. Если первый +символ равен 0 и второй - одна из цифр от 1 до 7, то строка интерпретируется +как восьмеричное целое. Если первый символ равен 0, а второй 'x' или 'X', +тогда строка понимается как шестнадцатеричное целое. Если первый символ при- +надлежит к цифрам 1..9, то строка понимается как десятичное целое. +Функция strtol возвращает значение преобразованной строки, если не было +переполнения или потери результата. + + + STRUPR + + #include + + char *strupr(*string) + + Описание. + + Функция преобразовывает любые буквы нижнего регистра строки string, +заканчивающейся нулем, в буквы верхнего регистра. Другие символы не рассмат- +риваются. Функция возвращает указатель на строку string. + + + SYSENV + + #include + + char *sysenv(char *sysenv) + + Описание. + + Функция получает системное окружение. Аргумент sysenv должен быть +указателем на буфер, предназначенный для данных системного окружения. Размер +буфера должен быть достаточным, чтобы вместить все данные системного окруже- +ния. Формат данных в буфере следующий: + + - строка каждой переменной окружения заканчивается на нуль. + - в конце строки последней переменной окружения, стоит дополнительный + нуль, показывающий, что дальше переменных нет. + +Пример (в асмовом варианте): + +sysenv: db "PATH=c:\fn;c:\zx",0 + db "SOLID=H",0 + db 0 + +Функция возвращает указатель на буфер sysenv. При ошибке, возвращается +значение -1 и errno содержит номер ошибки. + + + TELL + + #include + + uint tell(FD fd) + + Описание. + + Функция низко-уровневого ввода/вывода. Функция возвращает текущую +позицию указателя в файле. Позиция выражается как число байтов от начала +файла. Значение возвращаемого указателя не может быть больше 65534. Если +нужно получить большее значение, необходимо использовать функцию ltell. +При ошибке возвращается -1 и errno содержит номер ошибки. +Для устройств, не приспособленных к поиску (таких как терминалы и принтеры), +возвращаемое значение -1. + + + TOLOWER + + #include + + char tolower(char ch) + + Описание. + + Функция преобразует прописной символ ch в строчный. + + + TOUPPER + + #include + + char toupper(char ch) + + Описание. + + Функция преобразует строчный символ ch в прописной. + + + UNGETC + + #include + + char ungetc(char ch, FILE *fp) + + Описание. + + Функция относится к функциям высоко-уровневого ввода/вывода. +Функция возвращает символ ch в файл. Последующая операция чтения из +файла начинается с символа ch. +При удачном завершении, функция возвращает ch. При ошибке возвращается +EOF, говорящее о неудачном возвращении заданного символа. + + + UNLINK + + #include + + char unlink(char *pathname) + + Описание. + + Функция удаляет файл, определенный по pathname. Глобальные символы +* и ? в имени файла не допускаются. Файлы с атрибутом "только для чтения" +нельзя удалить данной функцией - предварительно нужно изменить этот атрибут. +Функция возвращает 0, если файл успешно удален. При ошибке, возвращается -1 +(0FFh) и errno содержит номер ошибки. + + + VMODEMOUSE + + #include + + char vmodeMouse(char video_mode) + + Описание. + + Функция информирует драйвер мыши о смене режима экрана. Номера +режимов соответствуют функции установки режима экрана. +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + WRITE + + #include + + size_t write(FD fd, void *buff, count) + + Описание. + + Функция низко-уровневого ввода/вывода. Функция записывает число байт +count из буфера buff в файл. Операции записи начинаются с текущей позиции +указателя в файле. Если файл открыт для добавления, операции выполняются в +конец файла. После осуществления операций записи, указатель в файле увеличи- +вается на количество реально записанных байтов. Макс. число записываемых бай- +тов в файл равно 65534; поскольку число 65535 является неотличимым от -1, то +возвращается ошибка. +Функция возвращает число реально записанных байт. При ошибке записи возвраща- +ется значение -1 и в errno устанавливается номер ошибки. + + + XLIMMOUSE + + #include + + char xLimMouse(uint minx, uint maxx) + + Описание. + + Задание горизонтальных границ перемещения курсора. +Функция задает левую минимальную и правую максимальную графические +координаты, в которых может перемещаться курсор мыши по горизонтали. +При ошибке, возвращается значение -1 и errno содержит номер ошибки. + + + YLIMMOUSE + + #include + + char yLimMouse(int miny, int maxy) + + Описание. + + Задание вертикальных границ перемещения курсора. +Функция задает верхнюю минимальную и нижнюю максимальную графические +координаты, в которых может перемещаться курсор мыши по вертикали. +При ошибке, возвращается значение -1 и errno содержит номер ошибки. diff --git a/third_party/solid-c/DOC/DEVEL-1.RUS b/third_party/solid-c/DOC/DEVEL-1.RUS new file mode 100644 index 0000000..0acbb5b --- /dev/null +++ b/third_party/solid-c/DOC/DEVEL-1.RUS @@ -0,0 +1,121 @@ + ПРИНЦИП РАЗДЕЛЬНОЙ КОМПИЛЯЦИИ + + + При разработке больших программ исходный текст разделен на несколько файлов. +После того, как они отдельно друг от друга откомпилированы, их нужно скомпоно- +вать в единую программу. Здесь описан метод раздельной компиляции и отмечены +основные моменты, на которые следует обращать внимание при разработке исходного +текста. + + + 1. Замечания к исходной программе + + Имеются две серьезные проблемы раздельной компиляции и сборки больших +программ: + + - ссылки на функции из других файлов + - возможность получения общих данных + + Ниже дана попытка освещения этих вопросов с параллельным показом на приме- +рах. Рассмотрим следующую программу. + +#include +int a[10]; +char b[4]; + +char main() +{ + char sub1(),sub2(); + sub1(); + sub2(); + printf("%d,%d,%d\n",a[0],a[3],a[9]); + printf("%c,%c,%c\n",b[0],b[1],b[2]); +} + +char sub1() +{ + a[0]=1; + a[3]=2; + a[9]=3; +} + +char sub2() +{ + b[0]='a'; + b[1]='b'; + b[2]='c'; +} + + Текст данной программы размещен в трех файлах с именами PROG1, PROG2 и +PROG3 - соответственно содержащих главную функцию и функции 1 и 2. +Точнее, в каждом из этих файлов содержатся: + +PROG1.C: + #include + int a[10]; + char b[4]; + char main() + { + : + : + } + +PROG2.C: + extern int a[10]; + char sub1() + { + : + : + } + +PROG3.C: + extern char b[4]; + char sub2() + { + : + : + } + + Функция main вызывает функции sub1 и sub2, поэтому их определения необхо- +димы. Так как функции sub1 и sub2 в свою очередь никакие другие функции не +вызывают - никаких других описаний не требуется. Использование массивов "a" +и "b" также является проблемой. На идентификатор "а" ссылаются программа main +и sub1. На массив "b" ссылаются функции main и sub2. В любом из этих вариантов +между файлами должна быть установлена связь. + Для этой цели используется описатель "extern" (внешний). В первом из файлов +- PROG1.C, этот описатель отсутствует, однако в двух других файлах этот описа- +тель введен. Этот факт отражает то обстоятельство, что массивы "a" и "b" содер- +жатся в файле PROG1.C, а в других файлах этих массивов нет. Если в двух или +большем числе файлов будут стоять определения без описателей "extern", то при +сборке единой программы появятся сообщения о дублировании имен массивов. С +другой стороны, при добавлении описателя "extern" во все определения, они мо- +гут диагностироваться как неопределенные. + Следовательно, в случае организации общих данных для нескольких файлов необ- +ходимо дать определение без описателя "extern" только в одном из файлов с +текстом исходной программы. Во все другие файлы нужно поставить "extern". + + + 2. Процедура компиляции и сборки программы + + Для описанных выше текстовых файлов с исходной программой последователь- +ность команд компиляции и сборки модулей выглядит следующим образом: + + cc1 prog1 + cc1 prog2 + cc1 prog3 + cc2 prog1 + cc2 prog2 + cc2 prog3 + as prog1 + as prog2 + as prog3 + ld prog=prog1,prog2,prog3,clib/l/gXMAIN + + В том случае, когда все части программы (все файлы) уже откомпилированы и +требуется лишь перекомпилировать одни из них (например файл PROG2.C), следует +выполнить приведенную ниже группу команд: + + cc1 prog2 + cc2 prog2 + as prog2 + ld prog=prog1,prog2,prog3,clib/l/gXMAIN diff --git a/third_party/solid-c/DOC/DEVEL-2.RUS b/third_party/solid-c/DOC/DEVEL-2.RUS new file mode 100644 index 0000000..58fc6e6 --- /dev/null +++ b/third_party/solid-c/DOC/DEVEL-2.RUS @@ -0,0 +1,228 @@ + СОЗДАНИЕ БИБЛИОТЕК + + + Известны два способа создания библиотеки. Оба они будут описаны в следующих +параграфах. Первый из них, метод "а" - быстрый и легкий по исполнению, однако +к собираемым пользовательским программам прилинковываются в том числе и такие +функции, которые не обязательно будут использоваться. + В отличие от первого, способ "b" реализуется сложнее и требует большего вре- +мени, но получаемые в соответствии с ним пользовательские программы будут со- +держать в себе только те функции, которые заведомо применяются в программе. +Стандартная библиотека компилятора "clib.irl" создается именно по способу "b". + + + 1. Простой способ создания библиотеки + +Рассмотрим пример двух функций "power" и "log2": + +int power(x,e) +int x,e; +{ + int y; + for(y=1; e>0; e--) + y *= x; + return(y); +} + +int log2(x) +int x; +{ + int y; + for(y=0; x>1; x>>=1) + y++; + return(y); +} + + Если эти функции помещаются в файл с именем XLIB.C, последовательность +создания библиотеки выглядит следующим образом: + + cc1 xlib + cc2 xlib + as xlib + + При выполнении этой последовательности будет создана библиотека с именем +XLIB.REL. Ниже приведена команда сборки программы, которая вызывает функции +из этой библиотеки: + + ld prog,xlib,clib/l/gXMAIN + + В этом случае нет необходимости писать ключ /l после имени библиотеки XLIB, +т.к. даже если его написать, тем не менее все функции, входящие в библиотеку +XLIB, будут скомпонованы с программой "prog". + + Здесь будет описан способ включения в библиотеку программ, написанных на +Ассемблере. В качестве примеров взяты функции hex, ror и rol, помещенные в +файл ALIB.ASM: + + public hex_, ror_, rol_ + cseg +hex_: ; convert 0..F -> '0'..'F' + and 0Fh + add a,90h + daa + adc a,40h + daa + ret + +ror_: ; ror(c,n) n bit rotate right char + inc e +rorl: dec e + ret z + rrca + jp rorl + +rol_: ; rol(c,n) n bit rotate left char + inc e +roll: dec e + ret z + rlca + jp roll + + Включение этих функций в библиотеку производится путем выполнения следующей +команды: + + as alib.asm + +Следующая команда вызывает линковку программы, как и в случае Си-программы: + + ld prog,alib,clib/l/gXMAIN + + Как видно из приведенных выше примеров, самый простой способ формирования +библиотеки - включение в нее тех программ, из которых компонуется программа. +Однако этот способ не совершенен, так как вызывает подключение всей библиотеки. +В следующем параграфе будет описан способ создания библиотеки, при котором +программа компонуется только из тех функций, к которым предполагаются обраще- +ния. + + + 2. Создание полной библиотеки + + 2.1. Включение Си-программ в библиотеку + + Здесь будет приведен тот же пример, что и выше - включение файла XLIB.C, +содержащего тексты функций POWER и LOG2 в библиотеку. + Вначале нужно "разделить" файл XLIB.C на составляющие его функции, записав +их в отдельные файлы POWER.C и LOG2.C. Далее необходимо выполнить следующие +команды: + + cc1 power + cc1 log2 + cc2 power + cc2 log2 + as power + as log2 + ol a xlib.irl power log2 + +При выполнении этой последовательности команд, происходит следующее: + + 1. Си-тексты функций транслируются в ассемблерные листинги. + 2. В результате ассемблирования получаем модули с расширением ".rel". + 3. С помощью библиотекаря OL из двух модулей с расширением ".rel" + создается библиотека XLIB.IRL. + +После создания библиотеки XLIB.IRL, файлы POWER.REL и LOG2.REL уже не нужны +и их можно удалить. +Применение библиотеки XLIB.IRL определяется следующей командой: + + ld prog,xlib/l,clib/l/gXMAIN + + После имени библиотеки XLIB нужен ключ /l как указание линкеру подключить +к программе только необходимые ей функции. + + При сборке программ, состоящих из большого числа файлов (функций), имеет +значение порядок расположения функций. Ниже приведены два примера: один из +них правильный, а другой неправильный. + + Правильный пример: + +char islower(c) +char c; +{ + return('a'<=c && c<='z'); +} + +char toupper(c) +char c; +{ + return(islower(c) ? c-'a'-'A' : c); +} + + В данном примере в библиотеку включается файл X.C, состоящий из двух +функций. В этом случае функция "islower" расположена в файле X.REL перед +функцией "toupper". Поэтому при редактировании связей по ключу /l линкер +не выдаст диагностику об ошибке типа отсутствия определения. + + Но если написать вначале текст функции "toupper", возникает следующий +неправильный пример: + +char toupper(c) +char c; +{ + char islower(); + return(islower(c) ? c-'a'-'A' : c); +} + +char islower(c) +char c; +{ + return('a'<=c && c<='z'); +} + + В результате расположение модулей в библиотечном файле будет неправильным. +Подводя итоги сказанному, можно резюмировать, что для правильного порядка +расположения модулей в библиотеке нужно в исходной программе вначале писать +вызываемую функцию, а после нее - вызывающую. + + + 2.2. Создание библиотеки модулей на Ассемблере + + По сравнению с описанием включения в библиотеку, которое было дано в п.1, +здесь, файл ALIB.ASM следует предварительно разделить на следующие три файла +"hex.asm", "ror.asm" и "rol.asm": + +HEX.ASM: + cseg + +hex_:: and 0Fh + add a,90h + daa + adc a,40h + daa + ret + + +ROR.ASM: + cseg + +ror_:: inc e +rorl: dec e + ret z + rrca + jp rorl + + +ROL.ASM: + cseg + +rol_:: inc e +roll: dec e + ret z + rlca + jp roll + + После того, как каждый из них будет ассемблирован и получен файл с расши- +рением ".rel", вызывается библиотекарь OL для создания библиотеки: + + as hex + as ror + as rol + ol a alib.irl hex ror rol + +Применение библиотеки ALIB.IRL определяется следующей командой: + + ld prog,alib/l,clib/l/gXMAIN + + При сборке программы, точно таким же образом, как и для сборки Си-программы +из модулей, должна соблюдаться последовательность записи исходного текста, а +именно: вызываемая функция должна быть записана прежде, а вызывающая ее, вслед +за ней. diff --git a/third_party/solid-c/DOC/IRL.RUS b/third_party/solid-c/DOC/IRL.RUS new file mode 100644 index 0000000..35b66b8 --- /dev/null +++ b/third_party/solid-c/DOC/IRL.RUS @@ -0,0 +1,80 @@ +Последняя редакция: 7.05.2004 + + + IRL формат + ~~~~~~~~~~ + + IRL-файл представляет собой индексированный REL-файл. Благодаря индекси- +рованию улучшается работа линкера. В начале IRL-файла находятся 3 байта: + + db старший ;+0 (File offset >> 14) & 0x7F + db средний ;+1 (File offset >> 7) & 0x7F + db младший ;+2 (File offset 1) & 0x7F + +IRL-файл состоит из 3 секций: IRL-заголовок, Символьная таблица и REL-имидж. + + + IRL-заголовок + ~~~~~~~~~~~~~ +Массив 128 байт в начале REL-файла. Используются только первые три байта, +содержащие смещение до REL-имиджа. Остальные байты установлены в ноль: + + db старш,средн,0 ; Смещение до REL-имиджа. Младший байт + ; всегда равен 0. Начало REL-имиджа вы- + ; равнивается на границу в 128 байтов. + ds 125 ; Не используются и установлены в 0. + +Чтобы вычислить смещение до REL-имиджа, надо "старший" и "средний" байты +умножить на 128. Например для файла clib.irl: 0011h * 128 = 0880h + + ld h,xx ;+0 + ld a,xx ;+1 + ;a,h,l * 128 + add a,a + ld l,a + xor a + srl h + rr l + srl h + rr l + rra + ;hl=ст.разряд + ;a=мл.разряд + +Обратите внимание, что 7-й бит первого байта всегда 0. В не индексированном +rel-файле, 7-й бит первого байта всегда 1 (первый бит записи "имя модуля"). + + + Символьная таблица + ~~~~~~~~~~~~~~~~~~ +Таблица начинается со смещения +80h от начала файла и состоит из множества +символьных записей разной длины. Каждая запись имеет формат: + + db ст,средн,мл ; Смещение от начала rel-имиджа до rel-модуля, + ; содержащего символьную строку (имя). + db "SYMBOL" ; Символьная строка из 1..8 символов. + db 0FEh ; Конец строки. + + +Конец таблицы отмечается 0 в начале символьной строки: + + db ст,средн,0 ; Размер REL-имиджа. Это не смещение на конец + ; файла в REL-имидже, а показывает число байт + ; REL-имиджа, включая выравнивание до границы + ; в 128 байт. + db 0FEh ; Конец строки. + + Примечание!: У irl-файлов от библиотекаря "OL", данная запись имеет формат: + + db 0,0,0 + db 0FFh + +После этой записи, таблица выравнивается (LIB использует байт 1Ah) до следу- +ющей границы в 128 байт. + + + REL-имидж + ~~~~~~~~~ +REL-имидж всегда начинается с границы в 128 байт. Состоит из обычных rel- +данных. Чтобы преобразовать IRL-библиотеку в REL-библиотеку, надо удалить +заголовок и символьную таблицу. diff --git a/third_party/solid-c/DOC/LD.RUS b/third_party/solid-c/DOC/LD.RUS new file mode 100644 index 0000000..3e10719 --- /dev/null +++ b/third_party/solid-c/DOC/LD.RUS @@ -0,0 +1,138 @@ + Линкер + + + Линкер LD предназначен для сборки готовых программ или dll-библиотек +из отдельных объектных модулей. В качестве объектных модулей могут высту- +пать файлы rel-формата или библиотеки irl-формата (создаваемые библиотека- +рем ol.exe). Описание "rel", "irl" форматов смотрите в файлах "rel.rus" и +"irl.rus". + +Строка вызова линкера имеет следующий формат: + + LD [/keys] [outfile=] infile[/keys] [,infile[/keys] ...] [@ list] + +где: + keys - опции линкера + outfile - имя выходного файла программы + infile - файл "rel" или "irl" формата + @ list - файл подстановок + + +Пример вызова линкера: + + LD hello.rel + +После выполнения данной команды получится файл "hello.exe". + +При своей работе, линкер может создавать на диске временные файлы. Поэтому +для ускорения работы линкера рекомендуется использовать его на электронном +диске. + +Опции линкера: + + A использовать диск для сохранения симв. таблицы + D## адрес расположения DATA сегмента + E не вставлять EXE заголовок + Glabel задать метку 'label' в качестве стартовой + L поиск библиотечного файла (опция после имени файла) + P## адрес расположения CODE сегмента + Q вывести метки вида ?labels на экран + R## установить адрес загрузки (адрес ORG-а программы) + S вывести список меток на экран + T[type:ver] создать DLL библиотеку. Type - внутр. описание библы; + Ver - версия библы. Символ ":" разделяет параметры. + U заменить все "@" на "_" в именах меток + Y исключить DATA сегмент из выходного кода + X не создавать SYM файл + + + + Создание DLL-библиотек + +Для создания динамических библиотек служит опция "t". Обратите внимание, +что эта опция отменяет вставку exe-заголовка. +Отслеживается превышение максимального размера dll-библиотеки в 16 kB. +В этом случае линкер выдает предупреждающее сообщение, но линковка библи- +отеки не прерывается. + +Создаваемые dll-библиотеки имеют сигнатуру заголовка "L1". Библиотека этого +формата отличается от формата "L0" только тем, что таблица перемещений начи- +нается сразу за концом "своего" кода. +Заголовок dll-библиотеки создается и прилинковывается автоматически, поэто- +му не надо резервировать для него место при написании ассемблерных текстов. +Более подробную информацию по dll-библиотекам смотрите в документации менед- +жера dll-библиотек. + +Пример строки вызова линкера: + + LD /TSymple library:0001 test.rel + +где: + "Symple library" - Строка внутреннего описания библиотеки. + Строка описания может содержать пробелы. + Длина описания не должна превышать 16 + символов, иначе линкер выдаст ошибку. + + "0001" - Внутренний номер версии библиотеки. Может + содержать символы 0..9 и A..F (a..f). + + "test.rel" - объектный файл, служащий для создания библиотеки. + +Можно не указывать один из параметров (или все) опции, но символ ":" разде- +лителя параметров должен стоять всегда. В случае отсутствия описания - в +заголовке библиотеки будет стоять пустая строка. В случае отсутствия номера +версии - в заголовке будет стоять нулевой номер. Примеры вызова опции: + + LD /Tsymple library: test.rel + LD /tМоя библиотека: test + LD /T:010B test.rel + LD /t:7 test + LD /t: test.rel + +Обратите внимание, что строка внутреннего описания библиотеки начинается +сразу же за буквой "t" опции. Например, если написать + + LD /T Example:0001 test.rel + +то строка описания в заголовке библиотеки будет иметь вид " Example", т.е. +начинаться с пробела. + + + + Файл подстановок + + Файл подстановок служит для некоторой "автоматизации" процесса линковки +программ. Можно один раз создать файл подстановки и линковать программу, не +набирая каждый раз (возможно длинную) строку параметров линкера. +Файл подстановок может содержать всего одну строку агрументов или отдельные +аргументы могут начинаться с новой строки. В конце файла подстановок должна +стоять пустая строка. Размер файла подстановок ограничен до 256 байт и файл +может иметь любое имя. +Пример вызова линкера с файлами подстановок: + + LD @ comp.txt + + или + + LD @list + + +Примеры файла подстановок. + +Пример 1 + +test=prog,clib.irl/l/gxmain/x + + +Пример 2 + +test=prog, +clib.irl/l +/gxmain +/x + +В данных примерах собирается программа с заданным именем "test". При лин- +ковке используется исходный объектный файл "prog.rel", библиотека "clib.irl" +и управление в программе передается на метку "xmain" (это необходимо делать +для всех программ, линкуемых с Си-библиотекой "clib.irl"). Опция "x" запре- +щает создание sym-файла. diff --git a/third_party/solid-c/DOC/M80.RUS b/third_party/solid-c/DOC/M80.RUS new file mode 100644 index 0000000..854013f --- /dev/null +++ b/third_party/solid-c/DOC/M80.RUS @@ -0,0 +1,1217 @@ + Макроассемблер M80 + =================== + + Содержание + + 1 Назначение и условия применения макроассемблера..... + 2 Элементы и основные конструкции языка............... + 2.1 Основные элементы языка............................. + 2.1.1 Символы............................................. + 2.1.2 Числа, константы и строки........................... + 2.1.3 Символические имена................................. + 2.2 Выражения........................................... + 2.2.1 Арифметические и логические операции................ + 2.2.2 Абсолютные и перемещаемые имена..................... + 2.2.3 Внешние ссылки...................................... + 2.3 Синтаксис ассемблерных предложений.................. + 2.3.1 Метка............................................... + 2.3.2 Оператор............................................ + 2.3.3 Операнды и примечания............................... + 2.4 Псевдокоманды....................................... + 2.4.1 Псевдокоманды перемещения........................... + 2.4.1.1 ASEG................................................ + 2.4.1.2 COMMON.............................................. + 2.4.1.3 CSEG................................................ + 2.4.1.4 DSEG................................................ + 2.4.2 DB - определить байт................................ + 2.4.3 DC - определить символ.............................. + 2.4.4 DS - определить область............................. + 2.4.5 DW - определить слово............................... + 2.4.6 END................................................. + 2.4.7 ENTRY/PUBLIC........................................ + 2.4.8 EQU................................................. + 2.4.9 EXT/EXTRN........................................... + 2.4.10 INCLUDE............................................. + 2.4.11 NAME................................................ + 2.4.12 ORG - задать счетчик адреса......................... + 2.4.13 PAGE................................................ + 2.4.14 ASET................................................ + 2.4.15 TITLE............................................... + 2.4.16 SUBTTL.............................................. + 2.4.17 .COMMENT............................................ + 2.4.18 .PRINTX............................................. + 2.4.19 .RADIX.............................................. + 2.4.20 .REQUEST............................................ + 2.4.21 Условные псевдокоманды............................. + 2.4.21.1 ELSE............................................... + 2.4.21.2 ENDIF.............................................. + 2.4.23 Перемещение перед загрузкой........................ + 2.5 Макрокоманды и блоки............................... + 2.5.1 Терминология....................................... + 2.5.2 Блок REPT-ENDM..................................... + 2.5.3 Блок IRP-ENDM..................................... + 2.5.4 Блок IRPC-ENDM..................................... + 2.5.5 MACRO.............................................. + 2.5.6 EXITM.............................................. + 2.5.7 LOCAL.............................................. + 2.5.8 Специальные макрооператоры и формы................. + 3 Руководство по эксплуатации компилятора M80........ + 3.1 Обращение к компилятору. Входные и выходные данные. + 3.2 Опции компиляции................................... + 3.3 Формат листинга.................................... + 3.4 Сообщения об ошибках............................... + + + + 1. Назначение и условия применения макроассеблера + + Макроассемблер - это компилятор с символического машинно- + ориентированного языка (языка ассемблера). Он преобразует ис- + ходную программу, написанную на языке макроассемблера, в пере- + мещаемый модуль. В дальнейшем с помощью линкера модуль может + быть собран (один или с другими модулями) в программу, готовую + к выполнению. + Применение макросредств позволяет наиболее часто встреча- + ющиеся участки программы оформлять в виде макрокоманд. + + + 2. Элементы и основные конструкции языка + + 2.1. Основные элементы языка + + 2.1.1. Символы + + Все сложные элементы языка М80 формируются из символов. + В качестве символов могут использоваться: + - буквы латинского алфавита от A до Z + - цифры от 0 до 9 + - специальные символы + - , : ; ( ) ' # $ пробел ; + + + 2.1.2. Числа, константы и строки + + Числа - это беззнаковые 16-битные величины. Число всегда + вычисляется в системе счисления по умолчанию, если оно не за- + дано в специальном виде: + + nnnnnnnnB - двоичное (где n - 0 или 1) + + nnnnO или nnnnQ - восьмеричное (где n - 0..7) + + nnnnH или nnnnX - шестнадцатиричное (где n - 0..9, + A,B,C,D,E,F), если первый символ не + цифра, то перед ним должен стоять 0 + 0nnnnH или 0nnnnX + + По умолчанию все числа считаются в десятичной системе + счисления. Этот режим можно изменить. С помощью команды .RADIX + можно выбрать любое основание системы счисления от 2 до 16. + Переполнение при вычислении числа игнорируется и значащими яв- + ляются младшие 16 бит. + Символьная константа - это строка, содержащая один или + два символа в апострофах. + Значением символьной константы, содержащей один символ, + является величина численного значения соответствующего кода, + принятого в операционной системе (ОС). Например, значением + константы "A" будет 41h. + Значением символьной константы, содержащей два символа, + будет двухбайтовое число, причем в старшем байте будет значе- + ние первого символа, а в младшем байте - значение второго + символа. Например, значением константы "AB" будет число + 41h*256+42h. + Строка - это набор символов, заключенных в кавычки или + апострофы. Кавычки также могут быть элементом строки, но при + этом они должны удваиваться. Например, предложение + + DB "Я""ИДУ""ГУЛЯТЬ" + + запомнит строку + + Я"ИДУ"ГУЛЯТЬ + + Если между кавычками нет символов, то такая строка будет + пустой строкой. + + + 2.1.3. Символьные имена (метки) + + Символические имена могут содержать любое количество сим- + волов, но значащими являются: + а) в локальной метке значащими являются первые 16 символов. + б) в метках глобального и внешнего типов линкеру передаются + первые шесть символов, остальные символы отсекаются. + + В именах допустимы следующие символы: + + буквы от A до Z, цифры от 0 до 9, $ . ? @ + + Символическое имя не может начинаться с цифры. + При обработке имен буквы из нижнего регистра переводятся + в буквы верхнего регистра. + + + 2.2. Выражения + + 2.2.1. Арифметические и логические операции + + В выражениях допустимы следующие операции, приведенные в + порядке убывания приоритета их выполнения. + + NUL + LOW, HIGH + *, /, MOD, SHR, SHL + Унарный минус + +, - + EQ, NE, LT, LE, GT, GE + NOT + AND + OR, XOR + + Для изменения порядка выполнения операций надо использо- + вать скобки. При вычислении выражений сначала выполняются опе- + рации, имеющие более высокий приоритет. Все подвыражения,со- + держащие операции с более высоким приоритетом, вычисляются в + первую очередь. + Все операции, кроме +, -, *, /, должны быть отделены от + операндов по крайней мере одним пробелом. Операции выделения + байта HIGH, LOW выделяют старшие или младшие 8 бит из абсолют- + ной 16-битной величины. Если в качестве операнда используется + перемещаемая величина, то HIGH и LOW интерпретируются как опе- + рации, работающие с адресом ноль. + + + 2.2.2. Абсолютные и перемещаемые имена + + Все символические имена, используемые в качестве операн- + дов в выражениях, есть либо абсолютные имена, либо перемещае- + мые имена. Перемещаемые имена подразделяются на программные + перемещаемые имена, перемещаемые имена данных и COMMON (п. + 2.4.1.). + Все символические имена, ассемблированные для псевдоко- + манд ASEG (по умолчанию), CSEG или DSEG, относятся к абсолют- + ным, перемещаемым программным или перемещаемым данным соот- + ветственно. Количество имен COMMON в программе зависит от чис- + ла блоков COMMON, поименованных в программе с помощью псевдо- + команды COMMON. Два символических имени COMMON считаются раз- + ными, если они присутствуют в разных блоках COMMON. + При любой операции, кроме сложения и вычитания, оба опе- + ранда должны быть абсолютными. + Для сложения применяются следующие правила: + + 1) по крайней мере один из операндов должен быть абсолютным; + 2) абсолютное + перемещаемое = перемещаемое + + Для вычитания действуют правила: + + 1) перемещаемое - абсолютное = перемещаемое + 2) перемещаемое - перемещаемое = абсолютное + + Причем в 2) оба имени должны быть перемещаемыми именами + одного типа. + Для каждого промежуточного шага при вычислении выражения + должны выполняться вышеуказанные правила, иначе будет выдано + сообщение об ошибке. Например, если FOO, BAZ и ZAZ - три симво- + лических перемещаемых имени, то выражение: + + FOO + BAZ - ZAZ + + выработает сообщение об ошибке, т.к. на первом шаге будут + складываться два перемещаемых имени. Этого можно избежать, ис- + пользуя скобки: + + FOO + (BAZ - ZAZ) + + + 2.2.3. Внешние ссылки + + Символическое имя может быть внешним (EXTRN) или нет + (см.п. 2.2.9.). Внешнее имя ассемблируется в 2 байта. При ис- + пользовании внешних имен в выражениях должны выполняться сле- + дующие правила: + + 1) EXTRN допустимы только при сложении и вычитании; + 2) если в выражении используется имя типа EXTRN, + то результат всегда будет EXTRN; + 3) при сложении любой операнд (но не оба одновременно) + может быть EXTRN; + 4) при вычитании только первый операнд может быть EXTRN. + + + 2.3. Синтаксис ассемблерных предложений + + Ассемблерная программа состоит из последовательности + предложений. Каждое предложение имеет следующую структуру: + + метка: (оператор) (операнды) ;примечание + + Совсем необязательно, чтобы предложение начиналось с + метки. + + + 2.3.1. Метка + + Метка - это символическое имя, после которого следует + двоеточие. Если метка присутствует, то она должна быть первым + элементом предложения. Значение метки есть текущее значение + счетчика адреса. Если после метки стоят два двоеточия "::", то + такая метка объявляется глобальной (PUBLIC) и к ней можно обра- + щаться из другой программы. + + + 2.3.2. Оператор + + Следующим элементом после метки или первым, если нет мет- + ки идет оператор. В качестве оператора может быть: + + 1) мнемокод микропроцессора Z80 (I8080); + 2) макровызов; + 3) псевдокоманда; + 4) выражение. + + Если в поле оператора стоит выражение, то ассемблер расс- + матривает его как псевдокоманду DB. + + + 2.3.3. Операнды и примечания + + Следующим элементом предложения являются операнды. В за- + висимости от оператора в поле операндов может быть один, два + или несколько операндов. + Примечания являются последним элементом предложения. При- + мечания всегда начинаются с символа ";" и заканчиваются CR (ВК). + + + 2.4. Псевдокоманды + + 2.4.1. Псевдокоманды перемещения + + Отличительной особенностью макроассемблера М80 является + создание им перемещаемых модулей. Перемещаемость модуля облег- + чает его отладку и тестирование, позволяет компоновать пограм- + му из нескольких модулей, написанных на разных языках. Кроме + того, программу можно разбивать на сенгменты и указать, какие + сегменты должны размещаться только в ОЗУ (сегменты данных), а + какие могут быть занесены в ПЗУ (сегменты содержащие програм- + му). Эти сегменты создаются с помощью псевдокоманд DSEG и + CSEG. Псевдокоманда ASEG используется при создании неперемеща- + емых (абсолютных) кодов. Псевдокоманда COMMON создает общие + области данных для каждого поименованного в программе блока + COMMON. + Для каждого сегмента программы ASEG, CSEG или DSEG заво- + дится свой счетчик адреса, который приостанавливает отсчет при + смене типа сегмента и возобновляет отсчет, когда снова встре- + чается соответствующий сегмент. Значение счетчика адреса в лю- + бом сегменте можно изменить с помощью псевдокоманды ORG + (п.2.4.12). По умолчанию всегда действует пседокоманда ASEG. + + + 2.4.1.1. ASEG + + Формат псевдокоманды: ASEG + + ASEG устанавливает значение счетчика адреса на абсолютный + сегмент в памяти. Значение счетчика будет продолжением преды- + дущего ASEG (по умолчанию 0), если после ASEG не стоит ORG. + Для ассемблера ASEG является псевдокомандой по умолчанию. + + + 2.4.1.2. COMMON + + Формат псевдокоманды: COMMON /имя блока/ + + COMMON устанавливает счетчик адреса на адрес выбранного + общего блока памяти. Для совместимости с оператором COMMON в + ФОРТРАНЕ этот адрес всегда указывает на начало области. Если + "имя блока" опущено или состоит из пробелов, то блок COMMON + считается пустым. + + + 2.4.1.3. CSEG + + Формат псевдокоманды: CSEG + + CSEG устанавливает значение счетчика адреса на смещение + относительно начала сегмента памяти, содержащего коды команд. + Значение адреса будет соответствовать значению предыдущего + CSEG (по умолчанию 0), если только после CSEG не стоит псевдо- + команда ORG. + + + 2.4.1.4. DSEG + + Формат псевдокоманды: DSEG + + DSEG устанавливает значение счетчика сегмента адреса на + относительный адрес сегмента памяти, содержащего данные. Зна- + чение адреса будет соответствовать адресу последнего DSEG (по + умолчанию 0), если не было псевдокоманды ORG. + + + 2.4.2. DB - определить байт + + Формат псевдокоманды: + + DB "выражение","выражение",... + или + DB "строка" ["строка"...] + + Аргументами для DB могут быть выражения или строки. DB + запоминает значения выражений или символов в строках в после- + довательных адресах памяти, начиная с адреса, указанного в + счетчике адреса. Значение выражения должно помещаться в одном + байте. Если старший байт результата 0 или 255, то сообщение об + ошибке не выдается. В противном случае выдается ошибка A. + В выражениях не могут присутствовать строки, содержащие + более 2-х символов. Старший бит каждого байта, отведенного под + соответствующий символ, равен нулю. + + Примеры: + + 0000 41 42 DB 'AB' + 0002 42 DB 'AB' AND 0FFh + 0003 41 42 43 DB 'ABC' + + + 2.4.3. DC - определить символ + + Формат псевдокоманды: + + DC "строка" + + DC запоминает символы, заданные в "строке", последова- + тельно, начиная с адреса, указанного в счетчике адреса. В от- + личие от DB, в байте, содержащем последний символ строки, в + старшем разряде стоит 1. Если строка пустая, то выдается сооб- + щение об ошибке. + + + + 2.4.4. DS - определить область + + Формат псевдокоманды: + + DS "выражение" + + DS резервирует область памяти. Значение выражения показы- + вает, сколько байтов должно быть зарезервировано. Все имена, + присутствующие в выражени, должны быть определены к моменту + вычисления выражения при первом проходе макроассемблера. В + противном случае при первом проходе появится флаг V, а при + втором проходе - флаг U. Если втором проходе флаг U не появит- + ся, то все равно в модуле может быть ошибка, т.к. DS обрабаты- + вается при первом проходе. + + + 2.4.5. DW - определить слово + + Формат псевдокоманды: + + DW "выражение","выражение",... + + DW последовательно записывает значения выражений в ячейки + памяти, начиная с адреса, содержащегося в счетчике адреса. Зна- + чения выражений есть двух-байтовые величины. + + + 2.4.6. END + + Формат псевдокоманды: + + END "выражение" + + Оператор END указывает на конец программы. Если присутс- + твует "выражение", то оно указывает на стартовый адрес прог- + раммы. Если "выражение" отсутствует, то линкеру стартовый адрес + не передается. + + *) Примечание. + Если ассемблерная программа является основной програм- + мой при компоновке, то в ней должен быть указан стар- + товый адрес. В противном случае линкер выдаст сообще- + ние об ошибке "нет стартового адреса". Если же ассемб- + лерная программа является подпрограммой по отношению + к программе, написанной, например на ФОРТРАНЕ, то стар- + товый адрес можно не задавать, т.к. он будет задан в + основной программе. + + + 2.4.7. ENTRY/PUBLIC + + Формат псевдокоманды: + + ENTRY "имя","имя",... + или + PUBLIC "имя","имя",... + + ENTRY или PUBLIC объявляют все имена, присутствующие в + списке, как доступные извне. После этого, к таким именам можно + обращаться из других программ. Все имена в списке ENTRY/PUBLIC + должны быть определены, иначе будет сообщение об ошибке U. + Имена, объявленные ENTRY или PUBLIC, заносятся в список глобаль- + ных имен и используются линкером при удовлетворении внешних + ссылок. + + + 2.4.8. EQU + + Формат псевдокоманды: + + "имя" EQU "выражение" + + По команде EQU символическому имени присваивается значе- + ние выражения. Если "выражение" имеет EXTRN, то выдается сооб- + щение об ошибке. + + + 2.4.9. EXT/EXTRN + + Формат псевдокоманды: + + EXT "имя","имя",... + или + EXTRN "имя","имя",... + + EXT или EXTRN объявляют указанные имена внешними (EXTRN), + т.е. определенными в другой программе. Объявить имя внешним + можно также поставив в конце имени два символа решетки "##". + Если имя, указанное в списке, определено в данной программе, + то будет выдано сообщение об ошибке M. + + + 2.4.10. INCLUDE + + Формат псевдокоманды: + + INCLUDE имя файла + + Три псевдокоманды INCLUDE, $INCLUDE и MACLIB эквивалент- + ны. Псевдокоманда INCLUDE позволяет включать в текст исходной + программы программы, записанные в других файлах. "имя файла" - + это имя файла, содержащего включаемую программу. Тип файла + должен быть ASM. + Файл, присутствующий в псевдокоманде INCLUDE, открывается + и транслируется в текущую программу сразу же за псевдокомандой + INCLUDE. + При выводе листинга в каждой строке, содержащей элемент + включенного файла, сразу же после кода команды стоит буква + "C". Вложение псевдокоманд INCLUDE не допускается. Если файл, + указанный в INCLUDE, не существует, то будет выдано сообщение + об ошибке "V" и данная псевдокоманда игнорируется. + + + 2.4.11. NAME + + Формат псевдокоманды: + + NAME ('имя программы') + + NAME задает имя программы. Значащими в "имени" являются + только первые шесть знаков. Имя можно задавать и с помощью + псевдокоманды TITLE. Если в программе отсутствует NAME и TIT- + LE, то в качестве имени берется имя исходного файла. + + + 2.4.12. ORG - задать счетчик адреса + + Формат псевдокоманды: + + ORG "выражение" + + Счетчику адреса присваивается выражение. Все имена в вы- + ражении должны быть определены при первом проходе. + + + 2.4.13. PAGE + + Формат псевдокоманды: + + PAGE "выражение" + + Пседокоманда PAGE дает указание ассемблеру начать новую + страницу вывода листинга. Если в псевдокоманде присутствует + "выражение", то оно задает число строк на странице. Это число + должно быть в диапазоне от 1 до 255. По умолчанию это число + равно 63. + + + 2.4.14. ASET + + Формат псевдокоманды: + + "имя" ASET "выражение" + + ASET осуществляет то же действие, что и EQU, но имя в + псевдокоманде ASET может быть определено ранее. Тогда после вы- + полнения ASET имя будет переопределено. + + + 2.4.15. TITLE + + Формат псевдокоманды: + + TITLE "текст" + + TITLE задает заголовок программы, который может печатать- + ся в первой строке каждой страницы. В тексте программы может + быть только одна псевдокоманда TITLE иначе быдет сообщение об + ошибке Q. Если не задана псевдокоманда NAME , то первые шесть + символов заголовка зададут имя модуля. Если в программе нет ни + NAME, ни TITLE, то имя модуля будет задано из имени исходного + файла. + + + 2.4.16. SUBTTL + + Формат псевдокоманды: + + SUBTTL "текст" + + Эта псевдокоманда выводит заголовок после заголовка, вы- + веденного псевдокомандой TITLE. Длина "текста" не должна пре- + вышать 60 знаков. В программе может быть любое количество + SUBTTL. + + + 2.4.17. .COMMENT + + Формат псевдокоманды: + + .COMMENT "разделитель" "текст" "разделитель" + + Первый символ, идущий после .COMMENT и отличный от пробе- + ла, считается разделителем. Текст после разделителя считается + примечаниями и может занимать произвольное количество строк. + Примечания заканчиваются, когда встречается второй разделитель + - тот же самый символ, который был использован в качестве пер- + вого разделителя. + + + 2.4.18. .PRINTX + + Формат псевдокоманды: + + .PRINTX "разделитель""текст""разделитель" + + Первый символ после .PRINTX, отличный от пробела, счита- + ется разделителем. Текст, идущий после разделителя, во время + трансляции выводится на терминал до тех пор, пока не встретит- + ся второй разделитель - тот же самый символ. + + *) Примечание. + .PRINTX выводит листинг при каждом проходе ассемблера, + поэтому, если листинг нужен только при одном какомлибо + проходе, то следует использовать псевдокоманды IF1 или + IF2. + + + 2.4.19. .RADIX + + Формат псевдокоманды: + + .RADIX "выражение" + + По умолчанию система счисления всех констант - десятич- + ная. Псевдокоманда .RADIX позволяет изменить основание системы + счисления по умолчанию (от 2 до 16). "Выражение" в .RADIX + всегда в десятичной системе счисления независимо от основания + системы счисления, действующей в данный момент. + + + 2.4.20. .REQUEST + + Формат псевдокоманды: + + .REQUEST "имя файла","имя файла",... + + Эта псевдокоманда передает запрос линкеру на поиск неу- + довлетворенных внешних имен в файлах, указанных в списке. + Имена файлов в списке не должны содержать типов файла и ссы- + лок на диски. Линкер ведет поиск файла с заданным именем и + с типом - REL на диске по умолчанию. + + + 2.4.21. Условные псевдокоманды + + Список условных псевдокоманд + + IF/IFT "выражение" Истина, если "выражение" не равно 0 + IFE/IFF "выражение" Истина, если "выражение" равно 0 + IF1 Истина при первом проходе + IF2 Истина при втором проходе + IFDEP "символ" Истина, если "символ" определен или + объявлен EXTERNAL + IFDEF "символ" Истина, если "символ" не определен и + не объявлен EXTERNAL + IFB "аргумент" Истина, если "аргумент" есть пробел. + аргумент должен быть в угловых скобках + IFNB "аргумент" Истина, если "аргумент" не пробел. + Используется для проверки некоторых + параметров. Аргумент должен быть в + угловых скобках. + IFIDN "аргумент1", Истина, если строка "аргумент1" иден- + "аргумент2" тична строке "аргумент2". Аргументы + должны быть в угловых скобках. + IFDIF "аргумент1", Истина, если строка "аргумент1" отли- + "аргумент2" чается от строки "аргумент2". + + Все условные псевдокоманды имеют формат: + + IF XXX [аргумент] + . + . + [ELSE + . + . + ] + ENDIF + + Допускается вложение условных псевдокоманд, т.е. псевдо- + команда внутри псевдокоманды. Во избежание ошибок все аргумен- + ты условных псевдокоманддолжны быть известны при первом прохо- + де. Для IF, IFT, IFF и IFE выражения должны содержать только + определенные символы и все выражения должны быть абсолютными. + + + 2.4.21.1. ELSE + + Каждая псевдокоманда IF должна иметь соответствующую ей + псевдокоманду ENDIF, заканчивающую условие. + + + 2.4.22. Псевдокоманды, управляющие выводом листинга + + Выводом листинга в файл можно управлять с помощью двух + псевдокоманд: + .LIST и .XLIST + + Если листинг не выводится, то данные псевдокоманды игно- + рируются. + По умолчанию действует псевдокоманда .LIST, инициирующая + вывод листинга. Если встречается псевдокоманда .XLIST, то вы- + вод листинга прекращается, пока не встретится псевдокоманда + .LIST. + + Вывод условных блоков, имеющих значение ложь, употребляет- + ся тремя псевдокомандами: + .SFCOND подавление вывода условных блоков, имеющих + значение "ложь"; + .LFCOND восстановить вывод условных блоков, имеющих + значение "ложь"; + .TFCOND управлять выводом условных блоков, имеющих + значение "ложь", в зависимости от опции /X. + + Вывод таблицы перекрестных управляется псевдокомандами + .CREF и .XCREF. Если кросс-средства не используются, то эти + псевдокоманды игнорируются. Условие по умолчанию - .CREF. Если + встречается псевдокоманда .XCREF, то вывод перекрестных ссылок + прекращается до тех пор, пока снова не встретится псевдокоман- + да .CREF. + Вывод расширений MACRO/REPT/IRP/IRPC управляется тремя + псевдокомандами: + + .LALL выводит полный макротекст для всех расширений; + .SALL выводит только сгенерированные объектные коды; + .XALL выводит сгенерированные объектные коды и соот- + ветствующий им текст (условие по умолчанию). + + + 2.4.23. Перемещение перед загрузкой + + С помощью двух псевдокоманд: .PHAZE и .DEPHAZE некоторые + участки программ могут находится в одной области, а выполнять- + ся лишь в другой, заданной, области. + Псевдокоманда .PHAZE обозначает начало такого участка, а + псевдокоманда .DEPHAZE - конец участка. + + Пример: + + 0000 .PHAZE + 0100 CD 0106 F00: CALL BAZ + 0103 C3 0007 JMP Z00 + 0106 C9 BAZ: RET + 0007 C3 0005 Z00: JMP 5 + + Все метки внутри блока .PHAZE получают абсолютные значе- + ния в зависимости от значения счетчика адреса .PHAZE. Однако + коды, загружаются в текущую область памяти (т.е. с 0000 в этом + примере). Позже их можно переслать по адресу 100h и выполнить. + + + 2.5. Макрокоманды и блоки + + Макросредства ассемблера MACRO включают в себя три макро- + команды повторения (REPT, IRP, IRPC) и операцию макроопределе- + ния (MACRO). Каждая макрокоманда должна заканчиваться псевдо- + командой ENDM. + + + 2.5.1. Терминология + + Для описания макрокоманд используются следующие термины: + 1) "фор.пар." - формальный параметр + Все формальные парметры являются допустимыми символическими + именами, которые появляются в теле макрорасширения; + 2) "список форм.пар." - список формальных параметров, разделен- + ных запятыми; + 3) "список арг." - список аргументов, разделенных запятыми. + Список аргументов всегда заключен в угловые скобки. Если + в угловых скобках нет символа или между двумя запятыми нет + символа, то это нулевой аргумент в списке. При вложении уг- + ловых скобок (скобки в скобках) каждый внутренний уровень + скобок удаляется при использовании соответствующего аргу- + мента. Строка в кавычках является допустимым аргументом; + 4) "список пар." - список параметров, разделенных запятыми. + + + 2.5.2. Блок REPT-ENDM + + Формат макрокоманды: + + REPT "выражение" + . + . + ENDM + + Вычисляется значение "выражения" и группа предложений, + заключенная между REPT и ENDM, повторяется полученное число + раз. "выражение" не может содержать внешние и неопределенные + имена. + + Пример: + + X ASET 0 + REPT 10 ;генерирует DB 1 - DB 10 + X ASET X+1 + DB X + ENDM + + + 2.5.3. Блок IRP-ENDM + + Формат макрокоманды: + + IRP "фор.пар.",<список арг.> + . + . + ENDM + + Число аргументов в списке определяет, сколько раз будет + повторена группа предложений, заключенная между IRP и ENDM. + При каждом повторении вместо всех вложений формального пара- + метра подставляется очередное значение из списка аргументов. + Если список аргументов пуст (<>), то группа предложений обра- + батывается 1 раз и формальный параметр удаляется из всех вхож- + дений. + + Пример: + + IRP X, <1,2,3,4,5,6,7,8,9,10> + DB X + ENDM + + Результат будет аналогичен предыдущему примеру. + + + 2.5.4. Блок IRPC-ENDM + + Формат макрокоманды: + + IRPC "фор.пар.", строка (или "строка") + . + . + ENDM + + Количество знаков в строке указывает, сколько раз будет + повторена группа предложений между IRPC и ENDM. В данном слу- + чае угловые скобки не обязательны. При каждом повторении вмес- + то формального параметра будет подставляться очередной знак из + строки. + + Пример: + + IRPC X, 0123456789 + DB X+1 + ENDM + + Результат аналогичен двум предыдущим примерам. + + + 2.5.5. MACRO + + Формат макрокоманды: + + "имя" MACRO "список форм.пар." + . + . + ENDM + + С помощью MACRO пользователь может создавать свои макро- + команды и помещать их в различные участки программы. + "имя" - это символическое имя, по которому впоследствии + будут вызывать данную макрокоманду. + "список форм.пар." - это список парметров, которые будут + изменяться (замещаться фактическими параметрами) при каждом + вызове макрокоманды. Предложения между MACRO и ENDM составляют + тело макрокоманды. + Форма обращения к макрокоманде следующая: + + "имя" "список пар." + + где "имя" - это имя присвоенное MACRO в макроопределении; + "список пар." - это список фактических параметров, которые + при вызове макрокоманды заменят соответствующие формальные + параметры. + Если число фактических параметров превышает количество + формальных параметров, то лишние фактические параметры игнори- + руются. Если же число параметров меньше числа формальных пара- + метров, то вместо недостающих фактических параметров будут + подставлены нули. + + Пример: + + F00 MACRO X + Y ASET 0 + REPT X + Y ASET Y+1 + DB Y + ENDM + ENDM + + При обращении F00 10 эта макрокоманда сгенерирует те же + предложения, что и в предыдущих примерах. + + + 2.5.6. EXITM + + Псевдокоманда EXITM используется для завершения + REPT/IRP/IRPC или вызова MACRO. При выполнении EXITM макрорас- + ширение немедленно выводится, а все оставшееся расширение или + повторение не генерируется. Если блок, содержащий EXITM, вхо- + дит в другой блок, то внешний уровень продолжает расширяться. + + + 2.5.7. LOCAL + + Формат команды: + + LOCAL "список фор.пар." + + Эта псевдокоманда допустима только внутри макроопределе- + ния MACRO. При выполнении LOCAL ассемблер создает уникальное + символическое имя для каждого формального параметра из списка + и подставляет потом это символическое имя при каждом вхождении + данного формального параметра в макрорасширение. Обычно, эти + уникальные символические имена используются для задания меток + внутри MACRO. Это исключает возможность появления многократно + определенных меток при неоднократных вызовах данной макроко- + манды. Символические имена, создаваемые при помощи LOCAL, на- + ходятся в диапазоне от ..0001 до ..FFFF. Поэтому пользователю + в своих программах следует избегать имен типа ..NNNN. Если в + макрокоманде есть LOCAL , то LOCAL должна быть в первом прело- + жении макроопределения. + + + 2.5.8. Специальные макрооператоры и формы + + & амперсанд используется для конкатенации текста или + символических имен. Формальный параметр, представляю- + щий собой строку в апострофах, не будет заменен в рас- + ширении, если перед ним не будет стоять амперсанд. Для + образования символического имени из текста и формаль- + ного параметра между ними надо поставить &; + + Пример: + + ERG MACRO X + ERROR&X: PUSH BC + LD B,'&X' + JP ERROR + ENDM + + + В этом примере вызов ERG A создаст следующую последова- + тельность предложений: + + ERROR&A: PUSH BC + LD B,'A' + JP ERROR + + *) Примечание. + Два символических имени считаются одинаковыми, если + одно имя отличается от другого только наличием амперсанда. Так + символическое имя ERRORA эквивалентно имени ERROR&A. + + ;; Если в макрокоманде перед комментариями стоят две + точки с запятой, то эти коментарии не появляются в + макрорасширениях даже, если есть указание .LALL; + + $ ссылка на текущее значение счетчика адреса; + + ! символ, стоящий после восклицательного знака вводит- + ся литерально; + + NUL это оператор, возвращающий значение "истина", если + его аргумент есть нуль. Остаток строки после NUL + рассматривается как аргумент для NUL. Условие IF NUL + аргумент будет "ложным", если при расширении первый + символ аргумента будет отличен от точки с запятой + или "CR" (ВК). Этот оператор рекомендуется исполь- + зовать для проверки наличия нулевых параметров в + условных псевдокомандах IFB и IFNB; + + % этот оператор может использоваться только в аргумен- + те макрокоманды. % преобразует следующее за ним вы- + ражение (обычно символическое имя) в число в текущей + системе счисления. Во время макрорасширения получен- + ное число подставляется в формальный параметр. Ис- + пользование % позволяет вызывать макрокоманду с чис- + лом (обычно макровызов - это вызов с текстом из ар- + гументов). Выражение, следующее за % должно удовлет- + ворять тем же требованиям, что и в псевдокоманде DS. + + Пример: + Нормально LB, являющееся аргументом для MACLAB, должно бы- + ло подставляться аргументом MACRO. % преобразует LB в число и + вместо Y подставляется уже число. Без % результат трансляции + был бы 'ERROR LB'. + + MACLAB MACRO Y + ERR&Y: DB 'ERROR &Y',0 + ENDM + MACERR MACRO X + LB ASET 0 + REPT X + LB ASET LB+1 + MACLAB %LB + ENDM + ENDM + + После макровызова MACERR 3 получим: + + ERR1: DB 'ERROR 1',0 + ERR2: DB 'ERROR 2',0 + ERR3: DB 'ERROR 3',0 + + + TYPE оператор TYPE возвращает байт, который описывает + две характеристики аргумента: перемещаемость и яв- + ляется ли аргумент внешним (EXTRN) или нет. Аргу- + ментом для TYPE может быть любое выражение (стро- + ковое, числовое, логическое). Если выражение не + верно, то TYPE вернет ноль. Структура возвращаемого + байта следующая: + младшие два бита определяют перемещаемость аргу- + мента следующим образом: + 0 абсолютный; + 1 перемещаемый относительно кода; + 2 перемещаемый относительно данных; + 3 COMMON перемещаемый. + + Старший бит (80h) - бит EXTRN. Когда выражение со- + держит внешний символ, то бит равен 1. + Бит определенности - (20h). Когда выражение опре- + делено, то этот бит равен 1. Если же выражение не + определено или содержит EXTRN, то этот бит равен 0. + TYPE обычно используют внутри макрокоманд, когда + необходимо проверить тип аргумента. + + + 3. Руководство по эксплуатации компилятора M80 + + 3.1. Обращение к компилятору. Входные и выходные данные + + Исходными данными для компилятора является файл, содержа- + щий программу написанную на макроассемблере, и имеющий тип + ASM. В результате работы компилятор создает файл типа REL, со- + держащий модуль в перемещаемой форме. Кроме того, по желанию + пользователя может быть создан файл с листингом и файл перек- + рестных ссылок. + Запуск макроассемблера осуществляется следующей командой: + + M80 "командная строка" + + Формат командной строки: + + "имя 1", "имя 2" ="имя 3" + + где "имя 1" - имя файла, в который будет записан переме- + щаемый модуль; + "имя 2" - устройство, на которое будет выводится + листинг. Таким устройством может быть консоль (CON:), + принтер (PRN:) или файл на диске; + "имя 3" - имя файла, содержащего исходный текст про- + граммы. + + Если "имя 1" и "имя 2" опущены, то по умолчанию берется + имя файла исходного текста. Тип файла в "имя 1" всегда REL, в + "имя 2" (если задан файл) всегда PRN, а в "имя 3" всегда ASM. + Если перемещаемый модуль и листинг не нужны, то слева от знака + равенства надо поставить запятую. + + Примеры: + + M80 =SOURSE.ASM транслировать программу SOURSE.ASM и + поместить объектный код в файл SOURSE.REL + + M80 ,PRN:=TEST транслировать программу TEST.ASM и вывес- + ти листинг на устройство PRN (принтер); + + M80 SMALL,CON:=TEST транслировать программу TEST.ASM, объект- + ный файл записать в SMALL.REL, а листинг + вывести на консоль. + + + + 3.2. Опции компиляции + + В командной строке может быть задано несколько опций, ко- + торые будут влиять на формат выводимого листинга. + + Опция Действие + ----- -------- + + /L создать файл с листингом + + /O печатать в листинге все адреса и т.п. в восьмерич- + ной системе счисления + + /H печатать в листинге все адреса и т.п. в шестнадца- + тиричной системе счисления (действует по умолчанию) + + /X подавить вывод листинга условий, значение которых + есть "ложь" + + /R создать объектный файл (действует по умолчанию) + + /P создать объектный файл (переполнение стека при + опции /R) + + /C создать файл перекрестных ссылок + + /M инициализация нулями псевдооператора(ов) "DS" + + /I настроить ассемблер на мнемоники I8080 + + /Z настроить ассемблер на мнемоники Z80 (по-умолчанию) + + + Пример: + + M80 =TEST/L/P оттранслировать файл TEST.ASM. Объектный + файл вывести в TEST.REL, а листинг в файл + TEST.LST. + + + 3.3. Формат листинга + + На каждой странице листинга первые две строки содержат: + + [TITLE ТЕКСТ] MACRO PAGE X [-Y] + [SUBTITLE ТЕКСТ] + + где TITLE ТЕКСТ - текст заданный псевдокомандой TITLE; + X - основной номер страницы. Он увеличивается только + при появлении из исходного файла символа подачи новой + страницы. Когда печатается таблица символов X=S; + Y - младший номер страницы. Он увеличивается при появ- + лении псевдокоманды PAGE или при заполнении текущей + страницы; + SUBTITLE ТЕКСТ- текст, заданный псевдокомандой SUBTITLE. + После вывода этих двух строк выводится одна пустая + строка, а затем очередная строка программы. Строка + программы имеет вид: + + [CRF#] [ERROR] LOC#M !XX!XXXX! ..... исходный текст + + Если выводится таблица перекрестных ссылок, то первый + элемент в строке - номер для таблицы, после него стоит символ + табуляции. + ERROR - это флаг ошибки, если в строке есть ошибка. Если + в стороке нет ошибки, то вместо ERROR стоит пробел. Если таб- + лица перекрестных ссылок не создается, то флаг ошибки стоит в + первой колонке. + LOG#M - значение счетчика адреса, которое в зависимости + от опций /H или /O, представляет собой 16-ричное число, содер- + жащее 4 цифры или 8-ричное число, содержащее 6 цифр. Символ + после числа - это индикатор перемещаемости: + + ' перемещаемый относительно кода; + " перемещаемый относительно данных; + ! COMMON перемещаемый; + ПРОБЕЛ абсолютный; + * внешний. + + Далее печатаются три пробела, после которых идет код ко- + манды и операндов (если они есть у данной команды). Если стро- + ка листинга появилась из файла, включенного по псевдокоманде + INCLUDE, то после кодов идет буква "C". Если строка содержит + макрорасширение (MACRO, REPT, IRP, IRPT), то после кодов стоит + знак "+". Остаток строки содержит исходный текст. + В конце листинга выводится таблица символических имен + (меток). Сначала в алфавитном порядке печатаются имена всех + макрокоманд, после этого выводятся все символические имена + программы. После каждого символического имени выводится знак + табуляции, а затем печатается значение символического имени. + Если имя типа PUBLIC, то после его значения печатается буква + I. Далее печатается один из следующих знаков: + + U имя неопределено; + C имя блока COMMON; + * внешнее имя; + ПРОБЕЛ абсолютное имя; + ' перемещаемый относительно кода; + " перемещаемый относительно данных; + ! COMMON относительный. + + + 3.4. Сообщения об ошибках + + Сообщения об ошибках индицируются одной буквой (флагом) в + первой колонке листинга. Если файл с листингом не выводится на + консоль, то ошибочные строки все равно выводятся. + + Флаг Значение + ---- -------- + A Ошибка в аргументе. + Неправильный формат аргумента псевдокоманды + или аргумент вне допустимых границ. + + C Ошибка условного вложения. + ELSE без IF; ENDIF без IF; два ELSE на один IF. + + D Двойное определение символического имени. + + E Ошибка при использовании EXTRN. + Недопустимое использование символического име- + ни, объявленного EXTRN. + + M Многократно определенное символическое имя. + + N Ошибка в числе. + Неверное задание числа (например 8Q) + + O Неверный код операции или ошибочный синтаксис + ENDM, LOCAL вне блока; ASET, EQU или MACRO без + имени; неверный синтаксис в коде команды; не- + верный синтаксис в выражении. + + P Ошибка фазы. + Значение метки или имени в EQU изменилось при + втором проходе. + + Q Вопрос. + Обычно означает, что строка окончена неверно. + Это предупреждение о возможной ошибке. + + R Перемещение. + Недопустимое использование перемещения в выра- + жении. + + U Символическое имя не определено. + + V Ошибка значения. + При первом проходе псевдокоманда не может полу- + чить необходимого определенного значения. Если + символ, встретившийся в псевдокоманде, опреде- + лен ниже, то при втором проходе ошибка U выда- + ваться не будет. diff --git a/third_party/solid-c/DOC/M80.TXT b/third_party/solid-c/DOC/M80.TXT new file mode 100644 index 0000000..f4fe2e6 --- /dev/null +++ b/third_party/solid-c/DOC/M80.TXT @@ -0,0 +1,1731 @@ + MACRO-80 Assembler + + + 2.1 Running MACRO-80 + 2.2 Command Format + 2.2.1 Devices + 2.2.2 Switches + 2.3 Format of MACRO-80 Source Files + 2.3.1 Statements + 2.3.2 Symbols + 2.3.3 Numeric Constants + 2.3.4 Strings + 2.4 Expression Evaluation + 2.4.1 Arithmetic and Logical Operators + 2.4.2 Modes + 2.4.3 Externals + 2.5 Opcodes as Operands + 2.6 Pseudo Operations + 2.6.1 ASEG + 2.6.2 COMMON + 2.6.3 CSEG + 2.6.4 DB - Define Byte + 2.6.5 DC - Define Character + 2.6.6 DS - Define Space + 2.6.7 DSEG + 2.6.8 DW - Define Word + 2.6.9 END + 2.6.10 ENTRY/PUBLIC + 2.6.11 EQU + 2.6.12 EXT/EXTRN + 2.6.13 INCLUDE + 2.6.14 NAME + 2.6.15 ORG - Define Origin + 2.6.16 PAGE + 2.6.17 ASET + 2.6.18 SUBTTL + 2.6.19 TITLE + 2.6.20 .COMMENT + 2.6.21 .PRINTX + 2.6.22 .RADIX + 2.6.23 .Z80 + 2.6.24 .8080 + 2.6.25 .REQUEST + 2.6.26 Conditional Pseudo Operations + 2.6.26.1 ELSE + 2.6.26.2 ENDIF + 2.6.27 Listing Control Pseudo Operations + 2.6.28 Relocation Pseudo Operations + 2.6.28.1 ORG Pseudo-op + 2.6.29.2 LINK-80 + 2.6.29 Relocation Before Loading + 2.7 Macros and Block Pseudo Operations + 2.7.1 Terms + 2.7.2 REPT-ENDM + 2.7.3 IRP-ENDM + 2.7.4 IRPC-ENDM + 2.7.5 MACRO + 2.7.6 ENDM + 2.7.7 EXITM + 2.7.8 LOCAL + 2.7.9 Special Macro Operators and Forms + 2.8 Using z80 Pseudo-ops + 2.9 Sample Assembly + 2.10 MACRO-80 Errors + 2.11 Compatability with Other Assemblers + 2.12 Format of Listings + 2.12.1 Symbol Table Listing + + + CHAPTER 2 + + MACRO-80 ASSEMBLER + + + + 2.1 RUNNING MACRO-80 + + The command to run MACRO-80 is + + M80 + + MACRO-80 returns the prompt "*", indicating it is ready to accept + commands. + + + NOTE + + If you are using the TEKDOS + operating system, see Appendix + A for proper command formats. + + + + + 2.2 COMMAND FORMAT + + A command to MACRO-80 consists of a string of filenames with optional + switches. All filenames should follow the operating system's + conventions for filenames and extensions. The default extensions + supplied by Microsoft software are as follows: + + File CP/M ISIS-II + + Relocatable object file REL REL + Listing file PRN LST + MACRO-80 source file MAC MAC + FORTRAN source file FOR FOR + COBOL source file COB COB + Absolute file COM + + + 2.2.1 Devices + + Any field in the MACRO-80 command string can also specify a device + name. The default device name with the CP/M operating system is the + currently logged disk. The default device name with the ISIS-II + operating system is disk drive 0. The command format is: + + dev:objfile,dev:lstfile=dev:source file + + The device names are as follows: + + Device CP/M ISIS-II + + Disk drives A:, B:, C:,... :F0:, :F1:, :F2:, ... + Line printer LST: LST: + Teletype or CRT TTY: TTY: + High speed reader HSR + + Examples: + + *,TTY:=TEST Assemble the source file TEST.MAC + and list the program on the + console. No object code is + generated. Useful for error check. + + *SMALL,TTY:=B:TEST Assemble TEST.MAC (found + on disk drive B), place + the object file in SMALL.REL + and list the program on the console. + + + + 2.2.2 Switches + + A switch is a letter that is appended to the command string, preceded + by a slash. It specifies an optional task to be performed during + assembly. More than one switch can be used, but each must be preceded + by a slash. (With the TEKDOS operating system, switches are preceded by + commas or spaces. See Appendix A.) All switches are optional. The + available switches are: + + Switch Action + + O Octal lising + + H Hexadecimal listing (default) + + R Force generation of an object file + + L Force generation of a lising file + + C Force generation of a cross reference file + + Z Assemble Z80 opcodes (default for Z80 operating systems) + + I Assemble 8080 opcodes (default for 8080 operating systems) + + P Each /P allocates an extra 256 bytes of stack space for use + during assembly. Use /P if stack overflow occurs during + assembly. Otherwise, not needed. + + M Initialize Block Data Areas. If the programmer wants the + area that is defined by the DS (Define Space) pseudo-op + initialized to zeros, then the programmer should use the /M + switch in the command line. Otherwise, the space is not + guaranteed to contain zeros. That is, DS does not + automattically initialize the space to zeros. + + X Usually used to suppress the listing of false conditionals. + The following paragraph describes the /X switch more + completely but in very technical terms. + + The presence or absence of /X in the command line sets the + initial current mode and the initial value of the default + for listing or suppressing lines in false conditional + blocks. /X sets the current mode and initial value of + default to not-to-list. No /X sets current mode and initial + value of default to list. Current mode determines whether + false conditionals will be listed or suppressed. The + initial value of the default is used with the .TFCOND + pseudo-op so that .TFCOND is independent of .SFCOND and + .LFCOND. If the program contains .SFCOND or .LFCOND, /X has + no effect after .SFCOND or .LFCOND is encountered until a + .TFCOND is encountered in the file. So /X has an effect + only when used with a file that contains no conditional + listing psuedo-ops or when used with .TFCOND. + + + Examples: + + *=TEST/L Assemble TEST.MAC, places the object file in TEST.REL + and a listing file in TEST.PRN. (With ISIS-II, the + listing file is TEST.LST.) + + *=TEST/L/O Same as above, but listing file addresses will be in + octal. + + *LAST=TEST/C Assemble TEST.MAC, place the object file in LAST.REL + and cross reference file in TEST.CRF. (See Chapter 3.) + + + + 2.3 FORMAT OF MACRO-80 SOURCE FILES + + Input source lines of up to 132 characters in length are acceptable. + + MACRO-80 preserves lower case letters in quoted strings and comments. + All symbols, opcodes and pseudo-opcodes typed in lower case will be + converted to upper case. + + If the source file includes line numbers from an editor, each byte of + th eline number must have the high bit on. Line numbers from + Microsoft's EDIT-80 are acceptable. + + + 2.3.1 Statements + + Source files input to MACRO-80 consist of statements of the form: + + [label:[:]] [operator] [arguments] [;comment] + + With the exception of the ISIS assembler $ controls (see Section 2.11), + it is nog necessary that statements begin in column 1. Multiple blanks + or tabs may be used to improve readability. + + If a label is present, it is the first item in the statement and is + immediately followed by a colon. If it is followed by two colons, it is + declared as PUBLIC (seen ENTRY/PUBLIC, Section 2.6.10). For example: + + FOO:: RET + + is equivalent to + + PUBLIC FOO + FOO: RET + + The next item after the label, or the first item on the line if no + label is present, is an operator. An operator may be an 8080 mnemonic, + pseudo-op, macro call or expression. The evaluation is as follows: + + 1. Macro call + + 2. Mnemonic/Pseudo operation + + 3. Expression + + Instead of flagging an expression as an error, the assembler treats it + as if it were a DB statement (see Section 2.6.4). + + The arguments following the operator will, of course, vary in form + according to the operator. + + A comment always begins with a semicolon and ends with a carriage + return. A comment may be a line by itself or it may be appended to a + line that contains a statement. Extended comments can be entered using + the .COMMENT pseudo operation (see Section 2.6.20). + + + 2.3.2 Symbols + + MACRO-80 symbols may be of any length, however, only the first six + characters are significant. The following characters are legal in a + symbol: + + A-Z 0-9 $ . ? @ + + With Microsoft's 8080/Z80/8086 assemblers, the underline character is + also legal in a symbol. A symbol may not start with a digit. When a + symbol is read, lower case is translated into upper case. If a symbol + reference is followed by ## it is declared external (see also the + EXT/EXTRN pseudo-op, Section 2.6.12). + + + 2.3.3 Numeric Constants + + The default base for numeric constants is decimal. This may be changed + by the .RADIX pseudo-op (see Section 2.6.22). Any base from 2 (binary) + to 16 (hexadecimal) may be selected. When the base is greater than 10, + A-F are the digits following 9. If the first digit of a number is not + numeric the number must be preceeded by a zero. + + Numbers are 16-bit unsigned quantities. A number is always evaluated in + the current radix unless one of the following special notations is + used: + + nnnnB Binary + nnnnD Decimal + nnnnO Octal + nnnnQ Octal + nnnnH Hexadecimal + X'nnnn' Hexadecimal + + Overflow of a number beyond two bytes is ignored and the result is the + low order 16-bits. + + A character constant is a string comprised of zero, one or two ASCII + characters, delimited by quotation marks, and used in a non-simple + expression. For example, in the statement + + DB 'A' + 1 + + 'A' is a character constant. But the statement + + DB 'A' + + uses 'A' as a string because it is in a simple expression. The rules + for character constant delimiters are the same as for strings. + + A character constant comprised of one character has as its value the + ASCII value of that character. That is, the high order byte of the + value is zero, and the low order byte is the ASCII value of the + character. For example, the value of the constant 'A' is 41H. + + A character constant comprised of two characters has as its value the + ASCII value of the first character in the high order byte and the ASCII + value of the second character in the low order byte. For example, the + value of the character constant 'AB' is 41H*256+42H + + + 2.3.4 Strings + + A string is comprised of zero or more characters delimited by quotation + marks. Either single or double quotes may be used as string delimiters. + The delimiter quotes may be used as characters if they appear twice for + every character occurrence desired. For example, the statement + + DB "I am ""great"" today" + + stores the string + I am "great" today + + If there are zero characters between the delimiters, the string is a + null string. + + + + 2.4 EXPRESSION EVALUATION + + 2.4.1 Arithmetic And Logical Operators + + The following operators are allowed in expressions. The operators are + listed in order of precedence. + + NUL + + LOW, HIGH + + *, /, MOD, SHR, SHL + + Unary Minus + + +, - + + EQ, NE, LT, LE, GT, GE + + NOT + + AND + + OR, XOR + + Parantheses are used to change the order of precedence. During + evaluation of an expression, as soon as a new operator is encountered + that has precedence less than or equal to the last operator + encountered, all operations up to the new operator are performed. That + is, subexpressions involving operators of higher precedence are + computed first. + + All operators except +, -, *, / must be separated from their operands + by at least one space. + + The byte isolation operators (HIGH, LOW) isolate the high or low order + 8 bits of an Absolute 16-bit value. If a relocatable value is supplied + as an operand, HIGH and LOW will treat it as if it were relative to + location zero. + + + 2.4.2 Modes + + All symbols used as operands in expressions are in one of the following + modes: Absolute, Data Relative, Program (Code) Relative or COMMON. (See + Section 2.6 for the ASEG, CSEG, DSEG and COMMON pseudo-ops.) Symbols + assembled under the ASEG, CSEG (default), or DSEG pseudo-ops are in + Absolute, Code Relative or Data Relative mode respectively. + + The number of COMMON modes in a program is determined by the number of + COMMON blocks that have been named with the COMMON pseudo-op. Two + COMMON symbols are not in the same mode unless they are in the same + COMMON block. In any operation other than addition or subtraction, the + mode of both operands must be Absolute. + + If the operation is addition, the following rules apply: + + 1 At least one of the operands must be Absolute. + + 2 Absolute + = + + If the operation is subtraction, the following rules apply: + + 1 - Absolute = + + 1 - = Absolute + where the two s are the same. + + Each intermediate step in the evaluation of an expression must conform + to the above rules for modes, or an error will be generated. For + example, if FOO, BAZ and ZAZ are three Program Relative symbols, the + expression + + FOO + (BAZ -ZAZ) + + if legal because the first step (BAZ - ZAZ) generates an Absolute value + that is then added to the Program Relative value, FOO. + + + 2.4.3 Externals + + Aside from its classification by mode, a symbol is either External or + not External. (See EXT/EXTRN, Section 2.6.12.) An External value must + be assembled into a two-byte field. (Singe-byte Externals are not + supported.) The following rules apply to the use of Externals in + expressions: + + 1. Externals are legal only in addition and subtraction. + + 2. If an External symbol is used in an expression, the result of + the expression is always External. + + 3. When the operation is addition, either operand (but not both) + may be External. + + 4. When the operation is subtraction, only the first operand may + be External. + + + + 2.5 OPCODES AS OPERANDS + + 8080 opcodes are valid one-byte operands. Note that only the first byte + is a valid operand. For example: + + MVI A,(JMP) + ADI (CPI) + MVI B,(RNZ) + CPI (INX H) + ACI (LXI B) + MVI C,MOV A,B + + Errors will be generated if more than one byte is included in the + operand -- such as (CPI 5), LXI B,LABEL1 or (JMP LABEL2). + + Opcodes used as one-byte operands need not be enclosed in parentheses. + + + NOTE + + Opcodes are not valid operands + in Z80 mode. + + + 2.6 PSEUDO OPERATIONS + + 2.6.1 ASEG + + ASEG + + ASEG sets the location counter to an absolute segment of memory. The + location of the absolute counter will be that of the last ASEG (default + is 0), unless an ORG is done after the ASEG to change the location. The + effect of ASEG is also achieved by using the code segment (CSEG) pseudo + operation and the /P switch in LINK-80. See also section 2.6.28 + + + 2.6.2 COMMON + + COMMON // + + COMMON sets the location counter to the selected common block in + memory. The location is always the beginning of the area so that + compatibility with the FORTRAN COMMON statement is maintained. If + is omitted or consists of spaces, it is considered to be + blank common. See also Section 2.6.28. + + + 2.6.3 CSEG + + CSEG + + CSEG sets the location counter to the code relative segment of memory. + The location will be that of the last CSEG (default is 0), unless an + ORG is done after the CSEG to change the location. CSEG is the default + condition of the assembler (the INTEL assembler defaults to ASEG). See + also Section 2.6.28. + + + 2.6.4 DB - Define Byte + + DB [,...] + + DB [...] + + The arguments to DB are either expressions or strings. DB stores the + values of the expressions or the characters of the strings in + successive memory locations beginning with the current location + counter. + + Expressions must evaluate to one byte. (if the high byte of the result + is 0 or 255, no error is given; otherwise, an A error results.) + + Strings of three or more characters may not be used in expressions + (i.e., they must be immediately followed by a comma or the end of the + line). The characters in a string are stored in the order of + appearance, each as a one-byte value with the high order bit set to + zero. + + Example: + + 0000' 41 42 DB 'AB' + 0002' 42 DB 'AB' AND 0FFH + 0003' 41 42 43 DB 'ABC' + + + 2.6.5 DC - Define Character + + DC + + DC stores the characters in in successive memory locations + beginning with the current location counter. As with DB, characters are + stored in order of appearance, each as a one-byte value with the high + order bit set to zero. However, DC stores the last character of the + string with the high order bit set to one. An error will result if the + argument to DC is a null string. + + + 2.6.6 DS - Define Space + + DS + + DS reserves an area of memory. The value of gives the number of + bytes to be allocated. All names used in must be previously + defined (i.e., all names known at that point on pass 1). Otherwise, a V + error is generated during pass 1 and a U error may be generated during + pass 2. If a U error is nog generated during pass 2, a phase error will + probably be generated because the DS generated no code on pass 1. + + + 2.6.7 DSEG + + DSEG + + DSEG sets the location counter to the Data Relative segment of memory. + The location of the data relative counter wil be that of the last DSEG + (default is 0), unless an ORG is done after the DSEG to change the + location. See also Section 2.6.28. + + + 2.6.8 DW - Define Word + + DW [,...] + + DW stores the values of the expressions in successive memory locations + beginning with the current location counter. Expressions are evaluated + as 2-byte (word) values. + + + 2.6.9 END + + END [] + + The END statement specifies the end of the program. If is + present, it is the start address of the program. If is not + present, then no start address is passed to LINK-80 for that program. + + + NOTE + + If an assembly language program + is the main program, a start + address (label) must be + specified. If not, LINK-80 will + issue a "no start address" + error. If the program is a + subroutine to a FORTRAN program + (for example), the start + address is nog required because + FORTRAN has supplied one. + + + + 2.6.10 ENTRY/PUBLIC + + ENTRY [,...] + or + PUBLIC [,...] + + ENTRY or PUBLIC declares each name in the list as internal and + therefore available for use by this program and other programs to be + loaded concurrently. All of the names in the list must be defined in + the current program or a U error results. An M error is generated if + the name is an external name or common-blockname. + + + 2.6.11 EQU + + EQU + + EQU assigns the value of to . If is external, an + error is generated. If already has a value other than , an + M error is generated. + + + 2.6.12 EXT/EXTRN + + EXT [,...] + or + EXTRN [,...] + + EXT or EXTRN declares that the name(s) in the list are external (i.e., + defined in a different program). If any item in the list references a + name that is defined in the current program, an M error results. A + reference to a name where the name is followed immediately by two pound + signs (e.g., NAME##) also declares the name as external. + + + 2.6.13 INCLUDE + + INCLUDE + + The INCLUDE pseudo-op applies only to CP/M versions of MACRO-80. The + pseudo-ops INCLUDE, $INCLUDE and MACLIB are synonymous. + + The INCLUDE pseudo-op assembles source statements from an alternate + source file into the current source file. Use of INCLUDE eliminates the + need to repeat an often-used sequence of statements in the current + source file. + + is any valid specification, as determined by the operating + system. Defaults for filename extensions and device names are the same + as those in a MACRO-80 command line. + + The INCLUDE file is opened and assembled into the current source file + immediately following the INCLUDE statement. When end-of-file is + reached, assembly resumes with the statement following INCLUDE. + + On a MACRO-80 listing, a plus sign is printed between the assembled + code and the source line on each line assembled from an INCLUDE file. + (See Section 2.12.) + + Nested INCLUDEs are not allowed. If encountered, they will result in an + objectionable syntax error 'O'. + + The file specified in the operand field must exist. If the file is not + found, the error 'V' (value error) is given, and the INCLUDE is + ignored. + + + 2.6.14 NAME + + NAME ('modname') + + NAME defines a name for the module. Only the first six characters are + significant in a module name. A module name may also be defined with + the TITLE pseudo-op. In the absence of both the NAME and TITLE + pseudo-ops, the module name is created from the source file name. + + + 2.6.15 ORG - Define Origin + + ORG + + The location counter is set to the value of and the assembler + assigns code starting with that value. All names used in must be + known on pass 1, and the value must either be absolute or in the same + area as the location counter. + + + 2.6.16 PAGE + + PAGE [] + + PAGE causes the assembler to start a new output page. The value of + , if included, becomes the new page size (measured in lines per + page) and must be in the range 10 to 255. The default page size is 50 + lines per page. The assembler puts a form feed character in the listing + file at the end of a page. + + + 2.6.17 ASET + + ASET + + ASET is the same as EQU, except no error is generated if is + already defined. + + + 2.6.18 SUBTTL + + SUBTTL + + SUBTTL specifies a subtitle to be listed on the line after the title + (see TITLE, Section 2.6.19) on each page heading. is truncated + after 60 characters. Any number of SUBTTLs may be given in a program. + + + 2.6.19 TITLE + + TITLE + + TITLE specifies a title to be listed on the first line of each page. If + more than one TITLE is given, a Q error results. The first six + characters of the title are used as the module name unless a NAME + pseudo operation is used. If neither a NAME or TITLE pseudo-op is used, + the module name is created from the source filename. + + + 2.6.20 .COMMENT + + .COMMENT + + The first non-blank character encountered after .COMMENT is the + delimiter. The following comprises a comment block which + continues until the next occurence of is encountered. For + example, using an asterisk as the delimiter, the format of the comment + block would be: + + .COMMENT * + any amount of text entered + here as the comment block + . + . + . * + ;return to normal mode + + + 2.6.21 .PRINTX + + .PRINTX + + The first non-blank character encountered after .PRINTX is the + delimiter. The following text is listed on the terminal during assembly + until another occurence of the delimiter is encountered. .PRINTX is + useful for displaying progress through a long assembly or for + displaying the value of conditional assembly switches. For example: + + IF CPM + .PRINTX /CPM version/ + ENDIF + + + NOTE + + .PRINTX will output on both + passes. If only one printout + is desired, use the IF1 or + IF2 pseudo-op. For example: + + IF2 + IF CPM + .PRINTX /CPM version/ + ENDIF + ENDIF + + will only print if CPM is + true and M80 is in pass 2. + + + 2.6.22 .RADIX + + .RADIX + + The default base (or radix) for all constants is decimal. The .RADIX + statement allows the default radix to be changed to any base in the + range of 2 to 16. For example: + + MOVI BX,0FFH + .RADIX 16 + MOVI BC,0FF + + The two MOVIs in the example are indentical. The in a .RADIX + statement is always in decimal radix, regardless of the current radix. + + + 2.6.23 .Z80 + + .Z80 enables the assembler to accept Z80 opcodes. This is the default + condition when the assembler is running on a Z80 operating system. Z80 + mode may also be set by appending the Z switch to the MACRO-80 command + string -- see Section 2.2.2. + + + 2.6.24 .8080 + + .8080 enables the assembler to accept 8080 opcodes. This is the default + condition when the assembler is running on an 8080 operating system. + 8080 mode may also be set by appending the I switch to the MACRO-80 + command string -- see Section 2.2.2. + + + 2.6.25 REQUEST + + .REQUEST [,...] + + .REQUEST sends a request to the LINK-80 loader to search the filenames + in the list for undefined globals. The filenames in the list should be + in the form of legal symbols. They should not include filename + extensions or disk specifications. LINK-80 supplies a default extension + and assumes the default disk drive. + + + 2.6.26 Conditional Pseudo Operations + + The conditional pseudo operations are: + + IF/IFT True if is no 0. + + IFE/IFF True if is 0. + + IF1 True if pass 1. + + IF2 True if pass 2. + + IFDEF True if is defined or has been + declared External. + + IFNDEF True if is undefined or not + declared External. + + IFB True if is blank. The angle + brackets around are required. + + IFNB True if is not blank. Used for + testing when dummy parameters are + supplied. The angle brackets around + are required. + + IFIDN , True if the string is IDeNtical to + the string . + The angle brackets around and + are required. + + IFDIF , True if the string is DIFferent + from the string . + The angle brackets around and + are required. + + All conditionals use the following format: + + IFxx [argument] + . + . + . + [ELSE + . + . + . ] + ENDIF + + Conditionals may be nested to any level. Any argument to a conditional + must be known on pass 1 to avoid V errors and incorrect evaluation. For + IF, IFT, IFF, and IFE the expression must involve values which were + previously defined and the expression must be absolute. If the name is + defined after an IFDEF or IFNDEF, pass 1 considers the name to be + undefined, but it will be defined on pass 2. + + + 2.6.26.1 ELSE - Each conditional pseudo operation may optionally be + used with the ELSE pseudo operation which allows alternate code to be + generated when the opposite condition exists. Only one ELSE if + permitted for a given IF, and an ELSE is always bound to the most + recent, open IF. A conditional with more than one ELSE or an ELSE + without a conditional will cause a C error. + + + 2.6.26.2 ENDIF - Each IF must have a matching ENDIF to terminate the + conditional. Otherwise, an 'Unterminated conditional' message is + generated at the end of each pass. An ENDIF without a matching IF + causes a C error. + + + 2.6.27 Listing Control Pseudo Operations + + Output to the listing file can be controlled by two pseudo-ops: + + .LIST and .XLIST + + If a listing is nog being made, these pseudo-ops have no effect. .LIST + is the default condition. When a .XLIST is encountered, source and + object code fill not be listed until a .LIST is encountered. + + The output of false conditional blocks is controlled by three + pseudo-ops: .SFCOND, .LFCOND, and .TFCOND. + + These pseudo-ops give the programmer control over four cases. + + 1. Normally list false conditionals. + For this case, the programmer simply allows the default mode + to control the listing. The default mode is list false + conditionals. If the programmer decides to suppress false + conditionals, the /X switch can be issued in the command line + instead of editing the source file. + + 2. Normally surpress false conditionals. + For this case, the programmer issues the .TFCOND pseudo-op in + the program file. .TFCOND reverses (toggles) the default, + causing false conditionals to be suppressed. If the programmer + decides to list false conditionals, the /X switch can be + issued in the command line instead of editing the source file. + + 3. Always suppress/list false conditionals. + For this case, the programmer has decided for most false + conditionals whether to list or suppress, but for some false + conditionals the programmer has not yet decided. For the false + conditionals decided about, use .SFCOND or .LFCOND. For those + not yet decided, use .TFCOND. .TFCOND sets the current and + default settings to the opposite of the default. Initially, + the default is set by giving /X or no /X in the command line. + Two subcases exist: + + 1. The programmer wants some false conditionals not to list + unless /X is given. The programmer uses the .SFCOND and + .LFCOND pseudo-ops to control which areas always suppress + or list false conditionals. To selectively suppress some + false conditionals, the programmer issues .TFCOND at the + beginning of the conditional block and again at the end of + the conditional block. (NOTE: The second .TFCOND should be + issued so that the default setting will be the same as the + initial setting. Leaving the default equal to the initial + setting makes it easier to keep track of the default mode + if there are many such areas.) If the conditional block + evaluates as false, the lines will be suppressed. In this + subcase, issuing the /X switch in the command line causes + the conditional block affected by .TFCOND to list even if + it evaluates as false. + + 2. The programmer want some false conditionals to list unless + /X is given. Two consecutive .TFCONDs places the + conditional listing setting in initial state which is + determined by the presence or absence of the /X switch in + the command line (the first .TFCOND sets the default to + not initial; the second to initial). The selected + conditional block then responds to the /X switch: if a /X + switch is issued in the command line, the conditional + block is suppressed if false; if no /X switch is issued in + the command line, the conditional block is listed even if + false. + + The three conditional listing pseudo-ops are summarized below. + + PSEUDO-OP DEFINITION + + .SFCOND Suppresses the listing of conditional blocks that + evaluate as false. + + .LFCOND Restores the listing of conditional blocks that + evaluate as false. + + .TFCOND Toggles the current setting which controls the listing + false conditionals. .TFCOND sets the current and + default setting to not default. If a /X switch is given + in the MACRO-80 run command line for a file which + contains .TFCOND, /X reverses the effect of .TFCOND. + + The following chart illustrates the effects of the three pseudo-ops + when encountered under /X and under no /X. + + PSEUDO-OP NO /X /X + + (none) ON OFF + . . . + . . . + . . . + .SFCOND OFF OFF + . . . + . . . + . . . + .LFCOND ON ON + . . . + . . . + . . . + .TFCOND OFF ON + . . . + . . . + . . . + .TFCOND ON OFF + . . . + . . . + . . . + .SFCOND OFF OFF + . . . + . . . + . . . + .TFCOND OFF ON + .TFCOND ON OFF + . . . + . . . + . . . + .TFCOND OFF ON + + + The output of cross reference information is controlled by .CREF and + .XCREF. If the cross reference facility (see Chapter 3) has not been + invoked, .CREF and .XCREF have no effect. The default condition is + .CREF. When a .XCREF is encountered, no cross reference information is + output until .CREF is encountered. + + The output of MACRO/REPT/IRP/IRPC expansions is controlled by three + pseudo-ops: .LALL, .SALL and .XALL. .LALL lists the complete macro text + for all expansions. .SALL suppresses listing of all text and object + code produced by macros. .XALL is the default condition; a source line + is listed only if it generates object code. + + + 2.6.28 Relocation Pseudo Operations + + The ability to create relocatable modules is one of the major features + of Microsoft assemblers. Relocatable modules offer the advantages of + easier coding and faster testing, debugging and modifying. In addition, + it is possible to specify segments of assembled code that will later be + loaded into RAM (the Data Relative segment) and ROM/PROM (the Code + Relative segment). The pseudo operations that select relocatable areas + are CSEG and DSEG. The ASEG pseudo-op is used to generate + non-relocatable (absolute) code. The COMMON pseudo-op creates a common + data area for every COMMON block that is named in the program. + + The default mode for the assembler is Code Relative. That is, assembly + begins with a CSEG automatically executed and the location counter in + the Code Relative mode, pointing to location 0 in the Code Relative + segment of memory. All subsequent instructions will be assembled into + the Code Relative segment of memory until a ASEG or DSEG or COMMON + pseudo-op is executed. For example, the first DSEG encountered sets the + location counter to location zero in the Data Relative segment of + memory. The following code is assembled in the Data Relative segment of + memory. If a subsequent CSEG is encountered, the location counter will + return to the next free location in the Code Relative segment and so + on. + + The ASEG, DSEG, CSEG pseudo-ops never have operands. If you wish to + alter the current value of the location counter, use the ORG pseudo-op. + + + 2.6.28.1 ORG Pseudo-op - At any time, the value of the location + counter may be changed by use of the ORG pseudo-op. The form of the ORG + statement is: + + ORG + + where the value of will be the new value of the location counter + in the current mode. All names used in must be known on pass 1 + and the value of must be either Absolute or in the current mode + of the location counter. For example, the statements + + DSEG + ORG 50 + + set the Data Relative counter to 50, relative to the start of the Data + Relative segment of memory. + + + 2.6.28.2 LINK-80 - The LINK-80 linking loader (see Chapter 4 of this + manual) combines the segments and creates each relocatable module in + memory when the program is loaded. The origins of the relocatable + segments are not fixed until the program is loaded and the origins are + assigned by LINK-80. The command to LINK-80 may contain user-specified + origins through the use of the /P (for Code Relative) and /D (for Data + and COMMON segments) switches. + + For example, a program that begins with the statements + + ASEG + ORG 800H + + and is assembled entirely in Absolute mode will always load beginning + at 800 unless the ORG statement is changed in the source file. However, + the same program, assembled in Code Relative mode with no ORG + statement, may be loaded at any specified address by appending the + /P:

switch to the LINK-80 command string. + + + 2.6.29 Relocation Before Loading + + Two pseudo-ops, .PHASE and .DEPHASE, allow code to be located in one + area, but executed only at a different, specified area. + + For example: + + 0000' .PHASE 100H + 0100 E8 0003 FOO: CALL BAZ + 0103 E9 FF01 JMP ZOO + 0106 C3 BAZ: RET + .DEPHASE + 0007' E9 FFFB ZOO: JMP 5 + + All labels within a .PHASE block are defined as the absolute value from + the origin of the phase area. The code, however, is loaded in the + current area (i.e., from 0' in this example). The code within the block + can later be moved to 100H and executed. + + + + + 2.7 MACROS AND BLOCK PSEUDO OPERATIONS + + The macro facilites provided by MACRO-80 include three repeat pseudo + operations: reapeat (REPT), indefinite repeat (IRP), and indefinite + repeat character (IRPC). A macro definition operation (MACRO) is also + provided. Each of these four macro operations is terminated by the ENDM + pseudo operation. + + + 2.7.1 Terms + + For the purposes of discussion of macros and block operations, the + following terms will be used: + + 1. is used to represent a dummy parameter. All dummy + paramters are legal symbols that appear in the body of a + macro expansion. + + 2. is a list of s separated by commas. + + 3. is a list of arguments separated by commas. + must be delimited by angle brackets. Two angle + brackets with no intervening characters (<>) or two commas + with no intervening characters enter a null argument in the + list. Otherwise an argument is a character or series of + characters terminated by a comma or >. With angle brackets + that are nested inside an , one level of brackets is + removed each time the bracketed argument is used in an + . (See example, Section 2.7.5.) A quoted string is + an acceptable argument and is passed as such. Unless enclosed + in brackets or a quoted string, leading and trailing spaces + are deleted from arguments. + + 4. is used to represent a list of actual parameters + separated by commas. No delimiters are required (the list is + terminated by the end of line or a comment), but the rules + for entering null parameters and nesting brackets are the + same as described for . (See example, Section + 2.7.5.) + + + 2.7.2 REPT-ENDM + + REPT + . + . + . + ENDM + + The block of statements between REPT and ENDM is repeated times. + is evaluated as a 16-bit unsigned number. If contains any + external or undefined terms, an error is generated. Example: + + ASET 0 + REPT 10 ;generates DB 1 - DB 10 + ASET X+1 + DB X + ENDM + + + 2.7.3 IRP-ENDM + + IRP , + . + . + . + ENDM + + The must be enclosed in angle brackets. The number of + arguments in the determines the number of times the block of + statements is repeated. Each repetition substitutes the next item in + the for every occurrence of in the block. If the + is null (i.e., <>), the block is processed once with each + occurence of removed. For example: + + IRP X,<1,2,3,4,5,6,7,8,9,10> + DB X + ENDM + + gernerates the same bytes as the REPT example. + + + 2.7.4 IRPC-ENDM + + IRPC ,string (or ) + . + . + . + ENDM + + IRPC is similar to IRP but the arglist is replaced by a string of text + and the angle brackets around the string are optional. The statements + in the block are repeated once for each character in the string. Each + repetition substitutes the next character in the string for every + occurrence of in the block. For example: + + IRPC X,0123456789 + DB X+1 + ENDM + + generates the same code as the two previous examples. + + + 2.7.5 MACRO + + Often it is convenient to be able to generate a given sequence of + statements from various places in a program, even though different + parameters may be required each time the sequence is used. This + capability is provided by the MACRO statement. + The form is + + MACRO + . + . + . + ENDM + + where conforms to the rules for forming symbols. is the + name that will be used to invoke the macro. The s in + are the parameters that will be changed (replaced) each time the MACRO + is invoked. The statements before the ENDM comprise the body of the + macro. During assembly, the macro is expanded every time it is invoked + but, unlike REPT/IRP/IRPC, the macro is not expanded when it is + encountered. + + The form of a macro call is + + + + where is the name supplied in the MACRO definition, and the + parameters in will replace the s in the MACRO + on a one-to-one basis. The number of items in + and is limited only by the length of a line. The number of + parameters used when the macro is called need not be the same as the + number of s in . If there are more parameters than + s, the extras are ignored. If there are fewer, the extra + s will be made null. The assembled code will contain the macro + expansion code after each macro call. + + NOTE + + A dummy parameter in a MACRO/REPT/IRP/IRPC + is always recognized exclusively as a dummy + parameter. Register names such as A and B + will be changed in the expansion if they + were used as dummy parameters. + + Here is an example of a MACRO definition that defines a macro called + FOO: + + FOO MACRO X + Y ASET 0 + REPT X + Y ASET Y+1 + DB Y + ENDM + ENDM + + This macro generates the same code as the previous three examples when + the call + + FOO 10 + + is executed. + + Another example, which generates the same code, illustrates the removal + of one level of brackets when an argument is used as an arglist: + + FOO MACRO X + IRP Y, + DB Y + ENDM + ENDM + + When the call + + FOO <1,2,3,4,5,6,7,8,9,10> + + is made, the macro expansion looks like this: + + IRP Y,<1,2,3,4,5,6,7,8,9,10> + DB Y + ENDM + + + 2.7.6 ENDM + + Every REPT, IRP, IRPC and MACRO pseudo-op must be terminated with the + ENDM pseudo-op. Otherwise the 'Unterminated REPT/IRP/IRPC/MACRO' + message is generated at the end of each pass. An unmatched ENDM causes + an O error. + + + 2.7.7 EXITM + + The EXITM pseudo-op is used to terminate a REPT/IRP/IRPC or MACRO call. + When an EXITM is executed, the expansion is exited immediately and any + remaining expansion or repetition is not generated. If the block + containing the EXITM is nested within another block, the outer level + continues to be expanded. + + + 2.7.8 LOCAL + + LOCAL + + The LOCAL pseudo-op is allowed only inside a MACRO definition. When + LOCAL is executed, the assembler creates a unique symbol for each + in and substitutes that symbol for each occurence + of the in the expansion. These unique symbols are usually used + to define a label within a macro, thus eliminating multiply-defined + labels on successive expansions of the macro. The symbols created by + the assembler range from ..0001 to ..FFFF. Users will therefore want to + avoid the term ..nnnn for their own symbols. If LOCAL statements are + used, they must be the first statements in the macro definition. + + + 2.7.9 Special Macro Operators And Forms + + & The ampersand is used in a macro expansion to concatenate text + or symbols. A dummy parameter that is in a quoted string will + not be substituted in the expansion unless it is immediately + preceded by &. To form a symbol from text and a dummy, put & + between them. For example: + + ERRGEN MACRO X + ERROR&X:PUSH BX + MOVI BX,'&X' + JMP ERROR + ENDM + + In this example, the call ERRGEN A will generate: + + ERRORA: PUSH BX + MOVI BX,'A' + JMP ERROR + + ;; In a block operation, a comment preceded by two + semicolons is not saved as part of the expansion (i.e., + it will not appear on the listing even under .LALL). A + comment preceded by one semicolon, however, will be + preserved and appear in the expansion. + + ! When an exclamation point is used in an argument, the + next character is entered literally (i.e., !; and <;> + are equivalent). + + NUL NULL is an operator that returns true if its argument (a + parameter) is null. The remainder of a line after NUL is + considered to be the argument to NUL. The conditional + + IF NUL argument + + is false if, during the expansion, the first character + of the argument is anything other than a semicolon or + carriage return. It is recommended that testing for null + parameters be done using the IFB and IFNB conditionals. + + % The percent sign is used only in a macro argument. % + converts the expression that follows it (usually a + symbol) to a number in the current radix. During macro + expansion, the number derived from converting the + expression is substituted for the dummy. Using the % + special operator allows a macro call by value. (Usually, + a macro call is a call by reference with the text of the + macro argument substituting exactly for the dummy.) + + The expression following the % must conform to the same + rules as the DS (Define Space) pseudo-op. A valid + expression returning a non-relocatable constant is + required. + + EXAMPLE: Normally, LB, the argument to MAKLAB, would be + substituted for Y, the argument to MACRO, as a string. + The % causes LB to be converted to a non-relocatable + constant which is then substituted for Y. Without the % + special operator, the result of assembly would be 'Error + LB' rather than 'Error 1', etc. + + MAKLAB MACRO Y + ERR&Y: DB 'Error &Y',0 + ENDM + MAKERR MACRO X + LB ASET 0 + REPT X + LB ASET LB+1 + MAKLAB %LB + ENDM + ENDM + + When called by MAKERR 3, the assembler will generate: + + ERR1: DB 'Error 1',0 + ERR2: DB 'Error 2',0 + ERR3: DB 'Error 3',0 + + TYPE The TYPE operator returns a byte that describes two + characteristics of its argument: 1) the mode, and 2) + whether it is External or not. The argument to TYPE may + be any expression (string, numeric, logical). If the + expression is invalid, TYPE returns zero. + + The byte that is returned is configured as follows: + + The lower two bits are the mode. If the lower two bits + are: + + 0 the mode is Absolute + 1 the mode is Program Relative + 2 the mode is Data Relative + 3 the mode is Common Relative + + The high bit (80H) is the External bit. If the high bit + is on, the expression contains an External. If the high + bit is off, the expression is local (not External). + + The Defined bit is 20H. This bit is on if the expression + is locally defined, and it is off if the expression is + undefined or external. If neither bit is on, the + expression is invalid. + + TYPE is usually used inside macros, where an argument + type may need to be tested to make a decision regarding + program flow. For example: + + FOO MACRO X + LOCAL Z + Z ASET TYPE X + IF Z... + + + + 2.8 USING Z80 PSEUDO-OPS + + When using the MACRO-80 assembler, the following Z80 pseudo-ops are + valid. The function of each pseudo-op is equivalent to that of its + counterpart. + + Z80 pseudo-op Equivalent pseudo-op + + COND IFT + ENDC ENDIF + *EJECT PAGE + DEFB DB + DEFS DS + DEFW DW + DEFM DB + DEFL ASET + GLOBAL PUBLIC + EXTERNAL EXTRN + + The formats, where different, conform to the previous format. That is, + DEFB and DEFW are permitted a list of arguments (as are DB and DW), and + DEFM is permitted a string or numeric argument (as is DB). + + + + + + 2.9 SAMPLE ASSEMBLY + + + A>M80 + + *EXMPL1,TTY:=EXMPL1 + + MAC80 3.2 PAGE 1 + + + 00100 ;CSL3(P1,P2) + 00200 ;SHIFT P1 LEFT CIRCULARY 3 BITS + 00300 ;RETURN RESULT IN P2 + 00400 ENTRY CSL3 + 00450 ;GET VALUE OF FIRST PARAMETER + 00500 CSL3: + 0000' 7E 00600 MOV A,M + 0001' 23 00700 INX H + 0002' 66 00800 MOV H,M + 0003' 6F 00900 MOV L,A + 01000 ;SHIFT COUNT + 0004' 06 03 01100 MVI B,3 + 0006' AF 01200 LOOP: XRA A + 01300 ;SHIFT LEFT + 0007' 29 01400 DAD H + 01500 ;ROTATE IN CY BIT + 0008' 17 01600 RAL + 0009' 85 01700 ADD L + 000A' 6F 01800 MOV L,A + 01900 ;DECREMENT COUNT + 000B' 05 02000 DCR B + 02100 ;ONE MORE TIME + 000C' C2 0006' 02200 JNZ LOOP + 000F' EB 02300 XCHG + 02400 ;SAVE RESULT IN SECOND PARAMETER + 0010' 71 02500 MOV M,E + 0011' 23 02600 INX H + 0012' 72 02700 MOV M,D + 0013' C9 02800 RET + 02900 END + + + MAC80 3.2 PAGE S + + + CSL3 0000I' LOOP 0006' + + + No Fatal error(s) + + + + 2.10 MACRO-80 ERRORS + + MACRO-80 errors are indicated by a one-character flag in column one of + the listing file. If a listing file is not being printed on the + terminal, each erroneous line is also printed or displayed on the + terminal. Below is a list of the MACRO-80 Error Codes: + + A Argument error + Argument to pseudo-op is not in correct format or is out of + range (.PAGE 1; .RADIX 1; PUBLIC 1; JMPS TOOFAR). + + C Conditional nesting error + ELSE without IF, ENDIF without IF, two ELSEs on one IF. + + D Double Defined symbol + Reference to a symbol which is multiply defined. + + E External error + Use of an external illigal in context (e.g., FOO SET NAME##; + MOVI AX,2-NAME##). + + M Multiply Defined symbol + Definition of a symbol which is multiply defined. + + N Number error + Error in a number, usually a bad digit (e.g., 8Q). + + O Bad opcode or objectionable syntax + ENDM, LOCAL outside a block; ASET, EQU or MACRO without a + name; bad syntax in an opcode; or bad syntax in an expression + (mismatched parenthesis, quotes, consecutive operators, + etc.). + + P Phase error + Value of a Label or EQU name is different on pass 2. + + Q Questionable + Usually means a line is not terminated properly. This is a + warning error (e.g. MOV AX,BX,). + + R Relocation + Illigal use of relocation in expression, such as abs-rel. + Data, code and COMMON areas are relocatable. + + U Undefined symbol + A symbol referenced in an expression is not defined. (For + certain pseudo-ops, a V error is printed on pass 1 and a U on + pass 2.) + + V Value error + On pass 1 a pseudo-op which must have its value known on pass + 1 (e.g., .RADIX, .PAGE, DS, IF, IFE, etc.), has a value which + is undefined. If the symbol is defined later in the program, + a U error will not appear on the pass 2 listing. + + + Error Messages: + + 'No END statement encountered on input file' + No END statement; either it is missing or it is not parsed + due to being in a false conditional, unterminated + IRP/IRPC/REPT block or terminated macro. + + 'Unterminated conditional' + At least one conditional is unterminated at the end of the + file. + + 'Unterminated REPT/IRP/IRPC/MACRO' + At least one block is unterminated. + + [xx] [No] Fatal error(s) [,xx warnings] + The number of fatal errors and warnings. The message is + listed on the CRT and in the list file. + + + + 2.11 COMPATIBILITY WITH OTHER ASSEMBLERS + + The $EJECT and $TITLE controls are provided for compatability with + INTEL's ISIS assembler. The dollar sign must appear in column 1 only if + spaces or tabs separate the dollar sign from the control word. The + control + + $EJECT + + is the same as the MACRO-80 PAGE pseudo-op. + The control + + $TITLE('text') + + is the same as the MACRO-80 SUBTTL pseudo-op. + + The INTEL operands PAGE and INPAGE generate Q errors when used with the + MACRO-80 CSEG or DSEG pseudo-ops. These errors are warnings: the + assembler ignores the operands. + + When MACRO-80 is entered, the default for the origin is Code Relative + 0. + + With the INTEL ISIS assembler, the default is Absolute 0. + + With MACRO-80, the dollar sign ($) is a defined constant that indicates + the value of the location counter at the start of the statement. Other + assemblers may use a decimal point or an asterisk. Other constants are + defined by MACRO-80 to have the following values: + + A-7 B-0 C-1 D-2 E-3 + H-4 L-5 M-6 SP-6 PSW-6 + + + + 2.12 FORMAT OF LISTINGS + + On each page of a MACRO-80 listing, the first two lines have the form: + + [TITLE text] M80 3.3 PAGE x[-y] + [SUBTTL text] + + where: + + 1. TITLE text is the text supplied with the TITLE pseudo-op, if + one was given in the source program. + + 2. x is the major page number, which is incremented only when a + form feed is encountered in the source file. (When using + Microsoft's EDIT-80 text editor, a form feed is inserted + whenever a page mark is done.) When the symbol table is being + printed, x = S. + + 3. y is the minor page number, which is incremented whenever the + .PAGE pseudo-op is encountered in the source file, or + whenever the current page size has been filled. + + 4. SUBTTL text is the text supplied with the SUBTTL pseudo-op, + if one was given in the source program. + + Next, a blank line is printed, followed by the first line of output. + + A line of output on a MACRO-80 listing has the following form: + + [crf#] [error] loc#m |xx | xxxx|... source + + If cross reference information is being output, the first item on the + line is the cross reference number, followed by a tab. + + A one-letter error code followed by a space appears next on the line, + if the line contains an error. If there is no error, a space is + printed. If there is no cross reference number, the error code column + is the first column on the listing. + + The value of the location counter appears next on the line. It is a + 4-digit hexadecimal number or 6-digit octal numer, depending on whether + the /O or /H switch was given in the MACRO-80 command string. + + The character at the end of the location counter value is the mode + indicator. It will be one of the following symbols: + + ' Code Relative + " Data Relative + ! COMMON Relative + Absolute + * External + + Next, three spaces are printed followed by the assembled code. One-byte + values are followed by a space. Two-byte values are followed by a mode + indicator. Two-byte values are printed in the opposite order the are + stored in, i.e., the high order byte is printed first. Externals are + either the offset or the value of the pointer to the next External in + the chain. + + If a line of output on a MACRO-80 listing is from an INCLUDE file, the + character 'C' is printed after the assembled code on that line. If a + line of output is part of a text expansion (MACRO, REPT, IRP, IRPC) a + plus sign '+' is printed after the assembled code on that line. + + The remainder of the line contains the line of source code, as it was + input. + + Example: + + 0C49 3A A912' C+ LDA LCOUNT + + 'C+' indicates this line is from an INCLUDE file and part of a macro + expansion. + + + 2.12.1 Symbol Table Listing + + In the symbol table listing, all the macro names in the program are + listed alphabetically, followed by all the symbols in the program, + listed alphabetically. After each symbol, a tab is printed, followed by + the value of the symbol. If the symbol is Public, an I is printed + immediately after the value. The next character printed will be one of + the following: + + U Undefined symbol. + + C COMMON block name. (The "value" of the COMMON block is + its length (number of bytes) in hexadecimal or octal.) + + * External symbol. + + 'space' Absolute value. + + ' Program Relative value. + + " Data Relative value. + + ! COMMON Relative value. diff --git a/third_party/solid-c/DOC/OL.RUS b/third_party/solid-c/DOC/OL.RUS new file mode 100644 index 0000000..c05cdcf --- /dev/null +++ b/third_party/solid-c/DOC/OL.RUS @@ -0,0 +1,30 @@ + Библиотекарь + + +Библиотекарь OL служит для работы с библиотеками IRL-формата. Информацию +по этому формату можно прочитать в файле "irl.rus". Строка вызова библио- +текаря имеет следующий формат: + + OL <опция> <имя_библиотеки> [<имя_модуля1> <имя_модуля2> ...] + +Например: + + OL a mylib.irl module1 module2 module3 + +В данном примере в библиотеку MYLIB.IRL добавляются три новых модуля +(rel-файлы). Если файла MYLIB.IRL не существует, то создается новая +библиотека с таким именем, содержащая три указанных модуля. + + +Опции библиотекаря: + + A - Добавить модуль(и) в библиотеку. Если указанной библиотеки + нет, она создается. + D - Вывод дампа содержимого библиотеки на экран. + E - Извлечь модуль(и) из библиотеки и сохранить его в файле. + В именах модулей можно использовать глобальные символы + "*" и "?". + L - Вывод списка модулей библиотеки на экран. + R - Переиндексация библиотеки. + T - Проверка всех модулей библиотеки на неопределенные внешние + метки. diff --git a/third_party/solid-c/DOC/README.RUS b/third_party/solid-c/DOC/README.RUS new file mode 100644 index 0000000..734ade8 --- /dev/null +++ b/third_party/solid-c/DOC/README.RUS @@ -0,0 +1,155 @@ + Некоторые особенности пакета SOLID C для ОС Estex + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + СИ-КОМПИЛЯТОР + +Коды возврата компилятора (1-й и 2-й проходы): + + 00h - Ok + 0FFh - были errors/warnings, ошибки выделения памяти или работы с файлами. + + + 1-й проход компилятора + +1. При компиляции "чужих" исходников ставить опцию "-k". + +2. В опциях: -dNAME, -jN, -oNAME и -rP:S:H пробелы не допускаются. + +3. Максимальная длина строки полного пути (disk\dir\file.ext) файлов + равна 80 символов. + +4. Файл "file.err" создается всегда по текущему пути входного .c файла. + +5. Формат записи include-файлов только как: + + #include - поиск ведется только в подкаталоге "INCLUDE" + расположения компилятора. + + #include "file.ext" - поиск ведется только в каталоге расположения + входного .c файла. + +Задание пути в имени файла не допускается!. Имя папки "INCLUDE" зарезерви- +ровано. + + 2-й проход компилятора + +1. Позволяет компилировать несколько бОльшие исходники, по сравнению + с фирменной версией. + +2. Исправлены две фирменные ошибки: + a) нельзя было указывать расширение для TMC-файлов + b) зависание при компиляции запредельно больших исходников + + + + АССЕМБЛЕР + +Примечание: Поскольку ассемблер AS совместим с ассемблером M80 фирмы Microsoft +по формату записи ассемблерных текстов - в качестве документации на AS исполь- +зуется документация ассемблера M80. Отличие ассемблера AS от M80 заключается в +том, что у AS отсутствуют некоторые команды M80 (в основном, управление вывода +листингов). + +1. Максимальная длина имен (включающих букву диска и каталоги) файлов + равна 64 символа. + +2. В псевдокоманде NAME('...') можно использовать также двойные (") + кавычки. + +3. Имя include-файла можно указывать без расширения. В этом случае будет + использоваться расширение по-умолчанию ".asm". Это же правило действует + и для входного asm-файла. + +4. Поддерживаются три варианта записи недокументированных регистров: + + HX/XH LX/XL + HY/YH LY/YL + HIX/IXH LIX/IXL + +5. Псевдокоманды "EQU" и "=" идентичны. + +6. Максимальная длина имен глобальных меток, передаваемых в объектный + файл (rel-файл) зависит от режима работы ассемблера: + + 6 символов - при указании опции "-t" + 8 символов - по-умолчанию + 30 символов - при указании опции "-x" (расширенный rel-формат) + + Следует отметить, что с объектными файлами расширенного rel-формата не + работает библиотекарь. Поэтому при компиляции библиотечных файлов, не + следует ассемблеру указывать опцию "-x". + +7. Коды возврата ассемблера: + + 00h - Ok + 0FFh - были errors/warnings, ошибки выделения памяти + или работы с файлами. + + + + ЛИНКЕР + +При линковке готовых си-программ, собираемых с библиотекой "clib.irl" необхо- +димо всегда указывать линкеру опцию "/gXMAIN". Она передает управление на +начальный startup-код си-программ. См. исходники библиотеки "clib". + +1. Линкер работает только с именами входных файлов. Указание диска и пути + расположения файлов не поддерживается. + +2. Исправлены фирменные глюки: + a) неверная работа с "@list" файлом + b) не отслеживались запросы на request-файлы + +3. При вставке exe-заголовка, параметры равны: ORG = 4100h, Stack = 0C000h. + (Значение ORG-a может быть изменено опцией "/r"). + +4. Файл "list" - содержит одну ком-строку с агрументами. Отдельные аргументы + могут начинаться с новой строки. В конце файла должна стоять пустая новая + строка. Кол-во читаемых байт ограничено до 256 байт. + +5. Поиск библы: сперва файл *.irl, после *.rel. Если не найден, выдается + сообщение ошибки: "файл *.rel не найден". + +6. Максимальная длина имен идентификаторов - 30 символов. + +7. Метки вида ?labels не выводятся в sym-файл и на экран. Становятся + "видимыми" только при опции /Q. + +8. Отслеживается превышение размера 16kB для dll-библиотек (выдается + предупреждение). + +9. Коды возврата линкера: + + 00h - Ok + 0FFh - были ошибки выделения памяти или работы с файлами. + + + + БИБЛИОТЕКАРЬ + +1. Тип открываемого входного файла отслеживается не по его расширению, +а по внутреннему содержимому. + +2. При создании библиотеки: если имя библиотеки совпадает с именем входного +файла, то необходимо указать расширение библиотеки, чтобы не было двойного +добавления файлов. В именах rel-файлов расширение можно не указывать. Имена +добавляемых файлов разделяются пробелами или запятыми. + +3. Глобальные символы "*" и "?" поддерживаются только для режима извлечения +модулей (опция "e"). В остальных режимах необходимо указывать реальное имя +файла. + +4. Задание пути поддерживается только для файла библиотеки. Для rel-файлов +указание пути не поддерживается и используется путь расположения библиотеки. + +5. В опции l(ist) (список модулей библиотеки), размеры "Code size: ..." и +"Data size: ..." выводятся в десятичном формате. + +6. В опциях d(ump) и l(ist) вывод на экран можно остановить/продолжить при +нажатии на любую клавишу. При нажатии на Esc - выход из режима. + +7. Коды возврата библиотекаря: + + 00h - Ok + 0FFh - были ошибки работы или операций с файлами. diff --git a/third_party/solid-c/DOC/REL.RUS b/third_party/solid-c/DOC/REL.RUS new file mode 100644 index 0000000..1201a93 --- /dev/null +++ b/third_party/solid-c/DOC/REL.RUS @@ -0,0 +1,137 @@ +Последняя редакция: 7.05.2004 + + + ФОРМАТ REL-СОВМЕСТИМЫХ ОБЪЕКТНЫХ ФАЙЛОВ + + + Объектные файлы REL-формата фирмы Microsoft, представляют собой битовый +поток. Отдельные поля в битовом потоке не выровнены на границу байта, +кроме элементов, описанных ниже. + Использование битового потока для объектных файлов уменьшает их размер, +сводя к минимуму число обращений к диску для чтения/записи данных. + + Имеются два основных типа: Абсолютный и Перемещаемый. Первый бит служит +индикатором типов. Если он равен 0, следующие 8 бит загружаются как абсо- +лютный байт. Если первый бит равен 1, следующие 2 бита определяют 4 типа: + + 00b Спец-элемент (описание ниже). + + 01b Перемещаемый Код. Значение следующих 16 бит (2 байта) + необходимо прибавить с текущему значению счетчика адреса + Кода. + + 10b Перемещаемые Данные. Значение следующих 16 бит (2 байта) + необходимо прибавить с текущему значению счетчика адреса + Данных. + + 11b Перемещаемая Общая область (код+данные). Значение следующих + 16 бит (2 байта) необходимо прибавить с текущему значению + счетчика адреса Common-области. + + +Спец-элемент(ы) содержит: + + ■ контр. поле из 4-х бит номеров элементов 0..15. + + ■ не обязательное A-поле. Содержит 2 бита типа адресации cseg, + dseg,common (кроме абсолютного) и 2 (4 у extended REL) байта + значения. + + ■ не обязательное B-поле. Содержит 3 бита (5 у extended REL) + длины имени и самого имени идентификатора. + + +Общее представление спец-элемента: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 1 00b xxx yy nnnn mmmm zzz + имя идентификатора + -------------- ------------------------ + A-поле B-поле + + xxx 4 бита контр. поля (0..15 номера элементов, см. ниже) + + yy 2 бита типа адресации (cseg/dseg/common) + nnnn 16 бит значения (адрес) + mmmm 16 бит дополнительно, при расширенном REL-формате + + zzz 3 бита длины имени (5 бит при расш. REL-формате) + ... имя идентификатора + + +Номера элементов контрольного поля +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Номера элементов только в B-поле: + + 0 - имя метки, на которую имеется ссылка + 1 - имя блока COMMON + 2 - имя прогр. модуля (program name) + 3 - request-имя файла (request library search) + 4 - элемент расширения. См. примечание. + +Номера элементов в A-поле и B-поле: + + 5 - размер COMMON (элемент только для A-поля ?) + 6 - внешняя цепочка: + для A-поля: адрес головной цепочки + для B-поля: внешнее имя + 7 - точка входа метки: + для A-поля: адрес располож. метки + для B-поля: имя метки + +Номера элементов только в A-поле: + + 8 - External - offset. Used for JMP and CALL to externals. + 9 - External + offset. The A value will be added to the two + bytes starting at the current location counter immediately + before execution. + 10 - размер области Данных. + 11 - счетчик памяти сегмента (ORG cseg/dseg/common). + 12 - адрес цепочки. A is head of chain, replace all entries + in chain with current location counter. + Вход последней цепочки имеет нулевой адрес. + 13 - размер области Кода. + 14 - конец программного модуля (end program), далее идет + выравнивание до границы байта. + +Этот элемент не содержит ни A-поле, ни B-поле: + + 15 - конец файла + + +Примечание по элементу расширения: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +C-поле элемента расширения имеет формат B-поля спец-элемента, но область +имени не содержит имя идентификатора, как в B-поле. Вместо него здесь +находится один байт типа (сигнатура) элемента расширения, далее следует +от 1 до 7 байт дополнительной информации. + +Таким образом, каждый элемент расширения имеет формат: + + 1 00b 0100b zzz i jjjjjjjj + ---------------- + C-поле + + zzz любые 3 бита (000b представляется как 8). + (001b у асма SOLID). + + i 8 бит типа (сигнатура) элемента расширения. + (0FEh у асма SOLID). + + jjjjjjjj zzz-1 число байт информации. Значение зависит + от типа i. + + +Это присутствует только в одном элементе расширения: + + zzz 010b (2) + + i X'35' тип (сигнатура) оверлейного сегмента COBOL + + j номер COBOL-сегмента - 31h (цифровой формат номера) + + Когда линкеру встречается сигнатура оверлейного сегмента, текущее число +оверлейных сегментов устанавливается в значение j+31h (симв. формат номера). +Если предварительно существующий номер сегмента не был нулевой и включена +опция /N (сохр. файл с заданным именем), то область данных записывается на +диск в файл. Имя файла равно текущему имени программы, с расширением файла - +Vxx, где "xx" две hex-цифры номера сегмента j+31h (симв. формат номера). diff --git a/third_party/solid-c/DOC/REL.TXT b/third_party/solid-c/DOC/REL.TXT new file mode 100644 index 0000000..e5067f2 --- /dev/null +++ b/third_party/solid-c/DOC/REL.TXT @@ -0,0 +1,129 @@ + 4.3 FORMAT OF LINK COMPATIBLE OBJECT FILES + + + NOTE + + Section 4.3 is interesting + material for users who wish to + know the load format of LINK-80 + relocatable object files. Most + users will want to skip this + section, as it does not contain + material neccessary to the + operation of the package. + + + LINK-compatible object files consist of a bit stream. Individual fields + within the bit stream are not aligned on byte boundaries, except as + noted below. Use of a bit stream for relocatable object files keeps the + size of object files to a minimum, thereby decreasing the number of + disk reads/writes. + + There are two basic types of load items: Absolute and Relocatable. The + first bit of an item indicates one of these two types. If the first bit + is a 0, the following 8 bits are loaded as an absolute byte. If the + first bit is a 1, the next 2 bits are used to indicate one of four + types of relocatable items: + + 00 Special LINK item (see below). + + 01 Program Relative. Load the following 16 bits + after adding the current Program base. + + 10 Data Relative. Load the following 16 bits after + adding the current Data base. + + 11 Common relative. Load the following 16 bits + after adding the current Common base. + + Special LINK items consist of the bit stream 100 followed by: + + a four-bit control field + + an optional A field consisting of a two-bit address type + that is the same as the two-bit field above except 00 + specifies absolute address + + an optional B field consisting of 3 bits that give a + symbol length and up to 8 bits for each character of the + symbol + + A general representation of a special LINK item is: + + 1 00 xxxx yy nn zzz + characters of symbol name + -------- --------------------------------- + A field B field + + xxxx Fout-bit control field (0-15 below) + yy Two-bit address type field + nn Sixteen-bit value + zzz Three-bit symbol length field + + The following special types have a B-field only: + + 0 Entry symbol (name for search) + 1 Select COMMON block + 2 Program name + 3 Request library search + 4 Extension LINK items (see below) + + The following special LINK items have both an A field and a B field: + + 5 Define COMMON size + 6 Chain external (A is head of address chain, B is name of + external symbol) + 7 Define entry point (A is address, B is name) + + The following special LINK items have an A field only: + + 8 External - offset. Used for JMP and CALL to externals + 9 External + offset. The A value will be added to the two + bytes starting at the current location counter + immediately before execution. + 10 Define size of Data area (A is size) + 11 Set loading location counter to A + 12 Chain address. A is head of chain, replace all entries + in chain with current location counter. The last entry + in the chain has an address field of absolute zero + 13 Define program size (A is size) + 14 End program (forces to byte boundary) + + The following special LINK item has neither an A nor a B field: + + 15 End file + + An Extension LINK item follows the general format of a B-field-only + special LINK item, but contents of the B-field are not a symbol name. + Instead, the symbol area contains one character to identify the type of + Extension LINK item, followed by from 1 to 7 characters of additional + information. + + Thus, every Extension LINK item has the format: + + 1 00 0100 zzz i jjjjjjjj + + where + + zzz may be any three bit integer (with 000 representing 8), + + i is an eight bit Extension LINK item type indentifier, + and + + jjjjjjjj are zzz-1 eight bit character of information whose + significance depends on i + + At present, there is only one Extension LINK item: + + i = X'35' COBOL overlay segment sentinel + + zzz = 010 (binary) + + j = COBOL segment number -49 (decimal) + + When the overlay segment sentinal is encountered by the linker, + the current overlay segment number is set to the value of j+49. If + the previously existing segment number was non-zero and a /N + switch is in effect, the data area is written to disk in a file + whose name is the current program name and whose extension is Vnn, + where nn are the two hexadecimal digits representing the number + j+49 (decimal). diff --git a/third_party/solid-c/EXAMPLES/ATEXIT.C b/third_party/solid-c/EXAMPLES/ATEXIT.C new file mode 100644 index 0000000..8862704 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/ATEXIT.C @@ -0,0 +1,28 @@ +#include + +void func1(); +void func2(); + +void main() +{ + atexit(func1); // "Exit Function 1 called" + atexit(func2); // "Exit Function 2 called" + printf("\tMain quitting ...\n"); + +/* + * 뢥: + * Main quitting ... + * Exit Function 2 called ... + * Exit Function 1 called ... + */ +} + +void func1() +{ + printf("\tExit Function 1 called ...\n"); +} + +void func2() +{ + printf("\tExit Function 2 called ...\n"); +} diff --git a/third_party/solid-c/EXAMPLES/BIN2C.C b/third_party/solid-c/EXAMPLES/BIN2C.C new file mode 100644 index 0000000..f49760c --- /dev/null +++ b/third_party/solid-c/EXAMPLES/BIN2C.C @@ -0,0 +1,98 @@ +/* + * BIN2C V1.0 CODED BY CHRISTIAN PADOVANO ON 17-MAY-1995 + * + * this little utility translates a binary file in a useful C structure + * that can be included in a C source. + */ + +#include +#include +#include +#include + + +#define BUF_LEN 1 +#define LINE 9 + +FILE *fp, *fp1; +f_point *pos; + + + +/* lower chars --> upper chars */ +void upper_chars(buff) +char *buff; +{ + char c; + for(c=0; c <= strlen(buff)-1; c++) + *(buff+c) = toupper(*(buff+c)); +} + + +void main(argc, argv) +int argc; +char *argv[]; +{ + char buffer[BUF_LEN], dummy[20]; + char c; + + if((argc < 4)) + { + puts("- <<< BIN2C V1.0 >>> by Christian Padovano -\n"); + puts("Usage: Bin2C \n"); + puts(" = name of the C structure in the destination file name"); + puts(" = without extension '.h' it will be added by program"); + exit(0); + } + + if((fp=fopen(argv[1], "rb")) == NULL) + { + cprintf("ERROR: I can't find source file %s\n", argv[1]); + exit(1); + } + + strcpy(dummy, argv[2]); + strcat(dummy, ".H"); /* add suffix .h to target name */ + + if((fp1=fopen(dummy, "w+")) == NULL) + { + cprintf("ERROR: I can't open destination file %s\n", dummy); + exit(1); + } + + strcpy(dummy, argv[3]); + upper_chars(dummy); /* lower to upper chars */ + strcat(dummy, "_LEN"); /* add the suffix _LEN to the struct name */ + /* for the #define stantment */ + + /* file size in bytes */ + fseek(fp, 0, 0, SEEK_END); + pos = ftell(fp); + fseek(fp, 0, 0, SEEK_SET); + + /* It writes the header information */ + fprintf(fp1, "#define %s %u\n\n", dummy, pos->low); + fprintf(fp1, " static unsigned char %s[]={\n ", argv[3]); + + if(ferror(fp1)) + { + cprintf("ERROR writing on target file: %s\n", argv[2]); + exit(1); + } + + do { + for(c=0; ((c <= LINE) && (! feof(fp))); c++) + { + fread(buffer, 1, 1, fp); + fprintf(fp1,"0x%02X", (char *) *buffer); + if(! feof(fp)) + fputc(',', fp1); + } + fprintf(fp1,"\n "); + } while(! feof(fp)); + + fprintf(fp1,"};\n"); + + fclose(fp); + fclose(fp1); +} diff --git a/third_party/solid-c/EXAMPLES/CLOSE.C b/third_party/solid-c/EXAMPLES/CLOSE.C new file mode 100644 index 0000000..8ac5c94 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/CLOSE.C @@ -0,0 +1,10 @@ +#include + +FD fd; + +void main() +{ + fd = open("test.txt", O_RDONLY); + if((close(fd)) == -1) + perror("close failed on file"); +} diff --git a/third_party/solid-c/EXAMPLES/CPRINTF.C b/third_party/solid-c/EXAMPLES/CPRINTF.C new file mode 100644 index 0000000..101aa55 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/CPRINTF.C @@ -0,0 +1,6 @@ +#include + +void main() +{ + cprintf("Hello, world!\n"); +} diff --git a/third_party/solid-c/EXAMPLES/CPUTS.C b/third_party/solid-c/EXAMPLES/CPUTS.C new file mode 100644 index 0000000..e0f07d2 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/CPUTS.C @@ -0,0 +1,8 @@ +#include + +char *buffer = "Insert data disk in drive A:\n"; + +void main() +{ + cputs(buffer); +} diff --git a/third_party/solid-c/EXAMPLES/CREAT.C b/third_party/solid-c/EXAMPLES/CREAT.C new file mode 100644 index 0000000..41fe19e --- /dev/null +++ b/third_party/solid-c/EXAMPLES/CREAT.C @@ -0,0 +1,12 @@ +#include + +FD fd; + +void main() +{ + fd = creat("test.txt", O_RDWR | O_CREAT); + if(fd == -1) + perror("create failed on file"); + else + close(fd); +} diff --git a/third_party/solid-c/EXAMPLES/FCLOSE.C b/third_party/solid-c/EXAMPLES/FCLOSE.C new file mode 100644 index 0000000..1f65dcb --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FCLOSE.C @@ -0,0 +1,10 @@ +#include + +FILE *fp; + +void main() +{ + fp = fopen("test.txt", "r"); + if((fclose(fp)) == -1) + perror("close failed on file"); +} diff --git a/third_party/solid-c/EXAMPLES/FDOPEN.C b/third_party/solid-c/EXAMPLES/FDOPEN.C new file mode 100644 index 0000000..2ebe80e --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FDOPEN.C @@ -0,0 +1,21 @@ +#include +#include + +FILE *fp; +FD fd; + +main() +{ + fd = open("test.txt", O_WRONLY); + if(fd == -1) + fprintf(stderr, "File test.txt not found\n"); + + fp = fdopen(fd, "a"); + if(fp == NULL) + fprintf(stderr, "Errors in function fdopen\n"); + else + { + fprintf(fp, "Hello, world !\n"); + fclose(fp); + } +} diff --git a/third_party/solid-c/EXAMPLES/FEOF.C b/third_party/solid-c/EXAMPLES/FEOF.C new file mode 100644 index 0000000..be54829 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FEOF.C @@ -0,0 +1,28 @@ + FEOF + +#include  㭪樨 +int feof(FILE *fp); + + 㭪 (ॠ ) ।, ⨣ - + 䠩. ᫨ 䠩 (EOF) ⨣, ⠭ 㯭묨 +樨 ⥭, .. 樨 ⥭, 㤥 ਧ- + 䠩, 䠩 㤥 맢 㭪樨 rewind, +fsetpos, fseek clearerr. +᫨ ⥪  殬 䠩 (EOF), 㭪 頥 - + 祭. ᫨ ⥪  殬 䠩 - - + 祭 0. 㭪 feof 訡 頥. + +#include +FILE *fp; +main() +{ + if((fp=fopen("file.dat", "r")) == NULL) + { + printf("訡 䠩\n"); + exit(1); + } + while(!feof(fp)) + fgetc(fp); + printf("\n ⠭, ⨫ EOF\n"); + fclose(fp); +} diff --git a/third_party/solid-c/EXAMPLES/FERROR.C b/third_party/solid-c/EXAMPLES/FERROR.C new file mode 100644 index 0000000..e50920f --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FERROR.C @@ -0,0 +1,22 @@ + 㭪 ferror ஢ 訡 ⥭ 䠩. + 訡, 訡 䠩 fp ⠥ - + , 䠩 ஥ 맢 +㭪樨 rewind clearerr. + 砥 㦥 訡 䠩, 㭪 ferror 頥 - + 祭. 頥 祭 0 ᢨ⥫ ⢨ +訡. + + +#include +FILE *fp; +char *string; + + /* ᫥騩 ਬ 䠩 ஢, + 訡 . । + 䠩, ।⥫쭮 . */ + fprintf(fp, "%s\n", string); + if(ferror(fp)) + { + fprintf(stderr, "Write error\n"); + clearerr(fp); + } diff --git a/third_party/solid-c/EXAMPLES/FFIRST.C b/third_party/solid-c/EXAMPLES/FFIRST.C new file mode 100644 index 0000000..e626627 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FFIRST.C @@ -0,0 +1,16 @@ +#include +#include + +FIND p; +char done; + +void main() +{ + printf("List of directory: *.*\n"); + done = ffirst("*.*", &p, FA_NORMAL | FA_ARCH | FA_DIREC); + while(!done) + { + printf("%s\n", p.ff_name); + done = fnext(&p); + } +} diff --git a/third_party/solid-c/EXAMPLES/FGETPOS.C b/third_party/solid-c/EXAMPLES/FGETPOS.C new file mode 100644 index 0000000..9bc26d4 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FGETPOS.C @@ -0,0 +1,20 @@ +#include + +void main() +{ + FILE *fp; + fpos_t position; + char buffer[80]; + + fp = fopen("test.txt", "r"); + if(fp != NULL) + { + fgetpos(fp, &position); /* get position */ + fgets(buffer, 80, fp); /* read record */ + fsetpos(fp, &position); /* set position */ + fgets(buffer, 80, fp); /* read same record */ + fclose(fp); /* close file */ + } + else + printf("can't open file\n"); +} diff --git a/third_party/solid-c/EXAMPLES/FNEXT.C b/third_party/solid-c/EXAMPLES/FNEXT.C new file mode 100644 index 0000000..dbd6378 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FNEXT.C @@ -0,0 +1,16 @@ +#include +#include + +struct ffblk p; +char done; + +void main() +{ + printf("List of directory: *.*\n"); + done = findfirst("*.*", &p, FA_NORMAL | FA_ARCH | FA_DIREC); + while(!done) + { + printf("%s\n", p.ff_name); + done = findnext(&p); + } +} diff --git a/third_party/solid-c/EXAMPLES/FOPEN.C b/third_party/solid-c/EXAMPLES/FOPEN.C new file mode 100644 index 0000000..c44b689 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FOPEN.C @@ -0,0 +1,14 @@ +#include + +FILE *fp; + +void main(argc, argv) +int argc; +char *argv[]; +{ + if((fp=fopen(argv[0], "r")) == NULL) + { + fprintf(stderr,"can't open file: %s\n", argv[0]); + exit(1); + } +} diff --git a/third_party/solid-c/EXAMPLES/FPRINTF.C b/third_party/solid-c/EXAMPLES/FPRINTF.C new file mode 100644 index 0000000..0f099ad --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FPRINTF.C @@ -0,0 +1,11 @@ +#include + +FILE *fp; +char *s = "This is string."; + +void main() +{ + fp = fopen("test.txt", "w"); + fprintf(fp,"%s",s); + fclose(fp); +} diff --git a/third_party/solid-c/EXAMPLES/FREOPEN.C b/third_party/solid-c/EXAMPLES/FREOPEN.C new file mode 100644 index 0000000..f19c019 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FREOPEN.C @@ -0,0 +1,21 @@ +#include + +FILE *fp; +char *s = "Hello, world ! ;)"; + +main() +{ + fp = fopen("test.txt", "r"); + if(fp == NULL) + fprintf(stderr, "File test.txt not found\n"); + + fp = freopen("file.dat", "w+", fp); + if(fp == NULL) + fprintf(stderr, "Errors in function freopen\n"); + else + { + fprintf(stderr, "Now data will go in file.dat\n"); + fprintf(fp, "%s\n", s); + } + fclose(fp); +} diff --git a/third_party/solid-c/EXAMPLES/FSEEK.C b/third_party/solid-c/EXAMPLES/FSEEK.C new file mode 100644 index 0000000..054258e --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FSEEK.C @@ -0,0 +1,17 @@ +#include + +FILE *fp; +f_point *pos; + +void main() +{ + fp=fopen("test.txt", "r"); + + pos->high = 0; + pos->low = 20; + + if((pos=fseek(fp, pos->high, pos->low, SEEK_SET)) == -1) + printf("訡 ६饭\n"); + fprintf(stdout,"\n%04X %04X", pos->high, pos->low); + fclose(fp); +} diff --git a/third_party/solid-c/EXAMPLES/FSETPOS.C b/third_party/solid-c/EXAMPLES/FSETPOS.C new file mode 100644 index 0000000..9bc26d4 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FSETPOS.C @@ -0,0 +1,20 @@ +#include + +void main() +{ + FILE *fp; + fpos_t position; + char buffer[80]; + + fp = fopen("test.txt", "r"); + if(fp != NULL) + { + fgetpos(fp, &position); /* get position */ + fgets(buffer, 80, fp); /* read record */ + fsetpos(fp, &position); /* set position */ + fgets(buffer, 80, fp); /* read same record */ + fclose(fp); /* close file */ + } + else + printf("can't open file\n"); +} diff --git a/third_party/solid-c/EXAMPLES/FTELL.C b/third_party/solid-c/EXAMPLES/FTELL.C new file mode 100644 index 0000000..3f19d16 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/FTELL.C @@ -0,0 +1,18 @@ +#include + +FILE *fp; +f_point *pos; + +void main() +{ + fp=fopen("test.txt", "r"); + + pos->high = 0; + pos->low = 20; + + if((fseek(fp, pos->high, pos->low, SEEK_SET)) == -1) + printf("訡 ६饭\n"); + pos=ftell(fp); + fprintf(stdout,"\n%04X %04X", pos->high, pos->low); + fclose(fp); +} diff --git a/third_party/solid-c/EXAMPLES/HELLO.BAT b/third_party/solid-c/EXAMPLES/HELLO.BAT new file mode 100644 index 0000000..9778389 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/HELLO.BAT @@ -0,0 +1,7 @@ +@echo off +cc1 -m hello.c +cc2 hello.tmc +as hello.asm +ld hello,clib/l/gXMAIN /x +del hello.rel +del hello.asm diff --git a/third_party/solid-c/EXAMPLES/HELLO.C b/third_party/solid-c/EXAMPLES/HELLO.C new file mode 100644 index 0000000..4e67d84 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/HELLO.C @@ -0,0 +1,9 @@ +#include + + +main() +{ + printf("\nHello world !\n"); + fprintf(stdout,"ਢ !\n"); +// fprintf(stderr,"ਢ !\n"); +} diff --git a/third_party/solid-c/EXAMPLES/INTDOS.C b/third_party/solid-c/EXAMPLES/INTDOS.C new file mode 100644 index 0000000..d8500c2 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/INTDOS.C @@ -0,0 +1,15 @@ +#include +#include + +union REGS inregs, outregs; + +void main() +{ + /* ᫥騥 롨 ⥪ , + ᯮ 맮 㭪樨 DOS 21h. */ + inregs.h.c = 0x21; + intdos(&inregs, &outregs); + cprintf("date is %02d/%02d/%04d\n", outregs.h.d, + outregs.h.e, + outregs.x.ix); +} diff --git a/third_party/solid-c/EXAMPLES/LSEEK.C b/third_party/solid-c/EXAMPLES/LSEEK.C new file mode 100644 index 0000000..1bd85ca --- /dev/null +++ b/third_party/solid-c/EXAMPLES/LSEEK.C @@ -0,0 +1,19 @@ +#include +#include + +FD fd; +f_point *pos; + +void main() +{ + + fd=open("test.txt", O_RDONLY); + + pos->high = 0; + pos->low = 10; + + if((pos=lseek(fd, pos->high, pos->low, SEEK_SET)) == -1) + printf("訡 ६饭\n"); + printf("\n%04X %04X", pos->high, pos->low); + close(fd); +} diff --git a/third_party/solid-c/EXAMPLES/LTELL.C b/third_party/solid-c/EXAMPLES/LTELL.C new file mode 100644 index 0000000..9d7c87d --- /dev/null +++ b/third_party/solid-c/EXAMPLES/LTELL.C @@ -0,0 +1,20 @@ +#include +#include + +FD fd; +f_point *pos; + +void main() +{ + + fd=open("test.txt", O_RDONLY); + + pos->high = 0; + pos->low = 10; + + if((lseek(fd, pos->high, pos->low, SEEK_SET)) == -1) + printf("訡 ६饭\n"); + pos=ltell(fd); + printf("\n%04X %04X", pos->high, pos->low); + close(fd); +} diff --git a/third_party/solid-c/EXAMPLES/LZH3.C b/third_party/solid-c/EXAMPLES/LZH3.C new file mode 100644 index 0000000..367fe44 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/LZH3.C @@ -0,0 +1,601 @@ +/************************************************************** + lzhuf.c + written by Haruyasu Yoshizaki 11/20/1988 + some minor changes 4/6/1989 + comments translated by Haruhiko Okumura 4/7/1989 + + MSX-C PROFI adaptation by MaxWolf, Aug-Sep 1992 + EOF bugfix 1st April 1993 + + : + cc1 -m -c lzh3.c + cc2 lzh3 +**************************************************************/ + + +#define EOF (-1) + +int getc(), putc(); +char encount(), deinc(), decount(), memmove(); + +#pragma nonrec + + +/********** LZSS compression *************/ + +#define N 4096 /* ࠧ */ +#define F 60 /* ।⥫ ࠧ */ +#define THRESHOLD 2 +#define NIL N /* ॢ */ + + +extern char text_buf[N + F - 1]; +static int matchposition, matchlength; +extern int lson[N + 1], rson[N + 257], dad[N + 1]; + + + +/* 樠 ॢ() */ +static int InitTree() +{ + int *i, n; + + for(i = &rson[N + 1], n = 256; n--;) + *i++ = NIL; /* ७ */ + for(i = dad, n = N; n--;) + *i++ = NIL; /* 㧥 */ +} + + +/* (⠢) ॢ */ +static int InsertNode(r) +int r; +{ + int i, p, cmp; + char *key; + unsigned c; + + cmp = 1; + key = &text_buf[r]; + p = N + 1 + (int)key[0]; + rson[r] = lson[r] = NIL; + matchlength = 0; + for (;;) { + if (cmp >= 0) { + if (rson[p] != NIL) + p = rson[p]; + else { + rson[p] = r; + goto i1; + } + } else { + if (lson[p] != NIL) + p = lson[p]; + else { + lson[p] = r; +i1: dad[r] = p; + return; + } + } + for (i = 1; i < F; i++) + if ((cmp = (int)key[i] - (int)text_buf[p + i]) != 0) + break; + if (i > THRESHOLD) { + if (i > matchlength) { + matchposition = ((r - p) & (N - 1)) - 1; + if ((matchlength = i) >= F) + break; + } + if (i == matchlength) { + if ((c = ((r - p) & (N - 1)) - 1) < matchposition) { + matchposition = c; + } + } + } + } + dad[r] = dad[p]; + dad[ lson[r] = lson[p] ] = r; + dad[ rson[r] = rson[p] ] = r; + if (rson[ i = dad[p] ] == p) + rson[i] = r; + else + lson[i] = r; + dad[p] = NIL; /* 㤠 p */ +} + + +/* 㤠 ॢ */ +static int DeleteNode(p) int p; +{ + int q, i; + + if (dad[p] == NIL) + return; /* not registered */ + if (rson[p] == NIL) + q = lson[p]; + else + if (lson[p] == NIL) + q = rson[p]; + else { + q = lson[p]; + if (rson[q] != NIL) { + do { + q = rson[q]; + } while (rson[q] != NIL); + dad[ rson[dad[q]] = lson[q] ] = dad[q]; + ; + dad[ lson[q] = lson[p] ] = q; + } + dad[ rson[q] = rson[p] ] = q; + } + if (rson[ i = dad[q] = dad[p] ] == p) + rson[i] = q; + else + lson[i] = q; + dad[p] = NIL; +} + + + +/* ஢ 䬠 */ + +#define N_CHAR (256 - THRESHOLD + F) + /* kinds of characters (character code = 0..N_CHAR-1) */ +#define T (N_CHAR * 2 - 1) /* ࠧ ⠡ */ +#define R (T - 1) /* */ +#define MAX_FREQ 0x8000 /* updates tree when the */ + /* root frequency comes to this value */ +typedef char uchar; + + + +/* ஢ ஢ 6- 孨 (upper) 樨 */ + +/* ஢ */ +static uchar p_len[64] = { + 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 +}; + +static uchar p_code[64] = { + 0x00, 0x20, 0x30, 0x40, 0x50, 0x58, 0x60, 0x68, + 0x70, 0x78, 0x80, 0x88, 0x90, 0x94, 0x98, 0x9C, + 0xA0, 0xA4, 0xA8, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC, + 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, + 0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA, 0xDC, 0xDE, + 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + + +/* ஢ */ +static uchar d_code[256] = { + 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, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, + 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, + 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, + 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, + 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, + 0x18, 0x18, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, + 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F, + 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, + 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, + 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, + 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, +}; + +static uchar d_len[256] = { + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, +}; + + +extern unsigned freq[T + 1]; /* ⠡ */ + +extern int prnt[T + N_CHAR]; /* pointers to parent nodes, except for the */ + /* elements [T..T + N_CHAR - 1] which are used to get */ + /* the positions of leaves corresponding to the codes. */ + +extern int son[T]; /* pointers to child nodes (son[], son[] + 1) */ + +static unsigned getbuf; +static uchar getlen; + + +#define GetBit() _GetBit((char)0) +#define GetByte() _GetBit((char)1) + + + +/* /ᥬ */ +/* get one/eight bit(s) */ +static int _GetBit(f) +char f; +{ + unsigned i; + + while (getlen <= 8) { + if ((int)(i = getc()) == EOF) break; /* i = 0; */ + getbuf |= i << (8 - getlen); + getlen += 8; + } + i = getbuf; + if (f) { + getbuf <<= 8; + getlen -= 8; + return i >> 8; + } else { + getbuf <<= 1; + --getlen; + return ((int)i < 0); + } +} + + +/*int GetByte() +{ + unsigned i; + + while (getlen <= 8) { + if ((i = getc()) == EOF) i = 0; + getbuf |= i << (8 - getlen); + getlen += 8; + } + i = getbuf; + getbuf <<= 8; + getlen -= 8; + return i >> 8; +}*/ + + +static unsigned putbuf; +static uchar putlen; + + +static int Putcode(l,c) int l;unsigned c; /* output c bits of code */ +{ + putbuf |= c >> putlen; + if ((putlen += l) >= 8) { + putc(putbuf >> 8); + if ((putlen -= 8) >= 8) { + putc(putbuf); + putlen -= 8; + putbuf = c << (l - putlen); + } else { + putbuf <<= 8; + } + } +} + + +/* initialization of tree */ + +static int StartHuff() +{ + int i, j; + + for (i = 0; i < N_CHAR; i++) { + freq[i] = 1; + son[i] = i + T; + prnt[i + T] = i; + } + i = 0; j = N_CHAR; + while (j <= R) { + freq[j] = freq[i] + freq[i + 1]; + son[j] = i; + prnt[i] = prnt[i + 1] = j; + i += 2; j++; + } + freq[T] = 0xFFFF; + prnt[R] = 0; +} + + +/* reconstruction of tree */ + +static int reconst() +{ + int i, j, k; + unsigned f, l; + + /* collect leaf nodes in the first half of the table */ + /* and replace the freq by (freq + 1) / 2. */ + j = 0; + for (i = 0; i < T; i++) { + if (son[i] >= T) { + freq[j] = (freq[i] + 1) / 2; + son[j] = son[i]; + j++; + } + } + /* begin constructing tree by connecting sons */ + for (i = 0, j = N_CHAR; j < T; i += 2, j++) { + k = i + 1; + f = freq[j] = freq[i] + freq[k]; + for (k = j - 1; f < freq[k]; k--); + k++; + l = (j - k) * 2; + memmove(&freq[k + 1], &freq[k], l); + freq[k] = f; + memmove(&son[k + 1], &son[k], l); + son[k] = i; + } + /* connect prnt */ + for (i = 0; i < T; i++) { + if ((k = son[i]) >= T) { + prnt[k] = i; + } else { + prnt[k] = prnt[k + 1] = i; + } + } +} + + + +/* increment frequency of given code by one, and update tree */ + +static int update(c) int c; +{ + int i, j, k, l; + + if (freq[R] == MAX_FREQ) { + reconst(); + } + c = prnt[c + T]; + do { + k = ++freq[c]; + + /* if the order is disturbed, exchange nodes */ + if (k > freq[l = c + 1]) { + while (k > freq[++l]); + l--; + freq[c] = freq[l]; + freq[l] = k; + + i = son[c]; + prnt[i] = l; + if (i < T) prnt[i + 1] = l; + + j = son[l]; + son[l] = i; + + prnt[j] = c; + if (j < T) prnt[j + 1] = c; + son[c] = j; + + c = l; + } + } while ((c = prnt[c]) != 0); /* repeat up to root */ +} + + +static EncodeChar(c) unsigned c; +{ + unsigned i; + int j, k; +#ifdef DEBUG + printf("char[%x]\n",c); +#endif + i = j = 0; + k = prnt[c + T]; + + /* travel from leaf to root */ + do { + i >>= 1; + + /* if node's address is odd-numbered, choose bigger brother node */ + if (k & 1) i += 0x8000; + + j++; + } while ((k = prnt[k]) != R); + Putcode(j, i); + update(c); +} + + +static EncodePosition(c) unsigned c; +{ + unsigned i; +#ifdef DEBUG + printf("pos[%x]\n",c); +#endif + /* output upper 6 bits by table lookup */ + i = c >> 6; + Putcode((int)p_len[i], (unsigned)p_code[i] << 8); + + /* output lower 6 bits verbatim */ + Putcode(6, (c & 0x3f) << 10); +} + + +static EncodeEnd() +{ + if (putlen) { + putc(putbuf >> 8); + } +} + + +static int DecodeChar() +{ + unsigned c; + + c = son[R]; + + /* travel from root to leaf, */ + /* choosing the smaller child node (son[]) if the read bit is 0, */ + /* the bigger (son[]+1} if 1 */ + while (c < T) { + c += GetBit(); + c = son[c]; + } + c -= T; + update(c); +#ifdef DEBUG + printf("char[%x]\n",c); +#endif + return c; +} + + +static int DecodePosition() +{ + unsigned i, j, c; + + /* recover upper 6 bits from table */ + i = GetByte(); + c = (unsigned)d_code[i] << 6; + j = d_len[i] - 2; + + /* read lower 6 bits verbatim */ + while (j--) { + i = (i << 1) + GetBit(); + } + c |= (i & 0x3F); +#ifdef DEBUG + printf("pos[%x]\n",c); +#endif + return c; +} + + +/*-- /ᯠ --*/ + +/* */ +char Encode() +{ + int i, c, len, r, s, last_matchlength; + + StartHuff(); + InitTree(); + putbuf = putlen = 0; + s = 0; + r = N - F; + for (i = s; i < r; i++) + text_buf[i] = ' '; + for (len = 0; len < F && (c = getc()) != EOF; len++) + text_buf[r + len] = c; + encount(len); + for (i = 1; i <= F; i++) + InsertNode(r - i); + InsertNode(r); + do { + if (matchlength > len) + matchlength = len; + if (matchlength <= THRESHOLD) { + matchlength = 1; + EncodeChar((int)text_buf[r]); + } else { + EncodeChar(255 - THRESHOLD + matchlength); + EncodePosition(matchposition); + } + last_matchlength = matchlength; + for (i = 0; i < last_matchlength && + (c = getc()) != EOF; i++) { + DeleteNode(s); + text_buf[s] = c; + if (s < F - 1) + text_buf[s + N] = c; + s = (s + 1) & (N - 1); + r = (r + 1) & (N - 1); + InsertNode(r); + } + encount(i); + while (i++ < last_matchlength) { + DeleteNode(s); + s = (s + 1) & (N - 1); + r = (r + 1) & (N - 1); + if (--len) InsertNode(r); + } + } while (len > 0); + EncodeEnd(); +} + + +/* ᯠ */ +char Decode() +{ + int i, j, k, r, c; + + StartHuff(); + getbuf = getlen = 0; + for (i = 0; i < N - F; i++) + text_buf[i] = ' '; + r = N - F; + while (decount() || getlen) { + c = DecodeChar(); + if (c < 256) { + putc(c); + text_buf[r++] = c; + r &= (N - 1); + deinc(); + } else { + i = (r - DecodePosition() - 1) & (N - 1); + j = c - 255 + THRESHOLD; + for (k = 0; k < j; k++) { + c = text_buf[(i + k) & (N - 1)]; + putc(c); + text_buf[r++] = c; + r &= (N - 1); + deinc(); + } + } + } +} diff --git a/third_party/solid-c/EXAMPLES/MSSTAT.C b/third_party/solid-c/EXAMPLES/MSSTAT.C new file mode 100644 index 0000000..04d258d --- /dev/null +++ b/third_party/solid-c/EXAMPLES/MSSTAT.C @@ -0,0 +1,19 @@ +#include +#include + +MSSTAT *p; + +void main() +{ + initMouse(); + showMouse(); + + while(!kbhit()) + { + p = getStatMouse(); + cprintf("BUTTON: %d Col: %02d Line: %02d\r", + (char *)p->button, + (char *)p->x, + (char *)p->y); + } +} diff --git a/third_party/solid-c/EXAMPLES/MS_GSEN.C b/third_party/solid-c/EXAMPLES/MS_GSEN.C new file mode 100644 index 0000000..a4108d8 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/MS_GSEN.C @@ -0,0 +1,20 @@ +#include +#include + +void main() +{ + MSSENS *p; + + p = getSensMouse(); + + printf("X: %x Y: %x\n", (char*)p->xsens, (char *)p->ysens); + + p->xsens = 2; + p->ysens = 3; + + setSensMouse(p); + + p = getSensMouse(); + + printf("X: %x Y: %x\n", (char*)p->xsens, (char *)p->ysens); +} diff --git a/third_party/solid-c/EXAMPLES/MS_SSEN.C b/third_party/solid-c/EXAMPLES/MS_SSEN.C new file mode 100644 index 0000000..b3bbd08 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/MS_SSEN.C @@ -0,0 +1,16 @@ +#include +#include + +void main() +{ + MSSENS *p; + + p->xsens = 2; + p->ysens = 3; + + setSensMouse(p); + + p = getSensMouse(); + + printf("X: %x Y: %x\n", (char*)p->xsens, (char *)p->ysens); +} diff --git a/third_party/solid-c/EXAMPLES/OPEN.C b/third_party/solid-c/EXAMPLES/OPEN.C new file mode 100644 index 0000000..552ba03 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/OPEN.C @@ -0,0 +1,12 @@ +#include + +FD fd; + +void main() +{ + fd = open("test.txt", O_RDONLY); + if(fd == -1) + perror("open failed on input file"); + else + close(fd); +} diff --git a/third_party/solid-c/EXAMPLES/PRINTF.C b/third_party/solid-c/EXAMPLES/PRINTF.C new file mode 100644 index 0000000..38e5ff5 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/PRINTF.C @@ -0,0 +1,8 @@ +#include + +int num = 0x07D4; + +void main() +{ + printf("Year: %d\n",num); +} diff --git a/third_party/solid-c/EXAMPLES/README b/third_party/solid-c/EXAMPLES/README new file mode 100644 index 0000000..90c3692 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/README @@ -0,0 +1 @@ +ਬ ᯮ짮 㭪権. diff --git a/third_party/solid-c/EXAMPLES/SEEK.C b/third_party/solid-c/EXAMPLES/SEEK.C new file mode 100644 index 0000000..18711bb --- /dev/null +++ b/third_party/solid-c/EXAMPLES/SEEK.C @@ -0,0 +1,15 @@ +#include +#include + +FD fd; +uint pos,i; + +void main() +{ + fd=open("test.txt", O_RDONLY); + i = 10; + if((pos=seek(fd, i, SEEK_SET)) == -1) + printf("訡 ६饭\n"); + printf("\n%04X",pos); + close(fd); +} diff --git a/third_party/solid-c/EXAMPLES/SORT2.BAT b/third_party/solid-c/EXAMPLES/SORT2.BAT new file mode 100644 index 0000000..805ae40 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/SORT2.BAT @@ -0,0 +1,7 @@ +@echo off +cc1 -m sort2.c +cc2 sort2.tmc +as sort2.asm +ld sort2,clib/l/gXMAIN /x +del sort2.rel +del sort2.asm diff --git a/third_party/solid-c/EXAMPLES/SORT2.C b/third_party/solid-c/EXAMPLES/SORT2.C new file mode 100644 index 0000000..8b660ee --- /dev/null +++ b/third_party/solid-c/EXAMPLES/SORT2.C @@ -0,0 +1,393 @@ +/* +MM> ᬮ, ᥡ, - ᠭ ⮤ +MM> ஢ (quick sort, buble sort, ..). ⠬ ਬ୮ 6 +MM> . ᠭ, ᯮ +MM> ⮬ ᮢ ࠡ. , , url. +MM> ᨡ! + +EI> c pp c, c, c ⮤ +EI> cpp, +EI> 祬 ⥬ , c p p cc + + H. H C (⠬ ᪮쪮 㦭). ᠫ + BC3.1. ।⠢ ᮡ ண ᡮ ⨪ 䥪⨢- + ⬮. + ⨪ :) ( ᠡ ࢮ ). +---------------- +*/ + +#include +#include +#include + +#define SIZE 15 + +/* Prototypes */ +void Binsort(); +void Choise(); +void Include(); +void Bubble(); +void Quick(); +void Shell(); +void Join(); +void Prn(); +void Test(); + +unsigned ITERATION, // ⢮ ன 横 + EXCHANGES, // 祥 + CONDITIONS; // ன ᫮ + +int Mass[SIZE]; + +int i, NumElem; +char key; + + +/* */ +int main() +{ + + NumElem = sizeof(Mass) / sizeof(Mass[0]); + clrscr(); + + do { + for(i=0; i < NumElem; i++) Mass[i] = rand() % 100 - 50; + clrscr(); + puts(":\n"); + puts(" 1. ஢ (⮤ 쪠)"); + puts(" 2. ஢ 롮஬"); + puts(" 3. ஢ 묨 ⠢"); + puts(" 4. ஢ 묨 ⠢ (⠢ )"); + puts(" 5. ஢ ⮤ "); + puts(" 6. ஢ ⮤\n"); + puts(" 7. ﭨ ஢ ᨢ"); + puts(" 8. ந⥫쭮\n"); + puts(" ESC. 室\n\n->"); + if ((key=getch()) == 27) + goto done; + + clrscr(); + if (key >= '0' && key <= '6') + { + cprintf("\nᨢ (ਣ):"); + Prn(Mass, NumElem); + } + + ITERATION=EXCHANGES=CONDITIONS=0; + + switch(key) + { + case '1': Bubble(Mass, NumElem); break; + case '2': Choise(Mass, NumElem); break; + case '3': Include(Mass, NumElem); break; + case '4': Binsort(Mass, NumElem); break; + case '5': Shell(Mass, NumElem); break; + case '6': Quick(Mass, 0, NumElem); break; + case '7': Join(); continue; + case '8': Test(Mass, NumElem); continue; + default : continue; + } + cprintf("\n(஢):"); + Prn(Mass, NumElem); + cprintf("\n\n\n ஢ ॡ 権: %d\n",ITERATION); + cprintf(" ந 祥: %d\n",EXCHANGES); + cprintf(" ன ᫮: %d\n",CONDITIONS); + puts("\n\n\nAny key..."); + getch(); + } while(1); + +done: + puts("\n\nSee you... ;)"); + return 0; +} + + +/*.......................................................................*/ +void Prn(PtrMass, count) +int *PtrMass, count; +{ + int i; + cprintf("\n["); + for (i=0; i < count; i++) + cprintf(" %3d", PtrMass[i]); + puts("]"); +} + + +/*.......................................................................*/ +void Test(PtrMass, count) +int *PtrMass, count; +{ + +uint ITERATION1, EXCHANGES1, CONDITIONS1, ITERATION2, + EXCHANGES2, CONDITIONS2, ITERATION3, EXCHANGES3, + CONDITIONS3, ITERATION4, EXCHANGES4, CONDITIONS4, + ITERATION5, EXCHANGES5, CONDITIONS5, i, j; + + ITERATION1=EXCHANGES1=CONDITIONS1=ITERATION2=EXCHANGES2=CONDITIONS2=0; + ITERATION3=EXCHANGES3=CONDITIONS3=ITERATION4=EXCHANGES4=CONDITIONS4=0; + ITERATION5=EXCHANGES5=CONDITIONS5=0; + + clrscr(); + puts("஢ : ன 横 ="); + puts(" 祩 ="); + puts(" ⠢ ᫮ =\n"); + puts("஢ 롮஬: ன 横 ="); + puts(" 祩 ="); + puts(" ⠢ ᫮ =\n"); + puts("஢ 묨 ⠢: ன 横 ="); + puts(" 祩 ="); + puts(" ⠢ ᫮ =\n"); + puts("஢ 묨 ⠢: ன 横 ="); + puts(" 祩 ="); + puts(" ⠢ ᫮ =\n"); + puts("஢ ⮤ : ன 横 ="); + puts(" 祩 ="); + puts(" ⠢ ᫮ =\n"); + puts("஢ ⮤: ன 横 ="); + puts(" 祩 ="); + puts(" ⠢ ᫮ ="); + + for(j=1; j <= 100; j++) + { + ITERATION=EXCHANGES=CONDITIONS=0; + for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50; + Bubble(PtrMass ,count); + ITERATION1+=ITERATION; EXCHANGES1+=EXCHANGES; CONDITIONS1+=CONDITIONS; + gotoxy(52,1); cprintf("%d ",ITERATION1/j); + gotoxy(52,2); cprintf("%d ",EXCHANGES1/j); + gotoxy(52,3); cprintf("%d ",CONDITIONS1/j); + + ITERATION=EXCHANGES=CONDITIONS=0; + for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50; + Choise(PtrMass ,count); + ITERATION2+=ITERATION; EXCHANGES2+=EXCHANGES; CONDITIONS2+=CONDITIONS; + gotoxy(52,5); cprintf("%d ",ITERATION2/j); + gotoxy(52,6); cprintf("%d ",EXCHANGES2/j); + gotoxy(52,7); cprintf("%d ",CONDITIONS2/j); + + ITERATION=EXCHANGES=CONDITIONS=0; + for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50; + Include(PtrMass ,count); + ITERATION3+=ITERATION; EXCHANGES3+=EXCHANGES; CONDITIONS3+=CONDITIONS; + gotoxy(52,9); cprintf("%d ",ITERATION3/j); + gotoxy(52,10); cprintf("%d ",EXCHANGES3/j); + gotoxy(52,11); cprintf("%d ",CONDITIONS3/j); + + ITERATION=EXCHANGES=CONDITIONS=0; + for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50; + Binsort(PtrMass ,count); + ITERATION4+=ITERATION; EXCHANGES4+=EXCHANGES; CONDITIONS4+=CONDITIONS; + gotoxy(52,13); cprintf("%d ",ITERATION4/j); + gotoxy(52,14); cprintf("%d ",EXCHANGES4/j); + gotoxy(52,15); cprintf("%d ",CONDITIONS4/j); + + ITERATION=EXCHANGES=CONDITIONS=0; + for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50; + Shell(PtrMass ,count); + ITERATION5+=ITERATION; EXCHANGES5+=EXCHANGES; CONDITIONS5+=CONDITIONS; + gotoxy(52,17); cprintf("%d ",ITERATION5/j); + gotoxy(52,18); cprintf("%d ",EXCHANGES5/j); + gotoxy(52,19); cprintf("%d ",CONDITIONS5/j); + + ITERATION=EXCHANGES=CONDITIONS=0; + for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50; + Quick(PtrMass , 0, count); + ITERATION5+=ITERATION; EXCHANGES5+=EXCHANGES; CONDITIONS5+=CONDITIONS; + gotoxy(52,21); cprintf("%d ",ITERATION5/j); + gotoxy(52,22); cprintf("%d ",EXCHANGES5/j); + gotoxy(52,23); cprintf("%d ",CONDITIONS5/j); + } + puts("\n\n\nOk..."); + getch(); +} + + +/*.......................................................................*/ +void Include(PtrMass, count) +int *PtrMass, count; +{ + int i, j, temp; + + for (i=1; i< count; ++i) + { + temp=PtrMass[i]; + for (j=i-1; j>=0 && temp PtrMass[middle]) /* ..᫨ ᫮ >᫠ . */ + { /* ஬ middle : */ + a=middle+1; /* . ࠭. = 業+1 */ + } /* */ + else /* */ + { /* */ + b = middle; /* ࠭ = 業... */ + } + CONDITIONS++; + ITERATION++; + } + pos=a; /* ন . */ + /* 㦭 ⠢ ᫮ */ + + for (j=i; j > pos; j--) + { /* ( 1 ࠢ) - */ + PtrMass[j]=PtrMass[j-1]; /* ᨢ 騥 । ⮬, */ + EXCHANGES++; + ITERATION++; /* ண ᢮- */ + } /* 1 */ + + PtrMass[pos]=num; /* ⠭ */ + } +} + + +/*.......................................................................*/ +void Bubble(PtrMass, count) +int *PtrMass, count; +{ +int i,j; + for (i=0; i PtrMass[j]) + { + PtrMass[i]+=PtrMass[j]; + PtrMass[j]= PtrMass[i] - PtrMass[j]; + PtrMass[i]-=PtrMass[j]; + EXCHANGES++; + CONDITIONS++; + } + ITERATION++; + } +} + + +/*.......................................................................*/ +void Choise(PtrMass, count) +int *PtrMass, count; +{ +int i,j; + + for (i=0; iPtrMass[j+1]) + { + PtrMass[j]+=PtrMass[j+1]; + PtrMass[j+1]=PtrMass[j]-PtrMass[j+1]; + PtrMass[j]-=PtrMass[j+1]; + EXCHANGES++; + CONDITIONS++; + } + ITERATION++; + } +} + + +int A[]={-1,1,2,3,3}, B[]={-2,0,2,4,4}; + +/*.......................................................................*/ +/* ﭨ ஢ ஢ */ +void Join() +{ + int C[10], i,j,k; + + for (i=j=k=0; k < 10; k++) + { + if (A[i] <= B[j]) + { C[k]=A[i]; i++; } + else + { C[k]=B[j]; j++; } + } + cprintf("\nᨢ A[]:"); + Prn(A, sizeof(A) / sizeof(A[0])); + cprintf("\nᨢ B[]:"); + Prn(B, sizeof(B) / sizeof(B[0])); + cprintf("\nᨢ C[]:"); + Prn(C, sizeof(C) / sizeof(C[0])); + puts("\n\n\nAny key..."); + getch(); +} + + + +int aa[]={9,5,3,2,1}; + +/*.......................................................................*/ +void Shell(PtrMass, count) +int *PtrMass, count; +{ + int i, j, gap, k, x; + + for(k=0; k < 5; k++) + { + gap = aa[k]; + for(i=gap; i < count; ++i) + { + x=PtrMass[i]; + for(j=i-gap; x < PtrMass[j] && j >= 0; j = j-gap) + { + PtrMass[j+gap]=PtrMass[j]; + ITERATION++; + EXCHANGES++; + } + PtrMass[j+gap]=x; + } + } +} + + +/*.......................................................................*/ +void Quick(PtrMass, left, right) +int *PtrMass, left, right; +{ + int x, y, i, j; + i = left; + j = right; + x = PtrMass[(left+right) / 2]; + do { + while(PtrMass[i] < x && i < right) { i++; ITERATION++; } + while(x < PtrMass[j] && j > left) { j--; ITERATION++; } + + if(i <= j) + { + y=PtrMass[i]; + PtrMass[i]=PtrMass[j]; + PtrMass[j]=y; + i++; + j--; + EXCHANGES++; + CONDITIONS++; + } + } while(i <= j); + + if(left < j) Quick(PtrMass,left,j); + if(i < right) Quick(PtrMass,i,right); +} diff --git a/third_party/solid-c/EXAMPLES/SPRINTF.C b/third_party/solid-c/EXAMPLES/SPRINTF.C new file mode 100644 index 0000000..1bd9269 --- /dev/null +++ b/third_party/solid-c/EXAMPLES/SPRINTF.C @@ -0,0 +1,9 @@ +#include + +char buffer[20]; +char *s = "computer"; + +void main() +{ + sprintf(buffer,"%s",s); +} diff --git a/third_party/solid-c/EXAMPLES/TELL.C b/third_party/solid-c/EXAMPLES/TELL.C new file mode 100644 index 0000000..cd6231d --- /dev/null +++ b/third_party/solid-c/EXAMPLES/TELL.C @@ -0,0 +1,16 @@ +#include +#include + +FD fd; +uint pos,i; + +void main() +{ + fd=open("test.txt", O_RDONLY); + i = 10; + if((seek(fd, i, SEEK_SET)) == -1) + printf("訡 ६饭\n"); + pos=tell(fd); + printf("\n%04X",pos); + close(fd); +} diff --git a/third_party/solid-c/FILE_ID.DIZ b/third_party/solid-c/FILE_ID.DIZ new file mode 100644 index 0000000..81c2a0d --- /dev/null +++ b/third_party/solid-c/FILE_ID.DIZ @@ -0,0 +1 @@ +SOLID C v0.01b for Sprinter-2000 diff --git a/third_party/solid-c/INCLUDE/CONIO.H b/third_party/solid-c/INCLUDE/CONIO.H new file mode 100644 index 0000000..bffc701 --- /dev/null +++ b/third_party/solid-c/INCLUDE/CONIO.H @@ -0,0 +1,25 @@ +/* + * CONIO.H + * + * Low-level console functions. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + + +char getch(); +char getche(); +void putch(); +void cputs(); +void clrscr(); +void home(); +void gotoxy(); +char *cgets(); +char inp(); +char outp(); +BOOL kbhit(); +int cprintf(.); diff --git a/third_party/solid-c/INCLUDE/CTYPE.H b/third_party/solid-c/INCLUDE/CTYPE.H new file mode 100644 index 0000000..e874977 --- /dev/null +++ b/third_party/solid-c/INCLUDE/CTYPE.H @@ -0,0 +1,23 @@ +/* + * CTYPE.H + * + * Character type classification. + * (c) 2004, SOLID C Sprinter-2000 + */ + + + +char tolower(); /* convert to lowercase */ +char toupper(); /* convert to uppercase */ +BOOL islower(); /* lowercase test */ +BOOL isupper(); /* uppercase test */ +BOOL isalnum(); /* A..Z a..z 0..9 */ +BOOL isalpha(); /* A..Z a..z */ +BOOL isascii(); /* !..~ */ +BOOL isdigit(); /* 0..9 */ +BOOL isxdigit(); /* hex digit test */ +BOOL isspace(); /* space test */ +BOOL iscntrl(); /* unprintable control symbol */ +BOOL isgraph(); /* has graphic reprezentation */ +BOOL isprint(); /* printable test */ +BOOL ispunct(); /* punctuation sign test */ diff --git a/third_party/solid-c/INCLUDE/DIRECT.H b/third_party/solid-c/INCLUDE/DIRECT.H new file mode 100644 index 0000000..a77c662 --- /dev/null +++ b/third_party/solid-c/INCLUDE/DIRECT.H @@ -0,0 +1,18 @@ +/* + * DIRECT.H + * + * Defines structures, macros, and functions for dealing + * with directories and pathnames. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + + +char chdir(); +char *getcwd(); +char mkdir(); +char rmdir(); diff --git a/third_party/solid-c/INCLUDE/DOS.H b/third_party/solid-c/INCLUDE/DOS.H new file mode 100644 index 0000000..f597159 --- /dev/null +++ b/third_party/solid-c/INCLUDE/DOS.H @@ -0,0 +1,100 @@ +/* + * DOS.H + * + * Defines structs, unions, and functions for + * dealing with Estex-DOS. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + + +/* Variables */ +extern int _argc; +extern char **_argv; + + +/* DOS types */ +struct WORDREGS { + unsigned af, bc, de, hl, ix, iy; +}; + +struct BYTEREGS { + char flag, a, c, b, e, d, l, h; +}; + +union REGS { + struct WORDREGS x; + struct BYTEREGS h; +}; + + +struct time { + unsigned char ti_min; /* minutes */ + unsigned char ti_hour; /* hours */ + unsigned char ti_hund; /* hundredths of seconds. Not used. */ + unsigned char ti_sec; /* seconds */ +}; + +struct date { + int da_year; /* year */ + char da_day; /* day of the month */ + char da_mon; /* month (1 = Jan) */ +}; + + +/* ffirst, fnext functions */ +typedef struct ffblk { + char name[8]; /* +0 pattern of a file name */ + char ext[3]; /* +8 pattern of file expansion */ + char attrib; /* +11 search attribute */ + char ff_resv[10]; /* +12 reserved for DOS */ + uint ff_time; /* +22 time of last write to file */ + uint ff_date; /* +24 date of last write to file */ + uint ff_clst; /* +26 number of first cluster */ + uint ff_lsize; /* +28 low size of file */ + uint ff_hsize; /* +30 high size of file */ + char ff_attr; /* +32 attribute byte of matched file */ + char ff_name[223]; /* +33 null-terminated name of matched file */ +} FIND; + + +/* file attributes */ +#define FA_NORMAL 0x00 /* Normal file, no attributes */ +#define FA_RDONLY 0x01 /* Read only attribute */ +#define FA_HIDDEN 0x02 /* Hidden file */ +#define FA_SYSTEM 0x04 /* System file */ +#define FA_LABEL 0x08 /* Volume label */ +#define FA_DIREC 0x10 /* Directory */ +#define FA_ARCH 0x20 /* Archive */ + + + + +/* Prototypes */ + +char bdos(); /* DOS call return status */ +int bdosh(); /* DOS call return int */ +void intdos(); /* DOS call, parameters and return as REGS */ +void enable(); /* enable interrupts */ +void disable(); /* disable interrupts */ +char absread(); /* read sectors */ +char abswrite(); /* write sectors */ +char ffirst(); /* found first file */ +char _ffirst(); /* found first file, format "FilenameExt" */ +char fnext(); /* found next file */ +int _setargv(); /* parsing arguments */ +void setdisk(); /* set default disk */ +char getdisk(); /* get default disk */ +void setdate(); /* set system date */ +void getdate(); /* get struct date */ +void settime(); /* set system time */ +void gettime(); /* get struct time */ +void sleep(); + + +#define findfirst ffirst +#define findnext fnext diff --git a/third_party/solid-c/INCLUDE/ERRNO.H b/third_party/solid-c/INCLUDE/ERRNO.H new file mode 100644 index 0000000..e9f1c98 --- /dev/null +++ b/third_party/solid-c/INCLUDE/ERRNO.H @@ -0,0 +1,63 @@ +/* + * ERRNO.H + * + * Defines the system error variable errno and the error + * numbers set by system calls. + * (c) 2004, SOLID C Sprinter-2000 + */ + + + +/* DOS Error Codes */ + +#define EZERO 0 /* No error */ +#define EINVFNC 1 /* Invalid function */ +#define EINVDRV 2 /* Invalid drive number */ +#define ENOFILE 3 /* File not found */ +#define ENOPATH 4 /* Path not found */ +#define EINVHND 5 /* Invalid handle */ +#define EMFILE 6 /* Too many open files */ +#define EEXIST 7 /* File already exists */ +#define EROFILE 8 /* File read only */ +#define EROOT 9 /* Root overflow */ +#define ENOSPACE 10 /* No free space */ +#define ENOEMPTY 11 /* Directory not empty */ +#define ECURDIR 12 /* Can't delete current directory */ +#define EINVMED 13 /* Invalid media */ +#define EOPER 14 /* Unknown operation */ +#define EEXISDIR 15 /* Directory exist */ +#define EINVFNAM 16 /* Invalid filename */ +#define EINVEXE 17 /* Invalid EXE-file */ +#define ENSUPEXE 18 /* Not supported EXE-file */ +#define EACCES 19 /* Access denied */ +#define ENORDY 20 /* Not ready */ +#define ESEEK 21 /* Seek error */ +#define ENOSECT 22 /* Sector not found */ +#define ECRC 23 /* CRC error */ +#define EWRTPRT 24 /* Write protect */ +#define EREAD 25 /* Read error */ +#define EWRITE 26 /* Write error */ +#define EDRVFAIL 27 /* Drive failure */ +#define EEXTND28 28 /* Extended error: 28 */ +#define EEXTND29 29 /* Extended error: 29 */ +#define ENOMEM 30 /* Not enough memory */ +#define EINVMEM 31 /* Invalid memory block */ +#define EEXTND32 32 /* Extended error: 32 */ +#define EEXTND33 33 /* Extended error: 33 */ +#define EEXTND34 34 /* Extended error: 34 */ +#define EERR35 35 /* 35 */ +#define EERR36 36 /* 36 */ +#define EERR37 37 /* 37 */ +#define EERR38 38 /* 38 */ +#define EERR39 39 /* 39 */ +#define EERR40 40 /* 40 */ +#define EERR41 41 /* 41 */ +#define EERR42 42 /* 42 */ +#define EERR43 43 /* 43 */ +#define EERR44 44 /* 44 */ +#define EERR45 45 /* 45 */ +#define EERR46 46 /* 46 */ +#define EERR47 47 /* 47 */ +#define EERR48 48 /* 48 */ +#define EERR49 49 /* 49 */ +#define EERR50 50 /* 50 */ diff --git a/third_party/solid-c/INCLUDE/IO.H b/third_party/solid-c/INCLUDE/IO.H new file mode 100644 index 0000000..950bc91 --- /dev/null +++ b/third_party/solid-c/INCLUDE/IO.H @@ -0,0 +1,51 @@ +/* + * IO.H + * + * Low-level nonbuffered file I/O. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + +#ifndef _STD_LIB_ +#include +#endif + + +#ifndef _STD_SEEK_ +#define _STD_SEEK_ +/* constants to be used as 3rd argument for "fseek" function */ +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif + + +/* Definition "open flags" */ +#define O_WRONLY 0x01 /* 0 file write only */ +#define O_RDONLY 0x02 /* 1 file read only */ +#define O_RDWR 0x03 /* 1,0 file read/write */ +#define O_TRUNC 0x04 /* 2 open with truncation */ +#define O_CREAT 0x08 /* 3 create and open file */ +#define O_EXCL 0x10 /* 4 exclusive open */ +#define O_APPEND 0x20 /* 5 to end of file */ + + + +uint open(); /* opens/creates a file */ +uint creat(); /* creates file */ +size_t read(); /* read file */ +size_t write(); /* write file */ +uint close(); /* close file */ +uint seek(); /* sets file pointer (range 0..65534) */ +uint tell(); /* returns current position (range 0..65534) */ +struct fpoint *lseek(); /* sets file pointer */ +struct fpoint *ltell(); /* returns current position */ +char unlink(); /* delete file */ +char remove(); /* delete file */ +char rename(); /* rename file */ +BOOL isatty(); /* return "true" if FD is console I/O */ +int ioctl(); /* control i/o for devices or files */ diff --git a/third_party/solid-c/INCLUDE/MALLOC.H b/third_party/solid-c/INCLUDE/MALLOC.H new file mode 100644 index 0000000..4ebb6a7 --- /dev/null +++ b/third_party/solid-c/INCLUDE/MALLOC.H @@ -0,0 +1,19 @@ +/* + * MALLOC.H + * + * Memory management functions. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + + +int brk(); /* set free memory pointer */ +char *sbrk(); /* move free memory pointer arg bytes higher */ +char *malloc(); /* allocate memory */ +char *calloc(); /* allocate object array, zero memory */ +char *realloc(); /* reallocate memory */ +void free(); /* free malloc'd memory */ diff --git a/third_party/solid-c/INCLUDE/MEM.H b/third_party/solid-c/INCLUDE/MEM.H new file mode 100644 index 0000000..ecab8a5 --- /dev/null +++ b/third_party/solid-c/INCLUDE/MEM.H @@ -0,0 +1,19 @@ +/* + * MEM.H + * + * Memory manipulation functions. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + + +int memcmp(); /* compare two memory blocks */ +void *memcpy(); /* copy memory block */ +void *memmove(); /* copy memory block */ +void *memset(); /* fill memory with byte */ +void movmem(); /* memory copy */ +void setmem(); /* memory fill */ diff --git a/third_party/solid-c/INCLUDE/MOUSE.H b/third_party/solid-c/INCLUDE/MOUSE.H new file mode 100644 index 0000000..b16dfcf --- /dev/null +++ b/third_party/solid-c/INCLUDE/MOUSE.H @@ -0,0 +1,112 @@ +/* + * MOUSE.H + * + * Defines structures, macros, and functions. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + + +#define LEFT_BUTTON 1 +#define RIGHT_BUTTON 2 + + +/* getStatMouse() */ +typedef struct { + char button; /* buttons: 0/1 bits - left/right */ + char x; /* colon */ + char y; /* line */ +} MSSTAT; + + +/* getGStatMouse() */ +typedef struct { + char button; /* buttons: 0/1 bits - left/right */ + int x; /* X pos */ + int y; /* Y pos */ +} MSGSTAT; + + +/* getCursMouse() */ +typedef struct { + char width; /* width curs */ + char high; /* high curs */ + char xpoint; /* X active point */ + char ypoint; /* Y active point */ + char *buff; /* addr cursor buffer */ +} MSCURS; + + +/* setTxtMouse() */ +typedef struct { + char xattr; /* XOR attribut mask */ + char aattr; /* AND attribut mask */ + char xsym; /* XOR simbol mask */ + char asym; /* AND simbol mask */ +} MSTXT; + + +/* getSensMouse(), setSensMouse() */ +typedef struct { + char xsens; /* horiz. sensitive */ + char ysens; /* vert. sensitive */ +} MSSENS; + + + +// 0 - 訡 +// 1 - ⭠ 㭪 +// 3 - 㦥 ࠭ +// 4 - ࠭ +// 5 - ࠦ ᫨誮 + +/* Mouse Error Codes */ +#define MSEZERO 0 /* No error */ +#define MSUNKNW 1 /* Unknown function */ +#define MSEXIST 3 /* Exists cursor */ +#define MSNOCUR 4 /* No cursor */ +#define MSTOOBIG 5 /* Too big image */ + + +/* prototypes */ + +char ms_init(); +char ms_show(); +char ms_hide(); +MSSTAT *ms_stat(); +MSGSTAT *msgstat(); +char ms_spos(); +char mssgpos(); +char ms_ybnd(); +char ms_xbnd(); +char ms_scur(); +char ms_tcur(); +MSCURS *ms_gcur(); +MSSENS *ms_gsen(); +char ms_ssen(); +char ms_hard(); +char ms_vmod(); +char ms_ref(); + + +#define initMouse ms_init +#define showMouse ms_show +#define hideMouse ms_hide +#define getStatMouse ms_stat +#define getGStatMouse msgstat +#define setPosMouse ms_spos +#define setGPosMouse mssgpos +#define yLimMouse ms_ybnd +#define xLimMouse ms_xbnd +#define setTxtMouse ms_tcur +#define getCursMouse ms_gcur +#define setCursMouse ms_scur +#define getSensMouse ms_gsen +#define setSensMouse ms_ssen +#define hardMouse ms_hard +#define vmodeMouse ms_vmod +#define refreshMouse ms_ref diff --git a/third_party/solid-c/INCLUDE/SETJMP.H b/third_party/solid-c/INCLUDE/SETJMP.H new file mode 100644 index 0000000..baa6fb1 --- /dev/null +++ b/third_party/solid-c/INCLUDE/SETJMP.H @@ -0,0 +1,22 @@ +/* + * SETJMP.H + * + * Defines typedef and functions for setjmp/longjmp. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + + +typedef struct { + uint j_sp; + uint j_iy; + uint j_pc; +} jmp_buf; + + +int setjmp(); /* set nonlocal jump return point */ +void longjmp(); /* do a nonlocal jump */ diff --git a/third_party/solid-c/INCLUDE/STAT.H b/third_party/solid-c/INCLUDE/STAT.H new file mode 100644 index 0000000..fc6a87e --- /dev/null +++ b/third_party/solid-c/INCLUDE/STAT.H @@ -0,0 +1,15 @@ +/* + * STAT.H + * + * Definitions used for file status functions. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + + +#define S_IWRITE 0x01 /* owner may write */ +#define S_IREAD 0x02 /* owner may read */ diff --git a/third_party/solid-c/INCLUDE/STDARG.H b/third_party/solid-c/INCLUDE/STDARG.H new file mode 100644 index 0000000..660a3fb --- /dev/null +++ b/third_party/solid-c/INCLUDE/STDARG.H @@ -0,0 +1,13 @@ +/* + * STDARG.H + * + * Definitions for accessing parameters in functions that + * accept a variable number of arguments. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef __STDARG_ +#define __STDARG_ +typedef void *va_list; /* for vprintf's functions */ +#endif diff --git a/third_party/solid-c/INCLUDE/STDIO.H b/third_party/solid-c/INCLUDE/STDIO.H new file mode 100644 index 0000000..e345cec --- /dev/null +++ b/third_party/solid-c/INCLUDE/STDIO.H @@ -0,0 +1,117 @@ +/* + * STDIO.H + * + * Definitions for stream input/output. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + +#ifndef _STD_LIB_ +#include +#endif + + + +/* definition of the control structure for streams */ +typedef struct { + uint flags; /* +0,1 file status flags */ + int level; /* +2,3 empty/fill level of buffer */ + char *curp; /* +4,5 current active pointer */ + int fd; /* +6,7 file descriptor for low-level i/o */ + char *buffer; /* +8,9 addr data transfer buffer */ + char hold; /* +10 ungetc char if no buffer */ + short token; /* +11,12 reserved */ + char dummy; /* +13 reserved */ +} FILE; /* this is the FILE object */ + + +/* "flags" bits definitions */ +#define _F_READ 0x0001 /* 0 read only file */ +#define _F_WRIT 0x0002 /* 1 write only file */ +#define _F_RDWR 0x0003 /* 0,1 read/write flag */ +#define _F_BUF 0x0004 /* 2 malloc'ed Buffer data */ +#define _F_LBUF 0x0008 /* 3 line-buffered file */ +#define _F_ERR 0x0010 /* 4 error indicator */ +#define _F_EOF 0x0020 /* 5 EOF indicator */ +#define _F_BIN 0x0040 /* 6 binary file indicator */ +#define _F_IN 0x0080 /* 7 data is incoming */ +#define _F_OUT 0x0100 /* 0 +1 data is outgoing */ +#define _F_TERM 0x0200 /* 1 +1 stdin stream */ + + +#define EOF (-1) /* end of file indicator */ + +#define BUFSIZ 512 /* buffer size for high-level i/o */ + +#define OPEN_MAX 8 /* able to have 8 files */ + +extern FILE _iob[]; /* list of fcb */ + +/* standard I/O predefined streams */ +#define stdin (&_iob[0]) +#define stdout (&_iob[-1]) +#define stderr (&_iob[-2]) +#define stdaux (&_iob[-3]) +#define stdprn (&_iob[-4]) + + +/* for fgetpos, fsetpos functions */ +typedef long fpos_t; /* file offset type */ + + +#ifndef _STD_SEEK_ +#define _STD_SEEK_ +/* constants to be used as 3rd argument for "fseek" function */ +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif + + +/* Prototypes */ + +int printf(.); +int fprintf(.); +int sprintf(.); +int scanf(.); +int sscanf(.); +int fscanf(.); +void clearerr(); +FILE *fdopen(); +FILE *fopen(); +FILE *freopen(); +void fclosall(); +char fclose(); +size_t fread(); +size_t fwrite(); +struct fpoint *fseek(); +struct fpoint *ftell(); + +char getc(); +char putc(); +char *gets(); +char puts(); +char *fgets(); +char fputs(); +char fgetc(); +char fputc(); +char ungetc(); +char fflush(); +void rewind(); +char fgetpos(); +char fsetpos(); + + + +/* The following macros provide for common functions */ + +#define fileno(a) ((a)->fd) +#define ferror(a) ((a)->flags & _F_ERR) +#define feof(a) ((a)->flags & _F_EOF) + +#define fgetchar getc(stdin) +#define fputchar(c) putc((c),stdout) diff --git a/third_party/solid-c/INCLUDE/STDLIB.H b/third_party/solid-c/INCLUDE/STDLIB.H new file mode 100644 index 0000000..5063126 --- /dev/null +++ b/third_party/solid-c/INCLUDE/STDLIB.H @@ -0,0 +1,51 @@ +/* + * STDLIB.H + * + * A header for a standart library CLIB. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + +#ifndef _STD_LIB_ +#define _STD_LIB_ + +char errno; /* must be declaration here */ + + +/* for "div" function */ +typedef struct divt { + uint quot; /* ⭮ */ + uint rem; /* ⮪ */ +} div_t; + + +int abs(); +int atoi(); +int min(); +int max(); +int strtol(); +int rand(); +void *bsearch(); +void qsort(); +void srand(); +void perror(); +void exit(); +void _exit(); +void abort(); +char atexit(); +char *sysenv(); +char *getenv(); +uint putenv(); +struct divt *div(); +void hex8(); +void hex16(); +void hex32(); +void dec8(); +void dec16(); +void dec32(); + +#endif diff --git a/third_party/solid-c/INCLUDE/STRING.H b/third_party/solid-c/INCLUDE/STRING.H new file mode 100644 index 0000000..8ad3874 --- /dev/null +++ b/third_party/solid-c/INCLUDE/STRING.H @@ -0,0 +1,33 @@ +/* + * STRING.H + * + * String manipulation functions. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#include +#endif + + +void *memchr(); /* search for a character in memory block */ +char *strcat(); +char *strncat(); +char *strchr(); +int strcmp(); +int strncmp(); +char *strcpy(); +char *strncpy(); +size_t strcspn(); +size_t strlen(); +char *strlwr(); +char *strpbrk(); +char *strrchr(); +size_t strspn(); +char *strstr(); +char *strtok(); +char *strupr(); +char *strerr(); + +#define strerror strerr; diff --git a/third_party/solid-c/INCLUDE/TYPES.H b/third_party/solid-c/INCLUDE/TYPES.H new file mode 100644 index 0000000..de01309 --- /dev/null +++ b/third_party/solid-c/INCLUDE/TYPES.H @@ -0,0 +1,51 @@ +/* + * TYPES.H + * + * General types definition for SOLID C. + * (c) 2004, SOLID C Sprinter-2000 + */ + + +#ifndef _C_TYPES_ +#define _C_TYPES_ + +typedef unsigned uint; + +typedef char BYTE; +typedef char TINY; +typedef char BOOL; +typedef char STATUS; +typedef uint WORD; +typedef int FD; /* file discripter type */ + + +/* for "seeks","tells" functions */ +typedef struct fpoint { + uint low; + uint high; +} f_point; + + +typedef struct { + uint low; + uint high; +} LONG; + + +#define NULL 0 +#define OK 0 +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 +#define ERROR (-1) +#define FALSE 0 +#define TRUE 1 +#define YES 1 +#define NO 0 +#define FLOAT LONG + +#ifndef _SIZE_T +#define _SIZE_T +typedef uint size_t; +#endif + +#endif diff --git a/third_party/solid-c/LD.EXE b/third_party/solid-c/LD.EXE new file mode 100644 index 0000000000000000000000000000000000000000..b938d865321a137988317c729db81145214e1f1e GIT binary patch literal 8074 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 NGr}P+T7?rD{s-aefcyXe literal 0 HcmV?d00001 diff --git a/third_party/solid-c/OL.EXE b/third_party/solid-c/OL.EXE new file mode 100644 index 0000000000000000000000000000000000000000..c0afef5665d465c208061522671fbd9556205c97 GIT binary patch literal 6067 zcmeHL|4&=j6@Ml`f;%2K&KE<-avzUnFC=lnN`XEFXMBr^MgoCk&6ZZF!4KkqZDgB( zBSJ?Aw(-+cO?E0x+Yi&E?uVu=`7-1z>ne!jC=c|cx~b;23lh^(8dA(qC-7kp09_+h{3bsY5s8^9e%w3_z{G!bp2{O6V{ne7-xVU+cB8aUO zN|{})wYujoLI=m1X0EwO6(76k#<5$Yw!hvINs1-jY%789_ zGumMTl6B(&-9$ilE3kqtI9WO*k&`Ee0NyP1K!#Dxml1U8y-cgZf%E>Ex0no&XcmHV z&Aa+_cLGUfL6@&iL`8Nm65riFhQ2D6sZN3f7^?tKhw-TZ7lsMPez0etR2?Oimwi9X5H3$4zbd#n&rD3b`j&y)f;0MxdV*cDZMb}?^&Zns6muP$n) zsdrO}fqJI0eUPL+@sDmzI7+GUA}-FlH8%=;2Yg3;tv-kEqVFBwHQz1YpL`E|PkjWh z=4pO_hHGdilP%HAR;h^DCPqD)*=PdDk!g%aG}DP$@DtZWQ__J%SVARfdM%hv#Od6J zVDo$N_;8I_KU^KEA08Er!{PeO4O1$ZO zRlzOfh2*9&MR5Io53b*Rl9Ks>l+9F2BvT8;{>6Xc9vsoEqkjHEay2)i)Gx6Nb3ol2 z(fn<$<)eV+H*+mF1Dan^H?XSsW0%LOQr0(X$f6yI|jMuh~FM}b?)Sg6R8au}_w z1P#NATvS*?ge~;eD?|XG|dbBkoNNnJK!bWanH}>+$oXR`%%xG^`WRo@p!rE zM3%bZSz@+->~_qpXD0?hoS>8*h!AA58#9Tl0Z68vg&{89aO+QlzNxk*43LixSLxHm z5zmB6%BW!ABGsqCO3pRpTLz^Bv-)9qa6yJNQr0J|fj5XYh*8fU1RcE@Edq{%ytK$< z;&RaZ3tw6?vL=+RUk5JF&8&ZIe9Hzwp8*RY+GLng<~}n_rO8DU5g=cX9sP1>)Jw%i zG>?*ZT-B%&%;K#`}=qgW&^!0%r|MWnOu^Q1Z!&nsKT z_ol0U0sr9PDU4U%WE&K5+!zz^PWU28_~ga}eY)5xooA9IBYZZbaAMq)7;(7nZO#N+Kp{;2#c%(SuyxX8Cs1N4kTRaY>4RY zY3(w%Ap|?ECS+@0Ig}QAud$gpI|rhvvxR714A^?*ld6?1$I>+qUHs|RDL+CX%DjZz-f~FAR3Bh?X||h8Ut$#tTC|0 zz#0Q<46HHmKVg7Oi|NV(xGDHAon{P5x|1YM4AfEHzJ_yC5B#{KFvi<|T+Mw{9&itJB!WqQ(Za-`4Fk+pK!D zKh;X?#gF8AbaH?4X*sooM&gZZWzyCGjY(D&LVNK;XX>Hafgh1m9za`*wWc0RH#8qs zCuem!R<#PCufuw1Dsb!Zt%r8I&9cfz1GechJDjUz%~)nnwl}N9$FSJRfoYEwx&&Jn zevn`3Ssd_0+}L^scLWWGs++5t4^bm*+nYCD^) utTsA8Y_npD&T@7KP=rdgB_#+kZM#tEtFOMY2emXdm}}7?Ya8@F#D4&*1vKaY literal 0 HcmV?d00001 diff --git a/third_party/solid-c/SRC/CLIB/CONIO.ASM b/third_party/solid-c/SRC/CLIB/CONIO.ASM new file mode 100644 index 0000000..0f83f3a --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/CONIO.ASM @@ -0,0 +1,452 @@ +; 㭪樨 ஢७. +; +; 㭪樨 _getscon, _getcon (㦭 ?), putdec (뢮 ᫠ 筮 +; ଠ ࠭) ਭ. +; +; +; 室騥 㭪樨: +; +; putch +; getch +; getche +; cputs +; clrscr +; home +; gotoxy +; kbhit +; cgets +; inp +; outp +; + + + + + + MODULE putch +; +; "conio.h" +; 㭪 뢮 ᨬ אַ ࠭. +; +; in: a = ᨬ +; out: +; +; void putch(char *c) +; +putch_:: + cp 0Ah + jr nz,cputc + call cputc + ld a,0Dh +cputc: ;push ix + ld c,5Bh + rst 10h + ;pop ix + ret + + ENDMODULE + + + MODULE getch +; +; "conio.h" +; 㭪 ⠥ ᨬ +; ⮡ࠦ ࠭. +; +; in: +; out: a = ⠭ ᨬ +; +; char getch() +; +getch_:: + ;push ix + ld c,30h + rst 10h + ;pop ix + ret + + ENDMODULE + + + MODULE getche +; +; "conio.h" +; 㭪 ⠥ ᨬ ⮡ࠦ ࠭. +; ⨨ Ctrl+Z Ctrl+C, 뤠 祭 -1. +; +; in: +; out: a = ⠭ ᨬ +; +; char getche() +; +getche_:: +@1: ;push ix + ld c,32h + rst 10h + ld a,e + ;pop ix + bit 7,d + jr z,@3 ; normal input + bit 5,b + jr z,@3 ; not Ctrl+.. + ld a,d + cp 0AAh ; Ctrl+Z (d = 7 bit "1") + jr z,@2 + cp 0ACh ; Ctrl+C + jr nz,@1 +@2: ld a,-1 ; end of input + ret +@3: cp 0Dh + ret nz + push af + ld a,0Ah + call putch_## + pop af + ret + + ENDMODULE + + + MODULE cputs +; +; "conio.h" +; 㭪 뢮 ப אַ ࠭. +; ப 稢 㫥. +; +; in: hl = ப +; out: +; +; void cputs(char *str) +; +cputs_:: + ld a,(hl) + or a + ret z + call putch_## + inc hl + jp cputs_ + + ENDMODULE + + + MODULE clrscr +; +; "conio.h" +; 饭 ࠭. +; +; in: +; out: +; +; void clrscr() +; +clrscr_:: + ld de,0 ; . 㣮 + ld hl,2050h ; Y/X ࠧ + ld bc,0756h ; b=ਡ 䮭 + ld a," " ; ᨬ ⥫ + rst 10h + ret + + ENDMODULE + + + MODULE home +; +; "conio.h" +; 孨 㣮. +; +; in: +; out: +; +; void home() +; +home_:: + ld de,0 ; Y/X position cursor + ld c,52h + rst 10h + ret + + ENDMODULE + + + MODULE gotoxy +; +; "conio.h" +; ⠭ X,Y . +; +; in: l,e = X,Y न +; out: +; +; void gotoxy(int x, int y) +; +gotoxy_:: + ld d,e ; Y . + ld e,l ; X . + dec d + dec e + ld c,52h + rst 10h + ret + + ENDMODULE + + + MODULE kbhit +; +; "conio.h" +; 㭪 ஢ ⨥ . +; 頥 BOOL. +; +; in: +; out: a=true - +; a=false - +; +; BOOL kbhit() +; +kbhit_:: + ;push ix + ld c,33h + rst 10h + ;pop ix + or a + ret z ; false + ld a,1 ; true + ret + + ENDMODULE + + + MODULE cgets +; +; "conio.h" +; 㭪 ⠥ ப ᨬ אַ ᮫, ப +; 㬥 str. 㬥 str 㪠⥫ ᨢ +; ᨬ. ᨢ - str[0] ᮤঠ ᨬ +; ( ᨬ) ⠥ ப. ᨢ 筮 訬, +; ⮡ ப ⥫ . 㭪 த 뢠 +; ᨬ, 㤥 ⠭ ப (0x0D) - +; ⢮ ᨬ. ⮬, ப . ப - +; str[2] ᨢ. ஬ ᨢ str[1] - +; ⢨⥫쭠 ப. +; 㭪 頥 㪠⥫ 砫 ப, 室饩 str[2]. +; 砥 訡, 頥 祭 ।. +; +; char *cgets(*str) +; +cgets_:: + ;push ix ; for _gets_ + ld b,(hl) ; str[0] max len string + inc hl + call __gets_## + inc hl + ret + + ENDMODULE + + +; MODULE putdec +; +; "conio.h" +; 뢮 ᫮ 筮 ଠ ࠭. +; +; in: hl = 祭 +; out: +; +; void putdec(int num) +; +;putdec_:: +; bit 7,h ; ஢ਬ ᫠ +; jr z,@1 +; ; . ᫮ +; call ?NEGHL## +; ld a,"-" +; call putch_## ; 뢮 ᨬ אַ ࠭ +;@1: ld de,0 +; ld c,e +; ld b,16 +;@2: add hl,hl +; ld a,e +; adc a,a +; daa +; ld e,a +; ld a,d +; adc a,a +; daa +; ld d,a +; rl c +; djnz @2 +; ld hl,mystr ; ᫠ +; call @fhexw +; ld e,c +; call @fhexb +; ld (hl),0 +; ld hl,mystr +; ld bc,4 +; ld a," " +; cpir +; jp cputs_## ; 뢥 ப אַ ࠭ +; +; de +;@fhexw:push de +; ld e,d +; call @fhexb +; pop de +;@fhexb:ld a,e +; push af +; rrca +; rrca +; rrca +; rrca +; call @3 +; pop af +;@3: and 0Fh +; add a,"0" +; cp "9"+1 +; jr c,@4 +; add a,7 +;@4: ld (hl),a +; inc hl +; ret +; +; dseg +;mystr: ds 6 ; ᫠ +; +; ENDMODULE + + +; MODULE getscon +; +; ப ᮫. +; . ப 128 ᨬ, 殢 ப. +; in: e = ? +; out: hl = ப, ᫨ Ok +; hl = NULL 訡 +; +;_getscon_:: +; push ix +; ld a,e ; ७  +; ex de,hl +; ld hl,-130 +; add hl,sp +; ld sp,hl +; ex de,hl ; hl= 㭪樨 +; push hl +; ld (?23+1),hl +; dec a +; dec a +; ld hl,2 +; add hl,sp +; ld (hl),a +; ld hl,2 +; add hl,sp +; ex de,hl ; de= +; ld c,0Ah ; ⥭ ᮫ +; call 5 +; ld e,0Ah +; ld c,2 ; 뢥 ᨬ ࠭ +; call 5 +; ld hl,4 +; add hl,sp +; ld a,(hl) +; pop hl +; cp 1Ah ; ப +; jr nz,@5 +; ld hl,0 ; hl=null +; jr @6 +; ; +;@5: push hl +; ld hl,3 +; add hl,sp +; ld c,(hl) +; ld hl,4 +; add hl,sp +; ex de,hl +; pop hl +;@8: dec c +; ld a,c +; inc a +; jr z,@7 +; ld a,(de) +; inc de +; ld (hl),a +; inc hl +; jr @8 +; ; +;@7: ld (hl),0Ah +; inc hl +; xor a +; ld (hl),a +;?23: ld hl,0 ; hl,(?23) ப +;@6: ex de,hl +; ld hl,130 +; add hl,sp +; ld sp,hl +; ex de,hl +; pop ix +; ret +; +; ENDMODULE + + +; MODULE getcon +; +; ᨬ ᮫ 宬. +; ࠡ뢠 0Dh. +; +;_getcon_:: +; push ix +; ld c,1 ; ᨬ +; call 5 +; cp 0Dh +; ret nz +; ld a,0Ah +; push af +; ld c,2 ; 뢮 ᨬ ࠭ +; ld e,a +; call 5 +; pop af +; pop ix +; ret +; +; ENDMODULE + + + MODULE inp +; +; "conio.h" +; 㭪 ⠥ 1 port. +; 㬥 port +; 楫 ᫮ 0 65535. +; 㭪 頥 ⠭ port. +; +; char inp(uint port); +; +inp_:: + ld c,l + ld b,h + in a,(c) + ret + + ENDMODULE + + + MODULE outp +; +; "conio.h" +; 㭪 뢠 祭 value port. +; 㬥 port 楫 +; ᫮ 0 65535. 㬥 value +; 楫 ᫮ 0 +; 255. +; 㭪 頥 뢠 . +; +; char outp(uint port, char value); +; +outp_:: + ld c,l + ld b,h + ld a,e + out (c),a + ret + + ENDMODULE diff --git a/third_party/solid-c/SRC/CLIB/CTYPE.ASM b/third_party/solid-c/SRC/CLIB/CTYPE.ASM new file mode 100644 index 0000000..999820f --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/CTYPE.ASM @@ -0,0 +1,357 @@ +; 室騥 㭪樨: +; +; tolower +; toupper +; isdigit +; isupper +; islower +; isascii +; isalnum +; isxdigit +; isspace +; iscntrl +; ispunct +; isalpha +; isgraph +; isprint +; + + + + + MODULE xtcty +; +; Table for ctype functs +; 255 bytes +@ctype:: + db 1,1,1,1,1,1,1,1,1,3,3,3,3,3,1,1 + db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + db 2,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 + db 20,20,20,20,20,20,20,20,20,20,8,8,8,8,8,8 + db 8,48,48,48,48,48,48,32,32,32,32,32,32,32,32,32 + db 32,3,32,32,32,32,32,32,32,32,32,8,8,8,8,8 + db 8,80,80,80,80,80,80,64,64,64,64,64,64,64,64,64 + db 64,64,64,64,64,64,64,64,64,64,64,8,8,8,8,1 + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + ENDMODULE + + + MODULE tolower +; +; "ctype.h" +; ८ࠧ ய᭮ ᨬ . +; in: a = ᨬ +; out a = a..z ᨬ +; +; char tolower(char ch) +; +tolower_:: + cp "A" + ret c + cp "Z"+1 + ret nc + add a,20h + ret + + ENDMODULE + + + MODULE toupper +; +; "ctype.h" +; ८ࠧ ᨬ ய᭮. +; in: a = ᨬ +; out a = A..Z ᨬ +; +; char toupper(char ch) +; +toupper_:: + cp "a" + ret c + cp "z"+1 + ret nc + sub 20h + ret + + ENDMODULE + + + MODULE isdigit +; +; "ctype.h" +; ஢ઠ ᨬ . +; in: a = ᨬ +; out: true - +; false - +; +; BOOL isdigit(char ch) +; +isdigit_:: + cp "0" + jr c,@1 + cp "9"+1 + jr nc,@1 + ld a,1 ; true + ret +@1: xor a ; false + ret + + ENDMODULE + + + MODULE isupper +; +; "ctype.h" +; ஢ઠ ய᭮ ᨬ +; in: a = ᨬ +; out: true - ய᭮ +; false - ய᭮ +; +; BOOL isupper(char ch) +; +isupper_:: + cp "A" + jr c,@1 + cp "Z"+1 + jr nc,@1 + ld a,1 ; true + ret +@1: xor a ; false + ret + + ENDMODULE + + + MODULE islower +; +; "ctype.h" +; ஢ઠ ᨬ +; in: a = ᨬ +; out: true - +; false - +; +; BOOL islower(char ch) +; +islower_:: + cp "a" + jr c,@1 + cp "z"+1 + jr nc,@1 + ld a,1 ; true + ret +@1: xor a ; false + ret + + ENDMODULE + + + MODULE isascii +; +; "ctype.h" +; ஢ઠ ᨬ ASCII ਭ +; in: a = ᨬ +; out: true - ascii-ᨬ +; false - ascii-ᨬ +; +; BOOL isascii(char ch) +; +isascii_:: + cp 0Dh + ret z + cp 0Ah + ret z + cp " " + jr c,@1 + cp "~"+1 + ret c ; true +@1: xor a ; false + ret + + ENDMODULE + + + MODULE isalnum +; +; "ctype.h" +; ஢ ᨬ ਭ 䠢⭮-஢ +; ⨯ (A..Z, a..z, 0..9) +; in: a = ᨬ +; out: true - 䠢⭮-஢ ᨬ +; false - +; +; BOOL isalnum(char ch) +; +isalnum_:: + ld l,a + ld h,0 + ld de,@ctype## + add hl,de + ld a,4+32+64 + and (hl) + ret + + ENDMODULE + + + MODULE isxdigit +; +; "ctype.h" +; ஢ ⭠ (0..9, A..F, a..f) +; in: a = ᨬ +; out: true - hex- +; false - +; +; BOOL isxdigit(char c) +; +isxdigit_:: + ld l,a + ld h,0 + ld de,@ctype## + add hl,de + ld a,10h + and (hl) + ret + + ENDMODULE + + + MODULE isspace +; +; "ctype.h" +; ஢ ஡ ᨬ (0x09, 0x0D 0x20) +; in: a = ᨬ +; out: true - ஡ ᨬ +; false - +; +; BOOL isspace(char ch) +; +isspace_:: + ld l,a + ld h,0 + ld de,@ctype## + add hl,de + ld a,2 + and (hl) + ret + + ENDMODULE + + + MODULE iscntrl +; +; "ctype.h" +; ஢ ࠢ騩 ᨬ (000..01F 0x7F) +; in: a = ᨬ +; out: true - ࠢ騩 ᨬ +; false - +; +; BOOL iscntl(char ch) +; +iscntrl_:: + ld l,a + ld h,0 + ld de,@ctype## + add hl,de + ld a,1 + and (hl) + ret + + ENDMODULE + + + MODULE ispunct +; +; "ctype.h" +; ஢ 㭪樨 +; in: a = ᨬ +; out: true - 㭪樨 +; false - +; +; BOOL ispunct(char ch) +; +ispunct_:: + ld l,a + ld h,0 + ld de,@ctype## + add hl,de + ld a,8 + and (hl) + ret + + ENDMODULE + + + MODULE isalpha +; +; "ctype.h" +; ஢ ਭ 㪢 (A..Z, a..z) +; in: a = ᨬ +; out: true - 㪢 +; false - 㪢 +; +; BOOL isalpha(char ch) +; +isalpha_:: + ld l,a + ld h,0 + ld de,@ctype## + add hl,de + ld a,32+64 + and (hl) + ret + + ENDMODULE + + + MODULE isgraph +; +; "ctype.h" +; ஢ ਭ ⠥ ᨬ, +; ᪫ ᨬ ஡ (021..07E) +; in: a = ᨬ +; out: true - ⠥ ᨬ +; false - +; +; BOOL isgraph(char ch) +; +isgraph_:: + ld l,a + ld h,0 + ld de,@ctype## + add hl,de + ld a,0FCh + and (hl) + ret + + ENDMODULE + + + MODULE isprint +; +; "ctype.h" +; ஢ ਭ ⠥ +; ᨬ (020..07E). +; in: a = ᨬ +; out: true - ⠥ ᨬ +; false - +; +; BOOL isprint(char ch) +; +isprint_:: + ld l,a + ld h,0 + ld de,@ctype## + add hl,de + ld a,0FEh + and (hl) + ret + + ENDMODULE diff --git a/third_party/solid-c/SRC/CLIB/DOS.ASM b/third_party/solid-c/SRC/CLIB/DOS.ASM new file mode 100644 index 0000000..23245f9 --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/DOS.ASM @@ -0,0 +1,618 @@ +; 㭪樨 ஢७. +; +; 室騥 㭪樨: +; +; bdos +; bdosh +; enable +; disable +; _setargv +; setdisk +; getdisk +; absread +; abswrite +; setdate +; getdate +; settime +; gettime +; intdos +; ffirst (findfirst) +; fnext (findnext) +; + + + + + + MODULE bdos +; +; "dos.h" +; 믮 ⥬ 맮 , ண । n. +; 㬥 doshl dosa ࠧ ᮮ⢥⢥ ॣ HL A. +; 㭪 믮 RST 10h ⢫ ⥬ 맮. +; 㭪 ᯮ짮 ⮫쪮 ⥬ -맮, +; ਭ 㬥⮢ ਭ ⮫쪮 ॣ HL A. +; 㭪 頥 祭 ॣ A, ⥬ 맮. +; ਬ砭: 㭪 ᯮ짮 ⢫ ⥬ +; 맮, 訡 㪠뢠 ।⢮ ⠭ 䫠 ७. +; .. -ணࠬ 㯠 ⮬ 䫠, 頥 +; 祭 । . ⮬ 砥 室 ᯮ짮 +; 㭪 intdos. +; 㭪 bdosh ⫨砥 bdos ⮫쪮 ⥬, 頥 祭 +; ᮤন ॣ. HL. +; 㭪樨 ᯮ짮 -맮: 02h,0Ah,0Bh,0Eh,11h,1Bh +; 1Ch,1Dh,1Eh,5Ch 㭪権. +; +; in: a = 㭪樨 +; de = । ࠬ +; c = ਡ +; out: a = 祭 ⥬ 맮 +; +; char bdos(char n, int doshl, char dosa) +; int bdosh(char n, int doshl, char dosa) +; +bdosh_:: +bdos_:: + ld b,c + ld c,a ; c = n + ld a,b ; a = dosa + ex de,hl ; hl = doshl + push ix + rst 10h + pop ix + ld l,a + ld h,0 + ret + + ENDMODULE + + + MODULE diei +; +; "dos.h" +; Enable and disable interrupts. +; +; in: +; out: +; +; void enable() +; void disable() +; +enable_:: + ei + ret + +disable_:: + di + ret + + ENDMODULE + + + MODULE setarg +;----------------------------------------------------------- +; ७: 뢠 xmain 㭪樨 _main_ +;----------------------------------------------------------- +; ᯨ᮪ 㬥⮢, ப. +; 頥 ᫮ 㬥⮢. ᮪ ⠭ +; ᨬ 30 㬥⮢. +; +; in: hl = . ப +; out: hl = ᫮ 㬥⮢ (argc) +; +; int _setargv(*string) +; +_setargv:: + ld c,(hl) ; . ப + inc hl + ld b,0 + ld e,l ; 砫 . ப + ld d,h + add hl,bc + ld (hl),b ; . ப + ; ணࠬ + push de + inc hl + inc hl + ld b,122 +@6: ld a,(hl) + inc hl + or a + jr z,@8 + cp "\" + jr nz,@7 + ld e,l + ld d,h +@7: djnz @6 +@8: ld (_argv_),de ; ணࠬ + pop de + ; + ld hl,_argv_+2 ; ᯨ᮪ ᮢ 㬥⮢ + ld b,1 ; b=1 argc! +@1: ld a,(de) + inc de + cp " " + jr z,@1 + cp 9 ; Tab + jr z,@1 + or a + jr z,@2 ; ப + dec de + ld (hl),e ; 㬥 ᯨ᮪ + inc hl + ld (hl),d + inc hl + inc b ; ++argc +@3: ld a,(de) + cp " " + jr z,@4 + cp 9 ; Tab + jr z,@4 + or a + jr z,@2 ; ப + inc de + cp '"' + jr z,@5 + jr @3 + ; +@4: xor a + ld (de),a ; 㬥 . ப + inc de + jr @1 + ; +@5: ld a,(de) + cp '"' + jr z,@3 + or a + jr z,@2 + inc de + jr @5 + ; + ; 㬥⮢ +@2: ld (hl),0 ; null + inc hl + ld (hl),0 + ld l,b ; hl=᫮ 㬥⮢ + ld h,0 + ret + + dseg +_argv_:: + ds 32*2 ; ᯨ᮪ ᮢ 㬥⮢ + + ENDMODULE + + + MODULE setdisk +; +; "dos.h" +; ⠭ ⥪騩 +; +; in: a = ᪠ +; out: +; +; void setdisk(char diskno) +; +setdisk_:: + push ix + ld c,1 + rst 10h + pop ix + ret + + ENDMODULE + + + MODULE absread +; +; "dos.h" +; ᮫⭮ ⥭ ᪠. +; 㭪 뢠 ᪮쪮 ᥪ஢ +; 砫 ⭮⥫ ஬. +; 㬥 0 砫 ᪮ ( 䨧᪮!) +; ᪠. ਬ, 㧮 ᥪ ᪮ +; ᪠ 0, ࢠ FAT 稭 +; ᥪ 1 .. +; 㭪 0 ᯥ譮 襭 樨. +; 砥 訡 頥 -1 (0FFh) errno ᮤন +; 訡. +; +; in: a = ᪠ +; de = . ᥪ +; bc = - ⠥ ᥪ஢ +; ⥪ = +; out: a = 0 - Ok +; a = -1 - Error +; +; char absread(char disk, int nsect, char count, char buffer) +; +; disk - ᪠ +; nsect - 砫쭮 ᥪ +; count - - ⠥ ᥪ஢ +; buffer - 뢠 +; +absread_:: + ld (@1+2),ix + ld lx,e ; ix=nsect + ld hx,d + pop hl + pop de ; de= buffer + push de + push hl + ld hl,0 ; .ࠧ ᥪ + ld b,c ; count + ld c,55h + rst 08h + jr c,@2 + xor a ; Ok +@1: ld ix,0 + ret +@2: ld a,25 ; EREAD (read error) + ld (errno_##),a + ld a,-1 + jr @1 + + ENDMODULE + + + MODULE abswrit +; +; "dos.h" +; ᮫⭠ . +; 㭪 뢠 ᪮쪮 ᥪ஢ +; 砫 ⭮⥫ ஬. +; 㬥 0 砫 ᪮ ( 䨧᪮!) +; ᪠. ਬ, 㧮 ᥪ ᪮ +; ᪠ 0, ࢠ FAT 稭 +; ᥪ 1 .. +; 㭪 0 ᯥ譮 襭 樨. +; 砥 訡 頥 -1 (0FFh) errno ᮤন +; 訡. +; +; in: a = ᪠ +; de = . ᥪ +; bc = - 뢠 ᥪ஢ +; out: a = 0 - Ok +; a = -1 - Error +; +; char abswrite(char disk, int nsect, char count, char buffer) +; +; disk - ᪠ +; nsect - 砫쭮 ᥪ +; count - - 뢠 ᥪ஢ +; buffer - +; +abswrite_:: + ld (@1+2),ix + ld lx,e ; ix=nsect + ld hx,d + pop hl + pop de ; de= buffer + push de + push hl + ld hl,0 ; .ࠧ ᥪ + ld b,c ; count + ld c,56h + rst 08h + jr c,@2 + xor a ; Ok +@1: ld ix,0 + ret +@2: ld a,26 ; EWRITE (write error) + ld (errno_##),a + ld a,-1 + jr @1 + + ENDMODULE + + + MODULE getdisk +; +; "dos.h" +; ᪠ +; +; in: +; out: a = ᪠ +; +; char getdisk() +; +getdisk_:: + ;push ix + ld c,2 + rst 10h + ;pop ix + ret + + ENDMODULE + + + MODULE getdate +; +; "dos.h" +; ⥬ date. +; +; in: hl = +; out: +; +; void getdate(struct date *date) +; +getdate_:: + push ix + push hl ; + ld c,21h + rst 10h + pop hl + push ix + pop bc + ld (hl),c ;+0 + inc hl ; + ld (hl),b ;+1 + inc hl + ld (hl),d ;+2 + inc hl + ld (hl),e ;+3 + pop ix + ret + + ENDMODULE + + + MODULE setdate +; +; "dos.h" +; ⠭ ⥬ . +; +; in: hl = +; out: +; +; void setdate(struct date *date) +; +setdate_:: + push ix + ld c,(hl) ;+0 + inc hl ; + ld b,(hl) ;+1 + inc hl + ld d,(hl) ;+2 + inc hl + ld e,(hl) ;+3 + push bc + pop ix + ld c,22h + rst 10h + pop ix + ret + + ENDMODULE + + + MODULE gettime +; +; "dos.h" +; ⥬ ६ time. +; +; in: hl = ६ +; out: +; +; void gettime(struct time *time) +; +gettime_:: + push ix + push hl + ld c,21h + rst 10h + ex de,hl + pop hl + ld (hl),e ;+0 + inc hl + ld (hl),d ;+1 + inc hl + inc hl ; 祩 "ti_hund" + ld (hl),b ;+3 ᥪ㭤 + pop ix + ret + + ENDMODULE + + + MODULE settime +; +; "dos.h" +; ⠭ ⥬ ६. +; +; in: hl = ६ +; out: +; +; void settime(struct time *time) +; +settime_:: + push ix + ld e,(hl) ;+0 + inc hl + ld d,(hl) ;+1 + inc hl + inc hl ; 祩 "ti_hund" + ld b,(hl) ;+3 ᥪ㭤 + ex de,hl + ld c,22h + rst 10h + pop ix + ret + + ENDMODULE + + + MODULE intdos +; +; "dos.h" +; 㭪 intdos ⢫ 믮 ⥬ -맮 ( ⮬ +; 䫠 ᫮), । 祭ﬨ ॣ஢,  +; union REGS *ri 頥 १ ⥬ 맮 union REGS *ro. +; ꥤ union REGS  "dos.h". +; ⢫ ⥬ 맮 intdos 믮 RST 10h. +; । 믮 㭪 ᮤন union REGS *ri +; ᮮ⢥騥 ॣ. ᫥ 믮 RST, 㭪 intdos +; 祭 ⥪ ॣ஢ union REGS *ro. ⠪ +; 頥 䫠 ᫮ ⥬ flag, ࠧ饭 union REGS *ro. +; ᫨  㫥, 䫠 㪠뢠 ᫮ 訡. +; +; union REGS *ri - 祭 ॣ஢ 맮 +; union REGS *ro - 祭 ॣ஢ +; +; in: hl = union REGS *ri +; de = union REGS *ro +; out: +; +; void intdos(union REGS *ri, union REGS *ro) +; +intdos_:: + push ix + push de ; de=REGS *ro + inc hl + ld a,(hl) ;+1 a + inc hl + ld c,(hl) ;+2 + inc hl + ld b,(hl) ;+3 + push bc + inc hl + ld e,(hl) ;+4 + inc hl + ld d,(hl) ;+5 + push de + inc hl + ld e,(hl) ;+6 l + inc hl + ld d,(hl) ;+7 h + inc hl + ld c,(hl) ;+8 xl + inc hl + ld b,(hl) ;+9 xh + push bc + pop ix + inc hl + ld c,(hl) ;+10 yl + inc hl + ld b,(hl) ;+11 yh + push bc + pop iy + ex de,hl ; hl + pop de + pop bc + rst 10h ; ⥬ -맮 + ex (sp),hl ; hl=REGS *ro + push bc + push af + pop bc + ld (hl),c ;+0 flag + inc hl + ld (hl),b ;+1 a + pop bc + inc hl + ld (hl),c ;+2 + inc hl + ld (hl),b ;+3 + inc hl + ld (hl),e ;+4 + inc hl + ld (hl),d ;+5 + inc hl + pop de + ld (hl),e ;+6 l + inc hl + ld (hl),d ;+7 h + push ix + pop bc + inc hl + ld (hl),c ;+8 xl + inc hl + ld (hl),b ;+9 xh + push iy + pop bc + inc hl + ld (hl),c ;+10 yl + inc hl + ld (hl),b ;+11 yh + pop ix + ret + + ENDMODULE + + + MODULE ffirst +; +; "dos.h" +; 㭪 ffirst ந pathname 䠩 㯯 +; 䠩. 㬥 pathname ᮤঠ ᪠ ⠫ ᪠. +; 䠩 ᪠ ᨬ ? *. 䠩 +; 室 ଠ DOS "filename.ext". +; 㭪 _ffirst ⫨砥 㭪樨 ffirst ⥬, 頥 +; 䠩 ଠ "FilenameExt". +; ᫨ 䠩 㦥, 㭪 (। "dos.h"), +; 㪠뢠 㬥 ffblk. +; 㬥 attr ᮤন ਡ() 䠩 ᪠ ਭ +; ᫥騥 祭, । "dos.h": +; +; FA_NORMAL 䠩 +; FA_RDONLY 쪮 ⥭ +; FA_HIDDEN 䠩 +; FA_SYSTEM ⥬ 䠩 +; FA_LABEL ⪠ ⮬ +; FA_DIREC ⠫ +; FA_ARCH 娢 +; +; oo 祭 ਡ⮢, o ᨬo "|" +; ( OR). +; 㭪 頥 0 ᯥ譮 襭 ᪠. +; ᫨ 䠩 䠩 ⨫ - 訡, +; 頥 -1 errno ᮤন 訡. +; +; char ffirst(char *pathname, FIND *ffblk, char attr) +; +_ffirst_:: + ld b,0 ; format "FilenameExt" + jr @1 + +ffirst_:: + ld b,1 ; format "filename.ext" +@1: ld a,c ; attr + ld c,19h ; f_first + push ix + rst 10h + pop ix + ld (errno_##),a + ld a,0 + ret nc + dec a + ret + + ENDMODULE + + + MODULE fnext +; +; "dos.h" +; 㭪 ந ᫥饣 ᮢ饣 䠩. +; 맮, 㭪 頥 䠩, , +; ࠬ 䠩 室 ࠬ ᪠. +; 㬥 ffblk 㪠뢠 (। "dos.h"), +; ।⥫쭮 㭪樥 ffirst. +; 㭪 頥 0 ᯥ譮 襭 ᪠. +; ᫨ 䠩 䠩 ⨫ - 訡, +; 頥 -1 errno ᮤন 訡. +; +; char fnext(FIND *ffblk) +; +fnext_:: + ex de,hl + ld c,1Ah ; f_next + push ix + rst 10h + pop ix + ld (errno_##),a + ld a,0 + ret nc + dec a + ret + + ENDMODULE diff --git a/third_party/solid-c/SRC/CLIB/IO.ASM b/third_party/solid-c/SRC/CLIB/IO.ASM new file mode 100644 index 0000000..6151c61 --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/IO.ASM @@ -0,0 +1,1174 @@ +; 㭪樨 ஢७. +; +; 室騥 㭪樨: +; +; errno - 祩 +; open +; close +; creat +; read +; write +; sleep +; chdir +; getcwd +; strerr - strerror +; perror +; isatty +; unlink +; remove +; mkdir +; rmdir +; rename +; getenv +; putenv +; sysenv +; seek +; lseek +; tell +; ltell +; ioctl - ⮢ +; + + + + + + + MODULE errno +;--------------------------------------------------------------------- +; errno variable +;--------------------------------------------------------------------- + dseg +errno_:: + db 0 ; . 訡 + + ENDMODULE + + + MODULE open +; +; "io.h" +;--------------------------------------------------------------------- +; creat() 㭪 -஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 creat ᮧ 䠩. +; ᫨ 䠩 㦥 , १ 㫥 . +; 祭 attr ⮨ ᪮쪨 ⠭: +; S_IWRITE S_IREAD,  "stat.h". ᫨ +; ⠭, ꥤ ᪮ "|". +; 㭪 頥 ਯ. +; 訡, 頥 祭 -1 (0FFFFh) errno +; ᮤন 訡. +; +; uint creat(char *name, int attr) +; uint creat(char *name, char attr) +;-------------------------------------------------------------------------- + +; "io.h" +;--------------------------------------------------------------------- +; open() 㭪 -஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 open 뢠 䠩, ।塞 path- ⠢ +; ᫥饬 ⥭ , । ।⢮ +; oflag. 㬥 oflag  楫 ࠦ, 騬 - +; 樨 ⠭,  "io.h". +; ᫨ ⠭, ꥤ +; ᪮ "|". 祭 㬥 oflag ਢ +; : +; +; O_RDWR ६ ⥭ . +; ᫨ 䫠, ࠭ +; 䫠 O_RDONLY, O_WRONLY. +; +; O_RDONLY ⮫쪮 ⥭. ᫨ +; 䫠, ࠭ 䫠 O_RDWR, +; O_WRONLY. +; +; O_WRONLY ⮫쪮 . ᫨ +; 䫠, ⠪ 䫠 O_RDONLY, +; ORDWR. +; +; O_TRUNC 騩 䠩 ⥭ , +; 祭 0. 䠩 ࠧ- +; 襭 . ন 䠩 㭨⮦. +; +; O_CREAT 䠩 ᮧ ⥭/; +; 䥪⨢, ᫨ 䠩, - +; 塞 path-. +; +; O_EXCL 頥 祭 訡, ᫨ +; 䠩, ।塞 path-. ਬ +; ⮫쪮 O_CREATE. +; +; O_APPEND ⥫ 䠩 ६ 䠩. +; ० O_RDONLY, O_TRUNC O_CREAT +; ᫠. +; +; 砭! O_TRUNC 㭨⮦ ᮤন 饣 +; 䠩, ⮬ 㦭 ⥫쭮 ᯮ짮 ⠭. +; +; 㭪 頥 ਯ 䠩, ᫨ Ok. +; 訡, 頥 祭 -1 (0FFFFh) 祩 errno ᮤন +; 訡. +; +; in: hl = *pathname (㪠⥫ 䠩) +; de = oflag (⨯ 権) +; out: hl = ਯ, ᫨ Ok +; hl = -1 訡 +; +; uint open(char *pathname, int oflag) +; uint open(char *pathname, char oflag) +; +creat_:: +open_:: + ; e=oflag + push ix + ld a,3 + and e ; mask 1,0 bits + xor 3 + ld d,a ; save "a" + ; a=0..2 + dec a + jr z,open ; O_RDONLY + ld a,0Ch + and e ; 3,2 bits ? + jr z,open ; no (O_WRONLY and O_RDWR) + ; O_CREAT or O_TRUNC + ld c,0Ah ; create file + bit 4,e + jr z,trunc ; no O_EXCL + inc c ; create new file +trunc: ld a,20h ; attr "archive" + rst 10h + jr op24 + ; +open: push de + ld a,d ; O_RDONLY, O_WRONLY, O_RDWR + ld c,11h + rst 10h + pop de + jr c,op24 ; file not found + bit 5,e ; O_APPEND + jr z,op24 ; no + ; . 㪠⥫ 䠩 + push af ; save file descriptor + ld hl,0 + push hl + pop ix + ld b,2 ; SEEK_END + ld c,15h ; move_fp + rst 10h + pop bc + ld a,b + ; +op24: ld l,a ; file descriptor + ld h,0 + pop ix + ret nc ; Ok + ld (errno_##),a + ld hl,-1 ; error + ret + +; +; "io.h" +;--------------------------------------------------------------------- +; 㭪 -஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 뢠 䠩. +; 㭪 頥 0, ᫨ 䠩 ᯥ譮 . +; 訡, 頥 祭 -1 (0FFFFh) errno +; ᮤন 訡. +; +; uint close(FD fd) +; +close_:: + push ix + ld a,l + ld c,12h + rst 10h + pop ix + ld hl,0 + ret nc ; Ok + ld (errno_##),a + dec hl ; -1 + ret + + ENDMODULE + + + MODULE read +; +; "io.h" +;--------------------------------------------------------------------- +; 㭪 -஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 ⠥ ᫮ count 䠩 buff. +; ⥭ 稭 ⥪饩 樨 㪠⥫ 䠩. +; 㭪 頥 ᫮ ॠ쭮 ⠭ ⮢, ஥ +; ,  count (ਬ - +; 䠩). aᨬao o ao, ooo oo +; oa aa a o a, ao 65534; oo 65535 +; (OxFFFF)  o⫨稬 o -1, oo 㤥 oa饭a +; o訡a. +; 㭪 頥 0, ᫨ ⪠ ⥭ 䠩. +; 訡 ⥭, 頥 -1 errno ᮤন 訡. +; +; size_t read(FD fd, void *buff, count) +; +read_:: + push ix + ld a,l ; file descriptor + ex de,hl ; hl = buffer address + ld e,c ; de = number of bytes to read + ld d,b + ld c,13h + rst 10h + ex de,hl ; hl = number of bytes actually read + pop ix + ret nc + ld (errno_##),a + ld hl,-1 + ret + + ENDMODULE + + + MODULE write +; +; "io.h" +;--------------------------------------------------------------------- +; 㭪 -஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 뢠 ᫮ count buff 䠩. +; 樨 稭 ⥪饩 樨 㪠⥫ 䠩. +; ᫨ 䠩 , 樨 믮 +; 䠩. ᫥ ⢫ 権 , 㪠⥫ 䠩 +; 㢥稢 ⢮ ॠ쭮 ᠭ ⮢. +; . ᫮ 뢠 ⮢ 䠩 ࠢ 65534; ᪮ +; ᫮ 65535  ⫨稬 -1, 頥 訡. +; 㭪 頥 ᫮ ॠ쭮 ᠭ . +; 訡 頥 祭 -1 errno ⠭- +; 訡. +; +; out: hl=᫮ ॠ쭮 . +; +; size_t write(FD fd, void *buff, count) +; +write_:: + push ix + ld a,l ; file descriptor + ex de,hl ; hl = buffer address + ld e,c ; de = number of bytes to write + ld d,b + ld c,14h + rst 10h + ex de,hl ; hl = number of bytes actually write + pop ix + ret nc + ld (errno_##),a + ld hl,-1 + ret + + ENDMODULE + + + MODULE sleep +; +; "dos.h" +; 㭪 ਮ⠭ 믮 +; ணࠬ seconds ᥪ㭤. +; ᫥ 믮 㭪樨, 뢠 +; 祭묨. +; +; void sleep(uint seconds) +; +sleep_:: + ei +@1: ld a,l + or h + ret z + ld a,49 ; 1/50 ᥪ㭤 +@2: halt + dec a + jr nz,@2 + dec hl + jr @1 + + ENDMODULE + + +; MODULE pid +; +; char getpid() -- MISIX only +; char getppid() -- MISIX only +; +;getppid_:: +; ld c,49h +; db 21h +;getpid_:: +; ld c,48h +; ld a,(_os_ver_##) +; cp 2 +; ld a,0 +; ret nz +; push ix +; call 5 +; pop ix +; ret +; +; ENDMODULE + + + MODULE chdir +; +; "direct.h" +; 㭪 ⥪騩 ⠫ ⥪騩 , ᫨ 㪠 +; pathname. ᫨ 稭 "\" - 砥 +; ୥ ⠫, ⥪饣. Pathname 뫠 +; 騩 ⠫. +; 㭪 頥 祭 0, ᫨ ࠡ稩 ⠫ ᯥ譮 . +; 訡, 頥 -1 (0FFh) errno ᮤন 訡. +; +; char chdir(char *pathname) +; +chdir_:: + ;push ix + ld c,1Dh + rst 10h + ld (errno_##),a + ;pop ix + ld a,0 + ret nc + dec a + ret + + ENDMODULE + + + MODULE getcwd +; +; "direct.h" +; 㭪 砥 ( 㪢 ᪠) path- ⥪饣 ⠫ +; ࠭ pathbuff. path- ⥪饣 - +; ⮨ ᨬ "\" ⥫ 㫥 ப. +; 㬥 len । ᨬ path-, +; 筮, ⮡ ଠ - +; ⥫ 㫥. ᨬ쭠 path- ࠢ 256 ⮢. +; ᫨ path- ॢ蠥 len, path- १ +; len, ⮬ ᨬ "\" ப ⠢. +; ᫨ 㬥 pathbuff ࠢ NULL, getcwd 뢠 malloc +; 뤥 ࠧ஬ len ⮢. 뤥 +; ᢮ ।⢮ 㭪樨 free. +; 㭪 頥 㪠⥫ pathbuff. +; 訡 頥 NULL errno ᮤন 訡. +; +; char *getcwd(char *pathbuff, int len) +; +getcwd_:: + ;push ix + ld (@6+1),de + ld a,l + or h + jr nz,@1 + ex de,hl ; hl=len + inc hl + call malloc_## + ld a,l + or h + ld a,30 ; ENOMEM (Not enough memory) + jr z,@4 + ; +@1: ld (@5+1),hl + ld hl,4100h ; exe-header as temp buffer + push hl + inc hl + inc hl + ; get current directory + ld c,1Eh + rst 10h + jr c,@3 + ex de,hl ; hl=end string + ld a,"\" + dec hl + dec hl + cp (hl) + jr z,@2 + inc hl + ld (hl),a + inc hl + ld (hl),0 + ; get current disk +@2: ld c,2 + rst 10h + pop hl + jr c,@4 + ld c,"A" + add a,c + ld (hl),a + inc hl + ld (hl),":" + dec hl ; hl=4100h + ; +@5: ld de,0 + push de +@6: ld bc,1 + ldir + xor a + ld (de),a + pop hl + ;pop ix + ret + ; +@3: pop hl +@4: ;pop ix + ld (errno_##),a + ld hl,0 ; NULL + ret + + ENDMODULE + + + MODULE strerr +; +; "string.h" +; ( ⮨ "strerror"). +; 㭪 ८ࠧ errno o ⥬ oo饭 o o訡 +; oaa aa⥫ a o. +; 㭪, ⫨稥 perror, 뢮 oo饭. 뢮 +; ᮮ饭 ॡ 맢a 㭪 oa (ਬ printf). +; 訡 ࠭ ६ errno,  譥 +; ஢ ᯮ ᨢ ⥬ ᮮ饭. +; ⥬ ᮮ饭 訡 㯭 १ ६ _errlst_, +;  ᨢ ⥬ ᮮ饭 訡. +; ⮡ ࠢ १, 㭪 strerr 맢 +; ࠧ ᫥ 筮 㭪樨, ⨢襩 訡. , 祭 +; errno १ᠭ ᫥ 맮 㭪権. +;  祭 errno, ᯮ㥬 , 㭪 strerr - +; 頥 㪠⥫ ப. +; +; in: a = ப 訡 +; out: hl = ப +; +; char *strerr(char errno) +; +strerr_:: + cp 50+1 + jr nc,@2 + ld e,a ; errno + ld d,0 + inc de + ld hl,_errlst_ ; array of system messages + ld bc,__nerr ; size of array +@1: xor a + cpir + ret po + ret nz + dec de + ld a,d + or e + jp nz,@1 + ret + ; +@2: ld hl,@3 + ret + ; +@3: db 0Dh,0Ah,0 + +; array of system messages +_errlst_:: + db 0 + db "No error",0 ; 0 + db "Invalid function",0 ; 1 + db "Invalid drive number",0 ; 2 + db "File not found",0 ; 3 + db "Path not found",0 ; 4 + db "Invalid handle",0 ; 5 + db "Too many open files",0 ; 6 + db "File already exists",0 ; 7 + db "File read only",0 ; 8 + db "Root overflow",0 ; 9 + db "No free space",0 ; 10 + db "Directory not empty",0 ; 11 + db "Can't delete current directory",0 ; 12 + db "Invalid media",0 ; 13 + db "Unknown operation",0 ; 14 + db "Directory exist",0 ; 15 + db "Invalid filename",0 ; 16 + db "Invalid EXE-file",0 ; 17 + db "Not supported EXE-file",0 ; 18 + db "Access denied",0 ; 19 + db "Not ready",0 ; 20 + db "Seek error",0 ; 21 + db "Sector not found",0 ; 22 + db "CRC error",0 ; 23 + db "Write protect",0 ; 24 + db "Read error",0 ; 25 + db "Write error",0 ; 26 + db "Drive failure",0 ; 27 + db "Extended error: 28",0 ; 28 + db "Extended error: 29",0 ; 29 + db "Not enough memory",0 ; 30 + db "Invalid memory block",0 ; 31 + db "Extended error: 32",0 ; 32 + db "Extended error: 33",0 ; 33 + db "Extended error: 34",0 ; 34 + db "35",0 ; 35 + db "36",0 ; 36 + db "37",0 ; 37 + db "38",0 ; 38 + db "39",0 ; 39 + db "40",0 ; 40 + db "41",0 ; 41 + db "42",0 ; 42 + db "43",0 ; 43 + db "44",0 ; 44 + db "45",0 ; 45 + db "46",0 ; 46 + db "47",0 ; 47 + db "48",0 ; 48 + db "49",0 ; 49 + db "50",0 ; 50 +_endlst_: + +__nerr equ _endlst_ - _errlst_ ; size of array + + ENDMODULE + + + MODULE perror +; +; "stdlib.h" +; 㭪 뢮 ᮮ饭 訡 stderr. +; ⮬ ᮮ饭 㬥 string 뢮 , ⥬ 뢮 +; 稥, ⥬ ᮮ饭 訡 ᫥ 筮 +; 맮, 襣 訡 ப. +; ᫨ 㬥 string ࠢ NULL, 㭪 ய᪠ ᮮ饭 string, +; 짮⥫ 뢮 ⮫쪮 ⥬ ᮮ饭 訡, +; ப. +; ⮡ 뢥 ࠢ १, 㭪 perror 맢 +; ࠧ ᫥ 筮 㭪樨, ⨢襩 訡. 祭 +; errno १ᠭ ᫥ 맮 㭪権. +; 㭪 perror 頥 祭. +; +; void perror(char *string) +; +perror_:: + ;push ix + ld a,l + or h + jr z,@1 + call cputs_## + ld hl,@2 + call cputs_## +@1: ld a,(errno_##) + call strerr_## + call cputs_## + ld a,0Ah + call putch_## + ;pop ix + ret + ; +@2: db ": ",0 + + ENDMODULE + + +; MODULE fcntl +; +; MISIX. +; +; int fcntl(FD fd, int mode, int arg) +; char fcntla +; +;fcntl_:: +;fcntla_:: +; ld a,(_os_ver_##) ; this function works ONLY in MISIX +; cp 2 +; jr nz,@1 +; ld h,e +; ld e,c +; ld d,b +; ld c,3Eh +; call 5 +; ld (errno_##),a +; or a +; ret z +;@1: ld a,-1 +; ld l,a +; ld h,a +; ret +; +; ENDMODULE + + + MODULE isatty +; +; "io.h" +;--------------------------------------------------------------------- +; 㭪 -஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 ।, ਭ ਯ +; ⠭ ⮪ (ନ, ᮫,...). +; 㭪 頥: +; true - ਯ ਭ ନ, ᮫. +; false - ਯ ਭ 䠩. +; +; in: l = ਯ +; out: a = true +; a = false +; +; BOOL isatty(FD fd) +; +isatty_:: + xor a + cp l + jr z,@1 ; stdin + bit 7,l ; stdout, stderr, ... ? + ret z ; no +@1: inc a + ret + + ENDMODULE + + + MODULE unlink +; +; "io.h" +; 㭪 㤠 䠩, । pathname. +; ᨬ * ? 䠩 ᪠. +; ਡ⮬ "⮫쪮 ⥭" 㤠 +; 㭪樥 - ।⥫쭮 㦭 ਡ. +; 㭪 頥 0, ᫨ 䠩 ᯥ譮 㤠. +; 訡, 頥 -1 (0FFh) errno ᮤন +; 訡. +; +; char unlink(char *pathname) +; char remove(char *pathname) +; +unlink_:: +remove_:: + push ix + ld c,0Eh + rst 10h + pop ix + ld (errno_##),a + ld a,0 + ret nc + dec a + ret + + ENDMODULE + + + MODULE mkdir +; +; "direct.h" +; 㭪 ᮧ ⠫ path-. +; 맮 㭪樨 ᮧ ⮫쪮 +; ⠫, ᫥ pathname. +; 㭪 頥 0, ᫨ ⠫ ᯥ譮 ᮧ. +; 訡, 頥 -1 (0FFh) errno ᮤন 訡. +; +; char mkdir(char *pathname) +; +mkdir_:: + push ix + ld c,1Bh + rst 10h + pop ix + ld (errno_##),a + ld a,0 + ret nc + dec a + ret + + ENDMODULE + + + MODULE rmdir +; +; "direct.h" +; 㭪 㤠 ⮩ ⠫, । pathname. +; 㤠 ⥪騩 ⠫ ୥. +; 㭪 頥 0, ᫨ ⠫ ᯥ譮 㤠. +; 訡, 頥 -1 (0FFh) errno ᮤন 訡. +; +; char rmdir(char *pathname) +; +rmdir_:: + push ix + ld c,1Ch + rst 10h + pop ix + ld (errno_##),a + ld a,0 + ret nc + dec a + ret + + ENDMODULE + + + MODULE rename +; +; "io.h" +; 㭪 २뢠 䠩 ⠫, । +; newname. Oldname path- 饣 䠩 +; ⠫. Newname । 㦥 饣 䠩 +; ⠫. +; 㭪 rename ᯮ짮 ६饭 䠩 +; ⠫ 㣮, 㪠 㣮 path- 㬥 newname. +; 㭪 頥 0, ᫨ 諠 ᯥ譮. +; 訡, 頥 -1 (0FFh) errno ᮤন 訡. +; +; char rename(char *oldname, char *newname) +; +rename_:: + push ix + ld c,10h + rst 10h + pop ix + ld (errno_##),a + ld a,0 + ret nc + dec a + ret + + ENDMODULE + + + MODULE getenv +; +; "stdlib.h" +; 㭪 頥 ६ 㦥 +; varname 㪠⥫ 祭 (ப) ⮩ ६. +; ᨬ쭠 ப 祭 ६ 㦥 +; 255 . +; 頥 祭 NULL, ᫨ ६ ⥪騩 +; ।. +; 訡 ⠪ 頥 NULL, errno 㤥 ᮤঠ +; 訡. +; +; in: hl = ६ +; out: hl = ப 祭 ६ +; +; char *getenv(char *varname) +; +getenv_:: + ;push ix + ld de,4000h ; exe-header as buffer for value + push de + ld bc,0146h ; get environment item + rst 10h + pop hl ; pointer to buffer for value + ;pop ix + jr c,@1 ; error + or a + jr z,@1 ; not found + ret +@1: ld (errno_##),a + ld hl,0 + ret + + ENDMODULE + + + MODULE putenv +; +; "stdlib.h" +; 㭪 ६ 㦥. +; 㬥 envstring 㪠⥫ ப ᫥饣 +; ଠ: +; +; VARNAME=VALUE +; +; : "VARNAME" - 塞 ६ 㦥 +; "VALUE - 祭 ⮩ ६. +; +; ப ࠧ ᨬ "=" ப +; 稢 㫥. +; +; 㭪 頥 0, ᫨ ᯥ譮 ࠡ⠫. +; 訡, 頥 祭 -1 errno ᮤন 訡. +; +; in: hl = ६ +; out: hl = 祭 ६ +; +; uint putenv(char *envstring) +; +putenv_:: + ;push ix + ld bc,0246h ; set environment item + rst 10h + ;pop ix + ld hl,0 + ret nc + ld (errno_##),a + dec hl + ret + + + ENDMODULE + + + MODULE sysenv +; +; "stdlib.h" +; 㭪 砥 ⥬ 㦥. +; 㬥 sysenv 㪠⥫ , ।祭 +; ⥬ 㦥. - +; , ⮡ ⥬ 㦥. ଠ +; ᫥騩: +; ப ६ 㦥 稢 . +; ப ᫥ ६ 㦥, ⮨ - +; ⥫ , 뢠騩, ६ . +; ਬ ( ᬮ ਠ): +; +; sysenv: db "PATH=c:\fn;c:\zx",0 +; db "SOLID=H",0 +; db 0 +; +; 㭪 頥 㪠⥫ sysenv. +; 訡, 頥 祭 -1 errno ᮤন +; 訡. +; +; in: hl = sysenv +; out: hl = sysenv +; +; char *sysenv(char *sysenv) +; +sysenv_:: + ;push ix + push hl + ld bc,0046h ; set system environment + rst 10h + pop hl + ;pop ix + ret nc + ld (errno_##),a + ld hl,-1 + ret + + ENDMODULE + + +; MODULE dup +; +; "io.h" +; ன ਯ ⮣ 䠩. +; ਯ ⨯ 㯠 䠩. +; 㭪 頥 2- ਯ. +; 訡, 頥 -1 (0FFFFh) errno ⠭ +; ᫥ 祭: +; +; EBADF - ਯ 䠩. +; EMFILE - 㣨 ਯ 䠩 +; 㯭, .. +; 䠩. +; +; FD dup(FD fd) +; +;dup_:: ld a,(_os_ver_##) +; or a +; ret z +; push ix +; dec a +; jr z,du1 +; ld h,0 +; ld c,3Eh +; call 5 +; pop ix +; ret +;du1: ld b,l +; ld c,47h +; call 5 +; pop ix +; ld l,b +; ld h,0 +; ret +; +; ENDMODULE + + +; MODULE dup2 +; +; "io.h" +; 㭪 ਯ fp2 뫪 ᠬ +; 䠩, 뫠 ਯ fp1. ᫨ ६ 맮 ⮩ +; 㭪樨, fp2 易 䠩, 䠩 뢠. +; fp1 - ਯ ⮣ 䠩 +; fp2 -  祭 ਯ +; 㭪 頥 0 砥 ᯥ. +; 訡, 頥 -1 (0FFFFh) errno ⠭ +; ᫥ 祭: +; +; EBADF - ਯ 䠩 +; EMFILE - 㣨 ਯ 䠩 㯭, +; .. 䠩 +; +; char dup2(FD fp1, FD fp2) -- MISIX only +; +;dup2_::ld a,(_os_ver_##) +; cp 2 +; ret nz +; ld h,1 +; ld c,3Eh +; push ix +; call 5 +; pop ix +; ret +; +; ENDMODULE + + + MODULE seek +; +; "io.h" +;--------------------------------------------------------------------- +; 㭪 -஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 ⠭ 㪠⥫ 䠩 ᯮ, +; ஥ । ᬥ饭 offset. ६饭 । +; 㬥⮬ type. 䠩 믮 +; ᯮ 㪠⥫. ६饭 㪠⥫ +; 65534. ᫨ 㦭 ६ 㪠⥫ 襥 祭, +; 室 ᯮ짮 㭪 lseek. +; 㬥 type ᫥ ⠭, । +; "io.h": +; +; SEEK_SET 砫 䠩 +; SEEK_CUR ⥪饩 樨 㪠⥫ 䠩 +; SEEK_END 䠩 +; +; 㭪 頥 祭 㪠⥫. +; 訡 頥 -1 errno ᮤন 訡. +; ⠭ 㪠⥫ । 䠩, 訡 뢠. +; ன, ᯮᮡ (⠪ ନ +; ਭ), 頥 祭 -1. +; +; uint seek(FD fd, uint offset, int type) +; uint seek(FD fd, uint offset, char type) +; +seek_:: + bit 7,l ; std... devices ? + jr nz,@1 ; yes + push ix + ld a,l + ld hl,0 + push de + pop ix + ld b,c + ld c,15h + rst 10h + push ix + pop hl + pop ix + ret nc + ld (errno_##),a +@1: ld hl,-1 + ret + + ENDMODULE + + + MODULE tell +; +; "io.h" +;--------------------------------------------------------------------- +; 㭪 -஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 頥 ⥪ 㪠⥫ 䠩. +; ࠦ ᫮ ⮢ 砫 䠩. +; 祭 頥 㪠⥫ 65534. ᫨ +; 㦭 襥 祭, 室 ᯮ짮 㭪 +; ltell. +; 訡 頥 -1 errno ᮤন 訡. +; ன, ᯮᮡ (⠪ ନ +; ਭ), 頥 祭 -1. +; +; uint tell(FD fd) +; +tell_:: + bit 7,l ; std... devices ? + jr nz,@1 ; yes + push ix + ld a,l + ld hl,0 + push hl + pop ix + ld b,1 + ld c,15h + rst 10h + push ix + pop hl + pop ix + ret nc + ld (errno_##),a +@1: ld hl,-1 + ret + + ENDMODULE + + + MODULE lseek +; +; "io.h" +;--------------------------------------------------------------------- +; 㭪 -஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 ⠭ 㪠⥫ 䠩 ᯮ, +; ।塞 㬥⠬ high low, ᮮ⢥⢥ - +; 32- ⭮ 祭 ६饭. +; ६饭 । 㬥⮬ type. +; 䠩 믮 ᯮ 㪠⥫. +; 㬥 type ᫥ ⠭, । +; "io.h": +; +; SEEK_SET 砫 䠩 +; SEEK_CUR ⥪饩 樨 㪠⥫ 䠩 +; SEEK_END 䠩 +; +; 㭪 頥 f_point, । "types.h" +; 訡 頥 -1 errno ᮤন 訡. +; ⠭ 㪠⥫ । 䠩, 訡 뢠. +; ன, ᯮᮡ (⠪ ନ +; ਭ), 頥 祭 -1. +; +; Usage: +; +; static f_point *p; // "f_point *p" 㭪樨 +; +; p = lseek(FD fd, p->high, p->low, type); +; printf("value: %X %X\n", p->high, p->low); +; +; +; struct fpoint *lseek(FD fd, uint high, uint low, int type) +; struct fpoint *lseek(FD fd, uint high, uint low, char type) +; +lseek_:: + bit 7,l ; std... devices ? + jr nz,@1 ; yes + ld a,l ; descriptor + push ix + push bc + pop ix ; low + ld hl,4 + add hl,sp + ld b,(hl) ; type + ex de,hl ; hl=high + ld c,15h + rst 10h + ld (high),hl + ld (low),ix + ld hl,low + pop ix + ret nc + ld (errno_##),a +@1: ld hl,-1 + ret + +low: dw 0 +high: dw 0 + + ENDMODULE + + + MODULE ltell +; +; "io.h" +;--------------------------------------------------------------------- +; 㭪 -஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 砥 ⥪ 㪠⥫ 䠩. +; ࠦ ᫮ ⮢ 砫 䠩. +; 㭪 頥 f_point, । "types.h" +; 訡 頥 -1 errno ᮤন 訡. +; ன, ᯮᮡ (⠪ ନ +; ਭ), 頥 祭 -1. +; +; Usage: +; +; static f_point *p; // "f_point *p" 㭪樨 +; +; p = ltell(FD fd); +; printf("value: %X %X\n", p->high, p->low); +; +; +; struct fpoint *ltell(FD fd) +; +ltell_:: + bit 7,l ; std... devices ? + jr nz,@1 ; yes + push ix + ld a,l + ld hl,0 + push hl + pop ix + ld bc,0115h + rst 10h + ld (high),hl + ld (low),ix + ld hl,low + pop ix + ret nc + ld (errno_##),a +@1: ld hl,-1 + ret + +low: dw 0 +high: dw 0 + + ENDMODULE + + + MODULE ioctl +; +; "io.h" +;--------------------------------------------------------------------- +; 㭪 -஢ /뢮 +;--------------------------------------------------------------------- +; +; int ioctl(FD fd, int cmd[,*argdx, argcx]) -- MS-DOS +; +; 㭪 ।祭 ࠢ ன /뢮 䠩. +; ᯮ ⥬ 맮 044 MS-DOS. ࠬ cmd 㪠뢠 +; ன⢠: +; +; ------+------------------------------------------------------ +; cmd | +; ------+------------------------------------------------------ +; 0 | ଠ ன⢥. (rst 08h, 58h) +; 1 | ⠭ ଠ ன⢥. (rst 08h, 59h) +; 2 | argcx 1 , 㪠 argdx. +; 3 | argcx , 㪠 argdx. +; 4 | 筮 2, ⮫쪮 handle +; | ன⢠ (0=⥪騩, 1=A ..). +; 5 | 筮 3, ⮫쪮 handle +; | ன⢠ (0=⥪騩, 1=A ..). +; 6 | . +; 7 | 뢮. +; 8 | Test removability; DOS 3.x only. +; 11 | Set sharing conflict retry count; DOS 3.x only. +; ------+------------------------------------------------------ +; +; 饭 㪠⥫ ... ஫ /䠩. +; 訡, 㭪 頥 -1. +; +; int ioctl(FD fd, char func, int arg) +; ;char ioctla(FD fd, char func, int arg) -- DOS2 only +; +;ioctla_:: +ioctl_:: + ret + push ix + ld a,e ; func + ld e,c ; de=arg + ld d,b + ld b,l ; FD fd ਯ + ld c,4Bh + call 5 + pop ix + ex de,hl ; hl = .. ? + ret + + ENDMODULE diff --git a/third_party/solid-c/SRC/CLIB/MALLOC1.ASM b/third_party/solid-c/SRC/CLIB/MALLOC1.ASM new file mode 100644 index 0000000..e22c480 --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/MALLOC1.ASM @@ -0,0 +1,660 @@ +; 室騥 㭪樨: +; +; sbrk (뤥. 㪠. ᢮. "$MEMRY" ⥪) +; brk +; free +; malloc +; calloc +; realoc +; + + + + + + MODULE sbrk +; +; "malloc.h" +; 뤥 n । 㪠⥫ +; ᢮ 㪠⥫ ⥪. +; 祭 n ⥫, ⮣ ⢮ +; 墠祭 㬥蠥 n ⮢. +; ᯥ譮 뤥 頥 㪠⥫ 뤥- +; . +; ᫨ 筮, 頥 -1 (0FFFFh). +; +; in: hl = ࠧ +; out: hl = 㪠⥫ 뤥. , ᫨ Ok. +; hl = -1 ⪥ . +; +; char *sbrk(int n) +; +sbrk_:: + ld de,($MEMRY) ; 㪠⥫ ᢮. + add hl,de + jr c,sbrkerr ; ९. ᫠ + call brk_ + ld a,h + and l + inc a + ret z ; 訡 + ex de,hl ; hl=砫 뤥. + ret + +; Set free memory pointer. +; int brk(int n) +brk_:: + push hl + inc h + inc h ; + 512 bytes reserved + or a + sbc hl,sp ; 뤥 + pop hl + jr nc,sbrkerr ; + ld ($MEMRY),hl ; . 㪠⥫ ᢮. + ret + ; +sbrkerr:ld hl,-1 ; EOF 訡 + ret + +; 㪠⥫ 砫 ᢮ ( ⥪) +$MEMRY:: + dw 0 ; ஬! + + ENDMODULE + + + MODULE free +; +; "malloc.h", "stdlib.h" +; 㭪 ᢮ . +; 㬥 ptr 㪠뢠 ࠭ 墠祭 +; ।⢮ 맮 malloc, calloc, realloc. +; 頥 祭 . +; +; void free(char *ptr) +; +free_:: + dec hl + dec hl + dec hl + dec hl ; 砫 + ld c,l + ld b,h + ld hl,(_alloc_) + ld (?49+1),hl + ex de,hl +@22: ld a,e + sub c + ld a,d + sbc a,b + jr nc,@19 + ld l,e + ld h,d + ld a,c + sub (hl) + inc hl + ld a,b + sbc a,(hl) + jr c,@20 +@19: ld l,e + ld h,d + ld a,e + sub (hl) + inc hl + ld a,d + sbc a,(hl) + jr c,@21 + ld a,e + sub c + ld a,d + sbc a,b + jr c,@20 + ld l,e + ld h,d + ld a,c + sub (hl) + inc hl + ld a,b + sbc a,(hl) + jr c,@20 +@21: ex de,hl + ld e,(hl) + inc hl + ld d,(hl) + ld (?49+1),de + jr @22 + ; +@20: ld l,e + ld h,d + ld (?48+1),bc + ld c,(hl) + inc hl + ld b,(hl) + push bc +?48: ld bc,0 ; . 祭 + ld hl,2 + add hl,bc + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + add hl,hl ;1+1=2 + add hl,hl ;2+2=4 + add hl,bc + ld (?48+1),bc + pop bc + push de + ld a,l + cp c + jr nz,$+4 + ld a,h + cp b + jr nz,@23 + ld hl,(?48+1) + push hl + inc hl + inc hl + ld e,(hl) + inc hl + ld d,(hl) + push hl +?49: ld hl,0 ; . 祭 + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + inc hl + inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + add hl,de + ex de,hl + pop hl + ld (hl),d + dec hl + ld (hl),e + ld hl,(?49+1) + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld c,(hl) + inc hl + ld b,(hl) + pop hl + ld (hl),c + inc hl + ld (hl),b + jr @24 + ; +@23: ex de,hl + ld c,(hl) + inc hl + ld b,(hl) + ld hl,(?48+1) + ld (hl),c + inc hl + ld (hl),b +@24: pop de + ld hl,2 + add hl,de + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + add hl,hl + add hl,hl + add hl,de + push de + ld bc,(?48+1) + ld a,l + cp c + jr nz,$+4 + ld a,h + cp b + jr nz,@25 + ld hl,2 + add hl,de + push de + ld e,(hl) + inc hl + ld d,(hl) + push hl + ld hl,2 + add hl,bc + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + add hl,de + ex de,hl + pop hl + ld (hl),d + dec hl + ld (hl),e + ld l,c + ld h,b + ld c,(hl) + inc hl + ld b,(hl) + pop de + ex de,hl + ld (hl),c + inc hl + ld (hl),b + jr @26 + ; +@25: ex de,hl + ld (hl),c + inc hl + ld (hl),b +@26: pop hl + ld (_alloc_),hl + ret + +; 祩 뤥. +_alloc_:: + dw 0 + + dseg +; +_base_:: + dw 0 ; addr next free block + dw 0 ; size of this free block + + ENDMODULE + + + MODULE malloc +; +; "malloc.h", "stdlib.h" +; 㭪 墠뢠 ࠧ஬ size ⮢. +; 㭪 頥 㪠⥫ 뤥 . +; ᫨ ᢮ 筮, 頥 NULL. +; +; char *malloc(int size) +; +malloc_:: + inc hl + inc hl + inc hl + srl h ; hl/4 + rr l + srl h + rr l + inc hl + ld (units+1),hl ; ࠧ + ld hl,(_alloc_##) + ld a,l + or h + jr nz,@0 + ld (_base_##+2),hl ; . ࠧ 뤥. + ld hl,_base_## ; + ld (_alloc_##),hl ; 뤥. + ld (_base_##),hl ; ᫥. + ; +@0: ld (prev+1),hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld (tp+1),hl ; hl=_base_ +@3: ld hl,(tp+1) + ld c,(hl) + inc hl + ld b,(hl) + ld a,l + cp c + jp nz,@1 + ld a,h + cp b + jp z,@1 + inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + add hl,hl ; *4 + add hl,hl ; + ex de,hl + ld hl,(tp+1) + add hl,de + ld a,l + cp c + jp nz,@1 + ld a,h + cp b + jp nz,@1 + ld hl,(tp+1) + ld e,l; + ld d,h; + ld c,(hl) + inc hl + ld b,(hl) + ld hl,(_alloc_##) + ld a,l + cp c + jr nz,@2 + ld a,h + cp b + jr nz,@2 + ;ld hl,(tp+1) + ld l,e; + ld h,d; + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld (_alloc_##),hl +@2: ;ld hl,(tp+1) + ex de,hl; + ld c,l; + ld b,h; + inc hl + inc hl + ld e,(hl) + inc hl + ld d,(hl) + push hl + ;ld hl,(tp+1) + ld l,c; + ld h,b; + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + inc hl + inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + add hl,de + ex de,hl + pop hl + ld (hl),d + dec hl + ld (hl),e + ;ld hl,(tp+1) + ld l,c; + ld h,b; + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ;ld c,(hl) + ;inc hl + ;ld b,(hl) + ;ld hl,(tp+1) + ;ld (hl),c + ;inc hl + ;ld (hl),b + ld a,(hl); + ld (bc),a; + inc hl; + inc bc; + ld a,(hl); + ld (bc),a; + jp @3 + ; +@1: ld hl,(tp+1) + inc hl + inc hl + ld c,(hl) + inc hl + ld b,(hl) +units: ld hl,0 ; ࠧ + ld a,c + sub l + ld a,b + sbc a,h + jp c,@4 + ld hl,(tp+1) + ld e,l; + ld d,h; + inc hl + inc hl + ld c,(hl) + inc hl + ld b,(hl) + ld hl,(units+1) ; ࠧ + ld a,c + cp l + jr nz,@5 + ld a,b + cp h + jr nz,@5 + ;ld hl,(tp+1) + ex de,hl; + ld c,(hl) + inc hl + ld b,(hl) +prev: ld hl,0 ; . 祭 + ld (hl),c + inc hl + ld (hl),b + jp @6 + ; +@5: ;ld hl,(units+1) ; hl=(units+1) ࠧ + add hl,hl + add hl,hl + ex de,hl + ;ld hl,(tp+1) + add hl,de + ld (_alloc_##),hl + ex de,hl + ld hl,(prev+1) + ld (hl),e + inc hl + ld (hl),d + ld hl,(tp+1) + ld c,(hl) + inc hl + ld b,(hl) + ;ld hl,(_alloc_##) + ex de,hl; + ld (hl),c + inc hl + ld (hl),b + ;ld hl,(tp+1) + ;inc hl + ex de,hl; + inc hl + ld c,(hl) + inc hl + ld b,(hl) + ;ld hl,(units+1) ; ࠧ + ld de,(units+1) + ld a,c + sub e ;l + ld c,a + ld a,b + sbc a,d ;h + ld b,a + ld hl,(_alloc_##) + inc hl + inc hl + ld (hl),c + inc hl + ld (hl),b + ;ld de,(units+1) ; ࠧ + ld hl,(tp+1) + inc hl + inc hl + ld (hl),e + inc hl + ld (hl),d +@6: ld hl,(prev+1) + ld (_alloc_##),hl +tp: ld hl,0 ; . 祭 + ld (hl),0 + inc hl + ld (hl),0 + inc hl + inc hl + inc hl ; ३ 뤥. + ret + ; +@4: ld de,(tp+1) + ld hl,(_alloc_##) + ld a,e + cp l + jr nz,@7 + ld a,d + cp h + jr nz,@7 + ld hl,512 + call sbrk_## + ld (tp+1),hl + ld a,l + and h + inc a + jr nz,@8 + inc hl ; NULL + ret + ; +@8: ld (hl),0 + inc hl + ld (hl),0 + inc hl + ld (hl),128 ; 512/sizeof(FREE) + inc hl + ld (hl),0 + inc hl + call free_## + ld hl,(_alloc_##) + ld (tp+1),hl +@7: ld hl,(tp+1) + ld (prev+1),hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld (tp+1),hl + jp @3 + + ENDMODULE + + + MODULE calloc +; +; "malloc.h", "stdlib.h" +; 㭪 墠뢠 ࠭⢮ ࠭ ᨢ n ⮢, +; ࠧ஬ size . 樠 0. +; 㭪 頥 㪠⥫ 墠祭 ࠭⢮. +; ᫨ 筮 , 頥 祭 NULL. +; +; char *calloc(int n, int size) +; +calloc_:: + call ?MULHD## ; n * size = ࠧ ᥣ ᨢ + ld (@34+1),hl + call malloc_## ; 뤥 + ld a,l + or h + ret z ; 筮 (hl=NULL) +@34: ld bc,0 ; . ࠧ ᨢ + ld (hl),0 ; + push hl + ld d,h + ld e,l + inc de + dec bc + ldir + pop hl ; Ok + ret + + ENDMODULE + + + MODULE realloc +; +; "malloc.h" +; 㭪 ࠧ ࠭ 뤥 . +; 㬥 ptr 㪠뢠 砫 . 㬥 size +; ࠧ . ন . +; ᫨ size ࠢ 0, ᢮ 頥 NULL. +; ᫨ ptr ࠢ NULL, ⢮ ( malloc) size ⮢ +; 頥 㪠⥫ . +; 㬥 ptr 㪠뢠 , ᢮ +; ०, 祬 ᫥ 맮 malloc, calloc, realloc. +; 㭪 頥 㪠⥫ १墠祭 . +; ।, ᫨ ࠧ , ⮬ - +; ptr 㭪樨 realloc 易⥫쭮 ⠪ , +; 頥 祭. +; 頥 祭 NULL, ᫨ 筮 ७ +; ࠧ. ⮬ ࢮ砫 ⠥ +; . +; +; char *realloc(*ptr, int size); +; +realloc_:: + ld a,l + or h + jr nz,@0 ; *ptr != NULL + ex de,hl + jp malloc_## + ; +@0: ld a,e + or d + jr nz,@1 ; size != 0 + call free_## + ld hl,0 ; NULL + ret + ; +@1: push hl ; *ptr + dec hl + ld a,(hl) + dec hl + ld l,(hl) ; hl=ࠧ ptr + ld h,a + add hl,hl ; + add hl,hl ; *4 + dec hl + dec hl + dec hl + dec hl + ld (osize+1),hl + pop hl + push de ; size + push hl ; ptr + push de + call free_## + pop hl ; size + call malloc_## + ld (@3+1),hl ; + pop de ; ptr + pop bc ; size + ld a,l + or h + jr z,@3 ; 訡 + ; alloc != ptr + ld a,l + cp e + jr nz,osize + ld a,h + cp d + jr z,@3 +osize: ld hl,0 ; . 祭 + ; size > osize ? + ld a,l + sub c + ld a,h + sbc a,b + jr nc,@2 ; osize > size + ld c,l ; bc=osize + ld b,h +@2: ex de,hl ; hl = *ptr + ld de,(@3+1) + call movmem_## ; hl=from, de=to, bc=size +@3: ld hl,0 ; . 㪠⥫ + ret + + ENDMODULE diff --git a/third_party/solid-c/SRC/CLIB/MEM.ASM b/third_party/solid-c/SRC/CLIB/MEM.ASM new file mode 100644 index 0000000..c5c7c60 --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/MEM.ASM @@ -0,0 +1,156 @@ +; 室騥 㭪樨: +; +; movmem +; memset +; memcpy +; memmove +; memcmp +; + + + + + MODULE movmem +; +; "mem.h" +; 㭪 movmem len source destin. +; ᫨ 室 १ ப ४뢠, +; ஢ -ࠢ ந ४⭮. +; +; 㭪 setmem ⠭ len addr +; 祭 value. +; +; void movmem(*source, *destin, len) +; void setmem(*addr, len, char value) +; +setmem_:: + ld a,b + or c + ret z + ld (hl),e ; value + ld e,l + ld d,h + inc de + dec bc +movmem_:: + ld a,b + or c + ret z + ldir + ret + + ENDMODULE + + + MODULE memset +; +; "mem.h" +; 㭪 count dest ᨬ "c". +; 㭪 頥 㪠⥫ dest. +; +; void *memset(*dest, c, count) +; +memset_:: + push hl + call setmem_## + pop hl ; dest + ret + + ENDMODULE + + + MODULE memcpy +; +; "mem.h" +; 㭪 count ⮢ source dest. +; ᫨ ⪨ source dest ४뢠, 㭪 +; ࠭, ४뢠 ⪠, ਭ- +; 騥 source, ᪮஢ । १. +; 㭪 頥 㪠⥫ dest. +; +; void *memcpy(*dest, *source, count) +; +memcpy_:: + ld a,b + or c + ret z ; count = 0 + push hl + ex de,hl + ldir + pop hl ; dest + ret + + ENDMODULE + + + MODULE memmove +; +; "mem.h" +; 㭪 o count ⮢ source dest. +; ᫨ oo o source dest ४뢠, 㭪 +; ࠭, o o source ४뢠饩 o +; oo । ९뢠. +; 㭪 頥 㪠⥫ dest. +; +; void *memmove(*dest, *source, count) +; +memmove_:: + ld a,b + or c + ret z ; count = 0 + push hl + ex de,hl + ld a,d + cp h + jr nz,@1 + ld a,e + cp l +@1: jr nc,@2 + ldir + pop hl + ret +@2: add hl,bc + ex de,hl + add hl,bc + ex de,hl + lddr + pop hl + ret + + ENDMODULE + + + MODULE memcmp +; +; "mem.h" +; 㭪 ந ᫥⥫쭮 ᨣ. ࠢ +; count ⮢ buf1 buf2, த , +; ᮢ, 믮 ⢮ +; ࠢ count. +; 㭪 頥 祭, 㪠뢠饥 ᮮ⭮襭 +; ஢: +; < 0 buf1 < buf2 +; = 0 buf1 = buf2 +; > 0 buf1 > buf2 +; +; int memcmp(*buf1, *buf2, count) +; +memcmp_:: + ld a,(de) + sub (hl) + jr nz,@1 + inc hl + inc de + dec bc + ld a,b + or c + jp nz,memcmp_ + ld h,a ; hl = 0 + ld l,a + ret +@1: ld hl,1 ; hl = 1 + ret nc + ld hl,-1 ; hl = -1 + ret + + ENDMODULE diff --git a/third_party/solid-c/SRC/CLIB/MOUSE.ASM b/third_party/solid-c/SRC/CLIB/MOUSE.ASM new file mode 100644 index 0000000..7d18a6d --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/MOUSE.ASM @@ -0,0 +1,566 @@ +; 室騥 㭪樨: +; +; ms_init (initMouse) +; ms_show (showMouse) +; ms_hide (hideMouse) +; ms_stat (getStatMouse) +; msgstat (getGStatMouse) +; ms_spos (setPosMouse) +; ms_ybnd (yLimMouse) +; ms_xbnd (xLimMouse) +; ms_scur (setCursMouse) +; ms_tcur (setTxtMouse) +; ms_gcur (getCursMouse) +; ms_gsen (getSensMouse) +; ms_ssen (setSensMouse) +; ms_hard (hardMouse) +; ms_vmod (vmodeMouse) +; ms_ref (refreshMouse) +; + + + + + MODULE msinit +; +; "mouse.h" +; Initialization the mouse driver. +; Returns 0 if mouse installed, -1 if not. +; +; char initMouse(void) +; +ms_init_:: + ld c,0 + rst 30h + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE + + + MODULE msshow +; +; "mouse.h" +; 㭪 뢮 ࠭ , ᫥ +; ६饭 ᮢ뢠 . +; +; 訡, 頥 祭 -1 errno +; ᮤন 訡. +; +; char showMouse(void) +; +ms_show_:: + ld c,1 + rst 30h + ld (errno_##),a + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE + + + MODULE mshide +; +; "mouse.h" +; 㭪 ࠥ ࠭, ࠩ த +; ᫥ ६饭 ⨥ . +; +; 訡, 頥 祭 -1 errno +; ᮤন 訡. +; +; char hideMouse(void) +; +ms_hide_:: + ld c,2 + rst 30h + ld (errno_##),a + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE + + + MODULE msstat +; +; "mouse.h" +; ⥭ ﭨ . +; 㭪 頥 ⥪騥 ⥪⮢ न +; ﭨ . +; 㭪 頥 㪠⥫ MSSTAT, । +; "mouse.h". +; 訡, 頥 祭 -1 (0FFFFh) errno ᮤন +; 訡. +; +; 室 : +; A - ﭨ +; 0 bit - +; 1 bit - ࠢ +; HL - Y/X ⥪. न +; +; MSSTAT *getStatMouse() +; +ms_stat_:: + ld c,3 ; . 誨 + rst 30h + jr c,@1 + ld (button),a + srl h + rr l + srl h + rr l + srl l + ld a,e ; Y न (0-255) + rra + rra + rra + and 1Fh + ld h,a ; hl = Y/X . + ld (x),hl + ld hl,button ; Ok + ret + ; +@1: ld (errno_##),a + ld hl,-1 ; error + ret + + dseg +button: db 0 +x: dw 0 ; Y/X ⥪. न + + ENDMODULE + + + MODULE msgstat +; +; "mouse.h" +; ⥭ ﭨ . +; 㭪 頥 ⥪騥 ᪨ न +; ﭨ . +; 㭪 頥 㪠⥫ MSGSTAT, । +; "mouse.h". +; 訡, 頥 祭 -1 (0FFFFh) errno ᮤন +; 訡. +; +; 室 : +; A - ﭨ +; 0 bit - +; 1 bit - ࠢ +; HL - x-न +; DE - y-न +; +; MSGSTAT *getGStatMouse() +; +msgstat_:: + ld c,3 + rst 30h + ld (button),a + ld (errno_##),a + ld (x),hl + ld (y),de + ld hl,button ; Ok + ret nc + ld hl,-1 ; error + ret + + dseg +button: db 0 +x: dw 0 +y: dw 0 + + ENDMODULE + + + MODULE msspos +; +; "mouse.h" +; ⠭ ⥪⮢ न . +; 㭪 ६頥 न. +; +; 訡, 頥 祭 -1 errno ᮤন +; 訡. +; +; 室 : +; HL - +; DE - ப +; +; char setPosMouse(int col, int line) +; +ms_spos_:: + sla l ; *2 + rl h + sla l + rl h ; hl = X pos + ld a,e + and 1Fh + rla + rla + rla + ld e,a ; de = Y pos + ld c,4 + rst 30h + ld (errno_##),a + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE + + + MODULE mssgpos +; +; "mouse.h" +; ⠭ ᪨ न . +; 㭪 ६頥 न. +; +; 訡, 頥 祭 -1 errno ᮤন +; 訡. +; +; 室 : +; HL - x-न +; DE - y-न +; +; char setGPosMouse(int x, int y) +; +mssgpos_:: + ld c,4 + rst 30h + ld (errno_##),a + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE + + + MODULE msybnd +; +; "mouse.h" +; ⨪ ࠭ ६饭 . +; 㭪 ᨬ न, +; ६ ⨪. +; +; 訡, 頥 祭 -1 errno ᮤন 訡. +; +; 室 : +; HL - y-쭠 +; DE - y-ᨬ쭠 +; +; char yLimMouse(int miny, int maxy) +; +ms_ybnd_:: + ld c,7 + rst 30h + ld (errno_##),a + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE + + + MODULE msxbnd +; +; "mouse.h" +; ਧ⠫ ࠭ ६饭 . +; 㭪 ࠢ ᨬ न, +; ६ ਧ⠫. +; +; 訡, 頥 祭 -1 errno ᮤন 訡. +; +; 室 : +; HL - x-쭠 +; DE - x-ᨬ쭠 +; +; char xLimMouse(uint minx, uint maxx) +; +ms_xbnd_:: + ld c,8 + rst 30h + ld (errno_##),a + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE + + + MODULE msscur +; +; "mouse.h" +; 㧪 ࠦ . +; 㭪 㦠 ࠦ ࠩ +; ⨢ ࠦ. +; । 맮 㭪樨, +; MSCURS, । "mouse.h". +; +; 訡, 頥 祭 -1 errno ᮤন +; 訡. +; +; 室 : +; H - +; L - ਭ +; D - Y ⨢ 窠 +; E - X ⨢ 窠 +; IX - ࠦ +; +; char setCursMouse(MSCURS *p) +; +ms_scur_:: + push ix + ld c,(hl) ; width + inc hl + ld b,(hl) ; high + inc hl + ld e,(hl) ; xpoint + inc hl + ld d,(hl) ; ypoint + inc hl + ld a,(hl) ; *buffer + ld lx,a + inc hl + ld a,(hl) + ld hx,a + ld l,c + ld h,b + ld bc,9 + rst 30h + pop ix + ld (errno_##),a + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE + + + MODULE mstcur +; +; "mouse.h" +; ⠭ ⥪⮢ ०. +; 㭪 ⠭ ᨬ ਡ +; ⥪⮢ ०. +; 訡, 頥 祭 -1 errno ᮤন +; 訡. +; +; 室 : +; E - XOR attribut mask +; D - AND attribut mask +; L - XOR simbol mask +; H - AND simbol mask +; +; char setTxtMouse(MSTXT *p) +; +ms_tcur_:: + ld e,(hl) ; XOR attribut mask + inc hl + ld d,(hl) ; AND attribut mask + inc hl + ld a,(hl) ; XOR simbol mask + inc hl + ld h,(hl) ; AND simbol mask + ld l,a + ld bc,0Ah + rst 30h + ld (errno_##),a + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE + + + MODULE msgcur +; +; "mouse.h" +; 祭 ࠦ ࠩ . +; 㭪 頥 㪠⥫ MSCURS, +; । "mouse.h". +; 訡, 頥 祭 -1 (0FFFFh) errno ᮤন +; 訡. +; +; 室 : +; IX - ࠦ +; +; 室 : +; H - +; L - ਭ +; D - Y ⨢ 窠 +; E - X ⨢ 窠 +; +; MSCURS *getCursMouse(char *buffer) +; +ms_gcur_:: + push ix + push hl + pop ix + ld (buff),hl + ld c,0Bh + rst 30h + pop ix + ld (errno_##),a + ld (width),hl + ld (xpoint),de + ld hl,width ; Ok + ret nc + ld hl,-1 ; error + ret + + dseg +width: db 0 ; ਭ + db 0 ; +xpoint: db 0 ; X ⨢ 窠 + db 0 ; Y ⨢ 窠 +buff: dw 0 ; ࠦ + + ENDMODULE + + + MODULE msgsens +; +; "mouse.h" +; 祭 祭 ⢨⥫쭮 ६饭 +; ⨪ ਧ⠫. +; 㭪 頥 㪠⥫ MSSENS, +; । "mouse.h". +; 訡, 頥 祭 -1 (0FFFFh) errno ᮤন +; 訡. +; +; 室 : +; H - ⢨⥫쭮 ⨪ +; L - ⢨⥫쭮 ਧ⠫ +; +; MSSENS *getSensMouse() +; +ms_gsen_:: + ld c,0Eh + rst 30h + ld (errno_##),a + ld (hsens),hl + ld hl,hsens ; Ok + ret nc + ld hl,-1 ; error + ret + + dseg +hsens: db 0 ; . ਧ⠫ + db 0 ; . ⨪ + + ENDMODULE + + + MODULE mssens +; +; "mouse.h" +; 㭪 ⠭ 祭 ⢨⥫쭮 ६饭 +; ⨪ ਧ⠫. +; । 맮 㭪樨, +; MSSENS, । "mouse.h". +; 訡, 頥 祭 -1 errno ᮤন +; 訡. +; +; 室 : +; H - ⢨⥫쭮 ⨪ +; L - ⢨⥫쭮 ਧ⠫ +; +; char setSensMouse(MSSENS *p) +; +ms_ssen_:: + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld c,0Fh + rst 30h + ld (errno_##),a + ld a,0 + ret nc + dec a + ret + + ENDMODULE + + + MODULE mshard +; +; "mouse.h" +; ࠡ稪 ⭮ 뢠 . +; 室 뢠 , 뢠 㭪 ࠩ. +; 砥, ॡ ࠡ ணࠬ 饭 - +; , ᯮ 㭪, ⮢ +; . +; 訡, 頥 祭 -1 errno ᮤন 訡. +; +; char hardMouse() +; +ms_hard_:: + ld c,80h + rst 30h + ld (errno_##),a + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE + + + MODULE msvmode +; +; "mouse.h" +; ନ஢ ᬥ ० ࠭. +; 㭪 ନ ࠩ ० ࠭. +; ० ᮮ⢥ 㭪樨 ⠭ ० ࠭. +; +; 訡, 頥 祭 -1 errno ᮤন +; 訡. +; +; 室 : +; A - ० ࠭ +; +; char vmodeMouse(char video_mode) +; +ms_vmod_:: + ld c,81h + rst 30h + ld (errno_##),a + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE + + + MODULE msref +; +; "mouse.h" +; ਭ㤨⥫쭠 ᮢ . +; 㭪 ᮢ뢠 ࠦ ࠭ +; । 뢠. +; 訡, 頥 祭 -1 errno ᮤন +; 訡. +; +; char refreshMouse() +; +ms_ref_:: + ld c,83h + rst 30h + ld (errno_##),a + ld a,0 ; Ok + ret nc + dec a ; error + ret + + ENDMODULE diff --git a/third_party/solid-c/SRC/CLIB/STARTUP.ASM b/third_party/solid-c/SRC/CLIB/STARTUP.ASM new file mode 100644 index 0000000..3eeaf9e --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/STARTUP.ASM @@ -0,0 +1,68 @@ +;/////////////////////////////////////////////////////////////////////////// +; +; C LIBRARY FOR SOLID C compiler +; Root module +; +;/////////////////////////////////////////////////////////////////////////// + +; 室騥 㭪樨: +; +; xmain +; _exit +; abort +; + + + + cseg + + db "CLIB v0.01",0 + + +xmain:: + ; ᮧ ᯨ᮪ 㬥⮢ + push ix + pop hl ; . ப + call _setargv## ; dos.asm + ld de,_argv_## ; ᯨ᮪ 㬥⮢ ( dos.asm) + + call _main_## ; stdio.asm + +; +; "stdlib.h" +; । ࠢ 㭪樨 exit. +; 㭪 蠥 맢 ஢ ⮪. +; 祭 code 筮 ⠭ 0 㪠 ଠ쭮 +; 室 ⠭  㣮 祭 । 訡. +; ᪮ 맮 _exit 頥 祭, . code  +; த⥫᪮ . +; in: hl = 祭 error code +; out: +; +; void _exit(int code) +; +_exit_:: + ld b,l + ld c,41h ; terminate with error code + rst 10h + ret + +; +; "stdlib.h" +; 㭪 뢮 ࠭ ᮮ饭 "Abnormal program termination." +; (। 襭 ணࠬ) 蠥 맢 +; ஢ ⮪. +; in: +; out: +; +; void abort() +; +abort_:: + ld hl,@1 + ld c,5Ch + rst 10h + ld l,-1 + jr _exit_ + + dseg +@1: db 0Dh,0Ah,"Abnormal program termination.",0Dh,0Ah,0Ah,0 diff --git a/third_party/solid-c/SRC/CLIB/STDIO.ASM b/third_party/solid-c/SRC/CLIB/STDIO.ASM new file mode 100644 index 0000000..ce2129a --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/STDIO.ASM @@ -0,0 +1,1671 @@ +; _fopen_ "t" 모 ?. +; + + + +; +; 室騥 㭪樨: +; +; _main_ +; exit +; atexit +; fclosall +; fflush +; fgetpos +; fsetpos +; rewind +; fseek +; ftell +; clearerr - ஢ । 9 ᨬ "clearerr_" +; fdopen +; freopen +; fopen +; fclose +; gets +; ungetc +; fputc +; fputs +; fgetc +; fgets +; fwrite +; fread +; + + + + + +;//////////////////////////////////////////////////////////////////////// +; +; C root MODULE - open standart i/o +; +;//////////////////////////////////////////////////////////////////////// + + MODULE root2 +; +; +; in: hl = - 㬥⮢ (.32) +; de = ᨢ _argv_ (ᯨ᮪ 㬥⮢ . ப) +; + cseg +_main_:: + xor a + ld (atxcount),a ; . ᫮ ॣ. 㭪権 + push de + push hl + ld hl,fclosall_ ; func + call atexit_ ; set as "exit function" + ;--------------------------------------------------- + ; initialize standard streams (without buffer) + ;--------------------------------------------------- + ; stdin "read only" + ld iy,_iob_## ; FILE stdin + ld hl,-1 + ld (iy+6),l ; descriptor + ld (iy+7),h + set 0,(iy+0) ; set "read only" + set 1,(iy+1) ; set "stdin" (keyboard) + ; stdout "write only" + ld iy,_iob_##-14 ; FILE stdout + dec hl ; -2 + ld (iy+6),l ; descriptor + ld (iy+7),h + set 1,(iy+0) ; set "write only" + set 2,(iy+1) ; set "stdout" (screen) + ; stderr "write only" + ld iy,_iob_##-28 ; FILE stderr + dec hl ; -3 + ld (iy+6),l ; descriptor + ld (iy+7),h + set 1,(iy+0) ; set "write only" + set 3,(iy+1) ; set "stderr" (screen) + ; stdaux "write only" + ld iy,_iob_##-42 ; FILE stdaux + dec hl ; -4 + ld (iy+6),l ; descriptor + ld (iy+7),h + set 1,(iy+0) ; set "write only" + set 4,(iy+1) ; set "stdaux" (serial port) + ; stdprn "write only" + ld iy,_iob_##-56 ; FILE stdprn + dec hl ; -5 + ld (iy+6),l ; descriptor + ld (iy+7),h + set 1,(iy+0) ; set "write only" + set 5,(iy+1) ; set "stdprn" (printer) + pop hl ; count arguments (max.32) + pop de ; addr list of arguments (_argv_) + + call main_## ; func main() + +; +; "stdlib.h" +; 㭪 蠥 맢 . । 襭 , +; 㭪 뢠 䠩 뢠 䠩. +; । 室 樮 ⥬, 㭪 ।⥫쭮 뢠 +; ࠡ ॣ஢ 㭪樨 "exit function" (ࠡ뢠- +; 騥 । 室 ). +; 祭 code 筮 ⠭ 0 㪠 ଠ쭮 - +; 室 ⠭  㣮 祭 । 訡. +; ᪮ 맮 exit 頥 祭, . code  +; த⥫᪮ . +; +; in: hl = 祭 code +; out: +; +; void exit(int code) +; +exit_:: + push hl ; 祭 code +@2: ld a,(atxcount) ; ᫮ ॣ. 㭪権 + dec a ; --atxcount + jp m,@1 ; ᫮ 㭪権 < 0 + ld (atxcount),a + ld l,a + ld h,0 + add hl,hl + ld de,atxtable ; ᯨ᮪ ᮢ ॣ. 㭪権 + add hl,de + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld de,@2 ; ᫥ ࠡ⪨ 㭪樨 + push de + ; 맢 ᫥ ᯨ᪥ ॣ. 㭪 + jp (hl) + ; +@1: pop hl ; 祭 code + jp _exit_## ; + +; +; "stdlib.h" +; 㭪 ॣ ( ᢮ ᯨ᮪) 㭪 *func +; "exit function", .. ࠡ뢠 । 室 . +; 砥 ଠ쭮 砭 ணࠬ, exit 뢠 ( +; 㬥⮢) "exit function" ࠧ । ⮬ - +; 樮 ⥬. +; 맮 atexit ॣ 㭪. +; 㥬 㭪樨 o ࠬo. +; ॣ஢ 8 㭪権, 믮 浪 +; "᫥ 襫 - 襫" (LIFO). +; 㭪 atexit oo⢥ ⠭ ANSI o oo- +; o onexit, ᫨ ॡ o⨬o ANSI. +; 㭪 o頥 0, ᫨ oଠo 㫥o 祭 +; o訡 (᫨ 㦥 o।o . ᫮ exit-㭪権). +; +; in: hl = ॣ㥬 㭪樨 +; out: a = 0, ᫨ Ok +; a = 0 訡 +; +; char atexit(*func) +; +; +; ਬ: +; main() +; { +; atexit(func1); // "Exit Function 1 called" +; atexit(func2); // "Exit Function 2 called" +; printf("Main quitting ...\n"); +; } +; 뢥: +; Main quitting ... +; Exit Function 2 called +; Exit Function 1 called +; +atexit_:: + ld a,(atxcount) ; ᫮ ॣ. 㭪権 + inc a ; ++atxcount + cp 8+1 ; . ᫮ 㭪権 + ret nc + ld (atxcount),a + ex de,hl ; de = । 㭪樨 + ld l,a + ld h,0 + add hl,hl + ld bc,atxtable-2 ; ᯨ᮪ ᮢ 㭪権 + add hl,bc + ld (hl),e ; 㭪樨 ᯨ᮪ + inc hl + ld (hl),d + xor a ; Ok + ret + +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 뢠 䠩 +; 뢠 䠩. +; +; in: +; out: +; +; void fclosall() +; +fclosall_:: + ld hl,_iob_##+14 ; 砫 FILE- 䠩 + ld b,8 ; max. count FILE-structurs +@fca: push hl + push bc + call fclose_## + pop bc + pop hl + ld de,14 ; size FILE-structure + add hl,de ; next + djnz @fca + ret + + dseg +atxcount: + db 0 ; ᫮ ॣ. 㭪権 +; ᯨ᮪ ᮢ ॣ. 㭪権 +atxtable: + ds 16 ; 8*2 + + ENDMODULE + + + + MODULE fflush +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 ᢮ (뢠) ⮣ 䠩. +; ਬ ࠭ ᪥, । 믮 +; 樨, 饩 ᫮ ⥬. +; ᫨ 䠩 , 뢠 䠩. +; ᫨ 䠩 ⥭, 頥. +; ᫥ 맮 㭪樨, 䠩 ⠥ . +; 㭪 頥 0, ᫨ ᯥ譮 . 祭 +; 頥, ⮪ ⮫쪮 +; ⥭. 砥 訡, 頥 祭 EOF. +; +; in: hl = FILE *fp +; out: a = 0 - Ok +; -1 - error +; +; char fflush(FILE *fp) +; +fflush_:: + xor a + ld (@3+1),a + push hl ; fp + pop iy + bit 1,(iy+1) ; stdin ? + ret nz ; yes, a=0 ! + bit 7,(iy+0) ; data is incoming ? + jr z,@1 ; no + ; flushing input file: + ; lseek file to curren position; + ; invalidate buffer + ld hl,0 + push iy + ld bc,1 ; SEEK_CUR + push bc; + ld e,(iy+2) ; level of buffer + ld d,(iy+3) + or a + sbc hl,de + ld c,l + ld b,h ; bc=low + sbc hl,hl + ex de,hl ; de=high + ld l,(iy+6) ; file descriptor + ld h,0 + call lseek_## + pop bc; + ld (@3+1),a + jr @2 + ; +@1: bit 0,(iy+1) ; data is outgoing ? + jr z,@2a ; no + ld l,(iy+6) ; file descriptor + ld e,(iy+8) ; addr data transfer buffer + ld d,(iy+9) + ld c,(iy+2) ; level of buffer (bytes) + ld b,(iy+3) + push iy + push bc + call write_## ; write to file + pop bc + ;or a + ;sbc hl,bc ; ᠫ ? + ;jr nc,@2 + or a; + jr z,@2; + ld a,-1 ; error + ld (@3+1),a +@2: pop iy +@2a: xor a + ld (iy+2),a ; set empty level of buffer + ld (iy+3),a + ld a,(iy+8) ; current active pointer + ld (iy+4),a ; to begin buffer + ld a,(iy+9) + ld (iy+5),a + res 0,(iy+1) ; data is outgoing + res 7,(iy+0) ; data is incoming +@3: ld a,0 + or a + ret z ; Ok + set 4,(iy+0) ; error indicator + ret + + ENDMODULE + + + MODULE fgetpos +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 ࠭ ⥪饥 㪠⥫ 䠩 ꥪ, +; 㪠뢠 position. , 㭪 fsetpos ᯮ +; 祭, ࠭ position ⠭ 㪠⥫ 䠩 +; . 祭 position ࠭ o ७ oଠ +; oo oo oo oo 㭪ﬨ fgetpos fsetpos. +; 㭪 o頥 0. +; 訡, o頥 -1. +; +; char fgetpos(FILE *fp, fpos_t *position) +; +fgetpos_:: + inc hl + ld a,(hl) + and 00111110b ;+1 std.. devices ? + dec hl + jr nz,@0 ; yes + push hl + push de + call fflush_## ; flushing file buffer + pop de + pop hl + or a + jr z,@1 ; Ok +@0: ld a,-1 + ret + ; +@1: ld bc,6 + add hl,bc + ld l,(hl) ; file descriptor + ld h,b + push de + call ltell_## + pop de + ld a,l + and h + inc a + jr z,@0 ; error + ld bc,4 + ldir + xor a + ret + + ENDMODULE + + + MODULE fsetpos +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪樨 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 rewind ६頥 㪠⥫ 䠩 砫 䠩. +; 맮 㭪樨 ⥭ 맮 ᫥饩 㭪樨: +; +; fseek(FILE *fp, 0, 0, SEEK_SET); +; +; ⮬ ⮣, FILE- fp ⥫ 䠩 㭪 rewind +; 頥 䫠 訡 䠩, fseek ⮣ . +; 㭪 頥 祭. +; +; void rewind(FILE *fp) +; +rewind_:: + ld de,@4 + res 4,(hl) ; error indicator + +; +; 㭪 fsetpos ⠭ 㪠⥫ 䠩 ࠢ +; 祭, 室饬 position, ooo o砥 o +; 㭪樨 fgetpos 䠩. 㭪 o頥 o o +; 䠩. 祭 position ࠭ o ७ oଠ oo oo +; oo oo 㭪ﬨ fgetpos fsetpos. +; 㭪 o頥 0. +; 訡, o頥 -1. +; +; char fsetpos(FILE *fp, fpos_t *position) +; +fsetpos_:: + inc hl + ld a,(hl) + and 00111110b ;+1 std.. devices ? + dec hl + jr nz,@2 ; yes + push de + push hl + call fflush_## ; flushing file buffer + pop hl + pop de + or a + jr z,@3 ; Ok +@2: ld a,-1 + ret + ; +@3: res 5,(hl) ; EOF indicator + ld bc,6 + add hl,bc + ld l,(hl) ; file descriptor + ld h,b + ld c,b ; bc=SEEK_SET + push bc + push hl + ex de,hl ; hl= &pos + ld c,(hl) + inc hl + ld b,(hl) ; bc=low + inc hl + ld e,(hl) + inc hl + ld d,(hl) ; de=high + pop hl + call lseek_## ; move_fp + pop bc + ld a,l + and h + inc a + jr z,@2 ; error + xor a + ret + +; for rewind_ +@4: dw 0 + dw 0 + + ENDMODULE + + + MODULE fseek +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 ⠭ 㪠⥫ 䠩 ᯮ, +; ।塞 㬥⠬ high low, ᮮ⢥⢥ - +; 32- ⭮ 祭 ६饭. +; ६饭 । 㬥⮬ type. +; 䠩 믮 ᯮ 㪠⥫. +; 㬥 type ᫥ ⠭, । +; "stdio.h": +; +; SEEK_SET 砫 䠩 +; SEEK_CUR ⥪饩 樨 㪠⥫ 䠩 +; SEEK_END 䠩 +; +; 㭪 頥 f_point, । "types.h" +; 訡 頥 -1 errno ᮤন 訡. +; ⠭ 㪠⥫ । 䠩, 訡 뢠. +; ன, ᯮᮡ (⠪ ନ +; ਭ), 頥 祭 -1. +; +; struct fpoint *fseek(FILE *fp, high, low, type) +; +fseek_:: + inc hl + ld a,(hl) + and 00111110b ;+1 std.. devices ? + dec hl + jr nz,@1 ; yes + push de + push hl + push bc + call fflush_## ; flushing file buffer + pop bc + pop hl + pop de + or a + jr z,@2 ; Ok +@1: ld hl,-1 + ret + ; +@2: push bc + ld bc,6 + add hl,bc + ld l,(hl) ; file descriptor + ld h,b + pop bc + jp lseek_## + + ENDMODULE + + + MODULE ftell +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 ftell 砥 ⥪ 㪠⥫ 䠩. +; ࠦ ᫮ ⮢ 砫 䠩. +; 㭪 頥 f_point, । "types.h" +; 訡 頥 -1 errno ᮤন 訡. +; ன, ᯮᮡ (⠪ ନ +; ਭ), 頥 祭 -1. +; +; struct fpoint *ftell(FILE *fp) +; +ftell_:: + inc hl + ld a,(hl) + and 00111110b ;+1 std.. devices ? + dec hl + jr nz,@1 ; yes + push hl + call fflush_## ; flushing file buffer + pop hl + or a + jr z,@2 ; Ok +@1: ld hl,-1 + ret + ; +@2: ld bc,6 + add hl,bc + ld l,(hl) ; file descriptor + ld h,b + jp ltell_## + + ENDMODULE + + + MODULE clearerr +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 뢠 FILE- 䠩 4- " 訡" +; 5- " 䠩". +; 訡 ⮬᪨ : ᫨ 䠩 - +; 訡, 樨 䠩 +; 祭 訡 , 맢 㭪樨 clearerr +; rewind. +; +; in: hl = ⥫ +; out: +; +; void clearerr(FILE *fp) +; +clearerr_:: + ld a,(hl) + and 11001111b ; 0CFh (clear 5,4 bits) + ld (hl),a + ret + + ENDMODULE + + + MODULE fheap +;----------------------------------------------------------- +; 뢠 fopen_ +;----------------------------------------------------------- +; ᢮ FILE-. +; ஢ 㫥 祭 flags () +; 8- FILE-. +; 頥 㪠⥫ . +; 頥 NULL, ᫨ ᢮ . +; +; in: +; out: hl = +; hl = NULL, ᫨ 諨 +; +_fpheap_:: + ld hl,_iob_+14 ; 砫 FILE- 䠩 + ld de,14 ; ࠧ + ld b,8 ; . ᫮ +@1: ld a,(hl) ;+0 + inc hl + or (hl) ;+1 + dec hl + ret z ; found + add hl,de + djnz @1 + ; no structs available + ld hl,0 ; NULL + ret + + dseg + ; 182 bytes + ; FILE structs std.. devices + ds 14 ; stdprn (descriptor -5) + ds 14 ; stdaux (descriptor -4) + ds 14 ; stderr (descriptor -3) + ds 14 ; stdout (descriptor -2) +_iob_:: ds 14 ; stdin (descriptor -1) + ; FILE structs of files + ds 14*8 + + ENDMODULE + + + MODULE fdopen +; +; "stdio.h" +; 㭪 ࠧ蠥 䠩, oo o-ooo o/o, +; o oଠo, .. ८ࠧ ᮪- +; ஢ /뢮. ᫥ ⮣, o᫥ o権 +; 䠩, 室 ᯮ짮 㭪樨 ᮪-஢ /뢮. +; ᫥⢨ ⮣, 뢠 䠩 室 㭪樥 fclose, close. +; 쭠 ப mode । ⨯ 㯠 䠩: +; +; r,w,a - ० ⥪. 䠩 +; rb,wb,ab - ०. ୮ 䠩 +; r+, w+, a+ - r/w, " " ⥪. 䠩 +; r+b, w+b, a+b - r/w, " " ୮ 䠩 +; +; o 襯ਢ 祭, ᨬo "b" +; "t", ० ࠭樨 o o. "t" ⭮ +; ANSI-⠭ fopen. o ७ Microsoft oo oo o- +; o, ᫨ ॡ ANSI-o⨬o. +; ᫨ "b" "t" o "mode", ० ࠭樨 o। +; "t". +; +; 㭪 o頥 㪠⥫ o FILE-. +; 訡, 頥 NULL. +; +; in: hl = ਯ +; de = ப type +; out: hl = FILE- ⮣ 䠩 +; hl = NULL, 訡 +; +; FILE *fdopen(FD fd, char *mode) +; +fdopen_:: + ld a,l + or h + cp 8+1 ; max number of descriptors + jp nc,@err + push hl + push de + call _fpheap_## ; get any FILE structs available + pop bc ; mode + pop de ; file descriptor + ld a,h + or l + ret z ; hl=NULL, structs not available + push hl + pop iy ; FILE- + ex de,hl ; de= + ld a,(bc) + and 5Fh + inc bc + cp "R" ; read + jr z,@10 + cp "W" ; write + jr z,@20 + cp "A" ; append + jp nz,@err + ; + ld (iy+6),l ; file descriptor + ld (iy+7),h ; + set 1,(iy+0) ; "write only" + push bc + push iy + ld bc,2 ; SEEK_END + push bc + ;ld l,(iy+6) ; . 䠩 + ld h,b + ld c,b + ld e,b + ld d,b + call lseek_## ; move_fp + pop bc + pop iy + pop bc + jp @4 + + +;----------------------------------------------------------- +; 뢠 freopen_, fopen_ +;----------------------------------------------------------- +; ⠭ ० 䠩. +; -㬮砭 "binary file" 襭. +; +; in: hl = FILE *fp 䠩 +; de = path- 䠩 +; bc = mode-ப: +; r,w,a - ० ⥪. 䠩 +; rb,wb,ab - ०. ୮ 䠩 +; r+, w+, a+ - r/w, " " ⥪. 䠩 +; r+b, w+b, a+b - r/w, " " ୮ 䠩 +; +; : +; +; "r" O_RDONLY +; +; "w" O_WRONLY (筮 O_WRONLY | O_CREAT | O_TRUNC) +; +; "a" O_WRONLY | O_APPEND (筮 O_WRONLY | O_CREAT | O_APPEND) +; +; "r+" O_RDWR +; +; "w+" O_RDWR (筮 O_RDWR | O_CREAT | O_TRUNC) +; +; "a+" O_RDWR | O_APPEND (筮 O_RDWR | O_CREAT | O_APPEND) +; +; o 襯ਢ 祭, ᨬo "b" +; "t", ० ࠭樨 o o. "t" ⭮ +; ANSI-⠭ fopen. o ७ Microsoft oo oo o- +; o, ᫨ ॡ ANSI-o⨬o. +; ᫨ "b" "t" o "mode", -㬮砭 ᯮ +; ० ࠭樨 o o, .. 祭 "t". +; +; out: hl = FILE *fp 䠩, ᫨ Ok +; hl = NULL, 訡 +; +_fopen_:: + inc hl + ld a,(hl) + and 00111110b ;+1 std.. devices ? + jr nz,@err ; yes + dec hl + push hl + pop iy ; FILE *fp + xor a + ld (iy+2),a ; set "empty level of buffer" + ld (iy+3),a + ld (iy+8),a ; res "data transfer buffer" + ld (iy+9),a + ;ld (iy+7),-1 ; . file descriptor + ld a,(bc) ;+0 mode-ப + and 5Fh + inc bc + cp "R" ; read + jr z,@read + cp "W" ; write + jr z,@write + cp "A" ; append + jr z,@append + ; 訡 +@err: ld hl,0 ; NULL + ret + ; +; "R" " ⥭" +@read: push bc + push iy + ex de,hl ; hl=path- 䠩 + ld de,3 ; O_RDWR + call open_## + pop iy + pop bc + bit 7,h ; return -1 ? (file not found ?) + jr nz,@err ; yes +@10: ld (iy+6),l ; ਯ low-level i/o + ld (iy+7),h + set 0,(iy+0) ; "read only" + jr @4 + ; +; "W" " " +@write: push bc + push iy +@21: ex de,hl ; hl=path- 䠩 + ld de,4 ; O_TRUNC + call open_## + pop iy + pop bc +@20: ld (iy+6),l + ld (iy+7),h + set 1,(iy+0) ; "write only" + jr @4 + ; +; "A" " " +@append:push bc + push iy + ex de,hl ; hl=path- 䠩 + ld de,23h ; O_RDWR | O_APPEND + push hl + call open_## + pop de + bit 7,h ; return -1 ? (file not found ?) + jr nz,@21 ; yes + pop iy + pop bc + ld (iy+6),l ; ਯ low-level i/o + ld (iy+7),h + set 1,(iy+0) ; "write only" + ; +@4: ld a,(bc) ;+1 mode-ப + cp "+" + jr nz,@5 + set 0,(iy+0) ; "read only" + set 1,(iy+0) ; "write only" + inc bc +@5: res 6,(iy+0) ; clear "binary file" + ld a,(bc) ;+2 mode-ப + cp "b" + jr nz,@6 + set 6,(iy+0) ; binary file +@6: push iy; + pop hl; + ret; + ; + ;bit 7,(iy+7) ; ? + ;jr z,@7 ; 訡 + ;ld hl,0 + ;ld (iy+0),l ; clear status FILE *fp + ;ld (iy+1),h + ;ret + ; +;@7: push iy + ;ld l,(iy+6) ; file descriptor + ;ld h,0 + ;call isatty_## ; std.. devices ? + ;pop hl + ;or a + ;ret z ; no + ;inc hl + ;set 1,(hl) ;+1 set "std.. device" in FILE *fp + ;dec hl + ;ret + + ENDMODULE + + + MODULE freopen +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 뢠 ⥪騩 䠩, 易 ਯ஬ (FILE-ன) +; fp ७砥 ਯ 䠩, ।塞 path-. +; 訡 ⨨ 䠩 . 㭪 筮 ਬ +; ॠ樨 । ⮪ stdin, stdout, stderr, stdaux stdprn +; 䠩, ।塞 짮⥫. ᪮ Estex ন +; ⮪, ⪥ ॠ樨 stdin, stdout, stderr, stdaux +; stdprn, 㤥 饭 NULL. 䠩 뢠 ० mode. +; 㭪 頥 㪠⥫ fp ⮣ 䠩. +; 訡, 㭪 頥 祭 NULL. +; +; in: hl = pathname +; de = ப mode +; bc = FILE *fp +; out: hl = ਯ ⮣ 䠩 +; hl = NULL, 訡 +; +; FILE *freopen(pathname, mode, FILE *fp) +; +freopen_:: + ld (@1+1),hl ; pathname ( 䠩) + ld l,c ; hl=FILE *fp + ld h,b + inc bc + ld a,(bc) + and 00111110b ;+1 std.. devices ? + jr nz,@2 ; yes + push hl + push de ; ப mode + call fclose_## + pop bc ; mode + pop hl ; FILE *fp +@1: ld de,0 ; pathname + jp _fopen_## ; 䠩 + ; +@2: ld hl,0 ; NULL + ret + + ENDMODULE + + + MODULE fopen +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 뢠 䠩 pathname. +; ப mode । ⨯ 㯠 䠩. +; 㭪 頥 㪠⥫ 䠩. +; 訡, 頥 NULL. +; +; in: hl = pathname +; de = ப mode +; out: hl = FILE *fp +; hl = NULL, 訡 +; +; +; FILE *fopen(pathname, mode) +; +fopen_:: + push hl ; pathname + push de ; ப mode + call _fpheap_## ; ᢮ FILE- + pop bc ; ப mode + pop de ; pathname + ld a,l + or h + ret z ; hl=NULL + jp _fopen_## + + ENDMODULE + + + MODULE fclose +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 뢠 䠩 뢠 . +; 㭪樥 뢠 ⮫쪮 䠩, ࠡ 묨 +; ந ࠬ ᮪-஢ /뢮. +; 䠩 ࠬ -஢ /뢮, - +; ਬ 㭪 close. +; +; in: hl = FILE- +; out: a = 0, ᫨ Ok +; a = EOF, 訡 +; +; char fclose(FILE *fp) +; +fclose_:: + ld a,(hl) ; test status current FILE *fp + inc hl + or (hl) + ld c,(hl) + dec hl + ret z ; free structure ( 祭 䠩) + ld a,c + and 00111110b ; std.. devices ? + jr nz,@24 ; yes + push hl + call fflush_## ; 䠩 + ld (@23+1),a ; 0 -1 + pop iy ; fp + push iy + ;bit 1,(iy+1) ; stdin ? + ;jr nz,@22 ; yes + ld l,(iy+6) ; file descriptor + call close_## ; close file + ld a,l + ld hl,@23+1 + or (hl) + ld (hl),a +@22: pop iy + bit 2,(iy+0) ; malloc'ed Buffer data ? + ld (iy+0),0 + ld (iy+1),0 + jr z,@23 ; no + ld l,(iy+8) ; addr data transfer buffer + ld h,(iy+9) + call free_## ; free memory of buffer +@23: ld a,0 ; return value + ret +@24: ld a,-1 + ret + + ENDMODULE + + + MODULE gets +; +; "stdio.h" +; 㭪 ⠥ ⠭⭮ ⮪ stdin ப +; ᢮ buffer. 室 ப ⠥ , +; ப "0x0D" ᫮ ᨬ +; ॢ 254. ப 0x0D , +; ⫨稨 㭪樨 fgets, ࠭ ᨬ 0x0D. +; 㭪 頥 㪠⥫ . +; 砥 訡, 頥 祭 ।. +; ଠ ப ᫥騩: +; +; +0: - , ᮤঠ騩 ⠭ ப, 楢 . +; +1: - 砫 ப. +; +; in: hl = +; out: hl= +; +; char *gets(char buffer[255]) +; +gets_:: ;push ix + ld b,254 ; max len string +__gets_:: + ld c,0 ; counter + push hl + inc hl +@1: push bc + push hl +@2: ld c,8Eh ; get curs + rst 08h + push de + ld c,32h ; echokey + rst 10h + pop de + cp 8 + jr z,@4 + cp 0Dh + jr z,@5 + cp " " + jr nc,@3 + ld c,84h ; set curs + rst 08h + jr @2 + ; +@3: pop hl + pop bc + ld (hl),a ; save symbol + inc hl + inc c ; ++counter + djnz @1 + jr @6 + ; +@4: pop hl + pop bc + dec c + inc c + jr z,@1 + dec c + dec hl + inc b + jr @1 + ; +@5: pop hl + pop bc +@6: ld (hl),0 + push bc + ld a,0Ah + call putch_## ; 뢮 ᨬ אַ ࠭ + pop bc + pop hl ; buffer + ld (hl),c ; len string + ;pop ix + ret + + ENDMODULE + + + MODULE fgetc1 +;----------------------------------------------------------- +; 뢠 fgetc_, fread_ +;----------------------------------------------------------- +; 㭪 ᮪-஢ /뢮. +; ⠥ ᨬ 䠩 fp stdin. +; +; in: hl = FILE *fp +; out: a = ⠭ ᨬ, ᫨ Ok +; a = EOF (0FFh) 訡 +; +; char _fgetc(FILE *fp) +; +_fgetc_:: + ld a,(hl) + and 00110000b ; 4,5 bits (Error/EOF) + ld c,a + inc hl + ld a,(hl) + dec hl + ;and 1 + and 00111100b ; mask stdout...stdprn + or c + jr z,@45 ; stdin, no errors, not EOF +@46: ld a,-1 ; Error/EOF or not stdin + ret + ; +@45: bit 0,(hl) ;+0 read only ? & ? + jr z,@46 ; no & ? + inc hl + bit 1,(hl) ;+1 stdin ? + jr z,@47 ; no + call getche_## ; echokey + cp 0Dh + ret nz + ld a,0Ah ; '\n' + ret + ; file +@47: dec hl + push hl ; fp + pop iy + ld a,(iy+2) ; empty level of buffer ? + or (iy+3) + jr nz,@48 ; no + ld a,(iy+8) ; data transfer buffer + or (iy+9) + jr nz,@49 ; != NULL + ; first time + ld hl,512 ; size buffer + call malloc_## ; alloc memory + ld (iy+8),l ; 砫 뤥. + ld (iy+9),h + ld a,l + or h + jr nz,@50 + ; hl=NULL + set 4,(iy+0) ; Error indicator + jr @46 + ; +@50: set 2,(iy+0) ; malloc'ed Buffer data +@49: ld e,(iy+8) + ld d,(iy+9) + ld (iy+4),e ; de=current active pointer + ld (iy+5),d + ld l,(iy+6) ; file descriptor + push iy + ld bc,512 ; size buffer + call read_## ; read file + pop iy + ld (iy+2),l ; fill level of buffer + ld (iy+3),h + ld a,h + or l + jr nz,@48 ; Ok + ; hl=NULL + xor a + set 5,(iy+0) ; EOF indicator + ld (iy+2),a ; empty level of buffer + ld (iy+3),a + dec a ; a=EOF + ret + ; +@48: set 7,(iy+0) ; data is incoming + ld e,(iy+2) ; level of buffer + ld d,(iy+3) + dec de + ld (iy+3),d + ld (iy+2),e + ld e,(iy+4) ; current active pointer + ld d,(iy+5) + ld a,(de) ; get byte from buffer + inc de + ld (iy+5),d + ld (iy+4),e + ret + + ENDMODULE + + + MODULE ungetc +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 頥 ᨬ ch 䠩. +; ᫥ ⥭ 䠩 稭 +; ᨬ ch. +; 㤠筮 襭, 㭪 頥 ch. +; 訡 頥 EOF, 饥 㤠筮 +; 饭 ᨬ. +; +; in: a = . ᨬ +; l = .. ? +; de = ਯ +; out: a = . ᨬ, ᫨ Ok +; a = EOF (0FFh) 訡 +; +; char ungetc(char ch, FILE *fp) +; +ungetc_:: + ;ld a,-1 ; EOF + ;cp l + ;jr z,@51 ; error + cp -1; + ret z; + push de ; fp + pop iy + ld (?132+1),a ; . ᨬ + ld e,(iy+2) ; ᫮ + ld d,(iy+3) + inc de + ld (iy+3),d + ld (iy+2),e + ld hl,1 + call ?cpshd## ; ? ࠢ hl de + jr nc,@52 ; 1 ᨬ ? +?132: ld a,0 ; return value + ld e,(iy+4) ; ⥪騩 + ld d,(iy+5) + dec de + ld (iy+5),d + ld (iy+4),e + ld (de),a ; ᨬ + ret + ; +@52: ld a,(iy+2) ; ᫮ + dec a + or (iy+3) ; + jr nz,@53 + push iy + pop bc + ld hl,10 ;+10 ᬥ. 祩 hold FILE- + add hl,bc + ld (iy+4),l ; ⥪. + ld (iy+5),h + ld a,(?132+1) ; return value + ld (hl),a ; ᨬ (祩 hold) + ret + ; +@53: ld a,(iy+2) ; ᫮ + sub 1 + ld (iy+2),a + jr nc,@51 + dec (iy+3) ; + ; 訡 +@51: ld a,-1 ; EOF + ret + + ENDMODULE + + + MODULE fputc1 +;----------------------------------------------------------- +; 뢠 fputc_ fwrite_ +;----------------------------------------------------------- +; 뢮 ᨬ ch ⮪, ९ fp. +; +; in: a = 뢮 ᨬ +; de = FILE *fp +; out: a = 뢮 ᨬ, ᫨ Ok +; a = EOF (0FFh) 訡 +; +; char fputc(char ch, FILE *fp) +; +_fputc_:: + ex de,hl + ld (@59+1),a ; 뢮 ᨬ + bit 1,(hl) ;+0 write only ? + jr nz,@54 ; yes +@55: ld a,-1 ; EOF + ret + ; +@54: bit 7,(hl) ;+0 data is incoming ? + jr nz,@55 ; yes + res 5,(hl) ;+0 clear EOF indicator + inc hl; + bit 2,(hl) ; stdout ? + jr nz,@60 ; yes + bit 3,(hl) ; stderr ? + jr z,@56 ; no + ; stdout, stderr +@60: ;push ix + push af + ld c,5Bh ; putchar + rst 10h + pop af ; return symbol + ;pop ix + ret + ; +@56: bit 4,(hl) ; stdaux ? + jr nz,@55 ; yes + bit 5,(hl) ; stdprn ? + jr z,@61 ; no + ;push ix + ld c,5Fh ; print + rst 10h + ;pop ix + jr c,@55 ; not ready + ld a,b ; return symbol + ret + ; +@61: dec hl + push hl ; fp + pop iy + ld a,(iy+2) ; level of buffer + or (iy+3) + jr nz,@57 + ld a,(iy+8) ; addr data transfer buffer + or (iy+9) + jr nz,@57 ; not NULL + ld hl,512 ; size buffer + call malloc_## ; alloc memory + ld (iy+8),l ; new addr data transfer buffer + ld (iy+9),h + ld a,l + or h + jr nz,@58 + ; hl=NULL + set 4,(iy+0) ; error indicator + jr @55 ; eof + ; +@58: set 2,(iy+0) ; malloc'ed Buffer data + ld (iy+4),l ; current active pointer + ld (iy+5),h +@57: ld e,(iy+4) + ld d,(iy+5) + ld a,(@59+1) ; symbol + ld (de),a ; put symbol to buffer + inc de ; ++pointer + ld (iy+5),d + ld (iy+4),e + set 0,(iy+1) ; "data is outgoing" + ld l,(iy+2) ; level of buffer + ld h,(iy+3) + inc hl ; ++level + ld (iy+2),l + ld (iy+3),h + bit 1,h ; full buffer ? + jr z,@59 ; no + push iy + pop hl + call fflush_## ; flushing file buffer + or a + jp nz,@55 ; eof +@59: ld a,0 ; return symbol + ret + + ENDMODULE + + + MODULE fputc +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 뢠 ᨬ ch 䠩 fp. +; 㭪 頥 ᠭ ᨬ. +; 訡, 頥 祭 EOF. +; +; in: a = 뢮 ᨬ +; de = FILE *fp +; out: a = 뢮 ᨬ, ᫨ Ok +; a = EOF (0FFh) 訡 +; +; char putc(char ch, FILE *fp) +; char fputc(char ch, FILE *fp) +; +putc_:: +fputc_:: + ld h,d ; FILE- + ld l,e + bit 6,(hl) ; binary file indicator + jp nz,_fputc_## + ; 䠩, ⮣ ⥪. ० + cp 0Ah + jp nz,_fputc_## + push de ; fp + ld a,0Dh + call _fputc_## + pop de + cp -1 ; EOF + ret z + ld a,0Ah + jp _fputc_## + + ENDMODULE + + + MODULE fputs +; +; "stdio.h" +; 㭪 ப 䠩 fp. +; 㫥 ᨬ 砭 ப '\0' . +; 㭪 頥 ᫥ ᠭ ᨬ. +; ;᫨ ப string , 頥 祭 0. +; 訡 頥 祭 EOF. +; +; char fputs(char *string, FILE *fp) +; +fputs_:: + push hl + push de + ex de,hl ; hl=FILE *fp + ld bc,2 ; SEEK_END + push bc + ld c,b ; bc=low + ld e,b ; de=high + ld d,b + call fseek_## + pop bc + pop de + pop hl + ld a,l + and h + cp -1 + ret z +@1: ld a,(hl) + or a + jr z,@2 + ld (@2+1),a + push hl + call fputc_## + pop hl + cp -1 + ret z ; error + inc hl + jp @1 + ; +@2: ld a,0 ; return symbol + ret + + ENDMODULE + + + MODULE fgetc +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 (ᯮ fgets_) +;--------------------------------------------------------------------- +; 㭪 ⠥ ⥪騩 ᨬ ⮪ fp ⠢ 㪠⥫ +; (᫨ ) ᫥騩 ᨬ. +; 頥 ⠭ ᨬ. +; 砥 訡 ⨦ 䠩, - +; 頥 祭 EOF. , 祭 EOF ਭ +; 楫 稭, ⮣ 㦭 ᯮ짮 㭪樨 ferror feof +; ஢ન 訡 䠩. +; +; in: hl = ਯ +; out: a = ⠭ ᨬ, ᫨ Ok +; a = EOF (0FFh) 訡 +; +; char getc(FILE *fp) +; char fgetc(FILE *fp) +; +getc_:: +fgetc_:: + bit 6,(hl) ; "binary file" ? + jp nz,_fgetc_## ; yes + ; line-buffered file (CR-LF translation) +@41: push hl ; fp + call _fgetc_## + pop hl + cp 0Dh ; ⮫쪮 䠩 ( stdin) + jr z,@41 + cp 1Ah ; EOF text file + ret nz ; no + set 5,(hl) ; EOF indicator + push hl + inc hl + inc hl + ld e,(hl) ;+2 level of buffer + inc hl ; + ld d,(hl) ;+3 + inc de ; ++level + ld (hl),d + dec hl + ld (hl),e + inc hl + inc hl + ld e,(hl) ;+4 current active pointer + inc hl ; + ld d,(hl) ;+5 + dec de ; --pointer + ld (hl),d + dec hl + ld (hl),e + pop hl + jr @41 + + ENDMODULE + + + MODULE fgets +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 ⠥ ப 室 ⮪ fp ᯮ +; string. 뢠, 稭 ⥪饩 樨 +; fp ᨬ ப '\n' ⮪, +; ᫮ ⠭ ᨬ ⠭ ࠢ maxlen-1. +; ப ࠧ頥 string, ⥬ ⠢ . +; ப ⠪ 砥 string. ᫨ 砫 +; 뢠 maxlen ࠢ﫮 1, string 㤥 ⮩ "". +; 㭪 頥 㪠⥫ ப string. +; 訡 䠩, 頥 NULL. +; +; in: hl = string +; de = ப +; bc = ਯ +; out: hl = string, ᫨ Ok +; hl = NULL, 訡 䠩 +; +; char *fgets(char *string, int maxlen, FILE *fp) +; +fgets_:: + ld (?105+1),bc ; FILE *fp + ld (@40+1),hl ; string + ld (@39+1),de ; maxlen + ld (?107+1),hl ; ⥪. string +@39: ld hl,0 ; maxlen + dec hl ; --maxlen + ld (@39+1),hl + ex de,hl + ld hl,0 + call ?cpshd## ; ࠢ hl de + jr nc,@38 +?105: ld hl,0 ; fd FILE- + call fgetc_## ; ᨬ 䠩 + cp -1 + jr z,@38 ; eof +?107: ld hl,0 ; ⥪. string + ld (hl),a ; save symbol + inc hl + ld (?107+1),hl + cp 0Ah + jr nz,@39 +@38: ex af,af' ; save "a" + xor a + ld de,(?107+1) ; ⥪. string + ld (de),a ; ப string + ex af,af' ; rest "a" + inc a + jr nz,@40 + ; end of file + ld hl,(@40+1) ; string + ld a,e + cp l + ret nz + ld a,d + cp h + ret nz + ; empty string "" + ld hl,0 ; NULL + ret + ; +@40: ld hl,0 ; string + ret + + ENDMODULE + + + MODULE fwrite +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 뢠 ꥪ ࠧ size 稪 +; count buffer 室 䠩 fp. +; 頥 ᫮ ॠ쭮 ᠭ ꥪ⮢. +; +; in: hl = buffer +; de = size +; bc = count +; sp+2 = FILE *fp +; out: hl = ᫮ ᠭ ꥪ⮢ +; +; uint fwrite(buffer, size, count, FILE *fp) +; +fwrite_:: + push ix + ld ix,0 + add ix,sp ; ix = ⥪ + ld (?86+1),hl ; ⥪. buffer + ld (?87+1),de ; size (ࠧ ꥪ ) + ld (@34+1),bc ; count (- ꥪ⮢) + ld hl,0 ; . ᫮ ᠭ ꥪ⮢ + ld (@31+1),hl +@34: ld hl,0 ; . - ꥪ⮢ + ld a,l + or h + jr z,@30 ; ꥪ⮢ ᠭ + dec hl ; --count + ld (@34+1),hl +?87: ld hl,0 ; . size (ࠧ ꥪ ) + ld (@32+1),hl ; ⥪. ࠧ size +@32: ld hl,0 + ld a,l + or h + jr z,@31 ; ꥪ ᠭ + dec hl ; --size + ld (@32+1),hl +?86: ld hl,0 ; current pointer + ld a,(hl) ; get symbol from buffer + inc hl ; ++pointer + ld (?86+1),hl + ld e,(ix+4) ; de = FILE *fp + ld d,(ix+5) + call _fputc_## ; put symbol to file + inc a + jr nz,@32 ; not EOF + ; 訡, 䠩 - ᫮ ᯥ譮 . ꥪ⮢ +@30: ld hl,(@31+1) ; 㧭 ᫮ . ꥪ⮢ +@33: ld sp,ix ; . ⥪ + pop ix + ret + ; +@31: ld hl,0 ; ᫮ ᠭ ꥪ⮢ + inc hl + ld (@31+1),hl + jp @34 + + ENDMODULE + + + MODULE fread +; +; "stdio.h" +;--------------------------------------------------------------------- +; 㭪 ᮪-஢ /뢮 +;--------------------------------------------------------------------- +; 㭪 ⠥ ꥪ ࠧ size 稪 count 室 +; 䠩 fp ᯮ buffer. +; 頥 ᫮ ॠ쭮 ⠭ ꥪ⮢. +; ਬ砭: +; ⥭ stdin, 0x0D 0x0A (oo 㬠) +; ।஢ . ⨥ +; Ctrl+Z Ctrl+C ਭ . +; ப ᨬ stdin ᯮ짮 㭪 gets, +; ᪠ ।஢ . +; +; in: hl = buffer +; de = size +; bc = count +; sp+2 = FILE *fp +; out: hl = ᫮ ⠭ ꥪ⮢ +; +; uint fread(buffer, size, count, FILE *fp) +; +fread_:: + push ix + ld ix,0 + add ix,sp ; ix = ⥪ + ld (@26+1),hl ; ⥪. buffer + ld (?75+1),de ; size (ࠧ ꥪ ) + ld (@29+1),bc ; count (- ꥪ⮢) + ld hl,0 ; . ᫮ ⠭ ꥪ⮢ + ld (@25+1),hl +@29: ld hl,0 ; . - ꥪ⮢ + ld a,l + or h + jr z,@24 ; ꥪ⮢ ⠭ + dec hl ; --count + ld (@29+1),hl +?75: ld hl,0 ; . size (ࠧ ꥪ ) + ld (@28+1),hl +@28: ld hl,0 ; ⥪. ࠧ size + ld a,l + or h + jr z,@25 ; ꥪ ⠭ + dec hl ; --size + ld (@28+1),hl + ld l,(ix+4) ; hl = FILE *fp + ld h,(ix+5) + call _fgetc_## ; ᨬ 䠩 + cp -1 + jr nz,@26 ; not EOF + ; 訡, 䠩 - ᫮ ᯥ譮 . ꥪ⮢ +@24: ld hl,(@25+1) ; ᫮ . ꥪ⮢ +@27: ld sp,ix + pop ix + ret + ; +@26: ld hl,0 ; current pointer + ld (hl),a ; save symbol to buffer + inc hl ; ++pointer + ld (@26+1),hl + jr @28 + ; +@25: ld hl,0 ; ᫮ . ꥪ⮢ + inc hl + ld (@25+1),hl + jr @29 + + ENDMODULE diff --git a/third_party/solid-c/SRC/CLIB/STDLIB.ASM b/third_party/solid-c/SRC/CLIB/STDLIB.ASM new file mode 100644 index 0000000..5213851 --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/STDLIB.ASM @@ -0,0 +1,1485 @@ +; 室騥 㭪樨: +; +; rand +; srand +; div +; atoi +; strtol +; qsort +; bsearch +; ?lauhl +; ?sauhl +; ?mulhd +; ?mulab +; ?dvnhd +; min +; max +; abs +; ?abshl +; ?neghl +; ?nothl +; ?dvihd +; ?dvbab +; ?slhb +; ?slab +; ?srnhb +; ?srihb +; ?srab +; ?cpshd +; setjmp +; longjmp +; hex8 +; hex16 +; hex32 +; dec8 +; dec16 +; dec32 +; + + + + + + MODULE rand +; +; "stdlib.h" +; 㭪 srand ⠭ 砫 樨 +; ⢠ ᥢ砩 楫. ⢥ 㬥 seed +; ⠭ ᯮ 1.  㣮 +; 祭 seed ⠭ 砫 砩 +; . +; 頥 祭 . +; +; void srand(seed) +; +srand_:: + ld (seed+1),hl + ret + +; +; "stdlib.h" +; 㭪 頥 ᥢ砩 楫 ࢠ 0..65535. +; । 맮 rand, 맢 㭪 srand - +; 砫쭮 砩 窨. +; 㭪 頥 ᥢ砩 ᫮. +; +; in: none +; out: hl=pseudo-random number, period 0..65535 +; +; int rand() +; +rand_:: +seed: ld de,0 ; seed is usually 0 + ld a,d + ld h,e + ld l,253 + or a + sbc hl,de + sbc a,0 + sbc hl,de + ld d,0 + sbc a,d + ld e,a + sbc hl,de + jr nc,rnd1 + inc hl +rnd1: ld (seed+1),hl + ret + + ENDMODULE + + + MODULE div +; +; "stdlib.h" +; 㭪 num1 num2, ⭮ ⮪. +; 頥 ⨯ div_t, । "stdlib.h". +; +; struct divt *div(uint num1, uint num2) +; +div_:: + call ?dvihd## + ld (quot),hl ; ⭮ + ld (rem),de ; ⮪ + ld hl,quot ; + ret + +quot: dw 0 ; ⭮ +rem: dw 0 ; ⮪ + + ENDMODULE + + + MODULE atoi +; +; "stdlib.h" +; 㭪 ८ࠧ ᨬ ப string 楫 祭. +; 室 ப string ।⠢ ᮡ ᫥⥫쭮 +; ᨬ, ஢ ᫮ +; 祭 । ⨯. 㭪 ४頥 ⥭ 室 +; ப, ⮫쪮  ᨬ, +; ਭ ᫠ ( 㫥 ᨬ, - +; 騩 ப). +; 㭪 頥 祭 int ⨯. +; 頥 祭 ࠢ 0, ᫨ 室 ८- +; 祭 ⨯. +; 砥 ९, 頥 祭 ।. +; +; int atoi(*string) +; +atoi_:: + ex de,hl ; de = string + xor a + ld (@3+1),a + ld h,a + ld l,a + ld a,(de) + cp "-" + jr z,@0 + cp "+" + jr z,@1 + jr @2 + ; +;@0: ld a,1 +@0: ld (@3+1),a +@1: inc de +@2: ld a,(de) ; ⥪. string + cp "0" + jr c,@3 + ld a,(de) + cp "9"+1 + jr nc,@3 + add hl,hl + ld c,l + ld b,h + add hl,hl + add hl,hl + add hl,bc + inc de + sub "0" + ld c,a + ld b,0 + add hl,bc + jp @2 + ; +@3: ld a,0 + or a + ret z + xor a + sub l + ld l,a + ld a,0 + sbc a,h + ld h,a + ret + + ENDMODULE + + + MODULE strtol +; +; "stdlib.h" +; +; int strtol(char *s, char **eptr, int base) +; +; char *s 㪠⥫ ப +; char **eptr 㪠⥫ ᬮ +; int base ᯮ㥬 ᭮ ᫠ +; +; 㭪 ८ࠧ ᨬ ப s long-祭, ⭮ +; base ᭮. 㭪 ४頥 ⥭ ப, ⮫쪮 +; ᨬ, ᫠ - 㫥- +; ᨬ '\0' ப ஢ ᨬ, +; ࠢ base. ᫨ eptr ࠢ NULL, *eptr 㪠뢠 ᨬ, +; ஬ ⠭ ᬮ. +; 㭪 strtol ।, s 㪠뢠 ப ᫥饩 : +; +; [whitespace][sign][0][x][digits] +; +; ᫨ base 2 36, 祭 ᯮ ᭮ ⥬ +; ᫥ ᫠. ᫨ base ࠢ 0, 砫 ᨬ ப, +; 㪠뢠 s, ᯮ । ᭮. ᫨ +; ᨬ ࠢ 0 ன - 1 7, ப +; 쬥筮 楫. ᫨ ᨬ ࠢ 0, ன 'x' 'X', +; ⮣ ப ⭠筮 楫. ᫨ ᨬ +; ਭ ࠬ 1..9, ப 筮 楫. +; 㭪 strtol 頥 祭 ८ࠧ ப, ᫨ 뫮 +; ९ १. +; +strtol_:: + ld (base),bc ; base + push de ; **eptr + ld (s@),hl ; *s + ex de,hl + xor a + ld (sig),a + ld h,a + ld l,a + ld (n@),hl + ld a,(de) + cp "-" + jr z,@4 + cp "+" + jr z,@5 + jr @6 + ; +@4: ld a,1 + ld (sig),a +@5: inc de + ld (s@),de +@6: ld a,c + or b + jr nz,@7 + ld a,(de) + cp "0" + jr nz,@8 + ld bc,8 + ld (base),bc + inc de + ld (s@),de + ld a,(de) + and 5Fh + cp "X" + jr nz,@10 + ld bc,16 + ld (base),bc + inc de + ld (s@),de + jr @10 + ; +@8: ld bc,10 + ld (base),bc + jr @10 + ; +@7: ld a,c + sub 16 + or b + jr nz,@10 + ld a,(de) + cp "0" + jr nz,@10 + ld hl,1 + add hl,de + ld a,(hl) + and 5Fh + cp "X" + jr nz,@10 + inc hl + ld (s@),hl +@10: ld e,c + ld d,b + ld hl,000Ah + call ?CPSHD## + jr nc,@12 + ld a,"9" + jr @13 + ; +@12: ld a,c + add a,"0" +@13: ld (?16),a + ld e,c + ld d,b + ld hl,000Ah + call ?CPSHD## + jr nc,@14 + ld a,c + add a,57h + jr @15 + ; +@14: ld a,(?16) +@15: ld (?17),a +@23: ld hl,(s@) + ld a,(hl) + inc hl + ld (s@),hl + call tolower_## + ld (?15),a + cp "0" + jr c,@18 + ld hl,(?16) + cp l + jr c,@17 + cp "a" + jr c,@18 + ld hl,(?17) + cp l + jr nc,@18 +@17: ld de,(base) + ld hl,(n@) + call ?MULHD## + ex de,hl + ld a,(?15) + cp "9"+1 + jr nc,@19 + ld hl,0-"0" + jr @20 + ; +@19: ld hl,0-"a"+10 +@20: add hl,de + ld b,0 + ld c,a + add hl,bc + add hl,de + ld (n@),hl + jr @23 + ; +@18: ld de,(s@) + pop hl + ld (hl),e + inc hl + ld (hl),d + ld a,(sig) + ld hl,(n@) + or a + ret z + xor a + sub l + ld l,a + ld a,0 + sbc a,h + ld h,a + ret + + dseg +s@: dw 0 +base: dw 0 +sig: db 0 +n@: dw 0 +?15: db 0 +?16: db 0 +?17: db 0 + + ENDMODULE + + + MODULE qsort +;----------------------------------------------------------- +; call from qsort +;----------------------------------------------------------- +_swp_: ld a,l + or h + ret z + ld a,(de) + ex af,af' + ld a,(bc) + ld (de),a + ex af,af' + ld (bc),a + inc de + inc bc + dec hl + jr _swp_ + + dseg +?7: dw 0 +?10: dw 0 +?9: dw 0 +?11: dw 0 +?12: dw 0 +?13: dw 0 +?18: dw 0 + + cseg +; +; "stdlib.h" +; 㭪 ॠ ஢ ⠡ . +; +; void qsort(*base, nel, size, *compare) +; +; void *base; - 㪠⥫ ⠡ +; unsigned nel; - ⢮ ⮢ ⠡ +; unsigned size; - ࠧ ⠡ +; int (*compare)(); - 㪠⥫ 㭪 ࠢ +; +; 㬥 compare  㪠⥫ 楤, ⠢塞 +; 짮⥫. ஢, 㭪 qsort 뢠 +; 楤 ᪮쪮 ࠧ, 맮 । +; 㪠⥫ ᨢ. 楤 compare ࠢ- +; , ⥬ ᫥ int-祭: +; +; < 0 element1 < element2 +; 0 element1 = element2 +; > 0 element1 > element2 +; +; ᫥ ࠡ⪨ 㭪樨 qsort, ⠡ ᮤন ஢ +; . +; 砥 訡, 頥 祭 . +; +qsort_:: + ld (?7),hl ; base ? + ld hl,-80 + add hl,sp + ld sp,hl + ld l,c ; size ? + ld h,b + ld (?9),hl + ex de,hl + ld (?10),hl ; nel ? + ld hl,(?7) + ex de,hl + ld hl,0 + add hl,sp + ld (hl),e + inc hl + ld (hl),d + push de + ld e,c + ld d,b + push de + ld hl,(?10) + ex de,hl + ld hl,-1 + add hl,de + pop de + call ?MULHD## + pop de + add hl,de + call ?SAUHL## + dw 42 + ; + ld hl,0 + ld (?18),hl +@5: inc h + dec h + jp m,@3 + push hl + add hl,hl + ex de,hl + ld hl,2 + add hl,sp + add hl,de + ld c,(hl) + inc hl + ld b,(hl) + pop hl + add hl,hl + ex de,hl + ld hl,40 + add hl,sp + add hl,de + ld a,c + sub (hl) + inc hl + ld a,b + sbc a,(hl) + jr c,@4 + ld hl,(?18) + dec hl + ld (?18),hl + jr @5 + ; +@4: ld hl,(?18) + push hl + add hl,hl + ex de,hl + ld hl,2 + add hl,sp + add hl,de + push hl + ld hl,(?9) + ld c,l + ld b,h + pop hl + ld a,(hl) + sub c + ld e,a + inc hl + ld a,(hl) + sbc a,b + ld d,a + ex de,hl + ld (?12),hl + pop hl + push hl + add hl,hl + ex de,hl + ld hl,42 + add hl,sp + add hl,de + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld (?13),hl + ld (?11),hl +@12: ld hl,(?12) + ld de,(?13) + ld a,l + sub e + ld a,h + sbc a,d + jp nc,@6 + ex de,hl + ld (?13),hl + ex de,hl + add hl,bc + push bc +@8: ld (?12),hl + push bc + push hl + ld hl,@1 + push hl + call ?LAUHL## + dw 92+2 + ; + push hl + ld hl,(?11) + ex de,hl + ld hl,(?12) + ret + ; +@1: pop de + pop bc + inc h + dec h + jp p,@7 + ld hl,(?12) + add hl,bc + jr @8 + ; +@7: push bc + push de + ld hl,(?13) + ex de,hl + ld a,e + sub c + ld c,a + ld a,d + sbc a,b + ld b,a + ld l,c + ld h,b + ld (?13),hl +@10: ld hl,(?12) + ld a,l + sub c + ld a,h + sbc a,b + jr nc,@9 + ld hl,@2 + push bc + push hl + call ?LAUHL## + dw 94+2 + ; + push hl + ld hl,(?11) + ex de,hl + ld l,c + ld h,b + ret + ; +@2: ex de,hl + ld hl,0000h + pop bc + call ?CPSHD## + jr nc,@9 + ld hl,(?9) + ld a,c + sub l + ld c,a + ld a,b + sbc a,h + ld b,a + ld l,c + ld h,b + ld (?13),hl + jr @10 + ; +@9: pop de + pop hl + ld a,e + sub c + ld a,d + sbc a,b + jr nc,@11 + call _swp_ +@11: pop bc + jp @12 + ; +@6: ld (?12),hl + pop hl + ld (?18),hl + push hl + add hl,hl + ex de,hl + ld hl,42 + add hl,sp + add hl,de + push bc + ld c,(hl) + inc hl + ld b,(hl) + ld hl,(?12) + ex de,hl + pop hl + push de + call _swp_ + ld hl,(?18) + ld (?18),hl + add hl,hl + ex de,hl + ld hl,44 + add hl,sp + add hl,de + pop bc + ld a,(hl) + sub c + ld e,a + inc hl + ld a,(hl) + sbc a,b + ld d,a + push de + ld hl,(?18) + add hl,hl + ex de,hl + ld hl,4 + add hl,sp + add hl,de + ld e,(hl) + inc hl + ld d,(hl) + ld a,c + sub e + ld l,a + ld a,b + sbc a,d + ld h,a + pop de + call ?CPSHD## + jr nc,@13 + ld l,c + ld h,b + ld (?12),hl + ld hl,(?18) + ld (?18),hl + push hl + add hl,hl + ex de,hl + ld hl,4 + add hl,sp + add hl,de + ld c,(hl) + inc hl + ld b,(hl) + ld hl,(?18) + inc hl + add hl,hl + ex de,hl + ld hl,4 + add hl,sp + add hl,de + ld (hl),c + inc hl + ld (hl),b + pop hl + ld (?18),hl + inc hl + add hl,hl + ex de,hl + ld hl,42 + add hl,sp + add hl,de + push hl + ld hl,(?12) + ld c,l + ld b,h + ld hl,(?9) + ld a,c + sub l + ld e,a + ld a,b + sbc a,h + ld d,a + ld (?9),hl + pop hl + ld (hl),e + inc hl + ld (hl),d + ld l,c + ld h,b + ex de,hl + ld hl,(?9) + ex de,hl + add hl,de + push hl + ld hl,(?18) + add hl,hl + ex de,hl + ld hl,4 + add hl,sp + add hl,de + pop de + ld (hl),e + inc hl + ld (hl),d + jr @14 + ; +@13: ld l,c + ld h,b + push bc + ex de,hl + ld hl,(?9) + ex de,hl + add hl,de + push hl + ld hl,(?18) + ld (?18),hl + inc hl + add hl,hl + push hl + ld hl,8 + add hl,sp + ex de,hl + ld (?9),hl + ex de,hl + pop de + add hl,de + pop de + ld (hl),e + inc hl + ld (hl),d + ld hl,(?18) + push hl + add hl,hl + ex de,hl + ld hl,46 + add hl,sp + add hl,de + ld c,(hl) + inc hl + ld b,(hl) + ld hl,(?18) + inc hl + add hl,hl + ex de,hl + ld hl,46 + add hl,sp + add hl,de + ld (hl),c + inc hl + ld (hl),b + pop hl + add hl,hl + ex de,hl + ld hl,44 + add hl,sp + add hl,de + pop bc + ex de,hl + ld hl,(?9) + ex de,hl + ld a,c + sub e + ld e,a + ld a,b + sbc a,d + ld d,a + ld (hl),e + inc hl + ld (hl),d +@14: pop hl + inc hl + ld (?18),hl + jp @5 + ; +@3: ld hl,80 + add hl,sp + ld sp,hl + ret + + ENDMODULE + + + MODULE bsearch +; +; "stdlib.h" +; 㭪 믮 ஢ ᨢ. +; +; void *bsearch(*key, *base, num, size, *compare) +; +; char *key; - 㪠⥫ (ப) ᪠ +; char *base; - 㪠⥫ ᨢ +; unsigned num; - ᫮ ⮢ ᨢ +; unsigned size; - ࠧ +; int (*compare)(); - 㪠⥫ 㭪 ࠢ +; +; 㬥 compare  㪠⥫ 楤, ⠢塞 짮- +; ⥫. ᪠, 㭪 bsearch 뢠 楤 +; ᪮쪮 ࠧ, 맮 । 㪠⥫ - +; ᨢ. 楤 compare ࠢ , ⥬ - +; ᫥ int-祭: +; +; < 0 element1 < element2 +; 0 element1 = element2 +; > 0 element1 > element2 +; +; 㭪 bsearch 頥 㪠⥫ ࢮ 宦 +; key ᨢ. +; 頥 NULL, ᫨ key ᨢ . +; + dseg +?33: dw 0 +?37: dw 0 + + cseg +bsearch_:: + ld (?33),hl + ex de,hl + ld (?37),hl +@18: ld a,c + or b + jr z,@16 + ld hl,@15 + push bc + push hl + ld hl,10 + add hl,sp + ld e,(hl) + inc hl + ld d,(hl) + push de + ld de,(?37) + ld hl,(?33) + ret + +@15: ld de,(?37) + pop bc + ld a,l + or h + jr nz,@17 + ld hl,(?37) + ret + +@17: push de + dec bc + ld hl,6 + add hl,sp + ld e,(hl) + inc hl + ld d,(hl) + pop hl + add hl,de + ld (?37),hl + jr @18 + ; +@16: ld hl,0 + ret + + ENDMODULE + + + MODULE lauhl +; +; 㧨 hl ... +; +?lauhl:: + pop hl + ld e,(hl) + inc hl + ld d,(hl) + inc hl + push hl + ex de,hl +?laut:: + add hl,sp + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ret + + ENDMODULE + + + MODULE sauhl +; +; ࠭ hl ... +; +?sauhl:: + ex (sp),hl + ld e,(hl) + inc hl + ld d,(hl) + inc hl + ex (sp),hl +?saut:: + ex de,hl + add hl,sp + ld (hl),e + inc hl + ld (hl),d + ex de,hl + ret + + ENDMODULE + + + MODULE mulhd +; +; h * d = hl +; out: hl = १ +; +?mulhd:: + ld a,h + ld c,l + ld hl,0 + ld b,16 +@1: add hl,hl + rl c + rla + jr nc,@2 + add hl,de +@2: djnz @1 + ret + + ENDMODULE + + + MODULE mulab +; +; a * b +; out: a = १ +; +?mulab:: + ld h,a + xor a + ld l,b + ld b,8 +@1: add a,a + rl h + jr nc,@2 + add a,l +@2: djnz @1 + ret + + ENDMODULE + + + MODULE dvnhd +; +; hl / de +; out: hl,de = १ +; +?dvnhd:: + ld b,d + ld c,e + ld de,0 + ld a,16 +@1: ex af,af' + add hl,hl + rl e + rl d + jr c,@2 + ld a,e + sub c + ld a,d + sbc a,b + jr c,@3 +@2: or a + ex de,hl + sbc hl,bc + ex de,hl + inc l +@3: ex af,af' + dec a + jp nz,@1 + ret + + ENDMODULE + + + MODULE min +; +; "stdlib.h" +; 㭪 ࠢ 㬥 o頥 +; 祭 襣o 㬥. +; 㬥o ⨯ o頥oo 祭 +; oo. +; +; int min(int arg1, int arg2) +; +min_:: + call ?cpshd## ; signed compare hl with de + ret c + ex de,hl + ret + + ENDMODULE + + + MODULE max +; +; "stdlib.h" +; 㭪 ࠢ 㬥 o頥 +; 祭 襣 㬥. +; 㬥o ⨯ o頥oo 祭 +; oo. +; +; int max(int arg1, int arg2) +; +max_:: + push hl + ex de,hl + pop de + call ?cpshd## ; signed compare hl with de + ret nc + ex de,hl + ret + + ENDMODULE + + + MODULE abs +; +; "stdlib.h" +; 頥 祭 n, ࠢ ᮫⭮ 稭 n +; in: hl = 祭 +; out: hl = १ +; +; int abs(int n) +; +abs_:: +?abshl:: + bit 7,h + ret z +?neghl:: + dec hl +?nothl:: + ld a,l + cpl + ld l,a + ld a,h + cpl + ld h,a + ret + + ENDMODULE + + + MODULE dvihd +; +; hl / de +; out: hl,de = १ +; +?dvihd:: + ld a,h + or a + push af ; reminder's sign + xor d + push af ; quotient's sign + call ?abshl## + ex de,hl + call ?abshl## + ex de,hl + call ?dvnhd## + pop af + call m,?neghl## + pop af + ret p + xor a + sub e + ld e,a + ld a,0 + sbc a,d + ld d,a + ret + + ENDMODULE + + + MODULE dvbab +; +; a / b +; out: b,a = १ +; +?dvbab:: + ld l,a + ld h,b + xor a + ld b,8 +@1: sla l + rla + jr c,@2 + cp h + jr c,@3 +@2: sub h + inc l +@3: djnz @1 + ld b,a + ld a,l + ret + + ENDMODULE + + + MODULE slhb +; +; 饭 ⮢ "hl" "b" ࠧ +; +?slhb:: + inc b + dec b + ret z +@1: add hl,hl + djnz @1 + ret + + ENDMODULE + + + MODULE slab +; +; 饭 ⮢ "a" "b" ࠧ +; +?slab:: + inc b + dec b + ret z +@1: add a,a + djnz @1 + ret + + ENDMODULE + + + MODULE srnhb +; +; ᬥ饭 ⮢ "hl" ࠢ "b" ࠧ +; +?srnhb:: + inc b + dec b + ret z +@1: srl h + rr l + djnz @1 + ret + + ENDMODULE + + + MODULE srihb +; +; ᬥ饭 ⮢ "hl" ࠢ "b" ࠧ +; +?srihb:: + inc b + dec b + ret z +@1: sra h + rr l + djnz @1 + ret + + ENDMODULE + + + MODULE srab +; +; 饭 ⮢ "a" ࠢ "b" ࠧ +; +?srab:: + inc b + dec b + ret z +@1: srl a + djnz @1 + ret + + ENDMODULE + + + MODULE cpshd +; +; ࠢ hl de +; +?cpshd:: + ld a,h + xor d + jp p,@1 + ld a,d + cp h + ret +@1: ld a,h + cp d + ret nz + ld a,l + cp e + ret + + ENDMODULE + + + MODULE setjmp +; +; "setjmp.h" +; 㭪 setjmp ࠭ ﭨ ⥪, +; ᫥⥫쭮 ⠭ ᯮ짮 㭪樨 longjmp. +; 㭪樨 setjmp longjmp ᯥ稢 믮 +; 쭮 (nonlocal) 室 筮 ᯮ - +; ࠢ ࠡ⪥ 訡 ⠭ +; ࠭ 맢 楤 ( ᯮ짮 筮 맮), +; ᫮ 祭. 맮 setjmp ⨢ +; ࠭ ⥪饣 ﭨ ⥪ env. ᫥騩 맮 +; longjmp ⠭ ࠭ ﭨ 頥 ࠢ- +; 㪠⥫ ( 室), ।⢥ ᫥騩 +; ᮮ⢥騬 맮 setjmp. +; +; int setjmp(jmp_buf env) +; +setjmp_:: + push ix + pop bc + push hl + pop iy + ld hl,2 + add hl,sp + ld (iy+0),l ; SP value + ld (iy+1),h + ld (iy+2),c + ld (iy+3),b + pop hl + ld (iy+4),l + ld (iy+5),h + push hl + ld hl,0 + ret +; +; void longjmp(jmp_buf env, int retval) +; +longjmp_:: + push hl + pop iy + ld l,(iy+0) + ld h,(iy+1) + ld c,(iy+2) + ld b,(iy+3) + ld sp,hl + ld l,(iy+4) + ld h,(iy+5) + push hl + push bc + pop ix + ex de,hl + ld a,h + or l + ret nz + inc hl + ret + + ENDMODULE + + + MODULE hex32 +; +; "stdlib.h" +; 㭪 뢮 ⭠筮 ଠ 祭 +; 㬥⮢ high low ᫮. +; 頥 祭 . +; +; void hex32(uint high, uint low) +; +hex32_:: + push de + call hex16_## + pop hl + jp hex16_## + + ENDMODULE + + + MODULE hex16 +; +; "stdlib.h" +; 㭪 뢮 ⭠筮 ଠ 祭 value. +; 뢮 祭 0x0000..0xFFFF +; 頥 祭 . +; +; void hex16(uint value) +; +hex16_:: + ld a,h + push hl + call hex8_## + pop hl + ld a,l + jp hex8_## + + ENDMODULE + + + MODULE hex8 +; +; "stdlib.h" +; 㭪 뢮 ⭠筮 ଠ 祭 value. +; 뢮 祭 0x00..0xFF. +; 頥 祭 . +; +; void hex8(char value) +; +hex8_:: + push af + rra + rra + rra + rra + call @1 + pop af +@1: and 0Fh + cp 9+1 + sbc a,69h + daa + ld c,5Bh + rst 10h + ret + + ENDMODULE + + + MODULE dec8 +; +; "stdlib.h" +; 㭪 뢮 㬥 value 筮 ଠ, +; 㫥. +; 뢮 祭 0..255. +; 㭪 頥 祭. +; +; void dec8(char value) +; +dec8_:: + push iy + ld l,a + ld h,0 + ld iy,_@tmp_## + res 7,(iy+0) + jp __dec3_## + + ENDMODULE + + + MODULE dec16 +; +; "stdlib.h" +; 㭪 뢮 㬥 value 筮 ଠ, +; 㫥. +; 뢮 祭 0..65535. +; 㭪 頥 祭. +; +; void dec16(uint value) +; +dec16_:: + push iy + exx + ld hl,0 ; . ࠧ + exx + ld iy,_@tmp_## + res 7,(iy+0) + jp __dec5_## + + ENDMODULE + + + MODULE dec32 +; +; "stdlib.h" +; 㭪 뢮 㬥 high low 祭. +; 뢮 ந室 筮 ଠ, 㫥. +; 뢮 祭 0...4 . +; 㭪 頥 祭. +; +; void dec32(uint high, uint low) +; +dec32_:: + push hl + exx + pop hl ; hl' = . ࠧ + exx + ex de,hl ; hl = . ࠧ + push iy + ld de,0CA00h + exx + ld de,3B9Ah ; 1.000.000.000 + exx + ld iy,_@tmp_ + res 7,(iy+0) + call GetLenN32 + ld de,0E100h + exx + ld de,05F5h ; 100.000.000 + exx + call GetLenN32 + ld de,9680h + exx + ld de,98h ; 10.000.000 + exx + call GetLenN32 + ld de,4240h + exx + ld de,0Fh ; 1.000.000 + exx + call GetLenN32 + ld de,86A0h + exx + ld de,1 ; 100.000 + exx + call GetLenN32 +__dec5_:: + ld de,10000 + exx + ld de,0 ; 10.000 + exx + call GetLenN32 + ld de,1000 ; 1.000 + call GetLenN16 +__dec3_:: + ld de,100 ; 100 + call GetLenN16 + ld de,10 ; 10 + call GetLenN16 + ld a,l + add a,"0" + ld c,5Bh + rst 10h + pop iy + ret + +_@tmp_::db 0 + +GetLenN32: + ld a,2Fh + and a +GetLenN321: + inc a + sbc hl,de + exx + sbc hl,de + exx + jp nc,GetLenN321 + add hl,de + exx + adc hl,de + exx + jr GetLenN160 + ; +GetLenN16: + ld a,2Fh + and a +GetLenN161: + inc a + sbc hl,de + jp nc,GetLenN161 + add hl,de +GetLenN160: + cp "0" + jr z,GetLenN162 + set 7,(iy+0) +GetLenN162: + bit 7,(iy+0) + ret z ; . 㫥 + ld c,5Bh + rst 10h + ret + + ENDMODULE diff --git a/third_party/solid-c/SRC/CLIB/STREAM.ASM b/third_party/solid-c/SRC/CLIB/STREAM.ASM new file mode 100644 index 0000000..2237291 --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/STREAM.ASM @@ -0,0 +1,947 @@ +; 室騥 㭪樨: +; +; puts +; printf +; fprintf +; cprintf +; sprintf +; scanf +; fscanf +; sscanf +; + + + + + + MODULE puts +; +; "stdio.h" +; 㭪 뢠 ࠭ ப string ⠭ ⮪ +; 뢮 stdout, 室 ⮪ 㫥 ᨬ 砭 +; ப ('\0') ᨬ ப ('\n'). +; 㭪 ᥣ 頥 ᫥ ᠭ ᨬ, +;  ᨬ ப '\n'. +; +; in: hl = ப +; out: a = ᫥ ᨬ ப +; +; char puts(*string) +; +puts_:: + ld a,(hl) + or a + jr z,@1 + push hl + call putch_## + pop hl + inc hl + jp puts_ + ; +@1: ld a,0Ah + push af + call putch_## + pop af + ret + + ENDMODULE + + + MODULE frmts +;----------------------------------------------------------- +; call from ..printf +;----------------------------------------------------------- +; in: hl = 砫 ࠬ஢ +; de = ࠡ稪 +; bc = । ࠬ஢ +; out: hl = ᫮ 뢥 ᨬ, ᫨ Ok +; hl = ⥫쭮 祭, 訡 +; +; int @spr@(char *fmt, char (* callback)(), int param) +; +; +mk_num: ld (mn0+1),a ; base + ld (chars+1),bc + exx + ld hl,number + exx + call mn0 + exx + ld (hl),0 + exx + ld hl,number + ld a,(sign) + or a + ret z + dec hl + ret + +;------------------------------------ +mn0: ld bc,200Ah + xor a +mn1: add hl,hl + rl e + rl d + rla + cp c + jr c,mn2 + sub c + inc l +mn2: djnz mn1 + ; DEHL-quot; A-rem + push af + ld a,d + or e + or h + or l + call nz,mn0 + pop af + push hl +chars: ld hl,char1 ; save char1 or char2 + ld c,a + ld b,0 + add hl,bc + ld a,(hl) + pop hl + exx + ld (hl),a + inc hl + exx + ret + +;------------------------------------------- +scan_length: + xor a + ld (flong),a ; false + ld (fladj),a + ld (flen+0),a ; make length = 0 + ld (flen+1),a + ld a," " + ld (padch),a ; space padding by default + ld a,(hl) + cp "-" + jr nz,sl1 + ld (fladj),a ; all will be LEFT adjusted, not right + inc hl +sl1: ld a,(hl) + cp "0" + jr nz,sl2 + ld a,(fladj) + or a + jr nz,sl1a + ld a,"0" + ld (padch),a ; pad numbers with '0's, not spaces +sl1a: inc hl +sl2: ld de,0 +sl2a: ld a,(hl) + sub "0" + jr c,sl3 + cp 9+1 + jr nc,sl3 + ex de,hl + ld c,l + ld b,h + add hl,hl + add hl,hl + add hl,bc + add hl,hl + ld b,0 + ld c,a + add hl,bc + ex de,hl + inc hl + jr sl2a + ; +sl3: ld (flen),de ; set explicit length + ld a,(hl) + cp "l" + jr z,sl4 + cp "L" + ret nz +sl4: ld (flong),a ; true + inc hl + ret + +;-------------------------------------------- +_pad: dec hl + bit 7,h + ret nz + push hl + ld a,(padch) + call outch + pop hl + ld de,(nprtd+1) + inc de + ld (nprtd+1),de + jp _pad + +;===================================================================== +; +; int @spr@(char *fmt,char (* callback)(), int param) +; +;===================================================================== +@spr@:: ld (outch1+1),bc ; optional parameter + ld (outch2+1),de ; callback pointer + push hl + pop iy ; at (iy+2) we have current parameter + ld hl,0 + ld (nprtd+1),hl ; clear return value + ld l,(iy+0) ; at iy we have pointer to format string + ld h,(iy+1) +loop: ld a,(hl) + inc hl + or a + jr z,nprtd + cp "%" + jr z,loc3 +loc4: call outch + ld de,(nprtd+1) + inc de + ld (nprtd+1),de + jp loop + ; +nprtd: ld hl,0 ; return value + ret + ; +loc3: ld a,(hl) + inc hl + cp "%" + jr z,loc4 + dec hl + call scan_length ; scan [-][0][0-9*][lL] + ld a,(hl) + inc hl + cp "c" + jp z,prt_c + cp "C" + jp z,prt_c ; print single character + cp "d" + jp z,prt_d + cp "D" + jp z,prt_d ; signed decimal + cp "u" + jp z,prt_u + cp "U" + jp z,prt_u ; unsigned decimal + cp "o" + jp z,prt_o + cp "O" + jp z,prt_o ; octal + cp "x" + jp z,prt_x1 + cp "X" + jp z,prt_x2 ; hexadecimal + cp "s" + jp z,prt_s + cp "S" + jp z,prt_s ; string + jp loop + ; +; %c symbol +prt_c: ld a,(iy+2) + call outch + ld de,(nprtd+1) + inc de + ld (nprtd+1),de +prt_q: inc iy + inc iy + ld a,(flong) + or a + jp z,loop ; false + inc iy + inc iy + jp loop + ; +; %s string +prt_s: ld a," " + ld (padch),a + push hl + push iy + ld l,(iy+2) + ld h,(iy+3) +fmt0: push hl + call strlen_## + ex de,hl + ld hl,(flen) + or a + sbc hl,de + ld (flen),hl + ld a,(fladj) + or a + call z,_pad + pop hl +fmt1: ld a,(hl) + inc hl + or a + jr z,fmt2 + call outch + ld de,(nprtd+1) + inc de + ld (nprtd+1),de + jp fmt1 + ; +fmt2: ld hl,(fladj) + ld a,(flen) + or a + call nz,_pad + pop iy + pop hl + jp prt_q + ; +; %u unsigned decimal +prt_u: push hl + push iy + call getnum + jr fmt4 + ; +; %d signed decimal +prt_d: push hl + push iy + call getnum + ld a,(flong) + or a + jr nz,fmt3 ; true + bit 7,h + jr z,fmt3 + ld de,-1 +fmt3: bit 7,d + jr z,fmt4 + ld a,"-" + ld (sign),a + xor a + sub l + ld l,a + ld a,0 + sbc a,h + ld h,a + ld a,0 + sbc a,e + ld e,a + ld a,0 + sbc a,d + ld d,a +fmt4: ld a,10 ; base + ld bc,char1 + call mk_num + jp fmt0 + ; +; %o octal +prt_o: push hl + push iy + call getnum + ld a,8 ; base + ld bc,char1 + call mk_num + jp fmt0 + ; +; %X hex +prt_x2: ld bc,char1 +prt_x: push hl + push iy + call getnum + ld a,16 ; base + call mk_num + jp fmt0 + ; +; %x hex +prt_x1: ld bc,char2 + jr prt_x + +;--------------------------------------- +getnum: xor a + ld (sign),a + ld l,(iy+2) + ld h,(iy+3) + ld a,(flong) + or a + jr z,gnu1 ; false + ld e,(iy+4) + ld d,(iy+5) + ret +gnu1: ld de,0 + ret + +;--------------------------------------- +outch: push hl + push iy +outch1: ld de,0 ; optional parameter +outch2: call 0 ; callback pointer + or a + jr z,och1 + ld hl,8000h ; -32768 + ld (nprtd+1),hl +och1: pop iy + pop hl + ret + +char1: db "0123456789ABCDEF" +char2: db "0123456789abcdef" + + dseg +flen: dw 0 +fladj: db 0 +flong: db 0 ; false/true +padch: db " " + ; +sign: db 0 ; ᫠ +number: ds 16 ; ᫠ + + ENDMODULE + + + MODULE xfputc +;----------------------------------------------------------- +; call from printf_, fprintf_ +;----------------------------------------------------------- +; 㭪 뢮 ᨬ 䠩 *fp. +; 訡 頥 EOF (0FFFFh) +; in: a = 뢮 ᨬ +; out: hl=0 - Ok +; hl=EOF (0FFFFh) - 訡 +; +; int @fputc(c, FILE *fp) +; +@fputc:: + call fputc_## ; 뢮 ᨬ ⮪ (䠩) + ld hl,-1 ; 訡 + cp l + ret z + xor a + inc hl ; Ok + ret + + ENDMODULE + + + MODULE printf +; +; "stdio.h" +; 㭪 뢮 ८ࠧ ଠ ⠭ +; ⮪ stdout ६, ।塞 㬥⠬ args. +; 㬥 㪠뢠 祭 ⨯, +; ᮮ⢥ ⨯, ப ଠ. +; +; in: ࠬ ⥪ +; out: hl = ᫮ 뢥 ᨬ, ᫨ Ok +; hl = . 祭 ( @spr@) 訡 +; +; int printf(char *format, arg1, arg2, ...) +; +printf_:: + ld bc,_iob_##-14 ; FILE- ⮪ stdout + ld de,@fputc## ; ࠡ稪 + ld hl,2 + add hl,sp ; 祩 ᮬ arg1 + jp @spr@## + + ENDMODULE + + + MODULE fprintf +; +; "stdio.h" +; 㭪 뢮 ८ࠧ ଠ 䠩 *fp +; ६, ।塞 㪠⥫ﬨ 㬥⮢ args. +; 㬥 㪠뢠 祭 ⨯, +; ᮮ⢥ ⨯, ப ଠ. +; +; in: ࠬ ⥪ +; out: hl = ᫮ 뢥. ᨬ, ᫨ Ok +; hl = . 祭 ( @spr@) 訡 +; +; int fprintf(FILE *fp, char *format, arg1, arg2, ...) +; +fprintf_:: + pop hl + pop bc ; bc = . ப + push bc + push hl + ld de,@fputc## ; ࠡ稪 + ld hl,4 + add hl,sp ; 祩 ᮬ arg1 + jp @spr@## + + ENDMODULE + + + MODULE cprintf +; +; "conio.h" +; 㭪 뢮 ८ࠧ ଠ ᨬ +; 祭 אַ ࠭. +; 㬥 㪠뢠 祭 ⨯, +; ᮮ⢥ ⨯, ப ଠ. +; +; in: ⥪ +; out: hl = ᫮ 뢥. ᨬ, ᫨ Ok +; hl = . 祭 ( @spr@), 訡 +; +; int cprintf(char *format, arg1, arg2, ...) +; +putch@: call putch_## + xor a + ret + +cprintf_:: + ld de,putch@ ; ࠡ稪 + ld hl,2 + add hl,sp ; 祩 ᮬ arg1 + jp @spr@## + + ENDMODULE + + + MODULE sprintf +; +; "stdio.h" +; 㭪 ८ࠧ ଠ 뢮 ᨬ 祭 +; buffer. 뢮 ப 뢠 . +; 㬥 㪠뢠 祭 ⨯, ᮮ- +; ⨯, ப ଠ. +; 㭪 頥 ⢮ ᨬ, ᠭ buffer. +; +; int sprintf(char buffer, char *format, arg1, arg2, ...) +; +; in: de=祩, ࠭ +@sspr@: ex de,hl + ld e,(hl) + inc hl + ld d,(hl) ; de= + ld (de),a ; . ᨬ + inc de + ld (hl),d ; . ⥪. ⥪ + dec hl + ld (hl),e + xor a + ret + +sprintf_:: + ld hl,2 + add hl,sp ; 祩 ᮬ + ld c,l + ld b,h + ld de,@sspr@ ; ࠡ稪 + ld hl,4 + add hl,sp + call @spr@## + ex de,hl + pop bc + pop hl + ld (hl),0 ; to end string + push hl + push bc + ex de,hl ; hl=return value + ret + + ENDMODULE + + + +;[]============================ scanf ==================================[] + + + MODULE xxscn +; +; call from _scn_ +; +@igs@: ex de,hl +@41: ld l,e + ld h,d + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld a,(hl) + cp " " + jr z,@40 + cp 9 ; Tab + jr z,@40 + cp 0Ah + ret nz +@40: ld l,e + ld h,d + push de + ld e,(hl) + inc hl + ld d,(hl) + inc de + ld (hl),d + dec hl + ld (hl),e + pop de + jr @41 + +; 室: hl= . +@bc@: ld hl,@46+1 + ld (hl),e ; ᥫ + call toupper_## + cp "A" + jr c,@42 + cp "Z"+1 + jr c,@43 +@42: cp "a" + jr c,@44 + cp "z"+1 + jr c,@43 +@44: cp "_" + jr nz,@45 +@43: sub "7" + jr @46 + ; +@45: cp "0" + jr c,@47 + cp "9"+1 + jr nc,@47 + sub "0" + jr @46 + ; +@47: ld hl,-1 ; . 祭 + ret + ; +@46: ld l,0 ; . 祭 + cp l + jr c,@48 + ld a,-1 +@48: ld l,a ; . + ld h,0 + ret + + dseg +?95: dw 0 +?99: dw 0 +?100: db 0 ; false/true +?102: db 0 +?103: dw 0 +?104: dw 0 +?105: dw 0 + + cseg +; +; call from ..scanf +; +_scn_:: + ld (?95),hl + ld l,e; + ld h,d; + inc de + inc de + ;ld hl,-2 + ;add hl,de + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld (?99),hl + ld l,e + ld h,d + ld (?105),hl + xor a + ld (?102),a +@50: ld hl,(?99) + ld a,(hl) + inc hl + ld (?99),hl + or a + jp z,@49 + cp " " + jr z,@50 + cp 9 ; Tab + jr z,@50 + cp 0Ah + jr z,@50 + cp "%" + jp nz,@51 + push hl + ld hl,1 + ld (?103),hl + ld a,l ; a=true + ld (?100),a + ld a,10 + ld (?101+1),a ; ᥫ + pop hl + ld a,(hl) + inc hl + ld (?99),hl + cp "*" + jr nz,@52 + xor a ; false + ld (?100),a + ld a,(hl) + inc hl + ld (?99),hl +@52: call toupper_## + cp "X" ; hex + jr z,@53 + cp "O" ; octal + jr z,@54 + cp "D" ; decimal + jr z,@55 + cp "U" ; unsigned + jr z,@56 + cp "S" ; string + jp z,@57 + cp "C" ; char + jp z,@58 + jp @49 + ; +@53: ld a,16 + ld (?101+1),a ; ᥫ + jr @56 + ; +@54: ld a,8 + ld (?101+1),a ; ᥫ + jr @56 + ; +@55: ld hl,?95 + call @igs@ + cp "-" + jr nz,@56 + ld hl,-1 + ld (?103),hl + ld hl,(?95) + inc hl + ld (?95),hl + ; +@56: ld hl,0 + ld (?104),hl + ld hl,?95 + call @igs@ +?101: ld e,0 ; . 祭 ( ᥫ) + call @bc@ + ld a,l + and h + inc a + jp z,@49 +@60: ld a,(?101+1) ; ᥫ + ld e,a + push af + ld hl,(?95) + ld a,(hl) + inc hl + ld (?95),hl + call @bc@ + ld a,l + pop de + ld e,d + cp 0FFh + jr z,@61 + push af + ld d,0 + ld hl,(?104) + call ?MULHD## + pop de + ld e,d + ld d,0 + add hl,de + ld (?104),hl + jr @60 + ; +@61: ld hl,(?95) + dec hl + ld (?95),hl + jp @62 + ; +@57: ld hl,?95 + call @igs@ + ld hl,(?105) + ld c,(hl) + inc hl + ld b,(hl) +@65: ld hl,(?95) + ld a,(hl) + inc hl + ld (?95),hl + ld e,a + inc e + dec e + jr z,@63 + ld hl,(?99) + ld a,(hl) + cp e + jr nz,@64 + inc hl + ld (?99),hl + jr @63 + ; +@64: ld a,(?100) + or a + jr z,@65 ; false + ld a,e + ld (bc),a + inc bc + jr @65 + ; +@63: ld hl,?100 + ld e,(hl) + inc e + dec e + jp z,@50 ; false + ld hl,(?102) + inc l + ld a,l + ld (?102),a + xor a + ld (bc),a + ld hl,(?105) + inc hl + inc hl + ld (?105),hl + jp @50 + ; +@58: ld hl,?100 + ld e,(hl) + inc e + dec e + jr z,@66 ; false + ld hl,(?95) + ld a,(hl) + ld hl,(?105) + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld (?105),hl + ld (bc),a + ld hl,(?102) + inc l + ld a,l + ld (?102),a +@66: ld hl,(?95) + inc hl + ld (?95),hl + jp @50 + ; +@62: ld a,(?100) + or a + jr z,@51 ; false + ld de,(?103) + ld hl,(?104) + call ?MULHD## + ex de,hl + ld hl,(?105) + inc hl + inc hl + ld (?105),hl + dec hl + dec hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld (hl),e + inc hl + ld (hl),d + ld hl,(?102) + inc l + ld a,l + ld (?102),a +@51: ld hl,(?95) + ld a,(hl) + or a + jp nz,@50 +@49: ld hl,(?102) + ld h,0 + ret + + ENDMODULE + + + MODULE scanf +; +; "stdio.h" +; 㭪 ⠥ ८ࠧ ଠ ⠭⭮ +; ⮪ stdin ६, ।塞 㪠⥫ﬨ 㬥⮢ args. +; 㬥 㪠뢠 祭 ⨯, ᮮ- +; ⨯, ப ଠ. +; 㭪 ᯮ ⥪, ࠧ஬ 128 . +; 㭪 頥 ᫮ , ࠧ ᯥ-ᨬ. +; +; int scanf(char *format, arg1, arg2, ...) +; +scanf_:: + ld (@1+1),sp + ld hl,-128 ; ࠧ + add hl,sp ; hl= ⥪ + ld sp,hl ; ᯮ ⥪ + call gets_## ; ப ᮫ + ex de,hl + ld hl,128+2 + add hl,sp + ex de,hl ; hl=㪠⥫ + call _scn_## +@1: ld sp,0 + ret + + ENDMODULE + + + MODULE fscanf +; +; "stdio.h" +; 㭪 ⠥ ८ࠧ ଠ 䠩 *fp, +; ६, ।塞 㪠⥫ﬨ 㬥⮢ args. +; 㬥 㪠뢠 祭 ⨯, +; ᮮ⢥ ⨯, ப ଠ. +; 㭪 ᯮ ⥪, ࠧ஬ 128 . +; 㭪 頥 ᫮ , ࠧ ᯥ-ᨬ. +; ⨦ 䠩, 뤠 EOF. +; +; int fscanf(FILE *fp, char *format, arg1, arg2, ...) +; +fscanf_:: + ld (@68+1),sp +; ld (?137+1),hl ; . + ld c,l; ; bc= . + ld b,h; + ld hl,-128 + add hl,sp + ld sp,hl ; ᯮ ⥪ +;?137: ld hl,0 +; call ?LAUHL;## +; dw 132 +; ; +; ld c,l ; bc= . +; ld b,h + ld de,127 ; . ப + 1 + ld hl,0 + add hl,sp ; hl= 祩 ⥪ + call fgets_## ; ப 䠩 (⮪) + ld a,l + or h + jr nz,@67 ; 訡 + dec hl ; hl=EOF + jr @68 + ; +@67: ex de,hl + ld hl,132 + add hl,sp + ex de,hl ; hl=㪠⥫ + call _scn_## +@68: ld sp,0 + ret + + ENDMODULE + + + MODULE sscanf +; +; "stdio.h" +; 㭪 ⠥ ८ࠧ ଠ buffer, +; ६, ।塞 㪠⥫ﬨ 㬥⮢ args. +; 㬥 㪠뢠 祭 ⨯, +; ᮮ⢥ ⨯, ப ଠ. +; 㭪 頥 ᫮ , ࠧ ᯥ-ᨬ. +; +; int sscanf(char *buffer, char *format, arg1, arg2, ...) +; +sscanf_:: + ld hl,2 + add hl,sp + ld e,(hl) + inc hl + ld d,(hl) + inc hl + ex de,hl + jp _scn_## + + ENDMODULE diff --git a/third_party/solid-c/SRC/CLIB/STRING.ASM b/third_party/solid-c/SRC/CLIB/STRING.ASM new file mode 100644 index 0000000..06018de --- /dev/null +++ b/third_party/solid-c/SRC/CLIB/STRING.ASM @@ -0,0 +1,554 @@ +; 室騥 㭪樨: +; +; memchr +; strcpy +; strncpy +; strcat +; strncat +; strcmp +; strncmp +; strchr +; strcspn +; strpbrk +; strlen +; strrchr +; strlwr +; strupr +; strspn +; strstr +; strtok +; + + + + + MODULE memchr +; +; "string.h" +; 㭪 count buff 楫 㦥 +; ࢮ  ᨬ "c". த , +; 㤥 㪠 ᨬ ஢७ +; count . +; 㭪 頥 㪠⥫ ᯮ ᨬ "c" buff. +; ᫨ ᨬ "c" 㦥 count buff, - +; 頥 NULL. +; +; void *memchr(char *buff, c, count) +; +memchr_:: + ld a,e ; ᨬ + cpir + dec hl + ret z ; + ld hl,0 ; NULL + ret + + ENDMODULE + + + MODULE strcpy +; +; "string.h" +; 㭪 s2 s1 ( 0- ᨬ 砭 ப). +; 㭪 頥 㪠⥫ s1. +; +; char *strcpy(*s1, *s2) +; +strcpy_:: + ex de,hl + push de +@1: ld a,(hl) + ldi + or a + jp nz,@1 + pop hl ; s1 + ret + + ENDMODULE + + + MODULE strncpy +; +; "string.h" +; 㭪 筮 count ᨬ ப s2 ப s1. +; ᫨ count s2, 㫥 ᨬ 砭 ப +; ப s1. ᫨ count s2, +; s1 㫥묨 ᨬ, ⨦ +; count. +; 㭪 頥 㪠⥫ s1. +; +; char *strncpy(*s1, *s2, count) +; +strncpy_:: + ex de,hl + push de +@2: ld a,(hl) +@3: ldi + jp pe,@4 + or a + jp nz,@2 + dec hl + jp @3 + ; +@4: pop hl ; s1 + ret + + ENDMODULE + + + MODULE strcat +; +; "string.h" +; 㭪 s2 s1, ப s1 +; 㫥 ᨬ. +; 㭪 頥 㪠⥫ s1. +; +; char *strcat(*s1, *s2) +; +strcat_:: + xor a + ld b,a + ld c,a + push hl + cpir + dec hl + ex de,hl +@1: ld a,(hl) + ldi + or a + jp nz,@1 + pop hl ; s1 + ret + + ENDMODULE + + + MODULE strncat +; +; "string.h" +; 㭪 count ᨬ ப s2 ப s1, +; ப s1 㫥 ᨬ. +; s1 筮 ࠧ饭 १- +; 饩 ப. +; 㭪 頥 㪠⥫ s1. +; +; char *strncat(*s1, *s2, count) +; +strncat_:: + xor a + push hl + ld bc,0 + cpir + dec hl + ex de,hl +@4: ld a,(hl) + or a + jr z,@5 + ldi + jp po,@4 +@5: xor a + ld (de),a + pop hl ; s1 + ret + + ENDMODULE + + + MODULE strcmp +; +; "string.h" +; 㭪 ந ᫥⥫쭮 ॣ-ᨬ +; ࠢ ᨬ ப s1 s2, த , +; ᮢ, ப . +; 㭪 頥 祭, 㪠뢠饥 ᮮ⭮襭 +; ப: +; < 0 s1 < s2 +; = 0 s1 = s2 +; > 0 s1 > s2 +; +; int strcmp(*s1, *s2) +; +strcmp_:: + ex de,hl +@6: ld a,(de) + sub (hl) + jr nz,@7 + inc de + inc hl + ld a,(de) + or a + jp nz,@6 +@7: ld h,a + ld l,0 + ret + + ENDMODULE + + + MODULE strncmp +; +; "string.h" +; 㭪 ந ᫥⥫쭮 ॣ-ᨬ ࠢ +; ᨬ ப s1 s2. ⢮ ࠢ ᨬ +; count. ᫨ ப 稢, ࠢ ४頥. +; 㭪 頥 祭, 㪠뢠饥 ᮮ⭮襭 ப: +; < 0 s1 < s2 +; = 0 s1 = s2 +; > 0 s1 > s2 +; +; int strncmp(*s1, *s2, uint count) +; +strncmp_:: + ex de,hl +@6: ld a,(de) + sub (hl) + jr nz,@7 + ld a,(de) + or a + jr z,@7 + inc de + inc hl + dec bc + ld a,b + or c + jp nz,@6 +@7: ld h,a + ld l,0 + ret + + ENDMODULE + + + MODULE strchr +; +; "string.h" +; 㭪 室 ࢮ 宦 "c" string. +; "c" 㫥 ᨬ. +; 㫥 ᨬ 砭 string ⠪ 砥 . +; 㭪 頥 㪠⥫ ࢮ 宦 "c" string. +; 頥 NULL, ᫨ ᨬ . +; +; char *strchr(*string, c) +; +strchr_:: + ld a,(hl) ; string + cp e ; ᨬ "c" + ret z + inc hl + or a + jp nz,strchr_ + ld h,a ; NULL + ld l,a + ret + + ENDMODULE + + + MODULE inrange +; +; 뢠 . /ணࠬ +; +@inran:: + ld a,(hl) + or a + ret z + cp e + inc hl + jp nz,@inran + or 0FFh + ret + + ENDMODULE + + + MODULE strcspn +; +; "string.h" +; 室 ப s1, 室 ப s2. +; 頥 ப s1, 饩 ᨬ, +; ப s2. ᫨ ᨬ ப s1 +; s2, 頥 ப s1 - +; 饣 . +; +; size_t strcspn(*s1, *s2) +; +strcspn_:: + ld b,h + ld c,l + ld hl,0 +@1: ld a,(bc) + or a + ret z + push hl + ex de,hl + push hl + ld e,a + call @inran## + pop de + pop hl + ret nz + inc hl + inc bc + jp @1 + + ENDMODULE + + + MODULE strpbrk +; +; "string.h" +; 㭪 室 ࢮ 宦 ப s1  +; ᨬ ப s2. 㫥 ᨬ 砭 +; ᪥ ᬠਢ. +; 㭪 頥 㪠⥫ ࢮ 宦 +; ᨬ s2 ப s1. +; ⢨ ᨬ s1 s2, - +; 頥 NULL. +; +; char *strpbrk(*s1, *s2) +; +strpbrk_:: + ld a,(hl) + or a + jr z,@2 +@1: push hl + ld l,(hl) + push de + ex de,hl + call @inran## + pop de + pop hl + ret nz + inc hl + jp @1 + ; +@2: ld h,a ; NULL + ld l,a + ret + + ENDMODULE + + + MODULE strlen +; +; "string.h" +; 㭪 頥 ப string, +; 祬 㫥 ᨬ 砭 ப, ࠧ +; ப 室. +; +; size_t strlen(*string) +; +strlen_:: + xor a + ld b,a + ld c,a + push hl + cpir + pop de + scf + sbc hl,de ; hl = ப + ret + + ENDMODULE + + + MODULE strrchr +; +; "string.h" +; 㭪 室 ᫥ 宦 ᨬ "c" +; ப string. 㫥 ᨬ 砭 ப +; string ⠪ 砥 . +; 㭪 頥 㪠⥫ ᫥ 宦 +; ᨬ "c" string. +; ᫨ ᨬ , 頥 NULL. +; +; char *strrchr(*string, c) +; +strrchr_:: + ld b,h + ld c,l + ld hl,0 ; NULL +@1: ld a,(bc) ; string + or a + ret z + cp e ; ᨬ "c" + jp nz,@2 + ld h,b ; 宦 + ld l,c +@2: inc bc + jp @1 + + ENDMODULE + + + MODULE strlwr +; +; "string.h" +; 㭪 ८ࠧ뢠 㪢 孥 ॣ +; ப string, 稢饩 㫥, 㪢 +; ॣ. 㣨 ᨬ ᬠਢ. +; 㭪 頥 㪠⥫ ப string. +; +; char *strlwr(*string) +; +strlwr_:: + push hl +@1: ld a,(hl) + or a + jr z,@2 + call tolower_## ; A..Z -> a..z + ld (hl),a + inc hl + jp @1 + ; +@2: pop hl ; string + ret + + ENDMODULE + + + MODULE strupr +; +; "string.h" +; 㭪 ८ࠧ뢠 㪢 ॣ +; ப string, 稢饩 㫥, 㪢 孥 +; ॣ. 㣨 ᨬ ᬠਢ. +; 㭪 頥 㪠⥫ ப string. +; +; char *strupr(*string) +; +strupr_:: + push hl +@1: ld a,(hl) + or a + jr z,@2 + call toupper_## ; a..z -> A..Z + ld (hl),a + inc hl + jp @1 + ; +@2: pop hl ; string + ret + + ENDMODULE + + + MODULE strspn +; +; "string.h" +; 㭪 頥 ᮢ饩 ப s1, +; ⮨ ᨬ, ப s2. 㫥 +; ᨬ 砭 ப s2 ᬠਢ. +; ᫨ ப s1 稭 ᨬ, 室饣 ப s2, +; 頥 0. +; +; size_t strspn(*s1, *s2) +; +strspn_:: + ld b,h + ld c,l + ld hl,0 ; . ப +@1: ld a,(bc) + or a + ret z + push hl + ex de,hl + push hl + ld e,a + call @inran## + pop de + pop hl + ret z ; ப + inc hl + inc bc + jp @1 + + ENDMODULE + + + MODULE strstr +; +; "string.h" +; 㭪 頥 㪠⥫ ࢮ 宦 +; ப s2 ப s1. +; 㭪 頥 NULL, ᫨ s2 뫠 . +; ᫨ ப s2 ࠢ 0, 頥 s1. +; +; char *strstr(*s1, *s2) +; +strstr_:: + ld a,(hl) + or a + jr nz,@1 + ld l,a ; NULL + ld h,a + ret +@1: push hl ; s1 + push de ; s2 +@2: ld a,(de) ; s2 + or a + jr z,@3 + cp (hl) ; s1 + inc hl + inc de + jp z,@2 + pop de + pop hl + inc hl + jp strstr_ + ; +@3: pop de + pop hl ; s1 + ret + + ENDMODULE + + + MODULE strtok +; +; "string.h" +; ⮪(). +; 㭪 室 ப s1 ⮪, ⤥ ( ) +; ࠭⥫ ⢠ ᨬ-࠭⥫ ப s2. +; ⮪ ப s1 稢 㫥. +; ⮣, ⮡ ᫥騩 ⮪ s1, 㭪 strtok +; 뢠 NULL-祭 㬥 s1. +; 㬥 NULL s1 뢠 strtok ᫥饣 +; ।饩 ப ᨬ. +; ⢮ ࠭⥫ ப s2, 맮 맮, +; ࠧ, ⠪ s2 ਭ 祭. +; 맮, 㭪 頥 㪠⥫ +; ⮪ ப s1, ࠧ த । ப s1. +; 㭪 頥 㪠⥫ NULL, ⮪ +; ப s1. +; +; char *strtok(*s1, *s2) +; +strtok_:: + ld (@4+1),de ; s2 + ld (@2+1),hl ; s1 + ld a,l + or h + jr nz,@0 +@3: ld hl,0 ; ᫥. ᪠ s1 + ld (@2+1),hl +@0: ld (@1+1),hl ; s1 +@2: ld hl,0 ; ⥪. s1 + ld a,(hl) + inc hl + ld (@2+1),hl + or a + jr z,@1 + ld e,a +@4: ld hl,0 ; . s2 + call @inran## + jr z,@2 + ld hl,(@2+1) ; ⥪. s1 + dec hl + ld (hl),0 ; ᨬ ? + inc hl + ld (@3+1),hl ; ᫥. ᪠ s1 +@1: ld hl,0 ; ᨬ + ret + + ENDMODULE diff --git a/third_party/solid-c/WHATSNEW.RUS b/third_party/solid-c/WHATSNEW.RUS new file mode 100644 index 0000000..ad42481 --- /dev/null +++ b/third_party/solid-c/WHATSNEW.RUS @@ -0,0 +1,23 @@ + SOLID C + ~~~~~~~~~~~~~ + + +[!] 砭 +[+] +[-] ࠢ 訡 +[*] + + + +--------------------------------------------------------------------------- +11.09.2004 +--------------------------------------------------------------------------- + [-] ࠢ (ld.exe), 騩 ᡮન + ணࠬ, ᠭ . v0.04b. + + +--------------------------------------------------------------------------- + 0.01b (03.09.2004) +--------------------------------------------------------------------------- + + betta-५ SOLID C. diff --git a/toolchain/check_banks.py b/toolchain/check_banks.py new file mode 100755 index 0000000..3295e1c --- /dev/null +++ b/toolchain/check_banks.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +""" +Parse an SDCC .map file produced by sdldz80 and verify that every named +bank fits inside its 16 KB window. + +The Sprinter toolchain expects each `_BANKn` area (with n >= 1) to occupy +at most 16384 bytes — that is the size of CPU window 3 where banked code +runs at execution time. The SDCC linker itself does not enforce this +limit, so we catch it post-link. + +We also surface the HOME budget: anything left between the end of _CODE +and the start of window 2 (0x8000) is leftover space for adding code/data +without banking. + +Usage: check_banks.py + +Exits non-zero with a clear message if any bank is over its limit. +""" + +import re +import sys + +BANK_LIMIT = 16 * 1024 +# HOME upper bound depends on layout: +# HUGE: CODE at 0x4100 (W1), HOME may spill into W2 → ceiling 0xC000 +# BIG: CODE at 0x8100 (W2), HOME stays in W2 → ceiling 0xC000 +# tiny/small: same ceiling — anything in W3 is bank territory. +# We pick the ceiling per-image based on where _CODE lives, so we don't +# falsely flag W2-resident code as "spilled into stack/heap". +HOME_CEILING = 0xC000 + + +def parse_map(path): + """ + Returns a dict {area_name: (addr, size)} for area lines like: + _CODE 00004100 00000313 = ... + """ + line_re = re.compile(r"^\s*(_\w+)\s+([0-9A-Fa-f]{8})\s+([0-9A-Fa-f]{8})\s*=") + areas = {} + with open(path) as f: + for ln in f: + m = line_re.match(ln) + if not m: + continue + name = m.group(1) + addr = int(m.group(2), 16) + size = int(m.group(3), 16) + areas[name] = (addr, size) + return areas + + +def main(): + if len(sys.argv) != 2: + sys.exit("usage: check_banks.py ") + + areas = parse_map(sys.argv[1]) + + fails = [] + bank_names = sorted( + n for n in areas if re.fullmatch(r"_BANK\d+", n) + ) + + for name in bank_names: + addr, size = areas[name] + pct = size * 100.0 / BANK_LIMIT + marker = "OK" + if size > BANK_LIMIT: + marker = "OVERFLOW" + fails.append((name, size)) + print(f" {name:<12} @ 0x{addr:08X} size {size:>5} / {BANK_LIMIT} ({pct:5.1f}%) {marker}") + + # HOME budget — _CODE can land in W1 (huge/small) or W2 (big/tiny). + if "_CODE" in areas: + addr, size = areas["_CODE"] + end = addr + size + budget_remaining = HOME_CEILING - end + which_window = "W2 (0x8000-0xBFFF)" if addr >= 0x8000 else "HOME (0x4100-0xBFFF)" + print(f" _CODE @ 0x{addr:08X} size {size:>5} → ends at 0x{end:04X}, " + f"{which_window} has {budget_remaining} bytes free before 0x{HOME_CEILING:04X}") + if budget_remaining < 0: + print(f" ERROR: _CODE extends past 0x{HOME_CEILING:04X} (stack/heap territory)") + fails.append(("_CODE", size)) + + if fails: + print() + for name, size in fails: + print(f" {name} too big: {size} bytes (limit {BANK_LIMIT})") + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/toolchain/make_release.sh b/toolchain/make_release.sh new file mode 100755 index 0000000..5f5f245 --- /dev/null +++ b/toolchain/make_release.sh @@ -0,0 +1,108 @@ +#!/bin/bash +# +# make_release.sh — pack a redistributable Sprinter C Compiler release tarball. +# +# Whitelist-based: only files explicitly listed below go into the tarball. +# Anything else (internal dev tools, research docs, build artefacts, mac +# xattr sidecars, .git, .claude memory, etc.) is excluded by construction. +# +# Output: build/sprinter-c-v-.tar.gz with: +# - bin/sprinter-cc : compiler driver +# - toolchain/mkexe/ : .ihx → .exe utility (prebuilt for host) +# - toolchain/check_banks.py : bank size checker used by sprinter-cc +# - runtime/ : crt0 + bank/heap support +# - libc/include/ : public headers +# - libc/{io,stdio,mem,gfx}/ : libc sources (assembled into sprinter.lib) +# - lib/Makefile + lib/sprinter.lib : prebuilt library + recipe to rebuild +# - examples/ : 27 ready-to-build programs +# - third_party/sdcc/ : vendored SDCC 4.5 +# - release_docs/ → docs/ : user-facing documentation +# - examples.mk-style root Makefile, README, RELEASE_NOTES, LICENSE +# +# NOT included (developer-only): +# - docs/ (research notes, original PetersPlus reference material) +# - third_party/solid-c/ (reference for Solid-C compat target) +# - mame/ (large emulator + Sprinter HDD/CD images) +# - .git/, .claude/, .DS_Store, ._* (macOS xattrs) +# - this script itself (toolchain/make_release.sh) +# - any build artefacts (.sprinter-cc-*, *.rel, *.ihx, *.lk, *.map, ...) +# +# Usage: ./toolchain/make_release.sh [VERSION] + +set -euo pipefail + +VERSION="${1:-1.0}" +ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )" +HOST_ARCH="$(uname -s | tr '[:upper:]' '[:lower:]')-$(uname -m)" +NAME="sprinter-c-v${VERSION}-${HOST_ARCH}" +STAGE="$ROOT/build/$NAME" +TARBALL="$ROOT/build/$NAME.tar.gz" + +cd "$ROOT" + +echo ">> verifying build is clean and current" +make all >/dev/null 2>&1 + +echo ">> staging $STAGE" +rm -rf "$STAGE" +mkdir -p "$STAGE" + +# --- WHITELIST: only these directories/files end up in the tarball --- + +# Top-level metadata +cp README.md RELEASE_NOTES.md LICENSE Makefile "$STAGE/" + +# Toolchain +cp -R bin runtime libc examples "$STAGE/" +# toolchain/ — only mkexe (prebuilt + sources) and check_banks.py +mkdir -p "$STAGE/toolchain/mkexe" +cp toolchain/mkexe/mkexe "$STAGE/toolchain/mkexe/" +cp toolchain/mkexe/mkexe.c "$STAGE/toolchain/mkexe/" +cp toolchain/mkexe/Makefile "$STAGE/toolchain/mkexe/" +[[ -f toolchain/mkexe/check.sh ]] && cp toolchain/mkexe/check.sh "$STAGE/toolchain/mkexe/" +cp toolchain/check_banks.py "$STAGE/toolchain/" + +# Lib — keep Makefile and the prebuilt archive only; sources are in libc/ +mkdir -p "$STAGE/lib" +cp lib/Makefile "$STAGE/lib/" +cp lib/sprinter.lib "$STAGE/lib/" + +# Vendored SDCC — follow symlinks so the real content lands in the tarball +mkdir -p "$STAGE/third_party" +[[ -d third_party/sdcc ]] && cp -RL third_party/sdcc "$STAGE/third_party/" +[[ -f third_party/setup-sdcc.sh ]] && cp third_party/setup-sdcc.sh "$STAGE/third_party/" + +# User-facing docs. Source: release_docs/{en,ru}/ → docs/{en,ru}/ in tarball. +# The internal docs/ tree (research notes, original Peters Plus material) is +# NOT shipped. +[[ -d release_docs ]] && cp -R release_docs "$STAGE/docs" + +# --- Strip build artefacts that crept in via examples/ --- +echo ">> stripping build artefacts and macOS metadata" +find "$STAGE" \( \ + -name '.sprinter-cc-*' -o \ + -name '*.rel' -o -name '*.lst' -o -name '*.sym' -o -name '*.asm' -o \ + -name '*.ihx' -o -name '*.lk' -o -name '*.map' -o -name '*.noi' -o \ + -name '*.exe' -o \ + -name '.DS_Store' -o -name '._*' \ + \) -print0 | xargs -0 rm -rf + +# Bonus: clean any *_test or scratch files I might have left in libc dirs +find "$STAGE/libc" -name 'build' -type d -exec rm -rf {} + 2>/dev/null || true + +# --- Tarball --- +echo ">> packaging $TARBALL" +cd "$ROOT/build" +COPYFILE_DISABLE=1 tar --no-mac-metadata -czf "$TARBALL" "$NAME" 2>/dev/null || \ + COPYFILE_DISABLE=1 tar -czf "$TARBALL" "$NAME" +rm -rf "$NAME" + +ls -lh "$TARBALL" +echo +echo "Release ready: $TARBALL" +echo +echo "Try it:" +echo " tar xzf $(basename "$TARBALL")" +echo " cd $NAME" +echo " make all" +echo " bin/sprinter-cc -o hello.exe examples/hello/hello.c" diff --git a/toolchain/mkexe/Makefile b/toolchain/mkexe/Makefile new file mode 100644 index 0000000..5d70cfd --- /dev/null +++ b/toolchain/mkexe/Makefile @@ -0,0 +1,15 @@ +CFLAGS ?= -O2 -Wall -Wextra -std=c99 -pedantic +CC ?= cc + +all: mkexe + +mkexe: mkexe.c + $(CC) $(CFLAGS) -o $@ mkexe.c + +check: mkexe + ./run-tests.sh + +clean: + rm -f mkexe tests/*.actual tests/*.exe + +.PHONY: all check clean diff --git a/toolchain/mkexe/mkexe.c b/toolchain/mkexe/mkexe.c new file mode 100644 index 0000000..888bf9c --- /dev/null +++ b/toolchain/mkexe/mkexe.c @@ -0,0 +1,485 @@ +/* + * mkexe — convert a flat binary or Intel HEX image into a Sprinter ESTEX .EXE. + * + * Single-image mode (no banks): + * +00 3 bytes "EXE" + * +03 1 byte version (0) + * +04 4 bytes offset to image (0x00000200) + * +08 2 bytes loader size (0 — whole file at once) + * +0A 6 bytes reserved (0) + * +10 2 bytes load address + * +12 2 bytes start (PC) + * +14 2 bytes initial SP + * +16 490 bytes reserved (0) + * +200 ... contiguous image bytes + * + * Multi-bank mode (detected from IHX ELA records): + * header.loader = HOME image size (so ESTEX loads only HOME and keeps the + * .EXE file open with the handle in IX-3; crt0_banked.s + * then reads each bank with ESTEX READ) + * file layout: header (512) + HOME image + bank1 (16KB) + bank2 (16KB) + ... + * + * IHX convention from SDCC `-Wl-b _BANKn=0xNC000`: + * ELA = 0x00 → HOME (low16 = 0x4100..0x7FFF range) + * ELA = 0x01 → BANK1 (low16 = 0xC000..0xFFFF) + * ELA = 0x02 → BANK2 + * ... + * + * Build: cc -O2 -Wall -Wextra -std=c99 -o mkexe mkexe.c + */ + +#include +#include +#include +#include +#include +#include + +#define EXE_HEADER_SIZE 512 +#define SEGMENT_SIZE 0x10000u +#define BANK_SIZE 0x4000u /* 16 KB per bank */ +#define DEFAULT_BANK_BASE 0xC000u /* HUGE mode (banks live in window 3)*/ +#define BIG_BANK_BASE 0x4000u /* BIG mode (banks live in window 1)*/ +#define MAX_BANKS 15 +#define HOME_SEG 0 + +#define DEFAULT_STACK 0xBFFEu +#define DEFAULT_LOAD 0x4100u + +typedef struct { + uint8_t bytes[SEGMENT_SIZE]; + uint8_t present[SEGMENT_SIZE]; + uint32_t lo; + uint32_t hi; + int any; +} segment_t; + +static segment_t segments[MAX_BANKS + 1]; + +static void segments_init(void) { + for (int i = 0; i <= MAX_BANKS; i++) { + memset(segments[i].bytes, 0, sizeof(segments[i].bytes)); + memset(segments[i].present, 0, sizeof(segments[i].present)); + segments[i].lo = 0xFFFFFFFFu; + segments[i].hi = 0; + segments[i].any = 0; + } +} + +static int segment_set(unsigned seg, uint32_t addr, uint8_t v) { + if (seg > MAX_BANKS) { + fprintf(stderr, "mkexe: bank id %u exceeds MAX_BANKS=%d\n", seg, MAX_BANKS); + return -1; + } + if (addr >= SEGMENT_SIZE) { + fprintf(stderr, "mkexe: address 0x%X outside the 64K Z80 space\n", addr); + return -1; + } + segment_t *s = &segments[seg]; + s->bytes[addr] = v; + s->present[addr] = 1; + if (addr < s->lo) s->lo = addr; + if (addr > s->hi) s->hi = addr; + s->any = 1; + return 0; +} + +static int hex_nib(int c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + return -1; +} + +static int hex_byte(const char *p) { + int h = hex_nib((unsigned char)p[0]); + int l = hex_nib((unsigned char)p[1]); + if (h < 0 || l < 0) return -1; + return (h << 4) | l; +} + +static int load_ihx(const char *path) { + FILE *f = fopen(path, "rb"); + if (!f) { + fprintf(stderr, "mkexe: cannot open '%s': %s\n", path, strerror(errno)); + return -1; + } + char line[1024]; + int rc = 0, lineno = 0; + unsigned seg = 0; /* upper 8 bits of 24-bit virtual addr */ + uint32_t para_base = 0; /* paragraph base from type-02 records */ + while (fgets(line, sizeof(line), f)) { + lineno++; + size_t n = strlen(line); + while (n > 0 && (line[n-1] == '\n' || line[n-1] == '\r' || line[n-1] == ' ')) { + line[--n] = 0; + } + if (n == 0) continue; + if (line[0] != ':') { + fprintf(stderr, "mkexe: %s:%d: expected ':' record start\n", path, lineno); + rc = -1; break; + } + if (n < 11) { + fprintf(stderr, "mkexe: %s:%d: record too short\n", path, lineno); + rc = -1; break; + } + int count = hex_byte(line + 1); + int aHi = hex_byte(line + 3); + int aLo = hex_byte(line + 5); + int type = hex_byte(line + 7); + if (count < 0 || aHi < 0 || aLo < 0 || type < 0) { + fprintf(stderr, "mkexe: %s:%d: bad hex in header\n", path, lineno); + rc = -1; break; + } + if (n < (size_t)(11 + 2 * count)) { + fprintf(stderr, "mkexe: %s:%d: truncated record\n", path, lineno); + rc = -1; break; + } + unsigned sum = (unsigned)count + (unsigned)aHi + (unsigned)aLo + (unsigned)type; + uint16_t addr = (uint16_t)((aHi << 8) | aLo); + + if (type == 0x00) { + for (int i = 0; i < count; i++) { + int b = hex_byte(line + 9 + 2 * i); + if (b < 0) { rc = -1; goto done; } + sum += (unsigned)b; + uint32_t a = para_base + (uint32_t)addr + (uint32_t)i; + if (segment_set(seg, a, (uint8_t)b) < 0) { rc = -1; goto done; } + } + } else if (type == 0x01) { + int cc = hex_byte(line + 9); + if (cc < 0) { rc = -1; goto done; } + sum += (unsigned)cc; + if ((sum & 0xFF) != 0) { + fprintf(stderr, "mkexe: %s:%d: bad checksum on EOF record\n", path, lineno); + rc = -1; goto done; + } + break; + } else if (type == 0x02) { + int bHi = hex_byte(line + 9); + int bLo = hex_byte(line + 11); + if (bHi < 0 || bLo < 0) { rc = -1; goto done; } + sum += (unsigned)bHi + (unsigned)bLo; + para_base = ((uint32_t)((bHi << 8) | bLo)) << 4; + } else if (type == 0x04) { + int bHi = hex_byte(line + 9); + int bLo = hex_byte(line + 11); + if (bHi < 0 || bLo < 0) { rc = -1; goto done; } + sum += (unsigned)bHi + (unsigned)bLo; + uint32_t high = ((uint32_t)bHi << 8) | (uint32_t)bLo; + if (high > MAX_BANKS) { + fprintf(stderr, "mkexe: %s:%d: ELA upper16=0x%04X means bank id %u, exceeds MAX_BANKS=%d\n", + path, lineno, (unsigned)high, (unsigned)high, MAX_BANKS); + rc = -1; goto done; + } + seg = (unsigned)high; + } else if (type == 0x03 || type == 0x05) { + for (int i = 0; i < count; i++) { + int b = hex_byte(line + 9 + 2 * i); + if (b < 0) { rc = -1; goto done; } + sum += (unsigned)b; + } + } else { + fprintf(stderr, "mkexe: %s:%d: unsupported HEX type 0x%02X\n", path, lineno, type); + rc = -1; goto done; + } + int cc = hex_byte(line + 9 + 2 * count); + if (cc < 0) { + fprintf(stderr, "mkexe: %s:%d: missing checksum\n", path, lineno); + rc = -1; goto done; + } + sum += (unsigned)cc; + if ((sum & 0xFF) != 0) { + fprintf(stderr, "mkexe: %s:%d: checksum mismatch (sum=%02X)\n", path, lineno, sum & 0xFF); + rc = -1; goto done; + } + } +done: + fclose(f); + return rc; +} + +static int load_bin(const char *path, uint32_t load_addr) { + FILE *f = fopen(path, "rb"); + if (!f) { + fprintf(stderr, "mkexe: cannot open '%s': %s\n", path, strerror(errno)); + return -1; + } + uint8_t buf[4096]; + uint32_t addr = load_addr; + size_t n; + while ((n = fread(buf, 1, sizeof(buf), f)) > 0) { + for (size_t i = 0; i < n; i++) { + if (segment_set(HOME_SEG, addr++, buf[i]) < 0) { fclose(f); return -1; } + } + } + fclose(f); + return 0; +} + +static int has_suffix(const char *s, const char *suf) { + size_t ls = strlen(s), lf = strlen(suf); + if (lf > ls) return 0; + return strcasecmp(s + ls - lf, suf) == 0; +} + +static void usage(FILE *o) { + fprintf(o, + "mkexe — assemble a Sprinter ESTEX .EXE from an IHX or BIN image\n" + "\n" + "Usage:\n" + " mkexe [options] -o OUT.exe INPUT(.ihx|.bin)\n" + "\n" + "Options:\n" + " -o FILE output .exe path (required)\n" + " -L ADDR load address (default: lowest in .ihx, or 0x%04X for .bin)\n" + " -E ADDR entry point / start PC (default: same as load)\n" + " -S ADDR initial SP (default: 0x%04X)\n" + " -p PAD padding byte for gaps in image (default: 0xFF)\n" + " -B ADDR bank low-16 base (default: 0x%04X HUGE; pass 0x%04X BIG)\n" + " -v verbose\n" + " -h this help\n" + "\n" + "If the input .ihx contains ELA records (type 04) with high16 = N where\n" + "1 <= N <= %d, those bytes are packed as bank N (16 KB each, base 0x%04X).\n" + "The header.loader is then set to the HOME image size so ESTEX keeps the\n" + "file open for crt0_banked.s to read each bank with RST 10h C=13h.\n" + "\n" + "Addresses accept 0x.. / $.. / decimal.\n", + DEFAULT_LOAD, DEFAULT_STACK, + DEFAULT_BANK_BASE, BIG_BANK_BASE, + MAX_BANKS, DEFAULT_BANK_BASE); +} + +static int parse_addr(const char *s, uint32_t *out) { + if (!s || !*s) return -1; + char *end = NULL; + int base = 10; + if (s[0] == '$') { s++; base = 16; } + else if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) { s += 2; base = 16; } + unsigned long v = strtoul(s, &end, base); + if (end == s || (end && *end)) return -1; + *out = (uint32_t)v; + return 0; +} + +static void put16_le(uint8_t *p, uint16_t v) { + p[0] = (uint8_t)(v & 0xFF); + p[1] = (uint8_t)(v >> 8); +} + +int main(int argc, char **argv) { + const char *out_path = NULL; + const char *in_path = NULL; + uint32_t load_addr = 0xFFFFFFFFu; + uint32_t start_addr = 0xFFFFFFFFu; + uint32_t stack_addr = DEFAULT_STACK; + uint32_t pad_byte = 0xFF; + uint32_t bank_base = DEFAULT_BANK_BASE; + int verbose = 0; + + for (int i = 1; i < argc; i++) { + const char *a = argv[i]; + if (!strcmp(a, "-h") || !strcmp(a, "--help")) { usage(stdout); return 0; } + if (!strcmp(a, "-v")) { verbose = 1; continue; } + if (!strcmp(a, "-o") && i + 1 < argc) { out_path = argv[++i]; continue; } + if (!strcmp(a, "-L") && i + 1 < argc) { + if (parse_addr(argv[++i], &load_addr) < 0) { fprintf(stderr, "mkexe: bad -L\n"); return 1; } + continue; + } + if (!strcmp(a, "-E") && i + 1 < argc) { + if (parse_addr(argv[++i], &start_addr) < 0) { fprintf(stderr, "mkexe: bad -E\n"); return 1; } + continue; + } + if (!strcmp(a, "-S") && i + 1 < argc) { + if (parse_addr(argv[++i], &stack_addr) < 0) { fprintf(stderr, "mkexe: bad -S\n"); return 1; } + continue; + } + if (!strcmp(a, "-p") && i + 1 < argc) { + if (parse_addr(argv[++i], &pad_byte) < 0) { fprintf(stderr, "mkexe: bad -p\n"); return 1; } + continue; + } + if (!strcmp(a, "-B") && i + 1 < argc) { + if (parse_addr(argv[++i], &bank_base) < 0) { fprintf(stderr, "mkexe: bad -B\n"); return 1; } + if (bank_base + BANK_SIZE > SEGMENT_SIZE) { + fprintf(stderr, "mkexe: -B 0x%X + 16KB exceeds 0x10000\n", bank_base); + return 1; + } + continue; + } + if (a[0] == '-') { fprintf(stderr, "mkexe: unknown option '%s'\n", a); usage(stderr); return 1; } + if (in_path) { fprintf(stderr, "mkexe: extra positional '%s'\n", a); return 1; } + in_path = a; + } + + if (!in_path || !out_path) { usage(stderr); return 1; } + + segments_init(); + + if (has_suffix(in_path, ".ihx") || has_suffix(in_path, ".hex")) { + if (load_ihx(in_path) < 0) return 2; + } else if (has_suffix(in_path, ".bin")) { + if (load_addr == 0xFFFFFFFFu) load_addr = DEFAULT_LOAD; + if (load_bin(in_path, load_addr) < 0) return 2; + } else { + fprintf(stderr, "mkexe: input must end with .ihx, .hex, or .bin\n"); + return 1; + } + + segment_t *home = &segments[HOME_SEG]; + if (!home->any) { + fprintf(stderr, "mkexe: input has no HOME (segment 0) bytes\n"); + return 2; + } + + if (load_addr == 0xFFFFFFFFu) load_addr = home->lo; + if (start_addr == 0xFFFFFFFFu) start_addr = load_addr; + + if (load_addr > 0xFFFFu) { fprintf(stderr, "mkexe: load address 0x%X > 0xFFFF\n", load_addr); return 1; } + if (start_addr > 0xFFFFu) { fprintf(stderr, "mkexe: start address 0x%X > 0xFFFF\n", start_addr); return 1; } + if (stack_addr > 0xFFFFu) { fprintf(stderr, "mkexe: stack address 0x%X > 0xFFFF\n", stack_addr); return 1; } + if (pad_byte > 0xFFu) { fprintf(stderr, "mkexe: pad byte 0x%X > 0xFF\n", pad_byte); return 1; } + + if (home->lo < load_addr) { + fprintf(stderr, "mkexe: HOME has bytes at 0x%04X below requested load 0x%04X\n", + home->lo, load_addr); + return 2; + } + + uint32_t home_size = home->hi + 1 - load_addr; + if (load_addr + home_size > 0x10000u) { + fprintf(stderr, "mkexe: HOME extends past 0xFFFF (load=0x%04X, size=0x%X)\n", + load_addr, home_size); + return 2; + } + + /* Inventory banks. */ + int max_bank = 0; + for (int i = 1; i <= MAX_BANKS; i++) { + if (segments[i].any) { + if (segments[i].lo < bank_base) { + /* Bytes below the bank base inside a BANK segment almost + certainly mean the *previous* bank overflowed 16 KB and + bled into this 64 KB virtual slot. Tell the user clearly. */ + int prev = i - 1; + if (prev >= 1) { + fprintf(stderr, + "mkexe: BANK%d appears to overflow its 16 KB limit:\n" + " data lands at virtual 0x%X%04X (low16 < 0x%04X)\n" + " Move some code from BANK%d's .c files into a new bank.\n", + prev, i, segments[i].lo, bank_base, prev); + } else { + fprintf(stderr, + "mkexe: bank %d has bytes at 0x%04X, below the bank base 0x%04X\n", + i, segments[i].lo, bank_base); + } + return 2; + } + if (segments[i].hi >= bank_base + BANK_SIZE) { + fprintf(stderr, + "mkexe: BANK%d overflows its 16 KB limit:\n" + " last byte at 0x%04X (limit 0x%04X)\n", + i, segments[i].hi, bank_base + BANK_SIZE - 1); + return 2; + } + if (i > max_bank) max_bank = i; + } + } + + /* HOME must not extend past 0xBFFF (W3 = bank territory in HUGE, + free in BIG but still off-limits to HOME). */ + if (home->hi >= 0xC000u) { + fprintf(stderr, + "mkexe: HOME image extends to 0x%04X, past window 2 end (0xBFFF).\n" + " Code grew too big for HOME — move some .c files into a bank.\n", + home->hi); + return 2; + } + /* In BIG mode HOME starts at 0x8100 (W2). Reject if it accidentally + overlaps the bank window in W1 (0x4000..0x7FFF) — that means the + user passed a bad --code-loc and the image would clobber banks. */ + if (bank_base == BIG_BANK_BASE && home->lo < 0x8000u) { + fprintf(stderr, + "mkexe: HOME image starts at 0x%04X in BIG mode, but banks own\n" + " 0x4000..0x7FFF — HOME must live in W2 (0x8000..0xBFFF).\n" + " Check --code-loc / -L.\n", + home->lo); + return 2; + } + + /* Banks must be densely numbered from 1 so the loader index matches. */ + for (int i = 1; i <= max_bank; i++) { + if (!segments[i].any) { + fprintf(stderr, "mkexe: bank %d is empty but bank %d exists — banks must be consecutive from 1\n", + i, max_bank); + return 2; + } + } + + uint32_t loader_size = (max_bank > 0) ? home_size : 0u; + + /* --- Write the EXE. --- */ + uint8_t header[EXE_HEADER_SIZE]; + memset(header, 0, sizeof(header)); + header[0x00] = 'E'; + header[0x01] = 'X'; + header[0x02] = 'E'; + header[0x03] = 0x00; + header[0x04] = 0x00; + header[0x05] = 0x02; + header[0x06] = 0x00; + header[0x07] = 0x00; + put16_le(header + 0x08, (uint16_t)loader_size); + put16_le(header + 0x10, (uint16_t)load_addr); + put16_le(header + 0x12, (uint16_t)start_addr); + put16_le(header + 0x14, (uint16_t)stack_addr); + + FILE *out = fopen(out_path, "wb"); + if (!out) { + fprintf(stderr, "mkexe: cannot open '%s' for writing: %s\n", out_path, strerror(errno)); + return 2; + } + if (fwrite(header, 1, EXE_HEADER_SIZE, out) != EXE_HEADER_SIZE) { + fprintf(stderr, "mkexe: short write on header\n"); fclose(out); return 2; + } + + /* HOME image */ + for (uint32_t a = load_addr; a < load_addr + home_size; a++) { + uint8_t b = home->present[a] ? home->bytes[a] : (uint8_t)pad_byte; + if (fwrite(&b, 1, 1, out) != 1) { + fprintf(stderr, "mkexe: short write on HOME at 0x%04X\n", a); + fclose(out); return 2; + } + } + + /* Banks — full 16 KB each, padding empty cells. */ + for (int i = 1; i <= max_bank; i++) { + segment_t *bnk = &segments[i]; + for (uint32_t a = bank_base; a < bank_base + BANK_SIZE; a++) { + uint8_t b = bnk->present[a] ? bnk->bytes[a] : (uint8_t)pad_byte; + if (fwrite(&b, 1, 1, out) != 1) { + fprintf(stderr, "mkexe: short write on bank %d at 0x%04X\n", i, a); + fclose(out); return 2; + } + } + } + + fclose(out); + + if (verbose) { + fprintf(stderr, + "mkexe: wrote %s\n" + " load=0x%04X start=0x%04X stack=0x%04X loader=0x%04X\n" + " HOME 0x%04X..0x%04X (%u bytes)\n", + out_path, load_addr, start_addr, stack_addr, loader_size, + home->lo, home->hi, home_size); + for (int i = 1; i <= max_bank; i++) { + fprintf(stderr, " BANK%-2d 0x%04X..0x%04X (%u live bytes, padded to 16 KB)\n", + i, segments[i].lo, segments[i].hi, + segments[i].hi + 1 - segments[i].lo); + } + uint32_t total = EXE_HEADER_SIZE + home_size + (uint32_t)max_bank * BANK_SIZE; + fprintf(stderr, " total .exe = %u bytes\n", total); + } + return 0; +} diff --git a/toolchain/mkexe/run-tests.sh b/toolchain/mkexe/run-tests.sh new file mode 100755 index 0000000..4e94793 --- /dev/null +++ b/toolchain/mkexe/run-tests.sh @@ -0,0 +1,125 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")" + +MKEXE=./mkexe +TESTS=tests +fail=0 +total=0 + +assert_hex_eq() { + local file=$1 offset=$2 expected=$3 label=$4 + local actual + actual=$(xxd -s "$offset" -l $((${#expected} / 2)) -p "$file") + if [ "$actual" != "$expected" ]; then + echo "FAIL: $label" + echo " file: $file" + echo " offset: $offset" + echo " expected: $expected" + echo " actual: $actual" + fail=$((fail + 1)) + fi +} + +run_case() { + local name=$1; shift + total=$((total + 1)) + if "$@" >/dev/null 2>&1; then + : + else + echo "FAIL: $name (exit nonzero)" + fail=$((fail + 1)) + return + fi +} + +expect_failure() { + local name=$1; shift + total=$((total + 1)) + if "$@" >/dev/null 2>&1; then + echo "FAIL: $name (expected nonzero exit, got success)" + fail=$((fail + 1)) + fi +} + +# Case 1: minimal .ihx with one byte RET at 0x4100 +run_case "build-single-byte" \ + $MKEXE -L 0x4100 -E 0x4100 -S 0xBFFE -o $TESTS/case1.exe $TESTS/hello.ihx + +assert_hex_eq $TESTS/case1.exe 0 "455845" "case1: signature EXE" +assert_hex_eq $TESTS/case1.exe 3 "00" "case1: version 0" +assert_hex_eq $TESTS/case1.exe 4 "00020000" "case1: offset 0x00000200" +assert_hex_eq $TESTS/case1.exe 8 "0000" "case1: loader=0" +assert_hex_eq $TESTS/case1.exe 0x10 "0041" "case1: load=0x4100" +assert_hex_eq $TESTS/case1.exe 0x12 "0041" "case1: start=0x4100" +assert_hex_eq $TESTS/case1.exe 0x14 "febf" "case1: stack=0xBFFE" +assert_hex_eq $TESTS/case1.exe 0x200 "c9" "case1: image byte = RET (C9)" + +# File size = 512 + 1 +size=$(stat -f "%z" $TESTS/case1.exe 2>/dev/null || stat -c "%s" $TESTS/case1.exe) +if [ "$size" != "513" ]; then + echo "FAIL: case1: file size $size != 513" + fail=$((fail + 1)) +fi +total=$((total + 1)) + +# Case 2: defaults — load and start auto-derived from .ihx, stack default = 0xBFFE +run_case "defaults-from-ihx" \ + $MKEXE -o $TESTS/case2.exe $TESTS/hello.ihx +assert_hex_eq $TESTS/case2.exe 0x10 "0041" "case2: load defaults to 0x4100 (from ihx)" +assert_hex_eq $TESTS/case2.exe 0x12 "0041" "case2: start defaults to load" +assert_hex_eq $TESTS/case2.exe 0x14 "febf" "case2: stack defaults to 0xBFFE" + +# Case 3: .bin input +printf '\xC9' > $TESTS/one.bin +run_case "build-from-bin" \ + $MKEXE -L 0x4100 -o $TESTS/case3.exe $TESTS/one.bin +assert_hex_eq $TESTS/case3.exe 0x10 "0041" "case3: bin load=0x4100" +assert_hex_eq $TESTS/case3.exe 0x200 "c9" "case3: bin image" + +# Case 4: image extending past 0xFFFF must fail +printf '\xFF%.0s' {1..4096} > $TESTS/big.bin +expect_failure "reject-past-FFFF" \ + $MKEXE -L 0xF800 -o $TESTS/case4.exe $TESTS/big.bin + +# Case 5: load above 0xFFFF must fail +expect_failure "reject-load-out-of-range" \ + $MKEXE -L 0x10000 -o $TESTS/case5.exe $TESTS/one.bin + +# Case 6: bad checksum in .ihx must fail +cat > $TESTS/bad.ihx <<'EOF' +:01410000C900 +:00000001FF +EOF +expect_failure "reject-bad-checksum" \ + $MKEXE -o $TESTS/case6.exe $TESTS/bad.ihx + +# Case 7: multi-bank IHX → loader auto-set to HOME size, bank 1 appended (16 KB) +# ELA "0001" puts the next records into bank 1 (virtual 0x1C000+). +# Note: Intel HEX address fields are big-endian inside the record +# :01 C000 00 77 C8 means addr=0xC000 (record bytes "C000" = high then low) +cat > $TESTS/banked.ihx <<'EOF' +:01410000C9F5 +:020000040001F9 +:01C0000077C8 +:00000001FF +EOF +run_case "banked-auto-loader" \ + $MKEXE -L 0x4100 -o $TESTS/case7.exe $TESTS/banked.ihx +assert_hex_eq $TESTS/case7.exe 8 "0100" "case7: loader=HOME size (1 byte)" +size=$(stat -f "%z" $TESTS/case7.exe 2>/dev/null || stat -c "%s" $TESTS/case7.exe) +if [ "$size" != "16897" ]; then + echo "FAIL: case7: file size $size != 16897 (512 hdr + 1 HOME + 16384 bank1)" + fail=$((fail + 1)) +fi +# Byte at file offset 0x201 (first byte of bank1) should be the 0x77 we put at bank1's 0xC000 +assert_hex_eq $TESTS/case7.exe 0x201 "77" "case7: bank1 first byte" + +total=$((total + 9)) +if [ "$fail" -gt 0 ]; then + echo + echo "FAILED: $fail of $total assertions/cases" + exit 1 +fi +echo "OK: $total cases passed" diff --git a/toolchain/mkexe/tests/bad.ihx b/toolchain/mkexe/tests/bad.ihx new file mode 100644 index 0000000..c49ad0b --- /dev/null +++ b/toolchain/mkexe/tests/bad.ihx @@ -0,0 +1,2 @@ +:01410000C900 +:00000001FF diff --git a/toolchain/mkexe/tests/banked.ihx b/toolchain/mkexe/tests/banked.ihx new file mode 100644 index 0000000..fd12984 --- /dev/null +++ b/toolchain/mkexe/tests/banked.ihx @@ -0,0 +1,4 @@ +:01410000C9F5 +:020000040001F9 +:01C0000077C8 +:00000001FF diff --git a/toolchain/mkexe/tests/big.bin b/toolchain/mkexe/tests/big.bin new file mode 100644 index 0000000..7de9e36 --- /dev/null +++ b/toolchain/mkexe/tests/big.bin @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toolchain/mkexe/tests/hello.ihx b/toolchain/mkexe/tests/hello.ihx new file mode 100644 index 0000000..f39e82f --- /dev/null +++ b/toolchain/mkexe/tests/hello.ihx @@ -0,0 +1,2 @@ +:01410000C9F5 +:00000001FF diff --git a/toolchain/mkexe/tests/one.bin b/toolchain/mkexe/tests/one.bin new file mode 100644 index 0000000..f7cb26f --- /dev/null +++ b/toolchain/mkexe/tests/one.bin @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toolchain/sprinter-cc b/toolchain/sprinter-cc new file mode 100755 index 0000000..d3a8ce4 --- /dev/null +++ b/toolchain/sprinter-cc @@ -0,0 +1,166 @@ +#!/usr/bin/env bash +# +# sprinter-cc — wrapper around SDCC for building Sprinter .EXE files. +# +# Usage: +# sprinter-cc -o foo.exe foo.c [more.c ...] [options] +# +# Options: +# -o NAME output executable name (required) +# --crt0=TYPE crt0 variant: default | minimal | banked (default: default) +# -I PATH additional include path (repeatable) +# -L 0xADDR code load address (default: 0x4100) +# -E 0xADDR entry address (default: same as -L) +# -S 0xADDR stack address (default: 0xBFFE) +# --code-loc 0xN forwarded to SDCC --code-loc (default: 0x4100) +# --data-loc 0xN forwarded to SDCC --data-loc (default: 0x8000) +# -Wl FLAG extra linker flag (repeatable) +# --bank N=FILE.c compile FILE.c as bank N; repeatable; pulls crt0_banked +# automatically and adds -Wl-b_BANKN=0x{N}C000 +# --mkexe FLAG extra mkexe flag (repeatable; e.g. --mkexe -p --mkexe 0) +# -v verbose (echo every command) +# -h, --help show this help +# +# Example: +# sprinter-cc -o hello.exe hello.c +# sprinter-cc -o app.exe main.c --bank 1=engine.c +# sprinter-cc -o tiny.exe tiny.c --crt0=minimal + +set -eo pipefail + +# ------- Locate the toolchain ------------------------------------------------ +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +PROJ_ROOT="$( cd "$SCRIPT_DIR/.." && pwd )" + +SDCC_BIN="$PROJ_ROOT/third_party/sdcc/bin" +SDCC="$SDCC_BIN/sdcc" +SDASZ80="$SDCC_BIN/sdasz80" +MKEXE="$PROJ_ROOT/toolchain/mkexe/mkexe" +CHECK_BANKS="$PROJ_ROOT/toolchain/check_banks.py" + +RUNTIME="$PROJ_ROOT/runtime" +LIB_DIR="$PROJ_ROOT/lib" +INC_DIR="$PROJ_ROOT/libc/include" + +# ------- Defaults ------------------------------------------------------------ +OUT="" +CRT0_TYPE="default" +CODE_LOC="0x8100" # TINY mode default — everything in W2 (single page) +DATA_LOC="0" # 0 = let linker auto-place after code areas +LOAD_ADDR="" +ENTRY_ADDR="" +STACK_ADDR="0xBFFE" +VERBOSE=0 +USER_INCS=() +SOURCES=() +LD_EXTRA=() +MKEXE_EXTRA=() +BANK_SPECS=() # entries like "1=engine.c" + +# ------- Parse args ---------------------------------------------------------- +usage() { + sed -n '3,28p' "$0" | sed 's/^# \{0,1\}//' + exit "${1:-0}" +} + +while [[ $# -gt 0 ]]; do + case "$1" in + -o) OUT="$2"; shift 2;; + --crt0=*) CRT0_TYPE="${1#*=}"; shift;; + -I) USER_INCS+=("-I" "$2"); shift 2;; + -L) LOAD_ADDR="$2"; shift 2;; + -E) ENTRY_ADDR="$2"; shift 2;; + -S) STACK_ADDR="$2"; shift 2;; + --code-loc) CODE_LOC="$2"; shift 2;; + --data-loc) DATA_LOC="$2"; shift 2;; + -Wl) LD_EXTRA+=("$2"); shift 2;; + --bank) BANK_SPECS+=("$2"); shift 2;; + --mkexe) MKEXE_EXTRA+=("$2"); shift 2;; + -v) VERBOSE=1; shift;; + -h|--help) usage 0;; + -*) echo "sprinter-cc: unknown option: $1" >&2; usage 1;; + *) SOURCES+=("$1"); shift;; + esac +done + +[[ -z "$OUT" ]] && { echo "sprinter-cc: -o NAME is required" >&2; exit 1; } +[[ ${#SOURCES[@]} -eq 0 ]] && { echo "sprinter-cc: no input files" >&2; exit 1; } + +LOAD_ADDR="${LOAD_ADDR:-$CODE_LOC}" +ENTRY_ADDR="${ENTRY_ADDR:-$LOAD_ADDR}" + +# Pick crt0 source. +case "$CRT0_TYPE" in + default) CRT0_SRC="$RUNTIME/crt0.s"; ;; + minimal) CRT0_SRC="$RUNTIME/crt0_minimal.s";; + banked) CRT0_SRC="$RUNTIME/crt0_banked.s"; ;; + *) echo "sprinter-cc: bad --crt0 type: $CRT0_TYPE" >&2; exit 1;; +esac + +# Banked builds always need crt0_banked, regardless of what the user asked. +if [[ ${#BANK_SPECS[@]} -gt 0 ]] && [[ "$CRT0_TYPE" != "banked" ]]; then + [[ $VERBOSE -eq 1 ]] && echo " --bank present → switching to crt0_banked" + CRT0_SRC="$RUNTIME/crt0_banked.s" +fi + +# ------- Build in a per-output workdir --------------------------------------- +WORK="$(dirname "$OUT")/.sprinter-cc-$(basename "$OUT" .exe)" +mkdir -p "$WORK" + +run() { + [[ $VERBOSE -eq 1 ]] && echo " $*" + "$@" +} + +# 1. crt0 +CRT0_REL="$WORK/$(basename "$CRT0_SRC" .s).rel" +run "$SDASZ80" -o "$CRT0_REL" "$CRT0_SRC" + +# 2. user sources → .rel (HOME) +USER_RELS=() +CC_FLAGS=(-mz80 --no-std-crt0 --std-c99 --opt-code-size -I "$INC_DIR" "${USER_INCS[@]}") +for src in "${SOURCES[@]}"; do + rel="$WORK/$(basename "$src" .c).rel" + run "$SDCC" "${CC_FLAGS[@]}" -c -o "$rel" "$src" + USER_RELS+=("$rel") +done + +# 3. bank sources +BANK_RELS=() +BANK_LD_FLAGS=() +for spec in "${BANK_SPECS[@]}"; do + bank_n="${spec%%=*}" + bank_src="${spec#*=}" + rel="$WORK/bank${bank_n}_$(basename "$bank_src" .c).rel" + run "$SDCC" "${CC_FLAGS[@]}" \ + --codeseg "BANK${bank_n}" --constseg "BANK${bank_n}" --dataseg "BANK${bank_n}" \ + -c -o "$rel" "$bank_src" + BANK_RELS+=("$rel") + # virtual address: bank_n in upper byte, 0xC000 low + addr=$(printf "0x%X" $(( (bank_n << 16) | 0xC000 ))) + BANK_LD_FLAGS+=("-Wl-b_BANK${bank_n}=${addr}") +done + +# 4. link → .ihx +IHX="$WORK/$(basename "$OUT" .exe).ihx" +LINK_FLAGS=(-mz80 --no-std-crt0 --std-c99 --opt-code-size + --code-loc "$CODE_LOC" --data-loc "$DATA_LOC") +LINK_FLAGS+=("${BANK_LD_FLAGS[@]}") +for f in "${LD_EXTRA[@]}"; do LINK_FLAGS+=("$f"); done +# libsprinter.lib via -l/-L (sdcc passes -lsprinter through to sdldz80) +run "$SDCC" "${LINK_FLAGS[@]}" -o "$IHX" \ + "$CRT0_REL" "${USER_RELS[@]}" "${BANK_RELS[@]}" \ + "-L$LIB_DIR" "-lsprinter" + +# Quick bank-size check (only meaningful if there are banks). +if [[ ${#BANK_SPECS[@]} -gt 0 ]] && [[ -f "${IHX%.ihx}.map" ]]; then + python3 "$CHECK_BANKS" "${IHX%.ihx}.map" || true +fi + +# 5. mkexe → .exe +MK_FLAGS=(-L "$LOAD_ADDR" -E "$ENTRY_ADDR" -S "$STACK_ADDR" -o "$OUT" "$IHX") +[[ $VERBOSE -eq 1 ]] && MK_FLAGS=(-v "${MK_FLAGS[@]}") +for f in "${MKEXE_EXTRA[@]}"; do MK_FLAGS=("$f" "${MK_FLAGS[@]}"); done +run "$MKEXE" "${MK_FLAGS[@]}" + +echo "sprinter-cc: wrote $OUT"

Ii%03Flj_yY3_FS3%qU^gxT<=TTj!c#SSA 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