Inferno
#04
22 июня 2003 |
|
Sofтинка - Функции операционной системы ZXVGS.
Функции ZXVGS Все функции ZXVGS вызываются через RST #08 с номером функции в следующем байте (hook code). Программа продолжается с адреса, лежащего за hook code. RST #08 DEFB function В нижеследующих таблицах колонки, обозна- ченные "вход" описывают регистры, содержа- щие аргументы функции. Колонки, обозначен- ные "выход" - регистры, в которых функция возвращает результат, причём остальные ре- гистры не меняются. Содержимое AF на входе игнорируется, состояние F на выходе не оп- ределено. В некоторых случаях функция мо- жет установить 7-й бит регистра R, это бу- дет означать, что одно или более экранное прерывание было пропущено. Значение байта после RST 8. #00-#1a - ошибки интерпретатора Бейсика #1b-#31 - Interface 1 hook codes #32-#47 - коды команд DISCiPLE #78-#7e - для внутреннего использования в RSX'ах #7f - внутренний вызов ПЗУ #80-#83 - джойстики #84-#85 - мышь #87-#88 - скорость #89-#8f - клавиатура #90-#9f - управление экраном - пока не используется #a0-#a1 - информация #a2-#a3 - настройка (config) #a4-#a5 - звук #a6-#a7 - экран #ac-#af - RSX'ы #b0-#bf - банки памяти #c0-#c1 - текущий путь (current path) #c2-#c3 - директории #c4-#c7 - информация о диске #c8-#cf - работа с файлами #d0-#db - прямой доступ к файлам #e0-#e7 - операции с файлами, имеющими заголовки (headers) #e8-#e9 - изображения #ea-#eb - отгрузки игр #ec-#ed - работа с кусками файлов (raw data) #ee-#ef - выбор файлов #f0-#f7 - принтер #f8-#fb - оверлеи #fc-#fe - системные вызовы #ff - OK Примечания: * Interface 1 hook codes обрабатываются через MDR.RZX и BI1.RZX. * Команды DISCiPLE обрабатываются через MGT.RZX и BD1.RZX. Внутренний вызов ПЗУ Код #7F зарезервирован для внутренних нужд системы. Используется для вызова ПЗУ ZX из системы. Джойстики Примечание. Вызовы функций #80..#83 могут быть прерваны пользователем. Во избежание выхода из программы без сохранения резуль- татов, используйте функцию #A3 (будет дос- тупна в следующих версиях). Возможно использование 4 независимых джой- стиков. Обычно используются первые два. Смысл битов 0..4 совместим со значени- ем из порта Кемпстон-джойстика (#1F, b0=right,b1=left, b2=down,b3=up, b4=fire). Bit 5 - второй fire (обычно не использует- ся). Биты 6 и 7,общие для всех джойстиков, символизируют ещё две кнопки. Bit 6 (HALT) может вызвать паузу в игре (когда установ- лен) или активировать опции. Bit 7 (EXIT) может прервать игру или вызвать переход в главное меню. Спецификация вызовов: № название описание вход выход #80 J0 read joystick 0 - A=состояние #81 J1 read joystick 1 - A=состояние #82 J2 read joystick 2 - A=состояние #83 J3 read joystick 3 - A=состояние Использование мыши Вы можете использовать внешнюю мышь (обс- луживаемую вне главной программы), а также вызывающую прерывания. Задачи вычисления абсолютных координат,рисования указателя и отслеживания событий лежат на вашей прог- рамме.Для использования мыши в любой прог- рамме руководствуйтесь следующими требова- ниями: 1. Запретите прерывания! Включите IM 2. 2. Установите значение регистра I (же- лательно #80..#FE). Он не должен указывать в ПЗУ! 3. Заполните таблицу прерываний (257 байт с адреса I*256) одинаковыми байтами. Осторожно! Некоторые типы мышей (AMX) ге- нерируют векторы IM 2! 4. По адресу, указываемому таблицей пре- рываний, разместите: NOP NOP NOP JP ownint "ownint" - адрес процедуры обслуживания прерываний.Если вам не нужен свой обработ- чик, можете поместить EI:RETI вместо этого перехода. 5. Зарезервируйте 128B буфер для проце- дур обслуживания мыши. Поместите адрес этого буфера в HL (#5B00..#FF80). Вы не должны будете портить эту область после установки мыши. 6. Зарезервируйте байт для хранения го- ризонтального смещения.Поместите его адрес в BC. 7. Зарезервируйте байт для хранения вер- тикального смещения. Поместите его адрес в DE. 8. Вызовите функцию #84. Она заполнит буфер и область под NOP'ами. И в случае необходимости сменит таблицу прерываний. 9. Разрешите прерывания! Для старых программ рекомендуется помес- тить XOR A: RET в начало буфера во избежа- ние сбоя программы при вызове до инициали- зации мыши. Координаты будут меняться по заданным ад- ресам. Все они 8-битные. Вы можете только считывать их и сравнивать с эталонами для опреденения изменений. Для проверки кнопок просто вызывайте процедуру из начала буфе- ра. Она вернёт состояние кнопок в A,сохра- нив значения остальных регистров (b0=левая кнопка, b1=правая; установленный бит ука- зывает на нажатие). Обратите внимание,что некоторые типы мышей (RS232, AMX) могут генерировать собствен- ные прерывания, бесполезные для нашей про- граммы. Все некадровые прерывания "съедаю- тся" (адрес возврата снимается со стека).И если адрес возврата ссылается на байт пос- ле команды HALT, он будет декрементирован для продолжения HALT до кадрового прерыва- ния. Мышь может быть деактивирована указанием 0 в качестве адреса буфера (в HL). Данные, возвращаемые в этом случае,полезны для RSX - они помогают отключить драйвер,использу- емый главной программой, подключить свой драйвер для обработки запроса, после чего отключить свой драйвер и возвратить драй- вер главной программы. Спецификация вызовов: № название описание вход выход #84 MSEINI установить I=page A=result мышь BC=^xcoord DE=^ycoord HL=^buf опросить HL=??? A=result мышь BC=^xcoord DE=^ycoord HL=^buf отключить HL=0 A=result мышь BC=^xcoord DE=^ycoord HL=^buf #85 MSEGET read state - A=keys (для внутр. B=dy использования) C=dx Скорость Функция #87 переключает процессор в быст- рый режим.Скорость не оговаривается - про- сто считается,что программа работает быст- рее. Функция #88 возвращает процессор в станда- ртый режим 3.5MHz. Спецификация вызовов: № название описание вход выход #87 FAST (Scorpion) - A=result ускоряет работу процессора #88 SLOW (Scorpion) - A=result возвращает 3.5MHz Клавиатура Расширенная клавиатура может использовать- ся для ввода текста в ряде программ. Позволяет использовать несколько дополни- тельных клавиш (на эмуляторах, SAM Coupe, ZX128 keypad). Будет использована в Бейсике, если появя- тся патчи или способы перехвата INT. Вызов функции #8F??? должен быть помещён в обработчик IM 2, как минимум с сохранением AF. Или может вызываться с запрещёнными прерываниями примерно 50 раз в секунду. Пока не применяйте!!! Не доделано!!! Спецификация вызовов: № название описание вход выход #8C? KBDGET get char () (A) from buffer #8D? KBDTST read char () (A) from buffer &leave it #8E? KBDMOD выбор режима (BC) (A=result) #8F? KBDINT sync. () (A) interrupt Управление экраном Функции #90..#9F разработаны для отображе- ния меню, перемещения указателя мыши и вы- вода текста в 42, 51 или 64 столбца. В том числе, в дополнительных экранных ре- жимах. В текущей версии ZXVGS не реализовано! Спецификация вызовов: № название описание вход выход #9F? CHOICE ask user HL=^title A=result what to do BC=^options Спецификация вызовов config & system info: № название описание вход выход #A0? неизвестно #A1? неизвестно Настройка функций Команды #A2 и #A3 управляют машиннозависи- мыми функциями. Параметры: Опция D E смысл Тип #80-83 0 не менять джойстика 1 Sinclair 1 2 Sinclair 2 3 Kempston 4 Fuller 5 стрелки SAM Coupe + <CNTRL> 6 функциональные кнопки SAM Coupe 7 (не определено) 8 TC2068 left (AY #F5, #F6) 9 TC2068 right (AY #F5, F6) Тип мыши. #84 0 Kempston Mouse Изменение 1 server mouse невозможно, 2 SAM Mouse когда драйвер 3 J3 mouse активен. 4 AMX Mouse 5 AY mouse (Украинская) 6 (не определено) 7 (не определено) 8 M$ Mouse в YAMOD.8250/0 9 M$ Mouse в YAMOD.8250/1 10 M$ Mouse в YAMOD.8250/2 11 M$ Mouse в YAMOD.8250/3 Наличие #A4 маска (1=отсутствие) звуковых устройств. Тип принтера #F7 (не определено) Спецификация вызовов: № название описание вход выход #A2? GETCFG взять D=функция A=ошибка установку E=режим функции #A3? SETCFG установить D=функция A=ошибка параметр E=mode0 функции E=mode1 Настройка звука Функция #A4 предоставляет сведения о дос- тупных звуковых устройствах. Bit 0 соотве- тствует биперу на порту #FE, bit 1 - про- цедуре BEEPER в ПЗУ Бейсика.Сброшенный бит означает - не генерируйте звук этим спосо- бом (пользователь не хочет слышать такой звук).Установленный bit 2 означает наличие AY-3-8910/2 по портам #BFFD и #FFFD (а та- кже #BEFD и #FEFD для неверно написанных плейеров),bit 3 - чип SAA 1099 (SAM Coupe) по портам #00FF и #01FF. Если один из двух последних битов сброшен, вы не должны ис- пользовать эти порты! Это может привести к сбою! Если эта функция вызвана без предваритель- ного вызова функции #A5 (после #AF), она определяет все доступные звуковые устройс- тва (совместимость сверху вниз,будет убра- но). Функция #A5 используется для автоопределе- ния звукового устройства. Номер устройства должен быть в D, а некоторые параметры - в E. (Звёздочка "*" означает, что устройство имеет фиксированные адреса портов.) Параметеры функции #A5 D устройство E #01* AY-3-891X (ZX128) каналы (в форме регистра 7) #02* AY-3-8912 (TC2068) каналы (в форме регистра 7) #03* оба (1 и 2) каналы (в форме регистра 7) #04* SAA1099 (SAM) каналы (в форме регистров 14&15 ;b6,b7 - выбор) #08 8255 ЦАП (MB-02) каналы b0..b3 Спецификация вызовов: № название описание вход выход #A4 SOUND сведения - A=flags #A5? OPENSOUND найти D=номер A=различие устройство E=каналы E=каналы Настройка экрана #A6? VIDEO () (A,D=ula,E=mode,B,C) возвращает тип ULA в D (свойства экрана) Параметры - в регистре D Страна D компьютер графика Англия #00 Sinclair ZX ULA 6C001E-7 Spectrum (+) #01 Sinclair AMSTRAD 40056 ZX+ 128 #02 Amstrad ZX +2 ULA 7K010E5 #03 Amstrad ZX GATE ARRAY +2A/+2B/+3 40077 #0C MGT SAM Coupe ASIC Порту- #20 Timex TS 2068 - 60Hz галия Sinclair 2068 #21 Timex TS 2068 - Computer 2068 50Hz, grey #22 Timex TS 2068 - Computer 2048 50Hz, black Польша #80 ELWRO 800 ? Junior #?? Solum ? Россия #C0 Pentagon ? #C1 Scorpion ZS ? др. #F0 Warajevo emulator #FF неизвестно B,C - параметры времени кадровой синхрони- зации в тактах Z80 (быстрое ОЗУ) #A7 OPENVIDEO Вход (BC=timing,DE=mode,HL=buffer) Выход (BC=timing,DE=mode,H=tacts,L=len) Функции #E8, #E9, #F3 используют значение экранного режима (screenmode). LINT: +#80 Интерфейс LINT генерирует прерывание перед тем,как отобразится строка,указанная в по- рту #F9. Прерывание может быть распознано чением порта #F9. Присутствие должно опре- деляться функцией #A???. (На данный момент такая возможность поддерживается только на SAM Coupe.) основные режимы неосновные режимы E описание E описание #00 стандартный #08 стандартные экран с #4000 экраны с #4000 и #C000 #01 стандартный #09 стандартные экран с #6000 экраны с #4000 и #6000 #02 high colour #0A high colour экран с #4000 экраны с #4000 и #C000 #03 hires #0B hires экран с #4000 экраны с #4000 и #C000 #04 стандартный #0C стандартные экран с #C000 экраны с #4000, #6000,#C000,#E000 #05 стандартный #0D стандартные экран с #E000 экраны с #C000 и #E000 #06 high colour #0E high colour экран с #C000 экран с #4000 и #C000 - 1:3 #07 high colour #0F high colour экран с #C000 экран с #4000 и #C000 - 1:2 При HL>#4000 по адресу HL помещается рело- цируемый код для выбора одного из основных экранных режимов. В этом случае L содержит длину этого кода,а H - требуемое ему число тактов.Вызовами с H=0 режим выбирается не- посредственно. Спецификация вызовов: № название описание вход выход #A6? VIDEO информация ? A о экране D=ula E=mode B C #A7 OPENVIDEO включить BC=timing BC=timing экранный DE=mode DE=mode режим HL=buffer H=tacts L=len Управление Резидентными Расширениями Системы Resident System Extentions (RSX) Функция #AC используется для загрузки RSX в память системы без активации. В случае отсутствия ошибок (A=0),хэндл (handle) вы- бранной RSX возвращается в D. Функция #AD? вызывает внутренние функции имеющегося в наличии RSX. Функция #AE предназначена для контроля всех загруженных RSX.При E=0 помещает в HL имя файла,который вызвал загрузку програм- мы или ошибку,если программа была запущена непосредственно, без привязки к файлу. BC должен содержать размер буфера,как минимум #0080. Функция #AF загружает RSX, соответствующий расширению файла, вслед за чем RSX за- гружает требуемый файл. Например, для файла "GAME.Z80" RSX грузится из файла "ZX:Z80.RZX". Это не происходит в случае расширений "V00" (родная программа ZXVGS) и "RZX" (грузит RSX непосредственно, а не "RZX.RZX"). Функция #AF загружает: * для файлов "*.V00" - требуемую прог- рамму (потом файл "*.SV@", если он есть), * для "*.RZX" - требуемый RSX, * для остальных - "ZX:ext.RZX" (если на- йдено;"ext" - расширение файла), а имя фа- йла будет доступно через функцию #AE при E=0; Спецификация вызовов: № название описание вход выход #AC RSXINIT взять RSX DE=^rsxname D=handle A=ошибка #AD? RSXCTRL вызвать D=handle ? функцию RSX E=функция A=ошибка #AE RSXINFO информация E=what ? о RSX HL A=ошибка BC #AF RSXLOAD загрузить DE=^filename файл RSX'ом A=ошибка Банки памяти Этими функциями вы можете управлять до 4MB памяти. (Что даёт в итоге 4128kB в режиме 16kB или 8208kB в режиме 32kB.) Введение Имеется 16kB переключаемого ОЗУ в верхней (section D) области памяти (#C000..#FFFF). Есть возможность использовать виртуальные банки памяти, содержимое которых будет пе- ремещаться программно. Банки #00..#07 при- вилегированы и могут переключаться быст- рее, отдельными функциями #B0..#B7 без ар- гументов. Банк должен быть открыт перед операциями с ним. Если при открытии не хватает памяти (ОЗУ в случае невиртуальных банков или внешней памяти в случае виртуальных),гене- рируется фатальная ошибка. Предварительно проверяйте свободное место! Открытый банк заполняется нулями. Функции не проверяют PC,SP и I, поэтому их исполь- зование в неправильном разрезе может при- вести к краху системы. Если по аппаратным причинам невозможно пе- реключать верхнюю четверть памяти,доступны только виртуальные банки (с долгим време- нем переключения). Если по аппаратным при- чинам переключаться могут только обе верх- ние четверти памяти одновременно (32kB, #8000..#FFFF), то переключение верхней че- тверти имитируется с или без перезаписи другой четверти (section C). В этом случае невозможно открыть банк, переключающийся быстро и не портящий эту section C. Она скопируется при открытии. Имеется три типа банков: 1. Индивидуальные - номера 0..15 - каж- дый может открываться в своём режиме. 2. Параметрические - номера с 16 до зна- чения, возвращаемого в A функцией #BF. Эта группа существует, только если функция #BF возвратит значение больше 15. Режим откры- тия определяется для первого открытого ба- нка в этой группе и будет таким же для ос- тальных. 3. Виртуальные - номера сверх значения, возвращённого функцией #BF. Эта группа су- ществует только если функция #BF возвраща- ет в A значение меньше 255. Режим открытия определяется для первого открытого банка в группе и будет тем же для остальных. Эти банки могут быть открыты только как вирту- альные. Для открытия первого виртуального банка как минимум один из реальных банков должен быть открыт как медленный (bit 0 в регистре D сброшен) - он сменит состояние на виртуальное и будет использован для хранения данных из виртуальной памяти (ба- нки, открытые особо,сохранят реальное сос- тояние). Функции Функции #B0..#B7 выбирают один из привиле- гированных банков.Функция #B8 выбирает лю- бой банк - его номер передаётся в регистре E. Функция #B9 предоставляет информацию о ба- нках. Функция #BA используется для получения ку- ска кода, переключающего банки. Более под- робно см.следующую секцию. Функция #BB копирует содержимое section C во всех открытых 32kB страницах или игно- рируется в случае 16kB-страничного режима. Функция #BC пытается открыть банк E в ре- жиме D и возвращает удавшийся режим в D. См. таблицу параметров. Функция #BD закрывает банк E. Если E явля- ется включенным в данный момент банком, то содержимое верхней четверти памяти стано- вится не определено (т.е. может содержать ПЗУ или #FF-ки) до выбора другого банка. Функция #BE закрывает все банки.Содержимое верхней четверти ОЗУ становится неопреде- лённым. Функция #BF возвращает в регистре E номер текущего банка, а в регистре D его режим. В регистре B возвращается количество отк- рытых банков.Регистр A содержит количество дополнительных банков (за исключением вир- туальных): * 0 - 48 kB (стандартный ZX48) * 1 - 64 kB (обычно один 32kB банк; поэ- тому называется ZX80kB) * 2 - 80 kB (два дополнительных банка - обычно по 16kB) * 5 - 128 kB (пять дополнительных банков - ZX128) * 6 - 144 kB (вид расширенного TC2048) * 27 - 480 kB (Pentagon 512kB с двумя зарезервированными страницами) Параметры: D вх.данные #BC вых.данные #BD/BF когда 1 когда 0 когда 1 0 должен щёлкать ┌─────────────────────┐ быстро? │ bit1=0 bit1=1 │ (не виртуально) │ 0 16Kvirt 32Kreal│ 1 область │bit0 +copy C │ #8000..#BFFF │ 1 32Kreal 16Kreal│ не меняется? └─────────────────────┘ 2 содержит экран? нету экрана есть экран 3 соответствует несовместим совместим банку ZX128? с OUT #7FFD с OUT #7FFD OUT(#7FFD),E+16 4 можно класть нет, можно, таблицу IM 2 пойдёт "снега" без "снега"? "снег" не будет 5 процессор будет да, будет нет, банк тормозить ULA? тормозить быстрый 6 поддерживает 8 нет, только да, 8 бит бит цвета (???) 1 бит цвета 7 откроется, даже откроется не откро- если не соблю- ется дать требований? Функция #BA - быстрое переключение банков Позволяет щёлкать банки намного быстрее. Следуйте этим указаниям: 1. Определите, будет ли ваша программа работать в 32kB страничном режиме. Если нет, используйте режим %XXXXXX11 (не будет работать на некоторых типах аппаратуры). В противном случае будет 32kB или 16kB. Следите за стеком и прерываниями. 2. Откройте банк функцией #BC. 3. Зарезервируйте 32B для программы пе- реключения страниц. Программа перемещаема. Для использования программы без её переме- щения, можете заполнить буфер нулями и по- местите его в свою программу.Или заполните 33 байта кодом "RET" (#C9) или "JP (HL)" (#E9), в зависимости от структуры вашей программы. 4. Зарезервируйте два байта в районе #5B00..#7FFE, поместите их адрес в BC при первом вызова функции #BA (потом BC будет игнорироваться). 5. Вызовите функцию #BA для помещения кода включения банка E по адресу HL. Функ- ция вернёт реальную длину кода в BC и чис- ло тактов в A. DE укажет на байт после ко- да, поэтому вы можете добавлять (с помощью LDIR) туда свой код. 6. Для выбора банка вызывайте этот код. Запомните! * Каждый банк имеет свою программу вклю- чения. * (!!!) Код можно переместить в любое место и в любое время. * Код НЕ ДОЛЖЕН использоваться после за- крытия банка! * Код, выданный функцией #BA, не длиннее 32 байт. * Он всегда портит AF, иногда BC и,кроме того, использует стек. * Для вызова любой функции ZXVGS вы ОБЯ- ЗАНЫ вызвать код,включающий страничку,сто- явшую до первого вызова этих кодов (после- дний банк, выбранный функциями #B0..#B8). * Код ОБЯЗАН находиться в банке, который он включет.Проблем не возникнет при разме- щении кода в адресах #4000..#7FFF. После размещения его в адресах #8000.. #BFFF вы можете вызвать функцию #BB для копирования его в остальные банки. Но если вы захотите использовать его с адресах #C000..#FFFF,вы должны сами скопировать его во включаемую страничку. * В некоторых случаях (например, на эму- ляторах) функция #BA возвращает #FF, что означает, что код содержит вызов функции #B8. Помните о стеке!!! Спецификация вызовов: № название описание вход выход #B0 BNK0 включить - A=? .. .. привилегиро- #B7 BNK7 ванный банк фатальная ошибка при неоткрытом #B8 BNKE включить - A=? любой банк фатальная ошибка при неоткрытом #B9 BNKCTRL сведения DE=infonum A о банке BC DE HL #BA BNKCODE получить E=number BC=длина программу HL=^buffer DE=^end переключения BC=^word A=tacts #BB BNKCOPY копировать - A=? section C во все банки #BC BNKOPEN открыть D=mode0 D=mode1 банку E=number A=xor #BD BNKCLOSE закрыть E=number A=? банку #BE BNKRESET закрыть - A=? все банки #BF BNKINFO сведения - B=opened о всех D=mode банках E=bank A=memory Текущая директория Спецификация вызовов: № название описание вход выход #C0 GETPATH Текущий путь DE=^buf A=ошибка (с диском) name=DE^ Начинается с имени диска и двоеточия #C1 SETPATH Сменить путь DE=^name A=ошибка Чтение содержимого директории Функция #C2 возвращает элемент каталога, выбранного функцией #C3. HL указывает на формат строки (определённый функцией #C3 используется либо при H=0, либо если HL указывает на нулевой байт; внутренняя сис- темная структура возвращается при H=1), DE указывает на буфер. В этот буфер возвраща- ется элемент каталога - ASCII текст, гото- вый к отображению. (Используйте HL=0 для заполнения селектора файлов(fileselector), потом HL=^'%f%n' для взятия имени файла, выбранного пользователем.) Функция #C3 выбирает каталог, считает эле- менты и копирует их во внутренний буфер. (Буфер должен быть освобождён (DE=0) после окончания чтения каталога.) HL указывает на строку формата (системный формат по умолчанию используется либо при H=0, либо если HL указывает на нулевой байт;внутрен- няя системная структура возвращается при H=1).Могут быть использованы следующие си- мволы форматирования: * %a атрибуты * %b число allocation units, занятых фа- йлом или строка "Dir" * %c комментарий файла * %d дата последнего изменения * %e расширение файла * %f путь к файлу (реальный) * %g имя группы файлов (GID) * %k номер первого allocation unit * %l длина в байтах или строка "Dir" * %m имя файла без расширения * %n имя файла с расширением * %p путь к файлу (the pointed by DE) * %s имя файла с расширением(?) * %t время последней модификации * %u имя пользователя файла (UID) * %x атрибуты U*IX Другие символы копируются без изменения. Десятичное число между % и буквой указыва- ет фиксированную ширину поля.Положительные значения - выравнивание по правому краю, отрицательные - по левому. Значение после точки указывает число отрезаемых символов в строке. Примеры: "%-16.16m %-3.3e %l" - NeOS 1.0 style (DEC) "%-8.8m<%1.1e>%3b%13l" - TR-DOS style (параметры start недоступны) "%x %-9g%-9u%8l %6d %5t %n" - U*IX style (ls -l) "%-9.8m%-4.3e%13l%9.8d%9t" - MS-DOS 6.20 style (default) Внутренняя системная структура состоит из следующих полей (не полностью определено): * +#00 - - 4B; * +#04 - - 4B; * +#08 - - 4B; * +#0C - - 4B; * +#10 - - 4B; * +#14 - - 4B; * +#18 - - 4B; * +#20 - имя файла в ASCIIZ без пути - до 32B; Свободное пространство на диске можно уз- нать через функции #C4 или #C5. Примечание: некоторые диски (большей час- тью сетевые, типа "TCP:", "HTTP:" или "FTP:") не показывают все возможные подка- талоги, а только те,которее были использо- ваны недавно (или есть в закладках). Спецификация вызовов: № название описание вход выход #C2 взять элемент BC=номер A=ошибка каталога HL=^buf1 HL^=entry (entry) DE=^format DE=? BC=? #C3 установить HL=^name A=ошибка маску DE=^format BC=число каталога BC=attr DE=? HL=? Сведения о диске Функции #C4 и #C6 возвращают информацию по указанному диску/пути или файлу. Функции #C5 и #C7 меняют информацию по указанному диску/пути или файлу, но только если это возможно. Параметры BC возвращает #C4 #C6 #0000 место на диске в Кб HL текст ASCIIZ #0001 глубина директории L текст ASCIIZ (1=корень) Спецификация вызовов: № название описание вход выход #C4 GETINFO получить DE=^name A=ошибка параметры BC=infonum BC в числовом HL DE виде HL #C5 SETINFO установить DE=^name A=ошибка параметры BC=infonum BC в числовом HL=значение DE виде HL #C6 GETINF$ получить DE=^name A=ошибка параметры BC=infonum BC в виде HL=^buf DE строки HL #C7 SETINF$ установить DE=^name A=ошибка параметры BC=infonum BC в виде HL=^значение DE строки HL Манипулирование файлами Функция #CB удаляет файлы или директорию (директория должна быть пуста). Функция #CC проверяет наличие файла (ошиб- ка или нет). Остальные функции пока не определены. Спецификация вызовов: № название описание вход выход #C8? RESET инициализация - A=ошибка файловой системы #C9? FLUSH освободить - -"- все буферы на диск #CA? MAKE создать файл DE=^name -"- или каталог #CB KILL удалить файл DE=^name -"- или пустой каталог #CC EXIST проверить DE=^name -"- наличие файла или каталога #CD? ASSIGN подключает DE=^name -"- новый диск HL=^newname #CE? MOVE move/rename DE=^oldname -"- файлов/каталогов HL=^newname #CF? COPY дублирование DE=^srcname -"- файлов/каталогов HL=^desname Простейшие файловые функции Функции для работы с файлами. Если вы хо- тите загрузить весь файл в память или сох- ранить часть памяти как файл, посмотрите сначала функции #E0..#ED. Функция #D0 всегда закрывает файл с задан- ным хэндлом. Если в качестве хэндла дан 0, то закроются все открытые файлы. Функция #D1 открывает файл на чтение (воз- вращает ошибку,если файла нет). Функция #D2 открывает файл на запись - удалит существующий файл и создаст новый, нулевой длины. Функция #D3 открывает файл и на чтение, и на запись.Если файл не существует,он будет создан с первой записью. Функции #D4..#D7 используются для чтения и записи файла. Функции #D4 и #D5 пересылают указанное количество байтов (возвращает число байт,переданное на самом деле - если оно меньше запрошенного,генерируется ошиб- ка). Функция #D6 читает байты из файла до предела или до значений #00 или #0D (вклю- чая их). Функция #D7 записывает байты до байта #00, который не записывается. Он за- пишется только будучи первым байтом в строке. Функция #D8 возвращает текущую позицию в файле. Функция #D9 позволяет переместить текущую позицию в файле и возвращает ста- рую позицию в файле.Смещение отсчитывается в зависимости от регистра B: #FF означает "с начала", #00 "с текущей позиции", а #01 "с конца" файла. Ошибочное значение возв- ращается, если пересечено начало или конец файла. Возможна адресация файла длиной до 8MB (23 бита адреса). Функция #DA сообщает, находится ли текущая позиция в конце файла (EOF). Функция #DB урезает файл по текущей пози- ции. Следующие функции - почти прямые вызовы системной структуры FILEDISK. Её определе- ния ещё могут поменяться в будущем. Спецификация вызовов: № название описание вход выход #D0 CLOSE закрыть файл D=хэндл A=ошибка #D1 OPENI открыть файл DE=^name A=ошибка на чтение D=хэндл #D2 OPENO открыть файл DE=^name A=ощибка на запись D=хэндл #D3 OPENO открыть файл DE=^name A=ощибка на чтение/запись D=хэндл #D4 READ чтение D=хэндл BC=readed из файла BC=длина A=ошибка HL=^databuf #D5 WRITE запись D=хэндл BC=written в файл BC=длина A=ошибка HL=^data #D6? GETL читать строку D=хэндл A=ошибка из файла BC=maxlen BC=длина HL=^linebuf #D7? PUTL запись строки D=хэндл A=ошибка в файл HL=^line #D8 FPOS получить D=хэндл EHL=pos текущую позицию A=ошибка #D9 SEEK установить D=хэндл EHL=oldpos позицию B=откуда A=ошибка EHL=newpos #DA? EOF проверка D=хэндл A=ошибка на окончание #DB? TRUNC урезать файл D=хэндл A=ошибка по текущей позиции Файлы с заголовком Функции #E0..#E7 оперируют файлами с заго- ловком (наподобие ленточных). Перед вызовом функций #E4..#E6 тип заголо- вка должен быть установлен одной из функ- ций #E0..#E3. Эта установка действует до следующего вызова любой из функций #E0..E3. Если файл существует,то в опреде- лённых регистрах возвратятся значения,взя- тые из заголовка этого файла.Если файл от- сутствует или требуемый тип заголовка не соответствует считанному,возвращается при- знак ошибки. Ошибка может быть игнорирова- на,если будет предпринята запись в файл,но чтение такого файла будет всегда приводить к ошибке. На входе в функцию #E3 размер буфера ука- зывается в BC. Длина,возвращаемая в BC,ог- раничена этим размером,тогда как DE содер- жит размер реальный. Это сделано во избе- жание ограничения ленты - вы не можете за- гружать с реальной ленты несколько первых байт длинного файла,и его контрольная сум- ма не может быть проверена. Также,BC=#1B00 и HL=#4000 распознаются как ваше желание загрузить или записать экран (однако вы можете загружать его и сохранять с других адресов). Чтение и запись выдаёт ошибку,если считано или записано меньше байт,чем требовалось.В этом случае проверяйте BC. Операция верификации эквивалентна чтению и происходит как на ленте - ошибка,если дан- ные различаются или файл слишком короткий. Функция #E7 вызавается перед #E4..#E6. По- зволяет установить смещение, которое даёт возможность последовательного доступа к файлу. Это означает,например,чтение после- довательных частей файла в разные банки памяти. Ошибка возвращается, когда позиция перейдёт через конец файла. Функции #E0..#E3 всегда устанавливают смещение в 0 (сразу после заголовка). Вызов любой из функций #E4..#E7 без пред- варительного вызова одной из #E0..#E3 при- водит к фатальной ошибке. Файл с заголовком может быть до 65535 байт длиной (не включая заголовок). Остальное отрезается. Формат заголовка может разли- чаться в разных файловых системах. Поэтому не приветствуется обработка файлов с заго- ловком с помощью других функций, за исклю- чением случаев, когда файл экран или игро- вая отгрузка. Для файлов с расширениями, отличными от ".CZX",".DZX",".DAT",".ROM",".SCR",вызыва- ется соответствющее RSX. Так вы можете,на- пример, загружать данные или Бейсик-прог- рамму из файла "*.Z80"! Более подробно чи- тайте в документации по RSX. Спецификация вызовов: № название описание вход выход #E0 HEADER0 выбор файла DE=^name A=ошибка типа program BC=prog DE=длина HL=line BC=prog HL=line #E1 HEADER1 выбор файла DE=^name A=ошибка типа H=тип&имя DE=длина number array H=тип&имя #E2 HEADER2 выбор файла DE=^name A=ошибка типа H=тип&имя DE=длина character array H=тип&имя #E3 HEADER3 выбор DE=^name A=ошибка двоичного BC=maxlen DE=длина файла HL=start HL=start BC=длина #E4 LOAD читать файл BC=длина A=ошибка в память HL=start BC=readed #E5 SAVE запись в файл BC=длина A=ошибка из памяти HL=start BC=written #E6 VERIFY сравнить BC=длина A=ошибка файл HL=start с памятью BC=verified #E7 SHIFT переместить DE=shift A=ошибка позицию в файле Экранные файлы Для чтения или записи спектрумовских экра- нов могут быть использованы функции #E8 и #E9. Операция всегда подразумевает 6912 байт памяти. Разделение этих функций поз- воляет конвертировать графику из/в различ- ные графические форматы. Записанный экран имеет 256x192 пикселов и 16 цветов,но воз- можны исключения.Если содержимое загружен- ного файла не совместимо с ограничениями Spectrum,результат будет не определён.Оши- бка возвращается,если файл не был записан, или не существует,или формат не распознан. В будущих релизах ZXVGS будут использованы RSX для чтения и записи изображений с рас- ширениями,отличными от ".SCR" и ".CZX".Эти функции могут также показывать на экране диалог со списком допустимых форматов,если не было дано расширение файла,или файл при чтении отсутствует, или имя файла пустое. Другие экранные режимы также будут поддер- жаны. Спецификация вызовов: № название описание вход выход #E8 LOADSCR load screen DE=^name A=ошибка from file HL=addr #E9 SAVESCR save screen DE=^name A=ошибка to file HL=addr Файлы игровых отгрузок Функции #EA и #EB разработаны для сохране- ния и восстановления состояний игр или конфигураций системных программ.Вызов этих функций позволяет пользователю выбрать один из 10 таких файлов. При сохранении пользователь может комментировать файл.Фа- йлы сохраняются с именем текущей прог- раммы и одним из расширений "SV0".."SV9" (выбираемых пользователем). При D=0 диалог не появится, и файл примет расширение по умолчанию ".SV?".В этом слу- чае E содержит код символа, помещаемого в 3-ю позицию расширения (непригодные симво- лы заменяются на "!").Эта возможность пре- дусмотрена для загрузки дефолтной конфи- гурации при запуске программы или сохране- ния её на выходе. Строка комментария при сохранении устанавливается в "Autosaved" (могут быть включены дата и время). Это можно использовать наряду со стандартными вызовами (когда пользователь выбирает сам) Для функции #EA при HL=0 используется ад- рес из заголовка. Расширение "SV@" (E=#40) зарезервировано для хранения файла таблицы рекордов. Если файл существует, ZXVGS загружает "*.SV@" сразу после файла "*.V00". Позже файл сох- раняется, когда пользователь вызывает меню ZXVGS. В новых программах он должен будет сохраняться функцией #EB при каждой моди- фикации таблицы рекордов.Файлы "*.SV?" со- храняются и загружаются на диске "SV:". Спецификация вызовов: № название описание вход выход #EA LOADCFG load settings BC=длина A=error DE=^title HL=addr #EB SAVECFG save settings BC=длина A=error DE=^title HL=addr Файлы без заголовка Функция #EC используется для загрузки це- лого файла или его начальной части в па- мять. Код ошибки возвращается, если было загружено меньше байт, чем запрошено. Функция #ED используется для сохранения непрерывной области памяти в файл. Код ошибки возвращается, если было сохранено меньше байт,чем требовалось (мало места на диске). Всегда проверяйте BC при ошибке. Спецификация вызовов: № название описание вход выход #EC LOADANY load BC=длина A=ошибка any file DE=^name BC=readed HL=addr #ED SAVEANY save BC=длина A=ошибка any file DE=^name BC=written HL=addr Селекторы файлов Функции #EE и #EF позволяют пользователю выбирать или вводить имя файла или дирек- тории лёгким способом. Возможно указание имени по умолчанию и ограничение выбора маской. Маска может редактироваться поль- зователем, заисключением "*/",что означает выбор директории. Имеется также титул опе- рации. Для представления результа (с пу- тём) необходимо зарезервировать 128 байт под буфер. Функции возвращают ошибку, если селектор файлов был покинут по кнопке <EDIT>, или имя файла пустое. Функция #EE всегда возвращает экран (об- ласть памяти #4000.. #5AFF) нетронутой,что во многих ситуациях выливается в ограни- ченной форме селектора. Функция #EF всегда использует полноэкранный интерфейс, но ос- тавляет экран в случайном состоянии. После этого требуется обновление экрана. Рекомендуется использование селекторов фа- йлов для каждого случая задания имён фай- лов пользователем. Если маской является "*.SZX" или "*.SCR", то селектор может также позволить выбирать другие форматы графики и соответственно может менять расширение. Спецификация вызовов: № название описание вход выход #EE FILESELL селектор DE=^default A=error без порчи BC=^mask name=DE^ экрана HL=^title #EF FILESELH селектор DE=^default A=error с порчей BC=^mask name=DE^ экрана HL=^title Принтер Функция #F0 возвращает контрольный код принтера.В регистре E задаётся номер кода, в HL - адрес буфера под него. В BC задаёт- ся максимальная длина (B игнорируется - должен быть 0). Когда контрольные коды по- мещены в буфер, BC (B=0) содержит количес- тво символов, а A равен 0. Если буфер был слишком мал, BC возвращает требуемый раз- мер,а A>0.Если контрольный код недоступен, то BC=0 и A>0. Функция #F1 пересылает требуемый контроль- ный код непосредственно на принтер.См.так- же функцию #F0. Функция #F2 эквивалентна команде Бейсика COPY. Функция #F3 печатает экран (256x192), взя- тый с указанного адреса. Функция #F4 имитирует ZX Printer на нор- мальном символьном принтере. Функция #F5 имитирует ZX Printer на матри- чном принтере, но для символьного принтера работает как функция #F4. Функция #F6 предназначена для печати текс- тов с национальными символами. Если в сис- теме нет перекодиторания, то эквивалентно функции #F7. Значения 1..5 в регистре D выбирают набор символов ISO-8859-D. Функция #F7 пересылает байт непосредствен- но на принтер (контрольные последователь- ности можно получить функцией #F0). Функции #F0..#F6 обслуживаются модулем {PRINTER.RZX}. Контрольные коды принтера для функций #F0 и #F1: код смысл установка для принтера Epson FX HP LaserJet {EPSONFX.RZX} {LASERJET.RZX} #00 число иголок 8 8 #01 перед печатью 27,65,8 ? экрана #02 число точек 224,1 ? в mode1 #03 выбор mode1 27,75,224,1 ? #04 число точек 192,3 ? в mode2 #05 выбор mode2 27,76,192,3 ? #06 код для CR 13 13 #07 код для LF 10 10 Спецификация вызовов: № название описание вход выход #F0 GETPRINT взять E=код A=ошибка контр.код HL=^buffer BC=codelen принтера BC=buflen code=HL^ #F1? SETPRINT выдать E=код A=ошибка контр.код #F2 DUMP печать 22 - A=? строк экранной графики #F3? DUMPANY печать HL=address A=? 24 строк экранной графики #F4 ZXPRINT печать E=символ A=? символа, как на ZX Printer #F5? HLPRINT печать HL=^pattern A=? символа, E=символ определённого по HL как ZX Printer #F6? DEPRINT печать D=modificator A=? символа E=символ с модификатором #F7 LPRINT прямой E=символ A=? вывод на принтер Оверлеи Функции #F8..#FB предназначены для управ- ления оверлеями. Обычно оверлеями являются следующие уровни игры. Оверлей может быть загружен вызовом функции #F8 с указанием номера оверлея. Подготовка (функция #F9) даёт результат на серверных системах и по- зволяет поднять скорость загрузки (напри- мер,на Timex FDD 3000) - не является необ- ходимой.Загрузка оверлеев в буфер (функция #FA) приводит к ускорению загрузки. Этот вариант игнорируется, когда недостаточно ОЗУ для хранения. Это может быть использо- вано вместо загрузки оверлеев непосредст- венно в банки памяти (наподобие игр, рабо- тающих и на ZX48, и на ZX128), поскольку в буфере оверлеи хранятся в сжатой форме и,к тому же, могут храниться в теневом ОЗУ под ПЗУ (MB-02).Функция #FB удаляет оверлей из буфера. Все функции возвращают свободное место в буфере в килобайтах. Если свобод- ного места больше, чем 254kB, возвращается значение 255. Спецификация вызовов: № название описание вход выход #F8 OVRLOAD load overlay E=номер A=free E=0 значит главную программу #F9 OVRPREPARE load E=номер A=free overlay в буфер only if multitasking #FA OVRSTORE copy overlay E=номер A=free во внутренний буфер #FB OVRREMOVE remove E=номер A=free overlay из внутр.буфера Системные вызовы Функции #FC..#FF предназначены для выхода из программы в системное меню и завершения работы программы. Функция #FC только вызывает системное ме- ню. Программа может быть продолжена. Функция #FD завершает программу после око- нчания её работы (закрывает все открытые файлы,банки,очищает буфер оверлеев и т.д.) Функция #FE похожа на #FD, но показывает нужное сообщение перед выходом в меню. Функция #FF зарезервирована для интерпре- татора Бейсика, который вызывает её после выполнения последней инструкции.Это беспо- лезно для программ ZXVGS. Обычно (без RSX) слово из XPTR #5C5F копируется в CHADD #5C5D, #FF помещается в ERRNR #5C3A,и про- грамма продолжается с #0058 (обработчик ошибок). Спецификация вызовов: № название описание вход выход #FC MENU выход в меню, - A=??? возврат пунктом "Continue" #FD QUIT выход в меню - - с сообщением "Program finished" #FE FATAL выход в меню DE=^text {zxvgs@yarek.com},{http:\zxvgs.yarek.com}
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября