Polski English Русский
Home Вкратце RSXы Файли Функции Версии Релизы Users Download
CP/M MEMDISK IDEDOS


Функции ZXVGS

Все функции ZXVGS вызываются через RST #08 с номером функции в следующем байте (hook code). Программа продолжается с адреса, лежащего за hook code.
        RST  #08
        DEFB функция
В нижеследующих таблицах колонки, обозначенные вход описывают регистры, содержащие аргументы функции. Колонки, обозначенные выход - регистры, в которых функция возвращает результат, причём остальные регистры не меняются. Содержимое AF на входе игнрируется, состояние F на выходе не определено. В некоторых случаях функция может установить 7-й бит регистра R, это будет означать, что одно или более экранное прерывание было пропущено.
Значение байта после RST 8.
#00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #0A #0B #0C #0D #0E #0F
ошибки #00 ошибки интерпретатора Бейсика
ошибки, I1 #10 ошибки интерпретатора Бейсика коды команд Interface 1
I1 #20 коды команд Interface 1
I1, DISCiPLE #30 коды к. I1 коды команд DISCiPLE
DISCiPLE #40 коды команд DISCiPLE
#50
#60
внутр. #70 для внутр. использ. в RSX'ах #7F
вход, скорость #80 джойстики мышь скорость клавиатура
экран #90 управление экраном - пока не используется
настройка #A0 информация настройка звук экран RSX'ы
память #B0 банки памяти
диски #C0 текущий путь директории информ. о диске работа с файлами
файли #D0 прямой доступ к файлам
data #E0 операции с файлами, имеющими заголовки картинки отгрузки raw data выбор ф.
принтер, оверлеи #F0 принтер оверлеи системные OK
#00 #01 #02 #03 #04 #05 #06 #07 #08 #09 #0A #0B #0C #0D #0E #0F

Примечания:

Внутренний вызов ПЗУ

Код #7F зарезервирован для внутренних нужд системы. Используется для вызова ПЗУ ZX из системы.
 

Джойстики

Примечание. Вызовы функций #80..#83 могут быть прерваны пользователем. Во избежание выхода из программы без сохранения результатов, используйте функцию #A3 (будет доступна в следующих версиях).

Возможно использование 4 независимых джойстиков. Обычно используются первые два. Смысл битов 0..4 совместим со значением из порта Кемпстон-джойстика (#1F, b0=right,b1=left, b2=down,b3=up, b4=fire). Бит 5 - второй fire (обычно не используется). Биты 6 и 7,общие для всех джойстиков, символизируют ещё две кнопки. Бит 6 (HALT) может вызвать паузу в игре (когда установлен) или активировать опции. Bit 7 (EXIT) может прервать игру или вызвать переход в главное меню.
Спецификация вызовов
название описание вход выход
#80 J0 read joysick 0 нет A=состояние
#81 J1 read joysick 1
#82 J2 read joysick 2
#83 J3 read joysick 3

Использование мыши

Вы можете использовать внешнюю мышь (обслуживаемую вне главной программы), а также вызывающую прерывания. Задачи вычисления абсолютных координат, рисования указателя и отслеживания событий лежат на вашей программе. Для использования мыши в любой программе руководствуйтесь следующими требованиями:
  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.
    Зарезервируйте байт для хранения вертикального смещения. Поместите его адрес в DE.
  7. Вызовите функцию #84. Она заполнит буфер и область под NOP'ами. И в случае необходимости сменит таблицу прерываний.
  8. Разрешите прерывания!
Для старых программ рекомендуется поместить XOR A: RET в начало буфера во избежание сбоя программы при вызове до инициализации мыши.

Координаты будут меняться по заданным адресам. Все они 8-битные. Вы можете только считывать их и сравнивать с эталонами для опреденения изменений. Для проверки кнопок просто вызывайте процедуру из начала буфера. Она вернёт состояние кнопок в A, сохранив значения остальных регистров (b0=левая кнопка, b1=правая; установленный бит указывает на нажатие).

Обратите внимание, что некоторые типы мышей (RS232, AMX) могут генерировать собственные прерывания, бесполезные для нашей программы. Все некадровые прерывания "съедаются" (адрес возврата снимается со стека). И если адрес возврата ссылается на байт после команды HALT, он будет декрементирован для продолжения HALT до кадрового прерывания.

Мышь может быть деактивирована указанием 0 в качестве адреса буфера (в HL). Данные, возвращаемые в этом случае, полезны для RSX - они помогают отключить драйвер, используемый главной программой, подключить свой драйвер для обработки запроса, после чего отключить свой драйвер и возвратить драйвер главной программы.
 
Спецификация вызовов
название описание вход выход
#84 MSEINI установить мышь I=page
BC=^xcoord
DE=^ycoord
HL=^buf
A=result
опросить мышь HL=??? A=result
BC=^xcoord
DE=^ycoord
HL=^buf
отключить мышь HL=0 A=result
BC=^xcoord
DE=^ycoord
HL=^buf
#85 MSEGET (для внутр. использования) нет A=keys
B=dy
C=dx

Скорость

Функция #87 переключает процессор в быстрый режим. Скорость не оговаривается - просто считается, что программа работает быстрее.

Функция #88 возвращает процессор в стандартый режим 3.5MHz.
 
Спецификация вызовов
название описание вход выход
#87 FAST (Scorpion) - ускоряет работу процессора нет A=result
#88 SLOW (Scorpion) - возвращает 3.5MHz

Клавиатура

Расширенная клавиатура может использоваться для ввода текста в ряде программ. Позволяет использовать несколько дополнительных клавиш (на эмуляторах, SAM Coupe, ZX128 keypad).

Будет использована в Бейсике, если появятся патчи или способы перехвата INT.

Вызов функции #8F??? должен быть помещён в обработчик IM 2, как минимум с сохранением AF. Или может вызываться с запрещёнными прерываниями примерно 50 раз в секунду.

Пока не применяйте!!! Не доделано!!!


 
Спецификация вызовов
название описание вход выход
#8C? KBDGET get char from buffer ()(A)
#8D? KBDTST read char from buffer and leave it ()(A)
#8E? KBDMOD выбор режима (BC)(A=result)
#8F? KBDINT sync. interrupt ()(A)

Управление экраном

Функции #90..#9F разработаны для отображения меню, перемещения указателя мыши и вывода текста в 42, 51 или 64 столбца. В том числе, в дополнительных экранных режимах.

В текущей версии ZXVGS не реализовано!
 
Спецификация вызовов
название описание вход выход
#9F? CHOICE ask user what to do HL=^title
BC=^options
A=result

Config and system info

Спецификация вызовов
название описание вход выход
#A0? неизвестно неизвестно ? ?
#A1?

Настройка функций

Команды #A2 и #A3 управляют машиннозависимыми функциями.
They should not be used in applications (including reading the release number), except config dedicated ones. In D is number of function being configured or #A2 for release number reading. Function #A2 returns current setting in E while the release number in AE. Function #A3 changes setting and returns effective setting (old one when no change were made, new one when change is accepted). Both function return A=0 when getting or setting configuration passed correctly (except for release number reading).
 
Параметры
опция в D в E смысл
Тип джойстика. #80
#81
#82
#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 in YAMOD.8250/0
9 M$ Mouse in YAMOD.8250/1
10 M$ Mouse in YAMOD.8250/2
11 M$ Mouse in YAMOD.8250/3
Release number. #A2 AE - four BCD digits (read only)
Наличие звуковых
устройств.
#A4 маска 1=отсутствие
Тип принтера. #F7 не определено
Спецификация вызовов
название описание вход выход
#A2 GETCFG взять установку функции D=функция A=ошибка
E=режим
get ZXVGS release number D=#A2 AE=release
#A3 SETCFG установить параметр функции D=функция
E=режим0
A=ошибка
E=режим1

Настройка звука

Функция #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=номер
E=каналы
A=различие
E=каналы

Настройка экрана


Функция #A6 возвращает тип ULA в D (свойства экрана), current screen mode in E and current frame length in BC.

Функция #A7 opens video mode. When the frame length is not important, set BC=#0000 and D=#FF. When BC>#0000 or D is different from #FF, ZXVGS will try to change ULA properties (what is possible on emulators and dedicated hardware). Value in D has higher priority than BC (however this is another way to swith the ZS Scorpion into fast mode).

Функции #E8, #E9, #F3 use the screenmode value to load, save or print the screen.

BC - параметры времени кадровой синхронизации в тактах Z80, measured in IM2, both code and IM 2 table are in быстрое ОЗУ (not slowed by ULA). To get number of tacts per frame, multiply the BC value by 18 and add 66 (ZX48) or 60 (ZX128) tacts. (However for the Sam Coupe BC must be multiplied by 20, not 18.) Please note that while both ZX48 and TC2048 have the same frame length, the starts of screen drawig are in different tacts.
 
Parameters - BC and D registers
страна
in D
время в BC компьютер графика
Англия #00 3879 Sinclair ZX Spectrum (+) ULA 6C001E-7
#01 3936 Sinclair ZX+ 128 AMSTRAD 40056
#02 3936 Amstrad ZX +2 ULA 7K010E5
#03 3936 Amstrad ZX +2A/+2B/+3 GATE ARRAY 40077
#0C 5987 MGT SAM Coupe ASIC
Португалия
(+ USA)
#20 3257 Timex Sinclair 2068 TS 2068 - 60Hz
#21 3879 Timex Computer 2068 TS 2068 - 50Hz, grey
#22 3879 Timex Computer 2048 TS 2068 - 50Hz, black
Польша #80 (unknown) ELWRO 800 Junior ?
#?? (unknown) Solum ?
Россия #C0 3979 Пентагон ?
#C1 slow: 3879
fast: 7762
ZS Скорпён ?
др. #F0 3879 Warajevo emulator
#FF ? неизвестно

LINT: +#80

Интерфейс LINT генерирует прерывание перед тем, как отобразится строка, указанная в порту #F9. Прерывание может быть распознано чтением порта #F9. Присутствие должно определяться функцией #A???. (На данный момент такая возможность поддерживается только на SAM Coupe.)
 
основные режимы мерцанные режимы
в E описание в E описание
#00 стандартный экран с #4000 #08 стандартные экраны с #4000 и #C000
#01 стандартный экран с #6000 #09 стандартные экраны с #4000 и #6000
#02 high colour экран с #4000 #0A high colour экраны с #4000 и #C000
#03 hires экран с #4000 #0B hires экраны с #4000 и #C000
#04 стандартный экран с #C000 #0C стандартные экраны с #4000, #6000, #C000 и #E000
#05 стандартный экран с #E000 #0D стандартные экраны с #C000 and #E000
#06 high colour экран с #C000 #0E high colour экраны с #4000 и #C000 - 1:3
#07 hires экран с #C000 #0F hires экраны с #4000 и #C000 - 1:2

При HL>#4000 по адресу HL помещается релоцируемый код для выбора одного из основных экранных режимов. В этом случае L содержит длину этого кода, а H - требуемое ему число тактов. Вызовами с H=0 режим выбирается непосредственно.
Спецификация вызовов
название описание вход выход
#A6? VIDEO информация о экране ? A
D=ula
E=mode
BC=время
#A7 OPENVIDEO включить экранный режим BC=время
DE=mode
HL=buffer
BC=время
DE=mode
H=tacts
L=длина

Управление Резидентными Расширениями Системы (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 загружает:

Спецификация вызовов
название описание вход выход
#AC RSXINIT взять RSX DE=^rsxname D=хэндл
A=ошибка
#AD? RSXCTRL вызвать RSX функцию D=хэндл
E=функция
?
A=ошибка
#AE RSXINFO информация о RSX E=what
HL
BC
?
A=ошибка
#AF RSXLOAD загрузить файл RSX'ом DE=^filename 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. Режим открытия определяется для первого открытого банка в группе и будет тем же для остальных. Эти банки могут быть открыты только как виртуальные. Для открытия первого виртуального банка как минимум один из реальных банков должен быть открыт как медленный (бит 0 в регистре D сброшен) - он сменит состояние на виртуальное и будет использован для
    хранения данных из виртуальной памяти (банки, открытые особо, сохранят реальное состояние).

Функции

Функции #B0..#B7 выбирают один из привилегированных банков. Функция #B8 выбирает любой банк - его номер передаётся в регистре E.

Функция #B9 предоставляет информацию о банках. Do not use. To get current bank number and its mode, use #BF function.

Функция #BA используется для получения куска кода, переключающего банки. Более подробно см. следующую секцию.

Функция #BB копирует содержимое section C во всех открытых 32kB страницах или игнорируется в случае 16kB-страничного режима.

Функция #BC пытается открыть банк E в режиме D и возвращает удавшийся режим в D. См. таблицу параметров.

Функция #BD закрывает банк E. Если E является включенным в данный момент банком, то содержимое верхней четверти памяти становится не определено (т. е. может содержать ПЗУ или #FF-ки) до выбора другого банка.

Функция #BE закрывает все банки. Содержимое верхней четверти ОЗУ становится неопределённым.

Функция #BF возвращает в регистре E номер текущего банка, а в регистре D его режим. В регистре B возвращается количество открытых банков. Регистр A содержит количество дополнительных банков (за исключением виртуальных):

Параметры
бит
в D
вход данные #BC выход данные #BD/BF
когда 1 когда 0 когда 1
0 должен щёлкать быстро (не виртуально)
бит 1
когда 0 когда 1
бит 0 0 16kB виртуальный 32kB реальный,
копирует section C
1 32kB реальный 16kB реальный
1 область #8000..#BFFF не меняется
2 содержит экран нет экрана есть экран
3 соответствует банку ZX128
OUT (#7FFD),E+#10
несовместим с OUT #7FFD совместим с OUT #7FFD
4 можно класть таблицу IM 2 без "снега" нет, пойдёт "снег" можно, "снега" не будет
5 процессор не будет тормозить ULA да, будет тормозить нет, банк быстрый
6 поддерживает 8 бит цвета (???) нет, только 1 бит да, 8 бит цвета (???)
7 откроется, даже если не соблюдать требований открыт не открыт

Функция #BA - быстрое переключение банков

Позволяет щёлкать банки намного быстрее. Следуйте этим указаниям:
  1. Определите, будет ли ваша программа работать в 32kB страничном режиме. Если нет, используйте режим %XXXXXX11 (не будет работать на некоторых типах аппаратуры). В противном случае будет переключатся 32kB или 16kB. Следите за стеком и прерываниями.
  2. Откройте банк функцией #BC.
  3. Зарезервируйте 32B для программы переключения страниц. Программа перемещаема. Для использования программы без её перемещения, можете заполнить буфер нулями ("NOP") и поместите его в свою программу. Или заполните 33 байта кодом "RET" (#C9) или "JP (HL)" (#E9), в зависимости от структуры вашей программы.
  4. Зарезервируйте два байта в районе #5B00..#7FFE, поместите их адрес в BC при первом вызова функции #BA (потом BC будет игнорироваться, аж до вызова с BC=0).
  5. Вызовите функцию #BA для помещения кода включения банка E по адресу HL. Функция вернёт реальную длину кода в BC и число тактов в A. DE укажет на байт после кода, поэтому вы можете добавлять (с помощью LDIR) туда свой код.
  6. Для выбора банка вызывайте этот код.

Запомните!

Спецификация вызовов
название описание вход выход
#B0..#B7 BNK0..BNK7 включить привилегированный банк
фатальная ошибка при неоткрытом
нет A=?
#B8 BNKE включить любой банк
фатальная ошибка при неоткрытом
E=N° A=?
#B9 BNKCTRL сведения о банке - do not use DE=infonumber A
BC
DE
HL
#BA BNKCODE получить программу переключения E=N°
HL=^buffer
BC=^слово
BC=длина
DE=^end
A=tacts
#BB BNKCOPY копировать section C во все банки нет A=?
#BC BNKOPEN открыть банку D=mode0
E=N°
D=mode1
A=xor
#BD BNKCLOSE закрыть банку E=N° 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). Могут быть использованы следующие символы форматирования:

Другие символы копируются без изменения. Десятичное число между % и буквой указывает фиксированную ширину поля. Положительные значения - выравнивание по правому краю, отрицательные - по левому. Значение после точки указывает число отрезаемых символов в строке. Примеры:

"%-16.16m %-3.3e %l" - характер NeOS 1.0 (DEC)
"%-8.8m<%1.1e>%3b%13l" - характер TR-DOS (параметры start недоступны)
"%x %-9g%-9u%8l %6d %5t %n" - характер U*IX (ls -l)
"%-9.8m%-4.3e%13l%9.8d%9t" - характер MS-DOS 6.20 (default)

Внутренняя системная структура состоит из следующих полей (не полностью определено):

Свободное пространство на диске можно узнать через функции #C4 или #C5.

Примечание: некоторые диски (большей частью сетевые, типа "TCP:", "HTTP:" или "FTP:") не показывают все возможные подкаталоги, а только те, которее были использованы недавно (или есть в закладках).
 
Спецификация вызовов
название описание вход выход
#C2 GETDIR взять элемент каталога (entry) BC=номер
DE=^buffer
HL=^format
A=ошибка
BC=?
DE^=entry
HL=?
#C3 SETDIR установить маску каталога BC=attr
DE=^pattern
HL=^format
A=ошибка
BC=число
DE=?
HL=?

Сведения о диске

Функции #C4 и #C6 возвращают информацию по указанному диску/пути или файлу. Функции #C5 и #C7 меняют информацию по указанному диску/пути или файлу, но только если это возможно.
Параметры
register BC return #C4 #C6
#0000 место на диске в Кб HL текст ASCIIZ
#0001 глубина директории (1=корень) L текст ASCIIZ
Спецификация вызовов
название описание вход выход
#C4 GETINFO получить параметры в числовом виде DE=^name
BC=infonumber
HL
A=ошибка
BC
DE
HL
#C5 SETINFO установить параметры в числовом виде DE=^name
BC=infonumber
HL=значение
A=ошибка
BC
DE
HL
#C6 GETINF$ получить параметры в виде строки DE=^name
BC=infonumber
HL=^buf
A=ошибка
BC
DE
HL
#C7 SETINF$ установить параметры в виде строки DE=^name
BC=infonumber
HL=^значение
A=ошибка
BC
DE
HL

Манипулирование файлами

Функция #CB удаляет файлы или директорию (директория должна быть пуста).

Функция #CC проверяет наличие файла (ошибка когда нет).

Остальные функции пока не определены.
Спецификация вызовов
название описание вход выход
#C8? RESET инициализация файловой системы нет A=ошибка
#C9? FLUSH освободить все буферы на диск
#CA? MAKE создать файл или каталог DE=^name
#CB KILL удалить файл или пустой каталог
#CC EXIST проверить наличие файла или каталога
#CD? ASSIGN подключает новый диск DE=^name
HL=^newname
#CE? MOVE move/rename файлов/каталогов DE=^oldname
HL=^newname
#CF? COPY дублирование файлов/каталогов DE=^sourcename
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 открыть файл на запись
#D3 OPENB открыть файл на чтение/запись
#D4 READ читать из файла D=хэндл
BC=длина
HL=^databuf
BC=загружено
A=ошибка
#D5 WRITE запись в файл D=хэндл
BC=длина
HL=^data
BC=сохранено
A=ошибка
#D6? GETL читать строку из файла D=хэндл
BC=maxlen
HL=^linebuf
A=ошибка
BC=длина
#D7? PUTL запись строки в файл D=хэндл
HL=^line
A=ошибка
#D8 FPOS получить текущую позицию D=хэндл EHL=позиция
A=ошибка
#D9 SEEK установить позицию D=хэндл
B=откуда
EHL=newpos
EHL=oldpos
A=ошибка
#DA? EOF проверка на окончание D=хэндл A=ошибка
#DB? TRUNC урезать файл по текущей позиции

Файлы с заголовком

Функции #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 выбор файла типа program DE=^name
BC=prog
HL=line
A=ошибка
DE=длина
BC=prog
HL=line
#E1 HEADER1 выбор файла типа number array DE=^name
H=тип&имя
A=ошибка
DE=длина
H=тип&имя
#E2 HEADER2 выбор файла типа character array
#E3 HEADER3 выбор двоичного файла DE=^name
BC=maxlen
HL=start
A=ошибка
DE=длина
HL=start
BC=длина
#E4 LOAD читать файл в память BC=длина
HL=start
A=ошибка
BC=загружено
#E5 SAVE запись в файл из памяти  BC=длина
HL=start
A=ошибка
BC=сохранено
#E6 VERIFY сравнить файл с памятью BC=длина
HL=start
A=ошибка
BC=верно
#E7 SHIFT переместить позицию в файле DE=позиция A=ошибка

Экранные файлы

Для чтения или записи спектрумовских экранов могут быть использованы функции #E8 и #E9. Операция всегда подразумевает 6912 байт памяти. Разделение этих функций позволяет конвертировать графику из/в популярные графические форматы. Записанный экран имеет 256x192 пикселов и 16 цветов, но возможны исключения. Если содержимое загруженного файла не совместимо с ограничениями Spectrum, результат будет не определён. Ошибка возвращается, если файл не был записан, или не существует, или формат не распознан.

В будущих релизах ZXVGS будут использованы RSX для чтения и записи изображений с расширениями, отличными от ".SCR" и ".CZX". Эти функции могут также показывать на экране диалог со списком допустимых форматов, если не было дано расширение файла, или файл при чтении отсутствует, или имя файла пустое.

Другие экранные режимы также будут поддержаны.
Спецификация вызовов
название описание вход выход
#E8 LOADSCR читать экран из файла DE=^name
HL=addr
A=ошибка
#E9 SAVESCR запись экрана в файл

Файлы игровых отгрузок

Функции #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 читать конфигурацию из файла DE=^title
BC=длина
HL=addr
A=ошибка
#EB SAVECFG запись конфигураций в файл

Файлы без заголовка

Функция #EC используется для загрузки целого файла или его начальной части в память. Код ошибки возвращается, если было загружено меньше байт, чем запрошено.

Функция #ED используется для сохранения непрерывной области памяти в файл. Код ошибки возвращается, если было сохранено меньше байт, чем требовалось (мало места на диске).

Всегда проверяйте BC при ошибке.
Спецификация вызовов
название описание вход выход
#EC LOADANY load any file DE=^name
BC=длина
HL=addr
A=ошибка
BC=загружено
#ED SAVEANY save any file A=ошибка
BC=сохранено

Селекторы файлов

Функции #EE и #EF позволяют пользователю выбирать или вводить имя файла или директории лёгким способом. Возможно указание имени по умолчанию и ограничение выбора маской. Маска может редактироваться пользователем, заисключением "*/", что означает выбор директории. Имеется также титул операции. Для представления результа (с путём) необходимо зарезервировать 128 байт под буфер. Функции возвращают ошибку, если селектор файлов был покинут по кнопке <EDIT>, или имя файла пустое.

Функция #EE всегда возвращает экран (область памяти #4000..#5AFF) нетронутой, что во многих ситуациях выливается в ограниченной форме селектора. Функция #EF всегда использует полноэкранный интерфейс, но оставляет экран в случайном состоянии. После этого требуется обновление экрана.

Рекомендуется использование селекторов файлов для каждого случая задания имён файлов пользователем.

Если маской является "*.SZX" или "*.SCR", то селектор может также позволить выбирать другие форматы графики и соответственно может менять расширение.
Спецификация вызовов
название описание вход выход
#EE FILESELL селектор без порчи экрана DE=^default
BC=^mask
HL=^title
A=ошибка
name=DE^
#EF FILESELH селектор с порчей экрана

Принтер

Функция #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
EPSONFX.RZX
Helwett-Packard Laser Jet
LASERJET.RZX
#00 число иголок 8 8
#01 перед печатью экрана 27,65,8 ?
#02 число точек в mode1 224,1 ?
#03 выбор mode1 27,75,224,1 ?
#04 число точек в mode2 192,3 ?
#05 выбор mode2 27,76,192,3 ?
#06 код для CR 13 13
#07 код для LF 10 10
Спецификация вызовов
название описание вход выход
#F0 GETPRINT взять контрольный код принтера E=код
HL=^buffer
BC=buflen
A=ошибка
BC=codelen
code=HL^
#F1? SETPRINT выдать контрольный код E=код A=ошибка
#F2 DUMP печать 22 строк экранной графики нет A=?
#F3? DUMPANY печать 24 строк экранной графики HL=address
#F4 ZXPRINT печать символа, как на ZX Printer E=символ
#F5? HLPRINT печать символа, определённого по HL как ZX Printer HL=^pattern
E=символ
#F6? DEPRINT печать символа с модификатором D=modificator
E=символ
#F7 LPRINT прямой вывод на принтер E=символ

Оверлеи

Функции #F8..#FB предназначены для управления оверлеями. Обычно оверлеями являются следующие уровни игры. Оверлей может быть загружен вызовом функции #F8 с указанием номера оверлея. Подготовка (функция #F9) даёт результат на серверных системах и позволяет поднять скорость загрузки (например, на Timex FDD 3000) - не является необходимой. Загрузка оверлеев в буфер (функция #FA) приводит к ускорению загрузки. Этот вариант игнорируется, когда недостаточно ОЗУ для хранения. Это может быть использовано вместо загрузки оверлеев непосредственно в банки памяти (наподобие игр, работающих и на ZX48, и на ZX128), поскольку в буфере оверлеи хранятся в сжатой форме и, к тому же, могут храниться в теневом ОЗУ под ПЗУ (MB-02). Функция #FB удаляет оверлей из буфера. Все функции возвращают свободное место в буфере в килобайтах. Если свободного места больше, чем 254kB, возвращается значение 255.
Спецификация вызовов
название описание вход выход
#F8 OVRLOAD загрутзить оверлей, E=0 значит главную программу E=номер A=свободно
#F9 OVRPREPARE загрутзить оверлей в буфер сервера
#FA OVRSTORE загрутзить оверлей во внутренний буфер
#FB OVRREMOVE удалить оверлей из внутренного буфера

Системные вызовы

Функции #FC..#FF предназначены для выхода из программы в системное меню и завершения работы программы.

Функция #FC только вызывает системное меню. Программа может быть продолжена. Функция #FD завершает программу после окончания её работы (закрывает все открытые файлы, банки, очищает буфер оверлеев и т. д.)
Функция #FE похожа на #FD, но показывает данные сообщение перед выходом в меню.

Функция #FF зарезервирована для интерпретатора Бейсика, который вызывает её после выполнения последней инструкции. Это бесполезно для программ ZXVGS. Обычно (без RSX) слово из XPTR #5C5F копируется в CHADD
#5C5D, #FF помещается в ERRNR #5C3A, и программа продолжается с #0058 (обработчик ошибок).
Спецификация вызовов
название описание вход выход
#FC MENU выход в меню, возврат пунктом "Continue" нет A=???
#FD QUIT выход в меню с сообщением "Program finished" no return
#FE FATAL выход в меню с данным собщением (фатальная ошибка) DE=^text
#FF OK для интерпретатора Бейсика нет скок до #0058


© 2003-08-30 22:21:05 Jarek Adamski zxvgs@yarek.com, http://zxvgs.yarek.com
© 2003 Alone Coder (Russian translation)